From aede33d26113a6bc3a8837673b781c89b0cc6c88 Mon Sep 17 00:00:00 2001 From: timlyeee Date: Tue, 13 Dec 2022 17:48:45 +0800 Subject: [PATCH] wip --- ios-m1-simulator/libs/liblibnyquist.a | Bin 0 -> 1976920 bytes ios-m1-simulator/libs/liblibwavpack.a | Bin 0 -> 175056 bytes ios-m1-simulator/libs/libsamplerate.a | Bin 0 -> 1491752 bytes ios/libs/liblibnyquist.a | Bin 1967752 -> 4152664 bytes ios/libs/liblibwavpack.a | Bin 174168 -> 380248 bytes ios/libs/libsamplerate.a | Bin 1492240 -> 2997648 bytes mac/libs/liblibnyquist.a | Bin 1985312 -> 4167752 bytes mac/libs/liblibwavpack.a | Bin 175056 -> 380352 bytes mac/libs/libsamplerate.a | Bin 1491752 -> 2997648 bytes .../third_party/libnyquist/CMakeLists.txt | 287 - .../LabSound/third_party/libnyquist/README.md | 33 - .../libnyquist/cmake/CXXhelpers.cmake | 24 - .../libnyquist/cmake_install.cmake | 92 - .../third_party/libnyquist/src/Common.cpp | 393 - .../third_party/libnyquist/src/Encoders.cpp | 442 - .../libnyquist/src/FlacDecoder.cpp | 258 - .../libnyquist/src/FlacDependencies.c | 108 - .../third_party/libnyquist/src/Mp3Decoder.cpp | 79 - .../libnyquist/src/MusepackDecoder.cpp | 191 - .../libnyquist/src/MusepackDependencies.c | 54 - .../libnyquist/src/OpusDecoder.cpp | 183 - .../libnyquist/src/OpusDependencies.c | 275 - .../libnyquist/src/VorbisDecoder.cpp | 262 - .../libnyquist/src/VorbisDependencies.c | 73 - .../third_party/libnyquist/src/WavDecoder.cpp | 326 - .../libnyquist/src/WavPackDecoder.cpp | 196 - .../libnyquist/third_party/FLAC/all.h | 371 - .../libnyquist/third_party/FLAC/assert.h | 46 - .../libnyquist/third_party/FLAC/callback.h | 185 - .../libnyquist/third_party/FLAC/export.h | 97 - .../libnyquist/third_party/FLAC/format.h | 1025 - .../libnyquist/third_party/FLAC/metadata.h | 2182 --- .../libnyquist/third_party/FLAC/ordinals.h | 86 - .../libnyquist/third_party/FLAC/src/bitmath.c | 109 - .../third_party/FLAC/src/bitreader.c | 1059 -- .../third_party/FLAC/src/bitwriter.c | 843 - .../libnyquist/third_party/FLAC/src/cpu.c | 487 - .../libnyquist/third_party/FLAC/src/crc.c | 143 - .../libnyquist/third_party/FLAC/src/fixed.c | 419 - .../third_party/FLAC/src/fixed_intrin_sse2.c | 253 - .../third_party/FLAC/src/fixed_intrin_ssse3.c | 241 - .../libnyquist/third_party/FLAC/src/float.c | 302 - .../libnyquist/third_party/FLAC/src/format.c | 585 - .../third_party/FLAC/src/ia32/cpu_asm.nasm | 98 - .../third_party/FLAC/src/ia32/fixed_asm.nasm | 309 - .../third_party/FLAC/src/ia32/lpc_asm.nasm | 2049 -- .../third_party/FLAC/src/ia32/nasm.h | 85 - .../FLAC/src/include/private/all.h | 50 - .../FLAC/src/include/private/bitmath.h | 186 - .../FLAC/src/include/private/bitreader.h | 91 - .../FLAC/src/include/private/bitwriter.h | 104 - .../FLAC/src/include/private/cpu.h | 168 - .../FLAC/src/include/private/crc.h | 62 - .../FLAC/src/include/private/fixed.h | 107 - .../FLAC/src/include/private/float.h | 98 - .../FLAC/src/include/private/format.h | 45 - .../FLAC/src/include/private/lpc.h | 246 - .../FLAC/src/include/private/macros.h | 72 - .../FLAC/src/include/private/md5.h | 50 - .../FLAC/src/include/private/memory.h | 58 - .../FLAC/src/include/private/metadata.h | 46 - .../src/include/private/ogg_decoder_aspect.h | 80 - .../src/include/private/ogg_encoder_aspect.h | 63 - .../FLAC/src/include/private/ogg_helper.h | 44 - .../FLAC/src/include/private/ogg_mapping.h | 64 - .../FLAC/src/include/private/stream_encoder.h | 67 - .../include/private/stream_encoder_framing.h | 46 - .../FLAC/src/include/private/window.h | 74 - .../FLAC/src/include/protected/all.h | 39 - .../src/include/protected/stream_decoder.h | 60 - .../src/include/protected/stream_encoder.h | 118 - .../FLAC/src/include/share/alloc.h | 209 - .../FLAC/src/include/share/compat.h | 201 - .../FLAC/src/include/share/endswap.h | 78 - .../FLAC/src/include/share/getopt.h | 184 - .../FLAC/src/include/share/macros.h | 41 - .../FLAC/src/include/share/private.h | 45 - .../FLAC/src/include/share/safe_str.h | 69 - .../third_party/FLAC/src/include/share/utf8.h | 25 - .../FLAC/src/include/share/win_utf8_io.h | 69 - .../libnyquist/third_party/FLAC/src/lpc.c | 1357 -- .../third_party/FLAC/src/lpc_intrin_avx2.c | 1120 -- .../third_party/FLAC/src/lpc_intrin_sse.c | 451 - .../third_party/FLAC/src/lpc_intrin_sse2.c | 1088 -- .../third_party/FLAC/src/lpc_intrin_sse41.c | 1312 -- .../libnyquist/third_party/FLAC/src/md5.c | 518 - .../libnyquist/third_party/FLAC/src/memory.c | 218 - .../third_party/FLAC/src/metadata_iterators.c | 3402 ---- .../third_party/FLAC/src/metadata_object.c | 1824 -- .../third_party/FLAC/src/ogg_decoder_aspect.c | 251 - .../third_party/FLAC/src/ogg_encoder_aspect.c | 228 - .../third_party/FLAC/src/ogg_helper.c | 210 - .../third_party/FLAC/src/ogg_mapping.c | 48 - .../third_party/FLAC/src/stream_decoder.c | 3389 ---- .../third_party/FLAC/src/stream_encoder.c | 4525 ----- .../FLAC/src/stream_encoder_framing.c | 549 - .../FLAC/src/stream_encoder_intrin_avx2.c | 142 - .../FLAC/src/stream_encoder_intrin_sse2.c | 159 - .../FLAC/src/stream_encoder_intrin_ssse3.c | 147 - .../third_party/FLAC/src/win_utf8_io.c | 373 - .../libnyquist/third_party/FLAC/src/window.c | 282 - .../third_party/FLAC/stream_decoder.h | 1560 -- .../third_party/FLAC/stream_encoder.h | 1790 -- .../third_party/libogg/include/ogg/ogg.h | 210 - .../third_party/libogg/include/ogg/os_types.h | 152 - .../third_party/libogg/src/bitwise.c | 1088 -- .../third_party/libogg/src/framing.c | 2111 --- .../libvorbis/include/vorbis/codec.h | 243 - .../libvorbis/include/vorbis/vorbisenc.h | 436 - .../libvorbis/include/vorbis/vorbisfile.h | 206 - .../third_party/libvorbis/src/analysis.c | 120 - .../third_party/libvorbis/src/backends.h | 144 - .../third_party/libvorbis/src/barkmel.c | 64 - .../third_party/libvorbis/src/bitrate.c | 253 - .../third_party/libvorbis/src/bitrate.h | 59 - .../third_party/libvorbis/src/block.c | 1047 - .../src/books/coupled/res_books_51.h | 12274 ------------ .../src/books/coupled/res_books_stereo.h | 15783 ---------------- .../libvorbis/src/books/floor/floor_books.h | 1547 -- .../src/books/uncoupled/res_books_uncoupled.h | 7758 -------- .../third_party/libvorbis/src/codebook.c | 490 - .../third_party/libvorbis/src/codebook.h | 118 - .../libvorbis/src/codec_internal.h | 167 - .../third_party/libvorbis/src/envelope.c | 375 - .../third_party/libvorbis/src/envelope.h | 80 - .../third_party/libvorbis/src/floor0.c | 224 - .../third_party/libvorbis/src/floor1.c | 1087 -- .../third_party/libvorbis/src/highlevel.h | 58 - .../third_party/libvorbis/src/info.c | 673 - .../third_party/libvorbis/src/lookup.c | 94 - .../third_party/libvorbis/src/lookup.h | 32 - .../third_party/libvorbis/src/lookup_data.h | 192 - .../third_party/libvorbis/src/lpc.c | 160 - .../third_party/libvorbis/src/lpc.h | 29 - .../third_party/libvorbis/src/lsp.c | 454 - .../third_party/libvorbis/src/lsp.h | 28 - .../third_party/libvorbis/src/mapping0.c | 810 - .../third_party/libvorbis/src/masking.h | 785 - .../third_party/libvorbis/src/mdct.c | 563 - .../third_party/libvorbis/src/mdct.h | 71 - .../third_party/libvorbis/src/misc.h | 58 - .../libvorbis/src/modes/floor_all.h | 260 - .../libvorbis/src/modes/psych_11.h | 51 - .../libvorbis/src/modes/psych_16.h | 133 - .../libvorbis/src/modes/psych_44.h | 642 - .../third_party/libvorbis/src/modes/psych_8.h | 101 - .../libvorbis/src/modes/residue_16.h | 163 - .../libvorbis/src/modes/residue_44.h | 292 - .../libvorbis/src/modes/residue_44p51.h | 451 - .../libvorbis/src/modes/residue_44u.h | 318 - .../libvorbis/src/modes/residue_8.h | 109 - .../libvorbis/src/modes/setup_11.h | 143 - .../libvorbis/src/modes/setup_16.h | 153 - .../libvorbis/src/modes/setup_22.h | 128 - .../libvorbis/src/modes/setup_32.h | 132 - .../libvorbis/src/modes/setup_44.h | 117 - .../libvorbis/src/modes/setup_44p51.h | 74 - .../libvorbis/src/modes/setup_44u.h | 74 - .../third_party/libvorbis/src/modes/setup_8.h | 149 - .../third_party/libvorbis/src/modes/setup_X.h | 225 - .../libnyquist/third_party/libvorbis/src/os.h | 191 - .../third_party/libvorbis/src/psy.c | 1209 -- .../third_party/libvorbis/src/psy.h | 154 - .../third_party/libvorbis/src/psytune.c | 524 - .../third_party/libvorbis/src/registry.c | 45 - .../third_party/libvorbis/src/registry.h | 32 - .../third_party/libvorbis/src/res0.c | 890 - .../third_party/libvorbis/src/scales.h | 90 - .../third_party/libvorbis/src/sharedbook.c | 588 - .../third_party/libvorbis/src/smallft.c | 1255 -- .../third_party/libvorbis/src/smallft.h | 34 - .../third_party/libvorbis/src/synthesis.c | 180 - .../third_party/libvorbis/src/tone.c | 54 - .../third_party/libvorbis/src/vorbisenc.c | 1224 -- .../third_party/libvorbis/src/vorbisfile.c | 2425 --- .../third_party/libvorbis/src/window.c | 2136 --- .../third_party/libvorbis/src/window.h | 26 - .../libnyquist/third_party/minimp3/LICENSE | 117 - .../libnyquist/third_party/minimp3/minimp3.h | 1855 -- .../third_party/minimp3/minimp3_ex.h | 1394 -- .../musepack/include/mpc/datatypes.h | 38 - .../musepack/include/mpc/minimax.h | 57 - .../musepack/include/mpc/mpc_types.h | 146 - .../third_party/musepack/include/mpc/mpcdec.h | 148 - .../musepack/include/mpc/mpcmath.h | 155 - .../third_party/musepack/include/mpc/reader.h | 98 - .../musepack/include/mpc/streaminfo.h | 109 - .../third_party/musepack/libmpcdec/crc32.c | 56 - .../third_party/musepack/libmpcdec/decoder.h | 101 - .../third_party/musepack/libmpcdec/huffman.c | 358 - .../third_party/musepack/libmpcdec/huffman.h | 83 - .../third_party/musepack/libmpcdec/internal.h | 110 - .../musepack/libmpcdec/mpc_bits_reader.c | 181 - .../musepack/libmpcdec/mpc_bits_reader.h | 150 - .../musepack/libmpcdec/mpc_decoder.c | 681 - .../musepack/libmpcdec/mpc_demux.c | 738 - .../musepack/libmpcdec/mpc_reader.c | 144 - .../musepack/libmpcdec/mpcdec_math.h | 135 - .../third_party/musepack/libmpcdec/requant.c | 124 - .../third_party/musepack/libmpcdec/requant.h | 61 - .../musepack/libmpcdec/streaminfo.c | 245 - .../musepack/libmpcdec/synth_filter.c | 430 - .../musepack/libmpcenc/analy_filter.c | 344 - .../musepack/libmpcenc/bitstream.c | 271 - .../musepack/libmpcenc/encode_sv7.c | 492 - .../third_party/musepack/libmpcenc/huffsv7.c | 112 - .../musepack/libmpcenc/libmpcenc.h | 122 - .../third_party/musepack/libmpcenc/quant.c | 309 - .../third_party/opus/celt/_kiss_fft_guts.h | 183 - .../libnyquist/third_party/opus/celt/arch.h | 214 - .../third_party/opus/celt/arm/arm2gnu.pl | 316 - .../third_party/opus/celt/arm/arm_celt_map.c | 49 - .../third_party/opus/celt/arm/armcpu.c | 174 - .../third_party/opus/celt/arm/armcpu.h | 71 - .../third_party/opus/celt/arm/armopts.s.in | 37 - .../opus/celt/arm/celt_pitch_xcorr_arm.s | 545 - .../third_party/opus/celt/arm/fixed_armv4.h | 76 - .../third_party/opus/celt/arm/fixed_armv5e.h | 116 - .../opus/celt/arm/kiss_fft_armv4.h | 121 - .../opus/celt/arm/kiss_fft_armv5e.h | 118 - .../third_party/opus/celt/arm/pitch_arm.h | 57 - .../libnyquist/third_party/opus/celt/bands.c | 1518 -- .../libnyquist/third_party/opus/celt/bands.h | 114 - .../libnyquist/third_party/opus/celt/celt.c | 223 - .../libnyquist/third_party/opus/celt/celt.h | 214 - .../third_party/opus/celt/celt_decoder.c | 1197 -- .../third_party/opus/celt/celt_encoder.c | 2353 --- .../third_party/opus/celt/celt_lpc.c | 309 - .../third_party/opus/celt/celt_lpc.h | 54 - .../third_party/opus/celt/cpu_support.h | 54 - .../libnyquist/third_party/opus/celt/cwrs.c | 697 - .../libnyquist/third_party/opus/celt/cwrs.h | 48 - .../third_party/opus/celt/ecintrin.h | 87 - .../third_party/opus/celt/entcode.c | 93 - .../third_party/opus/celt/entcode.h | 117 - .../libnyquist/third_party/opus/celt/entdec.c | 245 - .../libnyquist/third_party/opus/celt/entdec.h | 100 - .../libnyquist/third_party/opus/celt/entenc.c | 294 - .../libnyquist/third_party/opus/celt/entenc.h | 110 - .../third_party/opus/celt/fixed_debug.h | 773 - .../third_party/opus/celt/fixed_generic.h | 134 - .../third_party/opus/celt/float_cast.h | 140 - .../third_party/opus/celt/kiss_fft.c | 719 - .../third_party/opus/celt/kiss_fft.h | 139 - .../third_party/opus/celt/laplace.c | 134 - .../third_party/opus/celt/laplace.h | 48 - .../third_party/opus/celt/mathops.c | 208 - .../third_party/opus/celt/mathops.h | 258 - .../libnyquist/third_party/opus/celt/mdct.c | 311 - .../libnyquist/third_party/opus/celt/mdct.h | 70 - .../third_party/opus/celt/mfrngcod.h | 48 - .../libnyquist/third_party/opus/celt/modes.c | 438 - .../libnyquist/third_party/opus/celt/modes.h | 83 - .../third_party/opus/celt/opus_custom_demo.c | 210 - .../third_party/opus/celt/os_support.h | 92 - .../libnyquist/third_party/opus/celt/pitch.c | 537 - .../libnyquist/third_party/opus/celt/pitch.h | 173 - .../third_party/opus/celt/quant_bands.c | 556 - .../third_party/opus/celt/quant_bands.h | 66 - .../libnyquist/third_party/opus/celt/rate.c | 638 - .../libnyquist/third_party/opus/celt/rate.h | 101 - .../third_party/opus/celt/stack_alloc.h | 178 - .../opus/celt/static_modes_fixed.h | 595 - .../opus/celt/static_modes_float.h | 599 - .../libnyquist/third_party/opus/celt/vq.c | 415 - .../libnyquist/third_party/opus/celt/vq.h | 70 - .../third_party/opus/celt/x86/pitch_sse.h | 156 - .../third_party/opus/libopus/include/opus.h | 978 - .../opus/libopus/include/opus_custom.h | 342 - .../opus/libopus/include/opus_defines.h | 726 - .../opus/libopus/include/opus_multistream.h | 660 - .../opus/libopus/include/opus_types.h | 159 - .../third_party/opus/libopus/src/analysis.c | 645 - .../third_party/opus/libopus/src/analysis.h | 90 - .../third_party/opus/libopus/src/mlp.c | 140 - .../third_party/opus/libopus/src/mlp.h | 41 - .../third_party/opus/libopus/src/mlp_data.c | 105 - .../third_party/opus/libopus/src/opus.c | 329 - .../opus/libopus/src/opus_compare.c | 379 - .../opus/libopus/src/opus_decoder.c | 970 - .../third_party/opus/libopus/src/opus_demo.c | 885 - .../opus/libopus/src/opus_encoder.c | 2488 --- .../opus/libopus/src/opus_multistream.c | 92 - .../libopus/src/opus_multistream_decoder.c | 537 - .../libopus/src/opus_multistream_encoder.c | 1174 -- .../opus/libopus/src/opus_private.h | 129 - .../opus/libopus/src/repacketizer.c | 345 - .../opus/libopus/src/repacketizer_demo.c | 217 - .../opus/libopus/src/tansig_table.h | 45 - .../opus/opusfile/include/opusfile.h | 2102 -- .../third_party/opus/opusfile/src/http.c | 3391 ---- .../opus/opusfile/src/include/internal.h | 249 - .../opus/opusfile/src/include/winerrno.h | 90 - .../third_party/opus/opusfile/src/info.c | 687 - .../third_party/opus/opusfile/src/internal.c | 42 - .../third_party/opus/opusfile/src/opusfile.c | 3158 ---- .../third_party/opus/opusfile/src/stream.c | 366 - .../third_party/opus/opusfile/src/wincerts.c | 171 - .../libnyquist/third_party/opus/silk/A2NLSF.c | 252 - .../libnyquist/third_party/opus/silk/API.h | 133 - .../libnyquist/third_party/opus/silk/CNG.c | 172 - .../opus/silk/HP_variable_cutoff.c | 77 - .../third_party/opus/silk/Inlines.h | 188 - .../opus/silk/LPC_analysis_filter.c | 106 - .../third_party/opus/silk/LPC_inv_pred_gain.c | 154 - .../opus/silk/LP_variable_cutoff.c | 135 - .../third_party/opus/silk/MacroCount.h | 718 - .../third_party/opus/silk/MacroDebug.h | 952 - .../libnyquist/third_party/opus/silk/NLSF2A.c | 178 - .../third_party/opus/silk/NLSF_VQ.c | 68 - .../opus/silk/NLSF_VQ_weights_laroia.c | 80 - .../third_party/opus/silk/NLSF_decode.c | 101 - .../opus/silk/NLSF_del_dec_quant.c | 207 - .../third_party/opus/silk/NLSF_encode.c | 136 - .../third_party/opus/silk/NLSF_stabilize.c | 142 - .../third_party/opus/silk/NLSF_unpack.c | 55 - .../libnyquist/third_party/opus/silk/NSQ.c | 446 - .../third_party/opus/silk/NSQ_del_dec.c | 719 - .../libnyquist/third_party/opus/silk/PLC.c | 423 - .../libnyquist/third_party/opus/silk/PLC.h | 61 - .../third_party/opus/silk/SigProc_FIX.h | 594 - .../libnyquist/third_party/opus/silk/VAD.c | 357 - .../third_party/opus/silk/VQ_WMat_EC.c | 120 - .../third_party/opus/silk/ana_filt_bank_1.c | 74 - .../opus/silk/arm/SigProc_FIX_armv4.h | 47 - .../opus/silk/arm/SigProc_FIX_armv5e.h | 61 - .../third_party/opus/silk/arm/macros_armv4.h | 103 - .../third_party/opus/silk/arm/macros_armv5e.h | 213 - .../third_party/opus/silk/biquad_alt.c | 78 - .../third_party/opus/silk/bwexpander.c | 51 - .../third_party/opus/silk/bwexpander_32.c | 50 - .../opus/silk/check_control_input.c | 106 - .../third_party/opus/silk/code_signs.c | 115 - .../third_party/opus/silk/control.h | 142 - .../third_party/opus/silk/control_SNR.c | 81 - .../opus/silk/control_audio_bandwidth.c | 126 - .../third_party/opus/silk/control_codec.c | 422 - .../libnyquist/third_party/opus/silk/debug.c | 170 - .../libnyquist/third_party/opus/silk/debug.h | 279 - .../third_party/opus/silk/dec_API.c | 397 - .../third_party/opus/silk/decode_core.c | 238 - .../third_party/opus/silk/decode_frame.c | 128 - .../third_party/opus/silk/decode_indices.c | 151 - .../third_party/opus/silk/decode_parameters.c | 115 - .../third_party/opus/silk/decode_pitch.c | 77 - .../third_party/opus/silk/decode_pulses.c | 115 - .../third_party/opus/silk/decoder_set_fs.c | 108 - .../libnyquist/third_party/opus/silk/define.h | 235 - .../third_party/opus/silk/enc_API.c | 556 - .../third_party/opus/silk/encode_indices.c | 181 - .../third_party/opus/silk/encode_pulses.c | 206 - .../libnyquist/third_party/opus/silk/errors.h | 98 - .../opus/silk/fixed/LTP_analysis_filter_FIX.c | 85 - .../opus/silk/fixed/LTP_scale_ctrl_FIX.c | 53 - .../opus/silk/fixed/apply_sine_window_FIX.c | 101 - .../opus/silk/fixed/autocorr_FIX.c | 48 - .../opus/silk/fixed/burg_modified_FIX.c | 279 - .../opus/silk/fixed/corrMatrix_FIX.c | 156 - .../opus/silk/fixed/encode_frame_FIX.c | 385 - .../opus/silk/fixed/find_LPC_FIX.c | 151 - .../opus/silk/fixed/find_LTP_FIX.c | 244 - .../opus/silk/fixed/find_pitch_lags_FIX.c | 145 - .../opus/silk/fixed/find_pred_coefs_FIX.c | 147 - .../third_party/opus/silk/fixed/k2a_FIX.c | 53 - .../third_party/opus/silk/fixed/k2a_Q16_FIX.c | 53 - .../third_party/opus/silk/fixed/main_FIX.h | 257 - .../silk/fixed/noise_shape_analysis_FIX.c | 445 - .../opus/silk/fixed/pitch_analysis_core_FIX.c | 744 - .../opus/silk/fixed/prefilter_FIX.c | 209 - .../opus/silk/fixed/process_gains_FIX.c | 117 - .../silk/fixed/regularize_correlations_FIX.c | 47 - .../opus/silk/fixed/residual_energy16_FIX.c | 103 - .../opus/silk/fixed/residual_energy_FIX.c | 97 - .../third_party/opus/silk/fixed/schur64_FIX.c | 92 - .../third_party/opus/silk/fixed/schur_FIX.c | 106 - .../opus/silk/fixed/solve_LS_FIX.c | 249 - .../third_party/opus/silk/fixed/structs_FIX.h | 133 - .../opus/silk/fixed/vector_ops_FIX.c | 96 - .../silk/fixed/warped_autocorrelation_FIX.c | 88 - .../opus/silk/float/LPC_analysis_filter_FLP.c | 249 - .../opus/silk/float/LPC_inv_pred_gain_FLP.c | 76 - .../opus/silk/float/LTP_analysis_filter_FLP.c | 75 - .../opus/silk/float/LTP_scale_ctrl_FLP.c | 52 - .../third_party/opus/silk/float/SigProc_FLP.h | 204 - .../opus/silk/float/apply_sine_window_FLP.c | 81 - .../opus/silk/float/autocorrelation_FLP.c | 52 - .../opus/silk/float/burg_modified_FLP.c | 186 - .../opus/silk/float/bwexpander_FLP.c | 49 - .../opus/silk/float/corrMatrix_FLP.c | 93 - .../opus/silk/float/encode_frame_FLP.c | 372 - .../third_party/opus/silk/float/energy_FLP.c | 60 - .../opus/silk/float/find_LPC_FLP.c | 104 - .../opus/silk/float/find_LTP_FLP.c | 132 - .../opus/silk/float/find_pitch_lags_FLP.c | 132 - .../opus/silk/float/find_pred_coefs_FLP.c | 117 - .../opus/silk/float/inner_product_FLP.c | 60 - .../third_party/opus/silk/float/k2a_FLP.c | 53 - .../opus/silk/float/levinsondurbin_FLP.c | 81 - .../third_party/opus/silk/float/main_FLP.h | 312 - .../silk/float/noise_shape_analysis_FLP.c | 365 - .../opus/silk/float/pitch_analysis_core_FLP.c | 630 - .../opus/silk/float/prefilter_FLP.c | 206 - .../opus/silk/float/process_gains_FLP.c | 103 - .../silk/float/regularize_correlations_FLP.c | 48 - .../opus/silk/float/residual_energy_FLP.c | 117 - .../opus/silk/float/scale_copy_vector_FLP.c | 57 - .../opus/silk/float/scale_vector_FLP.c | 56 - .../third_party/opus/silk/float/schur_FLP.c | 70 - .../opus/silk/float/solve_LS_FLP.c | 207 - .../third_party/opus/silk/float/sort_FLP.c | 83 - .../third_party/opus/silk/float/structs_FLP.h | 131 - .../silk/float/warped_autocorrelation_FLP.c | 73 - .../opus/silk/float/wrappers_FLP.c | 201 - .../third_party/opus/silk/gain_quant.c | 141 - .../third_party/opus/silk/init_decoder.c | 56 - .../third_party/opus/silk/init_encoder.c | 64 - .../opus/silk/inner_prod_aligned.c | 47 - .../third_party/opus/silk/interpolate.c | 51 - .../third_party/opus/silk/lin2log.c | 46 - .../third_party/opus/silk/log2lin.c | 58 - .../libnyquist/third_party/opus/silk/macros.h | 115 - .../libnyquist/third_party/opus/silk/main.h | 438 - .../third_party/opus/silk/pitch_est_defines.h | 88 - .../third_party/opus/silk/pitch_est_tables.c | 99 - .../third_party/opus/silk/process_NLSFs.c | 105 - .../third_party/opus/silk/quant_LTP_gains.c | 128 - .../third_party/opus/silk/resampler.c | 215 - .../third_party/opus/silk/resampler_down2.c | 74 - .../third_party/opus/silk/resampler_down2_3.c | 103 - .../third_party/opus/silk/resampler_private.h | 88 - .../opus/silk/resampler_private_AR2.c | 55 - .../opus/silk/resampler_private_IIR_FIR.c | 107 - .../opus/silk/resampler_private_down_FIR.c | 194 - .../opus/silk/resampler_private_up2_HQ.c | 113 - .../third_party/opus/silk/resampler_rom.c | 96 - .../third_party/opus/silk/resampler_rom.h | 68 - .../third_party/opus/silk/resampler_structs.h | 60 - .../third_party/opus/silk/shell_coder.c | 151 - .../third_party/opus/silk/sigm_Q15.c | 76 - .../libnyquist/third_party/opus/silk/sort.c | 154 - .../third_party/opus/silk/stereo_LR_to_MS.c | 229 - .../third_party/opus/silk/stereo_MS_to_LR.c | 85 - .../opus/silk/stereo_decode_pred.c | 73 - .../opus/silk/stereo_encode_pred.c | 62 - .../opus/silk/stereo_find_predictor.c | 79 - .../third_party/opus/silk/stereo_quant_pred.c | 73 - .../third_party/opus/silk/structs.h | 327 - .../third_party/opus/silk/sum_sqr_shift.c | 85 - .../third_party/opus/silk/table_LSF_cos.c | 70 - .../libnyquist/third_party/opus/silk/tables.h | 122 - .../third_party/opus/silk/tables_LTP.c | 296 - .../opus/silk/tables_NLSF_CB_NB_MB.c | 159 - .../third_party/opus/silk/tables_NLSF_CB_WB.c | 198 - .../third_party/opus/silk/tables_gain.c | 63 - .../third_party/opus/silk/tables_other.c | 138 - .../third_party/opus/silk/tables_pitch_lag.c | 69 - .../opus/silk/tables_pulses_per_block.c | 264 - .../third_party/opus/silk/tuning_parameters.h | 171 - .../third_party/opus/silk/typedef.h | 78 - .../third_party/rtaudio/RtAudio.cpp | 10205 ---------- .../libnyquist/third_party/rtaudio/RtAudio.h | 1163 -- .../third_party/wavpack/include/wavpack.h | 420 - .../wavpack/output/arm64-v8a/liblibnyquist.a | Bin 2142564 -> 0 bytes .../wavpack/output/arm64-v8a/liblibwavpack.a | Bin 214412 -> 0 bytes .../output/armeabi-v7a/liblibnyquist.a | Bin 1691076 -> 0 bytes .../output/armeabi-v7a/liblibwavpack.a | Bin 160080 -> 0 bytes .../wavpack/output/x86/liblibnyquist.a | Bin 2060308 -> 0 bytes .../wavpack/output/x86/liblibwavpack.a | Bin 210856 -> 0 bytes .../wavpack/output/x86_64/liblibnyquist.a | Bin 2442692 -> 0 bytes .../wavpack/output/x86_64/liblibwavpack.a | Bin 228388 -> 0 bytes .../third_party/wavpack/src/common_utils.c | 771 - .../third_party/wavpack/src/decorr_tables.h | 1077 -- .../third_party/wavpack/src/decorr_utils.c | 204 - .../third_party/wavpack/src/entropy_utils.c | 378 - .../third_party/wavpack/src/extra1.c | 704 - .../third_party/wavpack/src/extra2.c | 929 - .../third_party/wavpack/src/open_filename.c | 304 - .../third_party/wavpack/src/open_legacy.c | 114 - .../third_party/wavpack/src/open_raw.c | 315 - .../third_party/wavpack/src/open_utils.c | 1279 -- .../libnyquist/third_party/wavpack/src/pack.c | 1726 -- .../third_party/wavpack/src/pack_dns.c | 191 - .../third_party/wavpack/src/pack_dsd.c | 669 - .../third_party/wavpack/src/pack_floats.c | 270 - .../third_party/wavpack/src/pack_utils.c | 1418 -- .../third_party/wavpack/src/pack_x64.S | 1941 -- .../third_party/wavpack/src/pack_x64.asm | 1852 -- .../third_party/wavpack/src/pack_x86.S | 1840 -- .../third_party/wavpack/src/pack_x86.asm | 1827 -- .../third_party/wavpack/src/read_words.c | 614 - .../third_party/wavpack/src/tag_utils.c | 597 - .../libnyquist/third_party/wavpack/src/tags.c | 179 - .../third_party/wavpack/src/unpack.c | 817 - .../third_party/wavpack/src/unpack3.c | 1703 -- .../third_party/wavpack/src/unpack3.h | 119 - .../third_party/wavpack/src/unpack3_open.c | 289 - .../third_party/wavpack/src/unpack3_seek.c | 212 - .../third_party/wavpack/src/unpack_armv7.S | 887 - .../third_party/wavpack/src/unpack_dsd.c | 616 - .../third_party/wavpack/src/unpack_floats.c | 134 - .../third_party/wavpack/src/unpack_seek.c | 375 - .../third_party/wavpack/src/unpack_utils.c | 411 - .../third_party/wavpack/src/unpack_x64.S | 957 - .../third_party/wavpack/src/unpack_x64.asm | 930 - .../third_party/wavpack/src/unpack_x86.S | 970 - .../third_party/wavpack/src/unpack_x86.asm | 958 - .../third_party/wavpack/src/wavpack_local.h | 895 - .../third_party/wavpack/src/wavpack_version.h | 19 - .../third_party/wavpack/src/write_words.c | 688 - 509 files changed, 224321 deletions(-) create mode 100644 ios-m1-simulator/libs/liblibnyquist.a create mode 100644 ios-m1-simulator/libs/liblibwavpack.a create mode 100644 ios-m1-simulator/libs/libsamplerate.a delete mode 100644 sources/LabSound/third_party/libnyquist/CMakeLists.txt delete mode 100644 sources/LabSound/third_party/libnyquist/README.md delete mode 100644 sources/LabSound/third_party/libnyquist/cmake/CXXhelpers.cmake delete mode 100644 sources/LabSound/third_party/libnyquist/cmake_install.cmake delete mode 100644 sources/LabSound/third_party/libnyquist/src/Common.cpp delete mode 100644 sources/LabSound/third_party/libnyquist/src/Encoders.cpp delete mode 100644 sources/LabSound/third_party/libnyquist/src/FlacDecoder.cpp delete mode 100644 sources/LabSound/third_party/libnyquist/src/FlacDependencies.c delete mode 100644 sources/LabSound/third_party/libnyquist/src/Mp3Decoder.cpp delete mode 100644 sources/LabSound/third_party/libnyquist/src/MusepackDecoder.cpp delete mode 100644 sources/LabSound/third_party/libnyquist/src/MusepackDependencies.c delete mode 100644 sources/LabSound/third_party/libnyquist/src/OpusDecoder.cpp delete mode 100644 sources/LabSound/third_party/libnyquist/src/OpusDependencies.c delete mode 100644 sources/LabSound/third_party/libnyquist/src/VorbisDecoder.cpp delete mode 100644 sources/LabSound/third_party/libnyquist/src/VorbisDependencies.c delete mode 100644 sources/LabSound/third_party/libnyquist/src/WavDecoder.cpp delete mode 100644 sources/LabSound/third_party/libnyquist/src/WavPackDecoder.cpp delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/all.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/assert.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/callback.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/export.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/format.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/metadata.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/ordinals.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/bitmath.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/bitreader.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/bitwriter.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/cpu.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/crc.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/fixed.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/fixed_intrin_sse2.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/fixed_intrin_ssse3.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/float.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/format.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/ia32/cpu_asm.nasm delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/ia32/fixed_asm.nasm delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/ia32/lpc_asm.nasm delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/ia32/nasm.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/all.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/bitmath.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/bitreader.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/bitwriter.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/cpu.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/crc.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/fixed.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/float.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/format.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/lpc.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/macros.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/md5.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/memory.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/metadata.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/ogg_decoder_aspect.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/ogg_encoder_aspect.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/ogg_helper.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/ogg_mapping.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/stream_encoder.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/stream_encoder_framing.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/window.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/protected/all.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/protected/stream_decoder.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/protected/stream_encoder.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/alloc.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/compat.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/endswap.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/getopt.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/macros.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/private.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/safe_str.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/utf8.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/win_utf8_io.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/lpc.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/lpc_intrin_avx2.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/lpc_intrin_sse.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/lpc_intrin_sse2.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/lpc_intrin_sse41.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/md5.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/memory.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/metadata_iterators.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/metadata_object.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/ogg_decoder_aspect.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/ogg_encoder_aspect.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/ogg_helper.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/ogg_mapping.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/stream_decoder.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/stream_encoder.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/stream_encoder_framing.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/stream_encoder_intrin_avx2.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/stream_encoder_intrin_sse2.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/stream_encoder_intrin_ssse3.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/win_utf8_io.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/src/window.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/stream_decoder.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/FLAC/stream_encoder.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libogg/include/ogg/ogg.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libogg/include/ogg/os_types.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libogg/src/bitwise.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libogg/src/framing.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/include/vorbis/codec.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/include/vorbis/vorbisenc.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/include/vorbis/vorbisfile.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/analysis.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/backends.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/barkmel.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/bitrate.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/bitrate.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/block.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/books/coupled/res_books_51.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/books/coupled/res_books_stereo.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/books/floor/floor_books.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/books/uncoupled/res_books_uncoupled.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/codebook.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/codebook.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/codec_internal.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/envelope.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/envelope.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/floor0.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/floor1.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/highlevel.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/info.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/lookup.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/lookup.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/lookup_data.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/lpc.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/lpc.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/lsp.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/lsp.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/mapping0.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/masking.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/mdct.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/mdct.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/misc.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/floor_all.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/psych_11.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/psych_16.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/psych_44.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/psych_8.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/residue_16.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/residue_44.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/residue_44p51.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/residue_44u.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/residue_8.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_11.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_16.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_22.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_32.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_44.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_44p51.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_44u.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_8.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_X.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/os.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/psy.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/psy.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/psytune.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/registry.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/registry.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/res0.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/scales.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/sharedbook.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/smallft.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/smallft.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/synthesis.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/tone.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/vorbisenc.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/vorbisfile.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/window.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/window.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/minimp3/LICENSE delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/minimp3/minimp3.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/minimp3/minimp3_ex.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/musepack/include/mpc/datatypes.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/musepack/include/mpc/minimax.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/musepack/include/mpc/mpc_types.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/musepack/include/mpc/mpcdec.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/musepack/include/mpc/mpcmath.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/musepack/include/mpc/reader.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/musepack/include/mpc/streaminfo.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/crc32.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/decoder.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/huffman.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/huffman.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/internal.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/mpc_bits_reader.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/mpc_bits_reader.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/mpc_decoder.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/mpc_demux.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/mpc_reader.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/mpcdec_math.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/requant.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/requant.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/streaminfo.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/synth_filter.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcenc/analy_filter.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcenc/bitstream.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcenc/encode_sv7.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcenc/huffsv7.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcenc/libmpcenc.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcenc/quant.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/_kiss_fft_guts.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/arch.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/arm2gnu.pl delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/arm_celt_map.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/armcpu.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/armcpu.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/armopts.s.in delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/celt_pitch_xcorr_arm.s delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/fixed_armv4.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/fixed_armv5e.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/kiss_fft_armv4.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/kiss_fft_armv5e.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/pitch_arm.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/bands.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/bands.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/celt.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/celt.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/celt_decoder.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/celt_encoder.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/celt_lpc.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/celt_lpc.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/cpu_support.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/cwrs.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/cwrs.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/ecintrin.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/entcode.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/entcode.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/entdec.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/entdec.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/entenc.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/entenc.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/fixed_debug.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/fixed_generic.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/float_cast.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/kiss_fft.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/kiss_fft.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/laplace.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/laplace.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/mathops.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/mathops.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/mdct.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/mdct.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/mfrngcod.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/modes.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/modes.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/opus_custom_demo.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/os_support.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/pitch.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/pitch.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/quant_bands.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/quant_bands.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/rate.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/rate.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/stack_alloc.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/static_modes_fixed.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/static_modes_float.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/vq.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/vq.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/celt/x86/pitch_sse.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/libopus/include/opus.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/libopus/include/opus_custom.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/libopus/include/opus_defines.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/libopus/include/opus_multistream.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/libopus/include/opus_types.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/analysis.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/analysis.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/mlp.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/mlp.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/mlp_data.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/opus.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/opus_compare.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/opus_decoder.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/opus_demo.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/opus_encoder.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/opus_multistream.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/opus_multistream_decoder.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/opus_multistream_encoder.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/opus_private.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/repacketizer.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/repacketizer_demo.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/tansig_table.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/include/opusfile.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/src/http.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/src/include/internal.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/src/include/winerrno.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/src/info.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/src/internal.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/src/opusfile.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/src/stream.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/src/wincerts.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/A2NLSF.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/API.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/CNG.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/HP_variable_cutoff.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/Inlines.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/LPC_analysis_filter.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/LPC_inv_pred_gain.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/LP_variable_cutoff.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/MacroCount.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/MacroDebug.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/NLSF2A.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/NLSF_VQ.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/NLSF_VQ_weights_laroia.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/NLSF_decode.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/NLSF_del_dec_quant.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/NLSF_encode.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/NLSF_stabilize.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/NLSF_unpack.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/NSQ.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/NSQ_del_dec.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/PLC.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/PLC.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/SigProc_FIX.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/VAD.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/VQ_WMat_EC.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/ana_filt_bank_1.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/arm/SigProc_FIX_armv4.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/arm/SigProc_FIX_armv5e.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/arm/macros_armv4.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/arm/macros_armv5e.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/biquad_alt.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/bwexpander.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/bwexpander_32.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/check_control_input.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/code_signs.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/control.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/control_SNR.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/control_audio_bandwidth.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/control_codec.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/debug.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/debug.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/dec_API.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/decode_core.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/decode_frame.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/decode_indices.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/decode_parameters.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/decode_pitch.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/decode_pulses.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/decoder_set_fs.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/define.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/enc_API.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/encode_indices.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/encode_pulses.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/errors.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/LTP_analysis_filter_FIX.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/LTP_scale_ctrl_FIX.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/apply_sine_window_FIX.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/autocorr_FIX.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/burg_modified_FIX.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/corrMatrix_FIX.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/encode_frame_FIX.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/find_LPC_FIX.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/find_LTP_FIX.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/find_pitch_lags_FIX.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/find_pred_coefs_FIX.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/k2a_FIX.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/k2a_Q16_FIX.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/main_FIX.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/noise_shape_analysis_FIX.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/pitch_analysis_core_FIX.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/prefilter_FIX.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/process_gains_FIX.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/regularize_correlations_FIX.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/residual_energy16_FIX.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/residual_energy_FIX.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/schur64_FIX.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/schur_FIX.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/solve_LS_FIX.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/structs_FIX.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/vector_ops_FIX.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/warped_autocorrelation_FIX.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/LPC_analysis_filter_FLP.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/LPC_inv_pred_gain_FLP.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/LTP_analysis_filter_FLP.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/LTP_scale_ctrl_FLP.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/SigProc_FLP.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/apply_sine_window_FLP.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/autocorrelation_FLP.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/burg_modified_FLP.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/bwexpander_FLP.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/corrMatrix_FLP.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/encode_frame_FLP.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/energy_FLP.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/find_LPC_FLP.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/find_LTP_FLP.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/find_pitch_lags_FLP.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/find_pred_coefs_FLP.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/inner_product_FLP.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/k2a_FLP.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/levinsondurbin_FLP.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/main_FLP.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/noise_shape_analysis_FLP.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/pitch_analysis_core_FLP.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/prefilter_FLP.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/process_gains_FLP.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/regularize_correlations_FLP.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/residual_energy_FLP.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/scale_copy_vector_FLP.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/scale_vector_FLP.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/schur_FLP.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/solve_LS_FLP.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/sort_FLP.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/structs_FLP.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/warped_autocorrelation_FLP.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/wrappers_FLP.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/gain_quant.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/init_decoder.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/init_encoder.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/inner_prod_aligned.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/interpolate.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/lin2log.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/log2lin.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/macros.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/main.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/pitch_est_defines.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/pitch_est_tables.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/process_NLSFs.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/quant_LTP_gains.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_down2.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_down2_3.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_private.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_private_AR2.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_private_IIR_FIR.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_private_down_FIR.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_private_up2_HQ.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_rom.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_rom.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_structs.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/shell_coder.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/sigm_Q15.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/sort.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/stereo_LR_to_MS.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/stereo_MS_to_LR.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/stereo_decode_pred.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/stereo_encode_pred.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/stereo_find_predictor.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/stereo_quant_pred.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/structs.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/sum_sqr_shift.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/table_LSF_cos.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/tables.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/tables_LTP.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/tables_NLSF_CB_NB_MB.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/tables_NLSF_CB_WB.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/tables_gain.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/tables_other.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/tables_pitch_lag.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/tables_pulses_per_block.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/tuning_parameters.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/opus/silk/typedef.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/rtaudio/RtAudio.cpp delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/rtaudio/RtAudio.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/include/wavpack.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/output/arm64-v8a/liblibnyquist.a delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/output/arm64-v8a/liblibwavpack.a delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/output/armeabi-v7a/liblibnyquist.a delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/output/armeabi-v7a/liblibwavpack.a delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/output/x86/liblibnyquist.a delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/output/x86/liblibwavpack.a delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/output/x86_64/liblibnyquist.a delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/output/x86_64/liblibwavpack.a delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/common_utils.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/decorr_tables.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/decorr_utils.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/entropy_utils.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/extra1.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/extra2.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/open_filename.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/open_legacy.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/open_raw.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/open_utils.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack_dns.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack_dsd.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack_floats.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack_utils.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack_x64.S delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack_x64.asm delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack_x86.S delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack_x86.asm delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/read_words.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/tag_utils.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/tags.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack3.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack3.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack3_open.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack3_seek.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_armv7.S delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_dsd.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_floats.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_seek.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_utils.c delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_x64.S delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_x64.asm delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_x86.S delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_x86.asm delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/wavpack_local.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/wavpack_version.h delete mode 100644 sources/LabSound/third_party/libnyquist/third_party/wavpack/src/write_words.c diff --git a/ios-m1-simulator/libs/liblibnyquist.a b/ios-m1-simulator/libs/liblibnyquist.a new file mode 100644 index 0000000000000000000000000000000000000000..bf657ab5d0cbb4d93f75f64110144a5c587bfafb GIT binary patch literal 1976920 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

P#rnd=g`&&O~^_2Npf4e&DP}U2j z$E3N^1JWFc(#W;TsT2#uvAAaAN|9oas?k!upj>we$`vcdig~yeAXNkS0sNzalaMZq zK`P#Fi{_HKw6J@qnpC6Y;By?7};oOlzC9}5IgH0cYCRdoiDGO zuM5{dxVG||`5Jfax0VwvAGDOVtZ13l64m0@;@NV!`G@8M&2Kc{p;_MiXmeWgwC01F z1DcVV-I~be{hGlVL$jO4uene2hnjmdT=NH-%U9zyXRl7y)LtDSjga2QH3-*EjjJY8 zvrV&AGhXwe=1-b8q&K8MT#c=vt@*7TV!PNT{wlVLzlhhxed0y&OEI$bE8#2QpSY&A ze$Ri$eaHQq`zv>idyTt%y+Qa)Xc1l)-V^>Id@B5zJHs`L&xyyxwCnZawCl@+Wx~6- z{w~&td&OL_NoW!-aOb(J+|S&z!WH3f!mENsSSoxWd?GXo_X_*3MF_w1zw@VsXM`PG z4)+^>H(z?~68{tTIk#E(m+&$FG5@Xbgm8{O$FCLU3qSHd@|$o~3fqOtoG;fK*E{?p z{8YZ0|AwE)kK#sgKk#+@Sx(2f^I!8b`J?<2{uIB5FX5-~75qm22%pWJt>&t@1nw<3gp5$hLe-+76$W7uhxcj-W+-xqE zE0FS~N5x0Q0l4lX`6Q)FV3_yF$j`vrUve$n>)dv zu01T3OKYSm< zUXaC+ya~G6P>$rWfuq)ibb?i_O;-2TjME3jdWwNXj)V5uN&i8&>vvgHjCN)X9 zQiq^iS0sznC^m}s;)=l48`tmBwzj(k(o zM4?V}7rz!~ibusI;wf>DxCz^ElzZEz8fBIiqkw2omlPJ`@ZswR|nV2$D2W_=_+>cw9KZ zAK*s{4+(>XDq)w9AiO2a6Yk;f;g>gmz>nbH=SkuY;s^0N1y|uEAye2U#0yUgMZ$P~ zJdeFXg*W&&_{&#(G-t1%6}w53-o#GF^X?<@iEK@&()gG4hJxirH7#B2isS+N3{=W7uq|-4)N>OjO+JZ z8`iSE*{iugmekKT6*L)|hBT3c=9)V76_U-k+J%1$ZNm3LtMFIhy0B09GyiA)8nyNO z>-=-LnuV*vGJYA~gew=<72d)(^7o?kj^L@?_QiEs=q>DTdjVQ&-?mHK2W`K~vK3Ml zx&&zsXM`_>3##sLOgJyRCj1@RLXEIjs2848P|sIwkFqN~9g!Cy>O?aCN*pe;hKC z^ofsAf6j3~a8slTX`^&R%9c(_M(G43vt2G9mK3@CN~dH_yJnZn2c(gZ$s})kLH62Z z?zENP`>445>R4f{P(Xbd$X*+#BBdqZ-2;S(te|58Lafgwlv9oFdlrHm&Ow;?(_e98tmGjEJ$xULr|K9~s^2#^>Vfr-MWxlQh=QL{^FyDH+UK@0im^AM*0^ntI%xPHYC!JCQSAp0L?OH= z+XpA30u#a<7TAKoVR0zIpg6c&ENDcHh+9%jaj?=8S_UI*O{w2 zo;M@y=6xj_%x~Vm$$WU&Yvut>W#*T@*lHg4##`oVODfFB7xO3g{Mr1j?+4~>n%(A? zFMVWQ@z0OVk9_&5`Oc~;GxE%w`rZ+9b;ajqP5Ci%--^GQFYGvBF8=Uq^S}0Hj97}g<7VyE>-S(x2@Iox~0eKg#s;eG+`{SL7_xG%dH%`QC=!|D$l zW_7JGtoYd&_EJkMYrpF#J6NiQzX9%t!Tm(IO~+k`_!|zfB)G5oF`BKL3-@0hW;?}L z#d(fBG=fyTr1*u`!JQ zXDk~y<|un`of^Ik?xW#8Sam-Tm~sdwy2mivm(i^19^~1NhuJarSXR~^&CY!l%QVKL zw)E%Vo>eiH3il~+9{_h0|L>w$RR;18cI);b{Nc#|UkxSfgHBZ{#n4>8jf@Oc^hfIrdf2%F&@%WR7du{CeTGTpSJY-x$=UJv)haNieh zAHdB_O#kd5R`>5{mikOIvz?4)JH#Vwun*EN9%dsq#IiLH9A)3HhI3_a7ktP9gt3 z2QO=*nZEB4b_wZU_x)jZJU*6X<|6&rEsd2S{3?Wh0Pa!lY$)8fA7G|W;Qkogj|08V z%ntQK{0D;nq$8{~B$k~iJjz^_O~NVTO0(wT>V{7b9;}b2(D%k0J55M;7bAC^qSno> zJ3~7uH<7AeiK2djD2^1IM)G}`D0qlkz2N50JB<{fisQ@4JKML1OE_JLq1&yP3%DzIRN`s3GxNMq%E?s3D;Vqh6ilHwq(cqe=`lK@Y`l z39>O;P*re3P-To?P}ewrc`PyP(AptkeMK&8+_OK1S~u?sJ@cpMLT6;=%$=MwC)a~1 zKkjjCe_5pCJluR4K1U-+WnKWL1av@I>HH<)sjFEuxKjQVy4~UN8uu#yg0NnEQF=-9 zveO3bE6y8THo0zglj3?wlij8G-co{xl-Ng_;weq-E8Xh_hhez8`ge&4`ps}p?a4bb zc67H6AE@Nt!|r*vbLSZUOMO*$dH-AdvG%uH{C9Awe=0bd+wqJLJ?s##KgjQDdwP0^pJRIb?d8)$`iH^4uJy`l z_rI%symR!|?GOBQw7=Hw?|&F?o85j7{O#y}u{}PH_9;K%SC8pT?2`Ym=U5Nj?D0_1 z(cI3Kc58oR?ig=xy9f4oOL2lUS;Y9Glt8TI7;kbf|KikmtE6Ln8EnswTje*&Th*PT z|DEY|@SkKo{kX@I66F@aX%mqi)DF;xdrAh)52N1_WZNAD~j<=;l!!$JKZ^yziRwngM+-bInX!xr{=R=+T3JL?WJ#T zIa_ZsqZexXXO|*3*-_iM9?hveyPf}P`_yCn)b#aePVE!^?A(1*{HUJb*Q0xCk9=?A zp4uI!+n7^3b36Ccp4`rSFCurl_)|M^yYQ)9xSjtb|8Hkrjqq>hKgspm#gFO}tn`@w zB)@Oxe(fKGZ-e>m+><=MUHtzjek4Qspd*Q3ZuwK)_h|k{^^4>O;@_itHRF2Z&p$Gk z<+{*w{>LGFB(cZvNj~DI2BQ#N|C4;j+J_#^)%4$FUS`558e>80fLk#DuvWpD)e($s z!~4BJBs$0+xC59vUM`2k89>ze#1sXMNkD|3n5dvJ8i+L-i6#Y&BY_xPO!QaKI1Gq5 zCF&J44hCYcfJAQ~s(NDmI3@hqK+wj#v5dvyeYS$e!K0OUXn_EB@^Sl7BmZJf182i-v%K0w;o9D*8$1j zwF(+jf#6r;!$A0FoB`|&q(dO!pD_st|BQ)1_-Bj;!at)4Na-C3jD~;y3K~V=4&?vl zQ5b>2`wa>jZ9$CngZ(8yh?pQN5JiWQ$eE#5a~$N0%0%loIgfPfMr-ozX3+|6AXe_@|p|>e$yfh3WTQI+z_xyie&B|BeHRUZP_R zbM_O96f|Z7!K#VaBbU%P8wgfTOjXcWjLezOvNIg8Rmrw8nNziqgc`K)w9|z(uC=vh2-#7)0B9Ou*L!fadlYc=Q0NY@H29W$oQE=wwNX0&l z@{;{kK=RL~pwSe^SP19|3L3+Kp`gPQH0pr{(1R5;?oC(nWk)JwCcH0K&}e;7d0&*l z*iytJ+lmMPcL1LO`sXY3=|>rR7xbAt#@++Y&Q<73IgBj^y%|X6R+SzJd=K>L`4}?; zuFsa+;UGPb(lJ;;?~~N`-YV^-(uWF^ zawrB;zOGVm=8ne{|JMR39>oe83xUYz#5@I!!AKOPXXoRJy&Vb~3xTpd1&zT#itq6y zjI9P%0l{jCdlfY908;sSEmQJo6*8IfWgFH>2te^EB|Q&6sl;=Jf-|?RQvBNtB>y%j zXtb?lYz^EM0qK3Ag2wU{N<6nIXw(Ba*qgCjd7q-7@w82e|0xBHb%@tieB}zQ9ffNs`f<`akJ1`f4+knw)87l{d0g1n~KvdNr z(=&{{4fF?+eQ#g|keF^ea2M>o2`pFLuLqL34fqyt2`~uZ7Aa^v1$PwAAt3&OHsc?K zGvit1eH@U=#|udB>z-5McM2%GQ*oz?!9cRF2U7Y5D`<2BQo6RO{-mr^=r|zx6RzT5 z759`f2CG3kfv=N0An|V*unf2X_#*Ouy@E5>0U;Bz*D5%(7`PtxRsruqJZuUYi-51; zeIk&`FHXUkCg5hg4+HK1dH@#y4TILDL6A4sD-@=Kq`l|z)dhOR&eGjAd(bh1CB!YOB6Kj zLE$>#{Vt$0a6ORnFB?eZl>#LG3Rck@NcnUKh$0B`W{gcnk_h9`R3dGJIzm)c_b}C* zFahS_3hD?^kKI?P=7fnbFIG@Th@bmj{3HJfr@*{QK^-CFiF+fE%n7H$yjejVArJFt zSR!-6dtpxPA5cdKQRhBeH787hxm7_OAw;74D%G5D8qA9o)Dc2{xYKw5`A?V(^F0dc z2q6mGPpRgF(_wyEK^-CZ-W_{9$?geLVD6!yj!=O41l64IKA4*n)Dfe!VH)PE2twZ zfO#U2+!M}$d6I%ULJiE9sOE%oVQy1UM+kZ0PWmmmC$z%6TtOWnRNfus=gV9bq2KGgX>!7--V_ z$v)wH*e_O4N0<-uS5%ttPSAUSWS=kx_Nx@s5klU%*Qzw(aL~b!7nGm=K+1PLko@%q zQaO15DPG7k29?a+1Y86R2fhMC-C+xXNx&jt9B?BLAj?5LkmQ{Sh@X2Z{y_w|+kmKQ z?q$HIfK@<}J9R*kFJy`2h#pAt!UPn6sle4h8*mM<47eOv1q5rk*8!gdlIN>{df-Z+ z3Ah573Z(jD1EMJ1%YalLs({77I-m_mfe|0;fmDv+z@flk;Fd152{h%;3?P+Pl4@?J zQ$bTc+JKa=8-P?!>r{Jox(qbse-)6*qYj87a;HR5xp@PrygYyuzMa;CM%lQVfW)_{ zK;lnPNSX1l6BZyGz;m(ddOR1quEp~umts6$a%psN;>&yO=!Mw!KGxfb zZ|>cS|L1zwq*c>Yx3 z=|YY_R(PtA$N%Gat|~l+=c>X(crGuj!gG1y4m_6?mgBjsa9g1$tX90u0B(DdFMkr)_!Qs#6mY|8e)DSZ$>}xx znKgXf8oa81iNE*~uz3UDx&gTPHNNaMSg~#4S8d^ox8Sk*4gT00{P8znYTL@M+RAJB z^;`K3glo6*>$Z}WZTzuq{PAsg-0>#A^G$x&n|LgLi{J4Uzw<3DrQYy1zxi#flU(;U zJ@SO>32krls|YW>#W%hMC${(aRqye|@4@fm@A0PytKZ{~5f=ZMU;Agoq4ho9_Gi@L z45~bk1vEQ}ek4DMHpMFRE|oqGrHFpts`Lz0KKiw)^e_k|`h`*@g!_jfl<1eH(q1np z^y4Z$68a_m%2c{gr9V;Wy&DvBo+>Tkd0eHPRJu;3-BkLLO7~G|61w#3uhJeWJxHbX zDy>)PV3od8rA;awsM1L)eYZ-ds&tr2=c)8KmA0w$M3r8r(q@$|Q|UOB-l@`4RJux~ zX@gWb{VM%{O4q6M!zz7ArPEZJ8W;M_QE3mA&QfW;O6L&`85*q83sgE>r5{&mlS(fm z8nQD^rJq;nhgJGbmCjb_Jt}Qe=^D^FG$`v-`nXEJtI}Vq^!qCPca`3)(%-9erAnVu z>CaU9yh0ed)3zhyIv^#h<9GxHf^`}MvbhJv}qtdUb^dgnMf3sqLk4nGvszP5? z>2J`fqF=0w;$I*-XY_ksrN^uE*D9T&(pOY^wn_)MD((|^D()XqX{$=VpwdMuU8B-_ zR9bXX+@DtIJ}N!0*`M_K{-$q)M|r3f;Gt;=iEM_o=j-O24eq z-YR`orS&R}!<6OxZdU1dm2Oq(Cy0g&V3kUEPph<-10C!@+Z^aU4)i4l+VpXE|5F`k zn*+Vmfj;g)Yd`7kU$_IE=RlV`(5D?}?cVPGnH=aM2fEyWKJ7qb_ayme&(B~7I@N(* z=Rj9E(De?q_OtH(`#aEa4s?+NUFJZaR_RWD*w@|v!47ni15Gog>1R*x9+igZV!hEm z&0Z%PQ=eL<_m(R3=PEtyd4(PZyJSCDr5}*#Dn{cz^vhFeHov+5mhN|>n(B!^ejei)?aD!?o|0b(+V~Ik~Q0eRp zh0apxB`W=dO1D0zm_Mu1h0iMVYbtGBqR=0x^szMxeORSMmHt|#wNEML4Jy5NnL=Mz z>8f;vrnZLSZ~qNa>BeW2HzQQq4N5xwB2@a+LWNFNX{&1AqSEWFig}(&?^J2(Pjm^6 zQGcQOp^_wPB-R~_hHXbZdAALc+OIM53m=n@C|1qXVg z1HH?E{=$L&)`9-Tf$ngiJ;A$O<3G@W_H&^99q79qXzKrW^>2a$ZFZn(GFn&r(;euC z9cbbbi{(MXIP67bnJsS-Wy#Db%*fA4%TAIvj~W-bV0LD1H1?~CNlutLy)e{bF^qXE zBON6U`Re45alK6QGi#b8LcrsZ1-^V2d53nr(>#L&wwf#OY1fri-wjao2g4)(t4DcCOQ z>E?CM=?NJ#DWh<@eYdUH%dvKt>zuCe4w{iep0jt>AWlnzD{0wI4 zd|3$Ia3C$S7R+&cl|HNUO-7L=Jv+DHh9`KDi)41SKy){6R6CaL{?G<%U7Zna=^jHk zEXc^n>a;Z{G{jPvYbh{{>3o%$lX)WvnWznEg*PIn(%m9sf7c~4+2Hq14~gjJKz>2C zE%)Ut%*>f>NzN!(K-p-oJ7cG$Wo5+X=Fd+n#Q!L;eoW>pvai&w@MI)RX1mTxd2`(f zzE#}`?#fg*>P~{fd?CRWi&D8QsEHYt^xXOLb8{vq&N9TrkXfNMKX;)eJ0oXqq1BR+ zpP!rG$-4$acJ5r%UHPp!Bqk{#U5@VbLPJPb2hlg!-4L3;Ag3^MeunDE(A80Qvo5Yk z0^OY0Tcy=8sb&LY*!0mBidV{H$B1>l?H;oH`u?c~q&~f>K}CXsf@xLdX}p$(;NQC^ZqG5kFI)_^(u;IfWV7@MFFlM_|VM^t?qf&d+@e*5HITF+?a2CK^VQfUwLV zUYF}*Qi3%zDRa6(E{sIO*u+q>KN}e~TglO+uvy68B(xl%mbv+ICWB0{D&B?5-W4p$ z0UyrIPs>@5osl$Wx+ODnx@EfRCADcJr_!w%Nb_T}@(a`E%Aw9fxFPm%RZDV(MC3Ax zk{%;Vne!JV$*m&!AV*k@ffD=})tM}o=0N;|+mj4q)wlE0^19g$MiMgT&rUB49Yc{! zN|=*L-l(l}{+;9vv&3!#6Z^e>G5ji!HN z=-*iS7f%1i;h!Ox{*emFXBNqm8VIUVF5jl4R)aRK=$W9=i3-V z@LWql`W#DkZqD5Q!L>ngU0}rqpZ~k_`I$u-sK*rd5UN?K&R3A0mYp#tjkG#SW|CE{ zeF+ZLZ%$^6VT=-yytMqnOcF>1|2OYKW$*0j#Q({!(Q_^HbJf%t3`kuz>T{mu(GWy? z++1*49*RzuN8kXelve14^V4#Y=Jb$URMeO-aHg8X|JcoFxB%R;P*^!-@1MZfSmN<5H_FJ8M&6c{M_`6f&yewf)&yle@U5{ zG05q>G-`^dE>TX);ti6R2|NoaH@OS#kt6wNk%hJ_tfyPZBUn+*$0Zs< z)K-A_QI?^^jcQ8}M#eIy$|f-eBmyar8yRRSXg81CU{Xv^6J0W#Rb`le3iKWhifz4TvlRhc~ zV-!OTcZY;yZ&v%yFlKDY$Q^cdMPPV!h#kdX)V zCR*9)cvN~`-Y9&7m4AP|_Deg)h~%y@{X@5%*)SHv^tkaGh})m&9)3IfDh5@m9Xm}! zvvi|dE&re)XB6Rsto>)Pq{PgiK{bcpA&djlkNhJq^ZMi454{kXjllkc9+wW4TGsN2 zyB+I-Jky;2(ypSl%Fc{-!h`?-1r>J(y^!aWb<$Pxo7?}p>CBlCbmok%woW}G1w*2p=atZT9*tXBY5h=| za)z^A@caXw&#LFGXn$It`~sbQ)8)LK0-WhwfIaN3Ll}-$v^}ro&NtW7Il8c;#aWE< zKJ_@)Pe$?+=f$Mb`75r<`75_Nd*CdlXmyOBGh=i&pBV!`Xup5$&+C)VBYt|EfhWgR zjU$;khG7r8>$wH+zqVuL9kt!luWP0>o=2KP;cp#~{QkeBw|wOzH=T*I-=4mecOZQ? z&Ih8fI@5-*9n;ovkj|VDah{Nb^NKV$Kb+2_?0)79m7$f+oLR=kRp88-Ot-T9^R74( z=zHZ18m&9dpc&fb3>r=MGidr(vC_xr3>r1<#0y*+D}8a6at=4e@i97==KHE~)m-z~ z`ejw)w0!f}Ta{xZ&S7X<9EuM*&MTwyK;?1+?+nCwUE2Ef$-Y+qX5vv9&#zDBKr<&LuRD2;&bYuC za9W)E>1fWcvtJt{I0}|?)a{f=| zkbxC;zwGbu8FXDd&Oyx#98h6@mpR0{g7QO;GYV}ulhvf&&l zd%dyYyeRuKorQ4)`TLh=Bb$qH4yDf$?WTtW&(h-lsPA0=nq{uV4d+qrR-B<>#hJUC zJyGA)b2OUac7@QtW-#MR25ASC;2XeYR9>7n<&Cp3l(W({{Ki#m>d#ufk>zK8JLN6nA*9 zNw@R2tL)Nx;asXaOqJWgyW7FLIPW|w4SCMeOyiV#WJ@NzmAx&n=iCS9#5JQ%A^{Q}G6?}81J;DtT5q`l0&O0kfM`LBOpvyLiJBm7xzJm%)hk47ZL2N$U2+ZT zwFu}HwU*x7e+}xdhKC|n3$fb#zw4Yc$z%w=+WsE@|ILTPp1t?lueH}+d+oLN+8Z3m zJE1c)Tit^8&F(dK2JY)H-p5j{Hxj$9=wf@`R-#cSMi!x8i+kkr* z7kZ++)26z1)3ylTKAFVZuN(#J#`n%8I^lZ#KVCrM2}k4!6Aqccnp+H*%L2Ur zOFC#)cz7gEczEQ^!w5e&`>TZcWG3@T@!rTgXU2H3^6Zb^BjZuvWSm9n!MNh`DC%R$ z4u9<%MLPNE@Lt_|yNI%QzsG#zsGm6A?K!wdU`+ZjVWocZ{r7uE#k}`qzJnzAiS&`+ zCW2G>Ei%yuU$X&ghbH>UM$vP#&{bsK>l_&F$#{!>)OmV>;j~o=&@+aOx7rZwl zAcH9Fh|W7(=?8c1_%gp|3{>Y_@JyrZJagQ=W*=tESD9+q>4Usm-OYPhr+JIC`ybW0 zjm!&O)c-uPEV4{mXR&H_zx9o+9d@@dj=Ly(j=kt-=SOOLJ9y8rgS_N@Qh66v+B2hW za)HRFCy_6W_eaUg`_qOUeai>d>OX;PfOluw(@)EsA~=o6rV@6Ly1!x@a^zL&I5wso z!mC~rS|P7YHT3ji>b`4`k~b{Vg!c+QKd%1-k5YcMy!B|w!;wDd-g%ieSgehwCBMU? zQE@M8+9J8XgMY?f_s$_&q6)x@;~vno5>A|$F}x`?v_gN(rk3m9x2ce(W31YsbsCYx z&77l$;?>jIG;C@&*-AFWt3$RMl-g}C;OBAscowK}Vn?wpE(3^taV$d*#3f*0aVRbe zh|ajLP&)Y}tD|IjRLgq6rp{>dE`H0ZduNe0DJNl{P5Vm1_ib8rR-;YZr={`pcUoM7 zjeEkED)qE2?gbk)K-u!LEw00+9haYxCQ3OeN{o4qYYA`I)Eis`ZM1#G$||12TB&-U z%91_U8n&)(UzSB=*3xAwZe6=9(c779U>WBg4D5aW{~(6wzfg=nI_`7*j>#_+n~B_S zf{Lk+P9_?r9S+I;sD7T&WK_2gA*kJuIBPA|cgd@^uRDd%>^8FpT|?YM%seYju3ZNQcG&cppj z+yL%ET(Q5r5?AcC{sC9Vg%)y!QrRk4{vr6lU5IQb_pdB}$8;B-!DY-X?=;EsrbQj8bP^nJ^cozI7pwO0jzNedbKZ9G0{}Ap}+;-e4 zxQ|)ka*5vr{7tw;v6`ZsWA5WW&u@Uz@>7w*QD{@ZTFH(K!xR{S0-{xRHHz&(ol1>6^$LY^x3 zC@v(PEBCudKAUg_zsqsIh&#t}$Ky&r{0{dj+&}{V@oyTgfd|~{@aI_WDBPL&({QCc zv3r<~`<~0}ucvXve*m`x_xrdW+?7^*1+MhlJY4CwIi|a?1Xubk8Fw0Pd!kwXe%yKZ zODy*S<=ue)IPQF0c$D04G$;pm1a20t8#e=Y7%qJ;`zVHe=os7peqasz(7CweW!O8? zM&-jl2e%Zr2{#M30XGjfgvp>xib};UCT!z4)CS1v9H!gpJ_T%cfk6PjF zxcoEhSf%|!WM14XT)|HOHw$+W?kL<4F8>TWR>tF?{dgeNLBh9<`r<+#gO1}mabK{) zblU2+Hie?N71DlnJrHPz{+1`CteQv>Tq0Xq#T`~S2#rWl3v1s_ojEiXh*JJ!Yi18nY@xKz|KO5tB zQP1f7N5}YYit#@f{~a;@<{1BvV*I~| z@wdhJ|2@Y4T#WzK82{NAza2i?r~NVhD`NaI2sotHpN1u`YVl2Sj#2u4JVX&g8j235=~V^v11*VzgXi_V4QyLC)?|8GY<>*ljKs>zhnYAu>BdT zE~oen1Cah~bv~uhOss33#LYKVimgJWnQ@OH zilFIlu4%n0FSfkOuP<9%_xCNdhcf<7NQ@zjtMVa?Ti0MPv6y4h9RI~oYSpdFZbC(U z2?CKW&zoS{>{)cuLmQJ#+Au8DEd6(cW%Og8a0%14i!IVDo443uV%p!#{rf4}nMESz za~D_2vY+d}QVagRm9k9q`Y-#7f6ubTvWe5bRqVZR>~-~unww0!i2t)p+VTo9dop>Z zj93nYVsj=IGcuPiUABA~RTs0cHHAIKTn6L%Yc1le^pmiF;w*b1hm*0ns#>;Y7K3Jd z_4I z?!nNfPdMq8WjC!^y-v&ku_2C{o<3c5t>iIWvw!-6m9B=i#D?;sd7|GGC0F%nP<|CV zkS2wg%zt8)kSF%fJ(OdHTl5uEsUC8g0CsMH(3dP;im8M#=gWz0jOgu@-b6zm>EBLdq|JR$)`c+xE@XvB^n;PVXfn0X8i}HQA8*I=PNxNmepLRpzhTx-|H#-cm!LjfBAyJs@tUR} zQS|~!XW8RouT5p~8Qt(Pc03J#0f;{#C!taC%U<^<{W&=kNRyjfa=w%^>AI$Z4$dn3 zyzTCjcAtNFifTrM)%1v_n%}lNT2Mcx{WN}1czm`hyxEZyKARXQymE{x{Ev8b>{U&z zdfT4V@|;~&d|`dyzLn4V!zs4Fy1X%m+{w;B;SAfLy0M(`&9teyM9#S-Q}#K#v*mut zFH05XjZ%f|g*?t!N?S$Vd4mFlF>#OGOZYpp0&A1U9NJMDuToysl23;?hu^^&Lum^r zYpSCy|2Ng!MZLi*_7$pm-o(J(d%*cwaE;16jXlM}CP#8O8C;~Ol;FA1$K1)blwh(a zu=UZJl?7$-N#XIcRpC3}zZ?9YwI{dCk5?5d!GH6!W5ZtXpFQf3I}iL90qYH@=1P@R z2aQ$Ckbd~6yMle?!t020kuS6C8guY=9(5O>Ab@C?k)+vv= z;+*~Rb7zaB`z-uC0w2rQWd4oj=l?%$_lvIVP&r$JO^wXqiK9a0$S_UM^P8>o zH1O11d6_!bF+x>T4pZm6392HAx$nC5uANOaD=(y^iVcaQ1=%I7B+s>TQ=AsQ3wg-q zw1tbAV>cofWyh&w%*U%vU;~ke9m8wTgZ=Q8;iW3DZWHr+l^!VErL;O1^3?{e@XtlQ zvQx$z$YZm}^Fi|b5qUm9US8&LkuBoLe-rt~#v_70mQCEulEB)kQHOS%rJrXgyD@M7 zo_Sl^P&CMD19>OU4s`X~hJdZN4JEcdZCG)>`}4JdJRcx0X+sNjxu^|R{NnezKei2m z|FXiwo#ST*_G;k&HSmwzob~`RkKJhxSAmx}6&EZS^|ZSRw`xRS>&V)wf)dhfinE39 zLLQn)pH$K(uVI^V_qpzh*Xffu`sADR$-mGio9L5Sz&{B5gUDU4DqEeCe%VF;JojOD z#S@e@llUs)ZzjJpv`6AZHkLS}@2vC>5dS1?UJZ=YF`ha;7*)pysN*K;II4DOL8MG0 z&6)1UM(XzPQu-1)G5WGn#TkA10(te~VQvo|SYxO4sT(p)bX(`Y^9gN*7fV}DS#8~i zjQOeYN?HH&D+!2@Z2cZpHTjV$^+QCY1l#9 zxCg+#_oJs2_W-Dt%mme%qX$|YMXJoV-agomZDZ*{-x0r3au>ta99^}}Jy*HbH$8cQ z&(VHk{^&z)mcRLPPgE92SnwFzu$So*e1zv~Y5utm)$Aj!q$^DctStqmlyuiy>HMUV zu(718C0!}u*K0%k;H&IZQbSO8s8soVn%_Rn8TM(eu;eGu6t^A|gDsA#5s?;oPq-RmN*5*(J z9&-(pfR<^wir04#!e<4rS}puX{;PZ2wPv^pPEUd|+#2 zoiJxz_5NxbFsu!8sEfe+@&Y|L_l-W{J`K*D7VZ+j-4+9PN8FU_Yul?gmQmjrM;W95_S)1pCj!fg#SVt>c8zqwT?Ao*<18e9k{YH*ge#N%^aF!@l%V$bF$zw_eBoCEL9z4w`S9nQ{o4gQp~*y9+~*~_bv zd0AA#)LPHD^~no%p$j-Uc(Ysjy>hx*-HzSi+`mEIe)6u2L@hz>eXhtLsx%>bkIb^eo=1Y6jC=mRa8*I8*pwJp%9NxS&%)vA6_E8DSGQ>49a2u`1a0rB z%Rf0UfsHLMQWoW=`R$ld0CS3Z*HUkNy?>{ZcIzK4yN~{LodO?+!H1vlAmOFpqf~Rb zg5YEBgRbG7pRx{r3%ukopZcXQz2^MtU~ZiwbAlEqWG*W>gAQ)qWf}0}Lk92I1r6O# zzm9{K_VOR*D)@)+xFCG2)|mGa{LbstI)6%Fzs#>P7dpR!KQGE(q1O4z0{cbhnjo;u zDbaJM0bdpqCTUjn&OOFFd4pOfGR&o92x+5_Hu{kvN|7Ok9`ql{p^fiz&(INDpz!d! zl?5kh=Umz;bLt_+_0iYN`RKV9BlFR(-J2P|M^k&--P2wz!7ppA!^B1Ef6DIk&l!Da z$7FDlK0WaBmj|ilqGVMTx%VMcrJuf^bxgy%GVey_!e6^}_;a4pvzeP^{4sYuJjk5)ZURTHnib4l*S%DS zTu?Xq`5kqHC0J|C#&vc3v0ZC@euz0YKF{3q0AV;kZY2iDs@oJ&1+>2d>$Hke)J3O=aFZQ5xHLId<`X6rHk-4Cnd2YiXWEjnPIt0J2vG^@~ zC@6ED@Y{_RpH;}t@Z29n_^j~NC)TS~A$aVo(El9VMULY8`s0(A;=!zIn*59@9hZHM z=GuYE=qKSxi?sIXg8RjZ`n9g5P35j%wyj>m?;v4SxN#%A*T%7GY11_@955Fv(xa`M5G%$iYkNL(|lz*RL%tLf@ceom>1tcZHw& z`!!WKBTlV)7@VK9Ykp`m)s+?~5E>3^uEVZGSGbOQW@^2qhnb_!dD%}1tPi{>;~88U zuFN$~#<0k$GEQ}PmCiUWJ(zO@8MVuWoHHj%esv+gRu3b8RWLb=I*80F`MJn%9`gF# zj1%~OmqX+z$4l-wi`z-^ScaD!Qbkc@CWnZQ*aL!S!E_igW-1)4#_Oj#&5{_)Y zu9xRL>vqETBwXe${ehW#x!>XlveXYW6=?GwUwo&G17nRyoFYzs$KGM|M|4B)b1xA# zm@WG1Z2 z{JU~zNcraSdIPRE?QV1>`n%0W`bb)tci;O$5i-|Pd!+u+eyL~oUG`&Vr^c;#YeM{r z(_;s$I5~3QiVttrxo5RW#hDu4VB53T;iJDbXfc09ED>&F_)C*!US|Db#=?y&hkDDT2` z54^AZe~|7UzV_|%e|_zt)xWztT>jzf53T;Uf!oV}@IN0~ePsH5Y>#uuGv+dc=n;yKOXSi@*ltZ(CV8vJlshZ=+T7xtQJ$)t(VmjD;@oR8 z=I3t88RK~{=W@^N5i@hk0`qd8$rHp`=uM^=5F&(@;vUJ?D^tXuF3uKqB*&*_zOJe{e_;4oXMWToJpRq zq^Uf%J}L#rKxJ*fLU&lKc&+DF}69{Te`t98Pj(Q`a+7L50V z?)!H6qO?7$6A61$&-Gk4w!pJ$Y@z2}-!#ulzUiK{sZ%^1S2vXhsAncH+nh5z6Q@q~ z?4JCC@+|suIAM=Fr+U6S^-532j>hu#GY_pELD(zKX`WwBy~5M++faEZZqMq=2s`hb z?s+@sYR`You_=?N;}p-3u~&G8=3MFdO(A_m zct>HDCqtj&xrzS&0_ArUjP%&aE2|*eqY>T;tu#{hgXA0MALBU!ZqEE9E_XI%Uru>V z(8Z!D`JQ8x^)t$_jh*cI$WFL@Q?-=bFIn(PI$rGwo z{C-m(?eVJQ0~+p^oufTB@%@}{Q$S!+4}_>o#|+i>6k%D)eZZ>*A2>rD$ElP9PXn`w zx(x7-^R)B3<4V<*rG}A)-&5uH@B<@5gAaJePB3VH6EwMry8OmB(la@fdSDUs+K~=i zDCK}Rlzbpd@))ezTm=Q5v7rpojRp7F;DNpxE^xyR)B}?Ry>L$v{^19D;xonXK2W3w za!V4vkn5%1Pl2y1^^u+;`s+1*U!iAviu5AluQlTB_RBpJt@vzyPcq_*89(!hFYw$z z*aW?RelPT_<#z?YZ&*4rw@A&)Ra3J(+X+h{%sbWVInM8^jQA4bgGT&X4LY#mxAXgQ zBYqa~rAGXI!Ujar^LvyLKb!cuM*IcB>{fgR_0KlquOWVp5nn)18aP%gKW0T<-Zc<5DrEUS_NnGrqpcn3S<~ zAM_#P>jB22jIklUt32gXay(NR`x#RUJ>Q3C#ZkW(7%P7u-PhoIFEReU%UH-`46K1R zrSE4lt~N1-R^xhc7Z~Mcdu*;Lv}cMZk8!AQ*N&BXPW3FL+zrs$F#j~qT~o(<{*y7c ziTn@I?mxf}v*Ev`Q}R4DjOlMvo`-U#6=ZpKGcFc0c6RbT#iz(;RL)d*`zX&F_`ik! zF4t(!SK;qt+LI4F1O2`^IM8-^DE+{jgkQ%PET&Bx!NZedvpq|2Q+z(p)&d{x1~9FmneN#peE|HeV@GF=B<%90vAHAL2OoHfG~?Te19kx4m?nSj#K7PKZ%j5}|HTON<-Re&^nWuv z+B3Q-CpRmQabT>Pk?U<|oCh)w1gM89nCdxkWuPr<({$p89q1SyXqyn4mOG(+*nz;5 zLgJ@*7E^XMVL3p+MUS_=eKKn<{49WP7qh#cc|lo?yN%B0O7_FkVK2 zPcI*Hd8nlAwS;2k#cU(Yt7emKBY&LS*tQBXcmaIT- zGxRq4s9C-i4`-A#=az{6rnaWGU^%*<#$|K2)YU96m=oVHxF+7=*GI+sxNEbtKlwBw zn@&Q$lQn^6H+4jzc=ed$UY!=KS?hR($Vw`J}b)KyIe7Fr`xD%J(eZ#b#u!d`8-=kNSl{VaJ++8}P zMaquo9myL#V_!Jq9#8HX-9j5`X+zIFrFnsi?>|{?efDZj{vG=&bdGX$3G%j*j=QBoHvl6(&IiNoD z#j)?l{+};^{`#8(Qyf|7#V+F<0<@Dep1X0OotzPz9sMY!`Q)nazv%eYPv5N>@vC>A zUG?F+`ub;g>K~P|pT%18#JZPs-P8dX@Ye5WoXEO03p$J7#pt_%imQD7_u^;s4+Fkx zbZntPfsYmys}F0?VQnrp@lnHmkKp4V_-J5Xp#gj}cs?CIIG&p(u+`j)-foTIXqq?2 zvP%27d&1vi&99Ft+Ur0kF!h@Qn>X0ixwzj3KG0al3%?Z{PC;)|X!I+0kfPJ9r>+}| z1Mt?tJ$K<&XA@UHY*h_$TL&`M{xI;$5chY#!0-Oxa?YW@lRb^MxRaRvK~K``M6cjN zH;|CZxz4vYmfwReJqdbVX-f*HFvjz2s`-$n(ndN5gcrvJ+U)ZO?fh!{?82qQ-?jFu z2SzfFmZ-q`O%Eg|Z94A##}ek!2k}3M|3UoA3^|K63u`3X{Dhsemd@^pn?>9h=D^wS z&0hZu@Xr9x`n+waKF0Ge$VX#Bs_g;f%~{oEnmF-WWz4$Jn@^;SF-mKba^i4Hme1}} zr&%BN10S;BaZ6Ulz^iL|>e-vW&C1`_Rgks>6`+-++R{n8qC7WX4)B1rAS@5_e4KeT;{lKeuEC2YmlEz;6VrZgd z#5FzrQ6>HyWbsgZTXDfij}3R(3!Ir+yX=4+nQhq%vyI=`{4Qzg&1Wg;W@Yu3EA;cN z9HF5BR=ES(O18zokLm|LWWnQ>Y>$D@=?7j7wDKR=R`UHA_;LNfhb(y9lHD=z_yLVZF%RPi@OO zOuDi`OI01S3qxzG4rHPKDr%p--V4w1!cRmtpLyLi>#Oir;kU!nMhShYgf>~PYPdyD z$G}(g10S;Baf=Scz~9ghyh^n4Pi!kX8Uz28e&9nEJZ{koG4PA}fmeg9{0Fray&MC- zv>*781&>>FJO;kHA9$5y<)746^t%}N<^8~iEO^|aju`lr{lKeaEC1xSqBmmT*YpD) zvfy!xI%DA1_5-g{to&2jiq7x-d>V(39ZJK5+cvO_6tS?Cpz729Ob5P9`< z`_ELxQl}oSXAKupuCSdsZb^GW^RkY_<|_2?U#nhGaM$?nw0`T+@3emHGL`?-e3d_v zbAXHD%(=9xJy2MMe{uEA2W-&cGf#IomS1=DWUS*nqdS6)~^%31{xo_==dn`h+uAX?#V@Q+>jji!{C>=A%C0 z%sm=k(WaPi<`#{ws39htxkTeDYK#eIuF&{I4v{%SyH zF>^wnaQMEBuNdCnCmcR+<12>8_X&rO+xUv%<$c28+cv)92V%nE%Qn8^Ju%_%VH;oZ zzL;?Mtc|Z2UfVZ+C-Ba;Vt8twaQLQ;uNdChCmcR$<129WyeVvd?^wpWsian^2Y!p!`TBat&BVP<|8%a$YInKO|u zBXXhWm_Lt9DZF(ta)j`mnNQC)@)KSwVMP*V$&z09Y!BQa3(g8N;4B%^3*YU5I~vK) z3^U*?+0hFh?tyzDl3x^@B{O>A%RO)}NAfenjQlKF(F>pMfjb__FAC0*5xwy39=P8{ z@-xGX{4Ckf3m@-+>xkqR1!u{G?1A>ey%EXJ3^VexWI^^Rd*M1G`9;B5GN2c}-&5|H zNPcFRZ^+<%`U*#L|7#uU&E=8~)E3f;NpbKZLIfzmM>Uk?@F- z@b>Hmcm-}T{Jc*b{M?AcExr&F2VXbSX>G;u?Y`-(IQVxlyt+@EvRUbDZN>2CK5_78 zvpnM9$$jGB(`I@0wqp2jpE&rinT|MkZ=X07XQhj4D~8|piG$yo>4<~J_K8ETGt2AC zR}GxOYrWu1WIWLW^vHJb&%SvKu<}5TgJ<@MgJ+s$69=E{69?}!%SN7qH};8xH=5~) zgCF*ZQ@WK7xegxKCk`HHrXvo%*C$RntaQkC@VY*6@H#Ucaqzc3ams0>L(YSz^@)S0 zndyjwkM)T|{xjlmi{V{;;^1c{ZbcRp+*-2Wb=UOB>aqsOhBs*qUUS_GZ;HtAMjZUe zh{G*{AN7fYFPZ6(3*kY1;^0MQI^y6ved6FhW;*0Ucuk);c#fHlIQUDSIQWd24mlB? z(kBkyVx}VwKGG)+eqyFWUW9k_iGzoj>4<}0^ofISnCajP--wBWS153{?!)f%XGZk$ z3hnm3d}0QAdf^koFCu*-YZc)UGeW90nok(v@P`>nYmMd+CcFkb;Zgj-geP3tTBCV` z32y_Q@F>1u!V|9Stf1A!+zYP_59 zge$!@daRr9I`D)?jdK&8aOG%?9^)pw19-xt#4w2LVrb)VMX_30Fz2(PP$xPXeCssPSsT6Rwh5qsOWVpA0Og%;XbV%;Xc=%j6SU%j6T<%H$JT%H$K; z$>bAS$>bB-$mA1R$mEm0&*YQ-&E%8*%;b~)%jA>(%H)&&$>fv%$mA3JXYvWYGx-F+ znS6rJOg_P1CZFIblP?I4E~R@Cy!EGh5&dlJ0%r+X4S_osUjy!WSjl78q<_ayz& zpYBQesXyJ5^jm+rC+WxjbWhT+{pp^hpFgecNob)z-ILHpf4V23mHu>3LOcEGo`jbA z(>)1o^{0ChTI)~uB(&F`?n!8|Ki!kiW`DXTq1FC$PeQw&qvE)foNZOk0BF?d= zHdpgrp_BdT%8ydc^37dqm9^Y-i^JJ*nQSwZz_6pjrz{@sntF$wd|yQv)hMVKIiGf zvd?~p9k=^mw`6Lm=N#At>ObA=-b;OanmZ_U@!Orjxrq)JXN7z<*_?gArpmABbsGf- znj_dC=K#QGE%=y<6M+cfQ0Km2De14g44zKf67(G$8?K>$u;EUvp?|ou zEUj*Oz)BbB+UFo0_j7H~66>DAjzs!N(!On^y`oQA^ITS-i#{$$;O?_6xa*V3k%&(Nl8jkNdlqR&$Mnx5^w0ByvHQ~o1;w8I+Joc5H_?__>QhVqv`|*qnGvr2>5$fOyam0h zNUf^lTvX#MRW?pjt(Ew<;D45J?u4G|=}*TmHkQ{=pHg739cq=hx+H96sHcmw9nx2c zz{p)-<88K}*qS|mFwZDg?8H`5?pf-0mh#TlXStf3j_^71>YlDvUHRm_?xdd$X}yxW z4`yiU+)3^yxtse?@HaO(IVW<}^{q1~@7!;A-x^$~11n!T2rjZlto`{xaKS!Q%OY@* zJ*s_2(X_cQdDAv*9hv>`&c#X#j|>C~y(NJ{JM@~O?7@ztX6lt?)GLpAt)gDMg_Kr2 zjk`SVbnUd)R9#rCla9MFDwW-!*O48S1>DpZd;>eT=MRoD((-%XaO|W9(B zz4O!STQh0jJGAc@?aTYOl`pl^z7*QmPW!TKs$~`J(?%WJkwyCy?X%IofKp)_?NhXG z$$Q-sy|lqb8*DX8E(CPqXah2*(FPlB$fI9gH`+h4Py3T;Lo#hhp$#F;7R(ye?&e&M zad(@lT~)A^{fY+4@61s7uMWUw41V2dAL@TKRjt~{Z?T0;=d9BI6Q|M|8TaNrHv#PI zp-0C3E^Uxeho3O+>$D`sz0l+pMjawF>4e9W!p9zFj3h!!*eM3Ze!fmiFviIIn!1Ai z=(hG$cSQyDlk%^k9}{pB`LHSD%v`A4aqFF1@A)O?j%z-|8{NpDs~(BJ+g*uU7aw--!Yz&8;(i|6xw9$i+-}ZKy-@U}{mIZ$d;OR8 zXW>41@JsuPai7+1*kAHd_e9!}cC4s!zY*WvJ@H_D<$i&&@%yQRmHP!Q?!)eh|IRp& zdvoBaF52k&5_ZNjH2rjav#K!9R;9NH@0NB1oGQPQ`}dSnRUnhq>Ej#Ru6R{u;!HK4 zgm3iNehzVk8*6F`u%#S;$9*alP4rhXHuBBPr{g{Pgyb>LyOV55{wJ2HRZsf@x9^5WG##ugIAheDdpDWXB$C&fVo`BZ$yn1(C z-o5Te@|xVGdCfb-Ua#RV-4lg&kI;wR15{nLH+-XGLtv|uGih5Gqs#|sF6{P#HNFCU zy|!R%4=-}H$h}EHhacEa~2Qkuy|0% zC3ujs_41!5k%=OF|15m}X6P&l{(3WX_Ne9vCyh{pg%3W;eI(D*_iy{2cQ;X|L92(h zJ_3Fo0hcR2=+1vDUZvhc_;crmw*CirHFz3z`Z#`e_TWgPyeqBplHg^@@UmujS>CAL zyD>Ys8#B5tFZ{WC;t9$S{(fX7MQ-TBCUt>3i;3WX+4K-af1-e2*kvftckAG{Wvr9UjUsOZGzuj0|_{z76 z3;!uWcpdc_=2EHasL!i5%{U`FX}Bu8ko4W)HsZJ0GQw-3 z>b#9QZ==rJsPi`JJX8;re|M;w@EGO3Y)f-(`+=6Sjdt*r@vdvDv_bzMY4X>p^9Aah z@x;oPx~OwO=GvckQRfWaZC^)P_vOFcaRYVENZ+va29*&WK9jg>0)>BesQfAR;lZw? z9l^p4f&2b!8y3EU`rJsJZ>P?g8_aXPH&Evfq+P_Hx4FZD=L}%h#^CwU@DZ z3trRh>8|tC`8;*zD-%5Ld1v6{YUwY=-Fa}F!MIDOz8Q?W^R|qZwbZw3%<&zQsqcAk z{3Vqh{-Bt+*@40-166*S-5vZ>(zf6$;5b7Y8eU6Xw$tZQm+m{&D($WAiW2%UV@6=> zFcs*UKxS%$S$|lRFidN}5-=i(v{d8JGX3`xRS8 z@D=WLy{+!H0_j8bZg<7^8Aty>{>PCk-Pa)N+ucUqBVH$+eMApF{{p`5B<~15GyYgv zFwHh1c*o_xb7z3}jLg8+?X_zQ1kWAsbyxhHd<)6JoWuv?bizgAN6l^SESK@=fRmyI$cW-SCe)dI9mhGbi-yn za`(f_?sWPueTbScl)4~OyeKmKIe6{^*uTJQn;wK8d=u7FNE^`pSvQus$DyyLwj>^8mtUq_anTc+Tk*|6_KV)Mzdw!LSEn>?uVA?{Pr9H-9?4saSakG3*EpE&5^}`mlRM!?X zY6G_Ht2XU;!tpMDEjB#!xLamEd0w|(U$8~$JfZ(26<=$YnVfgbxQQnt`Hm7~?FaZU9%cG`8n$SsYuTV$6^&2{>< zx4SF4*X68T-hJ;RC%AYEeL)rTsPs+1>hD@`(R;^2J9>i51&pb(Q>1&#q`em-I1VC1 zo%)G=uWx$bzDU?yWYTezxzeIdY|PSJ#yT+^Onx#eyppmOS!D%B1nw)UJ6-TvydEx6 zYTaUf7saV{_2TMk-4Wd7@$+1+MC$)db*_^;F|uFpuGod$(dqB)a*w^S?t;dg(arle**7ryVy3k& zeUH9Kelp*vYlKGR?v7$)pr=@qdPhCwE~3x8tVx&DEG~E+yo}}EuU$n&tG4Lo`mI{@ zVTtOP6aM3ZPt+l^J9C{o=heqGUw408^CIxGgt40neoDcQ^o45A4KD&e#o%WNe6yCZ zSC^;;=XPy)>2yu*+S2uL3m(=s{OnZC*tLG)3!7za?`+xlpWW~xQ}^Uz%!}^H#h6FO z(^540$sK<1P|BDWy+TCy$ij8$)+#tZgFn>PHS1+H~EiEvQ5mFTH-tjVs}!2F*9K z#ylo>;XCS18T3+nf%X|Xy1S7H)IyMKVHU=98v>rv=LGw7rWI*~EkLnr7=PpuobwvlnZi#Dsn-4(SK zJ=9tBP-oFY0D5pn=)s~(X>Sqj4bt8dv{%tymqi2YDfFR%6SNh6Zj>LPfk^*5qx#=f zTU$^YQ?JE;?ym6tr8|AiXqhiUsioeR-5qwnf7e&lDjRDmX(zh9v|7T)Vq{Cb{G~B@ zWIc81w)LU)sJ2~iwe8oel}gnR1BdrBJ_UamJf=;IYVQ-ai`y$Un@iArEdl4TZEhLU zOY=sXfjdoK%vWi_`_U83JZR2+k#y1gmHN65v!<%l((0CAM_da%3GZFO+}DD>y_EPO zP4gdsUOo+O0@xj2s^9;=ikpq+yYp+22i~&Vf~DT)41E0(e05$P=!)oxeT-dMPs*C^ zqdQ8`|IcL~U=I5M*RU@z8@udT+@EJN?69}6-gL1>g?A#yI*!O3dVYXPDMh~kPdT@H zMR&zqbWSzspXMSL`f$4_PjpM&PigEmXyj=lZ#!kgQC2*A4FmQXHlN%X=71*rD$q6e zpznxJsebQMlzj}B>d zj=#QjE_b*+tJFl16&-Pb)*10?)nVHI2<>s`f!34g*nGI6%Zc3YBzYrm8hQ7X*`IY| z&zo#C^&*SDUl&vVJ|bL=goAdiT?S>%y2OCCW_ z+>%Y(Mvi%M$Ev8djk4Od)UNW2xm)^m+Lrv}NTcq>v@P3e+hTOWW!$Ov8oK6Wo6U&N zV{Mg3yp6UMBTE+}OP8UW$s43n&uR%_8}%uJ7L5G?EyaKKkKOsKq0*{o^HSQ}Oq)m1 z<_#*&;O`@8GdkRU>kw&k2mD*|E#7y1Ygs7I)n7S3c?UfTZS91<44Q|&lAztBC$Btm zWfZ-ijnb8N3cW*LN!a9c*5nq*8m<$$rV^T|M`q20c3m~5T=foeZDhWbb&t^A4Bn^d zV4ig8>^q{9%K@L`ptA<(Oz!`Zxqc6Kf5}|0Yl;3VsGrUqeM#J<`WEHvLDuQkbOR52 zkaZ4eIy&_R=JYF!duVm&CM zfhtDFYP*+V&RQBK{#+%WT94=-q-9HTAh><+)+VE@Ee=nm;djMMa zcl2n_php{cZ~%8v+goHU{XV*~_t2GXKu`8Z^knz5{@jDUWe$3>23%PKSARuSY~v}U zA+^;7+nhtfAzS7v`GR-Gfb1E5hcU2+@%Cxz5na&}1Cm$OdKt^? ztDnC*u=P9oknkS(R5yD8ve&%_K6S{Z_e&>_!<&Ux+Tj`1&Oqys`iZVv(P4fbdb}a! z6Y!q;+3@~t@cwz*v-`|n-=6JJ?YUInEv8MMx$n@o?))p-mc@Q!PhWje`94oyUEmx> zf4Hsw6!q#47d>=z(yUt=bQDXYrRc(ze2V;Id08ayETK{Os6nIP@bk2LZG10{_SX&> z3q{O}pS4df{}k=&ue?axI?#_x+YG$XHaWx4U;jjp<&Voxq0_8pPshj)9&syq3!ezG z$G3{{EpeIg$;KIrU4)Ni{VTG8+^sAAho9}PSVg)ZYfqU+BRY^Dqi>Gvr>;cb9JxOu zGKX@;sHqD5GkKYJP^N^+nH!s)A#5P-o4A9sL*+x!3C7O1p^>KUIY-lX%3Pj--dWCe z$XYvrIeQ&4nj5|IpE=7VX-~0_vcaBl`pze#1G*;i8qm7Mo`axL=KF|gHG}mxvBP` z|A?Rb)41<8pZw<_M+MO($$iz;=w|fMFYj<^fvtzG`T5S}-uRt+*mDrM;(C$ikSne? zA*!~ieFzdc;~Ix$M1aHrib?+Uq8;;VGpus19QfE$PT3k^TTGDDpktd<57dF z@0hms`vcLP+^5dn&l>5Usk6{4@?+N!$Hnu{rScN`kIgT@n>E+du4ClMUi*vA@w0q$ zv_V_8u_w?;Uv9G{Z+Wj~O@T9h%izWV3H}DnS(?V4z!3HX(%BPeu;sXPZ6e=fm(HF* zb=}ytywlLU!P*nxUR>WQ3&*key%YRi4So~Aue_0P$j%+$><_&Me&sBeKKkemC-@D{ zir>i{IR)4~nR;ZIm|cms3zrP3iE6f}75ysx6VdjG8hM})tQ%Rb~f_Vv~^ z@OzI_t=n~%I@j6~jpr%~pFCzR5Uay~SHaT(@(C~Ntyd5rr6`m(mq`Ou?o z^E^>P@Cnv3a;{|sYZA zA@>|D#~E4A&80q^Ev*~L7}U}K8ug-nvGsyir8=n>ddHr7pKC`SX0HOB3Hn0LC%WXG zGxKhzP`S9G2Z=4`HP-Nd0(a5(W651k`uGrcY42X0#`;8o4_)VOGi}Bz%+alzova;| z9)zzmCI<)gRhKQ;%$;abt~zmLS@b<$(fKw^GV>fvo-#MGrp=S{K2p!&9noc($R`FnYLg*hm?J;Nyb0`rWPG;_Zf zeTtlm+Q{4`WoC`!eYCq&a|h=z#NRnHux?Gmmhwz=lP1lCUd*42PMWh3rQGMQkk6}E z^Nt7YPpdc2#-2ciU&6T$NxwVu!sH!tZYR%d_Zs+ykv}kz{BLV%ApfCtyE*6ab;|0z z3!W0Ml?mPKxeU4G+r9oA@l&TvExj%T-lRWuyLk>+w+C9;Z_e*br?1e%U!SChpRl=4 zZyp{w`!%GeULEcWlVj`g0rwwDJv8Xyzu;S)%)uw2iy@RTlrKG*Hqds)N=nXT)#@9} z8D`ei^0tD{dQZa8=dn)D8O%FI@cXgMW3>x2CY;Vbe4tz z9o>%|gRS@x`G#N6`Ps<6ZC37xh<|bP>7la945G=}u@TCzG?%;BYKB z$qfF&aBCvkj$s^(bMwILh}`* z@sWmePrL(k-Aj*f&;29ZbN@E?+uy@I_h;;bjC=0y=AL`e?XK7`bZ0_M?ge;U^EfN* zJnoV2ee2^{_eu5(=F>OA+peWQP2Tpbn=^*~6(fi4+?S%(%|kETlRmGX^vEcZzLb8R zk4}FtdfIWMUrWDMlSjf3weCI6m~l=gC~M$9L3=siMQCiZ-4Wz1umu|Dy>bj17oMZR z-v*?}T>8ta8rVM>+VYy+JlpuVEj`E?qOhcwGZ;Cv%RKuyq$Sb^6FE~U_?P~Y^3xJk ztJ|Tv%&~9L4CmbRg9S%!wCmwJkc(v8Mf&>!d1oQhoP@q|nA;g|M{+dPCGvI_`3fy@ z)&#yZ2mW*od}=oQY8HH}g!yRZUig?XAH7dIh0ad=SNFsrjN=oG!QUaDNApZMmmlG4 z!i$Cf3g2AJ_?L3Tub_dK)P>2J+Tgmo32!J4ToAfml)ZOnG++HBJAj^h5eq`)UUbzcBk|F|-`%8{s$AcJ?ixVgKd^Ip7;N}U?Ox5MIBEu(D`55UOLyfZ?PyU4+A%gRaq_gKgnAZ!GqWgfEV_x zn``O6&ETgx<~<2?psS0Jr-I<9&Vpgxwl4ZD3gIuyt+-hJGM~IxSaI{oyZ8N=XWiGr zS8lT6O5rOJyvjb$7S8ChXDxf9{!)9vWak9lAAx3TId{u@9jSGfxfV2Dmbw6Y2>-sz zhVfoif*)H0f2KBKbp!K#kakyV4ep7|DKjWT=u_xb`j|cRE`zS(0$nmDg|^0&9Hk5T?@*bgS&XDbaW2<^Peob)7b#tO~UI5!(K6JQN2{<)__K5^73)+z_q}uG;T>Jfng7I`DKKY{7oTI!^d;)99D923WV&kg@;h2S zXir5xuxmYI5IJsLjfIPP!JR$bfBtgj3%kzTmCiFZ$TI23GUQ{X}164OTsU z)UT#CXMYxMs`iNUpa#{pG7Cenh)M5WrgSm!yRP0W_i7LWk>GlmOHk! zfXqR9i|q=N??vwA?!HSq_QBUQWFQ-|kR6#Q4%vt^0W&rB+N^hkto5exmQZBvhMc^i zSQQ@f1X>R{)WmLNs$XYwx38=8qPT)v(d=sG-Rme0p~f5uV7rR^Y1@|t3&69u8_Om(^_P{Ew*_2 z348B++i4H1n{3Rr>24*+XOOzFKhiKJ&^i?+IL> z?d(a4OqPBG*}2(~wNd!`=>*2|A>k9OJ2cuFU5DR*+vDIy>`=`)%H-#V@Sj4LD0n+^ z)l6TmmJ!63##Ni>bcNAX9KOQtD|KF&T*ui9vA;dTxu#n5)0HB(at`iV==y(UziG5} zNl(8GZOLg2Trkdkl$qx~(hvHN$R6HAbSg~pt(`Ac?l<47<&D1i?0YAhwz!U*qP?f= z{uaab1{>pQS%c?7AIJc&S#w>rp@&DW0qq@jhgt=vQpyX(#VE%7~|| z0gP32Ea=dp^(g7AMf7~;WafwhbXcxEC3{PGtB-a5>Du}&JA#hmJ8Ji444(%NOk_OQ z(fk_7;9{8r{y5w6jz2q8veo27lIu1nJLKAM-t9Dd=Oqm;OCX+vctt zyZn6-k|61GfebJ~+vcsdxv;!22+-yrC!K z@fya+Y{tqg#!LxgXC`ZWY$wo1iq5sacS_|h{m7m9k@d5TC#8DlD#yyp76^SH9|mV= zL+Whx*WbREx#bsk+82miCu@!S;SZvJd=_5pyVa8_`mt*IpgWuQN8l%&;G~;75sbcI zyvRFx#yXij)5ix54a%FstQoN9un(R=ep&D=O-nQ6S{rRkr62c@H}MOqjk#k$v*7!2 z&Rt2qvFU~W1?Q}bQZ(u#bdqh+h~R1uHe@HkDQEb?lFuIU5t&}byVUiwys;AiRrs0H#F=R%e;4_FmNzLQdOBHih@S3qy+;Wy9h|+D zx%%XU%{$-;M{;Pp(AMd(|H>PO+KNAY$p#JD;nT=ftU<)q_|QP!qUOud8g@8vOZnz% zn|JuJQQo4fd^zJJG^hu%JjOeY)zxcR31rFd&ze{4^=#=BuE!|UPP zJElfzn?AyPYdb4rk;lnfm$w1iZUgrJW$*0+qblzG|2g}R-6Ts05Fk7l7DWvRm_UG_ zEG!T-V8jThXu%{TfkZ+QlAx%ltJ2$4qK!%`wN#_UHc)J-MGG1rDq2*uu~Mb?QjAJ# z6tq#P2Ib-R`ka{!VIg4e{eHi{Kdu8O@AICS&pdqQGjrygIdiuB4>~U2K~elpm{rT~ zUv`j-CaxDfY-4|DX3xP%1=E7J_`3{A`XM$UY0K}AOyu`R4Gxb^UhzWlum6vp-ZOumvJZ*j zH$8_)-M(J%9OIQmolmqKna4*n7az>CltdN1BH9yN8w-W<(SG%9Rs@G!E@SzvB6t{aBuU^d5+g(;YZ8~ zV>$ORPGAoey{($QMa+MW5qB!%P`yL-;P+3u$+$L{HKsmRbj&(=mzOeldB#1^#qWP} zUtj&g*cH7f!@S#r56JTsvCqNI9nx^X{FnXyKjw&g?+- z+4I<44t+XE+r~!6pi9yqf3AnG-C(g6$!{IsFhy;`9zMI1ww3aEc}De?qlY~{ceL5I zoQYg_Ub26a>2&v6*do74g-$qH(4E)Z?|F-g+II9*Puuf5vsM*7Lfb%eQSqiknd_kw zzI*b(;DPE&p2zoyW~@!-nTeNm1~2OjUcQ48%d?gup0mgvCC1@|0dcKmv{wT%JbtPtPRm$y0P!9+dbS9M#l4^Pv#(YdeUb^ zCi>jJ^u280Umlh=xiPi6Z_qrykoH!r2QqGT_YV9^-xg=`5U#he7Z5-8e14yY_dIKo zg6YHf=8CN0tmmDAnsfhZ|F-bu)Kz|a+eclCxlS{N#ZF_+^D)nx=*ye$aI3}g{RPQm zg-J*Mc6T_PcTP$N`-qi!(?=e)`6~KDw2M8@aXepS{xy|)kXHBo+$YLjyEhms4m#u4 z9pKw1@1(K^@7#C#K5D6o^_M4%ym#?{?ltavuj4xe-G5`L8Ku{jZhDeBmlZGCBzx)K zu)1EhGujthQao(a1j~DapMD@?(*)KCb2+b}yq6Drhwms1yP=MLA>YUNlzo2GE8(lN zRX5QI&;8OqVO^#-eOAI`e0!2K<+uIaQPEh-!3sRUPTnvT{`I{zfg2^6)!ghmbjj zj6gJGm)` z)kWRz>8h4_EOm<~RxR~-)Qz5Qs>;(xRd{-Y7IPI_9Nj%s&X=poqZ3uB$Eiv@z10n# zo~p>>Rtp$y=6n09LT{8R@Fu9-sA!cgA`b@sv$bwpLdcbkYr-c&JaTYKXGb zrl{WP8IMbC^dzXKcvEYGCsEbAd#O4%Chqj9rEcH73E z^%327NB2>x#qCuedYz5`h)E3nBgPf{2NwH}m;|+tvcFGVn>{_$Zg;$To4W6!E`Rn! zt0wBR6J73zic#C6;#6Z4OX3b6?bL;K>Zbh8SlY)!`&iV$Nga;Ru1uk6vmhgk*g_*1 z0)q~Vavn8$KZ2YCIi(tDbFl@H5u3?&9i~p`$w{E|h)LUFryU}#T;gSuS0?rpbYnoI z-Rg2sKeyV44K-s++Qyt}6ZW%#y4R6rEop{a-yp9j`!UkTm`SUZv|32#AD$@nckdy! z&r5xxzNTD?a$(EFlRU*P)3MbQ^6`_Nl&uXL61zSS^)J;Dyh_{1yjo8yB z_aU`0>Y&;X^#$$tHSOqCtK4m>miDT4e}%nvQFnPhB`)}C7xo6me4$?P#;P4&AMN=S?HNrUI*NWA=*NkEj$mJhurCkxb(k`^&~qDl z78{d#e?z^MI*g9n=x+y+Z;fiB{;}#~Y~~~HKGovwPdj{tO?`|_?Wf;%*SDP_KG=sU6tecJ$In{Try;ChGQ#=Odobf54ONv(VRPYJF5!RUZ|v)o1|7o{ZrM_?`xtyRrkyT4RLeWJ=4 zH;UZH=%4S=KL@A+Pe1zR0mcW5@!=cl$@oQkrt?N-id*dTF#X9ze{!Squjx+=KIo>6 zG+OC{EyQUi{=41-jeBDf8}`Qa-?TSw-^RUh?{C-}msGdc_xII%4?#HN^Y_o%pa{H+J(4 zb`yo&d`*21ss}uus#=fKxeH_77yN$WA+-!0-sFe2zUTIlJkRgdbI9O? z9^Hoxy?|`vQZ5`$wlP8SOO<@bj2=b47mZDKSazlibYacNs1;93dFdTd^hhVq1RT-v z)HI<{#rBC;z5z;g@hiVIz>(y1ofYNo@9Edq+b6MiG!>Of#*tGG-cmjxMf#x^J8*H` zb8tPfyxx#vg<8eL_*HBysq(5`mo6?97w1r2x$TaRS5~~k>2i0C@_3_TVtsL>7^JoQ zP8U}nw{6WXda=XfCADZ$iy^gGQuC1-k>ld|GMA&PGtTAi66N#6qHq~|JxIqOE$!_? zx(m{ANOwg#9%&vc`nuElE++yGE0(n4y2f|MyDe&hTJO0{o#%ZkOQzkFiN zFCKra?$JknzWQem|8&(uKl$;43vVbcS}?z`Ab(z7ZqD^{=X~$FYiD0`^;NTG&bTuB zis_eUT{dlM=B1ZR$(TH8Vo;kBHZ^*bv^njMB@9VU=y9m+t1tg`@QcqsYyIb^pB&i# z@kcEm{^RfaK6wAV=6Co0ZO?!G=U;cf^Y&i`pMT!DgRo<CCT~5sQn9OaMb1**`7j>Q*;u*zTjMG$9^qfX#Oi`|iy~(e9w_q{L#$PjeLSXE< zbLY&yni6MBx+s0f;PVFg2b6y=GdM2of`Pszi^~?~U3=B#Q!kw|@!~O~MqYUSIsLkI ziS^uARdU0;-0QEKl|4NxW%$tKvy=Mw?H=!qx}|jfv`a>h=;gTe=9?-j78Nfj%+I;v zveaQ`_37QSN7uNRXt&c^R+ONY79=tXw7R%Dxsz08)KE3fGhX?;b3&fzqDB>SQ&7cH zLf^9SbFR612I`v-pl1v@?_B@f@6Dch|uFqNZC)?E=QNmvH_GMT{t6SdZDvl?Fxm>Gy+`!#iB5=oHm0 z-s;+V%s;>p_gVAV11}ujJ?ZnK@BQ=B)RYN5&T@A7;>i1NHoZGy{5iuu_~g%fM+V;d zo33vy^-YUPQHh>_a(k!p1Yx>TG1>I?>zLKZ$j1zo*;hOxrI+5IJaNil9Xskg;yUd9 z#uN253y9KV{PdW3H{nrnc9XlDN7}Ctt@=DJQvp^Yx)FVz;*G+XIws|NZ+hFn5<; z@b`Tfx^3omf1o!|Z}$LN;Q|%!Nuw1Q*`vp6(?4D~O7@i`N72H4O2&FS$&XFPG5u>m zlB5|fcRA&jS$%p`f0gVRqWXBpt1i*kgd8!8=`puri?>t$qfW;W8Hng=hr-40VY;F2 z!Jnj$84&KD37>|0^SiI^Fx`Ljs0)(AT{-D2yO)PM`Cndp#U6uFWn>sK_-!*fz3@E4 zMat_tm0HDUH^fs&JJL6zZ?_dFrD<;(sl8M?oI!`N0v*_DKHVsDF@5aB(P?n<+kc51 zB&8xUP-3#S)7JtSk<|?k?486#=F(rUTX)IpJF_l1cWU=b#@_eAlpj`CPw@_PO&RFD zE5qfmGVTn8Ci{bGvezG) zj;UiUrbu<0F475qnO;~VC5QYCWB5FhNBW;B{7mux zr}F>P^pD|0ACyD=zc`mX#C2=~$vb@LQ2qD+RGf}!c0BKxerM<5a-9y3nnWcHi6^%C zf5T7G?09snOZZ&M5a~`;b}3`zarBt79RI)lIf}DuVHe*L$43zy4)Ong5@2T(@h7a- zlQ2@p?c6T-ss7lNIn|$bQSNfvowS*7=0SWCitD)B<(9GBCF8mM*XAAl80QIT54F#1 zKQ7ILbQXGCqSHLcUtHL>!{y?xRdIvL_^Zpvvq2uQGQ;Lz>Y z|4Q-DOJ1;0Jvms@QSvbpo}sEf985t}KMtl9>MRbP`!lv5cVWFqzLJ-uE$K-7K^((4 zc)vtV;$Z5ezQ-XC8kcfZbNrO!*Bo0p{>@wW4$0>Ujy)XwxQZ&__#;OOosD%Cm4fnK;iw{k5h#!+YHB|RYXs^r z4V_G)i%{TB6nF{B+d~C^B#Mi0QU=k#)L-(ygyVJ&snaw9|H<(h`F%uQR}ry4>GN)| z;@y8W2%%4Ch&&YkAc}kFY^ClRtkeyuJVv}osrxdN`sNDCJ%=`2NE*y1PUWNw(hj13 zslViZnBxrs63Le*c|6in>N)a^rw&6C(a%71LL=3V<8n+Md*`!&dN=m-OQr7l6XnCo zuDjS$Eq7SzgFjhn-B5@6!$VZ06DMUL3%mVA|5AU+pKmqt2u$aFF9w&15zS6fYI!DQ z#2|_u;`Z<@rIwsyDL#a#ws&!;oxgXetM7KIY0F(|%{I5Hncz`nU87Z>aa732+D*vK~${9L9UGn6G z>Z7|aRS5;f>Z~_csp(hzr@HKsk&^VcauQKmYZ8a_Ke2z&fwaHqU+ORUZ+w&X&U33T z{}!zrOS-A#PtH=Snp4$RzAIJW*^oMK{0?=|KPj6c%Zji~ULai~gnllK<@AKcX7qM_A=E zE_N*Zeyr=`{Bt}#hF&J>{BJoa1H+x&FJ=6d@lVDd>HpII#Qw$pr2R$zQh&*R>A(U< zOXZ`knTOVS19RVyB>vk@${^RjY7QCyW&D-#PsShV|I+`&{>A>J{YC#$f62e;!|~DQ zy!X*5t^ogDaik2Ah+O~V`Xl4NjK4De$@nAvU;3Zezu2F&zvy4;Z|Bcs%!zXu=Zcugw~GYY{wxB<;kt?w^%23X zA1%iE>>#}36~hj$kKXhxd;R=NSPh z#CPvO0+Re$NgagkQ@1y!3q?%mNdg_i#g4>bLiYVbn9DVo%bh(Zah)PuI*^P7($LbG zWsH_`H6zK%-HFT2f5s-b2*se*y+m^Yyrnr9CB?K z&LNE^^*F$>i{m+t$2k6j;|7k)IWFYT#>YtqC;3Y~MDbGop$28V9mMfI$4ZW|98DB- zHb)cZa&4?3(>JKZVf=b>h;gwR%Q7DGF)EWr__O#+I*UqP4G z42SgdQ3Oie*>j`zfif5Ik@gzYs+bDgj`jb9d>$tMii>H(6v};$QeV(( zdgE7JiO?w=N!$9D`pY@V+j?&S58)x@nSy64Y44(b)mYg|dTKfO-c257(*QqO#yEJb zQa8eVJQeumcJvXVUhu2mveZYWa*b~b#|pg?f$fj zO5;O<_5Y+DntLn%no}46d31Erf5iU9{-pgy|5AU+|5@5QW+2ymjQ@q*%z=oQ^mmrx zlbq_A<;4G^OZB;@CX4F6-XQ($#^V^->=UU!b1a zaIShfZ>P$2%p#?4=P*|#{r`Oqv47Elw7=+I>M!|cG51J&#Gzu&j#5YOiBr3~J5+tAEv2^^!X1@Q=UZ+h=ZKl9fIF z$@sI6L;9cCzu2F&zvy4;FZu6l;3I0kOi`;JFHu=rzf|tmFI0C9Y*Fuw+3on^*FW)W zT7M6<`1hR%NgK%cC*zOwf9Zc>|6+gA{-S@WzvN$^m8UZP`8q#Vw%z*iEeD;wR_{@t zytUEUe8*)n%>TC>S=;?m#$Or#Wc-o-Fa1yKU+hoXU-U2am;9^u{>)0O$#p&%b(QDE z$5YjY8~-8d{2#fcNH=jXZji~ULai~gnll7C9#^HG0G>J?Y_{H18_ zf95bh`}&6o*yF#9zcT*G_#^#a`k&ap*q^k&=wIqD`Ag1cnEpj^F_LwL@Op#2#L{8) zWq|T`iyz>yy2gFhdaOA$MOMUmbWf6%u+NVkd7p(bmcxQ0Ca@sp^2w4|VB~b{rx#rcXXWcKDI@b zzaCJFyKhrJdSC)L!RFq_0(N-l@AL%Xs}?LF^arj&$X|D{YP1@Z`g)uyTE9i5KO0c> zeYUBk$fw6nP_28B{c%9Gs(=dZKsKAB$;kVjRqA?vYNH$S2gj*Rf7qgePXyF%|2CC| z{4wVQ)%a;ZW!@9uYKi=l$WG&EH1dha=OI6^LDd}?r&?a%_oD9$sH5j^Q!m~>LH*>= zc-4HEyl)Gra^%&6$YyZV8~H)V=TrXF2G#fh@~>~Iat@w|64UezuL zsBDq1LUugIDkGnUd;#*48dUCIDgSQtHzuI^jNYcMtL10N{x)9uS*0t#GN3kC$WK9b z3`ez*&(QK}R)Y$?K2D{7u*KGMRA5^u|3?$lzBk6JopIw;a8` zzhRt8`DzO@t&7yX)3${U)=W@m{~rDI9IxuS1(cumRkg?uL_XWdFGGGV{QI>U5)F9{FCEU<44Ggy~iRSZ{#0AKJ#LgTZjB55Se(XaP5Z{HoLOw+P>)-+U&)NnR>^)BT;yUo|eh&424*9VctL;6vviiSO?Wx+PV(yrr4v(PxeYmvO z5@#p!M~N>s&`ACw-vsY|v1)!1`Lt)%;oivh+p2opvW;T`=i~81KJ6mnAm9BtWRR~z zz7hGo$RE9kw2`lUj=Z*#=T`FGMj048+~X+|@?)Q)jL4sZ{0m0D8TpTq--Y}x^yh7$ zuIO*tR_eYD9ZWzM*j*3gUwIB4A)ku;GsuU?U*x|={+E>Pzi7Y98qoDtbiNhcZ=(&+ z-_rrw1pW0Ud@b?;i>fV#-spa6Y_<~=M#UH zkq;rC0`K!2W7`(SxGjuzTN(4VGWKm#Q32|Iw1F{^asPG7KMVN+;%6Wq;*wmA{22I@ z=NMZVcdy*SSi6-mcPnG>HpXD=Z_F0Pof9A$YW2T9nW!X<+|}>%CMK~Z>(HT`upq_uF1&LzKs_0*CF3FR`gdoJa4$F zn5QOYtMjiat*pwMS5kQ4l%?f`6~&7RORMrq&R6FzUXoW*Ty?WQrNenD=d%h+3d@Vi zN(<$@Xvv~^;EcS2;xce%RbFX9UPS??Q%(W1Q4Qh)03F~d`a4<9~usQF`M91iRWjz(kl6VTaP6 z!*)fKNVyUjbj0QUdvdG81K6Cn^3Kdyl8w}B|8RXJ5ErSB+1mT~IMYcxcGljJ^=k<$ z?hN(&w&jRSKi+E!{BNe8@h$5q<+5EwKZz{I((qG~&f4E36Io9lMQC@1^k;?BKSMnu z#~*q2W4muT-m`PLZxYz&cvvL2cYkzX( zm!0hOzuM>U|LWR*SNZQW@SO&})4+Ec_)Y`gY2Z5ze5Zl$H1M4U{!ePatWkzn^-fAU zq<#L|;j&K2>yxgN5;h*@xoxN6JI|26tVf+sjCA9kAmfit9^tkddL{!HPSTE5fr&pJc6dH&Ia{nng8-mL$1DlhAQr_0|Iyi<8u_v3%3^^^6z(}kOLyiV=Itk-p#zpU4t zuKZ`xzpT%lu6$=oU)JAFC!cYK@(t4M+o}F!U5)p5I}JDMXPt)2y4mT5HAdaY7x1bG2CE7x#Ac%X!FU;K+S24v5+#25TM{_^QO;eznMGRi6b z(q6)sQ)3Ai+=PF~a6x#WhI)&CwZ=d*dRh+`eSv{phBq0W4E~z%K^g;8%jRS+7}&(S z?YLnz;6K1w2G^jxiOAJy49o@}htJX&sOqWIe-Xb3%*Ve#V_>N9_k(%(_tzNMm7wD{ zg1PuNXbjXF|JC4p{8woVgunv$GL3;Mun=CZF)#;|{IkJ%_-APhH1yWx-lQ?m#@+#5 z6dSg$k5a!No)=_eK$c5mpe<4RAJiCVHT;0#wf(ey62U8xOVAkbf}#(X#y~a~M4DvS zQ1BzrYj`W+!h>h=wi@xrX$+*DXYVP?O3@hL#V_>%@sh!2kq2q=ESJW>Vd6RAZ5jgy z!6 zhSh@afz{v)(p|1G&)2KHRb8<2$W))>eIv-m$pV_-Ij3bSTu z3}k~-;aM63nP4V7Lt|hZ_%u9SV;}{b1Rts~5I>u@{VAfLj8l8A(c_b#aQ{^r`)dp& zf)Za)#_BO znT97A9&h+gj7ZA89u#}6*Ely+uI+D`#y}DHE7C8}7}#B=)TQuU8Usz>CGedZ1KYtV z@J5Y+1~3D@Nn>CmI2pb{V_-e_B)nc@pbnJwUac{(5@hpER;|Xs>LPu;C^uN5F;D<@ zAzrS=z%1iGYk^XK!9QDLpmx5#KCLd)*jAwNpvFLp!I~xZw-2(aH3kM5?l*j8mA$t% zt5#!R=#BRLW7vUP^tiGf{0;i82BX0OumyD8tohERI=lh&;$H`T2rf1LMaF;CO(q>s z;>8=@N`AsOfRaz0;j?bl<*2?}k9XPN2ZU!D%)U#He+Tc>`OO9;olGzWOb4aB2SPgC zJ)ndqf^UOf@Ex%24jq3LDDi`!lw%P1SI`IUmUy@8@VeVH7J(9Pj^Rs}Y5ze6<3YMq zmQQ0~BlUTg_`6K`w;OCQxY1xM*h0L0|G^$ia5*UD+VOqOH-N&kK*@io;k%b>z7v%2 zl|SISHDL8Uy575gsBvetj@Jl^K0=0<8-93&mRI+&AC&MN_iC)K)z_aQ@FVfqgAJFYleZTf!u5oUnV*fO+VF^|+)b`hyB)E>Qk!HdLD+y26m?Zc-;j>J* zU=`uBH6{seAsjzDeL+myw^U=2;BLa#m~cT%%vY~5Ne~x@u55WhOw-q-F-Z_Ri92Az z1xeG_sxe6rJBgF~BB`GsUBlI2`|!^B)Ea__ zZ18(vHh3MF30?~ZLBitF!E3-2@MqQ4;qwy+XJ3rP`+o>9qu={ib1m*JlCIr0j9&C}{wg0w#g=#5)VD1N(zJ@E-^^f_|_i*8ZkITr)TbJ{vp-%m&W} z`HYe}A1nvY1NjcQ8Vo8h8QekPgJ2^#0Za$SgDGGDtfw;Lz&h|^FcG{6j0eYp)l`l) zi3@>az&4aR8f*nefkj{%m1>14-N%a zQSJ-CT5t$RGurb8bYagAg5VbXbHUwU2*kzJ@#h_|5&SFI3~mPHqV`+R555fs!MDI% za2FT?w}W*c|Kl3@^9I-qz6r`ji~n|eV*+tO2&NI23t}>HArMoFs{@Wl-!AQ;y38Ujjqmt6&|t z18f9e0h_@;f>OxWK|iBUaURE@WQW7$^*Hue z&3urc$=YRk9M#Smr^gX;FL!$!ZBhJ8grn7akT@+d2Vy*qX5T)a$FVzZ57JHXyW%cJkz;p7m1Tayps(=fP^^VLJ@hIkzN zhP3c^(}fKedK?E++fp5lgZ$lhc?*B{T;9yzj3f%RSwOerKQ&yAU_NS~Jf}5VQ8U)urWo;1L{d;TA@4?Y-0-foQLz49YrWv=cda_X+IOv$f`^-} z(0ky%W~-%H{6Df*egxKiY_0hitln?c><4SwtlBn;w)_{4>R&i&e&KLA_tZO@>mB=K zOnwM^kE747XIvBaTf++&RK>kzcqW6Txc3b&H~e$MR~dfP@Mgnf=ns;98iT61UWRAf zsQCqkx80-p#fI1ZNb}1KFS=jzYlTzp+LfALFPuJKXZQlc*BD-Ic)j5_8@|)<8pB;o zip13!o?-Y?hWG!84&QG0KEvM*hd-plTMRES{ASkjY8k+{W%rx<>x;pK)uVE7utA2<9ThCgL^uhlxe=M7Ic{7u7` z8s2R9J%;lcD!V+-8h*_1orcRiOv-!E@I=GCKiB!4Z@Ay^QDOdw4$m+=)9@LFzifD( z;U61bW_Zz~T7H?~%MF+LnUv=l!+&h}+lH?({8Pi_C#NL-QNy1%+`f>K#h(mMs?+)H zHGI6`2MoX7@NW#SFg#i=GNk{2;faPnWB7T7e`z?sOKr!Gc}&@EvfW|1x}<;cbRbH~bsJ`Jp{KevcQm{MCjJF#I~hFEIRi!^apt&+rL` z&o}&1!xtJp!|-y$=NP`k@Iu3HF?_M%cNl(~;mZxb$M7E-{yW3(Gklxj4;sGH@KuKI zHT>s>e`NUMhJR`JuMBr=*ZNs+xZCjG8SXXw8N+>sKWBJ1!y64xF#ILMdmH|$;e8GN zli_C>zRPgG;eUn4F=i(l{(<4+BKYhGzBGcbir_mUcxwcYe@W{joL?}4=SJ{Q1h0$W zjS;*#g2%snVt%<1JQTqfBY3mn`(x-2QQU)b6D01Ca4*l`n{BFGKvyT@ZN28vVa`pFIBth^_)|8u_Zdt4 z??0~jxh8y-;TIUb&v5RARaZ;LmA^rbt{$cQ+?YC;mlZ^GrlIhr9a68=KkVQ6TZ>dn>-h@?W?CwPrh$0 z+!v?$-wn_1rMX21Be>ngMDRWl{DKHRK7z|PMmwf=c?7>Ig3pQI`4PN0g3J3w9n-%l zg5Ms&|09Cm7r~|CIg?8l+JACN3QNsNS!I>VnNe7oGq0GFoSez|@;8IOMN8(-&nYe~ zuF5G{LeQe}{G3d@GGHw@hycNy~;|; z7R}2kC?v!7cqL^Ej{D^2mF7(1n@p8Dg3#kd5N2|7MX&ELkgFQilmfbAJNXqJ~@0Dsx-pCf^SCIO5l@Hd5dx? zZya-?+)3f-k>Qmnv@(DGiQbj@c_oE8WlO5c!%Y+}njPKFthjW3S%g$!RaiIe(QhuT zDk`j`-o+(VXkmUySzdb;7A;wtlV6l))LBp%<~gPF!U>C)POGC&M~z7gF^Z1G5x1v9QGWwrkg}7hP&WRncjJOf5|9?9X}G9ZFlH&QFw+ zQ&_4kQERG0zydx#rcBA~n6}jv=_=VK)gkhUVVF}6$|z4wk(0{u3KTV;Mx}c~tMc*} z3dxzDS4{0X`Yc$&$Iw*Hyjuz@P$A|nt1QyHZ+abZPi9%<9%wH@g8m1Jai z3AeYc0n^AG<4M87addAMixLCJ`os2g-1>A`G^cl%*4La5tCggrq^go>v!;$1o0DRn zj7&LxVg{t+t=&Fg9``yvoE`VO@+844%{bK|&PZLf4nAoo`HVWrXY@%vW-PJ?e6hwH zlX>OMi*h>h;}J|*+9MclN091tOraw`9-%`Dc7%>8bQta>hYr-1m#bBW5_X{N!5vbU z;EsuhH7hBH&uzKm7YsY7{qms$M|8~c%61kG?2sXWC*)^Z$xhUqYbn!Mnv6Oj{dN`( z?3n(j6Vo4kf@C|>lB2_M?d;o`4jglWWIGE7cFc23I2|3Beu88>3kP-_eA^v7oTv(vq@yc_o$M8-R0CFC3BXKkiaTk4YIjA}u{_q~AX( zC6#~?DH58Rk}^6i4NM!EI@*q&8*@eZlFAG{T^ycYUOv1moGAFGuRl5JGgEh&zq>i) z-67@Y!1du+D!dcdED><=+`otmb8c;A-PJzCKPRWEaH+Ys)_m5K*|X&AL|4#Nb4gFK zZS8NbJIf++sAJ5WoCW#$%nD9uDyb_vR zTx5Eoc%3_I*0!r<-Hcn7c4uzm+Idb6b3N=c>>|_4?xsV=oATu*oOu5fmJ1{4nW={M ziA?W4dEkN@E)9r##N20Uc5>ZME?>sPSrfytS&Q$j&vT7e6Zf&w#I@(>-%~N(?I7tb zD$mQW%2`r+6SI<>oUDxYKu-MTxkjU@ZwmL#l3okxCFzJKG>;Gw$>e^#6ign*`}sVB z8o{}rLu^Y~Gzy0#DQPJy%_)y3q^Wif5)b|R9${W?^41}z{(Ee)_2$7VoNJHV>RNlm zY2DxKbgcWrX{~FSEU#~=mCa6d|NET3=j^dg^WY&HV}plsdDXtTtFrl#TQk-kykhcN z(!0OWnIlh)R(|1B>zX6tHJfyf-L2j{a;vrW2x&_m9n(H?>%_H$x2Gdz{PG$H=^roW z7f$awFU{k%f`{a2p&ZpJG@~U)jcw_2-;Daw-&C|X)#hV8)YveFKkEpG-ZS|xiBgAJavH}LskYJ0PF>HIuE9e*>#H419&${uy!)T$F<`j9 zUtTlmggUo46V^%kMWoeC86`j3HbML%({3iNgd2S&9J^cU>7<^t#jS31W8Hs{wh%q? zeB@BjA6#o$>b3VD)cT?hhnhXI-9fDkby1^o9l=8uIuQOZWW41M&8Uu2o4u~!=4uD8 zySPF#1`_TtaY7^1W+NlLX=Q!d_y1h~{`${bUi{@T)o%Tg;DQxfKJ&QFZ3sO~O0>#^=VXU}z%@z0Weoevws@5rrF&`ZYJ zFR#JI?$$Q;-uc1J2hUOW)2FZ@ZJ#Z71jk07rFwk)+u+&>mRdaVcPk&B_q*zcNvl>V z-KL^XFX!GnuW#dRmlZ9)(E6mi)DFbI*>F3~S;0dSEp%#4cw5>q9Hz^u+wXYZ#&$e9 zALTf1Z#r$A4+>Fl#0zdNS~@K{c16${@V1K4x|9AQV}`OCWuG2nhq^!auFyE; zp7^A4Sx>6R_zi-(yT@5p@JY(?q&L~Re}JXN%6N3}iWlnbe)?_Gx}UUaJES$}6lo=# zTrMe3xNOQjnQ}RwR0A9Noq|vx`m@Zo=vHrAdwJcH2zNZG+`%Wka~$_`fqwF&@i#@+zjK_oUY%6uWNfeKdKp*2v(?ye`DENJLZ?ONoh+lg-!k85>gEjvyq`^K z^R_zLyn9ZOR@|A=GJ3fGC3OCM+EdrbvL-(1U1QzPPc5IUm+q%dGx_yNtV!6j<4Lh=Z?Xe@oWf2zDen&V@o~x51d*k}d7hNm;T_E=v((v6P|6ckhh) zn)MY$pDTH#!yW@k{x&HRx`pI?wP_Hib{AhC>a|6e1 z3H{!4_FCsO*VbIOO8bhqL91;{eUy$DeOvE-Z@)Tt#YfKGLn$8Q0#~6q`H5exxT&U>}}6uPP#U6-4fmD_*@SRKjn4Rgq`ZTDs>V6j&rWI9Oj5- zu4!LGI><|&$6mDF{Ca_7ZCj2LJ-HaanNQsswe|>ehkr504bQ8jOyRk0%Q?ZZndqbl zUCG?wMu&IBJH3L3{u&e9y!(OR<^dj+YB|&_))<*@^s?*RUN`(C-*DY5u^Z+LZ8B#t zVY?qto9}k?T;c5%nvv}E#tgVqEuN=VKI|T#dNiZM_qY!3GwCwPe>z-_T*~3~2RE-} z-ey_RLnNQDF121Rp?*`SX9o41y!Pt_%t>F=b0lt$?73&S4B@$GSiYT`YjDRrB_BCH zJa(+N=-AHJ%(LYDbUK#!{%Eza&FMzhu618Jo!F&gU9~TGs90IAd9CREy`O*d;cGeP zC%r$5wbU#-?^KyL^jP=4v(Gxw-vHHTKXyHf_v=2}?*gw^pWVfL@eu9y74s&>>4cU^ z>i)i;EPJ5Y+1D=PA@a_2PJHUCbF8(^%&D45>pf>8X=*#2uy9Pe%r8D-p2qcZvCJO_ zGDkcyf8v_LGL4_oYqky7bzg zN7)~ZvwsRQ;kaFQ-hQIT&gMc#Zr!#v+(sSeMdA5bxXr>gdVF4{=gRhc*0g7Mt|n<7 zaVoh+*nM2m_uAtmePW`zpYuaUZhhXK3w^!dIqdD^ap+5P&!XyrYoobenc)55{#Vdj z75%EGN_cJ4(MbS<&E760_p1r(a=G{7c0QrE zj2khDE81fEtdKa&yH|+pHrnaev_rVhy-yp7|4rAawM)5|VWP@CN5Vru{+{j3jn?S5|L1MHxW_Swd%BR*zt64KI}bn?t-kJGout!iCEmq)1v zm%rJqT3iX7A9fMA%I#wx%NjQi1~$5VY;9_E7w9zO`E4U!?6>^24t^4H7Ww>aqBT0% zx87mR@vU}PMgAIxwcbkLbdTk#cJPirlG`0Fo|)}%@E~oM!`1AtcFU*?4`F|wuaEu2>y`abtZg>;VFiXF+6B^vEk*0FE_l_ z@R5cG4ZqItT*L1%JRJYZh;US7yIc*SJ{pzZaM=xX9y@8W+0|6e4n)88bM~*l!Z#cK zcmCV2EUT+EePrq4iqzB&4`!z*<2Q*PSuzi6r>IMcOA7tPmHyJQDu15;Mt&Zuz+bjt zf&a#`ig|dmyjQ3umn|tNuw%&LruNHk_md?Ee_rX${(?L{Nnx*Q=2ewdjGHz7qKgbG zOtx1ctNf*d{pXjS@0W+Fg$0%VMR`k$7cE)juUt}IURF_6Sm3u`hM4GQS!79JWtG2x z(n!fFm*k6tno>&X=KJkJ&nV2xFT!tDQDH@)|E9c3%3o9_wJG(pa_=wCTTtk)l!Qw2 z3;m`1s1*;v{mF&H7YrXtR6AIt^2;hJmXufd%PRbfiYqHwYaKjXO)T{uk*%7dyc@}0m%Ffl6#dh$%F6PW zm)Wbec6rP5Dl4@h72wCWY|ka7EJ_#VqYOK*Jkm7FyMC64%PMa68>Jr4`lN^@#q%oi zh*?-sL2;#$vY5O?(vhN|F~43`@-LABX%s3es(*y%j#u+0`eCYb}*f)yoxF< zDJsT##5lyjicyB-Lkm|@h<2|N(-G~736@t#i6`cmsiCSOqU! zkXIrd2*b4-L$H6K`?04fKl3kfC&^dgIe{&- zCE)kK+2D9k3L-oWECMC}6p-1Xe6MC$9Vqc+9wgz_poB|3CB3Df$mbf&0`uX?U;*C& z5q*MlrQ8yaXRR{V8`erXbHGMW;x%ZTTW#X4cj@%kfFf57=7LK>9>fgG1@pk!Aali% zSsLeNgV(^bG|tTgGl`c0_T&32L5+cQa4!BsO?Wccm+(Ov1N}{S0x0>rz${R{x4^5! z!&*Tp$1X4f+zB#AEZL!P?sjkr{_8>Jro-yMY{FM-oErksb=ESCfpSpFSpqVb%qr3t z$OWaGvq33GCMe|yf>Mq&P|A@AN;zcxSjyqkIM)kGIa=vaQjP zc25V-!aq%8AO-9VAF44h2$XmVWSunYu-C@GMsNUpgT_D|*bBZ|V?b_FMXmr8{mT9? zFpv!T;e#{=WS<#J#aRg&13pmXcF_3;;=f&EK)zp)0NU`>X>R1KdU0a;w0>_^;F$ko}^( zTAx*|F%SYJeeS_!-+fkw#y}AC!N+L~q=6Feu*=@3pVg)@a1e|oo_q%c477j}uL(@V zf2YQP>{F8QWhW^1T?b}?vj0l#zQ*{=ey|L95h!+FpmA<4I0gSq@Cq;piv7!X6@D0Z_`@VE9Im zd&OZZL7qDdD>C6(pp-iUlyV0(&K(CzxxL`!;3kwW`ELNF|Bo}+O1=x=O`zy+JN{RJ zji8iA-me!q7bxRq8~%A7cvgagkK8+wj8#l7z*ul=7D~= zq$~26oc$dU@ejf!Ur7%Ww$l^;T)31g1WGyUK*}7q38ag~Z2%=+BX}X$3=Rj|K)QNd zD=6WjT@(m_lxE(H|-Ac%{b4Pv5k*~UK?m6Q4i~E4v>!^vUG{;O{|vw#V#k~Hcx3SmuUS7w6ey#lo?bpKJHT~=RQ@Z}E zF@ACHNF&k)JLoUsju;+qTOMPYG$!HlT~~2A!fB}Rds>SP51H`04PR;aj}5Ok{8xq_ zHhi<;@zOzXuNgke@V^;eVtA`?Izo7&|1ZO9P59S_*BO4y@C}B$#0ZgZG(6hyCd1z%JGJuZNmMApKo}I;WAE3{z1c2h0}q<@0E>(C(&`k?}d#w z{Hg9bzsZKbY`9z>B>rB*FE{*bF6QFw{mq1rGyED8o^ALX!=Erb&+xAdxA!w6e;1Po zarS;@_}>h-_cO!0F&PnO?`MYp#Bh5*Gh8M);_Us*@N~oN{mk%5hTHp@;foBn_cO!Y zOs>S)`k&jo5*>3ps>ukN})KHx*ukjf?vYhwSeP zJDL9rUuryLyb`{~@QpTaR5I@u_lDui4Q~MlSRplz>zueb^c~4>H{}+$#qe>azkLcH z5EW8wru-gkr7HupH&Ms;!w0xR>K4=9V>KxF7x}2yeWde6Tv@=;4a4Z zj`BSt_yrL>J%Ue<;BtS`F}=zNeoF+uD}u}SDmuzP7{TSfsAIUiEZLE7j^M9Ea53_n zoa?5ij_vT!eyVx)n>s?CL5JCtMeM`sH0ntEY1PEanf9a2DaD;fojhVnw!J7Y)_$;< z!2|p$GcKDxvub2cPU`3zc?w-tF|}y=%#k@`+n?)CEt-O}(>!U3A$3GnSzf^<6=jRE z^QwwSduGn5QcfLVKY){cTRb(KnlBlort&PgBB!b%k1Y>V^QTOS$Q7SXb4?59I*DhL zg%zFV``@V1h|!l8R?Q4APsqB%l%-XLrSdX;<&+ywt%Zz~PD4^nh}LlG=$xE#c0saH z&+J$fU7V~6QASScST-YI1dHY^VH2vnNG^>tD`!?p&Xg%LN9SZ;HZv_}X1e^JLG<+E zGIp@C(lZ5byPP`D5ozSPq)Ik-Rq!q~8v?^iB%S3gsilt8EoO?)p6wW&t+vJ!&1ODg z9jsHoMZtY$G3YdEUapOY8^#{GEh}PAQ(pR!zfo)9fz3t>ak#e#jOrM$3QK!fI#AT*&Q*zkq zA-&dadU;`fQCaEKta+(Zri>tr4KZam$yR6fW#-tUgt12>KbozKY@Z#=st_9=^9!q{ z(D*4iBZ>=j*-f-|+ZxSdeni@hIyIHejm2!5kO$~8xLn3g8gw+XDs@E1Tr-aMgVd1~ ztVmViL)5#h;mBJ$RH93_LZsw?tT_V!BPu&Mc(rc!Kt7GRM(I-wV zHfny!lFFiX4SjpT(UmNS_Mi16kFV619PE$BI}g)NqPRF zoT{>_JhuB1F4K|lo_J^#YkjhXne}Nq*yi%K0L7F3FNT}d$q>}pD1qsRgUrB_N-`bB zx2dPN#&nX$jq1|LlRIqYDk)4k$tU$BpAjedj5^6@%t=1!C;5y$$tRT^()Kp#l#~&2 zHd6ki$)8d3XSDnoBY)E6&shGXvXwf;7GoPBXGpNcdNdoW*){lob2}k>3S|T0NS?*n zuG4*jV@|zKa8z0v+X(%*@IFDA0`NjYabe}~{Nq~%Pqj}_?je<5=PU31?BJfWGnee= z1_GBWGPp1oUpbg=+wR-$6Ld}H1_~$XNw(G8Fx|zoVjg0K_}lKzw68DTq|?m(qqy=* zqU1SfyEC`b?Yuob9yW@L+=thCsV-Nu9m?~V%c7L2vhC9`ZSi18Iqg2drc9k)cAic! zB`eCVuVyFzB|SZHH$jo*^RLtC9W*yTp(iyDrxe+Qe1)ONd|bqi5}97&dM)2HQKzu< zx4OQo?(nEx+(SpYlk0opzQdMJbb570X_=qt^wNLhk@bO-oTPWUeTUV^i>n*1MOzN) z^cq>fTB3DuLY0NcBa+}>J?d&2t1ii_np401zQZC}D8os1@~BVvZu5*({5x|kyuX>_ zQj34h`?5Th{PRan#}Mo0+y**k(t24sajE;+zqLQ_*fHMIj9xcDITwmQkAHZA7Mdaa z6L|5m+aI)wiyO`^DsC8Ub**I6>5;TpZI@y%~sy6w$|Q3S!27fPmQuhbHv0455=a0Hm_e6 zd~o4yzMt{@W^v8-NBeg11~*T)f;a!u=^T<0QukvL34`6dH*3YNm|*$#H^=Du{_eKu ze*2tp>*&G>mppvmjF)FVUeTz|Phtm1chxvB$?s6H!QK7_Dc>Ec>;C2=$7bC(<+4pBZ&$>VBS!?YP_K%5q-DvVPZSJ>kyW^On zbXeGs?+y=({qBe`%Xc%6C6>|u4=c|qlE&UniKj-`xoGVU; zU2%?J8_qV2Es^aewp6y!Y)Ne6*v7JrVH?Vp#x{X%y!|L+*!WpbzE2n1HSd$2{1~;b ze~clf|H82CV*)~9#3UKN`x_`yg1CH%b{ z#NTf2Z`bfw9>iamhQB%B&;yM203#)8l(GvM$8;@)?I zw>oh1E_i$PzCMG$-$$vrZP~j^KjOGn*WY`XdygtH{`pInwCcc-(61Wju>bsi&!f+< z{YW>k?L%VLcLR$m;-`NL?vCgN`Uk25{oTYf57fo^)7UN%Uw$&e*K~TozU`SCDrOb3 ztzz54ri)B(3L99tePWh!@g2UmTQ{If0j~YkSpRQnW1KR;|4p_fy4bc&z%|j3Xx}$Y zXcHD{9)@^H;LE^=Amt2r+2!`n5TgOy9i!QorruvQ88 zng$2(G8kFW3GKW1hSNZ<=Ln_Yqk+n$Pev#$mkQMe+}p7qjPYDzyfvSF+tac_-`{+x zFoS&IL0umwdoCq7DfxGQ%-}tToqow7K%PBDp2(%ozOA$jI&`zYGs)9Xbid(=aYovX zCq~{_-txg1<l7XlY~EHJIf zDZB5HV&GR#p3hO8+3e!m+bfltlq#j>J-xZH!su(NibfV}D4&(dR>-!BZKE;0X>)Yt z_E$3kG<6C2T%ek}PIUL=%dt9D_%p%oxJ_w2N`H>)270~F(r#$!qk$e^?`i3Q{Vyxm)Jxfl)tXwb*rx7lN*&wA3+}?Q%?Zv zcWw-{dlvj=Gv1HDTY=hN!)qts^b7(AD~(SWfWe#O*mTmjaq1U%JPRK0Sa~%b-RXkI z0U92U>%imZJsKWkz~gwnap#JUm)`7)9ozv-|08%Lz9ZVFH+YL)dK5g4xegxVu8YSd z;L#YwqxIj2$L?Nul;aQ{RqzOZMEi7uuiz0qn1{I#Tcqo6o=E=Ai3s=&9_!5~f=d&4 z7k*KUG5!#qKLF2y$F?9I8`0Ai@HpcZV4J11T*a^8HN;mP$dE2@EIjKChxTZjwf@+y zXQnm~uToPB4GPbeqhmWaXEv+`cY<5N>7T&wIq)fM{gUflS)P`&@F&(wtQX!qs~_C> z31b%i^ueF=(6>cF{`@v=&t37^(xvdHQ*ZJ&z@G_M@n^}ui9h4PtKp@u;?IGNEa6?3 zKRcl*;m`AI{}%oX@n#60j;SHOjMMPB2YieHPLk6W%H=z%i}62)4iNk6@`{;SAnYs2B*9_2M$5yqWL++c=7jOMw>1ywgejT%v zmJaydP(jW;d13X~jvY@M8w^otc4O2?y9xbnKCRsN&)9-DV+($aEqD}Luu(st`%}Gg zN#yt?Xt{&FrRxn{o#~#IJ;Oz=8XMhx(LphuOPYRKc6O-=+G(un-|U2@JJOYwF{&x2 zgYg-bEo(M}E78jnkJt>>w{41wU1V_DmA@m~8Kn}l#}Qj6bt_t``ggm0#wXyZOP~H+Y02rUlyz>cwRQTa34u*4GSCHY zbl$97Du%{8lYtdFq4VkRhEGR$8YXfN9TeNB|7JIFY&9LTJeMZQcjf|b#$ShBR$uka z?uM#wbQ?w(o-jf~9&d4L2KIO-I7tU54za;+<2&5Tx`1WSUw+>v0f zxIMvMd%se4;u3Ob>$C=g&+vp3UEP^QT@U1>uMc#i*Yrr98Ct6|I_w+QIP4XKCT8-{xj#C}s1JbvmA@8?vcX_T|BS z0(+&pE?05Rk1$QvMVKe|iSVjQzY;ZmjCrz2JGM-Yh$vC*W7d}4Fs8t&+djt}D+T0Ub`Gqyo%MNIT&l@^=v?0ko#^Ux z?3I(eC$MUGx+>53`jhu2fZI-Fv&><-(CbEOJ2Z07#61u9&SFPoV6S9}y>jfocJAWE zE|R%R*O;jdXMux{c^`|f`CUKvw3HwR9GZO;n7=?TWfj1plY7E1+fMi7%lyv+PlsT! z09Y{R%p+7G_AFyJ7)|774{CHU-lS+x)3x@Q1N$rq`wZM_Hvichr#5tA&xszWd#5M= zEZ>@;8gqoNRn_yn@QjL1z@FCn5)RE?Uhz%j_BW8<`N;9P$n!j8{+x!+q}j;%S&Pn( z$z6op*W|woUG6t4`A%d=2zNr`A^c=$_)!}15yYC2FD8T8Z(&~51pchxZzK25)4xiq zuW40(<}l1Pr!kkjjk)CP;9Rqe^Lsg85}a#3#`#Y<{~707jtwjQ9p}xQw{R}=CL0ds7g9@xV*yH(4>~ zWP-Cy=0?&sG_1kN0iJZ|j11;%3D~)Jb$RP?P5{OG|`82AbYZ{)eJ z=-Y7iAy11Ly;=0)2)|L?v&`_$@ug1HkYiYB8XP}NDJ!9U@uj>@KYPHTH&)4yK*xw} zC-jC*mUp4b(_&@b*2FtKeEUMA>N#KDm39>j(c3ycX^_ee9>X&^-+z4ImO!0=Xb>@?eThB*PHqw<~Z-*xp9$i z+2ZsTb9MVKZ0UXN-tL!b*$?r?y(H&Wua&*aVKs{mJ&)bijm>gg7p>XhzZZKAJ@u1i zA1^(xv*onV=kyWSnaq2K>J#nh$l!g9nK|L>R>o#$8^Si7zTCX{zDGp%_F?PGcKb@( z;3mcv#qsCZhSBW%vBj{(vh`;hz&4OAj_p>(>VM1YX_|O^V(DGSCzbwrNk-F(<2RT7 z>iFc+iI1+Dbr;(TwqLQ`a=NAT*3-W)O+Wq5rOwl>rO!S1eCg2#|E2Vk2X~joJyc)% z9qxaZ`vu&e&iz#G=W%}t_aA$(zH}M)mvesw_wVEWmQ^jK2Uh*Q^vtS%E{%GywUk01 zHNRrMKOY(N#|NLw{fMpqL(kSc)g=tK|LYyUwmlU*Zu-VL8#u06(O2132p+1CEeBL(>^U|QzOu8>H}m@F zF0-d4d!>2sTI*q(*!LkC6ka+&2(H+~ry@NqIR9ehnjHHTO`e*wSE?~<`JLM~&Syp| zb8e?SpHV5xj$UW;p<~vnYi$KHl(Mcr)!JtAZo!>g+v}HN0WD7JLE8-8gD=cR+L^&M z!?O5(GH*8ApwBU=eWT+qg=xGpk9TFh5PvCBJNIyo+m`czWhbz!F0Z%^-kSywPK6hz zz>`_X%uHlv#v*uCla&SVSu%AD(hc+nyMuAQK67dOT-SZ-+_U&Vb1trYqZ+zfgiX`* zm#z0kOi%P*z`i8!r12vDB}M0XUgV{M%ueJugT2nlrsKDFX`0{g`Ba_RAEmSSFEB@{ z0Os&Y&8y6xanMrR$JAAUz8Cq?mE4TI{?+p1GBqT6^oI6k=1Kuy1iDA{T&mZ{b&o}^ z>{gVEDZt?O;p=P{yU`py6^iM?r{N{WFx4amlt3Dg3s z#}BZR`PdHTVGU!lT)Q?a?Zb3Y-O}zw{m&nNCQEHE<2;__^m@70oDN=h zVNdkvl$x#j{@o2pYWrw4s(YtCw!7g2r9DB7YOd4wYi>BDv^%)Iv8o?`DWir4HhKLs z!(FvjrR*H-rDOk{hb{{67n}Ag`5)-}G&XDwZy&`w;f(FQ!^!^H%p)3N^zAp&W+(Q% zm-$7tYIQdy>D#w+Z5HPs{6!VAe zNuHMNSy9c~nG-ba*WT;iew(M|yw23Nt5DaT!nj{iO>H|)g|)vzUm7`XDhzLLlw;tO ztkwZ_Ek{9oIA#29BpM9x}J_1MRqZ`i1-6XiN$`-@!bzu_|y}uMcaF zr2S3C$hLasa*Z+CH=64wKs)G2W7Mt8uSVMccDFj~l5gH`K0^nL1ip=hYWox!QP4=hM_HSr=UHd=De!tS5$^H~R>sZ?PXMIew8~L9Dosydbjib<({$f+^(uQ-RqSI|6hRT_Wf#mHRGsWwxW6GDeZgRQ4!@WK7CZz z=-<>nzI}g8bNjBJKfWVNZGV;LHt$;hxcE@c>o+|9)P&TA?;Dk|weagXWTfy+6XV~m zTHLi_%NUqjRq5Jmz~%NrrM*h__xT=8DLS`w2Rui6&F`rZ<|Z{FM`XZrE1OJB&>C%Y z@6cJzPv1B1(I#kC&Nr$S|4d)_;7Z`S3tkZVs#3#qPV1u^KgS>cKHE9`(dVg0BkL-O zr;jh4n((IWf;z|_)km3AsoHW@@m^t=61`iA@NP$T?o<1i-_;Lk+-Okd?0_F+eEVNa z^}k1(WkdHY9SVFMJl`(!8b#;L!Ir;pdETS(I@KG!ufhiIa^i1Q$}WzmwY9*f4*l%r zRGsR+s4C-;6M2K!cJ5c&b>OQQeDp_lY)4l7l5wBI#ur)Blr_6~YZdY!QW+<<+F!7F zu)P}3K>Huk5BgpceeZpbTu`I^8+krsmiokQHNv}T?|PfeD`hUps)2$T+1uv%Ej+#tTKX;gy`TOt2i|}Uw}G|p4d~wuqm@0k)Ufr_Mdv=lK2{f#J5Imn zmI1o{xqs5_xg|2X&RoZk-{vYqp3S}I@VUvELw=JR&GY?uHiqZqnFBntWymwR ztGIV&$gbRKRcCf6dek}d75u5IhCIdnt=!*|`+z5`lzl|?WJ^RjHpw8x;#P)i<{O*% z#zvOfD3>~9V}ynKWXRbq+=t$~LNI+_gOR{0iW)?H8lTe7=@xwMg&&$u>DpVtXA^X{ zS@zK3E^V*0Z)D#a_UHA=xFx_o3VnSMT+i`E4^D+ zQrh>jk0`n)ty+z6kAja&50|D*)JM3ZbT&WFmN}r8Yro(7yRVp(u}#Qsp>Lnw+I1dz zze6A33wXkv(nlFz$GTQMW6;Ap_4{@01JDKa&*<9ivfr$050~p>l=fK8tL|6l*5gNS zDAcz*x!!SjoS%9)sqgAnYdpKxO^u~2rJa1Xmfs=+KF04=SEX;4wXb)ewUfZ`6L_Z{ z{Wb&|Jq;{BPktE$!Cql@UOyjjUVuS3t#wp>51TDwk8 zQu49uUw_YJ_0v|{p5g_qdzm{W;3HBDZu=hQPt3P3W&rc^$bz$1#=iFP#zLK@Q>A94 z$gVT`wU1BGTipA@m1i4)9lELccXMxaHR|)4pVjAgi~m~mm>af>|4o^$)zC=%14YP+Xp-S7;T*sk%a)w>_N zj<)*!6&qV{_z5_y2ZyY+e+h@8HwA}b!2KiI6a0Omw__43kG;z}(cf5i6kT1vAKBDv zOjpKOCGDt9ND>S#UO4q&xedz=~-ARh;B=mP0T9bYQ=jJmUe-15P;=1&E6TB_`*{=U) z^K(h1uDXX7rYLVZzH3yr<|Se?hcSOo;5?jt0rq#p8~XN<;I(1DzI~{=VY14aT*Ll5 znj4o#-`fSBdCP8?o1~g^8mjV}i-0k3&Z$RV?>2eLezyOYkGuB&>hTNE|NF@4`u$;y zbHn89Vaiz1o%LC>n^%ug#_s9kNl7w#Qe<6B5&waKb#Lr+p@&ZBVYNHcl>^>=&_g2h zAU*-~+3klW4A8_(Xrcg`5I@tpWF_A(G;vdg zi)YNfAWhJgMiULdb0TnWC{)@f%YOein}3(Q*d@Lov8P>I)?ojrG1TGm&e*laHgRQx zNya{zaknz=e05Mxx<1x>wjc5a91H*l9qywx!5e<|mYyJ;i7Zl~4WTiqXNMjAdPqLh zdEmv6i~wdLBkK8vK^?+eE7okBuguwvjT1KLTg#n$Yi)XUkXhQl9xaQEk?#oJu5PdW4&ovzN4tG zk#-!^dB``h?W0jPAvySe1YXFNgOinU+o5~0p_5rJuSHi14y^)v;2FWblI!AMzy`b# z8}LSvbED}m{*+jeN1tO8eWZ`1j$V15$gE$9E_#1!o>Ql^6yXOEJ?Ox%ORit+?ThYv zWCwFS(X|)gmp$RWrhQgV(`%~EA2z_()W_~=QjQGGbsQO%n|Wk-ZsCy;xyrFyOC4;P zY=vxl!qa)Da{C2*oGP|8Jl3^me@}kw-+Bht!($?AM7L!-UbbZ;g23hbr>D?i_K)7R;uqetmnw{h(it*^}O8H=>(bR4u9Sld`VUgs*}-fG6N zns168(bk#qMl+0Cb@rC36{f^(pw(hu`398a;L2_G!n4m%fg_{0;o&NAQ>5eQZSON1T7m`6rxj zI5xU8uFsI~4(b#8U0WZ^cXu62ExnoZ$(-N9dBCSGe)Et|UHt45*g`&a@x4!C3;EQ= z=Y9*@WVV~_|55*bAeKyG$U^aD5=$mAWTE&ni6tA)7K$&E__K*@f%r06pPA3vWxQ(X z3h_i8cIFz@&}PEcJgA!d_*?wq^VhRwp|fQTLHz&nZS1s*Vz;X%{BEYv_Dt+c2R=9t zdOd^vboZLP`mC+@>aaOvjnj~yXnzsf5?(dO2Y6M__g3?*L#hG)gt03VUajZ&IR6(o zNi2o%ZKyx>^yM&{hrUoGLe^<6ZshxJ=tA1`Qu|!ij1<<4WKBXH#2P4iF7%BCtzBc+ zKH?V-YTq+-EeOUkUi*zq>}8!P(XMAdB`pb?X{db)-^^tE5*wxqet$3gYvTLD3v01A zYDHh--}j?0*Fop&G<|9H7K^^*TkFu5a&0Cy{=yjx)2h*z@V|GnMO$;olj9_w6MeZ5 zS{DEOajtE8u_vE31Wo_WQX_I6p0POX!Yxsnu1)N9FPnR7XOyI6-(Z+qOpRO@{yCQ# z=}w0COkw4D#VgghGw}up zV4lrfLB5d?6ZnSoPjIm51LmVa{N;kHQpWQt@Roatz3$0ett1Fha|iRh!_KsNeZUTk*BQDJgy%(vM;N>Z@$;R-4}C~y zmwAS{cC>Kp<$BL$k@u?D92+Vk%k|3T^UT%ibaFlH%Jn*(a=Aj! zxQV0Sndj?Fo)nn_bN%`9zO45W|6Bn)HUcY&DVks;ae{95FP=y3(#HtR+c#78m@JuZ5E{@$K^3w8~$ zG0pXx!!>*CkjnG=Z%L`4tNtf5A6>9}zsmn`zIy$rEBW9;S+h~FH4Sl|79+lEH@<5# zzH6^)!gt-K`L2`kU5~_foxLo6?u?ad%q7FHrC0~e;rdLjdpY;A&X&D0K89!d%^;A% zwbE~PTB$sQ&stko&XRRy9qY<^*091@%L->rs}E~ieOXsF5Z|k->Bj#kHPo3yG!lf= zQj0(2{6N-G*w1Hu>mdJoIpp@V{JM`aHXU8mg&kQAFB*b=5OZp#OY}s@W}5{Kh#eZK zvL3>9t5s=v1sT&dBPGq6%DN3Q#+VxLgRIAX3iv@H8ed_~ZoI+M5-~2r#WUt~HA3@) z(3UpmH89`2gs(?xk2efvU4pfjmzX0@x4d9GHCXRDKTv5|YgV3J#?~Y2O!%GfO_j9~ z^V6m8?mIGgUbr)K$!}j8%A2d}#}@DPLW*{E-{0l$!Tdt6%BkYtlt{nr3Uq z3dd@btT&7QO@-ei2J-}MtfTz|@1j;uaY`#ZQ{#hI=X3uO{*6!X+iL1zY&poke@SK? z7=FlBl^U_xN3w<1K7YwrKf}JboxY5+dLGFwE=_Z-42zj@s5tGA(dd?Wf!z10Hm`#1 z;9IGb?ZGa2+TCWOeodK|V}&uSceL5s;fD+G?`y2Drrv-5qf%?XGJBL??CW=-jlVDt zlKDhvZFLjJp|w@yl(x27$9{_viw6#_Fro$ZJmm2n` zX!~8h@gHel+LmvG+J7E;D30_zGNZUSt<)D5lY6K%?Pg%u~6omT*hlkjo?9+8cnUa(lu3l^C{Sj=Nz2rM#z#g-r}uuC;K$T~B8sKMeWeH9#0 zi#>0R^KF~K@wTlfQkigDWcT>{6P2-Yy@a*yM%KE!kSWwPdUi6nN*7xh-i`;4ZSa8j z-7Vnnyx!>E0S?9Qc7b)ii}bxb+eK`?_@<@*mc|6>Z*Yw~vsd2}gMIg~&tz@Op+x#w z>(THiYbet1)PBHOXVv;H-%K@I{ek}nD6}8_A8KFP*4E&I?H4BcE{jz`-J%F zjy{G73!&*w#@0bCd0)7aDsgmv<|?D%f$QCa*YiX0>Oyu2ytc6y9<~Cn_kh`P#A6e;PSnVk6`qO`n7RTC-AiCI-71+T@=YmzKKU zwyjQj+xE94)%CBGRudZ3{?R~O$EksVe~Z0^+`97bhF;eLamumaqkrS6!C5ZxRlN(Z zDH#dmIStl)R-%`P(`_k=SH@kh?QXs2l9m4by|yj|ed5yIpc|BNCu2M<17no2*e!X* z&}{>BE3`;_L~PseW40fw1KeWY%C!%Wb@A#zZ+Wzm|2a4=VLe&olEfnwuos?0=Dogf zxzcZ4_GJJ151?!0=7nV|ACYydi`aiB@Q1u3G_CVI?+DVgt~X8V0f6b>J$9 zC*)&I6LB9=&>eBC8cqKRejF61JS+38WVVHjVLM}hukZtjU82+=k7IWrZ$}|-n~=9D zhZd#1VzjzNuY5*-3Xn17#1R$*b%>Lh|;w8mW!xkBsS3KjqnLWl4xH%+Q=BN3O#c z?}Mi(^ua~?mypw2j{G0wjWdzg=krf{^2ak4v7x%)YoRe0TSz{d!4GQ#T2A4QXZ$!# z=qz4vA>#uV^U$w5+y`yPp)E7VA_G$JKkWn;uObVc1{Z;`ip)&uB{L)b6XZZZX1-1T zg|Dew`>fbeW?){Y`yy7I+z!pA65oUyTKDTrexDlGbqE=6BDbPIjqNIyWBNXm`)0kx zUrj6%@xg5s_&*%X?dJEg@5Rm&AKOu#()Z4IEr(w5F#eSVa3|1B~Sec7@ zvH~$!A$y~X|HX`i&Sw^5?+5LQHP{uRuizbRZ8i@ZUU)@hn8>oCq+{gc#54{@ZvSdU z{M;q?t1)+g2jg3j6FL-=`7FNkc;vS5_)VjE;vZq2qcX?QV(XDROPhM0TX?x=V8P09thm$xIB1&UT~if-0unQmEb<~j}@6y zIC#&={vB-3bVcdfgDnyYj($1Kr3tLAl^|mUe1pDZvC9SDTi(7A}-6r0D?@(e}KVW$Qz4AWx;YDa`?3;^P zKbqoceaT4bDd$VvW9>`$))MZ208h!h zOLWBt%$fRT(r30BHsTyEI*27bPaicH18aeC9WqK{@+H5T>ZRBS{KHc*fQm5r=Yj$$Z_1btfY0zGHq?r0x#Xv5%=z2u-GE3#EJx@jeb z2J`CdmAV-B(vi&%qnBPGHqb=;<2mLMJJHBDuiWoUYF+g49V+rn$Gn?=-|i=ek@-=Rrfl8{%gYU9g+=uKInowl&D2l6#eQZH?ge$~^Dvt@lc9K{fBLQ)B!a!?87h zuLEC-BhG2BC>hzB0xlfDUL`-qFwtS3PumO7-45}II~;adw>ixmzg8tLi2e4i5EJ;uy7Tuvl54d1| z$qIN^i0OJK<6kE`ICgl{(vungdvYennI2u~sf=Tj3ppt=ONTLm)YdUf8BPL zcd~g$`EyBYLO`C(K{m9n=AGr(G+m76ATd-4W^&>5F>W0=6Mus6+;Q&9{3|r}Q}ktq zen1X$tQ$fQ~j|Q*9>i>%~F7 zrk64#|7)05yCN0-zX|>i$&0z1=l7BqKjQqyoUdZNQ{=_fwJSnviJ{sRp*j^(&qCH4 zL+gvO2HCrI#c2BlR z|8;oBbq(*lbEYT%Hu})1pQO=R`YlRX67vf)c(RaJU{a0#Y>uTC!#Zqtk$;ZyUBf;&bSwXZ!M)G94~4ce*bhSo zO^H=fRE~#})25n|>?6=s(}t)iQDLmA@xIf-ETw(IVoM(k8&di`jvopO%RNnu@C($RS;czi6#m8QQsZwb zpj|)hO8aK$QEV$|OAWTAyhau`eFpk?(x1-qow^qH`th{R4FFC2Toz%m1$4O+z=t>jQe% zh<)uMm&S!Hb(U-Ygl?#1|Cv6_t?6FIEpjta_$H`B;)C$rQZ=v}n)Gf%KTqOX33+d# zi!IQ;@TI1U+y1k3@nB6CThOZ|`d+&D&)3(*iGlThP3MWO^XiS}I`p=z>6Nc=i(OxX zTxs{|O};(= zS0o&BB|+s2Xgwoben?Ui_~Z$U31-L$ap7rJRXIf9~_7XG#8xez^72kB|Y z!GF7M>b>qOHr_neek;|=?IB$y`RWDg;I4Pxqdt_Tt0uVJYP7ikT~&pw@6-)26Zb*< ztI;dIKMS;AMfaFhli$m+*cYP|GjTT&n(i{Aw^9@f=jJY{vm|sTwQ-8jUF*x2aVUv}uKx)?m~Adv#_pvcp7Pv*BOBDY7T6xMmMrv)zKc+uImWrSL+BwYcl(3wlYvwVbxe9gt z$9{?|?nV}`kab_=NXVuStUUzm>hpO3M_r8b41b|ep4a)0>Q@tobhi4A+H;}wuQ1CTib zwYfx{{;kP%CC!s3Vsnd~U7#PN>FPkuU-}C6;d;iqx1_XnQ*r4P`&!nldUO^|Z-`H|j=aa! zx;&{a$1zeTI_7$IpLG#=zOUe@EP;<9-q>{nsLn+bK?FQ-<=?*ZC>As$-;BO zdm+9{XKuR<{Cxx5Nn3KBO`M4E+iv(R1^mnUhRk!@ps&z8SNN_x$akT+Z8?0mJIHtc zH_vT7*z_{DeFfbAy}7OMT{&>+&`-ohi@C~1yS!o=c$^A8r-0Wi@SDlpETaK@Yraw^ zd6~vHi<+IpFr}+Xnfn`S?n)+?*^;2Ni%&h|N0pir_;}i(xf&lfO%r(Eo#F1aEi5rz_UlUcGa1^Fd0}J)@JmXZMSA4qIND@Q!0W>_*SZ+**9%BERP`c0Y1iV&#Yr&i;_OPVqFQ8JoR5-l|;eK!;F@H-9aD zy?AV>6l|zN%S*b&c5@Ybo2wb~%Wp62uIAXR7`?iLnac%N@ruRUIi~h5ziKp@6?4wv z2$MhCL4FVI-Tpv9chj<>W`X}>=#zP>)mw<2w}$V(10B7xyr{c@T0Y6)o|bsUthM8% zo$b6MZ4pc5bs-xiCh}!zm%dh46p)8q)GYUkXzMWTY+qK=EcfJEJ=es3eSz!fu{@b) zAK=)@@#^LAW8ztl>zqK%CHjni)MTRmMvl-2>wjx>#vB)Ll4pvD4RochxeMELj*s=^ zjxnnx&mo7tJ=8r?gn2>hdfj!(8#SbrKwn#5ZH%d#<9QH1Pw4 z{5~S9uJ`>Ue9A?tac(@{Sv|-w#_$~_&&7JRk+zM>&OBp6m`h}d(7KUlgzsk3m$mez zWMbTyZ2FSS^Jbnm^Ss#^=!^I)&Cr>dzBs2BrRl&UGBwXY8&2Lg@c#5W+4H^uc*r*l zLxoQF+6>Mw=u~ig0y@2Nf7loI1-32+=X}SB&n5I+k)q2nKRLzaW=*jOI+gZWw;r3V zsH``e1{;BMx;n3{lRj!=Bi5Jrhn&!L;d>M7mzI%PF6&57ix1!00_e3G`jvIONX2vM z9=;jH*e;Nx&_x{4`>aXs{7&2$Yoa>W%DCzoS0rPVZ_9hH+4P3n@JL%#LCW=@#mDh7@s_bjT>OZ-p1(4^$JA|G?&xt5&jx0$uR%`2-%4p@Lk z#MmrXB=Fd+S~PgP8iYqQ@Yo1ERN#@Cy(sNG{3`K+?*NY*6V$o0=;K-75e+;{d`I59 z!2Lj5gQSA+1_#(Oh)Ce)t1 zFYxekeJ$6|1CJEG)yddvxhJ{LA$SO`W$r0_YZ@EoIsq*Ncp($ms9t1OzG-BJOK4MM zzsRU~WVdPWT5<;sIq-dSHnJZ*Ww!7=90{=&#*J+lZMFnru&ar|t|oQ}ee9NJWh74DrK)C;RiXZiO#ZSw z7TH`eS!DHzcggeHqx(F>_fGU;1+}u=iay6U%rw|ERFef}!OINfg$X(^fdj$2$cr5M zl+Cjyc{X_cAa;H{96YB6Cu7-4iTB;5l$WygI(N2rV{Aj{w%hL_|kIW3LpC)Z{Do z`dLN?^4HCyp>yd2{uh};TQ&S3r+IG&??v!lNiiWWJR|kzB>u_5JK(QO`dkN&tn&TQ z87^uunTbR7>I3-dcfIGu|KeIUaIWYG6LNe%bb1BG!}i+(x;Fr8;ycX$Fs!Lv@;|V? z8aH1L>wVZahMbM)JE2ANnnuea>;H#dzo750hv9ykTVgEWft;d}Gz)MT`$(*ZS zgnAn}^)r&w%*d(|$$>;xNqvrFa&Tk~UF;ky_%b20EXYirF&Ch_rDluB9;w-qt(eWO zgf{eu!EHc)NS>F0Z}Sh^fc;6lB0uEL3Fw=Bwhq11ZEzg2Nt-6Ar$~QtRP1=sLkWkp zIXL=uqR2TDGW)R7Jz;vUdt&Q`WS|M#I2#)y9lf^(J)(VsF=+RpFXwlhrcP{n7vB%H z9kPo*ob@mGGw^BPFAK${8R&~K!{Ij>GF%C&t_?lxSJ}%Pj(-v33&_B45c*fgKjZUJ z@geBAMx5JBukM31!etZ*kKv~=S;Xb9NcoXv#@;(=$$7<1I8?||er$y%FBgx4ta42OjcV?bU(9h3Lgd>I*K`cTd=%^R&Fe_C6amn&?}UH<543 zJn{m4y@xqyJKrd?D=m>FqteXK6YBwaCf+~n=pOH8Uoun~x2%MDZjw^g=vMM?rC+?? zZ@silZu2^F!BTi`9r}}TX!=v~9A$p{K5gGa+uMt8Ok3pkv^>l^)KGJ;=N<9IrZDC` z(Bjivf0a%8`KlUeK2ASRF&5hCcfEHi(4h;_p_U-b){)1#@XkmLrYh}?q(4_+iY>*j zm-5ZnWh5=e60@w?4A=YSN$5@bE^xURgp0N0M$KlBzO18vQtL{_Jc@SKGiI?J#b%H> zNh$9|k^xMYapn>g!=`Q^rg?{jT?p zj9D8mNsco~n3*8;ppV(W!y`T}qZ&~&6%@Fq0982G;y zq`7m&qcpq;tyc4_)XA&{2VQazLi8&0Lc!ht8}#ZO6yMJ*^!fmCd(fzv@pu_e6McJ` z?Y%%BHTzNGCB)trdU~4iEQX%iutB93ycr+DQ1;yK=jR=4UN>tBEgH>3k6pnr2|O0^ z{vU$x`+>(o=y5&og!mR7DHFLPJa|303O!!S>!Ejq9^-k}9A2Kc6#XtTW9`58OxRBQ zZEWWQeZwBNdMjnT^k)(MSxZ{Oyku~U!afvcU#&+$!wY|nBuqmM} zvCpNg9AHzz*w)dW*yn<0WM`Q>IJWD-SjHwWyxu#Zv4!N`S!CvF+U}qamsd+A z*}!w=c=X<8`X+ksBDz?f!w)j9h_;LEcE}2J3La>be#CNS@*dp`3A3~D*5l>Gnk<&&pMGSW@1bh z^{2l13r@d*_YJ&{Prpoj=VDh0jij($d%p;Ln}A8Ss?_-TeceoO;3YPFo*I9&gFYLU z6*o(+LNflasg)Y9!~DeA_aq;mll^+Ugd+PbI#9KK_oeO1~rNcMtvb zqMs#)mH&>kbl~SO(^ux~mn0W@IO`lzPdb&oVdbbNR$C2zi6QI&t`R)vU<_4^=X>Yx zd*l1y{J{Gw-!R-C@x*NwS-+FmHCbbgZtPN2|H-2HpX>J)v`#V9MT8%E(Yor`uu+*C zsv@(FJQ+b9l8CIKmeO-dAOC`V1+A-8&*cYr?gxioux>dvd{pIz%E&24w(#7rh$%d` zfal*;JeQ{(OBl7~$nc1FiyWU9($3HgRRu{KHW$1b=Si6gOfn^|mpI6G4HY97^!KC) z?6#y0wO95h=8fEHT_HuDA@g$Pt8?TG(+ADhe8d#an2XNeW?rNAx?c_G# zwUE6RTTXI-1a4!2TQsngoL)8D;CBF@Q^2n9zLk%L1!2|)xIM)70krTK@cfAPJ_cr= zut|PzH+!=h>z`laOWF4`UrG|OSPvS8*$dOiNnoET@nEc=vFo3!F2oDmkVBJgkC#zu&py zjcK$~6mItS1s8LzG5#NdpC557|E9acI?!)KzDR$i2JHbh>GvmWM}z%OI2Po8RHZDo2`ISE0-$&YkZo_$Rg}$%ywt!Sz+OS0r!n@`@Sg$?53J+t8cS(4SL@J($vfKGk9mMA!d^bSvKo>DKIJ z4NH^Jt2yXZ(Vgf=bf>8+S@hrkk96n5!oO^ykE-F*3-IGkbm$klGa{%vEsdf#_ipf| zY8Wd=xn;F|(E2pN7nTfa3#?rKd=}GRfnrL~m|UBK?}~L~m}qqBo;7y}1{? z*?g^R`Umu;$erGLQ}Ve)cSbWN(FI@Dozd6m&InC+>fqx-bm9W^AbCv@Vd&4oV?#$x zIg*4<+^p%uknXGsKKFfer#xGTo}C(eZYsL75*=EFEc?DB| zML=f`vkwdE($k_lk*lIRSD_awqtTt5i|*Xa^FiHN_J5V`yoN5Wt2@zqqBli1y4XdPR3826bl``Z5z;DY{dK9@TUw zy7Yf^=ikwt=qb^gqCcx=JJEq5-6?ug z^yfhI+jHpT|4iNaDe~bi!z4|AitfAbHB&ASV!&+ozq>r$g{(tOm^TS33h z!SAfa3mBz)Q@1lQ3C%y^eA)A|bjl|Np@i&|u!+(iX)mw>gK<23Y zM>;P-z6pE`tRV;Bqsu8`4aZCyvUV-=XzBZA;M2j}auG1vsQDUHZxz?-nfn@6>IRD+ z*2+8E*voUT{H1ySN4BTyrruP7YVhUiR^-*?Vrx8XLI~=B_b* z)+EftxTte;z)b=4aF%aw$F7!jhEMOl{yKoygyIN zMAwTpf&yaFe7YE^OTa&2YO=|b>e4GU^HozDbqmN>U~Pco9^wkE_;vVETl*RduqBtj z78`-S<*&alBQ8)WSp8_qUH)s?#9T?{OWDK-USMM#G$oaFil{`T{at8DAyzKoa?dzui+>pC z{EI%T$V=(mdhaA(#-kR!CCA4)M;mw^44sH?Z_RzcoN*Fw$@50?pP-5BymOX!JP#DK zstukyH{vVu9vtc?mbqQ} zblz-hTd;~ez2Zf!-{TuonTtGtT_&*Dj4ct)H&<~!b=h)Yf}MfAkz}kGDKHSfrUU%n z6vzMbV(_(4JK*2|&!u>LYsQyqg-R6CRL!w!P%Wh`nAx?%Q7c9U_bQx9l9rKlh-w zkjMVV$kieSi<(siuY>;9SAF|SIlZ#pw3}SYukwY8%<4>Pp@!vG=L$&O*^jl_kbxQq zk~1Lr0=@mD^;LtqS<7r0j9e)~t}H{YEQc4bt$lzGw++91%{=(082)p?vr@0i30?bu zYa4K74w!cqxVG`Xw?)8}|MAZ8uIw{7`Czg?9k`AJu1&xd-)7qda)sVU{-zQS>UpcI zbv`_mh+ps`=UJRj0iMHvrP%E<_m~gdujC9G`R^?-))^%)U8`3eeF6Ndx{8qwa!T-H zk*96cVB7iXcz*)4&_ErdUmTYDR|e{;1?v7wzx}M?2|aAPKjYC(`tI&aTorP@0KUye zHs*;SFXOf-&iO-Su6L??fL)w(KhBDr%!L~dcYyZ-KZq(p-H8}h-Jw?^V4LqoE z>qW+hkDvfrQt{vJ*75&`r+#YNO}(-%c#N^V-pE`|{(BM3Yj2mB?{f0EDoVVq3)m;o z@9%LO9^|*Gl4SCVgr*q}-!CsAHx*e(Uu)9kJIJ&8syn|#vl&9ORYJ4Z&vocbdg+TA zuff_$6}*$KM3%`~k#niiFTSF0**rP^A;)|5Wr`f%!|^+6Ssiu+I{9@SesRXtPyFWa z!3MUP1=P|LJWj{P5nU^JG@VI$>dRc6KNG4i)0+q6pWONA8TjB*0l747#FNdSty*BX zX5Si-(e1=dU*sFwKaWTA-5ly_6<9rgwXpu{SN)H(-qeO1LiZ+145xqLBk0~}wdMr> znAxGK?R$~aJ1Ug+{p`iJ|KghCGhdTy7nSzcWnZSWACW!2f}^spQEJ{~?>I6hcfpZy zxtotn$PGI>G1qY{fgJ7x{x^_Nx{591s3W)XXkzaEqe;18f8zfHz3x}=&(#XftHLX{ zH>tWBFL_NH#m8?o`B~>_Q}|z933Wu~uk)oW&}!mHj&4A{%07cUO6W^+lC_*qd0vOS zmU~kB#mT-1Ip^bFGa2OJ8p8NzBDu(Bc;DD(;sk!-z%ShM*J|LrPJ^FSgP)o2 zEkx#?*QYc#0Y`yfDYPf>D+Fc^`3D1Int#Nh?JLoT85~!HS4_r{4sHgv{*xn`PU1ai!fvhnUVdK9a_+Pi=PM#R3 zJpWGBUM)6VM}L#}|L+2}#3P$>PgYe-mOL$k)G?wS2y2J0cTlsah?+$z@>OgvsTm;t zo=oHjc4>{Vg8J&zH!=ek)^}pFkin;rFR}(yi2TsADaaiqAyBvI1#FIUf1_Rz@R=ty zjGzOt$ytMaUD}>N8=<;IavrK%bh^K<=`T0z+uokx`BIIdH)i;n@~Bsom)Wm$3Hv3P zG06l21ARjPpV#`W|0t zA->r{d>Do3)LZs3i;1LA^wX(=Loi&*(R}#xo+K}2&2`%PPMkZ zK)&9K)Fu);O};~%h?Wn&4xW91>)N-0Zy~Uhx<%)Jb5-$;tvje&#M;=!S0AW-e6fn3 z4VrnE?FY2;ApLm|9{C=!@=4k}{bIb-F4B1A*ZAB{m^~?{Vlq+=zFeJm@Z1;pG(6zX z>p*`h;5QT6s{iECyy<5G=Y^b4fAQCO9j625t2h@~ZbA+Up2EP7;7G?NHKycVGW=Hm z%U|ZLrp<8LOweo+Sy#hOqMzdbDr8>;4axY!d9M%q15T%X1pB`*j@yF!yMz0Og8Lu9 z-?glHP+K{Fbswd@7~br|`+eD>*lL)M-^;xGeQJ=s#3psgVhm1uICZ<6z-fuwiSK*3 z{ZaQAdp^&}K94OGKYePTu8CGlgf+Y``L4+sz<2$HF6m6l;-B1sd^zE@ug#mrc9J?2 zpK0rODmlm3+C8@JBE8Q1t^0H_o!A31$LL*i;!f45)p{~Y{WI=m_nK!dL3a9>TP??4 zI!g@&`R8fx`}c8Q>Q#s?$-yoXo6>~sQ;?yQ6)`5}HLuJ6p|8~;Ip~m)RZ7hwMXixs z{HM_yCy;wjqc={nm;ch7Mh5O>L%L z#iqqKx_Qw}6w>omiC5QDn=uzrL z?A8tF+6D}M|Lvs>n-(v2ZPwq>y<0a>%V*66*0h}`=OtSHcz<_+MJcnA+iE1ozl5C4 zY-DOOu-9@~R|IN9NDg_A&fwi6b(-m~$V_5-uBy`%$RQ8Z6$#{#@7unGJm#(cjq;eK z=85EQOD?NLAJO)TYVa>2pLG;9y!Rp(H?e8+E93?9C`~R(F00i07aI0r56Sp-L3>iJ zi!3Uq?nZ}xoV$Y>5TQJCv9B({bHbnUFDt2GEYIJ>^9EpD3{ARs>B*Egc8?S8QOhfhwR~ZO(xIgmo=)#_$h8 z4=Qy-MII+}Uj56T=T(<&xmV8^Mb3tC&%)TP)Oz{B+lyKcAPetaUfg;HSt#p!3bI$3 zo+Rx6 zx|J4WLjm&YcI4Ii;`<(X7<}DRE;zf@F8|YYOlR)3!ll&*ka&=E)!J1qHpL28^BmQf zochh0yVA)`-3+gkh0f7YtKm)T4vmLYff=wFMSHRj)PatKzattGBYaIm2khJ4X9#r> zr|jDvs%`dPRSVIrbT)XpJe_KhL20D^#^jN8P2QX&%iVCU&ud z`qcBGmFIxHz;Xt#OlRyee*hQM|50Myz}Anvq5i>Q$qSmNQU`__Fq-`2U1F=c_VB!) z+CpNh`=%<*LW6s`r|~5=cNcnJH#`>@fmZd0G|n+O0GC`D=-W3m>>S~Ux&Xes>%G|+Y2@RdT4pcm-tKOW(Cw$ z+N1GTiN;@d|AYMHYF}%6;TW|-j}5nnA4}x_UhpBfmA;7#xB-~Uo_S(f4mwTz9>j}z zCBCox+sw1SUEJzqo?rRxqSh>YL_^t%e(+#k5p~JMUK5*aUcylOBJfB%{qXz7if>Em zE`^?xe{E?p8k@d@|LBOH|DaC(&+_GZaI)tAkJOsDaPw~$ogbqv>PprvlDYEN#ny>0 zsrQ_@zG^@>zUDILlNC0T_)9pR^<<@O4Zb8<2a$hmj^z4ou5Wwt0h^C~@sm~B|2GXQ zGakJie+_;>@48*;aLbB4cH)xs88n z2|xWm+`W5zRMpk+f6kmF%q3S6ZWEeh63|SzM(!G$N#Z4BAV8q?(Wg(j#MUGO;ieYk zl7s{W1}y>Y&Av?lk(ofe)Z0+;;S!5L6pdJ0TVElfB`{W`pbTD`_q)!S(THg6^FF`d z^ZEV$*q?LuKKty;+H0@9_S$Q$y#;t-qxh<%%Xb9%DY@YOySCW&7_-@X0JXIWqV&ib;L_2qW%f4hVG-|po8x1Zx9Ekyhx@sElB1-a(( zUITx)qF2ffSN39GlZ}27`;TqxNw%?1*~Z>u8+#Pd^Vr7TWgB~zZR|<5u~*r~US%75 zlx^AHC0t9$OFODWdv7bOX ziydhXU8n4pf5?A!A8W@4y}a(WrE_<0rtTQ%oZgSUj3q5Ft-*kXExYIrgidtu##YFXCKziK5QZBjker0_oz)}LxS5EEh4_rc2(L?a7Xaw z1@LA%^EsJz&LGd|quUof#s2DnH?}W|_-hb*R?(YYj9yhup>j5(5BoDyvTX@6wfpFb#2+yZ9pt?E8hi59Ov11ebI8b|>Y$ao6I&gwg@2;}ib$rSCy} zokegx6gpeY%QL~{VsQDBx2~zKBwj__Lww+|yz2GD?g!cdEoN3;PN|f4XXY*@!t?{BHsVl)zxRGDGOYf&W%aYlT^fF`s z``-A;ZqZ$P{*5KO$I!OTW|@=BKk)Wvc1K#slsKgSO~1Hh>B{8P3AO>Yd@at?xqDPv zI&0tTG~~W{jx^D&__>KSqIg_dw@LMkBYvS|d|JcKacKp-Kf^bN{w>;5x6_ffH`9?e z4_~T5&OYA6xA`iJpLuS9lGSPbt=|7LM-<67va{+^wY=0ffvv{GaXf|o<^&nt1k zJ>gqq-!lQ6lc&g;Mj#Vy<*f5DHNnPxG9EX)$QgX(CB!IC#WRPFu%D9u&j8nb_`iN0 z|JPFw4fD!9s);ugK=-bwzJjs7im@K0)4hMq$F)KCgyvmkz*MJu0^iXDp@V`8f&+pV zLI=O_ah(YrY%RbB9=_iJZ})z9?3)<2*M&R@N0S0_}6}noJN(4UNye>p!YtI0`0PwqX zU6A?q&Fg}|N#G8%%V-aUz0-FZvZ z^mXuw;EpGZJ0p7Fjvj;l=ODiN?|0Z0C&{+uDs5P>>Aqy*F^~}TK|wAn`tL~ zZaJZJOr#81U!NYUjP?`HC;p$;a8F)3ciffh-$NE~%TM{-KN)gb&@)vu4^E20d#u`5 zhvGl0hW*z(_FvV!zYIV50lZ}r=dT&uouRSLA4dmzH1ggjcuIM)$3<@dzp5$dNvG&K z2iO_~UC2PXp%+36-(j3{$#4Q0)jP-)--UOrjjCx~6}x}uttmCFKOVS$r^2134(=>1 zeC=U;KX2!*=#1(p@HHBIjR9Xp<{^CFNaDG~MdndP{0kr6S=DzCzmxAj;d=(>54x-X zI%dc(L@tp_h};t_XLS)D-Xi-Dna4Q7*ffjqrSN#2oV~vTFWjvr>OQ;M)Ts6b#p+#s ze&x}JOwrzV3C-+f>j>gARYAVsq~3CPJi*uBv4*s?DIGU5o-JFIjvII$hKI9O`pVqk z*5OoC30`$lp@^**j=Yg+j&mu@G^cScPP_#fFB<2%ACpm=;M2u>~g26@2K3R zo*3|Dsoe3I7%Il^gPNF4{j7nB$VdLok(Ta628~?fBKK7t)0Bm3B7S3IX(PVunzf(h zDQ$c6n%jPsXHEsTv_7F)lce9D=POb=QYkxoMQWERC9X`PkEQ~ zZGXMekxl*S>^Y9(OSV&FSIDuBai-eUtI7U-&206Z(C?iOkVj9ug){??Ik)SpjQd?* zWz47S=Q*b=bKX28?Jm1APX3Ym+09wt?=F*i5vmX?lr0&}^ z=PB-w6d20=rd`}`7Q$x9*QRtNGv}~hzNjGQ_hm`{xR*Uk>gK7Br`+w`kNMH3MQ8%| z#|C`ogf>hKNSi3Xacl~A)dCMIX~kj#jqI5_0^Ab^AJXso%t60v2s&@*b4@pM*QXhK zh>78QKqKEuh|B$-<~Td|e5NNmb=@y?;8v`&nboLiLObMs+I&^<3_+ey$Gtgz+9PQh zDtb%fT)SMHuRFj)KmC++=gs}53+_pp!v4adj8C&dw``2xT-q5&J6qLQw`cH6`dy>* zXlFI;Tu(c_+%>v$@Dcm^6|t%Jl71iQt;Acg3vDn20N-YfyKvRoYyH}^fF+5s01sp=%=#F<8Xm*x`WVXC>*H`D zJPzf815C-^SoBHzDAPi_&pZBN_~+|G7pKiJEU zyt1D80-kq$9iH%=wuU&fym%>&=y>xbJW2gpJdt_y@w>goN*RK872!UN*87n1l|IOK z^9mzfa8-v1Z4um*KKiyA?Lwa_#aC{;i@gnNEw&TPsiorc7Q7DUQ#r>Hd~iYwE$neG zcgL;R-0xxBzRexCd!d=)+r|k^$^mBzz%v>DQ`@13$ahX1U2D(hZY_PDu%@25rWfn6 znRVI18f;|^wy_4svIfVo2FJ4oC$I)5;!_~1(aipZdk8On9QGM}LgQ{*Wb)4raqZfb zzzM)8<>Enf0n^oJPv%BHgHw(W~7(0AVm z?ChWi`AT1p)voW2%6zQlU02HZx^_*hN8j#7d@4noZKwXCI@6JdnUN=VVT;){0=rC$ zYuCAYwK0~xRosSgX&2CS6CDn@8}cLWuIe`R^~~z0%#d@SQ`qz|XBVD=?w&UFbq5n% zyOuD|yE%(Ijr{8xeEW5mp`XEAJoQ`T-;AGgMa?GY)kWbUCSI(0;#7iiQDk$-o6Ai2 zypeu}^(Ksn$R$+IA(Oyst(CQJ;Vns&O+MklxkJvMjg6>z_JHYkebhbrH2C7ItQtS;NA~G6 z$y;*MuWqrRyDK!>(B0*(d;Bwr&a%L~$zka2&cvUh2R>8MM8~;8<$OrjafSxM|3-A2 zuX9Y)b(|;H7&^|e(aIQi4R<)BBcqv1#aix`kgTdE9IFNm;hD%?A z(QSr?T5VUO<9s(fN;>uLpnj3P7eB*UC-ATXk7Dk#Q&;?|MDW1GTrXtZETWBq^ULKw z@U@QrZmIc|m9s{-L`)tc;|Et|?bp2B=CWnNEaeow+i%gtR!CCvMY%>QEe@f*40 zFG{!B3e9|uyvE&G;!AWLYezR{I$h5<*`4sZC4?bLbD8L}yoj#1?AhZJx0k7jd1=B| zGY*aDO9uCH9{T8#ustn2p7=Oh=y=(lyD~93ll$cz`1S0C9rgZ6h0aX=`%vv?llZyi ziK%1vjq;vjjlX~8lh#d{N9}V=rkwpVOwObDb(wEUu)U05mwL)5XWmF1o74pN6X;If zDrv}0o`OyP3#bo{AItHFo0^ywwed0rUk+V%R30w;NF-O#)?&fO?W_hl2g ziz+m;O}Ep(bUduc1H0I-oPr+}ys|paLbqb}1cAH4Sg4FoE8{bqHYPAWA8@Yz z_>u*I{513>*>iO8ezun~CK;GJEQL;?XCKlJiO*S?l-hTHCifcmYgv`K-(H}oIgam{ zoSEE_U5F3a%mK=-V$KmWe~^*3g>trFldzw=-ij2?FxWqy2=62J1OM`hIlDzqWKKoq zZv1m6$+>O5$?7@IdB*K}J)^y=fVY%){>CQz_b5LC<4$0lO#8>Nj}sV=i8El_35>^Z zxA_yOP>jk|b~%9YO&RDr=P3)N%`ZVKM{&3L*zXlM$z!X5{tJvLONa4E#p)Kj)pS#A zu!?m`;Fg1&TAnt}?k@+w$Ch{k>A-F-uzN+`p@}N*g4ZTsmK$xr@HN^g@d9w^j(raF zLi@JN&fI6uWs2ucGdUf=kaN5wM-Lcoro7GA80^CrUe+Zr+^oZJb{K{Z9cRUVaC#Vq z)Af2r0mD0V7@h-$qba{BjHd!a6Kxy|46)}<8VwAeG^MyZN=A<#4GdQ?w=#iY?n?9Y zvA{4N7)qN3hMB-{%(Mb0d2BP4J~|93>vI@FL(w(<0*0rNcV3FWV*mMV&VdXY1+C@n z1Z7vm|9Cg+Y!`Sv2p>(dhqk~oIN=$x!LL)S+s8~6j~BYS5!|(~*N*I$iYqI3N8Ts$ z9?5G(4{j~xRl&#M<8b=TbxP7PXxpEmZ6){x@v>LpOnt+8cr|mb?ZIq^^+Dk=t*o&h zmK*oSz77n#^t#QSTF$#gj(ZG#VGaDk!QZa2n}t_k55~PS-t2w&RRBg^wlDYvWbI|y z@C@m!X=2Y}!d^sl{v!4wq6gh2eCEvq^|fBsct>$g+S&^%k8Y`|-0k2V!2;-+!82s< zE`UxcVVtJmxLEA;jYJL z`6lIwU&~U~eZLxyJj$Zm?HtB#r-VHbxR_K*8xHf7d`Ga`!3V0_6Ftes{;Bu9@HBqb za`|sFFkd#I9RG{58I#^yc>XilRm86OqnrMdHC6TN>m&3+aOhyq^$}b^-?F!? zkuQa5u&j?lhkLG(&CrhxtY1P)So8HWN7Y=rYfJw^=Rjb09^0L}9k1ALRIacV4tm9Y zw<*!RrN7Df1nb}eQ=;uL*1@--7g9zcc(7efbid$u!G7Wr8gk_o>Vqed#gtdvwp-5E z40?Q}(BsB@lQ~$6tnrwV=vjqL@AgUf1~v8a)H8<1u2UAiu-9upsl>QXau?^x1>fm? zKK3IG44CY z=bBP-ax?qpIy)6Tx`JI8nPkH$Cgize?|fxYO3^bN-gfwTM<>EAB? z>+fEw|5pTWBKmAH4hIyA8<~4!w`vQnV~v#iZ3V`MKNMWKJgnyf=M77$^mTGQaDGhQ z!EFccNx=Gp*g|J6>scrMT?F0&>kG6+*7gs9^xngcqE139Q8iM5mjI@|=UMLIl=D z!1~ur+VeoTJ$C}X^5Q#nSbrqxz*^dQJMDa}gS zG5d2_OOLaU&WA?1p;Z^qp$l@SWS2IUyCm$oex2O4Ben{A$m4^Kb+Om3U_Gr=%-(!8 zIe6;lP4+6z>`$}*=YF{0Y2wGw$N!jp{ubukMR-fWx4+EX@anQ{JOBQPZ~xyv`Nzq> zzd0aKW*#{z&GNxjX|f;3UMZ=IeI@#Ep1sh%F80G_OYJTT_j;zRusrwxxN*Gdj@`;$ zDXuwbb(-k3InriTjoB^xQPH>g9XNTs>aNS?S2&xURdx05kC8bX zLr=`bI6ajq`7d9-!g;P9j!N*Q$0aibtN*BWY8s{eLKMJ)T~B?eSFn zIrH9`zW3UUsQ%S@S{7-MJmfzvamiyVYLz^l{fNIgySjkjsF)qER?IGSQBTHe&85vT zb$R#q=8S=Uou>XS)&h~I%v6!5Fn*DJ^k|FOYuR^=SMH|z&}8x6MUZ@X$iSP?zl-3b z+7lloowE$rjf(JGx-LnV;2L|$9Oi8WI4xxWm&@W&GkElkdgg7Wj_vh*LJ!xcgdXDV zL7B_qBlKDJesUkX(RSmmPQPXknel-lcV(aYW0Sp^GcOzT)(Ma6uTKnM=;e;|RrEAf z`pzA*j1Ty@Z&bU;W)8uJ<@3MDz=Su3UvwV>H%>pX&fdZq!uwCGvA^}iTD!*B?jarz z4(`s^eatmh0=I~cdp~sV#6B3lxv@X*={)7Vm!!k{$vb>mdlNkN9gDw%{3qG-yZWTi ze`*5)+tK}cg7b;3*bWY(jgM%313qP-JF$;4?WYM!lE_Ds;tE4P?j)S2&pW&Bb8FC_ z7cbeT#gO)O;q0|c_^3MtA3FgUM-lQ(37*s3SDY<+ODk;bE9@;c(qCG-bV)w+EG|nCUz)FG z!{;Y5r_VBH{Mf>A4&z-<$QHj*(Bo_^%8T8+w_F|2elU7~H{K$)VRBxWoRdh~U&@20 zW;`qv6@hi=CgqFF4q07`VzIr;zSqywxx#PFsmcym2(rf4C<(#6LzEc@mY!L1uz8r< zjQn_F#r*LWWN=Q$oA$wCt3ccgpP!GuKR(}PtX(=k;8de+gDJ~Qo?he;TL2q#Z4KYd zYA;(aaPm#?+`KY1HS_$+jV^2`Yhz9Eb=Vzm!T$J11i{NIuw5!5Eh;XmbX&v2rGMq= zqYv-U&(+fRm^g0?{k*L~N!WmmaxUQ{^P#tER@&YM*QaGyDZ`U97R9IRy)AymmfPYt z-mtm4?E6_$%3|`Sl->H<(v4AddB6R)jOs-Vy#M;QrDeZ)qO|OWhpWqCuAZ`(yo>L9 zyn6b;QKe;fKT-W#@@{K*tn?(fq#`qb=L~M=ygLKFEGjQP-VCqUNxN3jt}ZP@UqdTu z%&E~U5>pq{B&Hrvm3D9en`X}buGqW8vU!j@iu>)e#eV{DGA~4T5gOs!zs8<@of7aZ z=RN}DV&)Yw$pUNH1NlwpVKQfn`Mym_bRU2(6#qK`&L5uv_Z|bU&G!|B686sw92eYP z^}~>3Y4ws!i_+16?beUbZ~H63Uw>2RO5(}rj0o-uZXX0s|5Lj;&}2&UDEn&dxd(n` z&o?Qap~z`vJ(G1j+oag~g8v6s+ERbAKihi|y7MtO&Yn8u)RMb6qqKPJkFT|lC+~!O zrS}Xi#rCm&ei|2yqn+9LO7hK1K3-y0xhD=>I#qQSxMNAR(7$Z(2_gg9|1I48M2_KS&c$d1Wz$s~0y4uI{@e>c&FRgPu-{n4^-_=ipeoPNNqJ2NG z{n(xU0B4Yw&exrCr!ZxSAGra{Kbbo}#Yb?@`8b$%=yMVsIhm7*_{loU8MfG_Drz+I zQQmI~sXYImnvbr8ug*t-q2N$-c&^DjH0D~gEgBeJ$zG!y-otar96SbWblL(9nHr`c z)8t7%g|~Xn{de}KmUXFTe=K_Y|H-)AWsHmWl0Ft#|DXOYmS?8@1JLV`JZm2ClXkjHqJ|E%zrQkTr5F6L3s|A&UZiGG3ETw9jJ zo~v6;^W;LO%rUiPDl!en-Zl0U;kMK+EvHO{w$$1)_$Lvc&~nGwOl3fDGHsbdTW;0c za%hyHz*2uk$ z_N0Av_H0w4O~oflq)n^zHkoMCDtjjXDfmtiU!vWr(Wd!d)22e&v_)@|NpF+X8EI3` zGNet+BfU-ON}4BQ?*@A==K?}6zo{Jp=M%^l(ita#&4T|zJ9?HO?T~Sdz$Rlabo^Vi z!+`Jq9XxuL@g;aLF4?qWB<(O`x0S@Wh;57DZQWAAKb3K*)5k^n(usakdKgzSfJc^& zE9HUfD$4^6%ag#B2AeT1f@fbHm!4%vJA|eSz6h=)>~FMhVBQ>rhrnNa$MDLEKmozA zJR$YSfI8b|-jC6q&SyBo!+zj+FV4p~<2c5==wx0<+L5F>dtEr+5!xLOukm8cUlQnvSS>(^~cRnp8^gDQAp}istI!)Wq1GHI?1Ca#-tc7Qcwo{N#Theic3O;AHmL2etlg;YpqFq%GvhdE@kwAxkeVnS`!o zT-=NHHJdp*U3y`O+z(Yjc{bLOV%|@)7hhXd6^I=imwLLQDln5H(~^Cg>_1a&wqu+< zc;JVGKlisy4@kM}sXX&U2d1s;^Y|&oBL`XBMC`~SYnPe5#j)ONJU*=~bbNpD$1fp6 zZ`N2#$t!bK>@&|XXJwCfMt`@r2tC9XMbhh>qlsRTW$8}>!o$cqf1bW}foI3yn}VD_ z__P@zbLCIQKdJKr1JDtPZ}Hbp4ZMY&95iR)Gr-+fG%YZh^_BapwIBVM7C6_ohCR}N(2MX3KVhuC zI*xt+uf{PBdBnduj>1#P`F2nrM^B)HaST>?0+<$iJdES_8S7&vo5uz{`WSeh2Tsz@ zh}^vvzhIYx`TNLo1?Dm)XV}9;VDCoG=+nNh!~O+eA1OIa8NZ(6@E$%! zQAkN?LKjZPM)FA>p_9UInHd8)lb7<&eLe=s_?qcw^D}nYD!$n-GZu4^_oPrR@`y6Y zm;W{S=8>8?in+Ywjo^|;nQQOC|Ig=)x;^e?`}@0WsZ*HS$IhQvhTjR?!ejNW$#%=L~GZw@fc8;#r8}4r|y^XMe@Hio6U_SPbt9BNm zw<&uH?r{hn2L>7JZ5pkK-U2nT{jumoZ=w}Fd-gA`<_vcsd&(?uUWv7(W^niCan^ax zFm?MJFMIe6wDWP=n9D!XF9-i+@SlVKjs4eh_x_!CG z5`>1%=XvH2Kee~AciLd8?VSYe$RMpVA=TX*_}@C{WqWkx+`tv4Xm^tm<7s&8Zu@El z-nVinYet{cY9*fZc+dOL_2HydbALH+f0`Xn>v$ zg%93?ZGsz|lQaFT^*4peE9M63xeu&-`BrNK&xWd@frpo;ri%OoA51eOzl-N~aN;Dk zX}5tx@~`NA)hm6z^j|t{$slMScaOP>@7ux0lj6Tt>lHk?y~!?TD%;u9oy>4uJh|lJ zlH1rjpIjc3dUU~ervGt4da~5@E_=e?rzECsi@L|gz3jF>Ma9^<>l&A+g3 zGv8zD?j7Ta-n!b}V2-gh0GEc?qxOd74_TwA`)=BPPu1MOh3wbu7glP?$71jCytBW- z-jty%YX*4B^XR>I_4`xGWG?h910`7Q zaqWjM1pJ5-=BoHWa42Vsu$?bueUDS)z4Lh{stMjkQ-XJo;4^Z{I#awiUr7wU&AXzQ ztRwg?cM|`NcqaeM_drj9;(YEecD&;I18BX z&CsZCW6SxCGRh*QV;i!^^PDxj%ele@=)#B0>(FIr9G)vWu$IE6fL z6z?_24CP&9u1!3J?w+9BcNlxYn`e=cJ$<0b{%1KOfG-fA4U%r?7#i<#CNYOSvB;nc zz`KKsR&HFIg|BFW*qN)?Ck0u%#BRP=^jENDui%-*bB)B~@X^kDW}j6ZP^iL}+EU61}}&oW{;ll{G<<3~K2w!g-jny&T@&Zb@kU5M_O2Rvd2bqe?l zV-1qN%elMsUA|{fzZJY$t69BP!aoM#B2BlHvSqJ}18;>&vNW1hp#RgmQN`0I8 z?t8Sp%>3#@x(_1JNiD_KrR0z1dko>0@71)X-Bf^zUK=BJc8jOxpc?UrhaC8*;n;UHo6jyL=y=wwUh<_Dsot9A7&6j}uBq zP0MdR`ufm!rIa;jOV~X|SM^neMdhl!zx@Y&IuQw0+*WenQ))3hI z!-hXOez+Q4K=G$2I)Q?(_1S~cikJuJce({H9n3*ryxfhBt~~f7{JrSF%09pe?ubk_ z2pte!QfP>ln2}~_^DJ_R^6V(5q7vbnL(E?NyP&!v4ap1HeYu*tlV=Z)BSiLZ?f zgvZU`dS-4~6@E2-|Ki}ZcU~Nn2CZ&{7Y`QD4)OUD<*C{|m>~8z57FL1o}Aqt_F~cp z@+Ntza**xFnT5r(4?5xFOyL;wL};IdcKru!K6Gcz#wyN7#ZSX~%%{KM^G1BolsJ^e zR>FFM$D*8VM&G6x|LAoD^-afc^i)4HLkrNknxSGJBy{0AnU_3eeoFjZ=!VeH(tR@n zkv!4N?J2BFlJ8ym@xB)CF5QY2D`VeOkQ2N&cb$FM8}mZ<)vdF)-druZbGCWh z?Y@U{9{JwAw;Wcjw#onK9;@elz{pz)ytwN$c;D(T{y9Zk#CMPHw?DUMzflot+5dC9 z`HiZ;Y0hJ3A`56a@N>KKjjB+~)A|z|8MCdK^;Bq36Y#bIJK;}<(axcac@_9*10UBD z4w)?NI=rE^tRs!$tDpV(*;$R{T`UHci>L&IQL}WB=_(5<6qOy z1H`Y=FnFI+T1rlOf#^6IwrC1<@1WlISP$il>OOb?`0a)7_iC~q!H4i(Rmq9iOp1QN zVw26wK0R0`_t2EcOLkK>`{JPdXi_afww_xn@bZ1 zE-20AnKW==>4EFERG%ay-ms-Qm#}Z(=F$@bx0XhwJybe4ZChy~wv)22nN4~fVKX7q zrB*uzZiycW4av=mjaN)bIW?+T*O8O^z2)u{^#)fUAGuE_uybS_My9FcpdY2%r@hEn z$e4E*Y3MRWV=EDZtwb+$sm|DmeQ{hnLygSQc_?Y$$~RwDWrf`9L8eRAfj7TX4R=_GW=ID3M= z49#(Te5OvCuMh{-x)+7GN{?wgXmUf zMn%PIgt4se#y>MEr#ws@5*3}M4yqlc9`?#^XNvML-(b@#63=LW)5%Q9*TxHvxYy+y-g2sPt)Dp zLviJn+7ku@J0R`da---Igu|?j*U5g4t;_ebda|)#(NZ7aDRW%T~>puc#8Zi zh>wPI=pf8CskU38FF&fhYxl#n>z;5Me_VMrzA!RqtLVeiR@OlF@wr>6>*Wu-#|6y^ z-fqsjHDq#~oNw3RhbUi(3a&w})vfdi7W3Srqy<+|zvysvD>1<~WSpJoyLv3Dw-X)F zcUWf{l)cx|ztYteALli=qN=y?zReX~{qTm`Dfeusn{oiV)dQp*aK%*LUGclT2GX~Y z&b=F@@}K^pnH#>YA)u&LmADQr$)7x=Hj=C7|^@inm7_D^Ah9wF1|7GEH$^Vi0BK(oenc2*>!Q6w_bG}G9`g{S-gZeAt zPhFocB9D}{sj3rPMBl2D`Eskr^XcjhbqV@>;qJVLnJW)5XJo$o*fZo)X*=s{hqQku z|9*;n8~AcD2=1Oo2dSa2t96sf?)@?TAzlH`&Js3)YflgoU;k}s?(0vKF1SHyHE^(Y z$^p_(>bQ7C>9*IdEN$qE_lpen(yS@xD7TZfwnj+~?t2Ft1A*1ItZVA)BTE;)p8GX* zJxpEOzqYP|)A;S8uFsZDVx4ib-juNJOl18j#+K(sY{j@4aOW@v$cto(n3Nx0p1*6yZ^I3`aH7VfQN?n4`#sMR^eAtd{h>&pK!2ua6l_%|0=xO zYso;-P`X1rC`-J-)*;k5x%h~uyD;FPWm-ZVxEF_c@1osN?by<{T z_-UIB9!q;>3Exdya#-^$?BT1B{Y2U&yrU!R`%>B^duFjKH?d})Kt?ZelXqFGgl`dE zRrmtoRr}M%uj4EC|F`g!U-db^Pxwmht3KyXW&K|F1My$sDfj;Wgs1#$*&cXCbgwUMPyy_WmA z?}>)j9)oT@UV6h@S5?1&Pl;FXDbc~6anW0&s;9I6|30#Sn~)9M|JLa0Ul9K#@m~>t z>a8)=&l2BF{5f5AfG>tG`J50x6NZloks%oVCq#ZRfiRvRJ~yu=c5ft zr&518e%BTfUqpN{@do^^-B0`h;y)w4?ajf}&kzp~-$h*at*HC*5nn9g$4q>kMSK9| z@-9Aq#NW>tg7^XY!sn0p0uq_UY|b8K&ep;s4Pn0KC^oN+AoF()w4{h|9px5^?O|9B zQHTwI)GacIPUgJq+yB+E`Dgw;r0>6=ufL?PzY6#LS>n5iKS$h<;a%RphXH4ine>Fc z_zC#}_WSX-R782#QQq~G_gDN22`;=!{3!9nw?%NS2?pwLl}5PA5XKY2uooY5z`mI|@pZ5lSW92$n57N_<|3~&LC-S? zvbQP->z$jG-LIPe+Wz-7{k#6Is)i1_nmCvLXQP+CAnmhd`;0r3A96XZu?=O#7SUlt zzom~wv}=>(o&a-kLz#KGIaN7p)8ilA^qg)p^w~0#|1;!{Gda^a1Wjfy-TSj;g?uYu zT{mn#@qfX6Im(mb^Y%RZ#_TWEW76wEk1$DPPbTZJ(D>U;_}YlU-s}6S^N!xiE;BL| z1)0vQLiN)%@uYL_^sL^>XEkGy!SGMrg*x;lkfpLFTw4F$%e1K*`W>+g{%o0sUmm4V z+UYAorx#uGTK+lsc0=!M#cWF-jQ>WRb{TS0wjh5x#eZhb zOU(n6C#4;g!_jL-_E9rj*)@QM+2jGp7|KX!V#;U9W*nXS;Dtd>;Rm%O^_$ClJ-DzwO_5bbP z?tkQ63*G2b^ep2=bQbh77|Uxl~@IPC}{}k}DuTAh$^jXx+_{RXhB)|A)kp8r@SM-}Q8i%b&d2nq^ig!47 zS04Jf=BOE)KKU*_9a^BB?F8YgG;{|i#aYm|w0VDuubMNn)y71=t>@frJ@NI#r|~Tp zo-Kp@yE02{9Ld>SBJYWF@EfHj22CR;ecZ<0EEaxrL8htk(P#^Dsd#UKHNo4;Q|^L@ z!)JBvh3F~bXX|*~cUzCw<+nETJfo_O&AhkrJR*D|^r8tmGaFg(DDd+VxLpKK4Lr^< z@c44@zVsjT7mR`&Sv3hbsF&1^8Zzul@a{~%@X=o4E==q5BlmuH)#)c6@7nQpwHQU*rdJtzN@mUw|wgzvZP>B zqGU84V?TF*{hXW|9>YJo>}zBnp8~G8FIc%TmixNb^KDqU+8EDW&_H11*SLw2;G*N)#Q@!_Ho7Sy;lj$aXljkIf1{EEI0X4~Su zhhqAAS%bYJXjhWpJ3dnf@?GqZ2BX{j5IWCYSK&_vdFa)^+UjVt&lFoU@ah(uGOZlB zrPzq&tC~mVx{QTS`|5o}j_<19@;;*4-ZS4zUf6}~;OJ-FPiEs|?i6dWtOw##y%Tyd z6TV;0HT*@U4)NdRtH%!!{t7qOCx^CZDSPv>8iMX`tnygd4y{jMXMLYQzH0Jp0T+eP zl-D<4p`2`oI=%Sj{-ezQp_KXB`UHGgT89sO6n*rreoc1q2_v>i@WWRBCZn%H^U>{^ zk>2CnUe3+Ucdp!c2t0Fg*PK%wpwliZ=l*hbpHX=_&w;&2<~z;R83VUeXK+7{oYNOD zUg$UnYlT-}eK^ej6QPGeDMzP)MmZ(edU2NpVSu+paD;R540v-n2hYgB_YUX(uJFEE z%JkK19Z}$&uUx~|7|$%VBZ=pBP5jC!9h#)IsU7HoV3%a-NRVf_sUu#VM|EFmffDq1 zo~*}5mff{$ZRQs~cFg#&OINL)9p!4r67uiBk69Hsu%pe?u~_1o*0G%DI>uFC<)Cj; z&T;nlo#;mC{F_M`y@oR7K1uO|CO*%6$yx`nz>dP=rjDdF@El_MCU(G1!5h9;@?GTT zLZ|%11^4uK%E+M%IXlQBI8!;(Lx!`HzTS_Yt3&t)81GUPgEHuK#4*_@;1A@~i!#{fK4Qa*g$A@YwJyv9CSO?J<* zD*Cy<__k;Zmt#if-0XPGK9Rm!M-)0)$GFGQ;#mc~j~!Rw+@r>N=J5UqZF`NjiSE^- zwB>zh9_L<3e~VLg{Zx%}ADK9R{1HdHopZsQYK(vJdA~5ona^Qpyp&PS-b?hEE|*8_ z(uMv>e{ba}a1nS!V0|-ba;J*SxuLXI%AUJ#y&ay#z5YAgAGq*4y*+BIP3ql2J8!3* zl+oMcIAous4zZTtldhd{dW3c#9%gdBgntmfYOx){KM3o!t%malGktth?VIlxhAj9tnQWGxj+;U5eP#76Qi*6dn=Z?Qz>BsA@V$-`|}K~&3etgW3j5^xS95)Fh`^vFVg2HC`eQ_sYCpN%9*vFI&{B&Nlo@0qfB~zQqR-Wv6DU@ zNB$P6=NC+FjJ>N>ks zRc(`*ANTiJZ{NdwdheblJ2-0HxmD@7k9v0&DIGuM*{#NVp3#y*J5QK89+Y&=r2E@E zOy5SSHhgC#d;GkM&nclT@=WF_{g(cGN}r{DhkC-3_W7x2DD9Cx4Us4HL32XOm*xam zn;V;GldKEOyAAi7@Igtvx}QjsGFHY(eE%i0rmw+f#WC9)^b@d~^k2?DEbWpCWk?C4L&(qqpkeB$s(Pl}DjO{4=K}s9Pkzd+2o@XS# zjk!39{HL{?oST@R%UEMR;>=5EU=-K3_Ls??3TTKSpEbt0uhO>! zf1AoyO5q(4a%F$-Sw=eUy@i22|ChMu2 zu^g({-RsI4DRYQz>?H;9^Gt_;C``;#w ziB09+)pk!bcY~s{Ja6#cC68<#?rufj`-o$&edM9J__9!wjvyO4f_>-_?DpOVF6gr) z$z6@;Wa#jfHbXbt1=m=I^*Mgat@i0cMKatcWpIk__g5NbUC`%JGHWqcj>1~)-U}8o0C}gPR7tf+l0Rm{Pj3qw9kdE)$GG2 z8oM*kzI*LWs?GCreDt~FQfxIUz85&J(c7}sXv>nN%L2kT)R_8vtbB{mpPsNAqW$;6 zZ108c(Th#}Y;M+dnX9*G{oqaPo*?x4}ucYDy$-O#KS#%40}riF348JLOfQv^Q*H=JQ#wnM;;p<&#Z zh@ac4!7u7QZQZ0#BHcsW3BCv(WrG_NzvSoEYZE`WU0QaIPc_>jw6T&iigT>je#T2* z2jNdnFkk$IhCW&do$+LB0)%gne9$Ym;J2)4I?V{*cXu^<&G>%Qb$)Z?9eBw4*iAmp zDR+HTqxt>QwT@Fk#sBaqtz&zU)**EYO};Qf+4U@V^9lTA3J4C zflr_Wc;~@gj1+O6c67cx6`{^nLxrdE-me*qoiz^K1TD zyEmK%8#u{hQ!Q@qM9=u{XeDJ|oT+p&XH-gTRB1JIbqe$W-v%2@_}-SM7Jf#BpV2&H zqD)ghfTljqIOm$ChOXq_SJ)@!E=a827rpn|-iy@gy_>q!}HSOJ?Jc$ z*>hhC;|P4Gt4i;Q?ER6~O*@ona>{t{o^+6Xoy?h@{1rBQ?wC3y=^5t7g@kl$b?|=- zehcp-cN_{YCG+59m`7u->A2g6w4>m`73oFJY<&85w<#T6S>O?PCVOC+2VLlG`O1y= zP?q91e3=`#CH|m&S;ky5&Yle)=akbZYd{VBRz=&-?Y@;}-LGBGc@fe14{?4idso3> zaB}P*c%)|VNof1qGMDLx@Xfv=lkWHXufj{igZCo8;Ixl6iyvq41Ax&-if^l?&q-P9 zdw%n>50E{&^vPdu(&-pHwl^D{bp@F~Au@vq9oEYQrzEfJ!M)HrmG44Zo0prYy}UccGMv9O%_9txx;REM!@f z{|IAN4sSYfK6W$oucS_C+yN|nVSN7G2|tcM zi5*4Uy{oc!W*$i%*~dlj&;}kJB;RRdC8^M7ksZl8Vk3W-$OMSPhrRlP0=2O(_qBC5C?(io%Jw^5wo@YWk4_;Nfs}_G=nb){>Md3p!qsaB#V01R+Kgr(-pW#D3 z0o@9ya;HIgkGl%^UwlWY^d$qhe{CP;e{&yFF6o2No3HD``EZ+rc1in}QNIIN525|i zb|-C@_QJ~qaz^xWW^3kQPV||j-4@cEZr;OiU&FmBIr+-2>>HKm^gLN6gFct*^jVjO z3OyD+3K|{qZ8G>1WF8^r$>?r$T(&ary71GX@7Q zPWJO|{7%kf4i~>*=(~x3%pJ6^O0|2%|5XWL679K{_K1DTa5dI@g!mESd(`+~;SZG= z@IRl+oxfb5!yBkn%Qcxdmja!XGoJX)?;cy z@a<}4#`+#`Z{?euDOY`=A#+h)CO= zv@?PWa$oBlc-E}weR-L$WtQIh&X(#q1K+8h!x;zd*3Zypg5$H{L1Zl#y*W4Ss-(X? z%aMBABVr%iNxMB3?4-hDz?^BH4IDBV2Nj)0x#!6-iMtBIYlz^HGpoocdmLFShM;ed z<Tu;ETJDCR5)d;M9C@iu&7_7n+%xAJ}-gu=LM8; zta4=FQNm9Nj7OvRzAT{rbhVe~Fze)L&Sk_V4|&YlLZ?yxy*=vQLEQ_e!$#ea{(V#3 z@0nutx~KN2dp>oGT}%^WC3Q<*_j5m;z?HS_RnE`bOVobeN&M4FpR4KfIyKHag}P6J z+mW$eug|GCU=aT~9R3#RJN*^=N$Y!K|IbV}DWab$#5S;(7j&;yv`wF~etOedRU%>n9{(}Ga`YW>k3S`mQLzG>E z;I9W4p$F94^;~n2sY7&U--a)dbuk}%lM41&m6yt`*&7RwB=Sl*({OQ)vn15ruL6Fd zg0(OkekdE+gz)YPy!Ar92`)v(ubMG>iLrSUS}_dRz5*^KGB-q5Wg%mli@iz)anWPR zHN_Ffrvl%OFxKLyq4P@dS7X?;JFscrPg#ZJJwiDVI*H6aY|n1kx2G%d!T0$uV&C4` z*=yVx?AssZc?A3RYMz{Zy_&;*yLH}O8yC>V5t{gauzN@H^w2KkR^B0+&5JJg{5tex z-UH8T>sII0*4<6Ghp;AZE@^e7)sa?5S{-S)`ukGa5mjxJbXgBOITIH=oc+JqOCT@n z38&T~wc~O4g<;sM3BEr z&?scQm%uGf_Z1Lw$|Z8pcObC zqrJi-3k)~^8T(3P2ywt?XP8dypzQg;Do9@!0J|XV!}Xvy13F?;26$(a=03OL=p4$O zq+qj1-Utn^=3GGVX)k%+2Zr*#pZDR|Q4B}VLe{@@lcK|`NmX^f3GV=tbW;TPjI<`k z*}y$T_q8DO{P_-nW0FnABiTQ$3(rt2TXzgiNNOr@lykQ znt{*b&_nJKX?4WNdxHKhu#vdf0q)b`6CZRO>7KC`_*kK*!ly;%R(3@Qv0go;kqB4SXg6kM-bJ zWPLCLFEj9hSNBe4Oa*2Uc)br#p)fBM=B2{CRG5DWjCm(`)d^lDfG3^cRVR35Rt-J3 zI^ZVzyL{;M=JxIxzZLn^{N)?{vi{YJ&7Zl&680Tu8q*}bS(fO^b;*{1B{`atc z2p@ru=iu>sx@V02^vnMqzfGMY{~LG58~?8!P}6!(0e4no|5b>tdAZo#plj~nZbR-w zuP!Gv5F$1bQin<#rH)x^j5>4~#N6c@OPGr?2jY}O)ndK#Xm4}f z@AEd-9mv~K_d?#*x`TQ5>S?P*HQxf#fH$s z7>N90o@(_ruU^@@XAK!;HmUu9e7$w`wxR#Q)aU_VlGc* zE+_FV2U_PMt%PweU@V8Aa}M6w~WX}0y9zD+cOW>!xZ{|G?+>Pj735}F_%9(^d zPxmt?g&s;8c2#;>4ROKKeEg({zZ4n6xBt_azw&+`@9=z9c^}66FmQDTxOyosUfN?W zpFv(5p>-R8p~_rVnY$aHMe@F0RU0LK2KdNa&Zi9p&vwuF`)B{(n#)PMjJez%Fy`_) zp8pebc^|m72iS=&?C>m8V=J_-mG$Z+&N3g3vg_;D5p=HP?%)VM?*&iygQr4QW&M`1 zkonytxVn*h9l%ww1s~dDzcraL7M&5!nxP8?t?1x*u@!E8J5JTd^hmgj8p=4nse8sI zDFfcA#9_-}4tU;%w`%A70A5u;8^B+*+cR;lu5%{&b{1(JtKkny3ND|YJ+r%FVuhYx zKi3bRX_U-1=a`YR5B=D%=RR}I)7*chVmoKTrdz|NI|`e+Xl(0Z&=c>4zPK5iZj1l3 zA`^GeCUuA%_jz>keOd7xs+t(W4j;Xr+E>lGUTZ|xvTrCRwif++{Ouw4C?=m7nOut& zen&RE3BBpQ?6HoqU;iV1;tw*9yU~FwV!wGfrmy!DK38O&nnk*5Ybe9kryV-seewO} zM_*!%dW1M*;eE8t)WLW(K88F?bTE@h&*dHoWJ&Fv(4`P{YCg- zF4xnn;j~qV*c9(|+=+0#67Rhc`l0pC=QuCc8=bbwCpNeSZR!^k{@BHSc8JJZsZ-X& zowUKrb0|8Plg#LS(q7i?_ERQH`+d-vYUHl>G5)1I#n&ujs_W{#vNGnuVsoO`MjqE_ z?w;9D=xpE~5C7sgT^FrMQO?TUsOjjTirygS<2f%bPf1NzxtlNPe(v#HxhbL_b6Qgx zf1u)1oM$@wRypJ72i$!pjJryGMe+LCmoLl2`2gw2Lq(5ZHv3GGO(E9`jY@J|JQx+@ zE$?IYx(C+o${AeX6rWQys>M@@PrxR{;`!O$wVb1`+_XM?p8GfI+pNa6Ln9ldos%iA z_#*o3j9nElFQLChgpusCd|Sghg5@TWpN4$kgUBvrukF|LK8Jke2^|CZ<{GGso<0&e z+*UcyK;Pk)zbspGYWpHHvWdUTo()@9kp-)XBhoTrGt!zAo98s+63@6)s8PDVsC4Go zmXn4|WIgN1dJ8)97UA(sx*Y9q%yID(xfywYgL?rtBLk4T$LpBevOg9127bAMLU)U^ z@oNvRy0KvpI9PcmFb~1~vZ}joUD6Id55<I53VOsMd@lEi)=Qm|X?%lpfe0az_ zKBMcx#CS50DV(9tBe_TOIK0VOY*9sTM!`p0K0Z*IsV_QDNtU~5X5Dpmi3#7rg&BXa z-$?yIzCFYHyZC+G2Cn>rdM~JH-f`xBUcq(qgt*iJD^ijj+@aKYgR-0ZCiHWb!RBc1 z1$2A6<$f?|i`<_O!0xTT_#xt6i4gXzVzYX2(ejM}^8oKBl=(Zp+xcF=_m7cJKge~2 za}rqJ`|aQPKW%SzOA+!j&Jepz1A@ot&&|pJx9LXC1+Z}v+a~<7EtGL|h^;CE||cFK>u`{t_LY5PkzP=^K0E)G*mq}A=a%b~-Gz*g)OjC!IsXacp4n_CdtvJA#oaeD&qQZO&ha94 zsTF_zXi2hsW6q0=U*@g~9@m&s@T+Oa>Q5gCpLKyhGOzl6e%58^m@PJ?*wDAq$9Yr? zcgn{1Jkv7Dk@=nT`>&RB0UBwXn|-M){d_BfvaoMzyd%cdv4=DJ<~Bn{AU@7aN*%t* zVsu%-tX0mAhqgxP@&nVuwPp2_Bf3h)xrOBxbX--lJ2IEgU4^bB^FwHn%>ORVj^qqd z^nTD;XcSs7oOE6P89L*HkK*h_zfbzpUak(IanEv3f}Dk-j_hbpSE=3)sBOFkN?BkU!BpMEibDH-skC`Pm9;}tj+xQwv^MxIX?M@6HmlHaHSgS zM#s~(bCjiHEi_T+a&UW-J@y~7jy9>v+4op0$dj{Ux=laN$}faoz^6`BQ`{{l4Bf9B zHQokK?>WtXFMjsLf0OucCT9`C@8+oH&-3`V8gx04yzJA?en1^l)x?}8d}oTUz=Ng~ zw^dEB`4`6vOan9FU8L+YjWu!yd9zIkIsPmoK9{^}ByUz& zS4D}-@o%!|ZF}*;-DNK(ZeLU@cPnUC=HiCDSooG&^3Yqm@N|02E? zo5S_A>t5R8leWOC32x6LjeWNJprn->X{DsSOj?(u)f;IeNc(^^GqgRTbCXC~l4*cj z?#}SH8Tros1K*&enT2OKVWjOPO@$U_OPUs?*SndtOwx)aEz3w-MOqPQ6_UnXO47b^ z(rzVfjii+uY1fgqnlzuJ)f;JpNqd;IgOaw@NQ)uu1=6}Ct<6X~`B`n*hw`tq`Gk@7 z2hyIV%?Bk-i`MIXnzTQX)+K3KM%vFw`$fen{FO(z12< z8EH<^vITymJ-ao!qe6rKB<)$w-j-^KfdPD*KpD@rMN2$%5!g=9QjD|{M%pfD$^;Gm znz!SNv@^?ypN_wpM_RL_(RT08-=c-mld+8wstuam9mSVbJ4O)Wtawt!o09XlAC zDtt!lXtU||$o;)7S;l(>@*{sytd5t$uS)%&ujO(_67r6g ztwvr8e0xiq@ot``Hu_J5|2tvU`Dww)mU@f6|5?-S^rDyE=r1zp=|O1G!Ng}4;aoM| zmUv}aEcO&}vL-^OWv!Nfg}-m1tcmnvt(wu;Qf}1c*An#h`88G78JBZl|5ly;a^4)~ zso9VE>up9qSVwd?&Lb^Lr-h+nc`pzD!@8q?XPuR`7x_Lg23BqHvW|rO_t;d{N!$kTNd?kI0}8~S|$BA+TLZQ%~{5K_%5zS zS@WtIFhjBBJN#FJhijc6Ksn54{Fpd&_-K z<)#jYK5m9ylWSS!ZvQ6TPGYxT)Aau7Y4zc>tR88L!)Zl5(#peWZ| zLZ2h`HWv|Z>k+RfexgUbjkp&5MSiU}_4kMu5ijZyuP0vKBi=^5zDHb3rv4uBBI0d5 z;`Pb9Cz#FNZQzNFv+%~9>@!5BAbJv_FA{~FkBoN>`UgAG+26?=3FA2XyM^`e^gj3< z@HcR9qB2%w5uBrNH@D;q(+_Z2beDGUpXhB@!fWk-hmv#eD%EPM`%BgCh>shUb76Tu z;&h~OPM0KmbrqhTJx0oA+9^0F_bUs}D0+C(zG!$(X=7Ifc2OT}U!<@{^=;xF5_Rfs z(ZxY8aCZiJN|8A)Ha$huQHZYx$;UoCoR8;X$^S~8@F!6`i|}0`yh$|g<@oH7Q25%` zQX}7nJl`lIzn%}Cfj z6WEGhphtoG+rYgrduUpr%aJCs??+F>>UIl%3h}jgL^y=#CXAXIFu5?E7EUpx0MZ#>>#m$F?HZ;EXHL8t;|#v-~Tz za#8oMY>oMKO>0u2t2NPz568m9>Rg_=h5v`WGmnp|%J%&^RT(O&BqSybCh1BlVMv8R z5JBt~Q%MwoXp}*_Fa16;#8#jr3iJRXCJ;oRK#4<7_B9M5NuU&3ZHqQ^fGC1d+Nf<0 z_7xD6Aq=9e1c%Q1{!Udv81&ljj_-c%ALn!Ceb!lf?X}llV@i4I$cn&djzgtE|>tY94;noATv zYT5Be@41*Zqzj-;tto!!q>_=TpJVN86B<_hp(;faE-BVwb#_)T5kB-z7E$?!`JMwr{UAwQ=8l2 zyqNRi4(C;zmvuOA;=HQExjm(!c6EpIV$Pd7oL6zaufus0=XOVj?_b3CJDfB3)E0L* zXYQ#j>u}E8Q(M*HoVllVb%%52p4z4k=gd7fIla}jRUsY33j7x}4@Ksm$h;%}NXbUh z%bT?r?gWyy>-z<5cF;G)fBn$tL};|^zX6S!Xl8GGa3@yNH$8gnbv&c4uE&~^pBScUk_GB-z$Ag(1G z6C-~w)vME3yBPTQBYP|N-3QnLV&Q3;Q{^9BfG%CS=wzOeu2s)2!|qv&UQOe1xIIKq zbxjuSP-n|gBHR5)d<{ktci>}>@1Z|X7H7p^*TOR@8E<`|*@?bs4e~YJJ9S#aBun;I zjxv0EvBmH&qr^WnCT3wD6`!puOR&aUDRBpNxuN4mTbxywxqe@WX2+XJmLJI_)Pt^D z?X;ecJkySUj&!2+O`&HSZSmH#74{^{w!gkO!HQRGw1s?7Hrf-cSgHcvlWz2QTkPc? z(-~jKegwWLQ`j#ylj1$>hclmOO>FUl)fPW!YbEyR2#E|7tuG- z>$YyWuYK&}$W66nVIBf+w%}pit?^t$Uc;-&Yk01WBj!{44cp#YRoa9+|KeLul)m)V zn$i;J^R{n!19x3h7}y3J`^YI6^=|j_9`E)jpM`OW{2S!HxQOFZ3!K*g@Xq+={7*v=NFaLN|onSTPpQuvU!N zMr1=!Ttg_ns2lM`Av;FI9-0gU%x^q#O2@JYqUJo1IH8FEpz+*~!xaeJdU! z=YDV7JmQFQ(I+WS!G79%pK;Pt^Sks8O(9#U;)}*%Tbrl8V4TUv{|7~8b#@BAlxi(uf;Y$3>*D5&t*n3{tik0>mB4ALYH+6d+09gq4NF056a5dFWaYb5ba`<{WH5;`&h*l zDqp?rfqMf{KgI9qt(EvFtt?%@wua62z*StQu9gkI&9L8@=AISMMI^s`4l;iccGeu^ zeXSkl(dX|=#s{y%6JAWOL2iEy`~MMpRK5>AvgG(F_y&x}*83Xql=6>^_{S$+w`lbB z&#s)2WUL*1+-}R4jg>jN8e6^Pv$ThNpetuhZAhLqwe19Us`prv*{D}8KEDbXB!_(= zYjVMY-OlpoSUD@dLGnhk1#=AlYx16>-URM#yyHe5Apgu}`CH1DG4kGf{KFyqB6_2< zi@a)@16)nbbmyuiqvf2yF8^z_^;@ zBG#twu~t29@@;Up6}nqFE6iN@n(a6PUfGF<69;BxSMB>^Uwd8|D{;F$bVV6CCLZ51RsA7^|-Cv zd(mFiE6*@S*{xiYi@rZUlzTFK{*UHyGh&p-O*IQb`6tz$mCKFxzA~5FIMefEawGm| zH1Auj<*aYH+{f?-e~f$v-42?qdDG&TRe$&$QSo-$?>-6YucIo zHTUwq=H8C4x##$rd+qSyFXzOPTa&z0;LZUb)K*)SMLrPkX7PxL*vI$Ujm=t5Rgm+` z7q9wg_I%ln9jY_rw7&1$R)*2%!?WV{^$ zPLnqBu_xd^+P6&dPWb&I#&|s6$};i&fgc><-3n}{B_aMX`VMlv3kQqgi}Bg=LnW5S zjjsxI&(WVzd6yqzB-&OU}YU$r`;dx*W?KVp1%bvK}{7}4cD7IHIXw9r0 z^ReOW#AY}?m0UBu3-8_%UwC&O{B;8FXbw~^@{*t2`_Ogd>BATE%{{l;$ZsjUq`~95 z!PmD8m49u{juqv(2UnC%%3M|I&de#@YgP^we?M*#Q-Hjs{v)qN>jdcTj=6DhwA$$yYb z-|psL_tO5zITa5%Kdc>1{mUfzm?eA|Bt|$YNpVp}fqNCaqPKwH$)UW&g zC;F9TK9STtb3(uQnXCJ)qIQwu(4YrPZYH;e1@{QxUK}6iA8C(oR{Lr<8(1fb#{*{$ z^k2oX=x`FTb;ej|l56PyHY3mbHD=}k_XOrb^-FKoA!ec5rM{WZHPKTgbE(%6s&h6G zx&mLDznpUo{eLxdPz*g3A-5DFvuwBIlz+(g5Z#XI>Yaj4&f*L9E^X;63O(a2J8{^D zgn5CSj=@H9CN?%Dw`Jmo__O=H9yc<@B5Hcbo+o=0xgjp9VN5cH#{Pj^!%K+ypGvO9 zPg(!G58qczh+_PP^zxEBu3LRZg)L+8K=Mp6Ui!nsdXuN6!p!hxqo1Hw=%}U0AG;Wf zA)#@6|KC(7hO>119$(Z%qRbuKK#=FXXU0J^DjGz-FYRP6H9fHv&lK- zA>Ys?)JvRFQ#rbZoQ#V%EKbkAWSD1sv@xKWyaz@XW31oq-E;@fTu%;6m(larG#S)8qq}&32(S{a>~Znm}&6b-Z7JZ%7t=%ekc{y`*nO z#!|jRT%MEMaAWk1KE&SE;Cmw<7Ggq5hz;}g#)s!R+E)IzACgaQ9pC;T-)@bnyl8zf z`7@EP{p4-&jWR|hTuP2FaG)GtR<56&#;7G8XU4iWqh$LH_Axt^{M0m_TU|x2Pv(_u z=H?Z}4_|ra_>n80wWkL6yl-5xqPX)HzbPZv3UIS_vSP;Tko(M*AOiXKGFW%Tx3|;nDm{c%o$!_Q2WY%xn#z- z#wbUmXeaW2hwqKg7|#DmUiLGF>t6Br^{!ycwP53)kO8cJ zb&S1QHmQhA;%-Ei;h!D+yJ$u_mM*|48%Cn`_Gs4C$!&$;Q+-Pg&frPbVtLet@i0E} z++;x^ephp~2iuF`_PF-mUz2X-Pl6X(yoPIe;ItMTY0asBC{cURnY9Kb2TcumFdiWf z#?Sb7(cn&KEgstQTJ#oY(VN;59cf(Fg3mPII>@{f@n;I<90~arD^H5<*A9$Ao=Fbo zf`@ajNrsH%JCmLy^smx0=|67_D#q8k9%+j{A(vh7+~;<{>y&%(pv__B`&3>SwO!A* zhx2XaRKXwG8WYxjW)yn-L6sn(~gq!I}$fvZx1~i z$tU9=Hox9(v%ZUe-SpS6aUaC4l?LpG8O!9gdSgV7=#2U@o5o#m9DdB1$Q)gfHyqGY zDsy=k=5pylAb{W^YRn!&kEb>@CjW`KJ7U9d%8@UP4sTDz<&dsq%?=$uKsl|`@*Z*< zJOka`hQ0a4Wbfvu3}dkJk30*WAK{wvw0=O}9f03`43CIhe~EfzYtY|4iLAR8S@(lX z>MdpVEPdao9C`qq&~{=UsM%)8x_Yn1OtW$wF0`dK$KI3r*g&>5Q)f2ZW~k0vPuGfU zDh(pr_L$PE;Q+A{Gl{v_jvhrc@OYGQ*`2^89r8uM6T|)h`lB9GZu{cN{VV&uocUx@ zugo9xyLSKDe%mwGCS993vETcdPxk9ErRNvh4V(XfBP6@(okrk5|1fr;EfzRpAL}vY z_J)PPup+ys>t$+(Zs2%Nc7IoFDKL%g>3W}Q5tsyz=%^=gYA?MyqTw0F>FwaCoxbT! zt!}}$06yH4HrHT>)_X5uhd#jiv4Xnf;@vgO5$bEzbgYEFBK@Jhs6@BZhqfzU8_^J; zZRvM+!&jU6W`I7DEV7a@rMc}W{ekRm$;rz9AURpO6w&Qrz9Bs&WB!fKy`nRuixkZd zhBrm%(m||1He>g4XPQ4UUL76A>z-XB8YGWL#>lp?OupqDnS2j2IW_sHgW1^`85i*V z)`{d_$-6;$xye-x-PXY$^Wn4Osf8EGSzT+xwpDD6E#i3`P6v7O#^djMgt<^_`nqD1 z9I@Con@lTTsC=Hjt@A2d%OLH+(RZx-ww4_BJ;15*Y@Pllyjn7k;#~gGw#b!rc^wZg3D7u&T(SX8_CtUf_Xl#1o>>n{LxzTDlfOgG)7An(z74Kv+mh7 zEQsBs2%Hh77``O$N_jP{V%owea zf?X@pGxSfA5e_CAmr15juE!iU$pYl>3Z}9i`r$=e#!W`2)fpd&MeJ?t^{i}6kzCdX z&B}`$=-%VZROdmSX}+{b@_z zj5X;;*7Kc5!{1Tg4>uE?9`|d=zRrB*muqJIL>@_JGjc?I@#tUzIh1RF(FQM4J~4R0 z=v~0YnlI&5;9Ad`W#@=KLtX_gV!`s8fy)D2iNKWwTnB+G5xAOx>$OV@Jv>7m&qNC@ z+OptU&o}g4Jv$tkju<}v&*quTb;&cpxx9!ts}No@nVLg=AU#Jd{UsSoGJiaM)v@0u zf7Cum<4iam&iELP?Na&9HP$o+)oeb5KsH;*-ji9EIXO?%4|@Bob$`SvN_RfuME&N>d=&E%Xvq}LUPXsvd2bSN(D znP|m;1#jY;k^H5nbLJ`+bqCl3)cwo@?z)dH-*47Bif<#w1$29E?#W1wJ;rmj@)bp5 z=fE?$aqS@)jCGCf>snn|NS^?Is&-VQX2c;I)US@R)<1FBp(5`e=6P#vlpDHN!1I#d zl#^8QdHudukyS$g z-HXD-0&(6=rR4s7u*#^GjQ|-895~6vme9Hf{b~wrY#>+KUgB7s+%Nj&1EaT% zSvAAU{OcxeO}>z1eQs{Z&r8f8y04zfyfecB6UB`@d$aco?eBfQjxX{}AT%E!98AsH;sLpcBCoc*bO>QeGG{#0~U+}4x zgLu!^(ZA?h`P165rPc1UTkGSaKR-j?OUPgChxc}*>zUB?mOu4tI7Vz%7BPUL@BUXA zsRlgkb;ir6*&ohwbDU+E7JWxS+u3Y3BdVF$DvQ1gX?H8_X4CFobl{@zV(5FKLH%Vj z%Krp*+G}{`C7xNqGw-7#p9g(c{WqZRHDUT@{95#lzi6{b4E8*y>34UaZ=(Z!=bxA> zJ9N@;v*On!^g*Q7;{32qyR7=&X+QWy#k5}gSNH3WE_=ZKHT^E#|75@1%me+pXMWhP zN9KusJu^S*SN38~(gL1KRgJlKNluL6d^uLw9P_B*@%&{Zz36qaWJ@Kom z8L73Sr8h!fRD`VMp3K@28C>f|H{;OanN3llx+T__L1z)BvD&8Sklr9Q+S0St=Ej6{ zGG#HUZxURGU0OVJGPG8g8=5ap%ja>GmMkY-^JMH0b@tHx3VSEtE7&g%+P{;35cx!L zEV5fg;uI@VsU^!AQ|mg-=g3}ddPZw$we_d*%iox_X8lKPwc9>wL%uu3JfSsj7oLke zfA_tP$5bC&wYrfHmOn@QrpA!!08F^n+YqUvZrX2u+;B{EslNG2?Bm7|x24CI|HM{! zwBFJ8hbu0IZy+DkMi^Dz^mHM3*)0R_z)k{yV6yqhGQ@-TnMjWST5h0?@t3a-GHZ?U9wTv zaBj`eym``=<_9iI4|k)!-HH5#=%hR1R`34-oc;)$egaNE0jJ7YE1U{nr@-N7w2QrP z`5e9>xaD(_-2sm)ZD;T}QP;tv7yX3duZ2h9MzFlib{0;c+kD{a2v4Z5L-Bk#M=U={ z-~A1E{sN451LJ4F_!%%3b#j!R?svQ5{Fh%TS+H(jsGq>)H|#S@CusE=Hf1UJe#v{`4n8Y_^M|CULv7T2O2G>r%*L2QxYwe+bCRT!bk@tmEHt;<<-=01h(S+Waqyw)+v$M2@e=|4)2z}RCXlM zGx<2IHBuzDOtF~t#UZ;;WKEQY+*hMHhj~^0@-^^qCv&srPqop}o*#Kee9^KOG==2W z$@iu`rm<=9o3hZq4eDLFDIUGIbl~wTzosS4w5X*I0`DoXJl}j>$PZ0ALCLKB z*w*heTjukLI0~bp{V41 zS9EfJ%&5ll81%E=Jfk|6oF>Vi+HOd>HRgto$P$7EXyIaOTv<#lP@ zG93E?a`k-HP13Qxhu&Zu&vnMPcu;0k>0Z`hT{xES+dgF0Zr%y5Kce@YeXt^s@xi9@ z%nyEBJ~!)y(xF**l|P=aiz9{{cYkIkhZBy0@ z<$uX)DF06LiqikXHgxx;<+re%zFs;0i_C!;{f0ypeld4ow|;YS?@7wcotrfG9e3&D zY(sYsEpLp?yrnia?Uwr3gj;UeeN}lg=dW`98t0GX4|P3~pU;-ZR={=@TVJ+5Y`tAS zy8pS-pWgqQ($8;p-*DxE7fQd+_AA<*!*<2)E6cB>t)aAa6>W{%{hjjfb3UH);hcwJ zpRRJ1QMo~tBDEWkcYO)FjIk$QJEM<2xE45AHwX^t_G+<_bcKK1MxK>6 zzI7*iecOV8{|NaHyU4W_V|`P;$a+pP6LQ&Qku|jRUGhn+EsoJU!L!%V@?TCntw$34 zF+9JUb#x%-%=&pM>t|nw^|N^0%dBbUbXY&1y>2ESAab^OoQN#ZalJT!b&l$5bX+gy zX}!pJl3e{w){9zqNbcykHVXX*wqMqbPe)-Z0w+6#lco?(b_*x_Y%RU`*LZSPAF}s6 z8z)tvHPmk51erj(C*fo=IGI2G3{K9)hvYzwL&*@c@67-&X_j30?}iuJJ`XRzdZBf+ zaAK{=_)qaOt)oN#62c4eL7I3-gfIP_^#M-a7Oq4y`AhlFs!)uYhjnv(amX)VJUnm= zYwCLXxP*2O+k1n%c#EE_wKsjI?{%eS#bxkD{4kckjXW1xUsIPWte5V%z8)6tBlS!D zKmR{|7uw6fCSh)uj3xLejl^fH zh&jjIO>+$OL>xJ;SAP8X==z$qGc5hktQ=SUJ~I?&{!f!$zuN-+@k`JpsMa_d@H&x1ibcbrdo6CmGNG(fWzk?MB*eU>Q!0292K|UJ#Zu zW9Hu-o({C{Mh3c>{ucg(N5!}Fi*xyZ55KvD81)UgHY?wBfvuC3qqV;+(ZAbF4#jQ} zr_~pq-U3@Vk8Ak)4Jqd3PjOFn!6c5A%d-f%-A??>5&VT;T0_l>bvEL>GS1evzm!}D&K_12Km9n&iU|1!lJXaWBG zdn*E0m3sru_v_1tf2+0J@zN8ejz0uTyS=}mJihnDq)|g{NgIhvc6u&#wVJMmQA1;r zrV}$eYG^z`NnDRkyTzw_^K>uCx|axCdhW#EW4WIYx?iaK@k!NxkLBH@q-x|9M|9>b z4&FVu)zy%9|C&UlRzek-qZ$$`f5FR~7o|LWx@N^AaDTl&R;4dsh~CnXHe z;og_J4x3pGDPee0!tfkMJ|9V&hv(_u8F=)Z;5m%!Zrv}`{SZ8QPVlrN-?!6l`_`<6 zg8QE=Z3k!V;H=`Ug3{UpzbpTjtb^s7f#-LBY%Kj3;AsS&69n@KKRbBuAU+)@3PSif zQ4qq<4&br=F;4f+z@z5`&ko?R?nmo>2p&Brc-{q`cWL+UiN@wD?q6Gah1Mm&GyAP8 zN^d#vLiycUe=i>gJmdbjsq~+K=R3eNJq*t+dN0M;JUtB0^e{ZP0FTw?#k!Z2lyWR~ zu;@t737%Vk$GYEH_e1dLxt1fbgU12SINJT}TgK)|tQ|z#qUi{I_x%dGPJ*smpzEig z>s`zPyE@SI@vo)p7oh8ga^=buU5ma&*W_qDQHg)UxpcjGT1B7%x>g@;{$sE-2u@t! z-_6o(D3X0-|M;#PSo$aq2bs0SKSj0>$wlXNh3J1?nA?RXE`*i z=a$n)o59Iu-u)M7cqlZynLgS~AI*JhXz3i_nES`gr7r--z30J^^)+zl-q*pQ`(Fh| z7H~Xy791Kw{|p=r!14Hba2T7v5+Bg)*TMnKekB|ipxKVJIutlIg!@Ib`YyD(A>1z; z!u=AV)pw!Q4Z_Fq5UuJt^-F|S--TB7j`~H<^@pY-wE7olbsDs~YT>h`+ZL`WeUGgu zxUuwl>Q7a$4)+c;#;TskY1%Y9Q9p({D5kS{i5XuaKU+Jxl_>bI^d`h`R1-I=n4lDN zC?~uFjIq}+|MwvONHlidp4f-BGv~iFqz8UwxvpjCZ`WYkeF@$mzmpGvC6dE0qK`j! zE?$-7DE$;U`ZMNZ>F}hB=h?G$@!v=u4y{|If0GU6Lh^9sP-E<5mJ8_OBX*aLx_GZ|h^5=i!gnyDi;v_Q{JQ>Y3(NhM z9j#*@HigzPUujP{S9Z6D^rY&)ZqlQ6kY6IQ`--d8hZ&D4AD5-CXbRa=vvOP$86nzUlo2g>(CS0 zm`k*-bKv*BjC0v8#FwR~>!>4C?4|Um5qk#q@if&?(-`l=vy)f@$`^|@Ls}g5&}^T^ z+`xMEPAfKr_T+1RD>Byt>Ygq5TW;yC(N@j}%STvaNxlvBJSTtrk@%#`N6p3@r#0`@ z%wY?Fal!Ch*VWgAd>iCj9Lc+5V{IC*f4Gr2MUM0Eo8NrO@;g2~hNLTs=ugkpiFCA` zNnfO~C_X8>S%_z4)Qczlr_MS54|X%nIbUZt+antp{0;^s z*ds^uW}mOIj$YgH`wZJnBeqiMf@SlnF^JyxOU^Iw7gdEn~E=cT(-4$p6F-)%ZWr~lvDclihPk><;P zlYJMwXL1?agVye?I| zj$E_KMN$vlTD%LoQcPed7tQ%}6{&IT3)7W&pV#7j;rGM5uMnOmnko$QJNZ;b_+4#N za_~a-naj}|X>9PH!MfD2&v0an6o>7{;8`{v*;+c5Q|cRPOzh&?sa^72|l_b@zGVj0n6@;EoLeD+eE`V z`++K>`f2p}5q;B*_zS)+Uq#~o&e&+;@!fT{P9Tp#3_N7O+=RzuAJ+XM?2aE0OI?5; zpK47M;-lLgzuc|Vhp^4sJL?*b@nQA7!ac!A886Vy?_?ZrA#fA?EHI+|_t~TUtFW`?ILMJg&4uk@U&ChB zX!6@WgzOv#kEpK-<-3pgBcwA|j_3Z4^2{*~vrCEc=H`Rv@utHk*(M#^fcz8WC%?l8 z+w2$zs&Od)_uAX>!!5ojn1c;Mv0dszi;v=q&e+87+>XyW@yOr-Ur&qv)u-|$9ZpTI zJ=p$7&~M_W*=9i?+YIr|mC$UKX=~lWcjUJ?oI1RhUt=gI(21?0XXZHZcm3Pq0@ktQ z^@-(Q@Pn;(1FPyRdS;r{`Pd;9tD}7Sy^Fn@`T#R^=UZBziSit#hW#OG*dOd_Y^o)$ zN3{RRYSZ(n)7bPmu`QPEu*|01M3(;`ahGi$VDr$rB^JDh&Q-(y+heYoG8y0gIAXRn zwx;sUk;GhDb_3$e8;Ol;C3Z+Y6HD3JIiGJXNsl*e&g)r6|ElxS^hV+hj@)09K9hQG zITlr+{@VwHss?5`Vb~{&0wOl=4Z{4KsrHxlFHQE{!)cscX>1HyOMJhk1jhJ#M7N zv+8j~#ezX&fam!{V;0|sRz+JY;knQh zJ||~n{I0X_4n}yA{^3HfUkG=F_%{gdk3WmOTy1Jjy_|1+{A1S`$r*z=mfh$wYafo^ z0*)&=A8)_dw+=cl01kayG>Uvfo$oI7iXZvpbSygS2Kr4n*+FfNGwp`k3x8AXEusIx zfivHp-mI8>4>%f6?u|0~jrzV1sWx(e{#8t!YFY-|Ms*Ur@sh;Oe(BjaniW%4#(Af- zQ0r|AwHvqMm%NR>cvnl=p^gGz&Z{_;hEeDic2Bh4IhkjUqtR& z3ZBG27U6sJF?cDs)7Yfg&OFAB<{#F{!8mW|Uf$KlWrg6+{r!%yJ{k3^xu(8-9~-~; zfZ}$wz7}sA2tVj%rZ#7BJva3lPcLG^7v+#Y>~im>eDVT(FI?EP>tAq z>}k6?!JF-h#0c%EUoyJ3zJA7{ioD0-zN8KmwLN5~j>8A4#%D~=+qx(nKR>l!O@BAn z0h?qw&5MiUiG_gYu7l2N2gb;6EZA&IC|QDU!lF{|sq69Mmu#^QUim85`^-(qpvJh9 zILcAGO>!sTQ;c2cji+eS(pgjYx%U8PhQ~~39vQ7%ghuss*zT6C>{~+ps*3{5ubp=K zhG2V12{3O5=5}JUrM^Z#qbE#}JxG2kqLbk>$tw??18Zw2W3Jzdk@WX??W}uNehOfBB*r;?bF)%?v$HN@+&dj}mpUD0 z)Tn_O*LY^aFDh&?zIF6l8The515=ZYv43R0uGl0G20r1?QM%5{%$C`l-#u$!@MCyc zO;gX-c>Krj!M{&^dk6RYv%i?NboR%ylv~5czba1R4)}P*R%3c%4F9loS$Ylj%%78U z!fTZWhcVp`$smMv8dSID0qeczb7G z39`jHV4lRk6&dNy?{H7!QLyVDgwu}q*A?4Ze#}3I`awBZL%8mV9MDcYsgHMBxB1i8 zSB2sUzt1@T3G}Ewn!|g_VSUzfy#EWX>wW7vU;(E=r`_qCWTrdQ?di_QyQjZR+dt|6 z!$R7WO?h3F*)mht-;81oy)mdfEBCPf3_rxeLSyVr)I`vD@G*V@t3&a~0eI$}jH9QD zjnEh=q;?*063N6#7|3|a|EYQNIOC&cka0qJ^f*ra5PDI5n>%M8nRSBWEL)22FykT$ zI_=M9*rJ-V@SBs|uX<+J(T4fq+=m7b*Rl;CxhIh2UShu=xwB|#Mc|1?Dgwh;N8Zjl z@<#GaPAA{wXyVdmvW;z9QT`*g`L17=uXa6C{t(xmVS9vY&#^7w`Wmhm@&481KOas0 z^D)YQPFp|V{D++Xi1SeVmg2M&!=+fQj`3SPT-#`KAKQzx`M$oFd0YAF%-hSO4zDQf z!4~t`it=7;FJ|6V{(k24)889L``32(-d&te=iJIka5|@K$WQJ}KG`0wB76(iuq}{( zA@O0v2~kfly?zCLh4^(guVC&{y#737-E4>9AK*yw=Ma-&N8Y^}*smdX*Dzwqhogtu zM$P)$IG)UL6S+p@W2gU}&$UHdE4r?`YcBVTWKHG zhbxeeuZKVPgNMqd{vLWT?e~TE`@{S9*~diLZcu&B4fasp{g-)n1J?)Km0Z3uddtv@ zW|-xvIn$Fa%bt;xoHM<2K=zE%0mD|5C$l}oHj^!F=dmjvwb@F4YO|OA%obJph%LJG zk%do|o@9HQ?K!rYkFPBq&6dnIz}lYU_%~d8o_o)h&WyS0hS6-vYy;RX8fFGki{`Hn z%p(sJF}AXK7Q%08%(zyA`pbQ0c~INm>o;Az>3VSRcg9H;a=UX&``DfFU7S{~ zAY^pp*x-0%<&wtsv636KF3D?bACyyNR_A`-yQ%wX(~32hEYI9I{R8Cg$h!8^+~0Y` zcSCU)lIdfVOC==77aP^`3(iKyIDn6R`~0h>$HOv{K~Ih=foo~ zDMz~2_leWzBkL#n4%5%ecz-9?#-A{z>zM`2`^da$iN`|EAU}-_@XQvj?O-ptV0^VX zz5B*R=_{IUY^b%53dPXqB$AZPbSCS2y!=&hpD+_&g5Y4uxzLG*cx&TC;FcrXN?#@12byF)mB{eBB(YrKKi+jTAIKYgt)*Wk}-iH}rU*Xrq? z>$&z+nc4DZaQ9TP+47FHx3#>jeU;hrrnR@V{DFO`-o5A1)9p>;-J!ZR_2;9XVh%#) z3hp)&efs_~?kWFh;`bgq?_Pj=m+0QG$IrX>8u#*a?|EwLk;CcSc8_vDTle#-E_go? zc?_Siw8V!OUhsZj?#pL6v2Do(?_bY-$pDGl9zO5>;hyH$Y25#&_!8`Y1Sd~1FaK5h zTw6;McofgCgpbO9O!kC3pvR@qm3%ICAqQ`raz{htcpJy!+v2yc@~qxbzuke1p*pOQ z=gxa)Na&qwL?5h=dc!}IZ$NV1Zfd1AZ}6x0e%aXM+-jsmWIgJlA~z-Y`qF+7np)Qs zk~3?FDL*_1S+C4)={%z4U&y+m7FlN{&nf;w>(poQ6ALhgjpZSqx5)L0lUM^W7feA8 zQLZFQ2gpD7Hn+^a16iVX^p@F@MzH*eDWtY)M zs=acQIkUel-XDZ77#_ADRP zQFi!iukzbF$PSTOEI(y#{~2@pn!ko>u>?8abb78I$eem9TTeF4uaSK5(v@lcznpC_ zoASvk$NUv+L)ZooZ^^oXxj{8nR)BBn(=tlQT;r+JUZ~=RC-Hq{h#mIsXgilG}=?K~O{uf+A$g zBJflMO%*|FMc}Cjx+(%kMc}RoJQYEUMbz^tg4T*8_kKeEna$LRLTV_v#&T5c{ zB67xhaMn@I_@6p&e$}|_C})VyBK&{-KC@*R^$FXs;jPa#(FrCuNM2mTet2QFYbx8T zY>LS4$=_m|z6juK5?-A4I&2}kPRW+Zcp<7yqoMY+PSt}M~Sto6!ACIxUZko+m*c2r* z>i%)`PW@>=<=8zBT|%xxFZO{6afW|loN3kUdk>z{J*^_pGjrSeC^OXU3GsR{kos z@@d2^CZSiFNF2uv(ARP9y{BW=Z#v$mWAqm~-p}#VWoP0ySRXErCO7;B)@1rt46z&= zxt{~hW$#0WQGJ~CzK2+h@g_A+&}S)zXOh+@z%qzuPLL-{^5BNdHKi%TD*~xEZd>2^ zX7>$)7d%(`UA9?lkFve}7kBANwr=>KKgWK+yMxOI$7J4eMNHZ)-;PPRW%Rq3mw%V@ z?{oftIG_3Mkn&la&*l7H&L4SqQ2C>r*Kod=^8?6$2ax{`ApadePCS4Ncz{^v1H?BU zKt?=(9C;w`Dz>3)L)b23^RN}L4RR%;_fq|qiR5ZfuCLvUyUMoqu_=tF3DKt0ZN&Kt z9j3oOI>{8`tdisPJ>+%blm~?KtOTJu`9Y|Lz+U_XZ1^Q;4QnGFE4Q0?f?|uw9shDo zy7CR$h=HGwo#Q(EUDc|O%O7t#re2-tcA+1fUX{r@K{YvtMjXd^RoD@Tzs>b~ zLpc=d*3O86mP7R~bI)q~+;$7Y?YgaYsRt?lD||>CMt_%MZf*PsXeG--4E4sv={D$~ z2s^uMoNe%rebAU}8UNAtpNOqN>u%qI_OVm)vE>n0J%#Uk%+4h~^0!avu`_)g>v8eW z3iO0ifVZ_*Zf6JA0B#&-P$lyB8W*L3~^#c`j|_v+@!L zu6T9B7~;a_TC%$8#-Q|mIVIjr77W;X1w%40to$?iwD3jgZzPwP_{xcgtfZ}Zht|%> zr7iK0DrnH%O+2Nat7sN`oparKZqxJDbK*J4n{IkAa$TfZEnVB&yW%NS@aoq3O=aY8ZhO0@66Pvu1cR0(2jiGBz`T!#( zUwu#*=XPDfdu9T)K6u8xp)%clk1e&6(TR6D`7YV=V0wYgn6WF)7!~;Qv01W>zIJb7 zMgSY(O5UHx`+a#oDfz+l-(w?fM|KKqd@x=5zSlM`OHbjSp|?TD3Tn^~Ci!IdK34PK zMaOJO&aJ$!I!)Wcwgt(eZsvw#tCx>1e}C-^UC%+^Sphw2d&9d@TGxWI3_hy0Kp8rZWPX0)?_<2-cO9G4{hAbrgBjMb+HMoE_wZ0EbRDT~sNrY=oS zNX9oN<$?5mFF@}-I!#Ytj8H!}<&qbSO}lO~QUteTCgnqr9qt%)jmxQPyoG;ug5!Gk zE9w0%x!KeAY2_zPa;lC%Vfa6s{KpdD8wtLeO{bGMuaf+yJA3*(Z@@p=1|PP^tLDI% zb-*Q?qwsw=bxHbg{;S|=Y8Hk6V<7)A+3r0x#i{)7spsW?pNVch!UN?8Exo(!`Rl5} zG97*iK6G=5=++z2XX;)jj=_U}*e%)ys`V!~V9b>R^{5MmkiN+=JaF3x4|H^EK(I;u-XTp4D^sE0oB#;DI03Bb$)xJy?%iavggQ zZN@=^JMWFls7LP`vES6gQ|p*hl*fJqvWsGZ;_mvH^_=WG(v`;{lc2{P$ ztc#9Am+gVZJu5qNdprMr`F6J~o~{^+eaCyV3XdOtn|%!}HsV z&6dM!V?7@5eds&*d}SD?KK*XAr|ubY8n3pu)FW>xU;WV+%(|2K2!4j#a;VX$qu);F zC#|)cmVcP$KiaGQ6dTeP^>jJ$EY~ue;Tp(h^9{G zAA;WG7Z+p3HScD=p5KW!SBGLt!hW`X?Ih0<=EAV=OVCH( zE*oQ3%U9+oJ~E$PZfpuvh5U_<;xF?#zA~)?@s()``3G6PGQDk{gPp(;emt_n9b{a5 zhTlv!c;0LMi{0{lvT$a{UYBdZ6wHe;2IrBJT6u+(6J$#7B2NjptGEwaY?Gb!){Ske z@!ORB|4xo&=bxbcGtu%z2+C*9@(0*wZ<(d*c3aEc?1ig!^yO_F3%_5`mx?uT0#7;P znKe_&9l#sOReT4vY{)~L@8kcJtN1!{6^|!Z@nPofM0`7ZS;z?kFPy7b{!ewlDu1v# z;Jie8;LO$@I0pl##@isB1LqL!fm8Xw1*d#zdRo^^E7$e6fKxS&>S^l+uGiC+S9{vJ znYQX_>n5Gk*7vlht#RztmgsjF$B}U(&Dl~=}um*hFq z{nVj@*LAb<%9zNJZs=0)C|`EoOk-2OpBS45&oMUD;3H|}r)fGnKaFxBYfQ|;{d9i;a-*Ixh-lXOe=Sw-)nxtq5b!fQe;hKkQ_2FmX z6|Ivl53QT>sqIlhdsE}$v4e)%^5Hw_>QrtIAi_jgEg9{l1R1nBWpTf=zzO@gL8%+A9H$a^O(T z04K2C!Tv$kaL2iRoa?g1tST0K)b-+;a2vsC4e)I%3g!N~j`#eD-N4fsTrH)h#!}8B z&&QkbR*l;U;Ewg;2@7|?Q!IGC37!hS22b9v#*-KPcxMkejhA`g#gluD$AL~nzIDyt z3jKrD7Jk-WDfm?`g`NVr_y{rwBz#`+<}%aaU&-}l&_{s%Q>)FE*SMExb_<>F3!N{s zh0k+s*8NJGqxpJ!oL|00dVW6dUdMVd!1z?#QT+FPocCv4o`A1-fU&OYR&BJh&~az_ ztxsxHwdnk(^uy2MZ2qU|i(||+r|6HT!TWJD$&Y^S&Uq)JZ}^OB0dhR3rs)eDXI>c` z9bnvVq}|8kQv87`vt=d652NQ%e7M%`>#Ho^Hu7C25U-O!p3(&J-6ih7-Ur%t-XN zk+=FO@F2g$?OZ>``9iKAU|(YeS#3OHC-pAH0{yO%5gC{Bu_ygn?qw1=FQB@F_x9}>qf&oAE93BcJxeJ(VhK`=d*0o5Qc}v@Lx-b*Bk;qMzP(&cA1&hybFK)EMLFi zl~el#e>J6Fa62&rHMSTlmS=sF+42bgN8GLN6?~dLz}G#Cw#i{Oc0GL}9HD;<;V3uk zqiNwH$-lA6v~*en=*zv}Y~$)P=lgWN@67oJI)~<@1MAE4$FY;vn0BjvbAgd$;b*Ox z5?{l3J_?R@hp(~Dv2eMYxChm05q$SkuRXxCI_}HyQnQnF{3>`niofk~VnEhIrwf67 z&%CPwd*&4cR)W8k;O~fe2A9g;p_~U1T&{s>-En~DVv$u@3o-;O0#&0z5CVZ0U56z*I$x}9hJUseFrEPKgg=**- z3%?lKYkzxJ=>`>lU-q)KY$<&0%B_XFuH07m`zv>)L{&H8Lna&i zmcnIRe}L-`hObu+9ZBC-Fb5R!kF51tx4ca5Z+yAbc09bQH*>y^HjWV2G>tY^+;?wa z)v}7ft&iRtxb2@S0?YTWDBrk$W%(QXSCxOfe|33f=7;4gGf$Ln%lxQ(U*^ZSOTgU7R0>S087e43AFc zUNyXV0DCWTv1vH`Heh@P9II~7o5@kt_ULZ@+wsj*e2sGJm)&Tuej=fpe*wo4-nxKm z*AR2FhHGm$j)6XIkB{}wr2eINsc7L@XhC&{W|G(V0Ag1e+XA*VY@&&0o8SrD_a1K_ z`$Kr?qrmwa;CP#BZ;!TD{~^A!|9P(cF}|z+Pwf93-_75~{x9si(dIksFJu2!e44+} zmfrd)%w)#81Bh2J&W(po>^T1EJp@|ph4IuAX2l5w5MxPFdjb^ILT`Vm_f>v*ii zD`UxBoJu`XqkhHws{$+LpW&6y+id>5@XfvO&FA2g;+1cs8x^lSi9V3ER_h-0@|pwM z;FUizy7_;~7G&GRe_vt0vF&nu*Jj1NH%`4GxScJ=cZK3ns@s8E4J0AL&u(^HgU-8uw9p*!WmOMybiw?cf z-at`eVc>ex>8H+fU{#_S5FLxY^u9%3jnsYS{lxNlqpuJ9Tghih{(Q?=V+NjEmOkrK z>Rab-n)bz=CiOdQ)bX@a&ohd;p44=m6I1tPmDWwRmbH%!tW#ZA=}J$5&sx?GYjXQ~ zYLU5X?OlSkPU`sDQ{}h5++jxQ`d&;uM(?Q|_z>6jy1Xu)+_J;x+AkPG$9S(+oQ>i^ z>+PM};*eWw*AA(Bhni=Kqg!3oIXIcRxS4fGw_f}Wk6jWQ4w(ROBJ`P<|efqMy!?A}x;a?z19Zs^ZdZ5C z3ziwv7jW$6zpQuB$@bvch4`&xlWV1ke4w{-Y~9ppZO zjaAg`1V$9LX*P7O#ojY^tx&rmm}D=^CeMGIw|2Cf?+7O*c|;BD5D{H}9J>B^{<{EN zcs4Fcmt5>27asHLsBCm;aly6LyK%fLok?Bq9-eypciYxAbqVHCV=K-X@2{io>~34~ z^rOU}G5$wGmv8*ip4{>ReP37g-8RnvboS8KKr_BX^?wfWJqJ1(t^I~WbE@ZMH0Sw; zv(IC1GXEAa@2a1lLAQQ}Hq$KHR1U>^Si{eY^;YME>BImBJ?5a_>68`R2W_injQsaM zz+X5Pc+{5sVYMFCyXUs)q0Om`oowc-#rAl=J37?%i?-Af(P5;0{ZFqR-ctwp&Xb*{ zc}#3{k+!Wi`3Dcs)G7jW|h^_{*R-_$Mn3ViF`Gx!d*DSR&p(@-~I7J&qnagUi@TL)lHTUcrE;E5!Vd*doOyT2+ymn8jI|nZpEUiKgQYN ze>v2Oqd(TtAGK9u+TzHGRBIngjklYF9K+Yga6CG6T=h@q)d!!*T4F`jXlgN=)O8=m zoN*0v$JNXs#mpr|bzj`6deARh^`J#lU)=dyu3xxzcssJj>Z*&+nLpCo^6t6!VFx-u z2eOW8tHV#5HCMXPi*zcn? zGVdg^?vtDz$1^>Nb3SIb@?fJSy|L)7!Rl9E)BeH7?bk#(ZnT-mN?zoj0r<9fglXbn+dp-w<=tg_xVJ2sk9Ss!8OY6-8|siYNNZ=#*Hs$ zHK;!0fmi#xh{YO3EuiT~BttI;4s;>g9r(I$$#HFW{D5r&#}i%K@h5nhZ*Irmv1hlQ zt^+#eIcjTKHFOlG^%(qAIzt`z4DS`g^#y$J@6h_o_VEp`#}+lb%zLjp`n%qT=i6=l zU5#Iu)7NbHd3pu=GWKikSrcD&&+7OdB|jLFTT(V;oITn($8LB2${CWu?5sjTa$7*vQ?M2$q`=NL3PV&xBJ2IhFH6V+}cN=qeLUa0fdz^3DiFRTmh{MMB zTd_ByE!E4*o9oChph<)OmLG-Vn&4<_F3)4W0=LF+Vtj6`4PE;l@jQL1Mi0N|%zQ83 z4ab|y-WWb^Rz{M&+^@i96nJRTm{`oJ%D4KiAO|7FpeS}T6|NyS4c$h-qCg^n2q z(Tsx_jRVF&EMvgV7>HsFJi{1BWelV-20md7L~_hZE@2FiU)AQ@L!7d0u@Q&{7ot&H z2O8G-N$9Q(`jxz?XL>bN^gTeIi;m@&um&1BFr=sJLu{u9paaoV3^aTNG^`poqG64N zlgycIw52vbq;{t0J~=+uYU9B6tcFNj2K8JIrisa8rHFBSbNosJB1$RGyJWFLBrQV!%yq!+U(A5_6+A0VHzfO-PwkJQ@fdL(QwS{ zSyr2BFGRzkHuS#rE;O7Krr~|JbQ|*%XttPmA`mDI>k_py^vl(HFlNH_*d|@ zmCyw_t*eh=?>qb*)oV|3p3IdD1H4 z;e2!j`kwUt((_BNF2Amc=!}cd^Skj4D`Jzc&cv|JU+ctn{>RPxU(Ojx-;SVB z(&xjNzptrlZ?aX3FZ?0#<@84E8K2W%0p^(fMvhCk_!)h4&^{=Chk2&f)j@1*jaM1d z_or44twpaTSx@U|&3{@S&$J~uYiwOxCxBn|WgN9|cOYk~9(=ZJ0QjkAhjr`ofUyyu zgOT)^!|d!l6kA-UTDhXn{i$1q9;44&p;y83FtF@KZxrBvI)`X0U-h5#4P)mZzt(Mf zPqn|Fvt>AueXO}sP6eR=Lbc;R6?Ux~oqtv)-t zB9N2l4H(N8+~8&_Vk=|IjxON(nS4t6r&s8|ullD0z;QAEAQ@TTPUYJTwrtQ!Ko~QTL_YRt+7sw84izhhMx8 zzgUmH;4EE%y(_Yw_hAq6UL>!}VY^ZNUFf)-+~o0p+B?fhT%TiB>nz#u9PXFXJFe07 z>^Nk@@$7Z%m7IuO?jXnUv@sr;QO6n=k{@f3Z^t7Ko=QgN1nraz!D;sJtUvLe%;Vioz<&^*lsM$lgHg<+$gT0*I~W^_z921Fo2$B4$@pHF z`LzXu>T1aiR8qyiI6C>)^&U|7#fiCZDtG&jiS7LjIszwi+ls2xwoS#U!56YFt&_iP zZSl=PWao>nGF{HPs+-CC5?5be@S{4}#Dl6)y+CIi|117in|2+gWJ@c zm#uiM3j8fw@!1ltE3i>2H$z?1*dX|HPO-&1J;>Fx8>-SQ-OPrnvB9TV7pczb->vzeYyGC; zF~JqAb(CBEg{&EM?e|bOntz;<|FWekxL*HDUwP)5W1yq@bycIN{S#lWIJ;xuuM+;W zmHA$}2i5$R&z24N<|A{dzR3#q0W%XFe41arx{^Wo_i7)qlI)pTW~Wy1ZQ;QB4|o-H z`LE)l5IhJsMs^=dX9A2DC9po#`d@ewZVtstS87Z@jBXxZ%Xp6&>-+?HLpqRF)<_lb zZ_TxjQS13N@YqUizVUO>Bf;m&^Iu8djZR7Zt-Jz#c`krI(gtXB7r1yDdP`<~djfo4 zUD6j`n!-FAg~>jtKHE5hlOm2IILV>Ly>Q}XUu1OhyQxKArkqaTL_XdNsKq{jd0Dn& z;lu~L&`64KbA<26Ml=C%lK60Ymx8eX_4U4Anrc_62NpGdnC zc-{~m@eecd*uZ7S=eOX$9>K{3V2t3z$?<;`PFmox)6hdj`e_>d)EMq3*$w*8PfO{i z2kEB({qz9+bR1dfL-04Mq>q0e{U7S9#QF&x`YESFKTQhvQ#O0Ik>oF*vcbD8j{yl4?TmT>%E zg~vDP+bPHz%9pp^KB_ITIUilV7hQf~pprRyen?(O(L60#t-wre&3?Om?34U&ZJFgq z-{xW-6YicUzA?DSz$VAM(E~eDBXe3JIc2n#JH))|Lq3Q{4>6Lt@4Cb|f4S-X^@CGd zhb*0PY{;?LP9?`<6G}d$kJqC=qVHN%D|ZiTFMN30l%q|yB@^G-M$`1I+&C{iVCvZL zt=L$ZZX@5;Yo@Jt;HG8cu#-CXa_k;EZyfaGwEV`wF}BCidOpDO<ojd=zHQMU-=>byXyNDx{88^6=e>3_(RXxhjeMu4UeEnN3i&SNFU5R34cv?b zz7gQ(P;6Yu$SFsM9FC1ISqE->%(=^Wz7sIuQ)2lN{vMyyyQcOHVyokt!@9Nu+Fj1I z52sEG_A`@v@4D%Mam08yZ{S$49%P;jFdtOF`&PpH^xnbeYtkpr>KUwc7^9R|b1ME6 zCDFuo!@vEuhkrQ*9~2MgBk1!u`Y6jZPLPwaem(zKX&M*dBuxEPY_q8g(zVW3-__A~ zy`cvKn6qd{K53I@^$to`i;O@nF7ipS6_}3JdCWzPb{qPE;mB^+BEtiko5|u9UZvyo9Xn>HGGB+>SN~QzghEh6t*}!bF>LhvN2~H^=HX|Rq1WD_n7C| zhrWX>$A6Lk&!~>nd6&$#3VmENGKpj)6MRK%$Scw5Jdx!+wShcY1=!R}_^*28%{=Mp z&2+0K*&+MI`30%?SM$Djy9a#9-g2-YI72yfZ{obqkM6Z{TM9-S_Tvz&Mzs??M;UP? z`&rkmp=L;H@B2pkX0M%b8`tjFIb-K2GW9X!hS%@&ev$lSa;IeCKa$_gEl+;Cduj69 z?$VU#tyd<$y|HxEf;HqH*;qQjiVx{o-v90Xr5nf%T(n?qDKf(elfJDn<60+Ja*1qf zq3=uXJj!>c@!g`?cidC-L~^I1Ke=xy19thr7a=PY6%D`1~e-cU3o*Y#j$@|KVX zYae{_37%6t@FdoQ^L_mqG#?kh-$jd(e`?^lONh1UgFNm7FRkEZ0`IgUYaNB=jv)^n z=O4Gi``=@8las*m-Fg)t?}+>+xyMZKXCZG+4D*1jUFZc$ks}9&@_{)yt}P}nwJw)o;;T~pWKZ&)X6z*e)YbErOSPG+>2gg!a$?t zX8LSC|6I)YxE0#}K`L^zY-Y)q5J!Ohq+-Iaqi(g`pj`gHL*LwnYzSXWlWwb<-G+~l z4I8%&yL$q5ZX3QsHb1wcs0v$h9fC`!0K$zc=4Fgsx-F)E_oP+l^7y zdarbE-vi*EHD$GQOOyXEckdn_Rh1?BpHo#ys_NuXl>~$;B&qN)l>ib&AvSg@0d0~% zAPH*g%t#=pl@t%7t)0jtAqkjJK`C_XZt>R;5KV%y!Pf57jCTmo(qI$~_Vl#Q+yQ(M z2nbB84Yrv3U8hnQFe)>5?&tn~zdz3Byw=%g?X~w_d+qhwdm0?up!4QrbV)PEj(p8G z>D6i_LEoEG#-ty)Lu`1=!*kET`+fvI;tMPL?jA*MweuefGWGSUJ)eAJ{-2QBB!hoF zMP8vQ>=_wGdsj6&oIQu;evz`_&Myx1mvbI^%2@cEvN9;s4Q+poe$Z#-d&X3S)$T8| zTKwV{lyY7E7XmM^b;yH>(9ss**^oe855TM3D@xw!W&JGWea4tR_S3sxTJ8Pw)NSU? z1=~CkOENCp{Y0eq?9_eaZQ94PeV)iAc4LD78pGkK$GAV{iCS{z!{?TKjBmv6KiszD zwGqdbguh+w{q@ubb0qIw6n+-S4fMfH=wBpeg&gpSLX+@+E$9ve7mfOF^ZH)Bp8wwK zd+^nL#DOFjHUE8k=7scmGq1Tw?`_`nSKVr)U-Bc(q#sJ3@}J?%_!pX^^E@Oz+Opq$ zFMV2Mr+XNmk;I9GaD9GB1i7WzXF`{01n#iG+FSBT-(0a<-Qx4Tx`sn<-#5mNyv4`= z=ugO?y(;r|8S{J=e0d#wNXFJG^yrOzx24?sst13^9LCH7U+Sx@oBS8Y4)_SHz%>Im zf57`yl-d4|)7)F9-Puu%UTPKn=Q;TKVP&}QS*@~l+ul1mp2vp6W^eGu$TqvIG3iI* zCm5&NyZWfdR`fD%eBsJiqxrDeVGHivBebC3ho0GW9}nd9xxM6Qyq{R?8gMyoAa@nC zhadUX&rP#M@B0CK@F@JiMEl?4J3IBcKe!4WrLBKQ8=Jg4r>^1tdG4jnKQ2Ez^)>Q= zZTmE(U~JjhslOvXSUuOz(r@bjZPb#5zMWHvQ46?iA^p}_92lN?tAsw zDWgYzR9^OK{fv~6Yxs5>y5wzK*JHD;hldJW6La)mkV%j=^*uUeo*0bQdC2H*A!nsl zlM7Uh>*~d(lLeheu}&Qa{rqa2Uwp4l8*KjjjW$2}|D_^hy-z&T`F<~|HxRSVB@v>D~xt*idvh?THQV>-qSt? z-Q+dddtS(3+!oP}4}SRkk|#ghafy$UY2>F%T-Ge$YhO_C3v@Bgk_@5ToAjS|${3rH z{}eiO>1%#)m%g7(-*kPflqEk7Hod2xF^T=-cUW-Y&LF!Y^wbW%IbztspOXs{u zwRIh*e~8^q{HGrm8zHfq_iLd%F-Pf_XK4om`C&{$@t65G7dlrLI#<_{Z5#&j6Pw6S zEHRNs^?5d~H(BV-m_XL*l6j+6XlxGAmocsDFOa(`dXOar&*QAMiB+}tp-b}Zd=!7g z;XbSQL|%pNmsqM(QP}%cbDB9$xlv?b8IKycH@r61A5Bg))fS4KlsU*tjE@DorNmNP ztHxvPbqppZC=|`fn*b z!^?ds_obCC{l0;`JdH;WSHf%Z&G_P2T(3E@hA0)|SsP`&7Lt{`pAOUU7!Mwwfb)ck ztFPZhT@MgD%4|{dny~NPF-4u;j9gX4g+Wy4-Q$om5N!kX}C_;Ql~TE zHIX{?Q76kwkLz_3`^2}^=~^{bs~-NiFQ0auQ8~T?9v%3Eel<^x@vUP0ie35tcXgFM zHCSC`U9prHxE?h&U*12C-E%Noqu3O_&(YQ`UPW-F&%G#$a))TaT`pcqniM1jQEeZXQ89yuUbxLpqbxM7|K0Z}3Yf1CbL%|C^k_zZn##9}W)tP*HZ77r&U2A~j%s*W+$v zttIhn?AxrFBRqETiNZ&jGrXWs?UuIp(k5km zld_eHQPeLT-Ifpg)*>}Q_iv7cHxMUDtVV(!(=uKq#}?1daBsu^^b_74K;7Lrb^e})sU;~j zH(&983I_j=lzCbEocG>4c)diADYD`^?7sz^+vxv!^ndXiZbYBu=HAV{#Egj?sp0dT zPHxP64l}Y%GqR)nulhImF;bTK%(4IQPJo{#!&erdXS{Ln|H?Om)w6G!5&wZG^haj& zNEUdY6<(;p=cBO+8UvrA0}@@3@cYa4K<5(FKu?_#I5$ddy#s&TqujsG{SnruAE1K} z{_)hx>?h3s`qPe0#D4bDPY$f~Y)E5n?ut|jqyNU&(SS^XUbq_>s&F3lTSWc#6Dy4! zr0Nu9wNyRaflL>89r*2cmUnnXh5?>$r2p&i;FZ{*oSQ6uF{i*mY_IaIl%apmbFry( z@$V+eIcZeRH^H+iDfeCO3Ep3Smr)7$X^&p!roU3gU-}*|l3XK~mm_vqbWug=9CoF? z=tc08|I4%ck$cEJK#ushwrbUYoyOL7Vwf`5^RK;?r?J6^&ZHe0*v5@Wh+D2DpwF-$ z#V784WM#?aE-=sDxuD~t6}E(J%Wck&u?z0wd>Z}5$2>@^zey>4{>h1KZ) zn?#0ZOqL@H^r_@v=iKtwzR4$z(fM*elN^U4L!D%s_Y{YYYA!*GuQmkKXB4DKhuN#LaZ^8OU} z*8qDat|tC0-%9RSmD~y`iV~k~TBVH=oEL>~o(|3*K|je+BRD^Q=RF;N3(j|g^S@Uc zojD^+&RUJL=akln zb24;ROaaXf&I&jyVn>#-0?zM)^VU1(cl?g_evP)?w%qPK7^65Jo5DGJwMLtCyTBJ( zUP9v+86S)hopz!()%ySY4LlhWLSN|{f~UmNlbh2XhKsqa;jUOUF28++t@y1K5eacI zZ=tuhY2Eb6)S<`(F$am;wV^LZ-ZC_>cL*{Qc@)epO-oX*LN@!E!~34QlJRKIQWJe` z@yc9yd;FW{xPt1ri`|Ye{QfDQy?@K~_EdKxdRdfDztU=~gDHSQK$^Vw` zXN*_uV&87eQW9i+m8xt;4{XU7zOkKtBz`Bo_)teft69j7F9Q1pIsD_G+d=fDP1%oW z>>rST+)vI3HQ|K}vvVdqbKC{9vx(>EPVMH1CQa6`N6}rKLKbaB?{B5Nbjm76-i)R! zA7$oc`_W&;B}l!nF(;(D&CV9=1efx+P)vY#*~2<-%V$oMHSY=9)b}@KI-e50Mj03R zT9`ix59#@zeL9a5{%MAXgufMjv;EF*em@hwctqlz;4{MGq>TOl+IQohct%Ww-J+~7 zN{!j?@WS(iX8Fhk$Bl_;>EKX}TqHWQG`_F-S8&cqW1s1?`2`c#EG)=a zb1!+iOVF8@6zq5nKbHDq1*II@I9wd<=rBZ9lXj>^e{uxe^5MmckS`ZKl2&;F8BcUw z^QrTx$?TKEz0A$R$Cn_ZE@m#sBL;LlhsHd7(l{=yNi}M*=2-vZ*lum! zr5)Y$L-NLJXNuP!2OTUu7 zya?Va`o%nC?@woELytYWkEql`>Lan%CbQLFpql+QaGwAkZ>i?4NPJYHxG$!D)dscq z)1OJM8rhrO(EAzJNjy8nc@uH3606xquKZ89Kg_+vza{~9Mt`5s`;q?M(EFkOKB4zf z!w{>))BgUmC}KO~tm`mz zYWLJ{UNXPFd5QG1BdfF8Z7E9OL9S18WTYtF6&Lzmku}0@^vh4fhfK6b-(RQqo{8Gz zsKIwU8k%J&(f%<81s!3iopw?09(=emcy|kXay_Sf{qC?5(QD>i7&c2a`RedDuK!Z> z@uBZcXZv0m&3CH@e78$6_09l?FwB|LQIn_h-^_Xj!VaJ@^l>Ft!y`)cCkKBPUaF_^5^<2$em8@1d|!iQj!LDA!y z3-srq*xgw?hu7=vS`DnU|0aX2_Xy`|)@Yw_mh#VV4&xPdB5E?Ri`MXc{qd;D8MJly z-p>7LRk?Wocu&;igR1S~eJuCL!y7a;wrjBxn}6*@rF#xXAVcY%3EeU{jxdKMM;@N~ zA>*T-b~;-2;nZZ>`bgQcQ)?m)PgTqH`vRr>S+N5YDx#lee9Qx9^`pMIH`3NJCK&&A z@=kV-BQC9p@@Fwt#11I)=(Xk;{~5;h*;Vs8CPv!w&#X$)bxDl1z(L0HE;VH5+eQD` zLfLcR4X0`2BrAKcF&B5Auil`1QN1BfRk}WaPtI37i@|Y1Nqy3n8Ni5LAPJgxqRX4e z7_=KaL8W$H2eLxGy*5c=eY?e$H4eD{*^lqcLGYY?1$fpR#xL^<@H`5hu6{g|2f=gB z72uhQoRS3}>SC_W^>_+ppS50O;hD%{*y=CN*Rzq!2A{7D&PDLdnaeE~=j$9(ldKK& zc|!aMEnaU&9_5AS>zR}_*nI7F8=MySyy$T@2~O~KbIqorp6Xo>9IxI~bi8`=18bM7 z#nEQ?!8nh5{J;6*ADh0q=yc!X@n?|xYmirzxkHPkO-8S@CDbpEagO<+$Y(Lmde3T& z@u`VySC5{y9=O$tmj4`h?OPt}+y+kDIKSq(MSD)swC(sr{0{il%dN%8p7w40caviF zeYA5myw&0}?OE-ZK3b{lRFwQAo|}L}uC~_$_uXN1RnaC!9;r~4i) zqQ3EGe-MA&`?B8g_EcW4c!EEn&JR-G2UkWqR}YPJZu2~${rV>(i(mdpY{F{vMGxIL zGX6K5w|Q>Yph<$%>o+T{&PPXDoyR;+X&;$ZYxkgYyas>s&!Nj7Dd!k;Ikr5~`TLwl zwU3kt?a`H*^EVvFDB~Dq9HWdUS4KNu;dnCV@3luGAJy&|p|~fRJ;A>RpI0d3NpM=j z`MI1m+V7Pp?LLzdyq6q#&^_UBvL|C-=XyuA!S1`YbB$w-Hx=D8vGveP{FesKjp4qk zUDj6@(VjDxM@#=J7J0D=U#&%Bl*+;SWHV#myrP;u*;AQIpG96QW=_H0yj7#|mpa0;``|%V_Lk6}|J!Q)xs`n- z^!La~_`@bz$zLV!*HV@|&qgn0NyN8b|IX|?0-Ss!F!a^AR?3mtU|1)BngQ>_$Vc5?8=T`bAGH2m_?yD)Ab&FnylR}Hp zhNJ8KnkB;Q*ZgUmBU<7un3vSk}I z))oqWC(+2#tB|D)&op1WHp(^jj#a#GQfrH%ng1pBd|`ca!7UumaXiX#hNGJ!r+zcC zH1>RsdX9Y@$2hKAv$-IFqcnAX?6lPR1+|>FaQ=|OIse0~e^c^$C{_3RmJT+>{T z!hwu*wpo1cnAgOv7HzWnn|5Xe+^V&!9G`-<^#450^le@DBsw5P^;~GM5XbFJ{Zi=i zoiT$(L-(i1xm%3G@NrPlC4EzmWRA`aTIS9{CvWj>hKIF{%?-|@O}0bdTqU*s%&U37aE>W~b58=>#!a`%@lx7&g(cg+c+x4xm} z?m3Jp<%ZwBlpbh-M$)H!jIAWs*FF+@Yzs1V+m_J*|6d<1Dxu!(5E3jDDe=HN8(?Ut65pv-36bo@x1wF;#ik zP0iF@vStlhoVasBQm9P~&0v@LoL2Lt^; zU|UBv2HWtJ@$5{OG7H6CVL)z>cq4`NU<>apD-xWouaj$lxm04KkA&a#|GSHSw-(F^ zzRo}Mr_~nCWIadw(79$0W8CQ+5O#p3wSK_g!l(vIU!8$_i|uPf6|sp;ZH8rIk392BY-Do~fTW50uktrruW@e&&&B9vh==a@#Ar^NL9X4u#gFiAV#V&f#uE(7amD1n*t&N}$Frx) z-J6ZKbIHnKf3vr^!-brg9bt2dJnHiN zJ^WWAUP#J}#jh`}P3m}kc7sNL3s~sKGkj$oW_yA*!{_d3{G$4uHsg=aWtSbVT(B}i z*X_DYwOST^z$JNR$?xmhvEGqg=C1rRIxC6E_zHc}m&6Nvir-kD65Cq>ACBs;Pb%=l^< z+ZYtTSe-u&5)a&oj!fS586&XM#G>blL*HdX&tpfo6_1@J0eid&d%OW(aO^RKlZ@l07xdrtx`Myc5_0seh0HorNX&w@)b*OEuW z#eK?|74M8L-_r3uu~2pFWBdp7c26!(-1y{Iv)_?e#V5bYe&;8M0;708scKXQ>(H}X z$;&kcAMG*N117OHopk5R9Z#+_UGfcil{E4s<&UXy>E9e755~vn+{bVnMt3j@x%zXy z{R4h%e=)Nz|LYySpG9qQNUotwVux-r4kMOrcyAAWZ<)E1FW!5(znxg9&%Y{pXQ)Ma z@y7QZD3qIWL73mCa>NQLsZuk%MkxD@cayY#*fHnR;@<$9z(A(ggkM( zh`*G4OSkc_YITU7XDJciRf)^gb1bP>^%|M~k10c~zmHHRKW|91J}PJQD1Z2LEJQ;l7=Q;;nT8_uCWZJXIaX+0ptl($Mui99t-22O) zFCVtiXuR*2AB-GUkn?Qv>^u73{kZ>~fp_oo?sw>eSC4oWIiX_dLXO({thg=pS+mi3 z6lC}7>6H5BC7qF*rV`)VeGIxb%f4HrzA0gxJcq97dFno??7og0?!33-kE{c4yz@65 zf26JcNc&0*@E>X4mko&;d86_tm0i>EJnbX4oL#i@NARm?`rJq4%h;xv@;@TKOSOVb zLi2j1$?<(8suT)Ax=qCHE@l6F(!)nDz4Ubc?%M^ykdQ zB43%wOLKauC-_M|eh}CSPmEIa7_naZF@CUtlcSWtDUSP*6U25>$a#VxHvfnkt1%w) zH#5)5xOwbdx307O1Ri@DyP(Jo^TGRJ=FA@WzW7`Wfe++QL~nlq9fi92fgZ-C;L?ll zimWF@7K&CHI9`3=P3DDJ_{n_2zu)@HrlN`F8eFMr4%va(T~*S7zf*<8cVsc&XLJS} zTBqM3G)O|Pry_G?Nj!P7GB;zTshIc=d&Ww&IE$Q98P~0I)MVPV`N$nSb7rhGBq-6{ zjV{U-Q{CEJ5xep$*X%HUs5dYdV z2#?wHEj;G;-{3JZI*++y0FSxjzlq0u_`l6#Y&wsb3y-<2pU2$(9Xw|4xA7SAd+R)A zc8JGx{yRBu;W2aJF%l;v;|m?}B|PTa#_d7I>}kf*84aBUF`u^E*WY!nojAMRbi?e0#L>W?&t}65=gC@<`LP!}uP?&t7y6jdLxlf# z3Yqs4_}&Tp%Vr~QpIKo_=%-JD_&V&^xt^FYi|?)7>m5s3SD(JwnJ^pv8(v?gQy+=9*7hCFE3jONIfMNgyexJAufMG%$^rUQx{X>)TPOslR3kWW@mFw;kHp}@{ZPhS;a*|7s5i_7XTdca z{#?zx@Fwzy$a~Hwf^R1LOME>gM_wQGO2+wOEcOP`erepW94o@FIciFQEzoCl7=s{V>7X1+# z-UtmRL+f+UZ6JM<~ z@e{tVteEvi5$ldZ)*o|Nhs?&_UVy)B#6^31-!!%R+&mQ+1F-lBFEimoMsCV1C37A& z_U)`SWH0Sckx3g&Mvb*Hz8;<@%qv!0jC;lBqw6+o)iaV6`%q{zd4v-96YU^AT@PaC z{0r+{WWuu^;%2ri^J6iI*Q+j@&WcF;BHwAi5GGDEbD>6!_ zv&x$0{U1m>CX${$ln1hB%N4@CbcJwxt`P3f6~euLg>e6Ig>VK><`vN;@(SUsR|pq- zg>dm#2siW!;T%^8H}VSMQaqV0y?x)?ujax_E-ahQSeV9`$YI>zUp_75U;e#g#raavm70H(?V+G%k?;R_KyF2u;#8^MtKRyio24vZQ8-eVZq(USwb8j9Qa zR(N1^_#EJCub_Njbog4}_gn!yFgpAm;0^Px0RMUY_$Pt?6~F@%!XJ2S^xsP#U_$r< zzvl|zfeGOce3+MgC;er<5c-o}E3%*WeHT11I(#JX>^b(m_yeQETY<;#|9jzq(cxo( zkG}$VV03tV)q93s0X#4|{7~Q>R{#%;4(|YdWC*_N82jjbTYm;dhbJCn(szv29_B0M zTw%~M)mEHKu2Ks!wsl2Kk;JH2KPn7rrwW7EF@4G1`HwUqTSlLi`)Hrc$r2NmyVLJ5 z>(AJuiv6l&F0*`A7&P-O@}a(ORoOo@7Uf27dBD8Fz0q=^`W^Fyd!JCS3yFQrimq~= zYO2Vm?4+xeptZX&h)?GYX;X=pVJ{FXWy$|f(HAUNdxDL;vn1CPS%xdJ$IW>+aL2)0 zzBQkx9*pa?91^qPQ5zldkF|U&aC-gl^V8omXUlsjLu3N6ODQqR1%a3UxbZ>NufZ=1 zUJxT?^vk6EcueBH$ijaGE|u%lxk@l~61s9?PSUUu=MnGjj(HtFQ%ip8q!8Q}_x&Th z@|$wR=eq3hwLg05v+S#J=Bl7&VSF$ZTf6x~doa1v^JU}BVw-e->Bc5*`P3eCV;8o3 zc~vl30spz$1>@WHplQd@pyh9if@S2wD=RMw9xyADT5hT>szN6#ISP*AZz?kMVPwIf z%2U{YYOiyDm5SdqcJx%%XF^Z6YyY5j z^kigF!9(oUsvMob{?jenivajqx3-Z?MKU5N=-}5C97I}FWf>qkl+nule<9nnGb(q4|=~U3?5D)kKuqigz=O-1i5PC)A*~c z_d!c3CysiA>l%J8aAg9=cs_icQjw?n9pQIjUB6%TKP|K=zbQWG%dwo7K35hAJ?Se} z4!wU!Ul~YmYkctaA0{P~$HoWK+GzuF1C_sT555i_8aY+vzg~4Mx!){KFMaDUYZ>XA zf`dvQhUVBP$ZH0CSpl@T$#TA>f4sDRjDK7Vu>|l=omPyUT!CZk=(sU{$6`1~f?`ZnlZFT;una(Rp+7gKMVBcT&a)a>T!mPg6PLQ0Oar%7*dQ z@wp7|Q%CydN?dIi=D7UtGMG0HlZOx(_^@8T16PU@?RPm&Yx!2<6Rh%X0BxjwOZsUO zx(?M#Gu0INs8=ub>ca2JN4>-+KrvpWExM_Q`GxsvXOp8mhqjN`LEA5;%<9yU0A2li~F?$wv%Oq|O)cawoV zX2fQW&I=#Kist_Mr%|rNznK42tMi-r{L_rQv1O&%If{3}Z^W*%1(-J;sorqF;MwrH zAv%AZRq0kfH7-5+d*ij}<>JIoe`#L2|AWG!3#I1Gv89#sV@v-~Qc(Ky`30pNNAVSE zjxAltv1m)Iyk9ysI(Ek`>HfG#rD~}%c4Qo}1U~j7Wlz$xyU`77Qit|>m>=BeIK_9W zoU)sqtf!r${r+3i{R%mSPokqkPgnFw^~#q{S69E3O>Dl4+`O*T683w&e`HdMC&RX< z2^}Z;%$L?V?nmE2dF&G>F`{w)Ec9RE)BcyertUuIBRYZ+)LmUM!npuCh`)xhp9bfk zf%oG;@N3!0a#40dp3sJ`81781u6}|tzTt}@&%XwD(1&^F_ z<1duR`Ih(#ZsJ>;@aJ)1m#bEtdX8e&dx2cqxaO|1I*UJSRfwC^V77&qs#7ft6|uy>oaVVdkg>rJr)8y>kj-ol(Hyja?Q2JIcD zXSgipr>DJR!D&IndC{|Wg3~5slcSu&^S88J_*&L$^3PQR-h10j=k+-!kAI467inQ% z5zZ;2Gpp~m1xw;A%wwwumn>_fnokFVEu3X6(v8=MDI$T!;TD*Ujj4Qd{yIyWM`_fo8Qc(>z)YrcN~$w+^dEPC>7~f;h(!YA}yyB0Iae zwAN8~+Kxe)H>mM4|-QIs>I|Jzi~V&juITmzl$v&8?0Sj#3=(_~-pU8>pF%X}?m zOFLL>D*Za-FP&>LXju`ePv!u5|6Tb0D{^s`$#6xmZwoB^=t|0cP2}w>g#8C#XMnS` z)0KWB_9Dii?x+5pGG?8ryM;N>K)z_OKc!WlS?GGrfc-RBq?w;Y&x!07L9 zCI<-b{+91I3H&p?nQed8%jrM{)8%{G>`?1dy_pgN+xGN!wlfH=H_O;p$X#`!QgR8k zxA7fzneF(e`tVO(gn#Nd{8QUAG-oV0EcGtwICD#UvE7hZsBEq&I&w?=^>NGBTaye* z#kG4LC*IgXA5tn#Z+rZ%+3df#1o$`USB$T~i;hO-n%Lg$VwVygivL|rRLJ+Pb*tK) zN_}eZJq`N}r!Um?ABTeA(~^=KY#r5~BOLm$NANidGFDruzW?<(3o=#PsQznYskW_3 zH~V6rGiNL8YZNNG$HDanp)wMb9pri65if11QdUc;(wzwWD@JmU*D2jsaV>f9I!0Br zHuU=n8psh_8>i|xzjELGt>S;2Ngg+s$?Rtzi$Kdz>Sr|fhRUK$y_`Ac!vAXfJ7sP& zdn}o&v)^eLYW7QRd+`@E&_6aC4eW8oT+6yn5&Z-E^f{4P$iZ3RyJO>BUVG_n!tA*`1)LLI`9`y5P$I{{WuE0X!L zcZgoL33)P0jq$baZgRNE%bb*{WO!LeiXFQq%F}MZHvyS?_9*-tra!Z_AR@*PyX{%q zwK>mhE0~@*akkk04T%}EJ@_{mfH6I}r68GakmF}Z0yVD6?9cLrOKkz7L}Qm zsx6VZ!P-Zrbo@zGUXgu|{;}?=j;-YMlri-zzSpupKrV4@3Czo4pO*4m$a1xhRCfIQ ztG<_$*!N@=_pR^~_7v?9Sx)k;U0POSu=QeD7QL*NNc3m+ApsdD;+r2HYtp~N|1PsC zg-72OW#A^79TF#$eel7n3C2$inSiFFETcW1=q-t(RZYHE56Jz zm&8imTjMiZ3Q{K^1Ef4S}lv`N)^@iipZe00|->h=Qv z?cd*7Yg4V-srOD)#v+G|=Xf)Fo%ZH?w87oLfW8)sSzq zDE0%dPxO~7omD=)VxhCtNIm8{(O|dkV4ks)8++n__Zfx+;_D;zIO?6u zJucp7DDr(MrrxFSUWx4e0H5Diwvwxa_s#lyRo|C-8}E1VUgGUvVUBu*_s{F)N9pn0 z&r^OM?_%7_B?xtVCGv=e(Xc?TMUEKfH2-+d|GuhkKM~$AI6)^EsV|rDGzM$lnuM}+II_0UC3JgPe_tYyojAyQEwkvY?RD6vKl=|Nm zD5h0Y6`m=Qr%eZvChC>v4z-|vFJF5zZo)5F z=zEs;M~I1OpH|#)&B_>O1~TK%mQ{2}e&8>G{R?G^4)i4bdB?7M+<#da=Uis=1k2&& z%i!h9$Z1qxVs_Sh)@ba>$eslwo&Q9f=}KXsi^n#t_Q?kOuS=!>CQSw?`fXJZPuSjjA`EPI!9Wi zyYieKvy*`CM)FS^@SU@_Wf>xRlV9kYTfx7)GEWg>W2Db+Bv0ysA9#Wp*IDre<)6?^ z_MEAhZgx(Cex=LJ`tz;OOJbR1kKJc!19|@t`M)!A>NR=SviCOqo2|fvzbWPULiwid zwvKwrk#8PM4}Bx=TK0ziQ##&r&AIYoRtec}IMZ6cJl+9V>HEFxI znSVx=pP7o@yP(u#T(WR(NG4lN%ws(~YBfAYWU__Gd3DHS_aJX=?S~yzzJqcl-~0h*bRP$iG>~UMz~y zx0d*ZO~c4n&AG>DN-HBK#v0Ojowcr7`*hybN_YN+?04{S3@kdne8XcGroZzhbNide zm;HL;^wIv<2bAvFJJ>S>o55N7+XwWo58-?9jL9|Us^7WB`*G#5nTf^3>gR7GKbXY$ zle-{c7cpeph$q+u4%>FrIU>AcEAjOYU?Y&Sz|GQILw?9HCX;`2&Acyl-7$1i$la2S z{axk`nJbiGw>vI~uq*a=hbFy8lq4bpLaw(*3)7PxQTOJkjepUgCHX8RVZihFVKv ze+|sb!2XoyzuU_J?1H-cVvV&A#42?^ ziOsHiD7Lol;n-2N_r&f~)b4GH8aPIo$Nt*)ip0HmI7&FAP7zWkcvQ6--Rt>`y$&NI zyZ(&q@ds#poA=YoZ9@~Be?D@!@<~JWOC-RpT+RJH@=_2d(|wpYmaXVko}nK%(7umB z2RTbyr?GCA+$!_X+n16*D3&!Lu_MHA#rnr{{g$fwPqVI_NKPNtVtTHY7_KF^h~#r2 zN0C+Jtdm@`&!e8}N6L${DwB~R^}H-EAVbVNyMnyfX8$Sp%;wh)$27m@iIFyycAUlD zKwG#M`EJ%Q_Fmg9Q=64=H)>!-LFa61TI2eEN{jNkY%{KoaMnB6(m z{+w;Lz6ZlII|>fDI;R$MZ+~WIfyf9MPyV{#9sJ6F!u5kZpZMfU1#_N!xuB5ehmIcB zVFj*&`}=u!Xt(|>j%Tyi^DH3Gn!kqIDdo-YoVtVO4?H(w_Jhxjh`WEyjwOX_b}qS& zF@N3A8)j#4wsW2snKiqRBjeuZ3Nn^FUtr6dA3KpadfETsAiVxG^jGm!z<%1>iH_B+ zYF$3)Zzb=JkGd|Q4TPU#7b}w3&CYDk#W8VlJTNw7O#EtmXXPBmL^ttv+5Ka}D0aBm zIOnxf$q6@{7(DW*Nj%ZP71~8v{;I~hoSJ$73lM*|D>^UGlyCHpee{5l$^V|@0QrO7?=8r=A z{!X#5pPNw$>@qq#B=5=*bibn`lpAUn6_`DHCfKGzJ^22ETb#uI^`c zl=VdzW*RUbVxJS7YtcW|J>8pGkImo+-ybC&SDrVQ8oLGl{eHNw?}zHS6fcGO+9t8- zE?cmHG8@p*Z$fu3I-3S;6OAv0@(*}eceO4UUfj6A7EGS5#MRtx*7d5%=vW(v))v(e zli%X6l@{fW4`Jn%K1A3z#+m!4zMkSYSL6oq zNt~pjA9N`p-|DdMC^jCu8TrQhRC*@u9$)r!dgd--+IF+P8w|cAB|X#IAB!K&cp69h z3WqQ65GOfnD4(D`%rr3U}bqze3@odK_>tD-*3_nCf~X0;-0wS zwh5P4Qa*W#mv%TlGQFGli-5#=^unvX3vM}Yv9QM{eJpPUxlh%as_Zf5jRSEh$>Bc& zM@+5gTJ!N2!`~*}IzmZ^wG)fNnjJlDMc%fxjyaU^x@yz+F{wTuniDnT`^nJ7$NY{B zF|h8VWgE8BkMh(QJ!XbImIAQ`crEmw!Z4E$hEO!ea54cW8kR#V)y_i?P} z*vYYPL~`sg4%^7&*bI(+&$wcbaoB$8ip}6S^sM>X9FvCr%N1M9^~W3w`tN_lwc$DQ zwe{TB^S+MziQJ!6)$Z%oC^Mhs`Po%U_gJpas)oS(t2fQ81+EadGpm)Er;%OBNvYeO zH!(MD7QM$P;`N9relbQZK4`i6`o|+Q|0nnfw6BOLZs-0~gzlHXzD$M&S8EBPhuj*cz~ec2Is_-hJJ6Px;=G=5HK+?(kww*&`$-+J|3(oNbb{P_M-w^|AZ12kGgwEGf{pdFx{VyxuY4mwJ+(VpcjlR^5V#dfv^y5%}M21Vqc7H%T zpYV-uTl-&FRtW!?10R_UKPiB(%p#_4W@}%a>Fby}qk+9QE|tmHV|@^L{OWV&MCJ?T zgI@8?U|f~wkkdRRJ#aD#TOEG66CSIR92-S8TTRiqT3N>%nIaK5mWkj=8&RJh770Qk#M-Bci3g4;dwiNW6 z$sUiUv?SZrkHPi(T{sn-;8u6U~SoCtazCtdDl{XCC# zLkW7$nv~v5!O7(zucV@ovuKs$2sB=mlOCvL-afLGcx!0;P^}Vpm^i0eY)MCXCjNQy zydf_{i&e~x4b-`TxflC&V#6xrF1O8pGPs>}t(b}o^?~v_RnhKPoi5G&$?FkA0by_J8LD`3wJ#K zn1v5;ICpnm#5%2se>O8W9OoN1HW}Z(RR5yv&Z<1g&CR#idF;d!7nf%v2h#TPj~DpI z;z7z^td}2sN%`QXmoNPx{0}ex(BvPKZ}U+^bE-LxJs#N z=$Gl5iPvsI#%f^w5}w&x2v)K zPl(UZ{Tk`hzrs&xsT!yC;j1`@eNg*Ui|<-uRMSR|J^s%$-ChZ17*K~GT*1O{|WgH-Rm@ky)gRs!H|4~J3{(` z66jloZo&<&W&JvXlFM`kCFl&i=nSUes~3tRO4P@Zw_j)AMQ3nfSvGS)D0g=m@@pCT z39+k-ub22orefP{c+acHAWD5kw|X9F#^<;(y0)mg+0(d{yTe zYmpQ4Tvf7;ZV-J&gy+2Xb~AB7xk2wg*n+a2^8V&h+N`DAa)Z_H175etS+(sn4Mdsfi1 z*%X_WgkS0@`dTXf-{!&z8!Z{=yShD9Gwe!LuBx1uwrId-N!r5vcf<6$icRr-=B5L` zcvPpopWHMS^7NE_-28ysvfuGFy<;z6+p__UA zoM6LM1InXseP?-5-%=jm&7eHK)$gA7-&y!BmGAQTZrqBI#hXN*Li|&z+TgHmCU4_2Ha%veoYqeKW?<7$ygu9^I6a~UA5+GW4avkcxG<)0~6v=Z{mBChJO`vOQG8p z`ZgVTQ2eO!RwNs9DPQ8c$T^=M?Sh`JHyr8wha8@1 zY4}e?BVRW0ZrqqR9PCe!mUTg`C|kAG;T}#-232{$%H9-R>!0F(Yl#U{i)W14?`U&u z)?;Pd#QC_T&4>Xq<4-8^7|ao!PRL(X?j@(V$Yp8DX8gL%`FZ%QO59(s(U3+ClVY)V zOz@tf55+p;ZWtN=3FoHl0*!qWDrc%@Z4UV zQ)hVVA<@O<+0YHJ_oDPU_qImjchrPj{C?BWOXZ`N@}Y-{#*fdhDpmQ>p7XO*&xQh1 z4SDjE?ym7M8-471H(oLO(Q#zvuegOh(XPJUkKRgPXYxPcM|pNr@md#r7#>xApnOVO zgpz4yjOI~J68fm^=1%~Yl zN#}%~hmlPf!+PCwO`h|_MrC%5v2HAbzB1=pD#`QBKl4nUs@$7BPcR;O)8TJ3n2+dt z747|eY#je@V$Ksj(6p_|v5xkf*^%A)=I-%+`b75x_O|?0snWfJ_O%mFm2sVAV@A1e z$_J|EuMnEVn~L8aZ*z)IejwFR=roZXbGm>GFUz3!m7G&N_z++qsMU ztr<5Z#b-zxB(K+OIRWkMJFl&z-*k)r)h6gNlX(hyuy=vEP4r>1uaCr*$i0>47T`2& zjn(w+#f7#iP^eemH97}XX;FXQgs;lBZe_S-n2t! z7!#*i0|?JykArvEkI6rZy57HeVtx|(78`qk*IV9p_!Uj7#<$X!v5uT^c7J-LQk9N> z)%|?$Q;nDWbG~ZQvXmH~YvMWwde5rvn2;Tr+;qJk(D$V-BLBSa#vd4Gc z)vVg{ZDV)qeHz+7u$x#B$%B_MntqP2h;5~<*tXKHj{&>X*?YEfTG`pk(&_QV_ea0& zuo+a%wsHr)%+d7eCWp{F?$p()G79H)ye4fl_PlsjVP&veH zvCgPQUme3)ct<)iq!%B5OZzCzJ2ff6jc<_^J+GAK1D{36PZ9^*#F;Ty^oH7`fA8Zw z0bBD)c#EtlWUg7qxPB2?zCev-UntfQJ0HXDX!gbKe%w(&p1*d+3w`wBdg5zXvoB7E zwfH6s0xP`WyZqf;oC+PKiM4%9=x ziasJqVCmnVi)}N%WXgQwr7(XK7=_%WtZ{UGE-=}b!Tcp$4s(?5(+`a6GME-%N>UWJ z_#>tPC-QrBit0Yhcz=WYq1^uzUCnsfS*}NLNZ*%h$^R9C4}G5wuQBKU^c(-c{>DE- zWv+uSnDZb02Ch;c`H$2)|2yzKBKAaJWpC8O;JlVL58+^RZ$b|%br8J7FGHU90Uw6# z((!xv8~E+l@e6$)s>AYc(EDfDQH0*@&^z2Fm(yG7unfI|)M5K~)S<-KUk7xPQil^4 z>k#1v--@O%-S;Sg)P7n^xq3bM*4zJ`?>p-gD(g+1-aq{Yy+0RvQ@-BM`2V-{kBjt1 zPbs*jg>gk688eW^{qJRdllHy5pOpYFboQd3{H|C_^Yz3kDN0c6C^GJP)Bj=d@lopH zbMp-7B8{v=$=kIof;F$I@AKQ>sxL}JmXVzQLpiI%LOBn}iB|MeZ0J+q!{09(>!L64lIQqSw`ZV%YPb zX-GY5h-mgZHEZS2PtIZbH3;3_yE8<$6j!k9H?|9Fp;h%B+xhCXu3+_3F1^2A-mj03 z%3j=?zHgEA96{G+CcckK>gHr&C`8*hjc^xz`bLY^Pk~EbRL`N7tF=qW)rn!))iH!Dd$s7 zo?snuDoOPJeE7fUITs)Y(dQ3|Eno7GY9$Rtp**8kwe6a33GQ+^g1e5U1$Q<7AgIe7 zl1CKYIIn;Gp)t;8{++h5Y1Np3Rkd~@`v-|z^t0a5$LyyDi~snB`NWu6e5bIx%eXu; zU|dRn>0xY2f9YX-9`7HYUH#+p^8WI_Ge%G9{O$kl814POF&clhE_Wu=ZxrH9d-}&~ z593w(%@M|I!%HJCf!UA!RoYa17=+fkPLt~c*ilcQE7yn{ms}vCt3G$tCdYAn#d6Kc z4PpnDTt;$#AWFGG%8)tb5p0N+*jFDqq_&cOdZ}==d$c{nP=SXhPD>=vhbYCwACj9sLW>Ba-We7-Rb$Y|0{YitIi@8KJ#`ZGL}b zP4G#Blicp+-Y)zGA3BuXT1h#NU_U*8O=deksJ zdZhnyolU*^YF)uTc%?b7PVdJ@iOV;P4aEl@Nb$I(4pKL%!|}&l!JZ8+a_Z0y$Liv> zh9`=cOVmJU%~fn6Kgyxb&+?Ld&mty9Yod=e*kA- z47R4Pzu)}GO&#JB;5F6+=MgU{@=uSxhQe=$@4mp_Kb`R#!eMOSoMEi^D8RouZ!U?g zxmo%Jacb+IfiJN}N;Iou1Jb@0_<`UgZSo3j!uH1CW$taGpEca=+?dp82`23}owux@ z4}R4*sgY-C;5v_g9zo{22|Q@q7VLwa5^es#Fl0V-#ee04BIh&?G zyCh;w^OA_^+m_^v$S5e~sOQ+mv0&W~+ZVF`rK|p>0(?&cP1&JbxWW%R(MhMH=ku{Y zuSQG)JTM^7OQGd1Xes^gy(!A1YHaV)&vw%Xm*0Mids)2a{4=bhH)-@e)=EA2ZR);< z{eGLPfSaEqcJELwl#B1P?+UhU;W3BGXVPtGe4zWS;$pD|f_DzzUJ(qu{Qub#C<%XW8LSt#Z z^vllvxu8FXLqkVxQ4e#2?)RdG@;FG|hn{`ILwO&_+toMHrR$Vs&X9k|8g7P+HT*o& z&=qOuGT?O^^Ux&_yQ;@`_tGcP!*eLxKyr5{a~=kN`& z_e*^=#-o(0fB!F`@4XJs`S3R(pNrvbAHoOZJApj_{RQ`)1s0vRoT7h8{a>ap524PV z8ix2~-gpEW{D5-;_~`8qjuBV=+%aR>vWqwg4;Q?`;%yFp68LO~ zzYd0js^51Esz?)C&r8PoH@N%mHka`!V&n8~Mf+;ONXocq$ko^0N+_|k#* ze*P;tuB30e)lE;MLl3ygFK~kXovT{9}?{}Bs zBQ#*`r;k0+wUtpvH!y3j@l>XP1MQ*9n|fOgfbD|sgymcdb(h#13vzBb-{-j`M>~7A zt(sRkYxlg$0@YJB+v2I3iOqZ#_VEI23A1CAs=RD`IV28=w#|Z{CqoncdveU@fdfA1 zUAaf+Rpt)BqlZ{>4+Z$o zScgeH%=E#5??mnn%OV5icd3`2ho$V%BCT+B(FtVkUW4YBdY()f9himAF&4RA^yG`N zl_0NWhH`<$`WM4fml_bH%HY+kQR0V8Tvapz zJdisQg(n=pw=u|mH-U0wQRZ5Ewb9a>_Zl`Q=va>5UoZ7QzCE-tLV5YP(VFHa7WF3N z5|Ll=@l0$ef8-*+G{G;!JV;{GM?rfTlLKQT<}+r(bMSt~mW=%;4I}(XdsBPY;!o9B z{!m9*UtehMfG-VW5A1>Sr1WcZ)v}HmUy6V8@V4;09rjBtq0W+{Mevh;8pg)}E`pEg zKZ(-`Z1Ih?xxp|_tH7!9TX1Um4xIiSoP-wN7RwU$mAkw?J>(VK|Hcasn3t#a=Zu^G z#Bi}0Yr{2%V$P=xbU)irJ%?PB?L;rh57(pjh2AnReC;zU`RFc(7g^_WxYVfO+J1vs zvrvwku_k$ptk~<#*uAk)=4-?q&%C}4KO|y>v74AVd$VU~>Cjkw9%7ayUEhv<%j_nO zG|Hj18L(@2yY1HX5bLM-zrXUtNX<=!6-=DSFN@g>2zOQqB|NQ2U=e5>)*0Y}VTt3g|`8=O% znAM6svTC%$SRrrV3eD)eR&&Ml@+hDM{Gq~0fZ`exw zW}^?flUxl3#l1>wG6vhMHSlts(C>Q1R_ucuFOl=M6Q95V$cu=%7&e!*lRlu673O3u z5wjs|sOqD=+eN-NCI#_&!*W?)_aYnG7poNJfv@hvmhL(B&co`G7e*+-E_@brEJc_4 zkg9Wu&EgSN?J)8zGA?AO#GKbRoWt(+9Co)!I+H00*^Toqb55rkVCv*rMM4(Ra)>$) z^1VaRyKW(2KN)%w-sdUeQHed@e++FdTB{2)oksq)z^{+#KbV_eEa?*_Hp~kweRCEp ziH!Psk#ATR^YrzSeo?2*5jhga?!usO(+XlF?-&>vb=tPp^yQ*HVdyi5ELft3mEb#Z z!GUs1w_vBGpy*yX-bvBrl$&JWv@BtJyl#~hW`5biS z5$x6U=my#b2)r?*B0XZziml|(u{AkOjiK+&eOFr{&9=P3cvtQZRycqT+&R0j&;EtovF<&qSUoZw)jO{tb zFpDvaBQ-Go62nGfItrZ40#0ro-dyw=zEtvnlL}&DoB~c(Fy|Hh`sP$116}}(EFdO! z9`GT41|A;dXF7;|`iTJi4xmRnOUiPdBwlz}4Ys)z&8saXN{~}e%|s?10|Z^e}{` zuu@jeG!qnmR{}|5^osA#duji0((}j%yHyjufLxYt>=QfjwUb4ASUdK8!C9ns7=*boMnUL#~Ty+C#9fQ{G zcEsQ#q5^+L<&+Z`e2B8kiBGqkcUyUv$GbZlg!si=Ibf)zXWDaB1d0W zvCZ)jDH4AYQ%OZfkBlvjX&!rrzQ{2~UldgAvw!TJJIujjcbK#8+7XiV(;Xqf{Z{S>k9RE7inl+FV4Gg#K=oj3*qhHpvKFL}ANPDM@%-V~ei*;Pras998k&Zt|s@d!K zubP(})*Vq<$vdKgH}<(RYa!`t%6(0_kGX!#H90!TVZDj;o8LK-YhHHLJo`IG{y>P>pId`x4+=%JNgC3*TDEE z!1%g{Uv%u1#PicUzcldQ9esiE3j<$rgahMB#TN98@mEx_gP7BdvA{fg_z^X*qwM4E z$tSRVmsm;(8Nd%oVkp^`5kqNpNuy7|OvjLbJjXbA6Uxw;j@Y4jj_J!%8bya%;w=fE zVp9)Yr<}uvjy?TGJ}V`Tw8Xjm8a+%+J~$xNZ5&+Yj;PgD*P@>*ds;v6oQ`wI)fh^{A;6L{mQUXIv(R-z-2p+GmO z<=Kq6%Q$5zHoZm{exwTfhOAuQ_RHqv_Q#u(V|@*#gL-9j3i^qw7BEo(D31_@kP1 zqjKK=No=JXz4zAB2<;%}Y_A>LvDsZ?M0Z#7Z`#v#p|LB!tJZwDnK=I(8`PX!nKnVQ z|2)GOcZB(w}`mfF{s*?7 z<(96>MLuCG=L`r6%9XNMsW+ngda1?Qk^;YMC$zqo4?`r;V0o=Kbdk~Ij@7JMZfNYm7gzuY8d>Kos4gx(d<%m#+GJeLB~kL!_2Nh zx+4L1H^l_KuPBcHP*lgm+_!T75%(}AeZSA)tL&jogLOwHKG_uG2+`>r z5jwrY&HYdGI>&8#z2nc^=Wsuj`;*+SQ*@4BDSC(axr#8POrd!G1$k-hfpSJAfz;=|5r3UtBy!)Mil zU2_=EC)7aK;qynvbi)VlynoHK&YP6b_tE!@Mph#+N<}w#L~4rluy1p6?=pvs&B;gj z=Ft65OgqFkBa)ZKOH9;#=*K!4CnNCKnLYDd;ax4|8J}BW;?GDQsaTbz&11z!r?Rwktg>`}&pkBn(gQvBOUEh$k$L;11SDKl1Czt+z-qTNSe@^kQZ%FS*Io&wiESOB)F+VJK6dt{ljg|4yjfV|pGNt^DaxyNa zyYIFNzaxcly#Bx5`h*{B`sqDZ^qWm3@PIPu+jq!}yzTRr6TcJZ!PUp$*PNy;(q{1& zR>BRNg6CFhYUNLBDB%{m?Y9=+)hy3^>>S1UG;Z^Kg7w6Qd|N$Q--exYy9 zZIXK7olo{rY;LJrXj(t`a#DX4JmEmvHHesX-m>qqzYf86%3FRH&$l3J@qTj_|B1K4 zTYismGU@_M?X>4zlJt2Wc+fjmD*u@f=*Nz+`JOLeh}$- zzWrPcgbY@m?1UF8>%|P6UxhBZ#Pr6`n#65CFTOXDkg=Qt_ojf0&eFE`)lxS)>#hs5 zM{tC99;7|PnFEFKFC!i2Jdf_flX=Xe%*Cwc!LCP|Z*l#id9-Um^R2F5j`PgL+XpJv z?_+FU>zRYs4?MlThJU@$GZ!)k+emMa8tHeE&WHK%Wj_2&+B`59Y519xxv=({iy_Q~ z)GKpwGjk#1FLN=9xsdw3bK%1`-m)?mefZ8>Ugjc#Z@u5hT!itx%!O4KXflF#KJS@} zBfaKAWMuo;%Xgs{|2e+Cyz?@gJznNz5N!o^KPX^aWZbN3P|IQFCrBUcT0=53ZtN@C zyd*I%jcSNV<^)+xwdn4}FfT`$m-Fmz(ez8^rImRpME5@_Q>p%v_6a`s&X4?K1aqS@ zFH1?n9~2%=MbF$UYaZfS*F4JgG;_0-xmn*cHxmvn)7HiKgX`9J^Pjs9KE3`3V|UL% z&pPqW%W3B35aXa=x1OZ)V}AOWVr5=P@Hn-(nb2!)?q-Z-K4fn0VSJ@-nVTuHPI}GF z5Wex2mAM(kci!?cH>3I1`;E3vdgjKc1evVNO%O@?-rZ|%%J`4??0OfUT@x6iVS83z zn;+<{8_y5^NtvHuz1j67DTJ|0>X{!!>$_r-xxofVn;(VwQCY)B!FMV2P3Gq)^D|vl zTxiJrbAJB8`6;-5exQB-*XQTcf6mW8x_;zr^u6`NIplwReqzv%|0jO?hwxkd_4C7- z@PB=N^8YzM|LFR8`}+CeeEz>aKfC`qKmX|bv|l$r!YlF454t!X*oYD9q2K-o>4PrM z{CMeVIp2s5jp2Le8$*Ma?ibp69JKX4(AM`uzvV!`O@V$Zf$li?H)w0``Nm7bSvlXB zp{+YrU(PvxKRD;;p~a-mxzJC(&|&+y7y8Yw7i}GW9c?|BbB?#H&~LYJ&heJl=r?F2 z?>FB+=NPqf&fCzG&(Zg2HK=0~{*4XrsZyZbEYNHjoOQ0}RY`0?FTYB7ogNtq@>2Y^ zO^d7F;I&_b&lj#P{AH8yw?wzc`;G8DWvqqoDd&l`l(`ju4^l3cIwby}w=A({3p=3m z&=Y{4?R|f(F0VhdQ|wjO{&ns9-v8PUk0_k>3NK|HZAjLuT05fE@D9=cLSL>)c#@)n zE&md|NRi`Qq;ApO_VRNd;`@9(@*4DwJ$=LXYmeL{zt4~4n|>re_($@?ek8x|kK{-F zNPhH>mkmrN00sR>>A=dyAs>kL)$5uf85LSb;t&8 z>?7A}n;efWQ?hC>#Sc!kCJarp7ODO?H%Ye+9W~CnM-4Cy9W~xMeC*xUb83)j_}F`_ zqbd7}uD@v!<(|>^Gu2V%{1(+}q@8V)ITxq58sLNcr_N$R?&?O)V`|%>kQZh0>Y!VISmwL0*L zc%$)aBd&(PK?`sob(G=ju=hOl_HE_$YkGNpn&#US+#UY6-iuwO!Iv1!$~Ajo@eke} zr=NRyz7K1{7rB`q^0Pk3(a;@OXvA)qwbLUD)BJ{KRA%=R`(eX!?Afu$q(0d*`d?X= zExM5^S9vy+{uaH0+Q$rmK0!}MhPx~Mlq+{YbF3#`y4YQmF4Z@dF4Z-b>WHZpN<4O8 zP;7jTno92~J+NZz)#pC)yzJVuUY?ha{g!##@Py(n9i(3M6D+>{bnK_{|59Clm$xku z`&4)3H+`>I^s?@jXQON3vHd6`{$`oS{zEaA-gR_^t?{UitDbf&R~ij|%d<-#w*g?-HNl`Io03P%c+~MIO4=r9l&}D8%NS9z?l8 z+3uAI+1R7|SSyLYz4EV9x%ahJK1?3|FDsGb8qx3b>g2EbV3NC_!C)2pqD`!)O8kKe zP8S;u=rm1lJKy1%%PR{fFlQOe-960V-OS~9WS`^e+vC#bGRK+^%Ioz&Wj?)QA*}3G+7K~>e$yjIHi|QVMU$1uU!1w z+)ca2)4p-EGoALPG0v%s^P8G}TV0%9iyvtC#+Cgb_|w38$lzL^r*D-Qhx?|WKMUX8 znl5u`bk;4bZU%k#Q5l*t2$H%1g&G#?Z%a{WU%qJ78i4iOxf;(3&4rYTrv-Zt(-5>#=3bz^`h? z*L^ST0>@`WXS-`ugYy`$F5@HPgnfWh?C36HYXomOT=L|3H1kvduiCn$k98%sTeFuK zqjnNsv49xRQ?O-eLGCU%U3}s+eyMBS$r!()4@I`FwiYwa#KG(OxltJ;;iQF>dIsJh=dV?yKdK zyEa5l2G*|O#|=F=@z+1HzH0R!kCnAmtN)1WGOizTT|QRu-FnuP=)`%~lK8Bz>?5|Q z{aoFgF~rx@Qufygv|(kG;$C@+&D~J$*Gf#xrkYz6ZGWj>;MY2c=S1Y)M*Jno`STTh zHsdn2YY=&2tL+)9`?^vY_tJpU(45oVx9?<(7VupQ5 z(NWI@wuSdD-wlOcl>ZIoJ84q`<1wMX;+`ahhoL(VaN*f(^y4=?G5(2c2Xd%2_NCcb(2XORuSt57E9Kup z-A7fEYd4wxEy1 zy`6glZSQ{E;{$BMmS+T4b-3u;hsBn3CktQSdEE%+I=Zn7DJer7iFyZth z_pY`2Ru}VEz_Zwe8?XzH#~+;m9Y^dSw0O1c(453eZ$ZvkE%woZ8w6MFEZ4W@vqlZ& zJ>bLFI-_vMP`S*h~8-{N@|9Ie$C=lQi>G4z4hmLo()&)^E?Y4mbh((>I8HY{5)-1zOtvzp66f>{@t1Gd9M6PPn+^Q&l%o- zZ1MCd!`p@vo-xSyO?dUrbkBVqc#QuwneYX+>x80>uYvL3xj_52sqUbTeZkxnj~;IQ z314l$seHgQhV=)1JkP+O^toQ|c{bd>PJ6B+&Sl-Vp8NW^o^S0v&nG-FbTei|RM&6O zY4v#VVBJBLz3IuZl|kj%gV9UY>Q483Uw2U7>Q8$z9^$(bJ>Plv!xKIK_qHdm=bHt( z)_(NyCE(k$C*Id}k+YAi7qmLC&*e;JSKJ??8@sWO5>f}=QGhck)9hA8P0(k%Gis)| zfh&6hFqlbQ;*a1~d`${m7J#=hfmg4uf|2OVt>nCu!ah|Wr)wQadylc+R?6PPT4x2EGAzjy+#k{+oVBc7dynmGkUq0d^e%s6q-*W!#;wt*QGADg0>*23N zYIH_M%`@(L>L8wKSG+HKD(Bd`a?c(wF>p?3-$(V7ox&a-X3D6Ebgz-Vh^DF!&!DoAQfv$C=k^}J_@1XZsFgtLAb<-4WTwB=VQ=n@PaFx9Ve4c%?2d`%* za7{q}Txb@r4ZX^}j-)3&2h6>uzCZRM{Bl2nU+!w`O`fXQ>sVXyvSZu0t@GX(w`bnz zaWBj>-~Hme+5xqW{R1{Rjt|)E&<_-y_un~0M_ud_Vt8jGO(&@~;x-M~6lB78Y{1xn zAoha<*#nN!zN*J(H&x*qQ+#A%e}S%tf5!}PVF|Rj#F?K%zvcnQs|tpXv3GTk5_mCT zLo$PP8jnu_@A-7lgQ5?4?aV1-C1WOICu1mM>DdEp?%m*7c|U=<6F5wa>!DFt7Z;0!d2gN2Kvcb@0yB!@HD;AHJErawT?+N!Fy7FYo17)afU6Nt@)ItXr>*qu4%N zEyMW9{^Tha+2G{|_2y02G2Xq)eD8b4`}^;%@u2F;J?{*~#Z7Nr=pJ3SrKfDcr7;5I z*SA;nv4p0UeP9f2`Vtyh_L4ief0Y=c5>Gjqd8dux8=mclJ!Tku#i?D_+oXEOJyp+q zkYwM<O!!HL3)mh-6W-=do*YvP?j>DCF@ zo;zPznQaf){Frrd;)cX4*rr{1cx@tjeO>5)*K_vUHOS_cxbar_rq(ivW4+Qo5!^Rn z$20hOGTNQQyBB-cT&q%;>4%SE&U~xzK`iHu#5=_<+hk8HT$&xNnw&e+wX;ZJ*n1A?>SV*NJ= zoQLr|3w!Z<4o`Bw1%GY=^h73ma(BAY+P+h~; zp6ZdaP`)~Y{uRuI-y5KesxR*u--7rt52(s$+8-`+VC0*4U(Ux-;qDCmQ*Hw`LHYQU zi1$^%J(h+#Xhn&6F5{g+o1)PL6`zPge@WY;v7OKOmU9NUe8RVV-O)qPFJ-UMfv0xT z_vm8I$;iPnr%YDr*46Tc&H$km6$`9Z&F5m z34cfU$uroK5~+JmAU6Ee;lgfl0e%ub*ZSv~XTu~9y|W29MIAJ~)@OA3>*D;hxhyl4 zY3Hpv=y~DEl*M`cC)PpFOIeN2qAHEK-F+{4&j-SvFpkI10AnfVUt@JbadWK<@LlT(=O(94mL(9pZO%mKXkV?pAB&ujoUThAwPFL z_cA9kzutLu;TuclHJH0b1Ujm2vh)PS_cO@UTe>Y?8 zV9o}w>mvMR@3{7F4;}5LtGxAZKS(kyXXG}+aopqQ44fBSB=oCQPK`Y#j?oJjwqZOFehzV0yc1(srx^d4Rwb8Zb;=57E+gwDYa%hh$( zb)dli_*4JnSt!+KH&5Ez@fIL67g6Wf2Wvs$8vbq0Jxb}y)=Y``R8(+>oCc(k0!IOe( zccIf-1)dZfY7MEfVBb+#gn#Yp*T;?4g`7WPz3T$L()H`W$vH{Z!JELlHZF0x)&$0& zKF>2=R`z${Ely|b6vf|e2hJOS9a#hT+Hz%L-?EEw`!&xAIf@(L)!t>o8y5W406p>m z-wHpWL9c6_Lb=2x-IFt+Erfr$f3e4pi}<+-fX4BsEsc4;t&Nn!_j-cJT?KyD6zDcQ z%D&cFaBj>QU;hNLOKHTfLX8@v#krLCotvh(yZNX1W|A14A(72v68!uV@bRws4CxfGy32_zRb!dQ9=*li-xWYTjR$qw+&1|7yXKC!72S)!0_IYipM-lnFcV|6 zJudv7I=!!lek=FTS6-P#UAnF{n05%CsSSTGz4Sbn z?oXKsbD`;s%Jd+0z+gwZr0|saDk%oP7t`^3F`by#nXz75eRGEb z?t91I<7diSmlGd$*dnw{Ja(k$Ui?7p0xzJO6}roJqG=A}COiT5?(?efyot@SpRw@r zu};AM@{Wb{Kc2A_y1I_O7-?r}0sLm+Sru?LVLUXvXI$pK$`A97eXsG<^PSWs<1e&V zhVa2yZygV_o*7>+{bOZJqsx@So%#auJBo&V+Fm5^h2Ni?fc(TF_-r9U7aADDW8l+2enX!I z+uW{yP4quY{D(@`NCvnvUo|Ae4~BM5?|~ukem=60N;$^?8@12?SK({M-I^R&XhV&z zhaUId8~83k&XIuzQyVl* zwV|$~zP85WfvJrnUmND~iL^EP4NPq;^_lM2_+gG0d&*)j(4_aOhv%u*B_Vv6kp|QO*w8(&a^Vo#O_WC*Syt~F9_R!eZmDgx&$@7%EvM`M{ zrJ|2;unyc9e%-&r>+V>ZZOG3bBe++54;Z@8F%?Mtb}}$KPbI8&We(#>#B>8I#d&XDtZ)IQe%bv7IFTVnOOkQv&&>q|gxI@9;iU zWQGCw8Z*RJ+4G61WT1>e9T;N72T3$=8^5R068)Z%G{LVl)Ubc0r2u{q&xHp3Pa1!9 zqFC!2b!Oss&Es9_7+0S57%6bVDq(oOex$3_;eg#3f}@X!X~b zT#2Lr#j~#3@h2tp!#rY=9)^b_extsCjyU9-Wpc1jKF9rgzN^`T&>3J3R+A@qU)Jp_ z=+xy49#e?pfzBag>TUz}#s99zk~blH5MOluq=E+YDSOG5i4)Vpo=BV{rFsW+=xb5I=^?S-k*KdCQ*7`v9#()F4MS;h2i=^&$#_kO3v;!JO+WhXOp{A;B!?e8# zS}|k|d(>_<*epcL zc4wA`wm)4OI$Eu?)Q0I=PclBA_4wxf7C5Wb_iM__R;p{`bgkmIR^%tW%hck_qON>u zQ~kkDpoj3us3O;Z?-iYD)7ESK!O2baI-_Y6FrN&}Pe@V1Ry~S*NZOJb9b#h5&rVHG z8XDF-Z8h}Du(LxnTZL{O^1h{8Rh_ZBB@V03nbllo>5P5fa%7m2 zH2lCC%k$+^x`1={5#V|@e68VnqrE*@u^wU`uxoYBPql?~^8bOsuOAbhVwtZ!6^6%)nMlt6ZsL(&CV){nU}V*wfd< zC5aoH^wmjUiK%6uM>)?w{G;9(PpmrrkRq)1h)j($hKHf5kJ9s2nNjkHCl|`e0luCS=*b0RP5*@7seUSZ(ukej4vz>Pk zhnIg(1m0FNw^fS=MA6pJ%*BCGtJoWaj+%XkQrxXml8d0*_UZd|)#`Pvn~;|Yt)i<1^D=5`Tbp~_;^j@AI_iJiW3&xl+yw2;pF^mg;qme>r8;YDd3;t2YY9){8i8! zl0S%if5t)XGl6r@{$PyCNUbzQ-{f1ki+ReYow5cDi-W@aSue6rS-G#fWu*1`wn=-x z*FN@Gv7PzRf4m(~SOw1h@BX76SV~^3SgqQ4D9JJwZwFcIv(t!`ry5NKY4{IjjpuH% zI^kzemhs%lHwEy9Qh=Sa>>~-Z%Lu(HWu?s%e3j9$EV zk&$7i9L~6f6);W`?@`7^#wmk)8MFGh?~hYHW8HgeOjYgA(Wcd;T@o`A z|DuAc#gC{%)!7e`{~Y;;$Uj8>A@W05|0D6?ne2>zgdR2>W zHy@nT%|2WXTpctitw-5En)Jwh^@^)R@#$EKOhHiwx)g)bx)phGjiPiM#|J62-^hQSR02(t#+q{u;fFLy7i9P8D*13Jb)``k{u5ei^;5b^ z6>PilZ@7(rZdH6-v6L6TrLjtY{WE+to?>rZ(R`$69X=;lU?0B@Ka{6^!c7tMrSIV8 zqJEK)q5VqwMqR?UJBxD`>lr{J)U3XxarCZTE-^5?ZJ%g1ZGkuY^SI|aj6TGh0 zHN=W6VNcmgn-jv=TNnF<1x7^Xe35P>9=SPeK7030{p7Ak)!>$nbbq^?k&r)}&kG<{ z9^*TSF-Y=PT5HR5wEm~)lnx!^FVEhwPL;8Mo??IR*uwc!`Rn4Rf;oGZ;v;es=>RED z?is^WMRnmru6n7WbG?R-NZ($*O&`WjfsnT#?^O3Q{w!G^nx{wwr@TZx6}3ZF@+tdHKtZ?B#nM_v732HvC3@!n=t1%`;PWwD{60pG%v!)T=b6opaMA^yUnGr$=1U?yioerpQWCx(&7{X}+wNFP zT7dt@9Q;3;AKu|elEiZe&m#veaD?Fx^3j329V77vnP$VE0zM#Bc(Kupbt$;Q>o@lp z^Rb69Ou{cLb5dO@W6At5o~@gi!z?AZLD7xGC za8|mTv(k8Ux5uHoosRBy8oJx5#GQIe)87uiJ22{L;&~p0rY`eUqK<(F4j7fF) zIJS^~iZZX0x1F>j$j9;ifbEWRygS9aWtm|)d&qwZ`2CQyjq%?`f7b!GACV$Sr|@%n z3O}cxP_7I3Jq0ax8kxYaD_)%UI4NrR4#!{c?Rf>5{tlQvqF?OzKl;T%-vQHa;p_Bm z{G7gnpVL3AXmE6|sCTUFGcv0Ic(!jd2OE6v%$hcJBz{guW*L6-iX;B%osPG6n6oxU zk8*6R+39eSpSjJPl}s5cWs`Zf{>JSnc)9^t9tA8nINrhcY35D0IUbaJVE4|77v@>H zUcztcLcUul-#q(!$0dBLCP$CP|LN}?|B0{Eh0(V;9(yNuiyjN17bdB$0my`42`f zatvTC{5sn0DE7fmRK;dTEGZ9vu@$5@D)!*Zn0aK4ydi4@U7lzqxTCDKd-9vesDwuO zzFmdVAo{Tqt4wq`RjyJd|By#6|1Nl}hP^re8;?A`;2V!Tekc2$$l+bQ7kOLX`fHR?2?*8Ahs|dEWb{`zx`q>(T_2gm2 zeStIVF?9E}_=dgDuVPODFF|a641=>Z*|TwQsOS}jPM9V<2J4v0brso0!&C0t#BPsr zZ6@VXm>TI)7&{q@CfdIl9i3xd+0{4IZuFd7_2dnOzUzSYnoaEZ6!zPtjE9_MKPQc# zpTi3mKb2^-Jv9tEwG$se=6i;^@LAoeq}c*vvTaZWBZC#6k-;IHk7LOTv2Z0nmi$=B zPoV4|rB!FM1r8!Vjr@>1lveXklvX|E<0OxAdF1DDRX&XkiY29y@<{hh7|K3e8>AeF zz8oXhwCKw=?Rntk>Du$a%T>f(=#;ZDaxQ58j_J&$Q}o!N;gz4wStK#)srTP(4-S2m z{8s3bNhRPg^y4Rgov2*8kgi-3UOus^@$sF$*2FkYpY42g*VoIl-`&0au`>0Rfl7Sr z!0EFSU$v_Sm$T=+H!qR%FmfbUm6ku})keO1Z}-cOZPvaU#CQBx^>-2Lu-CVepZIDb zKHYkM>#6fbBx4H=c8z%b>l>e^rT>ck!>*&CYfku(7Gr zJ>{-ro>u}d=(oA*{IlKl*gjc}p7WuOwj4FtF3Gylz6sT0|7QOdI0(l-ZJWtfZ73UA z-4EE>ie1IAIN$2yaNp0;Ql%h+m-(GN7i<-TG-J~nfx+qu@V`>TT=`h#HVhU*1t%X(6q*Fq3%uCq8`l) z!(UR5-pB{p?%Ee#yKB>PuiZ66r!?jdf+vk1S{-9|w2!S?dB1P9v_aov*H$O>bLOdM z{H&X>Cxd=&f2tt49el7-DbKE-T`*?0(Ds}O5^hq$I*2izdj+{IXEXN6e zFFoP6x@c?56w`(P+A4g|vy^XyzdoFpb znLa=XO^Z=NW+|#^NKtgoHbrO8!(UU1qH~tLUv3#RKnaT-u-RX(xtFm8+FfNiMmu8p zZqTB@s90i-r`l3Yv2`&agBJD4IUak!65CG+P3PW6r`iWE@`u-0jR= z{AcOO@xDs(K5TH>(|PW1BX$ajbGO*%8Xi(68CZ+$!MxLC1wXV4D@*b4l)Hfu@M!hl zvkwy<{7i70jJ=!_MbEi|wu$fTv&?suIBB(iJqkouq?260{H!m{%-486UTej+f}%w z%rW{B3+(D2^Vp}<>B3!YQK#Fo^LAA_gsm-r+1x&qwm>< ze7F)^_ARog-u?a)c``5POgW|h7twc|1MJL)_L65QFL}Mc5xDV|O^HGV$QfPgSWg{+ z$TGk9oy|Smh%a;I_5|Z5zEFhLI$AUC4~ijv;L#eNKfuopZD&5(UPNA{2F+H%HRGta zE!WeQGjAiuga6UCfiiD;<{$E%k-3+CwdH6sgyc40csT96{9!+9+l#iVZENPg9dS8Uf7N7fk9!cG z0!F*=VhZ#|y8-zQa#oWO{zoP{JP&Z6qV{tNpQWS5=7#^K=^8wMOl2!;vj+XOcc8KBHK!}VvyZ+ZJiMd((SPXSUU%IKV ziuM`Rm=NpYJ~;`z&y0QBV(PDiPUJa|{e^h1_POu_pJ$(GTpS$bga2HnsnoJUzUHHnM<9iZ3e1`R%$@$!j@ZfZS*ao`!N>C^P5$W9(G2V*3LfsMOT)#~C3twH zVr-c+-qy65b~ZA1#L5Y+;<_uf%2cCHPpaDgEOPuX_^@j&RsY&AXX1FJNpQ5t0KWJg zFqo5*d|aPdpP?wp8t!dQtUj^UvlhKL*ZF_CHJq!BO^WT(si@|=?BLu*;9RLoaIV;z zdvT7?;H-lW1O{a+Bqqd}5$W|>JP6;C#MQ*dF)Xhi3vi8$g~(!UJ$urA9W*a{(scGD*%xF_`U7jfjWzsMWA`ZU z+AF24UOW-lh@RPsyBj@g5&W0Zd{+$i{cYv4$19g&Sck_uZEo)#C3fV3v$SVu9MMhk zu0vUS?YG!OcQ-j3y$UJ!%_FbEKe!ejN!E;s7(KxL2S#Wok%fv3^xZSH*>n4sWq$!p z^*s3_p{e$qDa{_j8rTl3KLUT-=KL5R$Di=N z`zfXH;}_Oi66nG z^NBWQ{Y(1fOk>>syu=bUt;8?t;ia(B0 z{Be{jbVX<)k6!_$`I`R^rMdj7t$iDO62lzmt6IKqt{AIQ9(e}q7e8h_=Otk^7Yyv`jChH;auzw z=Y&isnHx6gz?>lm9tyhqz{5e09C#$?$peoDZ5y}A@doKM$$a-FM{Px|;{d#+6U5%} zS-w@XLp+8Y-A4X&QYlGk+T$=_gDAASto4cTUlWm|i!5E}_*KZG=aL%OzcQ@{EEytC z?ZJ!EZy8g;M=kKg^O4E4gI8)wubny4=%<`L5~+76`dT%r(sB0L8swQK?BCUnFStkc z>2K#5nPZ2<5ZI^cv@-Mjl-oHY`X_QtKxawzMN_F#J(P4W>5E=xm2KE&?!Y#4Tg8ld zZ&b{jce)~Po_YDKd3)f2Y$I0K2VCFKVuqQ6Pjd~2k8a*>&hp*3%@MM3kHc@{c1P&O z7aV;y?r?-{e9>XvxZ4rF@g+yn@`1s7Dh6ha=lVL=hq<2Ox`Jz;iuA=ZY-i-M3BWf~o(*~s=~ zj8*m?8Q<=7AL8wp;2#ID4+O$b4uY>7j9!o#SoYE4RU6o2B-P=|K3-8mZ(&Y$juhBa z6Hg)T&bM{%av+pe|R&TAp&~fPR@V5ZC@)QO6D%V>A)PtJS!;H{7_Ju z`Qe~E^CLkOTL&<%0~pf*jOT#hSrI9X58rg{EEof9dErc8Ozd2}Fc#qB@A{m7H}daB zBQd}jizk3FWWuIH_lD;@2d$Aw|7Xzuk}D~N?BE_be%S&Ij?eH3eHMKRf2A(_80RgK%Q~0X*1pA^mDe(E<7VW@Ykn_+^O}#^=H9O^3exP4*YjwU5oCjZdE5 zkbN$t_OT`o1Eqz_zK+B!g4@>w0eTYM9p#2bf zCvlb_bQV4L?|;7N!%p&*10!4;RMixqM77NNddY{*W5pj{(3@JESHh8}Pyf(NU&3@I zr*q2MX^Y?$xQLGGR z8F|{HSIkjg=}mT1n$Gk-d-1^G5m7UdYmKB$J~|&)M<3gzdBy;j)2O)K{mD(>>4>Q5 zeU#RZ(yL4X?~HKmWgKftuzv!UO2Y8}4P0|>`~V%i@UPf!{-PUT*YdI59!UPXXET&hFV9O zO*b!nYfNzB*nW;Vq_nLuSgO2BwTkDZ zyqn3h&wyITxbT_tC0^W2u4xr1!TLV?$1bfvZ>eIl_7ADsPCd-QhKYQ?YYG41S?bue zBuM+`b6n+rQm6c97Wz-)NwdOB=8q>Wjo%csIewF4P#@w0!uOgM##+FBr$!&uQQO`< z`Ck}U8Q<&2^(?fTjO+7(-yhcuq3HsZ+vS^oWLyuMJmZRj?d?l?#&v11XKcmCiS*e! z#at zCbFp=jPL7QmvP<7IG<#U^D4H^n??P3{KrXMbErecS;qJYo@HFukXNpab?}A?uCGyN z9%+2j(Rmf)K6B)eDk@HauTODJ37$p0gL{p0EaQBHai0EPa&}R|1ul0g1MEXt&udtl zPpHAJv+(DJvc`c)*EwZC%h~azO)=mJ<BP2a`v4w2&(qPP^WR{&!WjKxVCaqNm$(3O?&&_LAVc-&z6x!2b&o5L?lJ_x zkMLJUeTMw#B>4UWbfOU*&II%vs=A-g?$G<&OVj{oIp^#u&gZMxV>7{*&WOlRyPq;D zfclt^>XKMnA@bJAtD)^CCJozA3cXmi-*!2+qINjv?O(4vO8lCCIjJ zOHfSs$Pq{TC|6eF`>85|1P*_Kx; zL4A7VNfJ^EMLk50X(?kd`D zABMde-<;(eC*OSU-+!9jbw&>lk-0T2uJbp>hz_2QrVp2o{^_wevBMKO)~DfS=3K_U zt~~dLa&7d8ME{q0(dL-FChY3CF=l0qom#Q!Z;e~9Hf}Ozv=ROL8;o1k55_H3waxX` zd)>GNA7$JmUW~Lk9$f&@W%U=mKIS~Z_>Lvfr@1(vvySA8j%&OTdna@U{Ne3rdh|)? zArjj(6B-~F8lw@|9*T}+AW3*%YtSQo5_^d5)tUVzX%G8qIb4S&zRKWuTAapkjMLXx4MkaOg^0Ju{sQFPVF4zz=CxGk#@b zp)IecQO(e(`xL*9qx^4(PTvyeqjx=wPLr8fAkc^!zv=|BF!C7d6rI1b0lwv%v^_=D zcg*Gfq&}`;nPPBByr6x^?oWVwwx3%peq}}+9pK{_topS`J5Qs>`z3Alp6xCGYZv<| z)mxDZS3t#HK=)!9_n+OzJvv7h(S6y@Gam5*FU0WNPifu3^9r6TkRMlor?zq3#`O)Z zZ*V=$^)y$dV(akOifzNwDz*>LtJpCdy@J*S$fXzHcY^*0L8AvvCn>Mi2KDLbzXDx1 zr08VPX~oxG;iI(HDEf{n#!Fze4=|MU>G`5rCe^LSQT|zmT!Ue|LUT z(SyK(oKjya9js}pYu<#Q}@E3?+xHj)=6*pi|GY_=l?;3uZ}>~nnSr?w=gq*|X>iy+rH}Je^K#3V%)R6fIk47}qU+;q zeSeu{q|SUp_?rzZ2p;_$d5zeW4Q1Y;LBbC~TOC60AuxZq*l|{aL#xH^XFBv!VA0tk z&93T!FN*f5!OjNopxGzL73`-JqcdL3x2^0U=L1+v$bde$Q9Z(+2>^yWplO8fBDQp^ z_pi2`g}zx0Ux0IQ>l5rT^Lh9AreWAH1UcWsk9^NN4X&*0CI0Ls@!((CPqh6{^>=2# zUz2?!gZQ>qaE!mklkj)Vp}x87T?qweiW+3^fo@ubuJvqHDfZ`o=m4E>gD+4;e>}E7 z2Q>bcKkZB;Y5OR#(qtd~d;jkJefL3M_!=S5j-k+yVbGG{>}3(~H6pQh@~uAktiJyE z8eRR-6>5EbVsmjr9D6G?&s91QUPn7RKUVh74s=bs%N6%o_OJIi3wNih#a|rMRli01 zkz;8(Oy|mV)iKaYcQ0U1!$-!b1*M^1>2=jpncE_g8=bv&=%HNvB4* z+L0-SG55#&jIV!-c=twZqo2R$F{{;>WfDHUG1ZoAHBK@aQ@JmbcMCl4%6Q)2^KQSA zoCeMmTaVGSsRTTeh@9~FRNs0ZV4)71jLtXH>pKhTiiYTdU7b<3OPvM37;^&IOJ^AJ zgM$2`Hsqjc@x`L=XqV86lfsB4m{B-pQeP$H6|U76mVEe^*@aC8#sfV`dnfc+C-SX@ z3;d%x=c-YMXD2mfDG^umCrSQz^6|R}p0EC|bm(E7Pe%+eZ+QG{%ZY zvN3F(B`I`+C0DN${!G8o(n=_`SJ$hP_Uil+gr=JR;zmo-3r|}v@-NyP+6jO7PWTgE zJ?XuJkkzGSneyWTqaso#nSvi5T$E3YhloGN7v%S=$ zeBC`cmi$+IY{^mNH<4fHi;vEdkf=LfP($wcH(kh!<4+7y9O)TK#Rgir>iHp&jV5bRz582QOnT^>+eypCPYrOHVCs&mjSOZ8>UjB{0EsH|F(Ok}3|d`nD-`!h$1#OSKxYJHOKO@t|~5 zVZQwiI6T%MHlOk(ihJ+D{!QB!ZSzmTUS&e_O3V3A;O{Cv&NblT6m_8U{DErA zM+aAGb}fUjYuSg)+<36sVnDW&i{5u3IyKR1h%@0NG8DdR+fidlLXJ1sS=c1DFl{eX zu9tF#7c1AVQ3htKyc^++Z5p8t{K%`C@{MmfuL=q#u3Vwlc@uIbB=zk~YjY-IgCZVI4249u)cVQW2i9y`AZO47q zeaw$x|1yjC^0QMuTE$)md@FL}0-ifwoMaU`-%6gyL{@2K0-VI|wN&!lpq0ti%1EA+ zd8b#IwLD*7?%K#J(Sy1+{65dhrZhRP|jq3GybvOueA%B z>1)fW z?~v*e>^Mx&;`x5W_Mj9eX**J0IGyc^u#d6W4n4n5>+D{l0)CBJu5pdGs|Y`X%ZszUCCfx>@PLq{BYX4OKE z4jFdnu3Qy!EB1IF*2)ZcJx6UFZ$M7l!T6T?ylZ*g>@%i2nRC5f^Y?85zT4pAioY%K4{jhh zYlB|bTF>~4y|i__E^KGH+A2PhCjjT-dlWy;T`%$d$~5tb=y|S}`*P3y%jNpkx8cJ# zZ0UKY$FG?9PdwQ39H;qK@%U6c;mK>qPsLQuwq2ZS{h(3w@Q+`6@|o;ymfGy!AM|N8 z_ffLk$UV;Y(P#YxJ?pi|$8cDbwfAnnEZN`0|4|0*^7t|^ceUw_nlDo6Q{6!opJ`8y zg((njMejr8f;WCQ-NP|aXkChP}-HkS{GlI_fgMI>^x@!XReZf4Wj2TlXIoSeU)?UFl2rX z;NeiLQvH0n4*Q$?x_0O3TFtuqy7r{&T9dd++~($GC3BUn!6RZx%JP)PjFKH<;8%dpI@EkcWi;l)V)z}dOO}ZNz?>W7$^^j_IJ+C9~BWWl965>S}8+J zTZbcp|~ znf*o4VQ3|xLxi`}>3`TlOxdgdcyIRbq8i>M!cWPK^~|C8?YWaV9Ey&3Bd{;yD|2`b z-a{>VI_j7i^OP|&hU+qF=f#m`RqUQOc-+=`Kp#%-CG#`i?jdyH+y88 zgC{FlLr9x9VpG8T@{L;@=$2=pXP#w4zA$3|x--Z*6=a-BMQCtLMQGMhbcW2>LZxCO zR|Cw5Y)AYgYz9Y4KkufWYZ#|S`iK3h%L7ZnuEWr%L)Cy5(bEY*S7bV8e)G-E7Bl)E z*iSuHsw}s_7sv@2+-fl|@r^R0^I^s|c4XRprdG}_Vk;}p<|RQnyMZ^E7tT}XW0;q7 z;92ue%{emf3E)cM`FzRVJQQCIjVC<*be=mXFnwRw^IJS?N5+27{v$=T@ai^kp4rTK zCTVt5j*=gh6H7`Xo#6dR-hamXQ}RCOphXFI%@P~%x}|l0bWt;Wyh#CXSoU-7Y4uf# zJ6W5uKH;57Ow{u#ZILljSXbJZfahdP4lx$H<2-9On0tImww$GpRRvKw@5>eY;9d05 zO8-)!1B{GoRf!?0hP|k2Ta{%swt;hANv(fx|1g)p|MRTLbAf7(+5e_n3;P&dBe6F+ zhwQ+NT<^*KBVA^6u4C|f2>&Db++ts?+(_0zXNXVE;UU3M&>JCZ-kv`u*hk@9;_)Ax zN82aNACS|K=kZsC4*=Ig7TcwV{hNy)32H7DUy|5Q6w5x0uaYMA7ks+wu(|SS-2xuo zdJx}|?6u-U61(_I1-jB=!NKCoCL`9k;Z=0RSK{Z}dOmlIK^@={UXd{dSy3;%E;!wb z&l?V^tvUEqzKYY?SH%yJ*EfXh2{9jZqZeqf2cW|;6hBmn*aoAom5_jM8i|d7$7aA=CweNJ2Ywj8Y6f~0e=mNOKk(#4-UH6Ap3}bQ zsnx7k;gPNBp*z~awL*6seYJb?a5Yei&C$tvIS2i8o<0aq(#wlHiVp&xiX#*KDr^%+ zEbT-_d&&D^CqW-{$KLmJU+_uT>O5XnIz22GnvdJtn;uWL^PAI z#TBZQNdgoyFp$L!Z36@~Vb~(oCS^%NA_XQaQQV5JED_DhQcFA2(;fmS3Q;tAw6>?G zh*SZ?dejnow0XbRGYO*gczA#3{NDHX`MiHTpJ%)G`?~M@+OLHVWhN}VnQx={_fhrY zh0j$#yzu4L`~8Pn?|1yHb*{g(q61vVxhlAv z_}2oDz9@Q~5gVvF_M~lwK1v*XFl09!3VYHy&cM;CBe*BV5ll3B%T(}EWuWR)pz)Pu zik^;Lt~16vcJyHQII^dhu&H;=(1ag83b2Rq2EyVwe<$emi zmDA|yfF~L_powoXuEP5f9B>-?DI=r)*Kt65w;e$yxh<@nJj5uKsPoT|*J>1%T;zOm*qr}zIKG^aBZM=%}USTb`O#hexn zjPeySr-jSR|2U_Pf1Fc4`DIRvm`C&>F6&qcjwNGjw(-3jSy3A}i`10{ z|K83u0ywc!FZ*xpd2EUtMWaF^xLSCJZ&$ld%3=?4lr9LJr*7w6i$bD9vKD;pBDBa~ zfPsz0*MvrwmV_2_#}|Xpj_sU-7n?~V_|eDoS>Ul8dzU8Kl}>%byWfvMd7gi{l>#x*9yIn2x z!(KEZl*%Q2fY;YiK_Bd;^FlrOvdM?(Dq{SAphy4n;w?XbAQ^BLcoX#Txzl7Aul7wF=1 zUIy1H`JchhX*{8{7m!DMs5j!wzDHiZ_Hb&@SJqKFZ@(j_d5PgKKV*A&Yi@RiX2{o@ z;Ze3^Me1vYZ`o34l;7EmK7-(p(vD_q?OINBr&-!s){_TBWo%(x$cO zhc=qyL)7JJNr-$Cza!0AF8mhS_2%SA{Y_b<$xw5eZcq$5W$nL@t8J<3mQ51g?_YD2^|}G7Q7*jZ>KVZmW_N{ZR$;|fbRcUruJU)pS3Qu zt&xAgN+Z5oW1(Wa4?rKwgwK|T(K$~cZkzB6pTlQReX`o_CU2-J-k?tn|AWzYrdk$& zlhsA=sCy>j&yaDEe|^h-658T+h3m0fgFj)!1F0{J{Il_|o_P~IZHU@$UL!EoicZx; z=2Z5AkN>*j?Vhw+@w`wEts2YoKEa8gbFAo*jbyz#l8(CHfbTjw?hUt#^Yc7DU4WtZ zqukGBtk;gBLx%mU?|tFTrVoNQ>(bQ~aS2K6BT3lGAN^9*k7hVE#~AWuY(T%jm3JN< z`+3#sdjsDtz-!Kol*8`Y>khkRuXCc;eGGoy$O9YQhq1SSZ&7m21z)RgPI#Yc3G8Q2 z^S~FF)GIf9jJ@3k4Q=?3CY_boqGH1{igsJ@za#s|uG`mL_FJwJ?cvHDc(Z>A*CwvLT)EF~^)KPt#I=_z^BMeTaaD8e;5x8r ztN#R7)Dv6%!?-f>=}^d3&1JHWZ`r{;s`tv~B;g@|mm#AybXVIIXPW{{ZB!KEStvnu zf;Ti2c}p^~mO^9%Nz3B&j41BjDovfFgy5MPJ`~sWb%pKdojn<){BoVGHe3&1AddJX zU7R%>M)|Yp_hcZSem(0<{Gj~Z_@2-xXJZQ2YSxaFz1qeas*0?e=!d*x$8z4h$~-i)=d5G>SdcZm z27HK4x&@td$3uhjzS-7~fkDY5>E4IOvkPA-?8}W^;ICDjp%>V1W&RwDO{L6VmD%9m z;J+gHVx75tHuIPmr37UzP4@ByQN0h$&xB?#8tD&JI&_yR^}qWS-akm6MkKV z&&e3)X-cDJi#$9+v@J@5e1s?%M7E4{KvrT-X9mBTiAnkYq{oM}uSt@0$e2ItWDFj z;6m`BH|Wy^Y@yC`#>64(y3&Ww(Q#INVfXlLBflDJawIW-E4eeLqpA)ZyxfMMDJQ&u zvg#>I+S5#V)y%8FnY1gwSV`NU+g#E<{IDfR8;g>xy0o+EP^7HYCRf<#(}AjS-_@^2 z4poh-I`UQh->nhW}McQ|-GVQyh{o_@p{Ud4re3fbcOxo*Tx;zix zIS$uXkE^=*D%0Lf+V5Ru+V7F}`(LH4Wd2t&_ZiIlQ09CN^9`?WdIs}c`Tgo~a%R-m zDMl>M`h$vrXUh5aqB$qjaZ5x8q5ed744ehtM;pLD4E}TvXl%t~Dfg z{}X(|?Ce|(j?n<_V(=pP_UZ}~yza=m2bq7v!M>q}!k+heA^W(#se;3aPx3wB42{WZ z`!t>#Z+bM`GB!8dQq?!K6Ih+b)pF}_&ouDtma0CT6}H%5Z2y(HvCyL}_@^8J?0eWt z8g4-x&hu)X>#s}pca&pktUl7*->}0tsyg&z>_4$D{@lHD zxit^H4e{TVcQlYTriHOwPaBSbd$jCWH?t*rptjT1R}&oS&9Ot`_n3=3PH>KP@TBt- z75w|L-(myhjOgI!xh`zUy?B1#gI(Z27tzHV{fmw6i}=>Lh;JSFhJIe|`TZN+yUllX z#{D#{^c);V?5-B-gtT4S>ZSF6$CidB=*x2$)F{Z2DJ{z6r`o%VlC301DL zd@1AfTA%}7oLyTT?+UZW)HYY;bqZf))-WZ%dDX_;`44Y zlO{cLr8Y-vErT}`uPig^t{<561K?w&ajj+VqObMtivC8PoC*E)4^}Sk&hv!!a6(U> zzU1i}sjuHx^?g;(vajmVd-7aS&ya7cXX#h0NLGK^>sb{G4109rzPC|d(O@Eh->S@D3{S$DK3x6x~>}TvAx}mk~ z&y3xl%lqij4F0}GS_Qo$HeNt0uPrn zR?gQX+CPFbZ6|f?HN!7QR?2y%Lth%U&!fkcdoJ>CD>AG|{ou>Ac{_aJNSjUiHL)u^ z_tD?y;SkN8-tJV&8&P_;)K7UwY0K&)X~%l4hVxwPrFR{? zgZ(egu$dNp7@>P!#c!zKIO}cb?0-2SEc=1X@1Cq;4?gJh7S>S>m)KXINq6csl=u3> zgYz7$&poQcSB|Ws1Kg$#e`1S%S?*a_Q4j*x(q!JG{oBojo|ff|FYgz)B6DTZu@9-O zV_!VVKgah>#`uE+Y9hy5*DF@rgAKlnvFK$`FfJ6FCTUi8RX_OEw4 zlnuG^9Nx3uy)!E}G!)veKyj9=eWxq`Z}1$24iB-X?lI?vT9WaZ$MXsPwJcHEf5UU9 zq^VNc_wc-xGzC%4^i%)Rl`s3T^yfDjsw8b;_Gz3(EFAzy820cuF2Y?;Wf~zO@$FzLh&DpLu+DO;mSj) zK@&WB@xLuR-wJpP5@$=b;KPeN;)_SVe_LGe4D>FpCN8+-|4!WtWIE3exv^mf=jLbd zu`a>$+0NN1{4DV&{dFD|Hig2ws_GxI41Y9ieY7H1U2fehItXr6Z9}gMJ%vd8wWr~? zSo*Kbt;WYm@yJ}m_fG&CN%(rHjBykDSYVBJtgNL4wnxM3z!_RtFXzag*ekQ8mHA5S zmBpR8>*eLHaL?ebwp1$I2UU*SKcI44rNX~HmE#tv77dy@{*6bX!f&jJ3Lje+6@INU zO8kV?zP{fa-tVd$cQhluc8F^0&{*UDT$kA(JfM2op+OJY$|}b0Lr1A7CO3QrK4J}R zjKxM?;yEbjRhF}do@d>__tDY?#A0(c>J(`f4G5mHgwJ&6nqvSS4qO z5*tu0w(LV}SWg-@tl06wmp;kmT!l;o z{|=e+pZ6Eef5Bfpf4AR>{;<#<%KYv8LvAwvIlofB$FG0~fVXsbX_rxt)e#hW@Em>~ zjvDQ8(4O^f=rO~#vV}2#mK(c}d02#xtnz_5B}p>;Xl53eZv;`l+Qqmu6MZD zBfsK5HfK3Q^TiJcW7k%Oe2%qpjq2>|%eaako#H`X@gCP4_5?j;;Hz2jp~mZe;1S*+ z{3Qa{8*w^A4e%Qqh$}p0$u+ftvx?rzlpEsV^+lc=(lQzvnnpLAHY>iy7bAIg5tscm z^U;_UiS@Y$ywwB$rI9^M@;4+aMvPu-rtkzK-=1W>M#1M39$z%Pz8Ka#Wv0qrAbGZe zPai&z*e3gjy#I5@O$`m;W}fIfQa!@&tIF%loahNQRL$u0ls$~E>i!0=uXqr$bKq?| zzV8Iy8h{n!KkKd`OX3RmowpS}pXiJUpYK(8GLmKlvH4`J9SszPjxml$;O|X`PbR*c zXLR$#D(tWyk*{zL=#g_>HRyHtV0jnKPM_d6>DYYAe=|0tA}1(>zvukBSqI*<8D8>b z))Irlm3I;TUb-pH=SppN0~0x0;fd|P2A-Hn0lqeJR|BJ4E8KBI-@u2nQZg!jgL^If zJ#1bK{$48ly;-ccA>I7FMXV1=H{~{Q8r=wqxh#gyNQmb19@2Irz zcV}`2Cefdv;F(#RkIBf5GT}dYmnC9<_rtf9#e?Fpqw;x47xDiL|Iec8Ht$+ZYz}JS z?*ZFBE`dvg}+zb&EG@6%+O^}6t!(Ay2BFxG)XZ9Kj6xO$2XU;z7PCv$17nxAcX_w-Nr09lWC!{tas#4lj<}1l!3WnGRWbWofnSx?>$owr}{{DMB zy@B04y$LIu3uS&dtJrrtTG1d+^oXzA$f5 zNaO&C=$fR%({n+GfKy+#A$Lx)=@;gW3PBUsZUEmE{+aOf#CGmD=i+*Jc{^j2n>Ikt zpM_Vr6If_rUgcS6>Lb8JJ9P;UaU}Sd@C0|hT>JAkR2Mu|S7R4Ez7w>IbLdeA`dzaa zd*P{Oa0e8L|UKMc~xH;ex3KE8?ER{ALC zX@LHXXS^_m%kOE=S@0EUQ=QA(avwZLbh4&D|IAi{&;C3-o?-BK?t{lu2ao6eP22rd zq!C@L`$!`^`TIzdOqwdvpz8%+a=ZWeK1xfSE8~B#JeBe?{|C!6QC`;nV0mWB+kXY0 z?mwT)9pG_weXcSscwyaut4s?nSvTk^(}H`}xn^Ef|LgkvsO16X92>mp7nt*t%=rc8 z9KRg!@zbZDV9pm`0T&N+!-eqpuY`*S1TF@-Tk0rF;Ad`ky1Cuy>bl`)F6nl=1~Z=b zTxI(T{s-HqUuFA-(7t=Gu6^qMaXstm1^T>$@q2+jU%9SiY+g_+$6ejp8rV`7eUI+o9{+JX>L6#>mUtWMu zBy=qG)CzrO<;>WN@6KmlNeRBo*)bnKtH+?>=k-(aPvUd8mu3wv#cyQ;bWIwx-9L9c z)bLF_eK0=N}c~uV{B@WR(c&inhZxCX?ys&OUc&qCD#Slg7Na8%(u9p9zfaeUJpNsbXVhhi+ zc}BMVOD8_PELU#w9y2bK7ExkJ9Ds~KJNn`NA{L4ypV>2cZWP` zv?er+5B#jrqy>Y$v|uxI6Zl%FDwmB6Ms8pTRGOwgG=N=irf} zQ|uCYw-SH7GVelD3M@&V;~7_cZM5~sI@aA3vpJi0(UXFXZu3t8T zkJhODwPtvPos3;idBxyWbHA4xZUnAHj-9IZ$gzz$ zK>kiz^%aZH(|FLzLL;+qQg6Zv6pnR{scD>KcncP894Pc=wI<&a2goiMVq_8 zp^p$xrvn^Xa2n~?cP{;nU1pql^_AP52!G`>UDL zBmY_yntXc$(ND%en>PuQ?OCG;^7nH(qfBKG?I; zJs#WgqysD6l}m@0Dy>=JO6I>(Rkg|^Nx?+LnEyS6=rYKhOaDCdFXb@2#OO@;O89?^ z&f;$7?&S^-F*<`g{6z4QB=C));1S8-2P^F=aS@f46!vM6#T2pk2<>h7c!m$X8opi; zJd{dwjEdl=e3QQ?|AfD1`~wG#@b~^v-!};y^}o{hmAqG{uV#+ut7Vznqg7;tg=Vp_ z>Z~*O?yP6OM)xcvF$F~jK;e7%o{Dh84~&>+SJ>DN=(G{!x_bCb;E9cRto~Gd#cfGhi2jI6`A5{ zzNNrhkoWq7u24#=!_^FJDc{i*!amAH9!+m5RN9Lqtry+1C6VXJ$SGxgPG)>WKfE{X z_`p0Mb#iI>qhcQ=-;3g1m-WZ$1K#jI-QfMasVSpD^u?O1%+jXLCUoSQvyAq2{-&w5 ztf`PID?Ze8BBIMCI-E^)hQ3>8gPE9g(swibu(yPl)y?lpj@W@&WIs-lbueBV>$?A!*Au0EMq2DGa_E20BeUubF{ zAn#_A0bA(V_AW95Kg<7et{e$XOwAy%zGm2wNfXeTGhj zUh7@qQQ*bQ#xAIb*CqU|LT8Ws&a9{4i#Hcy{$CB69rk*gZGHQ+UAa z4X+}G_CE4nnZAkhT=ex~si$#Uxu>DBAe5q7G#Q5`;9cyjB;HtL3^ZM6cs>d=6i&|n+)*mz(^H_hvWW-$_M!EIu zlh>A=D!myPvE1G_Ue=2Asf<1jM=qa&EWW8KCp3^gu4aApiSV{))x`6oIyAHGTP)a-fMjsFAf zwIs7A1>WmEVli5Fte&}xF|vRsSk=B-knh9Q!M=5Bf8Xm#CQs3h;LOA6Dt@ga|I_$4 zpMS3Lm6mV0tfd<)*AVLK5Fd^2m4l3(Lv#xOP)d9&;p5{ZQ?4eN6{% zr@lxY`QGP+W#6dh_HU`@_HWd)^m08-=G#M3jLwuerOAzMA!aYUqH-I43!{ zKck&Wa&o_NABe2^Z|((sGoI2WGw0Tf3E?#A=UhU6(5(l`xR@*Z#0lVunonfKGPm-t zVVGOLiGNx~RJe%m#YUf^^(J#J^Bt}CmvMpK5nJ*$_6m_%S{V<~F`o)9_c`}hM|nL9 z@WtFC6KXb9S_Fd@3DfGRGHJxVF zf)CN3ChBgc9?oh#Fq=!@6+Fq1m1pJtgRHzQTGLj*lYM~m!ei|f^nkm|ILbWly7fNJ zZrZ{=j-Nn7ULHty7;$^Ykf#A0`>@HXwVC^)r>prSb`7+KOX9l)%4UU%qu2QQfb+^a zPua0%=4oWxvPT%Pcad$&vsLyBY(r6?9{0CH_Ra_to4+8t(#5o4}}J#86lTtluc zK3D|L=*RnEk!xp}(Dj-DPA2E*jLy@`6jus(agiDS_r#wakIlLhJ~(o)+;yBMa;A%| zT^jEqr<@j@6@uOjH1DZ#KfLD&H+Xfe(0du+^dkF`wD_3SZlg>ot4(x~{mGjxQ*H}d z_Gg6Ay*2#WoM2BbwhavSlrMVo?9H7*19>X1sm-obYoQ4*D$oGK$+tzd1caU)ku%BA z*A{wKz6rf5`rF&O-;Z~{tLSYQdAQ5}S}S)H??xG@h=fN_l&#`P{K!{)f(uR=)Z|S zeSA@LY{S>6jI(EOWUSW_H&A?`_vh*v3mI#%kCAqj?tjWHz89t%^;rWC?Rnh21~`&& z&)y#ydy&bGC+%ALZke9E*@{dBf7Zcz#$DnL%~7mvg1ZY|5y7WsfLozU0bXI{%(DEz zv$p>gzHt|ODx@ok$CSYO_{nxN{ZZ0$%GMBZ7)5h4K!3Cc>J+C+<`g)?H>SrCc zum)?`S3Kyb%K8%gQes-CqRZA(rX3pZ3^d+&;P4D|-dbqPGw8CNL6=RwNgQVJVIj5_ z0*_PvkXCACtqWZsJcW7S{n=`qPiTQD(CU_qtZ*^3g6Q8jCP(s2{(~n}PkPY-Q68E6 zrGmbj@`&Y2f$0eD$r?H#couzYHe%hsCAh21^*qKRE#2$!!8aQ@qTJI~loDFNp0hx7 z4pd99X}>8P;5}f|j2KlTG73TqGECt#d=m!1^A_=M5i%F{(_lx2`DtCKRRZEcijvRO5jZ3P2i>JTvz_j zfYCMAAnz`*Zf>mW9xp5N2wXHDjLg@(blYb9WVab>Q+N}U3H)7b#V73WZaDR_{-?4& zYP#2gz_0Pl`Vm`I88;vB*@Ke{Pwf=+i3gf=9=tU#bZ};DM#~(B+A@n+E?(&5%-Ag6 z&AgjhmSn~owqpY8|6BD_4q|&;)wgpS^ueWX(MPd_Hil1|@nJ=~!G&wH(LE5K+T&He zC9Vl~@K1c1bN(872|rcshMtPne@%FvY7626`f@%=yOg};QeN{6WMnZ3_Q_MiXRv7& zyUJJNR_4Axul}}IVePuS66E5le15uPIH#g@;*J_uhW7afvZjZ1h!HuxhVClBJ!?m7NXhuKku-!S5t4=gI2+aW4$qJ@Vwh`yDaAj2d-l;0unJYUK;ji{H;)+NIh$-Um)b zN5{cOa|F+cUK{wpbTzI`^j6$0)U7MsDn2IQ|6R-gc7WTQ`HWEj9-rvFi{6bfHtcW0Yf7T;BcpA>Y103=DF1Bw zf1Y)9o;G~5{}-?+{0LtN|DC=cdPMm`Z2YC~`{=vEdF5AQ+ZutDRN8^B(%>0c*VKQO z{)?XOM*1)IMz#2pQow&I%CSd=U%8mL-q=Ls4KdA1-?OI{eTZ2l7q->9XTYC?|7P@G z=6MM8ZyT^6Iz%$}Y0-}00&ueC^jJLr{WU)w9AE9cMQoW1R7XJk#tEF*z6EXsW;z%< z@p)3S+?3}d-3TuEp3OXpE#|1QbEV=B?9H}9?qOeS=*>%52SQP;aY zFQ>52DmMzO3!IMxmfoa)u{S&QqxA3fn;iPt*v?zT_d|giXY@~ak)$`)L>Ki1@Ler; zsn?rYkAJwm;^sJDwYA5qu38`L%KwVoqxj}b@Q8aR!=sE=8bQ&g)j z1$eU(i(-gsDiM6JzN&X&r3hOes-Dc34bO3scYASt=)4fa`hv8?=S&7JGbP%mQxWgaU~bh zcfX9=^0>=78C0R_1VqF^5)U0v>2ZOZuQZp&5m*BQe42 z>7#}I)YJdJJ~1PFYR-(X#2M+aIp`cZCHxo47yjNR@OO*3x33TTcKwR-$Gqr%3QVZ3 zKDB0ZAK!My*BIBGj3Mn7JH%A{xCLBzrP0i!z1`pQ%Z_ljE@qE7dpoVe%e7FFAiN3E>`>C*V`4C2Od9# zb_oASGizEv?QPgwEoA>4ZgOB}GR*ydpR^HqWALV#FfpW*C=`~Th!Q&ME1qWOFK%318)*rOz8EZrD@_f zy|!F+b)>Nup6)xv&@cUURiDld@cEuKn$6m*uevkjWG+q(<{WpwRaO&g*DCMsmlp=^ z6V2W)KLG9pMr6GQ@bkB)D!%hYb3*91=H4MWkL#=QLvgAp=X~}k#TWexY#(S`)({v`b5AKMhy zA?`c4(3?-d-XLK~+Zgtq+dKOmzA^Yq+WZ;1rhl_}!}q|mSX$mop9#-mCima^y`g9M zCVY>x*l0XMj3BYo7|Z*ml?9>Q%<0(j=x)9KDE&C+(k0HMcd==`w8Esftr(Ekad#jz zpL9RX`ne{&(mw`b^qE=DXqMt=;O=S7GBipLaE1#%Atlko{Ym&q@(xb~+S`I3mLhbF z`Xgh#gp8Ir?Iqiwvra9u>Al#OUgaLcy`FnC_to5^xKHM8;=UU`m1TulkLCH-RkwG_ znl#o9Z8@HUJ^FH0FG^CWZ>mNd^$>B`0+v0M?o)G|Ut7DJp{`@V_dmf`llaK8hFe(Y zCyykSeRMRj?8CPb%l`6iV%Z0OOf37YIY0EGIS(2uw{tLi)>-Pzz*g@Z^))kBiLJ97 zO0_F)GIJp@+N7PUnKKJEjdq^v8LuYVM_dTq!g*!M@M+SnSlR_$RHCwHHB)yYe#oW1 zv$VDTihahAA7m;y#n?2Ritk-($eBb}9XV5dm9sMuz2;MH_95WKfW<)(y1d!^UTI76 zd!;+G-YeZz_+IJms`pCw)V)`__27G@+fKY!y50PT(z@h7loo+M88%c|eM9w(sb$!d zunl~w(cCw5<2Y~ldpCK**NyOoZ6knJbX_eT?C9%mY#6}Wo{S#nHSiL|K0O88wZ1Bz za{=0N4?JUYeCKEUpG^FbdgMhvLSJ&0*t8GxhHn_;4GVr|gWkLb`>;*U-r9}DsiC#N zTs1KF1$MgC%XEDQ^Zf|EpR)VtdNy_+6QCXOGwP~Feisex_#w1off^k^UL612?rQgk z(2gHMJIc3@!LPFSSG%99x}$S#X`1*WtKCaq8=3QR@UukL`+uM#@E7FptEhJq^=?96 z?G|`afBT*n8uO0Op%goD-ZyFatdmvlSUsP$vWfU(@@*4%tJtoH47Zw?u&dk-{p9uD z@Jqyf{fK`rIpg$?_A=m6IVt|;i6OXy~ALT7utxnIX@_M;5+=4W$NawUcK_-_Qa z5u2mut8zoeSg8X#5X<3VXA9o^`%nMo5laP(%gcQ!u zdUFnVSH-w*^YwJKvfm=wA^vAH@J#4|w?vO68{b4z!7tY!2g(Mwo-)j)ABJ{-cZcnR zX5iMMA5adzA;{S(u}vbhg!rt9e1|!e-W4Bl9G-GbLiy@JC}zUx$}MQ}*+S;?0|J|Fpp zgTrqjZ?+nQH@n&mekpP2!$$lo_&I-jpjSg@fdyZqR(y`y@DZ&we0k7R`zdxSpP{!a za_oQb6%nK9ei^yzpWT-;bVjmlfY9vS*G5Kc1p)abE)t zY#H-t*oW+~oISo6efn%=Ywi^5VfPH=j&_sg+rsx6zE88h=7#r`+dyB0=jBPSai7jp z${fg?#qXBj+-IRBg$6>eHvU4L#4WR?z7O6GuQWImxn<7Qbl-T+(sXHWpIWVQC_8hqNURcbeKd08tL!7+~$i~0nysH5HGExj^{NnL&4!p!RX z7Zz4Ou&^56W9iu5V}CzAmpk_N)0c3^ufp_A-0`h2T}5wD;=7r!y_WcHW_&70e77k4 zD)hv6ORpY0J%e~|8QkY^pToV1dlmQRi0`()dbaN$S%szU!u#1}n4d{KOEUQB|Q zC%7tel)q4TO(sWBQ?<6U^aZ<{;7;D(z^CR$E{Pw43nEQXPTw>FeF+6Bu(~3>YzB>;iRP zOjc?|_eWq%?S?Vm*0jq$IqR%#?to&)C#M6Soa^0*q|tz};lNl><`x+1fp4j=(tt4s zFt+|1FlIIUXbPPw`W7DQ>!AKX@#)f7;O$C3pwg!%>VGCW zCWAJy>7JZEdB}nih9pJw??g^Lh&pWe+w1^NC6CY~v%yCsUfmr0dsV^zncF@0_u&(B z71tp{ZxnrN{9abeW$4as72WGatGEur535U=?a%5xWO^ZfF!A$vaU1kUfokdSGN-~n z?4T~%8$3(B!UG~EaNAn;*#*q$PTGi#LEce#5-nV>XH3%?qqDWO%q?{0#r^DiV}Wza zohx%&p(hVyPWk-hJ95J@=GL(%DDOBpw9u75;p{qq{@DBA{ypEu!Z(p`1?XP|Sx**O zixrWWYoe*>|+_2?NTkguOn)&#y!DO&pI$IL@^C1Xq3&0KQ!2oGX5>#30S^a!?Q zKl?u*USb9@dU1*&XH`+lPR1llkr{sgN81% z`Lf^Yt|~LJ2`qfK^4~@}jr4ZTo!Eviv&^+05&L|H*&RCmn5p4pTyz6_+glRz{SxV0bERD%tj==?jFgQv4^LQWX$3iv-6}IHS7&Hyl`X8S}L)RW~^k6N0=PG z*XhSBVleMw%wjK8=C%y7`F4XlJ50p1%$TknQynF1!PQ0X^UX0-|0+IVcgG(y!LR(u zkn3*%|M_%?%qy{=AMl3D`JPJKK1j}J7@#U+w=wVU<7Z9aTk1be|2qZtrUOrBh*7Ps z!tc8!P;;g$Ut~oI)G1|X>_?ZtTQ9>LWoYmNPvM)*qE?LUfw`2jqR!L6kjVe%@jaUu zownkS$7JItI(7e$(w=X`7Y>4Jjy1j?|HgM~_ji2hel2}$_xEVN_o)~oWgF$Vy1!eA zA>xU^R+8u(uue{2XT-w}f4OuTYj7%S(Z`z1W^GQv-~8kT)~c~?yAGb?k0=w)1Rn9s8m@J9&1tj@`@iS;-GrbX+dG6x9KXQx+&Eujy6O8riW6XNnQQR<8nZK2!UVm4)@JQ{Mp~C1X@g6@JL_p}Ot1dh0KP}^yY$UPQ#>+G z&ycsLeLsi4C1pNCJ&|&$hw^^f%dH7tEt1ZuKQqf47M|Ll$s5rpO3?oVKdgt(CS|sG z99qlGz0r+%LOXkNoZg6jU1}QRgbvUV`W_jFXS8XIK`Oe7`&4-0XS?!80AsADu^$s( zVJfoMd91rHmrep6CjyrffX^)8G!yvEAYOvnbMEy1PMdvnQ6zT!XV5y4{a)5BF@LMv z#6zqMTaamrOw_WR3;xbn)zXIUVXbu*=YPfi+Y-$c<2V;KF6CQF7J7blV;Z(r4d@)` z%n1J!p1~#fFn{fOGWV}tFFg1uc-l5|S%bx%!Ty8(1HSIIo86r!&`Xzn$8u|2o`JK0 zcMAQO3M^$0^Jv)*Ir2o8C+(HA;4I_|v+tSrh49$2iN`o^dTMY!dW6%^CtTR4wQM^2 zg^ST8l=#3o(34`n4vwXtLEk5UZeccf*6{0rGvr`Cc>3VWhOCg7jp>2?Phy+fH?a0V z(A|h!(W4H8{;~wxz#*2H`ui+Phvb!uPYuqb?dF-CnJ`%`pIkgS=L%Z;hBjMsrgY!nMu;Pcrs=tAbnPY`bAI)`C{J?;lRdW8E zAEV$4%9(e}$9YQ}onwVcNn$eh$B2;;Lk`|mD>us5}CbMPk<5|R* z&S>f3LG{F)?TPWLz=Kk}%0i|31wZlb{MGpMeI6dr16i%N6=vj2VPUI@eMzH&mu?X z+YG+Vik|EVSf_ZrilRAJ?eWj?5rYoiVIh3H0JaFTr?-~91Z>CrW{>}6?seFy-^Y5{ zA-q3$jbc;%A>YNfOO-uZucl4nEAkQA)EsNq*U=`iEw3Vttc{)gUqrq-{>%E<&Hp{d zKbO9N?|Zl;ou714=5!;SS2kGSBnRJ&viucjHzeX7j${5Wh^)#o)k#?YC)a7!-?@jl2+SHtG(hd5LZ-I1G zpT9iX(4B$rpRk2BU9*3cyIge#nviETv8ILhSOA~D?R;1MXW%j8fyn?dvwC1-s?e&O zUjidFl(`NW&$?Ge1Q$hnJ<|T&z%6YybRW@&)b{|xiL_%Bb7S~91un&J>EekQhQ7G? z@!7?m6ww*SAI+FJeH3G`mHkT2>2&zG0?X&dD*B>~Opo|PJt}(P>}e7GN*8%t$o|R0 z{uU`m@@&vXevdp8v%2$a)ONG)Me;C)W0*tsJJDN>)PsCn)(_toWlS*gv?N8+pD_|{?XZ4w_$8>H`y4{~Ka_Qps*D(HVtKU%PhKYJ5x z8vBFpJhfUaeUIdEk;kQrU#JTD9%-lec3N-vcq$n?>8pC^yOiHkmyDOBTTlNZbs^(N zZW0(f(IY;QT4-x6eLsu;u%5a^hu6r%7#L}3x5!(XkUPavUJZS38e!LoEfO#KX`)~H zpTUl=^&7B*Zq@zWuoJX@1v>&Wv(Rmt!`_m_zLDfr7k;&W)cJ?v6MQ!NMl$=veBgZ= zm++bV!1@ICfM_nUNv(#TB)%DCo@Pz_f#*4R(xXgqS_!_w#Fi}yc|ay>#i=;8S@;W+ zxT=Nt7@ON?q9+qr3=Ej$d5Jic)trH=NEg87?mqm7?Z;Q`DntGdZTM9!#D`cCy#MwOFvJR<(Jw9Hg{l;1*kE9#Py_r2?1m9&1 zCy{RW=vdx+JJieTSKbFYM)FVco;At^HkgyE8$^{CEi7tbMm;&imiXY#_d&icm53-&F9c`UqI)4!a4UTx(8D~4(m46R9xl-p=^Ie@%r<|$K zkN?0sxLO{)@aMr-@{5plO~Ie}kqtHR&f#8<{jKU;(H}Zjj(uGDRyQ_9^tcpCk|6JxczH5 zCv$WPoaGcai=woSdmr3VaL-g^Q)%k*U)XO$Z~2Fn@%|B2@w+(7(|s#*=YIc@Tx5u& zK0H`~&m3jre#QHx%-c!EU?skhHi3gaZmZ6%!$-{P)^`rn)BA$}vUVZ#S|pT>VhX45}e*T(!n3F$v^Bn-S|aNbkpvHDL6V)ag; zldu=q%ylVqvj+ddz(@MuYx3-KpoaymcM1EP^4?0x!^ENcm8q}qUF7x0u2)J#u7+%( zwv#$?*h?1Q{&?<;+xI^B?uy-;-~IdSxBrM-@{V5KM+zw$7zvug~{aJ`Pc8s?fxhG zjb8NoC!Y6zwkqs@i051IH}LDew@$wlGk*Hsn_uwnMfdO0{k#2_xc4XTre~k`&)l-z zzf|fN{E%ZAWj?dzIsa3X_udoR{k?w{_V+j5WKp8?y4WvK7$@@Z4NuiE%bQ*_-ZM5vBj@A#Z3I z<&HhL%KfJ$QTht#zX*-!(gpYZr1fd{)8rqWHA8zd3%#Yxd$a+RbAzIk-9TAOuthE( z>P=sAU=@0O7GfAb<{pb3*l76Y^eIRBH>96ZGW>IFw0V{oD}B+=E>!yX-oam!z-}76 zoXn`c!Sv$KZoA03xe~7Dq04)(@MwTHh5y)9{-?6SuByScUoM>pO*sLYG7FkA6Phvu zn(~klpH=p-Ey6!$trQ{4Dn@qou{kPLgHD}FT$JsG--vR6nynlvT9v*35s4Zm}`so~T<_Ji?TAGD@;J@`hd zo%%=OrsVuAcf-du@uD+&oOPZsCd2d6T~)cm9$PkT182R?4H z`hLYczl$tiY@7CSe<$;H?N``*G?;p8?;ykeHUH(`C1m+~xjy6nuT3_s(bQLa9A4Zf zriAV?qPok7GRk+j zUorLaeafD@*VIpY(UhQV!k6bI&gV$H zNaGnh?b>4GGuSZ3CpK7gBk!{4JfSsv_LYqkNkP~ z74qj1Uz0x{miSNFRPu~Kj$8n*SNuhZEkcj%`%3w98uI4=dX#}-hu!FbYd-P~C*L&W z&-=*hQES{j_~1SLLvQshY2Q@pl(@@BJlI9hKk29Ruf>pY#~Si=k!$X|qJQL#=yZ2~ zzp{T*yT3{Q&YELW{rDRdo!VW<*Qev#={$9u8w*}de5)h0(@#4$boWp6a>bs%r*7$= z)cbY$`fF|*`6iQZ9r^t9?->27QP;UA!(SFzbt-h$G~$Xi%J`{v-xSsAEA||A3!UXb z4k>#_2WQ_|_KYp~GdsXDx^WT{Dfe2=LAj6OF1`&#KhWn@YDaO2&U_Lv>kR*fJoo66 zd^n(d0sal=mrN;Nuq5Ze{9y;~b4)sLzvF=e4>&d+SnSv_0l$Y_C%K%Hw)wYKZ}lGl z4?h7NAGPW^!|&m7Sz5{Cn|t_y)2gzY-T5#dQH5MLXAM z_@~a)BW}&48N3Lwld?0m<%~(u?ZKHAkhb1o3xKhJOQJc^hOVn^pfw{x`PO}F@y zg{BifZ~8U^w|AoNU8#*)F>3SqFMs&<`I14%=i_|4NGCp9!L#uJ?bOerPj?>uDU0gx ziEW-ULvigUri9o)N=ykCx}E8%Z@5)>(@FTz+lQWJI(o7D&@&rBY>5`yF=V2WZaJ{d zJ;dcrKil=QcndMXW6^Kry~Ki_%2=tBy*rM2&vV}e4cJBB&fdOZ=05bPTJS?Dz8V&@ z_q&jLq_a;Z4QqFQfb64vHo6D+xAQW72ataZO*-JtRMgZc>=<;ZEq(#;m zrLXt;wWH{}Vkaj4x(y$_GoY`;|1thl!i!~|7<5>dG~aOYpMic9JHykQ zYiqE%3=FVp#hicTz`Tb18UEzVIK~G*mcGTvdoF^jZJ-^Cm;)J~TH0O0Sm8S`Ri)iY zirqJR*nW4C5|>)e_@u9_bf*&oaSP+4GCl_wpA4nay^`@sy5@j;JL8j%J|-}fC%zWb zy*XO?&?D|@%AK3^l6#}#>>hW!Z!Y7$p}X9;l^fh!Xou+52N;h4HW$!cdDu?qX~E5fqz{brG$^sU-1(;UIibyea*}O{hklZ zdyscc<#`>?*{p?Wl;Z&YUyo&72#hg*;uCq40cWuWpW?{!)Xmwze>U)s4Gyxyh%Kks zH)rF+c?#ov1o#(y5#o;e=8r?)$HUs2$bPhEi|91xwxHYW0RE4n7c^dt4YaU_k4Hb@ zFmUdnALSWJ`Wj?`p5+ZT(G46ApWVYA$eD!${;U zck1iU7`708zAxeu9KGkP`qtKObLPQ(6l4? zf4~x>_2PdfWt=2-*U9{!&FsR>jEVmvCI4dd*VP!Gth)e8B053>5PnJ6ltUn)r{q){OYg9lK(HsSn{7eiLs3O`dCW- zE60*_|1g$PhKyx*8Sq~M)l$b5V<~jCjOFB>u_Vve#?t=Hv5ab*!Z@}uj$;3w#yA!y zP0>8PB?hO}C$_jA`e$YSB+jKZQ30=u#QOVAx;qQoNANb0^YqAi;)oM=fxY}JzP(Rl z|2$lc)z%}U-*>|(&k>&SF{15E8|@MKMvweJY}~LxZW{vr*M+`N6Y*?w;Jw%?w&Z?X zzVE>f_z@lOBR(LGWR!h^Ckgz0*q?&&t0p{>3w<8{32W|C*4a((A1mDpp8lLE%J&3w z`=o&bN9*t05shr|NsaH?&CnX}lIHg&vo9hS1Xnij^%&%WcWRv`vvva9xUad7_WKpK zyl%WX@0iIJxU~C8_c47|=&N^KG}82pZlD)OHwdz1%1k|ja(`q>lTauSEu6gAP4On<8BkLVl2cgS_TJTlk| z8Y@C*i$(s;J#`LsU1-5M|H|kDKs0 z1djg#w85v#Y&&Wg*55(Nql)qe@s!)o~|U$C-i^>|H76q&*h!uNuob1=}*M>)`ndB%fo}w*pNL> ze-6=B&QjlX&^R|R_SB(&)L%vS`7w>}+79}&gETL2E`LIwmvAOwqY!@*nZ*N{KhQqm zJiVa6i!{Y(FVN1D=xv{bm$i>}Kd}2}?tS#bY zc(>S3uKRFEsbBS$y{^XkrtyrvPmbWKVizZ}d+W=dU@E*cA8FH|t)MO5vhDVk*~wGG zxwMvj-;O?lwp%F+@Z6kiY8QK&opmblx~)FSy69XPbRP#di?djRAFRs?u^$<>^P`uU z@@k0%J6=&s>cE4|CYJ`SmQ#*MvJwAtX6lNf%wfQ`*<@~u`NM~$@M+QACjJ3qB6Qts z+L;Njw?I)!GPlByqpYFWZ-157sqIkypXEOQO!VZBrrv8~oZ3Oki21{b%k@*Yi#B{~ z{oCP*i;rT;$c-|oZBFtFuaWqyn(Gf2O4C=E6OtY9L4Z?qpCe^NWpUOiy(N$IWd?nD zv&<7Zft;H;sU43G*RAl=WS?q;mm%XKZH$Rg+J{m03rdXEr9=mUoJ)tknDzFg&aS=Y z`|*zst?(D*+bVa_MHjju=H+3*mwI~_92%IhpgL+$+zzfoTqn6ID&{)2Rov$|P;tNG zM8yM+9bVcfzH_065}^%x=men=qM#AV6=%osPrLGWUD2j!+9YH43b5X#!~{C9CwZPW zJ^xvxP1nRkYtawoS!`?kU{h*Hfpf244-&#+AIr`b$|6W!UnGkAYFKuet>u z;}|#Fy~I(jx*I=6+_U=O!_cB>tZ~6}hi`+fkF^Dg(P>>k88&pML^o{-W`gq;BM|0!Z!i> z-^3T9y#aK*_tEAn+bcRISGIQn?e$aNV(KHFy4Z+bZtpzW+X&BM8gk1<+S_l z=YYL*VRw6lUh;{JDe}5(_!)86{3z9Gvj+B{dFZ9W_jqX@mo4foQZ7%;to141Z9HFDX-sVQyJdZZ}GAgxsw0YhYZPtG54HK)) z@PQ*^EOhoXp)*EEo7ZW!AJaD48^stG;2YAvr`qk9%eNx(WzpW%MxTwg&Y`W*wgZIa zWFNEJ0x{f&gKHOXmdW_Wbi+dvG{6k%+Rph14g0n6ZA4Zx&m+1}E44|qbrNlrz0L_N znz)WBae*VP8{Ar{H@r*Hd>?j?wa8SbBb&{}_fIyoy1-~47CMJEFQUz9?6xJO=(p&Y6qqNJ9D#1SmpYCp1AW=o9dUOcqk9%TkRMS; zBD72}8N?+S9d+WmpD_*eO}*|l?8yhG7Eq7qstWzP#jHHoY}({rU9RS>9`>p`u)J?K zJ#5i6Z1k{6fHv0k8p@iQ9ElPC&9bs7YYX*eo7cLtDKncgvVqHNu}?wY)iTVDO|j0i zrrBt}B~Tceqv^UP&&;3Lk<81m=`*lREgucv7MRi4Kf;Wmyesr&ZBb$9)_H{?iPO_F z2R6_ zUA}B|RMDMG?L~SEumQc~OB>4AVUs+WF`37|$@FWyNqNu)ytDx$^RSUm1K*UqO~8xz zF~k;ze%kcO8Iv_jG`26my6yAFb8URfp|1ibN2t4C|MYZt$%0eo?lyJaEWAI$;4RyEu7M6&4R0AghViZzo4(NuPy6qt z64~d3z8C(YWkn>fjr0*7cF|=Xb`g2CcqQKEVM0ioVlw4e{;RrjoO!MhHvP>nx^5Pp zF7>4gFZvX+02_J5C&*XrBo1D8JJ%8;Px$58E!ZN9|Gy+}j^(L%&X+sUFSh#dHymoL z!p9mors0pOY)E{HYc+oOGbbDZRLS()=xc$ruFR!j$uI9tAw^by+=JNvxAKzT-DNdWsS>}B9veK!ndi21H#r7jrY(fNAmNhN-Z-BKXzDQCA;nR+D z(#DygvDPfCHHlxJ!dkNfN33DPzEI#uTJghY<@<;0?_ULcX;mKgnN3NcGHGY;w&fNyS0#ErZ_~x!eb?D&Y z|ESFMSnD55Qm-34w147YuVv_9)tNXraZDoj;e*YVq`?KqM>Bt$JlO0UIXLPs%BU)y zPb23}O;l<%t_hU|zpW6|RPXO3 z-NcmSNIF&d-GpfG@8(LnXytcNmgK=J#|$0J`Ba;ofvp;s*e;lnlZmYM>z-R2Oc;^gON>hIey;HkUS4yYufntqraUV|F5u`o&r}Bk=J{DN`yJPbf?)aDG{zLz=!oU3gX7AnOqpHru z@4aVonM^JO6CogHCzAw70x3jLKuI%6L=kY1z)`DxCCLOx2n?5~fERKF(Xo~Zv}*N~ zn*oBPRV&Bl*W{1@;w9D^p`q=Ml7wquxQYVNSl;imX9i+Gtv!7|pVRkq{#c*2_HFI8 zp7pF}J?ptGzR~_V*HO&(<9T-i-!zf`o;>lda~zjj=Q<|wZ9U&jq@D?XEp!~)TVONs zY&UgO?Jc(b2j7-bPuaeuHap+t@%>rybL0#8CSz~Dt%y1-`xiJ~Z=LU`*k9zZ?_Wqg zv-y6$?RCGXha30OSMo!9?Y3Fu8GG|=Nfw9u>+sS8XRf@rt z5{rxtf1+Z=&%Ks)t#=r{+(Y@B1TYzT@aJ`Q_i+mAz5&4VctH}kvDZr>||D%p=0z+V&MZSCgV~!SbJ8&-| zKem67<05&*{zn|E$-@sUc0>gTYz5Abdf~f(TwwngNnpN^G>f!|B(N_c%_l7;<&hrI zQVgoV<(vgOAUPw+iVWj4_TN!fxo2QL8|QY-^TTH`sQK=Z+QK$qoWOjHKIfT>La(BjPsf0{ z=)@hR9Cmw&YG9P|rC^!>JlIL=+#ieNVt6!^z=GRrV`D~DNQl!~B=?s3@ zmx5X+b#bi%TLUmIA#Zy+yrz`00$#T{d)1JKwLKkHW8qmW_t)z0gx0L19HYMzQbW!= z!8PgJv+B>yH96$DT<;_`$h}?xHEsH{pqh5>W%7+xzW=FTO}1W-Npk85toaGoB~lJ7 zN&PA9uHt$l*NvnGdG~2!O&je#O!@HbC8^|LhliD<{u}tDfmdmyQIsc#cKxmxp6frBw*i`3DNXJOnQOMV;q9i+q9Z~2*9Cq2Nu`J}VKC8>qn2WM?RC4ZA# z0fui-ZXx}V>*J&j%Kqd5jmOZR--pSBn}_>s#kJK8B9`EwCYVck4{Y-wGR25409LE*CYVUTj_DxNL7o{i5}8 zN7Y|vI4;j?NbPEU(s6luL+ZKK1&+(J8d5)PUFgWzyU1pN{$1?Vkb3w)o@3O$CvEn< zkK4jq7TVs}x4`!4{SB#E2WC4u`!=KwZk^@me5fIHOzRxS7b6-{A81|d_+k|G8XHm{ zr0%Z44XHnCebmu4q#^a^t&cgnq8n0IwH7(L;u=y{w?5*q>|Fv4T&UOoY0F}0-YnbT zmdE(lqqa-$j<5MVq9HZqz@v`Or#7TsxTzs^+kwX%7cv`CTMiUDc0mV^PNrYM^i}3< z8s!7|j;PiGN9VAH)R@+6N9XO*wkI4FdmrIHkJ7INwmVy9@;~{9{IAG%jQ&>9j&srJ zU!^4FXcp$ZMRMkLhLp)I%!vbxV*p(A45?e0VIfP{OFXs5;SS>fSSf{}XbU|o@ z&|V*nNDtaERPN!!J=90Tg%+oCudLg9QA4tIoo&fS=z;tH%}BRNk{= zYb5hFoH_hWbXwUz-w_Uce02Bw(rdpVd0GW@wnT@u(B8kFUPnQ%Wh`=_%`z5i;RlD% z=Oo4;n8cpGDSMo?PR1ggT;Q#kax@*L&}R$uS;@@SpuMiHd3RJFkIRH6XF!|N=bpL! z9WSl^&ueJ)7qk4a;S0c)FA#f46Mm^d_>vo3m&?PN!>ln{dokxA1^axtz4~5bpG${c zP-^qh%LU!yq4P=5`RUO49ngICu%CoNyH_%PlCLK}{Troz0(5>NbbbzW{#p8Vs@U2| z>=2i{bDHr!b-$w1d7<&YhQ_s%`{?{Hey;jv;E>$VpHgtpt-MnE^ApFac#(s(|E z=XdiwiD&RtVfS!t|?`mmTWV;C6xp-iaW9(lG92Z-jwC!(Q>c~2< z&{4T>p{)zr^a}4j{MXrzSK!6!Tc2|L5o8#_^v$YUY_k$_`O{%dA63nI`sN) zg|24tpZlPh7sxOEb)MtxeT!`N{dR}4KiiSboR2%Oz)`->ZVNvE{|3(%{?~lR>n-zb z3!ppAEemW_`)4@DwakDA$#E#~aybWz9697hXyu_6yKVRWnf!aE?dbkldcOR?BfQ7; z{noE`!#`9oFLp@|Z3%$3RKR;wfZtUzU&t#G7H9+Y`%<=RcJ7x;4jm9$mLs{$3(6i^ zl&kZLq1?YhhlsIQtcJKx|HfLsmi?I<{3yg1yAXPm?WIGCDO;yM7I0r^OpcfK_^yTK z_{uej*_xb5g1?sAi2f~2H5DG_tgqR`nhIt<6?UVzk|-mSa|41p2I~y1=cr{3+#VGE@M26Twwi2av8tJ$d3VY;rCum6!x9?Cor@^KO`>5ar%-73}d{sL*OTH5kCvj z{fZ8;t^B5%w(|a@ex#_Hju))DFZz&pGUog&q|}ah|%UkPuyF0*(T2HJw}`4445hsb{y`t=>IRELpW`W zPa-%?Ft#64MyoeA^&h1zi~)`g_LK0y&7I_}3p~6mXLd=9vSBm$A8|Iaq+CY1Fg0UO zA+(LYH5Wqfq>oRYdaAOC@>0qloq4MA|MFbk{|p}14SwZA>&gvkb0jn_m%Zd-@|Eys zCD5AyXw=itoB_}&-ySlW`zG$mK5{pE#_e2h<~osgp?mBjmpYb0%Y^3}D(^y@gf1%Z zYhOW+9_Bht-yas+TBRQ7&jH@Mn{Ovjhm-G~4-70-k&9%HZhDBnLuJ#X{fhx=73#OnG=Pq9jiGT=#@C^$*UwcEAE*x$VY-=$7smq#1>xqt7zJk4R~cV)jR zzRKy~$R6lSp`oAiJ)T8U9!+}_lqhLqjghlf;lXu&=9~7M@9}Q$_m|d0G#7v8o>O7Z z*&De1qkB#ZwA}*D@r=Xw+jFYWs3@Z<@HwaId(H@V%puM_1OH?4^Xt}=grAZ9rp{La zPnj>+TDjYy*J128+n#=~rtRrIq=!g-Ne_@BNk1apSVK&gPd4{y{dC3tW1lMOtY2;k z%GTB<&elvy-6#2t?|hoDSgsfIf=L->5n zM1DG(_pH2kyMMLNwrQjvkS-WQlTJcQzc7X*bwc+p+{L%$0o9^!6FP^D7jd@2w-ATG zeVRDa)+}Y(>8F+2qxhr2qq$B%Lr?JiboxI8n!e?W;>r`y?g>i3#7W53meK!{#z9FX z(7}LzQ{EZ?o%@jZg7>H)!6#l*^jH$7sP}ndaJH(-xzmAb`oB*6ng4tCsmc@3^y!?- zacb}y>}G?AFQXJn8xnaJUC_DXy!$?~+xt6aTi@Y^P zIhP3^y3(xNO6;OfB)-kgPoLUzg7KQ78l5K?!*p^ZsYU72G#a1ocb7a?_qu7Y7QQ1E zIf?bF;kV7#hA&sT=Kp1JU9)Mpmcsp;@eQ1E+X5|xnDh%OtX;?W*I@H3c$`^UAkU>- zL0MwaVi%~#4gQIu+$#2dr9sh68vQxPn74xmhgkO{HsB@Juy+a;cM(4ztcrPGwQ}d= zL7XN1&fX*XSHNxNy&@}@^}2<09|>8Q$ic$4ky=Q7?Zq|y3avHgTh7}e_kCu&W#8wv`}SS1 z5nQI`#)rzbF8LtNIby1H?kx|c&s|ixyw{7QTGC%g7x_Mlb!H6dLDKCDi)&IJx7IA$ zchUCZzDu^+eVw+y?EAttDmSfW%B!W>(}96Q-S3-iT{yg7{C-b`D$*`{Hpex%AAv&IjtsOcRXPVmI zox@uA@!6;L9B1Ce7tHTE&b*5wU*1P~OXev2k}mIW8+BK8Ds$s~XvoReGOH)3;mq}L z=P7WExRhJkZnt(;5gTq3vEj1DS!+@=FGVE5mq)Y-@OICUK7#(A?!3IMRS9yRO0#y#{@xrKR>^vg=yC--7>-k)*GSNRN;flO824(LM!+pZ)uet>0CT z;QjT+!!swAXm3)_Thw!m_IxVyiuOeC{}kFYl6*Jqk-bzE^Qwxvs(^bHZK`5kRnev@ zU|B_*WDL+lG*7{NzG!tT_VbnWkLrRe0B3QF+=jQ=T>u+Ug%PLt7h@ zt!=cj4+9VUqVl!)(d_*iaB3#s&Orv{EzylldMbTSDE;^W zZ8jD-x&jL3c0CQA%%Y8f1wZI2hlkzCzS~%k+$D3d2E4slK(z~4Z7e_ zd42)&*sje;WG#R}F_!TW49zqd9vd7raWOFA|$~>xHG2p`>bwjhZ&D`lC>@ z^U%+VYubAIqhkZ{ns>gG zR&xga>7!E4Z^k}X;#@`>Lfs9uoEM}9H9Z#+;!LKUhw|rkEhBEza@MAq!2f7|vfj@P z^s{_fwBFA(h9LJk`na8Qj08^4si8^tz-I`(I|DBvz9s^XGtegCC4@f3{9n$Yh9;il zo#Ezir_tb{iGJ`ALKEkB*KV=p>Ar5CXWhOa>-O^L-?(lsV%_$iz395@c9D0@mUUI) z$$HjoVz#mmZTyb)I)e4u|1U+~xn94+`k=r^&Z6z-;diI25rt-OO?X@7o+M`nYG0EY z5o`j!D)=mZ*&R=de~WT!ajdf7WU#e!J?ET=&ZdMqgw9Ak^6V7Pgm%j_`N!=%e{bPa zmDTC+m+&_e)+sJG|0!f_<++><=Zo<<4my4pbbKH(5uvMhA`20^Itv+y(AAa5V1=#< zPI~6B%wL(;GWTR&&(~gKUJpdJvXS@iLZ)(-d;zkQoB3`PGPFm?J+fDkmxzo+WU;b$ z5gCfeQy$SQ`RMaVc2Wh&a%t@kGDvn(1<4YWHaD(!*_`Jr$X1c5M8i*)Ad{*NGC6~R z89wX!I`^Kz)O38=8b4jtx`@+OrE!HHm8}^Fmuq{@LW*Mi{iR`73vA42U z$sUufZ8qL_O-zr{MC<|h=5l!${`7Yvn;nmg_AX?#cj8Y!4uATdGTsk#8Ly1PGcpd+ zKH$$8A6t;&b6(btt%~%M-B}2*t43N ztn^RU$!#Z-(OTJRHDk*@oHmhVNjEV}%|%r}uAZBz`+A0unosHn}2sK<`>q@5Ux)lra zHg<7doyaCKn9CxMS|74wX!mQ82l<{!{bCcnMlrb$>AJ0m!r8?0_vy2aFb{7A55CpE;8gt$pxkt$VG?n0=eh`uG$O; z-4iKzu9H*Z#v4nd&lJO zTz7{@7bWo0Vc_-0iDdmL&LCDcJeI5ziOg-8f3g>G6BEg&!}5KH+((y3%lw8uy5v1< zyPPM`KSeXIEznCPXzq1sWkUn&N;M*wNT7XlqY;S^;eqditNxTG0*m)ZOhv zr{~k%eG@%Bi+=B4fu8C%1mL02Q{8?58fs?Uo?w9w3M$rZy95ur(@gk~Z>6DPGpO4N zGT-G)Bhl4)>;u$m>;p!ElRo=^5EC{6%z44ZQsT*%6Hoqs`W*J@>jZW&A`ig7Q}p~j zX`}Fq!e1SayNh{yC-Zk4I{iE5GN1Jry$R^t(y;AxQ-{Q_JHh@$MR%Wpj3*YG%?x-n ziz!BzBS<|a&Z7V7jjiQc_&p=G3nopUJsPP7I!m#05?$FyCD6H= zvhZw!SW{o*9z5Lt+GN5Dc-DGZpFK92#CmWQd2KR}!3$qj!*$!A^T^{zsu94{W0$#2 ziEwVXp*Y!R(t+l57hV<{W!IZIgO|aIi%1ZxEec1Q4>G9bD z{j+Q^kD)II4!S<<7`)(iRdFjFm!}ErEd@n&vH3;U*kB$*?l)Zx)OBLFu#Ss=);;*l zi9UYP+$SsVVJ}rP_wmZBb7_b^mqeE)x^p=XVY<~5GY}hSeNQB?_LYaJVa|4RkB87b zeizLgri3}qAu~Kb<$pe`KT=iKb~Vf`x<}zh@Tqkx#4-B=@Uj%l1J?7dfi-%5U>&Bz zx&~OUAr_s!Ux#k`V%lA`f%Vu`$+;Xo`KoU^r(-;{It(3~kMHVfHzoX(@LiIxA@6B3 z6>18DclGdH!tcEf-xUt66WdtqsVB)9m{HKdNXq}qcU`ra`u`K(CH7KhynL6~`iQO6 zMCNd?i8JHjy^ytCm-ov34&LkQwo+>0v+!OgjB1j|V%K=-w3~gB*h+cMVGVK$?dWA9 zHXOW{;NHK={wW+9Ec;rK0a)Ri*b_DtdSRH;V-GdK%YUixDLIN#&sl{F+@q9fw_yt< z{Le(}pXS21&ciM>nE5#$K4uF1PcZzEicHypuZ-dG$LliS#Vq*6=(d}ziBexXzB6ak zP&q@r8GWlB|MeBJ@q^`4@JnT zmvG-^40DF@4QHx1Pc;s3Dy9gh60S7=f;5(WAn~ap#m+%=^3X)xjw;G%2$px&7|m`g zG4i7qeqHt^Je%fSa}J}&EK)UR4)ke0^l264N4oKBi@Eo|JlpmCXb!;ZSD@z;Kbphn z@zM-8x!aJftb%V?ivGz1SI@lv8F1ZD=CN_Iz=H|jwk*icxxvq)-|+EexnWk_ru*;V z-$b@`AXDU9LAs4o8hf)X#Cf^wr3;6l3&K+zHd;IX1`oH&;Kw*~uGin;L$gZtb1r~? zEBY7U-zwnWfP>Dz9YzmwSq;!-VuLU8>LU@>&i{IEwDWW9*9J1@eq&8&lDg9iXVkr*`a2Kq zm|nM&fB5C|ALvOgK6gE7N~2M!=d8r~ZH7M11IB(%{@+||@N+jJ>k5abiC~Ub!#DmK zx^M=*aef)Tf0SK{(TR@KC1Wi#;!fzpG3diF=$r8G-RZ+LojyeB^q~maHIlZ9osy46 zh%J)P2=T?*P3&)>5n^i@6UKQO;=c&bp9W95gIsKMgx?X{ILYrO_ucDDAKJmALw^Sz zy`c7So&%50{|n$z3%*#Fk=+SzdO_w6>yYSL_OVaSDOdy^ExHDeuqgtM`dq;y;*Y(Y zv-no<=$5+suvcw0E9Zs~$3bBC_Irbzm)P6Al#$T%7pZgh<8?2q{hhfx1%Dm~e;)rv z{AmYwRB$ND=;yp>2z2t_<}_m;9ewM_Pb=-02tnd3a_+S|&qf#a&AV~O(C*L2>CelC#xqw-@Wu7;SSI&Q=3-yg`4f!I7yQF& zG&?P-*||BuG|?dP8RXdo2d32Khh^!u*tA=3{}6xE#1Q&WLLcVvefNI24I$2nv|IY4 zh-_z!$M@F&{~>(gDdv)#7x^5x@*I5(38u__@dvKZ`(@GY#HUyKCGF0mUp}AT3cX)f zpU=>rmkss#`gZTvqu91C&d91YVF!mSuQ2JI7yFC7VWIaNagh<7qR+pAXFRi~zf0o1 ziXDZ>f!dY~trHoL0UPW>cq-YmW#i|IFK|+d8Zyy>UQxx*Hy)a1Mdq}|>*q^c8=Z!r z6O0r;YM~>KQ_g@N%7A_nhp#!Ki!!u06W`u4%6Cv+MtMEY<^7|yN#qahrlv`Iq4OeF z`mCFu?6WR2qQ&W1PH5M*%Xm^`wiJmh}m-{Rw&8{)CKuJ}8A zd^1>!>{j;aimLmRM-%TZi5Osqj7m}r@#dn@S&2;P9JIs=4yY%etW05TGw>{f^3EV5 z?SeN6|8D>u_V%6iDlj{KPgz#My_@uS0zyAjXhcSW1zBFK*7kNl{b=Hhw_OgXZ~HQ! zezCtY61`CKba=rs;4bz;Vlz`q^2q0{Z=O7Klj|oI)pe5j{+vtBn-1Pm*1NbSbHIAr zvH`E!mSYnlK3@l)Q6{}RV59BV*aRJ>jNh+o<1=d}_10duz0UP1bf=>G5`Cbqb70Lp zLERIur4t$?@^d%;C_v{I%RVmSnY82y&^VFdl+wp&BeFB%0DjJX=}Y!N=(j$Rb)o(8 zo%P45XGl8s*ul?d4eh;g;i)}Qv@>dp#BoF}G{r>&$YT78w&c>7kCoXyZLkalT@>z-gQ$5|Mz2P2Rb z8l&88#G6*qW3-ztUw&%|d(1YzZKs}t_%6trw08EAx?=cWnO_3C7+_Oy2ET3hla(j1 zKX!8#PKN*0^NW1vpxqJ5eB(?bJGNiGGtw+8OD1QK?4%0P3~YmDrCV#(?X}o;?2WY@ z+8bxf;VfRYCEjNDFWV}%l!@s|bI@0pw-p;r?l$oJ?qE}s1-n)8TP-V`4NnuJrGuxX zg-K#(L!UTXmvP?(yjYK>L}AyTI#-VCcRqf z7hQ|A!BT(^1a-$0B-9C<+t?!?y@zG(#y}SP!8zPJB&obpaj`8qWcfoJn3Ewpi{_76xhcfXI&44cx zU;g)X+o9|Xjza&F<>3zIe*XNo7pmTVj~}rrE8);4&vk-D%lT+Zy@mHSzw}bpirP&J z4ZJ6N5!3v)vy6H<4mx4cHX9non239-!mH?Y?0kD+_vbmk$kOZ4zg6DO^3|jAZRskb zYy6MOvU2eOTS0D@ylYuj9{G&FOsUPj)6-Vd*^T;l3jd$^#gy7vKg_Dl|JxLN%@ksA z-=xE@1lT1&lQthTj`>gUV7#~d8_ELTGq-;azgXjq&7ZNZ$QeJE;88DL!=v`Ow3+rs z;Kz1jcxA2fN>;rYSeZ&TWhubMv?8lE=(#L8OEFmBa(7US76M-xV;YLj%BC!VIl-{B zArBbqm6f+@F^R&%-KOK8_{vCo#ZN?ZDlt*nnm;^~|8(a2%&gk?;EVDN)-iJS`bB(B zF5w$;9y(VFzPBBnSFa?*XmQlX8I)t9?Z(^qZ^`GwvsMhi0&u=f3ep~6Mz~E~A9vqSXSVj-= z^e-V%Yn!UnOS|&Zln7Jx?RqRSbJdFeLGWkNui%@pVNA1j26eh>6NuA04g4|z$0*LI z=tm5gPUL0%8DF!pUsGbB(tLa#`+=`A_K5B0@u^DZC~VK%@Z2Zx?YSG-+3{gP)ro39 z=kZLX^N;wFMLS$=C1xEVc5D)I|@GebiCT} zsrVU*Pqy%}>fS9&Es4b3VZGs8r{3EP5zfR=i`GK^iZQ}zM&CN!7+F{{g#OIK*4AsY zCNx!e(dYQzi6*7~_#UNRt~;Qu$2qqrNi{Uzi%mrmv@o4qd{-a9&SKg%b`~bDokif+ z>@0?fT?IPQA7E#Jt%Yv4CNX6shD_l<%g*Ai9(ES^ON*U__$}*p7Q{{vI}5Q#yT;Cf z_z7ZX(Tbgf&(1<@E_&Ko`0Up1!*=6(b{1kI_g!`t^ReIfSFp24MBZ-_o(Fwt$ELfh z)9~-(1{SzFQ5mvK@Yxw9y|y=xZyf9Bi-1YMr_q-M6p3xATig4K3rt)+(HV0 zJ`@|E59n^AGd;RnA8n9WoZV@{zZ~qLW82}4W6;HZ8_eI3^|{fr=F#`8XMk@a@I4NE z?*_h>ZuC~hKzypzz3X(CMys3`1U%sZdy8$$8qTh;FpkQ~oAou-w>J6KBOgugzP1V- zzl86FVmH>S;mMj3W6?U^UDN+O{98V2s2V<2Un6B*ZJ%nbk0bwV`d!tZ<6CmXZmkbu zZ5!YIi>&;LP5K(xk(*U3Ykm+sORUZ(#cJzWPt#dvrM)6!ivKWHD<&pxlT(>?sFzYN zvb>*}Z){R$W!CF_8GAAxpJb8sm^Cwh=JKrk)1Le3@S=wBRO)3;^UO;9vB;fdEpIDQ z>aECz+6tBW5@b9asL$7_aaQ-q)E_y*3l|Bat38GfJ_e2l~~l6ZI>`|hsZ2JN|UzqM23 zmKRyGzx-`AU^=RfB4!-(6qk#F* zGtQk)Zf8KoH-5B5Ls#Y!95{hbX{^MnF%8rF=yw^gFtVr02u({iz=x#sZmj4+yFHK7 zpOI}ZLlE5Yo+)%IcO^#@0! z*Ncsq1-xz_rq-K+Bb_%k2fChl>4mIk7F6kb9C?16{cr@xm?;{XZ$UrueNJD zKFT|h8+g7A+9LaRKlHS+H<$Q^#@*3%nbdQb`*MAVJs|skeczq@W#Fy9!UyXk=>CS; z4)*79{4ZYHF#88}pFppq4>1kw37@#N?l|KiYsR4>Ydt}1r>*--eq8~&o?!l+`$R$A zI_9t7ViNoRG!_47`Y{O_CHG}sTl!HCWvS}|aWk@IO#pWH@V&t91bbGw*L|;=&3GV} z@YoCD_oVZ-PUbhbxenQa)VCJ7f{bOKW}_8P@-@lx! zll)8Wb^n*O+rNrVKe=ZBx+eKgqxU}z{HM)ZuZeG^Zuyt|N9jjwO4&mQ?K*mOuc^>) ziTOdqXQy%_`x?FpLiW-|oG&>GS>SmV821kUp%#oE8|OMK;GBVJLxG{0vpJ@#A%%xn zqkqEudyO&b1$}#-{3JSpm18oT-L)kNh;VTJ-*FkrQ6VmTNxtQ41)$2e0YBj{9j! zZ@2iv=c=J*yAr}XMz=hR#;;oLzpCH!bDyMK#kbpe{|x0c#pph*zo)p*>DPYlv*gt-j{ zm40rm-@&y!mwS!e19zv0oJGzLjApExet&t|3FILYpiw6ZiCutNukRPD2~FRCE=%U}PI9U5Jo~(Ke1t-w+hHVh5n1i5M}61_LzmE3 z5RY`1Cm!ih8i<{{m0AG+{Ru>lZZ$9 zJbTeF_T$aqZS<6i-k-lZvgZ;2!UvVZTbQ+szKc=HndY z7;HXzdG!=R$Hms8lz5~Ak@>!kUSf4OJ;jUPLr?Jo_I%yrk#1#wC_YWHH}u3KB|g

RqoLxw9hn%U?olF>)bQA3*6vF?6TEK+oXx~?LcwKjygvc`gMJo8ufq)E&t*>nBm z+*6epz`uFA5Z_;D-L9YARa3FD6d&Z$$-90QShEYC<%*SMT$gd3R`U_Eo-@=Va&@r> zYhZnygdMaS-e^uxh|{c^n<{8iJanW28GeO&uP&FbP{Zr6hjPh!%l=TOS10!oe*yY; z54u_LDPq27$+;V?yz{}fHNU_)c}j_)uhWmY9Q$#g%knWga&*^5uB~e17JsF$lXak} zit9TSf2TXn+BpmRmBBk>(d&G;BU;JD49&{V$E(LPm5S4WK z%V};YuV$_Kk>cn4p)sSOWtY> zbRVP~Yc!b442C2l^|rFk4dPil_gne)82Ml&(5y1HcPW8Mh6PVmZl{j(^4#e8Pmv+g zd`yW*+RnF!^zZ!Khso`VpZUCEOgi_3(iw-JdXs8wawGp6s2V43WbJ#GG?G{d6V$#* zPJ{JL_bjFJVKpL2WB_jD0TY6PoqJT)Zq~*{K@rZT^Z$|M?zMU0TIAd%$hrN5PP3o9 zoTw~NUb;N(Ro0t|h8S%IsU!wFfDZ?fr)Xz)uIyitpQ6cn(*`afFZkre;0UMxm)81# zFVpLH^L`bnfp6a78}|OLwK4J9{2eR%zxrW3XBtJgOTon%@Y7On_0RB!NA6$6|2pCO z&O`epCP=_!Yh9pu5W1ql+CZaHKQQxNt_R}7KUj-1hSznXKiFW6(cU5P58bvlMaVp&;yiOj z-k+|R^fPWF)TpKhf})&8Bl}?1T_f!=8t;XVmU4Jq6#6A;gUpk5_P_?kqceCF*j60h zw6ILB6R@cO=7)RzR=+OeI)Z(l-5|0oVu@0hB`Q{{K*#bbIu`jx_=exIZf-RyBL&W} z^mPe1Z!cV;|Jz1@VyG%#DweW_dOk?(uH=Vsq>iMr222bRK*iEYbyf}3O7wNp$ zKf+tZ93#deHUNTGqoH{^UO|H|v0u&uuY5E(54_3)uY5E(uP0v3qA#$LYY$(ZHWi$T z0=M!Q8==2>@Nszt5B<$Egx6tv=8`rGUiD*5(B&<=JUWN=URHho>XYq=TxB9-mtSnH z6xj}X%mpILF>p_KJc)6^em-l0HAlci_FUt%a=hIn3)cc*PR_X$}r@2B|?!zIxMHV?@7_E3zSQ zKb?IidJA3Ws7%kSuV$`110Ax+J{x>||HJ39-aqTTPO#|x5!g##L_evwdrt^40D`up zBcILejb2vTNAl@h)6uVH_V%=`-P^VpZ`&qJ3DNcG(k_+%Nqc;H^aSA4_N+$-7lhu* z*Cqq|GO-bmGY9m&E4;WG&fcHz+r4_jp!u7!L{=blLiVc#=&aJv?X2U!31(&F!7rxN zXP}STLVurqf78ND-sPO8q+I5HaRhQQ^zXs+QRL6yXHe58+ zi*7uFJ-oudCZNYmI`p<)pIloLkc$PPXG6bMEP7$iJ#_OQb6kjvJxFu98eL}y%&Zsx zIoXqxf@9*torzp*B73Wlh!B_G=gMUN3xSgZE*K~4ez2vc=6BVG)MJ0L*q-hh?3lH8 zuT_mLpO$7G(X_zPurIt zvDWXVe>0;7VVgBbdp99od-`)j{ie}_v;fl}?I`(je`CFm50Q04hsDQl>w0aG&zOOC zx)*13T_U)mf=>dQJD{J3&<*-OlvyvbGv7FrV&5gSLdQAAU=ZJ1_}|^YFmaFfn)b{@ z*3rn=vUeKk(+3CeZUygVjAkuj&Sp@~Wjs27ZBRt0OCQ%iZ(4Zhhd-{rgRvQ>zc1@n zymsh^1M1^ct?p39kL%-kRzW-T`x$aysXuh*kL&%q-@jAtM~lCcZsU;ykA1y(8iHGw zjW>R;SQ;Xy_||i9cg8edF#2uz9J+ppwNTdO&#uu2_t*8o{m=&oc1@|hj7;S<=ICW? zU)R$n=*=es!KnnJM{iq#Tr4}o;Oa012CK+Yqz%QhjkRmCZm8YF9<^f*I?J6=u0(j& z*{sFHl=Q?|0skbd4t(^rFuI~tLG&D!u={h7iuwMOifw~;R5HzRA+IN6rXk}JJb0b;IB3Dr%Guz+YvqRKkdHTKm9TcIpBd+gj3~puacsu^7)K`h zXwKFM%OJLhUDAtOOZsiQEhAxFn4LT~VIAe1u-s)zm&A&)_|_`mH`|QuSGqx8tK>fg z{z1-Q{-uP^(PO3S>nSkPb)v)=9jeUNh7ME~%UULULxP-BS8TdTaHoM$j`m}G zgP`>%z*jf85fWbg-|9oIf9Y6hf4aB*!mml3cd1|InAopji{KKQ=3xHyt$i5h@lBLI ztfk+F`R*S|@>3ZAT-Z7}L%18+j#HtBtnvB?Q4o=ZIcIhI$$ zd$GRSGRRqzZFX`yc?Ed|xrOnQF|?D?pZQ@;sf_2cv>I%+TtZXC=Ro+K258-N$BBOq z9oVo~?3r`CYm~JcEqM&v9pTA_(B2iXS+&oszfZTFQFy-{o>0~|-@2oEzn625MAtAE z+#k=k!q*{RUvSS*h#B70|%?k!A)zx!;C0TTSYD{Z9PR>pXY45 zGqhFCHd=5`*vr}6&mlIF<#0)DTS0c6#hjHKcf-`=f$OdHDM4z}pn~~zF@|tw_$$`r z!KT65?$Lv_yNGEj`QX{}>t=cHg%2oBe%f2!Rr-b;x?r#e};hMw`H(Mh$U_ zo~xL#Z6t2l3T)FhGgjU8okAP4XTw*(&nT=FK0aJ{ZHM#J)1Jv1L7&^$L+IM6a6KA-Ai?zl zbf02F@d4|l(4>5Hobu0*9=I;?vqXL*^s;-KG4#^gT+O$M?X2|%!`Iqud1mR{I9Ku9 ze{_Bd{~&Wz+AU)$?QXl$ZuM*JHu3IvwLKRZXZD++t_s%pW#F@{qleI&%9yo1-I&_$ zY)oAnpww_a?=^Oc?UC?9J7eI@#$l&;2X=~?*ePaUrj-68zZn;24Y*px`n?@IZ6h92AoXl~D&*z+O##l` z=w2QmuYJn=^2U3NFaICvdCbt?*>bd`wgmr}MpIVu&hV+p@2s`fix15pwSUu>=plY* zzR5Y(7~E869^lll)%Y*7=KM4FYq1+UVC>&?*`T@qhCFHv1!F`&J66?29>Ej$+-Z1tUGMU}%AqHnk zxy(~0e$BC!<(~4+R_<4L%H>jCrk8iae;f@c9eWHuL1YFwjP)`8Av!Pdg}(p~aFI29 z5dKCR^GDUaYqHk+XoP-kv)0|^r3vpU)_NbU(4P@U-A6CDkF-y>54~KjHeZ@<053i9PriD>pEFWa*XQ5B^LJpEEjFNi;Q8P4+GFBV zHO)f{Z_#ZrdfIfpz?``p;PF%HX@jEMnXnf5Y%(tsS8KhOwu!u3z7_k#4q{&wuqO~* zt%d!5+;#T*K7Jn>sK=Cz#+FR+&ifAH^jW-neIGwx3LHv)>9w^j>1H4L`XId@`M>>T zmg$dP+hE%0qw&%gC%V$o0Bn3;je&>Ad02_c(QPBKWlXw!!&P2H^oGJ?nH$z*ooL;> zFde!qe7hU^k;`6M_A7JV2z8ZH7P&|1rdaPd_+OCxK!z}Cn632a4%av}~|2@Na+w!#~67D-L6 z#8d1VKG{ObAlXS)|1{z(diGN7Uj8l{*y{Y9)S-IzP{QM7vwsR|h|=!%@^Av@>`y~o z2eIvF=Ut(jJAO6L_1>>$jLE+_Y>bKhQ3>nbb~E+_eb@A_5E|=!PxuGnU55zo+KtEK z%x%5>`aY3&B_3x8wnxH)dwD$eggdtC{GIT2!q@fS=_-V;^U8>XpUd&~OV+sS^-FA< ztn^Lz9gCMA%kIX{`Q}3--^+X`_1b`o3@MiPW&KwYytobz_j|8As}*}IfBN%&K*<;* zc_Mt>``j~o&tW$Gn;J3x{RF47q~I#Qb?;SvtMmsRTXUUPtbY574V7+}j!e%W{{}D0 zkWq>3Nq-NyhuEu&tXOQL{q!>aw!D}7U}n9C?|ggV*Y3l|`0QQu=g79DZpGWL?EA23 zK(FlK55+!1><>-ucKX?K{e$l4@tp)0zEuuU9?)$1nxACqb z(4^q}!qG~0R=wasDeVgJW4&g796GYHHjHxsdp%Q;^^w}kDdYER_Q|i~Hz%??7v*@) zMqI8~-#ltmI+sJIH?eLEJZp3v2~;}$ofTPq(f@p&skr{LQqD5?fzHR(BEx$LnWg_T zACn?JF$B*NMfHYa3~o-{7z(nIlv={cvusTSZi-5pLthi z{j9;6_4ZMj^?4UF>SrLATSNaQVz)7H?trNS#}9PYp-aQIXF(179*H?HaIUrTe4w?n zsK386e0*O04U_Wfdz)_7iWV=ei%d$_>cc&F9|g z9np2asj$|qGLPV$5!&ilu_q06zsB10F|sVz6Z7=%-$6FN0Do@z|8V~C`s{&q2k^^j zHHNs;*;B|K)Sv!HA9~Y=8%!x$c+$<`j*1|aBm;N=|eOBspLN? zl;!Ry7 zk@|1`ac2Dp<6td|e#!N4^Kk84gth)t-i>%MufB+D>2H>z=wp=3c%-rR3SAYS_Bd~U zQUd&J=aHZ7HTXL#ZN)Vsb8m3`>`rUVeYp{iMY%URew$02_sXXy7m>D+#*kK5uAJOL zx=4yzwQ_P+%Sc;M%dNJzT1MHXfnSvwC1Y1*l#ac5-)P(FjIyzn8RcWEkh`EWIVb!_ z8h-F=p*<-910FtNw08am9PZ5+zB#+7?mX~Y0DPw8kEpAHZ<&&T-KgrX`&(~%e12Wv zi-NOxwSg=1z~4N*Z?6%He>!{18f4NkM$OFg2-cnRt(z7uGzdJwH={ZD5p*kyzXq4Q( z8(80v>78pp9+-m-{Cen{tS3IX&oJaZKW&d*Je_}((7zncHoopVsqh4!*f zbk)#DV%cMF6y&zhK9P%vOf#APp6>SFUckqI{7e2TF~$#}hl~qo94m5~JmhVhVH+m0 zwhBqe+C=6iayC2iwhHocgt8uuFWeW zlz6Q6XP&AN`O+P<*(W3PwYj^DP}*E3ZT=qp%bYfR-Uj%`T($Lk$su>hH{WwC%lHO4 z(z#OXU1aPOcr_bqsGGh^+@X{7{W)@hLk)QnwjRVUBNk7n4ik|BHmX0aJJNSMfZBd%b@cKH?2{%SIJnkZ#Z9{grYb9&-gwRRz%FS8&T!eNH2?`1> zX3i8MZ!h+aq2OG9#&8bu-DIl)+%xtVyO1sGzbA}DzPkf_7dQ#Ni|ua={QN2EuJI3X z{(u;tA0g)@)_Rl3l69ESkFp*xk$L`Wj%tRh<~+Z1F*NFv${&Na-mry;C@}2#XR%L*JYjw z+$YIAqkf6eKNOh{a?2(&|5AZ_8EqH+vheJ>j}-n-_t5sa%mvZC>urb5$-8$y;?Yy5 zv*z7hQF3MParctri^X5ata$M21T=0q{X!>|)%`yB_%*zf{h5s6NxQ$x!g?Y779H|w zAihO-7+WEn>_JRZJ$j<$h*+Zhud4KJk6PVfA; zFkWV^gNJ6-%Dl%HaawS;r#z8$Zpccb>%?IHL^uBP$ARk!XqFrLC3O4{|2r{Qtv&+2 zoE)Z9A7$hYR5mQ zj1+mf=|SZdeeVt}TK6Ml)%vu=kitlfa`%;FV9;X2RzG|Iog5q&Ba7_(l5EkvYH>1Z`O{rYvg( za*mEoe$^t&T7kS@zrJ1R?BL%bixxkn3Gk5}nMPNTYH%IL7s+fvM$I!5v48Y?;ARl_ zjt>c_?ihyugM0@*n!;bdA&55KB=Y}WezrEwXwL_>B5S;jF_SSE4}UG=-v1tDYTSmnUo4sPDt)gOICw`QwM1(yRc2iA|E%+X2y^mh@gopSq3g0KX7{SvO_)Z=l zl36Wyd6>BBoUhBdBRl4J^<=hh(rGASuRzKmiL5PK%Bt6PiTNE(`(y<3$zRrRFm2*yBW6qq$f8itABk#yw;A7Pjv-M+D^~P)s zyAre2|8dTI#h%`C#!Ye+-t zFS#%0lK6bM*Wi!c(}#N(KHd^5{{nvD*Yn}-OB{Zm4|n%-uD|W<5ew&Kq_^bg=UL17 z)iXI`#7-W-*&|22XOd)a7ReF)3=+;J;p`DPhqg-2UM5zyoYf^~^Z9eei054E9R2+2 zQr34%g6HfJ3-4IGXOeizp0h_R#MhQHVXt?_^+(-ewu+7U@wmy!Ygwb`sGNN~%G$XV zJM)rnIODqXJI=V4I9amh%Nf`3JbK*Lq3}3skk`t*bF+`S8ne~xwDHd~$i+?vg*gQu z8<1!3_!l_e`V9T?#cUP1`cU|pLV+Laz-!oUi%ebDKbSmcT(bw&?RVkFM)sVyV(W&G zJyP-w-!yOWHIjKN@ARCv24aJqWl!BR*0Pm(+4iz$-X3G#az=evTU<%%bmrU-nOlRH zXR~-GmAOj{20i|Q_|VAt^x5RTbAuN0zHjcnMEMtd^E=Xd%FJ6^1@%;s*O80=O%vsl zr0#RKg*XZ_uP%7!uACXOn>pY+M@Y_$dADVjP0q2GGwMHSS!lb!+?7}jZ*w-i9;+eF zGtd9ZT)o)x6#HwtL(Zbn&+}n^zQf!ZM0|#g)O(A5PW_{{f9IU~V|yR9ea^i8yya1w zekKj{pknVLTMB0f$$9j0K8^VD$h>ag{Q8-kQ-73sD(Bl|wB*|Ef_7AR&j=b!8^f8u zdaMR~jO?5%=YpQ-IrF!IYdNP_&Z766SA6Xp6h2(e5o*-q;Y)eGrt0SiNqLsme&v3i zR(hpu*Uy|*`PMgo+s}A>M7}nE@w3$DFL9TB_~(naAhGw$y2V|VYhSztDGR;$zVmki zIDZ=1DIWf%IIi7i@beq2d7vU#z*o&-9^ym#0ON@5%P2!Z1A0bZ= zn@M=*Qe+h0$rrw>c1XeEHVlU{mO;s>@IH+8?^3x zad&?Bo9$PlzqkFW=&pVG>aXdD%A+s&_7NS#R`l&9gr^lAO}BZAgQteKzX~t$?Nqmv z{WoAHIv&}Rch?;b!CzK%qCxyi;3c-DvEKnNpYC&W`Sfe{lclVAqD$+pKf9c%Hh(tR zhz#0~Sfi@zGhKJzBfcmy=r;N+`>Zvhi)W98uYb~-ZaQJHB@>c|!(3$YAFy|N2$&Sd^L&c;xyAFm4B5R|Ey>y@&xi8-Uhnfn@ALj5TPneKfafE5 zKH2*`#q)eef->z{p8tnDzk}yC@AGuebHfz}?~>7eaXr zdsjC;Yn(}AmY9g*d%Z?g-6y#xZU2eCf**B=8UA1tI9Vz9UGjeGJ+u2MuG06d_Y93u zTxF6E$G%8%WP}xx-%IRJ@(})e56>i?;l|R2vAdB!Z%W5T2btAwZ2vcjF95Pbz1)ah z4tCdixm3#Wo^raB2YTOW7<+W@M%!|c=YU%xLlpg7ni}k0dnbD+)!ZaDGC>OQB~*iR zBCtBazpeL(JQttU-s#CX>~BQhoQv)vE;2ni20w>%5+agiCs z$-u8lzvt1tOPpHS9|_+m`*zVY^br`Be190r_@j^2VO&W5H5gm|J{S)L#>)lf^A*?A z0(07NkJSV7*Bcwgh98J=yaDV}4pq4jD?KDI?*384%xR|XB@yu8HXG-JvlbSnk?|o(8t6B zcMI`N(-{{T6M?;qhaG+)9{78%<2_>{{tiJ)^?R1^O#K^utkAdUd2ei9dyG#G?fMmS z#Ju+VkB`j1WRqun+<~6)nVl$hE}nVt_soHw<1>`;St;YS5}mk=7wwwNeDTOOdu{my zxMneC=NY>q#w@F4gzY@zSHzg=w<)$ z#QLQtmodh7Fvg{ftCHZEJEAX)4bNbXd9FS44Zk(!ntV6VFO&Hu^DkEOe8)U|<|**t z4(?-H(rq4Q_Za7O$Y@5&I5&L%aTYo{H^?*2L&#+w&QAH~j`L8)xl+dcb;Y$x#+`Of z&b~VCpQSgBUCp@vk@4TgxUX)x#r8Qku#Iuo%izE^#$7Li1KSvPy$lX)W86LOw{m}w z_kAf3_P#IW;okS9oZ@}|0Ogy#?@M`vx7;}Pt(LcJtGnTYs>{Hb-^81~hR){r=6A-G z`EAkXa5`g0>|*cylyS{r3}x=ic*ps9=&Rh9xu34%iiZxzF~6k_c`se`smy!91K+je zQkOmGDK9-3cP%~WcP%|=$7Td!d!!k=hwr;4%6fV#*n=nN$vk+%I`q$^2R-p*D0s43 z@aAL1^)t!a6xYusKdZQ25ImwElS{7R(WS=5u~Drtj?U7?v13{-jxWHgsC{E>KWdG2 zNd9N=YfNjLUhV|H#3v_yw|L)|@~z(Yr98@04r)jpz3;cS7rWt|=!Et49sk2?@UGN{cbPr# z&a-aBLx()LCwM1x2%LdV#X*BS>$KfMrPlaCHc^y1`(u=2eT~kkvr}VW0h&0 ztY@ELrxwZnW^;tKwuRX7pBn>`?j}B40rA-+Uhn%)T30>(UV`&tU!@j5?WETXeVRVt z?1M%nRy*-)ziK&)YXWlJ6P&v<0og8gp`F5uo#4!Y*{8UU=9)7oPGJ8#f%6QG4hgIl zACu$gAKu%M;LPW2%mmhvs8V8!VjpKlu0)$ViLF+D5jnf~vqo@#1vbgmna1W3!~{N$ zY%rD>!FDq-%o5R2M&Y+g9Wh3wJ_cKGWo6mqn9P!~F@1^I#Qk(|Am(X9a?H*~&$FGS zV`GN-o)P=*Y5(My%$?rv%E!js<$0Eg?N-cBO?5XL=(y|C(GK`I;_oBNnPIZ$thja&b&;3nU<1_iOz(SWrAW3ivLu;#?s zC6Ch*db_erF5;)?GM#uWmS?fhuh^U5m8E z!AnNg9n|SXzb)%@8sdrZ9m79k`JYOC9nZg%l|OEyZo4fp1`faQQ1a0=KTaMG4}A8F zwSK`wYx1L0)02y^SuKU`SrU@8|HMwyl5nfmV!B1oFJR{@*L|?Lyp?>^(;3MZvDv(s zl%$QGH7+?S_!i2ewbAaoD3A1%=S`qILN8xT8l{ak$LQr0^C+z)=~nHrG1QNJX$s$_ zP|y8*H%i`ncf4Ll)Q}`?iT?c&w zG#l8;dXfWQU|}p4CP>{%{elGA${2|6zKnsLu|OWMK+Yh$51+^PKDd0#H1dmmt+iiH zwN^h8uDqrDrckGkR##tKp7s9g8}*nK{||E^GFEv@X!mCBzsG$QoXF>XKE5lm=80e0 z3C4K>xtq05d=}*Wt-Svs?~Bd4__=#xZ|vAQ^WTbV=8xO4HDf<}LB9bHPxXs@c$#0x z!}k4y9glMT7}txquGl}^@gmnRas3OftM;cje#dnk*Y#WrKcpm#B#j{5OcFk66zNuy z`0NNDMI82oF{IHX*~6uhBnIs5#1k#9iNA5j)*Z-t?xfx<>YYlxhmiNo;`$M;ALZJQ zJoCyQYrGsy| zq3o&21^051ZAe*sj|!(itNH&rbeiHTB9H+z{~YY6w!oWAfVR7N zR>-q#aKsz)BpJWXp+0`sGp6yPZ#gG6P9kF!nx=oxc_HF6lurNUebGIv;~l~0GVi}d z52)L9A^+9C0XJWxZ-S%pOys}0-~neqZM_q`yw{7D-SI*2vO7KqUUtU^!OMR(KIG{8 zT8})Leg7W4?Tr6c+Aeq?{qBwjGWI^*i;SJT{~A63PW(7>k#igAtHjTa8c~qzezXp)e}EvU+@t7g9q6s{D}R+1K5(?&lwl@v5)w7 z_7l@MGkxk@_7_*=-=hDR$oPx?<8JmL5<^7J$r0RC@m)|jS5y8gIw%YGMUEQ7eep;A zR)3tG5!d+Ra5mzCn&HZ{gYf%!71k=$m++)|6ZKC~|3q9?aBju67qdF{dT8Ph_9DkQ z|8oxGm4MBO_!Q1P_2iy>Y%s&Pre^9ZY!x5ES1Jsxk{{**&pu~w^aVQqFIm$iZ$%tyrvv<3>ltcPtzWX& zIb<+6U*rC3c=0TwxvLES^TJZ=mRtAU;54ixzAkP4Mpa%7px(Feov0{W()4WplBPxM zBNr83jZLB3E<9ywp8Wtm6s5+1uD#4*EjrtNEJ9hB3XiZDf0ym~qnl!f=Gs%ZKUbl+ zVhcw%g@5{drfcQ+hKKNd$ue5I62RL(8kJX{As?c&Yd7ICA?`os{s8x%aDS2e>jQ`Wq=WmfxffXE z#VzN!m!p{DZjSpoR&daxCFk&9RE(A^QR3FJa<4i(ILcJg;Tl;yY{6 zeP=5j#lXGzJK^34EIWwB_xlSEKQZ2@y==ix`V#o~HN0`&lMg4}y@mYptT&Y$J2)yF zW1A`+*EFqjjBDD@{WHd3X9c{;>QrJ|FcvxB(qUy-mxeF*y(M8=9w$ELXw}kEXR$bC z9h16@tUqDkF!-m>-C6WO_>oWHQ^1LEqaoLBBrj_2R5$*eVs50W z?}c?kOY7Hb_-vvt8U^1l0or;kbXNEuS!aCtA6aMa=luh`_pUQfbN_Sh-D{%oITJYC z^5}m4M|^vQ|MBuZ64zV!AK`n1CmL@TUus!bN`X-g`0zXW8_qwg;KEw`sbd%iX+vNs zWn{gTd6nc7mthe98pm3Ciuo`6p2SIzwN&^!w~wtx+_cjAo3Fyx7G0VAv;3#5q1o8~ z<$8Q=g-3`2t~Jnd;dk`T*^t!@r1jg;oO#e3M#<8|^%desU~rp9CJ?=~J~o;&1v?eR2E0v*xKgOIcff8>Zt> zrmRy1YmAYs-}7TXDQJ?l{3QFK0`@~*o%%_1xCy}BicEDbM{t$ateHT3OsNMJo5o!9tmDb--MoLgA;GEPR+zO(4S+p8qiWP6MqE`S*xTy zFP#YFKU090VQQ>h;yE2>d`C0iL-}vNl}nmr|I;zt7&+>bB~9yCXY%Mvg-QS3CH08^ zU8NG{?7*(M)If{@aN|5{pwN4{Kf>A~*B9UuKgaL!3+(*gxLIr3f#2w}vTpLPuNlbM z%{qLT_=hrQj({Vxqoe7Mnf|DC!~tEnjWLd;pWEO?b|~SJ-`CBfxaV8A=<;Je6I#Xk z&bPt90Q!<6T8Vr!Ai+?Bp0d+0?u{TJS^7rN53 z+KewFF{ga}uCb{}v35_HO&sy8>28~6*|T{4@L6YEbMc2uV9v?@MC`WI;WZhO199fC zeJ^ZQ)z%tv9IhiDB5OijOYQnJ>tjvYJ+-`f_bHOse4lYtd^91_XnAhb(x1bQ{! z#P|9<0`A_NhxZV6zFlC0kMK75e?va|MPf6mD<$Wl!I4Jaj_`g2uuElL9A!<7HOYDq ztLHtG*c<(M4}8(J^jO;und{xyZYPw-9{EHwE67H`;-4;x;O9Q z8_9o~-j{n3I~8x-E{XB5gWQYHUzU4uD|ShedvUwiC8@*l`SRF6z{|F==ASZJ(j~SY z{B!FVe4MlYNZc&>ch)=EXOhJksVaS+8Gb90it71Ix?dD0J&` zIK}}tH!ShTAP06dvexf{qZfX%b_qNMuA`{)+wdC#{D#&oTfO-ohTl5ixBfEt34Iax zRRBLG`ZwSgjqd9ofuHczo#;luxjr9ip_Af|-LpCk{GJ1z&j#OTf%iAF7seiLfB&5L zyZoT6T5IqA>8(er$@OCls5?GIX*`Cm>j=38+sRSXc3y3kJ>^B_%7sA9^;B-0>lJit zzVoWKVo>*kmI&(?nM(NnhXW%2xcsUGhv6?&`YZg4#B3;J-Vx_;VI1QX&oQ4d%bMsZ zBYX9c?lLjtk@lAH#~z|LQ<;#6&v-uji&A0%7rb8mOQC^LT9&HkQi%gU3-J39`@>Vcj}7SReJt~|Rl|2K!WHvF_$c;{ zVw0MP-RABXZ9@ItjkevY)lvVF)3*7}c!?$03Xac@f=+D$zcZy@uZLgE=N}v^OP|PB zv?mG_Yx>v-;%Q)e+WwaDnj>!+L(iPQR<|9)*E!)VbEcx;o=eQv5VwDJ_BVVS^A-^c zap|@Yd4JFJppX}DN^pi6lvVdAqwS$bqOjFd=D*KBZ-u^=5`z($?n2?e$I&loNB-?3 z|Hl7ic9oXCe7f}Em+NmD=Ny+l&be3Ux#u6nf3}x@JiB*;tyi@;&c3wK_G^6NpjtSW_}3m&VD`YL1%ag=^FWU9{=ISN{xftOt(oKelN==)ua& zPwB%s`jFjzc%`y%@PZ&ED80NSEMn~pWkAZBkjQ8yBvR4VT6u2GQTMEhp-ik|N>5!A z7Lm6mG%{tnlnaf_)l#e`#bi}fgLSr|TGcg{h#1!1m^ErdQnWT9X3yicD8=lE-dAp` z5r1ITMrhEvWaLPv9U~e$?-|k9o1skTx)SchDCa8Jr(Fqm_JgB>KN|v+*Q~^+FCZ4! zYNIvXi!bi~y;>jF#~34Gm9@4dYr#q;$HMWUir@IqPuWALDO&KS*ix!IkKuWYJjXWj zT#V8h%R2+lQ+WRAG;)Gq=XaDkjPi_fc|6bKOq`aG7!G3AgyeDjdQO5<0YBRIMqP@Q zb8^%rO~1Ea%GU4gm*BhRzt8{0z$Zt+^W;D$p94=Nr;v9ZoMOz<7_%LUK&$x zMkd2pysw71K7ihYL2sZn1KOZBTcI~XOYi|tUkkmdfZhl_N%jkkjL|BrJhyIx-lR|_ zRWYY8g5FfF35(2w-sEwv&{D1OirE^Y8m$G2!5Ry_NrB#^KyR|3Hz|8u#VrHLXQiIan z{}|%=zpIFm7gYD+O=Fzl7SkZe*1#Bo7C|532M0e`>R}Y=EOS_ zCSZfYen0xRS>)=5|70Jmx#f8CC5{|?K(S7v2Kc$E(#kS(ACBAdIeTw6r3FW%&Nj7}x=h*c~ytNkO_Oia69DTghI08AsI3(usO{$-BCb?H$noTZOlf;9P z{1_AL9qh4kIUnHsB=+DF&&zBb+;squh($_yFfy(FyP1{Nl`HPDOr9UX~9ZFBs9ZNO}0>^#vn2m%RK4=RCiMUtY)a5y+iV z&}Sr_QqB>)x-Ji0robrWCM_{_*qX#t6LLv`0sD%Z$YXo!RcjI#6Qi~gInctKC)|Lco9F%k z>lFR@ZF{qte!OaC;?F$Kw^@<30N)?{cxK{$t9xIXT5?n3eI}7pO|oCGiactP{f-G* z^KJ8QN*rbtS=2Q9om+2CyxuCZsq5`F^9}m>t~0X|e`KA`^>q6h>kR$;l^K97iagiksdrJvDB2r^CbJ+o;iu#dOK6?cf6L?*G8i`j`z}5`nTHpVZq$KwldDm z?Q3J+s$2Tnn6vqozBaPTGy2*XYD%PDX=|R|)}6FbOIy>%#Mx)BBcCwOZRYE_zurFk z6^zbLS(A`)O|xs(XnQu}m-;Wr+)Y#M zMsO?{`9sQl#Wm`2Ew~1~#eB}!dE8OFg%9eU5AKKUDA+Om0_PlX=$a`|O-0{5A#azeysasob+$vLWP49}MPJ}XvTV|n(3@3Xxs{Zd^wNLlKV?=!gmkTNUq zQ_eiJf__mZ+2Bf@Z*a}bF}Q9jHn^^#%z2+Oui%e3$1iBvB%VEm|6}H%`!Zfd&$A-o zKKqJ*XGxT(SKb-aSn}#NO<+Ll0(5L5H*=;X&Rl zxBoluKH=R^{4QTRv@+uk{oP95-EV(QzrJ6_tThF`G&M$Pof!^)I>gpIp6|kd-z+)f z<0(2Q@iPs?hjTH{L`NllsN(Bc$-N#==TD24z46haj7Rt{@xgureU;ny`aXM^?rZn} zvLo>~e2`-~$4dJm_A1%@tI@FJUyb-(m+_4sf>54aW`ki@W3q#e)qvB+07zK=$}n)I3RrRakq&kA>@JVQKfSy!QH zUF^U28nk)^nTvs(iL%#Kup>@ImSP(Je5S;H$P*b0u}Zyi8QH6kpv(wtLgZbH#4+Xj z6wR>ATV}6CsV`6Ypih<~-^B7wEOsR#uZj66wy(bOl*gu*r@a3?%RWlk-+s@sn<@L= z_bj`KvMt}Utdp|ue$TQSDf`a%EW3fSZ-39SRg`_}dzM{K*#qCR>?4$Y^Lv(EN7*;N zXW2^1?*E=;D=53~ie)u$C;Fr448d0gd@Un3VjJ^B4Vz?Fk=Gf-jsy9t@J=#sI*CIw zJX{HHhqsA|j&;SF#9nu}E~k|5yzx=ReoJEQuS3q#34bIxOWHhfP|&Ajc49jir7De` z$Lcam8b+G+>vMxv5Nc@d1$~bc3 z^!T+puN4#P%2|bO72U=yv>S}vPQYeK|0n)K zr(Jid(o?yCd6rNp#4 z#s8&I&sgdyx~Z&T?y5vRCd*d7IcY3jCH=7aTbxUiQ&tttNm;c)HCyA=U~9n~!>aT- z23d&tk1}&PZ8>T*>+C15XVZt}X`+Z;gx47F+p#3aQ`xfM23BRAd@|i$)``Ep>4*Bx=9v;6GAK#W6-S`%7 zw7A@RimQ=(SX@~n$RDq6{N*Xe(aD}c^da%(dY{0nh%RM@vQWla{x{lR)BXP2Zcus@ zQ?^~?Xzf#!o)}XO^NF}2_+#kLCiXu|mNM7$->dMn?y~rf$-6P`cVhQ)Uq7tOl;8LpJvY1S+2vEu z^ZjLFgJ-$x+1~$5ucx~I-d)dZcRgEt>Up}qOf0;v{$Ee_Khx`ZtpDC!Pnx?Pr%yfW z`^&@zr@QN^=zpfyQ`&#;u4k^hp4C3}JlJ0*Hux5IJuCX3>Gj;xfA6j*!(ETVr=BJK zWnzQpx$DX6f2P-y)qn4<=T^O*6dB9)mZBJNr+>`nyX#oc|BYV9y#9N49hp9Lm@cbh zfxC{>{%`a;lKStZ4sY!Fwh>B?moAAtgT%)Qz0s8~LB>pOS70#8B@9$ByY}Ga9 zkd`*)fPucZ-JtaxIj{6+-g)q~(sN{r##|5{E63h0zDbm8pQ!a5J*@QP@SpNrpATJ> zy{5mccTTjMQ{3N-(Rxa>Y`c7;!|ABfbM$JBxgl|Pa_vW$8#4ud`?a36p7|p2?T+lG zttV|oxt?dzUb}gwyUyS6?n8G!Ql;$c+<&0-c*`DPp6GSHa#@|f)_RUTHuSPOZ+6$Y zOY2$c>8D=j^IFft-1pZx%U$Pot*4sj-{@<#)>G(H*4@|H?s~UqJr3V`pVoQ`e99hS z4rRzcJgN2UGrQ?Uk=#F~^=$Lp8~FD&|FlFC&)b|@k7CZYU&HmWz*~#j&5XaiXATL! z><6Db623Zz>!YPw&j{dL0k3^C$C2>4iTb~-)_U#+u4^gtX+%cROumsAO2@CdC2_l=#;#)jF;m~@{nHJjv_Ql#Sq|Pn+9p8*k zxYvH}mU)R2cs9v$pM4;En|rxFpQZIgSXN-azQTSR$7l0zODG0!LO zkF|f*F}vuZWtII8mWSBGK4kx@XhGs#JinBx_58@X#y)+_8v82lzfRJ6Zm_PlZyB>1 z`}@^)(}-+)BsBcYiQa`@pVxX;^X}5uTF*0lvzl)%9rn5I>c4KXme_laYCX-IpBcmT zAAPPr?!Uf@x>xgF>gqXvXOYy~_sv`V<$7BBuchoW=B4)kus-ar+ghrhe{3$)&+>ka z*a* z_USrV?5D6>k5j9D+4(g#zYj>t{(^>Bcit*;3@Gr>v(4;R$yb`rS-#7M z-zmUfWfI??LiU|SjPbAbtBqRA?1!=~Gas7DbLEBqEE&H$#WR=RR;~0S>2+CO205D-*gu z&@LYNm_6D4mp>=C0%m7U&wqU;a7d&TGdi2K4A zcXZJQ#<>%`H0{0GX=Wc_8Gs!w_=tU{mHkSw16_4#vZ2_4uG%__c%$GY`HXeDuBv2Z zJ{y*SRm^+eeiiC=g6Idxn^?#`P5SrTi&eI_P3ZBt9=La%T!%}4)t9KBd8q=2_Efd; zM7r82^Kv%!FW&h+;kOA+?{!>3?Nqfyd%_4Uz-HW~`H9^y|HFJev!cI_aNbWaD6TT* zdO3%;ydO9t@%!`5R;vlUhnaS6!#DZDcD3>3F6Cm}-bpQ@S4-gescPlogT&Ol8UNy| z*?(U|2N}OYX?@M;*IFyKN>>lwd1-~o)s4+{+gn3-9$i0VXUA`-BY?aZz|ihrHti#0 zSbB8`G)nBeR!8o{~MW@l;@{C29e}Z}Qd)hfq8(v+-5u*wJ-J$sJ z4kLD^+aIs3V$Y0h@=o0qfuC@y%#-0=73||=kAGzUT|3*}x`Te)zVjGkdi=b0@dRVs z@f-4DQ}18S|8Qru!RFY-m;j%Fw4W*W?}7tWYmz_A_cJ*y4~u_La zJ5FFO``07n9+DX4i}=2ZedtM}Eg?a*x4erFf$*}?tK;1^N#R1P%y1ysGO$LhrOjZz z6Z$8TbuKH#5K@cE2xYZl2U zu@9&3OO3%Tzd}B8iyGn#F@`wr;d(E*4YzT4-~|w`^1` z&aNz7^kr)?5G5 z`&uG?Bg9&2dBGCoe3$V`uv(njn^{d|;_t;8B65mT*b#L>H-iS1P2Gg8w3IDF{+X?o z&Da#KH7*TT8oj<@VzW8a80g%AjqL$)$UL*%g8ePI-W2k@lb1v0Yk2~`BFxiH_AoMs zylb?Hxr&|H<7ukmnp3cID)Z=xIqo_7xPxax`z~xxZaiJBUEBoBil&f1HeOj60xpIE z*L#8MOUNgp|B~{dLi_g4HBani-Dp3oTr`p=Cx>|3?Qb!Ec4-%r$=^B(nepgo#kCc^ z-Sf=LW85G6qjIqlx%sgcMaTP@Ce?X_*t@oZBU8%_HtTix09`N+YDxOc?IVDGQpd#& z;N_nz1D%4G?M6F!hlkhYSPswqxzXTy+GunQv=W<=_>?O-M&k=I3Yq)y6=gI0@oPW6 zC8Yje@MZs3Wc1vJ952;lQ)bMj%ub%y@!Y|+_`nzO?fcw6#(6!@-sJsAzPZF%;!OU4 z>)R;zAje9shw9!__vGSyEmTfG~!IICSK&Uk5^~hMXbpfeAtse&dGQP zpZUx~4`uutzVs6~e^t6?hP;>flQTbFl<^0A<^S;ULm8q^+VSz-8KNJlBu=HooQxr+ zd@ivqV?WN#*pIFx?@(UGdHm=n&@a(n%tC+h8G4eukCtaVK`hH1au(go$ICM!(2-Pr zv_g+LngBo^C8qc?G1yJO8N?2{DsQh9nAbQkD0QuQ)&eYbsk z-*aS0`gIP^bM48V>t~F9t{Cjy)lbP)cNqDqV(${Xm9_d+(?I7$Wl+nXOcBoV3UWZO z&l0|U?L#@b50{r`UmLn_tn8(|_qjgT!oQ2IBS{JFItqQA{IV`M1wrne*Of5vMvn z%Rw(C<%M6}Y7A>iA#av}d7Yxz9A_9G-EM^3TCdQ~{p7WL%@EP@Ws7$4E6(Tts9oG! z_)velQ*-Ql3-9m0_tcwnv(oe$`Y6`eR_bfbg~lF%&Yfo+zHVUI)Yl9Hou8WqIcp5i zPea*^*9K^f_YY7SS7f3eN@*+q+%u0@F(9!pi4a-{Hi>y=VVDcY( z7e2vQ3qR(ijbpH1*Z|MsrKuaahR4zAr!U>iIn*n3^Wd+cd)U3XT+qBW*7i>^eG3e&F1aZ;Um5Z>|F#oQqMuiB~(oD}Ug%Loqt)!7J9n zaE{hTbf1@imeGcQmJV`_@5MK=507e39D+f5Fj=RC9MahZIJjUUu z(b#ev`(E*@Sr2Y?ke|H69O!H#M`?{xHlrgw7zSmf>A`zr8Ca7*?g!oMH4YVhC55`M4LT%hyixTQ<1Z^N4+_#Blttw!;j@vas_) z?~wYQln;LeOg_M`?+iS}ttO*0jJ&>r%jfVnQVhg}Cx5(RATB)THpXqJ>G0fvTnDg* z2C{}iQ!|c7hI-=HgnT0|d;;%T$1~ztkH@ec&*lCWzRTeH9?u#)pLhRI{2JEOZ^W-* z4Hw&j+ld#W$FE_H7kh#z*7R@1uVH&PObz5u?cVl}eG2!9u9lNOaHs*nMKWT&)mVMBb=F{c#&O5(i@P8FtmHLDa zSOzbDn0<%v0%zD82ruvfzN=@{Am>unk+~iptWUvhw-4677yjSQ6R=m&W6aA~XwWDJ z`=F(ahx|)9K2_eakhNX*EII61s__lpL{6zOxS#PXTx4~>MJ6ZvPu8u>dSWMRCV!&D z5fgtYkx3cw&lg?}ACLsy2Y~(gJY-}?d2hfU51+%w&$15@+d<@O5@#!1#uOc}zE>0f z7m+2PhtcyPpTo|j4Sr0O+ zmH2<(?77~-bqcgPh9l3zBZ%!`RdlxQM_38ZS~>J?dnJ60KeDP(_(9%8+=u7zU)&Qt z!k&n2eS5*D>|a!C60)B<_N21@>_^Ua0$-=!v%eI-eUYDe^To+tH6LC6I$(K@Z(W9P zD|s3n7VgDgQofgOFYv9vyq)I)SK&p{kwKkeeUjMQB5T^rm?a?7cvnG|i(JR~;znB* zvYfg-PMZa}ki;qT%7sK8(_hx#u}d%O=h%3KvTrN?=?ZP0v}zaQuw#%Mu7RpDt+wI^ z--4_VhiPzKfrl_+?659H%!9Ic@#b{`=%Js^Q;{@qGvQsh}sQ1}D2j9_l+L$S1vH zqQ?&}aK{hd#kcs>xq`y}d*g@e?Revd)7D>)AO7QS<1_fwv-&6Ct@8~&5wSP zpM7-zb4UHAZznNS4&z5=9fEz1;%`lYPM=}^)ImQwi3Lea^J0V8;xl(7ZllC@+=Q%I z_{e4Epe-UhE6cy9>7M*wlUH%ijCNz$jQ5dA{W(HuY`1EOM+wpl$L`#4jn%MLsI@;6a|rzl}wIpNI|8IR0lI$K(9t zIpl7_-^=&WV@3Y! z4Q2TcHtl6UAaFUre&7Ufd650>Xv2^eU-*1tFgvH3hB~L220MR7yv)g*uQv{9xod>P zpBd6pZ5Z731##N5jDxzqb*Q3O4EI@q@g;9&2>reNE5hPilG#JN>IYVX57T5Aq_ev>!8r! zGUkTRU7@M+>`M8?Ro0}Q)i*OYZeotiWUi#*7n;Ic?#~A>8^8Y==7X6%l=%IRU~RQ9 zwpQ>efdjs#E4w`Tt9O$>EJJAbC$@Kb%E9!c$6&5({-p-V2FMk|TU2|Mjgn z1JE^JTITgfcki3gg{j)bT5?vjkC6F~j+%UBvW`07MWZfXbBOox|5VP3Q}oBn4~S2b zMAYzt{icd zq9itw>j~e2P_Z|8i>N-QK~7SID%0y2x);B6OmJIs+zhw7GFoJJm0q#9aZB<@EM zx}I&ECFVv0G~iXPy>g3W9L&tih-i}N{a$?0HmympR1-$p>vqNSPLQXq9 zC)OGtxrOA!D)HzVd~;$w$8+DDSX=piAIDpKd!9qji520NTMR}nq36UR@1V#n`tsR@ zy5$ye$R@r#l%LV-$%*wD^8H@xo*8mK8yQFM$N9Q0qDqg!n~#lue?F`o$SdAFba%!f z#)ZspHUxwF-OxPXwWw>*bF;dT=E%~@MF@FUY*AkPlQerZKC*%;% zSi%|q`V8W#h2VdZ@e=19oCU_2{I}>IKIAN8dmm?k@#maH|L`-;GFC%?o9HbXxEGz) zG#!qMfwknp61a(<$`X$IIYgf$d9v>15FZxN`*?j?R&gz3w9;M=JhvhnmUTj8!a|ec zec&0(I^mT8NgJ}>=RkuL6Z#MKdu%0ktsx{ka%%_%&9d+i_WUi&R>y6{~z;T!8dF_DVSfK}&HpEFp93#@Mc$q{{?9f4zn;hcPp|nQO7nNc zLGP^y{=0QfRlj&Tv#NN9?uQUd?m`V2K_{^wO=QZ3m1CPkPAB`iQud2A$l@es zsK}W|taLOqi5F7AH^%(&ToYT8=kEInO=6!ChW(W2dh^(4p8hIu z@)_!=*S{}nn#s3$Q%CY`V$<)Cz3Q<)jmFk5ZZ{)GC3fU$>&_lx>WN&g{R;XyW zN0#)ejT|!%i(j-`Mk3rE;r2q&JaL3^UcrZ`jBKc*0e zQv9@X@zXI7>%fng>*V@9w-&jl*pnVn)$|d_vDX#mHHp90BY((k5}oj3e0FwBU2I=x zLXIH1-uw|w*u9C}*nDDPcjW*t_L~D@Ou6<~X$xI$YcvNkJ&DyhKPg1wwo*mD z%OltjAHY`W5leuxf;uH0O|N3?I?DUQieJ|;&d0wDoRX*bS+;XF601C!Smk&7nKB;X zsJvEbJ&ygt3I0WNd>wv!r+V#0s8IU(S^ygUli??cVdf3ts@o z)*_=5`P*#9y_4}bddAm%|GfL2aSmd?pfR?(zYKm^Vo#t=#RrOOkpjOCaIsEE-Q;825XsmA!G;pXKN_`gkw_VKreDFZz@TJ_hU@IZM>GCh)^VyYZAO<*b zsmX01^E!5Ap)U9MfctyZP^U3K>sbUYSMsmopJ*7M6dh03dXmA_$9R8am{v4PY}zbZ zPwZ4;eNZkJdC7LuB0KRBT@vrUBUmXqjO^C|{BsKuFSYZ1MM2S}6l5tmX(QdFfU)nDlmS@fnDZ~!=q99m<1B=)dg7qNUr{*%2@hjsSgl^!6(Y2MnNKDBV=##)Wf%$6X5ZZ`c z(m?E8T=n?4DA44w`H2l;8zbLV1HT$zpsZZVT4JtK?M`PdNHQfs-DqLG);{W=p$jKCzbb;~Jv1X!{q`A#2=) zdAoP&^Avx@ByhmNSsSXnI)Y<1IZJd~4gNvSqQ{eQ(qn_KDt$s(WC&Fk1%!%@5ROz4c{K(H#~RT$Yalr%Nzb|$jIT@*p1|iQi$`b zCWHc$5GB-^iw+-NL5H^ydMoRE74@IuUnGx-#9?>mkgz%>?zGemj5GJq5B#$R_7aCY zI#l9ehcXVT?w1sb{-wAibjwIJwB;=JN)^N!%BIfzk7Dd^P%rg_PcT^ZSnV?3@;&wJ z33A8R$Nn?nScxHW|L+$yEz)A_`FvYBcZB^oc6y9;@v)bxZO>zqyQCy=%PUHN6WgbA zV}RAVf+bCNV}pf#aBGKRZK>ruv70)k23Uy;A1?i?V_qyS@!v8^^>0~Mu()Y4<=>{9 zlkcCSE&1lnxufhg(If58zBkf-Zm-KG{XKww5<6f$=f+uhoM(|I`vV8DNfUe3XM20E zdlQ&Q`%=g8*Q;&o;1w%@;j=?W+ShshV>@+LE1^1^9$|bWw*Gp~i%J5voKON*gOlYlCY^c_OZUUTdKiFl{_j@hH%HbteJ1n{!DnZQHEIix}l@& zevHF8V|c>7C4O5b82nluDY&<(68p4AhzGZaJ_f!w+TI2ZT@4QH0f$a-|4703rZC24 z0x%U?T*W*PyR*ENZhux{*F&2uUFx5E7hag>&Qlt7+E~1aagA1#Y0hbtU#E)5|hdmU}a&bpEgbE z=o+Lf7aPaIlCa32->uCgj-;a&8f-Bsu4}C0r^r7o;=A4aZy{?%INyBQTm7xRlpDJz zUqiW!2u1(qFmvhc9go^fC2EB9L*Np1CZc#Qu|-;PH_f|vqlzKHheK&J1ov}#UJHa{6piIgyfo7_~jg$#qtp;b5Vkmr73i?4q`$2wjk~bF z>NHvtj`3_`rP5tLvTS7fbX3&30I!G_e`UTsv_ zfcK)xG6heF;k@wHLE6-)zZi=jS0A^XGmcN-Kdq*V#&CuDicH;8f($0>J%*`Mas!k} zf@fZQsbkLkg85`MY12&jvfe81e8wMVOr5rRaWpM?yfcUL0w=M}$Y)H>;ye6j@bNHx z@x?#kM+E-_PKPPadb7}Xd_Kia^L@tSuo~t_=UrOz1m}1|n6)0(Ai-iWoP+ z{Z!hOv$UmgT^rnD3n{Ti9%k&487I9@{LeD_bhun8K0^DHKNwE?f+wA{=f#r`3RXX% z1RFA5gg0{A_9xXVhP5wDSnKw4?8U}J)=q(y(9;+FLW!##+9LO+(aK8prswtoTj|Rg z#$-7CG3oSU>J&5dBO&@7TNiZ00o_O|8M9?BF$~gr?tU^&4YF-6ib(EhjCS4V+oX15 zX8u<(jSu{V!w{>-(O2NJtF+3@?84gVrGsM|OGn2x%D3fTy5rRfT;%`7{@Dwc=SvZYp?Sz>ZTv#^S~U$zvz~ z8U+p%dH!`b|Gh`9!2!9>mTPc8t`)A?r|ADF_ulcA>vF~(-|+cS(2i8fO=OK8%zQS{ zFJw2scW_J<7RxpDUE`N>U;`v%6mY_us-{+qU5{enKV1B)Xb`OX69DdXRW-Tfq~ zL&`}XCQ?@F2ZrBSzr4RvyS)`g_TVOL_RQe1h5lISR}k(;A zJGMEk=Ex19%5_JK%A`-o#}^ygJ;iL)rX~1C4#+B3i>)PPnT|nD_?2PH=W_j!y2*CZ zZ|W3zw-@@Jqz+$h*;tmD=D*QKZuG`W%$1EFXbryf>q<08_@7@ugQf#J;F9?zu*|oR zSE6Ka83_1pcFNlDnsya#S)?Fua}{Le1% zgKx4`2o#CNLBG1o@9z@}E2azQJEj$^~chVpYa(5Ol|dW< z>1gHR^PEpvl}7pI(q;I4>~G+A)hj=139z=z9WePp5+u0!;>BlAXJ zdJOx(QM4_%RHk%KxsN`70Ud*P93r??>N!ijg}htMy_Ef{`A?CNyVo<1jj9oPR57R_ zJgA?}#64{B;NGGqhk<)zON|lL`0EJ1OazYe{gr`Y^Y}GuzvN(2qqTzgQZ-^qsUafa z;RKy$N$bhed6hJOx3ABWd+_yv?!8bku=@q-*?6PYSZc61R=m8?#wKUrYJ>9X&v^DY z^WitxOm3?f+^~E9;O^b2LmHMs&o&a<{gz=$<_oe@pE|T**Zv_5%L27&qT7%- zH^?d3BPjzPzn*&F?MuOvTUal@0G@}re&gj|*hJ3nrAbE_bHUqJdwZYO%-vI}bo!-4 zz6Sj|WKhx%*aMME&XLGja=S`gOzD%A z;|pXiW9gfNYw35PRhx!CYuyJ|4W0OY&aefKUKKv^y{m=}cwt!B#M3eA#6nnyd{K`1Ap%feGZNQCvP+SD!>OE|TaGVG4Wi5|j+&?5v zkJz`ia*o;-TD&*<+yA+1%+>Ky=eE>=4KEo7bhpFj{M&Z5^*0p*x`$Hd?uxK(fy?gH z@P=BR*H(mg@0Rs|_+Pc9(eblcqiT%<8@3Rupz2!Ilk39gM?rh5riv^}@+m2HdxA7f3zp#N=#c!_^O*`u#dnlT;!)>%Pnn1@qHC=5t`f1 ze@kqfFTmrkSchfq94EJ~&;b+u$cKmA5JDemBuC`Fu<=uRl~Y}bNJew zI|L>xqZX7Jm2==v=I}w)wjZ%({I81n-OSm6wfle2umK#MQeuicbYO}zQjN4SHFev0 zz9~Km444z*M#SJW&fZC!Q~+(5s|&ncqjd9|Ed&Rc9-d7 zuK3oS&K^wUhth}dYD3m{ZyRm!BHn(+>-~)H>!+2uRGT`#fiWmPDdTONPb?_2MRHrg zQEq$+YY?0gTuTHuc7jV@Jd0Wle#Ow59n#;pXvVsXvDilW#HwsPiW$zmv4XQi+xYp$gMj>WLJaf%Wm3{ zIzOOJX+Ov?Y~tgzFKy0d9?82iygQAoBj~Q76GaB!%R7+|$Fu(ydG8tIm8X&E>V29x zK3?E)igMfN?=IGi?+Z8h=WoGn?SBE>kYoH!xCuPOx55{XeeqTBclCcGygo(GD!BF{ z^CyP+w5!ClU{?j}hq=X;!FqF8^(zjI#$I65M%xGee#K`eRNr-0^$S0X{AH6GnqJRw zxW`z$tK4bZ#Tb-=hXT8L@bK5*;jh5MUgR{fJbTfDhwyLVHQ-@*+C5XxvZl15N7?gZ zHy#Fg@bD$@L-6p=yenngMQ>G09fB7H9z5J>9IDqXc!-=)$3vkX7U)IV-ROaWHm0)~ z9C#A>nJ>;2@%;vH?j3d5#IfL<)bGW)oxJM;=bWsiVh6FCccQoQ;@nB_uL~R#oZETL z`1o{SQ>a?f<7rpM%Ar`&mlj{OK=^i3Ir&wPrJj6cqwUh`)wa%8oVHqMOf9h4nHnba zFTECC$9KGiX4D$PJZrFl)2;ldd!LU^*Cp$b_qpoxyxPcG zRI#9;Gos2SwAX~5&P&%s7kL|W4SvT}yMKXBpF0C718uHljWVf2bs8;lwqEGkv6r8` zjP4EA>0WM6@6%sF=bH9MG`wz%=x$=|(rKx2NL@VZ@|Ec6blRnFE?E~$l>dUVy`KL{ z_UV5uG=FDBW_QfqIH&ycw$xi2BB|?&TI$Oe>U;+4 zm&7G}Q0)ETxoTDAx-0$P*8Q?(N7kj#2jNSftytLY{V!S9?l3CX&7+S=toM^&dD13z zqm$ERD6)RG(6-cHh3r7b3D5u68gJFdvliH?;nly~QQ>Z98}O8N1b)Kz)X+vZ@?qcq zaX<@v{l8*pUv$fL@B(Sc64Uszsg+;qHra{127@zOhXSHj7EXKeMk3J)M- zw+r3FPGe?wQgT3XI@hAJEi%~CEyyP7-c4{4emK(EGRCKCZ8bV9!{f21uDdbhjBOgm8`Q>*I$MHcm(0RhH)qi?(a{bNZnqNY$`N#h> ze%VWZny@VPqiq=@KH8o!@}p-nMt!s+<95n^mZ8;OxGkA_uBD!d)H8{Cu3NT`JS|7b z@8U=P*HMQ?WgH1n>W>Xp>pK*KbEwhJNleUhVpq~ZUnFi@4L-%fw@Y6?Ar@5Qn!qjV z(e=J%33ML8cQ~(L6*h6PcClxZ{NywB`;pkHpaUm=z-n8m z2iKkSMesitKU?%x2POZA*c!OuH5j`BdtE#9B8B!PE^#d5rV@jAgnm!1D|F<^dcT65 zXZaUw=kzhtZCO0?p&FQqZCC?qrR-te9_Aj$o$M=w*WCz@BK@)s>mSoy*lEbT-bnwg z^xqNuu1);69bzv-|4uWeV(0Q_=Y%QaiuA9Jf_DkfccJTZ zE5tv~Qdj0*TE8}U-wWBq49z8GsQAI zAN#1Ug0r7zEL0DT!Ny0YFJgPToBo!4E;`Y&gT;Z$l;_kC=kwSFehL0HKx=xHu&#^H z4WTVUW2PA+El*pAIJZ~>csE41FD!+&bntE!^n{qBmeHK0z7yjOsrmi24=x2(ekw(g+~Kjo5PI?}=!wj;x%!wA+sPQ@lsQ_4y>2#Zpv=du zjG5r11Kg}*t;u4ov2rcnjR6PeF#mU9XCZ4$F!))|8Y8~CO=VSaoqGHr=7QoCbq=IopL04@RYeDx~V!(%$#KA;^i>_qTr{6cif4*qORfx4Rcg;+F|U5PrkCjwjon#eENE& zaVPwCysBghA6=D#j0hfA_=|{_o<#QXZTY?M*CPAfovOC>tiA~u{!C=}smSnCkl`mI z!#|+wx#ZtP-+U5Xu>~DP8afL6ahF@s<2d}$^`IA?gDpxSyky#-+27EmM4<B?{N_aFDRfhKPto~Kk})ODM%yC8 zy!J%_^DKMFGkdspc?vn*jO6Zi+qOj@6Bt-m>A!b+CH!UO8!;J`Z*0q0hi$N))9$0Z zj2&|PoO?MM+A}KSwubEB{A}D-u5&^biS3)j@$m4Tdsu@R#}-RlZKk!YAv1_}Pt&f% zA}R_nJ2!wUG2#R4;XidgG(Xn9R_<34LkC=riOaT+BY(Hojzs3}m27+W^3S^~6ma01 z`b`;kfxXCcd-eC|V1Zw+QEBvrY0qkO>CkT(V}Y5Rd-p5EtMJv?GHxTaf;zrG6{uV+ zqg=wXH_p#;krx4(MLu#>EAm#_a&1zSu%d#(shiBf#Cwi9)EP)_`xx@N@|_8t=G(!_ ztF)6@fV|dBJ~3~lX2$?>vR z%tr^+iQY3Gy{E`?y|xUDfi)jp)#Ytm-lsUTr%%wcEA{E}^4KrA{~`0raEo*`!mtl94f!$4g$+#`Q;(a}K zH!!U~p1Exb(i#(h z#~cqllIWMfL-br%f``bBH+tYPhwC)pkxpNNF4KKK%0F$=ZHYpxkD~hyDG7_=~2FYA6RYz9-=?b0v_*TPtXfI3ek-V zJmP^zJn*mpk2LyV!G`j3TLRJ5iyhM(;E(`35=tzQCV!I-4|oIM;kG+6VUx7shifx8 z2K@BfHc1r{S4?GXG_Xb*Su3$gT1{**Y=|!C>ykm&>xjNe@X%|U{yT}Nf&TI^N!VB29j z{Z!_I&`{Hfs?3#~tN4#bu}R`zVvJX|Niua*WoA?M{>4h;{dL$PJ)$(iXEf%* z4bW}um^!KJbL#1aU+Me)#LgM+Yptg(MZMJb{0Pq(t4{RHQlFQ03tR;*n+1O8wdC4s z+a%YDtee>T$aM_YGGB!+^TJk>?>w*-8dAl3+SF~EL=F+hz1TRt%~{u-aqb+gcx;@8 z^w~J&k3;UM)8HX>$)ESr;AlT3H2Y?yr}p8&k@w{)jiN)07MSgOWV-vBJYA3U>%PH7 zkN#Th^~mqhJ}x|aU*M&}ZAznsZ#A(W%TRhO#cMMQV+X|NGk<0?fBM&`MNjH$RH4AM zDl`8sb(N{?Uk}b!YCbc4+VNTbUF7!QAM%eVjd7x5e3vtPTmBz}-hP|s>#cCx#C2yi zf#)iCj?L9-Z17lHh5x$1-sW@kG-3~Mx$Tv}{IB6S|I;@PzBpbEz6*{Eeitw%6aAG} zk&XJ;UJb$aDwV#Z(5GbP;2Sz$>YWEw@HH|IG|qze8^HM*k4;t?YtonWRdlRJ*z*cM zD0uC)%Zlz1yDT@p!hZ~0KzV7K@%PweUAb*3Bi~)AUw>C@r_}3Op&8_32?VxcpJk{s zY0-9(OUYaien*blib368{v>}*Tpxd8gFop+hwLj~7ya`M@WG{=YuMjq?^Bv+|C}&SQiAU<+ohR_7?iKYMAjt(tMX4}R+I0m{V(CSzyC z{(mX@=SA0wz1N@wvGsZTK(!6O$BU)Y1By2z2e>~(X&eYle}KF&zXIDwyK>Qh-Mxi= zK48%<%GgvHhC4++T3|4`q6^}hv|;o=Q`N7DiR+SBfqSSccR<;U)Y5^GZP>H4BjY{- ze6W$q9L1QPkg+x<9m*ZBX9kXluVx{;i3R6`=l8-$a&TQwd$~rfS>BIeFPrS=m*M+f z@?e|uO^FOh5xEr4kn!ko+1Sqy5xb;mz{MA?MxI>`+YRJC$!Cn}z&Q&zXDNtpC}f<* zeD2J21npX$&b{nig?F3G_o55A4|;k(yz?S>`lWVc0^pPACD46?$>s6F0?6yWTbh*YfxIx!y4h zvKI0W>F>llvxz&X-5KAs!K{QAVkeMwC;4Cn&#~9JL)~Cg$fc%`t4-#Vz-5wvNDi6jiN?pa5lW~7+_t>zBCsaoxnFX z#$@T|4?nR{)m|=QOzYXBECWvOb3TiXvSveR;&zvo_~tK46W`jaCEgT2%Dw}9-2vX# zfxppl#BkMdd4ydBXOZu@koUUI(nbv9QK|-Y)$qS#kSB?JNyY#>cBi!U0%wsirEsLh z%lXW#lizHz+E~E9N5P+($^8{T9f3Y@6FL>ZKV40q{t>vn_@OVptO9i$ySfj@ zyzmO=AC=kAWN<7@$1!kG$FcGD+{s$=RluzzEwEYU;Hi*dR!!#RwMuhAirN@2c3-2g z`vT7fP)`JhFYE@;r-{H$cqN&i?9W=WJo8h=LFQ*V^Rs~Yxs*AxiFsMX9Fln|@kz^= zpOrt=5}#`=O?>V5TH?(Kqx*2|AnQkVf_Hw7v`4UppbvHF@bk=1iAN{%6MKi2F`l(p zbTHBu`S+aJ%*|Mi%!F9`3hF`*tIO{-%S5}0{ivZ2&#rdIcV=!H`tZyRGvy8+cwMVC z2Li7pcLg@*^MCo7YGV|-s^5-67jW~e=6f?{H5X^jYA(EORpFYxlI9e%AX(GmjC&mJCDRjL>G`T5vrbOF+%5fjZ0*=pEqdUL{ z{J5GExDV%eF*VxW%yS3Fe!eMHhIVPg+0Tzuif?*xlPznYQoQiR&9*H3+U_LBq3rYT zdht+3zBddX+Vx_#|8|jfPI8U*vKu3IX4JgA_t&kPJ89CFTm&hL5dAN$#5t-Z>-)_T{w-uiq)-Hgxo znBz|kF?PJcx29(E#TOdtXS}`NKK?I8fN_UsR84Uvi5(TVSFBIx0jSO zDXnZ?c7`V#TB2}WTH!qU5NiZ`3KzXtmW`bz`%1fQ^)p%Ue=2C}r+>!pGq$Rt5B~7X z{b~1^r>DTjyW(%ihEAY&CH(!1uXtX35_~`iNqiH@-FJ9!QmBQt(xTlGw< zBP(NF?TGZz*1QvqG&N(iH6A<{T{s>$u?HB8K@8(@1pdem8Hc6NfvxoA39BEYGp?IA zI-@LmOh(x}>}2_VVz@m}kaKNDHvWf8I6ptZxzm$9I^!np$~T((Cn@H^Bg9nv-_JCr z{R*9IC-kO;3u)^N*3sLIX&yr=1@;` znfHC(ca8e4GJ}Oi%NFKTWo^3E??UWv3&Z`^{3@j1h2W+_=Aq)F7Us;zxCwl&wAu7~ z0QAgS$C!*G%!{=zj?DPB)&FZVcFwz&am>#soR?4kM`qkMZzTP{HY1VtzGpLbj8)$m zPvyCZyYl=p{2ppMGz@LeCEt-DM$PY@S)Zn{jp0(;HP(WQp7m`SaJe4Y_FCwN*sA5g z2mA|MHrYaOX-CeYc7C{eX!^a_{I133cP;%K!}#j^+9K?x>E~Md8RHyH+Kh~w!M{qo zmwv_$%*%KZoG!oUPrNufzkvX$$IyY-b8v)L1UW7N-wn1JHp@ekMit4C(kS^&&l)hxWH{^%b9KE z$qRprlv8|8p6jeURp;etIw#NdRv!J|5&5q6M4r{=nIS&|C-{~{KLiJO{R`p2wp4*@ z1PecBfUN&0+YX=iV6JH%M0RzmnX{MpFiI02!;!r!%{u@6hwsIz6i=@Q|KD5Db+YuZ zosNJ3JU#as;qFA)z}^s~h$MRqBfQ#bwu_KhC3(T#5o`Fz;NbpTzK1mrZbkCttG8S=Z$)}97! zjyx1zZs3*hIqEvrzIZ;x1!Ds8$)MN*ZvK6T|KRoPC=dTv&$DRdI>}SP$-uC{MPVjS=bwbQBCR_G>}9Y>?u zYT80|8pM*5E`r)@0)OcusEkdfqenD4cwwT>Jm$a|8Cmi8dZG;h+9230@|^Vz5|M|> zC&+(B9-0S?B?BvMwTbn;1w16Zfy;p3 z%|lOLa}D>U$n_>9aQ_?4N6J@7+e!mHvtvH)|1103VL#;G9?ADYz8CWCrOMk@F6Ox|CVzYx?+r%7 zxcAXfQXB!DKX-=dsUI`O2PV2U#>d15CJ?`1shQAKXL?qte3iY6dC+V+0_ZSU=kZ@+ zpYx7=K&WrXgVeW$^hxu=L{CEV;$?JF1eYFkycUP&g4JPukd~w^WuH(-(lP*f;&8>Jz(%`oF*0{>tnR( z>KX$c8Ngh4lDy4~{Z7NtQ-*HI+u)Q?T!Q$HM`Du#kH#hjz8C8b)UEi=%2wdN3-}+6 zf`2)&CP-(*Dgo!YeIWd6riyJ~?}ee;jzy2|qm_-pWz%)|}fz&*hByh5v>4>-taf)}_#L zx%8d?Q*sTbJD)Rd8+(J~YZuC$_%~a&JZ@xp4u1}D&Lic-Q?KJH_Oq45JHpngm2w@! z&%S5z-WY%OU1zSM*t74@%L^^p-b!b>;#stU-{#PUOmyKrJWF1r{p)=F3XM+@{au93 zbUp2k^!E|q^z7eif7AB2TaYIZLkb(G1avUl{&wq`_qM+Y7MOq?T(IH*xW!5Po$wA^ zwA+PDEkJwS=;-HTyEi*|_KKUh=Fn#4k=)J76BFYe&3C1bPA*yT7hu|oZ;xVN8fi=8 z1!FeIKbJfjvqg-V2iOSybHecVF`iA7dui~OjhUn40B2{xUp7~nw6_je2>y|GgLlC{ z@?OVy3I36HgLlEd56__g*!7SoQ9L z7Jg+!wShj+bw{RGKel|M_nsqPu3q!Uanqk^CS<&KshqnFhj}xjp|2V$7_>Xzj{y&bbesB7E?|X%b)vJK%ANi-? zPubPS;_7CazI(lbZ-sB8*GnHKP{*;V_1JqpZr5k^`|S=dtab^cK-X*EO)h!c6L+$QDS9$<49KZQQ~4qw|*q)tAX{yf0|TX zcVq@S_m@@w>`#-?xxcdd@Sm=!&i>QH>O1~)b@iU#j`WruzSf&Q{W0&qFh2iMNZG#| z<=x1?%cj?RM@)UxJHj)9c%V7n@AK^xF*|1b>5A%%s>i&IjL#`zc1%7z#rwTNNA+IX zuD0A=Rga$4<=!~oquw}AT=hxdc9Qlie(lTN%a7z%|9~-jjlMngyQ%2@=Xn3utbx@7 zS3Kt3z`xHPofHr=RnFUmgR09{)O$_JD8oKr_iNeS*GKJ|`PR@~Ghae} z^H%1rnfLwivg$R5M|r2x#wW2S_z`6lzBbi+{bAZ6xeoNfT6mCg$Z>QxkiXRNZL}rR zk(>oS25GwA#J9IE2afPy-{Ae$@IQo(s!KAX?2OHPtFXSQPNj|bb|&{uGe$i8Q}xID7S4`|uNEIZ!sq_L zj{F*Y=#F;<{O|+I2CN>h`8|?+o(*+L*^catiiFzn*D##zxx^-dUTsH?BZUgIGix&v7n_|-EN zUMgi~@m}6oFy276W(Nlw!vvSCjG|+YmHHlj!Sc1MZyvr`_0rbzI&-|vy=4PA`)pwB zXqP2l`X>DtH4hv=7hGS$Ikk9c#LvPP+TqWNx8%$pBWG4@_D_*Be*!IF=~KefJR@he zr=6~S#RxWTLZ17rEpSel7nK*t8`i8yPwp%0?Hzp~buo=O|Fk5<+?()C@m zKvivs7Vy`K7H~id6hR9Vtte(MQrcMdO{K-7gA+-coji9%J^PIEH+B@PsNxwJd&-V@ zBlV_2+H?7RrO%_Q(q^j*26eB%mL(yp<`%EfTTb3uuMrggudNDQ6`tE->w>;(jNa|U zlWt4r8#*U#L%H9=9e)fy^i|q^NEyTfZQIqD=9`Wz8l4NtEkiat$d03IcG}=SWPZu0 z!IwgB09wR?0lGZe@3B!qkEEgW1Ud$4V`ZAr%Q@lmvXON&7kfRui_vFTaoB9X2buQD zAx7`=3S|1vuE$2K_4Yn=Cc5DXzVKF6@XnF8+*EUD$vx9Oz27bN1XtYRL0&$rV;MSv zn;PP39Qb})OJ3>7euiG)>D!E4*-@M9&Bu{-zX@OVEo8fIBO5i~Tc~d7yMEjdm;5mQ zzXMHu4>IdJM;7Kf%=D5KhYQ-<-pUL5hIo2UBR~BNx&PE3NW-?S?RH?cIcZ`&v})P&%wyI>7Hh)sPi@wj zNORiq^NLQZ{Es@&RaN=EpYh*hqegR}4WBIHe`aErqW8VLOJ67Ry3l(!@6y-FoQKQ= zy%xuFjcI#nUmLI!?Il^K==!#5%0y;j@Vte2`uH9@eU$BeddFhM$$}Ss?B@Mb^dZ_G z!`_Xy?}C;?rZ@2z^j-)5ty}F%&&AdxU zkoj~>O&9&lUp1yidQw}PJi#8PF=-ohXiVfgC-cn-HM^kiGfzyY+09+D{hQVP{nYh) zPp|{H=A%142l=)Oy&=vmHAQA)S_#kj51BPSbO`gi_@*-rHj3h{<#m1GLRe+0)Q3@nc7uKP$FoD>SZbb>tJl)PK{GYj)H2_Nf1s!atBNH2Dh3FG#M* z-QAQHDRVvWQ<(?UM*baF-<;N5nZBUeG?Sb0Lxk_Lyk>LwRZDll~1NRW9kd z^=2~r*L>U}q*P*Wr*^j|uS-)q8tLaE=89#j>U8Ec+Kp*bsN;XS(Ft=7cjw-LeJy?& z4($SLHBD+&WC9|HYFdS>y{!|Hh^c~X}_Dpyu`L{$STJm3vUg`vh*u`iFKt% zUNLJ9v!-K}ADor|j;!W;rkPc97{8A>UB>)Q=I&1BqU<_1X+Cp*H>NJ7nKGN_8}pmT zIMO?TcjBlAN|SQ$FWpI=cg_3LHktStqz}!%ZMMqSzrwMd9Y*jS_$1n2w(+d8)>Bp| zWo=Pev|}f@bvI*E#CXg8t8IP!_NCz3h;O5L=xB!YS*5d@=-z3j```WDrnKwSkJX`d ze~kTAYd%|Ro;}6}PAu3^pA>l(?V$bJ*uFV&FZyzcGvX7IjLS0KHxu!hnUubFTBAD= zoybJ1{H&V2%)ic8=x6=4^ONeYP2S0z>}DSBWc-vikG3XqE#hpu7yXPjblp19CrMyE zcjocmz`D{`%poN^lkc~D%Q(nu78;cm@NhOwjnPV5Bz`f6m`>&f#@A-%_Q!*KkW)|=PRqy({Er6zmo7Ox+IDI0RL_R zN2x5G9|ikr%Gpaf`Yt@S?GSqb%}-YSb^Nmp*lgk%In=_Ph0IO8^B;Vv zg~}tIfzpqWSM6GgZjE&x8M=?5PNlzxJ*x7*kG;uzW@6rZhH=d+*p)>7sV2XC2q-4= zyQJ0foTFcn90&n>l6)ZQiR*!x3wO~bIOiNiJ`~dc4;aHWS@w8w@ zn*}qKQ!&I7j4sQ=zM?%qX_e$tdi!w?`Y6Wa_EJx94mO?0%t|{Zc!I^x;oBL%!Ts?; zq+6vgH=2|mDu z-Brn}tk=$I54dl0;tPpupe?E7*Z6CFf7%B3cZiGJ!Zp!0u;k#X zF!dA$d>mYhNmUt|_gMHht$yo?ty! zHf8L_uc|q{-u*JM9if1_cT=!_eFc-;%j29uX7+c2!W#?*RuW?^!T@oe3V z*bb5}+1~-IYZ7P|mtiDZ?V3otGOtapnfQDQJ}8pOm*hXmnED5Jg3Y>2cgcZO@#+3) z&F;+U$u<7x0yl02*76GyX)AC{&0`;vk9gfhzqq(t_Nv@PzjV;9S)h`n$PW2A49yjxeGlSX~kUeCWL(ev1P7vssE;bD$#4S!oNKWxl9 z;f@5#jpPyUG?FIVvvbauYPN9~ZMBF!y_h{-Z4%8Jk8X9Q8Smc)Ow|_F|3dXe>EqDH zRvK$);g={s@?H#FRnE)Q8)@@6aG~;60n7d2KF5P2_3Z%pI>O(Wcd3!QF1{~fzi);% zh~!;DUHVqXx9*c)3pPS`s^0~)Z!3FZ{Qkz$C5+D^Bi=ur|JDA;`#b->DJ|EGckKh# z`=~F8x&(L8AsRF1Q}>rvLZ6A}sD3(EK62*WNuP6nyDm+8sOTM?1LUiz8`^UbG@0n4 zHej-}!pQYO&+AN4cCDwkK5VZex?FfMhV`?l4ZlE?-=?`sU&?tF?DhZMoFzKgKgys@ zp?@c}g}*<3U)>pdCCO+)_DT_6b-G{Yj1Jb0%GTbnnX>ae$>EqRmq~wUVj16k(Du;8 zpGSDFXLXAgKNJtYd=q@H;x2jz9Zqav~`>hGfxew84g|)%_;e7#J|T0 zJ3cT>M^~Q>-G82)yWz9X9Ma9U**biK`4B3gPp}DvLS4LNA`Lqn!ne@J-or zFZ<9=_^#+?_I9xz+P3Iy<$?xEO>e_DT>0%r&`geL*+OiVvO=BJbbgQFyq18zcq)41 z5np0@9%|XWzri`?bYxj`{@N3+9do6I9hYZnW{A19GbU(HYCD=Cj@k1Cnps4_LZ;t}CA^ods{mfZw$l{*G+sE4UYO zU(0gClnw9(V;omzJON+nX5OEG zm-NKXj2&b6_NIK+Q@*7~`)|gMft4Y@2a*L#hP(+~sm(daf3U?@Or{;I!dVH zvU?SKzW?$gW#1Am`-vgL#t*y~eFMrZpxi4NM;~Vv*Q&S$T7wR3t172C7Sx)BH77Hm z6QHO4%$u={-L}DXDSq&5Zb87EOTOGyaf3c$j@I8#6=+z5x&`l57z(KM-J?&;)LGN_qAJfO0>W*X0aV`;`1RfTCDrMu5 z#+)B&`LUGWGi+23#nJBRpZ0xE_NiF|dZ*xbtD_9OdyIUd#p+^ur@YHLnM#b@cQ_aC z1+N~VE&HfLa;s?Dy0Og3Tx`+McXStEAK^f6AcA+*&W~)v0&45K=e3o%Pq}}E?mf!& zI(5j;W_0^fBJDGx+ZXbaQ`bkVnFjU+@NkoC!Dydg)&BR|_i8`wiyanVzf9Ht-^T_+ z`;6$$HsN2&jp(P#t~$D3>XVQ01NIk;fe-kDC;mpbD$fz z#Iuj6ebVtfr+xIdoi^s6LmC+q$Ev)IZpOsHm^iF4$qD3~Hzpqf^N(!t*0@|sANm`g zj!66e65amr`20C)e8T6hO!t4H?XO9(i>__tym_X>eLimY90U(Br^H_@f%X!PcXNkMJyeD+ra5qo zC3h4a3`F6;dhCnh$0l&{0F`W@cL1cAJ0|b_^v;2e{qu9cV6n<-j(}4)`a`+0M_);hQA6 z{mU~KyxP%J`jZaX5MQzJHf!H2`;DJ8(Q8}fSAjF=*zaa6@MA+9vN0~VY>Y+oSBWon z8T8U!p5CoF# zfvMmN=*HBLZ>r%PyQA}h3!v>n{;bdyIaA*8v;N|q-48AD6g&v#hVLY_(VyXa;>S+9 z84mpCIab*RITMUz>`-eQ@Z{Q?Ji+oIp5X06cFmkK0lw^IPqf(L!|um-)=>8d z_Mu6%?aQ>SJq(Yok;bzf{GY-+Xc}ous$%~r9%)R@pOjqFIu1HLCVJ&$yM!2x3-wrmzZBm#qT z;B^1lF{uA23f7`a(XWX76Fm;Tr{?CWkAh#MZ7_h)GvUldJ%Gv0$aH8}! zur0#Z3N%(rG4r^GdAtJsokiR?;ZIjO4IQsA9{5Gh(ix5Oe-HGh{DN)ep8G!@C|$Sb zx!d=xK5MU}K2|~BaxdxFV%^=c7i{038_0%6MNe_QZ1ilbMe)})k2H2_v*_B&V$sGS z8^e6+>!RM1thW;IzI+9}4tzUPVp`-c2s@+S+;7U~(BQx;lzqfZ=-CI|St0sVdq+-TLJW|F6A0mzpbmGv%#j2R#V`8a(sfZ1K#KJ>ydw z9=zdZe5F0Pq3(uX;(za{b)LDu=KCqGe_gj}ZuZ(YyoFq}@6=}Gyqq(7#LJvcALS>i z^H2;nEUu29nDO`vTaCZ4+Rj$|hHb%bSf^>qj?9V?rE$(W)wggJdSIHT?mhLT33u0* zTKE*aEIpWY(5%^_)g^O9p4&cpUFn=XAv-ZM2N~=0>q{$peq_mfjVxrgjL}u-G5-r~ z5k8UMmmlzq9O6*C>F!F1XWjvmTqpj>n0Fe}i;d;u@WCsPk#E803++2ImZI_Y&*5Cf zIBK4pkc}*KDeJfk`PZo;=8ft*39O~p`wsi4&JfZ&Ze@OWTv-{d=tJW}!qVL>XRgEh zwRCrDfr;kJH8ya!=HP7hJ>dk(ayw`{^7VJ#T0wb{n1!BBgYnAdD&$(s74pet;G-=* z&sQf<{|s9E zW$qo|;ki58EPK#A_OH3Gww2a#HW6Ln2TzDjpuc&tQ?#LfEE_-h3VxsY`3ANib&S)! zbFoQ4wtveXMrP>!iP@tve(?vz6B}v8byG~UY|d8FZ7!$%(rxz7H_>fQ?b!^?Al#tx z3w3V8razfI<1JZR;Gx1Ikgd%>09MVlw+UpivJ#rjyserc7*Kcca;U&H6A z=|P6DbvkFgXXfSti;^Yqi)x9j<$t<4&7WvmZMhpdO#7)n!R_|5mq%bEUn-&Ve}#4a z*O(~%g^~CGz1CpwF(%Im!$`DPJKyFMWX@l7U1m-0llaII3|*ob>SjV0PO42YgFk2Q zk#0cbj8nPt+&xYB-Dh`LJQwk@D#71*;O|`UxBTZV0sh7KDAQat!+WJ4Tl1|h^nTed zn!|qeG&Jfo)&S zV)Ps38!fWmH79^G*!!BP*9(q+WtDs51ZN^RKC$PDiT6J?q5l5Ih?UH~nAlS{@rF-) z;Ly3?_)glY{SrR&hF#!z-FI`hf$Qz~O1d9>{|oTF^!Kg+x8rYl<3Moxz}4=J$-GbG zp2fSdlDpFg2;Yxce%p%!Hh2=ofak9O_eXI3_2Btmp(7=osPpl>0ge~0S3Kw4;Q3AL z-{s89q4ZsAoORK)9-ZV)>^VBadwer($z>n&0|(*ai^2I^+#2!?DL4zp+9$VCPb;(m zWBj0e=V~waNoG!(;6D~vYY(l^I-xD_=PdtU9sCpV0p`XRR}a3pD#AX%WZUo#w9f4R zg8#3z>;?F$JLCWBD7d~j&KcN>pD)cX@NAb8JCS&NfhAD?yJ25o<={O_FA4nCAl&2| znXyIpW#Fw{+TTJxz`WsDa`nLC=CCYEJP`RtcpY9Lw)5CVgzUw|ThKW!hczZzZxZJi z(KUjRU%IyN$xhfEc@a2qcCg@-!yI$7FGb)K@mbaohLh-kY zy+?3zvAE>y7K(!M9kf7Pi{^gmWQ6iRSEv|1)bT_mBHEavA!vjlH0q{pQ3^ z*7DuyU-D|-LcyUu{QYkB`e=AOL3#gGy5^bZjU75yYJbxiS94W+ivt->KKcMT=y;td z`JX8{=$tw6larb3v23i{ZiM&6+1ZzDJl6*wH5*?_9XIY?-gYB0HS+i=PkF1L)eUF@ z=fEFXeix*>+pK|h6v5&~NhH!d5_@yqlV1>yU zI6mGPnCEl`GL3|u!ijS~S!k8(z$4?&3{9iGPP5O}#ARZSlAr@TN(7a(Cv7 zzaWh@ip^TsevCS`e@kAev#|?)3p6J7Y3X@m&4jL6bWVk9PeRAZZ~l@~=#rZWfrR*k zKqoZmv2g!?Qg0kQPG6tkx*osF|7`6q+4%F$uKpFUc$@31_*!NxKUH~_@(=zw@_p|X&>`0rN8`})%N8>7x?}L zkAK3q>7OU~5@)y`c=^ST7|DwgM);e7onvBAiSN(qds&Tx_Xr#XL$~J8CBV$aKKB1I z%)aR|Cb@`5;x=6+zLC(r$c}y19CN#UA7OtFF0o`f%s)S{tOb@I0B7G-#=@$8;8@Ju z^M~i2KQA=*IG_8Eb4HjOHTUM6KldhlOY}cyq0rm|&olR&{mwnotht9Di99B1(9bw> z?wiD%Iy3kDQFE`7xu-mlxx`u5ntOiM%B9S`==_>{bC`RT%sqeJ*||52_KKG$eIxlQ zitO{btaI&=AKTF%WX~@EZ}-Q~905PG3_3z|=BL1yn2A#&W$3@7;65Mvwh^A+?r;oE zOFw{d6F*gcj(X9>x|X@^1DC)fEW!V-f5g-OlI8;*m9B5)y37&S>e;%W69Xo9)u)(F zD}Rry=d-wLzNn79=uAZTxzX__BHzy8T_S^toT1LjiEgpvbj-6}`|cUU%NX8K4!!sW zGSva>F=~q^7dgpQQM%Pp@iLS@;@?lt(`dKOu6iEM^T+5;M7Jv%e%i~HLRXC^fBP$f zm(${9YX224^KR&qX#auHyxX(wztw90V(4P!l^km}^+wtrf&+g3qWIVsj5WAF6a1vM z%mwe=%$S$m_m%bv=x94Ic!RMQ9F+bkd-<-c(^K}^hUfY4J-!T?=!NaNZ}S6F>XI|HjwyV5$MVRPnNR9oAaGxAk74c$llKyk)(rk`eP?qrPW(Ju(~Td})_ zp3`sr=U6p7U3or)rae2p$}2gh6^Ai2zG>0pi(Ylq_^Qv#s=z_}Lv(BvZ5azMG(yXc z174zKb^f|Lg*AU3O)LGV=ycJzJJFNby8DZ0+yslp?SuyYM`>K`>6OeSY@yeOmGiA8nVeNF{m2!{|bGwaGTr-^zUnSM3lpxOdMK ze5|E*MPgG%V%V0kE}~=FRtzZ!>YGU&A$jRgt@F~z`O$ElzQ#*E9gO!9;4lvS-;8Xh z8CPp#IR0rrKM9W{pDu#c;`{JbY7cxuTLAF z#q)renuqzWvW`KoFCl)EbRe>!x0|x#OXiwxw`5?NUrp%P6UWx_#pdArE~qczoqgd3K1OsI#HyUh(&2vy%#c?}6UFq3w?{7X~=pu1C?&1Sc0e_dx6K zPm|nKwx6S)UYjQQ>77@F@bz2pzNBLy_y{f*{zDI3ekh+^4Q;c6wQv{rD(>htF$aQe zg(3ZeG_|i1MrFL?bhDP+|XXB zy}dcSw=W6r?aD72iI{No_*Z=zZe~;xQ(nBYs0+Zsjm^Yrx58_ti)&^_$`S%Vyo~cRal& z?dQjD40dM{9~Rr4BVl`>Utl{RTc8hbkS);Quq}{yI?^#o#~x@H_CO(BmwVR4B_HO$ zanL$%T!9QSQ?x`(N!#(X;4#{oZ-n$Xj-y-l`8`GS=_~Z@dir=BeVvVulv%_~w~3ZX z&5SXEvM?SypbPdM-2KJ=<`)}y((i1>pY-}wwguG>G?aoHun&NCT$Q|_mjAo3jgWurgj96?U3H}| z^S;RP3%x!quqtN30b-9!AIVSbamAvZ!&$8IB>vT?19~zA9`dAo$|(TP${&RvJe!Lz z=}Ci)+eK5z_GA*{zK(eARVNFAa~Pj|Gs&{2QM)5{+4SG?Ilr)=h!#DLkvBXO^TcBZ6%*#(txzRBFFJGqkv>F@XDx1HGzA9b1UVmkdDn9sM z7=QV+Cf;t|-s`giNwoVqcwF7ToE~r-JF+bEU3*OqZ5;Mne21ayvWqq^lD-aO+HLMy z?!e#lFmOvIvBR1N8w>X`{*J*JDY9vxu2TI|4{S~h@GL)RdX^WVkC)Fm_88?j;?DlN zjk8_kUx#U2)yw{sgCoss%F(mR83zwVybN?T2B}?6yVGsSYH8ar{B^1gOV}eK%mE0wNaWEea z#HI(DC&sqS!_&e}WT4`4-oMseit)ZoJ3A|5TPprJE@@PZal>pb@u~)p9?SKkg4(4|&)Ku&FOw<~ z?;s9a>NORK4|AW){WSAzZ!UZV)ojf zdX2TudY@eTocC92pZ8jFUg`I&-Rx~$+v?rLWo&=in}F?*_&a6vuZy<%nYT-ppIo*H zm`p%d8+yaN-b{3dbO9VaV}WD$^6q8Z;e`kWOBp9{eG2!~XgCxt9)49Lu=s(?Xc^2| zX{Bvg$sfcMG1IK?jd9qN4ctI1)qlO+xhi*KF7iLkK_@zpQ&$zaH`!xqw$di)wAs)( zKb~*2>uht3n2){qv=e>s0q@=Uo_6tBSoeY9_$6|T8dl;kN4WJ(^ZqpcAc`pC1a?+V zo71H;PBv@K$(-3we~am_#s6U5j>CS1SkA;0i|aHW$vb9r}|xtuR-3v#Hl z$STVb5N_zAzQZG9TlOZVM_fp)!eDJQu=P%%7`8LltY_QEkc$oB-XdmC7-S!L1_c%6XmXDQ-r7KQ( zA3CazT~`P2JDxX$Gr4SPkAZta?S;3=yL^)C{dk-Q9m#NP z`D%xMaPUL$_($OJNWVmXg4fR4daoIA+EJ#nNtUH+DY=Gdptqn)Uxz+_<33OD_>j_E z$G7e+?Z&QIJc?obKa6&U&Ip5`Erwa`7r#QfwcY&Z#GXg`5z=jm);%gWU0u)^Etgqhy-M#`I>+7jEP4h#SBsYrI`hEWfCm(^w;mLN!5Z}C*8GptPGH0tQRhT# z9vnT#=;Kc4r097R@nNsA$LIdR{^LsYGk*Wbc+uXAjaOu>`s<(0dT08Gt$uVL&yN`p zi5Jkf#&+mk5*Ncpya1!4jd{^V3@7$A{JT2>b>P>%=p9NX6VD!)Q+MtB z%ueE3aK2fGpMkrG-4lYJ(b9x**jVr>H3W5BVgrSY|h$ee4C2~ zsd@}K8n#B#5n6;@Ryp@7@JfJlc?mjLmDp7K!5LL!T>B8T$=EAS4z)#bN_;~utqpsphTHJ_OK(GFE_$_7sDA=DEi!kBUy?1o z*ERp&Y3JGX)w_3cxcmwKK>5JcF)0k!t1hh{jaP;1fq!zz_ztA%RAeT-Sp%A z{^rLO;qvqTf$}v!#)tcH&879DXk56SYyPo%8uP;S+<$5HIC8`F-2ac&;~ou;WUYxu z{_ZGZFZ46!IhTdYuD~qL8CYsb^u%3LkUs`_}(bHD`%G)ow&fe}U z@Xr_E9nGUE@Zch78@!BI?dcCU`(o>Y--Wg*+hS`m4>ejiT=C%|@`&BB&_L{AqIZPf zt$qPRUk9{ZINpwE;Qr$4oF9j$zxvN#b2({YSloB%uxK0>`e&c*lK%;^&gYB%Y8w(B zs~=w4Smg{3x9^9SUe}55G^C*O?as%4j`ZkbvgfQ&Tr1y$XVnf1q6-s&T~=1Zy939lyq5woTU-3;r$hW`IknqqEUY=5%S(f_$vx^RQet5zNG zz58pM#>fr7BlEX$H7Cj2cx_$j?>`sc6&oAQC3BcZ7uzFLzUPRPr6nlStL!Ab+ zCw&kf&vm8IQet|hiGPkeffes^o)zyQa=yq4|HEAASY#mQeW4-EDIGHG&GYy_Z&~I7 z$3*<_R+debtxv1!!RIRawSMVRQ>W$Qv%mj~^*`lP#?}9oGF;dP7n`R0QpynjGC;j* zkKo}jP0JU+ZhTofC#)}Z5t|O1$@H8oXSz`klPq{CpYHvgVTgZAdh7<@FJA4{cu)t7p4Ezg=-eHQ6!Nxzr$`$+$1(ru@XGIp&o zvq`^>^hVOxk={glfOK>?@tKtGT=nPH5Bty!b9Lm^ta@;(kr3DxhC6Y`yUOnMd{&3< zXJ@wY^k&9b|7DT?`?T+qTYnC}$As@=e^~er+IDDO9oS|ilJOnvRh;~?D7|)hbp9h{+BnGWyw?E~(+Os#@ z9`RuGt~{ULGn+omqHl%tu>hXdFD?GlTlDQs+J*Mj!)RJuQVN9ZEI3aBc~>|MJS$i+e^vYdy$PUA81T^7#>)o z{)691+-U!J=5HA==}#WIYl3*?#9O&ox<$Ji4@=fP7T&^N(ZATfW+42lx>D)IG;;ow zFW*Xh4$Q&lfCIj5$maPLt1oT#l!#(J>H%7^#a(+f_r4RdR6JB}XD<8k(bPulGVe>BQ| z@F?xle2HPaB@5C#%0gDtw&tPj%HM^4{5m_bGh(wEtg}Vz^WsfrLT|HoS@1diY2W0d zTBr0&zIuwe+qpNzd8QQ)Hd1VDwI05!7-~8%! z%Ptl8c<_fZ?Bl-4LD~kqN;8cimJgP!i;P)Tma*_5^1iV6%JxR)g8HxhL}T{ItQhz{ zrKc4Ou49dHaE>|f^t!9z1=&+hx6d*T&ftACeXh5&|AKFyUHqN)E@Ivc1*Q*?PdX$Y z6C<#1Pj-)s@4l+Lr)r&R9~JLdx-WL}G7hD0vS#aS`G-~3Uue(vHD5g)8vCy@4+eMa z>g~Jc*OV9e_M9y>aHBmwz}P2S?Y2AoCqHG}-1Ncj^gF>9E^x=fr`J8E`EcS#o6A&#Flf-q`JQ2@T zvOMj(e&lT1><@3BW{)pvwCZ(OK9mOGcP|2yHpV9nIF+y-z>_K;dC&h=Cya2njvEqla38kw4f2A$Gw)6mfndp(8yZt-uk@n3F!|xMt z*N3$ABjiDbnSWTm6+W`Qv5u^EeD!oU`Y9G3c%d;(W0-4x^>nuAALxc&s~-8Jbar&H zz9vVFZ2-KF%%c=v*oPeEF!#rnKCxMH0^VT!ySyd_G5f&TYY$h@r1gvDgiBnRmar`I1M9>y#aKKX@lX+OK|SJuAg zxd`s?glN5?(J?`G0^eDj#Y)hR2F8ch5d&i^*IcfX_5pc2iG}eJeBDjttLI*X-u?Ii z&Oj%2K@-rwf0c2$%}m<30bBMO?2)p$Y}l8?V1vU}7l_3U=dG|E&fAQq;^U^qxC7-Y zDqpN1M#18$@)vKaTKeL3#3L#s=1?}*VlFHGkiPl&#`_90V}ow zI0=36o?Y}cexlooHR7jl3D~eNCBB7X(G;;qyXa#geN3W%?}z)h89RW&u>H&)-LW$| zu6vZ7(UsJ{!8Df3F9SNhmd$4Y<1&)9I~Mvk2e=n=oe0BTvL83&lA?5A{|fM)tM&kA zd_HbWaySAXVB48Y{EMSLFkc;Vph&}}mp>J&T4)Vmb)Ulp&o~=h-d`q4L0f< zdq0Lc3kUOU2>YkbP2cBiq}T@$-kj&NzR5dn!|KRTwk5Lb@Qe=ID&giioJ>56?h%L>Z^V9EJ zb#>!Qx*dKSG;J|(3tDHl@VNzq60;d81cnAC=v2 z`h=8rEB(B4(-q+4KK^qgK_enR5})p3>(oITm6nB%fhwL`?Snq+STkt5SX@ ze3$D0R|nURXW0+#Tb{SQYx%hCdzX*jew%G*`z@=D-XXO2u+3;$X^U$qTGWLAH?VEndgkC=d`G2?B37hAr`vx*Ap{b1Fy|+<1Zn8;OLA5;>3xbZXVP^*Xe8ryLMRrGz;Js@RbW-h*^vb(D zz1jFiDFcq>KQ=7Cwq+0Ujd8BH-P0@IgDVc9=L#LX0=U1)UApd~p_c&X`;$F8e8`X6 zI764+PZ>i(^($==0QbgRDa#mn*=@b`c1YQx}YI^$ku%L=yZkY2Kn@=?3mx~ z!KT>2_R-wiT5aoY^%jiS>@`MYd$UY@0GNpZd_!6GdzIvuZi=rdq??fiuFqMrVy>(K`FwBK=8%32`^ggWpWw_ReLp|&*krnUJoLqZKM%cE zn$9jmeZe-;2{vm#~Q6$~0oV-ffAl|rW6qECMq#tUh=GCLcIRR^}CF5HG z{m*jXS3z5aOXfayf9Zh*TW*)%4?ntQil31SK0I2L`=WeXE&7^q>L}-}D)c?)f`j3U zw7AjnTgtQS1zhxH1M7Ah*Zt$S<-Uu~-301-6~5HF=D@&L9RmaN zNk2$>mhJM4Q}(0|(^cDPPua6A8~f5R#7Mb}m@1d!kF4+yBdfp4`+VL@d0)(&yMy;T zdH*i&vdw*z_wVukeclyg#ZcUr9K~N5!-X#y;#3>Nt2T&Rt$5o8@x2Y=d>h2BRvZ|` zs5Nq?a9xuzu@Kr7y8Vcm)Km9y-@-)bbm+pa-ONkHT~Yb+1*EZfmOZ--ousM66nm_A zYM|_yT{F#P<=*lN;u|b0Pb~9tj~VuDYdlKpW|nz(&D3*wDRJ0hh;gHD6?}{2A;0ym zJWX>tm8ZO#^gonW7jR|!$`egrxwj18w2I^Av6KJ#|E4-K!gUhcsO)F|O?9S)>vU7+ zzx_AWiN62~wn@~v=fA1WlyIHI#41afwL>vFG*8aoqfGPG9~zGG48v2wJj~7TEHHL7 z?w=a4@I+2tMnS+cJ`0?gb$}R&amEg3ZP{<~j9rJ2qXddS|Mo+5RaGw<^Rv^o-<{PGIqGk3;S9S2*upB%D9}E-TmY_Q^r`}(NB6oAQY3=D&q>^(NCT; zWn2wB`bjScgk$y!?o)tAKY7lS@nzuAPkKS%D`&?yA9(bW=S&&1fQPL=cody2<14_U zpFC&EC;=Y*q!$F{oGs%9;6WaA&jPvD9IHHcjxk49u-};VbH*DvV>4`Xh~XKYqbBbj z{J0emf5|kRPSva4Y9ve0F#S7t2UzWLke|9-m=pAD7!as#81J>#?4OV{u&zss`W zTZc?08(M8-yJts%Rqja2A{I5}dMGzb<+8VCvxknP+&s!Hq+G@A&Bk|A)xNwyA+gJ} zXIJnp`#|ltzhUIN6)fxgQT1=`TUZAy|FiYa`GWet%ekzzVgHPBm$%dY z#^&m*5sz2}io}G@tT(ny@Qf&*(7MO@S=rAD zcPPG{wPxpLWt81w+u=(jUIRMZ=0L`D7%;zt{YpMR4Cp5_CdONl=pFk?%@-WmFDOG6{i`@+xbc-|j=ZsNHs{2buv?`y6G<>WR*~oAvU4GnRWM zyxjox!@s;xN9EssQ0l7q-dP=$-RJ74)XQd&|7A0ni4I9TcL(oXlo#R0{%7`@-Q?@$j3Yi_6K58sDWB3^v~8^E zD2bnjii&9z^X5I_a=PfI^Bv}EWU7rzb*do z7ugFIg>@$2m!(Me<{fnAYU#&T?(5L4$wzKFm*>$*r_rs6L#`K#Owfi-f&ADR9kzHQ zH^yNEGjq&f<_4qpR^pb>my|~Q{&lb9o?!+b#V4Nwf60y5op)m&vvXv$P7XFhoIeZk zujh)=$=Qe85}2K%ljGvt-k(lR4}G4C?$svRnni5EPI$?Z1Nu2D6>wIv`ontQOj;@( z9@%kMF^=(+KNkN3^D382t>rwav6GKT!6FmeGW{zb!*248Gh^KID*aP+?(~q4vcvh@ zR=$bk+l21>F6vRa?1@)J%7uq;LAhhdUrYXa#$Gm#`u8Yv2A%=qY`63bzP~4=PgKGg zSb7X2m>0e9TBJuZ%|1f5Q+z$&L6eQ=W3xR}N_* ze*W+dGpu*`E_;spEFZr8@%N+cs&?AUGj=>lw8MqIP~aKtc(CP>K2IGyh=znc+d}?B zvB^Pas2n&h0vELY8JQHiKV`^ZmDhDix1LcjtU^npY4+hiW`A1+HDRV3OQ-4v68LbD#ka=CY4&J((dg2+2 zle9%V?DbCv9>brSctpvy*qErlHrlB4Mq6Fb$vQQ1of|j9i`1Aj(&o%CzuuaYQDx?v zE~~s@c4TxGzusw;=OE5p8$4?HF_aF2%3;h(A4)TW4+4ja=|#y7tcW!(xqh8@^ySt8`I{IC$rCP>AQR_{N2J8 z4cJjKw&Evw$Wuo@E~Y0HDKm%v9a(kw#4wgm;U8z^JrBB|r9A9$x)*S-i#0m)>y1-c ztk(k zz1ZCO3v(prJe|5G+An>zJJ4f8ww3Z-3dGP89)7`@7dqd?n6BPy}eQEWCs1;#JqeQ_)BNw>QqaAFXe~8O>5|{ ztf5}|@kzL!T0>fMh0qTg56$%>m*EG7yZH1D6WPxE83AXuCs+IZ5!QpDJdC0INNNt} za*5v8df3c7bMUTsv;PQPu#Xr-Dlef|2GwLc{92y1^2-?a9}MzxDIbWR`C&s~Bcuq@y%7)Edl^51D$ z{Hw8BK!0AN-&gSdF!x;Uk-QO{fqZv405}I{u%Wh?Zy7h(-Y{>F|5y9kY_A7DRy*G24~ zl27}Q+eFK!m3N7~E||dH`Ple`jgdW9`L*9ZjGxQs{F3joA0E4?^G^&K+Ld_NWy-@>;g>ig>F83`Xt z@{kE#i#;~$<<^lQ8JX%-%xx!peqVK=W$RkP8j>!ci}>5Fm7)0C?v?Izoev^0w&$SJ zsk1>IDJaZz) zxiJzS#ma*WRCy}X3xfN=b!FFB@uv?~rXX7aCv>xp%jr*rOY%Y4xTjfoIu<%c^V@^@NQ1xUd~w9HWCNVL2NLM+Z=qp2GAo`{Hw}i6XuU&4)_no zCFjQ)6NSI?w_xwWy^%ac_?%L#xdg^pxFiAFlJ(e@Bx_zK6^QnmDF0vY+Be;J+s{3@ z-$~w-MqJ$z#fa&|H&f@BM0bLjezn6)Dw$v#SmKx#pDtgZ2?;N!`Is{iz20JC#DwCU z-eko&U4%Y%F*a93G+UwbVVTw*wCi2B7{RgFU^&bLx66!o`x6@7&CG|T?z&(mdT|x> zJ&|>DKkci*W&+0VBzE*DaplPi)5IO2g^e2hH5YIk?DhxY$D`t35iC_{bl>{L1a>n`}GO zSDXPYJV0LcKM#9|LBRM-d7t-9LiSBeQ1pdA@0)Cur*E`VWd=Bts4Urb93Y>{(>Xq+x!KR7)PyVBd}qv(})mQUCYKZ!Y!*wYG~cf?HS z@k6I-tdBs$mQzL#c|NA>lidHxJtsEVT?t;3&$Upj^}}h3y&b^^x!7S%u zsty%_-wtyg8p>WWjJ;$zZTJL#UOF2;Y#Sl{F!mner`a4m5QYnV%ym7FK*uWQp6^QM z`n2f7bK>rR%X0qKH^~QnP@9g}Lbh2|jI(^eRmDLwNC*Ddgyc%_M^UyjU3f~*uH$Ph zy?D2OjfErP;dkW1yAe)PjL|tS;XBlH``u0Kf#}Lhj-JD_6-PAO789H1Gq^F_-VW>u z6u0e6d+{$2$y3B08Tr0DDz?xr;A)*OhgmxDr8+12@NMXX5AWOKg#JYDx}3{6pRB5$#pWrm7#Uj30XMEw#q59-VPXPtktsfY;Gp zb*GgFys_|MU|(ybT6q$IkIEYhZd7@S-*l!t_Mr32%OQWb+>|ofTtM6JVjqe4pj^pV zD4yPO_L(eu{$aJdEH;!clt((O;RU#R2UjILnWwcoM2tZCJNDK3#nGEb2F?JBzvv>dvEX7ktqy>NZq2|7u*dZ$*4f zXup(>y>!=9CU8#?ZFRyvCC>>>kq4ZLor-IU-7UPpD)!T_n`tGv<`8%Ou`k!Sj?|Y< zd%7tNT^{Y%leOn+yvrFE(G?E-yI0Z|tv&exJyU-)O{6)3u6ZT2$q9U=eE7JLyBIp? zG<*FmrPtx-D7B*;_*77i;vU|d;R)UfJ!8$+H6fodM$G9cTAz19Hte(Mjto6%Y%*#XAxrX5PQN5>E&u&i2tg8^C{m14{HAJ21nn(zjM(gp6iGYYyz*Y zV?D(?oPj=gjgMpdGY;Ld1o&vxZ?5>w`xp}QW8lAC?LCGcpVyN;OaBo+KAWBSo%Q(fd7Swl-M`Ji&FUZHbir7h(f^KT zd;C!;b<{PK?qr^};%Tzj9|0Du+l3&D)J=KB6nYRH%QW`uBx6z|@X&r2fZl{xP}&5&a`ucls6#x}$Qd)5 zr#io%zMQW!9>A{ejLvv}Fb<#l$`a0naa3RW)fvYIoTGvE?{jqRgOZVa^SpL39=*Pp zkPn1)_~Uh&M(~CU^91)|d#$;ly}F9AQ~9D#xL=yiIQ`SPT)NH|(;1%_E>Ap^9(amp z_}k;18zV7xBI6;Rd1O2y=XdGZM|j+ZaW0QrZB=@tOcPrbt&>Q3V_A3b97~7L&Y`sP z0viGLwJ)*}2*U!~>I;3xMQj*^8x8yr2uFN=&rWQM(P`ve?eM^V$&8T?f!&sUl9d*>);R@Y1*rz(>}Xx2R6PYcFQ*Wbz-9!_DR=8-(`P1&9FdlP)S5@^BK zGmVxf7uycLP2Vkh4EirQ4tAPn>}7X-);FaazJzQ*9=173*z2u5R%LXd-|>iTi2IsP z`zGD>Y2TE-Bxu_`lkv%y8s(EO1ka0@Xg z^)0~up#D7WjHRryk^06)z^buwL7T}zLPQONap>1&JHrP#~B1teR2!!~o zCV>`#2zG)(4}Kvykx)#bTTN&&@3U`JVSwPT`?ua(>$l!|f82HNJ?Gvt?6dbi`|Pv# zK8eKLjiKIY{6Cj|%Njw-aZ`@Ouv|zCU|&4nuv^6k+Jqi2g_yp9a8eQn;U7^2X9|Jvr zkNwm{UX^NB5U{f*97?I%Cty$W`bUt!l+uQ!MLW z)#Q$zy=RKOwq|lnO~K@71$+FkBBwEIQ{HsW;FDOXR#j(?Thg`H^d-~HrpX!jvk_~3 za!j?6_M{Q}?F4S62r{MdO7Jv;*gRyEmC5Qu+B-;=VtM4lJUg9A{Kag z!HG2D4#_!;sj4}ZGyB38{>IYNYD_hA&Rl9rm@-@De_wqu)l!cax!ITyL#&xg>)KDc zf%2qmv6V65|6$&_93L37ThdOlf1R=NsSyi`^0DEH!B$M{#l*gQuq6k1Sk5g|kJv1N!epw~63<~m~GwTLXnX3UWIn7{1xX#5(gy)9|ozP^;S_-j9#-TS7S3gsv$;; zi*Li8O*c3L9{_CGI5#yqT=B>}_uu)58MVEGf3rvSqkoS~c%AsfRO2Uh$y}rF(`xu+ zo~-}E44*_+8~!q{I%>9(yOQmNC zU4@aNSC%vK?&nOJui4*w0Na&s*a!TU^=vl&OE%W|Wy@}dpY}ILO)=++j4b8%G~&y6 z{c>j+ydd*>WLx}((kW9ElZKb3!#0N132GCY!K)lx^!nIvmbcpGG{4p5WcH>+$TE; z%wB?DFH1JhF4avglJht9c5|4(`(DnIy053bT40>{luwsZxUAc3fou9ATbplx%xCie zO*R;rA5F_A6?x6iJBNk6m6y($gBxEecA6io$jjh)*x*;38^770o!Pi?_)@2N+lIUa zr04v5sdHG{hP-<(K3C=4C;uwzobG>Y$h%+CN3C*13VA=;00&S>9V|sd4BjN ze86V^-nsGls=QqJZnUEuSO}dL_4=3oq44i@vwCxeTf)ktGj8YHvcH>39N%-zn;Pjl zl-$SF@9;#&6Aq7e+4TG0$_Oo^%~Ll<4U5^)}ZN zM`K*YTu(%O@4B7ziANJ%|2Q(<_2lsnTuY7)blrV;isPxHgIw$Gigw*|_s?1I+Z=x)tY9Go>aZTQx+?xr;z*^8oWsK$Gbm%> z;o**){~7L@a$$-q>u@}0$3F}exH*6?Y zMp+$R>OFbB#N{6Fn5#SW2GfuBsBFjE10Hv|KOg2Wf4$Ll@<@y;n7+Igb;9wx0UKT0 zxlSCJ;4&Xga4r0%!u8y+jF9K&M!ODJGeTB#J@h{VU9&#F&N1)spBzv9&mh-5pI`6z z>3^77XxvPoq4LlpEvz$Kua3sMsYK78c`+!j+&(NlKNqhKzhPrO~e3awt zkx{NiQSGkKpRRXJ`uttTDAGa?z3aG#dTx*U(6xy2e?>h{emx^dJY}A*7X|g zx`#5JBL9aY*SmiBX`<`zhdho6pI14y57-_uAZmEXhf$M5UfU3Q-D`Iw&3dg{%&ds0 zk)+3lcu4b*<{_-#>>4v`!hjE5cOI^GoV8qVJsh>!6-r$_4{dYw zS)Adx+mMbSCugIDu;- z*91qz(Xp;av&tqvdQ;7mKH$`$L*pFVev*5<;}z21vlmQmz<%=wF809d4R+>{+K?8t z$!Gg*e8f^@dVfHXMknNh zon~;4X{*XpLKj-*Lzl_Wr5YM%83bJ}fG*|yman17H=)VvnI8+W_wGtug=@La&KPQW z6aO_y`H zyN_$W>G(q zMq8YYc-lJJvKfE4M+~DaqfMhNpNXI2z_FHx9fK@W$qzG)vgBb)|4-7R2aX0t#LhB} zvD_Lr#uAR7+*s3C%bd8emPfc}Qf2|N%EN|Hma*i;lQuh!I!s)VW3>A9^dX*W5allb zHe&C1E9H&xmp6xh#&#&Lg!)2FgS7ITFDINv@qU%|HWJMlrP^&e;4qd!1zthe*DNkw(A+&XL&BUl1Sj<*CkhJsUrEpIWV&w^uTNw10KTul1#7hrOhu@3_-^@ey$ORNtr z(q4ht)BF=p-fr@~1rOE>engDY>g+;WhjRUyvR5PwvCLted6x42;xDg-f9gAy2d%BA zekt!bdD5S^C~tR%@_e)~*wQs_sD_);?myG#DU>b!lsboSy-9k4q%o&wIk3x-IX!L# za;VYG{##qr?3n7ZhI!SQw{upG>>mtV?koYHRli+{&gh%x4Z}K5@6Wtlw!65RxUX$- zOR*bxl=uL0uP~RJ^lFiD&?KHs<)&Vfiyj}Sv>AIzUib3p$lwO-_f3@F=Qh*Ys&|(= zuW5KQ&x8!#ohy{2xCVg-_xH4W9?;o651+Sra?ja3 zgZd7F9tK%<)y7!PSdrQBLHP<8%Gup=ZmSXz1O7z=&moqTe_5utY&=%Em ze^1r(d-l?NGO$t<{>0r-`RCrY%H0F7@y8cdk+}N!yow*}`Y(pK#NRbEVyWZ!7uULWe=*e6GTmPJ z&)aO3b0U^IzP~%avh}{FDvKkYb~ulWcEulwcTI|1<5+AiaV(zN&-F#bvyQDt#agFr+_CJ=ryaZQeAb~HigqkL6yq2?Z;fMxp~SJm*2Q(-yq6ux zhX*>=^S<5|}vA+85VbMgMSVTqQ9t)nbYksca15j-BxHO?|_SORz9^OLzIagF5~ZP^qz zf%^!qB+CMPURKc0-Sj6kZi;2I^zpX*%2)2*`Sy^wA(o=gw>VzQ-&$l^VLB?6| zMZ7B%el2i$gnm9oKUaJ))+KOxow@31(!}q1_ZQ<_pOf}C-b3TAxBQ(nCu4d$ZN7^( z|BANSWAVEJM#=a(Cj+NsV3Z7u^l>A(CvXw}2v{W3@8sBtmJ!g9EjAH46Mt#(p`Oe& z$&v$)GXmEGs;=mas;du8R_aHcXx}P61PhPgvks4C9a1+8oL^WmqnvZm>NsQ6Jsg^N zaHyl4vvG+v+1;I9oA#jst=hTAX!IOo$$0u_KWqEbKc~mARxt!et>qoQsi{RrfbKdnJ|=BFu-4u)E_*M(?7ii(_ryCd{eS6Y?|UzMCr-r* z19c-)?cKSmq4|sV&o%$1=G^q+=C4w$Lx)id7ymhbI$VQ4S6xNLGwcc zH)OrPkiGGhs#-Mvd7nSjs+dVd?y$+)I#CCVkyTzepejZ0GM>LJ-;j6qxVrh4F)yAQ z^~3RVVfQ`ftlwXrr{}vznS&o^|6lBCPN5@iLT?f^M`^JU`wts|qS`0Yw-03RwhP~4 z=aX{^UGiJZ6E`Sb>(<$nmSyNAB=0M97%s|q`s9;q-cY)_KR&zU;83-j`)0LUo#g)u z-ONW3PgQ(V>Mp>c;rit zwoH5FzaO?$UU)pevOW5#%6YPGgpXVM6+5iP5{K1pbiKy9YVpxYuIzrVIZ{YVv71~+ zSfhH5PH}DQ_eVz#X*qVY%kV$3uJ)rzu2cOA9hIb2+JjwN4_R3Y#j%DN#@b|rWBr}a zIKI8}1;@4U`iJMeTSP zPu|;jKhJyUp|Or|cw0YsTYq@l3V7EFc+v`Z)e88U(98;W+6s8x3g~i$Mn@C5CvuJ9 z8pSo4YZBL3%Wg$ibX?KZzXUJa^3V3I>y#j`*wNg_Slz1z)jh2Sxu+`ny7e__AIdu7 z8SdJ;f_mOsVY~SJ%!;4WrA-UEV3&-(H$8f=Wx*$dEpMRjy02ueX9#7KkhY$*`%3zH z3ZiNMCqpdX2yY?JMqV;`PeYG4adp!@@W!F7r{*!WkXef*nxwWwauTx(j9tM1}^iT6VO~`3wf2_*WQCEP^iQjMOpCUPzbEM_o zSBO1_eEP=Dc^>iY)&FIJ#TS&j0Ov ze;EV)@5%l;c2ckWpU(Y0>KA>h;e!>1F4%kNoL770;I@-}i-GpK(t6z@L6X@$B@cPaF0}XIbfnJR|LT-DLIE zsipbGdj1EB=XJ{7I@Q-#UpfA~HHv4MzZ_q^Re9YgM`!Zkh_8+QZ!74Nzm2{=`P0#* z4)mAdgF%%KM#e#wCxOoc&+G6RALxgl{~z?LI}N^m`QYvQ=XLN-@Ic05!Db&^(_dFT z8E>hcrdx`fv5ZR>+Sh0vY*E1*(W7TBc)_`+VME>k(lbm`EM@d_NzX3Y-hg4@3TNzI z-#fr8 z%e(&jZ~0!{75?o(nezM) z^~(J^;3@Z6v{~-=n-tHdhFD*kX|Q%bV;-Tw;0$unQ)8$vxwQ&GRnhXwS%X(oT7Ppuy(p z0bcZ?E_r`)pUv|S<;@3P+P6Dxp6mSIrhj1b%!0;lp$(F^po0E0w(@*G^YbjzP|J;! zQ^9*Sv9nwis;BJTXPr%-ZO97-W~b>}BjxsFj1O2xTc#~4a!#w=kk^B}edg;d`>b*P zw5q%i((T&FFOc``>@f_@o-fT5g5T_1-hF@oS>cZ zTmeqVy#yMFro1=ILX*rjMv?8&S84P($TE=fWM6M7&cHJ;()pjiMDHeiX+F65x}R6iXDnX#^RoH-cnyGUwKA50lUiBO!2H1fGN1aN(?5WR{Ymv;U*ja!TJ=%(*00(0yGZ4hp_Ytu z$gAv49c8~&&d0WY2p>UTGL^JG%*#8`mq|>F1?Vp_fPt!4JnAijElc~xSYAJHyQd6! zwy@bhFF|9`(ePE`V3Z!{<1xIj!71}S@gF?%DMNHjdu}(Z)lHA_>}9{Nydkn$y)nkK z>GpY^_r9O&d42pm&x6<7+TMt%nUeL2u4r(}tRL5poOxlxPctsOHGiHbufcYKIARx^ z6IX=1*rj_&Ue^fMlf*Gv)2+WNeqfj@etwXvzDs}C7R$^Fv(Z=Yz40|?){d&YG3?vK zqkq_{o9C%Yp63Z280re0-_7-2*Z!{LXq_uLJ>2yr&$>ec9nJmt=jevKQT&tq#VFS; z$cV2SYo=Ij&pD@myCE;0^x3SB_s)IU+5Ek)>`{kCIdZ=k!3#yR zZdvn(Sqsn?yb)6{Wpljk!ruOWa9Y3Kke3kLC1lWNn?n+T&G;9Wr@cWO$M<4v7Z!c? zUWoP$d}tDRi(V{FJH%RlBHusxj_O(Q+4_(bUnGqD=Cds!>%W*d@}yruwS9dn@do_4my4Jc}&2{-?Q~x2~V(`2d;mSClyqo;jKOad^df*4rB_ z^E^NDJa5uu%c6OzC&HX)**bB8WvgkD!V+$Dyhaqt&M~tk^xT8k?T588P@oV?(fN>#E3<+yOnaRa0uk?#Sv@+J2$Q z{RnZ#9!-YM`=~{8T6+BWxI^_kR-s(TLuY4;L>_x(p64igyw9<&7rpfpqwSs#Xj`Ir zqQx1PNPeUz`;byJ7aaM(zHjop7mH>+aeuh$Z;a!Z7ymG8%+WEfTMv(Myl-DMdE4zX zFC1D^)Z^7Pf9Ubjk;IXo9U2?5<@VqU+cwYhjEA>Xn-eV3??Z73mTj9OJ=?a;^TddYciS(FKmpd!iU%jPB z2{ujjJx}Gi^!vUZQS8ylons%Kvi||(tjd-pg-LbTZH$&J}}1fI&B^Ztc<0vIahxC#zmc$k$#jD z*FO$h`l(^I${YLID{r>Xt(-l5Ugd(%u5~=X8eH^{zh(`-0)F}e@1ma--E3eDU&Z@& z-UDlR(MgIvQgmiM{i5g|MTf>3mooi zZP1<>!&2IyJu`--v_*Sn3`=Q?_RJWT(kAVhF;qiGSmq0lW=%cbC!+9){MDeAbNs8U!wMR%Uy|GZ7eoCWus%N--yfb+>kiP$2;~` zD^U$AQS|vVD=&0lK|rZcKGLa+ESN#uJPFFe};T^InH7aTC7e(K2S(%VpFS zOipLq%JjEiVK2CpKJJ*R<=d59(Qjg(+wc{3QDT!W_OE(luzQHo#r;-)TjhH<*eiq7F7C~?n#u3mYA0{8 z?VP;Twrle4FGjmWw|5A>a2URD9C=N2d#${;@g9m^Q*?Wg==S=d+lyzyAd7r|& z=*ZW@Bi6$^*25P>N4_2&u^xTjdUSj1;U(+Q>#awoT90mTJ-lRn>=draT<8ZCwdknY z#aj!kzaeJu4)!f<;Mib8ko!J#eG5XBqGxWfefR*E*aT?xi5?Hy?Fwv4n44}SHf&d7 zJePo{r@n8W^A>Yf8R;L*z{UU`yBl8jF){9T5p(WaV%+Vfrfl_M6x9{1LLEl((C*#6NU8XTl{h-+1vg={R;Nj9WJ2CSz!3>~hd)%h-v( z@J%-;+PT^`{11cJCy_Qw+i%qR;BPl`%GKKaNr!gd44nqregEGU{zvU@q}^U{sAGF) z(B6gq_7VsC1!B-^?L7?*N}KN|&N05LE!f@vZ?*Z;4sCw6L!00F+e80xn^S;w8Z`7A z^dvE-MnXg4Yc&Gesf30O2rWTFXD;j8)#%7aLm}>)9v}9h#H-3zP2LiGWQ2y~JW!z_ zJ@rV;FrguA-y0NTclTGS>b@TudKeng^PC3_Jpv8=8XEe|{{b`<0}bs^RgH$e!rx4I zgV4}1quxD8)z>M|&`{{7TL&7_bm9LSG*r`JTrZ`e^#5pFg@($O-*W{|F9r4&7T*Q` zo>va9EfStBd>0+ZLrQ^CsbD+Zc)Z&~N`!JDDnZeFO#U_NPw-=WN2V&AcSlUSaBL;{ zCtdtcdcVhF14`fQ;eJ`f`%}$vO@0+&n52(mqqjh{RHZn&`6=fgrfHMqP_ycg+*t-XDVz$bl~ zQkkyv!6!XZxsb1&<9+Er^8MxIbXGQJ+H;n@9@ub>;Nl=)tKw&?a=y={XXG_qqqGHV zT>^21@P&69i946nObj2x4d<8Q->_0wlNk53I(yhsWp-K?XA{I@yWUsLEhUEA%C4Q{ z4N-Gzk)KwYI?0PybC2QEurj2RyxwXqu^6(%>vNlb{|2PGC%ZrWrLiPmR z*~GVd8NUSZf0e}83!*&y98w3^*2Ed{U7f;tR{DbRtBlyQW}iryfq%nl@pXiiYwrjou04wn6#^E?kM67U?XEb04(0i zKAjLnyt~|5VlFOIbBk(=B1h>$%{_YdhH`+Qwf~k0mkoUyAs-gaS82tsJ(sM z&wcj!dWv6H2{K>6-beE@Ck9y{Hd1GBXk?z3J_X7WSPHL}H0j?<;9ntQ5CyDDi6bHX zj#{X+%;5QZeES=@h|N~99DSSoBXBsHJ?^S-*nbr`{N=xZ!>54OzqAKDRP>|GDM|PoKk{ zV_)+y+Y_roWc*C~c&~^(-M%#&9&$M^D}y((SKek&muwcER$>1Cd7AJv@hv!HQ)6VRl_r}<8vHNG$ZK%c8FN?FT>kK-WU8V(fiI+6&_y#k1z4__!4;h4tTuSLIl1Qdcu!t%Q5~Ho}i;2 zBFlX3_m@;COXxw$jn=hJ5IXCOpNydlfq@~EcnVr$vpMcR#RqNf?=YS+ZkOXk_GLK1I{C`EzXMKbbAN|2Q~Y!P0LHf?K1BbQ z_)r2aT@4=^$?I(VU({rapU1zmZ#s^(Plou}?=CPewd-}PmvyYk^_<kfEcDj}KTlsQM2Vd%b5=C`Sj~M#HgDh<$T zEcvg_SHbnZ8V=nibi;EXmcTLWOoi9W*mq2CLI!NozU{+2T+kr?w1TtvKgLHRGZ!K& zmT~TVfyj`OuJrcC;4>=zl{&^l&cS*$PN`N#`sR=VVuKYd(}|yKPpRu=om%wDmrBv^ z&f()v><@L5Qlzs7X*4Nu%zS4e`+P6udxdl0{-#&Pi!P*)xIRnyCrQDVpLiazUEtgF zKejvXA@;V|Sf%<)y^p@-U*e2ZJZ@;6p#8f@sg@X&;y3%aMwdcAHv{vVfc=e(!3~VX zROIVq+f?%_(>VI^X=mW z1~M*p!mrkafFr_#$P3(sPrUd;`_>QPtr2`9@4a~6&UVs+bIw%$$+@`IC(nt$A@n#WlQxvI{(+AW z%bt0KD~1%ijUKGD43cuA@kur-)k#y3qme7iC`)1$ zN6qy4MHccdbI8EKw#2w_+Y?`IRIPC~TjH=AI1717=&jiU3}c3M=S=%0p}o8tb=J6P zw!{-roC!~y=o0jjY3McNPAsi)Da84dcWgN4h`u9}`lOyF#$E8OX;>F)4fCZT8hdn` z@&tJ5Y+PP5`PlN>$wH&z8y-u0#5Y_kYXI@%&=sf5ku&BE-ZJz(fpX=25bv=wY>7>S zh`H6)KGu2*eZ7`=UijHgCFaw7WF|RR$;$sHfXOh{8TqtZN9?}ot?d#gTF$!F;#(`w zx1m5Ois9Qvz2JmTMr_pE+9c+wv~?YK4G(2~sVJ2)$9#XsrLhRKHBYE7mWJTBtSfqh z-#pzb*i}YeI56JQ&RMUQpV=<_ zPUd>rj2!Hnx1Wp8Xm}#!!k4wUA06A;M4zwLR)L4Km9l+z z{7|*`tJHC|xVVD%I^dJecz0}D$1~ewp^0W_q8yr78TZM#=7p!vF}9iy?l1k9hVAB8 z;N(~X@x?|d_1CE3-UYl1T*i%3ifoKEaM9-Y0?xaYc|_&_VjO6E;Ar;Pgh$~EKX6{^ z8{qI3&a3|YO}6b(<~zJb+FbApZPwOQ#0i)0lwbI63_60|_%4)w|J1?2xEK7?z9s7M zgzf2FmA2AzOAe;{@uG(H80oFZPHj=djx{4MGN&{&{giw#sy4y9Tw*rRzNVhi*WO+| z@8gK^P~z{S^sh#fl>)I2d~=+vV+1d)|6FpgPnNY+o()-9t<#9_tAOvB;A8J661Q_+ zW6={miHWD{EoXMO*rDeap#^EnM*1mm$z+{XNE@1I!vtvaD|D)c*7gZf4lyRQ|7y`! zKCRJE0r5j_V4j)EJd?~kV`rZENQ}zbK3;?H)jLBSQEfO;?hW80x@i*j;NgR3BO;I*!sxg z#O>?!eZ4inIhJv#7-}oG8vDA(ux~IuSYiMfB*sO&=oRF7-J;mmF^miH1#O*7tFj5xdk7 zt|T-OKTU^DL-0*t5um4)oHt;k+{MsSM>)AQEtzqUm@~d}yM=eO0+Xxp&%VH8q8}b< zzysU>9zIyyM!N8o04!`8EGAyTR|+n|Vxk`wzP8Gm&)5IN?M?aVo1>O0-gI>O+re3I zNaLFVqehLVT;r!HpKp14c0$6V;CU=O<#2XvYnD7`WwypLe+6J5JY|vA|IT>;z5@+c z{Qpz?)?ebMm#z_gF@Q8WLhj6g7K~5Y)|_CDDnz%Ks@5cSe_EX#jDB$)`jayBCkuIh z(Eq+M-c1YvbB+q`BOeq=EJkF7mKgX~=Dx;+a>iKV9r$D~pH5h0fh2!j&3ZLXXJIrsKZTvkn!S-_{$i=YZBtP%(TBd?a!w_h4d$t_Zj~8Rq?Cn zkBRsUO738z?L6hz+v$t6U&@qm>0Fla#VZngXau(eo@G6K@Ubij^@Z#+3H4cL5|n4u+3GT7c2uU4J8IMmkwTD;Q`)O8ILi=~t3czC(@DQ2T zOCQC*#2tVMX?3K@KCZymz&Syc;ElxC9?APr#)3#Wk-mLdleYl+ay_xI^$a+A7M*Ad zV{;5V)q$^rR;aTF7cjQKYU!w@kyClU!T-K&)G}iJ>T-nthk~a9uXy-!41GM1)tvB- z8j^Z>UA4^L9rYyAzK-u{*ow)%mhfoF6P-c`cgD~u`cE0-X~c4Q*sc^wJC&~a<+>2| zMKZGzVz`pI7H~!VOUXUZ`}xQu?q_=cHZqNSW$))A^SQ6?y*e@;`AXV(S`9H1uh3ke z2AiW;^F$-R$z?0Q(TevCGnq-OSbjwB=0Fz+auW4r;|K1Bc<%8Y>Vt9k9IC) z&e&$@B(JNQ8-x6^ZD1#PA^!h{c9J*Jx7V^Qu9H04sX`CiMs|{Cp-ic7bSHVVr54)Q zHolX*p_D0onAl0)L^U@99<}ZIn#4m&pHvhr;kT=OQbW1F!d?8`w{aJ{ltbK2+`s2; z;NC~qCsoFMJa^$^efVGW1-Enm{!IJ0?^!Dx4zVX}zlqp$+mzhzdOaI?sORsC+uz|? z|8its{VT;2^tQzBcPg{x+zP|#b}jzl&zBPK zuoiv{eHKN{WsLw`m(62e1-fm*R=TgcuK0cYG-WO7o0o0pRK`{Kp~%RW=Sgfck<%i7 zOg=cRTcjHqq-8nf@748k$F-zs{NMz!w5-R{5|XGx;%dp6)csXs-S3y9+u+;BkfG!Z zmkWzi>1PW4old`}(f^x~vu;ACrPtQM1%8<(y_d2@WJ%w8TF1Istvm{k8iYMgtiHF~ z5X{^RFAyENm1hHSYv!>YY9y}QaOPBVeOf|(CHfF}XTIzwaX$e+iQxNv-1~6Pu4SBu z_;e%LVMcy5M{B7!$w5c8Hl{!nY ze*w0{^6QO_LVvGuwl=3aL(t_M_4oOxzt5-qb?^7ry`Q>w`0L*9uX{gr@9@{X-(UBB z>Xx*QbswefTE=|@dze!94(hhfROZP1mvdj_t=aLWIO3tjRrEE*r4p}iAvTw8_TZBE zZs3{rIjKtwx8`J96Nb_DeA1S|19JE#J4i{)g^sUbJm+%H3_*X@PpMvPvL$A9WuK3| z$mTax>tk5HW=E3NhqRvP;@I!IV?e|hEB6TlLdRT#UapV+8n3`m#!2v~ku`_VmbPbu zyqz&nbXlU;xJIM79oZ8SzGE%c1PvLmlQAqwKNt~Q^LO}=cPHftehHpkr_<)VhT+_i z_q8&$we*dwdpP?oL!)Df2k4Xek0SGb-%n|a)knCqSnJ1)uvw=XYv!eM#SO7rQ@9V~ zLjM?-gxqtUc#P~p##vRf_TJ2U8tGjkY>V#YveOpueu7c$<+g?qH=cG5q@7{2(U0rH z>Y`Mg)^BNR7uv|71=h?crDt0|TXkPxB=HChz^N~A68%n1?<#r!*Rx3$rDf zdoxbNeV9&tVh2Rr%{j&l+x8iI3!TIFmgV6ipVHlGOXMDBjN*I)%8aF~lazImvao~I z;)bX4zu4mG!TVVLPvQSK{)d;P#PL7(xI!CxOxk@N7y6cP!N=X)TiFXacC%XkBRuQh ztTzIC+<`SM`+Q>qeg2YoY{zc4mp2mEUCw-ZmH*3-UyRU$X{jk z15TA8Yh95C+>U`)Y5mdN4`Cl5JGa#uwyI%obJ@9ad+oXDQ;%u-(51BZe(3*de%ytwub}71tI#vHnwQhF0eWQJPi#qLTz7akI_%u#$mNvT7RR{kV_Yg2 zmlVcD_HK?Ldmo2Jzh&+G4Kym}NPVpjtMIp@(|=^`kQJ@eClQ-!0nakO8@XhC`z2*9 zM4!zZ)H8&&$#uq+&fiX}$O~Py()mI~S)RzO@uQWn18SIiwh~g8G*W4qPX83**@P*! z>iDP955|Yo{C%lP9;QtT=ws4&)*TAA=fqh~QhMYx^1LI6wJYmM^hca|5~{5&_focT ztlb(1A1~+HkDXe{jmUT1v1y{55zRMZgQO-E59s>D+7BkY|Et65lk%Y_vUba_DM_{h2~M zk~kB4JCa8%)fDEkC*rPMO^hK^iZ(vom2pk{zlZ-%0q-2fJ&SLxsv#xYUk-D3ip)XN ziLWbp{FjpDFNgFL>|^4hn3F`VG|?^tZJp&GgBJFo8;SXFjJObA5!do2@~z}O#3g(> zD?}NamZ0ReV4M6E>yzwY+Y?z~wkI-$pBu5;K}R9qb&siwlz#+nUtwp~h#l?8cNJ?h z_L%XMc{SRTb=1{pF9to#)o9O-yxl4734cc3?v(bJ50)~HozkAz6QW2frB0c*<^h9vEz2%2t!&{R8N&ngNpv0o9JqY^N1SUP{}JCv{=(Z{ zcFwqMYu@mu-d?-;o$8-~%#;; zV*G`U0{=-FHOM8ELBZxbfDgLGI)nZicMh`F4DxiOomAyK4CErkKzBzzdywo$vXHH?UK5J`S)$g6daZ^UI!mXW<8kj zX{i!+2Dz&}7#b#RPuPH-QFeW<4SminO82@b6Y*oJ*|X)W;CIo#oiW-HdklE|eJQ8i z2)_eAqjWvIgSa16^|``}_FPcHM3#$6WF5(#?H=N0m$kN!ZI9vmD(MTcX(`JH?ONHd zw!)iC(3|XCi`;1r2F5YSYn(YI^<2j_gmIAjo!l!qyIA^E$r)-L$Joob_ancvvFJ^@ ztPvGO#m3mT4}7VPkTs;iw-1pX*we-CA)sU9pYY4~joYUhE{hvKfbjB4%Rt71eG_8C z-+hJsv*r7YP4iG{y6H?MX!FRVbeH0IQh_iN~(v;S)SwxQH{h5l3aRAdd@$R086 zd`a$sJq+}?TRQHOcFb$srJX6m@=ke4a7Eg@j(sWNN7{G0eESC2A5UN}VQi!S{g~9n zzgk_~kNMLjjXW(~Y)6(dA2nfz2(4^6X0{>6`t%5*uZRlO#TTH{{F-r*K7YwQoO_@h z7t5dOtEV%V6!`5#(cy2Z0soBb9phV+x|eAIgN9dKV$FbH=JX{UR`bu`Y>7J zU4tDG{wCpye=q;9&TG~xm)X{EzDdzhU2ks<mzAbIqu;2r;co9`ajt4kl~dr!xnO1?|SzDw>I*iayUY)Qu^tFyi4XeElXDLUVO z`lWrycKtAk$Iaf3@NL0IY`-{{z!1y1ZgZ5e(->dkV^=>KvblOs*FNs>Q%@cYw6)+G zpFQRGtid0no$1Rynw+t0_vFTBgDM}T{f!H{fb+zA9^ZXGD&N^#`w&H?sXvN;RZP;^Z+nXmSZT+pbYVR;p`8;%9zed-Upp-ag zezndSqATGn^xoLw^{()8ojlyFoON}0zN)kYqbD*hj=ELO^-jYs;r2~07bmGVe`w20LEoT8q&9x6t8Ut*s}6kA z_<-7$r0<_oN}C#=y{)qG*>07>o22e>{<@`JbV74l#SZbZx}^@SZs;~z%5jl;_%LZ^{9cTKb^E`cV=60F;lgN`jmS*55 z_BP9~vyyY-1y0^swl*2tQ}DDlwRM}o@4KnCw!j#)zKFhrFcP#^sMt79j&zs5FxaMT=0-MODZrEPH z!}_w<_!#&)j(&W<%TyEzA8XG+pEbruhfS$GPvFcsM&MZV#KYTV zk1a_TqQNIh*WbIGaS@nBu}690+I5lg-GM#^_krHx%NdeWKz&k%*f;FyV{}Kv*vgxx zDw>VvcY{pjR_aPJD=p2}(O*P#5;`NSI#Do)%o&t^l z!!>PbUCOO@N3OM&Dn-qcuvgOe^Zp1u&SV|h416a5-&g6g%+2z>lQX{?Tv@^3SXAute@pw7UJiseT z1}Wnfb>J1k2g2#^o<8Aj-O_tnkL~i&xX`hzF`^90rc>ykz>!Ujj8`N1lBex^`=6V@ zd)k)!(?h>o^HckobFASsJc9p2OTBYsZMB%THBIu-*AB5I0!NXeNdz?=t<$7 z#;LaYB=9`);omv;BYO<>!K0y-egx|1_{}GjzXco;JWbLYG#j|)MFD#4?W0#|BlNn9 zaq`mV{0r=}vd)ly_R{x>xk`C9yedWQpBi_Y&Ke!8wB;bTcyEPYQtyx8O2;~b(YV4_!oqS8t9x$vRbZ4eL06Z}p~v;uP?o{U2`u{PQn;OzvRj-Ur*;tKL;3-8)nZ zuFYo~-r4kg@vQfMTU>#S+X4G^?jDR?Xdhd33w&AT3-LpaF3_!2@!ySB6nB);&ntF8 zvX>pqJsO#ywvXZ-gq>GDXQQUVpJKwHbMzCkpI<{B`ii!DmEgLJ?td=UDLv|t_i+3nG?d;c~Pj*@R4RY=dwW~K9-h3bN9(VAq7r2T4!!tkHUp&qp!VaaY z_h0X?DE_XB^J`o453X0j>weRk|GwB1A4eutX@j);2F14KCjUQMxWB9ft@^0T)9&?3 zZ+E_;x_E))`~TU^I0_8cF;<1(wa`F!;!ykb3>pqxJ{FbVw$J$k{}BUv%@5aN zcLDEfg60i(8`m13SD~92_($6y>}}GFYxT83^@5A|saAgr&p*l>_AmH!G<0)(st^B< znWvY34UP(~%bfDK+B$v~V^J{?1EsiQ&uQ8*JyXk7MipTPFKaTs$S zbe2xL#V-6`y=+>)x6(&nav$>o_LqpLOB z#3*0;0y1MJ^PMq_vsi9o&KSq}C(D%T2>cE+p&x-k7VXJ?XGRt}D|d`)t_#4U27jGQ z#z17zz*@=1xQVTQXXha;MFx|zmymB+6aMU*ak*WZ^iym!17&trRt@7OFu*2lw&1DZ zZmWi)W3iVLJQbagf%L+A3>uz(&D{UZ$H~>-K45RVh0$^0L+L@5_qi3ls`xt4n?<-Drhm5Sf_@1IIO@`>27c4k*CzC9{3 zK69!z7nHD{=Gz1!0unQg?LQr4(~AOCB=sh`&x0sHG-lqq|62HKIS`Co|N)Ro_{ z#=pdGDu5gEui#i`|6Hz*5PPL#@H~NM3FQU!PSTHba5JErko9Nh@X%E()ytZ}=Xay{ z{UIB#0+&8>lyc@(X!QR~_*|}k8K`Tmk~8H3XUSdc-(|28Iu4)V>)U@~JJzmO@e}8q z!o_-QEX3#hQoK^G0>94SR>FGr!s4meGKfEps@X2wN*a2Di#T+7egIeGo6GaAHqL4% z`FtHOX-6PUV2mDT zn5=i`XA?R+1O1e~J%=1nik>X43;xK&`!O+>NFRk~Pa9IUR{CTeT(MSkC060p*yw2e zwQ**Je0P=ftNmvS_36p9ai>kG?6F861-@Ov?2Gmz2T8f5%o|PE;z~Jj)Sp^zFQ1{B z_dTeZ>RhUQa}VUweXOBUh>^oNeZ~2z{alLrT=6>Y73!*Dvo;pywKDJ8R70KELCPAy zO@D=+tmxTA7idQBHyoK^q$j`ptQxYfUhPp=OZhQM4{waZIboZY7C%JVGWOllNUPjb zRD6^=Mkvn}N9nlho+}>7dJ%tkcO&0eYtgk~=O{W)4WFn>?ty+^KAz32r3-<-^!XzG zps&+l>>oGLzZF0q((a4t=;^)4$1>iX{>yyYX}Z769R5}K*Wb3Da_>khf${OORuY^k zBj!^8XJ(S7cElOlCUpgHM%EVwKYqxbP~bU$6TJ%7I^S1Hu#@oNR5&;#bZyK=Uz;|4h8LS1_C)9#__L96rgNsS=n=3tL07OkGU`bMU82wKdz!`zeb30e z@I~Kq4t;df#~k`-rjMyhQr9k|kM0Yp?tInY>tpcV;^{$!ZmsMNWy*d@$2ttsmJa!s z&%1#>o3VY>^s3;=G_x{R=HU!eYZZEI*0kYXGwaWMWaNCuXiYw!4sLQjVRimf#_~*L z%sEZk zII=*_dachK+QTZcyx?zaj7gJ+rQP|+^OwsJnaK9+nP0KSNoUWy5&8S_@0BMDOqZw0 zS}33k7e7`X9{b|E1nk=NpTf z2I0qz?e;%=>59&Suap0>47%82lG+LT9Yi;j@L)^01%JL6;!wsbj1WrTmif?PI?~$0ss-KVTs~P-e=_Tr_Tb zVOM1=Ys#>GYCrQh)=06pj$f-DGth2dnFZvh4{V)K=Ipc9XiwH+iPbR=n+Dk1reOz( zE{a&3;52<=&tpy!b7Gy)eh~I&y%lXA%u0PS4nj94^s#Yf&I<01?rAkP2&dk7!TI2n zioDfJD%U=D;l6`Xj+wJBbJXV|qd2=bnDZw?IL~%J?{cPbcGz=~?h6kbj8gmNP2)^q z!xCe^D9-+T1E1SP^oMm{ZXM4n8Q+Sbeb%P1el-l)w$>EJIhWw#I@9RtSE1#8{aYu9 zjlg&4F}yA8@8M_W)%Qyk{bk(jZEL5Gu(!>aom{=@Cj6aQH!A4plDIcw1G;(?`vJkN z6aEpQj9tmz96D!g2~A$}t=Qb|99B16?U#yg1@ef|%N)ICWc{k*RUfULhb?K?hzt1# z_tnO^%e%K$1v`}qr@*b#@V+zX9{M3O{DXb7B>N=qM)X-{DJx26^v*!WI1B$a?;PfS z51qFG7yTtZh7E;c}&wc%~#1hKhs1BVvcm9K_* zy`=G65s%MSi!Q8A>c~|?LAkSQa_S3;Lk|^2ihX&DepFn3ZM=6Qb;#ZX=lpP__F2y9 zy|kaJ(eH}hY8Y@Ozu}5}#`{m?)5eBN;KQE1_|0dHY^};>KUBs=#$+V@UA6VH@%U%^ zw&0PMj>kWc5!Nyuzc>!)k@o$!X*hr^8Mo= z{8r-fU4rjT?c2&2ivay~F=DC&bW(R z@t&KJwf*zQDb7M#2OnGKmq`kl&kKSjJdxQRYrVV|h z)r^i@?Uz%6P2E=Zt`c_zu~*gGD|SFqrp%r3=r6zZ&y!zvvzLo5OJaeFZd=+?FopBn z{rSiG`P$bwxpl%y^reOLvH4o|4bYo*jKxtvJcz=OJgr^kUF;*U@7H~dGVb)oiu<)?c@bVMb-z2Fa-eJ+ooHOuX!Q~U|4Y$KP9>j(; z4nD%ZLl}DtYkq+54kxD7!cnbNqgdNT?VRL|V{C*M?d{!KHJr8Bh&J1r)A08*>^Jn_ zdmB7kWVAE2(e6*-w`Ylu70nv0lxrP(dGVW1GMLFABfN>0b zHC_p=OJaXQ6xwQQP?a8Lv2Qv9?^8;a zMjqpv-_qZ+dL^};J;plt%UPYueAB}_ljk$4Vs505tW(!W42rY*=(zUUQQnR4nS;E) zOw1FFhS_hGamw`LM=Y^IWIs@R)lSm3SUqwrxEag&*@eiPv3$p#6l?f?6-|tt_yh

h|#uFk8 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

S_=d|HDtvpe z$M=5KcIrdTIJ5%}?f$@_5V7aAIJEo2|6erL`x^cW4kh)TzzOL|{~dpL7yYsp_|@W1 zYm55_{_xBhIQc97dJ`Tr?Io%A0zG;ER^8PJaq3A&L-qXu^>z{fKlq-?P=)J8%nhVJ zZ<_y~^#QN!S;H+S#STqh2c4n5ehR#i1LOqqD~02#$2cAYKYS8?Z0Wftp3{CSU92ik z&xDfpo7`U1Yk{`wrxtO@>Vb4O($8x_sG@+_ zK0pA_1Ly+`0EPe|zz84$hyg7V23`5+C;js(O?NuQQs6(ua6yI;~2S0irdIJ`5 zh_1BPA{?icX)ak89P9w}4ZW9X#n>?*Qh@~bBGW_5pj5UuVYTzDS$dc~-q8MZa?_>ThA0crrh0?q?Y04f280DA$2fC9jJ zz)CKfHZe6bx3ILbwrSPc)=pyY(8kfpS?c2I*0x=HcMngm z4jsKab@u7v>({kg_Z~fa_4b#^IYmHVpT7P24+t6<91=PxZ19lqh{&j+!-kI-IqH+q zW5$k)ju{_2;nTQ@@d=5_Nt2VNOr17;#>`o>=OoXaH-ACO!ql|%MT;{&Te37WD_fPb zZ25|nxvN&MS-bA@^pwu-e`@f(7EJId?7KC9p`-bw;jgxB=yGoW+6M6Fy|m=cnzpBRs9otu z?M%lN=&kfSb6R`thI6_PUo4uVC64qi9qC&-r+(*z@fzifUM|H*!gcg^jF|vF4~N!%81B#f_TY6@0IW6^~5hrQId0{Q5LWMbFDN+?Sgd z%bEAwpIJx1CuU|F&33W&E?r&vxws6AWnNxhodLZ8K>#nWp_;#5UeR7&U(spNAuq3E zgel#>Z*lfL;3v(U+w9FBPb?UphqnL@DA+o_5MU0l1<*fd#-#t{XWUlmBb9~G{ZX2S zaj0cq7S6`8xoiruu+3&ddzU2?w%pZkmOoyGTtlNC${~jb9T3--7>l^>G4_j zjP4n->HVXFM}&+R9y~JelRguAPwJBFKCf+zS6G+Gu&D46A;W@)4;VFYOz@cC$?ntL zX1UCASz(cDxyov@@mA4(!!m<%;Xb3*`@7BH;sVF_iwzz*;FE!$gpC|FWOU#dMO^QR z{_*~^{N{JacKysLrrn^9vQcCF6Fik3NgZdlo7Qe>y9JUA`%J4G>wMFV<{K=FO!kS6 z2rCWt7;O~U?C+g4U|7h|sK`$OM+_VuG&*E_P(m+dw;6uZyHD+r?wjGhPMXtZyz3xO z&$-colf0(5&+0JWIoWNFG*!C9MP;+P^?K_Kc6pL*HpS+LOb&_GnW)TK?dPTkM?^)A zj+iKq4vOyc=|E-BwC=P0Qv7E7&Fa3?C#(He&be)3q=VcUi$mK{`?UiwjxAAg%-Wk{ zQ_JM+e5jm{u_rV!x3Xz%+f4jH{XzcS+P1|byViWRaKW6(!#%8w^r-ppOQUoY_zy?} z6aXp#H2@ZXdw@!Sc_8LcKoB4rkPKJ?SP9qw*bBG>FzBOAlhXY=V3h7ZfCBdk(f|d3 zN&uAs;QYbqwbKKqU!9IR6*^@)jd$whBy#%IvA}V>ql@FUHY?i%wt4KZ&Y_pXulCdJ zMfP7xJS7M0dfAoQ`r96C?cKVdm3ga$Hg(ov)_bkYt&%KHSU6hDG(T?E%4~w^Zj-mh z3gZm%36V$?Y?LiLZpb&38zk%R*Lxsv5sc!m;+;Yfx~Y>sY-_sS*s3w?edfEP4Ike2 zdOQ2g!Pl=}^?0@5W#tRui-_l6K6~)A*VCLQHy`(Syz0@@heICjueYsV^x*0J==&Gz zg6odm>wE9`-O#(2?@YM!`u6hM?zfNMO1x!xtNiBFn{GF+*KVkdu63_{U30ujGbmzA>~XQBt&>|vwRd3H@UijdO>LY#eFN2F<0ns@G5c-T zenUo#BND3NZw_H1df0)nQa^BOeYJc}S`QvQh8Z+k*qgB}JwR`R;ILpEW4p3}`R3<( z9%#{S;P?U=YmCG^H3dCji}txCYs1(*wcV{~*GZXQj34aqy-SLb+>x^RYF)cI31Eti=>^Rk6 zlm2SY)F=WTLnW=bfiuuh{8#fn@IQRuH}M5cje-WxO+=nLQIzQi}Wx79o( zqo(&i@bN)&(l}^dz#n?5#(zFvE%@-^0|+&xLO1bG@B#Pq^qTaW8Vwo^^xq5Ly@z;+ zr<5fBgC;%At9VcFtbBjQ@L+67xl#31PGZmYmMq0rVrljfYL6#$Z1wS-pEu8p?Cs@j zix-X100KUHa%5(22lJK<^6pOQ(qV9tXo6M51jSeS^|hlcvI zTV@aPwl^0UYTr>eH9Wai@#UPMJ=?Z6)3lGe>HX_RH>$r`zhHbwclS0nW=#E|>CLsx ziG4gBERBt*OR;1IR*LBXXdV)ZjLn^TDhtk>(Xdg?fBJRmGiBRHcOrrZkDHv9TTp!F z%$XXsx<*}-65P9A%rf}I{o_|WW9Y!p(KB+3&(z=*`fXb>E$-7eykemJ#tLk>?H*UD{Js=P0hjlC9@~T$0bggy%>2eUL3q^ z@R00r@k_?Vev&dKbpDL_%uHygCpH%FO+@+zMy5PwWB|Ti$m1I}8GbN)FH{?-4H`x7 zL?3W`FM4B4ci}|9)JwrVvFg7&w-1GCvb7}>+ zwODlw&-}yJti4y+uq$c<_6ZxNKFnbM&{%2v>!3&KYw9?*U0tUR;tgyRirUJT{wO=C zU}ST6^{qW&d zlb*hwjl%V={P?jK7&z8U0_mw%{j<7J9RME95Ty~SFR8=%oeca$KN{a2uK$C8Jy$?r)Hl(157YwI0d%8~ zygFJ1cxWGpSK+!GG}l zPTYC*Yktnttz-78vjnrA7({-hJ}p@EByPZ3^^XG8)Aqf;P^SrEp6~YFs@4~rdpXvn zL>AQI$jg8=))f!86|kmf)r)(W^4W*i zzi%JwDg=>gsH<8O&|06z)bF4Cv^ln;nI4_KxN&%Kuv83krEYw6_tb`jp0+~J6Lr&@ z`pe&BM0Kz-q^l3_p58dNacVy|GXu?K)2n+I_GXUhZZ9VKhr!YKbc`EXx>RZ-}$k_o_E0 z^k{8>6yMhW{LN=WJ6Tb2KfL(;=*C(7+Zt=Kdi&r!=yvB;no^=%*UHu^`?#5F%k}=n zt&`i*Ms;svqOWgEzF3|ye|kdnh#^6Wo?SY$leV$7Ha9lX z=QFd#+1dH|#l`)`%$U76ds+6nb@}V^3$_(3PFu2U*|OZ++;#c*72vmRTXFHhN)Xt} zGnHp*^bBkbAzPrv#tt4Pjc?36?M!(ejD` z?-!ug0=`jwRM6vB-tiBFmhCztn0x=oda?eiS*;M9WY$Z8;O#gEz1L=g{GX}y7VsMd z?V@b&@l8BUoNO9mUQ?@nPVdHfywq>s z$Gnlp-X(Xx_M*c)y}EFHvA~eej6@^6`J;x9`6Oce^6Bh3xeJFaNS;5Zs8~7K*wsIBQpQ&Y&fYe2?mp<#l+X8^ zthMqC963E}^PvlOjqSPw#U!uZb>fDkL%&hemu@_8rq-lY*CC0EzC3W|wwYZA#i$v} z3y)p5vXw_nNX{)Rzud~H%ixL0pBGi%vT4&XAaTLEoyTe%eL`a9F5i0i!W}C+zy4!p zuGm)jo5V#P5;Hq@`_U_Q(jNUknYLo;Zc=*w?u)h7lAzdW zi}UuL_|3&j7B*&j{=PGJTDR#IvmpEHZ!X+%Y}aGt?DP%$Pu#O<-L=o zP5f-bH^+XdYttz>cERU+k6(Kv^^}E4BE6_uX9W$Wk{wRqjO!_{}% zc2-2i&;D}X$-9^KuSuU2Jv3tQAX)F8J$!vScl7jdZ|COXgi#?PvhwQX!~3;Ys>}E8 z*|at@WqRBv;RF2ryj&f?yc&!3**DoaYd&B5#phqo>=V&@bkKy6qe+{~VgudWT-;pn zi|ps-=Q1;{f8V})2^iWp%5CPd^{S$bBZq#?%4jGoQN_ni=-YSy)sm8;m%ko4 zQuOl3k>9c><{v7_n)zM+`pk?ghYl5Oxw11~^>W9dlAX=a`K=^-!h|Ig;#~UnozSRV-~GBIT~p<04vsN_2z*tftzu>xNx9X&tjaMOc~I**CL#3OB&cy z9)D4-em_5;d*2B=)$hRX5YI#Zz~gBCo#7d_Zr82f&imr-CUzd(`$dkQ zn!5a}okyy#Jv2jSlZA~=T$s6jd&!yFry?7-F5KX8Neh>KRa|!F_eU1iZGC%(ja1HG zvTnq3(XlHRGEzAsO*6THr)n(~g$On&B&dJCv*j;}5TD_^2TSr;wCzIx8=j}rJkBu#zI{JrxqMV$#2%f} zo%=4GKWEOwe&hR2OrAYEZov2@nO_|`_=Rf8`NFp$Wh>??oqa$Nm<9i0y=s0*R>G3; zOXCkt_-^Nt3H|%_4-9l!tk@RU*A1g>363rKHfF^o<;@=c>6}k7zq+{v_H~Wk5;p-6T%_Bx zcgIbL;`1jcljpeoV2eTA^b+z3jpoLhcG{Eo7kX-Gz{~IZX-?kP9g5O2s!tCOGu6EO zWdA3Q#N)iZwQqtI-BGK*)XT$Pwfa_^*=Wtl&ylu459w@OsFb^mWBJ@cUfoM@@+xb9 zS8o+PS{&FVP{7dL8@a`)w&n z5vZq+?wutE1 z|An`s*R2p!r?@m*hYoE-S7U-KAAR}K;9+Mg@vW6x^&V|$!x!C9Lj2_G8<|?$yLRXn zFlbc#oTbRO^DJm*TQlZ-L9Hfu>xoq@yh-{MIto#^^I+JbVdz9h(#z2OA^o-2y62P* zJ^$j_&*Qy*^Io=}_(WnqEom-~6L%&AsLaV6wE=Xes*9H36+N(SiPGuJyDx zNbdgQ8cZ5pYhI-1`Ua5rny(Es3sr`9NBQ-b6Xx6Vrz&gos4y`y)(LnnJL-S)6|owt$y?zlGoZ}`6ctJMSj2ag!o;?N?AYeWLd(>MY8#wvt%`IR>-pNtdq@e_)50VcdJag zdY5d7?E#tZ(Ic|Kx!=nyGpc3${GVh_mw%J};(J@R=fFdmbi^xJVVe)KO^XEb=LSOg zkNL*(-xU^ezt=YMen%v7iWLn5-$ZZuviZL9i2NS%A5O~T4hDVXBZmaZ z=M@f;e`gXYk4PIK7qYSPsGL~&bGHO}+fzw$xA`;WySmSV{yt5<^Zp`v!>^yoKRc5t zAM&G0-u?J;`J0ou@^3D#k+-Y)TyFL}Pd-VwLGIwXNv;mqB0oQ2yL_LjNbYd3SRQqI zuly&Q1M_4-RQ_o zPwK>-df%CASki@iWah_hU)Pn>v+vH``LYK$!l4%@`=U3u*hQ9Oln zNSVqF959VrU_6~WaC$oTbm;4J;d$IqpZVOJujg||%ocDPXD{IRzb@cj`lfK7W~Xp{e@o%MX}6GD zF=-)JziT1)^}U7MRfkkAH8hn=pPkC_^HaI=C8?alPpRAwcT>6Qm#JK*rc~fBjia$n zW1MtuLVyTBGAFH35*JHro3!?c*s{zSfJF-^PqDTM=nEJEhz2ABh{F7DrdNRUP5{V0 z0%EczZPW6~vRzL35=5hx^ z?{ejf6=kC~w3bVYFUUo4#$1YjsoYxHRK8+IA5J)@zC!fETRv-bXuyz2RmG%-n=8Jx zSybhqtP0pXet)IogWH#HIQwb2dic?@eE+p&)o+)UcZfMtRxOPzQ*5&-f9(3E zte~k!`ET0=^84d%%6~r9Sl*`EOMb5~QqCJ3T>eIISw3J+C0E?guR^iKxytM48F}S? zx#HyP837YcKdWfJb$vza)A#+CRAn4FS+`Oa6=dk2cdx8$;sDRm-dQHzI3(s;lr!TDk@#d`mMBBTP% z{1^0!FP$znEOU}rlQu_ryx1wydtWv)wp zFSBl_DD!%>yewpAZRz%heaq)1)t2pYSS3#=I#+I3T_$t=bana3dm}3vk5-pm8aJhU zO8S-xlS#Q;{>cG~Bkfm|1%C3lV%kX$Me^hOm6AdS#nS9mhr6v$FH4n5%Ce{1mEW0Q zDSvayUq06>)aHo89r(gWn zD6{2>VN1%#AMPyoY0DI!8M&6nMz@hk!d(LnzRge=p0%k=j*TfBZ0YDf{;+wu@J5aQ zk?Y2?%xwe8V%8s(xxQ*TvSF2NSxNpkM~*yPTGsL4G1=X-q2QD3${B)+ok$S39dwu~TxzIael;w*>{ExY%WZaUD_8#1 zL%!1~t?avebGf_6Ub*eLO8K~jtt;Z*999%PJ6i7DBUb)o*S8g&C*3(YuV^QC)v3gk&Ap3DQ|DeRHL9H8|8Q85|EF=COOK!H>VL{)s!V?1TS@1k(Pp@zU+y(d}B|sTrqrDnS(<&*^lRx{!e-=?OkNQq4egyaq`XkYs(&f&8ysM zq2wHdZ7P=tzTgfGn_t%1@^!`G%CF?RPJNJju1w(KLWap#+qSA4H`Z9u-uhhS%CIZk zj!iu)rd|#7A9PkCn_NF$HhEEr|BF5=%f<*^mmXX&&_C#Y<`MaZod3h#_rT{^z5kzk z+hZHUFtH57uw`R~3_JJP7$(Co3>(8R48t%P&!&~Bl~t>TrB$n_Rnp3YJ)5K{MW2>b zs#S`LT2fKU?|nVz+=XuiS`+EIezt`(~>-64zU+2$tUFW*a|NDOSuZ?2-qniTx zf%I4O^H0?5Ul+eG^1!&8s!n~lT@U^K8=mp{5pSLEse2XeiCVidO~k)C&zAVc zr0Rq8Wv9Lrqq@!Ht;YA%eFs0zfB)2nzx({`{pWT)vG;?yntZRcC!m%b|Q!*7~Z4t{f5n2^ei#mDepQ`n^ceX6|#gkG*d~TNY5QKliciwqLWO z-qOyCIrSIyQB(TY9A0F5s^b^?wruWLWhX2*U|F1Sc?Kic})SgqjO>H@~+tk+6Synp7+75i%LN|o& z2t5%(5PBhmA@o7G5doWi^zt|xfG`kYFak%wgpWld3`H1*Fam-08Al4aguMv+5o`!G2(Kc%hVVMVVT3mk-ahA&hiKog(13gBhL6e*ppCB4KM0zDAgW z!3@4{&xU!T&Jdz80D28!v^VMmVLk>pzau=*3^HR-^bW!bFxL?SqQeNQTS6yT!1xm3 z(N?hA*3elS)DyxUENX0Q3z@Eip4vg@Sm5{p;XMep|9aR|2iP4JJnrrYJH;k^ZfAr* z{M`l5x`NgXae@%HJJR$(+MdV*3h93X^6Z7YLs3Q;%Ib|Wu~;(mM(}VGc$Cp8UvY!LG}^QK`eA}3v@CHx)}`}je)MP z_|g{Z%`Z%V4p9+5O@dAnq1&m@@igc<89JW<-OofF%tBqHqE6;!c85p?)5bXgCbegWNn2_2t-uD^xO z&q4PMvh9NicAs6X;T|>^?T$9c1MK*R<0SWaH+H(CJAUxc zo!RiQ&l-GyX2U1$%)gBXvySv&HMt(_^j;5~3Bi%c{uZXKv@p*~3-iBhVPZ%VmWz*2 zovv%bR(J7aBEyqK!?8B_c`^S5UhGPZ7mE(?W~a08p^^8!nRQ@Omius1hC^)3e^E1L zJJF13BYfED-9Bt}ujb75XmeI`eG9hX!4}LP=lHA-w#29HyVR={yHeSTX(L-R z&y%g0|FSkrG{gH#Px-Oa!`rgeU$G}9g(!cPA-l&zjNjM;3%Sxs;( z*$xNI}WV!cFWv2%vLH=YW z9>&*BCe4KYXEXm3sq9MWTo%0~jh!B{fL-d4&aA&KvbWVcV5i;|*cRHp=oa|(~G+SdeM>V!197jt^-B>hU9<6!aoq132U^|*x zSo8@C%iZ6Eh3xZW-p6tF4ktLZ+0B^uhdwMMvjxlT>&v3AZ_Rex;K#h@UB_zPY0sh; zbzt83DajpCU0BW9Ag2A?lZBM`V&0GUVYwgoWx3NMn0E+gAyGq^_S6VglQNp^$e4gU zr?BYK6!`Hx<~?o++c9Jni+;q)au?*YknQ&}@1(6vyYmUA-Mo`|r|xAT?O$iPlip>~ z-Rjwn_2-!P>fcyR)23Qf-SV6zcXv>e+*8R-ydN%Z5^|=liS|}&&zkY$J$K~X@991L zxM%cv{H$!uOfT=`9bP+z{OA?^yY8J^RNx)rd(zuGE3Bzjm(x@WJ>JwiKdf0u!yV0X z(?4$(ZHe;Pao`aj?`O5=Zc!8j0Y^FRzRW`Cuz2VQhzoon1#myQ%6shr}fcpKQ~1i+he0PZq9yfYl~mB(RbbKwtHl@+v@$bZja9haDVT)RqiwTeB?fJ z;Rug!&+qf-m=tLlG4zndd(^Zh%L6Vq={|3V=aSE6do7I(^&Xt!-t^p$UpIaKz4~UG zKRx3!^t@Y(6+icBX+4?Yn_F_I)m=B=)Mo##3cq<>#$Fe))vbM-=wtq`Megaask*A; zy`Gjyes63v~{6vug~c7NZ7`k9u0Z3f3Ix=1}1ku7P(>e zgHaHoe@9{cw38yE1MX(|)~+wOsKITWY&W6I&{^nv;v%S{|L@ zzVx1L9#_`zCfdsryf&3wZu-N_#1`VIg4Q+NUu(B%PQOk+%Ons(n*w^mxE z`@Q}5S)w;RsNNy;ynA^yKVA_Ru7k_L_c|NZntsQvDeU- zwA-_gZT|TLTez`QYku$#x6WF;rOO8$z5Awzw|wuhvi48S^XeJ$``XAgFP)y&aaG5S z&zFWBe)gU56NqB>ePfW zBcccO4eJ?ry&r~1bgf)GFL_e@sNvCr`}Ya%+^!`?QjD!zm60}M%7ihoLn3eP(=*V& zl@A76cUZHQ&6_!GqI??Ctz$dirdr{~_1Q}o&Y6)oK5lr_K;+!z`j%Spy?5rVS+QjP ztfWctw+!V2ZtNB0r#-f{=$_lHtCy$GO_`c7dIZYr-AOBdVq5X1jkm2`nXw>s`s8uM zbeLbQx(?Os+r8`A?T>HUT$GE!uIciER_GsIcE`WA_}3ou>#i&a@fHN!9Wj1yr$Jux zPYzmtZt~!bvv&=4zrhk2esW-Bg}y2>;PGvd@0@=v@{c=yh}`;&FSk5<1J64!oKN^F zmABfso^N>Me*WgJC-^&6m3)xx2v2zaGwyfiFT6!}PyK@nt@Rl|ts)(s!%MSDNfeI|UPe{$};-elu%dX=x6=sdNF2zsQci2tO8=yhEi5k0J( z=)RzXSbke)@%E-};w$XAXJ+>jVrn1Z-=nWM{mIQ@^KFAf-!{5 zi$;mJ?-(P#ykngBAw5Cd6ERuL|9XlTW=#^mUYahJPnjv6e|Wa2IW$Kct(zxW)y^0H zDP1TQ&sZelJ(h?In=-^#Zp*~}?uHFS}Lr z?72pqeq)VzczU+z|3$VanX*>wKd@HZ(RrQtBx9X;X7@UA^ujvPBg881m}nJMw_3%6 zo2}x=F01f+9edjETgCb>tm5OdR`K$WR&nP=tEm0WDvo1++w+Q5Jb`cq;dcav{cZ|R z;_uCWSjCCURx$fms~Gf)RZK_Px4*NByS}!HBINh=N&NkuRjhu?Dk=_I#o)bG(eefC zn?Gq4C0ndw(mhs@lxr2wFSm*@bCAa*tH>N~6_@&hw;-!H+uACoFso>NZk_P|V4YZW zaGhxJ{5tV_@j4N)ex0aUuuc?@UnlkrTqk-5t`p}h>%_0$tQ8ZFt`)!US}QI*uvSE5 ztrc%VALWDAijS^eE2jLKExLb@EyV6@vArl;q%6%A^G0Wj{lVE{rhB%S`0*N1{PG%c z!=^RDXWkmY^);f(Z;jaW&8=dm?N-sH=vMLhyj#VOgKiZG&2JS=K3y%mcdiymIjaSW zUoC#_v|2=-%Mx|3WQqM7vc$y+St74@@L9mozc(^?BmN!g->u z+U*?F+&2vQTpgCgAhpD2)t*Q8YOsbf$d$wpYaklV3KTF(w&nz+X zhFRjF*Jg@7DKkazuPGw${uD7JG)2rlI756jZH9R3{B+T7<8<*_r|IJT7n8-9*kloM zGD$30k|bKXC5h{crir_{PZP6Vo+?U*PZh(CPZ9BRrig<-CW>vjiQ=;siK1ZZWKr64 zvgr8YB;l@45(%{vMf33!#f={&i0au1V$Zh|M5pBw#P^rRi(dF_WSwQa_~y=WBE97} zG41|%QF&dw$lE+t?C&sE%z1c>Skq~YaC>C5xY%j5n7%De^zRravbT;B{ryLY=?~r_ zerd!@cwbQII?iKa6dInJU?xic;`PcV*bb&vC1}7 zT<$ki{IX++SkP&Rn0Q~bsI)|j`?8|M>2HL1DM^Um-qOW>T^E<0<6>tgEcT8@z53VT*AR{M~S&MTCo+O8UU(dyB5KdyCIs3lky1VdCeFp zy+lx4FOgqCamRXkMFMFe%|B1C4O`1VL=(YWUROSYV!|!(xi^DpI zvh~-CCGY!-w|e=DYHNEj;@x&4wMRSAe)V-?)|+j`kdAG|p2dFRu&s?)>f1)_N@*<$ zcD6$M)JilT>nmPbaDWzKhcyRXmcccg!- z$9?~`zGUec{oMJl^tYFPsW-jwg}!6?=lav<>viv?pXzUZ_p$!N!jpRLnGf~lsUPS^ zK7C)mXXGgN?T5(L@zWZ(cLhrZq=bv~}|Fpv!`nr2-^};5v>({M$ zO>g`CtNMmn2lS=yRqOAMu<0-E*{?V4wNL+e>nnOcpFO%;_HKRbw=d}(r&j1oYIo_; zH@~1i`1tesa^L6lceBg&SI#`G2Pf>%gKSUfPli0Hzj%L{KJNF&^z6Bh>V1zsqOTsX zO`q^ciN3$dR(;Q+&H62M59yhM9@N82i}XCp{rb`c_v)A5-lTW#dyoFvg9UojuXpN$ zk~ivgwhemAu6O9)-0OudZPl~6m_CVz{1(ffd}uJw>D!xs`gS0HYknJ^>CuD_=08M!k#Rior^ok3zIwbg z@-weHBBNGJiVQvx7^$y1KDgJaNrQXuAN(Sn{%w32!?O^qDu=M~__v0Y;pEpR2H`5o z7$Kn3zcT!5z*i(XXgxK9VxWw%26Xz@RBMV4|LIz+7Oxo;17(Z`ten$79see4Gqkx{ zx@J%elre4uo&L?hzhzpMwobcE3;xUJC>%TpZrLuNbJw6AJ=N!1`l!#h3{anM5$f|T zBZB?9goO7W$fJe~8!>WJ+?e?B6DLoZmNY$O)|`3s7p5=HShix->NVNxa)R6S>>D|B z}m)8?C}uobB1OXVDk(!!{O+$hy23?3n z7sZV3Nipa`tRsgHAKtfb=iNhsWd!;E0|yRNRz7=IbWe&w7h)Ygbm-9Dz0Vg638wRs z4J=LT#2#cVv^%s&R>4BGGJNCYKkOFmfYuUwV^`QJEI2=bou3D^QP{H@ti7ns$Ntk4 z?HznLb1in57HQqEH`WFp1B=E!*Nxf^Z3gzN#%ix?eyo6bU_?bnuLuWPpUk%l#F>~zi7I%AKnrM5xi*!v07p3tUY?`)Lzs^-h`F%iwudb1~4 zC+$HkjvZu?T7|ZNea@!hODav+I`%VLtOctyG)D-e$wKDlLTyQ@!gw^Ow(3teXz&aS$jwujr~H7Z_+Hp-rqFsUCk4FnZK|lT6gSAw$<*|hGLJg zul9^K6Z?hZw8PqU>>kzxEki$i@g_(s(Z;hk*bwa%ErXq5DcT9mhvl)$EK|FIJ;tur z?$csfHH*-8YID)%P14@hI$#g98QPVB*v|~n9@QpeZ*qiY(^g=gaSpzP>+GXFr6ptEad+H=!tJz8+A!?z_QzY|v$0n@L3>kc&kC8BmZRN_ zuk`fLwrL6M2#eA7Y0KC*Y?k(+)`H!EkK?S=LeYZ+XhqsB_(<6xZI_nD>RF<8OzVjK z=jPh&+F?{3ShqWPKr>z!3JFI%zT-YS}p#nnAjwG{KPTL)~bqWRbE`^&0m-nH+{(^WLz z!kDV63+7o`_Uqww`lQ1fRh=-8IxLP=(fsMYsmH5m-t^V^qGmRl-+VZ*g^lJl7#rJYKJ$jHjg96p7)#q|{(>>KtsmwsZ@k~ZmXG-g#^gBH zJ)FksHkzLd-_^}V^Ae2hZTDk7f-%31<{{nVdf90H@x^Olwyv0WVD4a}`No{bZnDul z1Hp#BX%1qec?IIw5SQjGHl(GwjE&|G$kRsi29#k#Su`iI(L4b>*l2zLo^0SvfJYn6 z2f(w9<^hnw23cs1W}|UGWVAt6n$y`JJI(cMG`@#UY&5Qij%+lZht3e6(Ol97UFy)O zjmGWJu?@P`p>rE_ucHoZs0$r+Vnf~Ns3RNdN=Kd9PSo^k?)fJ$ahJfNH&s@WF?tNc51&!7o-!?4e5w6mm)Iw##z9Z+3RolxCS9Z_9Tol)IU9a3FVol@OW9aCLXom1VD4UjF6O^|JnjgYO7 z&5-So4UsL8O_6PpjghU9&5`Yq4U#RAO_FVrjgqaB&64es4U;XCO_ObtjgzgD&6Dku z50EdAPmphrkC3mB&yeqs50NjCPmyntkCCsD&ynwu50WpEPm*tvkCLyF&yw%5@a9jb zd%JIwkE{50-={V}&qsLfIQ+uI^)laze+wu;&;CBMBb zqc%}@Nxv8ul8Z7;RKsy^*)GqusGzI9dq z_O_hbbY&m*ww~I2Wk2@5fcgYwU-rI&`V3`%_P&Jr6lI_GzJ~f7Wxqn%v%PPkK1$iU zz3-wvO!2s~`K!I}r9N2sv%PPo zKALp+{RC{9|JJ1+HwMRm=Pxi3}WVVkz zpac6@gvKPQeY1~MXw0J8Kl@k)K5QS`K*#p64vl$K`)MBw(U?fJulBJLeAqsALLJ)2 zQm9k=*owwjs=c<4y=V-k+H;}Wcl%fkHe(;V(HKtk2llZYjqy}}VITX^7*O>m_OT&s z)IL_EF{A2#>|;szuzhR^8@G=&Y0RnmFZ)=O#-yr$vyWBbGxo77jbT-PXdm0s7+3X| zLiL~au`qnnJ~pN?vg&UItDW!!jiFV4Omy;LickGDr6(Vz{K$tXfAV1}k9?TQCm$w$ z$cKqP8Xpk9&FzR8El-pPl_{>g{Q zAIOKvKgfs4U&x2af5?Z)pU8*FzsQHl-^ho_|Hy~QAIXQwKgoy5U&)8bf9-+(re{Q> zI24!CP+H1^@}fK`Zz_YzqB5y$;(>S}o`^T%k$5GZiFcBLWFeVIHj!jOvc+km{1^lvBg-E`UdoJvT=TGUCLSznGdC;Hh4jy0y2 zus|bQ)*s zM_`S}hHunO!dlSVSXZ8dwW5#l-f||^gwEoOgpM_!mvP>HG}d}vV}UFQYe99a4^Fc` zg;gF;oRYUGfzowge zR`NPdFHFZ;%5j|kUxYQ2FY#W%Fsza6$H|5Stc4t5J#lLP5v-2f%$8wIjP@{`cf5E81 zRMg)9)ZlW|S7+4NG}Kpb)Yt;lPY`M-1@+SxHM9iv5rP_-gZhX-jbuXqfvABb=)VtY zU?KF~9U7krefNXLGoarapy9dD??7mH1@zek8cl{i!=cf1=&uJfI1Bpg4-GDbzIs7p z^PsOm(AY}orz^n^xcLmxLoBg-IvC^V1;`3FM-IPeTfJ3&?pB^0!=?Y%F!9h>(&;ligqHG*BMp^QG5PV2w@ucB{`-TN~@6tKodVk~dsJ<=nfz;+c zxSBOC@>2QKKfP2EI5wznAhu&;PyQ9Dt6uA_LQ zV~|MrBSiGRw~wfQzn_?0H&8U>>*C#ChKOgnjS%fxjuI#KjSZvFD$-K;)cXC_Y`hNHjaPSiI3LL)7CN4WG?i zCPvR&E*_kcDSQU45LdiciaXy}DfVWs64hO@#4MbRczDEWG3t%gB53HX_$J1!V(|5A zMD6M|BJe-JZrNhMl5BClB3n%VDO=QsuN7zKtrfestQ8f9*NP@Ttre|0t`qHttP^8W z*NJy;!Ijac%-YT*htm4TZ ztm4)4X!n1#idQb+e9TWcFY~ii^u)QDqX?^T=H_>VqDxlcjsC%kZ~JXNUFh8|K>s z{as&mk3BSwM{$dOK4eex;I0Clg7NJ5q;kFJXPmD?puf%cM*QU~X3w6pd^wxHc;(FW z`Kf_3m(5$TXwKqHHfzP)xpS5UW-eJ0xO~yf^mN3?oU?54%=ExH%a$!!#%3>BwroX4 z=A6{P<(bRo%v{8l%~`r)&hpH_#Y-{+=P$}gpF`QqNxho$^30i;bJ(IeiT?io5j@j@!$OVhvVP<_`g3P(kra@f0;vA?-}d5cftO) z{r5=*b4FsOr!85Y`9GZTpr}4}r6kOpx15EA>FmmhEA{M_;UkB$jqzhfG;fLzn2#7a zJYv91I}Du3M#jdBXYp|f!^lL?tIJEf74KcT5$_>Oag)uSTf8Vf zKKK5oeDRr9d8PPt^xdXC>~_C$N~7H^3}M zCB1w|SK2?6L&pA#94YF#0cJVE)gfn=>arYr7G^oJjEohU?IRNJ_1LdimA|?*=aa6U z8(^k~8UzRF4Ka*p6rT*yu;VC$j|7vPmRL{ANUy)xUy()Sq=-lR|U*c`v^8sitZh;QaM-iWWtH`4>v za|6tD998+#Wu^zZ$luom{i?oHDdzmE|5W;4+hNjY}cR5oOTh8rc(`ne90i@2}dg#76NN_X~<_PM2h)bKwW(bdmosompPIiuI7IxX)-0|7E+MqWCeu?C+xrW7=58`XR3vQ+`=SeP3h0Yv!xHQ7`|JuOJg& zcy(G{aV^3dkDtu(s*QRz#WTxUXT-ZkInCvz8GN}I|KXP#)jQ*jWnEfNe6kkC@0OxK%u#u6GlD`=;rad zSx>3PIKYLT%<0PhWj%%(?WB3UMC%=p!CdcG`w0i}&H6Bp-_3j{71vWk3^$gaM0eG_2K2J9d*E8 zu;E{h+Fu9hG7bK&QLY@LJhOgPIcC2sHsmt;5n7K!Tys6dnd-qzFID*)V5Xlm2nx-7 zT=f%!4;9axPrWH0b3LUQd^*y%T3%wL` zRDN#eKh&^W7xr#WXJ7Ot8Ll;*VJ9xqU8|j(HR{1x{WV%YHrGdqgZePrV_Bez_z%l5 z*Jqhgj)V5kmE2}}gdw-eHwNf|VE9j{Vb|9m}XD*u^~Yj1kX4IamEw(arvL(P#%;_>GyrtMezL zopDh91rvYfeD)dTo5qo5KCiA*x!}{BuFx0|xkzW`>zHBxF7#h(#B(5jj!FJV+!(4ZComA9Ffinncj$BAuC^3YqHa z|IPW<{mcF_@oJ9p53`@(vwreQ`15+FnZFzr%>XmK*r<0E!A!3-#%nPxd}&?PEMLh# z^aFFg)doWf&Hcs^LvL88wZv+ck#3e-+%2O#EO8dgXz(0~bdCMF+!*&HwkWi0)k@qf zvF?_U9+q1ymQhVCah{gZUY0T5ma#^&6lY3rH#FkqU#`=b^>V`CKLPvSe-*$o#?vyE zOwO#AB;ujbWzILqkTao0ys^%0iM3cpHnH5|X&L2ZiSxFMhLC3Y0-LE!(_7TL*pF|# z@9%IQpwv)gx)Z%PKY_zLKx`1&8xyN8d;&xIeG?Jdt}SpII@k1WmgP;JC_QI6Sf z^Nn`K7%y&hFQKf=_0?d=@h|maF4xOwFHGYGb38vIp244*Uzy_-8TD`Kr_FMt|Ce%@ z{e%3z@nx=;Jfl6k#(GIK+BwsB$Xvd8pWCdLtLri*J)8OTGuj6ie46!H+*e7Tc};$I z)sI7w+ylWF2kkWEZalx-YAG?)XqG>(vGVb^S*}<^E*IknbH0U!-KqS|dc8U>G}+}} z^kXbQ{7b(v^A&31%dEc(f2Tj%Z+9TaMI%2$4(0#ma<9fy`IzZJhMrZwY^J-K2gQ&P zG`h^`%No(>PcxnF8(*&IX1)0udUMd;{w2OyZ^n5y#e~@o3k~^P_?J1|skSOZ7wOFM z#xzz2{x;M7Omwq+rG|Ws{m_XWMHu-R@zs40kVH59JI2tnVQ&uBB@J~M*_!!}HwX&N zbRUC%2XtQ-bjq*sWv-V7Lk<`1idnCbM!ANb47*Y5XK^UBvA&KO^Q+8%*S?zdQf!p3 zgfrJqfT4KPc?5GlSNm_3k6F$$Mmde^xsm;t_32?WPze|hIvJmu)1~!S3^<#=B8oYk zhr!=9`js(UQltx3S!RQ~uTc0~h6+^?Jf6*xXKS^(-OY%<-!Ye$4S5>{A_d zl)r=cXN_@}*`8HCX1g)W%P7W7C;M-FndwoDiTK-0kNGd@k*4%!eO^5uYnIo+`u7DR zzrWLeqje0k9PN#C3eEP57rf-1cILuv%;_!~HFAyV zP8#*)f={#j!A5xs&HP+8+6QOr^+;>Zx6YKWnQkuEOlL;B=YX%P=l%Xm`!ttpwg5A#j>hjIm*3v+xLmoyq@nA2S_^zA}_=5$x> z$x-{M&SRL<1smnL;L}_Wd4@hr{$p;}QjK^D&Gf7Gs_16Dw>S86P)}yQuFj`Se3|nN zH~iJXzOz|RamKvQMZK8iGnShSHJJImx(?%l->Y&tXa~&Y78wO9G|Q7==+#BNo6|KI z`vflZVAgk?!H)y}&3cJ6;=9nxDI=bPe9e5g@_REMB}V>@?GMk)`R+5~IpD*b?^Qlb z@|ojNIrhs`zPY}=jCcyKl^)|F{eMe0+oPGktK(z`{O7pfkMe7Lne}*eoyVkaGasiK zXM(@Y^?Y?5u5o=d>Nm{(5@a+0F8sxuF2y(p;3A!wf3qIU^m?OzR&tu@J}%_Hx=!c7 z&dvD+y2x**LH~#P%<)hOT(nzeKFt1M)_1Hiu5_XANEA;j81wgFqaQK%yYj%Ev2QE9)Qj$L4fb&kg*YzG+r+?Xvo_n4i*e&WJ!fOKi!29rVfG)Y^TwAex>*l-Mq&qkZq6^qh_BF0H_Xn6W|phH zK`_nhjmQ5j8t0R;RlCtoF?2?)uN13ukuj?MFUM~S)0L*y%kXoj_A6MOk4aIOqp(TFCVzJ~t?;!75Ddpu)|`mQ16|C^{rv-m$|2b$Eu7%fp7d221`i6Y3!SwkM50vhKuZ_9k>tF8p;uwCZ z_s@m@&0PbYZOqT7pYlf9NQ8f$ma-#x^Ygvz%bnL+Hl>e5K>3lRlWQ%T(i>Ny{KIHH zjmK9}`L{!QB^2Nu2-P{bQb2DR<(N+2Pw6bXy1&nX=$;VK!IdSe%3=Acy>@6i1u|cU z>FN6>_^Dop<)^qvAMS(nn&b3j2e=%TuhzpImY?n-J@pT`9Oe)9oYJF^(%lLF^!*WM z^>@le{m^$toTaDli8!NQME=g`wJzkNbw?P7L;cb^m@_)98#<%MgO1Cg{sZk~$Mj$q z^gtK+t9gXO^3}SlLwdD~@?F`N>Pa2upYDSH7#DQ4zTz_Fv6o9oj$5CvZVae}AcAyF+?4k~wQ%FM#Nb z?y7yJ?=m>kFMW5xnf<8ufE@CVFK)y&h$gy5pb5Cz8B!`#6Mm25A}BSJFee; zF8n{uMfwx6ejVG73p#xtz?uB?9RO!^dXE`dIJ7T&`{0D`s(+^U`JMGY^xnQR{t{it zzY}z4{Hyoz9qO0f$9GyjG~>+vyvYBY=!ee3Iiu5i^Ulhr_v4+FUySmh0*Cb%hs3xX z%3o?HJEos>K_~mc<*@vEJK1smX-Mx(epl^hEhO`FGJm7~*_nRm{dH&M$0M<``U{7A z&hn@C&^@Ca%b$Y8&g_@oGk3-xy-)6x{$J|%EckQQKa{wTzbw#s`ZA;kiw^C_RsBbR zKU@y&o8IGgHvVzNKfRajOn!U+8|AosSM7hQoqfmY$-Zzol+V@tFzQ9ivt?H=g3e42kaE1%wvc1AxY<#Whitqb{cT<}ltKRdG@ zdcWBjfAk)+v-I?yva|FJF8HJOk)5?~w7%vn|7vL&i1qiEQmjM!sf2!=) zkgv`K|A{Wr)BC^9=7%{h(yRA=9m@|2e!kZso!3~-!3z0d3Wh?~Rm z=>V&<`Gfua+f9!1PjbN@y=Ut_*>QUHKCMIhqW5E+%`fP^S7-dwd#uj%OYf^X>z}JZ zcb1;sLq#9vuzjKTPo44S<)VF}^J@6dVgBmA?w<&b|r7yeD}aXOQ4CrZYaqQm_2T*x1b@}0Gxg)Zcy{s;d#EWa4W^t{pTS){&Q#_w7%gi{}ad^Ll}qYtC6|0`Zo>TqV#dEB`I2ZIN z7xb9_lJ2U1rTt-N^3(junf+sVfG&sjN0~dTKYFjunSHy;zuI2Bb@R%-#^114t@{!ot_>%U&o%y$Yf7VI+sosxq$RE8o z=FC6nJuqkEKUea_LOy5x1NHyT=+*EaXYIGE`Aq>bca}cM1%JxEm6;&2=}L8xKfR~r z%)eaaPv=jZ>ED(8rGZ~(@>jZ`ll?gJ&kNwsnS4|~&gj9QJIg;0{2_{C{mc4rXx~)7 zxE#{kBXei^q4Axw^6C91XZ!c`K9e)~QMXR{3kTI%`NW?y{)=4XpMmtw^iS_0Ipd%D z2WRC+y5Rqmi}bGSx5P#M`~E@x&h#7VB7ZN?aXGXvSM(Sc>Hk~0tNN$$1ulpD=h(@P z=>ab2G{17DU#fpx4$Ch^VrTY6@BKKlPkO({8Qm5C^^!A({JCm>U9ArU+QoM)|4z`I z$)Drl+<#r!AH9#`Oh3UW+}+9fTY9g?(+NEi{5z}vC>L}(U*t@FdN0P={++Az^nQyo z`DuOJ8J*r&aYnxg%W*b-ivrzQ`|E0dCCi2WU>QJ zDITp$P(0dS0P;$3K=FLApW7Rsf%KBd>HHDJ4@Eyn7}1BZ5FmbPoZaBT(k~-2Fgb=g z3dX{Y1W8O)xV@Xa@24=WtGvJ5MPhs)!|#)`uwobyuCNmwB_8X*@T=!6t`>MBuo{T5 zKwKpdMaS)wbY3p$e7mIcGD+tZSXU(ec1ldn8N~1_^eir0B99oz*jKpkCy^Hqkn|#n zy!>XnU58}@1Ho64x{m;2%OosNp)Z)Ee0?PHdX66|hkkP4_)k-L5_uYsp8E*K3ZZu| ziTpBtAsFWi<1R|%0eFrzvAFgUc?yu~<-%~O_Y@$>l_W7aZ>YU}39B2zn2vZQ(UM*) zF*$gQOjk5oJ};D*Tz-p8mj(1bGJfD#nZ6wPQ@JTX zJ6{r$eG+86Vx-rguM4<8?w?8L%&%Pc?J+$8FA?nxz7xSU%Q8%C2|Jrhx^OZ?Z_|Ak@ZoXF8M6al=5Z+ zNscUu$pwoUD@M9}i9BnOq-RP@KC?!qs{~TI3W>?JD;V31bO$B!I+gD+mG22KkFz;p zl?uxgmamm^rmUCw_5)JB;S!SzavAI3&cYINq@N~8c^(q^~X`4ONE`YHz=AiV*f2fb7xFL_GY1>~W4XE6ZU z4Xg$30agPk{yvHPByPwrQh~%@ibNg?BtC*A@<1T*5g?Ht+{0Kj_}>RyiRYCPc@}UG zp2q{Je~6RFJ=F7ym6Besuufqjkm4supr1Huo@@(}yQ$5d6&trka zM|*{5UY7UiZ!5b5+U-(e^1dTdPnn0M-WZVDk&0S*p9&;BmcPyzR2R2hBF_d=yL9G| zjCblaNw1g4>-I@MJ0_7wz9Q)n61fkM`0$dLob|rsFaEfE9w#w5?>$vcoov@mN#yJu z=@0FXO7u~90dl#+F3Xji+m)Q{Pkt*?65|hJ$lwbZQ zjO~KFNkHN|QDSn+myGp7zHwh+u>tKvC=g9iT(Cs$2c&+Y{EWoQxZeW$MTvYTa4YW1 zCGv)EWIiW=1Ms{~BCiHgJF`zBuLM%Qv28W`xFV&QhW8I~kBymU!DlUAo*>Luc*0F% z&)_}_y$YoZR9JmQw&w*vdY%C!`%VYmit^JW^7gO!|A}<6+;=Vv4 z&jAj`eYQlN0UU(;bcs9#I1u+q5_vo@0{3weF+SAT6x34zFcFvtBzy5uSbM!@w~u1j zBl$;>#N@gNjn2`A?E~t_uTmo43AEzATq55N~@*`sH}(V63yNZr31-6(S?RHAv)Vf#iQ@ zB=S?hKDe)!$amhR+55}9T#a6-2)mFYD zYKZ$(bG8uon!aRi;3VneT-$x=pxKzeZP#C2! zK%tkyVl13e`&s~83H|0v{B@(k0CMt|kShrZ_R|};44oc)XK*}#$ zB2QZ=?J`v&FHDp71rmAnJXuaTkkW0J$ivn10QJ1Rdd}v`avSEza?eWS`9P8{OFhq2 z&rhbx=f{A==Mjm#5J+-n1F76BiTvPf8NU)p@hc?qEFi^C1ycMJi9BMaM&APnW5CI< zxAYX*F4iSUIgd%?N2W=82nA9;N2W@wR9K`iN1-o}%JGrNv!6-FrxRal)UBQ6@`iCzj}2oa?i-Ev8+uIvl0W+ZY5aXTPP6xq7bWtFQJQ@| znh&ISMYm|I3DWtFl=@B?CNX=cY(K++_Vy!M-p5C2_IYQVL>>d|2Y#a@@;Y6% z9|Y2RN`-p9Q$6=k_e|ZN*e&Cg0;#_!k(itSq<%J1VIYv^B^O?n{cf?sI3PW*eM!dO z38ecxAdRnr6`rh6>33;tI_&QtkowDVAoZ6iKuQ;-@ZbxQpK6K8`THfGC--XXBIG_H zk;emx?>LFcCn_bqP9paJ5}ip*F0GMzzFe*Jt}s|(LY2m_w-{FbrYtW5Na@ohCZ`;h z?Rb(z9(z#o-GF>4-dTysXWy6U_W|j7rNrdGx1>D4z!KaCO5|myBp;bT;v++1a>ExI8-jReCGvV;H11DI zlgNXC^!)P2vb>8DlUakta*+P=_jcs5 zK$0^?B98!9XopN`xKd+aVTmZ~Oc^(SOGeAHeYQJ4s9g84v#M82=7n|*ztKw*-?P=%MhCH;uP5{2msBNh56Jn1Fl zmn+Ox7^g5m;aTW`)+O?Q#7~YyezBRGeO!D&A}?>{#$uq)?Gkw@Fc9yaf0u?u#Yz0wAT&m&mh$^|;TH z$TNYT;66hl_XU!_cqpuEA@e^bk?#aj`f`ap3P|NeO5_1RANcdB<}%-Ui97*#JLHU) z$YX&dcZ@`S*+-^31Kb5aNw`k>Q6P})JwRfzPg^(kJ?Izw+}Mx6Iw0NWsr#HZ@_Bu0 zneL>-$krx0T$9=v;9_lak!hlr&m)qNsp9NC= zpOMJxfmDAdCGveh(to8yUIC=~+bNM}0jd5nCGrd)=`&p-PXUs?lO*y)Ak|lbL>>er zJ$Q6EB98**gB~f7mvnGrkAPk*krx6tf?gnzU%cLpy+Zs-7L`Y07>FUOoLH-ONjRy)lyRn|Y%g{qH%DX6$#{nr_ti!=eSDkB9TY-m2{@C;U+g$1^QWu{0NZvs|J$4?UTrNs^_J^!<3&yo}->; z0^1^fhD4sIp2q@B z`K(n~sxV7oyux6GOyP-vGTlyv`3h4MMkw@EcqT&WLt(MPMBoRID?uWU0J_6o>j%jA zl?ro!Un5?&M4qUg#{tigUL^8RAjuglG5HKO%4wc(5J=CfB_@{xsoyA8m;=nB{3Y`C zz#QEBN#wD@jm^bOz(q)z~nobeKqlVat4qQvA9JSRDd zCGsL5$x$eg=L1QOJc&F9NOELLA$!Qv2N=NbPsS zOd004I!&HgefmD7ZkmLym5`Uo*d3!|bXK9-ww3T zcO>$3;BMp-s&MCI=|ADX{op5PlB|b7iJSrL^R|h0N!(*c8Scl9!UNENr}8dJ>L%e9M8)n@>KOa5lH=hf+KSGp?aPNq;W!yM4qXhrvho5 zkRp-Cs^^hF8Ye_Zhsg_rM;=}sv;qOd|?iNZXE=?W7RMk)*h(l{YNBKHM) zzz&bxF7q!}SfDUPVJz@5$WKV)hZuEFhlEHq6Yzqzd(t+pVf^`MSMbvAFl2R zDgLo_ZfpwZghW50?g@#W2c-ORB=VxQZY&n@2`PS|x+kRg;lL4~6B0dC-4hc1RJP2o zULwD+#*NO?lo3+=26azJ@e6_dK_?`7fx0IodJK^Gi;~C_Zgpcph)+oIc z#=3z{Nc6Mno{;FO_j)lfz*BkNlZR+mrPfnFkNA+!XSkn3QyfB_doHtC(uI<*Tvhb^WJ&yuI_5R zciy|}FViX!f&?h6gAB3}AV81|0}BvF&>#T<1_=-(j4-m%K?gx1gqe-s>yyvd>VxO^ z^L?N5J>Q(1oTR6x-Mn#!amu*b=tlV*=u&Nm>971kKM$5wyM*$1QYhO=s&>NkhfzLX zE~s_@oz!!xz3yCR>*p(#puYbX@nf8Sa`@luzpQG<@iWvh)ea-a{nUbL2a)4^Dxlia zD4&-$7-xT}<8DV8cbjTYql~*rwKt-SyFs)A=`4yNJ@CG6syhQ0Bi=wYQr7%_#GqR_zJXzYb;oYgD@!W?Z%# z$2)PW)NE%9%KqD|+T*5w)Y!aKm#d*{e@V4VrazCe{hVqiO@AC^`!UttDE(}A6lME6 z_v*OY@IQGSZB^}+3)&yvqsPY%l;dOl#rnB&LbVq!bUJ>`I9X%nd_8_=QTG1~%5l6! zwWm;y<9MBF?+WR5H{xgM-=Ny-QC@%JDC4hF?S7Q;dsW+wGQLZ- zWplA=Q_9OzWiT+x(E$)2eTCS=U>GQC^3uRXg#xE*DpQQH=9=cAzY` zU9~simDE$Jy$aXy`9hTbF;k1wcAa_2`Zd)KqAV9s?e!@0pHO{ECv<*kl>U_J3!^+Q z8>-qrsrq)+b@^2%}1RZ~jTwOTXxJoJ+moIj7?fIE3VQU8%J4wo$6bSt?S>$jc4@wd-_$q-kwtJ#fEODs`@s(QO6rX z8LwaUxlzWeS*q&|?XBzi>t5IH=;QkOgtxtQ9e-T4%WPL3Ph97-J*N8H@6_>&YjymB z>T|rKy|q7MX1h_d-AP-Q??;(Wuj-q5f4hTQBB!>fc4}PbGmf+D&zbkOw_acA_q01s zv0O^ElgO=>Qwh~x&wOOu3Dp zCyG-#-zds_BdRZJ@;Uqy>-klC3T3&Cs;@e&>nBnA6RIzUGT$lV^yjtiMOn_R`nG>f z*I$p)KcV`1zuN9NhyCnU?aWs+PpiK8*V`Rw@|bEz@OJ93YWq#T%jC0o8~F~^4t}$} zb=@hT+Ho#o%k}P^DD#+AeOpkrvstw_p=@VLwZ}}p(&R%Z+v!*B34Z7=>yNAU8kF@{ zt9*Z=c|+y<6J38vwTDdJZ*n)v`YzQj{ZQ90s&*b_`#IIF&1$}++EtYGE2^C|dBWr| zl=Y*ko%p`4A6M-tN*+<|S(EQD`8JgCx2pCAlTVs_!sO#7cbnX0@+KdqWc-F|Z~I=m zYr-=D%ID#UDq$;6TGhS{BTFc z$*I0D{(%0~x9RaapHw4!c$4MAs&AAxQ8|7}k86KX^;I8jcdVm-$9?S%o|3gQMmNgq zV~IE6*JB2yo-n$9*Y0>1b>yyg$A@uSRvqV?3#sFWHQ#_Tk4e?Ha#80odrbRxsJ<=u zD%;OK-R_{dHimcMc9i*TKHA>;InK0d7b@+JXUYBS6sEE^%;S^u@ifZzHmSbIl5TG& zO8>0t%RHy&^R#NG87$8@^C*vV6Bm(WyME>?k8>l+`WsZ=%!@kiI+Xr3sxN1@lQr8} z1~0ww%`U_*7Hf^_TWm9y`_UxSr*<8P{R!aj3pZmyVxB>CdRX6w3HZX1j}KyLG<# zlKB)-mM^Hje*78B%Qt7z-!$X+m%CceSHH*QxQy3NuWHxdsN*D2mQSd@)o*aMj;jne zH88~5c`lOP#JIbVLw;?6@nreD>Px;=$C*Rv_p83mV_HwEzB0e$A@k0lESFY&lN3^~ zSA8{p$)vR$ww6zQ8wiy$vY+ld5lF#?|_H-MnfK{gbQp z^SXZ34u4(i1=SAXzwka6Q0-mFOL%IhYH#|QEV++ zIps_(srIHXx*TnM?g?$uaf7PuM;UjQ%FoGk+%2lT31wbWs=Wba+)34*|9gENx1hXU zL!Z}rddk)M`Q#?mp2Bal-bU3P!w<83{S&(0G#~2MP_MxUdH&0jF1fBbRZ{H)avgIj zuG(|BncA<~oADp0r&W6mewBK)YCG^N)Xk5!w2L@RT~O^9ewjL|+Pm;e)H_vs6Mm6; zO0`$vCh9TOZg8-Cfx52RdHj3ooN7n#^VDJ0-i}k$+f;iaevW#BYWGjL9IM$Mo5o!Z zP7!OjaMF_FZL{i|__iL0Ln!_Is&C^~SL-|)H^*np9G{!Wcgpjq+OF^D`lW5Ueo^&R z%y?xp-q!8rc*oZ9uKKe7=4zeSlPLWO)z{pm%coKLQ>w2r>uSBPRasx&-%@70q#1AJ zZe6bzWj(j*EBm!BslM$$*4O0}%5oc3-_TEW{nSsiKdJi0&3Nm~c43;{WPBmxg76j zxhWiExd~iPz3w8NuM3y)x{S}OJ8(VA)h{&t#xaz~yHfR~F3@@B&)4O0j4OFo^$lI8 z<5#ZL{<7*DMS1@#9MH#^MlQ9jT`+aPxW%}2zvk=F#k?G*u0*s>q3nk_Q?EC!Mj6*( z>dDJ>`PIhwUYFzF7;ihu`WydRFX;a4$Ny!2_NsQ|VqI=C`%50@wCd}Go4 zugv4`W&8lj@^h+h9m`99@>e>aMQVBeDkzW7kC(IEU8)_tL7%@+(j`APnhL7+4E~aO zi)v4!k9w18Phc10tulsxt@Rwr?^pR%dnd~8SIw&ScC@LtsrDw6<8Df|H=^vXHMoW4 zR;%_Hew})yYWLy}wqL!`QsD zey%n(rrM)8Lp`M0%{yH3E9g@V)vn_=sB5ZSxYgCVZj;5G^k-B%bhBdm$8#T4dxaidNawzkeGxcV?ljT>RaykB;`8r-zYp>|@QG40d zx^B9p+Kc$l?5C<~yI$1Xq1w%w<_*qPt=9Ah#Zgd-KOWI#D zHlEYhUtP7U&$?Rsd5v-V39W;R>e4f6s;b*xjr?41YL#lQMEO0DQPtjhRJXV4Nj_iD zKc?C%u`J7}c0WEr-K*MeJVNbK?U^HboNs&F<+ysD_hqBzx-j3G$L~@{`_4?U~AEke`pW_eb2laTI zML8a~qU1Y<^f=y#avs{C`X+Fg<;ItHI1?VzQ{-L!Gn8?;`zvZHk#=tX&)4wTpb`Vp-Ij2mG;&8haPv5waJRsGE!t@o=P z#_g-Le>1+7aVAjC7isM0{VRzBjFV99_&ap|G1a%j)Z0xRTiww*5AS%JF1KCv`QNJh zIsX>jZ)ueMkWzhNQ!ki$6#rHpm+5b^eU|q*-l_9ytmSbquexf_t?O`jS$@bEdzaSh zj4tFpj46j|_r6;ncli@KpD@aN7F1vEW6YQR5S{FBG+8gAav!4B8&rGr!@6AcLu$#G zF(!>Wj9ZOU#z|xIgSvjrSTg2~0pl*?R^w*lkkM_dO_+HZr$3;_NAUd}t=~V|^**g9 zP|h#SaW#+s%Hz$cb_V~2I<4AC{5Ew$wPU!II;z@X{1)|sYA4^@(RzOf8-vE3_&+Q+ zt8zbYhvS>n6RJIA>V8w_-qYc@kUXo}apb;|shDbS;rW#3Z?o!KzoEnNq>QK96qwsy%}{sJE#06n>9-qiS!!?@~{y_B#9z>NTpp8oA$OYL#jaA@`R|^{aL- z{u{MhwHu%5aD0cluG%%+M!lrkn^2B}btwC7jcQkU{O_l~X!b)4<@^x)d+lF9*{`cm z#v4=ZahLRo*K>TCR?KAsxN`@xcGFX9M~r>ffdf711%DChHOS>hyw8NM;#!&X#`fuv~T#d4v8>PST&-%WXK>5CE8s+hA zQhlSQ9x`=ftB$jXvRqa5#Z4VEbvJ!@(tzwX??LSz52hM|d9B;iEhsYgBvYe>+;&FLv(ia2#cS&Z_q8f9d%& z@cjfK@w;B8q{aaLflj+}x^0|0}YA3$a(fT_`+fY77EN<&?RLHBUJ@>CV zf4}MrU7(L^2g>8!uKG%$4*8QFQ$^Koo~Ly~wWmzI(bOUKk1QWlxt~VITci5wj4QA6 zs^|z^ZVV=)D zESFb(>rs{)$3B)@r`oGf#v4<8i3NT9eq&=#hvP~fe_gdFE;0LaFYhDlrxKpxcuS$| zx1g~fuVTGk)sC6<=1|s~MOm+eZ5;QDmuj6u87FKU!>bu*rD_*0)9vT*Z&)slZ^oUb ze}{3Kag%WjxzBEGe4n}lWxYxK6#Hcz%6_hdI~<#^h;n|<;b$?0Qy9Rt*nfG4!^ymB z5q-YPD9i7lU-svA)i-YHb*A3BU+2HcxY4-I=sKWz)6{ii*_g&r<{dJouF&m9Q06~_ zU&4*X0^`ZN(kS`pRXTpZ(QT|TrA+LpaFmA*kA!WQQZhcxlykpgi8{uXTPglsaVUTtfRdq0DdGSiYgd z(apFe)gHe?=e5eX(wNWa@smb5Zc?f*fuCc%7=99Wp~dkwgP*3J#*MfUKZEOW1Fpf( zV?WAq?Ls-88*ESJy@+x=mr;)A7|M2|s&9v>x0`yCsi#am{~MiG5M^F-DCf0Z##!Tb z<5uI8(QPc=sq5v98Dq#eXAC@`%gv%Ze>3=2j{i}V^Q;?X{w~$mykE}?X>9FJ)fdCJ zu-+Dw`A(zkj|t-#%Kjcgd0dNmJx?T2&J*+a1^QQ`%wzFBok!MK&2>0FL4OJ5c}OGo z{jQCmtT%s`<~vaG%_#Y(>91$Czl_p9i?UwmxB5K#QJ$|^lzDG9u10y?G}*86cpIv3 z=kGfl@1}nT%Hv&$a^CGnIq%llU-CXwQ|&5_vs?w`eW!$a-$oZnB=tbJ6ryO@A4sKl-4~cN@z3Qz+ZrsM_mMwmX3`zj4*x@&}#A zD7GFK{j%MfYFAOl&y&mN&Uuu1x*pQ?>eTW+5`3h?!L2}RBai8RA41u0y+)UDsiggJ zd_C*cPUvx1LOH&|D9^)!>MK00{Q;EMY5gfZt|}kK;V`I@NZdJb!VS?@jM8%_TP)4v`+K>z4qXY2e{ALwj7Z#C7oh%#=L<(^?)8P(o}^8D^p zebG^!S1*P+t`jRd9hYKbsMGN#=CjJu@f|4ZHQ&(ES4SDY@H!noui62W<>pl1roZcK z{hdqy+dEso7nfMw+4}pA&9`;7{{D{Rt(vcXOK0ovIVM+iw*HRKI%E0GosM^~ouM~& zIu>~x{i;3v?#|ZhV9L0`xW<@V*V%gii{doL!7R%0z7^&8oJKi5$5GxVSEIZxhD^Tn zuFlr`XbC0HqvRQs<2{KoP8em}5XyL)QO^6TQQn7#P}X;&tlxa6u3tl0KVjTvoJJXM zBg%MgW9O96#w!a!>dn-}4x9UAQ z-zD~=%sYbee1=uuh7Wf-{+|B&ht#NX0p;_<4*V=`G5zaIzuWW|KB()(jk{3Rn?_l0 z%+!quturXwi`t#7^Tt+`^G0L6){7{|VFu;Am_)gb8$fw|kD2}E z_v7^_@1t8js`&<#d?iZW_=x7|k99iUOC7-XVF~$>_S!Oj5Z8QM=Tk?S51+vuuj5bU ziLY;S^m48fE%704edcEetz2A5KA~D7zXIW%Ho5o)^3AFxa*MWim&rwo+^b(4#4A#bRb$gSVrA*aqyd@K2=YKeS#r%f)tjeN6e zi8G8pYjSZl`A*dmuV;MDiLL!7zMVXxT4IqrZE}%6k=e`b-J&Iaj`7PT7vDi%Q7v&L zdDG zn_OH+o>47vFL~YM;=9SY%}cbzn9R>*=7;YgU#D7Po_xyW;(N(?t&5h(E%)ACCKt!a z{i-G2NFF!2_&)N4YKgazmrX9dpS+@4;;rOOlZzi9cXYJ0M1FO_yAoypiWB5xswEyK zUvF~pgXEK{C8o)@m|Xl2`HX6b{HlX@m&wHsllxUmyoEe$a&bL*M76{edD`TnO`cIL zkzYOVmQ5~xguJ3!;@#v;lZziEcXYP2M1B>*yAoTEA1BGjR7>PnFT9*KTePpFp2t?l0JCKor7?@%rAUd9iaT>K1qNVUX!$de`)`ICda zDb*4mCNG*?{2X~nwZu4iuUqFQPLa#M3yzj}9r={W#m|#(QZ3OV^EbK3pG@rCp<3c* z^03LpFOWx6OZ*yn(d6PL@{($a-ymP*(fNsABwwvs;@4&SCKtaX+gB}-Q<^tza`DUL z8PyVftY0;`I8DB&TH+S+-fpvh@GIo~swKXe_m^pti(e(*tXkqK@?9nu|AE}ETH@c5 z$4xG7CQqoAxR3q6WO9)|vDsTwE%8_6t9s1-!G9!Qty&_VqrF>9E`FVSMzusvq28#; zMgBx+Z%nnsFzc61F8atTswHx(saO7;Z#lljZ;-oHOYD&6&*b7ik*`)QF~ay8OfJrl zZ&WR@ll5m!F8(w5PSp}!l^OV~SYa`Ahzebo|qiFv~&7k7|HR7>O#_ZCeq{wH}! zwM6c_@VfY>xpn;E_sQL=C363@cfHBQACOO~mdGLO-D+}imVBFPi8rwRoXN!>k_S{v zyoNk#a`C^&W2z;_$@3-`|C_v^TH>$BmrO41B(JHKcrDLQFE@Y4;}d^G-mhBXcUXUo z$;JO6U#D6kpTWFaO)mZ~`8L%Ox!>FyHo3TqJfd3SZ^`o}7ypmEpjslI*}P4Yi$5lp zixX&xHag&QbAy255 zcsqI7vZ*p;-yr5bl_tAP? z+#DeD6E7lntCrZq{MMUXyqJ7awZv}nttJ=ukZ)5h(L+9Oa&dutLAAse*nZaJ;$HHc zYKi<_vA1b*@e*?Rp(I-3Z^*|{<}Y4KKA~Eoi|ubWxfmwjp<3d9uzt|w;y&__YKhzj z>&=^7yo|h{TH*ubb(4#ilQ&dL_^6p5M#v{rOYD>VXL4~r`8L%Od&%caE*>Bc zsFwI$#*dm@yn;NYTB4ivmrO23$!n@5-og4qTy&THCtgWDs#+r7qk5-JE?z~xS+&GG z`JBnctH}eZB|a+iGr1TekExbeBF~y!yoNldTH?LrRg;U?k}s;3crm$)A0o*7#p}r3 zswG}czQ*KYoP3>XiN7bGGP!s?`6ks8i{#r)F8+#qhiZwlic8@|tRi7m%;vLY#~*rpVW+mUtog zR+EdjkZ)5hk&l4hsL91!$z!S|@)6BjHo15kc}2CvAjxs;- zcJc|;5}zgCZgTN3`3}_*W8_hji+7O6R7>O}C z$JYGtH{=tlCDzENO)mbHe6wna{Qi$OXmT-29#SolYfj#{$;G?K6RIV?LS8hv_&f5F zYKa}}-@3`gyU81>C3?w+-l+2zbL69{B@U90n_Rqyd_uLvtJwZ_lZ*F~?@%rAT6ugX z7w;nvsg`&hdD`S+o;;&kVu8GAa`Aq0$5=~C`duTr7~sR7<>xylisuLGp@fiAnM`Z_@3He;{9{TH@X0vnCfGBHyW6VwpT^a#suDe`1AvwQ7k?@(m^zpCaF=THLTYKf1KkDFY4j(kG3 z#2=DxHMzJ%zD>2n*Yo@ZO)j1!52=>;AnV6XE_&~iCn_)t~a^ZAfHq%@x83S#pL3v z|-qI46k*`E~ z{fcME$5cyvANhKdi?5MSs+RbE@+~G8xnSEnqgrA=`7V=-ZRCE{690xgY;w^_9#Jjv zb>u~pi|ynk)e=X@U4LhuA9RtsRZDCqpEkMJLB3hF#3aY>tjWbr@|~(Ba-X?3Y;v)S zJfd3S1LSFwi*E9aYKh$E?p-pu=pnDEmUxhS)jM?lVmJ9})e?u9{}z*rJ>)a0CH^z{ zyvfC0@&(lrKS`c6x!6aZQY~?kylisOOI}eeaU=QA8l9iGjC@qJ#0hfw_n+nX5&OwE zs+PE%eAeXR0QpYU5{Jm6CKm_EW2z;tATOF+Tuxq6Epe2*ZgO#myrEj+TjcZES~Gtf zCLdKT@%QZiag&Q9O%q<7ln;v2{}tCq+mKkqJ+ zix#M*PMxIeEk^8i~b(4#4B5$acxQcw}UFP}0HDvj4@^DlZ)>ppHwZ8OH$q~CKumDKBHRV z-?9F@$;EZ#3#ui)gFI<+@!jMp)e<+57fmj{hrFa(;>XCFCKumJE`JmjE%D>zE3x(X zaGZQhwZu=5uQ$2)KJrP`59+YKiY8 zFPmKaAbCZ##CMSoz1JN7_#yI9)e_&t@jq^I@x$a3swIw*&zW3YPaaS$k>Ahp#!W8T zCKo?KUQjLZGvsxXiytL#sFvs;Upa2}KTeX5sg}qkLhqEx#gCD1QZ4Z{ zIe(g5{5bhe)e_qnKWcLE6XY?~605AAH@Uchyr5d*GvsxXi=QNKsFvtt{8jJM`HP<- zU#(i=Dc0X&a`DsTGpZ$?A)hn3xRE@dS|a!FdE+J*KSQ2SE%D3bd6SEuB`>I!xQV=J za`AKI@<*f55~s=6pdA0=6!|*U61fEG-D-02^W@u9OZ+11hfOa2J$Xd6T9Ow{E`EW$ zq*^V>dq1Gt7dMgjtCl!LK5laHi{ulkC4QcK+T`Mw$TzE&_zL@X*5u-s$#<%j_!ZWV znp~VFkExdURr0*a#jlVTR7?C4dDGobzPQQ7eiCf6sswHxX z)w|y0qK|x1wZvm=f4j-WZ;f95k=(W39Dlfj+^t&TbL8VD7ypxdLbb%#b9`<$x%hqZ9jYZRvVPR$;t$AUswFOw zXH727lIK)QJV9PHx%fl!Mb#4P)SPOXL!sH*9h-Kps&okxO9SqRGWyke5_T##w za>vJ7TB2OSS&6Ol2cAPdrdlGGK)mZsE(XabRZHX&gLk{h#dFDbsFo<->IY3O{*pYT zS|Z;7&jX?88;dyjWsN=-9`L8R`3BV;r&SF$YT!g!wlYw>)QA^ z0ItSIa10;DQ7mFVK7?-k1M*lM58_5-4DTe~ffINbXYhBp8SlbPn8h9V7;Z!6ik@E%-1=IRaM-I&5ECh%!2A-|{REub7XIb4kyl;g00@_g1%p7%wR$p{(=56{73pH@jmJqCfOj zSiy(U(W&<%kKuLHljvdj8RWV1`tfVBKFWQ;8T>j{kX_)Fn-P7~W4Hw;QSQ&3LAejt zk8;0l1oz4I@mI2ayi~UDmTyN{AH%YJl>1v}u!HgZ7@*E!&K1MNv{~+t*HL`xU-j6wkJS6WVGBxiEvI(yrS=1Xr{_oB3pDtM+ zzln|>y`OOmZ=jyUYj6hR=*M4S1h19t<9DblxD6e>dOzS8{+4Q}Sq91>a5#;~g z4F5SuUBTPY(Z}lz$M9yH#P8z_9zs8+FoL&X25-R%UWELwbwAn|o=-iA_u&i%(T}%c z1m(W43~r~c;P=q6jPovz;lJS|%Kce0DEDFc(Ss3ufjonEVg-MLa3h=_+9$tVyN6tG=_5D&?NF2^Uh!%{rD(Gu!I@B7b|!%%Ei#D zaSVTtlUT$VoJBwW7e??L%pm73Zw1dqx!Cwi9K*A5690fR_z?Q>0*v5=m_c^Ew}R|K zuUrh2`$5L=7`fa(_$ux}_%c?ohH|m+MI6IAPU0&#gB^_PN4ei2f^uI& z2CpKo;I$|h3$Md5ETG&!cRkKv7X6sO2;PJlOkxG^M!8s2#xcy{BtC;PSVce1V+8NQ z41NnM_;Zwt9Y4S^{2fl>^EiX@b8J7JqK;q_Gk6*+_%O;h(@)?SK8KSiKOdgKAE6)r zf)PB98GIEh_z223+dsrHl%Km!;)B#PxE}p@znnktL)01k09NpWDBlbX;1~|#B=+G9 z_M#s-)V&dWFLegTv4Y(w-%Rx2n0!-#lei3L@O|jV_hSV6F@t}D6?`4aHxnZ`hV3|s zN#;9)H=!RNkojW*Gk6dyI4tX1`tztU{G_aplQ@GL(T@`t!R462A*|pEly3$`aSY|> zHk0^!#-G6l(T{vK@J1w;_3^E;KE7GjA9J*R9x{f!q`i~KOVc}pZzA_2FEwuj|5nz= zRkA+H&l%*Ki8a(?_->rUwK#+F67%DGs3Z7x%-}k#;A)g_Hh3v{$537>llV6JXOKhO z>&L&Nj^H~mgB!4dA4Bp7)A7MXD z;%CWc@H6N~-XOgZb!8ZEko0%&07(OHGqf^$$Q`CMugAtVLni>2uR&bN7 z|5m*oIflHXyp#AvSs(u%{rClp;1p)?^H{-G7*{@oeua7rzlxLiC7eOI4(CU?-WEX{ zGx#d&Rqzee@?n;jqIV2=NqHyn82JnyK|dbH2tJJ&{0mmFiSnWNG>)NMH=0DbJ~V@J z9mtPzy(fZ?V+NnX3Z6vykSy0@#;}2tSjHKA4E-qAOCl)OMKZ`s*IU6wYWc7&*E7cO z1Wuw{pO`_p4&g_+-Vi~#u8=`qy50)PbprX&&P&ldhVp&?B-U^S<@_Yyferl;`Jj>wKsx1W!?<3>%A3Z7kVA<)bA_CkcZ@* zM5gAQK{ny_Ba3>woYC%Bcb9Xiuh!S)%nsxRoX)`Og0FM6C*F~KN9rA}_NLGOjk#}h zIfGk6Tf3a|-&^=zmoxeO)c3ob%~}5s`R`8ukGh&Cv}1%o+KaGx{@{)n7Olf8kvEg|o}Kc(!xtY`P-nIHTt{ zW9K-X&iRmYAw*a5VrS}NXZm8A^Lv~Ndz}0`Xs-69n6nmh)?+k_*EmbpILp^COz8$E z|9Y3JJ#f1-c)K%nJI&}}XY8;uewcLWx6aycF?pXebsrJ`U{>`$=i+^IMILfSAHun! zGf>3FL(Znuu_Mm-5ey%3M#RbyXH`r;<;*;VwdbAn=P~|*Gw}ijYR+H{i#2CS%>T(* z_!FjHa;9Gr>&|ptCRld{>&{S}$60vQS$vhKa!z~ooOU*OUVHq!b{==QJr!h#0ynTKT?rS^EKJyD`r|6_aOkL}Gr%Gk%+v&V4h zM0@Roc(T2A5-TsYS6^b3(5d$MQ|)cez^Qhc98ag(gHroXwbOKpb5b{6ZKug`_-cFe zRn}iT)4p_uP0e5DTDZ;?zRu-zhHrO8Zg;iu#JOlX#gNp^w2LN(X4>VKdMWLq$swF} z)zZ}Ew2P)wtVo?tyJ$MaLfXX(7f-kb_;!Ccjmt3`%Xf|JV`CoC(y+YI9bj>wgfhNtwX;<>JD|MP?;k2uG+EqF& zTlRMp{2gu1jK71XQ_T81*!6omntL&EZAbE2oV%_ga2?LaI~L-S$2*$h()As+>oN7K zj`XiEeXt{Q5QE8%P?GTqw{#S5p|1R{qxw5c-rbS98ymTfW)AcBbQJEv`n?^EdvWQ$ zj@o^=@IXiS0gU~=BmR5F2|m~ndJwCRbSyqXf3w`-e*&{lbmYWzr6W_pz*8N;r!ZLU z2vsq8yd!lS3(s~GpT+tM9gP<-eYzua8Y{1LRA0mD?#{*CojmF1bvDoIY;)Gm>!j%v z>ryYC*GbbUE=gTEual-zte)4&`g=PU_hM;pXIWghq%(X81~2IhT_VdRJF7|R#Z>1~ z3KREtChza$pelDRlsm&^nwh6Nvrl*Co~9Xop)>MAXY>V{{#xf;tus(#o#Km~r5EYS zzuZ}PxwH5(U8Pq#%dgP2^wX}|PrK?r?do!tFX*aV&_&n9UA2q5>KD_j?dhuT>1ymD z4e#xW?ColE&hPD_$(d_!*TP=uzoaX235%v~=t|$vmAQegNTMs6z`((-;6b9sZC%aV zy8LOn3b%I^Z)feLySr+4WBKl`%H51wyt|7gFW9@gN>b zB=2pk<^hcnjG&(y3%6v$u56|MKhJIY^5t#p)2}SSL`VkU3jXCrc(@y<)dAd zqbwSFzH9#Zu7&4mmY?scJl|D)o;fC8=t{kS@fW%hFA#-a=!(416_u{i3teUDs+{Gn zp5umJ!X3H7&5pa$UAfX-y^>})?vBLW(Kw?;u6IYT$I$ie zc`j`%wflCQ@O)Mwe6|tCbm&DXTclsbE4!Vcy0MN$SWg?&vMl z^S8JcZlTWK;x0&?xy7B8+JCEi?pEshE$+rGJjC3s?)ppHK4jy;R@XWb1k`kXuV95$bG`vBLNq6uho6Mec z=T5rwC+UivbjQWq^X~lfM6u`H@#o!%=jm!b@Akid#hSZRBTByPPQC0-zf3dmiaYp< zJM;=^_KZ7s2GeKU88Lpwoe-mE+%a+9?^*DB7|rkT@AmLI-0jKk_T+YZcpd)46Z;8W zrI4o_@>D`J3m1Ee7kf$d)Z1k;;BSDZO%f(Lz5#u;wg&B1D@0YoIl`M5EriSgs)(^;1wR494l9N zLM^ZIgs!6Bf0ZYA75z9TRX9Cg-N>JpMRSO&;{54pK)CdSVA<>Pb%`iRC*yl{;kUJ3W~@J=r_ys{Yoq z_*-mbJzJd1Z>@-9zGtl#Zv+|AIz2R)$&+4S6l9-2-u@E}9i z9`)28^)w!3(NxKkE}{Q1&)j2JDS4_=#~$;?K@!$x{;xbx*O5nU_7;mofN?C-e%|Uh&k$%B!C0s~A7!Nu0vaUp(`FLH}vb+-c08 z_7ud#8Bg*IM*Q7TzkDa;@2-i3-QC6AnE7dU_NN$}>kiFfZLYg6R({@H{W-?Z>Q0=6 zp+NV10JCRz=g!9D+1)8|{_O4rF&ylU1iN`}33XRP-HRc*V&`|q&&Rn7y8{>E!iC*o zF?nHkN-SU4T@mNzy94u>y{J2Pk+`=zx3`;f_TKLJ-frIi_IA_c$lu!?mO8Mvnbr<$^7x&RzxU4&T zS$E_zSvu04i!fRu(w&S@2P55~2y4$px@mGGM!Ex1H!ts|$&2FhZoe#FKG0n`K%G0# zoj*XHKG02*7uSLAjMRw(-86Y|9q3Mqsd#rf&U)1wyBBZ7r9<7dLzp|%ofl(=y5nLg z)m=_u#VKmnr%V8kb9TaPKch~Qh`kwCKJvjGdci>4} zJkq^%1dB(yOJd>4?&6c|g7VSs%F*uXQJTe9yGyTjmtSR;*;C!QQ}Sp|b<^b0oa)Y; zVv(@FC*tpk`g{0beRfas?4H!wJ$xRD^wc6f9CZ783j3*(`+HLRd)l0_{XH~!CinNm zr4H}!p~;J5e@|pTLlm#-DP7f5zKUk@*FC9U_oRPKb3WO#kn9O3X{M4r>10nP$=HFL zdV)7$?WUf(7`eG8dNVHF+*1?tH}@27W|jD%p2VS^u1u~co9oHtWWa}d z(hv1y9-^5n_N0nE=_1X@@t)}Mp4f4wR$J<+FVR(fv1jqco~0KVCiPNJ`X#y&7xyMF z?oD0X%ei4sZ+uU0VoxtebGSDZrYm%~cm8ni!eN@xJ9=Yx^v3U?S$Mp+_;_#Wahj=e zZ@S!@DYH)MSa13mCXV$c#qv^bWr;FLVjb#5H}%Yx+{x^zm|v_XXp0rLXJDT-TSqj%Mn{zVwZKnHw3gd2^rt5Y}$) ztKW>VLw#|n!-x7JV&Ja6;9abeytglPZ(sUex~fO|7LVXuwJ%V`#?yVxr!iCQ%SxTB z_NByHwXZH#t9^@N{8(S&7)FluMa9I4zT^pvp6H8-ODFnjV&z0%RV+T&S9%U}&-LZS z&{E(063#941;ob5zUE0>I@wnflh601p2yhpeQ_~d>x;b1T`t*>Ow*ffdUH*h#Y4+VhnAHOE#ufoEi0y$l~T)i2-#(&EM2vGm(}lG*0`5uwy-Q$ zSe7r)te2KGO3Ruh7EC|7Ec2+Ok1fkRwk-b`&G^w}iKEMsM`<>WE^8iL=6{+6Q?+I3 z8eO$NEvx@&S>sPMi!UuJy|k?SlB`o-mZ&dF)@jb4+rMybfB4*fzL!3?f9c%*nlv-# z^=HrP&z(oJd0xLi)IS%ZSvbGHcz%EB{C?gqF6a+kKv(|i{=(J$#j9y1?&we6(Vx15 zW--%W%Ji2rH2wGY&)wf2xSwXa*qJOBp_lf?@6aCpI zXqJxjmyh&Uj`Z^xe)m9m_W+j!b`Q|xlEChPgw+1s12p-hvwL7p>Y{&urd-h)DEX;l z{sEetef$G)shh9$)8x$kTEAcF!fX9BdEa=gzxY}|ml$5_r^#D6%Sqih(@&G{jnDKq z&rs*j^wZ?Kx-0=;CNmb$cyF3KqZ3t$Us5NLZ=o zlpY)?KS(q2@Idn6fz-n^Go^uSX&_gknS5*@_1HlAF`B7Y2hy(&WL~A2YYya_1BE8d z((b|X?!n6LLC#Y@84UhpF!U3eiJuH6e=?YoX7Xo)shTW_>CXq#KgYp=`njEgL4K`n6 zsM>3TGs|UN~oY@tozHP_9|txMq3t8kVl!ynOLy)-K(=oF*@}o0pew zUe2C5ygYOm=MFCqh>^p~qvFEh<>A9D7tJk??q)sxFe7(W~gn#)fjSp?r+4!Zkz1YjEzmp}=*RxMwJN4~sPK8S>vdGEp8M@u7y)xf4VA6GMD#Ix$3(k4-0r zGEyf_4AJC6;EAE6)X@_|G}((MhGJ4LoEW0XUOX`rKEZg|GefyE7}-4>-95}BI%_z5 z)^OykVNUFU;dB7w7YrvZ80HAPaJX^dFxOl!9Hz+*zHqoEhUSOo=jjj357XrBeSSD7 z#^;9<(jT24rpXlMhht)HemF1vnfYOwTtk>2&WhFf;YH~$&kxh&NSz<9i2jR)=PshZ zF+WU`CwP9iDgEJ#h9lBHf6*{a4$q5*7cOGHwT0pO0_H9m&R;@*Bs?4qQ`h$mH}>Ju zzTw(F9%}Bg;rwO8h0AEht{9GAF`T$U(wl~BH(~Xr;YBf*8qTL!Wd1k93%?l-|AuDa zH^ar>440%?$qrYu!;4v(i@D*Y+;A;NGjPvv@Sfq&Jv3wY49D*oPDrzQ&+y_s!%Nci z|9*Jx_rrnT%XS_dUVISCM~5p%F?)14C(a!k4jjXJZMadx_%BBizZ~HS+B*{7I}+JT zGk(cP;*yc%B_q6uE*%M7in+^1@|R)b@{#7{SlmBS+Rvg((UDqoq#mU!a@9!mDon&i zk};x4Y$O^RiN!|T&ipkag=>fwuN_&smMC!DNbtIm&~3rX%pF*f7i(9ns9(WQ{^W|eqDN8`_q zCZxIa!f5S<(fSMgyxZ|6`C(}r_ny6rg0HovZhT7X51V@9Ra$?=)Vm(l`dg-+8fFl_ zerW3A`?TI|>e+)@hfH1OkJ89j)YQS-wf?oK6L)Hz`D@J|5s|NlOdaEoCdk(@Qzr+V zt-5LIjokDnUt{t^U>5D=<^%b9kEzEma<%GDnmV(pqg8+Vuk|~${)wqw@6`HoQ&%@= z{oB9hU(ot#Q#<}q>(@-(H1+G>qVsX_?+MA*`%OJ|Kk_Sb3sq^Vc)ckkuvc~eK$YVCNd z&VT#6wO(oJS^i$Re7*CpIe#x*zBZUT&fhPWuWy)o=3`pR-+PefNB*9;e0|^4@^{7M zYnQ1jrvCrboex~pWxnr!zZuXOK*T~NGa1WTz&`t%X~bZn=BfT`G5@uub>$2X-~@=leY0-|(9U zus!GAb6)5EUd%l6e*S)+|9^iETbN7dOY@&FpJINT`84wZVib*-1=9ZW%ns&%W=>}A zWOg#Y%AC*q26GYfTg+9=Czu1wzh!P_{sVIh^GD2W%stGV%%3qIWBx01H}lubXPD11 zYYRt+^wa6E1I3?t1ha!Vk~x_ z8O)u`bD57Z&u8vtzK;0}b1t)%E#tqOIfnU0W(V^Rn3I`{n4QcX=6vS0%tg$8<|^h| z<^b~s=4R%*m|K|dWo~0`VD4nTkNFt$cIIy8pE93eru#xDzqLg&{*N-pFh9xcV19}@ znYoSG$^0C1KJzb`ix9K-w-vxE8X%*o8+P!Q73$sA6HguwaC5zIx*qnWFiW0?cYmoYapPhxIi zzKXexIf1#8c{=kk=2Yfx=GnyP+RiY~VeVtjV%BnGdMskLF)w9~Va{icW4?je!F&sI z0<()bnYolXgW1dMWUge+VXk4$XRc>n$-I%di1{AoGUormT*chPT+h6XIl%lA<_6}6 zn46hfn0GQi!Q8^Umw6BKFPPhy4>GqicQAJ{zsP)q`4!?YoDpR{%6x+PH_RuQ|G@l5 z=8u^_VLrngvsmVLKl6NME6)8yu)69ul=1-VEW&R8E8Rmau{)+h= zGu?MY>2KX9<*}qlj$pPik7kYr)6_kVIgWXn!Z`|;Dcr1Zr^0;-JNHZZjPQySZc(^X zVcXN8?h_O)Q@BClHieHVd`97zUxbF|RJdN@oeCdQ*w&`_r*M(N%?fuad`97z1EKyW zE1a)zmBP&mw<&x~;WG-yJfnoKaK6G-3O6gq|!akkApz^$PD)xLx6s3fq1e>R+lJQOxJO|}XQ+Sq3fC*VQ{i@nPb#b(3iaQi@Jfa26>e9!Tj98uL;cTJxL)Bs3ZGOs z=9N(Yaug0I+@f%|!nVVTe+t(tyi?(Jg|$~h{Yy}|OyQjhw<~;7;XZ}qUJDJ+sc@0P z0fpNY?p9d)RjB_73KuE7Q{hg9yA{@sg!=DPxL)CQh0iD)^LnU%ISL09ZddrE!ZB|s z{wZ9haErp73il{%>k9QhLE#*Q0}8h&d`#h(qoMv6DZEqRc7@L$sR5<3% zQ2S1W>lJQM_>97FZz=vMT&8fl!Y37uITq?)hQccq4k+BNu!9);uH4GphM;Rc1<6h5Y~_Fkxe846b^yhq_93ZGFp;bf@)D-~`~ zxLx5Mg>AnL^)Er;9EHmiZcuoS!Y37u`CVvu$qJV#+^le$!p9W0{cEWI2@2OMyi?(J zg-&ZiQ{#q5dT+T%>S=!tDxoD{T89)c*{Hs}$a;aHqoE3dejH>c3Or zdWG8*?ortBQK)}83YRI|pm4jw-3rH?Qv6rAOyOpQI~DF$IPOoO{^u(kP>6e}uW(aL@cBX52R* z*2f+)>@y!=ww;yczhcf|##W9t8t37rHH>WVqD3BVsi&b#T_wWPHc;*EB6DWG7F_+#WP@Bgbdza+p%nRp8zK!{4 zhvaJJJre1E+lugx9i@~P|7%om`A zyo~uE^GfCu%xjpxa7+93%zH{DJGMFsF)$=V#24#NCv_|G@X9&Wmi`xl!`3 zm?z#R!#hEY_M@5Gi{G+&5#mkHr_3?$O8Z|i=e{QycS?%zijGUh9k7DG_>JW0%%?`l z@|MB8^DSvUpSk-T$xE3X(bE1+%)8nDBIa0TKXdyr>HbH|rMo2WWIp_+JNQgR=2A=?j!Hr1ydmiJQTrgPH%MCKQC8DBc) zP4?3wBxf;4jg-9HVD|4e=84SZ%=v%E4?OoW`#3y`Ci#CWn?KE5)hg}3$Xv_$_bcX% zm!vr*Gr7-wSn@~Aj<+SBWqyH~qDA)WIe$kp_x()TpU8apr;<|*^X-xsGoRck`6lKb z&My!1Ldr-y8<^|=EKu9d-1H~OZOrY=Z!n*E4?^OhVKT`Z#{Gwmxk98<|hHN#4U;cAw;zm^U-O!+h`(nLdAH zu8o!aSLPQ^NcSUbGCsEFBwx;)F;?22&OC+Nn+4404oLgAFvmS3xq`W{LZ;8{hB=Q9 znwgJvO8=i=c03~adFHlS>HZM&9)ADfcg&}!OZ)xI2d|Pm0pkeDpTqnvux=Q7V{J{Tp#FJ*4y_UKOL9n23h zpXUDdG3JIn(*3i{QQW@1%AEV8G(W*y^mEC*%-W-p&oQsuEjcP$%75oR$=5J{(IR;k za~Zq8j`=8uzmoaXUTNRY{C=iv|F$p(ek8I-dx*KTQF1HuW?arn&o7ye{Y>&(%x9jG z{AcE(y^{NxckhrKF`COWRC*>E{5{Dj%u^zyyz>n6-%ELOnQ`BmaIlIPKPTj)A;(kA zyomWe=3M5-m`^bO3o*Qop$q)+{EC_WX)8VN8C)m_NT-+^?w5R)x$}C-wixN(8T``; zdg7V8e<3-8`54<@!c6~!f}UH6(T3;q_-s9!S51}X&CGqcbeo>1nbVF-^Ea5M-6hRG zH5iwu(qkPX(`&~vnO>JO$8vh46C>)K9_fAsG2|&?dHl={<_30uut56P${fx9y-W=M z=CFVN%I@pg{g=!c%n`V3nDX-g`*#KN81^rP`6q0i!@Ql@LyYihzn1w|&3tO4jL*Hq zh))a8uYbzi&Af*gR)2lHjL!?~K7dPQ>3M_sR$Nj`&&SNU^p6_w^fO1{Qeb*6!6nEf z&ly}!OV1Qy_Rc^>m)%r`SfGuJS`!Q9Mz zg7a%HvxCF`7v}Cf8UB0Boy=#MHMSp#c8TPREt2-HW+;fjK|CqTG|74n;KIT~VKWdzm zuk$f!e=_sRaWa2qGM}M|I-cdsMNyL1Fgy21_jfW+d|dK2=C~`Q{l}S)Tr2r`=3_Lm z$J52^`<~>FnCq8H{))M8mgERricRUeaHQlbnA>O}0Z%G1@~4UOE61>pf2KiC5py^5 z?aYVErFj$cnJURG%yD6opJnc$i7}qT%%}S$zsKB!OaAHkl)30xX`kV*cDxI~|x zNyM=F9Lqa{%@er1%w?{+PKLjnISrT8(^JB{vq18C=F|5{-eNHOw}*MoMj1ZcuTS#C z-7Doi#hj1Jtmz5EW!=J@+kdhI?f!+(i6?fa6CGw)n0<>_U1^hk3nE)ysD4s-mjWd4Txo9`3D|2?>L zo}NPHref(|CEH)k>CwP^n%zIb_WRKc{r{NxVO;7?&jn&QeV5zM z%O^^CiY}AxlbNe-miBX*9ZMzqm`~#JczW(*KEn3*F;8Us$C=A~Qr^#)+pm#43YVo* zdf2>@6PaTYB|DjulO*R8k4p;WY~T6|PhGPKEDPc#Fc@72c)rV+#LV z;inaTUf~xNeof)G6n;T!p|#wMB#r` zxL4u7D@^}PLJyW+{4Xbk$0&T6!sOKDD)IPgUGBPCe~G`k+F)N*iRNzjDymX*{cBR8U0LgOmH2%=cU6r?lU|j2O8liB*X`cgGM5Lw2>+#KwQG&1)>Y&E zVW{0|m$%Z3K!i!A?Y>gsBDg~v!B)~kVM9zW8v zw6;uhaq3pp`D(~vsi)FkUE%h5YdjFFvXr#^w^vqp>s_mTemCSc&`a6qS>|z9!j7ke zJaQF#Yh6D7nkuu#fT_2nbal`~CNaCKlb%UW>Z(fJwa8FuhO9UJL_! z;6a7LUqxwEEi!80H`1}DR@86kv5Y8-byQSHr>?r%Q;8^uWQE4+Qh${P8A?9~exd3} zEfiD3xXj~51%W+sYx1(fQ{k$qt@gMpTqXFXasx}`43YBrsBR$+h8Aj)$pYN^t2Ydo z)>R`xVYR9RetJB}c?Qa`0r1zlB~`m`AFxLdv?pM|o*_E~EH$bTydFSAf$F3PL+F~A zByktB+%=wR6w^v+vj(MstFIAP;e*geYw4**`68z>Hs=68!ubNta1t$rb;#!eSgAE4yjG>&#hRJLqYvm9g8U{mqSV6tk zK!hNN%q&XiAPf|T0j)~3?dwH34eBBAVCgn%2BRpwu0{~34SrFmP4-B@%3@cIyQ0cR zt-MJ9a~~L@ZAu3jPj<#_6!!+g32TMOZKO?z+(FHt+=fo5+=i}_u!gotwAHIcF-2U- z?s`u(wQ5wzyp?NM;5F!~>wM@1MeJFV+7nlmyP8HBA`adGpDOBnwO(#iLb7bIK}hxu zHdeB2NDINF7|Jv>S%$KqB+*b-Ovz<7mZ{0nA8ase)QnsR$=Si~&Gls{)8V6L1aOh4 z8CHggS{0go6o)F=XP|JH1z^Lv%At*G&`F`kqR|v}^B2j&K{hWU@F2S;$yp$BO+zjo zn2AzpGD7|39@VJ8p@yymekf&d#J~Ow#SX}t&Fir-<(D!ZL<{B9w`U<1LPEqPlYd`+UBM+ z#3Zx~h8R(9Ajv~gb&v&9=M!RP5G$3keE!}qtMkYanjwSGFvfp!><+IhYrHhBL}SgPS~(@7 zsfy9+OPv}Nv=YpE#Ke;(QpO}lYLxh?M?lTTJPJ{envyUJs}$2BLmNC`vl>Im^%(d2 z>xwZzMbCqAZg3v89%FY(`)ZF62Ij8SZq}-+#GKdd+aTtNHC|u2D=RfGcf}$NleQqZ z7Ukx%#)A1SALRvx*=sx)sta48ny!>&R|VRL!A3KO)C{$scb#D=?>bk3M+_8&PYcB~ zoDH*i3M5RfL;gzBYS#)e7Y}Mndm-96`L6YDjAAh^#fYsIgHiT#F=is{jY)@nV4d9g z1qJAsCFm=t)zj22Xh`zDVNcp%Ry!#Zik5q zGH`*vrqEsNTC{kjYk7*1QMrZrD=<{|P=%uSFHcD`#4pTO#Wx28Q!#X(zqoLPYk4}w z+sI+~Db0)o8Dvo5EiFZ0?)7V21q+ohspa=pmU`+%dYXi(AvrOI#*lrW^if#r*U8{W z1lRJ}CMPf%Qj=OqlTgxUlGbpGE0E_dDTq4{(TYF@S9>oyyr#Su#ZqPPghr5+!(L&iGS zfPoxNm>px$!&6=5_lcz(ZW0CwgNk14^$pZ25eRjzC77Q|-&X|XU9lWti|_}`T(?)d zt0i!p_Z@_!(XtS^KgtQ{Hw zwri{}3K3Y(EENxN2ExGLrW8eXfysZVg$_WmB?nfbOIA&&J1y~hR@a!^h;Gc(_!HN- z7BA#TODy$>p;w5WS%=1r)XLKQj4cT*8MOf|jN@n_lZrF)0MdxQC+Na3uEQ$)fb5XR zQ!VOjjlWt1gZTrh(VF4ycq?f#Om>2PhxjpIF2yOo%ugEuHD&H9j30QMY6@KDeb9hv*dSA?z5Y7%4KymH9@&)n(tW6nVT~{5bdV!- zgQ!x2v{6h$G^;&wbHyyRT=;fTM{872UJRFdL)ew2cAyAxDpRjpjJ=w27mwRGRRWd2J%G82@;oJ2wSp}6 zeo{FSimuBjG6VW(p-M0SE^r0MzXN7eT?ctoRqb6*(a97DY@Y*ZR@K4`(Q=^zxKoHppm8 zZL=_S*o|6;5kr}m*1CldwHweL%WWJnI5358Ho~?b4INCTb(LQ1EmzDOLN9Fyz4RgU zW(}d2Vb;UWbrrhWp@*1=n7fqvQe-5r)o_Z@hE*+1u8j3pqg&BjwX4xP(GIB5Z`Jx~ zEv9xuuup;=LyK0MXkAQm@%aK|Q^=~0p*?6_$1n(4*+F0JrTu73{x*o^J1ljqc4LR2 zpsv!Bi+y<7nRB_Y0ak)KUQ&ixnIIbAF<}Zv+y7jphyz+^gCU&~%mz9jP`7$D z^sQUj4;fg zO-b{b1g$Y($X9~2LNc1SLTQ%8TILNKj%~>HVhQ!A#t8#jKd&jnV4WQgGBj^intkRT zOhnAQygt~DYxvMH95?$P5;)9)g1Jl^-E!~D9OS_IcThK2T;+iVGyvG4U+tmuDkwn4 z2@O$dr4b#_NfqG*S3r$p28Q^hs642|*fKzGT;?uySBUn9dmT6CJ@Q=9khYAX!!31C z8rn=1lVj4MnIqLJI!;3yKc>?L)HGLm>Zv7>dmU(k%8k=9RC!9pzJc@u9u4+^8#xLm zctS%oZ6X2CP6=Ov5VS)k!P6N8vL*E;C#PumN~N!v^p!?m>GU;=zGl-`27P7X3ymhe z$OT5U_#zir!NnK3K)Z-9a*;wVQpiOrxkx1!spKM+T%?kVRC19@E>g(_)`jpzE@qO8 zndAbCDEJ~5Gs(qFaxs%!%p?~x$;C`^kwz}k$VD2tNFx_%+m>a*;+Z(#SEt4vT%?nWbaIhSF4DCKt2G#cXmhn_SE$7qiL5Y;rN1T+AjHxZNFJ+xyT?F z8RR09Tx61qOmdM)E;7kQCb`HY7n$TDlU!uNMM^SUq)?uxP@bnyo~KZrr%;}!P@XR- zT%0!31#9#pjepEe9{2&rFv^(4I`|=VQZiFnD>XIU_?0%>_%$mf_{;DVVr! zBh1vypf8yj>~>~~p+~d81o<*+#AsBh;>6W|B4Q}8uAk}ncN!+(N?W7W;Co*;;8` z9W9ujDwBSQy`NOMLLyACi^lO0QY_5QEzEK)TbySE7@Wukg}e!?^u~&OP*X@AT<;g! zLhKqu@%vdpuLi(E{#FYy2=?CiKj|! zl!FB*F|K^<#oXXpm{o|aNDqaYPCM`PgBE&&r?fHQ%1cAv!%<1Wut1*uuEk*=?9J9> zqJzb>4~;fN#%?TnXhu4bJV10%mk5W|#Q9s#`ZRQ#0u8UAk(}%j9uC+_#UR1tNC+@s zN`aea88cR(4AY)N)`G(83y{Xa6Bb6EpjlsUBv4LP!7^7?VWBLGVn;D6Zz1Vq=iQK1 znC-f8Sd$yr2w-x#3LcZ&E<72h+(cbfQ47vHnQw{VMr8rc_aktg_#u^N2~w-~L_Z{Zf>HTo^w zV#G$jgZwd@?%BAU^pXshcgOJ;bmQzT|PG`*$6I5WgIO$}vv zHx;OY>u=Iri1VVwx!JA-S-H9Mvlc8}A+(ldFEi^<#~#daEVObqV}YU8q(8JST7N17 zie0q-L+H+=cRQ|1xi&S!G4Q0!nvIcHT1MJTha){X1qP|fWQt+dth6+!DYG)5;36~7($P+8D)BpN=Hge04$r_sL& z)F>%?@ct`3Gw?C^n9#ZS*M$Z8+h1I7Z9RWSSnGMKzU|+v`rhuVv~3?)Ep#)s>PYH>XIa8didmjIOYl3d;+H-GwpSC_wAp9Sx_3Qi_R~$9lbZ0-V8fs32 z+VgY0b+DeLmE?c4M0@+g5^bCG!;mq%72yWuqqu){lLc~{<8Rw*_(@^)jMnDz zq2l-j@|N;O4}<)iwqFwS?>fY*;kM4q9OUy3i<7QGY@V!X+YGmh&Xq1{*pRmd@M4(MELA4$t%Nf_9I@+^ED^pDa#4P(fDnIf5B=&zJ(*-Mxfk| zY(4*qzO4u4R{H7ecZQKX`u`vx2rGag)y(z0NLJxFoy({9O z$T80Ta^2olet!OgS$brz7iEV0!fV2@#rU0Qk7%@y(fTh~wf>jxy`mley8NI`ySv~K zi(}o6XBs9@7*sAFe;jp#%L(ocJUA9V*r1YZ1pB-PsWzuC06O zn+t_@xLY#H+24zDeHyY>{K(nYvcda;b3^(I&yCQwHHB+u-Efx}u5H8ppS_3R=Hm+& z#{UNYM)Ld}*CGEFwSILI>ZH{o>m-*Aioa3jD1L6pW`h~kL0LCZ=Jd|F-PXX|3k$SN z*lE^KW+-kJQ~9z%&vy51eRvDMaS!55ei`Mgg<06S!r7mtBOmp7?^4)?8I`*aIGv0# zsMa@a7@5=lKa`ouz;N*~(ruuA%68`ew|sdMK?=~I%9=G8}c_4R2yJYBHctwBvZ)+^AeJ(4?cNoe!`nfyMR-y0t5^e7n+*Wm8 zMg1)It5-QQadll<8R{sN+4UA%<9p+r{lATHcAVUfIyX{F(JfkGPYJbY<3t;8TR2=U8CJQpIq3tIoS27MRWW9ok>9jQJUGEiCz zX7@qnI%W=&{HG7K7nH_Ec!vJP(wOW!?ApOTYdF$6Z0}cA>t0IthA6b-n%-s8?Y-j< zJ+kX&{GK;bI~%EMg(B<}+3$R4y=*U~U%Yl%@1YS|;e`>}+1@ayw`phZK|9+I`M=(z zWnvr>+cRI=HsP~7w|8472pMsm&fXkr)-zvUrMIF_L>qn?(l&1Ihe%_ReO~$O3>p)C zg7H(luC42VUy~0s>vG+ z7pC@?%#AXNFu%25CqK_ywQbUkQKsdX&z7ZavuRrY`8y8np|bV2HUEtArlZ`2j^DoG zx}~)^TkX2mHP5!C_jROOE$Y=+Ew-!uoB0pgt>YS#&fj%>?Fj8Tn;zR0aX#xo7s^Cp z%GO;G+PUp6dqb~H>)W1rcf+pVVyu&J;jZJTo6kAEzUw%}>1(75<^A*M#}0jU*KxG< zbPM1PY6priM#I%fvEwOyBjOtSA}(trJG0o%OUNf&0a$3%xet*?eZ`zU@vwkeM%3b?IFL6bfn)-$Vl!mE4_s5ne*!3P%m=s)E{zV?7i0J z>`&Aq8k2OrYbyH7O-PSI#NQYvi1Mk&HkM&*DCNsSy?xop}xj0+20VcI&~ zsukKD&elX-Z$vtY@h$G-E~NI>7KX8}N#6qfNYdX;`DJf}n=Zr6<4C6n$Yq0EG)CS6 zrZQl}1!@7s$xv;GhlcSH>0Nl}GR%}5n&ybPRa+RgQqM`|Svu|tdT5Mp*QzwFDlDMu zC~bHyT+pKz+B$XZR@)w3E3Id}80}%0KdeW=WRE^g*t=ajh1u6BYgCh6YYv-s#-_ax z<~U)~dctDy`&<}ia67}Jj@Y!r;nPmrv@_w3V>a#K5wZB)HUfr6M?@XAX(va-VAeJw z>Xc3UVgyRio{`gfY}$#Dj-xg$V2j1?9X42Qvqg0x09z@^_)wNUDpl)=@dVy zA4L<;xUe*BBI1d22U>Npw!mHaomvN-$8d{icG891U5EFgx5VVOaC`VUE&0ta+GpkLG;n=iAIr zz}dz8Z-ECFGcQHtu(UF)e1UH<&q4SXOCJ<{dN>*q%-<8G|HGQ2uF*5BIp^=N=~oEH z2x3_G0rLGKOL1r)FKW*64GO;&uBK|*bRSd{=;IozY$#)bg$#;;|7O2a>cS6mB`+BLas$%n7p^}^np^`sw(%grBmh7*3A1e9R zh7=+H_ds0&^q3(d127jBSx{9u!%>p+_b=795SYVzWfQlu~+&iT@w-)Mk&@Y5a z>EVPr4(4;DIyV{Wa_A>O#Z|_+Q=~dK1}eon3@XW+k4YKHl>?RJn!}t1mE?|rioBUl z|AvL+=z)s4O)mZ0A*gfd-)~(9efqa^WdAVK*-&4AiZRLbHmKx&2h?k!HbMO!#ZRiM zHbYH@z7OhEP%*yIz6WuqeC~uw@u`>Usxqh)AG%fz>RcLdlbrcbM?*hXs&f}YB{}9m&4xM+ zD#p^_YQ{XEHW1S-jKSgNZILM1uqx_gp?+C`G% zVW^ivpZBkJ<>IH*5> zYJ-Y8Kb@}2Tm|(s)LWq*M1zt9wGFDMA5a&AA7*tY)VbgWs5wyUp<+R1dKpxTe+F|h z)bE31pk4{})JSQ51S+LZCsazG7o@tX9V(^IW~doZ(;{T})1Xp%w_}h8GHsfI1~g+D95_4m2$ZP$xshZw*%sMx*W2a3x}N3{+g@7>#7ru7T==`W>i9Gi^Rp zmz;p9SffGJ$^KOAZ@ zRMK}sCAla(R8r>{S97R)mj--!{flB^3pyG+nfQqDyPG)^4RQyF3;S2R5Isg^<6Ws!p;@t@q z{ZDi^)HtYQI032yD*CZ#o8^dpRJU0=^~3l+sJG*LpWdd2S$9}=S{}B9S^F&KECK6C z%kHo}VIwUsgmvQkTv#C7W@!%Jf$xU!rtp!Lo%VzL0l-^*+hB~#OW0-l77GxilRaTh$1&40!m&-@tkwaia4uVCKGyoUK{=1t7cFh9-w zJo9VJzhtI+`{{WJ9E}RHhZ%JU_mc*+Gn{_t8wD@q^l~#FWo}|V%uMxVwBD&5M4Hp{ z1wO=7Ug;6zV*X7`;~KgTwVnXacj1osoJ6fkaHp_GS~RX9|4yAt$#e}faXaEk&(q-e@PHQJ_=^9hg!nfzV{b@{4-07Ye+%gOJGn=q82h;6@Ow1u z8~d;+U@N0M`5?Z8x^L1(_{9J#wBJRk4DkV zbnUU3A5geU;rA8(Lg5JHi`l;g3cD1pQuxOT|8Ip4EBqIQ!%$Al;YTTaslxRCbjs#&95p`+5-utbV=?J^Dd{L_@kV71B{|D^O#7hIES@hohLM#G7?37fjJ(Xbjhwn}t zKE4Z5v-8FJPUe97ycM-GU9Oar)MC62UBZW(7MJ9$ml+xFkE9G&6&% zPNb8Klg0>dh&7`WToCInT~zI_$amM4A>0)%Q>XX*XVbTwLfXOm<~wubAb^U%DdAwIYN53Sd3M>#xC4 z#~M#Iw1uoP%+xf5i8pd6w{f-y@Bh@`b$*<+_6!#``Ia(MmKYWx80>5rY=tQRBdJ%z znW_A&MoMS6Ty)tP`Fr@rO=f|6fwg@J6~nnRX!i;)|i@ijB z!h&vf1zu{Qx5ZpH$OBIWo|-y(=gBDavzOt8m_>ARR4u;eqoQPci*d}I%~MlRUZgRZ z<$J1Eh?`d^_cHSrER#mE5-sK2NOl=-9#dY?i7On%U7TB-lAWCjGn~rD%^-M5Z4F(o zOy?500I~a7bc)sI$*hB0+*;+S%|>n|yHdTSA;AO-!z{ey11G^!n396SooES!*VJMx z#R+>vXGLvFsyWn!0|hr_CSGI19iO;fi{x35Vs;d2W^y%jvopA;hZY)YbPzzn(iQ3E zGOU)yp)1Wy6!UB&IwE|f5D)DveYLNyrYx93|G2|hHMr%hdIQOerjwKL-|bvUv$PVV zvdl|aV$w_K9bz=c!914wToM%L!Hk~?LFg5cVs|Mv8$^pkFK&48P6j$fQOrW39CVm2 z-pb5gOYvDzn;EPnqWvpetQHiqCUiqfg3!J(54TLXO6u!zXVUtVl-Z*C)!?=*dS9Ae z3KsD!47EnJpa!>&``km=94houU%rs7@^)%u5S-gM?2QsD4uguDm8D6sXANEgETLPb z4a;brLN(}}-N7zJl98J=^|-eK@7Eb`IIqWXUh_M|!@gC_uM-Df8|GJnY1;>feC5k= z{PrB)iNpKL1F!tj7=Z5;TrW}%hnLrj_xWo1UgPy*s1tnkaXt0*=sR%y-PpS_4I&IJ zDFG2xZ}v*G22_l5hiQ<8YcotO1GiQw@P;o`pw@2j5M9JDVTc^fO-&)`<@<~>g~Uw| z`6x*>bQl|BwCffuFdg~zd6Ea|qzuwY9i)>!NN3g{o!NtQG6w0$6Yn^2PN&Z4ygHp$ zr?cvGQk~AJ(h*_7}F|b0myZLQ|h_9nF3daft z{4stFj&JDs^RjTcFqBXtGb9fG(3H}z<)bLAkJo?`lm^aLE6E&^;~f4RZh0P5**(JvhsC zhXv;qHM|d??R5pTbzYp)DT=_^YI&Y$$0np3rE8Hz+kgI!`EZkkvskZ)^FVaI{7am} z@>-nzYah#MjU1!BJrC!V_l^|jcW{OuXSr^!?X&A+x0d64W0@WsIdyW^u3X)j*{DY* zE!DNm_{rKj{A;$twJ?vw+1#~y#L}dz-`G_i4L`$So&|H9GZN-Fa~5K5hq)W(IQJ#Y zaYjGHd=$*@hB@LS%yC|_9R4R>-L=c5YwJF-Zkeza;Vd45Gk#ZSW9Xb-;(>+qP}3sm>k9|%j==U$E`0vic$}#^{pAIbj=CPU zO_akgFB~kpgw8~TZ7YM{5jcBQgmYkPpVV8Q!`Vl*JZdNpL+8Oj8UC-#LmTqYj`T~^ zW0%?|zrM@J&vLgmW-8KC&C{ni&z59qW7PcY;`~}N*<{9f*~@tqbfe}W%81BAl%xM{ zd1$lonR#rv*&*kZx(!8KypIqo>g>0eqaSE4!TT5J;;HS5rFUokwnoSKM+@ql6?G5q z?(n-bbl&xAu76Z_b0%urT$*-v+<|*`*=&IhyKZSrxkHQk-Do?gEg^rX4v@PR zyoW&L-$v#CO1-s=&OMvt==uAF^dk5r&$Pw~84R}+hFy;n^^n?}MEZ^T8Sl-=cpmRB zJi4|%V+W2S*dVJ-AGdV!lq0)Hb~+n-{*G*<-$JD00;K1BoU_al?+6uX@$U}b-VN=B z^3uqwDV$fLJ*NJE&M`(oCTiO>sA$WB?e#^>|0DI^=j_RF?GLVb*uxX?9((*&ox~NUBFu8jJWyOxNnuzv2 z@n&~l6#Ak@wCUwnADQ5~T3c6+x_@7|Gcy|b@FwcO{>g7ncna;kD_dLFh;nzI9cF0D zL(DvQ*976-HwtEG$IWIv$WzykU=A6!j&Wx8SZzylCLfs)2|vp=Iv;fCwyh%GsB5JD zzltaR<#w8E^Yo=g97mzOE1&#p5zj~?o@nFDaa?M|5$#)0AMvBQMe*AY*(p8HKZxP6N1{(P>{1*0UlE2qTpL5El$m)~%eq&Ix`#dJg3nQw-kki_ zgkS5UlICU0x>t$1HyU*>#0+JV>Ru(v=4jMCvl-RBc|VeMuafKD5tQFi@N*C99?I)h zl5-yNxaq)_2~8q@qeT8L(W4rvEF@ygL}^X$xtYuDzc+ny$7tIqjUGXJG+g?4DSgB^ zPhaYTd`9|2qux?oq%@*>E7Az{)|@_6Z$bW}fvp&aTQAiPB{qusM{O3yHI7j>6aV|%(3o13 zKUOJR4f$vIZyW2(#OA7;zfqbCj#qe6kTtin&v2`K;A{{6o_x3XO=+3nb!Hwx9in;2 z%P21qVmufqz&k6kXafq!O@#f9?T!P7=1e*8@|?3DkMwIzDV3I$j>@dvHos$cj6XRH zN6988=S|)nbM0iP3wGPCEr$Ml{4RlB3DnJS^JBPq6>fIJY%}zpfY}pJe+B!0hTd!V z{W0`DhU&UoJKJ)(R+xI=l{qsH9G+8fe@bP+Esn~Kd^A9~v6XYwX*em-yh z=7V`9o1e?uytys!iOubKuWf!d@8iw?l!r0nS;u&-F!{i%b5akyCek4WVO)wZYFQ>q z2eVu?2xmRZWrS_S<0iQ2V;R1N3?v`L<7Vh(LaqYnQ9Lw+A1c=~kgEf7{S)MBM>^?e zi!Pyb`W4dY$bW-$vYhQ6Md|c9(&>%=M(JcZi+AymPF+Z+qyG)k$$A!Z4W!er=cF8X zbIxB;uVU^`t&Bl=x)f!j7Uduv;>G|!EX z6YRi8Yd?^O)18xCXy+Yh!!ZtPOsv2dM33l78tcq(owu&j!U7X8E;)NQ=3dlx^toQZ zoJPmo2J1L?;C_Qwv~4*1jQ88+d-Cx|cwHF`#*C5u^=nes_2Z8Sq{1x#f#G3`vdvitOw0_(#aBw_6 zUtyh#+Pa3joDY`0Nb7J5An$z0orSsBVX>A3^Gk-(@8u`S45Z?I}ci0bYKqsUoD^U-k~Zd4gpI!Z>D$l zA@3?y-K=`F%m{iHkmrjolwBI1V9Zev3Hv^j>n3;3l4&>l+8ZX@mSD^x?h>Fe4%vMJ zeI}NbW68du7YX+m`wZ(=^t+J9zR|XV#?^}KsHM2;odQI;@x5+ z@4Ic47EsSPGZ?uzhpkIkUYejNR;zB@yn#dL-Q019E-R z1{p}tuE%Vfg?EyREVSMt-!*T6EJb)nwdWQ6nS_|;zb0(Td5G-W&tLc8chBcE-Z)a; z{bATI!dd{umBx?5y|YUGJO2~wjtC!XsCajNT`$T;AJQM|O8s9WKfDMV>jRA+Y~9pK z>DglmbWmF3-S9@NZrFYh`& z)w{O6T#rkg>P>3LdRSxGB$TDs5O>T6%HEA@r8-sk*9!*|p?a(Jjt7)=Xxo$pD0jLj zcjyobsckaqKh+zm8?ub)qKqA-G8bl)Fh8vJZRW{sYppYN9WURoCQg6P^8^An)SOThETgI;_#A@1EfN;h|ufhVHA- z-Ar_Uf~_{IqXG2`?~<>Zinas!^-eUx!W;r^XW$(l*8KM0<=k$^{0;4E>=vYF;)b$5 zw4r1EVvX2au8(e{ynYGoN;m4oCafV;Ak06G($-DG*yw)b$!L_5x4iz03m9AIr~~A` z*_|7DFMVTO=Rh66`y8<(3(cQNmMw6<7vV>WvR0l^euY-hHC9WfFlh{vh4u}yz4M{2 zr9TC?xPPXAWGx2&98BrGCDI97s)oIHUcOXI`}C8hf=_*WaTinU-iT4* z?eTVPgQlw|p4hjy~$ZC)TaIk`U*uFKhisT$LTu+L`JYTd4Ut!%4`?9g);HI@w8?&WS z??}X2NZB=7YXj=i7V0mk{kuhPZ9w|i4yAWBpl#5Pq&HfSm!giMEa^wn8_C>qR@Tu5 z;ci@G1NBMpCmwyQP|?2%6@9Bv(XXz>9YQFRVvX3`=a<9XaD6`Qv#EW)p+|i__MC=w z>xI7w+~=>wZ==r_zq!vBb|9Mr>8S4CQ8^updUMa|3+b|*3$2q$6?bl@b#;tIn(xM) zL|6V<^Pff?`waEe3jHvA!tr@#S=Rox?3eeADAw~&AHh)y+@jHD#ecKpoRI@5Wr<3CtfJ74v{dF%Pi!-hJjmVH4Wrk1*EYwkOt! z_LJHXtV12NS7mjGHU?!q0c>uIC?3>Km(f@fZArp~3uzYU8Euu>AM)Su>vi}=ejDMb z{^YPfC?~NkJWi!BG{{2XQTmcvM0!XQ*rWM`(4)5hVq;gbFZY^ddu+Jt{0H3)H%_H> zWo={pr6iX*e6ijf);HUjFWF--KEV1O%3a5N-M+LqTI--O9@?+MB9tp#vo|6>J80hu zd*dBm*h5`fYD4{s*JH){Tmr3&;y#_&aOXC1yqVB zXwSA3XSIJaTI+bESZ^=CW`UQ~P2sZdqCV?1+VIb;k$Z9GsQFFo9X)`t|L5){OWwNK z-~Q?3h$Z{ce!0gqkovEN0m>; zo@3KmXXX~nnQ44mj(XLEyrl6|1!Tq9fW{>-Tk7>??AIeBD<)|jv_9JiH?*d_0AYJ4 zXdUKw<(|7x_y+19$xm`ErMB7<*+}gG{N7f9IP6Cp?z_37eJ|obZ7{_FeF@US*@3;* za^!a*{oX?9fwnV%JJT%T+S?!4FuJwK~;)}_wOjPcIQ#M#cwgqhCFPafA3 z6RyQx;CQVgaVqq_BlKDmufp$mq2HfyIn?i1Tfg^_vwikecej7H+?jdjHO_u9UqTvQ zY|e#y0S?lb+@??LZ9&{={Hog~2Kz@EyXsLBF{T!Fx{N;3VDFW*KRvOl>`80urfbk& zzKA-Fw2D9UJu&V_S7>~Nt#dZ?xxS#Bh zt36(iS@!|*<8POUdFMNcer;P4&PF|FiD=wmiRi)_*;$-BC=_E*tF3o3!kmaQ_;=jf zMRntH{61kt-aqDS#TW~78=Ghoi%_3%KS3<+@!3vyMWIdWJ&HEShB&kLJuY=cGFb<=F*!ZyxEvKQY(bWSvmHBocAPyz(>aQ=!?r5jB=Wa;oyA%Dd5A(KZ(A$J@c?-4?*F(1Z!VLSC}l^6b`clD?jh(SuTw-j`BYY7;@p@Oi?4{A`RRDkza)M7i>%fq z|GVt?+AFG_O?h+fzSHe{6MtWS{L^^+hW@9QQ+h+jeqK(45 zcBrysM_EeL$EVs4#kW(N)q^&<>}9Rrfw)t7p>nd`_>FO44SrLf`U&@`Iyw;1k+ahrrWAi0lE9N)@)x{$#k?gT~ILmO&OSlGG@ZNxl%RBr{!bTsx7yEas` zFAd9|?Y#nfhx+(S<{^I`MV`HhH4K`sj&=qL_98ET4SQ{{^O8Qkx=DXvLZTki_!-8% z@tCt|s9SfVox~c$C8w=XNmG;c*2u#s%dyz&j>X#7#*Gj9ygso}fhVz6nt6X$xETiTFnK?&tWvvBB5A74gL!{@`N7XDQ;m1aecnb(HJZU!UICgm9;G z{G$>7YY}!E=2v4TIk(4K##fi?_apve8k_Xdjq_+ujQBS}u3pTylBVgcv_469m_U?%d<+&3F*kQ$BmXnf4;*XDjU z)IP5t+=})H_O-y4Ia*-r9J?KI;T~6vrw%5G-&#NBmznc)t$&_f>#)P@qUN}l_M+xv zzs3BrZ!yRHtQYlv^0$~@{VnE+-(o)fTg-89HadTT1=G4d|%+C%| zUfM??-;jUt$Um%$bQp7l0QwJe*_eqoq+u4yST;V}#J$F8&X|jj+o+5-T!OPHS7>8w z*po*%>ufmRv1J7Oz`lIKp@c?SNAO;WHHCse$0nTR3*7VSoT7-pTyxmAw1IFT=eq8Z zk4&ICZ;O*<(}Dda2lks#H|E;+FQIY4*+|sci0RJO-1Aw-*N%E)mlozcpM?FVB*=8P zUOXvD!?+XoEnAkqI(Pm_cb+xOmN&oo(Dn1rl~m5(>8_mL{z2ZAfxG8eT9=%M`E8SJ z#giOyMUyn=nn@8_{m-awZngHjlQa?Sy(}+!_but44EZf>OU`H6+>>TQ{s-4;{mnNz`{QvwvmE=xpCb*|p}cG>cJ?RV z74wjOaLIYgG0&uJd6+}$F8AX%kBkw+<-*F|A4u?C>Z$>$qZ!4X2wbMPx>F`W?EVme{d(z~i#git- zl}?&$E19GvxF;ET9$2lNH}X9XVIu!Ku1DT4LEc|L-Y+@uz=S2p(>IWxB*#lA_l+p` zdHUGiB~b4xaQ6REANACq5Z}LG%ybNKeiP@6Hf3t-{DNX zQ#)f$q$U{w|x#dbd1M( zF)w%ozq=6rGJRa{eNdYq(|(-kdI@vuQD7=7OR?u4v21GNvdP-Ey$JIkiEExduIo+s zgD{u>5q@EDsBr&e?QQb!Q{)2{;9@DP@)3QrTP;ytbdDM4f@m%DEY1b(`tEt0TjsRz zqD_ihme{C`&g$FpJFVj~jJar>mVkKESt4q4=uH17qqi*m9@22J^|G!x`sIy}V9%!! zX-DU?>1;Fgt)y3kGLmDx9P1pHbzO!&S+mlb&w!oGk$A@;QahWAzTXD3%MfQ9^45m% zjCTkU5T0lwUrA_;K;B-B_#|TgB@z38Q~69buU?~MFypo8`y$S-R5 zd!a5F71_8HXrPFHHT(JUl@*07(Nz!&_81RbeKb`+5J^pS}0mYp=_*p7pHfww~1|@ZIp)K=wBHLCTZ;QiBrt zCKtG09o#4N26nk`{fF+T_kaJ?Ka}%7{%6p?@Q?jp_$U5f_$T?l|3~`kUFV(rvr(es z^WIz~FbKle8-(vOm%vx-dPWX`U1M9g7MDXFJ#ql!jy!xb@{GE2o~NBx{^sSI@&7g7k%w*#9MQA?t73=UJ>)yy#?&+yQCsnGuhbi7iQ^rKquTUSkAsz+UrWs!9*l4ZSp zU0-jTqq;?oeS@<){yRDLw=33MQI6eqcR-Hab{}oKM2@Zbt)*7{E!=WJ_pbzt?~-Y6 zjB|D0#eB~i5ZKq~7rqdlHvwO5pYUVs=M$Z{>>(1^d>7yKWv{)8KYsF#27@=ajL)e7 zz_>uNi-O>j1rFrPdN}H(Lx>TEm4loA(v$Pd`WI6o!>bxM&6XfT`57lc8 zj$1ITOVZ$HjC$B7BDmO1+Hw8jG-aYr;r$)|#U4V=2_c{OKPY&w5u)HE@Xq-%dM&*%jRlmW`BzG<8tjsX1N{TiiQc~@vaD*i{U+~ zDl_;`>dJa{dUs8I=rUTDHsD>U(qtL%W!=Knmm zt{TGOi>0r<`&8cDbG`KGeEZM#TrX{PN2=F;2&@(*tA;oGdKV{=?3^2++JbXD1G zlE zs7%@#DpLW6;f#%I_yv4$J!|RC8Xl;t<#bPe#hO|G8_T~)&e`JglyiCTU zk8~OMMLBI7`W#|!Z{_=pz07Stx`2DWqYhhVppHWPVg>i&xB}%4hD6}&XHwVyC@Ri3 zfp#=!x*BS*b2hPlx`O;c6XO_qK9;NuI@$#NXT0k|{@&@&_UX2Ohgq~w+En~$PkuIK zX8h_F14p||mTiUSdR`a%UZ|fr(A~h;jjj}&tqPV6PhICV$_~(O$$xCg^~QMZ+@0cI z1Ae`?o?z@YM$RV+%o^mJFVD;ZP?1gIX}l_#B4~R z{PAI4Xro%6sJXsYE_F^-&f1~E)eZ#M2K-s_ERP`n%{WOBIG)_O*dFz1>#KYqBpeA^j!`XA1uXsu^7(oWbIufg7% zj}LCTSv{W^#k!Vzg6E{?6K5vze6k&hv?=rkfMP;!2FP0i=cUkpH;6OCIt{9_22KH1fL(bJfwrlBVL=XVKdj{c?ScMp(je(np@1>g%R36;&{yS6XJT=iFY;clCNk&li#n3c#^~ zY}XDcQ=`n9lmC|I{`1y_x^^|X!Q}X6&-%RbPq!{K8SlfBG`Lt*?U!@E;@@Uc5 zpsP-dFUVFqyg`|x02);=$F(D?)~4Rw~^nB%wnSaP+ck|DZYTZ%%l~}Q9BfSKLw@*H&Wjc z*N*0;>kpT|yY-CwH%(`1K0bA3@6z>otKZ$aFjQC3Z@hW6A77|z`d`Wqx1HX4X8K>6 z&$OKm)R*;_^1Rm57y2x9yMN<7T=VhPGtEoiJyZTJ`OM%V@R9bYA@qF-Z3(W;1+4!C z8v-!30jsR~U*@$o(`Tc9j`*ybev#LFV(UVy@$NKW8bLnWcr`!ezUT7F+qW(ZH@=OI zZ+><~p1Wh~!bs!&8Y6EMc~y$QWVG>a<~=G=V?3OsIpWWc$A(^Q%A-x&Ts!2uP%J*cPpSaLgA{)-wFDgX=A0 z06n@5dXs}MN_K7A@afQ@Ea=g#^E+;uHXr(A_+Yt)s@JZxe?sKyL1C`$H=y-@f`vE- zzvK<^6GEqra^TtiN9B|QAw$l7)L;Y&X3gvY~4DlsGn*;g14Gx>CM8|Bby>j-Z)N9la z4{*MIeA$HW4b)$L<@zPxMfE2J>Zh#B)*pYF`h)VL@PpNi$0J;=qXPBY;E$wj#yj%Q?$I}5;%P&=LiPrcu}@a{#{4Sn;1>!Ih1 zWZ%o|OS{rOnu~4x>`4p1P-bsGAc39XBLF;&71>R(P4BpLMa$8~u`W<6Y(*@HzhuKY!6Xww8Q406?U&s9?{i~hyJ*e z@!{s%GpuomMGtpr!95K|{-Oz8Pcg4+kw>d^i(hE0dk*xLI>i2E1y?-Ksy36w>A+4l zZ$d_GMNx5Ag~jH3vB=q#jh$2CCuKmxWSlP5?MhjfOTV1niZhK58GZw-AMhRMR-wx) zhjq!C`5)kMIyPIejR}mzzudelN%mBE=9^W%3;&JVfDv2P(*(9=z7<{PZ7^9ZzCxuRas$UO&C(+DP7mf2*|Hhf z_plCZr*C2tl(HR*AL&ZOFSUqvqQ}k&jdAb%?c{e~Cp23t72obZF?U3sFQV@j_7oL4 z*^fk>aO_fimvh#IZ@(~J zS9O_32)iQD3F0?t zvIae~LRE@CrK~+g^u^IfFR`@ZZnB-1)Xb8)T31#ke-K%N?fD%=lHB!80>` z6})4?;7aN@_jKS#dH-)dq#v@s(8AbNvLF9TbZpu9 zkmhJHEu-0=8R1oxk&6AMz>T_N)#9<|V*08>=vu`$q_Tp3i;w67R`uFvrkHK4LD!~( zZ~K^!g&KQfc<(etZ^K^QN!+*mleA^{Cy#B2(M`s;kMQ?-T!s5Knak=nN4x4qE-H*n zT2z=jje92d`?(XXI(I$yRopAH%Ico{{_YpAUs4#Ewxlrk4(@r}AL0HW_g`{c!^x=~Cxz9cNV9A5rPaS=v|ulf*cg z@#m^S-zl_0#>&RE?eNCK`@(jdDc<$g8Rza(XEMmA$XER4vxnPn{Qa5s=iWI}{QF=! z^?YTDb#6;mhqUMt{N7Y-W}G{I_ma`)GHFNhq&e|s%ba)z>zS-+W%yeZu%F-)@y}kG zaiom(aQ@>}c9m2R&slf*KE_^O>^YZ-|I>c-U#FQ{9q8TmJnlLdRTCQ@;B@&a{4g>Wl(bZJf=$i#j!6wu`#7ApF4XPFc^<5td3@&A?jr0<iJy?T zkaFI$#D)|d`^EHQSXUQw-fRlZ6bCu@J``Eq47;cF(a?3p5a zl1%t^h5_e3z`HMS?}wh1eMu(0GLCiH&i(>(BDSBP4P_uU6!U2OzK9WM@Ni>|H7m^v z9E2xc44*sUCRg_(tZ_GCV-N8m31NYKFW78q;pP0*z_ehL>K6D4Z&R+T@$f2#jXgvB zTZ9ZZ{n4T>XN2&b%82D@wygF|f3)CyS~mRIFv}WW%9hm|%lnnXLwOB5&J4jN=H1ti zX3?Kp>DM&+cMJWT%ATSrwe;K2;e0hfb$`)Mbw8aQ^aHs2a()1Vx7~^CTTZ`HM9#gD zeZ=tgAs+-UI>XgLAB1vz5USw)tFqzm*`KsJ*;HFR%GJFF{V2A!?sGQPT@H@bVl&uB z{Lta_y@+z1@MH$hgB<0d@4};v4)%Ms;V+l@1T7m zi`y*T22aHPjSj9dU@QD$_G0|x7JKS%gFl=He);h=Wv`&$3*2XrE@|`8@k@S@Kg!s@ zXret1;8w)*li1gaU$~_Nh3v8|((32f1F)3c!?WEmVMeZ)O zKPkSKuKkFnCCC3dTQ#I0%jsJ3Z<69z51yX2Bg2fo6P;(sXG;^kWL8o<`iUI{Hnn3& zKX1c?zvHV1oSz2X$KaVo9{56J#2~LEHqL>Msah|v78)-+{L{MXPKX)e?;5PS&qk?k zKmW8rZ-)fGKZ6_=vaNi<|1x&1e82R+V&>rMBBKZE8u$}c`wTuWm;P^|&QKZt0r23u z#WxAN(l5b*V#Yh2xEwjGEq3y?VUt_jXLXBX&t%^OXwcqxRXGvAn>Ibp*k5%(`q!(@ za>L&y&hWP>r|xHswg+PWNZZBUBz4#Dzr{4zx0*VOu-pCsxTO?b-{t066+P4?{IbS9 zWbc%8Gw){05Z`JYoF?yG=-pb`TV#gkp3UB|ZQ#SNvt13p{Ozr^0{UH zFlj>T^7+gWdx@!M%^|*Yj2@J4+mgRu%f7RgwiVbdRo9!cFRk_GjMW;Ead=)M_DtD- zJSa!xpf1{O=@*bEe9Q;onGJc_9P0~}Y394=1bx7HA~-HGnvoCrOOt$ziO@umyUgI9 z$Z5i-6!dSpxnRZ0$qzZH6FQXzosxP*9x-pKx=UnBkx!6AyG35{Q2rWyU<>=SeBzhH zIwW@E{*o_|deJ&Je1N@7@*Df(uyIKGe~{K=(hs!_*XEyFphK(J4>&sv+SLad))$%# zUEZTrif@1!x@>07wL-hZuX6w}b_3hu7iQL8AJM$gG6GpLqS-F(ngHJ_uoXFawr2M4 zV{F~a(0MZkA^m{pylb#MvksOH*;TcX_0yOacK%5>+5Oq@vtnBp9A>@rJ$zDC4#j4Y zg58MI3u4`rCHMq<8w?#T{}78S-`x((3stFmYq{Ost{U9Bu~wA&fUC?`!C~2RR?c{t z7b8Q{2S=IZIUTvpjSenM8|(|LWyEA=p33+PQ^TBMn|JHphOc%wGfCLVtxe7lFU?Y40_RRo&u}`knaCj)=)QyPvT^KLI_k8u}U5unj_! zxgRb9|G$3pR&Ze&IB^TOF%=w{!g`hof0QvF+%eWP!3UAiMaCWtjzlD~{w$u~C2}}N z85q9g#rTrve4Y7ZF*pj{c`afXdojrK65nY{=Ydz(Zmi>b#V zjTNNJm{(B8+F<&N!SqjAV?0^}{@%70iGgZkt&;VnU{m&4;j3({Q;vw1joDn%NBp_- z&8$wv<3Z5H)9mzpdC)fzKzIf{fl1; zbD$g9P~_}WTMW-o2FA)abwa?RelukI!RmNfLYf1I~rPNDFeqxgToQ8m})K5ZyBMwEn|VH?6sbQ zE(qLl@ID)SD&*Y?ti~!=_h)m|Yn}J2hUtsub+yg{f9OxnR9EfEYgP9g`jqP2w=vPX zce3Vvdvc=e_4fXJ@`;d%*u95GQD5t=uI_%&+#+IMw{syc=A7Qc z`n%M%p>!$h=|uQczTfefYr~(oTJ?dx)+*KAj2@%)ImR7&+4}F)OP*n7_PV0Km>H&S z-=p{QeR!wp{*d&!>4p!&&DbyB{$utsg!4X=bb0rYj=rWHnP8u!|3Y=QOZv;) z6M@DKfIE5wS&LIv>b}+-{HVgzq1NBSe{N>p%eSjl z_qJsA7ypqw^1eN)_VWcl`5m(M`ZQ!u*>kalaoMTD{H|%}447xNpDjI7fz5SjaZy(* zI3WB+OFFnqJPl%+$xfLe^x@^|J|fX{jI6D)pilHpa_|?bvAUwZ1xosv&mz!_-31I{!Z|t%oOK8 z&Ao`2GP6w8OCk!oTJp~B0#XK8U(!G#d)vPhHm z%YJzOkHL{gUELkj-^$vi&|BycuDX&%YkYsmI5v3|y3SRuu#&ej{yKRJ&s$u5O5V=+ z%jCCte%sZzFCIk%%h`9<{rJeq=feWVW6w-?W;2CN@(}H zx47yK6Z2@*(Xl04j;58oee}ALQ%A>@sP{(XCcQT@H}kzwxpUvUI#;1f)+1D%L(?j= zwOF4ggYzTUuk($xbvQIELA_oM?4X-@Be+Xn{F`Ugx^3`|*k1g1y1Glu+@~P-*=)X< zwn4tmC)wv_i(&tt%`fmtAofJ7z)p(_!Z6a`VZ6uq+ngD@Kg@g* zT+Fid^R+$58VWzzwjg*>qq0B%Maa7}>s zXa$~v)16w30Z)Ow{1*ev1V@{P2|S~$A^a@o-M~*^=@(eSL(c?;|Ig#6v=w-k4^pqg zD;Rj$3NA|DTY%kZV3%u)^er&iz{9BEyfz!S1x+?^GccdcL0pV9a4{ELOw;2G*d0S2 z5&VrA6u`yif#1f(a?%7Bi?}*MFl3Gw(~f{%QtJ5r4Ca2w+xWAv>tp^c$2ITjof(Jfsx&X*aJ1&oV~ z#hy#XqEKCaEDEMxJQl}TlWjZk^MCZ-t{!+Sfq#l+ps)Skg&tdhztukn__wCcGS&?z zc0fsEP0oieKP-8RfuBX-`NshK#a`;yZ7nWfFS>bj(1tDVuV42JZe58S#Tx2=8C)(S zt`aah4$VJ_4IqT~vW^L?jXb{~AAZR1@NX9O`A2|>@GPQpXiE*qHfF7Aqd7%&x885) z0Md?Q-|^py?3bb%PF~A6EJ8*_o)rF>eZ(7uCwKCm&inMB4m8D5?lU`fZ7k8uwodFd zCvI|eM~*=M@?e11--QlZXszWz_{P!TF8u!q^bpSAGyXLB*3k<6s?|S+XUEsIYf`?C z?%AfsH)}CD?Xzfe(mwVJqxaCve)BHkmco}eW6L#DkL0cCr>@68Ay(uGk#(dzEA_Qw z6AH-{5Byut>!CJzS)ZhDR{D}dpQL|T^sktA;d!&s9Z0_{=&^gZy8wUP%fTe1izosn zS^Q^3CvNnKK8m~}vYN;_iQGSB{5i|bh~p(~cjJRD{q!6CY%%)D{HC94Hk!Y#S!3or zvru2L-FF+XK~6Non>e^E$d`e5$9E&6{S;a4C&+9+Ms~XkJ;aY{k>v~>#OYs5tBtG= zb9AzoUdA>Ai(S~Yf5}{IrT&zW%^Op6vyJuB)4Yp)GvgdR^`8Y@ zhE5=bJtV|w6WtbLh#8hor3c`!%hEBNCa`pcLc_MoQ@A0P5xF`xHeDP!El-X-yB zoC-OPaShm&0(yj22opvR|2U%ze5hO8ce{K^KF}9EpA+6@AJR$eE+jBUL!w+34VkMs^$n&L!v({tWQ) z`}8LPJ!%gAE{tiZje898TrzUt>|v@CTS>l&etrbbtwQ!&_4%?RBbUtW`WPOl+I>&s zCg@7FQad)eM>KAUR+Vpu1?+qx`<1C^ztHzoa9CvVN8vd)b7tB|i)+JF)u-iN{8~jG zJw@3cQ}(IHmOVLc$-P}av+BNwtP#G4ttQr^LH^%fmw$F8@D{t<7w8eH`?~7hK;GIN z>8kr}qoybSxI#0?ie0`c>BPYv|_%o^)^ko_b-Py<^Eup=zzDx9Voy$gQsrZtE%lGU=8H@nvrHQh1#Hu)cibCQ8z<=lTE_NO zw~s&%yh06V>G{VG{U7#&x1J2#SxaK*!^y>^T~o~AzQ1Ab|Cqj=GWBtuVhmjF`x^_~ zS2qIhL$v>P=yvC5@GW5Xj`U{$cMI@-B1ye2ZI$+*7|aJBN^`jX931$})VD>(dIe+s zBg*Od$B)j}UqgI18TU-aaRlT2xH-bN#T@PX*c3$@bnKsfoe#pBdEE~-R=dYFp5lMn za(hp(9f9$WG;E9?Gadp?x* z_n;or5(`XzfQ&o={q~p0yA$<+IbF867Li|9k*`Wc`V;LczkBgLT{qgoeK*1*tGY#@JO*uAs*Ob3b-aX|nllM$HI{6Ms%dDEb zEAuy#cW3_Fh?#cfR~KLKj6jBVH=;V2Kp8B_EGq)U-whDhssR!JlyE= zOlTzikffIpCqu^bErXx<-@}7n0JD#oV}E3hz0DjG{JEe9i1rt>_T*n_-Ua5IzD?pM z7clQ0();>;%e?oS1;zI_7BatB7j_gDU)}g%e^n`SOz7a>_}-%p@eH@B z{1M>5N8rE~Ey}k=^=)|)ozGTnfbV0T!J*1OD!t`F#{Xx!-tshhlsE7>ct#s!`_iTw zoMEgYIxA$RDVtaCG<7dxR7VqcOq zE*x4>$2u1|IivO?3jURtoQQM@d z<*6P&c;LHA^+#@iZ?qWuA7u_nKH=Xq==JqHOSwthlerYSZ^PcCd2i6bTlx0ePLeqnLdM(DD-p`nuQieu5&bM3I$6CkFM*9r7 z6ctVKV3Q2NU^(qT)-mMui|PSZm#Zh#&KrXN2;7!a{*~(X(|=jV4Hy=^KIu{z3Y?_B z0xPkfijRYobrJl7{Sbd!DNB4RFRib4Ibu%>)c4S&=5Kn&f2%yk!~Ea0MQnu2?cN6Y zcSUHt+0SBu&S5hw)fw~hc;p!T=9l*m;$qNucR7Cc@}C}jFUJ-h>UXHD&d@S_{Z(yuCo^{BQ7akeC7mi%<6&PU`y}J z0N&u@h6If@ivOH%t^ObjIa1y?G1fL;!-mg`(MtV7dvLH#3qt<*eF9_E;5eb zlKHKwjf0>g(s%I-5cx#=LHP$OuysqHr7f?cyFR85^q&BR)Peox+vgbVJzKV6ANKDP zlrM6TjX8Om^=&ly$8cTCHI}P`c0?~TKUcBT_FNs;LFRa&^kZ4nb1yCpf3A#vtvd9B zvoEq9%X7|KYd&z(-%pqi$g&&4DOddOq|9rAWu|eLGSj%~DB~bkN3h&$iT(B&I*0?r zmy^2Xdo*wr*!58U^VD@4a)~_8d&~DhIdzHrfq(sYkq4x|GH=u+^HXSEZ`)cd_M|Gt z_5l4K0MB0#9NXoW8C%8JR?!ChaK(3QLxLJ$_(NIVD*pigIiI{s`+D2SWQ@y!@oMIk zz*um?%DVh1cBoX^C~y{d2%HZtRrFOo=UHk6&erGZg0N^OzMc=5&(;R`?>RK6_e@=WHuBRV~Tv{+zxY#ZSx>UnztE(ZEGcDIJm!4ssHsg0EGOQ0+j$Rr#yLbQY zz`3CZpm|l1s{0uoS(dWOt;9VCj-D7bz9JI)wQ+vvUVHk@DlG?EwC?=*p_U8hhhC-9 zps)Gs&YvIJ>l^b)>RosK{Lo(CMh0T%uj8CWU~|5_x}U24CB)4__AhOD)n_kRI^{{9 z7U}cR&fBH7HIwz+vy1r2RrJ$Oea@e%%6*a9Emf@Z^Lb}p91itU z);{@H#<7^Pxc3)-aQ5-X7SrGCk$dg)&!16jG0rI7rdgePk#~v17CfK$LOOo^{XG_9 z#nZmE+@W3FQofYEllE-C0QXt@iCMQ(3paeVLhT8`UGUu9S9Oo39rJqCU%}a=CA8}x z?W)isofpn&4Zv)_7H+id!Wpd>(w_#F#DS}!2u4DZ4lhv3v5=K)r1!Qcc+Ojk7-sj{{B1?D`HKbP&9Fp@K4ZQ!*5vr{|dVF7idQ+csCnZ z3J(~&Sw^uQYhVnhk78Y0wd4-GPOWQQ%l+X_Ex zgNKdmr(*U)n|kzcW6nklC%)lQ(|`lJ$F%gI=NUu$!O`>cR@TP#wBsQ64%$DC_Mheq zq_xngm+3?2$UoZ?hNHItCtqf4$7*po9ZB!nu|qi%rl8l5bms5(d#BG0$O|t+pC0I) zzA`|YUWPV(X1Y+$JJ6+L(4`LIFLpqe>W~H3f|DJ3l?>s=;BL_*m&v3usZ1{BsT{h^0q|H0hlm8-psu=mMJ)yrU-AtZW zjXp)^j7@&m9BPRUGTL|i#FQusoZJ90ot&ZHdHXSm#g22Ec;8=h-ZWAL+^2D zXFtn};LaE3Z;w~_U=?$~7_SJwz*2bl-sN2MUB+(Q#pAhuKfe0xLyH71SM#ro+e`HE zpp4sqZ;u;#D`&#EZ;zXiKI_}#W~4v(?QxTI_NDZHg0T}lSI4Ur7meMgjGe%(0=QKG zxBXXu+xD)&UY~*Bq^z;d7!~6KhR?FbwgMNSUoArG#{|~cPgrBideM5BOTB1)e>dle zyoyg_@z6`w+JWf0uC&$?@74qCFT2+M;5*jZhc2wO>|e~;o3z(HhV!UvBUJwxz-2aY zsUr^POW^cc)>y&mdBL?d8@Q|iE^_`!s`$CUvnSJrD*7vUkn?Yxdk-Fpt)xn``PTx2 z(0VIRjQ{k5J=Z@*|Dof-HPxEqVXb=!Jdc7-bZAzCCy=?_ zF>;^%pcduyFqSW!=OqH)58@946FPpo!AD3L@33A*I=AB^Cu=hEq*8c>Pfd|dX~%rp zAZ@qN_8GJtnltNDJ%Y9q1OL0)P7KNy>C30IKZ*8V;03G(k5F<+yBG9ocOC7yus(;{ z9bvS4ez4tjwEHFU!FvUG3GRZIp9I@IkNP?1ocPeRop$DeX9sEfX+092BGTB?DE?$| zv@O6d?6c1XmxR77pl#6x?X~8#W53Czo`a126Z~Hc4O;`8wsRL8_EBd!V=imn`^<%h zDKm%qWFL^!D{INOaCw4i_y*e+vPaAe`d!0$=Vs1dTTA)y3P$;hxc`!}e?{59qHH(+ zh+KIbTu+C$DCE9``E(;bJ+oPB=zD%h{>w03UjCbne(6L&7qLNTYc+knRQ{85qBHA;en{Ddnez$!0HWruw=b0G-SmaI6>^0(2>>HjF(kd6P(|1p^nIj#&i{a=w8;ZrV^8GFlvW*7D! z^fDs1DC`uj%kYk6$tn<6AQ<;Az(0o0|5CBN<-gu#FUJlh<>H^}G>2nf>mxSSSpNaW zqzGL_(&C@hON=ga(dUznqfy=$S(7APk>0y(k#T#!_pZx~EkgLRRLVB`LOD(N z2JMZ3ckBJ_ z6KLLZ4oBZbdWwZbB^Wz?LKi{D>ObppAU%s zQj2Kcex@fsB9XY~i{14zI1kMN4%eVBbriKuTFrQkrXSG10rPi_p&t>3%$FXnj2O`( zgF4J2Q<%4XK695L|D>}9`-oXSn(^|m4p(TL*-C!)75kjf6bE$k(tiYBLT!jR*E6B! zp_xYnf41M?+Q5G;f=6w{L__z!Av6YaEnRO2-A%>rz?yt`3~PD_wg+d7@yXg7&G^eW zCu`xp&04sv%&SV98UNvo+X%*NBxCkMv^rF!`Wn3ZDDu3mOt!bxK_a zrku@*d+hg6)*jAYS%qC`t_oWtZJVpQ-k5Dxr4{ga^TAW%vD?^Fx@}%RH8EE+w;V%1 z)I$H~siwOkVqM(_zs@)!{zES>UQiFe?&(;$ZeuI&2bWiE%+?}XjDMgB`_Ttl!He6# z33LnC%ELVW+?g^gAm<1Cx8PNgb}?QhfLCjXJ1=;ZZQzyFz$<(_*yjk=D}zz$ve?Y~2gkoQ-dj1B(5@Bu~~5Mo|nQf+v5(Imo^Dei|}2GFUBq zdyS5d3i>z){y=+|OzaX_I^8tbznpP1XgaV(k9at{Y#C?y4A~ZllQ3Z0y2o8zO^b^f zH{lZ{`}C@V{y`b6<6>ucP`4U;)(R=7hxNUfc_6f3Z2a60Uv7V|23}llZ*NFHBJ0!T zY)Bz^`3K7SV`9zI@i)+ddwf}&l2qpm=6V@CNlUECj{`^ET%jt3|4A?n@Nnh{e9WNp z`(c4knv1k%U?VUP8^vB=6;9ku@on1!?5vL!9I-JjHuRXO_~6!A!+nw9$4k~oUp78s z+3>E`kyiAm5&k*LbI%TEK3m!E|3mWl8B-55H1sd=Cn`VTe~CX4@SDZQ6<@=jUqvj6 zOMHdB_!LUq31UtdK6nWldtK0*N?*`f9qz(5YP8E?V@z$t-CR+f+Ed)g|}^eWr0?-|s}P7GsI=rO^iV?f6%uegEuOVo^?EUVS3^PJ9QdB3x(2 zn$~Ts;Ov%l{73AJ1+Ij!+z!*V+c?j~7lE%pH04Iq2aRt!mx(KEP+48yc;XPOdL=iB zE0b$3*Yg9@>t47DU)&7*{g}^*oH6X;D&SJ}ujbl0QyBSpo6slW31t5?JPdYji;uOZ z#r73(O_@UlOU5+T(MI;e#(0F+VeTXWmsgoP0%v%;e9q%`%D%~v-ZwC|7so5OK+}XD zzWlcN;xvto#D+Jr#FrCO=7>G&|53t{%-hP1?V7pPeb05Z%$}YV2lH{ zJ6R8^q4Ss0yU@BIw8Ke%w|}s>>l6HF3XA3$I9yOPx^cD^>-lQXvm3kn{mL$MWD~G8 zY-0vKU%p>GroQZ9jbRUKfBXvu;AaqvzrjHK4hG>DH<&%FeJa0%exCzZQ^JWC&Hf|v ztIO>}mg)mqCEj#!5Af&m-89G+dY84bS;scID_|dOz4;f1vySaNlhypzndWn+&KNN* zIL}GWy5c;m_-BSI$J0kt?J@L=si}+`d)k|HVt-s3!X&u1Z>JvR_rufIf#YUk{k=+BB091Y__E8s{F8Fm zm9ZydGyAj4l+Aw+et5F~Vy7Ns>?x=s?Gq!vGWHgfsVHMl%ueRar=(Z${u%c&72{7* zx>fcVR4HZn*%!vBiO_y)3ilK(+}au~{_~MmVq{OO(W0$x?yc-kNZ}5gyIq_UCNXCx zKC*0s@FR-Yw$-L*CSQ1d+IZGTZ=@f>mzjudTh3i^KOUvkokcHHZTiz>C1v&V-h3j} zdvjub@=Prl=Qb4k_Cw;+791@oIesnQ*YBQrJi&WDe(ecUSl#i2K>S)sKR&$aW{nuO zCx-KUE$PIi5kBC=O1;i_=lLYDY%|CsaYsJ9y6NVR`2QZ>KO9Oua;Jq7mJc7GH# zwa(}d|4V;#`mus^w?5QY!+I)hJdxUT^KVUmo_w5`zne|(Priq}h?`CSF?p`spS-co z3w=$3*4;G#e*tvdJ^B!QsfaBKE%^Jx@w09)4Q{!Su{^sZVO&k*U?0x#oX^cUUYz|V zZAv0Oi^OPAuB7-AE7HffOmpI;--*HRQn%!31(zkCwmf|deq=Fs*;LF|$wu7H&gIx~ zjuA)ZAM8)t9;NdCyv#HUJB$^mmYF*#-k2flGsRux3lks6ZWPDD7Ur9&jl+59hcsI`j@4qpIkMk{=@sTk}iqnCc5?4AlD1d-9<57cZV9ee6URr!0K1$KC&-OI8a!J6l%!_+Je#^*WF;qhikui^ zI{a3|4pxPT~@!VM|hd4Vz7IhpEzj8vVvhN0a?C=x&*&Jfg!x zCUm~6MdhrI4EIIds2s?a>S3F5!-iGot{?V%?(I{zmVETX#FDV7&*w(Z2`h3D3zKKQE~;+};gqkIZ4 zeX)E3pLNL|$k5)8kbIKP*oz+6YO=J*{+_+M$RwN>rfj|f_zI0n_BP4>5^U^-pN}OR znbM^yMXwx+Nz&BUHAZJok`XHm|EJbdrr*h$Zend7PQ0r^;#MUQk8HQqwL|i>p3;7o zHSWnXDcylQ5<6=SvArZuGW5y4&fCz8exxun>)e#Eu*jtMhDR1=n$HO@T)4)yBZ-*X zg=?b6NSvzS(_K4;PZ}OS_vdOy@^rN$;d*4AKN7EEooYxxPjB7&%Z&*(^oq#q=n(K# zLtf@g1=}lI^X3q@M)psof;*nYs(+z2JU%t<={#G_3kyTv!cVWt`{Wn(3s*>9>J|Sk zJ$fGh&576FeaL9D&{jQqbi65ge7ph<2doy~^L<=9R+&c-Cuc-_B;_BZ{3go3M`GoW zzDn+VQ`9eUcoJ_*r6u)EX3V(-2#ESz|C zqe`anK8yE!-es@t{k%WK`@_7;e$e&2Kg;_sc^BDFrCi6A#x;_Q{-*%9lyO|6xFnuD zTcJ~~=L*6oWfIR5xyHuNC0<=2dvem*2a6w4{y{CKCE6O}yB0g?JJu+l?2FTn0!K+nwMe9+vqz@hd*OTL8K3knv+Eu?WS-(2? zT(fXE&ze0N<05pX^)wv8eXAa zs&AlQF)GUFSK4l`T_p$lHC7MwOJ!D`?^glqtF$A!uQ#xNhH=(-$3L(k37@=#OjWu9 z+|`4)dkt;ZPZOsR8aM)(Rq*(4$kEHe*_Ghzz2NNq{}15omLSf~X75fDcBg23@RQ8C z?{-Y|hrrz=@HKhr1)LTC#zNNX=Zv|op6YGS5&dB->w$_4_(FTI_0MO3<{|UDMgB*w zsnRTl{kZsMVvV4SweE5nzGgF+FJ+Oc+pVi^*66$vtKnzX->Ou@80g0*=sd0krfWGD zs3g+Wy$`!gw)iA5PsHZ`PS8#pt=kOWm3I8j%0>ok{_kLy5xx9H-);%$zTd$v6AhiZ z=-a&kdHfy2hvhfC8K>yx@=n9E2pmG?Vc*PO z01W)Vz%%lo{TP0PhK=dGZ7R~RP1$st^BC}H0WUAurY?N*;D0AJ{0`c_AlL_Kuk=HF zVT?A>9_Vx4I~Fz0<T#Kg4z(iLSm%i}d#%w@^Rezcz%MRX6R1|1)nJNVppY9-xg+U~BK8jSFbwe%dc> zl)7FTf-p<_Ub)_|>&=Qr|I>r5?{e*n1fG#`s$nc`koJk)U)mQ#`_e`ouTQ6*oE2?f>{h@i_ZW)O#zsJ>miu+TmfcAn}(?d zp?jxk(;(U;cz%d6Hrf<~&o0JT+LTF~k`i~@aoKZX$DDN#-In0tY3|2>PYLk3Ha-BK zC@B~Jhg5Lx6?`8gzraUqp=*21J9zf~*HFLs{R$38!J9@U;wMPmR_54`Xj3U|8Vj7F z1x`U9iKI*5^okbkjE+?OKLt){dW5f(b{zmt^J&xR;QZ)awue24%;U~f?p56V*mK(- zNw_XSw|dHXcG6!P*M4ZpPWmRc&Ub;S*l(k;-|nOz$P4-N@M*iyKIR4O7QLFZZ;lpe zz>D?K84X-2jJAavZ4>*9v<-i8WA1*!-mmCI&icw^>`r>LXFh$eKu)N5`j+nXLtG7? zVSAStRnk@;Fug5F9fAi%UWxL5h;O;^dW9w4bRly zOr0V#!$YCd4cO{0^#vCio5(*}-vEsjU6xyS8S&;UoU1n=9G#4O2VPQ^7k^dpwdh^m zaq$;GzENHsmh8fL?BqA%*(c&haxq=U&ww=!e*87FB5ni!i@i(AFMw~8I8&FV$v3IP zI5R;qLV%b-y^me zH)GX|FRe!3FXuPB75#J)xc@ADmVYkyUExO{SEB*ZJ%buB$W7g zaZgY0He<_iFDds88|iH@b3VtDbIs4yz#j}{e`OJCUW!JX6=WCl7*%N}9%Jg}TWhBi zzam{T`#)!o;|y@8I2d=*pQ_bLpHjAF)wbJ2hO_!C(B8Hv)=h;ybEUcV#wjwEcBAj@ z^j&<#5^o|F5dY>Q8@V;RFNN4d(w1`CBK{b(y>kq4&dWqz<1RY<(Dxz8W)fFH+8GD` zK8*JZI{l$WYz7&(6G3PLJdp7iLW>BX; z7Wq4**IyUZ>qoP1^HROOBJQ{w*|N7zKd^pZS+BqL|7X2^NT*+fPM`R5E$v?h^!naj zdVOes==BeAzS-+yyOlFC0(0;3v0~eXXL9CGAhw<{KG3Q{Wc84bv(SV#_K}+LIcznh zIGc22apZBuULNf~lkOINSnw?YI_C@cB;>VUolz_P*AB)~WOnfxP6F-{|6bxy`>?&O z_`uUxrI|hL(AESk+(WF^d=F!|9@}CW_)^07MQGtU+v&?Obk2v;d>hj1C>}9K5fX$^0n~O_(V&ei$wfI?o#GbP9s<7OtVPUzSn9{aYuqR`zCE6!CmA+j4 zxT2?()%DMH)vbSTY;NUyX}KHTyDs<1_r~Q$PfI6##fx(}Uu+B4+gzu(DzLwZO?Wdp zmOWe_a?Qp5GEd}JEvf~7;+Dwnp4S#I-&PhcXq*Dyzq0sRi9J!t+7N@RbqM>55lea} zW8)=0@~^n}m`sOoEaoh@KG31Q=#%=PS2CktvY=1t{xG3z{6X@EzFYX7qM8nymk;wP?9K8|n`zj# zM9;Xc2I`pXd9W*8@Cn=9+50tMq1S#n%T$XU=x_nLTeGS;?7r{qGg*B&qYfR4W+^1? z`NK62{N+rF;w(F{c@P6#^d+q)pUF$H2hM8Cv;^a|ldcR~3VFcgtRYG9DbUN-t5q%g z0S^70evPAF7W!kSt|ioU7j?Zyf8L`%anw~$U6ZKmE6Sfp`H80Fcq=d{Ko;%|iwx8K zzpCdd^!oGi)ll&cIn=-*wh( zPe0e8o;?wV{sHdFUS{DH%)NDlCVSVo^33i@=35$0*w}L)_BgR=Rp|kEsc!6boFlUS zF7$`TAB;h#W=E$MIJ5Qm+=z?cXIXd;eAD;`AK%L3Q~Fe%&p%G9#HNuKdhcP)Zes1D zJ>5bhzhI9>D{I~$)}Zc{11op0D{~w-4Q1UK#(WvF?Qi%Re9Sr|xcb!YMBn?^#%}m9 zu-9C4t?!xC>pC!=2ww*54%e9O`c@416Jv>~-p^GDJSxBIOkHWyN3|eHs{B=~FrDK^t}K^`z8G+TNm+ z`mb0MWdC@TiSq^G(H+```3726G}JI=&lT6yf8ci4w=R0LK0&h^dw{c{D@BxJ8*Z+2 z7uD9c6Mr!qeDf3)*Zaq*hO=%*eT%24et%IB{*pFZ9eUv^Oe04=V0DBsiX$S({N*+BosO z<#~5rRkQFob1xCSq*eVoulw`s&dI7wfU(bMVlEGyA<|~iePvXC#qil*F1pCwuCS zDJe<^*HOBi=6fC6I~5m*Jjl2do;CvHoS7E+zjabzQw8a(^c05 z_eVVwcS5^zkQ-{4?|T=y>(iNIyU25NQA)jq^-I?6R_q-TyP;Nm;d{D>e2c0V-v`mBh1334<}beVm4lHLzJRxWjTq@~+{l>#`d~w5I6%E$ zitGkYC$zA}h~pmX8^jr;HNl- zJ*D9`&1|b+uFqzUhsRV9>rq>n#huvAwrtX6?mJ`F*weW;>9M{dp3NhaLwM43(UH8@ zlV7e6@|lx}C1)XKDRe8FXWQ`T%6ZpCRDKG*s^h&x^ENEVSYQ7Dbm1U0Af~vazJq&o z@q+qDcS(JedqF*CS=1lALG|yD3wnX5pVNb$t>XtzpaYM|=~&8KjCj}nee%7^m83`8 zI<`D%$jQR>0;N!5!H@5BV%l^mi7n$HO&8rAv1_p-hf-V`tt>} zMb?mmnr=IwN7!x~s}F6tX3$Vz5VOyz56$Es`r}Uo9%}I%V!2!$ufZd&;4b#03DB+g zm%U*<_Dxjj`@ehI{tWREk`~Qr-2Fpn58s6@q@vH*qIBCH-DJCcsy_7H%t1pHdp6(s zo<3CULFfw_EYJpray*wF2F_r=UztC3M?3oqY!Bd12)yybx;BjSbdXmT%tOC2pE>f9 z7H)eBT63>?Wc*9C_idiH#Epu-4|~Mh*z4c^bK%|h@4CD36wjx4E&*jVJ1bogX{4o*mbT%onSHn( zh;Z$Am-JBHk2$mG7nE`J23JI|uG}Qjw!C+L?x^=4AQtO=x$3=pb3G?GX9e8Spv8_| zKdH~A-(mQi+`?tT_h*gPHE|mEq?Ea|=e~H`QuEOJc+ccHi|4*Puj08caFBD7-26X^ zv~vFIXZ%N*_ru@b6TgXfHHnLN4I5_$d~cHLeq@71@mWeWDD!>st`xWn(!}S^()geAsn+2uVdRSloTHGg4e@KNgWtu& zJMkG9&H6Ik6fW^eecOpSR>38Gcd!P?Iv{%+WxmRJMQfoqb*ww={cDgl=-|=;L+frZ z53NgbvBxobz!=)S4!!#|-=t5Fy^5#5PM=Um+a+D%T6`DY^_a|@M=3rU8s|rSTmG6G z#7EIB{190z3tU`1ftX0>1a3elaO1Pn#h1KP)~4;)P>X)>bY5Ug&D+9}wcu$hMZP?^ zG;9`a>W`k?IYZVu`sQMu&JbEkpQ5HrX&`RK?LDm9#JR~||4mPHWzm93VxLy{QXgEZ z&yu)6Vy8H5+$}?a!z@3~)tv8j{1Nr_k?UeBV;Rc?S^L3d{6h}4Z8lXpk~q%`UoG3X zh|2xR(Uq)OhL6oPddzjXv?V>b_6p2}-#HFXz7C$?33!6&0TGoV7pUS=gD24730~p( zRqk_Wd-RQ}f0|r+G(3UIadD-?|EJwic~{ypH8d@9mp$zTp5X^F$X|G_Y+^d5wnY4F z3UpV4f{$QZqDQ?_DYg>NADDAV_+#qWjU_#;X@y2} zh}U;1Y^97OXlJrPQ`J+=&t#$>V(->7dUtc=EyR694q;q{UbLfw&w)=9e~j6rx1-;a z7!xA1wycP)+_xdKTXcbYH|X7>6KB1@C=QgL`1GRhmHf@*Z{=OitXhs=aEOmQ(cv}D zR*`zYOjX^Iw@K*MWym9dwZ!W*an->c$yOa9N-}B}Tvt|MB7AkePkZK;?gw_wu77~{ zw5Vv`aNbLq52d^(N5%N2K6OiXF3&o8%bDC0xqqK~A@^7R(KB%+_y1z9&&Ix14SxAJ zfAqEp+Iux|7>NJo)U0ePQn6#`>wM-zh<>_&kI>H954I=!f*{)r{?>)EI2 z@j<)9k6!kBiQIHxk>|4iCy`J51*9GsgW8hEHl!2{oh5PRWPFK{vdur#)qMiLSK&#F zJpkNCu6iSP)T%dguU_?9?gO`!)h(Q{`^D&Kn@UDb+fp)Z+6yK3Pup6e;;VCiJM6c) zdxmY!{RqFnq*bryvX*vAoi2O@3%I;o8fU?(VVfeY&`cZa9qY6+oxUXkvlg?(SBp$I z4_T%H+*w2a+2;}?@`?1z311~RYSxxFd}*>ehZe;@SM)?imy>ltVv~$vj8IcPXCCP4 z))qfppMtGNFZy!Q@f`HT@F6lkWS+=;`QpfwI+=%VWJ<9KnTy_-B>FON_;7nFe9qcT z!&a5GR_{JH4mpweA~^5)TTlKl{71iJ4q<~b^4DVj6MIn&HmP3^P?e&KBc58P`iMOq z|BJo1kB_Rl7QfG#Auum_e}OQ-WF~-S5`v|QfWplrNDT=@4On0LLPBhtWFU%fHJ~IR zXaf_FvA$Gon;=q?z<8yVHtB^2Vt-mRh=N{jYg-9uYak+mRVNnA^Id1=Br_qR_xAqo z=eeKH^T&M7o_+S&d+oK?UVH7e*Io-dF7ucqZwCIIO}V)pCTLw3^!vBR+^zdWHe|iSFWI*YZj)AncB-Mx_ot%#k;yK%%yp}##6a|l}dfHhh2 zYdFiYpabe5W(MX!C{KV5InjDK|3yt$nJM|-BKF@*`}sp4V}*t+kF z9hZg`%)@$v_JcOqeOTW*153NevlZJa-TAZZt_vi?caym16v!GW8-w&sE75<3~ zbU~e~&?|l-ztG?Dxq8*7`+FRlKevN5mVL#bZ^cKU!3NfPS#P>H(~>(C_$f#Xpik+n zY;TvcYk*JM*;jc_JN^SbDLWpq$(_XpXtv*guPJc$n8DziJ~A+a!N(Uw?V-mFM&6Im z;;%eui1O{i9%4H6h~Gx>Kd`DEn>T!mmY|Qbv47~P{B6664oKQt8fwq!`K{J|Ug&>@ zXJvba_$R|DMvqNX(KEavjt3+-H$CLPZFx9AwnA-_y zd@Fa(q>PT|0>)L&0OcF0Q^&7-rCW(`H4-kfT~P|25kYFtIC1ite1!#eL-g zUu6vjrBBw)4cK{rheV0L9fRyw=~OOzpEJP+H{=F_eg?3qL3StvZ-agYVg~&TObgnx z4cc;ry}K@G&o=01Ane_WpdHMI*t4B9#uUb+zpD953HM(kwrpa{^dPo6E}rXvnY*u= zKcrXi0aR(gFPjb9JLVdCs6?@EI*o0=*t$5QmBg6w&wOLg&--ZsL#p30_H?*Cjlt+(t=tKDIt;}Wd;UHtXIcBi! zr(8-x9&H;`18p06_fJ(8*I`psPuojrJ5Smk8^q-;w4F`c8)*9})sUG-|FXv`N&Z>U zi?TT*@J}!%m4So$FdSruaFB}}zLfjExwT5iX5uGG-wT-sPfd<&zmdCTb;MXLrEE@g zbo&+H+5pT8>ECd5Sl|VMr@6pdCa_Kj!g^I0tXouLX0~ZuVs`REtKT*EjiKYD!zgW* zjZki%NV{^^M_}|Y=eJ;YRR)fXsu3I+dtYVDnp6c7o!Ug9aiMMYrO7%B_%XOl+Mf)r z);eCa$@xavcqK6p-Qya*6M0=|P3DH+WUiuW&pai!W9g*8j4kP`SBlYNnH03G-GX9R zrtqFDLyB-K_}f?$JvVTX_f!ahQ{8)*vt7%6L1Kx$lzTA_>lAB zedrjD@@@lZ`9|hp<5I<^f7{EL{3~=LHj;5_9C(P+{J-gS$(RUkYx0a8&ytq$8Ap9p z#8`e1Jbj3Lp=Qemt#pB>)95!8=0=RzJi;e5TfULlJetQPzM2xGnW20_>>j0!Sk{Uv zX(u$Ft*KS<&IY#pZW;2^OF{6EFJslZJ?62t2*V2x}5eye5! z8{`QBe>CvN0sl#4uSVyqHZL;wUHEJ20tUH1(g2Q$r9@nFV%q_?;92lJ#`*8IQs%m> zSKwWf39BR4tIS@B_X}|^_HbtJVGrrCSiK(hkaw$Q>ygiu74M^;NmECA)-(23bY)1a zO6!%XsZi`bj)vAQ_HiA}F@YKV2F0@+dgbnx4d?}Tam{ZygMNKYT5H?ZN`|r9?rBp2{GJNHFp)>uLMLdg04XG&nkKZBQTX=55OH; z|w!_<%^-7-`vTqlEqZJnTYn{@e=Lz=*!->~UWIrlMe=48aiXhiEd&Px01 zhm%9b1vDAt7lSfLa)Y7o5zf*Y3g&j0Oi>-kBIrA?Ne532$bq7NFaQs-#v!3241<#8 zDfliQ8P#zS|6@qA9uAySW!|;=p$GF6pZGIAUAMa8=(?JUgz6RTN_9!QT3y<1s9xI6 zdS{JQVy#n@Xe;-ytf$aTa5jFr4thuL$Q~rddbb*F6&-@?aYct9^nkyVuF83}?Uw4w z_HU}A#m9-}b8{c#CGg0YEg#L?fme?~fASpk+n=ti;7;6}rSyq0I5ZZRk5@tKb0cY8 z=(tqqnKMzLckz!Y^e%Kg0=gdYz`I5FuRU7y0JQxhX!|Pe^M6C5>7yD=%U+2y+8|9! z-Ox0FZ#0@dZWyF#fq64@r?MB)X*xjpZhksV3(Nv9`~$qRe+1r&;t@Vey~IdoUuoPs zM~^F|tbMo2$uEyz89!z1zr;ED8n^vPaF-uH8NU57PE zV7-0yL&u?C(J5xJx1D0H>&T9&>zJBQ*Rc)ReEZ5}?S6DH&#tU$&zh#VvS+C-7vqmE zR2zSRPXRu;_a<;R7+Dd0sE`Jkn3W*;|ADc*AKVoIb+)@4{cw|AEg7FJxTLv$xjw9MYCcmK6}{m zA^tF2`TpM-*jqg(hn2mxoK0NPkk^O(Q(MDEcVOMugJ%#D zoA+zjIDkjG@tvy45DgydDlx6Vo*wY~b!r zEb~3$ySkvfw}HJ5apelz@Yz^MeVG$PZba{aUnbp`)BC_EcGf)tC$fMB=XmAv@{#v< zXm;D!V(90AeVhlHjW(~We;?+IXnhr0N6|K5i=m$hj>Q&Z=$W9{uj^-m)2Ty06D&uc zFESl-Vuh@6!`ZFtw!rM&JEXjn{RsOl`R+@<8L4!fuwK=gkIX8()q^h=k#919p@&$s zvK|maxWkH$@U!=nR^*3d;sAFXC*CPKKC8S7jKR(oodadLvuf)7>^*mDCbq`;rd01Z zWT1T0IIkHQ=s0m}M|ZkAE=T@OLT6c?X${(+!;e@47MJk8$-OL>GYuxC&|Fiw+w<~6i;6kS>ddPd=O zVw){%SU$06M2;!=8uAilyqqCgt6l9`=ohEpW1KaHJ0#X#3wp_H&cw3VKQ1$`?Pw%j z6d&VztzudGZ87y7@#wVc06Ww*6oSFyakk+Uf|D~mTo7h>C1$eq(dIa3fj zxwzGF<35NvU^}pNVtp>k6X)v~9G^Thmeqis8NNxRYXL5I^1Omdd$ubk5E0ag#NZ?E)d z@NKWmIsDkTpO1jnWc|4$euQrt&u(nr0^@}cewRK$D=f)NBzihO{uYS%l64`&VI->CRiyyf8 z#pq7kukKaH)i73feDlXQ?@>*jo%o#FV;JFi6?%97v1Hf7#BeGtzmq$_*yxpCw(C*! z2gJvg zR~*F@PqAus8b%kEVza2#No=&W*ye~F_bz@3!uutDB?P8SYy{kYylvNZ-O&-58erx&FnRCbw`XUqg z3mLz+lfH{$zte1@f@h{iZSE<N__ElG5BGf~=Pa@};cR%f*f!gH{yL{c(m!Y!ek3Ncci6`^j4D=e2xjUS*z3zW5fx zZWOz`;QrxJzH452dAo@*RKTN@L66z@GQK*L3RghVN<~HBXsEnaAAF&KHB@wtIn^0~ zp*R`}r}zd8`s`Bi={3aWpngI?VkSwuvexVV=GhN>P4k#XjN@^m;=4>Wbu}4;z6bsE z>T6L8_FN5>j(fuQwI#q-J_IKv;G_hcX!%2MQljA`$W!kg1}EiVIFWP^C&BVsec%K? zuN@U3oV3(`=RBKlvCG_3uN)kTFX{V*^}!1IU;{GIaQL$g;7@FQWDg_r!GwPe9e2~g z-5w2hDXe#6G+gU=7TmRfJMKekYqFQ~ivM6uI?jE^BL=f)AM%i_(c*VY_zd?95@h|A zKFj(m=TCwUTlGDGV4S)!ZEoYkq6OnsfmOKktVtevyZRT-;!%>S#H z|AY4`&ffZx#tXjMxczsGS&+`YXw0@TM*4U)ke2f%;lqDm9OZmN&Xr`mWUrM8ZxmdQ zt^Q%)GuE|#aQ5N|8!vtA^zo9hV$4M+q>b0Z)G6m1Qoq;@q_MY`eVhCjxhDB8d*X5C zD0WRN1n+5TvZt2!@?8_>TwUZ1hwq@iBDrnPSHQV@#QFOZ;el>q$LVz3g**&Qhm?En z43vmm3_Z#_;P5rQkkQK|5PO_HdGFwU+-LMj`%gLH5$@18CEPF8)5444A%1=TBRpCB z&6G>oKb8hGyF%m!c@Dj=nuZOp#>=teh34isz?b^Q8cpsju_=Awbq?nnRQRU&GFTk1 zJl~+tRr)CM$)isN?@4kt=G#NxUZHP$SKbw)1#ejD;=djeH)n^}C-=zOqebl4XhmKs}>t!xTKV?4r z;a}PrYkFZS6_(x+~A&MpbhGfzUgZo z{_lhS)YmBf67Dk(=W}x?4J!B?)?q5acltou7M2d{drA6WevtMJw59TkoCCw|{|Ded zUtb{dKywOrxAAYC!CW?tz$Yzn-Cf)RY*Nj=UdGMBe4fv~Jcn^q`7di4_ty^gk5j7q ztx894z5AE4H)#Z?=wc3?Kz2ScQJIy=yb^x_MV!UxJ`VP%vAr9pW1!r{!E$0lF_|%7 zJ{AL$=BsNVd;dc0*G>lOI`oRN_e_&&>D|Vhl69vFm=^L(7i}yXU`?&4iM|& zlm;jM-1%N&LCINw#KUOB2f6rFmo;iTzYl;(>pOF1A+U=dj2JZ-%R+P*1F&Ze!X5_< z%W20?J4?V*7v;nrRBz(|ZHWD)v>`gClYIM?+PLJOXoGLRtc~N0)$vRJi8lCF+CYc1 zcs{stX=f>B{C}9V*cm<4Zvi*u;Kme&n+kAa1^<=c--R9qokAu$g<0J7>v;Kt4aM_| zw%?9yUT}PzyE=3E#$xou1^mxs-?pNA47PD08d*c!MDZ1HAwL0felI+GzQf(x->Hm1<_cIaH% zsG(k=b@*oS6!0fy<%~l94{d)6bS`BYCm*)4@1ZX-8l7i>=NRzpS4R`W5c-Yz zXU2GpGOO3;X!cAAdF=%i=#qVJ?b}tQP%( z$Pk-v7TqE;-p$CC$b}gdnH}$3EtS#J_9d{9*}wVgq_hz1|G) zgU+<0DP8G6@1oV4e|@lC)AhAu>}f=ip<_#3}Q`t7*j8Sq^>4xu}jSS#N}%0??CQ$5?D6r_c`jbz zRN|Y*3O)+x54P%>4UfXuVI-mPnq`#D25+*Ccqr$m9D2vhZ15Hf-VSJa2ZDLvEqERv zob72Dd6n`@Fp=KH?T%e0blP6f8?q2M{E;1Vxo~pY5y{zPx`x!{dV}6${sw1 zJiV_vU5L(CA7`C64maK+zjMb^iz_YsdA{)J(74GMH9%jFB0G0a4C;^euACm&o2xu8 zGJXSc^d4krvA66^!d3tq!jI9Bx&)X(#-36{n%6JGWKC$lX)aG_9`?cGMV2H!(0r;7h}yE zpfRB@jkcKY6`XTif*)FmxhZSZ2IiYTL}Om&j4K72gKn}J_f~MfL1Z&vEaLe=2u7*n zHN&{C9|^Vp3iBBMbc@;ymaZenqeA1uwU12tP$jx7y?wEXY@_``+TRY{>iBI${vj?+ z=5x@koK*`g$ESDMHsLF4N7#IymcHM{eb)iH-2vU=a~(fvdu`lN&lEc!iJd6$qv!Vu zywZnL#`sLZ$F0C3{m4pH77y*itDLcaVIM5`<^q2Qfd6syYC6A2g+2y+NukekppUB4 zc?fOEy|%)ugE|n231EXxt`z?w)bmk@KD9j{`jAhcS=j@&&0|ijQ4)l1YYahuUN3`h zcuG?13$8B7i^leRU%YbJan5ow!RNPSJin_<>xDKlg&%+u;Thjn$7de-7iF64^)kV2 zR(QT$ndV{KGQn?Qcz%eNW`=mFUXNvh%pqk(KKgeP_K+^sA6J;Y8mA%Cu8{h3`oqur#A!{18Dk9GdrAi9w1 z8G+fK_FpDx6Z)Zb@K~AG%Q#bokiiZ6Al65btr-vIQ*gc`U!7OZL;rQ3ifu1sf0jl>G{UI*#;hl&b5UX;uoyFGS{4p>leWujNN$H_8hRs1H1T!7TzH| z1Ai5n&jEWpyh75tZ15boJq?}56PHZNb8krFbHwn}_}nRDT#!f5{ul8%lx4E-KE(d_ zArI%{lfEL17GNwO&ZNYN?PXrdU6*aZ=n+5Rq;(kEfRR{0%-vu<2E@J-jP1Dl?m}#P;@G?dlu}>7eMU@(i1u1f|v?KF|Jxd=pQd)bmt~`icW3avb zwkBlP-%++m#s?lrT-n0?^vO$KtAM4KI>CV#dj+q+Bz3(HE$eV;@(Fv>m?(UP!Xu7w zCgp{WME_FA(}ew78oKmeU`%8E+s<>3*}Y;J&mQ_9``9cSGCX~$VcqW<8(iaiXh)Yx z^fRYg%GPyh2GYpk=?c3=b2@kwaC>=zjWzc=%k!=l%d`tU8#F87=p zz@6wlWzSZ?de5FrgF%}|li8zc z9+F+Oz96>P2{nzFY zHa`C=<`8x*`LBKP94a{wnnU*C=a8Il4xK~cG-MTdbqEbDgsz6tO4DeiM3p<_4i zT_IW$zn|>gBG zgKx6`Nz~4>;gh1vbF7*f$Y)=Egtf`aT$?{}P!_?aMAPjL#f=O9q_b80^ianq>_t)- zn{w{Ihzt;1zuvOBh(oTgD<0Mr&I^);!l|#(4(elkJA}RkjxJeCz7wWHVSULakM&_d zhjRtvA$=4ds^jqklLaiIgBBeM{h~M6j?_iWDVp4kp+iaLo|7VHGV#_ zlkDkVVUM|l{e|fMY$04v0S+&4$Uf2<^4*@lBvPL%`#Rt{uMZkN@mq5o_~oubP#5@? zZHfk?O_O^X(3>qmUm`G08Cd5A-$gUG3rZHvrn1*T>AXBOF^lKEeNPE7O*(&ptnWo?x9 zq)(an-N}mL4ji&YEe#ZTNY!sHLW>4Es`xlG;cpZ8k(Ft4e4=8lt zp*?IBdoADYm-R70V9BD7np{tN`wT((UYBL_C%<2r@F~5%qvpu}L*YF-1YQ+b!oRN@QvcBY4DD~HCGz{DL%tu{ z{?PA-);|EF=zxg#UtQHT6@4*9=%$p0@ZKlJ^1-w(m3I%Iq{8;P$RHePkn zk^f8MBLDw?t-Ld=KXvdQnKL>)i!D|@>zc?)R?hF`{6*vtDWj6s%W3B;d@JWGVxtt) z$=(&fSJv|l=x2V7&AnRj>-LDc$sb*Dcl+h|MU?Vms_zP5Uv%Bk(X}(Rav_}FjV*W& zJWTRL|C_Gygvi*u%$4LXvvCkVV&c0_e1(m@%H8+)*OcdzM__Y2GHCB)#mBMOtoGL^ zt*MSMerOEx!vOsDC!Bw#UV;q}_bo-gw2eFNX859<6Bd&0MqeN>4$_0->x`K1@Y9I- zr1&D|6aORTGxZHAA32|h!y7gZbt7f`2Jh6>fn)7|h(Fa~9~SYSbKQvl+%F3MPe0|3 z%^}ve@H;j`{9bSuojwb{GGUwYpD8bGIr&z`RK9oQ4D$XSaD1HlhFfn^we=?GGtfcI zhND(lZ-W0bsAIVAPEen$RrC3F-$jbH-W*wNXx+D3ZS7&r*~gmGLp{W!Wo(sM*t7Iu zW6~io>UPMExnB*wF&cb9+hxaG9lqfI4C?qY_*#H(4{*tvxF;Py*%yHCF=+CKHi;>s z_%>7ie~R{cI8P1wNg1TKo{%l02N_G`?$0=jbt4BI1vYJbQsC?Mczns^dUnBUfGbo-KL5*CVathL zm{@zy&yP#>I_l7Y30&yEG?-{dV6tNO-NXLZ#7>z z;*Vyq&3*W@F@@TEIW{GtJ>i$qhISq;?Xl-Oue~t)*I;`lU+2o5k!?_~N2 z8B=V*<&JkUdVT}X%Xo_Y=w579_hPHs%(I!N9*d_MyY2ArWp60u>6`x}e4v+XygH!Q z9nLQtVSTMx4LqEE$(ViF*#drlcXTtK9LiGSSCrUQe9fBf?Kvc|A|y_P{Bjh0h;1jI z^-PU&pCeZCcO_1QX5$^dI{1WEnS+}AEO9$dUTR$aRbqE!xE*#gzfX-(teqp;0<57Q zY4H$L)>EZz4|ksmvFYeDj>**TMaz9n*@s?1Ta?Ui=d(_mswV zb3c6`)-Q3ZyLm4>;^?ToTKwK_$-}?gKpDzw|D_CNCC0DvW=WBhcfMI#u9nt(6Jd zLJ#ou8R#Lf3-DQq#Vc_+o|yRBncsd&j8t%xrY3pX#w&}*bDs6&TjlK~#`K6d90I3G zo9V<$?f!upCq6Dj7h}BNeRl4fTVjBOYu&e#$sceYAr z;rkw6^v+GqOC0>%`1{vzu(#Ci7>keMndNqg^&#;*G`!H3_=?|LS-#7OfBVhEEL{iB zUca)UU3^`M|MgPtj5e?z&E#H^%V_ap=i$xej+m5}J7QV*VFT_<<& zRO0J8Oak1ozHY8u73$}eyU+vq)~yu3^kY4nxf6Gs z`|U2y2rcw;b7f_yT&CQC^JUV$wj(jy^rX z7`un*&wpl&molc#j4Z~KG3J*i<0|7jOn;q2#auNFrpbe~Y}Kbqjdnhb&*(o$~=%;z3s=6z~XK66EUTzJ3_ zx;CGOdxY2<`yN;E`@>VxPmo>`NH9PXVi<(=39xR`f6+_Mwfod2g8%r)i|<0yAq9Y$sM z)4b0Hp6#mpms72&-UD^Y!8m-*#+xkO_%+HwiN)O=RpUPv^TPJ1M7MvGt;VmInu`?i z-}&aGA}495Tdi`wIk~7)Rs8OOcNZ0v4!paVcRBt8s(LWqpdOr-ryN{yu79WaDcuX4 zF~;bwY+{rZsnK1rrdV$r_hgAJa!~HgbrTo3^Tj2*ghrZQOp};Znh%d&`m~BZS;0pk z{n~@CoG!6FglG5S3y5+F%fZDS!G-7)!G)8)K1*Ns)7NXPrrED zn=-P-Z-^ysGJU-`qObTe9q7;2qN5Rg{Y6+`pW$7O{}g@2KjlHETRF&`!kuDMA$?s= zUl-C>iIZlb-B|jH4T{#+z4SF#`U=kr?<=;Jo*4G$dx(v*kUkdBmwx(t`~~!L^fL=z z(=}%0^cL!0)>re;de)1D^v^#{IrsthkT$y z(p6}+;*ZJFRYI)lQh0&jx&&NPw}xxce`i7)1;EKVknNaBOqtMo@m(Ug_tLiD{y4bL z1g814FTAyYF@V2hOPvnB;eYUc@en$cI`#vPJ1pM~eRd;r9cAw~5VIVcEQ#|cdp2DM zsl;iqjS`2u%U8!*^JVw=Si25cYTOSM!uO{X&h$0{_d;+i=Xrkez=LlOI)H8&1J%;| z+>Z56Oa;ec`*?u#t!ix72iQIIGX`_nKUAslU9U3^r}-7B30+4SgKmBf#eGg~Tyoa= zW^=5nDCd+n9kC9cN0GDQEyPCvm;Gu&Zwa!^CHPA1W-N}@E!pJ+-$(1xm;(-bx2o)Z z4V)ff?tEa3YunEr;6LDJL-Do;A2wO|dScx=beyyK6Ugd?g)_wG(7^?vzG0^!{;2S) zVAkRrH=$2|aK~d$#L%}rr2V9e)R?Z5;F>%CTHh9`ab5pPzodUB4e?#w++{z_PoZzl zjlsS-4Z*A}IDZucp^mA;9OH|bju^uL$Bb%y%Z8R{GJWB0Q%XQ9oL%tgI#Lup{> z_;aSPX%@T_TTqQw*3iFqpc|0^L|)<|IyXe$o)CS141M2$98f!?e8~gKF7{?xdC_YRM~i#W`wL8;{oo6HT(Oo!t|8+B zF4ho{%S`tX`z~~k`UHK=S54URD84#dU`CEJc<)tgv*dnE=8F3svf^hT+Kt^9bXgl! zvwTg=3(G_}93BUSgF*FLZi0aHn7F!LSwcK3Ga@ksUuf^xWv@&wTjyAI`)de(%hVhZ+w} zyJXjy)Bk$p%#P>ZJF|uNTX_Et?~R8)J@Yqc=v~&xzZyqsdyeMkn{3VavsdsdsN8wq zL-4Auixf-Y5!(Je?+z=Y3V#nxj|A2ks-^HF!|1Lzqm#Vw7he*20rtCh7*f5DEWEty z4@#<6t@fP##R%o#3(8Xa7JlsME|GiNlaQaDPQ3*=`4;>A?oxXLaY3G5aEpB{dx5ok zOYD=8Luwu0v%iasBXRylN<0>RlZh2Lk~km_5RYU8F+-jvj>=o=SnH2&TzNK%m?9F7 zgnh@s-zsCR+*?kN^QA`S>W_#)@+0D_Y$dM9FZlj%Grwcn5bS z`oa7Az%R7D)}h7xI>_GebmJLfHGxO1Zo?Q4cTX1|2KQr(qr3VIslAfl!km9p9gR#A zt^Lp7f0H4mcMa>Zyx(I;>a9nH6J5nejCF^S)TNFv6@3hU+hTG1wX?@PIq6%f42LEE zXQaPZm9C|KI{RVzvy-(sO-b%mfwx~t>aD{DN@U&O-2K*h{t_IFhs<5xv(B9V-YI;- zD0lQD{a$_cgP`B5bF22?#||H3=gsl7K*qg;bNe`DGD34ZQ)E2u0Avxv=s5E%#}S<8 z(V=-hg?S#sJTGFNpJIL4%RGN!n0emJJb#LLekwH2h2KkmVq&7bQ;|a!AcNF~=6N&o z{6J`)(@wE+k4KyT$dZ-G+;4>dGhmFh& znIBg%C)N_rC+bGxjY8`Zf2b_ud-izZ8J-e9XYfj)r!wYV-pn$)p?d1srIZtW2ko=A z;%AJpY1)dzN_+Vfi-0kEiao~Dx zXtEv0=bECL3q@Bm+_`4Bt|dcpqlYuJrHOwX=4iMst-+w{`3C)UH#~3^<&)av{ANAl zDSFm)88hhgGUjCX|M0S1;60-52iAskh@1_DbbC@>>MaEK+_yaRSbC!GC+X>$ZzgqB z@T^DLkvroJe18NT;0a)E;k?BF49FD&X9{_&VN#dwOZ(``!SBP%yBY7{VrPiYPwA)h zCoj}L&XhFx#0F35kovnwYp}9D>uszFl@~Z$I6o0MMK7&??*V4fzv}ht{eKi60i7e) zYWUUjI=>P5Upp6LT=t0m6Pylr@BKo)ROC!sbZib_)cqUCJ>6~er-uH>J(b^}{};d7 z+oAt;oTG7O*JnY76T609=rc4<(qAJ%VnUC>@)sNd`j*bg+R;_JFm^L0JcAMOV1NyH!S z2Z}OdCjGw0plE%Q{+xi;4Z&P3?Z}fWCqa zO3(&0n!5n6+K}}!MfNaZi}DJ*alN#`Q)`3zZS-a310&>YuDCpG-Z_WNJN*nneBrFJ zjP>5_9nm3kN4^W6uV3_CiPzNeD6uz6_=!&z2Q;P8Dt>)mWggWK3w{Gnd(F6BFn&t%O!|Ma{A?)3Eg7e{ZYzGstwT<}h zzTkX#U9&xoE{x{>$%EYa*v@>|!+dDmu|d1TgHO2-jYMlSg0Jetjf~;@QP}PW`lqK^ zsRvn8=07@&#l$7gK530=Ie@VskDQ`%^39^S&`PQ~dF1u)>#QoUM%M>(F~R ztRma$b!5XK*dLRU={*BDhq3uL7 zN3X$lKLRJUFbdaCl2%8#JAh#GyCf@6d?f!x8wwio)h?BsOoOh(nJL9pi||{j)JOV0!Z#tz)7%Lu4Io zHI5Eg=W#~-ZS=Fo_<$+Dwxh+E7zn@vO*N|r_SYhV>ptEj=KNXs&gkZ=Tbqqz0xuhq zygBHC7DCsbA@6n=ZwP!WXN{q==!|FbTTS@hNx|1?M!l(Z_FOp!9Ix>(S?fhUaa_s0 z1M+&&WBrl(T*f4?_$!lox7CjcWK;KVht!*|)jL+JH=laH9air@s8`kpcc|WN^*025 zZ2$&|ZH-^e*80%_Y2!2W2re}U|F7$lv~~pkf1C%u%{y)w_@x~=`xE%34LRRB%iNVZ zTG-dv)cC+6+PM^)jW*-8fqe9dJ>asH^K%!v3m3Xq@i*8~pDg|-efgXxxBgB!n8A0M z_#(~cPH3y~n}LkG8oZ`Qa?zou1j?t&xT#thQ)+GT5>;XdH$2f=AN;OmqI%FG-(RD2 zv>J;8Iq=$yt?O)UW$M9v@=f=tNhb8}ZF58aCvZMR981ytv`kbEj-$*rV@hCKc2IV7 z5KC3%?8=equ$zcYWvW&Z6?LLLBlVGDQ_C-IS0x5Fx^vS9Ym0k+)E@kgZc}t54KF-$ zs3&9BnfwP|IJ57w_s+Ub??fY3?`^GT<{ zAgvI?jWHBj*=D>xPzb#=^OUtz=uq-xO%<9s3mwbZxYW}EJ+{^}2Gy4b?w}26=lUzf z9%{Ts^Z#sHk?kzf+L1QqUs~Hy01Xt*t;J>*J+g7#6Wi-=2sENsda$~+z1Qe{Vr})d z_Izk7A6-}*bdpz59>~X+>HKO>pdcE*)tr+T>{#=}x6bAL*n-d4!l&0f0iBW8@I*Ae zPVcg=@5&$_8aZv*vF?f4#JoZmcv|)Vo1xKe^vu6DCI#B8(^|!z>@)NaeeA100Y8Gb zHtUL3{7VoobZpxx=B~uC|Fv-uV|i_$WwrYu=^H%mPz63!7Xm{j_nHgQpSF!`Pv%*n0HVZ~xK;?R*C9EM$F02c^ZSY^=UDa3ohbU4~o|Z#8-2tQN1&9P3RpB=oMC zcFkv7fblhL{=~_-jL*kDw;T8zoL8iCUNK^Hjen%w?N|Ohsml51$yIrOzNo6~&lguI zBXc;h!fXa%35g!R$|p0YBa}bd;eJ0ZPiny`B7CoQ?)bDCBQs|^}Vq_ z_s8X&wNxUzNI(3XiSzv?bfP{_^(`9Q^{jUv8e_V$=`(TUy{C*BZTOh*o>YmO!+!s? z8bb`pIL`vkFZ}09-oQ`9&II~-tK4m^Dfy+pF525&y}_GfPNa>4#nOfT z*eiPRGWG{L4v6bj=u*d7k+rR6;vu=f$A{o!1$8*`j?C82sGNCk&(_av()0c@JC8G* zJh!20V&0!;mys@W8>=Rz)c7x&a6azvGw)9q{iv#XR_uz_ z@U|?3w<#Llkj<|X+=*-?=YHZZY>7gwT>4cGFH(#q@BF{7e#42LN9d{?KW8nm#DydN zoT8l_E(#c!<8tnyzc(XqnyxoLsnAb7--P|1&Yz~hpQ7PUbs_$gYlKe;U&?T4ylDfx z=_I^qA-w5Tc+=((ZxTI+!a0lZA*K5AT`llX@j2rG*K#h>z}hdo!a{7w+;#43C%i9D z>Xll(l|m3K~4CQp~$311Ywjb_UtZJ`%YJsG?m0>O@;`?E&-1?zoXXnM2Y!T~wy=hn)N2E>PPlkl zu(3>?Y z#7%BBCIrmH6_hnm%cH)wEx~jvZOHm-BF07Q?}F=Wa198i^>xn-&pHmzS`QtafQ|~F zqgS9K1F=UZ^1F(-64zh)Xg6qk3?JJnI=xvsH^V zT8^LKKUS6p=0o>a!p~(rmwx0gR66qCQGJ3}KRoecc!pq$Os|Jv;;F&(`s|MwLmhtMSvDn6}5JbHka6M{I>pvfIdHCz~f2q zxDh;l03M6L;{os(gAPDsDCxWSF|B9*wQLFEq8vWiS{9^j7j5Jy=HB#6^FNcdqUCqN zGRM&+onT#ZM|I9t?i_Ke@&{*?^5=BU=qDComley|53$&9DRRmWJ*e1HIiu=kGY7R8 z8d8s$w#8qqPD?rPFj*_)&W`9=b@&9H`S3lVOPA5?-3DwPzU975R~Ggo9(Y0tJVED0 zn}sKZWTeh;zJq>M&Vx%?m&Arl)>1jc+gzUj9SH4QtH~=Z&)nInR#)r_p6`uod&+oS zK*`0Hgz?=M(gU{6RS#Z5`D>xUuT5*YeZ_-o4jufs<;=8izjns=!KY^&3m!PsZ283* z_vC*+Q}VY@&t$P)wb9;u_6Cjw_wL-A(A&bR3h)P7K;Aammp*N$t&{MWIB;O(oFxw( zbspy=c^MVizlP+;gvd6$5CvqM% z6o!0wRIJq{nG;Logb z=Ls5@@2$|R;FP;(eYGj>-3>cbV#a_^)-{Q{la3vn@G4?IbuEW}JjNKW;1~aA*h9p4 zpRHF99suX~QSff&JR*;utR)8Ui@I>xwUgEjmNj3v?Em@ohQYEi7cM(#{zHRh6E0l#mOni@ST^OtWuIRD zyZu+7%trC5?tiv~-zPj~B@RT0BGk!?oXFS-c`krO(?PsnvspERzf2_&2g86s^ zIs1c)n{2getYteqa3k|Eyo~;SA>Y*)V|q_gb_w5n$g{>6*L#X*8vjr8+}k~BMkDn! z^4zY*TNdzqUrn$?^UOltP)Cd?LciH&c-g&Bc&xx9=ZMeIZoJ{zfN^B!>~~qu%CIxL z<=v;M=8k{5>i_V6694aicS}|M_^nl2Si|7C+TNyyGehTJ`WK5I2jMgSQ~gwq1pB%F z?O;C}c}hPQ@ch5k&(c5jFaD5z%6at5tWCPyBzq0fX|))UQ_afm4D?sJ-N zazOTzZ=knW$G0xl3>Rw#`|K6R`Sulb*Dn0w%YEyol8{*hHsYrzvo6S)1m_O}=awz? zHv|mV$vJ3p+h+D6vK}>{7sx=rQ8zAFKAk!xziwjW|L2jPFEX;0 z1nr1|dc3`rGuy={WQ%bzzE+rn22-zxz2R@JxwEx{I@SU2dSV&4?z228dJ23udR?r; z7r(f;qbDw{{S)}M@T|@7`lpiaXcb$ft-$v@aQ=;cOW(x5ZwC82IoB*iADc=)#11ct zzBg=f_)Og6FtZ1Du?NopR*4g|>*61_x~4JDtM6d#yPo~y__lX6J;k`T_hc^_x(k!R z`Y3l{)?>Sofn8tHytN%V-n{IUWZx&TUA6&}*lo*MllW~Dy?h&X;%P>U7ALJi(n24j znr!8Nn$%tnp7Q@RDL}lG1gY-~GKkdE0uIL0|AwrFNSIUHea#`5oxpqyShe*UIRA#+ zuEXTPKZ5jI?vJ+tli1}IIN3KMXNinei|s}ha!8ud+AH>2g{+T-f0`WF3LKvR19Joz zZanY&zLfs#LGC@b>T2}J-$0){554kL=$GdbPbaVS_{3c9Q0!Y4^rinLaWRbQK{>mP zwBND?B=$}!@{kSM9V@aF@ptmMH`F4!>3pTbG)nY*iqFD6r~n;l0Xm-P$kBVS`IUUD z$Vudj&G6;OO`N-F`InJy3Z=zvp%uL`^UXIq9=ycI`&!Xe({arYzR=KSqb*=X-z59Y z-)#9|tLQ|D{qsgk?@VZRtR@Gp#CE)anA{nwTH0HUHwA(+1gotG`K` zFS*d2(6NK@D#wPXyD}rd-SX4Np@(&qSF~4fUhQB{x4HgCZ5~U!4e4(Uw6_ge_P0N% zZq;GjY`i((T67pvgfPi`4O;7{&L<+p7@s1-ec!1?|b>L_tgU&Vh1MpT?cCHw`CA3 zQrEW~WA7|HH~iae^kFy~&Rpsee)45D#Zq4_cgf`Ln4-k`6(xpWG(Rgp3qLbI6TeaX zM)Hf|H-ev$pMf8G1Y#|jZX3lNM($EE2EvE>jU&0+6$f96=R7Qd^RPttRT6wF8UB?5 z9~;ei*ci^kqI`0n>n!)VKBj+ib`ykUu^mDe%izwL;{E|;SF@ilwI?h0{QS;|;-@10=jQlKyJ8ON8ZGh5sH@Um$Gxhf zmjJtb2R=;7_Cq}_FP!Q5{Jk?)(F2$~oUuH2Xy4EObf(7;I1{bu2A0_yuvd10;|%;& z8PuirV;9%XDK(%w#7wS3M)aGejNttd+B|v*cgjNTN&QO3GW*es z$z#v1WK`1LJwG?8NrfhCCdxT8szna!=1#D{_Zc`Uk$d3COmY?=dBW36#8*b>fA=Ed zHjPvIcEVrp8m08zYg9V!&QkhJ+(VEv9P=+5i_5>IU}t33VnCWUK2$7cH|wGOo|O+5 zn?88vc8UFwardKI{xC&(`qCxPv>p$d@ATR5G_( zk#%b5r-k(1mDRgCSKg!9s+-lMu5>m1=g!o0yOcSG{zCTbd8;nnC32JYJv>eBGs*Xy z2WvL$B0JR>#`c~7C;8SSuhO|>7w48;N@$PYNx3G@?T#_V0#{d>viR(+N~`Gi8djw( z64>NyZFY5SN5D9~>r(pqP5d=n1}%+Mo<7uZ+h5MiQhLt(13k%==t+*xb@$DP+4n>Y zIQl#MBf$TLywP5l(k$nc-s6kl6V+D)B<_&hAr`&m64ov^`>Kyu+n#KJ?t6Sq#Tog* zu~W>UyLTF`w;U?}{!3@_qk6P+Kr^^(S)KBv0$%pb`C0M4MT2LF`kZrOi!5W{aFy6g z(W9$o?t!8Ik?}F1YuaZR&zYaCHd{ZO4S^^8PMwK+TjB6n z{}b?(gy6{ygGX^x*#F8n$yw!2!x(RaakK_oFXQ?N^d`6x9^8oRN-SXXE;n!%TibCX zy7P}$CqF6ckMLXhw#Ja$t6;~_guSqbF>W2w561=YYWYv}!yW2}Gprv1mwFevzl@9^ zt{tWJtLVdhtVw5$?!G4MapXKo=Hfs8$b;Vnjd89hFXSBXd;nu$MiS z3BGTJ-zUS{{|;~eJG?ywzVz?#rH|q1tS#^toj+H=tKl)J@bM5lQjf-i$k%vKMu_L2 zXBGY={CeNYO9R3;a*Wt%!)r9!_p#2?u0!~k)W`f#&2zJ5&m(o0z(WU4zeQ}3mmjKvbh!pVJu zbE|GZ=J+PE$Mwh{i;+bZv3DwF?{pn9%C*Z+UV07pC`W4d(obFaYyPX`8<1U$$Sxx& zAH{bg`F<4jn2=qFy*$_8>!0X8*pE)1_1Cxb3FTbrQ_4B9mo52R*D$|jXL@1*=J z$~(Kb7fE?1Wu26DQr1aXXPQ$hYoKf%WpAcz9%b_=n@8C^%H~lvkFt4b=~~$llwC{N zCnTRh?GTG=GZ-a%OpW$&Qu9hAL;vUgDS4$9s^**hj&s+CQq z?8B68r0m0#eVDQjQ}$uXK1|t%Df{q*%e1m7l-)^LKV^4Pb|+`#B(aLt4NF|#N@+0?Ak*wnO% zv8m6*Uy^!5&NZpt=Bl$3W)^+=$>gE{^flc3Pwg{{W_~)kXe>CN#rL!Leiq-);`>>A zpPDwS=qBD@!TXzee>3lI=KamQznS;5(yl04$@_2deiiRm@qQKWSMh!o?{7}KvgqG< ze;@C6^L{t)ck_NX?|1WlRoa}QzwrM5;r-jZf1CGj^Zsq#zs>vIY5!96Iq#3~zMuE~ zyzl3IKkxf_|8`nVQO?Jci+Xr(a+SuKCQOVqZH>RgbbZb>rghC#{b?CR`MfuS9~bXk zym#^5#d{a;O%q&26}->neF5(acwfN#0^S$!K6655(K_B|@!rFG5AQv^_we4s`>Y9B zMXkJ_!uv+vH}bxb_l>-73TZz>oe@7 zcDK)2JI4nfxumLi@0=I^y0vO6yr(|xuT^E2*Us58erwT|33peOeLa}2pKw=I+0~it|1Ryesxn(Jy(R4jRb``t>9Vx% zSCu6O({s~qsY*}VTD3G5IfQ4oeQQ<8NX2j2bf?|=`VZ|tgkMH)y3D?OYGUiHS0uEq z$ct|+xm)S8Ap4X*3;#toC^~_PC(!xkD!xw*<9+4u)UkISzi3{WXmtDWWpM1TI=R%(2coy(XRAo<%&z z^Ss%goJ*N`Qs!I!*(uSM!YFc^}UNo^?D^c;3(R`X&D43d$}gt&+EbXB5x7V zES{}A=kWCNbn^7^oXqnPo-Uq`^UUV?GoE94uH!j@=Z3mDN>mi%Ig+t7GL9n{LzVF} z01vhtQPI4M;hlwdR^FL-XXYKcn<%&chc~u)BnPRm1= z6P4$`qae>;LSC+xhaM(su75?|T)%@nRm(&76LppU2ezyH-EUIgn^GS-A?WXWiSzu; zUuAN^BQL0H@9q@oJL+C@(l zwIHlbbXQRe!`efi6;%}09y+e5Yr@)#V_+K2>ULyY&g|(N&|HWbL zCG-FKu=Y~;|IM)WM)UuMu=d9A|HiQPQu%*VSbJmne{)!SHvWGrti5sk|8`h=MI4Y{pSLd9)l8z$H9FnnA%%qt|wUUk@&0H#xbOLGS zlUvd$q@h)zFJ&xg=yk88Cy<85n>#~626w2 zX}Z;N`w{l=qG#B*ropD7TXmu{75$Qufv%K2qwGy!sBhPuFth=kS!DRps~Y=BX}hP1kW}&^0?c_W0+cE|;NH~277lc!( z4AJdZtTTwu3)iW^DfMl>0Gzo|k#HuYTo6u&4(C^_GlV8WtTTwu!8(awaH!;S_ioYY_ZX8iO`OS=KY;#xjp8e3A2o(^o*Ovl z`47%{qB#eO`LMLVjnO2uaX~dR%r_AzRFj+`${&V6Rn;dsO4Nv zMR%&Aj~vuT_nc8!BTAoD&WWz?X!vKL zZT7TWe4TOEPU6Kgd~7IeNl-AEM6_LO9q6 z4jvU8Tpnn`2N0Jp@L8I|Hd5K-RM0a%;MUFo%M)`uWDQMI&7N%RvhRi8H{~d&8>T6X z<*bRbIqh6c&V`n|gN?64{8lZcFU#zu&$`cL0J}+foj8vH4W|m{4&ivVXlrq$y;s9A z>n?p)z;P<)Yl>?*eP>OUv&&Gvl2OI?_t?!f?Uo!h*|YA2b@X+tXV#7&ZqmqWc%i|T zV>EdjzgoPqfPJmV0+q-G9_XRMWq#6vtnl(hmM0z6D|gM}Oi}Q&nKL`tJ1+ze%`0b# zpG3FrJPhJR&SS#y5~tzi)?xAD*6?!cSHO$SbH$D)G@8-z!kL}N4PGk4@Uku| z94FPgZXUqN$}pTD<%# zi+gvWcK_1a)q@R14tKle;vX{;JDz;i>J{6^W#~-2+=F-@n@7Q!M^$}|l-rBXm!<04 zv-95FTqSzpg|iK@*-^@jg|kP-a%YUEC3d;?jE&vEbE$eHqO3nu_SI0?lcBQQxuPt3 z=kR*T)9U3}7PWVdR=1W%-BLcRtUpxtRqbhsJsB#u@Uu~u&j9`s)xJyWiuuQ=%S&=4 zO&Q*m)JZxv_EkxD+IO7?ujH#~+P51dohxbjsC_Hx*w}^Iw`qJk1b*#XWw+L@q@$GG zdOuF~@gEyVt!+uiD7z#2BY6qIZ#PIfMbfk@>9N7@mVZQgg0frU;>dmW?)NyK#MflG z(bOelrrV%7$QS*T%%|m|$HK0qPriXpUg5l0r;$qLV?H{ia5~8vLMQLo|9?99-%cl; z@j-uK}h0ecCQNYSok7mj{|&B)(q`@E#uY*eyD2vu=KpOSX&E}pA@?uY`@)s z%?LiXW(cnnJB;R=%Xj?^x~rgFC-<+#CdE|Ij^Fr;?Q&;gJNrf_cO4YgZ#^$s@)9J^ zF_5>6bkhh;ZGtRM+CwDS}^@*PY=LGUL4dyk%^PNs9$32!%Is98Jc21UZ zgLw-i&n4w14V2rCPS}}E-nD~y(ULb!z8%b42L7DW$$Nb;Z$JAx=Papj@<4r4ByWz? zH<;Im4VN=l>Kn{^pEb}qPwE@YTR@(|Ij+oQ$6xWAN?$~;yqx@o!j|Gk7*og5$b1v| z4@y4#UoZbE?KKp%6tjO#9*%eH{a|?B;rQcV9nz+WI_{CW|2;ClVSY>T?UH{mGT%i0 zGRc26GQT0erTF`j|8iu$iTo1De=#z@;p&#+nc1>t6GW)*qH2Sjm$TZ|24_q8kyfPx1~5! z@;683o5-Ie`9F)yZ^&!We8xK-kIXlbpDN`aiOg@vZ7EKad|za~iTr5E-w>JK;BL`k z^g7lJ=Ep!ICi2Aw%)uHa`X15qINSOcTZzx+ydT>95IZV;K4G8etP^@2%v&IN_mTJ9 zVBU6kg0q^uO@n#Sl6Mz*w+-ek<9r0&1@mMuZ$I*qb2)im8_b&`c@^Zv59T%EW5oGA z@;x>zcz^@BQ_xsHVF0O1K8+yB;!Z62b%>mw$!@M zixkzY*>kI@*q4K_wMmgR@cJ+^UNeLmt0A>4LHdpBDoNd z3W64!nFN(25HzB;_8gNC&?G~G(bJZIm*Iko5C40AvJc7@DbSq;qzJc`OwH3O3nrdhF9YD1j8%)-vh8-+GqbIusVZaEdW-D z%Pw)sB}TcxX_x(gDr4X(I0Z(9^=voi;1m)wUVP?ktie)PGv)sur6QZPV)oJ&(*|O; znzB+{8FxGI_e!u9-l1&A2hF$tb=f~%Gk%WI2Rn8tjGZgbBMR&X_^OzWhR1!rC}GI^ zG9C=XFvHhc^W9I@;+fH(yq7r8`Mk$pyI$g5S8;!a`)%AeaPN?Kg7``5;MdpBNU+uz zuD9xmBQgeGABnxVi8XkgVT@G|k4ogCEKeQp=5f#eo;U-sZsC=bnbHbA#qKan0juO8SO%IqAuy8?17sy2QIKgwCWX_P&=c-u2F1YVVW?>eN%8#D{$8 zHf2a0F~r0t{|IrzQd#rB<6_BkcmnZ718_>-*6&&GX}yj8VkKqU&o7JWjQY<9pGn|e zU-HQIv0Qg?e>dr)q>qtKVozv7Ik7@KsX^(6kQCufYYo+SSA!;8jmucK{eD$9GNJrbkx zuFw0YqK-O|Gb{qQutx1z|s2pUC&4#=zuGc=dq-hVSfbJ%e1o{ z9@b!g1lY^A-*_wV-s*#0Z<=WR2-xr8DxCTa+A`5v1ne2K;iO@#RbZEPUkm$$?fZ!@ zLfp-IX+r?sRA{-xkQV&Q-k!1<<6RL-L{0$r4>Q)rCXKxU56?p%qzu|$p^85)F-py5 z&O(1&z2}G;;(UX9V(8^bzY%lHEM>ESV2;EZ`H+~-FA>W$YUlNxA>brR4RKB6a&XP% zs^i)s^F|#+EY3mf2_EE{&$XJ%s}D~pn~~-UWz32_q%LWURob&#jWi!o6lW=P^H1Pb zEqQ3WuJj=dk2dZTxxa&SEPZb)erWq{XvYT9Os=PSUr(CIx2RhuT06jB54f~3F76^d z!Lwe&?+w;Jf!~a&H&~zK-3_#VH)CTrbGIiz4{bara(@H( zaB!c={lla;CM8-6xjzA2sp0vD+>d3Psis8hA@Cyjx|4JlxH-YUG9GsuZWs_>W1-K| zzWLzm2A%Tyd$dn@Uw7iK%07Eog*WTq(N~^jsm08NMhWlz6yAH`8s2N^wXm1r+pMF9 z&*Xev=w~uUZxlJj%o2cui19sLpm9QxiRaeHLk_;rAy4-|Of&8+2Z@m6JKvNcXm zJj)@-@WkHC&r~WBp{H5!_fnnFWyDXMGcdfmn(WVt=mA%BRsuz`q0{K!lOA8d`>#P-G#s;dnsiPUMg@2pO*7L zv-HMJ75=9JyCbmYo%t6{z7?GN7XPsWzL;d?%+Wp*ai=@!?{N;|2AY*aD(kQabf!A| zc_PstPq^uwk0x+_$9bX0Q8!y9mP$Il*Q=PjZ!E6ZZmX>5O%NYXWrUZ&P;(M1=d!;h zn(?G-sZvz0gLm^Q3$`~BlVJ0{>#dA+Z#(P7`pSY{Y<%_UI@PNPY}_vg-iH=TUT7yW zrtBpOlok9r$E)kJ+A~sOEfSxbqag?nShjy1hB{=T^q{QFMDf$a=wT-G_X;nQuP^HW_cn@bMN| zP{y6a`IY#;UhpYnU={u8V!x8;2&Z?$e2rBzk#dYwf(Cz&mWTbL`}Qi+Thv zQcpH|wN<&*o)(kIWyfF4tQtG3m`fr%OB|DG%2l|mdU(YKbE*oVuUJi~rBO?QXB zwUzv$Z%shon!p}&(YNNJZyi5Kxj7zvW-j{72=tt}=moWR=rVKBN6Nbd^sd+b6F0y= z@-FaC`)$|$qr4udClMX&rMl2vUiy#y?pMHu-ZJpdrTpkDC4VmZ%L%kyzUQJ7jduvl z!2j7`+QD~uhaUDC__gnWe+1^M|B2(DtKbj*hjr^E_=D?0@0t({fABx(T!ZT=N8cLn z*SE?UCC3;)1MS1BVa$Hn9=z_v-P$_Nz`ocL#zwH7wo%r;@L18)&JWVl%G@);L(<{P z#9N&c2Cpb({;$}Z=u*Ocu|dpXysIqjt%4?WAk(Pd_N_H?h&hu=%$b>_7Jm&=@l5aZgDS}3ZkV>4GW&0AX(|I4lJ9(~~ znP{z3l-J+j-Mp#STZ_;kEQ1cpUV-J@S3}Rvz>hZ%07o%+YU0}o^8KE@g&A6k;IY+(PBx|b1!`0EO8|ymc&f;@;8YWAu%R)koOGVC0>NYkC@Fr z{k%KJyL6q-+e6x@SF{)s==-!765~iEw!&$hGC*vFke0LXC|@jkwdKDOKY~4*bINJY zY9+!oiz{1=aE&LGm^B^n-wauUA}a;Qq}j;3;FvTu0sah4leOYk#Q^W$6?%w37wj(y zCDx$6rI|Chn`0)suh1>9cl&n6=0^58%wSv^KfyjpoakW}9mHB!Vuy)6lzq@Ei8){h zHLf>mGPKcUSWbLXVt*zn$SKG-$*d<$7ppynTWUNn>+kLL!qXQJOK~-xPphGmvhI9= zbtf{rwg!EPd)8>$eWToCBb7WGxKHO^&a>L4*Bx@HQN4jZ>Zkec0#{qvQ(i?m$TC`- zz#WZ|70!;8>-IenJ!&=owI=Eg5fh|W>i!XR%YVf5)7HE%{rgn+K2_|XMd{G~+ zQ~J*Ge1KjZe?x4>2O zM@!dE(Aj_99uX4J==yWH=8^ug z?xWnB|0%sS_NTA1UqRk~ocpZy{sQl7xBZ5Eza`K2$@3e&{kHA`_qE$T<^7*|e;@BZ z<^7*|e;@CMKKV)RkS9ONjd}9p+}I~CUoc~dglS54QMDCq74$8FX>GYwtW)6de6GWKQ9OY<^cytqrxyL`_p zWPM2=OeSs4)Eyc@-OWY1LnBFlMa+-pWx7M5@@|vv&@f4N=?=w^ZqQF{Z9XA!&Ul9| zPm4{r%paQ$J&(ku6aB8Q%)2hdq7xr?H*J(SdA|SoMjNzvd&vKR_UvY!`Rcx__lOee z_0>;at$yMXW+-#Euy43o8H6s#=pFU)k1dVFQjmC#&3fIXcxSQ)tvOM5NG0};@TKPU z-**pJ2X!{nPqLrAQUA^~bUzDIiCO!Lga6`gd#uv^tA`i4iQiIDmg3v17>Ebsro9rI zZsbzq`df(w_&8^Fe$3b{W}V{J``Yx1el1}muuY&tjVD$GF-nNpAaORT51;hM1lz(s zNr_4FioUW{>XtoV0*~zFJ(?sudQNXRF+7@$gNT(!?1;+8h#{d&5?M{+Fihv$mf?$9 zTfqCB>f6&=!24aK6GN2QE#N+ndpVcTT+-53z1X?Ex;RD7-XK=%C~qcwx|CP|vX^*5 zNoj94bx8bSC-+q`#1&(V%U&+A6)cc^6BfCXOBVFDFt4*oom?-Fe;;WT>$jc6N*6uT z3C3R$bthX^&VjC5Gaea9PvQmO|Ztg~68`+rq3YWw#OL<9J8!_DLtMp-BiM1zqOa^yb!4G@ zT4@3o$-vtRUgX{hUd9+ly5hl2p<;IBBd_;@pIq*%lnC!h?tiSkALjLP-@rR9E|j8p zPxHKkXNe0{r3}+>*1-P~AF7J)!uNOZe2lb#=cC&5Fz;afVAF@(|1e6K;#9*;IixN% z(qty>q%S%nl__SOYH~@cgqm_lv*SgNswZAZ2>md+Wjt+w@5NR_OO!vvmsf+&YzI7q z3th9svCw3wcD}28chodYE0kCZU5(mazev^rk*YE!5;=OImYO0CYH38o!i$4%mO0~K zzlzPynw&GtB;PrFMjfn0w09ly&J^(@d53JKy+fxHi449F9|?OXYcl?|BR9(#ZZan4 zg6l@`>`--#J=J>x9Nfr#KI8BM?&oXoLw)%4kIj5F)E9q?{2Crvj|(1a$s4EYymOTh zQy0&H@tzQ(OgRS*&oO2r!QqRf2E|}1CQYhQ>Yw6T$aNRj%g~64#Nzq|^sb$>kyyOM z5yH2H;|FVadzS+;1 zO=N85b5(JPPPKtFj_U~d^vwG|5##EVf6Obt=j<{56CFZzG3OE);;q%isS-o7KA-%$ z_lf;OneipQZ+5;FaLKbl2q&@>zW z3vH7!?EGKAdq<#5o~5qWif?Q?R`N(&I~Ve4#n?GD55$p1W(Ux{|Egl0~ZGvyRD zN504JthTiCUytP1DHRj%tA8LaB--i1o@t^jW67(MSIRinUSsJX?@=x(U-IRkUxNPU z9P*dZqmRz%;rb|T$0izc|=x;>qzsaP{+29%B$Vb zlT)mlyx1jABQu>rmv$CeO7J2!s6aecIm1L^vTAE)d`@Pob}d#^0W`UWOBsPpKvLGj zat5(NtP>q)0VdH0_L&9fOcz<9`yMYi1NWK_Kpg8}9dd-oH))JtlRn(#(uKPgaIslT z^un55wT89fMlPu%xO|oJrH|t&pFj@Q+}o8lflv6e0X@F7HwFDxm)?-ltsgAs|Kxp0 zn^TlQIoas{#EvWZIJ(3tz6YC17ijzYGk`w>_@`5TG3D3JoQr?wB5SyFTwCkX@KGD_ zxs^EGHKo2-<$@d0r77q$wk;}dTR;pgiD_O-d4*CYaN8-z;K=?=;&ZPSeROhyb>I89 z^y2#yE%EVXUqtu-IFNJf0x(7kjNn0H5DWxk7BFTB4wf265j#eMv5@8(X_b80} zx&HnNz_c7)j=<6hEXf)y#+E?r-9Vfw`PTtX-{UM68+2CIcSVZttkA%@Ug^-YPR7(x zo#SGceq@Ro^)0LLn7Ad$Z8~sVi_TK`f|MotfxYm9WHq)^*O6dNUY_xc5 zZY?cs!;f=_bENSbbJ3aPpi4G8Q`!v4HtSr@7!NM11NaBhZ55*XRfuo=W%Dqg-;%K> z<6sqi!a3O9Q|L>=^=8)&Z2c0?lk=2KVm}Cc+ku@z-f!hy75Tl~?@)(oI+(NFgQsAN zHnotJB5#$F8i~;lS>NIof40G%(bFCdYbpx03g{{1X)P}s2usJ@`wmE*bUgAtk zyy@O!xDr}}FTkr8X8(W0hERzOq0~!ECUss-o_v$F(#0hXd^>hF^Q^_lLY}%Nzro;( zrRIXZNh~nY2}=B#hMh@TyrB|oJMqK@E9mckRmv?k**(3~U%-3qImP#Xs{j9Dd?OU{ z%Qq>fIK>xpEC-pTK)&%_;%ybwvLC8eX)VwZhh+d*2l6wKv&6;5rD8jme{}vhCN=2# zgP&InAhK53m6w` z3K1rt0mY0B6KC;Nshn3weNQdDe4d%CA;qVwDuVbT=&q6}r-U<A?@G=k>(O66%k11gD??uL zpG_A2^EKL8eFs?YmIE*AEf;lZ=hrO&=1Aa`HcLC5z~^tLb{5`OwlhTOn@T(P)1Q%y zv(vijA(6ZblqKV8I^QpS3##W7yyj}$xTO69o!JI%wo3a4IID*bYGyVn5E)&2Wr&q?%uF}Os27-AT$V2gx4fRh025L*>7mMygSUj;b5M;mpIe%VJu}i(#@NGm0{&%^bB+2Aa>m<2aOMIgbFAW# zvQD#0I&dbWoD&{~j4U|YN1gR!4q6T(Gw!3lDD;e+8JDx#_O_*7jZWcww8Q9l@??!E zWBdh4sUwYZ-=vOk`b5qGJdQt1DD7LIgqiV`sE^Z`y|vf}GsBeVBf#Ya21k+-ZF^iF zqjuQPMXTPKoYT1p`C=h(90Ly9^*b&3BYgAj17Jze>2hl0cUl~Znqo63L*|ZVF0rP_ zcxjm>BO*=dUF_Snej?=(c}7i^s1hE_1>_doDt33 z(lMs=hA3BIyyDT*M%y4|^4rismHQ0719B$5;gcd~?jEfS`5`!N0LLG^RA;FJ$4%5f zUu)x)^@k`?t|#MFPZT!vbX}CU5t{S?=MV<^`a{NB6MY@pF@`pWdc!zVa5H>xK6u?t^R#`E5}9){{$0zTltC%|LVH;!KX0(#GAH=`?W|!~V?G~dzvW+o-_J)s zAn&8>w_MO)E@vNYMz@}Kj=sDa-VNkWve`X5RD-khkN9H&i_BY7bx3_KHlZWDZ}~(2 zobllit^?2A-gjW6-823V{gXsaMklEGog~dlJt@pPjc*~7 zBa=B7yx%`3Th2DZKcSSqFpf|>!Sw6vXx}b$Ie|O@df5Kk{?~T!zF)69^i^m31^j+A zer)o|H6jPDKqeYRELdV*_PvX|vI2jeE@HRE8aS`;Cs}=ak$p^@2PCn$O)56AB-K5f zn6g^jamJ0%;esK=dP8RT^K8YvmHwC5aIz0m)?CDVW3N2tu@OJ+cgPdNDa*@RR%E3k zx{=QJcK(}1o`1^TxCXu1dlWv=MVvWH<>PIO(H)6=)kR!uIoDWZsyOf)I0sqIGm)_? zFu)fMH!hy0#oLxOyvSV&vT)YeJ(iXIgKsXOEvDbUB5}u~v&IZx-?I2|&OJ-&6~7CC zQ(*YqX?IWI{{B?xx2$QHkD~9M%XpytJo$z$BlbIyis$GPOP`T??Zh(er|qlopUdD| zO+*N`fzd8z(+#;9Tt!@UT*>Uk6j{pt)5hEau4*pTu9TB6!pOdQ z6MN{VEH#Zn=jUt$7WPc#{P_v7z$?TXlA8Lr8V!!)^({foU_tW&!2qmgrPa>DnnD|H*!o2Rp;41af>tlb1w-yX*p zudE4$k4Ya09vZQ2iQcbCA~SnOYALzuFLvj8T^X8PuH;~6*!Oy@&f0Hf3@9MJ+vui zs#|QrSL;cUvmCo39$-G(Pc^u_oSCsSn!L;k#UGYm*DnFi!+9E7$yF8 zxV>)@`Wdm;WPw|WA)bYOIN(RORX>ur{hgNPWy8TW>tS>pVqcC^X(#37&~L9L{=ki| zwi$fiZ3utYGLrvCZ@SZM`KG<^6>Li3;ALc{!a8Q8hIfg%D|1cxrox$+BU`fcqg_Ac z%*qn_LuB=8#_mdvEs5Rl)=4_8cSelz>TBp3WE`rZ8}Qltdd&EG%Gm@G-(GxaHJI4zjI8F< zC1b}KS!G!N%lp6Y{)PU2Ek6FADM!kJ=JbdSxS2W(m5=utDqm?Uk=W$$jC3`&w4HgN z!4mC*MX6le8xM|)(QzBpk*;q3vvDTECUd2`89NcW|KG%gC@%|q<@BZKpM9}$=V-RT z6zE?7)*N`B@MC!v`Y7M^9-nW<|M$VFg=ino6Xvrsbc`E%q zg7_POe{+ZtE3#Q|d0X*i4fMCRS9e#EcWY1ooIA-Uv_kqz^2>j>_{&NMj#Ankz^{{f zOt=J0$zX9BK{g-e%)MW(6Uxr&09~y3jUWsj0?5rmGQQ9J~ z3U2o^-mk{vDfH=bCfC(?gx(I9f7?k1(mDO5dfx!u6WhP6$E1GYE$Csdp?R)FKAPu* z<~e_t#90|WnzsjI+3vX)S_uEISF3$=jfWD05`&tkez7 zNe=(LB@NoqJ>1?mp418LD1~lh(Qag+o>RmO&%(C_dVk3KyyD)1EVDOCIn;f>(&t&G zJ2ZBgQXh*h=%f=^^F!UAJ44)Oe>vDKV^ZqVWCzA=%I)ahp*8Rc&0k*VP?YTtmIggB z`Uf{yr2cficR$|%4L7EA4OTo~Ou+}{2Z~4d&6!MlUq5R!iOt=`*#X5>gRKN#7M$MXv86j{4bj&PYZU=%NnjRfTyHXK?a;24nP;ZPfa1&NPvj*j-x< z?sK!1J~@k|H~)6`xnF0wyB1gUe(s#^{(`e#&i?XFx0IiZ?}v$hviZkE`3CkM7_dp9 ztFJHRObB#0u9A|Z-igqUbX|nE`bN<)RrDIk_Xp1R%jTTBY-kjA&(cD8fY>Wi_#fMD zy$f5llXFI0B`LkZ`NX%+6l3p`b1J?Ct^3x+{#QGJza+BL(w&cQkhBY*30Zf`+Ng`O z71zj2DiTfjcGL)6*zn7!{cV*F_I3%b+we6HK@xMBSyXz6dxWhcLLkKOZw zC)Ai%@0r#rvRZGI(pLk`5&xxB))$@pEJBHdbAf{uDv&H{CK z&g#mzd(P<0Ijy9v@a!sexYM;^jipMBaV~iIUrFJKudKEh(qcxj*ZmOke}&4}iKp!X ztH{ezehEJ$Q)Ve}`~1qDc*c9b9bHnGYnzU9V5#@1H}l)Zs}be{%%_9YeU3WM>mqWZ z7RTMgTKn!J)O~Kl)0TefKL7G6Ql;YDD^FVtx5bP)@SRbk%HND@1I7x`o4O68DtH|vF@73SN(WY1L`DSY;^Q8)YE@e64yJEXq z0BozNUu=Z4cqjVV39K`Y(kK1+4`;A{`cv8`_E2p2Lnf4*nc5GWvSybxD*COwiOxsb zYPcrq)SL<5iXJ8F%{Y8W9Kdu$0dpKl&&P)3H+Fpc? z#OcDETeWtn>@Ghe;jc2yt3XBrHeMR-zeuiwkq(1@3z^y0X|Von*}~;i@-k5 z|19@c!`$w6+`54}Xh&W!9RD2{M5izOSn3iu#z)xKo>L<_&+8*Pakz8Eb1@%>B!IVk z;VXpWTvs;@RhO>)1~qcD4Ar##}pB0hiMDa;}aw$_dVviNL-v z4?A{f@w~R{OXsz1Rzh-W4I!hD(O(wdqx2A8|KRs>P5%fV+eH6tq<^XuU;pGQiYIfX zy-l8_e?-^w0sVsx#C$@p&&lL_pnnSC*T>L(A7$Or!&;;{q<4zUD<`saDq}3*&o2H+ ztZ}vdacSUhfg0ZVtSO9hmcv@!#y?dVWN+0)5PMV~;R^Ae1zla&SiYfdL;23SjpZlm zHu=wjR$33>_kNCXD{G)M+AjMJ_Zh-mYdE{}DbCa6{KcF#cPMR6|C*`mcl}d7#tu0H z->^6}##{Eg{yBT#6BigiDt=xGB_B`y6#64;wxi$m**;`ngT$^shP^157VTl)%DF2B z{t2d=g}>>agI!wFSyhmBBRk9bN%nYkLDNP4PuUA!i{oEtzwj*Kbx!;qGRe;xvE@QK zbeH*?th65%|2pAQYv3KM;SXP+oK*0~+&^qggia85){v<5J%${I{if&KY0q3sTN0@HFE;`=<=!4Bck*K1T46t`76IGOpe1&#+Zu%b-oVl24}w+VA7{ z=!l@d@{h00znFRqK6VWZ@W3u$7a33BDA?IQr+e{Zy-D!GQ{c}##o<1i>5DlB{ngGs zI?5b1EDc|ukDZ~EF*Xjr^cA#8)|A1prvT%MFRq1M{JsBL*xwP^@k@LL`ZLGWUtDrK zcDU*6-^yekR|b2m9qh5*-5l62+s_>Ns+jK$vX;h|Q1(`fO{z;Dg6&(^B63o)O{p)! z@7=(dROr)E{Gn<0q!eVj?B7l9Wusg4C)j{QPPq35Ws|EN$pMe!KBb_q(?u^XNusYs=$FCQ$$3)kx61l;M9VA4g%^;c)^V=IpE*z90_DH^Ev4@hWY8VVYZvpn zZ)~P}D(m7O3{nn#0>57Ahhabb!a!T!1vbuuIwb42_ki)zci_UXcxnCXgDciGasasc zfJ^M00$02~mi^NsTzi0{QK$3;&JX|X7yYk!nNRS$iVF=6_b0>co~@kGD*RDoLy75> zLhMKf`vT%e6li{iA{*uKeTPY@*tXMUfi6!_4K`~kc5d{Ecb9$o#M-CMJ-+rF^Y=V+ z@thjvI`81T`bhg)tsfb`26ePKT{U^_Bk^GrTF3Z}N49GaofWiS@KlC=w-7n10sWN@ z{;J7r$XPbzO5x!rpnDlh3VJgaC2M=m;*=O~JYzis*wBaPomf=RTVzmOAL2Xq&~$s- z5oqx4IZr-tMA12Sw%1zTfEG7}U~i^wbT)@;6wW}R9oN$ik)@&i^$qCQ+tKUJH|t$n z;raE*`94$`Kq^_ z|L2-jS0?2b_4iN7pzI82O}=7w%AP3kQEM2&`MSu2@-K2itoDpeLY^Pt`D)x8r|wK} zGdHMiJ8S3T;3U9DGr>(!wNn29dqqS1d^MDG5Z7QX_JuF3m{HaG*j+ofP5c#c`MDnB zdX{UDGFD<#m3z#Hoy}Fn@x2XPJGhQ;vEN1; zAIHeE1HKo33fsO;?K~E)x)SQ_z4<=;_H1BGWd9e+Yb0jWmz8%j<%!-(=8UZSlE%P8 zm^(>hg!YJja^QFt(Aa;Ne)8*d_Cn9SoS`h|kcsRm^t{2YREUqU&=-7*^G4A=W7*?t zOBstI^T~OCfibGddc?Q5gZLJ8t2gI1t!~QQy?RUT$<@!}6TP|IR@YRXQMaYMsP6f4 zC-Te&#@y91o{8}#vV-sprvd%HYV0gQ&Piv@kR7_pBK)L={%aYbOcH&;Kc!}r%z$5H z`T0c*{G#`vJKaf%O8qApA`cApo*JyWk3-vqPoV6(M31{PJ~2`|i@pm!F%;eYC-4fz zuj3b8tLUVTLX$_K)0{+^mGGh!x{>(l4)yLIu)Nqy<@ITN$EP=yvV^`%S&ByAN4mP8 z?*)3H@4h@$(4=1Ulc^ST@9-tr7hE7T6*`OG*BsfSF_Y(faFETJfXAWNIpAP5y7MFa z8_rp+BD0T2uW_)iYHf#V|M^{ZrGBESb~?gTS4O;2FFN#4@`Nr*>-EXB25;jqVmeT! z0eUF(82Xwgc^;}&uffeeNcbW;IoB=FkS{@w`foXJL{@{Xc?$}@qWEA$TjmGP0q_>eMjzQ#AU`mpr7%vJLubTITyK6C6SYh$y&KGqKS6=Dyg%$a7h zYmF_-LtMNmt8LkyainrKti+LAvuou##?7Ht<6cSYcgT90a%9{|9pW1j88o)q>2Fz^ z%KJwcPqOxny6@=+;&c(th@DSaWSpEsx6}_$G1E4I*~@s5{DKErPvkRhgdW^wj&wyQ zWMLzX*6Awhw?!_7EN?4a}u()&p14;89;|BNBi97unl(p1n5}_|i*zgm38< zjqepdgd^b04s6256Ijc!|IH;d@Cy3pU+dPjHRd*P?dCekRXwjUcf-65xjW}=%snx0 zQ?89MoUTNAYrwa{dxiH3?-ls2%9uXRJlH|I?X#1@ z=(V^4qSKm;y=n*j*}UaBOUzQoGt;pBb(!ryUy&HIepJuWwUZj}bWfd%J`Z{)G<_EG z^3gjL_n*w@RfFj849za&qnk6Z3w<|Jc;+ZgPZpq?_HQbEJ?ri6qtHK-Mn6ZnW~3{9 zr;yXrp^sakkIAeZM6MILyy{y@MG|9A)^0M!PcL@%?qBR|+W{XrgKqXLYj_zmPs3Y8 z|8h&WVbju$y~$EayPQPdLea)Kf2U&Qtt^D60*= z`(bWI-Jf!c>Q3g?)t%3E+Tgp4VSC+C^eRVltGSf6o(B!eLq8MSXCrf2&L@70eb_nR zri%6$LRW~cT*FNo@cylEYN0IW*~ix|V7{$kz0=B^Oa5^2JGrFi(ATyTGixU?vl`i} zvN2p~ZG}#p6FmrH81r<~@wH<3&pSG3aw5 z_`TA8G4NT^0lRU(Ue6kM5NqSXtdR|@m5r>KP58E&IkQz)e{8JMmjVy=*=|EdiTyS! z6dn8o1zkEeyQ^%tu0+sDEZ?Z-$z1 z;QhAQ-)pwn80ORn<`m~_YIEvp8N|27jL~EeS^K_sl?)=f6!6d-{*1aNN+XrVHa=)?6qcjMrJXx&NKj1*YkS!9@fEK zsnk(b@D4T)Qu{Ogi8{CBi(~C-9?n1Lh?41xWX_E3o}zfVjLNHB$TNKJk?#T9t;o}2 zZ|O?p8}OuHw+-AQ!)xbbYdR*)R{HO4f=lfjY-|yyrijhdRC<&(s)k#?&9s}khhuY? zg5Pl$u~?+ePS*Kd{A&RB!aEF!#`Q7b@2wLX$}rL@-7s$p^h9DO>w!t0Q+O6V;IUMn z4lNG-V>PzoE@*+2>4k1|i_hs&Wqq>I!jc94JvQUE=c}>K z$A&$#?z6$fLgrtQjpb}4IfGm5wPNR~qWvw{D+2A$Vcp~*PXKS7ew(+*0fIOAH;}iK zJ=W51!x>+JHm9;*AsGI~h~8gz;WHbsfyWd7Si>hiNYHO*E9Gl=90_m54lXvPq{?sh zc7?IGL+c--w-i}R>~Mz4?F05j`&E509DM&h`oRv3{af~fjKM%ZG{`u_k1>GTw^*zD z#^93Po%Dx{FX&~xZ=Nu(u{R3;Gj|DYWc{ziYWZ#CL4PIrV(Ax&3nb%4{8Pl=DKM^% zs=dEl5!5dQ%+=t2Im7zwnto9!7kv@B2K-ZUpjp|_t}JNS3~1S%==tt&L))~qXLsW3 zWfx}StG`6&zPL=OSJ}g4U=K;xvcjLoI2zW)&tyM|?6q;AQ^I!jWoJ#VNPq5d(u2SH zs5xujM}|}WGpLi~-04StMw}dCWyaW4Y^6T)Sy-tal1)tgmZ+L3V0ZacKk!EfN{An{~E~Pl;ugj!z+et8)Y&E@Usk1@?qj1ur6hLc{PA0T0Ag zURByWHJ|@58fj|*k$b}MHCQvI)3U!Z?k177&QhQFkQ9QaRq&tl)W@14@2!jdlfoAz z%U-K`um4>*crx-VetClHYUt8R>Oe=(6VCtQH!N!&Gy9{;#=K=&Lmjf_kv54QQ|b^s z9kAv>JJB;MLnwa;v_7TFq)f)nd`p~Bd9(%{URNgf;mV^nxxa_|Xywrk^qXBp+z(YA zEtLDmxF4xJs>=N``z?D6l#yevjI;4w=+HgfkKw!Af0z4Y<@Gkb5Wh z6O~7gfm6z>jGIjTa=(Q8Tc}^|m)R@3LMi)B`oY0>Xesr0I6LA|o7~UlJ`4DSmtn7t zn??O{e?RwkQ@`AQm-~CEAKulK&;56(U+#;z|7Yrl_H;eWeIez`y_5U-lrQ%Sxi6u7 z`VkmCab=V*_dnpig7W2l3HRTle8yzg^Rtr;l|H=gIom%;n^*Kp^Rj>LWlsh1O`wxp zLK{2CA55nLv`PNyPW<<>-h37MrGqx;p;IC5i+Z(w_z1hF3tKN^vZ5F{MB>eT5}4yr z$Ru~$*Tx5E26C)MGb%6Bj1|~|B#(_e2Ixn;&=&H=Z{wVUpnOKYH6the7{1=l`As#9 z8-YvgXZ^@d)#z*b(XSVxA73FhD8{;(dzlN`I3$f{@0rS#KunECCt|9=6Q|3{RC zj4v@Z7m6NQTX!&4vCX^Aapi*>(a$`_+nZz?PRcd^x5|~Z<`H7M9H*aE@G+6L%Cn9+A*m zUbfv_C%K{)^Zn`e*}J(;az(9epWVb+*}J(;az*`SZf?`N^LU=e^E{sC`RbB-xI#yy zmxWTt;Mm#)=+3klEn+7)q6_o3e?+VxbjybZMX!I^6z#IH7LSThT`Kq<1HPNUx8OL` z0FDLUobeot>ke?e9Gtv-3+GePW+^w6HV^(EZu1z6ugznJ)h@7I)#i9FzB07AeUN#5 zqlq|me_@+LiHU{ZP>-~E25rVxcv$Ss7ne+DK4&toGmuM!=fA1(d~Iw)lYYWnIx6Rp zgU1e1iK**gf2+g`mifo|GCw;)xf^`^cx{}-*I<05yt(rI8Sr9x-T_t zV*c%7-|V@ihEe#`XfZ>MfFr5rDeB3k{HN|Ut^Zrsv70)+3g$#$E&^tOQ*QuHf!QDH zEErxJefkPz35QqnuQJ||v6sNZb}9AZkMS`)M0AM6cxoli0hiKhBWBnNc#V3O>NbQZ?rO%L z==EgG7YtMSgb&FaDMKcBjycl!7t9fn4;cTZ@-H@XfE{t;h7lXbBln9uFN={?#^KY1=rvjyyZtD?Ps-##BopWpjg7=F_I)D_(4pFRBV(6wvjmi|oTP@wOxT#JnA z9cV11vp$hEo~#ektCgMve_wO z!il7L4)Qg0kguSRd^I=f$)D%$ zu4~IZS@(W3G*N3ifC50n_Y*ic!;R zi*6=aF?O1Vwrf6x+5fT10`1mxe)yK8d@l$m*@?;|nMV>2U*=I4>ozyBR+5Qlm%Q}x zwIftxXB_X^(G`mAb4P+wA+n0BYf`{*V81iCW}QIHu}7E6zTl_hiA7{whHjAW=3=Uw0z+rMeGtw<-_)tRl-^_SoHyvWcen z@e>~?7@tR)NBS7)W2DcLK1*7WrI1f88#6M!b*!Uyn?gC+Hguura%E0e%b18XxV)To z)T}df%HHk;tT9)s?GMZ(PDAQ)h4_J{7S?5&{uCY7(?yEJRTzQK*U*+gYy}VeP;ir+ z&Qq-m)bEZfUtx{EdI-9{z)t@p>Zz5RY#+oAWzx6KS!qW8T&p-uGfvR)H? zwX6{o+Gtu*(wj{g+5Efr{S<9oC_Y~fXnrs}vX4Pvc?(^nmrLS0m)%m8ywI^T>F&^~ z63${M4qr5}En<T;;7|Jjz;G{dA z)`bTuOWO`GcedH~SyrnNDdukzj|F(;--F~omvGR6ea>m742c_cDGsI=f{q`em z%$Lay+Mce2d29b;)w=8uwBKdfGR#W(ylmAxCL27l|{rDB^=(P!%5vwGGMA;?#u$XA2VW2*JT z@Hsrfn21NuJ=|dL>m5Y>Vk>05AiBUV=Bk1D6f5!;baN#B^0(3t;s={V`nh~({2a$t zc!II!Yfp7vGT+bz_f(_rF`~~u_I^oQd&GZOl0%fcN1Zl~dM%>ElFm6E1&p=yD5XMl zE!TH`(^aBZ%qgm39@ClZx}h_LHQ&&dIL7}m^fF&ohYIcc1~AC~f&A6r`#A8(Su_F@ z<0enw6_{%Hb_4nKj}IM{#r{of5*0>ur6q~~-K^t3PE_2&13%#Z54rxtb<$ssjKM(L z9LP=x7PNifdK}mub4!PS6&Z3g$ib$Bm4P0p7o)|p(Zxa<<6$se~@Wbcbh?x62) zXADedEMzh!GSG25+>8-TzTCr^JSDYC{VJ~DGj0Os?l>Jj`94k^=4}M$;#2T-HgV{T zC!cmG=s1a2(>D@*s@Q{xaj1XtFK5}WEb8Dpc-`zP>iDwp6exbLMO zEvhA_8NJqs!eOH%#+}5PXJ1)QBjfEkz1{Q6Cv>B_uu%;Q|E)#*Iu&rVBSNVV+O`AV z!w$yVyw0hvJ-QKQqdLqyzcb185MxgCLE`_uj`(naemy}uC2!!{1MHO#e3P;D2fj-= zl1Iu3m3Ypw7oM}|XM&fN#QN)?e6a!8dBzrTcTf0U%Z*PMNA;^w&SUW48{r*U zl{T?cM2p|%Ic)Fg)F(QiH2OaonJ-X=%DcD8cehb>Aydbii3M=HGH%EO&Uxs7udu$3 zmh({Zg{DF)&(hX@)~3greq>2l6gQ+_)j5Th=rLm(w#+idvPO%)YM*>yU3`>%F2y(F zQ$srPc6;9ld@2?hlvju2r!I3}_*5x!eHD6;d!rlH9gV6UvVzzu#88N3-V*bVwFs&B zZw}|WI&TvGqr}6QBnNc=mg^O+?`K0(sjt1%?iSjIOsCNxx&IU&-Us^oUn{D8*C*m zRS9Fh1zpY>ctSpVV}v%95z9p4_pBj)kGwkror1RaZPO`QyPHjl=N^9>rCkHzVMbs7 zCYuyS?3mTq*{YDEbKnc%#J7n+#y+63hY)#?bIVeypodQC4ksQ{1Z&qTz7@jH zfFV4bZ^)%re5-+;vPKRkR+U$8&e>|~v@D>!RN_>L?#RhGZcbta$$2={Nj>e2`Tp+VN8;V9jB8yx^TrzrVt@=c$Zd^1f+YLHJ{QtSx3ub_+OaXWU4fdFJfl zD&F14{c7TTy}%xzgW&GmnEjR=HXrUT$Fd5~iAp$RiPS}=>~Q#ScR7|-(6>S#?k>l& z3i?*#!=1$WI-?KI2~XH>c~Ol_p}&Xx2>dmu?4^8pwMAkrNxaqo`PWx%YQL?ZcKNiG{8xgG@$<#S zy-Tv`>%r9?3v$v>_LMAQFU`L&x7_|cHZuM%1o;XUYd+f}w7osW_&0qoL)O_oosQV{ zW!}qN?Bbp5!x^a`>Z)WemVmc>k^SKxlBWb;#pLUh`pNj-WqrK#om*|np=9#P+P{@? zB zIcSf>NE~=?7PN+a+}okC1M89vlc4?3O9S+B7=AiKXK+EU8t3|G+76AT`SA4#x}R@D z)4m5C{qN8I23%91mP<{%Q6`kUxqv1T)(Vy@6CTh(>cH&HJUev zf03Iel|f5iU_Kuhv(M6C^U=H)FU4j<=Rs_?v*ei5Y$`c~+pc`w2* zqTm--e5>)%yceN)r-^NN8r{lMl(!F>hi^=Dm8w)6c-dt+pv9MqaFx+kgBsxyJUgKy zob%&Z0L@zfz63{3a8wG8vY|UEstFvKGYw<7+S|_*=S_hpIzuY0g^+;^P zQgD+6Zj#4zu0xNp)EyDs{s{6fA{UK-xzh#*6s@Uhg+j*}?;#qYg|2saX#B|F9vh_oKjnT0Xt`;&*mr_q{g+|4FCn zz8U!Mdu*u3zAO78zH!#%)J(U57!cD+n%ib@{S#~AE_7WMDwr<)c2IP&+~+YCJ0?l-L0`QNV)zjelqlRb)Y z^j~1Vm&^l+Ya{!;R;|SbaB{F_Lpnx!oa+SFbpL*@tM@mEKE=iuyn1hgnY|6dV@203 zI`x%u#v6M66#TaF|8nMZxGwGS@(%8u!nioR0{>wrV|cYLw4Ql7Bovq!)Ag&d8}W~q zJydhnpj&xCb+Gm`I`?+0w9HPld!SY37gW{L+QB{r=0X8$nf=IFGDlk9lsy2xbLF(y z8FftDT6%{cTo;OCWFCzc%}i80vm(u| zmghqIvXD;&<}~2VIylaiykT5Dv@05U^-%bd=C(77%X)K>b2x*<)e4VZsG7{P`9G~> zytXf=fjJ;+4wi7a{s zr6c>|VthrP09HG^bgTh6hUd@t_BpX@zF_}^eQ=I8z9v6E+pVf|t%j+ER#RzhUNw5P zoA)QV+I4pA`%i9T?A$wLeJ!c1aa7Jli=SF--5FsoQw(#hI%5&>{rR6Ur=uKYD))?c znJ00oQgQ0H4Hotil*W(7p9)>CZ7M0{={QG2;)*9whQ7z~dcenEE@fq~2Ccm>=5?Jd zC{K9CwRs*Tk1;6ECzs2~z^_6p=K=DJ3Ca_FxtvRRzE2*`i@O9*-vH%2NS@@NJVOU4 zXEAxAgYsM)pq#nnN%Q5g3I0ZAX!Qy%<2nCY*5B1n#JpaugLcUMk7Hg>`5}CP{xd#S zn`cysv13+VwV%t@zK5~*S#8_!pzU|I2jz@y@sn|_tj!CDFS(%K5!ULw)yd=6*BI@s z%Z%-})phKgwz;Er+Qv0X>jutE39pyD;jWsFUDIki-k7$mj%|`DSHl|j_&$s z7O*!t{%O1TM3r+t2EVA?JO_Nznvx#U{G+z;{fE%j-G+xbvv;obZG2B6$-f)FnU`p< z?A2)^u6(#|k@aoHos_4Q#k(`NDW0p#lkev%`G@kFC~php?dQKUX)5pLSzG14MD+*_ zO7Fo(34PBz=!*$DU`FpE`*WmCrL@WMobUWVIUg_sJU9%6*39LX``O006Mae|b((3n zmv+zdpV2oToZ-v%V9|*A)KG1BW|JsUWG%lsktHr{oUjv+lmnoQb5nilJ^g(|J)Pq?4RyFSv%q!&qV zAys2NVYiXTSbdv0lzT_4Cwy-V?dASy&O_+2i|JNTOq0HSbp2Mo{)NZR&QT^Tk^!v`gpm|T7H}96JVP- z)MM%+olJU>^p>HX8SulY`Ro&T*xq;ZLVI5&^I_8ZtiGhNVozefSFJMVT}63K<8_Y9 zye@vdu@8Od(>Be{9owSwe{0a8BRzPpr&w%}Dts0mx$;xhV}#e5oF#3mK2ts2#9UhW zpQ@+*{o*gGb?QZdLH1yb_-EEv^I2P!`Qd2r!vRlO0H2>hSxI9R&w%hW{O#cB!)LBR zKhk*=ouk0kHrL+w%Lit;HQa3S!-T$2U@HD9m^KXzQxgBI08h!_DGNLq!P5$Gl%(OP zSi@0QX>r>M4M!zc;;0ZDea8>W^L|)}EiJID_$pYQ|9V)Y-G3=OpQ4wXGkln<+LUu~ zW5jg#=JEIwvbI)%LHL<{l>a??MtN`ZzZbkVBA?h(ul()^{P#`&`)~OEEA+pw9_Hh# z!c$dvssf$Rk+zJ_b{E4}gA9|i!=P&P1yqEvkTNtVN z-cp8?)5O1Z?>?Mc$N!u8Ke67_x+&W6rEu-O?v86pXQSJQp7x&i%cZ*#D+{5$YcILS$%=IauykL2ekhja|QjVHdk7iCoiZG zol?gBubC$YzGR;Ky~bqG|DyR(RR6zceiYUJ@0lM(^;gahp{KjAyF4c@(JIDvfaV71 ztBjkkqo;q({3v362p_V4Lz&~4l5=r9^JJ%gp2+xaeE?nE{_(C|L32fTN^m~mDd(6c zN0=w)nJ2_{y2MisFjqLsq4O;BgfhOACY)!U460KDXm{~=zo zi#d_aI>-^8b8%Y=_JbgqYt7y?*T!&rS_V8#bUGpMmRe*l|GMHq8|xL}E27uPh|9S+ zi+^o4<@F8lA_sX_@_$0m{|fI!pEcKCp6Iy(x~&5K6P{L$Ex|q^=b}-{q8#~W<=$kM z&1g^KOu9%LaOhb(%|pjhgU-PSzX`w>tSfV*=UhysjCjf|pqzNoFEZ~}?oGX-tRmhQ zQqDkSDEw=WW<8f{@7o-4r~7k!dmO*cz9{xzSp&;j{=(A!*SbF^)+ze@E7p&RzW+95 z@b9hc*YST3UPl(Pj{E^@uda1jeMdj@>FpGJY>xeB_C>)ddxl>(JY1VMn)>WF`OCw{ zB)Ggw>(0!aif2G*L@y*q~1#AxP zb?B52CAqp&>~68gh;Ae~bmhA4e4X1;W_J%8jNe_<0;}lYwRi}`4VAbYjai(XN?x_T zMq687h#29j{;}Gpy_3EFthcMN4dYMCnWDtHsqDoqy!y5-&cu`d#U^CH&!`Lg*@}%} z_1z}od?xEW3h)^yGuCNXFR^KL{_?wqUG?8E{`1>0B-Xz8#uT7)Qy5D|L$L-gF*@s4 z=&C*a_?4!h=aX^`lxr{!ca6Ti&Lg@L#ea63_{=3mj&>=}h4ighIBdNt@nZeolHx?~ zG}@`@Gk`fMj=ITXL|^Czej~cWB=cyOG1=frL4QizR!=(mp;LpDNoL0WD)MGyo6mMA z^;_{rmAwg?O#^#|6FuZ=Y!U6)^=7I0y=$<4l~G=+s(b@`xo1{Q@VhwQJ8*P4pVjvc z+rk?B-+cdGr@iaKCa|h%*!ohv$(2nklvHdRRlt?X7!|u`+NN>!FH|n*Jwm@r{0!iz z7u#PUb{w&}j>Ar|)v9<>52m_Gv2{qB-omdvhW#*?+J(*Tf3#i1(fG=C;hXyxwF@6{ zIcMIBjp*t&d)ez#484WVf=FtTulI1FTOQSVh}~2wW*%*2gkeigERaX z>RTDR>1wzaXBGOGGYYzwyz@dydG8B4<<&I$WCwUP(jmnPvR@c#B(4?d->Yoq#owdsR^V=>FV}q9|LS;f zas-^@5Od`+PQtZ)jDnLRew=J%d`tXwNeAk;RN_Qj({CI8`hGh_EQtTV-+W{H>hbp9 z?YH=kvylt-9PY+;V#9W#z_*hlN4QdkX3GANzT}Gz&hIU;+V&S%6GoI+We;kGp@4IH z7g=-uImDyUR{Zeu#W$HboX@yXp`}8H^O5mQi)-^-->+q#(W-SeXX*BUykVlwQ`DJ3 zotn%-9kZBoHe%iwHpCMH+3vAXpZMU`U?)!+4iBJgCv}LuH#O4aa^kxsd+r)|zZGA7 z@tZ5JSLzo+(;qR0yQ1!x?upZlcG{TRkH}sW{GmIkBaS@~J4xmI4tQeTH<;6sP9cqE z-@+#L5X!#IqxdZ!^T+=U<#`a-SUdYRXYAbevBZAc9KSGD;=XN(XTN6rgo&j0k>-&; zy!vGMW2-+de=KD~#K)Z9`|#@X<&UhsP#(qedF{EUykhky z)i3o+S*k+356aVQ+KfL1yWw9_rkPmR$?QRwve}q3$3(fw;cu-=;Ve6;)3m++HPPia zbN|PS{liaVlV5Qt+ZQhcSXS=O?kmBcXw`e!eWmybSN{=t5&4C7{Y=_rCSH;g8OrtC zy&le(nk4Y9*kI~g*<|Wl)L_+xh8idIu!^|9=W)i0YaR{sa-Yo?2`AE*@BChPTV z_>aU;$A*lbfZ)X8m%o$ur?>+4UF7*PnF9*4zsT-|gRuYk<#L&i0>>4wj#u5ypY^{c ze(d;+tiAf%p1%Iqcz-wmd(LP5lLhuKi;3Kwh_5(%8pLlWc#R-FQifSJmjN5bDrCwO zW6Jsf%o!>+Y2TV7Hv?TwtZXCCBs4SzZ|hTy)Em>gG(GkoP!qFUBZXMBa+rd-TM#y8a{o>e31$MBT(*AKO~ zKI!kPU!yO+p=1BF8#@k6o0#Qjy{Y5iv`N4}nf|<)zL@&Q8LhWCc2B$2@#|^R&SbUT zMq9phx8wEnnmyB!YW7Y`u6b)(N=@gq)V=oCoZ>#xM_wEAC7WV;t`8@FWY;`+l@8dp@=OlS9_Zhlv`f|6X$CbD^4{5P) zKIH!!w)kv*yJ^p0?tNtuM+bXf$gCC9BxZ@e#=1Rm%Vj-y2=_j_VLN(o-?-XES)urv zWKu>zUp|lf;C$0B{kL=WeC`8dy^b+1w#9jr5fWZ~+cIBW4`wnyr-M^J9v+lhnXn1?W_s{=h@6F?*s?vo2d#jRA zOA-=DSOQk65|&hj2vOOgQwgXcfgq7?m!5e^z$HmRFxo1pkc6NexX>EZ?ssse11Opb zM4MJyG93m2Y9q1j1|3KHbtEiGLIELeRA@23?{ljPip8a8c|V`u=bb<9=k8~D&U2pq zJm+GVJ*wwOQaxiS0aQ;g8eEA|0APQ{Nk|2z6HEvyfZ(WaHaD*_x2wf!;L zeg|#8gSHQkSDJw`eSKM~H&Hc9B zrhqe@sX6eg>_sQ94dlE0V)nlfgG???a%jwBU7`m&jOZ8rC4QN)Gj%?Fp!SxRKg<2* zFQ4W9=|YZ8DOY7Zp<;K~a<8s0?C5%de0(EqN{ho*v@TJv-x`eHmYfrL4$5~Jx_4oZ zDq(*<^I&We>}xhGKKrc1?V7Oo#xTD)D^E1nl6%Sn9dQki`Yw z*=h>%G2_VlP#vaoy{}%{ZjmR<$ll2jiqjCG^f)5OixHH+)lY~Or|l{>aOI@soVD}E z%|2|<`REA&8Ku|;Y*^#qelmt}8@1HkBY9jr+}C_q_I2nR;frO!a3!!D7UYS>Zp%3j z>zhXnFYwlsdRjtsOTNwH`O4C=mJlBe{WFa3j6IffHPF=sL7JD!ccFhn{s8ry<(%2* zKVVj^JxZkYoMPsP;fUu*=usudR{EX zN@CVGkPlSs?lN|AUj%$Y_mTr7d{6Vv)Rsk;u8op;ln;)4P7eDoSnr$2ct|e$dh#m0 z&GUN6%K~n)9=f{?y|u)Upeg8FDt2zM=Y2)p@~(_`0UW%rhNLs~bvVT+a&xuvZUb}B&b{o*bftN?f%)<`%|rA!2lG&|7u$}8%|pdL-?lJp z9?CkB@OdcTTj{g(Yv=hnc6on7b5g$7g7a3cpW|BQt;#$VIue?L;PiLS!41s82I?bz z{rnu1`PabwYhW(E{EnsPmA~*_UGnRO1Dt!09cXyp(zEw$<+}|ZTY5Ta!rP}_3<8k)P8!{fgKH$%CMcO{Z17aYurR_<*Fo@o_7Zf*dl zbD?kT$Wfs@#%bKU+{&DJZzvVHz&nID?E4Y7sI+Xt8f;2cYV!Lg;ON38kjHv)$QJTVAM7+CM*mJ!HS5j_~hSuOfXf>0 z*K)u0+)OR+H;UH zch4xJ|F!Hm_c_6#G@ieHlD$Ciq1uHWa4j&H#h7L=rZLN~vys10#;Z)uj9DIS)1NV( z_J6gU8wLCvhb$NM=TiKXGVR^;Te-O3^4zVs_9#79~`h)1NJ-R)?%9-zT}cI z=}c@6hnHU78{bhL{#E&3{qy~Lx%M|MZlC<`+)unR^B}xj!R2IZzsFe@=GqTVlMloc zQPn&M{E&aLfJylGS->Fto^SL#zUhp08ZZ-hRi0D3XR=mZ{E84;hS%VUkmW6U329&1D% zlWUR38sP)kVSJzo`}2#)202U1zZPCF6JAiOlEaLg7FSV^`1z0{p1_}2C-ttO-g@e7 z2amRtF7%gOQg2yUy=7tbmLUg9y&|)T9O$9m@?gDgo=xXjgBq=Yw-x!|vD8aGbJr~D zBPYmy;U%)3QS!72d}Xbi3mK^l+hp1faIn>KPGyXQ=L?L($73V%rugteyh-lmdKmoq zAU0*;O(x0}`WgP8`0MJC7qj_J5)7VRV%DbRVyqUW)2faAC4%FNR9{&BZq-QYh)}@Z%e=4KJ1IzN9Yyn5`z6$!W!Xr*&kT<`SfozM6Z~ltQ^v0h^U(SJIa+f z2x<2r@;ONkCb=$gxtsSY{_&+(S2a7;zp225i?~js{t|LANd7+ZCN$eQ ztBkSyUo;LLCijfDem{x5={6baXm>xkFJ66v_XxQVj*^c`+8QZymggdm+t~y8t3FlD z^EBsZinhAc_+JPZHFC|t2oQJ7J;KO);W|XV_m{Kc_!EF9qB~}+~$VwAL82*@ZXS4ZdPo{M{ic@K3Nce zt@J^1ITgXvkK!Zx1Ye_k8^yPM__o&==&RHd$iWrNImtMbJU`tFuj}a`XJFZj*L!oh zzK){=K4DT5+f3&gR^RWCyf*#yy`DpLy^oG1I>Aq%nHJ6u+^%}%IvlRTFMvm3i5xOE z;NPWrDuA~>9$)pX>ensszry@uYy&Ysk^ixI=nmjRf&y;pbDVj3>D~bPUf0wkYrmwA zc4(iB^Ofq>^0^Ee32W<8s}=3QvIMj2(`XkM#Q zmk<8pkM5~g)$WylaX%z}=Tg?i=N)2CU*t*QlfV!^+yxs;$qMGhf1)kYhBjo0QrZy8 z$13_~Jh)>aA8UHGfp{lN<0ADoe|h!a`4`i^d#)lkD(yPR(aVv%Za}lA+E^#~SY<7= z$jZ>uxmIY^jN#U2ob=5^z6aN%)BN-JUiz|;z65mh3w`OWk-fW2tnoLq#@_-ButEc( zp#d?_0HdBWP3V{4M|-A!e694Ib!ttiik?^NY3Sdo-KM%N;Lfy{lFj z>uL*4Tr1w%`4;veA5Hyv6>1X2(tAU01o+rK*Ty^1U7StT|Woq*EQ#k6cZz z&e2icRr7@=n6*_&**zL^#zVw@ogLZ7+mRmWt!4aHt*dIb0CT&;^2{McN3*VP&aSxw6f{a1mTX{~8mEqJ+#|D43O&FD+s251%aS)F`iYITy2zrQb^_^ZDF zn?T=*=L4Um+zmu8Ym8GK z->rs!t^Nsla^btj;Vbi?rS&#L^Ks}h`8B-9Sz|cwoZ^+|;Q6}M1Js`5?EfV1YWu0O zr&Dt^Fe!n4n1H1tvf&wN8~xV#D;$|)m?^W+T3qdnStEA>@P;WE~nzHzt_-gsZe_6(|;YGPEuxLfj3vj zCzJ0adFeIqsdQ<{c5~EC$opQ-Bvm-4T7PjI3)n82S(zNrGP zvlzEp#yT{{=I-8Cr5%@!G5YXaz5WRBIlO-8La6??)C=_=0+)YC{SuR#%Q%~Z=d0yR zyH|t9GX#(4BWuuJ6L?M`rsapP9S^=k!>XuaWQAlVzZsV}s{t&Ofwm(BXkH zp9NQ*hRz7S)PgUyw8;$4sF7xHh8*1?oIyU3`y%?Uz@z2dApN|g&mlS^bJ+w=C4x^T zaK+^K*YyL`{;S9EU$Qd5XMxU?7?ieEWjW2Is(<|IyK=~FVfN&;)+d>q|GNG-xzv-f z`B}HEUJp)K)5({k({tK$rT6))7hXdd&@j(QkwK{s`mI#~Gbv{gaYGU-BKUjhyS2pb zik#;N_7!=lVjpG5vydz*0 zo>hfvkIW-8^QaoSAEM8-)FHIH{u{G*={FbXixMySs%F7gX2M_c;WK&gn;GOi%=N;5 zbXiFFJ>&U`j6o;|jhk`PWtTk)IiUmlu3f5^h(6N`kGS+Z)3?Y^;os{r1-P3H?4W}Q zq52dzayojEVhWr)Q~zaA$ls*@1I>kS3NKwJazSV6Zr#3Za>E-{)pL?LY(_@T!k#kB zgiHbLZ6zm)7u!Z!1i8u^rhC(FEAh{`t(bXYZZnbV#3c4PXuL95e5H4@cgvDrhnFof z12{ET;DrCQhq3G)1&%1#7#ROKGl+dfYz>mrPs)?| z> z{aWmWRrFyI@Xk|Xpxf3qFEr5!%}RgN?VrWrQDfTH#6Z*OoAAk6vE@R)FN_T_U+$5N z&xDJ{=Sn`65UyB(zb;pU6Ak3PxgS2g)1Z3DPc=6iyhvl-q%BFlw$ycl*ZyJ2*9tai z;e%;u4bP~N0UNam8@22U7}B@Dx<&9V;8!szZyzv4`#&>@ZRT6P*-0FwhrW~Vv{1$- zq}xCver0kN*|1Z@?=&QMvgz}u&$Z0(+sqtuk;ktx4Y_a{0m9a|e?H$*Eo^Kw7%rz?wKb6>ZXqVkk7rMUG<`fz$>Bn5= zbwG~}?6WAg68S$gh8@uE2N=VHjNw{f>M)>FjzAufxqVxy-^9GWPBpb%sf=$c`(SW< zBu}m6qz#NuV&nUaPlA%5y~_9;G$iWd^C9CC_(uGC7q{_0)33c@{aQr7ROuId-$|RC z;Ag^zrT+hlKK1oxNfpSi%N z1imLWxmDOG!T)u&hO7Lg@YT}QRn3*LYER_=Lv!UfR&V7uvEIsiu{9tASK2s`yGoIP z??t5sue@5zSmmM%l!oa7e}r#%?&5oNk#JpL zBXjfHb%CMhbrG>ei{Ll!yO}$0hl|YADYq81|=(F4;jG` z@ELhp*FD=){IAKLKQc}-Ch6GcN^ih+yMXqi17;z!y2aOnZpv=l<3ciFNXN_#&XIQT z%^k8;GIr;$fo14ga86`{_L_c8?KSZnaU6X)VmV?sqB*P_77jCqiK9j@U~B?*H<`zBFLPPujoxP&1J%~A zgSqOYFTQKpYkjipw{G#W-*-<>y45Q@S8NutpLd7H>^($2M=1k)>Uh};wS&Ca9XBGc zu$QWio9sP)5pH4=4&i2JS#yJI%G6mF6U#iw-3IOqmmM9Ur`wf4*&g$amj2e@cQnbP2RPs}Hv8 z57{>e9wNNcg}!VdcFbk8wB?^`T%83TihW0P<*eaKMG7=baI%~>*wK?la~7L<12`wX z3tgYZE{=?!sW9&!us}=1kFmdZd}WT&U%A`hCy#pbYV<7=_)~)37n*w^`)DqG5dI{3 znB=PL1RpxUhmMgJZ|5}5f&(MXUXj&1Z{!*r=}fhHi=-@YI5aQYYr?L>=BvP{5}mKX zc>860`m};4@aVcrZQy6`&PM-xQ_TTSJa)KX+G9rwWItpNIz=%ug2KCSox+MvVT!kCCiDk#IJQ}^dyrRL_P5q;t>l_) zE@@3`Q}8E*+Pv$_-dA6w%`(@%ZST8~&3hg?-XEc}!oLTr1`S_N-2*wXbq{V*>X!VL zTzu?z;sPgb>!Z9X^GUulsY+Xk;E2xi2m37Gm*7LlAJ+a&?`!Q5%Bxa8I%M-+=3oPJ zyCis)Z&f9*KDlIHcFzKyI~ZSsJPY7q_ZHcU*#M3Bx_7+Uhz`IWr^w;Hh3KPZBlL;> zNm~uzaCm!VPm}OAhPTU&JhlP;C-2SZlcn^*^?l#tzY6b%&=To~oPS6^Jit!+k$djq ze!Ly*hwN`7bIL?Js>q!ub(s{#6y2wzZ`C^SPp0uc;6K0E=N8(ts&|^$*ZW}aFk$yF zWB;&V2eD#b$Horb4vlpPw@X%FLx6vY?0O6Kk6R5o%=CB+xqm9p|C;z(l38|}o(HYO zw_J&xp>$h)(s=Zu680wNzWXG7D}(+-^K90K3;iDA2~1{X&Z~x)HuO9n@ln{u-A|Tc zH$5YJpwXA{(1$71C;xRklzekKka_CK z(XPjq0(T`NBx?@xRkQy0On;?kGGzqpiv1f?xE2_S9O0hkf2{*vNKX4FlZ``tqiAnD za=QE@>(a^7TNwVHn25Q;gZCPcx2)JL4T){Ck3>gbWH07|j8jJ+rN?9(+V+)kXk&7= zyE`3Ta-4r;zZjXHcG2ZI?5tnwfG3N8Bot>NdSx<}@ zdqk*T?0ZBzg+8ZEy_`N*O}RjyOVB^FDv=HPE3Dlg>N^R|@4*MsgZ)!*+<^Tw1eXv@ zWDMk8$`#%T9FrBpwyKHB-0_jXE}eOTY*U6TlehFCbQQDD!I+xIx+hvP$-zA}?&cX+ z4Z7Bn!L@2}S)A^P*5U4n(GK<^_@|P0%dWcTW!K*qy==b9JrTQbqx0XFyt|5L*xx1s zSIL{aZ3A}30PIXYp+nLJu@65&8~yCRA~O%YEA8A|KUwg*|+A^?FVq^rLbsT4JXo)Wp z{O{pAdA8e?X()`j?^lol^gxi)4cKG-d9RpiEGE^kSL7&VN#m zzYldGm)N1(g3r6~I|-g8tAl(F#!Kdo$PEF1Q<%&j;eV}U9r_~k6#3I5dq|6p+Q9#! zqn3*Q3jM{&`BMAw57kkja{+lLBA{>0f2Yl4!HE{j1wmtYQZ97BTI$(Gzr?3D`=`lv(Jc#H92H-4NfC&|lGu{m9nX z+_niV$eQNvPE$4%rtJyPrd{My7z`f>%#p#qT|t^(ORVZ4$_bar+o^MDX#PR-JD?f8 z>>twGPidC8m@MYF>;u!me*v9VZCWApU585`7Dwnhd&SQcTZsFwy{}2VU(rsXPZGb_ zfxg*8xxnpJeg1a$o}a&=wl%Qt)1|aQLG}*O2KhgnCxz-yq2I!P>|MRDb)e7cJO#a8 z_{m0a#yob{#8npmIMM5KEy}oX*q(v6&LrQ2$U*)ncoMWlXpM>XmAzQtE!D@@>|1-9 z+$fCi>ZPUI_u+NnPaTU^h8;t`6I)9uc8pT=FtK5jqKDlrGy)kdMB6T%gSqGD+(2xoGm**ikW5sjk3jF60YybJK4Lu6q%_Eoi7i4&xyXL`*o1}i6_#8 zw#vL*bObvi-^$#Su@blo9h1H6d-sT(Xr^upZLrdoXxc;!#>27fU5Ad(o@HXgOi;{q zrXu1ghA2IW#7GV*GSr!Ond$~?Fw~ja1F;w8Dr24Lra0rpId4BF~mw3?l-9Fmch zgg)dF-%*Nq{mU{diaO({5ARYHbuz%T5tpwc5r5vF_I!*{~h!5Q;KJ-A}$gOdm z^vT4!|Bzfyr{|8MKIyl}`C>;qv`7BAz;}zR%q46>;un-PHpK<_N?1e5J~`(?e1Bu>qSsZsa53kz$WKZ;OM*h&@fW#fcpaIj~b~Z09bq z#lhD@wz!fYo&{hXh9Iv_VPgov8`e+EeGRjFz%YFMhq%6e4!94IlYn;%T($Z4@8H2g4^PAUJ*CHExsJDcA zO%jtpUFp~!4AgC$ZsTbGUV&a6vGdlZcx68keLsp&u0a)jSK51}GMJkQ z{{th*ar50U3gJr`bA|C(Cq81u6!bM$U9jVve>WxY?)zXX^EKqtm%Wg#G)5Qsqrp)b z%a9F8;x)tX1%FGh6D4COGGiwii%rOkooF2Afy||Ra8woBk>Kfv5BQ%li0?Weo0=xF zehR(feT(?q(Y29dL?-=`YngW;f3?I5i2h+x6WWAlg>bJS#d*Q6FEI?vi*M^s2kjOg ztrK384Lvhw!)GL(M&L0vfXjB`RCG9VFK2VLyIJ8{_Y=ZzOm%^HF!oIke8=38@4l_< zKT6pXu@MpPqL5EbFPr=GWpf=~HW4#{Z-V81-~Q^C;)vMy|7z^h__;9(T_h5nB%<+b za9zZg_@!m+w!_OLE?D%@T6jt=e)v^E-jl(z)##@AkpZ8U*f51odyo~@xUzfJAbYMc zo3yo8XZLI^b@}t4o#NYa02}N&oa}3K0@OEy%K|X7+viM@^X-|GUx3``>DphE4R&c*D zcxFX9_BD9g0cY{xn=M5Rg$nB&eZ<$F=v!5Ik}^&K*FO>8b7*NvOAc%P9i|kUtW$R& zSB+NgvGuBk%r5rT>OH3h_7qjk)|Un-6PlPG+4KjVgH3RNZzHiq{|k6X-5umaHf6`( zEcO3|IcPSbPcA0nG-nA_5=9fk& zOQant?GXJYi*^*#jw!U`L+Z`Pt|NW#WF7FOb;m3z@t;EW>jH)wuXkTo_Za$~oZ`-m z+pQ%f8=^gNzg?5`XH{AH4zh0-bqaryzQ4-4m1K3GubO%ZeoEK^|C7ERr%r3Izx1`= zN%|YRq}1Oyx{G?=X2)Z2w#C;86==F(TG zH;a0uzcLq0?A88D!71hgHd@b2!Pzo{j%yM-XhLV$o3eMk#9NE}UW<%yAGlPD3`N{y z^RDIUGXgy4 zH}a*`1N_5bZ?Y3_4ZNW*I=pW_(|aD?m)85;u{`)F^teqKJN!~LN&aL-^;I#~1)d>V zx&`|BKz{^nI#aAjYf+q&_SYpDGqw%3a2gUEZH%RBi-n&<5EOPr> zK^l8Phwp&%|878DmVb-DNu3r_W<$;8zRrzTv+jSI3SM1#Us~ZQwa~>h_}eP#7y2l? zMdbPrjT{S&6kE2u`;ztF`}qDXu6xLJML)0G2Q9TiOK)S1M+0LN!g&k2leEo+T!E^B5y$kd~PeL9J+7kXd!4t+bQDs^34cX8dz^=YozZ?!F%K6i7S$#oXj z!M`i_&b(Ye+g=O5y}*>_y2D|=M&i!LI1uHc&3 zG>#xQ9fjWrE!kM3?w56qaxK2`t>m+G_F-+BVTh+}&##i&cCTMwPv6qK*$XU9YrcLQh-i6FfxEC%FkewG;bZ4K($3>XUkT7f-H9&xUO?9@;{G zaDvG50|o4Bxwu-Xy9u~U8`Q6ivnyt}G|}TX(4OM5BEM2v#5|4n9UfVq6rsdvm1>0V z6RxjUA}uN0W8c)@WhoK9qdbp{RL18h5tiNT2b@yH+CGk>tJ5IITK$>gZUwgq1-f7hWHHHBk=YSiXWhj#)~WsmcDzVUA zjOi}MP%+tU8yQbK=M9XZ@ZxO7Maq$N-Sw1P%$R;m+{YruBQ#FZ2L+o=9OcEc-)FKR z#y3B6&e=WG5x+v#QuPH-V;hx-$|ghf?ybs4_HxHZj`9$^hYhG~8ewxcRq=cy&v!Ep zM;HftR8~_;?24@p;3e~;oib!@)1Cu!h&fPzSDZo7m@}FJY^43FA<%y1h5!y;+Wtf2 z7k`oVhxf_-uf3PGy&Jf+1D9v%LmYkRrVmoTJ*tv6UEYTX`Ve)6J}C6TKp&J~9}bKC zhxv19TNTDp+A1-rGIzgE#{Uu-UUpcQ*c{D*@y z>mTu**1|KykLII2(#EgwC*EcpY&EG#*7fisX>T%k{WiY04wusWHZYSuBagC{PZ^s| zztgx*Bc5y*wEs|QV6Evc>{<=9Em;wJRn_^n!Jp;|-5*ce64^&@FYBQLZ5ya{V)t{f z_ULfXmifNqs;7P8XBM49;!A4jqwtF@z$;Wv!}8@%CaMG5N*;Q^uaL(+WP1+(KONY8 zpMC?rKamqyE1U4Q$}u6?Md&>CfPPi9Rq(?floe$z{SevZUcL+IR)>%e!u2bM#PhMH zCnOUjLDQWPRm~IO*=d82r{o>HJkj}=Bz>(WeAomZ*5L(Ch+Y|z|KNG~7W$h9pZh8C z9s;`OJoqQRk#+syr6O-+p~DGJZx9_2-jWsM z>7r8zPj^1Jd|g?NQfK8q5C2L2|C5x}q*~i{(xw1^w}$a|YZ!mG>im7y#4PXZ>=g~N zMpkH6mO5DH>1DC3`7pBXhO$kREi#cuHMLbzZazF6z2iJj59pr4(*rjB0G}V!*lr-N z0`~LJn28*z>*~mnAzghdFb$VM!{x{;$&cA7-!DIg#y))9MXxp^Kb0b@IfJqqaO^h_ z+A)E#t_>UKbmoPup$z#~(2?@Zj59Wuy6YHc!9%fY24t6jogBHZP~?}LhCv?lo~M&m z?|x>zK7Q!jqWiWH7myW{S+asM3;*aci>$R-ShmO?Q@RNLW`Vz%b)7IIvpfrrTX~7h zvN6c-gqM2Yb(M^p$SjrUfgzbi+Qhqf-g%0)-Ev-Lk$OiVv&^bi>aGrxS!U00YS7*T z_t2h-vU~h-rT4IBKwn=w@`%9@t4XeyBU~F5qs7iW@}d4N%Mg%VjL0mCVzBH&X0gMA zRF1>M1|DJWgB)a*=|4bbxdz$fx+};m{dk`617wyIWR_vbEDM4%%OUC(IY49)Nc{>ji{T0~%Td<7eR|d9 za#wp~R@32_6{BW6texB!5;nyn99YG$}nflL*&fcx!Be^{H zNAI-Db@40nFtt(a%c7qPY(w<$yY%nBg@+9e@~{b)@vsm7CLVTskcUkS^04#eo#$bf zmnS?-bk}d=Vaeaa!_5CJJZ#W;9%lYe@Gx21_kWv*b*8?l`?LO59yZbW;eR0y8|-oF zJZ$}Xef<8f@vuSP!NUgq4-fk<<6(n*^Z$p3>2`zvzw@wgUiE!CxcKYqv43|MYmz#R zk0wp|pke!j54_vwesG6B_XF12e^BaQ9gE$>pmgVLdushH=W?F3#3*&z^G}KYiD$Lz zO`B`ipS7%R`)QwAt&BZ%(s++t+ilvmYW-loPusj|{c&{b8R|f7oI1EIk#FX)2E&6) zoqcBcyCI)xUZs0oNT%LvNYoY*a~#b#l8ZxZmY2SZK@Un_`iQ?iTj^ea{#%aSW|3ux zw%8o4$-YhVGiRL@IbtokimY3I2YF(#E>pxbwntVXAMD=xI`YGt$PWtkG6(juoR3Ce zKO0%T3;AI;@1y@7P0Sn$d6it>^2iwxwvd0wh(e*myK%C*Tm88 zQOG}kL`SpmUlVqC=h7v9?2_F_XphgB(YQ5AnPXM0+AmaV{z2@Aqj>H)SM;t=RbE|a ziP3zOMZfh_Cu&zO)wFkr$*NaleJR*G7FtZ&i`6_s@4DI?tH0xaUkiC@+t-Wf9 z&OeE5qDdWSZBk>ci}qz`P1Jd6@!$Qn3mJV3eOGc0PEkx73KX|euI79^#lf}1t(F^d z{(VXg*Ew!OxiROXDGRt>;5L>A@*rG3o*Nj?O^l~Ujn%s7g99059&p=rrg!ek$cFxT zEyTU3#J`X)<6)!s+#ZEBCgPKlyk72R^D?!+m0UxK%d(#wg?+`TL~E`JW&faMIZt}H zznS|74dg$F!1j+n$K$|XU`*6znxeHe4rM>NAa*Ejhi!hOJ40-f*~rV{OI5HxS5+ss zxVe{if=AhWd;VQ3?*@ndtqlAdANF2V*ke-utqlCjx99(5FUUOBYI(BpS!65w=dn-H zZq_C^d1f&W((-7R51YH4|8s(MJ3{}bfzOmJ?`V%+_W5_Txrnmuv^ghOuOrlE`Hy`k zpxO%F)w17D<+uT>%P5Y0s2g~pYskR%^hS~1Uc4zE2jkNvNG{%nvB*vvZre!zHe$1`2L4x1 z&Hj#hvM;J9RJL9waL~()Np5MS{%5J*LHk1WP6JlY0uP7OLw!xa!^t6V*$HkMu??Ec ziL9+5ZxZ8loWn=Ii|DJ-yqqz?SAiW}aL7(O<+&jy>^bEN&bjGZQDip%$asYPLto{& zAtvm3=pWis6q&<6GWKErWXnG}{1f&(^bh?lik!wjte6k~hyKfRLrmE7&_DFwR85~b zzzOt1v)=Do_UQCN!z|!QzG~KrV%$62d@KDyN7_*YzPYJSzt`K!J!k!1+5!H#Ba>V7 zd#Qu6lU1wlS?0Zod07h`H94Sfk?tMsv3$q(?NR*SI zekXpLyuGQK%mKF!|7jT!;6N(4p`@kQ^nS5#l;r=HK0DM$GK#>{Y7>1IxD950MTR|N z{FSQ|`YYp~b8%U~N=Xcs1$-Rp@{7xgm$Jg1Nm=Yo70<0-rs(;`goiIqdpqeK;yq8{ zpYMXMN5T_t;yxMMT-=-WN!w05^6my~L(iRF_U;Q2k=h&Z`VnfRc8q5)FN=NVW>bId zXO_O&Q!AAHUlNxjzV!`J*%>QhFCNbg;8T??(AN#%RI4EjM)b8RiT$Ob!kz)QDx0$7 z-|!1<;Q5N!i^p_>f$|0f%L8W*U0Pm01zf(Qya7^P1m#sy-o@j(VMTIFRcx@l-N`MN zl}Gz8E02Eso1qWoEvLMT$998(^4Ql+#&$!_70RRimz7691di_;;(qX^pH-bcx} zo!Fb#O_OZPIDcZAYWv^3f1UFuJo^W}8J2i`#)zwyWjrxqgl*e|k+zj-BW#<~M%t1m zW!h}6OxuX7re}<~{*jCW6UNv+hp+rOZH%oOK68U*s_kyeB-=jzxr^%?x%Tnzh^rpX zxMtS0jNC~hY@HLXwcX$vVLO&~t?imw4`qz|`<#rQP8w%>WYTzBp=+G&KG%5LFRhbo z4_c?%PH_KA&JS|`N8XS7`=uF^E3z}*nKaqfHED|Neb;2$8P^osZs%y*sfkzHCRZ%U z7|pybo;=$2aQbN5Se@wUA+RamKsr0RgF*{CH& zblCnrJ=HdCa;j}TaOtJa9R4{zImLE3J;nAh_XqjcH~B}lkJGbk$&*Lf2BnX(jhdWc zo0y(qJIQ@7_gg19ZLhkVwpEkTY)`q;Y_-mGn>I1swuAq-^8Z@rRNFsIoN9}9X4p&< zGi(c}L+Uz7z2!Xf@azcf$eQS~Ih`)s@${*-bmzp3bCajquD*Xl##CpjZPfjfGg2p} z+R|bsWjyOjv2B`^VoRi-3jJM@HrBRa!dTnb$@GWo9IhSd4%^d{enfkIWNUWWZ7Fw7 z&Db!>Zkwu3$*6KUY!lS1jH*cvTdMk_jH=0*w&KZSY;nLg1=ywnGijsnVTJRdNyBY* z6UKoPV{M6($J+ik?dk!~CQX=Nn+zN#EmAWa zX%lQ!v^y0TIbxKIL*SsaYg~*m!#=@o8><>Jc7f;Flg8K<0E=$$If3~wmO8Hcab(8p z;JzYq5%t+4BQo5sF}7mhwnFd$e7_Sqm6F&eql&TwFYJ*~8N#=nssX+lsmF$0NzN9V>F3DWlAB8Gp#eRQSbbudyfs7p zth;OOTuy>d-47jiB9HH8y>kZZ>z5#( z%eod7x!lQpZ%QDaS2;S>Ea?7Bc*IV#(!I5H&HBe#>)q>6x;LTM5XW<1F}#Cw;mW}I z!0DdKb@Aw>`z`TWY6|xCp2~Nzg|D+41`+Q-4s$a;d^fr8kuU0$__lcVC&m7}Kf)ZL zt&CIl|Hcs4HpUdEMW!H&D~j(^{3Zugqwg5!dBk{}=A30P>i!dQWcj+e->DdVuPc2l z;$ykPtc)jCz%qvO7=zJr+N6wcCx2XYgi`l-Bx`jd-Jd-{dyR(2*FR1y#tGWzjOp8U znl%r9QscCH)VQ`xQ=*m$eI-7lP2oRcrk*HLc1@LYaqv7pcwWHy2;*`Gd&E9U4u{9c z@9=Z-#jPY?+;dX~6>KJt!%Dld|4pv{!1Xb%H&@MTd4uz#Pqe$2~GW~pH$Y-f5hk0hFu4$BMH`#R>>s~Ud#ZFyr z?j6CpezCN2U4bc9+l8DXx`5P+F0h|^eEHN{Pdp)UROH%;cFDf-$glfZ-??98SCMl! z%9%E+)a&4W6Lm{FQdd=Gq#%z=U#0&!OI$4}$ho2?raU?i8$pUKpStr+RxOV@gnM?X4Zt@w2>Y5Oban3M<3lu>TStZKN!7d){BXaK+#~(cG$hj zeNNcDf%|D;_eSoghuueTe|^|}B=~OIw=K0^jHYYZ>+~%CK z9_(U=nJ;!bd*pGg8s_=qq2bV${nWAFp~$zYP8*_$`@OX8Z062t*7=6oEI!c~bU?|O zCiDuv18uSRPH>G5%RFcQXzG#Y_N9wk980k;(zcU~d*7vt{lwh+X774@{b|~lL4PFA zQeWcM7OQ>n0bh7G3z}i)-(+lXSlv`CT^ZA3dTBF)vBJd9=ia#Vd2$9!|b_p=z_fL!6U^v0n@Al{_oG!~?IO zeu;1B%K?8)kn7XvY{|=uKI`sNpCoHFRN^5{Tm0kqTa@wodtjVN`8V#()IM*`)I_Jd zub)!)v$($6(>Y4rT=+Gy0oI@JzMJ=RfW>&;-tdX+?94}7^2o_+RL@M>Znx;fW# z|2b#!PU^h9m-{ccPc|m{y0RVGY*SzDOL)jQW0Iwd|9A5KOWu!*QpRT*`dhk*ndrvk zy-m()qNNM_Yz5c&-wUk|Enl~oJ-?4(KmA;d(Z0Z*nfNo?%>xz=y?OC6Wypi@-goHp zt?>LN&TBY&`2Q??{IB@c-JVlZvOOoK7~XRfOd-B&TFKW_rh86Ix%0hY1vkAnyx?Wx zMJtFEz2?0Q1z+!*tUX~>W@Z`^tq&UqSZ_BD(kAu~P}&gO2&>{4D3e& zb7`yW|Cg><^H1MzyEzk^b06CGd4w`Y+9hogyQ;LSs;s=Fx@=L4*fhRGX3H+Qzhwos zbVpi>&A_wyAB<@cUi5$=&RX=rxE43>yHv$mE%tW!+*mcvIxhIGigKzcPo5WjFt+6> z1M49SeXPv2idN>IjQz=etk*Fq6-CgGZ}3NC@vIGez_(B+xNyR#xMFDQ)!@_OG0Ofw z$0>E&IPT;?eye+oHvgRUiXGUj`QBQon3!1Tv&r)fXIwj=pU{BK>Seb{=P)?*&5 z{iW5V{j(`a`zd8Vve%{kS{bPAda^QOuVJ93uEK_g-0>*9U;*-VfDa&p)BZGh{|}WJ z|H66qlh`!*<`1S}x_;^4oMRe+9T8f@dqZnw#y6Dv`ZMl~8+jLR5xp@}|7ImNN3k{D zfnIt986*n0D*RW%e|@Nb4EM6{JcZk`aA12Occ&ZRJ|*>^EVv zS9c=^rO{8W9oRnPUYCE+6_j1r-b)s@xPb$)LOb+pzJ;#sSfIpchmkWKv|sS+`}`jM zc{|Sg7fjF_>9-GFL%dm`3mP|*e!=e=^XQM2e#-nf30*z~j_rbOww8kP^rPqlXG`dQ zv1+yk@O^a4JIEizu3E8|R8+$g%#^>D_0WRvyChzg`!?Vl!gbMW#!xSMlU+m%ag5_O>b?W~zn*8GVv~PiFTNn=-RJc83wX$n`S&aG`TuI~2(9WDl^MnBuoVK& zI|Vm&Tpo5_ragqLFYsmU%?`Pi_KKageb>AeH_vwgbGerFN>5Su`y7I!?T;n5+{ZOK zMcqzfvG)LDvE${@$2S#|H4ZxwJlErZN0E=M!tz{IQr^j@FZmAg^Gp!4i(*RQH36`K*5Kj!_=bbV+>5cn4QBI zW~1K*@*4LVqsTqck9E@hd6vMtL~OnT@E;Ate-v5wB{b5HUGOaH6^}x1dWdxvnh{#( z^n2DT+7;&GU#kn#1~=$?>e>f^U#zba-ub&d3ESBNC|-O|wb&$yr|B_q-SL9K`SP@+ z?dp%%cL|xZW17;V(NA)vxU!}x6-HzSGh9S8+<2`kkLxXb<4U&< z$p;@!3}LSr))Z;11v~*ykU5&c^VytVH1ySG8~bYUT>pk~n`4aE#OEt@ki%h)iR*@%!Q0c285)d(x67WpvbSyt?IOQMa~A!(y0tbbm-{T*p2l^@ z?-lmF80_kp=I-f>Y|x>@(WD(GUvD4soTUZtOKZz@^$8E9Kv$mMA7|wl}F;dG)RVp^YTj8Y#PJs8PZe&f~8*z@wV+R)!erIPPg4QokQ{`zoZV%|1*7q##E4Na_&iB6N^9KF4`n~^(M}5V6(l0 z>!|;8Ps>W|xzEFg??Lyw+jCFLr@-tk&zP2||FgK|F`oYk{pD`Y;^6bqEdtMWXjorh z@F{)|`F9Ms6#j3VHAaiVZZ7}F>+dRp|7W&jS@|FP#;54?i}iPlTcnIYy`x*AEP?-K z2j7LB??YC9);P$22pvbpg&eg#oBNOV4%J~dREM3S!%p#?0Cs6=wB^Xn?w*52qy8>g z8RR>KYqu0_*Q#-r2F@L-!BWE6#CoSR&Lv8c z<+++${2l$3@eRsQ%cc1BtnpU=X5%gXy(jvN@5svWT3LG(OMGhkp6T9bmaUW0A%s$4kk~L17S>yEj(^zCMduc<1 zaiD)M?P;hP;1{~N30(As;i9Z}kvVK;jmLa8x<==UZ>YI-d!=gfD8$PWS6Mg)+?v!;N zczA{Iv6yUS?q>4*RKmY~G4OGC_bPNg@sIkD>lT71qQm8Q7Pf36c4-YfN|ztu|H3zj zW3g_9uM#KY5g2r^S0MXrc}_a8QCO(s-|CaVGX95bGsh+2=ClrFlk%1OptxX^ttU&O_l`}%h#3oE8j(a z@|QefxOoQkm@BTj)@vNJeKRuo4XH}q3&`i=cy40N%xlJh+eHQ;&Mdyxm|*o9Z`n?c zC9AjQmhA#tFKreX?Vy3&RN(SZXqdO=C)-zj(|es67>j(7JUFn=4&@bk(Z9ssQzkfy zZ2k_%Y@VM62Mp+Fd+I7PM4vOVK4XEdccj`jA-BuB*VhK$J?3tacU@-o*+rh*^e8qg zhf>$8CU|_vHiB~=HNh%4EjrwOU~Qw0EzpxP=0XE)mwt>MZWk?oKua4nAWYs z2DqEVq>^-uh_4^@C~(a&E0D*aI$Z{)n}_AB`!04*O0Gev=&h zB@UU>!1Fodt=qTN-0H7nEwX})vCU-CO2DBuaOW^b3NT#|gm-EfymQcx<=q`Yc&7&8 zz0wqbcg{+s#RI(SVQB*IX5d>N3oRN#+#vf(HgOi3)QP^}0#0VeDPTLQDnvi+w}xl4 zfQQ5ao}!(91{T=H>KIQw@0$bJYf}ljf-z2;h7NgzHa}Ogfc3`ssG;FCoJFsA4qmf@ zw#v8D*936mS-#Wp2E4#-xFZgGk?0wcFQbWeyu+~*Jn?`R!jDC_UIVT)fy0$*jIMY7 zhVc>lR0eIb{s8)9f46t;6YvAk`NQc^7xYNv&8wj|@6g9M=z`Fvs|~T>$PnKto#qsr zT>#CAMP~@CVK+6-ervQAierrkuHC(q?u6Fv$~qXK;X9oLdi%IfhLqe>h{ywUsmT z_yA+;Y6NDYFN$qL^v)B+_nkyHJ_YZQu{}*Y+Jz@zBam_EVxA!PR0#cJ&ef4yK=$jz z&m360E%~mc4ymtAcoEkc=ML%;8snrcC-6MZn%j93m5LJJCUy_87YS|jQGdXGnLrz4 z?Rd1lc3kML@ITRih5rdZlvvJr&&KteeN&Jv1=jhd5akSTpz13gkn| z@232A`X{m+aAWNyFlNpwN-VbIIOuMFk3#%P^)mA_E0&p_nTE{yti`BpvKX}K*yWF! zBD6y$Rm;Nnn=@wm*+cjR0&C{1$WaN%QSptRVk;6o-_CmU6xO4=BeI%uqJwMPXut56 z4ahUQkYQGW*U~4+socTX0n>^@+=uweaq=IA^nGm^dtw4BT|W-$#KP-O!q)@3e*!it z{GG%ZpD-q0tp5;TH)kvNv-;x~0S+(qQ}&OcEb()&CQRU&?@`UxWO4?( zAL^Yuhj&5;7DdW>Piw#)0M1NnwQF~vKRt_Ha+KrxR)_XH_nXxy?RjM9W8lq`ib0zX zp1#j{4>U;T`GZ^^28ZUOL+#<6(EJvjtuTf?Edc#Z1kuGTFO`HWj?ZzZMKSm02dk!=%mAnuOA_9Kw2%ZUD%YoJ{ zFa`P>$@@(a(x2cn`YZHpKK}@f)cK%E*`fClKCW;`f2{OdbPbt%al|nn1V`2LHaByA z6XRBo4kGLL7W}n$AoTe_42SsOy1;+YWw(L<3g;h+*L%RoOwXf+07{zi+c*}-==_`V>B?=ts@lh3zG<0t$QtO1=xis4 zun!&oZo$?ib}orUZsL43@4BF`l3yef+d&*hz|NJ}czEw<&Az0f#m#uxm)z6hW=wL# z=8PR#_>P1A3H+gd`I!cbwF`cOeBfziT!g+kfYrH&Z^6F!6YPvX#@;v=yW`E|XDsw$ zhty+h$l2d4v`Xf)&_S_pd7xXubJIDC496a|>sc4DuRCpPTTBNI$!woiFlF8-2V7 z{Ip_kiiQWy5?)CEyO`?*Q)7p85yuh--<36>cFN1fFGJD^QZ?}mV_U{ZFKJ#VkB?E9^wz+HB*dzv?}JQJlCILC;pK!O4}vR`tXeB z@?8~kwTSC%o{23P+xCu$@c%*R+4l*YfS1hO%^V_!Ea1p7DRZ)rL1YdC>v(MC;IjpO zPEIC{WX0@hCDyuu`P}(M?{$~LNvD70gg(wV>$DGei5##MSp5Q6Z3R9Hmqiab$y^d2 zR~NSP-yj>$;aXr6h-bmyH5MW9H~X^8>RKxm!gTC_$zeeGuVm!0c6S~+w+yeGNk{Jq%Ep>Z3aU9BAY`=2W%c^pdxJdVj>uIxH*^18{@ron-xc3a&?llX@4C_H)0sOnnNt~*EwZ1;MP2Z`d)^qQ={lL< z;PPcp9z&N7%H>%;`ZP4K5E@u` z3LnbjLBC+%n9qc-we21Gk0_`+6-jBcVfuO(e*1gwhx8Ym99sl6N zYSp^Gqr7kSj?&tgBjTGd8HZ>FVycbwNBnOQ*#B~Q7L`c+J^iT0W-B(+JBd#i>3Oi_ zH}rKA{rrTuRIy>)$RYl|9PXniL;g`G4YO77PoIBKGHUT1VhhU{f!$-IMdDb;*xtm> z*~UM25d);Z!>8zA?LsU67Zc;%z(3-j%r-e}QT*qi>@9p>%=g8#$4FZg6S^7g*L`lZ zr-=Xd@}EL1QWdsliANGYkB>EBMf@jm_jaC3j6gNz3SP@U{|G*dZ}H(&;-HMNzG>)G z$QdF_h#!FQGD9ol@Gr*UUyNhy#9wc=?!-5wV#gKVkO|+AN%UgHl%EV9AN#4>>qh2~ zakO$aMJQHT4`l(zWu`APW*L)`j22n%k&3T0(lC-3(c!iQO9FT&I9gPa)>1`3 z9lR5NWKqdz-3GIOIVwIUp=E!IU(v~23imCF%$p8<5?`wDsTh4OsmQy=Mv*VvCHJ&! zgAQh56Ur{B&}mJ(Dt^v;TJ(FNHA~a+xkr=x+a$Kgifs6Zg|>x!iyQI#>u|)^=%T)< z@MpQ#;6d1%MUTVYqPWVL2QM)%ZsI%#`Y3Zkc!l^Ek1@adv)=5weIuZS5zxZO##{LB zgSSR%MbN0uML3 zh3>NjS4#0G&P0|MT}AZvDwzlRIJ;V^z-ze{U!%R$)slzI1ONF}-{RMce-D4ZILCkv z=QwO4-Rji{J;~0)|>XbZKI(?))O57A%_d~xd+~#}X-cO;E$AbRHpF!WM z1s>p@$k3@KyKNdco6Y?pMcEIb z{wnf`qX?&m;!hSjDDe|D9MieKo^hA;Tc6UV=V{Y1WP$$3k6*l%rrko@zhu9P-$5g8 z;kcFY{|D&cSwnwKc>Qj@O)0j?#{SxTWCm%owD)VJKeR2?R?Qe^Tao((2e@B=j4+IE z?qKdoyQ_`Lj_k+X8E+)@j&eYw-cY1(%tz>>%**TfM|6l9zI})?Z>X=#c$4RML-&Lp zK0`b1qK;}{F`fFwb}*efp5wd#{=xdw9h3NG8u1;|pnb#SId%V@XAAgm8vjU~=QREi znkaZ$%s+#mZ{p`phPFM6UrT5kxPfe9wK^GF;?1lAYoTWwv2TAddph#pG~~Y=@I&^3 zdn33G>4*8EzhG{iWsZgWqGd0I@A5-`gTB>)z9;_Zx6tEQ59L{n&fhC~H}c~_Y`^)O zp*IJx*||h!UbAc<^78U07l8wTJgQ0P`8H(ZSajpQ-(Z# zOU$mUc@-VI7<%(CG)3x=T(wfC4?fIVIG6aJJ=Eg?_mhKqzTlwfRANUuiOhKl{izGv zoY)wo?vxwcErx(yL)VGLt|760$b-yto37{2qrPa`u@*hQoN~mcCb7TpH*#f>w+&m* z26P?Chjp0pMbD@G^Xb#!=}L<}A9*Hv zzO+;FwJ03fw09Hj{h{p;y=)j`VnjFjgm{Gj?TBgIO}?Jj$=9=qd^*pOPv@BA)1f|T zujplwz+T!f{g6I>Vu;KayT%IiviY=cv(O8^7g#CSb2HI19l$Cl2rHqn*r)q<-pHOE z=wu-s#)nKO2 zTdPOpLoYELdQ66u{e8jBe<3cTb=(DeO8z{t*(YunebYjFSqI;okKayW7Bh%jFnv#) zg5EFmxPoAug7h(m>*K^I5c@HwgV>KyoI)Hn{nNxLNIqHdJ?4V9@=Wf}$0{TT-goSg zm;{TKX67CH@|FOnjv>K!?8{pldY8_A9TKnbvdPO@c48EWX+R$6NH=(2G6rH5T-oru zX~Zg|s~2Jw*gMn^j8zyVb@U4^|3{j4mQy(2pJ&9E z@I@F?lo%W1JW&#J{t8ole}$KM{`!k-#n;9x-pKpbENk%@d=`%8H^*a{9v;JQj1Nc_ z&5~b2*jHfz?+gz{zs*-+67Nf;FVfLZDJO; z!dKzb$oCGOG5Chd+(+c82$<`^Bv5)S>IhAS|8RL1AYo)UxO~jiiCwV>vWs{Cwb?EP=xb@C)?7>j(`!JN@!=SZ1`6>*6<}$|9 zh0O8wEE~S}Sp0?$<=S+v>77scqz31!P&TPH@Kumc!W?&PO5m%Y@(=ZW6{h&t^qit} z`6}GK_mIWR8-M-Mi2AL~tdXDX_}0hqY6I&cCpz90Z+@9|lbJ=?)bq|)A?~h!I+k?4 z3a|H-uR;%(r-eOKpC#|Br^;8M()U&H_AKkmnznovZYxP{{u90meT#Z{YuxxMyhXZX z^g5yWDjcy_Y{*P}74BwTm;G>;Ea7}fQBkV-nzOddtceYIsi-9NA;J%_e`|_xCN5`p zUi0xSN4#7<y!e%3i3;MiSgv*kgtOL7s9>@2h@7L3NKNvzT^5Vei5I>Km33fTgFd-*Kzt~3csBt z_$Q=zf3gJMgwNss@d)o&m%#f+iuWaLuPq-SpZpYV59y)CJnVVZ0r)9wL>GC-T(ty0 zg`dV!lj`wP&^UZ7w)PA#^U8gCvwpSmBAzw$p6o8l;X71gHE%AYvw8;ocFBY-uQUEg zj`ANl3frUKfJ!ds!PiHNO7K-kIbQ``KMZ@-67#N0j*{C?S(wFLUFps ztP#oHv-+20#vYU`nRWiDzOMpvCiRs=8B5Q{=BV$5eHE~!&R5|UWSg&R(!)ntd&*D0 zd+#qTmM%+&A1H8L_vzXyu5C(dZGQhrFY)ff-h1E0nzYsnZ2TR=*d$-O7QJ(1jRTu^ z@yo39DSw(V`(kYPBaGpHVSY1*_*mXAde5bOk6Xgp^6A5}y+6l0_W$I&8R7Sg-@m5U z7QJh{3x7WEePfonQU!CRoO|EMyOv++o#USg?Y-j_ymx#XdA`m#KSS?Pcm|uvJI9lF zF4J6p5_*0v&$~)@X*>f=<~Pk#m4=VjNu=x9;#}TO1n1m0m2M@gt#k zj#Z;$dr$fa?>y7~d&lozGhxeL*+%3Eu!uERek?OqeL>Hei|8MHW4vEyym$>C2H9ZU z`z&KodLPfHViC_+{lsg=QoV=V%rl*QBAPD0aMjhcRqsri7>_gtXfbL~8y10|39d1gQHYxS#i&i7TSbk9`M^p5D6;=Lz@-*^6*`Q@E@Rt4hc zRk8iux<(9pbz-cCp0mat5KHsEGcif;JLie_=l9QL8kf!-Ufc- z^Q#>rp4BhoAMAb3Cf3Fr%-pT#-PZD$^NHT%F5vOmv~$D!d2-}hxeQO>PJ zd;TxU&Baqc^5!+P{g<>oycQk9PR3ZbDbCa{>&RNP^f7-eTKgFt6XQ3s$?dO0f5+#! z=7+ZdabwEIrlYiPy1`7^gV2yo|R@ZzT-dd)_NtQF(KP?S39<67Qa(y!S|u03(}JFm6K5uePt7ZV;!SWlYwTwb%}B>H><&vz%Y)^Rmsr|3R} zwC2^&NV-dd?nAl0T506DnsnLG<`{I_IrpvRT{?+IQs5-b%OokX7i44 z>HiL1JOkgOMa((x!e6WrUp3lR#e8B*CEuz@@XZ|gqb0sl{L!(rA&o!UUHHcH4r=a! z(6)$h5x#EIkk6gy!gO#L`4adN{gd{7m-&T$C(7DRRib3?^miG9pDNBd`z;-7iKQpi zLT@kVRR3hY#6D@>Z$_5l3w9g+X(u8h&21mYf9pE{Uss+FZQWPzw(w93-=d!ifb@qz?^-|_#bM>r$&BwO%#y%}#ZrR6$6ILb;Na3?qe*@0#bMNALMLug| z7|Wf`A-AhJzpLb|E$0z#VqTgduYB3EMZIQ8SBLQ|D*u-&N{X516wg{j{i90~lQeJb zcUAJ%M|rQH_iSspUp_To=Uq;V@B4iN{)D4rJ)FPyzW8k~;=Bc2l;7}ONm*vy74~I`MSwhyP0Q{@8V16 z_ONEIRRXP6_t*LTds=#gTptCJRT1k|PF5i~HvG(!WARtp%2D<~a%}i2eF`5A*$ByT z8S*mS@9*2V+4Rf7)a}Lr<`x-KBR>Vc z56thT%6WgC;5~Md_t`1@8q)l3Dzo^Vl9IVv|Is?Q-cjqfqWZp@_Nn{;`|$sC-`Lg| zdlK^gby;(<_wCQ3-%LF-#_y$?{cBCdv1J->8>hzZeVA`6_v72HjYWwem$8TO+q6^P z{gz+GfidqJ&U|O(?%Qkmjx^srdz0&5x}$jRg&T|KUOBa7ZsVDJ5198_jrSAs8!nY= z-v*WqSNTU!{!5jK!CU!0cP&0=iIVzzhx6TZ){9WQ%qX=#nT_uF?} zzb%b?3(4Bjm-m8`S%cd|dp7YM^fiPD+VCRpC;8ocn{U3}))HHM8)f5%IPZeJinhLp zADw;gbpv+(S?q!8Qdw*CUEv>nc(LY$ql>beH8%g}`TVBm@{3kpP&{tPk$fY#Ki?6) zO5des%v!?tfHyyU^sI|`f4`aU2!Ds~2>+5i&+r}L*+sYPJBj(Ez9Zb?e@FQAcN%Vx zy;*~u%Kt_*{Hu8+_`Y!Fh|ir1O+^*6UOc{JF~0+G-;>t+$O|rHpM%RU+VbK-v8|i= zX8FU|zzfdRext45xW?|e?+kBX+!Spwz9rS@>&QmZ^zGqi@$b;J`ij^f&u?e1Hab$v z+S`Vg`Odh$fyFz!1Nc7og?xusI&dVs)_TS5f7Lf$T6q}c{Y%SuZ1$P@{YLNlrZemG zZRxY1Cy&3^VFQf6FJ{{E_gTjN?eq6mpTB+D@VB_jeC!i^E8O^)&oh04y*VBm#JEwV z-zpt|KaGA5u6fO5bS9slv7#;a=zA6U={M6y8;ZC5@B;WM9Ztd5(M74vtLZ!L8_oa9 z4gLh*j~EUgU(>Tsh}Y~t>b^U}^V`s5Zm&@e_|`1 zN-V(-;_lnA7vA^m-FM4f{k18+q1~I`^WWZ)+y$xyQ@vea~YN zvYGK#%ZghsMTcpd_%VZTywBi!-_ns8eA8Qb8sBVLas7YQZ*hQV=l!0#eK_TcW)|TpJRMg`o>Q9Tdy8Xx4cn3;}+4^Z)?jB z^u8^I%rpk>U9|V38~9fAJ6C)Nd4CYOk3s&Yq6eq2R{H_IrR?p4)pCvWBTjlL*UQLP zPW}Y?fsUM1Joitz*w(*0Ux;G-!uY)q{VTDYH5SI8PcyFQ8=6<)kMJTPbRMxOS9~~Y z>GSwL(L8L-ysg|b`lR~T`Z31!dtk;bF~%kA*NS~ksQ*=hF`+Nt23d_gN&NDJtz#VlVyx48vRt?caF&bBlW?qOw*0TeP=t(cYW+(c$=w#fe9sy+(ZXzUij%mOT;2H>=zk}k0@e|ho0qIYA^ zzf;k}Q_#l`prty^4I*}6Py35#j`jn1 zdEWy?znX~d-1)#hD-*P_5qsPRJNF!8^C_v=ieahPKz+Z7YrkI1`oLQ}^S<<7jl366 zZf@XR2=uX+L}HSjVW0nI(c()^WDfw=BlKJE3(l>W+js~4fZs}A`aQzErOW$nez|9C z{6DC33v(@f|55Mfm_NMMtNG?zB-^V>_T79GW9y>geIH%Sx(0Ki*A8c2^26DSyzdG1 zuYL0S*WS`Ve_p*G-#jJk%kM5W&_6cyl^vm<_f;S1-KLK;?H?O|Ycapy#$J-=-bTJ* z^vqXci=U~E-Fy2<#lOl~%+1Z{GuqSFn-eD7e%j$Vp`P<@ zp)HcH+TS1f{{#Mh5!!adm#bp?ZqCw&w=jo(3pAGO`{)HF?b99Gt1#V-dv8nkYTo&G zhVFV~W3mt(OX-^@L&I$)rIVWB@w3Qq6}qzEhN55H>AwBggZIaKvj)@KjoH}bC5s;5 z{diFyHx8}9e*m4hx8YFMRhci#RyQ17zx7`9&d%R}XAMWRUjHKB@m|C?(PH!;m;cb% z)&{;0n&6wDxARS9mo}KR;fz`2Eqd{a-?+5lv8|VK{#)*~xkSU!v8_S;h}hQEuUzT! zZlaxx17|iK$DEY5;g7xbh|33V8G8AUEr%nw!{1pvGf}notYm3y>-o?x*=Wp=&Z^Hm zi+y|>--qXW6wSSpbLo%AhkXJ*Y{JjM_|SlE)F(`Cy*A_bJbtU@vHx2%cjG}tbN~0e z;$JQJf~SY2^fl2FOU4FW%G~OUsrs$Tr#h4_AE0wdTgW?wfjs+vo8RNH7bA3PpN3vb z{**g$@$=ZzxBu1hP4@2?q&1;>pZAVt=)D#m^}68jEo)edz7TngA>N1#dMbq1Nq9Zu zz~rqPu6d~L*=v4LxAB@abuY3epWG+5wdmT|GM;fpHp2fz&ze~qu6d9=Kd+1N&byJZ z>jJ*9et6YBv-&;F_?=aM+xyYPJBw!a%f`0$fQK>WXEQj4g zzy1RT4&`&wF^c9ZR{(jskif+i+MztH$A-~fe8W!_(m!IOz&SdJH8Dg@0S#ars0RZ; zEvN)Bu%SK{TMe2)6Q~C<#r<+!=%?#?Ggu8a0Nt;0RG!MM2jf5km;#!>3@``W44T0r zupF!etHBzu7OVpsz$Wl2*aBiF!X%IY8NjbzV>O@`=yT$R7Vp5mxr6-fc-23*^ws{k zrQ3b6x;_tuQN-P04CTHsVyiDdxedtN#64$$deG#D#e|HJ4$KSaDo_Bjeu#d#^S%7A z=U*Qf^{Hznj}{ca|L3QU`u(tq(Z~K_{OF(5T;ZU&(sWI2R2@SH^sDVvnTSeZ@e6423uy5RXz>eZ@e62a@d{}13uy5RXz>eZ@e6423uy5RKs>GmgsuQW*8)P< z0z%gU!oJE#INA@d@d1AUTbRA| zysFAi{6|gwewY96IqSdtUsv2Vn>Fj{ z7ruVxTX#%#tL%*j4y;}A#5YEM@sWN_!~b^Mx8C~aDfg{> z>$QcKxBUH|qn&tWWQg z4*L1X*wLS_{n-(}{MPl=mo=TS*X;{4z4yBB@xDFSd2qo$$CiG1Z6fi=;}2)b@A~Ft z%kMes$_wW7y!emTJ^95yJblBY$*a%&&mX){b#C!nYtR4bDYtzp@ySnp;#XhZ@8jn; ztpDhF18zP2$)i5;!EAb;lYg|=y83TEbm!9AKTKS-^_|1+{P2bsZXdh+_Mg7Jtl_>x zW*v0Tyqh+D@0cT(&AfT=*p-~@005rzxA#2kDPPF6))ZR=lxb} z7#I8E^Vc3a_{C8p-gtS$q~)*AzVzZZJ~r;SH#eUC`oBK?>Z*q}z5M0-k9~C1FQ-4% z^5`|wSN?Y3t(X7mud1i2V*Z z{Lu9Wyc)Z$|Ec?Zs^5vH?=$!x~qlcGxw`F>zLQ>9s9~Z8ZKJ4<^QHke*4$8M{fM=$d_JN)qC;g zbXntH@44@=|0`Pf!f)0!-TBA={MN+ZU-!W&llcW^4RK?-@fAM%m4SGhQYU9{N*=pTlC2l^ZK6h#hdos z>$n-q(y!0HDnKKZjt-$_qz{Lo&fPQGD4{4)n1_4CiZIQG`6Po4FN zo?n}?Pp<(Nt?M&r@f9btG_mPD+40++cGmjtrt*TKon$`}#ZtXV@ z9{%`Qwa;ztdDQrSK6&`%hc5p46C)abw)cKVKGqz2Y0aJEmOWK{`s80fI_a2auDtY> zKm6>`+n>AisfIs)_tk@5>hb8`W+XYzhc$z zulVB1l5+v~Q1r4U78>{PzDHI&kcFj~zH}#K?hDzV^X^2Q{BHaOJ#-13z}r7Y5F_ z?dpMVr)LhlA%4Ta3+Bxqc-&7H4jlcBy9eIT_s0XDzu@74%bK1VIQZh{2QK{J>jP)Z zE*iA@jpU%Rzg7>r^ol-%Rxdns(2y&R9rXK>k%K;U+6M=X_{>>@?mc7TptleC!l0R# zUp;90bJq^K@^|wFeRbmeL1$jSaM1CexqHwdn^p~4fAqtHo;cyDK_?vj{Gg8)zdq>e z=NAn=hYmjO)ME!<@>t#APgQ+z@MjM^Yw#19iGx@E@$-Yf z`O&Kf_qp%d!Jq%myusfcJb&=j=PVpN=%~8~|6=*7!Oy?GW^hr-Q-d2eKR0;)`~Eig zj{2e@n-?aBymoW-kca#B8M6Ne4jnSG$FW29|3=-A|9oo9kUO6H*pN3KK5xji-~9ZL z?;dsake|%EcE}~y%p3ATV*Zey^j|pS)UC^hTz>hgA^%#rX2_`z{&vW`Mb8b{@`b+* zS-o%3&>Oyz9J=+Q>Y-(S>pk?`nnQ=4^~`{w>&~egI`7soL;tqmV?&Ss+Id4iH}3O8 ze^Y+-&`B3wJ9O%Vc|(u*!>vP;Z{Inz@#o8jjyQ4E(8Is7W@z(Qe>?PdpM7rVrv85$ z`r_YX!%jIXIjrKO>R}&wu=lVZJa@>jtL_>w?2be0hW)%@%&?E1|FL1$oP6G}#^mRR z6>V%9cJPVU4*S+o^M+lq?ABrDJ$mP`|DL;iST?9J7@Xuzy9XF;oncJ89pQN+u^ru*f_lWw%3NA zy*M^vZE14Er(Uiak-MPxh-p&~8S&0Z14jJE$`Kc&?NsQb*-BkI;HKeg^pOUBo2y7Jt*CkI|!_sc0w zbvHdcqi*=Jxpk`#zP0Y>!|ts6>Oa3*_ovU^S2y*BU)0?@>&dzmpWIk?dDUxmZ=Dkx zdF>ApBcJ(Z)yU$C-XpI&;E<8`u0LkvMIRb5vi{OjN6wu*e&kn&pF8rvSEh_SVrmrTBgedP%g71IJ4gQQ{_l?5a`b&8Oa9+4MqYIKlOxaGXXD6UJ@V?vPY#WZ z`qFiYQO93YHEPa=eMcSk+QFlaUVO}`uk{!)>X8wrjynD5@uP-p`OK(k-<~q+>xVRr z`oiTiMs57~+)?WvzGc+bbqhva^!4wK>b>PhqrS2KFGd}odves?|M%>uk<(rs^-y(e z^yfdD7=6QuRilsm{=TE1Sbgy5yT5qM=j$41{Z_*iY>l3K zreLQ!1KE8+HeYsKwq7=0m=0wBggL-${{IjcWFHrT`E2A2WJu@N-*5Z%%T zrB4Tvuf}nW*@Eb71`EIfIg4(|cp=bSYz0^aBw* zt-d@Th;~78Uj&weF#V5kE?r*_R7PhZej8M;+MqsmBhY!cEoM8_mW5y`_#Tk`ydSIq zzXr7B-LRuhkLoDDBake__p^cc9_EYa)%gsdJ~kVOUeT9tTSV&uAl{2!@n7@)p8(Oj z4s7ZkdSjK8wIkG!M>rS^07hpc@yoyzFcFAmLFZS3sbCI}Y(=l)qFMAx#`A$_6{K$_ zU(vc6h}JI3*4YZ#i|s*uD@I*H9AtoKJsFJgL&?A1$2h{%fM^ztmjKbNunC0a8eC0GYUtLUo)qH!n~0Q!MipfsUBs0Y&J z@jx^yYyhIQ5ljKo!89P6CFeOnc0_t@^ct-9dS5HmC5beTjAi8e`qI)3_ z&0#%W%lZ0k>2>`_PL!;R};WwAUZ|=Wk7l@%myakn~95N$yu~62djW&yB2Kd8ofIl z`}$DF!JwZHo%iz7`V)==13)d%wHhBfuLGh}bc-Jf&jymaXcx_*-!PN7AbCsff@H2S z#QL+@m7kEd2CM@ww9f-K?ybe}1Y@^vn%_U_cWfM05jSmV98OjzNaS#KRU-t;2 zbs!Lb6c=A~F1iKLJRY3v$3?&5!f8OfYXl8oq90Bnyab3hv%ws2BbW~sg5^Nth-iPZ zeY(T_+s#uokI+5h+dV*hRC&!nW#86YC&l1K(s0pt>W+Ze2C8v0`YFcyF;%l+vH;ONG6iU z^*}TTQ^A!!q#HsLP`biPfYOvl=hJ}h6Yau{Ks2jd@yq0E^sXc=)Tg>CE4$z6m+CcI zj1IL`Z4P5H=M6x8VLTWE8o@X}u5-n8Z356W$yzikoB`$l)h9h}2BKA10HiCD?Ft~- z-VYuDPl4xmPQGpCziPMIf3^?BjUJ_`-D-aw7~n%RDSj~MxnTlvLFqyRm9GG|UI0OMTV) zli3gPRB>IGtrfisfbLg0Yrs>WgZzCr=ncjP_370>GMCIG7qwaKp9!XcOTcA*yvdJG z_0LU*ZsuI~iq=IyrOfn6Y1$6v|rey|dRWp^XzYPV>c490^-AR5mG6GBkB(J#3g zy^^hTK=c~j(hVVB&M$PVA9Y5~+w?ctE44-KGTKB>1E>cB{BS6t(BBVrO*jpRR$(%j z0(8G1`UT0n$q#1`s-7Ex@j`r93MBU~$b5&isU2#MWOXv=1LB|-WIzn`^3Rp7v>G6~ z4+aB)_@VQD{<-4gz?cvw5EoR>L~t1p{nLQae=~8>y#lNOU8Va$zbwgf0gyg5gZW?) zknPdA(!T?~2krr~D-VGu!Asq*Z=KQ2_VPNphUpU>rmy1XjbM%+hV7y9d2(=#zXzo5qJLK@*q`OotR#|B;;)tG9T}P`M zqgT_0U#*R1zqS{ z?ds$@%6$x|o_m0J-wf0)(WdsF28M!qKkQF95Y+iNnNZgnz<6*r5bYCzXg5BH2Tfo) zkn9DcUob3xH(ag|Wkp`HxY?{a~eE-a(8{i0R85Okkt&bJ@Ch}LcT zq2wUllP;?5*MrNz*`U$K1VTY+lfflGc|`LxAJhHwIfUYo$`aj%<;3p+D}d?uW5mUW zC&Buz%e)P3t0+@-iSO3WWM|Y)(Nzb=fPvs(KddJl;NxUM(R>5P&v|r zD}i)E{7@(!-U#M{1wic(&5r=}=k=YZ)!nE2t-q+uB|thUdnLY41r0#$tpT;55+wY% z+AcbJfrCTw4DmjGdVfOQHxMYlLh(fR>HKV<@`Z6=8W7z#1EW=K+(|m~?Nb|>%1$f= z>R+mFAy6L^A0%h#vhq9#9s{x^8#>SH{5HIs=k3xb9gBl;-o6x)sZIaP^Fatd$!AkHTP(Rz) z{XE!a?jruHO=_QLs{^7(;Q%lYi~&mP=VLr!e;@UP;)D2cHc&p5Bl<4^;+b?ndOshC z_N8DI5S>qe_1#0~HgXefs&h6_Thz{jK`rRzheHX~=I}M8SsvxnJxa5%j(C3`;*Zi5 ziU*=~1`wU<7b}4D=rJI>)lD*Wb4TfjY{P1xJ|uc&TNe0OLijx(UatX9f^OpVyJ^2s{DSfj@%XP`0jp_tQ4XM{Sqvrho=8!HDe2}Qf)E1G3D zZvyjy^m-`}pQH=o!zv*Di4Vwpd%DzJ*Md2k=voQXCbdnvDA`Q}r-3>@lx;AY#}gj| zls3+f>s;w)gC;N&Nao_#0x%z_e4R_~kAV&E9g=v7-*0JTSb z?J2PF-Q#<>P2Cl5V?RZk=$Zp=1kx+XcDWCu^+C>ML;tvY)9S`k>52NG#<=eQ^%Lom zFdayzWJ_)a(qCN{4@9&0p?g)v`rVIKC%ZMYZ52>^)o#&qC7A3(@o8WRxD1G9L3UF# zi(cKk6iAO(gU7({!KPhHv(qu@n%brIsjZTgY{@uK2hIkftq~~gG%ygH490-*U;?-V zTn}c0nP5JUyrmP;Ytg+Hyhk=g{nzQ0>Q()sPi<2BL_EB2JOo6mWc>VlBV%Vn*HE8m72jo7Bu}*~zisMoYTFC% zP20M|mO5RPtq@&vz>Pq%G~7&F*X{v70?NAw(W!pn+AWz$r!E6id`u*iu8G!LfaEDT zi_Qmu>DtEKQ=S^L-E)E3y9kJuMxeeo9;h#k^C4QBz%(G4E(GFF_cg=i{1t>2h0SzU-Zgut^~3t_XF9K z$H1=vw01|I>PQ)muc~_mxEV+;1A*u|7z_Y){<*?hV7~YAzZbo6KVA8CpZGHw%mx~7 zq|>rl3xM;MQ1>t_%4XXrNG9m2Z^gsJqh+O zS{-fbgUw(Hm`ji!T*q4ZBxAb+kza(m&a|fuI(| zfoQ!1h`tG6j1TFscrYE@2<`wY!D_IZ$+E45MfyctLbMYpcKuzSg*qc&B~ zXl}0j7@=&3`jg}_2Z%n#DwnS7zX#;+XxY0%zJl~=T$lz#r(`L+qW&gYR{-gtY{?!V zQ?=2}VKlC-0+N|%YXFyk*@j-b7>9lyW2CUnC^w-fQxk=xocan|tQFgLF=mo}rdLVig_VaO?pEjOQv`fY| zMrvGyU%Ny9vo^$DrA?CKQZNHZA8mY-T-NVi?X`AyG;BlPH0YTJBunX`PqCEf0GNJ^Ae{NZ$bbc;@Kx{PobqyI|KSOKNEeL zht&i1Iqg01??RvCr@3?kknChf;s6>8@nug*3*@JW+rw!TN&qv`NcpV z<c66&Av!Wqwb;gmmn;e^dzSpQf5`s@DnH~i~w`PWm?_|IA%<% zIN_H6)^Ts32mbkJFMN3P@$UGIfBrjPe>V8(&y7Cc9WVITUmX4TV>ev4arB!n-lK+;MMp8`QUQ(z-`ToUuI8E(U+FwHXK0%uB={#J(c_HZDd~70ZBUtC- zH-rZ9VhiAVtSx*4wnelEZxld#q7?6Rk7yP>3RT|Uef)z^2=j^Nw>iXD<+n1_7QxC2 zmnR+xI>LqMe&w?=)D|IJj6HWYm1d-e4z+; zSUH96wY2UoLv0aXqz6Wi(PVWN3d8NNGNd>E&SkXMU!)89Fj?k@`TfQC7}jygL%LDu zPa zsBIeG1+_JNzr{6H$RmVA0TLd#3kVeK$FXmXn)Op~=g9Cnr# z8#lwD(Jgvaxo8Qav$PmbRi5!sGBSv!Fb#@Jwqbs#47JO6Z}JJZ)%s32wEK*orWY1U z=R}X7>1s#Xp|T7{lhH*H9V)}<$PY!2$_mq9@g3139k)KDKC`>f61Mvmm%fP}lZ*Hk zKBRBfZ)F2^7h3Y?;5vWBmzU^~?80;?Zhc4e@a^%KzR?=S^PH>SO5epF6${* zvp*6K!}^TMvG#=fw8d4n=5m@RcLy!uHYgsJliFhP&JRte)vomgpt6iFh1zLpqE%&! zcll5r)nojWEW$^=T((Dx@mF@K5KMmSxZWNl^Duu3#Z^urh_)~-oVGb^4A#3S*|L0E zbZ$DgBU(hC+Rz>yO7AEwl3{x=`D`JN^g18^B29KWUq3oai|FYJE#igRT1Z~TE0dY> zPn;rq0aAC^k4$w+@x3G1q9Yun;Y3 zQ$E7uZI}j&?}(P2osR{C5D^_Zx|5bd_DT9CdPKA2;?>&vS9-BC^D&BQbEw4bq(%KR zA2$E7KHEx#7t5!`#zhNl-l4uLUWqs2i{6ujVSG|~f8<&i(lzOs#)WWu)TS_`bDE2( z+NYtQ^s!Hi;+p?k61T9gfNtuii~s zM3d-IJH$(?Q}qhQPrcX9=SNt^lCRAl^ZSJOWPL*U@*(<^r#&6h_@KF%pgDhjJ4`NN zTC6_NW7taE-f6EVo)48PeO3Dk@!ZlxpW55rTukXklj{Cg9v~s;w}skZd^NdKW6WZ!=ZSt`i&;lEt&-DCkk!+H+fnp zxtflLZ5X$-Il?sAy%y$|AwC;VEL8gp;!~Igi-+|`m3NgEwL^6l>T|MT;*rr{VIf*1 z<1maS-oSg0MUD@=>xk`uQ(9@)JX7AnJNu+V5xsPffE^I_w@^5_V!(VC8nm!hW}Sp60j zYDastSowCZg@wv68Z6AGr9E41eb(wSdJ55EV~K_B&BsJf7?O<+*imr2wYC{=r7vL^ zP4<4w@>?hw*}WZ=i_u`A(V{ZLWrh2y;x^{DM~h@5s2thFm-C>q{|aRLMWfMRVRzFK zrpNlB@l(7KP3kv)%!72zXfb-MjrpP4EPC?OZCsEYP@SsJ`l$G)L;7aArv9>?JYks5 zD^&Sbm+CV}hmAJbq452Ri#FXa85=F(a>H?}LwVbS+FnmOgF@{b=!f;etHK8(^e=h8jT*&ln>+U_S&IqYDb~+ElqXosEm$WH{A_~;y>&T z4tpN9P~)S`$+TW+yv`3*X1;z}p^~R;y2{jiEdSo{xyn($%12mFR8N?OaC{5bRG&fh z+W2U5GMkTu>&=f#mTCjHZ*!<@n`7qR7d|&V?+Ps@ALHT9(jp$IEb%T35ohzUaNG0a zqD5thzhQ)FQ~6<8NDBo(`56p{JO*E)(+LBvC$x!bf|pECVWqR+{!4_KBKKG zw3v*fXZdx9&#fK#w1_6rBU;3x@ICo)D`R`KXxz2=WT8;^stq=O36Cq``B;A4;d5(8 zd$drzD?fZse%#8~9xWQ93ejL`9i>I%YkROUM7k|{!jNoqNH+OncKF=pK^gka&d3VyHvaFw4XtI)A z^4lLiw|Ui$=9b~M=f{l})fGO%{YLY#aJ~6)>AvZi$_v9}B^%J*JWA;*Ghg1}bE~60 zJy&{IKf-!$akW76^wI`HXA6ruVb*G06h?&1l}GwWlf|f9@VY z^Evsa?*;Y-y?}ht_XWK{AFv;g&w5`_3l0DWf`h=p;1F;qI1K1$uYJ}=wbP(9gQazp z2GL=(7(JqCdvtNRVEb%dXl+rbH1W3(EWg6=Jw}5<(P8MQOt__B`&5UO+0nAL$A@=A zzU{TobWnO|x+r}#os?c0q@Sjv-6`KN|0EN&b$c>?H{~0PZ5U1U9Q^LY553=`{N4Y3 z%2q!;R_|T!Y?$%ys|-T#_c2xV-tS)OX zNLWj89fkcqsBrkZ;P*ik8Eg951N9vZ=VOx#;hUs~F^}^Z;468!g!A@rA=f;8II`Z8 z+tKx2`;T$$i!}}K(~tG!`NDDD^?e3<*JES6aOl^!AI9ux)k803OFQ}(_uEnGl^aX= z=UM-}Ro^7XSgiSkSgZlm7l3}JtKaDA_k;P6zTZUp>ec7Da(3>|uDW;UTD#}o<;hxd zu5Ay#tk)p#d`Q;Kk*xO+@q4mXe{N6K&B$1oQUD?{lJy=UYBzWF zWWA@zS?%=twfgkx`oggOoG)jc>(E|P(Rl6gV)y=A=y}%C^scwqM^OPXq$iz$JwvNp zX4sln*7F}UwS#8TSAz{8Y;)?-%`spcm;f3;BbWjnI&ph2+6sk6ZxNLhI`V0?XZ`T= zVSZfov`??mCmO>D)2jH+)2q6-hhnbpe)Mi%hTD^GM`+yx2q$?)ZR{qr^!zLfi zgu?1}kT2hzr?)uP+D9!e`oiF};9>o-J^J#~#aq?k@vo`gqqmuGbpaTSwI_JJouySY?;3jZ^|lkV`t7>q+sYDrR$#g|FmB~N|MbMfwjiy>1S+&2Ss+dDU zD=FrmjIn=|l*IKfUdq3+Qq8UkAI0&KQvFjVQ33fhqB31UW!Xxa>K&wKxR@bFDwj!% z&4SpKrhQp873yhcB2$scRM66jbS4d@Syuq}ro5AB#D9@yl)Jxm5X>P4ZLqIlbY%Ye$VKzG^JO07J_zu}z7B7#N!)E?LXPX0( zGno`@O^O28C?S`ZmL|*M@kFAuG*MZRt>nDCtfZtgQ5r9Y%{lTXNkfH8OLG}0$yQY* z(p6PyLLFtPN|38c5b8)~iE};WDZfh#|0zr7s>)q{Qc<)x1;)#>Rb`1>RVC-TUY5*K zo~MT@HB*tRqCdG}N>de8rAc~4GFO!&siZtpRZ^C&Dy0l{I9)3#=bUo0>B=fKBgws~ zbVXHV1#Krmu=bTwPbp=UCsBB4;#NnG%Fhs2ALQ05BwbZSV`7qyjzHOo$2rsuwl5*S z8<34dox%GDgVSL-Q3EP~*jsCemz24GjT9>B0N<%%}ITps%pCL_0R>s(Gt4qlH195FrWKsmLc>h{!o|x;Rc@mP9LrU~f zx?f@OkXlk&EMusQ>Y?Q_NLX+N4u%48Ig3%sWSo{^I9qkVQwh)1V(7h>d4;Me;kL38 z)SwhmwtJKpk*7FbN|>pPXL6OvT%|jTOVgF5*yUu_JC7$am8HoH=UxW=Wyq-H79BYT zH%6#LRVJBs37Cya=&MK~LnWX_S(=nCC#=L|LR@7M1K{%Ka+T@};oe}qf{?@6G5;^* zl%cThUs8`VexGTW=4gxYvZi^9; zIx_oYq|8-Ux(4R`p}%+<>H3X7g1H{*sob`5Xq)0q27N<`siehDRW%8wA6x&;WSF@! z&!e|wDjCU{hgJ~smq`O1JFgo%)8qcAzm%cA$&zGo(hZkw>(^Onk$Nqbs+8WzY^)+x z!E}z!=NVu*Fm>|SUe}Nv>)c`e#cQR8lx>^ik0F88@%s$@MHVO3{`jzMQGSXB4mzpW zk|<4MyfRG2GYS4_vaA_yXO4JjSsGnU=~1O3tLX+MGUuQdGCfE6nAX!JnbPyrlU9$Z z?t!81!4s06sB+w!B|rJf%9&>K1V($@c{y5&K`k$1`cjr**3HmKr|VJGgD0mR8RptN zD^y~y+@k~aF!@faF6CFfZlK`4ERA6*P8(=Pb#<<~y0WU8X?it{s;;bLj7z6LvP_R7 zm6fPRI#bDWM3x3-s;YT5Qb%EO%G@LqboNZPx-y-tE@BcV#=3{5*2$sC9_u80FkKlg%0?n>BFKo%75@{S};h*Ii=hPr9Qs^iyDbL2^no=gKdRFFo7MGTzj^!1MiJB7hjF+c) zFi+;tq{^Pvxt`TMd-i04-=inx60K>S3WO#kdVcl)X@sS0{<&eEfj+I?68@LSs_*bO zoAmzCkI-#5`e)%w1v3*(F{^s+wHN<&P_usoX4XA5s}0ob>hx-DS8x0am{mO~XUKQdKKg+F>cA^Q z)Ipy&xzn6jqjcJhO*yP{7RGt(LxC8hG+Sa)&ybLONeXx)5A#5njDac7hyrItJMqV#`o-NaAX`vi7{E&CfgFtBgc_MP>Ngg?PomI)Jsz9oGB9UI|&|^j!_n>Xwd1-kLF7P;# zaOb=%;t?=ei9Wh>{h_x3PhS`{Dwz!GiNsy!Rahl2kjS5|R0^*PDk-B9C3M#d{js*_ zT85To3aMhD8%ZnXod-`}xde5pLe49hVOB8h<7&>)uJ$uBx^op1F5c^YVcXZT@9YMDJh9g`E4-KrEGeguZ@%@>(5>R*yK3St*8CtWDUDGuBGP;q7oE^vQC ze{71^%Etn2@LnvrnF7ss2GW}=BP{CN_KqE;xEBK`iVkP6U2JFn#N2x?QQ+}9UdYD! zlS=oli}{;sm0+1N!J3qQ!_vv4#Ho(jY=g1lasBD|;VCPBWsk5W*rSq)(s(@0E8vvg z`{`|GX$j{tOi7*)63HsAG1H{Orn9^d<}}m^_~Cu+MK>B3j{@0m%Wy#awD;!Z@h6 zO&s1J*TKJjpZ9u=o7!(%qkGM#Cs?#x6CyDW;cEVX4NU9zG@U%m#JVSKXKaaeyr<;l zr1GLpHlVw+7nlWgstUK5)u}tWH?#PsHb{fJN=x^)EGq52;DE`ziOLQDvP=4{)hXcp zbxb*t-v{A$^5#kSG~hQn=Y%F05ZRZmX+dOPy2igf{cf`_>PU1jXIp9sXYc8Rb-MlA z+86P}#{XSqXSzD>tNlhpr&;3P&=uPG>8jf+qCGlvT~C5~x843i_|CRGx^Gu=!0byC z4bk(6&W8i(q~1d zm3K#N7Jm!8$quSf{WiBL^iEON!~6FHH%5`&f&->=O|(YxI{=t%(K{GjmwdIpqW!Xt z2LGP(nQiS$6SRtU9qM1!$GXzjU16R06WN!@zH~xecDt-$`yv}6`yu-xTci1lY>I47 z*w$zrRL@e{&rNe4w%c;gRC~7FDQsV4Q+DNH^QWC{gUNSi@9*k;VVm4lTDsbn=>GSf z1A)v@gcGS=Hl-Fs?|0{%pb3l3$*rG+=M&;xz(3;e#-X{A>IjFOtw(JSx4$#@>-j_Z z?fxA-@8p-gBmUUC-TeFPTl!z0AJOo=QT*NKKrp_c2$SPe5aMTm{{;U7)`OwsUkhe(&zYT7 zQtp5EkMR7ZzFzCo>e!~+G~GQb(tJm=_4gh1pRTss>IsLPEmLg|x4$#@tA8rL-QQW! z?T9~-ed&xe_Po66FYcft$(G2bY$8!M|7;*zvmPao?Klxk1+py(@=QQ^WQVk;`N2T% zfWv=>2Yc+}ri(fzA<;ZIO-9GtvRz1fV(1 zRInFHDj92jqxUT~N0BX=4>o~DDe@kBgzbyxU$;{oa*w6IaKqJq3t#D2YFF>?SS?Ym z-IW7oUo>BNe;?c07d`idO{RDy*qEzvHw-;X$p&`>D!Zcyw}IQDBjP~Bfrta|DF-4O z^q#Uisx0EbZpVSh2JChsi5e7f;639&)c@ZzR!0>@9M~;6&{Z3-tMA_}nHn`J;y}cK z4s)QZHl)K9MHwRwL>$!1X5OH8P z4Q@q~)<6#H%`<7Jg@fAR`; z=T2&S@030vz!x8K*+i1h>#+qrpSEC|R(9QG>u&aRCB~lN>^{rp;-zJLqk%27tJ$KR z-Fdk!8CN8mtLAfAWZ|n4X*NdY<7#Yt%YLs!xP#9^@#O`|=93ldKAhrvNlCUI=Bs(0 z$n&4&%^$5OE{SolyK7#=JMHXWzMJFS!lt)gq&z7HterlB0{IT1R|p?{+3C`v8{a1! z2-Jq}Q~GMtH9h1DFkU(A@b5*~%(*MfY%MVD>vI`G&zd-oI$6i{r_%$*}4(8ECe z0uArB0!_nruE6N7hyxJ^A`V0xh&T{&AmTv8frtYU2O23%j-dDtFR}j&MI{lTNAmY}!)%Y&c8>e}yoNrF+>*ZQw(y3RwU*C2T_?)P= z6lu+&4~&u!E+L~FL4xj30@b++b%RTANsd;1a+n-`g1es8#+u%_@~(lR|Yxq6I^b-=UQPo*x1b#86=pPO>b-k*!0Slm`(3&WzO`{qo-9~9yzUh zjakK}pE)3}5hv1Vbc~O@@|jmfNFx%yB$j!X z6!D5}v;T>btlvS>LlPJN`v;i#ulPN_ms>6H%hrf75fQNLZrPvfKU z+w|V#VeK_J86QnfesOLu7R3X))D*lKJQ~C}+!y>4Sclr0;^v=ZG9DS?c`S=Zg-UWK z?D)drluTl_ldN>0q5_FXHzn{~PV&MF!_x*&X?>N;W|b>YS)<$dVRRc`jBewL(QSOm zm$T_7t#F6wC!g|l-wxmAkDt%VGyYnA{^h_f6_uB#^p3+3H@ z8dVoQ+O4A93x&(sUaBK{dl}x(*QDa_&e2)@lwG51yDsbZe~c*ok?)z)|GA)knUg8d zx3l@|dpajOCljHrnMuJ@|{^W|{Q-piippt*So*h@EK@UA;k z?mjc_<_w&23j>8?oR>w$&^M|6J*2cr5Km-jJzJ|xj7%=cF9C5V!N1)F8sb_L-1TsR zmC>5Vl|UAK2Hh`6XG#bT@0`jlg#<4X2`huK@R!)9+yPG)b-UYor&du{gC?B`C; z2h8y1>wny@Ie54VB6)Xo@U+$K!yd}$BptlBV78z@z7_9fK!FP8j1nUb1RMy|Ch)@S zqS^#*opf-o7VJY%-A+V;w-!MQyI9~(v?01>kK;hAVw)Lc;?Wf<0zC}WugeAIcMyie zuCy?^H{w9VfrtYU2O!1X5OE;lz`r>MI=r5)^~yrL zXxDwN-3#V~v`uNO;@PXmZLUQL?@tccdZn#X+Iptxt?8usgV=hgam&_8i%R0Y&m0b- zUZ%LMNV0c`WeXyKA_i}meHS<@xX4?mCZAicm*#qoJ4C#-Ww(l>HDwpkf^OT0x1{XK z)7r9EaJSLx`xhj&r0t4tT{PDz4sK=gGjNOMeggfkZG!pL>AJhcbEESbE;kC=?3M48 z;1WDSy@d9>=Da332P1Fc*%IV(6mUdU$~nQ~3|@2FBzPr+a^xk@MCVl(S=?gzj#ad8RT{19kgnjsKn@}`%!6woLQ7A zT{M0hKTY3_-`3Af9@fw8KBLFvWOSLFe7`!4BrwBV>2R!RJ&{XEhy3bL=T^Tur`sY! zN|=$71}DB>oh0F@uXD0<%Ilh^o)Wmy;k(m%()!(630d@;I>FGjcVC7|19gz2a8 z#r!;wcU-$BA>h_OWyJlAR-Wa%jJJ@D7_7{ZFCT}LWOl&C*(uvwFTlvX5M3=bwh zC0miQi)}-{0xRF@&2N|Khqcf6WbHFPIr%%AggAV^Dkrqo6Unba`b<|*=gCwNSHIDP zOoiu4CF!NZCs}r)!qW=*D_6QA%Z^oSex-c4PdQgA6_&+mDwoB{G9w2pNj;a7D-~B9 zcd9sX-dKLajV`0t=rVp7UB;K4m48XAAFaA1y+dB%u2XyGp#(Q3ki$B?pFzFYGXtRn z&jhrafSKARhv#Z#w>bAEJ5h-DR@fs-y|rzEvwcXe^(L}!_J zR*@nt&g8J+2_%!MNTPP|8}B~6{iJp5qgLIcrn<7SrldrIpo^9iOYCfrhL2oQ36+Vm z1al!u#J##yMYD+-k}gZ6vQ)?bL@xGULk`JQHd|SRx@Rk@k_nU_-LEVwV*FqawkkGi zOO~@MTV!1X5OE;lK*WKF0}%%z4n!P?I1q8*-`)3vF(XPTo%(uytQs@3nPd(_2$LTZgoDW#f^pHy4!@+X7-N zP~;#IC~6Q19MytIp3a8%ebYj|yBv;qZ_k4i+;lugHM!|HM>Q>`yNI{#nb+cOqgU>8 ztZ;Lv7U%xPI23C^ZW!Y=+h#*Mb}+|SAus#;GgD7BuAcqnmjoiRd(IaQDB=l z%ORf*cZ*k{N@(5Y&9xz%Am@@cIaGmj3-OrACU4$p;EpE$G-U`9Og~I-Y{kR$%2wh` z?`#3X8{Qf12FV_#bEaoduI%-?vmca7zm!<@mu!FxnE%$*|Rj&F6si3;#4& zpJyL1xu=gU1^#JL)WAPY+~M1H(q^we?7%-wEf-ru{%LL-L`(Ob)#TIU zD>?f{g6g%F_Lz>u4hh);Z z!zo1PZi#YtodbRcH#=bc-|U3-f3qWg|Cc9MHe>#YNg4gt6MAE%H?VoTxaq_hQ2Mgm z4rRsEt?|W5WA5baCZEhozO>2V^<_@d7-zh|@ImAxmn9Rvr}!;aR#tF=JEC_5pDgxz zl%pnBbV4TFv;2me-7|Y=cF*WByJz&8-7|g!cF!-*#wX*8jZgTediFkKsAc^98G$z` z@C?42B3OcFFm>ie7{@j@iSW*yi!u(#Iy`&eF}C$wIoxG;KMVF8ehNi66VmD=s6yS& zaQ+?2fQ^OcZ4xAeHc5U0El@rJZc#<92Bo+%T$-1`<)92DxtolS#&45@@!RBN`AlBM zZ!1X5OE;lzIL>cfrBF^S7=b17-Ai|D1fTd!tup4?iOb`h=Tx*~#z)_wg# z{Y&KUHhR5%-@IjUSC5v}y#;MoZ#w4r8M$?4w=V5B+e?tYkl*~g1XiiN0xU;ff?pt{ z$u+?-%yP(8AxO~Dc-sVbi=V@*!#OwD(zF`cCc&LjWZ)!6f-BN5!<^_sIV>r-#q`7U zW|ys_xAm*Tj{r5rEx_}ugK``I20m6QDVk0|TaY_6M{OWAI-};4PJAbU-1b!Cm z%hS5qTPW&weKJK3wtzw`QYjtnMlFj(2nBv#OZ6LK{n+%~`myzMlZUm}pXQxtt2d_z zvOv|GV87*LmC5#yqI#w#ThT*)RsKn)M-Q&~Cs|J9SH+hxDS(}|*y_!ho{DTuO$|;~ zZf`etQd5(yP%T+q;RL^`N_OS)8*X$Ny+)Vu!{{=;?6my7PVRMR*Cox(O1(gb=TYkq z5iY^^t94ghg8XY?o7Zt%FLArN`58RFD(hI@4HzY_pLu!2KRQq-$#t{9Yf3&&GI2oy zl@v&@o8&g7LvB>gr(Mw^Y0|MS;1hOetQ`e#sP_%vMpL zR|nh1aXWj}Rj}O~m!KFmbp=YK#%Eu=ft|x1dP$|_zG#^aS*D!{Z8907hj{k~k)0_n z*18W}P)-opxdNlR-VYqGr<-om!$9kTuQp;l}y0=v?f=-xer1BDd3 zoAl83c4uDF6>fxjieFBo*j?dgbZ^9ghyxJ^A`V0xh&T{&AmTv8frtYU2O~e@F&t{y+ZOM_=`no=t>6Wg#qAAsn;Y1VtDOsN zvqfj`BMzAUnO>R>n%aEQtaAB9UJZCler-_H+dDuTq z92G^V7)s`y&~5d>Nltd;pQat5T+`+9kxlt0d*Hrr@e(n?J8(y_Xex!DTIb+F|M%17~XSopYu-iF;za9`X2Me`N5h^@lAneOf*jD zKviIhV@o)}eAuucUXHL|T=>(bUIynj>)o##=ww!aUq@?_=cA_X9dd*7?WdKXI-S>B zD8Vb%-Q*Ra?Zk8_ub0nH@ciPG=4Bv!1X5OE;lK*WKF0}%%z4n!P?I1q8* zeZc`+FSm6ZTTeIQZM{hTT(-7k*Ic+Af39}!z-_DW50Vb)$UikO+xEByYpJn60zrg;FaLJ zZ+Qi3Rl02gDK4S426-S*M#0Z^T9LjlmUol$U+_E*?7G|*Tp0!Zxx5>K99lis4WR_j z3u2G<=aQQYgcaUzOeAxJ_Zw689s6_14c8NRN{ZmCY$)noY~zBF@5JTZ6!PcN_Z>NO zlkeKK3;ns;|BffFnQEXZUE7m(_8aqbTU+*+3zz4QDUTZzbcg<2c-c5T)^|MhSwCN? z&3>6(Gecx{!0eaVKN}y-{@F^g*+291@QZJ=-xz!U1pAG-*v{=YrvBv}SU`(rv-oqh zp6vSAd(7Vg`<(e3m9_Eb^1mPHnJI00#*Bw=@nW;IwOQcL)dQ~~@B5Kxm+f;VzpaXD zZ=W-^ozguuJ+e8ktcq-P5B528{#^L4dRv=mpEI&~C)`o73-r!e6yLl!t6*kFy-!Er zOzNGI;9DL$*LY>)ke5auwEnAc!VPGx32x}f+viMK+PZi-vuRaOgy(wY?WIOCr8?Iu z%i$&XH#zStRqHutsqmm-%3?S9Wyp5>*KKPwSb6iQJjvmwJ=-!X4$}=seHDoDjm<1vTbp?f{lQgXKPkp znT|6JkC(AIaJnpA&g5IW18ZKdsXnv+RKnZNmj_O5?3+lsM-F@MV7g@QC0h6MwPk~D z-_N&;KmHCj2!;b*>-kNQkr9Ov2MTi_P@6zof=J;Tc9a_29=O{FksaMy_ovBHV}7Paj`^42-$;^kk9U89r4sK)9`4lr34X!R z?gcBl8$$1mp!248f83U%D%ZQbHyQ`Z*Z;c?W zD&3!ea&OZock2GQtKC%TE-0p>`dO^~YYVk6`h8L%u0(0w!~wI9W;e}0*YwtO((J4G z_geL~!s32T+SsnP3D_|;+j(Zo^V<8d zk(c0HvAqQU*GXLWbF?Ptr$A6FPi!2FT?y^~K1tVALh$>fyaX#j{`DTi{r#r(%ZLBZ z-kWP#k}GR^c`74go^}j*o8!G4dbnfvBd{eZy%yD$sPqd^qD+wz-+)ilB1LKxC{U!r zMS-jNeZQHx``!^dE9+F=s&g{8XQXcc1{eUt4|8|88N3rLFNeGN$n=|prtj}JEr-Qn zX@+@lGcV8v5WkgOIM;u_MSXtGYeI2xbyWev`Z*x2>v2MQZ@=lSe-hU4U$ftI`zJBN z;$Lhql+K9?#!H}s`Uh-+<`l!%DO15DRq#*8KdD_q3Zi^JyE_Ry_g#`~e8HA!_{KkJ zpa|+Fcq;^#h^WVaXT|gVy#uyDS3@COk_x4PoC!ulG zm4!RzF$(FfL8yMayL&3AxheJSHUdTW88f+oIgw0z6&mJbyQJUVQi=%Jy5?*5a3Jz< zpAsYxxxZ)PQ_CG?9(RvyHqG|a_jiVOn5$ji@zwa>ST5ObTJ2GDk1no}_Sso!ouG_7 zDw?Z_`%!Na_WYB`hD0{>OiU7*9prWknj~2UeM^r01UXW~!yI0yIaNZENT}JLG>5$M zIqj!V<){Sd=E{*Q@lP_T$766f_#7M#ekb4HcyKs4o@b-M@mwPZ$20DOv{SViAC|$8jIn(?CpQF2n>rc13)ZN}cT%TXytz_^j7LGa`;azm)r6dgW zFNzb>-CYI;$E1gc`#Xo_`U)UkbK$Q&k28h+1ia%4Ptf6?z-do?8U zi#Qx)UKpP2CJ!WYihe-?3vAGom2C-pq0|>hOL1mwWvexjFBJJQsg`ZXb8*!z{FMy9 zT-}NKeMsP&1AD>Y0zWQpzeZMX87`K=zlQCp>`4MA37jNwlE6shpF}q3ZYqXnW@8@On_O_cuz}ID|_AZIB z@|by1u|4|{huiTzvafrgq40~XN?9&32Bvrrq;QV?)XCy_VK2ncns-vWAv2F>eviCo zp3iv9JfCrz{>(T{zh<1uel55j`!$*#f`|X48mr?3$+EBai9#$YuIHa+!XQT$X;fAjY0*_uKC8Iyqlf9+; zM1hvb&}cHsP-|OuawiHKyUJeJcTZ1Gs#ax}%tmjnVn&HpdwRlnvMO;CcQR|kdwUg? zC-w0u0K^#X{(eXNi7L=7_Z&o@o*o|Idkyu02=M`|*5K`bv%EQQN^+#7j=?4`0;8m;K?H@ST7Xu)xF_jm`e> zrnZ(^G9+P*mF;6JCzr&GOvTDNa+45-)>1{JlT-=ArL;)$#QriCmZ zhYqX8JFZt46=IZm^XUewKuj_pZZNJqj(C$e0(^g4s0!jv30n6{KM7R&8Mq#Z9FmUyrK>)HQkXO#sK=7 ztI`D-@9#0Sv_jf)cYB5X<;C^=F7}sNh3=-G)4!3!d-j(j^U3>*e(Rx@A|SL1F6KDD zh|iLFVR*8?Tx4@VkK&QUYVql97o4Sql6lVk7NU;2{h9l|%LbXe4zfOqORN|=)0 z;1{D8xa5sNPU{QKV}x%|>F>betMU2q*uIr)hcz#E_u7xa$NL1fMw>S=dj;4tM{~B* zagx9)fzgknH^**Za68Z&{W@xMIE+2QH@ClR14jU>L1zpx1$+YjwAp0>f?9)ts1ANB zpfN?;UuvjPE&gWxwN;v$l<^t$OoDZ38$kjF2;^82s@Y3|rWiJV65cnrv^#q_DpGZ{ zb)_{NB$#3=mK@y*%!(q2wZPq&giL|X!G^*qkG;?siM&ZD3$Km2Wf{Y1ja1^!cV-O^ zZbttMu6`?fm7lf0q;I`B<-YwT#+Sd1{iOq~A!Qk2CMY^4wL)7l z2k#^AnddVeGtXxp&pe-T>S6pa<1}_~U~;j7qXl5C?Jo;wdv?V85%;Yez?S`GO&DRA zF2O4h+>4CKWhhIeP&Oz`TQR@nSnxOf9(hc^M=sOvk<0XZzv*AzC{-6sH8lli~NDk>z9yrw2)zwq4FEc$uyF*q3f3=RfggM-1@;9zhzcpRLK z-RIzJ*8m!vJ#~C=_B;UV-DSfWRH}_BX>`!}^3Qv(dY`lI z+ZlsRGnG|d_VP&DvUa^8WRtmtFs#49Z`qAj<-Xxt>fjX@(RT>npweOSX=R_#TKO@; zl>7$2W7-9)EUGRGp&LRPG%pptL7l$`i?7G$$AI%q8#O|im%DpJ^1n~u)oKQCFSil$ zzfX9R^OW$TNMQ8i=*_Vk7~Br@M!$~T!N_Oq5`MAW=rCFo@w^sq&Of=4ZJCQMcB2!J z5EAx?m1nborv@m|92&8-PFn)sZr{$WnW%;@2X>>_w{3H1FQVP{p_%AA31$AGc}Q&J z$Pt5$tWrCYNNb9GDM2QiB3h%Q3XGgu;z@w%l2BD@1=Tq^Va;KMF_W4cvx(wT zWbiS=Jthx>t9k!5xEp(y!R6Sy3_ho#!ROe!3_i!+rCa=A>|K5*yU~ELw!}LO78(kz zwclNUdn9N+jzFQe_KZQ1cB8Q|{XO^XOsh6_qs+QAHWQGku@{NmXxa|NeLF?3$YRKn zd>9GH7gJFIu@`AmOYI5z`|ka+vKXU!)khsS+7){} z^#VBu)`bU27@;yS+r&lbY>HNzIoHHaGjZ70g;#=u-N~z&>o##p@8vv9T#GI|<+@}e z5T09W(oN27zAxw8XV5%fym59Huv@H03Wd<{+pXM>Z$+2CYwHaHoaEja1={#bj~ zkC#{4cXROF_e(Y$#kBSE)7kZzw_i7R*qSn-+2!~8{Osyuc0awjJip?~&hDsuh#q5V z>{-zuSGQ%)imB zx&(ZN^EttLJns{|$NMY(|F``AU-|#NAJc!IowhRg5&Hj;$7Y;2ce`iYZ@CM&3-I`ado>U0mp8lT8@@JR-re&Z-ym=m>XFCUOMP|;Jw38o##%9< zCmaTOmfAi2fj2Gr^Yt6c&R3VdZX>X9$oh13>Fc-4OKPsbg1S%U3~2(8X5C?O&2ui# zujE}%y=;BO7Y=j>$Wry?#q||SUs(aeb#5j2?6DGj0=dDNpEVS{Wk2}LPj&QlCHTP+ zQbM?!XQye?`b)=o;dbHXEjhu!hY&00n+$t|yno{{_!<{I+A=2>DkyPB<(0-)r$Su_ zYi$Q11VTTyl~*0tZwa+1NaahtRR;?kFs0`Q1lL~Ds)H)mC|%~8K37-lmT{mVnS|A~xDoWF=b?`U1 zoOPIK(L6uT@6hKtd&kz+({$vWCVFe zcL@x~{omm~_0BrNv}@KErroo?F#VeKh3Vg{FHHYtj!ge%ePLQL>kF*!&VoIQKP>-M;ThLKSeW$Y}SrR;M-zwY(!8)VY($n}mAfBRx5M*HtW+glX;X_^V?-OCJ{( z$SFOzGQffsAN(QCcVSp{!_VI~JJ~95jwE%^y#+8sV)l7dUuImUXESae-A<`i@ov_k z*#=pW0c?s2(ULb|f>lTzv<*u2Aa&lP90sdkH)QZOI2$|;&IYg3-of$oXK+0I8XOOw z;Xiz)p5Zg~44#XB(A4-Ve?Pil|7khVI$x*pQ+%i2)8CQH)H-ro`^!Rqx>%FwwqF2bM%~`LZo9Z2 zagD#G?d|RBMC|#Lwq5O;SSF+Guo2PNc+Jd}sWirn85d3`a})%+KaiFCt%D;zBA z>x^u@rv&B~c+@-a5k>{LheAYt*vVsp0%%E1&=e<%T5k<*QYD+A`#CtDahiV5I1c`2 zoTuE3_uzlVd%-`uHc<=zv)2eCZkzlMtOdYC9a3KC2w%sS=(SOT1ABG?k>G!Z?}iVv zRmMbbxvw-U$|6(2C_2x%<5%K{veiJ(lG`PU&hvoEUFp0Rau<@0az)Qa;e4A@@R=xY zgnSA0FxRb-&&X}$GjbjIjC@BvBj3>vBi}_ov_R*2Ir5!)7u?J?M-Fj)>&;NcUko5B z0hBa^TuCH$(!}$Nn8Ix@5i#!blX@(1uVf+)!{&7jX^hq;(NX4~L$=8&4$PQQOz{Rl zQj@c|c1C_W(F{3cyGabUqD;=o=Wo?6rBdtMIe#v3ttdIC1xxjSaZT%i92^Wj1_y(m z!NK5ba4zS!JpZeX4<7#Ojt^e`X~zdo|E%MK zw}0O8!Q;Q^_~7-gJ3e^+n~o2z|F+|U>%Z&x;QH@7KDhpejt{Q?Wyj~|Uv=OkTl;A5 z@OXdz@yt6<9=@;H(udoV>$`_rmV&seH^c%@Lieoy5W2VolkOTsP~d@VCWm?jLt@-~smT;n~$D{$1Ta-d>w} z_UZZo6ACIj`{{z2@Zi19`PCi96xP58Grw+)X%>>cu*P&i8u^XfM!w&8o$30>Iuk23 z-sZ6C!O449+VR`2Gg&#cugfqai8sG*my_0YCPLco(SM^yNB@nU9sM_Yc=X@s>6xFS z$7lYIo}bptbs&$sb#sjJ;~LuitVfc}y;<%kIsmJFd(C!ckdXc(qa{amf1=qb);cC3 zINm1oL;RZKTR+uLw}1KXW}S(t#Nj$qey=~NdAaXcmzUmIXL2UH;yGr2wj&X%R6w7vUlpKfnof{t|X_AZh1 zmJ7~{&%3$%eiM0l5$Cm<#EQ`paREt_Xen7u+Karj&FDiJe|kTp;b#l&x55Eh+qsc$ zPXJhW=k_+W)`*h#D}s|HQ>d94u3-0ba6b5+eh zzM~&TzKecn{&T$?`A)s)UvI)oJIj-Sj#W^Qe}VYH`=d^`mp9urcdQ07JdyqEp^Di6hpToP&a_*O{)d zO6Uj|`UG!XO~P>F;)Vx&BdjxVkB4pz#n&r!NB0}c<+RRJ0{^Ei_rcRY>-ga9pLcxl z_%Av>c>U{+51#*~auX{`-y(uK%IqgX=G?GvOd}_i)c*jxV2Qoyql} zJJ*>o^2g@r?#ksLLsbD>Bzt)}MF);pU3n;6ddXOIhp>zkA-v zfdp2UvTEgK)UGqJr8KrotTVAw^~Dur*O|B@x?+7RYgw){v3$jC66;L2yN4JvonPJR z!b1&v>r8wA3Y(>?ORkn0GVwRZ7j2o2m^qF7hR4YF=hm6D_ju2qDW*(0IrZVnZLV`) zQzq7wTwdwrq}VgDK9eP;oSN{9)|v9CkCJ+8&m>a0tdBht6Q4sh88uvX-?}9_m+B?s8IFEWKT4dY9l*4~scCgt@G<_WTY4 zB1YoNQcpVlO&|TOe7nx%y=%l?gzY+02#eSUe}l`J{}j$K`eA;DK6+%zkDeJmqlbpi z=&AT~{+R1bJg9qnbFlD40$K{?;+?NKz^Lm?2MOM97o7~|_(FoutC9N@SrTS6e#hT+ zor%{7Iri6?yi-}$kd{E%GoetHlqFDo8Qe|J2A6y5Op&vXDEKrgVINj{ok>ykI+H=h zsWZ5Cv;WPY)&(t$~ zrk>$5^$ee>=L`3#)qBC0r|<#QUZmEU$dap&D+K0Gq}Q1c4Y-|kCPXcWzv1yM*O^>f z@G8<>tXa9Y&J+_S?>+3*V$b9}!)B=f^fvPPS|TBrR!bG(B5Z`a5jc58CbF(G5s5t$ z3kHu5nlr_oNhjnM-EV~hzb(g%@z`Hn+N2ga6Xcf!XGJOVstRs`-Os`K;CuQ#_#XTZ zz6bw<@4^2dZoz+jh0aGW26MB{CbzL2*{tur&Kp59+l8ZBEQR#-^3idJOKNLVft zt=~%APg4cGoAV$WQF8iZy?^W_4s|ba^6w=MrzAGlNvn!T%%7(TnWIYBnhrJ#;v`zx zl8}IjZ?cjv+1ISqO4Iib^Bty|$;2MW!NJ4_2ZNu%!Qg9fFgP0=49-Sx4bHyVI@8(4 zp2^Gbo8_gmx@PAR{pWbvAG%*0>+zg%oAH`)o$;FSp7EOTp7EOT9=$N*J$hlrd-TGL z_vnQgZ`Z$aJ#ik}8Sk=q%j_!HHLGB*L*3oEL;$_k!b<(^X5#a#$0b^=w;TIMui2ez zj7invwE(}HH8NE$nvpex-EIfeOU=T^*Ec57h^S?9pd4s!) zD%or#?RHeAr539ncNoP~68jynN66idR{#%{3nMO@DewDTB|Yw{E2MFx;BLn<3hY_+ zxGPp9!`tfEPbBR!Bbwi4!3)!xI@p<{lNNi{8Rr@Q8Rx;ljPu}N#(8is<2*Q+aULAZ zI1dh%aqfYi_2a?8tRM3{s9l+N7u#d*AKv~pgOgoZ31Y_YuUjrNet*;P8Na{n_>AA* zb$rI}?>j!@_YWPPdHgRsK0p7e10OE~Wbns&U!HJT+QV(oB`MeY2)fG0+~a1N1;Lwp zz7d);zBc1)Lssr$<5KzboXYnIUj1O2rpbKpH@KYnKNXLDnBSp~9+~o^XNJ${q2V*v znLL(zVQ1Nk8Oh>F0^ZigzRFolnVQZ7BqU`C49ET7;Xn1x^=;ZU*SBf+T;HZ&3dLjk zH-j_%o9o;3Z?11us(j~DKHYL|(roWzKA`b1q^rk{Am5AIUP7(+RRQiqZA#^kL&L}m zU)}Go3DmHcV>o!rlXk5M%Xm+Ff4AT5dS3*DT^V!AhYTFPnQHVn{)$3EhDtwSIu;}~2+u&^QI5-=; z4$cP0gR{Z$jMw0J_zeHyGxZFgsb~01J;P_}nfWmF%zS8nT>FVHeXPP8cIVs39$@z) zW!lj|uEnqg)l=Iy_^tcK+&tDDq<4`X#e4ca{T;bX%_FzP|JXJzT~x7hKa&R%u*zbN zH>Zds)3YPhE6l~5sT~mwOQctP059fe2a#Uw;ZmJ7y%ev=ORx0YyNBQ``z-cCzZDL0 zLte=C)oD+uP0&@qPG$aVf?WszwWXL?+6E^=>N~+6puzc!)AW1BaqvImJoumS9{kUE zFZl2EzG&-py|2eF3%;wCeYNGAs14pk@!3(4)zHUxl^d~&Wr5eMDhTx1-D{0M_!&5C z*ZWosc=IMCURXZ#@X2nX^&nf(hsQkC4i&pH9)){@3i~|r8M%#oMy?~Dk?+W7~dA(0D&GEkf;*nK6xlh6RMf&e1?&mV*K(WfTfBcF> zd8PPp9p-D|hWnD3rM7BBr|~1FY1oQ^wci?SOQtt71t2{yr zB}_JKeVyA;{xD~8jwF`lasiNY7U;-@NmHIAi<1T6mP-a%SOG~v5?SoLn*E3$%(Z)B zU*j-x?T;kNJ?S5Me@!vV-9NcI)069nor2Yr2`(*SgG_1)nntSo8(WH%%Ss_5Nj78M zzxYoT2eB(*n7u1GIOc|A|F?m3T1PBF%sl?WU*lQZKGp zG>@qtYmWfkCB=>5-oO3#|4o|pKmTv_`)~jE`u$)2kNW)||IhmU@Bgp-{!jni|6TF_ z;s2@MfAjy*;sWH>c_UCg~JBN#G=b?^FWE^uX74_t%sk z-8?$^YwJAaJ4xUqf$u{C>JRmR_Z=ra@O_NwsTU^+e60kI-9Mb3L%vpmr+g;~{CP{j zxqeI!d`-`OZTZu4$k#~ul;oeLft3^cmGPM%T_N3oUt1_V4EV*e?;OLX9{R&|{8{Jw!%q|X{xI^T9vzhj4k7W` z#CuOKINZ(%;4eks{2Zq}6ZylzBKv}UV8;xi`HZC*D2q>51<1Sv@D3#Eo?F-EuToHp zTQdyv$43*taL|&aRPli`rK-9j(cmI2fiEzWbW|Q6KPmwJXn36o)E|B2k515{lGzd< zN@h&x)>1l3c9fP@Gb=zFiI$9)<`doi!SL7t+XFtu5LS?iGlD0P^Ab4D@DJF7;-P}C z38uU{BpJZM7DHbgSV*ZqtPHW<#TZ!I*zEmt#Ri1@UGOcIYraWAz)gCzHokPHOcJl% zMv(8l;P#J&FMDR<=i+ClVvntTEsWTZ(~S%D5?!T4v*{y$j4D1umzQ#eCwwrtP52Rp zSnXRWHq7$Wh*-~cB zEhi;=doL?WgcT?1BFgza0=cXlcW-l;nXi@Vgu{u7Y;G|yiUBoQ2zd&@@0(UyO1Rk{ z1ZwLj`Su7)Gz9WpUUIs+VsJTi^x}fy21Ih{5NN8<0YR9(CBRB^blNi1W|e3YQX9>n z1vuwlak{vm=|&M0sB&=cDPc4r2}a)#uoq80w;L=5@-y^MteQaCCLnCTX+#%yxZU4z zy1C(G6zg(AZg)Xcr+lL9gMoQEw)he-K%b~-A#@1{k71Cq`z4->vs-G|BN$PZIml)k zgev+-G~ZJyLZ~?{1Z?TkaEd`F1}X7GtfE-p(^88KtEtGcpk*pYI&z^i%2a)DPct|r zba-+b64SOPvZn-Tse`5^6!~ezzY-FHc?RI=8E(%{M4z8w$?5TNP7o4(L7fol=!?-O zqL0rZ&_DbEDE7L|$A0EUU-lWiywVi*t_slaA6}oSw_3nP`c_UI6uW;lMA`cXN`yVp zS2}3D5=fKKB^VPc>gWf16jq!hbcv+Jds5*5Gj})^bp^Pa4X)VcRp@aFu7Wx|>KcC# zECwbUS9oOviQ#7`gcXUCIe@#mq8}Na3>l%|Po3>1%gfMi2U)^nhFe6CuSTB|ZpCCc`!s4**E0V@XFT&;0Q#WLTt*{tg7{*IL+lV5NbFe z(0UC=8oqp)=)mVL@QH@2(5kP5UZJUVorp!)#h~>h{3szNgIKdvv1r={+=_z&oEQQ= zIP(Ne0;aMM9b6U6*h(l_y2Qg{(3CXFQsodHR>E7r-I9-s8w5@iQ`)+{!rpd_@G}#r4b4eHzi8f z1u8O#l95&EEA(0};JD`U8B+G+E35$;0ZhH@;%Hf0P`WNv28q=wvjj+q!X8#ZA`0~W z<-=5z5>qya6~F-;TjD4jHQWYpd_;AwoC$F%Tt&Ize^&UTSnE19;R?*=w-d_6p3z#7 z{Rn}s3b=sS1?5Hnbm_OM)KPp{KQ{x*s`dOf?g~bg z-V+zk2c1q|^f)9F*6tV zhY!zQCc{?ITC9o^`S2lAu0rw)iv8UXUa8{>X^F6^BNAd7R9jSHk1QZim0Jbc^M^DN z-8h8IBX2V4AX#2*f*THs>sNYCC3xe z0k$Z^0Io}<))jEznMMR_vI6FPq*&%1qLBd=aC(F(6>twoOYLPEF$ZCD|@slCoZ$s*Qk8@7sb zD*#b@SC3LT*9^NrZBZ@Cpvuw(Wra9#UuRA@)=tS%q+amh7b(z!5US@~qG5$*$QY$I z1RRZ|=$c0cju-m5iAj5+tYSL=#UllpqyHe=bRU zTes`jy`~umaYqr*BlyYu^aQxlj7&e^Od8uLrhl-aEzc?%s!%u?bLx*$NY4SS7a(Mh zcC>QZq9z~{6-5x{kf6?1U`~@%naTr!7NbC)j)SFiyILY4piH#d7r}d-qiL_twDiNP zC0^_5Oo><1l+nveLNbu)YegASE}s?)?~GykM8cGim;tZr`5wXA&@Zkp!zGI1Nz_D0 z%rZx7x|;f1!x1K=*vazrOqJ=+imTjXq$Mx%Q+#!VP-4iyvjjuy$bv5O4ulZH?r6zW z$VOQvE#2cLR8?S>fLbn3))cL5I%Q#%EI`P+moy{Zh8I)`wt&xzlx52nEfnx zKJiUZy#rz?zF!7$vp6qmw)WP zz5KD+EcxrrSTac31n4xv@1>tVee^SU zJMB&Qag%J!Ptan1G0(Tn=Xo8o!@ut z>1oE;)0dS$JXu2K%-3;P^qIlSM$2pw+8eoY7UlTu>f|xtWTId#CDzqmgHm6H!H%)63ZqnBPw&EZwQv4$R>+d zk6PgLvov%#(e%5PkkeDG=!x2{I(Y%=v^8Xwg@B#>l4XxDtVrzI_U!4kKDYODn{`4P zYoCcGWc5R6V|fS@>Jk&xA3%Y;DZ$3he9cXBr~`X?KfaO`cwWNu+OiGk$1r~1p1#Uz zHctt%$chp!%M(i4N~q{Upv?d*_Vkt@lzL;IaDLDuo%63*er zOi{MX0N)!d=FQp!@ERBUpP0L8PsPi0-_a$+T*A!GSD979*G6W>PF@p2EZxl4C++^U zPo*q2oR%;|2?&g7CQ{8oEz&c2p!!zB_xD=;`97FaZ1O59foK{YLX|KdC46mC`3zOD zlvoI?LT%XSbbn+tDRoV*JH1_L?2(wQu(y2OP0>3ow8|Vju-3I*yJsiePd-P^k@S0 z#=;|^sXS)=mZce!mgqhKR>^|JgZUEGbhd2#%7`{4G+|8#V`cdKv;~}olA41eKMg$! zS4c=~bQDNov=D$mXe5RzuCT11VgtA!EWnIeW+S#sFzT5Gjtt_?KoJ;}AiD){L6{JL zE_yIlu27BT0!InLClKARB4H&kzyVyp2~3s28gruiHZU9bXc9}Ui82>bM^}{EieS@V z(1a~3?6S55dYftQXC5$ZB$`u9PC2zR1VD=Ia)vD68e?T~iY3xQAQY?oVi4@cxKqQ` z7rr>J+Xh+6lo<_Ifa`n<;F1MtjBP8S;Ki~4J^8lqNo@gUqbX&ntpJx2f^ZxLY(W7o zFl)8MtI-v3G0$y+&{K2y?Fz7FbTM0QOhRp3X+~4p4D6;@l_&;*BNrRzc@G|KCDemb z8YH-Cgaua{z+pCTiQsC19PIFu^r6D72?PT13@ETsl;38imb9C4vdLsbA;KSjr5q!ZYC}5ZYb@a&x z7(^lxk$^pObBVIl>bRj&tjfHZ%27*v{;GU82!&}ID;EQ7l2x>$&03M^2GYjLt!-EK zWU;wXv_T^L(vL2YFKq=rsx)K;N*Zvv4!*&aSIz<)!VaW75vnVv47P;ght^w=Si19T z0H<Qtc4izv&!!d9%g15@X zOG5BSbOBtc($vxUHh|*`HQueiC5TDdUK&nSg`!}{Xtx(RqH!Av;5aqHN}GYJx`u|D zt8S0Ez{GsGMw)Bra@7q%B+`1}BgS(Nm)ho(tFCnfB~?doYB5_S13WtdpN42M!&E|P z+hxwI45~pPl(OU@VxAx7x$@Y$$4}?yv8TVk=Q)X|oY2b%aA6}w zy+Q?OdoO;Ey_9BC*yJT2;~jf?37UdYLOY;X6Y=}{f+1L24q=;C=Jh1-GCzd8(tqL$ z&)Cyrb;FaDAs%D%%!hvFxlyNAZsReoXH1zahDfl_ z^1*^r5i~m^iX62fCFEmFQIkd7l$lea5!ev4gu=Kfq7%6kL%OjgkBwD?p8f%zHm}Eq zuFa-G2zyP#%C^hLFj~L^uFq_oc!c*Us-g*{eQ7Df@P@$5cFh2Sw=vlC(o3HkS@gg{ z%W2OE0?u{X=t_8ug&p5ny|_UC#U~?X^Fj*b;A3PIqa~gVE-^fZL0F+NHEL!)qmwbY zH#0^XJ`Etw3_P3xT&(D0ESfCj(eMlQV*{%%h!|HTJur;afxV~ZX1gcTG;?AaB6b`B zUPKc}4A9YAPcL388RWQa#1gat2drLVqE{BE8jvg&k(zljBpQu8ztBN$%S03MNe7XT z(;!jQH;N-z>p9bn-0^v=F|^m99KGY{JELUpTooXi=+SU=I0RZ*gcu*9Udkb)#1vU^ zxdm6+e>%&Qsfb00KqY`{f>$z&VUVh64H>krOpgd*_MPaQ#@fb(HYRgy{G5wEm%@eA zoP6A&O8BHL>2HgKih_vb6Bd-ESTct|&$Ys(k;xJVlZYf)O8Y31a^Rrn=qs*`Dl%^M z1&tmSRH;2Z7lhjz#=MajaiVjG`h?1}7!L>#;VvbYE7Sil7B0bx?zL zr>IB)M@0+Z1kDRpnl{J_R{>6G$$$YZFwmK2F5^`G3KVOk3AT08v+9sUkrgUqlmin{ z2^`Gy7p6FJ4wn`p{A?9lk#I^&SLsHG!FY#~8Gea!QS6>G^B#Zz$O*1=2tmiv3_s&$ zFWR%C$DE34a>o8sfb^KduK@>k$rXY|xpXG&i|u>}Lb{HmrH^&m0uI|zhC_79injDA zU7gN&M@5gwl*(6JrBw(=0!ph0UeLTY3%J-MJLa$tVnYZRBFWU-P)?PMQLc^gVBn+y zE}2rSM8f@qQDk{lyR{J;>{VWV_L6Hq^oV_YaJe~;Q(A_^;~NqsDk|AL>=Cm6QSYHg~U>f zSPsX=K6cx=2vZ581^efh2$Wgz9LstD4X$ZRk0u>^#^V|G9%iA+^j0f%qLprK0UVua z4MK{SJ6e_wu42bUZ9xf{@Jzt=+X)eFIU#g=#DO}bTKkx;z`PGS+Cqv1&?@?ZP%IZ~ zxadPc*{IE28gdcN#KAh=VdRvuXqCQ6i4Atz40Gp^VsbR9SXEBTqLm}`+)MS0qEY~7 zGiZM%toj95Am_*ceI=EAQC~afbjt2{VuC>XfvM8XFdnu_y`Mn9`+$L zV%4^#Ea?YM9o{U~2m`&sBz3gMM${{UppM3UIJYwi9qxQo?cf49UTCB<-6IGonW)a- zQW*+y5V^KKfK`_ei4CqT;CjsA$M~kN3Y%g?z`a?6KbSji)+;t5J@ToJ$&*_|8j*`) zkVqFqQ%V2@?|jIIkorj3Rf|69f04rx|L~%*EByTV>gS7JYfqoemGUx(&oky_kgp;P z@S@jy*c{x3a;HYng)ctQy4cglTAZsecYa)QHJN9Lo4a0afyvB0ssR^42$0EpRj6DW zcziX;%8)EEHis>LA?1yamrB=87KUEZQ+on3EiqL^f9bIu&1xLWHgUbl;_5@{J^jV?ElV|wFg_}-TwL*xfO@*-(Uk|-yT>vVYL^PuQLaDn!Q1+J zH4}^SK}N8F`tTdlnbRtRCA_u!apFfgaduC)96ai)8<&`B5p`L6swLtgf`^6BvQT(C zt%FR$5+wbmc0%V!534B-rbk%`q5c{#qhCkQ99u8@T00@WA&i~S{n<}v=a=m1clPnq zhESPdjDi6R1#Un>Fn%h?1Vs<>r-R6Q2~r) z&M`3B-*=OBFmS+M7R0!%vs77s5P%7#NIYPON+snB2gWZ;DKf){Xq764r0`cM1gfqt zFqCu@AJ_>|;ky<;)j7_Ufpggg5m*xGE{XhAfHTyk`2?!5bzVr=uaLqy%YmL@c3(l48&CEI79c{%>4@*t#1vvYhZfi)(~?U68S^>kZ2%F%HA60k6GwlSX>JU zumLB02pDF;Cbx#@C<5G*dHXn8kjtscZSLe6HMF0;6v_x>RAI}8aG|0$E}|2e^hhryQ$%fmO}_7Azzaa zwcrpc%SuST;$fC|2$2}-oWlzXRj1e7;)bv3hoScg$rrJ_4cQ~)^@czS_2*`?JM9`g za_23h4#f*D50&LP##WbaO@kXw+&1Z0**_xv$&Ou{Y`XEyy_9G zD`AS|!NzCU*_EzdY9_k8EN9)u#pS#^=iQ}y%=tdk1z4l?c3cyoCa_vDuh&iM60_f! zYh-RFw!>nCk;z1YpKmOE$y^o@^(r&3C_|vOdcDbZTrQOH@I{s`#$r|Pdsr_u7s8t5 zfM5v`RF#jJ1)~mgPFCsk?w93h!BR(Frmmbfp{2y6O}B=Dy-b>5?rjkJ6?tAz`wE)H zSl%nvn@C?#@+hCQI?<1c)@ySzm&H)_0y9gflf~sFS>;W57*wc$o)_MAsuz=a6KM-r zCvR43$ol@I6QFR*Y=RuKl^ zvUJaB@*%n|;j&k~MJKcPDS0B#v~(d%!y7}s1s9^jAO;*k z80?$SeOuq6`+}Nrqon2z^{$(Ncg4s7T{o2@>U;7gFoFZUcR{=@Xl_o4MM0uMnc3TsQ#4;cvl&jDI;G$$Qf(#zGV%t`L6g1_OsDNvNt5cgS zB9S3%1`rljh$o;KE~|!Xy~eT>E%oA1`51-`%%&{-Ae8Eh@kc;7B~sh)TcNkWZ19ZC zAIfZ_EO!K)Ryyi~*rcs$DY|Y?;cZ8HRWgIWt>S4`v9$<5vO6XS%LP0bpM5uaq zR`s>2v@i|9%GFnuxk?zVI@~F-EITX_O_&W4$tSV{(E?muQkk46C?xKwan<%`D6N7X zG8J%zzu8Z7y>iwSR$K|a0bFas6bt(%ywz}ffYVYa0P#ZFTfS};SzkyG05{kO5(9z4 z?iT?^zF@6293@s~0BgkDX9yxY!Bh)PUpNNaJdQ zHO*{SeYIk8tNH?g9@>oWQbJ|fOd0c3J_d?G`yfJGtsA`-zeQga=OA%|Y*c+gFJ)K4 zi-hjSWO3Pld7kd4wqxraWhdm@Y#zCI%JJ&T>EWJdoYhWl^OS7*>?A z@6#!f*FhQ(%_}16=Qbm?DF)tZz_j1`ylf1Jo}PJNyu0O*k%z#x6XN;o2KGEaaxdt8 z_hKicd(mPiv?1{DCV?kAx}VpU7DF1ms__w{3BHg@J~afwfxv^54}=uU2|`}qyjB#n zr5_L+4SG&LVkbmJno1x^t~Lmme5Dz{wr4F!`w{+T{X{5xn3@wll(11E0?A_Ozt5yiuYWN}%jIZx5%ZjbWAg}6{ z7jL!47g>3G`s{P0Z;x^vP6v^Tt@4RdpA3{qS`|x-dwL!MIx7Th%z838x3td4TT!m7 zG0D?-fsp)YUyH8Z98z4EF&+_9PV68F;G8FkMv~x4GloK96TI9~76}GsF!!A#Fw2q5 z^`cW&Ry_m)B?}3etC3%73w)v!x^fCqd2iDg6@)b0yD$V=pUfd>gh?&5Dmq7nt6Vw@ zFG5=x(c;*1w4IR1dDl*etMD;9ArLWkLV{Z9u7Jx6-~t>{%Y;Ss^b26NU;~K_IQ@=# zELBF@31!n+u6F_T;0h#y7v>IQ2>4?s)1M0+Q!@{+eKJ4{*MiA$hf zmr0qcFm+Z8K%zlnYM06zS3wD-bpk)an2^@2s=@S^L!PBYA!AgX+8NdE8!_&?1UJ`3^yALHhdxt*9RCus6k>Y3W{N* zq@56ilz^axg=Ib3B8L$~`kE?a7eNS{EeeG|?1Y|PkZueqa=AfSYV4xiREM$7c+uV@ z$~OeHBX~tj@PqxcQ#@NfI-@8dY^<&9grZky#50d%MTh}MfZq2n>Cp-XqG-%EiXqai ztMTv(n-KC2K@CUQ90;UMb!bzYV+_HGNI1>$DS&aKxzR{55sIG7CI4CDn}jgTunzJ? zv$FGILZlUYz@I%fyAGlmgBUZ>zBDTaMAWPjrlq!?KDCMzVcMj{2naPIhG=2r5?n#e zGzcaeiLeKMUOFghpPc7Tl5AcItOOja7@xKi(n5_i2)RK6Ikq71QBYeuq1GU|GXXiy z3e+`KHsHX4Rfc_pZ2ij)m&h0Dat{{1V4gUtclZ-behqXYh*Kk3leil-2%==XvEXHWD$GsgW4Ad0Mg^ZK;#xR zowst1+^SJBL)-UjO+e&~O9=!$8Ng9xwq_5mkbw9b#3JRs9Sm{;%+k+~ub&lH3B5w8 z12v2Yts};2!DJI6CJ9g38t<#0FMhq95Kkih@lu-`)r5U3aNJIa_X)lX%D$Ugro?%> z-wNfulHV}fybL0PTdv25$eY-_4{~XZ`&;gOcvfRopZj`-JAZDjS$QDs+X=Dw!tJH^ zjNBK`%b;TD!)_RI*_R>rfz7b(gfMiH#I3W((f2|0pblQ_$CM}LLR$RLY3zmwkj`uW z?O)poWmiru0%qS$G9y}UO#QpmxQC}!!WAexA;hN<4+5)fjzZfBt;Rh~G7q&EhdRSh zZmXTpu&P%(dBr2c4Tq`A_jQoID37rdddKAEk2BEu=5|8goZ*+{@pj)$cLhf&)N!&C zDmnbw>@WI}N$b8eY)EsryI^0ME9`_YdExV~%uFUSFM99Pjof?jHuNTTLT8(;SJ^-3 z62-tQWXI%e#@1=REt08~M{~zi2cXZbOKU)9K&Unjr`>;Fv>4x3? z*s@PgE*!TmwdBW^{_+gl`g5K>SlQ6h9*aKg>)E06c6WR6>GI~-`pA!JPyY*^UqBmn z*&j3t|G?@kryOf2gkFb&bd+$AWsNq+w?D^?zTf8k<|(Nh3wdicPg^^kmh#TKkG0|H2d}65SVPIY zM%T~*VM@OF&2Ya-{Sgv^uvOx#*f&CSsrg-kW3=X5LtiWQ-&Mdz0e7??N0EqaOCR{c zY(+B3Z+=gJYe=oQItZjtk(FRDQaHa|ZoU8b8iSQ{=c~(zp>hed* z(y7X@Jy(}GSHbEsWtSAfG-LUrwWO4MY-BpSbd!{o6xkMuGo-3wWjLIxx~hVlC5j~g zLo)DJtd?w~9JNPy$61&6|6`wlvu^q8V)D$8@lp}PVTMlo4E|z|z(}voy1tgvVx#Oc zu*$$J1N#Z>DmLa6@Yn9xSBMx(x}l4mu2yqq04tn9=EWx5{3||S=RNxjEjF-s#!3z| zrVXgOiv{62xoV;>bNu5Osp*&qy9 zv>M#7qH;$S88EG#x||X!m4F8egHd%TgSD)dU7N~7s8bWdAoXGioXY8;`x%>74FbS{ znPMje?W82DN{!nIrD`hbXhQ6y_&#AuC~-=VnYJiI+34w*rY$FG%jjnw=`>9OS#rX- zm$(%b7rVMf*AUd^pL|;al@je@Ysh^dW$XMs0GznG86aW#yx^)_vWyaH!Uk9B@D*@D zU2s(=OC(fWR=}yCY0PxmL7{2sQBDJzP75{t=zJN~l;}_~pjbl%F8K_`zFQiNjk;;w zge(9^P)A$JPaURd)e5+d4k1mOQ^v?0>XB>G0yvw&;L)_OZ^Ay{9BgC|2JZnbgBJo7 z+a`LnMPi0~B}l4S;TU6C>NppWLZG$*9O(r(2-7!$`+$ST!eBxalQ)oV&U=IvW(kD> zDnEP#TvXNIN)3nX0a6s%P@O%cn@E3yE2XePFM5)w2A;@y1304r9IUt=MZ?V?my%(4 z0;HViOvc>P;Hn8kJ6{MBP4^c9tcn^97vTuoWTroFG+Y7B8Bp>|9W@k7Z9SIkwkl!j zCDaWsJ;|IAz-hQ82yFq!Jm(r3m@OJEU??C(H8}u{D_TP+(uhD%UweR4O!z7<8m{2u z_(B*BN34KE&vP{`4JXhC?JKS_?JH_yRzgXG9>L3h17$+1)KV{M9oDuW^(JWcxm2z= zD1TkYsJwJlMg^Mj!_8&{Ih9*(cF8F9r4Mh=6m+f*;_cz9Cvf=biB221J>8BBu(eIJ zC8y<5L==8&bPcVUr-VJ9&U6};>-t-qG4_`|xq^*`O0d?Rw&Ww)z)UD5-~qoap#hiL zju5)UWa*~S^SI1LQ4sN9Wa9Q}sCK#_WWzUv_R>w}m0-x7E*$@)a>^bRC^s$Pk(`|I z*a)Ej7nq4+s?Icx<99BpX0EjGlk;Suie%QW#vK!&SZmzEi(rvB2IKYH{~`1?;-=v2<%!A$c4uV zAM^=5+cBx^aE;G{&mNp;B;HO>l`n&%_9M!+Rbi0R!vkIrk2_9@Mv{bdGy2>v7|w&< z^}79aDdFbA$T`j>?GY3|jQEvA3}lEC$me*hASvpg@~_(0--kl_mZw)v>RQVhVn^E$ zL^j?vbYE8oe1q8h)h$-Z!pjc)?OdLLkVeXYCvvtbV9XbPT^OKhc06XqWfsjP6$bPK zxa+dLd*WKe9tQ2Ni#REvaL7W(7Qj(?5#m?*IsUqcVz>MJnaq!mECz7ta_OP{TxSLydSB&{B^V8KW=WHaUTMr)|>rxk?v;@%MY$DpFisl^En73rS=g1 zjE|FkE=AL7h_x4Z$f% z6n`*#PAG89yv&Jx{RJF65=CFHe&C<=`B}VNby2Ta!4d5t#;LSFGdqVb^ z26hlu8CpW|2kXjV8{9A2r}Dk=*QG4i7=^7bl&sQH)uB?eI|Um3!N?^6J9HrBFcy5M zH!hl{#XVbpU8n+1Kk(p>G3TPP?CZ~Tb`+>wU4kYf3Ky;v?YX0~N2X=uQM1 zf8986HbA&9v%e$u3`K+(Li{;19uYQ#d%9|sHY0)v;D9Ckph#%{>E2NK5O9d@5virw zJ?5}VZ4ly?+ek#jtG{jlC$7>XI>i{o*N!wHnu%>^As~#|cv|d|vrp-229N5qfqQg> zUn&%Y?UtKX(cd6(ONf$D#`au?Mrtc1qvI`==35Q|jt;IuM7qvF=0!xe*|cA!mD=K< z8xe~G(G)^L`s>1gwA3NsXfD&)t`bUFS~c#I&&>0<<)~z8jM5ggzKBhgB?J9+$+C5y zq+4lUN<@cczk-(qSGA$}XKKp?TM2Q&jp{={PvDw5xDqoqUWC136GB3-<*!S$c2k%0 zXT5Jj;Lf0T_y_Iy1b;?qaU}-DY$tA6WJ@)2M#VY}U>X8J2-X%2mobX0vSoSH5;*W$ zQPQ=m@FKr}gP*s1H6EmepbO**I6#$oXICi30OSC0TmeK}niB<(J04En2|&rLba{x3*#_qT$R7B7rB7{)d3m6dB+16?`sPnNU#+J z4(IXL1#r<}-leq$p~_scg3jOt4B02^*XKLUKzJ&*NT1);Fl<5Y4ikzKI)e)mm%aYULs`dx?(yfHTMs1H!M=f{8C=;_6yEDOFM~R; zLF<%W>k?`!B>D{sdvru{r8S8eq4XxmaYAD*$TP*b$J``#$T5wEmr2e*10#Q?}Os6%k`IAJAGJZ zUw_^baqZ>LTRxt%67Z?L{dIj~!Qm6B53erWa9_y1Te;Vg#OD31a}dy#ci&%^Z`Kt< z9#pps$?St8H^K|U>(v3++QAZ>xuSCG>~ZXU5c@0nN{d6cyUo7-wV5r6^p!QH^-teg z-gNSQY<1Hue_g&qA5Og1;D($oa^wAuziv6xD*Sanet1?96A@uZ3RQRAcl~v*;Y@XF zeq@`nh(wpbVxG|;Aq=U~z!&8){<_ra;cJ`k{rIvx`1twN)u-=S2EKRO9$%KnTmNP6 za=1;YW2{GKhwd?u8td3Gu__dzQ@fl7&mLZ-JZ3v<^{Izu!5*VpN584qJx2fa^={FR zb9*s*5-pr#^ub?re185(2Y64+mk!=Jn*ROtQ|)&5c=pp3pE$UG!kS;#ZB_z04u#eZhWkuYO7I2!y6&IUh&!@0f=P6t1O*2e9=X`;p3Z)HioXV5-0@Qt_-pv> ziktS=V4Z65*I-GGjmsbThXeY_Ut~Q-Q~8_J-zXuKe{v!vw03K4Rj3h8+O#1oZXO}5Ws`Z09_>mbw8{_j zqCVEpN)72K!EFxe_*$_~{@>*{-HIe5tF>DPa$beFh7P2=mQ9uwyGJ{g0X<6no(Zei z6FLxGdVV0?RqO}zW0ms(t3OTotvx>g+}goQmEa~iSJ6Yw@XLFC0^FO+#46_lT&;uy zBp!fu9fdzlz@@qAOhT)EUi*;_uKidEYq9ig%@V?&`X%*u9ghRCud+Ij?kdxxgoCnc ziQlz@r^-(f_*0Re}`UY4PSDbA=6jlEYFEo)xYD*{;TkgZ5XA6WMJm!y)#Giy|zU zvx?3twxGHrb)elJ(;!X=};52$4r(c@bZ8jJ4C)luv?lR_+rCoN!Rw_ zZII}efT7-&z^jvFp<5_{n~4%?J5_$=T-{Gdw+!<2iMJ@c2iNA4P==k8RHB^h(Q$&p znJi>hh(tMAQ4x5#V@Lv(BA0`cFX79pf)c(7n$sHX5c!%qp%Buym7qZs4Tg(04ND0O z^mI+(^{+DB38Wa(v&H{J6AD#i#P;&Zd}QGyVWNb@WD&x2Eum2+1YUA$vl8|R-8tMW zr{~0wrIFicrwt*|_0(nQo896>K2Nm1N>qQPYR|gnO9<5ac?~O1zDRPdJg``zl$b`E zIqXwg2*r6zK-l&5gsPWnWKj9SDnL?x;EGdVmS!m38mOicWu}Nf@+FI)rUcPOqFJ;~ z50?;vHOGh&G3}hP=~e@de)yKMn0ARos|DgEps8pZc+-LgQnO#F!^+{Nt063*8Y8A8 z{kVG%a4V2Ped5ctf+k38=vA>5SB46333ZgTh8YYD1-7y7-26Jx&L`l+S_6(yX6QS(vQ^2KR&}V0F@L8bh12b;H29@9 zSX=MfD)h^j0jDlT8*p+G7b1d0ZLo__(NcXgw7$roL^qdWA;hW}Lcp5VH{jMZp;x_3 z*<64^&1qU7zX+_P(d<)Vd$PL)IIhcnfTW;DmW1e$S_&KlAnNB*L3VXi8ldqq#;40T zwIXZi5fxH2Hx3_#Ca0Rw_SaDC`Ro~h%R72Y5ULB%b|_YlG`ed0GJ-Q&=|>YLZH-Qk zRtQ)xw=fiozeYx%Xz4n}G@u#eI21D|Ex)RK8K{+dNN8N81>xd}4${c5!XPER46F3q zYiN`fwUR~Y!k(5k!U#pBdG9cU&XS7~B|=Eqgd&h))evPecqv~sT$iAlTvF+I?lQWA zLj^D%t2DwTnA{Q)hW#|WLzPdMr5H@NAqLbNs!~A?1wM*8RFuyJ1RXR=Eh)N*Ldd7p zl9tos?xtKiFvVGK8#^jrKj061-mAxKWa2C$`l<-ub}*TJU3ugC3xKr{r(`h7qA z(3(|BBy;;~kT1~?a64<6IuYC5r$c<{#L=hnCS)EZUkCxxMAK$Y2PIlKnYF1mSvoU_ z&3z7|W$SBDw35T%(Wu@Rjt4U(m*Y5cK=AXBl-)1k&}!K?T-FksFHMf;24;2zxahhq zUSMDpAW_E_aE;ivgp{By_xGRm@M!4KzR$KL#p+XSe(CSUPfNz8Yk8jT2kc|-SNFcJ zmS<^BcAe)hZ&)y7<{2z$*mf~otG~udX!EmJ4Cea`jHrf?7?Z`guL#<*D_*U~{6t9m zYw&v93!nZPZPNGFUjw^2Oxwz?9uYA&o}$S}(>AZ{>&Ch)#-*Pjl?59%d~Gxlqq&&( zYh=j_X|{fF%LYztpX8;Br!-y}Z~ZlRJWJEO*zrt>@-W1P0C}WCE=GBX!&33t&$q>2 zgMr|aUtDF1kk27`mqVv%6?*TT@2g=27gJz0C{m-%%t?f(fik~sg6xOBAdm%C+UDg% zmK?F~OmAcBms1Fj)?2oI%0e|e{Y^i3YUkSELn@t7K~|Qnzs5cRon}ASaRBvJ{u(NE zEdeopMc2Ybe+@7SQwV(U&CiQu(dF^Mr>VtXBmLdI{;kR=1q=APP+)~8s;>Xh$gX}^Q)HJ@h%Dq11WveXed1zEMBsv!<%@M%u%D9xIErC8q49~W}O%Z4TCzUZhckM%un?wnTk`PF< zzeRZ8Un6Z`c+&ICfC!A9*I3Gco|g+t`D-}bk2xtn@-d+02gI1;uc4YF4W_n=$9#;M z(RGWz1|ywTfvb%9@}-0bDH8HH1wXa2S7$=K|c;UxVv5 z>qDRU&{QK#tM(i*P}ZoK*uK9;e_zd9bS9vQ*juYG00Br;OIq55bOEvVC=jyEWM)W% ztC(g7{J~Xl9bCm5A@A}1p%Du z+ARa&u``{Q~dxfpZ3CxhVWy#F7 zZ1LC7w?z%dcd+c|ctob>Z9X4Ooi1>~4nB6-sz{>wXj=v}ju-KB2(oed75rquy^Kq$ znrr=dTE1WkFJv4LmU9se>kqFHLi##mIGXtiRa9S0<;#4YHkZA;)POqLF(0Z5So0aR z*v3b%RYmHMe1c6MDee#8g4dG6%&g#hsckOFglO~m_!@!i2NVD*DBlO0o~ttGAZYR< zX7KB)2Exl+2%79S#Z=}Vak8K;S&_6sqIWkjZ4VryC;enEBSWf?DLBFaLw^~>!al=E z<^7GcCcx@RZAqK0ToZc_W%f6;L58KFx`QOV4K#LXuXIFa`J3Iu?Kel9Xl@VPMeO(0ncVfh4QzQZOkldnC8 z9K%kt4o6idkR0vn5x}8ssm;ncAT0hG^t^k-sAi1tN_MJI`4(3*i8Jj(ps{-J(8)J` zK-7^g2S}+B6-m=n`Eke&Hb|R(JImwS75}%iI8?Yaa^~Y{tyG(UxBzeiD_N|9$}@XX zGbac_n1f9!hvoq|=4>?JSw=uff5s4!5tq4=R6+ zygcE?{p!NED7+ZrxrP9LwQ$cZ76JS$xCej;li~xixiuh+wk6=b8#l+HayLjAlFzvZ z{u;C+%z02H;MG4l!^a1|3UIGSrI1+0)Qmjj3+1L=$MIQeTtJnMWMe~o}bVAOFCo#gfRScY%@ zdAPO8H=$!~aFQQCzKo9_#9u>q4UV@C8wHOKW8*tk*nhr$DZc*oy9`h9*SNXFt>E(J z9(5mojjQwcYp6!zuc2m*zXo5$^z(7;uMssFw+uf&7mTBKuHvr|Sdte#8b1y`WOu95 z1fA+8Vie?;OMputMm!8_k&xfFkxFl`jLzhmOAeL-n$o|qfhv8(0N`60`^N~PaXvW#{?valN z`hAW2SGKR<`x>{$u8*hhYt(=pTkrjt>nWBwZB`qQr3h3bqsA$qhQKd$+Fyw8sJZQR??hI1u|PtE19g37PS0bQOEj*68;vzf<2%68LHf9DUyMQ}6As z;ny^nSg17S;=aEIUraO+iwIWB381y=kNlJ(On_+@e+?eAN#x8^wQl5`d8fr!7+ByW za~`?1V5q-hNIKc-kIWT-R82}L6St*^Qg4y!3^gyN&363w$TgnUR!@t6^@4MCq|TLR zIg?mE8dYh9DPG)`BJ{n&6(HMJ`fF@URZF%h6^0vsR9b&@GorS?1m2b+g>;G>^-p;F zeGS)tG1))x*I*rn)e%e|vI@@nyjut{o{PT*tIw?CXFZx_-|hN5=@?_V(!TGnQL87l zP;ZB7csa+`z&+6u)vK(>BOeXm zzC>WK%t9As>MND9W90pG28bb&0jEUC5^H9w)Mib$3{3y{p2sit*T4@$snNHacJ9Ev z$IocMG*w0hf@jj`WvI)EhF|&x4Jz+OrtC0C**Anx*AnSl7lR*!tud_x`bioD;j>f3 zSWsaYCsfKxUQ;xzScpoE!E>28TcSRO;83h)_G9J@)d5&tKgy)u@xU;$*~j#BV?K{j z*W$TRAx+VNV{CuZdZS6x#%2uFDMmkhSG-Wy64qAKF`q96Nh>HX{u*$ONK*MAtXYN2 zLfEvl344_@pxxZ?OBO97s-}^d5m?E0-RRR4zXn7YUV^ z0yvR__XP-B0M|egaE+_m_SZ;eTRLtYglyUZ)&kr_A=rXO9U(GvGHnC61tl4+IlaNv z0bz!5km&bfCJS=up3~_CaBCVPG`O-s%*!KyizI!O3+E}3<}TBI2&w!n;GAmI3;UEX z6u_YfXj-&m0nXueJO*$}RQS9>BGe%9J-}_DGJsnUL37|&st+01s+>v#M^jfzw_K7h zSE-)^91O@T%s_jG3XT~MFMJz~q<-EgGE0Oy@F7YE3wnEm4d8Tci@!$RzV89ffr@hn zAY=r+n_;wii~^NGMB^n?(mFaJdcJ6+DM8si=R>d6J z9+|*rjT!=Qp;k+KJgi8;wsg73bqiX-=&d6gs# zBKEL)CsZm({PFDz5Yb*5AaU{6sEoG?nk zZqY$O4L8$?ZV3U+hM){Ap*s?t34?AaR}EQ38mn#xv6_WbEFU+5U#`0InF=lJNRtXP zLK+*^#EDx5cN$GVeWfghRtY)MO9{Wyv1997(g@X;Hjepg^rx+WqjvZ32(BWbsK^lT zx!5Da-p2 zs$o#JCj8OAYi$+OzeGzlOGm5LBeq--LX$WZ+4&mlaa=5*oLRv{@WdtO)oUpup)W zPsguXO{&ka>&qbLp&0@ewJy&U)sW@X_Z&-wd8WGECon=Z!I7~3b9)2nrRSO~paOxxN>PwfbfW!Gh zs64C4xQ+$X0YglcaS$r}QF)q1f9sPi@dH|L71L*$A>f$M`2+_+4mAx``;Rt+v$rUW zU_?hKR@u=Y5q7e47s%2CLR$iEBhDW9JM$ccnDZ*#A_N2>yu^-MBt~U~-{>pN*lBV= z2;lPF7CjF{qBhh>V_(BzA{`Bf5wu<9V9WRcoXtryLI7|mH*+~PtB!QKFKFpLwR9bX z(yH`4g2=cf+A<(Z2SgQ5)NQ=(uCm-;}5 zGU~4y@EHx!4t&F4vhWEHKSg0}x#Y)uzT7ex+gCjzyYiUNBcU9*^!7E17DQI?uuZfq z!rq9zOwk94h&VSaJ8C7ZPRcn)S+Lt%C%6sk!;aEOVi8jGBw*Di)TSveK60QI;6#=< zXwWl5;8~-2^1bA{D7x5^#mfcN=9@^V1*S;D$&3TZVpmU{-e%VHPl*8Tp*|Hu3*&q9 z#8J4)Co=+X5ay>p0yx1{S?CF)ucHamj~sT9egxw$FS-37OFIZLJRua|xaa4Fpa7@# z20newqdU><_^q|$1MTOmgV(FG+@ZUI*~=aNbz8gS1bpbql4&u!*s;DbKR6n26a%)pgtxy{SX zSkM`80nF|StNAUYzBa zl_5BCgM8%%Cq?4oTwyNY1Yl@-_;?GMfO+P9P&1^CFtikmnKoevbz#WUGfzSp?qlzR z@YkT<9tuK-i%3KV3SVdDAgpom&--ii_cip_SUe^YF82y5DfbGUDG(lK{VB5b-7oRi zfcb&HhO8XTcl|Y}ApRPh6ZoP$PW~DZ&pIE0ghL;ra{`H0xY+X+%x=)M*KDK z-}8GLd|v~_l8*{y&k=mtu6EDtv;mSAe~q|bfVPdl1`)rn5$x{!Yq(ux3cwdnjrePL znQ&?27x`;gfXDtWYHSWyQ#f$pOO8Ysx!>yh8o#x_#@s)Y_FB(}*S(c;3Y{cylEC*S zfn$2$Yy0_Y%YSV>r+g;~oFs6Pz)1op37jPG{Yc>0{ln=wu&i>&NuK zm&y(8*OnhXr{9wVP7*jt;3R>Q1Wpq8F(vRHHix@gO!UW;#@cJ;u*OcIlLSr@I7#3n zfs+JI68KRhFzYO5bl8m_wZ;9*AEop3^GEJKd$-;{JiWYp`gnGJb@T9ib@uV>f(>79 z&OfqGFZ)Pbx!>#K%OfVjnASeNvYWx>#mzmxP_A!(Vkg>c2E-W?FD%3iXdQXUenXe; z&g&qZJJ8C|~i3`w&}?9MDDiN7T!_N|)# zYVFESEO)n(arPF+;U#|B=gEpt6BM26Fa@!rmkk#RbZrxdD->dm+gqp z&awH#*bS5DOZHjf_x6s{-EGq7_4N%scNY}CwL@k1ca_gHWM(?wO2!!OUIREi2yG8( z*sr-k1>eoMFM?_0b4wch03@ak*i*zhkT`qJq>iMSj#nrr{_b$lf))9+v{lJ{hdKoYTm42AH>p&2U4?F2w ziOs!FzNF8Vp{m=RAI<`xb^sl>o-0fNWl+j;Lc$Ven`V*Xt$&FTFD~~goE#yjz7p}XIrpI zmwirQFJpzsKFJD^PAgZ^V86qbojNNY4W)9cp(3h;Y4Ul3WaYH%@!X9MO6(f&uVM$> zOc3$MNe|HyPK~)!1;<;*V->qFaQmkcSal?A*&FkSy~n)kpqzC?2Gwcdti`?drw-JXU5U4no4-(TJrLlXU@>>k&H@E_};wo*aiIX}M zv}GTvku-=FFl6rJl8M8(0eKsh2`1Xf%>Y01mfYsmYhNEMvY?bb~8em1ZS#y5AK=R+R33 z(8yFCL99%ttoa0c5cl-|v-c)TmTb#^R^C(D_d9pixe^Evtpt()W6VGrG5HU86g`Gs zf+u6ZkP!n6%rL_Y6W{l9_lVd#cV<=H)7)$4W>i+}h}F3Ja`)A^uO^~!N66XKbXwt* zr43n>a2gpDPC95&o*qX~*^|C#2{qu|dfvKWI|Kl0b8$^jDmAcM;fRayq6bkplr`tS zct`?;t_YwN#U12Om7J*sDted0%0z9T zg#)sR&L&`q^uOws=9L0XEl3MTBTEZMQxZKWWw18d=yMB8D5X5*CJU-YsWekRh)A)x zS)Geb@(T18(k7hd)p}~nDs!4BBPe;4@DvU}5D6$@!ILgl)3VlciW1R6BXUG5U_y#% z;Vgboh8szDRL{GBY&2fWVF9Pm08B)yPZ&W!*YgFr3`3E+JpdcLwV~;}%EOWua!YPG zl^#@wMV#JvB8-nc zz3`L*2GKN@rB}}>R#A{vQ;L!|qD^6v!}5jg;D*5Hv+1h*QMo9g$x1vRuNID4+Y0xD z^l2DiL8-Sb12P|F5L@vtS`xwA0+)_QMbRtDKIy^}Si)81P#$s(1Wm3-gLFMlW4`2# zJdku36eJ>y$jyXHRfDr!FDX%_Q)J>+GP~0Dx8<I6nI`}m#JH3xgt9_br*rDFKG)k~x@AJ*q*9Ffu4@2`vZhnmnv>gpSZ+7^;n; zN4X?Tb^{oCIEjEr(C^tBzO0kb7WI1XyAXfkV;@)7*iYQCGB7Q)rPyQ1*KyfOgTaJF zMNdaB$iUuTPV>BDn(wALO@!}&>aawJ4xX6i z@Tv&Ijv^Q2UBCiLqCwuYBwKDy@-+lV9|+EU5}kg%M|sJtdcoDEu^4A%L- zL^yUQAYpa$Jx?avTx=t?96DElU`5PRE5g`hc`Y@&mTV9{&|&KJ-Zr z*Ou)S()VN0nlE`(zmjOg>Mdn!{WDS2c7;~rpLY_=5Sb8o6Q1AZ5><53@dMqBDihhX zn8z$sVUYx$9ZSN)_Ifd-()p`2R^%l?VW=wnTUfHtXOc}0()e0g%+?4A3@r^RNl27e zlWne~+q^H2OF0DEC<35xi1P?yr+XWbY`HDa>)}*bVitvauaTL0E-@kKu$~XIi7F;0 z4QV&m!d(&{M3>Cdy)Uv%g0RH!HGT1U)q|)72}%G%Mi`i|;n^UJ$QJIx&}}(Llysr5 z;*c~`Xs+qUFE1e^dkM808($Xih2JVYKUHeq=`Mqb&-c&gCJVT6Bz z9|ZXocZE!FVT^cAM!b=^0E99H6jQ>06rdAP>5MZXNl3|i(_~0tPw<*9fxb>RLHq`& zxi+s0@?@)sV5^&8@)RVdX{1T+s}vm}Pu#-xEpk(yLLLayN{wU$^W(@v%Yr;Ymc}L= z59k!N|cmyZSXd(B^-kMH2 zWkWXwYcQGgqC7u2Pv(%E?_=JQgD_^P9`2s4WBig1CkUPvemSKWcR^f27)Usjh=0OK zLKv>~-8~ka!+B6*XXx?dTjuyHcF&kQSWO(LT22+6Bk?jaRTbA(q0~?Hr27%~1=-@n z#1(>CnPq)^!Yb2m^T-^>)5G{{AwXxbry6r6 zq5m^arjBqJ(}Q33pdc@g&m1po-n=i!pFz%%X^p&nN+N#=asb3RDS-0IaF820_OBrW zz!WZ zf|x`V;UplE;I9zy^B(h*<8}E|2y92@u=#nXWBJ)I5BiSGnSg}NGG{+B58FL|i^RC0 zkYza&&8!~amEJwBGFRwTKvaZ(xK8&^*wRko;00yCuEG^^+~g=B$YBf>4KJR^W%drG zuBobLyaFX-6bZkdD$cQ9>XZV3EyWo8gZhe{{eav#RQmB1#Rmrjka_pKe-XKQ^0lGt;qWpBIdZcUd$i@{D>x_z5#_ihmzu(VsRD~Bku*Xz3_P3? zs8U8Fi7GjBKh}yguaYan_bD$`&50QN;;IQM`n0!&L+eZC z#41Ac3dw{>B2YrhtIRnzdH?mRGN)`v&)Oa69N?(TO+z>!JRy^}9Y?w%X%#NYnzqj7 z1%*>jkcVzVIReK-Mv12#r@8sh)lQV zEJ#S@kVMt&c@GHQq3@NZn}Z<9^A)*KxIzwJBzzC@-QEJ)C~)p(s+E$ZfYcNC>LgC8 z8aGS&vuq(8g77)NMc?I2huA(Y_$Z~s+s+r^eHG28~F;N-CiB! z*mG1xN}Z0dW1$rhUa?(4r#^;9ITE17|C)M;R?$cC-oOm#*v zMP4$8@0Nr-uarExYdyCKlesVeWN^1wXIjXjDtiEJH!_IrXElWrG~qi6^fPr(9C8d$ zG!s&m_KE`11XA);FnR(6Ycumo1aFE#V{*vu1o|mE zJ^C362Xeus=5hAF&7R#IjCh4ANtNM(642S#P%5&o)a|bo2*D6g#TStW!9s**+j6EX zxWS0xQ*sr-^IwVlc}Htj^OmSLY**Yif?t(+>6K#!D-RLMms%^i7Cj{gr)Q-?pUSGV zt9_<)oI^|7&i4asSj_x#zA!D9rfBA{8Dl2<)PFJ+Djo9Z0pg6*)C z();i0Xglw;aHN&*R0*3-9*e~)SQHz|0*`d&4u_=7%K7#A2keVqe9r69e9(>ag{;SP zK8T5!Oy4*kl!ajYVvf*n5=FmP%gMAzvQ#Wlx0htjq#!Bi0_mob%lRPT0uW$EX}*<< zkFcH(%3>H-fH5D`Gds7JPD+Za=7ShN*4)#~BGr5lK%Hh@a%F0ZT=6-B3p6ct2HoLhz9?|Cp zc<{iWDrrns0OehBHLfA!0AS~u%%o3dapi2%LPsFiApe*jpXa>RjPhddGnt&TU9BCt zwmhA%W5g6Q5CairtB6E1QlKXJ$L$ALabh^SWp) zkFGyhIlr*pAA50s`O~@HqsM!e`Qxd2c(^?07Z(ESCRo3J`*gztDfs4~}5<2kc3?Y50G z&fcaRbUbnKoZoucc5ViH%vZ8>2cT zDr1m!--Zezu1?I?hsjkdS%8BI>5~#58nvWZQ2f$;8=S~q3rMI1kl_dfWbWG_B4G#n zHZm>AIHc35xcCDYy3D$C2nIlwu;6(x5`-CMDW2Bl!s4(FZlHO^Dh0K3(RtQj)*4$nJHQ73>3Z`^301uM;Ph;P zd}z@ffKMREF`S_%$VpeorA)Se$G#00ZA9i9w)egbh}6UWq&mv>N@q(LnPaf8Dg^RrlkL!TZ9pvPI`ho3(Bk? zRu^vkm0rOsYa-=vJvW-Ed7Erev&h%*=$4B|HQFr==_s#eEE=UZ6N}PVF(Pk0%;+0; ztjn|;l((t@`J+B0P8j8?rL+~1yvi-gHS4(xsH%*710dxUIe74JY>?wm!9!8VnXfrk zILaS_4wa#1q(aalsA*(WIHkYT^KN9QAw|m+koJI5!Ze5sHvy%>F-zcW(_SUa#!_0+ zSlVtN%cL`m2pbu~P`Jn(xY3Q0d8DAsL78E|BJ;EiP-bK4Fyo_r8@A};XobtZ4NXq^ zKarKfZT4-Xxv6F;0-zVN0wBRR`!-TJqj2yK*>-ys{Zj|4!u@H&COtNjJ>yW%Pna@Up4MP2%F! zQQIy@APD5n4+L)sv~b8Av;=Xyvu~rST4}6>>G~_@+_%Av)&)%I-91?4y> zG8f8%b>1n04IbP?mZp|rhDQKtA~#H=jbT2Q^v+r7>wU9tLuTvm!~=%d@n%}+7L<); zF$aQEtVBehmP4ZVY>VrLEK@(w)e@|B+=f7I4E#-(xzZh zIK!;PsojfSL7er&{-gv|I&S^w!Gye1Mx|ImS>>oC&O7P%lZ=`Z>W&2-BwOT5n0QrS z`JODoT`0C}AitOh0ov zO(u|_uM|^VSGD*WZ=y|@t~ZK+N<`b4>s};nvdE*9Kb#bKRgfSDrR+;lDNMpL;}(9B zUxzycNvJ+=KVSUFEFQ#@_-XIH4I`Nd!anPt_69+b33iMQoNz8(v#LNZ;uU(!0gYz$8hS;dL$HrrKVXckmt|pVuH-flfI@PLEc2 z8@Ut!{Rqbv`9TyIhFtR{u5RA*w563MB-j#mBK9CHZIJJ|Z6oyCC0rJ#XdnVu;ML80 zp0@cCHlg#I1aD9ndK$TnAW=4&a@X>g(pY>6(#w*F5v`blZOe875>|wVbxXRClv@hd z>DEx5qTa!loB0O^kM)|cWHxK1^Jx`;ZIDeDMThs?t833&`#zcav(0Ns*yya>TJPTwK`>s3&N9Szhk@~E2hBuO0LhIk3RZuJPD5U zui@~si6|AB9LaV7yfdv~>r>5gKzEIEieATo0E zhO`bM$P!ul)0YBWWM1;Em_!`N{5z40q$wEW!6qJJyls(_*5JMxckm|p#5NO&AD|7S z+LwXo?-BAfsv0R!KXPt^PtJ69}?q>5)L z`B0P(oC%179i*MKrpb9ad-Ktdm2 zOGqUyhODFo61U_q@(1j3)&XIHGxL3q9iFvEwTYtlZMdNWJI4xycfM0!ID%InxNCVu!;(Lc>#Ga}M39_d z;$B~l*p8=WkvZJOpl!CJ3~)#yw`^~jmnVxYoI54lAyks{?X|c{aBlMr+$PIGC;&c>8E1Y2|Ipt zXlkD15~X`DzEu2@?VLnvu&@-#qUi+{B~O-3$2u}sw%$mm#6g@TyyeqOm?=u(vLF{B zmvgdq=m1N_T=WV-!y#oCigY(x4jiDR?Kt{@#%flU*9Nj0@01G)hi;*6wS9?HDyB(X zUi)(`n>}u1RJah7h9_+AdcHI=YDqUTUC;5`dsctRP1Jk5Y}CYu&+mszhuE{mxFrEoQI zpk9Ss&(5M)%2($#dTT4yGRN61j_^>K*DRU}r@ToQg`*|=`nB}HyvW=&$25EBz$=dR zR=Cu`f|X4+!Lc^4iIFOhQ(e;PS;5ddD5ad)73bta6pk>ttHQZ`DPH`fbW(MdM@SMd?X>i>_-6mAP-ft-4tyG1Pk%#K6%){K&b1|}w0~P~U0J$Sxwkd{a+k=vMl^o;& zW%K7=gv_##Q?)2@8(~*zu?SR=(zs=&#FcHxEEOgpAO&#oPJDJ}K9 zx(SHv8l_UJ?I;&GEJrHmR_1Um$Q6{#=&IKBT!psmh>V>4r#jkPz^d#GNxOT{$WRbV zUj4^mJ)hQRMl$X=1EaOfO=yE$#UzaXDL+$g#1aWmbQ0Of5$eSrnNvVpsx)|!xjjyH zrg@U03TLrEvHO{9Z)7eg+N*3D0el(?We)P%)WK#N!mV`5oJSQ@1+?U8;m|%i;lJj-jqN#J zPP@2HGM;G%@H}&863|8KgwHu%iE^rLqO#3`F%|Q5oolmiqtEfuGGh?nz4vW+YM1j0 z2tFrrabM2ya%BxMP7J=;x3T2H0CM2}L@xJjxZ9(=?PT(qJGefa55it!M?HJzYu^Ub zY%_6K^JC6R@dsxZNcfP6DaJq*ei&t{aEG=LEne zBLI_F;Ca~QT5(kx$!KCf;WG0pG zz3W#4Xm#`YSU-OH!h(LZOD#=pru(5oa?OI*=e~{N!|Y?JT~cRf!yms9=4G4j<##c> z{5FQy>??Sw*RzZM-S_XT-+%4*S?~X~-)G&(&;35@{QunV^Yf1;{gp%5{p+QlXSii; zrQc~_-^SzB`T6D5?cFo$1U%;Ox%O>bztF$Upn%b&jd>HOT&5cR4(+_T=` z`jW1K$NPIK535jY^Lfd-0~VbS$4eSe)8X1fwWE0|R83JkTgnwbGk1Fv?I=T7V&Xd) z?QHalxulo3e%2FH7xsrsk@BMZLKzHyhp)r`;p@m}_&V|%zE*Ft?w_dIGF)Btf4gs^ z_H5MVjlnbUMm~dYAWb^<#kf!Ea_FA)lWyRAxxtLw|LndEye_*}_igyyjk_z)?Zm%= z954C4hWj=y&(E*-oRaQ0Ik5TICvbia7KF&3pV>J4-UjkV0qPGaBN(O_>1=tR-^81g zzjVA=>rXhT+-5;n3 zqKCu|85n~k8vyKBlg80R<_db>#{I|bTzzlDBG93y9P_=6yuytvvUg@b!x}a^B|>cU zw3+eGvhsKKZD6qXx^x#;F?2$Qbqb)=@9x`(TX$Vw?-~ifP%3uifY%iTSqJUpm!l%r zO&OH6Sn=qNFAR$g9$Rmy9RXk?9y=F*bnV+vV2r|GB=ngW9LLL@UAwi}KybA1enpO_ z2O`@M$5^_M`z`=}7+c5lks>JZ+HjH_M&m{#Ocs?h+#ro1_aan8SVx6VgjPhL_ABXV z!I$jg?}1{N?lc10DE|uVqB}xLO{(Qw5Z{69>vekx6rI z&Gz6Oa>I5TMo2Sa)MvpFQ0kQxYu&dIeW{apLQ4>hEPD}b=sOk^x`mGr(scg26j|3$ zn20q<6)n9wQlIzsZ5&mcbs0TPnlxK*wFHM@q!;8yAW?~gj7E-&aOy`@7e%OEAx7AG zxNk$Ta$%s)vQ&MO35sV`>k(FJ3=*hq=+b7S8)rf38Qz-M$k>O3FZ(vC8rV-oeV!xV z(yNpJqEuk=HWMv}iYYyqpK23%EmxETt2Evhf?970&SuPxzhGM{_=s`8ApoR$|-!^2aQC*JGt7^1DcyuT?x-hn>!VPU#6$}-KB86~>$H^ImQy`6; zeH-SrWuVLwWXmv>bIL1ODjYs^c_1h`L^+gq|pOVl<+a0hLGEhRG6{n1~cG=~@cV+=ZrU8CLT(@(ad-!T)huS`DUo zwdiSHw>Yf7W=T5RO80HJD~13iQEZQp1y5o%%2Ik`2a6n#ZORFD=*H6B6L=vb>B5c3 zM7F2U)jl`PX=FgGc;PWOkvCP;w^FG@$oBY|OFYw1;CmHaaDbe;zoc7`hgb5nn)>hx z2b;VyP^Lzh6xwo_ujwl_i&`mKbc=G=zKv|&(2wgmTe!CZZ$YW!D;{Qi_f-zcRZN7) zVq%J=IztdFu5##LTN#lY=`>*{7$q>JOo>x&U5mIw!93|;hHf{>t&Kv_q1m?~8DJ~D zQr-);s!{f3R1HK?^+S0i2RA4UuS93_8eY}ZXc$(#feZvgpXF6boe8M{mF;AyYD<$5 zh1+~Nj98>^QK3rpHg8^|gqFOjTJewAbXgIC69TnAYb{4{4TU}as86vyN@G3OlA3)R zrAVlD;T3k^TfRo_3|=O8GKES!3c^Wa;qG>?PVy??Lzzc+ZI)JCrXi4}EWAV{d6gF_!Cf`M2|ZL;ZZ%S$HsAL(CoJoV^{GT(Q86!fMyc z=|1_@-a5#o1%|oCAj^TJ?G4W`itQS4o0h#5%gK$2X`$J-5d*GZ(s~kZV%8Mnz18=l zWyULQH*FYgJJks#8b2((Wuh>}$ie9J@nb)1+^-%Hf%S>KnLpi3^#>_)>3ryC_ib#i zHJl_%-h(vBosdZ!w^R<1l(jK0_I-Pcp!W7+!YX|CWt?1%fcuV?YoCyD`l`{~(kg904x>(R4ESo~dW3^^tbY1dW%Ur%5tkz>00ZDde!yZY zM48?C;L*O^4AZ;buZC;0#+F*rL1Mxf!trF9el;N%q;Pv1QQ??nB=>)zT> zi5ip%o4ienVItsfZa(JKpj;7!cGIaV{;EUWC1rq~!VwS^QFse%P;|CKM2E=Zwg`+0 zZ=M>mWHSc6n)e31h-(Q?I+C_5x9K9$2vunVUBdmfI#` z5lxaDrHeqwwMu#g6%idPT!;i4aE@@S;AzKAM!;6v^STf?4}~P@5)>#QD7WvFIZzay zA{ziv1YsnCAHi3Wgc)9!5u0=qtWpon1GE+7@bv(BMK!Y0HINpDmB}axst+RuMjXRk|jFYzu&nl&p~OKHCTH7L-{QP#saAiZtcd7#1j6l%oiL7$ffrXxo8GkP>Z<3 z>UXGG()m!=QgVS>ND240!66WX3YZaYNSFyWPMf*I+lSL-b(>oy9v zB|{JkxmC}DF5r`mr-d}INXij_4H;WdW;80dlc0n(5qa8{D47E~C`DVB@B*{%h9=2h zg1pc#$R$@`BIgR^gca&4jQBfUg7bQSJozi}Qots9Ezw$XF(rIOUhfjHxk6LIf^v=7 zHW`yBMY6isE_)^RDhAW=$iUbie zqv@q}fias!nA5K**5DAZ$Vn$bmRDpVCr5C2v%GO<7II^q`XR5#iN_@q$`H2XLT0k@ zD^*RdPNeKbz}cfG$a~6R+2YDe1Wp*8LCI!1r&{ph=*ZzVGa!ZugdaUWMuU82@3d?K zK&pzx;t-LJM<6Dz)Mwtz0*cXy#V^_E%29>4N~e)P6JF`WtuKrDKAbUH!##VajAc7h zxyl=3b3M6gm3dmkVtbfflok`EO(r_c6586&xv)J2q?pLWr5@tYb-<*CGA>Z!RpIdE zKmgiACIOW5UWP@-MUg2e1RA_BGD3;Ml}~Qvm60oVAG1`%Myb?Cnj5*(O{MLnFAX$v zCMZ8tmBN)|z?kwHUdTgM#F&UkP%@wuLCKaBby2veC_YPL0b)^G;qYum;m{KS1iYSL zg^66F3=zNLMgLSMuDA;e9zh$0i_CK}PtAhKKT8p9uVb@}(Cb?Y2UwLg$gRksKE(*~ zxMf@A#T_yhg{v9>G<6V-gBJE@sc?}m8fHDGIBK2syk%~KveBz(V#1;&@)SW)&!Y#t z!db&0FZCR+x$vYJ7CRpf-Np8jx#)za&a_eod}NM%Z6ikJ(avagH!=W&xRJSdg-_Vb z_eoz>PLYSXB7fq0NLBLDcJtc8>9wRXMcYAMY9VEA6_GGDeRRa#QWE%~Sq zq=g{09R!p-YzeOtBQ23zazy3Lf(le4qawA;!_)SLN4b>zDs$2y*wPRMoU$fe@ERHa zxuvvN;FT)bRa7-{0#s_-uu;|s&oIhhDxB_R>Xn;T(W=|)AnX)#@jYRMzPs?*`gNHDZ) zkyk{^h%y!q%4&@Y+td7KawhfPmVw%+p3C+|9=@v#VSCl{B3yt08g4X^2r3ob2uqIO zr9SD3(N^mK<+TNB!9fmNQ0b+BrEtkxUq)(XN9F)7a+?-s2&?sJP@)86pbDQqCQ@4A zDEXlD*C{t5Q*sEfa+bmgfd3Y-x|1-1A~NA3%&;kiVITm;l3>loSaNbp0FU|5l3i*T zW4eG6JD{9ew*?Vib)-_U%6!-^O9bG5ms3prP!khIwy-^~!}cmZm;|~>S3FP~j})$O z2r4C4CN0b2DH&7pjsUsgP!)0K$#TnNf7Px+UWD6Zcv13`$TuYiFUVy?5w22K$FhuM zx&6&fK^M#u!w{K6>WuDF{#^YRsR9r_06&}```ot?_N?`h^~|UCZJ>c4Y?xq}`rh?HuJ^Kh z9R4c<{MNpWFF$?m+dxJBDEm`>x?=GO`<*YpT;QL=;<(@e57HA~WnjVo-Sh1g-)p$J z-QDGT8`pc5`@3d=eH%HI|I5wOj$NOBc6Y$+7r4HCdSSl+I|#C0fc&?QJI)d16CT&( zyS-+=z@Krn{OEpxO!{Z`>hyjA7X!SrUjTpcoBaZ~C|q(7M?GDPodpgoyN+M9UjU;N z0QOn*L3WXig02nt{C(K|9`6^>!9rhqpKmbum6F~sz%RzOcIT=60QU+=HRs=4AQ=Lu{~pB zMplfw9mWP;!c0tX#*{AQJ+)t;*AXAB>&}Ao%{t;N_?FF#*aaFKh1`L8kW0WZ@*dlP zJVgiu%hov@^(9Oev9{A8Vg`cJT;NH|@Dv;qf$ifcxn3Ov`af>M9`X}eBS{CovHy`?v1x>m+&pysZjdeT0Al<237V8Y;nl@ zyd7C3sInvUc_6K3M2N)gBXZ0N{D&V|EvSs?%|4g%L671iILwabU!E5i?Iq zi{g(hs>u&_iBjP{+@P}2t5xA*A4C&pX2I!-O(S!no`+#6QF9lWylJnftx31a+}6Kj z8>MN5L$-&FW$ANtGJHW$%A5)oc;sDMhH_pG@=cAhLf{;19N5b;rIJ@wOpDayTDPhkaRhWZswGtU0aUtc3zBw70H%#$ zuRDhm{MF($UCCTkOoI}<+~VJCkJOZ->d}J3ITaT5DFD>b77pa9C`;w55llVereXzo zR-2p7+CsXhp$f-mp=Io}J~m73&XKBcQkK+wOxHmZi`=%IDo6&3g+6!K)YTMKwpeoM zn{@5eK--(`)hz~x%3#Y-^CA!vppi!qg_cI7Xep7Rb-w`lY!YU_KvuKUy9`S@og6t? z&q+6pOc!v2yxNG!W3A^YpzK5fEa?s>!U#*M6W{(%y@H!dTVx?2vF zDDaeQ`9Z533$sOGggBl#`v=u>jXvkL%zgo4<65%3rsKB`-pO|!M$)O42+72eU?S9} zYM-hcBZaD~pbhf0opB-(5&*fQ>wX6y`Ukrc0rFydDO@-it!uW!zl5d97;KIdP=>df zSXz?)+-@w*uoO_t@Hha%Fj{N}8ET0IY=wjGaY`m{(iL*G-?lx4D3#3l}kI}{}fJhHUvH`Z!WXwp2QGmooefW<3 z0<4Vh{Q}@FKOmzN{@%NOjVP^X;m0|546uBJMtwgSB<^g-WCulXiStAIGy6%d&-pr| zd{7%^KZzlD2JpD*x`pL$_mkWm>?a{X+2ij0Pr(<66wjgvcoWB}?^l9jkN0f=kR%aGi2@tTyFtEe zuL595(ydWVJ#Z*@uociMrHBM7Wb=AYx_$~WV;lLTTjBduK=O1*m*Bk`vM4G+hs~?u zbybAVN!+2QejHJ9<#r-IM@5MHJ>=#&!m&ku6mM`KE(s_wYYg|ygmh9lH|#N3af}o;@jprK)4C-l1m%d#1nYj>a`Fh zj9h_Y1W$7dutap&7J5A=c1^b?*h+8>NhVr5KS*-T=z;f8tZ zau9k1^aOJA9;GXI-t&|Mxdl9dLDa#Oc!T_Xg@Y%mpghP82qEaGJt$^(I$kWpn{sq` zNh_ozNjEa&X(6vT4p1gXZd-y(V&KtjO`N9?R8NO7hvn!}3hb!7EBGQZN$Li`cXh2% zCifv?-!?c7BbW4xFrzu~rXHp|l6SRhr({0aq6a1`*P7zD*}7#kGS}26y<$k~eY^9cB~MDYiFDgqmwO5dl#2 z2@g)*itXG>ca1KTOTrU%W{?j_^IOQ5oOvjWqF<3GOyq|7Z_C7k>;riTG_^z@L=-&l zc`|X* zKFJEXq7X-JTint^sJHKsx#Wu1)WVwbZjdF(=6#c6gFFCCB{YG3C-TOdjK|1}6~z*{|0~_Z&t~mh#pzTR@RT&ymwFX~yCW$B$+h zG}ZEL{5U)YJn7rJ2G&_kYr42ijC^DXkZuIvT_5Zh$hH8>VX@-O4s!BhK&CQd3}(Lo z@IW3{w>ZkR1%e@u1>=F)Y5K zAnI3KI0VN_mKAmSd*as7S=w&d>=)429_sM{1prjJvXW9tl%7_dP=g~ZP8b|6-0?$J zngir6D#J5WR7p&TOjsye_Y25-&F5akj8*R}?o9uwLgku{j8v;y#Ed{&=A&jcI|k+P zV?lJuocx{yQZkRbb=@xzoh*eD9->9>&~avCHv0uA1onU0g=GabVe&xrj!wpvTr#gh z2VP{JbgRtqDX2cFM>V-X0j1CSLDc{t`l1jBj1(+1wVY>~MFoT7O`x^`y)f4>ORiLK z9Gck+4p}UCQ3^Lj4FGfSzsQYxnzj^yU%ZLr%4CY^@B|Y$iWG-5d69XiQ^p?Ggj-Px zNT1b~tHRaSo6G6FvLtF@Nh`uy5mu=$IpqW*4XC0O(DIDxL2b{sbb?NWtISI}!<+}$ z)qVkVsLwr2Bcs+$J%_#U*=a`#E7zWIAf}%82RRa^Wb_j^+vT#%(Q!(N6)LP(F_mD# z5{c7k8nUG=iDV*LbS*N^T(vckjHv;(m8?gtuYpA7Hh)zi#7nx8x$+HF8<{ITRP*_8 zzd)@hj-U8=zksF6q|kf&1@eW9V{I>Sg)ee0erJE9a62@1tsn5k@RE@-r!)j4F~5ja zxkVELAxSKTEnJBkY`i9&zbc%c(lC*E3%-HARw;pZL{+a(u()Z41zO6Awxfw$&Q>Cc z5Cw%E6-An+g~TGuB!socS^zO7j$a*h!+{^=Qh=pRGN-V07#YJb!vm%IfTWYOOdV82 z<&{tVFCK`ps%{EhJg^o}@|T(XC3&#H0*lJ6UVR^+C6AhfSdj})wmSnNUT#%PUNUVl z$R&fsa^wJc*d7T6?;&z|tl|hv9HAYj|;2 z3_cHNgyLHpoZjz4Su8QmK~~ zF7lT4jm%3tsznNDq$#@iDRXj+%!x5DWQ@#fr(K$nYPc=A%<*d~kh@lU!mUw}Amv>+ zlyD-DxmhKFl9^6om*&;^O~OMYaqjv2o%ah|vR`243-jG?PS|2r=*@S(nIdtvh;cjr zH~R$)!tBVT;JROcX%+r5(P%ExFt~S8&`F}~2w+f_ML*oh?tTHIPVW~OXq{a+P7f{n z1p+?+ow^cia0Mv=(wD&C`sRKCcM2TN7c#ZR+}Pn9-ZH)CyxU=vAzn#x7`5bb=I`*D z>Ag(m9p|dVMjhc=a*6Iuu4GHD16)C2NTNQRFZ|pu5caJ0{?*m}{RQpf{l)4{bZB~| zEurCXd|h$USzRY0j}w3Vesv1|hgp6x$`$(c`gr*CE{=C24)cG$eZ+xx+5SretvuYTn+o*)N-qwfvi*3|lE+&mh z!?2$@20UGOyfgvu#jzz5UkXuv`6%-bIm)S`4gfYT6N9UB3D8_P$ug@gK=wb0s4Qn4 z_s%U4&fkZA3HH&-3ksMUFMegrn_+mcIE)XrxR$w&Pvd|-BXkvUEQSuNM0mJb?Q!K5 z=D4{R8oAZSvRsy)MVqX5FwEP7;02KLDYAyHCe7JLTfQddq@0k?{8NE4v0=*^p#tU9 zSfiBJ<;m9Bn|&UxKRHf|w;Qp0fJR7!edE1ZBcA+434h zg9GsZ&&3a2-r&`rn_Xs^F?ISw)xfW5Eb}7#802eBr{FKer5W%E^A-nbeE=nSb&Fm9bEY7wn$U$_fib>UBRE5$?Naz}o`aw~my9yu4 z0VMP4S@l%a1^$yK%(fn_L=qmgKx8U|w4_l{#$ea?y=qCQ2TlvBw^S|E6Vp>v3zSUj zmaHPM6t(0F+D(K|GXvqKGd=w!b2k0RgM@L@1sh#C`Uz0=A#VC9AVd4e|8`(bIKb|RJs77^Fq)lU~A_=sWddiU=rrL-CdP1pd8jM9$)vMJK7Kw5mZ9S!` zsizdmoZC_a=WLxaB8=P1OCl0RVbq0^W$UTB6&1(_Y50zJHhPhYzlu;1U)_H8;}pgwp7SJv8ut#?y|H53POfJH_hwH z>=49lH{^~K3=6r@h)__iEd`)jS+~L_(!Cg4ZGO!H9tm^>6})Om(NcuBJZPmBB3E{j zw(5CLx>;&UoAbF2*$y|1ta^@0i-W>6a`G(534gYJZr9+e) zETG9OdGsjTuwQHBW&ssETqMxS5qn#N+gt~@g2KshhOJrEyne4b#@B{l*jq57{+uAcy5_krXOibS zm|8wO_UN5bkh$pS@tT%+9LG}ydWWN#_xmyE0X zrX_4FSDxfbo)S^i8@a)|y!zlJfPy0OL0@qdnk-2e^XGbh) zTSnqM=C1D*X6z!rfC;<>QN8u6iMOD57WoELlCO}>P}fnq30~Fb4JfE8=mmbwAtA-x$Zf?jNgBk_E1}0YI^mRPP?E3` zFE~2k0Qd-b0a+WFqIZ*HfhCRSS;8U)*Ol%NuN>1`*JB|>{Xhiag zd~hU3BR8yQT|iYGsQ5``i4Jg>ZOJid1FE2Ha2T-SkTPF8Bt#}GHx#Z5zhcYN36>Pl zw-JS{P|TgM;PtjZJ|LI)71ShYQ1cpSh5;q;CL-yU5*b@pp19>I3JM0#ot&rw^=?&b zSo34@$Wfp@}wK80JgptBaVrbx9Jd9%v9tTWvicO|YQZSOQ`7}r9h7*=Zr`+;!-^>*f ziv=EdSa>-%7f>2W{Iy?PS_+3ijp(T~*)4Cge>am0y}^-QIxJkL+-fqV&&}nCU<|@O zz||v=a)7Jnv}z-^8-I{jIwG9B6yu6KHBjV)S-zU=5xL@fgFGAxxw)Am&Ryqaj*c13ULH5_1u6DvW3A0a-utYQtkoa0ig2)K7ce+N7e;R`p6I}VqcE>=dPqST_%iV}p zWe~5^FHxUj`$p!;8@?nRY{~vpr$*k9c~p6WW6`T}?5KcI;FQ(K=x!4!r7ZvjIy?zu z!o`w@;YqhJv7C-<;-wsgeATPCo}z0(UW8MUFuNHM4t2#r`Us$KNKDdM@(6&lexrX7 zZUxi5DDs?}8+IbX6ie~M-Rf)0))qvWWp60cG=x*E%_PL?69!w-c~izJ9G*wjEGTnp znX7QMhqR~yg^H1^A+m~q>!*VnZ^(snD!3TLbgswGmQMSTG*LGERs&&%s#1Qy^XiS@Qn+Y4;czX5F(N7oibCGXPx@9kfKr1} zDyvMwtqPm1_g2%UHK0P_@<8WvYQ_qB;kJrD1@(9OgZlyg7e zmFU2;$*OXs(1sU>fZ0q0t+RC5WawlZ=~cMrT41v>oAgc!5m}NJew07-p$xTYR0S+) z8BTWfH^{?na~N32qjg1n01)NWCI136>B2g32l*+5OHoVVQhaY*ppQPU@?d-t6>T0^ zf)NjVk{ioIscXvILAB-t*jR7qK1 z92>n#A0@BE5z$I>>XAXw-CpVdo}LdMnMb>ezCua*oSW;KEsH5Fp+56>ws4DR*J;*N zh@7O+6^9ZXOVBFW?Q_bPatOI_7^b$%cC<_8cy2DZDX%AkTMK^YeY6*RA!YW_Uc1iF ziJ{CF=3G@LgPafI(21Ja!93`5cV|9`_c?c$RLqYt6U0!U=7TV8cqVU6-|*yAj_dmD z=y|4DVbTYTiOPyUz~$Us5)?oP;E)vVqybc)saxmn3NY)3$mP&hfaDTjkct8X0%WMb z(XHQc?rzNwx-B(-OqBKWGEc`$S^heJ1gEd#y{)HHC3FC0R__?#2m5F@AP;jntu>H0 ziFjOR87;(z^J9NvSoC>)a^RB#e*g|J{{Fl^Iq=DWPY!%?;FANN9QfqGZ^D5em>>Jo z`T6tn`OV$a^ZETXradz+!=K9bTfheVqO2>#m)h} z3FP9_J=?r@x&#hFI`)1+QjWQ8rXPI12y)>aA?L)n)5t?ru;4HFL2RGNn**13=ospz znjJ9l&ewyG&avv>BK$2kPX=xiY@V-i_r&RUjOY~Jqy9}CMMgY`b&N}-3ys3V5SH}N9>C)KV7gPj(Lt+ijEhzOrFeo{Bh1}Ij@V^yrb(6R?azBCdK;K|J%RL@4x-u z>-Qi2kNW-d|5?BP?*FRafB%2i@4x+j>i2*Bf9v-j{=fSD^Pm3Bnb*JjlHcopc=$K7 zt~24Ew@(gya^RB#pB(t)z$XVjIq=DWPY!%?;FANt0|!3skl%sHpC~>#@HfnXU)l!z z()@qJtobDElLMa|_~gJR2R=FQ$${U21OI+=xpQbw$lLMa| z_~gJR2R=FQn{Yrsi~l{V+yCeM|0n$ad$=6`{9_90@4xC_pS}Jb%FjtOIi2I4?>lkw zz~lY-PaHhXnMQsbi}#1?3l3l>k!#VeZy)b3zp!HK>hX>bY?0-WeK33&i?lf&oih`1 z4mO{Ay1PARyFRBV@aKW-oW$Wbn>`=x;gL^rCF-6KaBv_xAM5hip~v|S*|G0$&XNBK ze0)MZUr~o5j)>>n2acZO%sH0JaVL52+nUvtPwdV%tIrdJkpFC zPksj_2l?!tiFn`>P<$mIH;)PNtPuAS$tBNd%8g?n>L95{xGPZB1bVJdj?Uxc4-OmQ z2tMfZ9Eu$HlQWBW0WzB?JYkA6+aB&c4TSSU`2U)(6L|Uw#}E<7_m~I;(EG@rz!C7A zjV}_jiJVWYfxHOvBn;24@Dvh`fLf8~iSt8Vpnxq>ygu^LD2ghP94f+B7C36@nF6x@ zpAQmyWD_*AY3bGDg?2mGZ(^p6{IbU5ndigo zfy_}Ql$#uUM&iuFOQy^^L(}gdA^ty3fO@_EJvMi@`=c06BOJ(5N05y zI7>tb+M&&yMZ~cv^orch4S0 zD6ejffchMtBTF7R)J6V5df*Y_IY*F7aZ?Ts>9e-MUk<`D26j?2?|fDBsW10xFWc(? zh_=yGkdE3)+sNZPHtbotEGY-0Yp7!~B^^^V~tC(-jFa3Zb&2qjZsJftjG^n1haVGp$t_uXm8e+ zIy#G`@Eo>8Lr|Y8JF~TT9a-2GY>;r;9JJ!Hc@Lz2wfx>)nWxsXq)nLiu6Ziu@IkJG41@ z{fanF!v8}BTDyMeI@0%V>ZkRep3`%&{Jv=oa~T&puJp4zHbC?wX`)(kyx3qt78Sf2 z10MKS$qc4aJ8<*SQP;g65wvT5^wmC+Mxq;H6DNu1?d6HaAq@qg9;;bxMVD*p-)~+2 z8Rh!{q7?L+cECo`gSl>QcwxXT3;5?piHaM<K=G=JDocf2m<`b+f;>f4jMRarj05wtGw`cmIN= z;lCH`oa?)*izmKa#z~ELe%g!9^=Su3Q4UTI`0@qo>Gl~uavI$IGfgd^ZlASiFm9gj zuD)DiVKL%3M?G(z59}=()msm)V*o}|$H$5t-|&YfI{bc&y~QX8d#j@EZ4nte++%M! z(BrT5YU;_f-_yPy+gqt5h#!e+Z!HJRMYJvh?dV!Xq^%E4cbIP?pdJI}=|Q;QR?u{scmdyO$74(+X+ zrfltf(z20j)I@GM>o(^rK0h;n_OQS36gXNtR#_|u%@Lop7cd4qOOf%_-Y)=hXgBFz zh+r!-11=+W`$Ob51a-c4?5*IX-2h_1L&{1OgHTDU2n)h%;nhyzTu1PNgMo(;vA6O; z#ljm3PzSA@dqypuE5T8ZuUJof%1x68%Le-ha{b01pPOTBy6*_BofMFP3^_QM^96Q^ z?fL8#dy9|IJ-?ovJw5MV&tT2V9&%oD^W@SqzRt(cM&!~AaxFfLy%#@SSU4nC!%hng zcz#-u2*%8sT71a%@lkv0>1Cf!BVy^s&UFSMQc zjXJN<_tDGu#xt~jvA6m*{(z0Wb<6k2Y_b@E(_Gz`k(9&nV{g%Hp)npK$&;Gu%_l^N zW_hcK#3rJYiW1Q9mbDX;2Mm?B>@8}ULuiMuRsu{4I7h7^hv)Gpf*g-a4T+tXN(5ds zQX?7N8GFlKDyIcw2EfecLwm~tN;nEuHB-D=d=1`eDDonRjzE(Hf{KCzOA~to#ZiOv z9c(Qst0&-TD~ZtJYhEoDni0f5JvXn=53+^Q#~1QFJ1#G~(Q??GS`jQq+gs>D!k(}* zQxU8ZIwR0Ugy0#i4`&i~HulySdr1ecILL)^$mimuW|dSi!f)hp>yX5fV81==(l!(= zlou?(zlp|M?GaQ~q2o>~L9UuYS8@e`}Kdb-$u9eWF_%Ry;wO~?<(-{WI{;QFD&AHxmP zKTh%)`)hE(*7tAZ`f>eKwac<76N~PNj`GeI4X!jmssFYN)N+S@X}D+^nTN1Pqn6Y7 zGoj!M%{$$GS_a2Qy2u{mi`Io@m*()uN7C@$%z5!$*O$M!96Bvmm+SYkE7-&DdM@tnsCFR&UFLjp!ujSzBv!b?Qxsk7(J1XqqkK_uq>z z7uOHBG}%vAKRM5I^ZaoB1;5us5#FHd|Umuab2MqQT_dxtJv-(H;G-R~HU-g0!5 z-R`HomHFN2)BIiflhgBCpY|3_1|vt>6aF$f{j|3}?X6FHi!LB$->1D*t?8$|^>=P> zefi0cj(l)Aj@w+_36Fni`r&21tmDVO->-`uioSi0pNA>@j(_5F{JdexhA+Q#{LE4s zoY(ieyBl2HH}|{S%P-g?w|rvBIkUUn6Vm`+E;!Gac?jnz9$5eN<;w-j7_M%aC^}pp z=6uDnK5R2zfl17IiC!P(0)?5c$fPmju$r%MPUD;N74eJrdO1kVdbI(rQY4b;RlZNMCv{x3>Th2bHgX*!ZETX z0&j4>Q&dZ|vViLuvhyK2=N$B6;(>JDfCX2Bx|;RPk*uopk~YUM3j|InI8arj$Fg9x>-*){{d|9^fUiY{M_h$+UH-hk(v2%Hk6CNZP zW)d^|(6x)%kpeFTDS0YyEd%SC31zkeR6weB2(Jhkwv;2&9E2lhV<)1T0A>=c{mvUi z{jI#I_^iYNdS(q>IAknMg#f6O_f#6|Kp~f5jU2q8V35;FILi~f64kRPR^D(|=UQe* zlyCB;S%}w+DNEN(26^x*34CbiwDT3yK7X%%X8f#EDsur!Ci4KTGo`P{r5!x>O8Q7<}bK@efi^Iq&Z}e&rnCvW@$OgE!r!K8> zUCwmp>6aC>!hNo0Gg4-?CsmVjlf;fU=~wi#S$yz~sC z*T1>^6?XZbYh*bye(kUeAkQtnazD&n(fJV1BpHAH1|a{9b&y zxS@f5xP7>?dAPd1*I#{cdBY@zW6Ud5;QaFZ@|t(5%f;m*-Q(re#knIq#uRL*;D?s{ z`PRj;*ZeXsKz>%l3-0#W{9hPnKQZ29==uDBmidKu@wwjWaJ-#0=I@QSSsyfmG%YI3pajN6(^y(yW$;y5y zM~}Ca8-3wA*mpk$5XqMP2@fLQS^>hNFpOx$;g@l2=Cc1wCNirE`*Q+(*+oAI{$ZcI`UPKz$%?HSWoe>CZ+U914YUa#RTb^Dv+ZFQEe zr)^U-`gpvZSjLds@%Co0ANnlc$K&lgP{izSwWqGG5fe z@irRhgWa=&n1>in&iQWF2l3{BM9nkew^|?MFrQ_swLVBh^if%Y9C8lU2laTHG*Cn1 zZ3%pYZCXMVp7HiP+6JgeNkq)cJTl(it`Fi{+wfTt>~?H3qg@Nz@eMq`&WQW>8duDI zj9)(9{-Wd%d;M%4)|vjzDC?V#zy5d|{dBw?gUUfR%Blt^QVy9Z+Zw{$<>-ofbOBR6H3C%*J?OAcLgl)I|0r9LHy`m z!AqV3H|Yry`sTF)3Vh!e{QYh}dT_l7H~@%x+zwwy9wVob$H;5sG4h&xBd?Li$ZO;= z@)~)Jych``TnvwLU9!}fCA$we*In#$f2Tchb@O;v_5}9j1^WZsj~)B_q3nq-bcf`l zCD%H{W5ZIID?TBQoyq)>`v~qcDrco>*%MFf^TuSkVxPgK{(G{-fB*CY_QX@{3Ab*p z{(J2S*I)gBJ)vRwo;^W@ufLP_L`VIo|K9N$jY@7bI(U~HU-60_+h*iO3!w9kPU$Fu z-lm=IWlzutjsKp`gmwadoP%co=`^+%*U+%td7(KAj&h;9j{sh|4;+*ZXJ|=sON-+0 zeTMY0CuquOd3ufj$Qfy89G)R=hQcoyhudIfJgncFK|3_tDi75K;-^uO5`qVUeEB7pE0D@JqGWywfmI_@IJqi zgrR=yzjEPy!aJ0&pbnnf6of z(}W7Q8c@Rl`oc0aCK((syza0l=9+e3>i@J86F=?9DSLvJ^Ns(WmhL@!0?874Y){ZJ zLcELjJ&>$T<86xkYdf!5pxVnn_Kq=>Z1_Sq*yZ zzh`LoJ@$lDjbr~EdxDWWED4)TT;*`Ykc|i@?1|J&#_P5S)*pxOtN-4*q5!luQor@8 z+bTTokZ{H9WUy?j|dzWel5?6ZRN}E^=lJ8<(l$NxrQH8uHnm!ONK8q zE*ZYexMcV;q~84t(SA%-haV`7W@|1@66xm9nGi9k!h`+IiM|#wsYvk zxt`IyQq=O0prFOQo&-hBR3bDg&HWgw{aQMOw&~!oGe+-Xz0e? zD?F192q>8}a%p&y(S$tHP81yG_B45VQi@0w7}KWtIr=$zJNh~LJNh~LJNh~LJNh~L zJNh~LJLBfj-x)V+$87A7Y{%Q0H75cNl4}-h0meuXa_ZFZCzK}~GM9M5A9wh)pU$sY$d4QO?&*@1Nl&|(3n07m#kh@m;MgLb zD})FB7_x&3&$eeu;&dT#PVPwvQ|>IhF&rN@0vWquWHWXJ=T9y30Q&V=WS@2XJm+DV z2XGz<+nSQ_u%vOZl&(vn4Ck*Ayob;2#hZ1~80`bZM*W1eEDz;kwK&p*_H8J5^^5E4#+m$UbfKY;^%5HA9&bw%Yxw7i?$ z1tidmh*N>Yt}6mEo`pCLmH@Da^&I4qT?B00*4h!me08f>zSpxj_dsbQD)1P^Ok_X61 zvUllG))i$k#d%;h!05)8+?RF1kyPRMe{q7q6->w~NnSm7h;>6QTf#@O%LIY*56(_F zLBLX@oI7-^@1vJvXHWdt;h6_;kNXYgaumAP@?H~^(-ct{lz%`br zo(G^Z)Kje?(#_-fqYsZnWDcR6&v=}e?1&Qx71_=M=yIyOflLMKW%K$*T@H_r-aQ3Y zj^*5;tmE%&(wJrQ%R2s^kJn3EtByP#FWxE7c|DEXvK4p>UT)-2P*kOcNP$EFv`$=N z4#8K8pl=QLJa4rW*9cbxIXQtcq4AHsu4pMQ?##@YWL;5#N;wDzl$CryRXN1La?nCV z-t3L2bYSfhm*AH`VRq87E}vt{^wu59qeLO1Ee<&uyb_&74JCjSCh(+S0nd|?#*4=~ zIwv9{{iKtEaud4#bo@Tk9)C+eGY_Disi+9x?$&u~`w3QQpo2<51*IFhbNPNr#kQFU zl|e5i#Wp-;>F|@*O#joJWo$=aJ)-XZrIg*Z47)`5rW}#H&Va9??e0v)VH@s7JOJ`heb1 zCFaq37F|qr**vPB39HJ)qb~E`xLmFxM-E;d2osSoV5v~*6CD-`=mwerEJIqI2YqMlyfoFuUp_2L!Pe5{2!G=DeyJ?SESF?WovtKbx#cMHQ8jml_9fBdGVPUrc@lG(p51iO{?9)sctE;Ca$@s8@OSt({2l%ce}{j=-|4reotXKG;qS~>Wd5i$J`L9N0?lEO_ve%yodbKv zj>Z@>qSw>8Sk7UrB7AE{JEBE8Z|rC~5ZC3j9nGQ0jMky4*V7T})OdEDWBu{!S3_8d z7IT?&S;yA~qIRV-6UI7)QJGC|B|)9tgj6hK)| z=N|crWj&pz=k8h5=6?7(4k%_nYt!{h}=*mS1Tg0+Y4zyWC4(c14Uf^xN;VXth* zsWp3~V>E??_*BXZhX-qYXEC4a{q`)XdvraWcJvwBqFUic-=`i-|1kAo`j79hqp8Vh z3mxpka9WO3=u>ud7BDU5vi2PXtv-~tVu?Vg^r+d2R-iB}V46v?0;&!*q^5OeO-GJN z#7*R5N0*JOPt6`V;7O7iLRSs=WJGpK&cD`~EBSUH5O=}m>!LM{FUrQ8UV#EK_& zw9Do^Th|qM)(*xuT0Yv*f#S{`pk)`xN#t2O6VCu8Y8=I^W2!7*urZu+>{I0hE4U#S zOi+~#^;z#1r=M$l`3B1m>gO9f`mXJ0_ZVxr;JZ1nqj^W;kdh^c?H@uFU>+L(=>OD< z8DCAkneo@upBa};{h4vudv-JgEOzwr;EMGue{!INZjBv{kTODXxcV#8x3Qz+9?~_f z9gPcuj!9LfpK+)hA2koCG!>Ix4;85>xQK~u)B}Tnrf>K%{20E$56vx#7dzT+vK|pq zE+Q+s#vmQqKaR^bkI7&d2DsNpk4?zPapXI496661hu)FnlxN1*Q?8}FmMd!Yt{tt; zsbw2GT7OxEr4^h<#+TNcagV8(>45#EL!s)HuJZId+tJDf0W8M#2q{8|9bMvCWEeZT zMRs6aM_{>4EH9hK-&$UrLw4;dzPk9pURozxC@$(iJ=DD%eM`vE>k|Gq_0aqqeI7j@ zeV%$S`aJbv^m*#TUurLwJ?`Mxf7;_yJ*}jg=P17aRdoi@{`lX^ZgqY2TYlCW|I=yo ztLgF%@ao}>bL>p3R8iIz0huf{XEo3B>Mm0T6ca}?CjQN9Ugo`*hMLnpbo!~k7Ju#K zy0*juncl=2Rn1`cDr-R3$%^&ci;!)Q9PBr#_6_r+*m#$n+1>9#8+^ zS^}>xHyC6O%xhwg>x{w^R93jgz_YG&EptX{*xUAycaJ*LHOOx<*Y#lWm77N%@Kypr zMZKe#d|g9(oXh2(Z1%wz=Q^i5zQ5VsGLubZ;(I%{Slond3^PjH#9?Lc7^jzFfugSXFH8JWgA$>lb)@tUo<m`O{4;q~FXc5Owgd3?=e zH;g$Mtr5*BSkHddPkWpXNhFpC>{Bd`VhQR-4sBr5W@fmK_b_pCX!+L1XeNShKMHS` zZ-Elac@&h$t!>O}XB!(6*PKO%N>LQ1*Rh6sYT3)tN?9~_Vk>`pUi-+*t9k9!9?w2FdPw-6ez9?A9&GLLKEa7f zIQFE7xX6l*a_n)$9tBnYwA+rrVvk2+8+%+iNlxP*{hxX<{q@i_{rS|N z>F=lh%sAlC9@j(gc3%5kdmJe^WOWv&9w72prf+MHBX_Er_IM^joV+flHX~)+@l-p1 zq2}I6a7I1a+N5&l4c%b1sdik zl2rBB501{3Fi5Xxo1_Va?j~g9IPx7ij+{r1L+{9O$}{7+Dc8V-kJ{sEmBT5!D*43h zgiaxJE2S!>n@9AGf*58M*gQh6jfHhWjz=%`pVb3h#XQnE{Kn-f$uKl@UK_&e;&Gnm z7pZI>ldNQ0Igmt|<|SoK^9Zs+6MOjh8<*=(U;3Ptg9BEULsww?uXvTV*8R6G7kYSc z?PN3x7?o5LY3fzWa`rivZ&gL3(5dCc7CI_yZ=v@2Qd-9w)!hctCOqG0G?C7s+NbD) zlQ4WE&k?qV}rI@Ggs$&EANB#Tf{{6@O`*Z*P2mL$yga5;RXI>=NKk46@2lSsCG?4S1g*m?hHzfV8)pY{9LiT`=OPe1Wr^!xDTzwGzn+ke&X!`FY- z?^FJN-tQxq|GM8tZvRcckNo~czmNR>WxtR7{#Cz^{Qld1pZ4{?>-YKj@B2Y}7R^JQ z;)t+y3ICUZqRvEGtTero$MqjS!*kzow8nM%U$%OIS! z9(+qim(InP3mpA?d*tHk%Q>4CcMmL~y1Zn<$d4?rzl42^m}xcVgNwkq4$uDM&T~ER z%pYzQ%m5#lnacNRD||w-nAe#E$M0ibjBLjK&~13Q9-j-<;pJ;s{FMEuLhYr@D#CRL@$l#OmKJzjgBJHHu$Yk8Uk@ z8rSTkE5ERI{5u64=X#Kr4_%--*WXgr-t-M})5T2{3N{gvMnq0Kd*k2M2dvA#-PoIQ z=syr%od>&?7c2!zUs$`g17634$F-&%KsuXtd$IVo0b)>@p&ICRVXmWLjRf;zOMLsSpomlwm?-L-z&cT8@-jY8! z^ynL)&(1<3i;5>duRw^awK19ilRpl=H9pHTDu2a0J0&pRR071C0KuD|ccq@#j_-hq zHh!5;7=Ow*8OGl-ew6XYj2~tEHKPaP&lx=#f6wUA=+)@c_=`rL#^1L3`@=ExiS~~> z>~ax1E_2u7!DlwKIeQKRnRGpfa&D-i5YEs&cn9CmwfK(@Hbcb^S3-^O%N4wNB(A~^ zoyO~eEfoFDm05raUG|d?KZlRQ@8RRfW9S_@O?gI6Q?4oRvOiCy^T^&1R4=KGRRMHB zNl{dD!sDB*0<=a}nxvx1FWpv|mzPp}Qb)y8ZG8U!+4~N_s*3FI014^IdkIYx3m`}p z1u4n9bHIWHY!n3rMLGh~dyw8c_6SF z-@`-gV4e`?6jG>sV$>@HzavU@1= zl^FbxS4L;!E2FpZmC-xF zSGJ!nY373SdLRyzjGw!JpR~ecW7yb$8$h87`{_V1ZHROg0oZ^O8t6t*O)D{VW?kD9 z)#y3_r=jqonMMY_wV<{SI|RlA${%P6(B0sr9AaUd6k%Byrd*;&L50kNs922QFT;=F z&G2J*HT)QU4L^oolRLw&$(`ZX+6BX}wF`+>8aPc{VZ$5hn-FaB1#v6CLPjVD(6vRN za!ztQHYSyT)LWclPGsQ~8TD2Y5Qz}NxaC)Q%yL+$2Q{*Xmd8p0B8a~53L~1=Kf^Tt zD6nEYEoa4?89~#m4BlGqh?iVQydDzLp2i=>2gX0f2gYB<2gYZ{2gYaCKQKPC{(N(I zzw)E8s+SOjDYLcW%`eF!8>T|PUPzk|4Q3Qv$PEA=96o#l2w>=EEEbR%`H1|5nngki zGH8f+<5$DK@v+gz_}J)Yd~EbJJ~sLr9~&PS9~&PS9~&PS9~&PSA6Kv8`zKI=c0rx} z&J`w5H6QE|Vf1Sj;>GCKJoFp=T7-V1U(3*M^lKIRjee~|ztL~&^TA|QvM)xQ@D*CD zYsHa!_(&9%$l|j=ICBqQujRl+CXV4_1dK1>TecXeq6>4w=u%?2EY4M+6PsYM>@PbL zmJs9%%&hANGqJIeBVEyGS_V}BKda0|6qz_)7_M|2&5?=B0K?H78CaniLGKF@5FYMi zu92F>5d>^wu2CZcV`cf+B!=9uAOc5Xp=HR)Paf-n&Y?X9CamaSGs&?oe#lDgF&+*K zH!@O)+GA)qY^;kYH2j6=EMMR3$Gh+z%CBZ0s!9!|UhP=1=gd}!tIzP02uOUVhz1}6 z^fkD2&XdEmuf4KRQZ^iCKc|lWHFE^8a>3;^_&(!yVM6DJp_kC zaXubYDX(zNXd+)-ddc;iTukupWqxD|{o&gJrR#blEC~9QZC1)yQm7 zuz&&V?+H*Iig71xJp9Q@NKZc=h1U~N6lV2B=M|Z2%8Bu=Fmny?p-Nn({m^gv$;xH=%gSf^&B|x(S7?8+XTl6{&W8>nQQ3fY151Dh(HVPhwpev3^= z-Y}S?_YgSDK3Dnznrxpd3=s@QXX2{F*T(P0*Cubq*T(n8*T(nOUo*b9{@U-1cj0p% zS`M;PlCzR0jG`P$i@luPL#G#4gR5+X97_gM+`5PkFF}jH_Ot}{PMzZv@6Z>we&0<%g@rW^4NHn);po#RKb|G zqbFI9B#n2W-ikOzp(IxDB(w_Ea*_w*85W;o7Udpv?^UR&#M#3t_n?peZ^o~pLZt&e zD{4)>lAH#@GZCBw+mh2p!!*nUPNgc04fGj*7#)pH##cs1<13@Hy=U|`zA}0z_$nOl zVk-ijqXS%^4aslgT?kNa2xsKX_SB(G63!D3-7P=B>8`dV6QK_lU&vhQM-NyzjpJmnGtmn!_tFqFJ~8|l-V8s6SHq9t z*YIQbHMukVn%o(F%|0~zntk}k$Geo5NO7XyE--?Ewg|LH`ed}^SUP^Az+@;XSs@;x z0aO|2VOt*WN=l9|`YWj@2C6t*mVkya!yGETo`^+<#;gDdfy$4`0f=e!CXHTqSSV;isImVIg` zXc-%?<2XNbB}e2T?aE;qgBlDvlbZk;L-nHeUO8R|FK=(W_>s79sKX zbO?<*CH&b=I*)*jru+kxtuPfa+GFg$&@B}HLp)3h`WLHjxP%77j*NoDp^^c{%f4bv zhr2Kskw@U7j6Nj|&<(4^z0uL=YjiaF8y$@gjE=?!Mn~fVlSAVJlSAVJlSAVJlSAVJ zlSA}B*~y}@Wfuoqw$!|PSeQW7c%4Ut(XUyE7o%VE&~Nl>5&DgOEknQ2uT|(b`u&OV zI+YWQ*YOhq7$-n~0+htS8n$g`<0vT%-QnYDu;npy#{oSIu5dM32KKJQ0!s(w@woyF zNMHaBpDWvQJe--Y4p z{qw}1JiKsY7+$?g3a*)ZrFWTo1+P66o|4kM(z9jgZ|$Ft^x3v&_YeGgr!4o+!7Kc; z^BVuWc&&eCfA620*7@h;AN=#ZpZ&A@ul`xLTB7_Zyt=>W;b$)M&yo-?NXOUj{-yr8 zKo~tG<>T=At>~gp5}!AjB)qwgiF>0=AHb=8?vqM}ah@pI&v>R2zDwF$LcPPA>nxMq ze4jVr$?moASH6D$jQ20NSxigEo-7A%>L{jF`F;A6(?Arxm=@)QH|2=Bk~iz|Dc-4k ze+AfT+^iqd`x*C7;Z1kt`(KqK3GIsh%4K0Wwv>j!3@5}3Z$z(f8LleVgZ|2OG5l=p zX?Z3;*C8FoCk`rPT*+hQAnuayZ{cSe$vE9w{u>aFb*x;MF97>jx7F41POgKwlj~ym zOnxR;iM+CBaG|BAX)PTR`MCksrTV0o=ANR}IGUn-|TKi~f?yqS(&+rwl3 zs(qfZMHru^rwF35Tt?`^MdfArH{V)?9n-`cwdr#?46v^Gm&sfFoS7?quwlUl8iv$I%#R*<+d zY8G(pI47?lvt|L0X~@ngNCyn#R+-t+j10gy1QyN8D#+pDvmAWCzaXEVtjjOJMoV1! zaed?sRbSz%9{Mmo?p;_CR>@Hz{vY;WtB;S1!E*1w*TDYp+gpg3NDymzEWyyRh1gY~ zDhwzF5^RHM9*>fQW7{x<#XbH-EW7j$Onq-#QvR*-1Z@`_CeODg!K!!v7clVmF?NEV zF~PDum`pHsf}b;UsxP=$di3{+vD3IkObsKP)M z2C6Vng@OO;7)Z?5gcapnQt}nf;-p|crzYovH@mo@X=?#nego^IZN{ZyYFiDc7_G|p zKZF6}KjTZz(epCCHP*9v$Z)dJN5XG7X_!*2M)h=aC)hIKusO<68z5w1sm&35TvNVd1yGzDYX`xw9xy7Uso` zL;$e(+@GZWiZQr5slqEEfG=<-7QGsy0)VTDe1bkkE&*6Xr59fb0X|E=D@kJ{0l1n< zU*T>j?pyKzf;=Fxmp=^0z9xMI3$$1$ynvJM{KYcrHYYA`G7ut^zhXRLd}H$o##c7Q zYCR2M}Td zEk2QgonUli;do12*k?irw#?#FCfv1)P%DS!Yt=Wosa7MwAIL>_l`13f)I4qo1&b;) zq$VTihh4ZclrVl11z&_z7t5y(P!Ul5x+`}N)9INUP9MeQI&~ct%Vc;od>bB(9#&qX zlhw!QWc4yS>ApOOqn;gv6IWOnT;N%*Xb3NqLV+wk>Y3tC>0)i*$qB1P+^1j{Gv3w8 zlG1z&C#hqTkM|%x7>pk7V5dwey}5%OpQFI0I4vH(O_E?a&p}*Lq%c0jVRci ziXg;RA)<>it^siQFE~M-s0A3r6!7I<)nrTzK!QjfWTSG(4+@de2qW1PtObA|hG4=d zjriBHF+@+HrQ+c~g_gx;MCBPm;R>T`7ywFthBK~uRDUu}@8ugB?$h)@rmpY$FgVr0 z)I5aY{O7Hjg{9D7O@N6L>{Ihu;g=CuEuV;{z%a%N(E+bP2-Y`3LK+_!e;6Ma{}>+_ ze;FSbpBWz*pIQ54d}i&F@fp_#^D;iOeXu6KT;H60aSbuAw3^Wj{VG*%TJ>luJ|>pI z@1faMGc}Tyh41p?AgxS%q6|`;8%YNYUou0yjG7S~)r{|^h8`JZ|MB|biOh?`@(68uxSS4I9W#Q;v1 z^(BWM_KpNYZd;8KuS3cD6rex1EvZW7!D`en!7Ni#+mmk9yZ@&#kfaYown=dKw$;0w zv5lY6b=bC~{9EM-8b718-<|}k-mStw6$Yv>P=$di3{+vD3IkObsKP)M2C6Vng@Gyz zRAHbB163HP!odG=4A{Jq&Ewd-lU3X1rMA8vjg#9JJNb#Pv~D?ovq)PUw!>!=wj7Y0 zY?b?e3IoP}#+Np4YJ6++s>Z*SS<&WYt5vU&;KsxvjD#Z*lyD@Lp(Q366H944{;?j7 zA0bXGLkm}*g)GeF8VaF9-^2`kB?qRPF%_+;B^-(MIon-dE|+5&bOIdf1dxwkRP=iQ zmYQ?)oKdf|+6;cC!6YqwGk~r(^I7^7l9r!s24D_cEtWt)1puOJ88F>!Q|OjL0$?vB z7WZrh@Ht>LkWIVegJN8uRt_-!FupOxWPD{aamIHxfnj`U^ZiCIE3EOSWo-Ou^Ziep~Rno=OM@_IBbOw-jJi4|&?kk^F@Sl+=kYs3#7ia9H%D>SEN;Pa#@k*U(WoOI|>ON(`Ty4c2-AR8VQg&dCQBb1knN_RGwP^wQob{-O$DJ3sF97#P~63JC( zU?Gy-%WufSJSt8@NN}!4Q;+8c&xLuO^c6h*yK=09;lt`}c(HmLUaa1Rmqfjp2ri?$ z_xbPV(M@{uo9UbVgb^)0!>{FM=~#KHDc1hNAI~^{{cl)s#n)Qk*WYKYZ_ zTs8-Bg-fq=tc-+LRS(q{73J^a=h;_E+#E2ZZi_6<*<$ ztwj#;Y5Zw;HU2dG8h;wU7=Ic+8GjnTnf^4sGyQ3Nm(ZVFuM0c@Q)E8qEQ+okcVqy{ z9F~FN*jBHXd^C;66>(%SuZdJ?0{!~BvNBsVzRrsae#3YMfy|ZzeJqMMj#5K0baj~m z{rWs4pm~NbGezbEntH{Ycpr4;$}+zIjVtsRldDy+n6<*oJdh70_b(ts;AXT$ElRSe`@twX&G4h zmX%ctSD{|%X@xa$)@F8YG&`e^>$UNLHo$nsTV^&+{Vde;M6qrzvk;3nv9ud2mkT2} zd=v}p@}h+}Mii*ZP3L0e-26yEzMchyW#oBL-@@YLg95mqq;cFqK33o2G%*}^fO8RW z1VW8e9(RCsqC8?Oizw!42x(j%or~iTuzr;5oN;m^I5OAd$>hl74c%4`f_YZSVNw6w z69;l=r&&9~$v@PGq-HrxJH$N5F;$n|Z59C8&LV#()95F(^2i2xc@%mwkiv8)g?8wY zdUXig&I{T>Q`XG2XRD38o}s1zK9qc_9neHCbUX9a*RlGyJYRK%d9YN>viv7p{r*?v z8m0lQsF*CTmeqW-0Nv*B7uS5V%t><`Te(^0ny*p@5fc0yR>I^y^d{^m(+?JI`orEg z{bKTB`p42S{iNm|+Z6ScP<>Sub>>Sub>>Sub>3SxTG`iG$*prUG40js1-xRL={%VZPN*EY%K46E;3U2P9o zSmIC1RmJxBnR@&Fa=wdZ9x`7_-Lei2!5{7tWYfhk#sPue>^B@yW52ZFs zj=*4Eq=R;a&{wVG^e=`5F@7^XGk!EaGk&%58XsGIjE}8e#>bY9rElq2K9-Kgo~sIv<-A;LW_i4|TDvdw{rSvelXsREFaO4I@9QzCu*l?*f(V^)r* zuNycKkug269F!DuGoUX>Iapt(6_I@XHNc9ghG}j$Fgbyckj4kbAI1m9KgI{fU&aT< zXT}G{XVz~rKC^z4@!7W8o7g9s#bMXPm9*Q^!!T}?2>c&(g!DAJ8NH0IMlYkc(aY#< z^fG!Iy^P+b7mVJfca7er7mVK8&Uy{cp`YCByj<12kanIlij8tOcr#ZghP(oxwu3&) z$5-A}&iRRWzJ^!^qFRPV3O31S~QxMmy?y3ou7jPO!Yuf1+xHoNZ6-U-Qs!^lK6NjeaddztOK%=r{Vc4*e#_dxm~{v;iKYPt;W+SyF*pRHhes%YATA=*#NZueUC$xKUTE~OFsTB$g9M>@Mlw9U z7w3~gqAkyq&M$XXx1B?J;#c0kVSQ(uahi@pgbUNEVOX)7K1VOb4-T5kLpe!=%pZu|#6GI*2)9o)R04g&;8 zMgOQKyijxafCe=Zu$avtDoE52d%!SOnT;U85gKN&wfwkWo>n(f4SQaw4^O!?A$z_&ViHdF)qu_X@nCw zku+wcY8Fw{jL!$Ia5^pD;C_1aeW4O*=H&6UXax8SVGKp`Ir({j^tkb$SgnKXHM;_MMFS@ zhdyiOI8m3$vwlb(XNs_X%v|%$_a$I66-E3AlVU(lB#L1RoD7ZQM-Y%7EyzGU5IHYe zfaD9%Fhrt-s7o}$fP5ghAd1j}@C}|?0#xJOy!?U`R4YYWg@Qc5Q^1E&z%VY(0;S{^ zL{g%81(AXjWR63Db8-q4SNSLq8k$I?&@xB9EI|bM78amrDTT}&`R1b80{*n5g{Vp) z^2jfYqK*Xxz+NFziKgHvmBJ`9FJQii9AQ#XM8T0OdKMR1()iu@()3Npu8HwQ%&JlY z;8QXBqr(c?G=pckVIIt>Kj^t-b3cA|jt}6cGBBG(Fjx`~OcHRY2;MyKG3ugr5eN=; zML;fin=?az0;WH?xeyJe!aVrHq%=wnj6ql>5CjgRqLj}uN9{YKq$Df5I;pjj=%&qL<~^rQ-)xMMyZ z>9GR^IYWBDAB#b|lyBq#mXA~1^KhOzYJ^&X&5=zC4&BMiiR4A{QZxXJ2DWB_@=TC5fd|15s7tjF;0hjNLc(;0$kIbJ|(ezDa%Uym|@aTMhdDwr>6(ZQ^VEkZoH@+~s8y$@9 zMkk}Y(J?{yF#Yn*qX(GXQVl$S-X|Ih2rmDL(3kt5fb`{J0i*;lV(>zn0Iz;&jb5aVOD88785e)ph-d?eV8rnu8lZ7l z79WvMCV==1<^`8}^)o&QL}3VHxsWgW$aHAJ%m>BO3NZzrIMK<{;#EyZ9}L!*L^|ew zSTW7ZCr2NVgsSl+`vQWVZ%T?9e;6Ma{}>+_e;FSbpBWz*pPBt?d}j8m@tN7L#%E@~ zn%=0W-BMB#-wy((WM`qr8le^*zd>uRU`sSgs=?sTtiDKA20@I0+s_!#hAGf zblPDvrKV=%GeR&8;Nf6}4l_XIn(dMf8;Bj5Onj0EU7}356GjZ&z%2STaA0r+jtW8G zA{a5GAA2&utJTX(O?f}AM#65P7Ns$P5<+h9uZ|3~j`(M#(3R7{9B``-LbJ%W69vm) z5NncU^x9f}uv=)dK(x?LQu*SDEI0uPfW7I`A2O8oNVInZeF$#S9|ZWW3VVa-P_T2O zT?_OR(1quy4+7W)VfO_+i?El1ZbJlFt64bb3bZ7MKo<2T4HR z3FYCy6YLh+3IMAGqsB`lA3YS>Eof8`p!P^Uts25$Y#;!3%hod2Jop;=V#wXsgTD;W z9uxbX-k?Ec*qIA6M;jCzBD~x@?d%b%YSIMfHffo75I~~4wD5RyQJ~Li*ui9x6rx=vGfN`12h{IAG9T1 zs54z;H+JhmVb%5u(@-cx^zupnWYYoZX{i1{8j(ClJRoFD6C6(Y_rk#eR*EO}ui7oh zjiRras}MmYv;WS1GxG(E)&NC}nUm%7^L*xNm{Am&30n-z-h0UmEhkm=RQXu1#mEqQ zHg&XH0HW@P-NM(@%S4#GpAO~nUkyMB(DV2C!ktIEMazsiHoCMxL>0Z>Zt-OXhyrcK zpRWfIp;m~7dUSHsLS-cvwgFiVf=Wr(P>lyWguD#i(#(CCY3OObEOWlkoYg|XL+NLs zBEU7PfP7g3UlBZDBry-om&irx$QSUOh z4v!pfx4@y6HtT1O#P?Z^|4lBe9W}YJcGl#_+F_F))B9*oAUzNt319Ap#1@=0kg0%6Xj8^Nuiszp8v_Td^D&|7lo=h*7|t>@*Iy<={UR-4Qe>SlI?U zAFVaCrW%+SCP5G_aWoVdA44mX7eNpPV?gn+e1;dphv6-0z7!*ukQlu{GjoOx)R(jH z9uGQNs8%SHNCJk{k{(G!j5mCaCCkiV;57;Yy2k`BtqKf%iV?|Lc%f9EIU3*%?wbK_^jtMRkRgYmP;gV`M>4`z3m zJea(P+4=7*!&42`Jv0_O4wOGy@DL7aJN1I^aRH*2dZ_F|FW3RD(C1-EzxI{~X+JrU z5)A^rns_(iNJ=2txy|JIkK>o~955)=_=e2@3krH0)uj#1UsbNqM%$Z{fxM=cg90V|P!aM|EpCh@1(6G>S`Y0iNjNeTTjNeTj zjNeTjjNeTjjNeTjjNeTj%+5A>Fgx4i!Sr*Dni#9d$jitpOydW?Yi6fM3Sm*AACR3> zSctF71D2IuP(WJ{x-+w&0M>3A?wXjAK;?i(z|ifj34=5>8?z-5eh|H8rk?wbHX%0x zyMmSuHz4Rzq3qoJ!diJSRXN$1Un^g?xnbbBAP@Tiut^{*2RjZjYGT7zMmBb(0f;V2 zHu|IhLhEPIg&8{Z^Jx_N-g5-@Dj3WEL$>h`H-4eO$#4pRmyAG5opghnhP%cgMEOL6 z$Pyu<41b0`VpAmxhoF*reC5CQGykpt24k{5C+1pt<8byz%9$ajCy&@u|&MUR_5 zY;ZY;p!SD$J(Ba#C@OlWERA#gfCJg{#g7&!Y2GBXD`=s63&Y#$+C%1~qPIV2ov8hx zeQIRR&Nl18&Q8V5QMfPDf>|;>PEPm%1&zmgctqeGHC%;gLVbxVUk`7X_yTFEG%|`tOP;i3Ji2(n{ycF$I z{;_;bKUujQGgd6vs1qTsFRWbEIs3E zIA00tQx4EjdVP`@U}E%SK*GyP(}+v}RGa|d%M9cN9;g7IkaF}uF9d3M1puk8wrhDP zxtl5RVj!->)*!=|;qgD!P9%+Wl9@Qxi9tq=b!NiBaSgB$TS$&?(?L_5#s%PLmvy=n zsy7_#EI)_c_{8|b_$a|2umH)XN=Y5_44ny>4paJIj(;i-kPnia^y&p&Z&$)e`i4L{ z!-5!Jn>-m`8{Zo}th`1itB<8)^-8oSX=;WME!d*RnlaPOJQdj*k+g$Ke)IC60s#vc zuZF_lJ<6BlB8D)M@?(PA$ygOU%EF%EIP{~j87aYkR&T?H)!Xo5^)|d%y$vskdWVQG zJz{vVehlcn6+9uGI5CcKU7x7;ga!XM;uiv;GEq^UJWR#KWG9SAq0kq+bR;`Nd0~Wd z=ayYzJ&k{iPF8QDqw$r|+4#!nZG2_)PVkkdx0et|R618^QKHZ-&%s)Ogdh?56eB!U zFwndrjKV-K86WSd+75-Fq8Dr2LV*H}K~3|j$}T55*ntBeArFu_AWB%4rD=M?V@^W7 ze%KL_6GDdttr$8W;?XWo zox6cWg`BXKpX;L{1$c)M3b?qR%k&WqI+-)A*cG4&0b0P97{35-Fgw7gw($zn^#Pdn zL<-ED0LH~Hvc{@Qjivy+9@5$5&E(AF(B#bI(B#bI(B#bI(B#bI(B#bI(Db>*8~yeS{q|@RI?}Yuf>~3H!|4kDoV;kJF80UBLm^z4vVxfv#ZVcXSXq*fJ{*V5 zGPBWV!Fmyl?PYW2MJAWyW#(bVAE#tN>@muLmBttY%Q99=Ng4ZeXU+D^W&T<6xqoh2 z=btI{!{@Hy)A{Ekef+cXzJbnbJp9C;!tka3Irv%sMEY~D;C27flnU3kq6?aVtepYh z0k_EuqiqRh>wv!7v}qIL@LCOb<@;N}en^VrV`3#H97dZ#aNAw^efqbShVcT^wDrR?5&7X1q6y9|6PENz}wWrm?%CWt5vGh>%&93BfRIUg8f3_~k_%!!A zq{F%q2P^>jtukJJuN+_Cy_L8Pr%cb%G@SAIuhL*Tzjw2)$!TnctQ5$nUf)V*JbAO- zV(fwuO#x(ED$B5v*C-+8h`Sp?k4Xh zr}0PKDJe5imuPOb@BOpC7z*~UpiY$>e>N!}zdS)3 zw1s)GZAn$V^}mCG1lyn^?Q0DabbG3g84yb+H0sd1-mV1oTX9GsF$=w&32skes^0x? z!9Y1<8$YA**q*{;n8&}KU_XomZC`?6c@ha?QP1`ySoLld2C6Vng@GyzRAHbB163HP z!ax-UsxVN6fhr7CVW0{FRT!wkKoti5k7Iyy#=LCZ2g9@sDvi|u3MH!O(Z)9`5cHar?Vth`1itB=vi z>SgJ2owBYMVR0lT-?mduHR47LU6zdt4-_3(MaNjQ0Gy2+K8a7w?+b>Q=R!9da z@#`<@A!@kg6`mZhCrIN%bW0zOtO}U{ALb&{g{*?jd)&Vl7ToG>_^^5#Uaa1R7pu47 zB~kA%J>$>Nn^@;qtp?j;EZIb(teCK$FruYr__h2j9V^ej{dca`Pt!|A&xBsm{W-u}D78Qe_x$0QJ#E4$!5&fEKW?H#A;7=K4`qe&1rdiT;{Ix+ z0m)Ehp|N!RKhwlZ6dAt9bdjQdB2Yha0JtW?Ks^`I$MZDOj}tO+qzs5QCz=elwo^Fy zDK6%#B&D0N7#mSFBP7Z6;NzZj%_>m^1~HJ~cvZ!i01xwF+(C~Bi0Z-m)h}kpGO;#H zgMq9(GtokZ0boI5kHupV^d)@*QJFAGq7Rmuq1*zi0IernK3n|4%`y^^AtCK){9$}x z{9}Az{AGM#d}e%Ld}i&F@tN%lFg~+=0mf&xFTnV0Yu{5$t%=V#sJcx}ElA7cdbBKT zc_{E}($dqSHF<^?K1P=r<P=$di3{+vD3IkObsKP)M2C6Vng@GyzRAHbB1OHbs zkeIItD`@jhR$rT!;yJuFXJujf)MH30Ktj(}12~Cf(_!bZoW=9FddJD5g?RbzXJ!pxa`-X@pJ1s!GpP1 z8^}&L{>t@eJV!=nfH`B%d1~+VD+0pRW(-dP__cDF^yZQTPGxTfz}z_s?PG+?&nf{h zpNZ2lza~=_Yk_bq zSqo!uJz52T@rUt^P30M1*@T7hoz3?fU)p@X@u!u|_|q~r{w4dCJsMH0 z=M;DcmZ1^hT!zMl2k3FiMg$thnLR@M!opJQ_U=k47iMqtVImXmnCMvRuRiKDigx3up>G zghLv96!LzOM?)x<05bsV(XcSbzoF|jH3R`F8(tJb50{|9i3OD?5kK1PxmAnDl`;v& zh6n3QY;l@?JBX1CA69R}i`CokV)Zt>BK_yYUOYBeQWa97(NsCgV^6<>$ex>mb#O6XVI1 z$}iMKHZl{AR27>M`RQhL5K597#q+ z5I(EQ#XtBUD|`x|7avaLF_65}i_fg`kT4tzuHRq9cUi;G5TC}MhF9ZH!>{4p_{I3s z_{sRw_|5p!_|EjF@tx_>*kd2Dt|}y#IHK1VwHFfk4>VOr`3#PLXkqGBk4SSFfBdG zCEfVPS6&e#H7y^DqUpk!HU&BOrdyQy!Jl^oMncP^M-Jl`?o@v94QFoQ&<#+K2PM*h z18Q<}(~^QR(Zt|v9tI(f;m_p8ZuMzQ~Us+&Bw}->*hT7gEENanhG^VR%jtjxpguKZpp; z8=i**)yeaR0c7&TX)aGR#c>*NL=r~;`}1>=1COPIGDLtsyI2DXpi=#Txdmxl@{Ih; zGuP8$@Fi|E^hh50Y6+OUKgkH0la{_zx;#A+VJUe2Fb)!iiw84CaSA5BRZZQkrSj(< zGZhBlpe`zDumjE~;0eQgjhb8!>doi*!#rUag=A9r;&y}qkrWNcN4?RE@ML2oREY0s z<29hVkmnDl6rd3JR5s4|Ekwm}2v}ZT0Z;!eEc5}<{1kp$yD$Zr>rv2Q37AR>N)RdZ znS(GMi5eM)2S*veBb0OVqrgg`9ynach9=BBAD=V^#-oL3<_Zf@HU#iMSJbyK1w|`F z0IHB*nD?j8ANJ>e>G{L>rn;(K>e+03vk_7VuE!5Kl^2&S>-obWEIfZ0?7~3w481En zkC&9^2|{}QFxL^ouRnn4!9fsX&4bDNJopL{(vwUe_E;9>Wd+iKCC5yP@py<{4i8Gu zMcX)woZEF!VsNzP!Q^=gInN@(N1^G}C`>InZCC63+)4YEjadzr+<-E^e`McKo0UN870|4E>s9fN{%IAdCZzV zEq_bj^0oHU%4O}VmCxE=E1$K`T0ZS@L9bvdlXvDq5NlAVh)Zfjb$Sei9*@K*K8^?$ z0d_zcoI}ns!VP4>WZ}VX`WK19oRHLW$Q*mxBr5Pp!b*G{-D_bQQ z!v-P1BbeJT5Dgx*FCIs#_1VtgAD8~p$9NnQLS*b<(Uyqq10raEZ2|OykMQZ(g*I9= zA<>*510+BQFJ`8B(@ApxFxmv@5;6{(9eCNPXMvFg4FeXGO&6bjSB|E`nEohL9}{s9 z?rjXHC73@*$;b4GB7%Q`F&UsK@`=3lZT|`a=_SrsKwlsq4i8J=BQOa%Sq>jvi==t- zWd-|0G$C#bQW#?M9p20-B&6|y@rS{Ue~b@|zl;xz&x{X@&;BlZB{e-aGd~lDeq;X* zPH|1=7FF)-AzgDK8GtDiO@-G>+4+peQ(|FHzx`6xc3nCf`)|~vV|JL4?P73f~a{BO5+8?nGB*M)9ACc{IE}H zGrI+-0}k2r;-4adAN;ErI!gx3s75#8_rSs9{ zrrm-rv?hQakoHodDO<>#J;}U0%>(IyKj7D1p0~BMRHz$`7yK|imH>S=z6LM*V)#M6 zFi%jFuv8qjVr2IBBT>AhrW}r0Lz(r5b_)V%FwjCkNl|ir11Z5IKwkhKL}vg_T=f-% zSq9sPgI4Hu70_JND1}<&tXG{Faj714<8VPMS}pGh+J;B5Mf$el%RmNk)p}h zL#-(qNa(MG0Vowqp!sSEkO%BEWL|*!VK9x>6o=iIxi3%(O8|Q*T8It{ET@p+jo*zg zt-UdMu=WVz5Sr9ra5ezoGS8p%g5@EP{Lxl{KR9-k0V<#TK@jyOq>h2?DEc2NQV^Fv zh!et8K%okAskn13DbQWh(@<5hY7rqHZzcdlyM_85QisTFXdr%+8loHRRD2LH4;HXlqfR;C>%UV7`(thwGarRr9)ZqbyNERp_EJ-7O(}V z43LkvGhkliW$F3Eu$&MI{Ad8jAYcd4;6SM~50;*ZDvh)RmGfY6wFC_C6A)^mX}($l zlF^riMdk%-1sG=Lh`{oZ5@A4IcD}WHf0RFy>=x|MtYEjO1}48I9B2_p9U7eKFuMh; z1~7}Hd;2K^#{VW4){a`aterLaF+FecW9>AK&tlU6yNcss-Vs8y&0s+i4sAlfQ=Iui z0Jupd4pb<2gcyj*Ub!B60{q~esFQc-38Cgpz%W!`Fdb2(c%p&v zXMWO2D^;(*t6t%`%A}6+uP0rS6P59>KYp$kC&9+GGCiEg9XlPt~Ys`pD0KGvf z6r=-9&YOp^Qx3g1m)%^AN&uQoW=^N}aG}_Iig;67CJlp&4Hx1tL2b*lv9fyqr|?@n z4Z0;s719Jz6&h+uwMkSksTTF}jf(l8+$#cyUByaGkGw6H+e9AH+e9+n>-}= zJrn@b$0iTf-&X(F`#S6M;z#|n^GE;k{K8%F!nU4YXy?Y+)6RI~xp`WSq#wfrL4%TR zd)JtXvM} zZ}s5wkJM#rY2oz>*I!*1om<~zl9G*+s=XoD~ z%JMMYw@VQX*I)mvmol}ed)MsPcP~5=o4Bz!IO^cJ!P@@IgP*Qz;O_qNFxUR7Q`}+i z&v%b5e%N(6^+R{-W52lvhUCjnDZ5C66|H2$d&Sb~+JofkXfJ7!f1I>FZ>WsDWV9@9 zJ3;23F-7)WGF_hdu0*;GE0ZSf$)&!3uY2f%r`(riZ@M<;f8jp6;|G^JyoO90nJokR7E1Fy zc9gSTYA84E*If3B?_u%TE9%1E-aJVcZka& zBjd9F4RJa3g}BW4JTB37arwtDae42zxV($Hr{EmNw4A9O_nwtqH2Hx?i#~lmC~ord zyyCNWU0J+-Xrq`6?i*VYKRZ@jcX4dZ_}60t=KL0G)w)hF{_EDkmGOgv_dgmE%t$>Y znE&$y!GSMd8#IaE9o$;;=^!%j-9XOyCRq1qHFy8jId101b=|#Xjogh>_jD7VFLn(l z9^}p$)7y=FV4&-HAn>+JeckWrAx_2&H>8daI&Yk_h&+eDO)nw3#Y0_m>rt}?=D-#Dq z<+vki%a8U1K`$!b+3ZB7rQ{tKNY z`rCdoa>oPZ+(w7UH???re$EUjxp{_M*SwJ4R`i%R9bHKp=-mon))yG&ku zwoHCWiOZ#J;&NEuxV$(cF85v@mz!>n%RW!UWzDj<9Q$!x)~|?5+qH3t{}7krpX2iI z#<=tX%{znU58(a=_irKn7vxOs(Ejx7PEDSAw9|2)21P5so>$a+$jYLQw=^n#`Mtiy z3qC!&xcQxni*t{CqxgmQHWeScL*3ZVt=q&NYt=0_uh#Hb>v6MUpFDR_?EX48#H#hW zFSh>V=VDLI|1fstqVHo*FG~&HI4~0Yyw^^_;tTc&h78>&IOn!~gE^y)2p*kxTyUC< z4x05U2{x`iEvWz1IYI7@mj)-D_K)E8CN~AI{dQZhKIi`6nIj$xUVZlY;KC_y1ZVgC zC}=xoMNoao_rZv^zXd0bO?7X6l<5`@%Xe3#*LH_4t?wqDyQ{lrViUJyTuayRw7uOW zi#xhIzjm(nz6ZE|3%j|UoAq$tKhVdG9dNwcV~3&cmgS?|sgF%?``|@v`{yio zD=zxV{dDDOcj@)tx=FXLbNk) zQ`S^|JGz++Z{0$gR%;~O)HjL?}*9F zzD}lY6e*kAMM~Q4C;gw^UviG>DpNi>P-YK0SlWMjhzviryF_0;R2l_`%LO+aA>A{2 zNVg$9<&=kd$(OlD$@soUOa1wMm;F8-AVoi% zAnj`ol8%wVvR|zs(yw5soR&3Ap4vD}c3&}EZhm=$^u7H=>3sG`89HE;yuIgWnZIGQ zJp0d+eB&lb$7d(W!ow!Z zF)!opHbowJY>HgF&s3>>{Zwg_H%&4oPLq4zm?np}oi3~9OqXjvoi1m$n;}b2nIXMj zoFPMNl}Kiv66te!iJbTbp82Ix)U{NaO)nLxSaoETt;t*%MXz8_K@)o zXw#}e&gbDSfP4?beI4!>aDR?_9qx^|H{qu4=N-$L+WyzmvpW_(`)J3Xz6?5DynbG% z36ocL`sRT~MdLQ~E!y>$vx^42y|}31#cveVsGCy!YLB|bT}s;&*S@q{amH1{i&s1| ztGHIt#l`Plb3<_?Wl8awy`C?Q%>Sr(@<;26ADf*Po4IQ=_D-7yu|*Fyi@oK~j*UHUL9FiLJ7Yg&JQVwW z{*$rw<6n+_a`HQ|c`tkx%j)?}EU)&4Sl7(z!5ufG2M->f8ywl8Fc{i$hu{mhOYrzf zy9X;CY!MvTWbfd)TRR3P^pN1k!mh!z@45%CecdzoHtpEp!J>h|u5(5N89$E=`ky*A zIJNf7V8aiyf>XXYBPd*cb})a*`Rlumx7Mz%Yrtm-U{}7|NWrhyPpIwIZhUS#*Q#L$*C$rwzB)E= zugvW1YAoE(O@6nltDk>}`~09o-P30r;qH09r@OY+(Jnsl7$^7icW>mJ;PxId*d6@b zFqhM2q#HH&B-bxs zXS?+i=eV*1&UGv6p6~WveStgdv5Q>$xtF+)CtT*b9)5-E-||YgOZHXnlvV$5@fWXl z*>_y)cDeL=cSp&M?t#HKyFCxP#btI{26wkm;2_^d)(kR?sLCA zbHBUmpAWj}cm2~Ha?4V;!?lmP59U7Z&b|0a*YLcj-MO=$boYx)#o>mNvH2DhtAkVP8zeTyg6_;DeK)(1|Qf+PU+ZKUf*MPIl5jGNlR}k@2zVp zZ+xNpu#a=g5kJwV>LVt^dcyxDOp<|@^!ZC7B`dIm7;8?lip|R4W_Bh#Z)Hum{Y@E!fGhVJ7Ffba;GFDBJM_WyngT_pj`L|7$ z=f0UN&$gT**Nm7Vy>6Hy%RibTy?2-@Hy=4wK0OmQ!_uh|SvOU(_n0O>9y3kenlnvq z{pU0({d$@lywh~4b;xx2bn_IbR_Lv#+z$G&z?ZFu` z`lA`LzIusVy?cp_JFrAX4KI<4&Mc7?HzRATc>rSLvHUn-R)%S+|#pYhBulYJYPNz0C9GPPTov^cIzx{fWA7fvpd$1W_B zX4jQT>Rn}W)MI7R=+!dhUnU*CE|Xb5mr3vRxZGA4my36aOL~jAWVMgW)t%8tJ|r#| z_KM4Q{n0-j8kcj%#O0+aak(cRm;KI&OUb!$8F)!te!Ma+!L@PecynA<+!~jjcg1Du zlDHi6Pqdkj#^v~@;&S?Pahdp1T$;TGyYUUQr*Fq4_kFzkA=>Rvklu2@zd&3272a7H zm#)%LHmB3)pDgaw=h`u`acXVn4jzIkxv* z2gbg??XcM1&-ae4O6?!3-+yrIfn_6OPYs_CE81yBEPcw!vE9a;78^SGtk~;w&WVk< z^McrJUtSXXrTN_0_oe@c)%^I{*xpCp6r1qs!r0RTZjZItba!m-qWfcoBOZ=j*zWOI zt^8+Vm;CfXtZ?nCv9o@9GqyhO{aDX-pTw>n{zdGqg{xve{Q7Nd!*M^v-hb(r*o!x& z1Xql%5xiVnGZ-Ds490(x9lZZqUU1XH(O}sfwSwao)eZJvTt7JNz6Qb0&+HoHeB3BF zY*UlqliiyKPxNdRe1B$}VDyu1gFQ1l1RZ)61*hB?1okYm43lHCk_aPA|JT&kTTX%jiy4pp-_0da$ zp1WTbOpRR;M325Q*m=@b!IhWJ56*n>n&8vVt_v3A-x$2>ZVo1nyCs--)1u(rj~55m zHn<~rvHxAc(bwD)xUcRDPTBi`VAq)s1$AD1I2gG5qe1o3$Ak56JsEUr|4i`wWzPi* zHog!n8~k#x|0}Ns8{O-{hTGo^IyQMHSn`kef=Ts148~mXad6#^p9Oi>d>-7^?5p6^ zdsYUs_y0Or`sSKow^82(i&NJJgRcHDaPo5ye6lg$0usIO*^Hz zBd64Kt(K*`3)*D5((|(1H*2!p@*{KIarfl8zV##S&6!d6+E)ec&>pqi0spM+mNcvD zZoI6X%T2HER!`Z{by>NS%RX*rckr@Z+|LK^=5~6lp}V!Xv0HTS?yg?jrtaI@_i%f+ zY3|;?y@mT`?^bTey{%p6;x?}A(Y@Tx2e)+%UTf!O^lR_hf7QWtpVY}cSfkj@x+vzZ zZR}i~`^0^CNEi3hNBg>gllON!<#lz9ZaUCS>T<9v_}~!t&W9am!QOh`d>@-P&31l-Eyny_THj7R)={#ZNxNy)pDmx3K$J zZqweg-K#sC?RKp;$F2Bkj%)quId1j+=ema1o#$SebG}y*;YN4K%A4H!4{vt2FI(WAeC8In_rnX_ z4|gqc(OYhHCttnT9dOxg?$~p0cTb#lhbt|;)15ZyF8BWEyWPy8_qegg-|H6kxzFv{ zV~N|??S2>S`hXkN`9YUm{E%C-&p%zAy&iUDEtk3`dpzQD8$asW?)sR!bf?E%yB(fz zIdz_NI~P9XhDV-uD{`N4^Ru6IvooJ_3(}u=8`55IGg4o4Eo;2wva7%B>Q#Hi9hvf~ zyJyp@Zr@F>xu1Sp=HB@2b@%pfZ@5jrz3IAbddn@@^tL-NT-9}8ZzkS8j{v5Rjyo+Dvg_`$^2W=B&S79^xu-NJO)wPl7BFUpYp zTV_hpqDpId$aL zv+Bs>HS5Z~v+BxeDfOgvX+61XLp>>&yn`I_-41f>N%iG`mG!0O&>dy|Cp$`B|DB}Q z+dIjao(<&qml{apgLjsP9^YB^aJ$IRCA-L!y?2#k7VRo|O?HzD=kF$8)N3eN7dDh% zvl_|6vl_{v8ym@jiH&91>c;ZS;N4~R`@2h>UQOhr=bOlR`!<#7_cxV2+w38WZrnrG z?$k_vyRezOmeE{Bl{J?azi%$z4{sqKeb7SA>(NqbJl#@?i(5(i+gi!GhOK4drLE=O z%su7)l0Bt#&7M+iU>iB$^)_-)*S#cb$zF1Hv%TfHxqHh~*=;3W(pG+0-B$MK-%jeh z*iM$l_L0Vm_K|&eY%e>`ZZC^}YA+jxc97p*?;sEE+fnwsy`vo4pp(e#PV&wVout_y zjFrAzB&&;xrT>k^a!NEN{Yzr9>Wi4PJTj2o9t`B!#!ecY3tQnwC*K?|a@;c*OKQ_u zj<~$Dyt=8g)EL%9mcQ6VCbipF?wPx=XO6(E?#_~>>oKu=8ro_u7B+y>Dl&RS#;6CviSRhrEkwe z;FUdq};{ddS93J!RJU zJ!SD1J!M9$m#n^^m!y2zOYSS~Es^tkOV0A%a!ZG!WYz4W1iMsBYG^jCB-t06|+KnA4``kEE-hFSRG>(pvg07?F z`st(O{l%kX$)}^FQ=QQ=;Na2HvShSewRp7L^YLhzP;ipGx!+0h$;6Z7!W&MK6>pp* zU!{$abN3k|?+qR!uU<4pPI_#N-1Y4kxq9cZ(!TpxnKW%IczCR=d2OsT+cZ}4T8xu< zM~#y=P97&q7LAjxZ;g|9wed2j#d!I?*LZ1NHePDqG+q|GJYH7(I9}e|WdiJ;39{s* z33BTt6Xb}8CSd$G8>O5_jDRS(qxWAbqwX&zmsZFQK;{B$|1;cDA+B9jh<23oG-8AWa*fcqF*fg0sbDHda#WXqpj%jlLv(x07Po~L1 z8>Y$P$aHzV>2$f@O_u?^r^{0#r^`1dPnWkZn=Z3%oi1x1n=ZS(4V&@n>GE8)8M1$! z8FEVV8FHGNA&2&uA@2;CAuXl>K4*qBoIgXJxnqX3dt!zRe{+Tm`f7$W{dtDmosBWp z1|_mb>k^4di9B(5iF6rIB4>>)k$E#qq~!b(X?k^u{NuI~`SjruS@&XzEPKC1X09rc zUpAD;0U4!oT%A%muyLtu+N)H~lv4Smd#Pj}Q!44hO6BzlusdgB9%W9cG{2%$_PwE0 zTHjGB-#k<*r#w?CtCnFr_oGq?R+dVW^`-K~CfKT3WwNqXne4d>#&(;PN$0j@k{guC z-CfJ1?Ga@%r*D}o9f&!Zk!5nvMA)mPWm5O_GP&^FGFfqHnd~$lcI-`MQvbFx`TX88 zIrrf*sq<8sl)MOA_VqIP^1U)y^=X;BvZ72b`L;}oe=L*7f5khgahaTjaoY%N$~tkm zVJFPpHH=HUJ>v3OE7+xNF^AJJE@=*PKKsR`+d*+T=up^%J>v5HQF!mzxD*Y*`10Vm z>^dSYV@Aj2#&L0ZdQx0onHHBPO5<|P$#EHeT3mKG3-d>FVE3LMm)kFjOWtL1={q+r z=Us)ouZB%|U0fcyF)j-iU=DE+<`Zv&4S5IhxEp!j2V3_3xa{#zT+VtJbE=PE4Eu4| zuume-r{i+Uvl!ogJ}zZ1#%1Wsaq03Z(q9I9{PnoZd^0XhU^_2;2l3y-`1Jb-|1d7M zd=!@q*wM#+iaapp{W0w6LfF&AU&0QDO?}b|jE%2^eT;GNiLk8)e~tRXzHYt-COhI<(9vvJ>w`vu%9ai_ud z-Wm5kxDUa79PY8WXW~8&_f@zT;JzF8Qryqreg*eixIe)C8Sbxeug1Lw_xHHh$+EbIJmWF6P&w1Q$P3?(@ zmsJUg($FpvLYdj4qLh)nLv|#Qtz?ruBAdRC_aC2set-V{xL(flc{=-?=Q)?o^>)8^ zuUjh#3$KtY9=b!aJM)0#_?r`wo$D@2=FGn?k?d=g+|qp^2|fK$QeF8=GW}T(A#G)E zVQRFp;2)+bXpGep8j6gB*qi3UE74XMc43H6nII8b2YU!#wEcvS`k_J-MGA{%j}^?H z#0nJ?5`>@sQUu!**+RdjIl}VG^Msjq778aiON5#IR|w0aRttKS>jlMsn}xW^TLsI< z)k4^mUBbiey+X^jLxSbl3dZEXUbHdyQmxM{zuL?CcZwLV|?+QV^+l5_jPlc&j z9m3qkcfwDrPN8w_ccH8AUqOtJ7IzrQi08k_iVJV`5q}<26g8?<#CsdmMW3}=;(r@; zM7|hj}*5I86z6p8z(vzMvJdp;zZXkQ$^Fm)5RULXNrvx zY2sX)O!1CVt~eokwpfu;Anr~qCvOs!R+Wj`7c0b$Ut7i8A=||Ji8bQSJv+olUv`NLg+1c;`TIo6 zI|symR)@vg`A5aD*5hKa>q&9Z`g$=y>a5r}^}MKX_oAricUio8;))pT)GQY7yDlzt zxGDM^x-Fg*?}=X;TE&-~BLKHrrW&wQW;m zs=CUoUx^Cq*;9?3$x>${ziO}xiCRqleP3pgpu_au>$2yG`mFG)0sEcRpZWGQVpB_u z*#uovW?OB>nw`y=*Ch*9GRBJS{AA5GF0f$}jO^Htt1@A{W^YzHNHH{5;e}V*X|dXOX5WqwYhuQ6Sx7FId!29w%)li9Z2Vm6w0*ze%GY<IS%6iK7o_NOMx}USxo-dhXK?fVv^on_^zhOT|y=6J& z@7R@B@7YU-kE|*C6U)8$nf+Az!Z7YD3*FhptbcxE&AvaFxaKEI?)b%$UH>r2qQ9*1 z!9S*^BSpq%rD#=xG$m;FplxS+koSz9E<9K8u-qL9#_M8}hqhLpxU5QrrkT%F?!{SNH8{&&EO2Jl=tPOb3%z z$6#VRhtSDHM=Eu6qH{l;$iLp1%;&k#m_S#0spduv_uQzvOhP4-1)6Cu($4Q938xtu zE+mSI0KL+8=kLhesn=c)T9M^RDL!6Qqv}l#54=ga#)l|%D4liprL{_abf(phSdBj^ z&I%wK??5V352Dy7L6o&On4aW^(E89&sx%Cv?vG)#<8(M}TOL83(Zi_3aX4klj-Z40 zMi6#Jl5XBe@(3SA$IPNA??)7^Y#L2nTSWL1)F}>YgOdm~3NNr6CMJOzxefdks?&}h|JY^{rv@hl7 zaT$d)ETakHa$34?IXy66K|?pLpsQ*tY372JH2CjIQcWqPKCes3X#6UQxV?%h0#}pb z+10edbqzV~Swmk2tfi)nYw3)}I%-+8j{ZomC(q3FwDr?^GMuu34n5jHlSXc&LDx2t zmhUFgtlvboE}Ln>p3St&qKwqb%V@byIaw_)r`A3dR8>$xMZYVkFm(&9eZPe+#BC+{ z$6IM~R3$yQQAtySsz~`_6*XcTZ9cY*77nSV#kJK`X;DMBD{4sJU^`{5-cIjTcToD` z9i$_>lbUDmqz%7!Qtqr>l=gWS6(rPBRYxtgNAD)DzCuwNsNqU`liZ;DJ zMbXph$@z6X=}kUO$}dinTFe0D?76*f0eMDQiDZMsBSftN|4@iHm-H&VY#jpXWkg(hCSLaTh5=+5~j zGV#7j+2^j(BhO|EJ=;u;9@i-R%r$!Iex349Ung_-7P?p8LZ!GtW9n~^4Q`TL{Y`pH zx2W~hExJLs>E@~1#NWPB=czlSg1h8Yf0tr#kJi`Uqx-l|MyKynl6xyPoNgs^k2Wek z(?-8M9#GQR2lUR9=Mv7f(=V@wwD|l(GVystr!PFB*rAU}x#2OL^nF4pm!6QF|5N&S z`6(R=ct-hGo>6Gfb27X7oc;#Cptj~0bSm^ERbGEdOTs%S_eKXL4tqthw_efM5w9ug z4rk;W8guUrO^A9+Q(E6r@|bs&_uw6sjD1g=AHJu(<3G^(#~-M5;z#=Y^drf~ej?Ks zpNQfxM z)UU9c7W9z9KTj#7%$35+b5e+uk;VmYX*kT2#)b>h=qcL+lZW;|spay{|H zw!Cq%V{~{bd>Slgt6Mn$ysQNnzGB@A4sgvLusi0-Y7E?;HL zS)dHL24yUeRe{t{6(rA7!Nc<^@RCtQg_kOR7O2AitSVMYtKqi08q{X1!KYpg$^X=_ zhN!gXLshXI4KoicLn)o|N3nvn_ki1(9 zM(?$7VPIcG$M?mzn!cFR(HA|~ib}`{aJ8-qVl2BkG4)*8R~uxj*!(`t$$u`(wGGAZ%-Oy^)F*Mx|rZ%iU|Vun&84a6AZR8#fnL$cv)czyN9Nj zs%M5Zk!Coy!VFiN&2U?O0Im-mfKvqnu=&&gB>x%!S7&p4o@tIvwdN3Bo1@9h0-+Nu zaAAW5Z0}lNfx0Db23taXp(Q-eTVhhTB{C&en4M;YjJ;Nferp9Xw}!$*Ycy`KM%Eo` z7^n@zp1^@{oIemdP7j3Y?}3==WP|;QHh8z)2HMYUFr>dN+(+4ht+2(wCR@nM+MyM8 zSf6Q!fCF}T`_2wI=JxnE-X2No>~Z6UJTS~>9dPYx*G z;DDL89N?fd7*Bi#V|LzPs2mxLl8=M&+hPbtP8fo%YlqAo z5WYSjo(lpl`T%NKfd6h_`cv*1`nn@4z#TDp?r`1jjvp`FQKjnv3iiOc*&c8_=z(P& z9=NCH38fHE*v#>S>p@T0cX&cwkLQ?zys$o>`-uHsxc=M=!P?$9=6C|t^iVrk1z-00zp?jgR=p5zO?)xPN6 z;ETuKeX-Tj58+XMc)idM(~kS$-Wxv*()UMlpg%Te`{U3~PMbd}6ap|y2!Qjn06bnF zfYinSbp8y$XsbZfjta!<1%dor2g2xOAoR3?@Xsp=Iw!$M&`ClnKRhhlzPC|33k z!y>0JOp6YKYxn z__}%|?$wV()vJ*htu_ij+(scUdKBI*8U?QdqfpQ`3fp@|;n=_^>>Cz^<=Igfy)_C7 zSGbSqjKToD(OBv+8c(K-hW@hApd+K<_mKOUUSrVLW(@8}jKRFjG0-U=gVKv*@Z;SW zcx(KJ47dNVYW#m#H;?DfcK*lT$^QqP@BiVX!B_-%jz#_Cu`nnZi|GAhvGnd(RQ(x? zEym+eG;|yyr;UTcvT@jca2)LKkHeAq3Vqp{=i(>_`kZg@b<+)gNJ&T3C%p^pZ@f^4JB!t9Hf>j}RMO!Cf&ACY! z_-qoYd&EJ(Bn~4z;;?u^9BT68uzPbHHk^#Z%m;C>{~d=rx|1=JanzEkizb_!Ap_^^zBKRE@9Tc_aI_bIrhIThC&rs8nO zR4kY_74Ah-@uYGp63$HJ4s|MoUsI9aHy*nN$KzZ`JkG?&WBdGgWNwMakW=xveLo%( zy5ez5bs7fQOv5bSX{d^xh7-BdaB}T5R3Dgz%x3PWUUNs)GXYcjC*YB50x&EAMbi^d zw;%y`DiY9Emw?N+6HxIn0TcU7hk_~3uZz>6A2}U!5~ri3Xgd0A;U24QI$Uo}hwc06 zP?Vj4Tm5HXzRL_4ht0sYDKnroX9i}hn}NOiX5hi)8TkB!^K%AT)e=!_m56wcM5sn3 zq9Q2~21SXOU6zPzhZ7;!%(I3s68Y~b5w;rKZ&@edzIzguj7);vj3gW_OyacwNm#Tm z2{#&&(Cc9mOur_yh&eJ7JDO(V!4p2s zx0#SqOh%_sGOjr#V@*IZ{KqGwBPAJ0Mag)!F&Uowl2Lpi8E5V%Ulf$WKhg=Q-TBmGYXXZK=3^G!>nV+_kl*;`fJCJe5krA@ww*nx(R}(y-xa8j`-GVX(|BJl33r>;c@zInP4I&{?=2 zISZDPXCXFy7K#_l!j?6&P*pt(tB%YFdJyR*>sau(Kqn*|$LUgM*c4!r^C+;ykp zq*pq=M5Lo{bUG|&ro&=3cXvzE@nKUs4)01wLR~sk8+m=gy>ys#q+?lEI^OlnfQxzt z5{)vj+Aae-MDF$iGWat)1Nm_o2u{s_d_e{dEzLmarVQNOk%5q-88~<$1HEr%An0)h z^4@1)^DjQ19M5@b@_HlVOr+ao!b`}+Ki^E$49|q;#7s0!=fkW_{#(d|)XGc@Ez3mC zPVNGaWa7}dOdP+)=Wolz@{UZze#wMocP858v-mSN3#ukrSZSLDS+^`q_0HmT4q50P zorNKBS%{pOh4`E-BreE8%!(}dZOTIbnk+oupT&RsS@67+h1MJVZ|zxV@5q90C$Gc! z!#$%ccZX`(h|@m5m9(*>D<}jXx8zaUeb$|D|T*du}%7F35)T za-LOPpN*ES*)Xf+uJLd-HrHq4;-zdnZpp^G)@;0amW|eT**MXajb;C`5h<4gWz`%U z)5$@kaSmQuLF$1V^sURmuCqCCY|O#lmK+$}&%xZsIk?}E1JjQ=nD{LREB@x- zh)gc7E99bGouiwJ7NcAov&iM=JQs0J+*^vdc;?CLP5g5)C@dEjB6ATkHWy7XybdKk z7gb5QkV?-*SZ*##=jP(-!d(1bnu~s`bK$r#7w%hf;Zc(dm)*HAIhczc$8&MFJ{J`i zaxvjbF0@*5aq3Pk#y-eJ=M(NfJNW$Xa*@=Ti`MVF=H)M6caJ=@$#J)-l!plQJmhQV zp~4^!$BpxF$(-kO2j-z+P#%srr2Irw9A`g<0d1xP#hglQy zAUlbVo0A}GJls5*hw2k~NIA`O!RPrh8uGC1N*=6bdKa2ar4DLg-`1a)R+;ARuxU+dS zx`1bf3-b{UF<&Yb@y{e zc_1JDhjT~>W=XpMw zJLQgx+<7)|r+JC{)JE=fujE6viEjt@%Rf2qoAdGT8sGQp{1~_J8mJrmxZLE&@)q~U zxAUQShr3wL$-8`=_xQft&xdI%&w6ue+xYoBff8s^Rb^Z?g?KX zchb8#5zn}P<*ay~54#uKt8>P^thuY+&vAXj9Wh6I%ZD77clgE^-ER^6P{1kmLG=*M4z2IKtO_Ea5!j z*mZF?&bh?V_{KdtXDjD5$M!q-@|=B~PaOLn+;wxRIZrrx+74WD(5{%fje?bjt^%7C!4d1vzybv zdC2MFDE{NuJ;#|7z!}R);uLU7IaQoPoC};=oM)WRoPQjJZhl>H%sBQOf#bso9oP7bG#Q_NY(Sv} zx19H!kDO1OPR?|9`!HHy`&u z{?Ft8{~caL#*pYD1*bKa&Nzj=X3j^xZ*;cHdE>n9w5iM29;01cdltJqd%oLc-?rN> z31(8RD<)~XUS2)ORsCq7Yxw0UuH#O%ZM-!za3Z8I|NV?tZ@8vo{Oe)Gd~|xmT=p zn;KQ&wjy+g+o8D!-0pUraOGzufdc^pNx|>n%}A zRF+7M)0BLirYC7#Ya}`S++0!-YAeaPKSVODKq46s;34@m$WLOH$sEb&NAn~O9~MeJC@hf-a9bg{o3>ig>+E{T?tW#GmZGha z89i$x^GkL~bS(Bs%&s4jY%e-4*&bFeF}6G}(NMW8$?MfDiB`BNsW-YODfMZWJjr}2 z*>dN1^aufO^WMLH(JT{b{?6mKb1lnoU6J+Kpo84VUZ6P$!M^{zsYz9>xQ(IMfr zr_eBFsGxYqUyvUaESz}~CJag$E<`Gh5}azs2u&l#3wp9Kg3+ls;bCsP5aBaJ$k$93 zCcaG*eqYWMg7)SLR@Y_=y&DUJvzH2mkyqvm7h8%1wFip?mp8?N%bz8Jy83dVVc<$( zr2i`6Z2THQcG)^%z_ATN|CgJD&wa~<&4F8l0fm*q{L|Zn(^A`oTi!c`GsU&S!h3rJ zE6e@D*6f2q*Nwx1vE4DjyrfQ$`E*h^9(h{uKXX>tXMaKHtY{GAbsB}=%bSGrD%XU# zz@Qx z_(iA^z6sC2{SbZ~`YpW3_$S;dlM;=3^$H@mbriq6 za}wDq7cmKLV)0vvxO|-`=J}I2{5M4PJs#q*STE7fz(+iNd#Gr*+)tbw5+JTo3KI7; z2a9``hl*<>!^O${hKYtRhl{87Mv6YUqr?M&qs2Z3|B1dI#){LSEiP@>i;^MKXVu9Z*alBK8XkwNnUeU}EN6Y1j z*MH}WeSgjtoxA3U0i6Y6*r&Oo|Hnen>Ek?6hMzW@c32YZ@YUTg{@0`gPGEyhR+e{D#>7#!c~$#%=L(xHqd#=)-23%CiHl@+^LZ0$UrP$i$vXY~%?g){&;nKG>_UX>U~6 zxGGiFFhPxNGf-#0@2Rtkt2CJ0Fimz!Rg1l8)?y_keOXnIHgi?Dttq*};qA&K+HNfAjT_THC1H{k z0&9vB*-e45P&H!IL9F5=SVpNkJ2%aP6?l2FL;7Cqzpq|w)>UsNQ|-fK=L}^zV|>{p zXFqmU&7ZA!@6YaB4qzqQ0@=~IK`e4&Fq?u9_O4$jd+{ffg*^ykb|=Ew?2Qr3CwCaj z9XFg=x{qK!CXwup%t+SSF_MK}8O0=fqS)${quHd4F|2y*e{77`SXN*)jv1(qXO`c` zv+9Qv*xHK|+3(%atYu9M)14E`ZpBYxQX}G6878y6)>GJ!zEhc1k9fB1Lp+<>HjN#; zl)z>lp3cfEXE2YIiEMa561z8ZCTpIU%$y@qn2J{_i*ih3ea&YvFP(JuR6c`!`J2Jg zK4-EiFS1zE{cN_SIfuPEm&?kJ<+00q@|nZ1+3ZO3Y?c-MAk$7fZr7^yAHYta@qT5~I_-n^9!w5nt;4^*;yRK=tktJwGv+gR7* zZR|`!H9P;Kn*A%RVKdaWGtJH0*=Oq=Oy=kg7UHv$HQ(6D=1theW`5YkR^`;P5AwTN z-n!k)%W@CHkv%MV=w8-(doRnFw2uXM?PH_n?PqJX4ltE%2Uwl+LAJT!AUizj5R-Xx zh%L-M%)FG2u)$?V*eHji?7+FB%scWJQ+R!h$>khpZYp)Gd`lf;&L@~^;|ZoS?j#%0 zd6He4e~KmP*Rznl^=zWgX||*FG_y!L!&-ZtWoI{>Wse=svB8(lvE$>;v-Ga>Y)bJ3 zw$$_@dwcvM%ZX@Uo^Ki$E4aiG^e*#rf0@MxHZr&8jZDbB!czJ+vB!Iw*c|_>Eb`e^ zHZixEm1$pN8vC!Yx}fW9O~-XsQ_#ZR_q)L+AG^V{M%-jSKHX%>CAV0V)opg~!fjR@ zeTSuV-(gEP-er&6?y;D=_n3a#eI}>T%FOq*vaHZH*5gAPJ6ZgI)edZD*BjfJMf^jy zzt1C?t!%c*X*hp0ldm&zWP`3)c1d1$(pdCDU;3 zU^DJ@u)kTaSbe|O?BMCwtUcxp@9XfEHSBoHibCG8+|GBba`k)GE&0HTAAMj!g&!HL zKCwy7pV-Ni&&*%9lgZV0vhT59n4ZE{mbC9H`!TYM9r)M9%B#My(?Q>v`q%Gl&4wQ= z*y|^AdHa(^to+5wgx}2Y`ES-z{D&QK`pd37{L3_o{;?8=Zsyk3&5AvxsC11K9eO84 zA3UVVV~sS`zLO>g&mPpgrUw9?a6wJg=5Q*X5BoKIhRT;7+o{`94ZBem(merR#Qg8I5Jp2AsR?IVKultjQ zuOXFG8uGe4BPt(nL_sHwNLAmM-eee4+Z|(i?r1_iSDKLIvk5H-HKn(;rZid6jDE(O z(H36#6m2_mq2*TO zEM-kYCRmf-X=_S08b}9b48s^@L#gP9#Yoo7eyU)qt9 zpFMeRx2NUugQ#oTAewP?5dE`rpsmXsXndywISe06x`zjow$2b5m^Fk(JQzZy6WyESM2VN2$Y7u|Jt}dgqo16qdYB9CJnTXjbX}<{$CZS~uC&_AjpVA`s6<{u zRx>2j)*_)TP6Fkv6DaAgKp7K7T6ICB1}jD?OBnI;TY4DDVq!UHy~r)Yi*B}i(OfTY^4;!D#wtFflIBC|Z9Zh} zF_cDD52bZVzVs=@m&UaEQk%OUC06^9uChPfP4%bkZT_^(Gk}V>2hb+fKsu8iNWUKj zlK;>k+F2V!CR)K%n-fey&x1)SD1-P+B!Nl-9our31sl=t*4|nV5xBMsYYj z`5I2+$41cS3lX%&ZWx8H8AgUu!%2GTaQfadoTP*i)W32Bg(^kTs#%fr;ZY=w@gGTT z`$tle!6?$1KZ})>YCLsHO(2DY3FLBj0;PLSq{iBbWUm`dHHFdS_$iuh zjESMbh8Xf65=%y9v813diF&6`BAsWGNC=IinRRh=++s3ml}@I)Qd6ks^eMFF{uEv} zJC(ZjPo>j_@wBNpo=Sek)3Uf}RCRM2HMu8{?Cu1L(4S6wi>8zDx9LQbm|Z}#j}?$^X93k&&!xDSxummkF5SE}msTqk zQuNS5a>_3xwWEd9^{J4aTFs+7(evo$hIw@F);xNlG@pJAoln}cc|P&je2VX!Pvrv_ zPgIr8c;+F=N8fT6GfEpt%zRRFQmk&3+d06g|z&^LbB_-h;D{1 zqWp!6$no4F`t)ZJ9duqyvy&Fn@EwcE{`q23?_W%RNAgVLa$ZM$h36Z4l~5N-NH(j4 z3=fv@Ldz1GY`KJ1M=znP8<&vc-6a&Ewv@^Omr~cfr4)X8DINN?l#HF0(aOYSq`YGp zEq%U>bPbo&_Ne9LQM#NSH!r98eO8d8_X>KQw}PsUt)Qu2`FH!3Bpbhy9#yWS`bR6N zTCbE=k0_J0Gp44|;3J zHF6CtTE2#!HmxC#-fOAaYb|Ny^S+74*OK(NwN&7+j^wAWqjfdw_&%?rD~9W7#+db_ zvt~VAy0M<}l{XLz*g!qzZ=kDZHqhq38z|jvBaKMgNW#92Wbu9@=~`_f^+}wHO{CMl ziOh62lgo(B6t;XbC0*T2tNWDk=SUfSn^Q*ir^+btR~bLnW9dyoYCmBZX zr2Mj-^zy+@3fJ33XGiWLw^h67(2ZT>tXfMagKNouaV@o8s->B-yGhA=H}5&Mn?}^{ zCaJ%>`8xK{a_e)5Ci@MWhWS!&5UOK(n|CE34c$y_`~ z0omth=J9j1>E}6Way?J~($ACQk@Ga;+j-jQbb;QbULc2q7bx?~1v)?YB55RFq_}+- z>BOgtq&294k`o)~#_k4k{?I_1Y%h`A^h=bs>k_?udx=I5yi6_emnmq+WomqVnF6gE z>H3sL8dcLsPdgeZ$>Iu0Pv#ldZCA+ll{sv7cyFnq3Zjg)NO)?&TlT^xXQuo7~^tt~ndO7YEwQs&f zcOTxOoBeN7%edQgWAkmg{qQ!m^}j<;$K9cKoA1z%hj&QM@Gj|$zf0C-cL|T~(n!O5 zy#K;IT3mLIwm-T@mkjUIoALKax%@s2d3>M77`4*839YoZypL+dV(D(sqM?av5Ee~kP(+AXK(oTvo?G&=LomM<+r@N*PsbB0vimQA`d!Ij~KW2}} zf6^mbTlI)uy?8_t^T)I#?lC>v_L$r{9@BD*C-i3W6Y{BfLKUx`P`Bk%8aMSRo!b7C zjNUw@xz@bzLi{rd+WCwQynROcHqWUr;W>TS^_)h(e@+dyFUWDm3);H-1!;VILG$ci z()Yxd6u!iA(P71i(N%#7Ep}2rA^mWk}ntSC7sVRP?vY@YI zSMrrkT>VM`%3X9Xq>JK~cG1^sT{K7a8>xhUqm9eIk=2cFbXfg6c@6tc*H(U~F}J=` zhvpAT8S#Vut@=SlcYctD_D|Y0@+Xxsr6J<+Kn16?;6AW8<4GG(xEoeXM^$>92Z8GQLE z15LeNaFq1I@X@`HlGO{#*Y`s0@m^?b?S&V=dZAlS7CHj&9Xdu9e%Z1Zw?P)Eb+RaG zlf{PLve>OJhk8K{*T=}=QMMf3Z;->UIyuNakmI$kaxgIHjR9hB*!JF3Inf6W5Bk9BPahZ?$U|F{hvI+o=+2f$ z=LUH^tCPpgHhG-+Ezj4lfc1g`&m}5gMz#VXHz+`?Q-E=s0($*cK!=_pE=d$oGg=Yz zvlJ1%UJ-O$5!$Va+)FB=L01VI-IS0Nr3BARC1|Wu!n31F*n3Y2xj&TPr=tutS7qEA zsf@C8WyGvehWQa?yt<=|>Tk-J)K>*2&MIghp@P+EDhOGn0+~Z9IC@J3@n2P-uc?a0 zA*#q2rV6tZRWz?q#jO3RFu0+LGoMuvtEL872Q^fMslh8r4Ud+pA#)GUYF|@B^#?VG z%IavgRmb>Xb$m!rM|QC~h{7+R=_{aZDme@+u~pK9W@v=)MlwXoY=3rZ8T5TDPp-J7*w zcuEUt?OJI3qlJD3eKB3=ixZ>!qIXtbM6BzJbw~U1TPyE5_`NS;`)cz(sM>fmTpN0+ z+K5=GjiUY9sB7VQ@K4$>P}PCIy$(`Bbg*H%4$c(o;Q3A+$X?Nb*&7{r^x-{HEOn9M ztBayIU2K@Ai=CCaICf4K7oO^(Sy~Ubjr4FIdT1M`ht^!)+i;^EZq(`V>r@Z*KlQL* zM;}{U^sy{bAK7X8h%MFU8EAdj-Oz{1XMMa^F~DUz18fO4KxTpgf)^XWaEAfjUoyb4 z4g-Fi`XOLIKPY?m!?oysSTcuyFYm|u+x5fo_I{Z0rymUU`{Sxxe`Jp850mu%xU{N2 zrXB1L#hd-H<8y!bs2ZZ(&JfALhUk@Gh|)!dFy3y6oehQ<{L&DIWsKlzYJ|fcMi@N7 z2s`qOV6@2yE9;EVv(*SmKa9}Y*BBm7#;6)*4B2F3#4a;N{cdAuUo}R;TVtH+V*({h z6GRO)!IoGPyecrkzzP#gt2aS)y9u8BHi3?wDFR(hksWD@np9KVTw#izdri^rnkneL zDaI(6VV0E{N_@>wG06=3=9;0t!VH(|&2YV)_k;Y+bMCqWaKmK)nnn!3xs(AovU~u~ z-48(N)d9$RI{=gVn8VM)9F{)jkclxz`)qR@*ldpZC(JRT)f~n@%<)>wg7;3hKvK8` z>=G^Ty4V8cJ1j8#k_BX5T3~-qON=qLgfuKs`JW}cvMljvjU_S;S@L6QiOruZF;LkG zhX-0g^tZz4I4hvg3Uw7$aICk&_6Jtb`(=e9ZEJKoS|cjLn%5}s?0kte(sx+ndV@90 zURWco$3UDl90)}=5D}vXqBMOVZk7&&^8SJFxi%0P?*{VT?KZe&Zi7EwHZY!O1J67g zjNf3x@1-_aa@z)Foi?advBgmvTb%N@#hEx;)X%lW@p4=2J86rmR$G*Qx5aEtJ4|-4 zLtqH+jXcc`az%D{Txo}cXY5e;&<^3h?VzV)kB5%-C=0j8e>3c%wb&kw)%M6fZx72S z_GtNQk6C(ypzSgU2Zs&fy=MmDY4ISWY##)vi-WN6=^!X~55f|C2Pn8Ypm4YYek3_y zYKa5xY3xkpPWH5I8=zy6?h*T0j15nhtX>RCNd(P_7}0qO~mlwB6=l?*uPN3m`V}g zMYwzw(WJ~U){5bk7enGWhR+!cGgdNm)G~~@#QPpSWf=08VXZddrvqVl5HH<~Bm9|7 z@ZUgKeu&pETq9__Aq4Tq`|SR}URR(k0+5;x7%u==1u(o0h`SA>d<3%lxFg@x9l6XM zvqrijex^G{FLvjB{oP?*?+*FDn$ z*y%qM3DHAgnLQK_SMr*QT|*&U7>cLuLoxT;P#CKC;;@A;eBFI2mAaVG$p9|F+aD-Z?!0^#5kh}NJ$ z@hLQzPa6!%3&z-0!I-rx7z@t@V@+!?%0CBVYwr-08-`$wa|jj&hhSE02*zfIfL4S+ zcY6pv)`#Hqoe(T~AA(SsP^jpK;<7_1a{WRvaC|6krG@e=W+=3_hGN&TP~dtfuDlFI z#NSZd)CfbUbr>$Vhw)5q7|N!HL8dSaG3&!{a&H(^8^SQIJq*=f!tlCJILwX0G1fU8 zOM}8u7ah)P*uo*bG#mz1;TTjG4)>OD_;-XO_-{A@H6q|;6#*wiz+^-O`b>+!o7oY# z`2W~DANacF^N-)OX&XcY9YGvH5TpcUL9QnVf*>?)(>Ax#Hf_^3ZPPYQ)BI}?lode{ znoZDIO-!~0L2W_MQ4_>u6BcBI6-7o(&F}Nv=lQ1TS3PuE{Po^HEqJl*;5c&ct5 zPq+MaJYD_icv?Js0!@yZKuKdJP}Ery=+g-k=nwNI(8`Jlc+W6__W1P#YW~9nDtvtc z9o{v8UfMc=^7fucqmGc@jNx{v>+PH;L9Pnnc%JJ&EStIf+sqnnZ^_J&C?-okUGtljz#5ljyw2 z$uul>GClUw$u#T2$+Xwylj(PhC(|X@Or{U+oJ`9enoPr=o=huSC)22|$#liHlc_sm z3Qa!@&oDcA3LSg?6uLHR3biksLh)Bkp~Bmz&=U_}@67rsbbJe*arXWcy5XxS^!wei zs5Lr^K0Q8*hMk>7krS|oW=<9zSeixq-;_mr-kU|=HDpoO3t6=BZ&~!%D>%5`#j*IhoAJ(xqtT2n;kxy_N9+L7%`P* zMop!6j+siAdZ*GKE}2TP)2Gta1yiZxnyGa1ol~ju!Kw7}Q&TCjWh!0t9>U#I>5-9_ zQ%BV0G~(FHDb{;Ac`vz~(x+Wcz9pB_%&W0i=Z?#1+5?xG{#wbjOj|G(9n!;x5Rh52s{P?fh)YSdoqIt!LA^d$Z~MhHU!BbJ)}KW;X5q zQ8wNB?`+yHd>XAjcpB|-{4^>{oXd z)=WAtZzi2wI+LPT&7}XVnMr?ra3=b8CieBtq|~=&Quse-(u@C|NmuSZi^d)}i#m>; zMc14ssn@SJG^S={j(}?8Rlzho-Dx5l-?w>!KT1sbA_s?e2K5J&vF~6Qo-p6Ot z`5R_a`kSy1X48fLLj2HNI)2|=iaIQpzD>x*`=MN_zc`n!^x<0~dAT&YB$ryR%cUEu zbLp&K<aq1jeao!yIWc(Z& zpEHLZTRewGUonT~-ZY1v{P`RjSvQ9+d}0p$Y{MLC{>vQN(m98Y{BjOm95R>k_nJ#L z96XoqJ9aKLoI02Oc-~xU9uJ!_m!4WQmwvlqF5P{@T)KA6T$=m9TsrqLJeTjex%BC4 zbLokWxwPWbxkOv%(l@)!qlfmNhu^iBN1-QSPgL?eO1XF*y)|VX&7U)mzA2nXD=O#F z_cza@;=6ITscs%kePSNH@WMPg=8bu@^1XS~@!33FFU_Nh-Sg=A{qrd7h&(#`#5`I~ zdGtV99=$#(kG9Opqx}o=DB+4cO1UwQE?bjFlh@@@)+2c|>6tuAe(er8X(eo+kl=IZ?{m+m*E-n*Ir*pGycAiKKpnfE&XaCeHD^Vi}%c@52Nxa zGd7=|JwBh}PS2<7&dsOyFU_Y!Up}qO#a^!^_}!Eh`84tRe7gCze0r`nAJ1XUC+o3% zI_sHyn)Y%&m9*v4P4DN^&p*wlUwxBL4~8zH2liS-_a2CSU`H&X%7jI@zp#idJ$Dfu zf9WC$%UVQl&BDI0Mc6M^x`b`f>oyoesESwz{tT7>s)i|DcSi)hLV*faL(BD$r0 z5gqa2BKrO3izsR9B5E4Bn9kUHF+FzBVmkK7#dKG~Vj6z>Vw!!zpOD zW(kg!Eun+1T|%!{Eum}fT0&#jBJD#BD}vSxYH& zA@;c~!}BLAmQu)dOR4r|?1{T;DZP5{QkwqYQu^%oOQ~@EQu?MDd>P?4meP!OmeOk< zEG6$}OX=RPm(p-gAzdC;NRLJqQrH27*fWLS9yq#?-any`4m+)ovd$``TP`T1XD`F= zT}>{e{bm%>sq+wTNg?Hz6jJ3?g|zx-h4hPCv43t2o^yF$A>H?2A+7m+A>H_7A(cH_ zNV8umq_o!yY0O)NwA=gGi}!IM{qBoGs`z&yT`+7JMeM$e{=D}xy6%8wlziwi`XX)_ z)g~;X)Wl`<2`!^l=V6cCCClg!6PD2>QVIR#qT0qwG8j2meIyr zmeHwqVc*?7%V^{Sh*OW>33_Z9?f*x_dmel9US3Auw=ScU_GMK0{xbUG$II|M|7CRa zH_K?Er--f?RYdnk6w&iPDWdnIi|F5n7vWi=MHGEv5gm1E5sgX4b2!f{qWFu8D0X}i z9gtN-yUi$~?m0#DR(=uvVObH?lowIq)!47Ms)!E0wTM2xvk1>%EW-OT?Em{s5q;56 zL=QY!L|M<^cN_kM{eG_$(UiXw(bo1Ny6gQSJR7%&Uf5hjnO_%C=XXVv7rLA_@4lQC z?!BBo-hVkwvzF8AvDn{t>~g9*VL9!SxSR^kSWd5|ET>~GTuv)4T}~|%m(#&hm($Fg z<#-k>(&ghhq05$&uMB(su3An{U$>k#-L#zcy?r^IQiErQ-n*Rg*Da@OezTnJY*vGy}STTJzs+gYJ zvzTt*x0rGcD5f!o6w{Zn#nf<2F)d0crejYjrjFB#>6SB#iOwsgkJ5_i#>?@|(Gm7cE++wo$!4_AWM7t^|%u-EXmV%#Ige#E=65Am19^y;sR zX>2|AD?WnqpD3ntn~LeK=Zfj$7mMkX7VKwyqnMugTQTLkT_BSVEUQ zg)*Klp|a;oDB`6OTJs9_K(?09uiHv!%-bbY_b$?XP(pWqTtfSPRzj6uqRwAq|K!#Z zde(#A>ljf=SMP@BtnOJ#r|nZpRr}%p1MyoPhm=yu;idHKQKd90zLZiEO6i)hrFidI zN?#|H(lKY2(&TeW>Du$L&+(#C`pc!I^v(EEikghQk5fzOqUohHeHQja&c*)61*LT3 z;!?W3u$0ymV-ICHcqPKu;P~~WbmfhRcMIa*j&ye+{V$Nuy~yvErS#?lrS!Xpu;22x zr8M=CQab+eQu=OvDZS8y-#=_FrEwcdY4k=sANG|}y5V&^8}`jo`uE>T>A`nUzxPUM z#0RDH&_|_o*(Z38>}KrY>@KC_wjlktrR4j*6xZlwv|=Ql9lJaBQSMnr2kl)(zZhLc zR#X|SISBhC4=JNnhheYfk!85PD5H+}GP*FKjDCMo8AbiHjEYYyqrZB~=#(?DUor*H zoIS6M5-%*H>n<*XPs;GSZDo|3Sw;^{DWlJ(;yJX_%V_S*GP*Ap>E@MD_(D8~b}^1E zEu-6t%IK+*GJ3DPj6$z0qu8slk8@=i)-3GHys?a~z8U*NSC`S+JIbj3F6Yt>?Lh3qkUc|qtE|T zMt|N|hG!d>QN?RzH2#e;I;yRVzW!SoHNRa(H+JCI`(=^r~e#QPFEj+{h)DpzV0#Q6g~#&kH>GmoQUVE)Di27co*8T&WSE~hKbDW?z4E2q>8%4uC%IgPjkdp9pFr^m;Y(_RzGX+|cV z(K{LW_^=oB@^V@;4RxD=-;LJ>TTbU+S5CP!+KGxpZDz-O;v zkM8U6!yDKK`(`0e#t^y`nyY3e5U z>r?!8-DmL2=h(OVWjQ_FjW&K&P7zzm>383hQ^vR0OS=_i{->Od^I)%G2=?<0$9}d@ zJok1a_Hc$_zw2%*=!`wE7c(4tO(U>BZZA9+cW>;6+Xs93Mq@ABPgc;9{jqN^3eWUC z5c}m0!f)^#jD3U_p3NJxf}S}P&pSSR1+9(6{>UR&(2Aq5cQX!q5s$&MkB`N3jmKb5 z;&Iq(cl-)E_XO+-JP~_Y$6~MG$#|aeDR|CsBAyL=DxQIS8uk+=;kXxj`p&>UJ3{<3 zSJ2I8p{%p9&+wcTH0xaKPdyL&T2rw{@&fD+yb#agO~XFWi&oGfm#m=7bUdT?QtW@d z4Ey!QVPEHX?5muBy^j-DP-7;oIEqn*N@0SSQk9>Xw9d_F~#D4($ZGVm5Erl(85c$=uptoUF z53QiHeuMD?yZ2%EpdNc9VGsNkdx?LCJ(93r{T}HXP*+&ZBk;?kCuskqFmV0_3+nI*#8Oh{sH|0oAXEH536dzUf8Gcd}dh6Gx(h)*z{+yw-Z*< zjJiIDF$Fv5dE^N@_66)8g(Ysleq-2~f5P~Io%hgef!>tLV3PU*rPbJ(-6u#fP}a99)&)E8bJPV^2Kx={9azK{@F6S@b{A{|>|e0MzC?Oh3G9B@tFW!GBfBw< zVas9n!d`-X2|MUt80)Y(u$y3yz}|v+zQSH`*!i&eu$y5Gus31vOb;E{#hjRw(P}uRXGhk`3NwC?l0@#(Xn_z2T>tK(- zo`$^)`zx#ywi)&)x@!Kz{Rz#f48 z7WO#oY1p4&EwDD&-(erXK7n<^zJ(3@9zK9Yz)u~1G^q}BkX3_ZLn(C8ra>idttwXt%E%X`wgrf z_Iuc)utwOEu%}>6uxDV+u;*cag1rQL8TJb7RoH8=R@h%)ZLq(>-h#Em-hurc_Acx_ z*!!@5z&?O|2(*wngn5knP{S z>|6YAY%BgZ_8tE3ZT~^IFZ&+H`(rJ?7;>nzopL^UTi)Y8= z&6z&Ie<Q7U;&3Pww&iJ1UGxMOJ<&za8KmAb?ld2J``z>y)Bg_X<6QJSm--jD=-ltUU-tUD zjkCd~59?hx{Vej_#Iv=^^XV+6TI|I9(Vg#jK=Wy?rT_4?B#Q%1`^sI}$+tWw9WRs6A zp1nM~|Lo;;ntV(@=rxKxpPv5G`1X9dO~2dfV~^Lf?%B$-kH7VyT2Qvb_*=6_4Y$o+ z&p6W_rCm>U(NkRX%`SS2O}Dqd$B(x5+v8Oa(~NBK?Co(o&)3@OV^41%kM@3O9-$dH zT?aYz!zx?3_IX=m)|cMnrPsW*$FDH?^)r6a0OL0sfA=&0bTi%^)_1!f)BEX1`#9)X zk8IFo7v)Z_N+e0#iP6R)?Qam*fXtnsfco_+k<$G<%vr}FIME3vQg0*uE-6Th$X zBidunKiiBi`*=}**!v+dRE56!VMOX~BhHt1Aog<7Tnr^<{=mvuG?)!{0c@s?uR zV;^tk{SmJVBU1MqalVW+d%tyS^9<~Inh})te$6+!ZC=>($u{vE@~JhtEg!p|qRfQJ zir75dyqD+k(Yw9K%U*t@$zN&Lb6oVE^M%H<*Q>?6@y?3K4^XZDs#lV&T>Cg`G2_oZ zUb($UYi|elPw$t#zmmi zvU-@ke^O1m`Bm|2G%{BJL()0E@lH+#A^;}4f~JYKk|X8vz6w4zl}kUTn|9ga+50cX#8cYK%Qd>~JY@Grr5OkP^hXNv3Ytq15CGy7cqVfFkPhID@fN@`_}AMW9|#u{oAvS z+s09U3?h&c3c`KK6F@ zTxYqo)1I!tjAxg0cK@&Ht35bo_lw(gC$A6wmu>yA`ydvbk+%1Ui}v|1zoz%I{`Pivo9lwU)}LP26ZY}YW#)q! zHxBJL-EG`p@28&oJpJsaD04n?s;{08?DcgTzxMv9+)ryd$n$0bcQU^QIG!>jRnK30 z{nnfF%mBwr8gk?+nQ>PaqeT=AXxxpsc;6A1j7Cy>KgODMr?2Zi#E*sbE&Ac)5RqxB%+gES;(W!k7^DD>HJ5|S%hVA+Hd|*Am{Cmz*F8R0q z!0Wy|Gad(6ul}|>+HD*=T*pS4_1UFfc0YH9Y6rNavyZD9(~rH!--y%^BhHrw*vA!@ z>wnq$#h!1AX@`BhYI1x1n~lHvT2FetpRH z_VTs<_I%S!yLzu%IA(8GgUPqAb)}E^6)y4Z^~i9jhrOR7O+2N&o@9Uh z?uXtFjx#r~23THyugC25j5YJ1ule2Uy5WbWv-c;5d%xUtd%02ltgk)atlovy{G5MN#qhb5F%rNch=eTU>=elHXN0>R!y0pXYpK#L-r9I!;e%8k= z-@)nwu9w66VYl|i^>aMf`?=?HW&8T5*KH~AZz#-MXC|2I?d*t(5c9#n9V4nox_qy| zUT)9lHhs-=lxO$5+xetO$AN);+;27G**5O&<#4**FMI#>yf1V4eAQn5w(Gx$gx+qm z=O4GfmhLhi?CG*h{|~TUZ9RV3zFzkJ>bV}yh)C~U|2s$B6~-TP*y~eg?!yhR9X8T7WA9lV-j|nzsApr7f3wgzrJ(Xb&nc9*jwo2H#6RXezSW_!cKlOey%=E;u-(- zoy)F!)cC>PLMOkO@fP%(-D47V@~1f-ceune{_8uJUH7QdRjcujz2#=S1^s6CjD(&1 zW{xKxBJqs>`p#w7J^Dk(ThMQPj|r#iUNhdz`>W(Voz5VA=ew&MHGZ(S$H{MIeGB@{ z?lB2F`O|*f%-6ni*>#Wp(DluDB2znssf$crev%dEHv%TKmkV(#;We?_M z@-bhF`Js84d=B`b8E86_Px27u<1rcj!2C?|pr8A8pz+U+)?emp_kGve{itczjy9fm z)piBPPv2wGjKiVw&#pRt%-2Z!_M-dIq4x7o^;d;^)dR*b?TQH)%Uv}2RJcbC7{lbV zPrz92qRHn(_oxA5n0zV%#&Q=;KD%nWg7d5IF<|;Vrf<35M@>Ez{Z7$$M3c|1Iu3W$ zb_L(31Rl@HearnmYUYJ~pHsgx(1<3Vp;`}zs^60b+7MfO)2<5J@qq?SJ~0DLXp3+1 zsjwX%Xwc*nGth*#_$HqU+wp-0O+LHoI<~8}E4Xg-J<`p19;$f}(|0lbKDw*dXIGtH zyK1|J>N+90-!q`^h-O|4RX!Dc7t`;fram$KPSJNnlTSt8a=(w7e0J4wxU03xd|xA` z-#si52b*r7*8#!u`tBg(m!Lnl_mA;Q%=U*}Lnd9&pWD02_+@AD=cU_Mf50Kr-ofTG z;DUn*f*#m~JTO%AXsGfr?<4N9eIdbIw|YF09rE4Z$ZYNgQ?9*B%=cIp*&=MqCt_p%;OI1^)dByZdak^Q<%+ZP5tfp znB&WB!nXQkY*!yst}S{`{twuMZTb8{^U28OC~o=KhEK2C&;9FnlfUEmsXgdj|2VAu z)?XjD@#EO8ioa^RZthpR2HWq!`6cUy>0cg8y9&lP`0;l?Kb*SA95CIKO&(K>j!LeX#EzO+GpQT}1H6 zPUL~1>c<^zy)~bMIDRha>EGv@#y|G=U)#>t!OyjMxbJG8Yny)G)vk+7yMpWXPP9n( zQPrX9$Kbl%zw6|oTK@-o-DS>e&h`2K{e2`eFC5qHu8Hz~w&VM3o>s=6_9vc5vP9Jqflg zFFW_T{ci6@;s2g?U9&{i?ezVoaTK?8+xh*`zqVVq-PYUSx^3%_|EIyBTDQ%(b$;I+ zx!v`EDcA0Hlh2NJU)p)zEMpoAWvuJdg0eaQ08|Ji`8QT;GD{5q6KWe}d-`zkh;%ejE=3 z&m;Z2{}X&a()ai@<7cqXZ7}%+&m)2T>^KgielG7LqP+h1BTny&ji2Xid*k3QuqRlh z&&SaBBTo64_`&xhefQV@x1(lU1>cYK-Sfsjj`PtpzRCRvu}q6{TbLV!ST7h ze}eO9dw-Zva2^>?Y)|8ton;=`-*;}`nqX*0_kbC1gY8F?kNF(yhql|?=lIf=fw|Ao z-{;r5=aZ~b)J8JvtZ2O*<$M{+9?>gmU>f_w+w`qOk`?+rZan2`eyLSEHd{&+$ z@6T4s_YR!$G5&FUKi#C?JMi4;_p|YX&7D2|bj-(7v|YbDG=f9wG>t_FJ^`5#w1Se(rRL)DKapWyX?&A}Qp>$CHDDtJA>u5$KI@Ops# z6TBW^F9csZng`7KAG{ve(RyZJ^%<&uH2DOt2m1DZ@OmIJn>`b}KOp0y=lyT+{(#>h z!TSR;E_T+xX8ljzSsM_nx8DOp)sH5h9qoF+`F{Ao?yEb$Z#DPBgP%L}o>D#MJ5TU) z2lk8O_({{}ouv7uaXd4R`2XH7*XzlC-d8vM;&`7Sczxn`d+_?C_vqXC{x|a|dFQKo zu*SVSFjW0$@(Es_^m1;me_hWn{rsI__k4n%gRt8juLnFk*ykX@>l6Ph34Xt#*J2U; zchDX%=cD97=M>D~$MnEZ^`prrczx1$Z@OPs1i!b*p8J3Iz0KhDiGRWbuTT13H-blh zm`1g4ZW~cW3bWBzS$&dt?N!PsAH$-3VTv^d23-{|D;>c zn^7?RkLrP;>c^oz{|3L;+V`+9ejY0SIOh}mUMu&2g`MZ-}QXGa@=;$Wpdh2YWihI+1Fs| zV}1wJ-tJ&{=kUN#^`jZ*j`L-J->-JQE)DK$H~{&CJHc>N#H&vUD{TmPNbZ8I+% z{k)T||2xO(wyl~Uv_kVn)e&YeK#X`bSLq^Q1zqvUcjZccAN3s-{(*dbv}dreQ;Bs!RBN9?ChWP z?Vd+$%C)((=Y9T;@_DMMr=x#jej?YYG5^Zuwm4m<8vi)9tKxO_Pq9BAQ!eM(`{kOC zCv!l4PVSv~@c*6817QMgOfWnc514V4JeW+7){I-n zao*3*zlS=X!M?9F^%-nF#?Q|F*}1RZ9NX1Fvc7eEpUp$e_>=$d{WAV}xA#H(-*X+< z^tRqNyE&VqxaBk0--|c(N#??WubtKdL)DLFyg82Z;QHntBhLQWxz{(x>#nYeJN5dO zv(wJ(V8z)3W_=rMKL*#g|LyzJ!LF0;{Z**fONH6J#|i)6`(?(@^4tPxm|sJa6SX9PjKC~_f#;vBY42fyPQE*#>^w<^(6SY3A@{)K91Mz+55=)U(uKyC?E6w4Bl@M>B4n*OP%=Z|`X9p(^}4{TF^`ye;t=K!0q zZ9PfYZas1Po`Yk3Dq4P&`y}r=wJZAzt^Q%o%4GeI@=oJqZuOb7tpfg1dV*C4ZFe4Vs*i~uJdgD1r2ohNn(>)4NFSJS>p0E_ z_<3URJkocEnErCSE*;?Yt>d~KJdgN0;9XlcnDx{1Bb`Sa>$CLEo$@?lbFXXAjQ<$d znA=DA|B`O7>-hFw3x@vJ9x%^ey2o~5-m~uPw|%PZV`N6*Z0UY>zr-)^!og} zfA8yDujlIbmGe#gzSFoSrd)fi%yGx_){k@^4X%^+p4z#>W?T)nAA{>{|GozkTyOiH zA7&g5cD*(EIKCfS>Dz9-HS4pzRwkd|dTaMgFgzF!m~l1O_127A=j*`8?e43Za_x0D z`2_D1**zm+^Wm~rmhu7TZea=b48AAe3_{NvcJ;C-2$ zWeV?-^)&M?XOOLP9p?kQ5AHZ$2AI!a*Co@g!RBN9?A)$_t#59#sg+O+0oYR9c`U-d|&O!-|oJZ)BEZjb)DQ%u5ZmabgWPC z`=tJ9?sy*AMZX7R#zo8k7rDWv8|->G!0HC053vV=pYH}g-|ao5%>7+Y@V<@TEkm`x zA-GQV9%Vb<|G{-KxK8#SwLjK6X|C5Cum5+_@4@u;ZD0Qzf5-GC1~~RZ(-}V}2go}p z?f4#Wzn?I$@6$Nnza3aUgS~HK+BMjG%s6*$*TC+RJFZK?>q-A)30_a`_-n@hqK0Pv zI?ua-ttUg3&tTUR)2_khGt}#nvw!-xzL|D8=M((=j_1w0w#j3zzdSqX=XbW|3^>s=w`_D~}LH`CyALpXy`I9@B zU*Mw0y6A4>Yq06{zLcZ?-1P84*59ptZn|6fgVl3n<#O~-2FAyz0P8~~{DUZxi}-50 zztJxKTji3z*(H5A7T-YYS12kMsD3)X9qaGr-%O+owEnxLPjzWuii_^%-_b7VdHo9H zpJW%^t$m#?>DB*^c&u_dO{ab{|6KMWaAaNkQ$VG2P$$`?R!+C+$w{(~G z@%# zQc-xI`h~%>f&A0ylD-Y~50w8F^k1OyUjseR{L8`o3go|Z7yrdT$IEeiqjb_8|eI%iNc4+IM**vYVKJ7A}&9`_)gg^u%7LbepOiD^pWt-{sGG8 z`5nl=Zh9;GKS2JOsDGgI1Ewdx9R0TrVxaVVehZ}Y`6p2Q3S9J6C_j*Y+|Hl8{sl^( zik1hO-)`gIt$&)>vjNthP`rT%^pa;0VjddB{X*hr2<>=o^^xs|quFrUV!OPMAtr$Ro#$O&v4wS!}|LahAp!vPZ zrT1RR=;SM`5A@z8L0i8F72y9 z<3a+ApRxYtJGZ|Drb-F_-KW50b2^#1Fs0QGlEzu9g5Md5+QZ<6u@S?RV4p{0s*;mcI$|@Bn%#mmZ+}R2QA! zp9bomRu{bu4GegGK<5TpU*mQUoZjvH7K{7?t^aPi+xT(Qqg=|*a`Atri{6ON3FO~c zN$)s*GEl!j{oCL&zrrv+1C{T#zSp|s@0NbBI+q{l`qC}`I2Zr>?~ew!eoMgOJL)Fq z^?~o-1X`cn)}JDm@v{~EkC)^4(DCEAe)07kUhqQSFFwDHN^ovp9BzID8b4W*vt#~k zF8TBI!6E6+<=651vjFXPyMB#v8UO2C^hk&6FZTOM;hr%$%1&^B$CK6}^zyp35aAf1 zw+`i;j`(X4=6JP2Zw`1Ij(0(4=A*wjUM@V!@p6P-9>=WLL0`LvXUsVFDY4|2Y%aGc}w`$D8os}Op-G=3!pGnZQ-^m_J?@K&tzIPMJ{ zE%|QQSMyg^gY1u$$|7Zz#;;TsDGPog=@XQ($|z+6n2&nY3%z48kxoYb8!;ZaT}{dc zWhDq#j>!PIot+pr-0tuLCB8@5jR%Et`i&sRYgCp(UkZP&2GJE`N-d8k8RZuVz3UE^ z`m7at^Fhu(OSuK{I9)OZD>Ft}smxWjf?R%dj4)godZ>iE5oSL&fLy;)kjvR{n8z~~ ztOVIF6+&+l(s6jb(3^X>$5V-RL?0#jMJhv;YmXE^t^_&%jj`gl)gYHss?1b&A0zoh zjq!NU)G-Ao%J@rHMkPvpxBk@QIST1JL9YJ>4cBXUwT4SIoUP$h4aaMEw1&5wBKdWI zoL{qs>oi=c%+=%R8Xl|RXbpQb+;y_#vk~NaHfXq7!xb9N(QulE<24+vtkU)tD8o(_ zKXxI^{o1ZCbm+o#;9Y*emQR)RdPax|Q&T$$wYoQ-i=3bOw*mC+!UwlS;D@_7CO zy#nNN3Y00zt~2F$i?Ug{7W@~|6@i>@I`|dB@ygM9d_%Iwb0*fiW}&wLJOkl;p*I8M z^eM`4y>F>2FeLlee)R}&m@F9m6hNOg!7eIAm^W|9IK2`c6dc!kM?rB ztn-9vN)PBS|6E~_G83GG`JW;5rh>T$rwF~#;B17Wgx>CRJf2wyZx(txLC!Z**_9&U z4d6_~YZiKI!5oBZgx)HU(^Y~qaJ)k3Edr+_Tp;x3fzuGq6?(J5Y=pCf-Zb!Xgj0py zWN<3NNkVTZn1ph+oGt87wkmT$ba7ga(3=Ia-_t<$<7m(aJyPgxxKMEW2G`rk4J($4#S1sO?ZRHb%6`ITCsUxI4HC+zpHe--X|!L5|mgayb1)p|ANe$+s5d z<26EG8#VxNK8+yfQ=#RSYPnk{NV<(6r`sU(MT1 za??c7yM(?9ko7!}ue;(^k5fGhlZvkw#wt6qB%B0td=JR$L+2D-CzSch6lJJ#)g)XmWU?(7P#L!d*gd zWs!s{gx>s8xt{7Q@pw)}d)9({eZN{+q0CpND&v%q%Fbd**QBgb7AP~6Tb4__I%TFZ zS=ottarv#vW@S^E)UW1xkEa%Tfies9_w#k4ue?ga>#me|Ss?4HuaJISrL0hPm&-cc z^)t~oDAy|!S4n*;z!B)*#GB;($XKDb{RRoQ3B6$&4%KkmEi(S=Kpy|=guZBy^J}zuzR}0&IA?Kl1p||_z9#0I~-3j6pmewKk zX6f-XWr8wB*;*s{vGbg>utfqIW2pm5s_Q@J!SvQ|L_xacWFU z6M9p?vk*=edPDE@cuqw5-Ds!3pOp#si(k{%ivQAtzLr{?|1mzA@0R0DLSN;B(!Xg) z$N97%%;)ENrKe8xTxFUvMVX*n^|1Iq`ZwbDbq`5?70NJ>$7dJfGwYOyG zK)D;0-M^Le9UvcXQs#o;2yb~p+Sv^rjqrxYC4QZ)p|=a|;&I(6^dKCgl zdQs}13Ua&@p|56x%&QGA2rHYh&LZCmp*I!ebs$n%^{j+*L9SPth8v#tc=C|0Ug*sQ zxttuKZ|z1&m#hp^w!I|BYn7$SY-PH#1NG&4G$?c4koF{iTu!{u7X$KnqodX1ISp(D zPe8p|gx*{|o~g$(^my~@GX9%{-fWP^P4vq$K0`q+$0PI={8h@&0=b-YkjqIEdZR#& zKU(N3X!G!?FfCu`O?p$(#e36O+w#VkkhXOIeh`h>2p9%pQcO%y$Hvu9u0E3En40tWjo0Ew+Vfmm!>g1PN)O2I zC$@g*r?(#D_YrkM?<$b%Q3-OsDH>j><&`S)l{v~xWs9;2JsmUhQ~C5%>AQva z>pvRg>&j4&$5VS)h-W{P-wblNbk7j~I+3A_S8fTH<1NZ2WxcXiS*5H{<}0(6>B?kf zf-*)Ksq`o}?;+)OC|i_G%6et3vPxN@%vWYB)0N4}1Z9jeQt44{-d)RAwkVsF^~zdh zm9j#augq4aE0dK8${1y&(xcpre&ThzL)oHiQr0VLl~u~P(bC`1%1CARzH+=lSpf2Q z$N{z$zF57ju_5+Q6-)+=k3RmuuwzA{^xu1r=YC}Wh7%2v!ruFqQZXZ}ch{vq@h z9T4I<2FDY@IItEU$oj(|hwJy3a4yK<=KUm`0dlzRC&FB1mNG?|s7#Fs@xPBx1bN*b zEA&NyvB;?&P z8p!93RH3&zMZ&9vxPKVpxfuC}fm6WRv!$L@$|7ZsvLZReGZpbNlySAL#nL@7z??}Eka)hn2q|bN|kkRrO=xMa=#`Dy;)@~3ey@i91n6m;)K2m)PvW%w97*L?@KpbD(z`kZd5iZ>%c=WAJaj8AKR2J zY)~eEXJdZH3%!k(g!tbFRw_4NEaCOaY-PN%D^1p;dTp`wZ zvT_sJ!{JR!#J}r6Ztq&5uX2IpziN)Kz%WdF>&PYUrYMLwH_-sH>>PZ-{cF}a;d8fGHw9Xlb!GY-cSgx)al zGK52g-uCgB7YMfrz4ah&X{OZ)y_Fztm8Mk)y_q0xm8N9~z472h2*(M%9xx5ztr>oL zTfqwvZV`IdffpdWR_HAS&qugO=uHPx5l$0&W5M$fjuCph$Ax&#MR>E&+XC`#}yh6 zuZ)>xznNWxkXOz4_o-C@)Xw%?0^=WRB3g>FN;AT!g!X-Xw4d!ihp}b7hEUF~Utk zZvn{l%@_KLZj<_Eua@IkLSNgha-QA@jz#(nLT@VC$LUjqzO_it>&0r2+mU{|gcFoe z%B>o2ld|~^InPumbChYyB;^LA=ksQxa;>sTS)ok7OUm_B%lWbW9vMe9%4}t8tSn($09phb3I|YZ(`vNYDOlQ?3I!{aT@~<#(djfjobzl%thf zP!1mteGKVP4-dE*?c4gOpWdxcO8WXn;VO{h=PQ$yF@{ajp5~_{-a6%mX7R_CXN3vM z{AVN_`Lx9EMtaV_=D85h31BAZU#B&^;ZNeHwIH{%R_I#|@_0*nUed>atVaud9WRIY z@AGHBDE*oWa{e*O(pM#%p$rB2bAi^D5D#ITRsL1Vt!$HgD}=sHZ%Tdz%J#oV`74#B z;OR)82Xg%~-Vl8($k)5EU@YcQj1c$BWS-{;y%`|ihlmEb9(Aut`Rjzfinl`WHEzr= z@MJJS!(D$1;jdtfX$1LrhKAeUMt%4=cpA74JQd8-aEgW-+Oe+Tc;t9kFC9*CC)vR{&wrCp+@d?G^dNW53^RJIdAeY-dLc%p*5$anl^j3jf-%{nK&|#h2 z{}rx3pl2!*l`+Z<|C0H)9$bcU8in3EkjqI@Jwf$&)nim&*DdL5Ku%vR^sWLqeU$3q zs)wn*^-IyyKa=!vp9mvCf4T$FPSiW7@^-wcL=H3v)l z+GvSiBlK2S5#?(A$Ri^UAm>*%2K7h$3~*1xtBW7zS&rkYK+ZoN zd>m{-dEBne$_|j**DmyipCs*%KY5tv6~wPXm|1$}F#r4ehGeN{CdlW5452Rte&u*JtNPM`fc<|{hE}klO+90WvMb3)}vD;{n~ScE0qN)60So1d0ezyCh^lQmGQ7O zUGgghdHzI#JfFirp3j>vk#f2~E@w5!_00nJhF)>8jEfkM$5~W{jML0<(%(trWxSN) zIQM_d1YswRbGQ}cdU>$%h{tQ>lwqD{5N-xJ96LkCOYY^vJW(hw3mk*vDN~2}?*k+Y zy(vEFuVkSw7Uc9@S;A_N$JuJ3Z)=Xs|MeiR3q>I3A8o=Ym(wTC#CQV7f>(;CMdI3B4^~2ErSK-kd8W-)x~T z?m8(i9OUxCgudi!C7dMm!%!$ugf+*C-GNEQDSq zw3w@**Qw522EATrF@Ftxqw35e=q*BvSq*)Y>dfWPHw!H$-uFgChe-RF#n5Af7V}ro zQ&eY`Ku;A~%v+!rsLm{fUL>@bzl6S8b!Hj#YN5rv6?%i}%yQ_BLW{W$daLTp70}y+ z789?C@L^JaCiX&vM+zdYIVw+SsKK9`8-R-Jhh^esY*c_Vaw{)WH(U={Qz zp~buh`dHPOH$&(BVxYym33`U=%v+#m3N2<0^a9nHw?Z!xTFf=jSF6rk4ZT`uF|UW- zpgQw5=#4^)c^&jt)tR?LZxdR~pF{6fop}fJEkcX=Gw7pnbI9L*uo`-l&|=PqK2~++ zozN477IQZA4Aq%;LC+Lg%$d*&RA;V%UL>@bxzJau&cw5l!mEWAa}M+d)tNts-YB$~ zdC*%`XZ`|uo6us;gWjz=^KR%{gcfry^wA@={UG)lhDQl4Cf-*?q^Qok2YRZ|VlIT9 zr#kaq==f}tX)zZ-=lxdfU*>(#F~*n{Gaq_`>ddv!8-*5g7W7utnZJbICbXDKp@)x> z{F(Pdj}%%=EO8NIRcHPRdZN%`79xF?>dbY}vxOFOF?4>u2G^hY0Ce6L23kxkArW<| zGk*=eUT86wApJ(wnGZs55n9Y*=$lk$)?rO*9tA>3h4ZN7xoYHchH-J7PB0B zr|Qh#L+=t=%xj>B?k4G(7z5#9LW_y_Q4#T~GarGTAheiQLC;W~`6%>Ep~b}YQN$|M znU6uQ5?aiwq1UO-#Fz`O7h23x=o?jMJ`TM_Xfey6Z&IE41oX{9i@6MX`0m<&;FHiJ zg%-02dc5k)_0SW97BdHWhU(0xpl1p#=HH>0s?Pia^a`QH{0MrD>dZevuN7L%F6ir3 zXEs4^5?ag;ptq~ed>VR(&|>}r`sh8ReavT|M+q(FhtS8W&U_YnqR?XE{z3%W=pR4K zX6RTGnHKW`=&My{J_o&8XfZE@-mE(FdFUI27V~51-KsNRfWAd&G2e%d?>_j;XKsLw z?^G}?CQgwNS*kPt1U*}5G1HO0Qg!Bw&{qmA=Go9Us?K}~IzLYkw3v8*9TB>xl+WA< zJxpjZ&w?JWI`d`d2||lG4SI&^%s)fV6k1H|zlkVSo%ss%3Zcck1bU6?%ogaiLW?;O zdb8@xSD|kZTFiH$cdO2P4f+ z`Kvnf4d_)ui-~|RnoCeA70i9(B+0zE@@ z=3k*_3N7YE&+@w3ulqKS_1w-=QZ9E#?78pQSpp1A4a5Vjc*+RCVUN&?|%%6ZcOd z8dPV#2fa~fF)iq=sx#k*-X^q|_&!)f=-xX1!A|I5LW}u()IU~r=0Bjv2`%Pn(9=|B zegHjPXfg3U%7{wUnIA%5DYTdo(CbuZc0sQfT1>1N5v{5-KZ4#Sw3wek->N$EW9XiJ z{Ir<3#EOUpdHgf~2|Y$=G4c6jM270jP0%xi789TUMO3QJ`~><+p~d_h`g+xwpF(dE zTFft@cdO3)4Eh$K#hd|s?7lkw!OhSUg%%T+SP^-uGe3u(FSMArM2T3fI`a$Y)k2Gj zQ+&jF)tO&HZxUKeoFXIIRcCfX?+{u{oMIw)zdiep`7h{ULW_wdJR(JP=2y^Dg%%S_ zY{V+nnO{Ta{rI58^r8LDsx!Ah-ypP@Si&MUsm}Zc`evcU#1aw_{u8Mm^WV@Tg%)!v z@=sBn`7QKRp~b}axgttcXKsaFA+(s7;t~8D0B%3?JLru2>PX{s~Pq2cL5i-|6XC{Udl0=-CRG1&$DdOW(4#mp~b{~#fWy* znR`L+5L!&!e~cK7FL(Ou4@N?d5?ajfkbjEm%)Ozf3N0qOETTYl=04DigckEXq_0z* zxi9p3p~W15^7%Owe*c4`p|=Pv=E2Z6sm}Zf^vyzxiTz0tWAWu>PS4yAdZN%`?g2ed zb>{xi^M#h5sQ+5knRu3F_&TBGC-jY~GY^2?BDDO3zDafFfzUS#EkB`0W0L^ak9iRE z7@_4S^bFOR(ai|Rc9Uyy+UaD3B6f$rUiY2(DD=dR@Iq!4rjOrH(o)Dc^>*F z8uZr>jDa2_w3r#tb5v&@3O!e7G4Z{^hz8Y}he2-?T1BA3} z@|m&FBZU?d-zSYoQJr}N^i-k6yo~FoI`c^Axk8JH@6ATksLnhJdacl69*Xi?RcFRQ zZxdR~7Np;*I`e4g{N)PJV!jGJ7G(c1kAWU1w3w~XGgN0D3q4b4G2ejB&spL0%y{S( zLW}u2^ajC2fagRF%LugMx&EBf9CPfql6aoO{7m!otXeVS!gj2 zNBRQQnI}Lm5?ai^Abp+c%oCy43oT|F^j6iGCqZu$TFk#f562+j`Y~~jCOlGTG5-cV zMRn%M&{KsL^DXG5sxwc4ULmxYNzm(5XZ{p=z0hKMp|`5e#66+#HlfAD_k1EkF-W+6 z%u}I<2`%R7(34bWo(4TxXfeNno~JtVbm;j)i}^3;YgK0^L0>1dn6dDGv+7JQ^bJCb z`6<$Os?IzEdY8~*egZudgTP;Zkf4VNEoLV4B-NS8(36E0a{}}N)tP5PFA`eJNzm7; z&O8fxlh9(~^WunZ)tP5Q-y*b__+COpECw0ZkC_5JPG~XleT0Y<)tTo&PZe6seWB;5 z&O8@-uFztRhF+;U^E~J)g%)!d^k&tWc$Rzk2BF0~0{-t*oq0a=E}_LdlIIsXiR;h2 z0D6?rVum9BB-NQ0LQfW2%%hM#OLb-%^lYKU4B`5#&b$cvN}NSDl#wy-8>>A3^?|sx!w!?-E+fV~{=+o#3xOI01T?&|=ne{Z(g9 zgq|q0n7`%vtIo`Xo-MSPk3nCpI&%{AYN5sa9rOm(nUkS63N0q?K}EEy&YS|hLufHy zfX>gQ^4A~Cf*vNcn16yEt2)yMJx*vbpNF2JI&&)YRH4PhJ+X)!)tQ$=&lOtC2cfT0 zotX{2N@y`(fxcdK<}~O{LW@}ky z)6kn$_Y?XC4x@jW&qC+tr*Zw5OQ3HNTFi%`$D@<{{SOvEPY_znG4Owm>dd9kbA=Z3 z4@h6BI2pkMc8AXO=+E6k5!ek-k86CO%^dFA`eJ^P$(N&MbpoFSMB1(A!mKmP79l zTFeBL9}6e?#|O9qdYsT=PDlC-)tMF0GldrO1f(xeop}ZHBB8}R5&CM?nO8!u7Fx`c zps!b*c@^{~p~V~vyaX29rUgjerk5dx2FT-f~2& z1o2iWq5{NQyoe$YZ#^UOLA*7Ns0Fhy?yAAb|3}lEfV(lieH>5Dno~sVvBw^JYK?s? zCHB~3AA79-*kd2nlIl_Ef~cw~txns6s3N6m&@$@Kpw*xllm;z=;PGz8ffF!; zHp+Q6k6{YOBd5;>9>pY%!vsEpaU6>=d>Erx!U#TuA$$-6_y9Ip?-*?0XsqKXblUlz z9&OxHVI&4klv;!Fw=-cVhsDqMY9|1RHo4)^RZUXkiWS#HwZw?;yK)J67;EEaR={;4N6d zo6*9X(C^@LvJlHdsfUMB4;Q5#6_k3EQR*ST=O^{BQR-1bsYel|9tD(oSSa<#qtrvL zi!1fWqSV7gsYeE-9%+<%q)_T%pwuIYQjY`LFhuNIm3y6RC&%UVzl2j#3XFr5-b7N9F%(4DD^0z)T4+}j{-_PER=fWQRXFx+L#am=r5+|qJu)cuNTbvv zfl`k+Zp(NIq1N_cp==*HlLBN*NF7orbuduskVL6N0%g01qih#3lR~ZQKD%xIH!pa6C*s8YuPfQR-1csYey19v(_PT$FlLQ0h@e zsfUA74;!T(C6qc8)dEUAEH#f(kDQuCsfUSDj|@sZ(kS&vsRl|tk|^~^pwuI-#?&ZE zJt8Re2%*#?fKrbp^^|(lQ0h^|QOLf;s_jG0Ly>y$UHhtf@SXOmdhp%Ss(J)a>d{=S zRgVUKL$0IL!$+wH`%bIs!9LEaddT@PQWqDc9vlm;vW!v>N3~JvQ9`Ll5v3jllzLcd z9;F^RlzL=Q>S3xGHH}h_6iPh|lzJpl>XAUHM+BuFAzXslHCo$;iBgX=%Jz{$***-E z?IVd&4>>Tw8MNq$?K(r)Gk~=sfUG9 zk39ZPza0LCS(JL1xPqL)UonlpU<#L`felQm3H+HX=j(`3{0So{bqJxFC^o&P{x~6vnb;=QO27=8E+b8 zyeTz~GTs<>AbZIpVH zQ0h@c*&iyP>X1OGLmZ_JF_bz)QR)yusY3{*4gr)pG^wN1p@C9| zI!YaU%{7!dR8i{Sq13@esY3;&4keU26jACR=k3V*dL89;P(!Ih6{QXy%Im;Ic^$}k zKx1exqr46rl-Gfc@;WG?ybg*euY-bWp=|$oHH-2(Fi~Cy8I(F0D6fO0nm~CS#8F-c zQ8j`x-Vn-o11PV9CiRlnK|`&gybe5+@yhS($m>3aGTsQvcta@TmGgjPyiHCvk?}Tg z4DEH4@ydBbGTs`>c&jMm^-#v^suh&+%6UnmjWXU6%6N+?YM%#%rRCH?5{n z#%rLAH;FRd1j=~hY6xY#0hIAtjORgF4?fNKa`+Txu@B|ErD>SKshGwom_m*S^RIr!1pb6^{1Icg45Ro1M(}$K;ddw>64$ZG`j%n?zr`B! z+u44q*oGbk(Zv8(@L&3s@gH>XZ?thGmhdku;-6T+|3eF#n8!abhreSMf5YU)e7?={ z6Uc|;;W(~=a{kup7{%2vf&(ywJt!Y~^VvhV$#S}}fn8X~PV}(@)AW0YMVGLIK0b`` zP58VPbNC3#`BdXjK3snk<@~4dSj5Lr&R4QAwi%xfV-_FBGCqM#oQQH>&m=71lUT*c z7>)7%f+kKu2d82Kr(tpn-k;FIr%=v6c^V^I@;b!~meIy%v5wO*u@$d#%;OAn@p%kw z&FdJ`_#&3Df^uHMOpI^C>l1VMGFEUF2Dat(j47OrMSK-&=wfU;UXPf?*RhOmU=!z{ z5$E-c1$-0bd*HV)x;?LdH1Tb8a30F{tnXlQ2VS3O;kzi`Z@!0-9eF)t2CHb}`&h>h zFtHQw2Pog?EkG9+VrXYxf0)KaDBqXWP`>y27~{L}`o$c6iWOXp@}=Tun8MGoh+kk0 zeT*e|onjWh!ZLo1Ov!s8@QRgK5$cceP9f0xH(qwZ~9eG z`jt`oIk*YhxG|Pc`pNHW?N83&ewfAsQGRdh05nkg#ZmgjQ2Ir2UyR^B7((e+#WTnr zo{lb_g%vy#<#)cMUkRmO5v5-NGic#ym`CYnB>BFYoKzEdBRQ_daBPtEYrA||DgB$= z|9Whwb(DT(+V5t*quO{6xunYPc1gdyw&&C=4yB)|W>EUY_F+GT`B62350T~fzC`(Q zRQlEFFa3PAh7XXds)y3ANdG69Ur;TaOwOx0lz#GiS<)}9rf?G3P?ISA9N!|x)F?_n zA3tG!O|9amWKVTb`Z?Net0nxHenqu_(ocRDZ5i`Zs)0X}lWGE`pZrdm^oywSduczA z<;!TXsmsff|6w~U%8Z7`2pqx`PfR+z*s zF^XGA`+OoH$WTLNBO<3DAvgvVurjCCU9f4k!wzb^SCM2 zadUKWGfW&t-7$nQl;0)W3e&hHy0{INaBB<=;(0}%ye+25+hZK#Si&7KhdZE;J7WcR z!ua7lFBrgGFonBe5qHPh5u6{%^Hjwn(Zdv$@d$MAa4g~=EZ||7$3roLhhP#9#wZ%t zWcde4`;naghiNS=>{`hkIce_r}=KZ1314?}J(LerVvnSjGdefcs+;55g*PiRG|y4CBNo z8d$(X(ZoZrii6O>!!UX*b;Jhwa5TwBViHs6;L&K|QP@B((Hr*gSWF(r_%VXVqlIbA z;0fsANoeDV7&)FgW1W05X2_>u0#8L7PscoFu#RV(F7d@<(m60Drac@sQOWxNC(ycmmk5f<=5%;5!?#q%+P=V1~}jN-Z2 zWVz>{{2tla(ta}Mr(puG#W-Gr5xg2hn8U_NoM(r1yb5c0C06hXEaByt$ICE-mr6VL zFEI|eh|$9`F3e&IFO~7(Wmv?^Q7(RT1=h${Vv77fjNw&S#H%rjIjrHeSjKBGb{hK; z*d$+vS@Ml&;0;*Do3Ma+Y~n3g#hcN{@Oc(S@m4J09cUt#}}=;?f3h7Iyv zD8Fwu1d})v9lQrEyc-)h3_UDh@(ez=!wBAs7T$*$>_rdnM;k|Ak$CV|Y78@HT9)oLjMq zw_q7>#vp5p389_Hpow)NuGpBoQMui zMhlXk2K&&%XVAu{F>)TqcUUKvF++Y16F41hd>->S16_O( z;}=k8#u>xW7{yU2Kb|=fo9FX9p^x`t4M(7d_o0KmSis?!#d|S@!!V8oX=iyKu)Zc% zu!=L$xRB#XjN;2!z*%VGD_F(Z=-{guy@=yTY>-_v$!}m1Uq=V$qJ?v?fp4LQZ({Od z_8&2V9$NSgW^f*Q_%7PmkC96_j>J0oJP~zj6UlrN&BT7-?6?jF2DjV#3p`(Ra}I|WgNF+6hFoS zeu5@`idFm!9bAmj%Q;@f2KjR|$zNg;eRS|^wD2oz;5X>u5=>sf@hV2}TeR>y%wQco z`~hwJ9wS$>pNw_#GE9(v#?n=6pNzAJ&tUv40fT1J!oSH>$p0m zuVZ^>oGF}(2F}4azJW1(9YgpU%Ei%LtY6FP41Ju99=?Ju&cZUjj75A2b2t;zSdn&? zvm@(|UC;hDHpy#XmdrVgVFTC1GOmRMTpOFX4pwnpG;Uyj8>6@$7Laoz!zONkRooCA z^3SiyI&g!81Gen+$Z>@Do)qk%hP853B*U9pJ+v5LE)aVy6G7{xuXfP0~ddtw!n z=-}QMy^Z~5Y>>HRYuF_3k4fAQ9psX*VG9qy1{&xgmy8W3Z)ZOlBX}@cco=5zQ1tL{ zv~dtd?qEL|>*OOaLp}-g@O;eR zdFbJVXyXMK8OnY+*2x!PhMdI&UV=7WhIzacUAzM0_wc?Z^})X|ihrVfY4?BFyqot$ z^zjd@;qU0;Z&<+z3AdFY47EIp7VH1ctJbcF?N#+nl0=i z=QZcBlbqFTVh1^+IgRb)6yC@34QwMPH777gj%$u#fE?8v!GC!^LYf2k54p+XmF1=G z<9(U_hML6H$q6-%Q|K4L0n87na&o|G2BlxI$m@pr1=Ygq$ayt~vfd0{!~C?G!fVNfnnYP%OxvSs1h1xFNR^XVq+fC* z`{~S2sByfP98;qx>y?vV3e0bEKe2(su&(-eA+KLg+g-JS_t3AbIw<{omN%XGHMNR1 z*;8GV^*T77`L-twr5onAEjSLO{4THjB2gdQu8S5&8bzK^HZvU z&y$mC0%dtoZI7rSe2#u{(vaBH^(IEQ)*Dx2DC>=?5tQ{dx!+voH`F@5N%qwm%6eUG zuc&35LqA8gQTo+%eO1-d^|@*VWxY0j#QjTZ5f_mQs)e$=thSqK1{cyVt)@`=HSm5J z&lvV|X>Z^LSjY9ThU;Jz*Fz82#j?(KaBXrC*TMpFj(9kSYho6|n8r1*@&Ly{tWQpQ znTk0qVhTrM1xH~KN27chJ_c*#2QWo`2xIsl7V%-sVhL;b2$pdy#!75o*d&j`Ecr1s za6FcA0v6E5CO&~xd>oC3`TPWD zLHYgjS(van-op^i#yq};X>`%WH?V}SV`u`eH}uJKFin07g#3t?gVFM4q zI_{5Eo$ukkx(_f=M`AQ4>5}iu!akA>kHP{TiFNM3 z7VoEtr+Gg_8-L^RfE{KY7x`c5 zM{Xm>F^DDXz#O(qKkUK^c4GWl_TN!X#_7f!4!{)lU=#OSi?)v!;8_yELQLmv~_+7FCtrbA?EP{H1T}Q;CX1EiE%s^3or2cWBpa!8;uuv zU&bhIj0M~TP23c#xEVUQIYukIpJIa?LzBD}CUHx2a2vF6Yi!_l=;5}QoXPt+Mv#Bw z8n$pp%-{~_;m&B|P8fNK_bIHCcfkyKASRH1D;u_Pcg*8%SjRol#XT_bGVene!X)N# zKTPAk=;8rb!u?TBx{~LmNtWlOf&arAUWHY>63th5Kcs(gHpijl0^W%hTA0T>FpIaM ziML}0Z$m@pC-D|?3~$CL-h=_nW0UpVh(6wc9$t^}SJ{7O{W&}feLM&&XkgsseFFn{ z2N@t7r_ zhz6d3Wjq-RcoH`8RIK7DXuQGe1fzHw7Vr!-@pP=>Iq2Zo7@fm*jScd-Xp+yzB%X&h z%JWh}d0vV*6!SO)b9fiZNpTm^Kk*j(SL8T8gfV;&qxb-Za1_ePb7Qc{{YImYGQWl+ z(ZwQG@P4#$1eWkVw6GVmI2=8eH<<-#mhd*r z;jQT79azEJG2T!8QBEebFo#1ig+s7{_h1q4MmgDV7}m%IG|2M2BvGE11U`aM9E%Zr z8145sUZj6@KKrL+51&F8`>=x3&_M@noQfr!f|kzD<7BdlPhtiqp@9=IiBDh*AIA_* zz-*QKvHmhT7<-@R8Jpzcm?e)u1MkB!7O{Z$V-rVV6-T1+0oxfyaWoe2K{W9JtYQfr zd&;Iv&eFi>C4z;xi6uQGqHvhbn!)W@C6Kg%>J}IZhRKgSVkA0!xB!%&?g)x zpiiEGY4VF0#}}}KGcku1^zmh^;7b_)l*f;9vg<6&;j5U!*;v8Xu!t_o$*^x=jr=;M z$a67HH{u zPL`9JKf@-=U5q|{iZ%QMUHljwtYPRI_KUeLLmq$Rainn>y7)7e@Fxs?%kc>MIq_fn_taO~)g-Qvb~TQxF^-6~hg3O9 z{TKQ*S&rC1=~rQXfPY6_;;{t)}oqvY{qX`o*+8sz#7&IfO&1{9^{` z=izzGchw4>PcEwtO24AE7gP&P`sLLeO26b!>}N7Rp~mqVa!iflH}sQ#L?Qi}+)r#^ z4(qCq($AsaUCg)D5)L63)dEVtoVI6G69>~Tqoz^%xwtykf9Cy$?cK+}v4$(r#lNtE zf1-o`hXrh67XQE${*H0{P1+kA53}4RhOvrkps}3K6EKQvVgc7i6W78ju8R(?gVA63 zd;uHe_0S}9t)g%eH$VqBLJK#<25y2LZj8xaIZnq2Zi*JhFoT<;ja#C(g6)&~xHteS z*n>85t&VUByRm>>n8i*^VF$*s9YfeA?Z5Fk0?V!8)>y`^F!npIGi;K#!7Q0;F@+7> z4$HU$7I1rP;!aq_9ntuM<9&?c&RD<%nz$=gaW`~uAV!086+&TDTtOab3*fI+((>F^+3t2)VXNxX$v{l=eS4{$;rp+!u?u4+j3? z^8~Ds_rnzVK#bu5SVRM}co5d`5G>=t7+cA4IyT9NVwQY38aN2cn8E@cflWLLt9T?D ze{;N!Q9K$=JPr&0@O<#NE!-OOxD}eXC1!97OkoV;xH*P!Gpw_mP0_eNv66Ww!OyMb5!3-AhGzmYc_mF^w0Yi&-q;B^c@q1};ONd?}{MS7013#}ZzJIlK~m%wYxp zhw-jp;2I3z)tJNUFooA*1#iG2UXOw9U?7h*@{JfH-;AkHFmMo$+rR@ci3eZ|_s1yi zhaub->)dZ2^pI=+gdN-)3%HlG)9-$ko9PJ#Zp8%Nf;QfcdAtqlXrYUDU}8WpFc?F4 zC+2YortvOx@op^PPz45O--BuLy%@(~Si)Y+;c)bE1Xl1qlz+4`60>Ur1IP2Y zO*{@Wcq|%t3?}htjNwrj#Un9-ZSDI35#`U|<4<(8fGIfoXgk zU7Um^oQR>df`Q5Clb^&ic?!nS!4gix98SdwK83M$c%3oMD4v56JR6&9^E$-_o{2R) z1FLvCx|l&5PeTh&MH5d!15d^no+Rxo*JFJRd}d;?4PI)*j~ z2Iitqo`Y%fTNuYTF^6wsEz0YgaaQpv^zce7;}z)OE*@IAEfeav7LJ^T=D`~V{x2LlVS zPF{c+@*+&&M`+{6n8zB{@l$m16HIIp419(mT#R}A0@L_8y7(oQ(8tiG!NAw(lfS|^ z`CBY*#`_54ETDxJ-ho-X9ZkFqQ+O*HcnikyW{lxY7{WXT@J4K~{2Q=}*JBy4!y;ZQ z?ey!E>t$>n4AglXNnDB!evcM@hYehY9{zyISTOJtM({_puz?x;89n?3ZCs9#ErNj+ zSSSCA8S?L#z~9iuCg$-EtmB{P;{Rb{%V1z7hVU=U<3E_jztP2jTptAgm3~_V18roV z9K`gEp>@d0Y?c7)2L1z(hP4*a$gwkX^m7iw}}3n#=eA+0h)@fxjnY`A3XmlldiVsC67mN%FK$ zW`0i1qC+;-3`##k+mmVnpQK-0jiL0b;|t99)f&D?uBslc#`nBsZFf`~pQm3*Eu!?3 ze~ft$OvdDF0pQ?ZCsWIpXzvmSFd{;p#Z&p-#yL<`Tt2A+)`o`cEV*-ys^o{JWq zj~P4I1}X` z&sL)y87l&bDKifutdt5#6@#kv1zsmp=v zAJLw|g=pXcjN^wG!w)cm?_-1eRk4cmv5fCw5#Pn=LA>v?+y?!}phn z!UjHq9*)JN!TTaca2#6r7-n!hdN=`Xv@vop@4HwhKaLslBuwB$v~e=#@kw;i!T6!< zukmDYnT!QkCy}!ohA?(+ok6&U9ef01PbntU5;Afb{#hAiRF^-=|JIi~6^)+!S zR&fd%hw;9KQJjVad>T!B3aeN~2cN;{Al^5zL4FoZ@(fJkbLij;XyNnNzzTZ!A|?;# zb&nC8i5AYn48DvW&PE$w!N?K3uV9`0DrU&9V*+2pJkCKs#r_`Stl=M6#ow`lzhN0y zUV+Y#2upJ9gVV*2KlJr}R>;5IwI1Z5O0jg1yeras7-pcXp$I@O#t_>V^up5img$3-y z9Clz9+cAS}n8YAPF@Q~$`!A2Hg8!hA=J_HD#M;lke$Vn6f>*O^sLylkq z*Tg)oh5pIxe>1)su8&n*4=cDXmT?^{;o4Zlwa`MYy&N`iO*Al!Fnjq>-lgd38Jntj}aTvMyKG1*gH zl)tah(^($#BWeh@Bg@4v#3udZ?`DF$qpbf79uM==xDBRoYfRu)7{@I!id$fl`^B(^ zn_~qx!xCOHu0l5}`xQV-C6?a49tYBbIjN%?xz`fDL zy|9Y=po2+_p3Uc>*dXtVCiwtN;{NF1L1^KD=%Im$b6F3MH;#MA2 z&*5>RkGoaR*G`_E=##hp@gP9*lDFki)P>J`_{r!!d?~u!t$l z;t^QGqp*xeV(dJQORz~k8nfi%(74P~Ly=0F2`wn7|9T9|WdQ zj~G6L20n=JG4 z=Vf6GA4da=XySOZuorE73|+hreS8=L?VJaPF&v8q7SKc+EgXS1PCys$M<2&wpo89mxPfewuR#|Xdf3Nn$$@UpC&U=uf(BlVCJsgmEwu4Ybny=K z@pcTb!Q7289D)Ykg(lvF77j%lZ$%exLmzL%Ko93PVhk@t1HV8Mze5Y_Xydo&;y38y zQVa~>{1A-cQE1@NXyW&1;n!#*PuZ&9b4ZhY@}U@5jqjx~hKHbm=b?!wp@qkzji;fD zU!spoFtECuHpBg~hu>c^Z~&S}pHEtikul^pD{Na(`S~?vKaN zZsCSx8#h81qv+#i$bW$~F^134-@tv*#0c{(45N)JnD64x=p&oZs_V!9LXNG;c{^y} zay0Q*wD1D7kxgdR_3(M>!#!5v<3?lV$z5IrDuyLDtWM ziIHP?3faID(Zu7>!YydGu}XIFee`hw%7a^oG5in>`~XedQr3@)$Tn_8cJU*!k2RD* zeT*^u1P%NYP23+XJOFJx2wmI{ef%Az7{6f*w`TbU{zNwMN3<}5HlB(uo{m1s@BT^= zH^CULfd&K^L{rG~c zALHClp0w@d{`fre4cvijVwr5=vuNXs=;Czr(L;H%-@+KajRwAnCeA?%r=gAW(ZxRW zaW2Y6;-XxScNQA>3YxehkHf;5WE*!PyEu>RV?WBq^eV>iWt8jozK15xKntHn8(&8k zUqc_?K-u`7!5Hq$@(r9#HgOkOKUT;#zJxBmgFfy`yKJ2Al4E!z8fc=43AsO>PquL& z*~Q(^$KB=rY@~Z&4EIC>_d*l*MhlZ@<38x(zUbqAC>!?qL0HEZ!X)BQEF-)_Q}% zwmH2)Cfh_$EcFJ*iH+gG6~krzu%I^##|;bGqBSfyWEl5bQ3x{GCN>M?dLhVUo48E! z;zE$gHqn>t6@pB*iT#pi6@pB*iEe?%**h{=94U?p7Doj;+WQ|3Rv!&6c$CSC9h_wc zU7N|3cF>v-95R8)ag&1fq~OF!Ox7m_mrV*bWYT*o*#A_p`V^DS)4{%{gXO2C!!yBU z&jcIKFgc?ftdxVZ%B-sYonZAHEW8)&eGeB`gMJmA4}*OlVtrw7*+MKY3eH%BLu$c7 z4J)4nXMKXDPlMw=#rl`QWnZGTJUC=I4jJ247|WAbd!%jgBRFGxTV;G(M|=5+wi!>f zRi0qdnbg)dsjWPTR?lhcciP(8YBSmv&u9y__0N#WHnA$%ogtHL;vBI$vu(jl^j~gU z@-i-XrLFb~i*#RYoAYX$_bQY9UR%{`Ti`LdWNBM{Y1^`;tY}WX&8uUv-ZrK#y}oO! ze%H3(JLxsJy*{{o*WhFL2sx4pyhMFPK7?zNziysqHhSGFh0`-aDCvm`#&Aw|&msc5g0|wKv)qztQf$!DQ*p_Hl2v+ixP_zTLjyZ6+7L)9%01zT_R2)HlDqJReuiZ?~#g{i}V!UpQuPM`>^e z&(;$iL!Q7DPjoazdrHT|DIFc{6K8ZdGdlWaFzLM9(f4vk`DI$iz1m^F%B&e~N5$=! ztvI-x3mA=PHI2A(;ME|Kb%=J?(3}F$1JC}v#+($_jOt$ur{J|u~;c~&MIPIWM}V4x;965t{mNIjbT>b!=2@aJ9#4P&azFORqk}l ztvFRgnp72OzmWn zZE_*e7}AlujnwL`!mYN+*+S%TqcROd(I4(#d3-=tyololNq!=5(%f z$o)147^oG7_5xsyrWv?h11n9R_NlRL*u?kr7asEy}3S3HM{=Xd(^ zX_~mS(^=Ztx0J~-_0Cegb6lOtB|mi5f9PEH1C#c$&WX!9on=f~zjY4zt+VhOlf^$e z$NbS*`hz9;e{?SSLt5|Z8gf@x;jS*8|3cS_LRYiEyLIK>u37h@JFIKYurA&Yhj%R- zjw?rWS@+|z5nYWDv@aRaRUg4!YZJN_Pw4U|FgfS(F7NTK{>N$cCU^BuX4Yb-%Xhk# zILul+r^}zitZ{R@?73YN=Q3G+w`;+>UA1?aoH)PBncvknpUK{@x{62dBI4bn_yZ+C6b9P1dvBL!Rv} zJj*O^c6a}5T<}qM?ISGIyL;!j($eAni-wfGriXVpT4{^wXP+8OFiC8{E>8L^~{-t<#|0b=FzlxUXMSoXURNf z+5J5e`N_A)tZ!~l21 zfH@KxzZW65A2g@f36b01nzQLv zUXSAySzcdnD-YCMdaRZA)x5`(t$gHv?bBNMRLynGS1UQuqfkJG&J zrB?3KeDbVTenIoC^IG{0&5Qe6`2)?_g{}OBX8HGCa$Bz1(cI4Qm5jHhd0owYpSSvN zqxp&+I&s@i^D(hjK3TJ|bt_+}IlgTxU#9sm%{OUI##`<8YL@T+VzxUj61)?&Nq?#%JH%%ByRxXx>zF;+|If_L_GZ*2)7lr#0`Rd5;mT_JcKt zxaf=Aj?|o(+{!0t?&abzaywn~g?+7jp5`%6xALW$jk&FSljg0tn2Fr((|lNeD^JwC z?7dc=EmYe1X^v@rS93!12bvAdi!`S-FV<{o{!(*J^S7EU%|B=^YHnz@ zHUFl$tocvPuI7I=S2cI=`GJhj*W9DIp*gHsE+Qhgbu>pbM>WSZZ>l+=c}vZP=Iu16 zHSeU^)I3mgPV-)xEzSFBE^0P3+nNVyE^9tYv#a@d$?bfGqWNUaHO;4M_BEfQxvu#F z%?-`+dtb7=rsgX(%f(jYc8%tc<{LFfG~cQ@s`*aMG0k^tj%yySIiXp8hfLO=)ck;C z{#F^9AJd%DJVo;{nxE5bX`ZRMz(r!@_L}BC&F}t~xj2m6KF}QD;xKaiR&z#k8=o)9 zqRVd64Gj{;l>?G)E6;+? zzEQJ#ek=ECPG8Z=6Es_zr)xHHt@igc+nT@AEEg?Ubz?t89`8&(;$j7Iliv@M#~abS;=jyA z4dk`~`&rVyuI7C;Z>ITd&3kK>&kd#jjhZL^m$}%1+}_fBi{|e&57oQ|pAX9Y$7^2o zyI$naHJ_~Qn{kl>x#j=My{-I+=Iu1k)@*40QnRJGgU=IXeZw?wr}=TsM``{_^HrL+ z%UL)!J41ce4*xVH4oGLljf&2?{a@@ z{U2(+O7kE8_1C;HpI^%Q!o^nqgEWuOe1T?L^F5kB&^%4^i6dM0pRf5s&A)1XQ1b?S z-YM%_e^jgg{+c(_e4gfWG~caxyymI@^&j23|9hGb)clL)*_zjnwbobFyszdqE>0o0 zb2JauJXrG>%};86Q}aB{hjS4Nxh?-Mb8!o~ZLmdaeMf0NK=a9(FVK9Y=3$zj()^6( zS2QowJXiBy|79+kA-65IY^|@8i)qO1aLq$CU#@wQ=A!0p9&Yu2Uh^Q$pJ<+|`CrY8 zG;h6CYkfUqTlYUw^DxaYvs; zN%QrZw|TVHK34M}&97>nt9gm$Z#4JFml+*=hdjP@|6MfSsQDz#Q#9u_Z~s`U|D&4s z)BL*TD>X0G{G;a8i@dt2Q+`Hd9vmK z@}&&x`&jcXnoobcb^jAJU#|HE&5vpxt2xF+ROI%!X5+(FenImUn&)XQY5rXE9L>u# z*Os;J|F`BQ7h{myX7XhakM~F}!XP(8v#t4T%@xhJXg1g8PTWeG3z}chEdMB3ZXaq+ zXS4a{bo*kJ4;z(8`x+u4^8u*@(8}sxQ{!DXX!&d*l zH2a#P@+BBesf}9gduh&UK1p*?^VOO|o3{Fo(45fRr`gy1w&v7kt^P|j=QeNU4*Bwn z$)@HlHAiBt_JcK7_G#sFHT#-x*PPkE)jm$Mt@&lm%Qb(ZIdwp*e^YZ&^9DP$9#7@K zR{Nfsje}bGWX&bb*Jv(l9;rEDwE91zxuE$y&B=pX?aMUVnpcxA=V)>@Z?CzoIi=Y+ zq;>y`H5W7w)to%E)&7KLTl4Fhy~A4V^81pqzVx70UiD=llM^&=Azu!Xf6;uf=0gu} z^*>*8N%QTR%bFk2oH1MdU({@AUZA;oeyhEq*|?yU*N`tCnH;Hk2hDZOhigt;*y?|Q z=FCN{e1~RV^El1Pi(Bm#&1uaGHCHt+*Brm3)n87ilE+iiyn|*V+iE{Tv#I$4%>~Vt zX8A|WavP^Pu6d^Bn&yR?jVoIHf6<)1vX#RFTaTxqc}LBmt6J?xYA)Z?$`@;{X&$0E zeQ&FMg65LuS2cg9`7_PN@K*mnH5W9??}kc!%Dt`jJvArqYvq$P7d7WJJDNvmj*n>d zpQhQ;{I=!<|EOAS-)b&t?%2Jx{)*-;H2azl(wyWZOu3z<+0uNo=ETTW`$L*bnxEI~ zj%u}kpgF}qVwT%-%@1o{Yme6B`Cjut&HIgM^*>Q_QS()r9nHfvr=M>1pR75rd5-2r zxz+A#PCnbpe`_A5d80jBkH^=%m*)8NR{xVUr=M%(|7osi?$w-_(Q0=zr!>#i>}mc| zbL{z6|9>=BHE*<6>+vM{N5^v8TXRP9Nt!LqIn9X|Tm5@Amo!h&oT{|i=V~r%{z`Lg zram6c=1Z--@!qY+lh?eD=GcN(`>C2!ny=IBe$;9osX4T$m7mf4|BT%Sd?Ur#$8ph3 zH{FCLYD|~yE20}hF>rurK^z3xclMpk*=ON$_-HZRbkj|MU|KM6fM~&V(Gt;uctbH= zbkj`>q9yOlK0l4MyR$O>d_wN4|2#Xh>v>iMn>!pokJI>5T)-7knLqrR)NhK1@gK1M z#wpjmCvi_QZllW*{^|s_^ z;y!#MR{t8;sec?t^5S>#$#}8tW&TmTDlU8`<7;uF`sHE$wLk8~^Kf|SrJVds+<W*a|ZK06d7>aArlx`*Fic;v4Z0ehiP` zw{di38UGU=z-#R&>#47lybcfJ7|!B0JdV%8L#wbJT(PS7aXfbCc zPviO>Wc)|P@jHqaub1@<;SF$B{SdkS+5yMZ50~q&nfM-j9Io0$^2=}p-;GD(lD~lU zFU9Jw&vEY&;)-2a58f149VPj$xDg+P@5IOBiiC{69LMlIxVKUA9M->FtG~X$alGtq ze82E!cpUGB8)iv;0vGV{xN)}RgSZdhgNN~pINr>9a0V~;2U*Xs`ek4JwHXf25&r?_ z=ZX`!KPf&5e~$l(W9pZK_16P9iC@K)r%L`Uj^fJQWj$&2OR)NDD?Ez##<70MTks%0 z1%HCC!S!d!_y=)69>r<(%eDIJI~+YnyviQ3o&mfy9>)9N>T_lM9NdRb#S!&Ox%%rG zJcu8{>ZggEd=%&L_c(jL#4s$ybVqci1)$ccrH#~B>Aa0ezEvEoWb|t{9h%1 z3GaT5_-j0fSKN#57v2I_Unk@D#4$Vz58^-LaeO82yJceJ!v0)ki4OTxF<$OO^+FRCBeY1E= zT&aFZR)6h<`*AaFSR{EL9>-VXq1zaXi@70%#+dnA7okKjVF{$9z~*q8O-8l1=b;L-+t3dw})e5v>0nZT)&L`k>@D-~s#??tMt| zx9~Xr38x=nJ^OKe9u?Q&ij4RGoWgB5{FvnZxF6q$Gx#yw@Pv%d<3%{Mzsz6xq~z=2 zB;F49;XmTSKV*C-4*yepez6|kiZl41xFIX!KftX|ix)dU)|0{O;ZeLjj;mjW)?a_b zY21mco|XIp{1{$@^Eituo|Ew(;t{-9Ox6>AUh?(v5Z)da@L@RrFB#v3<1dH@aMg?A zML2_>#$*2{`G+|5Z}H*>%6jrIiPy)yFN=4;X?z%tzAE_wd=tFWPUw7j;egUWO z=XmUO8DDV_`{xbuCOD3F#cBK}9DP&9ABPWrOMH28JiZ%eaSk`UE#p7OL%8B#Sx?0~ zl5dLd#Jk}fJ_;A`@pw4TdT`~t;(PD_&fziq1YujQP%gyYLah+bLyAF_18{#3?Gie8%o}d z8}I<`Q@`Y_zi!3D_@6k9-@{}0zc{ac8Crj>eVDATfT!Yd^-I(GD~2l~;x?>*iCTZ1 ziL3DSIEo)Bj#s~2t-oH!Vf;NF!>h$*J>fbTzbUR)zdWtKcEh{lqwqLhh~w&)uJzZY zxEH7K5PlA)@y9rempWY5qkm~ze{F!P@b05t&h5PVw zN6LDJ@FqBmcfq6ha6FEW#nsJn{0nhCUWB79lK%t8@VmHSj^sb%M!e>qWPJzEmAnQw zB*pvUMmz@(c1zxeGx$ne=#%_j96ni`!`1jx+=!PtO4buUMaFM{Q+RuvJXP{Tu=?!= z=lXZx-qXZq;Q@RDPUA<4<4>3Iui-)bEp9wR^2&s)??Sv4z7+3;>(7+&O?ViefV22A zJdW?gp?;}<7FXfdaP(ryf55$Xl}1_L0Nx7sUn1l8#A)1w$A%<79*3?KUxvTMcNWKA zC;79*@z;w#!UY^^lJ!*HAo)7DAuXPYQ#gi)ACmlNoWrN%QG5-qd|1XmfGZvmzl6j1 zD_r%cG&bS^Qj-!uB-i2fMe4N6=#qp2J_$P22zlFn3Nd6OU#B0u$ z^)=%fT=}Go-xv4dId~BF;S9bK=kUFF4F4NfKPAWi0@ve;W?4`4AChl`8}Uwf@c$$~ z45x7?zW(2mpI03JlK7_Lc>FjXep&K2aR&c@3-3z4N{g&7{GNC#9RE_hCsw~_6w+T! zxE~*nGx#z*@|BEF;~ah#XU8S~5a)4dj;v?&Ysr6y$MIA=_KoBR;Lx|?qj4CYhR5(V zxZ*n*e?QLQS8(O`l7E9&$1Bd2^=0tyarJ*>{BF1bABj`=Slov%#Dn+_Jc^&j9Fdd?OseJK-ok45x4>PHrgm=i)wm6Ykwe^2hK1eiQd^Ect)%5MJeIS>NC$ zl5dIAcu$z)>8omhlJU z2yVv>_|G`LtBfDOy)(qO;}QHcPVXoA`#6jLi$gOduWFO^R^vJxK0@;Sa1mG@@56EYe|Vr(^3U-IUZ!2vGu|WlhPY~hct;$@f5dTo42~Tu&k(MR*Ly zPn7YCcgT7&cs-oQ({aT~GX5Z3h1+lhpN&)aMx6Y!)IW;*@auTw9Lc}KdAxE;);D^t z-UjDz10KV3aCKUae=-i=DZUa%@!xUkVaaoN z5PyaT9+7;hZduPT4&$LmCEp&8;6rgbBY6kT;6R0 z$ojH)bDViy>i>X8@liPUhUC3?3}1}%Z%Td}F5oO4e@pWBaK+o=UvV{FYk{n99M|H? zcVzqwJc?U!RbKKlaU5TVWA94-5KiJ(@z58Ne~q(vg=5)YUrN3i9>u%j+*gtxfyeLy zoFA8b02lDBIP$CHPvJPuoY!AJ;Ssz>FYCkG;sV|Wk1r?n&A4KD@t<*M1@RTQ z3g3e(SCsr;xEghezOIaa z3#V}bk5x;)>T$BZ%FV@FF&%ou9hw%vB5l8+a`C&MYyKowxj|=z~Jbb0pKZPr=62FTh_!k_lm5Bz_wYv8a#B9H@rtLio|`4F#(j8qJcJWCi;u^lTcrLn9L0CxG5kD^ z-74chDb_C%FL|1*Cy6)0!+2LbhW~`?ZkL)I7nyNr+E44#2g z_enk%kK)sD)rjOb;5g3UG=2kT@eeqBztpdKrmQE5x54QLCEpv5;uaixMDjk|i?6~t zd>^iQRL1`sXYrRfl97D5epycpZ;E^It~iH}#8r<~g!ET04m~cu8292k@X!;IKZC2E z6p!H~Ugj)W&oJH?hn|x0JL4)m6Q^(w?#CAv>$6h72v_4Q9(qRd_i+~g4~L(X{C8)| z`jU7Wu6j=L192a2$3wUuXYmcV_j##*6zB09#qs}={6Dz<1@Wrqu%4WFYdntk#gP{! zPvF>_;*;<__%FEPEy?f2Vf-TQ#h>E=Tyd_fry?))8{-Jx1rNU``AnR{3vl)Ol3$2Z z_%@uySzP&njQ;>9@&9liUgtbnU+6;_KMlw6L3k9m zN&Z7|{3qg7&zJS|;cf8nr;_iDBcF-q;!E%uxPY(2vCn1v!#Igw!x{V?9>tXx$a-R5 zN&S|%7w?6~zm|L!uKGrN5>DYO@Cd#aSAHwwb2yGa$7#IGfUGBrH^vR$N&U`v2+zdf z?9F~KQcaxqd$n>$7%dOJXnzYcNfa~Dt{DD!_l9_2jUFwz?=Lm`T4jX z--7e_DO|ws;@B@z{|ipys*7Yj`Tt5@hb#UkJ^=SEwybmiJ{k|>GjM2e$*;u?_+dPR zNAVc`4%aUs^($X2>xttn@hILCN0yZFvv3-ph%1(o{0iKU@46 zPjVT_H^Mo*Gp?wR{BS(5toT@5z-QyCH6*_opMamlIs7&r!$0E2Dyd)XQdwU=-UjD! z1Fl|M#?QvF--%Deqj(TU){*=!+<>3QS^O~$uPfshzf9JX!|UScdXi7aaeN@|!)-XS zzKlNu58`Wa)drG3h*S6#91lxAj&peV%Vm878%e$?j&3ZjFXnhA9>qPlVN)4@0nX!F zaMfm#KZ%EaFMba%SuI{{ko|?%#Th&ekKzMyY)h%1hkNlEIEROD)mAe8L0rGJ_+^~M z<2byHx<$|@d(}pS8glgXW|U*#?=wYFTf4>W}L!L;&6?Oe;fDXA8|#kM$KsvRXi68GX19>pi)0=~3ZzmwG8j5om#;Rt>S_u)@)8ZUX3tUq5b$6F6q?kroVSE~nCFOWSxEDW+$B&l$H5{EM{trG2ul852H{KRkx5@Y!IMyys z;!%7$j?9<*THJsi!CCw|4tL1-A8-z@c8#njnvy(%<9G({!>xD}pN_}zb;bM`Io=~U z)+v4iS9Y@=Jc8F6lJ$gpB(K9!9K-qZC2zwO7l_ZoeHV&v#990}Ui%`+-@z&TGakWJ z*Yf?kSjJDm$xFls;tX!bqxftbzf{Km4X5!FxbZU9gR}S-Jcg^Tll4?yF5{=-3_cK7 z4@y42IQ|Op*|;Cygd47u{0Tgc-@}JoCHdml%lspFeVoHP;0>>q@o_wOjkp_U@BpqD zlKeK@h@Zw|_#?dRbuxa58)Q9=cmv#vcfb_n<01S4F5pjb<(*Q$^i8s!B;FAB;hk{dZW$lP;d{j0 zc<}Gy3vdSCimUFE{2#axzlSSFB>xrn;%k&fplXx?k$&;Rrsnm_H!-b$9?j zf@2R!{u(ae0zUF#$ydKw)|1BD;w;`5haZvgb8r-&g3}qvug0VJejIy3@|SQg9>+Pn z{4KJcswZXq?{Nz6hDY#Gxbi6(zYtgBOYtyH*F-u z9uH&xS^;*W6U+v3IUko7d+b#U$-$+yGNym%iR$4B5^yZ{g4GjSSUiL>}-oWqad72cKk zUcsaIQ#_7;#qkeh{2FOFpA_B{_u?tI5ATTw@l1RJJ{qU-@i>dm$9a5xas0=!p8N0! zeietuB>x6S@k)2HKNedqq`x-D6^o1azp57H*Q>3@(XYl--^fZKXB!8GX6cB#J}P`y!PF)zU1;U zehSXx7#>78)=WqdkjAJ`X{bD1so+Mru z$99o?8qVSaasRH8&%=@3#AoA6@Qrv3KZ-+tknykMIQ|Z&@XGhg`o{K<@tfnyJ;l4@ z{s!?;IE@$LioGSj7{~DKco=8#IDQ{D>?8HR;znHcfUGZ%YjJd68NVMM!E+?(+~{$i$3q@xJkEO@ zdd)Mx$MqgJdfeynkjEL1^B#v@_ss8cy~m9n_jx?zamM4k$Dubo^Lt$Haihlr9*=lD z>T&2z&wL)oJ?`^(*yF6n1&^!Va?cm_IPP(;$AcbcJRbA7;%)bQ5szaY_j)|!@u69`m>&@1C#P<3^ABJWhL@_qg(1_wnmJPI)}+an9qa_uR*e zdED#qkjGh%$2_il-+lagk5e8Gc|7WI#Rs0_dEDpmkjEL1$2_k1(0%-f$4QU-Js$Qr z>v8BK_wmCX$2?AXJm_)G)qC9M@rcKHk1IZLAFtZu zn8yPik9u7Bsrz_QkK-N>c%1b(^qJ>)9;ZAW^f=>j!Q<-B-N$e6xYy%hkMkZ^ec?V{ zy~m9n_j^3zao*#KFWtwl_PEjG0gp2t7d)=|%6@;K{p z<=5`xHF%u#IPG!h8+U!g*?(=xq$q5 zT~)jgSFSD|zzu7Nug86BitooGYl)x3<5lAKaP{xR|G|yxh*x|>)<3wecpW^Br{kgZ zB;OZjaiTaLcj3tTGX6}Q!dKxOzOy)f0~w#iar}01JpK+hgk}7)kIMRo@$d0C-W^9b zl<`ft51)jy_)1*4k&M3|$MGw82!D&maAii;6WLhmx5mAAU!1|MxMC9-e+G`>>+vAY z;5>c{S8poyKj9Q!>oHl+2%d^Vo5}ctaRW}_0el`F#kb(_@1_2qIEg>NX}s9uGJgSw zaecMa?}GdBQ8e_`l#rJc5VuD|j4#hof6a{i;vMdirn#XYu~Ha!VQChU54g zJcMt-WB6$t*-Gj^#=Ur{CuRN&-WXSGE#r5^F`U4I_(Yt?SK{hzr2c-K!mr{HT)?4i zWqj3BvYrMU#RE8wM{zF>N2GobC-DeQ<566|1zcYv^=th@=I_VTa1I}et7>I@H*Uli z<6(Rk9>*`@Xr0uL<37CdKV|+b-Ue4rk@5TCIBv&7_&hv@Z^MzPQvW>e#h>F0UOp@H zS4@-fTi_Vp8xP_n&f_z2^>nHK8&2V;@Cg0@hoUlmiKqGgi>+B z_-dTS58?uT4cBik^*`W#yv8%Ko*b^jRXfP|192nnz{B`FJdXcT9KWN~{|)ExUATTH z$sfUK{0t87Ecq*V0KbPryGZ^ePT`+$9xwf@oL{V7#;=Mqcxzm-tK@s*7@mo9yGhDOkop$fk9%+qpN^~cmhqS3Mtmb4#`ofJ{1lGvBlR!iKKvoh;_q?gzA}EP z=jHt4cnv&+x5Z<49~_w>^)qpLKk>X`et`Hi+>8H;Gk6iMh{^Z|a13YhAbths@dvp2 zK&k%*r*PBD-Vs{cX4xKZrBRj(+>al_Ih?~)O)~x++=zd~ z!+6;jxgN7+{6;v1BX|Vwj6=;begIIy(9tsfVBCP4@Br?>qxeJ| zo+tI^;3U2Rr}0g=fbYfiZBqXP?#D0U9R3VfwafUQ@!)*%>i_0?;Eix~hvX5Q!aL&; zJOhVPGJYm*z)3uS7vNER8V(;L^%vnJ9>QsSJ1*ddaDAuLKZE=62RMhn!?A7|zv4@B z{)2cOoX4Bv>K++C9jEXfcmyAeLknbl6K=pAcmSV>NAWp0e5}-8fs^6hjFV|aBuh&RG{9KqGcOa0C`g=gRqJQIgbknu^}fEVBad>S6b z7vb=UQa^-~_;#Ge58(oS2G^e?^`p2Se}i*)@mIJWeKLL>Jcu{Pc|09gpDg3|z$tt% z9>GmGbc&4czzz6BJb=%^qxcFOK2_>(!byBDPU9zV0l$drPm}t0a6kS6=kPMG%Jrx^ zUB<742hR{ka31fBtIw2t22SCbcmyYLs9(k}zzz5`Jb*94qj(61&yxDvaS}g-)A$)& zz@xbSY^nbU_v7zy4lh2+^*BeyuZtV;RycpId!27C@4 zz*pc=d=m~|Aocg+Bz^*?@r$^C-@)|*QvU_+$3Np7UiLMv$AvO}E!>E=#g!LHzB3-d zGm7IcmV73zxI~=9X}kc(FO~c>9J)+=5gx`vICi<@x8nkS2oDWP{tRxoLi|1+z~AA@ zDb;mB1|zYp%khv5uv#uZn~_+xMkpM(eTIXI68arIxN{zja_ zci|EIC=OjCI!@yKa2g+u3%CW>-yrqJ z;C_4}&f&9g)r~U#Qrw8I#l!eEJdW?j(Z5OkQ@9Vmh_m=DTzQj>{{+YJ_jm{|_NH8) zF}x~H-YoT7;56PIM{bq;K-`Px;tcM>6^ms2pK%PIg9q{DIFGN#)wfCg9XN#_#3T5h zICQ&=|2J;H@8ALa86L$y;P4$%zrW9}oPSXAt8w*1;=6GQKZ-~2vpDpy zjDHn3;P>$W{tA!cpKif&bNB#Um67pB;6^+b z592O8j{l6Kk4gOi9(i0mj6+X|M{wVh;umlhe~2relKg8N$G_qsylkHRgV(^3e@Oj? zxEF7YGk7~(@lP4Q2ae$b@gV*a&f`{Got63?oWdvL5qusFJuTy}zzz6DJb>@Sqxf+g ze^%;W$3ys29DZK%#olHA;I(iXZ;T6gTU`Gysow$jMy{3_)46`H{r?`W&GVZjvvKC_*p!LU&WFCllu2@Fa8b}{w?_m@5%M6e@VP9 z&b%zH!xgWH_r@`NC?3R3IFH+L^{Z095U23zcm!XFL!&bOYTSTt#sm0XJc=K~;n$@8 zd7Q+r;WYjb7x34({&lJU75C$1-5)`{0YwB?{UR@GJdfSXIz^0CxE ziF*B^wrM?ai<6ZDL-WNwdlktb)K0F&|aR;va zT*e=dQGgfGTp_!=DfLh5hDz4$(y!B60dFJ=4-IELTAgZL-h@Rf{T<|Da2BX~7j zJudkMco1)iE54R|I_|}Pz+?CT9REhfAAz%YE{=XHc^4kWf5uhcNqz-x#JAx5_mV$> ztN$Z@5vTAwcm#ieLqEv)pK$|T_G7s|19&YwiZ{jKg4EaHB;FOL@d3Dileqpzsqe*^ zpTq;W;%D*IIEHV*gZMt2$4}zwU!?v;oWgJ85&Rhr{VL-NxB)LU#`VCf;!(UM4*yr` zcfdpc6CaGna3hX{RtV{@cHE1P!x?-gu2@XQUxH)!T0Dqv$9eo9u3lW~vp9uc#v}Mk z99lxg{}=ZyDPHpvxgJ@(F|J%n@(7OOo$wIe2an;yaAawzZ^pg&7@WZ;;fiHs{5d#= z2k{`j6X)?`xN%vje+>`gkMKDD7Dtzp@u5%U{QK~VIE#OWE0>q?zsGSr1rOm}@fhA8 zM^=#fBXBS7#umB|l?- z;8k$tDl&e39LLk~5Z()iSCjDxoWyN7jThnqJ_FaUF7+4VemsP8_%>X%hKzpzH{yTd zVf+#v$M53kno|EI?!!OhEUx%mu21D!GJZoG$2EAgO7gvNcx~|?aT3qQX`I3Zd?K#@ z-3reA=4{-LFUL821Fl*}#@~q>@gsN`Ka0olD2}eXf-~QTxDS7Wvv~P0xE|}t_;v8W z`rbCe_v2`_)IWv$@QXN$KgE@s%lM!0z!u_Fzmn@Uir2^CEhXOq zC-F3##=GGH-XGU*CG|6LKc0hgxD!`xE#ptZjreRlj4#9E_&OZjM(S_JefR;K#s9#S z+sgR&a6SGK_u`-M7+!i@u2(!F^&8?LT!X{4lJA0(ct4!RN8kc(#r1Vke=P3Dr{f&H z7*|b^@z>%;d$8Y244pRRm9@$a6%r|oWp`FBQ z;0C-g9>6tt6z_t=J4^k3IEjzIY21nn_*h)Oi`1Wv`|-s%hp)v|^)mhr+=w5>!}wV| zj$gykU8TN&lX%H*<$4U^N?f^{j9(Y`;b}OF_rwjm%lL!w0B*#ixE+W0knzXiBt8?T z@g=x`uf_FyO8xD)A3un5IE$mGB5&2Z#PBc{OgpQ}F=a4Uggj zaQHB(KN2T#D^BADxPVW^^>L{m!2S4YoWu9ws>5acKk(p8@xO5%=W+EBl7E3y_$NGq zm-#`iSLjF?zdCNf8{z@H4Iafi;P9WMz5yrkp*W3a;R5c%RYytvIXH$d!~OUUoWqY4 z$2Us-Gk6fcg7f%2T-_w&zr-p06CS}!7q~vNWc;eQ0k4k-@D_L!Ps8EaQhxwW;-m0b zv*btPNQ-y@?!~9z3_c%M%#rbb!7=KA2(H5!yrg>9w(?@3(77i%Z{I@em|GLGgpR$jvSG^o^Jgh#~(O>^l|I^1`)Va9hHPoNAcZ@m=ZGj)cyW+8w#xo5J?c8?uO0A^BlX{j#5wi<`l|)^;f1)~NkgIYa7gVL{dFDgX8m{I9l1Ua<8jvi zEPf8Zj;C;azAT#a`vtGS@t0SR>-~BI$6p(NE>CBnYP=-%+v5Rs9R0O7u4nymdtL!myLQ}+e^bqRin@i$>fL!k$7h6nzItLx+d`md#T?x)klU*gj?5f||1e-tmN z_K6r^q4qCaKmFI> zIi4xwE7U&G-u*Cf6%HRE{(aGWKc?V&INlz(iu^#F<9g1-!?+!X7=Ju293=Cdg}>u^ z=)a~#uW#K$B-ek9hxSmXSpT&O+P$2w{?Gbr&zLItd-#M))r0Em8@vcFuKGfcue?t3 zO5AvjcpV(SOuQNXK)3dN8r`<3lH@*7e^iz_uz(%_*8AR z$18cg_7@z(cj5t@rM_}Y=kTG|@Qk?lTina*ljYUR4t@T8E6RME;ld6wen*_%Uwkm` z-bUPp8}TVPIz{ro;>_0KyYVo77Ejqua{Xg4dOc54um3f^cKs)kFQx8V+F4#t{SGg} z5!`&PjMpCn>G5w~B-U@kv_H61yZ~Qvp?CmiFBji}3+IR*!KeM7I*9su6%XXZtfu$m*h9%OV*eDKZ0Xe zKac43+_R44AK-OAm*f2x7s%I9&oj>Yt7N=>-qDV)F5~ycH*h}sb)n7+xC=joPsiDV zWW877&|%^`@Goo2@gK*FnD14b{#5dDd==lH3}FdmfK@{FTQ)c>IgUi?8Bd?=l{*?D3i& zujlc`9&h1sjmJ@sck*}-kN5NVP>+xDc#g-t9-rv(X&#^F@kJj0#pCNd*1I5)nAOoS zFVWtV>Ry;?sYx8u(=@+(K~q~-G3lA_Jk)wzi+W^ETSrrOU2P)OG<#kNd*)9((9xNQ zsi?haUQ6QGj?QL%Aa(Rq>-@P+(Am<}+T7FP{CPo3qGkSqmbQ*mOJa6gOH-#BTl!e* z{MK&IL+wqSdgjtmU8-<)()(btb&gZpnwXpFT9}yA*`iNiL2IH^9i6jUyAo=3Z3`2} zw$5+vI9895M`yKl%$}EMYE%E`eXz4NHCvt9#KTgXnA_q^nMyRZr`nr(6U{BNn-=O( zsl@D#o>W_lTwZl86Z1Pd+nd_ts;YQyTgR-XHnU3eK%4sJ$N}bew05<$H+8{|Idi&N zx)V+Fn-lG=y)s0fnYoN9=R}KFFqP=;m`{0g=bY}uEcG2cwn?9ZL&}^#&*|taN#qFX z8{g3xNwoB)Iy$>&^~`T>Q&-b@utt3gXLmH0&^Bg{{zfvsb$)kCXR4#Esk+Ttpl+u1a~r>!OBdQflwmhRHyr<&%r%@u~Yg3!+p#?3SU9BDS zWl&dlXG>Fi!daL55orv)9L6-as6TY5jaBlPStMiTwDokUo+ugNJfbdmTbt|QiR(sX zYsZ3?*{$wX$@y6y?C9b8Q7%JMEiG!JmdviNhp&Eai@(}=%)d-^+bDjcn8j0H1*;qR$6?dYvLUBL!~R!KDM)? zTXlt6g}x-aC7PNSxK&faS*`3I89QrXcZ=*MvAVI8o|Zf)_Xcx(&C)}v?IgQcMr(Rw zbDG5=#cM1+wzJiB29DKDYp!gLl0g$!xb#7DnM)t+NXf=6dCap6XPWNLp84v&%h|au zp2ozPBwUv+;l6VEj_kc~3DoyUsz#0Bd4sJ*?V_-JQGS65q8 z${8|8JsIoo?}9|KscnuqS`i5u)!NoE*BR70e~!M(El8L${fESC^}MN{V)Q0nkVwte z_gUwTFo8sI#$xKUnQOfBh-+MTi*x&uqjYz4H|d+%f<$N2u@e&%VG8vFrqIDep)`p) zg8GBL>!_zDIih3za>t=webX%cq^D-%p3~Dli@|b7l56^ZdI?rI=j>ij!FW(r+Kva z5>E}OQBSQ+UFvL|KbvP^N2Q0VEg4svC>>X;Rx>fBemUrU?pFuX533g!u2&O0T1)|64k(CDMW30&e#_Oe3mWRkJgdvkb4^=3OuIVgx%$;gaj^5E)pKy?F?YFs&F>lIJfvR8wdwXR9b^gTv; zt;>05!wk;D?z3?oaxJ_qHCx@NI@%M>P2ElAi2Bh~XG?SI?1`(UAM5T&v~{VcB4$v3 z)(_3@>0B_e8tEg;derk_ck68DeXn`x$AL;Bx%v4YFWw1@$-?>FNp-iHxa+7Fq4J1K ztzY$e$Cf;|21fds)*m{zCF>zun`Iwas$3U(VtMKbxOC4=1nL>t9>}XB->TGYxx1-z z;yW~PB=vG+_PmbyZ4>>#n;!jMMtvk;7Hi&pCt5l?JM;$uiLO@l#T~PYS+#ct>Y(njVo>WRdEjOuJ^-uNECzP0VoVt~VoF`-bX5L9!di7gU z_4K0Nm(FhM&`*E7^idxb=vU72iGg~TtzWmyk!RPoW~ab;@uS|pJ0A_Sx3terstNV~ z>({pG|J&7DDCZB({Z2ig{$IV8=~gc;=GROMB~toxhGV+aTWS3y%5l``hV;qK)-O5q z|LcRP|99@k#n-{k>%H0PRbe98(&n6JLS3S^CiRAGu09#{d4PJMF!5GV-t@KV&j*^- zrA#)dUZVYVU$ykAZxC+?z=k|Cg$^6M}O|3KHE^&L%m8+p9d6s z0m@4UpsydVI!YgLjp1d0di~819;nsdzu7(QJrf@is80$KZLRb5w@J@k<1Em?wU8QK z;xo{@kQ#YGRI-qo;_H#(Ld*kdA;l)t7i8jP^Ngms>Nelmk~pljJDJ$MWsX{@^Im@c zmSfdNEs2AgQpqm;-d;T`sOx1u;*h(FVR7B&fs(~eJXZWb#ynzPKFN()f3_nxKegp& zsZYq%$4lzdqC|4xtj^YEJ-@j0L#IfMIY=T>V_u!KuJmYm?exwpbRa{;57%Q5|1=x1cU|@sIj4JDoOdih7r$--$Ty+~%wO>AVNfaZC5? zr1N=Ks}mFUi&WJm>9%{PBXtGi8;zB4qXq*a&gRPSxnOFFe={lSKMSbaj-qCN=YJH+GabELLN zq(=XvR{x_;|6_{&$5j1~Y5E`2^*^HeAKR&a)I{_@bVZG>sL>TQx}ru`sJoK-hpwp6 z6*an|R#(*OidtP!t1D`CMXj!=)fKh6qE=Vb>WVsDQKu{FbVZ%6sM8g7x}r{3)ai;k zT~Vhirs#?(x?+m1n4&87Ib`pe+M0w4^q=ac@u%9_i29RiB>f4f{%3SI)m)vkonF^l za@Ru|^!>7>v!x@^om5Xr$z(^H{`lGdn7Wa)t2gTER=MYl0}ePy-w-<5n|Dhn?0aY| zWIiiZ#rhM`)|zefT~L3-tUqFPUb}R+w5RmVNj=uCUI(l9mqqKh%*B3BOi_E$S(3Wn z_oz<-x)+v2s#o<(bNyOL-I`V7so|xMwRNbQx_-!+)@gEe;_7f}uX-MjG^?vIF|12H z392igcbfWe*)(rc^U;Y8_1dJ9_aweh&sfa#sXC4AJhygDOgPc)t?j9vHr*f2%oC5N z)T?=Eb#oBs?x3D*=Ib@NAJvnVKA0$3y&kFiQ-98Fu0-(xxn|rHIYKdWuH8iBtWA9@ z)T@+|OU-Rj9-g?`GB{-&>pbcmD%)*hflcZuK|T4XjnK)m^dn8Pis#zx=9xL$pI zr~iiQ%b38`$Z_;J{e~fd3!XU2Bnz&Yd?Gz$l8N+?z=`z5o9xPzj0rq#8B_MkObiKJ z@WhZw7F_nq$Wh8(nTa8R6Y1|#4IiWho_6V=z_ThHG}&}z`-KDPGb?)!P|GfRfjCa> zWZO#}M~|88#PpcS&a3V>%%#UnHkTe#ey-or!!-;lKO2K4n{M)N*>vaIQT|&dW6E!| z>CU&~w~U$W#3uiiO;1ezEt4^m%~keWrW9l6WKiHYr?{r_ zn~x*uL6ct2vfHmX-4u1CN!O$YO*)+(6!^`njZBG7zFl0S0w;8h`fW1?ZkOV*%5In9 zpt9SgbWq?0Ee~<*~6gb_~n%dstQ&r$4 zC><2ISxN^@HeK0Gz=6u{fs!$kty=GZ-!f*h6D#|C#(K)`k&-c!%~iaiIPdM$4Orge zO}sf&pUn9ln`L=S|IC`IQtxovTh+f7RpQ^BsyCSGBNP2|Zr*#lN@mZmN$8J>olm9% z2dICU&xi%b$WOF6Z#GSRN`HEzK6yB%^sT5Rb$+nWQ(9ZL)TFl3y0WF^(<#MT+ks73 z^3HnVbf%UoHKDasf41dZC)=zh3@Ft*JK*|HOAuO1rqgT%Y4_PPong|Tr6J{jcsO=@45 z*{{}OliG{TjG^jXmYpHWCx1&{TcCB@0liFuC`!=9Bcvq{L&CazJo76tD*}DP7 zlgwOh_sZT5yv6gGYf#>l0GGJB!5hn&>}b&wO94zbK=GTV#+y~9E6`_~Cg zXIN%5nQg{^p5dTnXSDVUg+ZBW@t{{Ts!y%ODZ*6)HbULt+NJi zVCT5yXDzc$gYWoyiP53VVTin zwiyH3g@cxz(b_B&24$)TgYNgLvNZLbhziSW*V5EhT4qnG((ssm#t*so9>kSxso2HF)zn#|_*|Dm7cwHmeD(vj%Tq=eXr( zEwfF7@ArC(m$~0N`+&wOgt@d7{b(P3cAxI_1~bF!d@afg<|poVY? zO=u|$Y6qvVY-qZ{a#WLfwt#a~(+ieDli3Q*cD59n%wA~iFK0ET3v7jED_dqXnY}Q0 zM$-Yd!tLyz3pqUuoRliR%rUbQfM-Jp>_W_=NQx@PH6hT zGNZ|CGnziI7P1;!q3Hulp~>up!RHv%BhEQ)Xa8ulB(wF1j?46j`dP@}=MfzS_J})l zUj-)%>JfKnDKu^1xqMEc2`z;|ZQvA^4NV_dj%qU7a!ems3QcA!G<{$xG?~57x__K= z4C)alG<{&1(PXw61A2sm+Iz$aO&?fhG?{Hi(+AeVvNKwrM_5hJ^N5bi^vKk5J)*r~WP>(pF=>yA*CbP{L&?6kwzGI!x^nqnYli6kr=n)QDc1CNDP#DxBI`+RoNw&__ zKZ0+2;+f{|8qX={bfRtC=kCsIg{EyRh2=8S7`B6&&~nhA#&DKeHZ+}KIjYHQ%b8ky zy=*PC?r&!`K^^s5!g5Eo?YRqjY=x#5 zEi;CQY0cEW(pn=~_xXFI3~-PheY zXi(!#9-7Xx9MxpD-xt={(C(O=eq8K<7C#mdk<~&ncWFWRF;u8uVegb5zrLmO_)+ z&M}}XIjDWdI-%)2%Zw(o%^1*?9JI`grt>T_n#?w1Kvz05n#^8k?Me!RUeoHhOjmAK zwkvfS)RpecvtTC-=*mem(|ERnn$UgSor4B-<>aC1Jj+o{W?N1`=Q%T$%YquuDV!v< zb|r=O9qWXq^DO6RGTS)@bR`EZGo$G|%Zw(o%^1*?&Wt9r6`Ibo%xE%uVenNA>Plxh z0iRfwWVTnZI+m{V{MvSEs$NIQPf#bE2PXb~SxVK}-;Jj94^apFfV9pg8rgjT+?ngb zIgx2&OPR@RW!9a+A%in}gF9s=vaF=e`c{&%;MvSA!+!!MvdlImcs3JR%FM0AKbwiH zWt@PmEco2aZNy(@BFk*%sohpqZZ_M~lk*Lj=6tGe=>wheCFmJX{TKbs@jX+QM(*{hB&h#NBVSQa zzo??J5#Msl@$8#H9nUn3ugE0+(+y}P=Wu~DnTGMrWD@^O0j;EFGKs&)G>mU1lh}%a zuAXT!f021J>YK?VwxXb!%-dI6k+o^ng;4)h3bmd6uQHuT|FW_7cl*?yR7JL5Lsq}C zslwpTV00MJ=_(26^wPw4UK9Q7y@C^ozsPi=uSgQxO-lXbO;B&w1^0GozHn>TM^o_O?mvJy52%>jHaQB>}x%n)oip zL#zf*T3g~S$Q*dvqpBM`2?J2>%T^hMpsFI-GE{%LeK@F^m%0|{caEk1EMn$HB zeTy)O=h`|&K{EyQwkk3m?3>9X{+Ub%TZ#hD$#k%<$Rz%m0(x65+$8=Y)4{%(Okyhv zx_YMTZAI4JR?7?OZ6~t!wn=Qgt^b=9LBEi!c1zInwn_qeyEO5g*F*<#98Ch^Y{(EiTh?Cq~2)8xLHOyZx(G`XcH za3<5_z9N(OXEIH0DJnCQwf)uE2DQHvS=-+v_8utH{!;_nUnK$UUz+$X#zd2QFUCaT zFA8XXHB<0YyZZU6z}}t~*xRLvXB{ds9qe9wY2q(39qcPIiLJ=macZWZ-d2(6VBbt8 z@y}#B*ivNQooXi2!M-As_-6{}ZRc=-Gno$d&14e)OaZ;EW-^Jt$aJu8CX?8Tg1%3t z>up8W-d4*C>TM^o_O?lEy*;hmQ@aWS-jb^%ptnmC-+4`Ru=fg1B>tj+-c~aO_qO^m ztiax$9@yKZiDw-u3h3?9#9w4O*nP&T$RxHR>z;9n?0ujj)4{%(OyZv@ptqgF1%k{SUiKxH^i3T=EY2sO=iUJy>H1QXiHgI1KRb&!dk@Z{b6xlDlicA~$ zW-^I?rho=<4i`9+X#?L(Ch^Z?+Q3p2IFo4uUy(`tGnqE96a~&?+Q3(268}sA4Wh1| zNo+;dCqJji-XKn7Z4i^#8YEh-LDUZ?1vbcbfelicc+N~k0S!``_=`*%xG%gaGKsB- zZ=|Kj{w-F=Gi~52GKqhtfCh067dVq?1K&(0@y`^{AZjL)_=`*%_+~PRttjZ~nbz?a znKtmvWD;9Z&`d!MqE0v98Kg9^&17v5rzq$dWIGzf^W%ByZ=O<5Ii;VdxIa%(RmaL0 zOV{B-!uD51T6I{meA~9%Zw(o&1m+pwa|KZD9&hm3MkEjc2@956+Mx1`%Z;H+s+kv zPE%(Ao6Z$k%FMQMUmRU#B1@UsRQ@s(S<1|o@|T&&Qf4-kzsy9|GV4~;=N7cnbY?b_ ze>M|YW((M6azy(slgzrwCL-G&Q)!tkR`%AW!k{hYiackivw$t;iY#SjAGxomE;Es( z%Ok^oD`^aBrB5Rp-i|KO<+G090`^Z0=i7c}PY%w{aeTzwE-C`4w zZHuY2%oeLHcNbG(&=zw=o-@>0z!q~wmNK)C+}Bf=naEOR_L0BLM3yqMkNjmOvXq&9 zki*#U!(Cv5CmG#Z+2mi`A9eVk!*UVy?(@ zhB^z_Vy?(iX7-W$dg?M0S<1{l@|T&&QfBs%zsy9IGP95TWhSzgS+|%zx1cSiGqaEU zvzf>;Tfi2RBigr^WY#S<5!tqwO3Q4qDdo193WK(oEApJ7&H}cWE3%ZCedNBLy39nD zGP95TWhSzenSJChGm)jt>?41fiL7PTEvC;cXp8C0>?8kdCbG;Hu*Kwv_AMrvb&E|z zwk@Vow%EkK%TK8Pl49_C&#C3MoeG1toh$O3wax;zoh!1GnZ4z{#=6WzmNK)q{ADJx zl$pKdFEf#)%S8|zhT*kXBbx&2Nn*9R&L>H}BgIYXTV^noj~l$p)$zA(DX zM3yqM+5KfEvXq(4?k_WurOa%0f0>CaWoEPc%S>b~v+hiNNrL)7XJ)heXETvyHnZ7n zW%iw^XEU4KUuGi9Yyo{BM=Up+wGX6BN47ptX_-ElUak*R7}N)@$a97|3+Mw^WGOS7 z-F-cEnTafAX0!XtOk^oDo84b#B1@Us?EW$nS<1|2_m`Q-T4wD7eMy4)KxbyN`)4ze zWwwAmkR#f6rq0Y}_s?b`%WMICAV(}Wo3#(5ET|7u>VK`2Yz=;?6fM^p>R+qbe=4J= zH1V9WiURtgH1QXit?$0Ns>me%BD3**MJDkVnQiYYGKsCoxzDA}~d^4HE zKa+X6ZYi>F7d4YvJ?f*WE#s?WD@^O0Uf6nZW4cyX)51LCb1O-eVk?9^^ zkxBeTrh9xvCb1P+zh7#3L4Bnn(>=bKOyZv@ps$?6*>}5&O!xR^GKqhtfWC4L7dVsY z9^XtR@y}$s$5IqHlj$B`kxBeBneMR^m6^%fSL#9p_m%1#c?xs=>*zXtpj6jFl^vUE z>gr192RtL3XF1nnwQ7)BZ(D2kLj5nYQ?2voCTgaI60_PmX3y(tJ+4Km_;0CQkMSg` zC+zN+-=d1Ux?9wtyPa}pA@e(0yISV>u+Pd_A-a{Y98DETw zKXl>^7(2V8J=HY7IT7_(9hB2hfpfq_S9en@_1|vVq|V3v zVAHIU6DeM1eFYP9+d5`7wH2qHsM6P@r6bYa(cD7mf|PT;)a9C&Xlg!MhPwZL)tYJk zzhAXxn*RG$efQCtX|wg;tJI~wZEgB8x_=LqbmCT8x@mo3$+j(K*886?v=mzJfyKhI zp}7%Sj%qU7d6@f}rO;%yLUWt46q?LlNLyPAEiGTX0OodODKwdFM%&G7;-F<_G`B6w zj3%?qXuGKuXEd3;Q1^v>KL*^|)N%D+8dL0iU#$)U_p&>5pQe)q?PYgpDGb`KPGQ;5 z>{rWCP3F0H&QZ;NwG^7nR%rICrO;&dLhD|3R%4#5ZG~pPT4pqvy)bx2v(IgXX1`iy zG?~3Hc*dZ;>|6lbf7Ol68uTW_l^)Dc+ndbc1T*>P!_qphF;7R`oB^M3yqs zi~cebS;|be`O8dXEwgQW=iJPjR7;s@CjV?EvX%wT7SLtRN^C!VEc-;gDb{<_@^ZaL z{ZLcMUEi}9{qs=fuJ1kvS7a$OJH=mSB1@UsDgH7OS<1{#@t2v%Qf79Fzsy9IGP6_s zWhSzenQytj%tY2Q>u%8BfS}!=Gjm(@&t@XaZ1x+j-X``B{?rE3nYpFmf05bez9N(Oi_9+f z6`90eWcIkP$RxHR>vmM z(?z}_llW%}XfNk*fisy7^37xt|4ad`rDigTt;pI~PEpV^i20dC*9Up}Lp#^UfBFH> zh|-rh?nqqtj3ppyva+8vOyC@17Se z_gS2T6SuX}z2MDCwjGi6PUOw}W!8HUW#uw+JMtgWM3xgU_ZEMdi7aL2M&U0rk+n>J z2i>0%ac<`RVkt8>3;%2;vX%wTX6`YTGIPW5&t@WPS>SBey9wuQ`=G)VS@x{{gd^bd z8|{$b5%=MJBNo z*>;(}dS+Mni_D$SHr}NK z*K2t7(8Npl;)`3)zpmF0d;g_$ap=Trb^VCE1m`vP)Q8jeYDb+R%>yF_l$i`O&`|UDOKVS^L}gZebzbmoO46lY3KXi_vU;#cdg%E z`|Q2e+JDa8XYZWTz7v5oCoqT96e)G2T!Mjes*?8pJ4I3_5NUm1^s|C~R?^QZQCXE(+tb+59248{ zsQ0?&7SWzaB$~Q9dz067?MNh>L7N)e+qX1g=Yz^gBzl{Zecg%n*4`vSnl&uO%TVRQ zergzfo5vo<_CT3~m*e@f^HPL)Ma3g&SJc$U)SN2q(Qu}UFt1c&xU;&V#yq3q)i}U7dx$+tvjrj#td48syC$EMRrNz-U#2|YBjgdQ4MLJy5pv8L0= zCiTcwNlD)+g&rzdSEf}dHdV4DOq(nTJ(49itV*P_)F$;XMoH6HY6(45vV>_>N@JIMP^eK}xUCO#vrE|3wr%PLl(MM`E(UVU!AUTYB5y`uj*zKd(}5BPFF2#;wc=Hrec_e6+^Wt@+R>ViIdpF z=`=#-Lh(pFMedP&iu_XPdlag9eVRfw#c2xFE}la9G=*wjou->G#c2xFE}p_MX$sZ6 zI!&S4#Zx4nrcm{;F~k0CZHa}vN zETCOm2`!ZX?fOcXBDHG_sa<6W-G!XKnM2}T$dse4)py8G*QQnwO4YNFWujUFZ&5tU zcM`GdBx27=#Ez4Q{U#B+O(X3WiP&ix*=6i9DPxamqzf4c{^LSc(5@+@c2xoGx&qpj z1+;4`p`{X_U0(@Pq;`!VwW}gehxI}EYL~OW5+Bk{WaE2WYqLJGvSYq*X3QY)7 zokB4!rx3E7A`v@9B6f;I>=cREDH>@5Bx0v%WS6m1q>P;+5j#aA`*rLTDPyN-mN-x9Zmv`{dT*TqRmB1`p4U}^wFw0p3o5U=0DN%3i z*GZe@FC}VcwU(HrFC}W13ronY3h3_uF|ab#U+1yApj|#)NVOG{7Y}E-CT-pLy1nfq zgyv|Gf=y2q*&GF){Umv<7kKuP=}f!XC$vZ z1J&3wlILr^JVU}%i!m(ss56wfGoELiF+Vkpa>0&sb4o=#dj>pvL-JZf@azrATjA^t zgmXgz&)$%{72oVZDPObyRJ`_*45uzj>S=jQe)XEu@$#746U#k4=9+`RXitwJ*sM#- zZ5{*99s|!Flf2dtJbO&?RycbM;p{Q+>@mq(@!4YtXOBr)ebIp37xTnVuY>J5z-$>rw`CyLVVWw+#ga>bynRq7|n+cxH1kYwlUaJS5&6K>V8O5Tdk zW+I%;l)N@m@@_LR>i00yJ)$nSM8s z^1MQ(?@g2{Bmbu=N&gSws$0s*u85W~*4qq~{Q0NX);%}_vVN`Q?} zAVuOf0sFqaOrWb$O+ZA;1lldm#X*2gAiyRNU=s+i2?W>#1+=0B*aQVqByJOI|Ltte z167qyHG%)R6HT1{N7^!h0GmL7O(4J~5MUDsun7uiMG3G83ZzKfCg3{;UZvpb%=)Yk z9>4_pHUgId0XBgEn?Qg~AiyRNU=tM3iV|QG6iAV{O~8Bdy-aY8;QFi=>ca$j_dc6I zfK4F4CJ1+Z4Hh}<}K!8mk zz$Or269}-@3TUkfm=C?=3*yZMG27eX;ZcfaKJn7PZ7E(@?PaNJDAZ@Y*&0dHOR(8e z0&FP(wv+%{N`NgTz?KqVOBK+T5@1Ueuu05^dr}>?l%m;QOk+N}>BB3Dy)1PN<|v|7 zru3R)wv+%{N`NgTz?KqVO9`;01lUpqv^@maQUz=hwv;4nsRHgYwY^K(-VM6ObGBE< zqD(PpVne~Ro#5F_@N6Y`Hd69hU+`?NVz-jc_&^JR2=}D?S^Ia5h@< zWVCarXZxQNInIl%?B$^y@sutN=ZJSW4X-1kjUD`Nd8XUUB(z*R$VAF5CQ^TYJr*eO!RPSGe$lW@*{@H!t`tFR_K6z=jX zjl?|~g-SucdCK&jZPczMrthT0be#mI=Oi#)rGfI41g4`jNRha8#kkmA1(bm)wY?7! zxdss6x-NlP{t~bW6pc+Fz$Or269}-@3TUkfn1w5oHp^B5vuHK2UE{ic!?_qfds*ss z2_jmS;;A;56?nE2Jevugtpv|TN?vOPp6!*q70#w3+^pBo)-qi3R(v)a;bwiN_{wN! z2ajhn`riX(KVH(y6&WlgYAa^-5(-z{)z|1(R48|7pnRZ#a)JiR3mPcXHBk04ARRPN zMa{q_Q8sIdGMa&-1l4;jyo^xk$?niJLITqW2}~m-FpZGFG(rN?2n}pWn?^{9s;~N0 z8>SIbVj7_V8R0HEXFpWZXO*6-k;?y|ciXKlQU6}A&6Zt*s>&){dq9S32S{GqFL`ag z=B2@s*PhV4J=|F^)K0zhQ`b;iH}xal)Q@;mKjKaOh&S~k-qeqHQzyk+>FctwbtUr6 z0%$t4o@w${eAT2<|5+OUvh4i-Y57*C)L8PpMX5n00>@Rc>z5Tpts}N_RZ;1(;*#R! z(ddez7z9cjD=J!9TpW#-E|0BLu^U308+TMRH{m7aJ=ZmLcVE{<>3#phpMMk)!XTc0 zGI0+0@Ds&}V;;`Mgwq_uvy@;&$1!mhg6W*5uS?*+d;60bfFu&Nm36fiHn|1U6-Vh& zk}Y{cbW>1<7$9OEc&SrUQ=+-Qsku9uNH%V9re~(}lD^>V43(aFy_4#H5$9lMdZSve zG3hBG_RqXzdcDaWyhv21=uGb<^r7QMo!+4KqY8DW?bffNytdqoEkqzk@eMlY{iY=TgB$;BzcrDluCU8nbb4{E-{M@AUK|wyEFCGef&j7--SdU` z1ZeaMA&OA=%ZSHGbwL<#8cs@*bQ4CgzW@ZGVw5Txj_Yumc&`kZ`sZTT-yZz%ZsXvE zgzw<{oBapR-h)Tv&5kz(;PPEcf}t1Di6yKL{S}A-5n?k`NjSn$6oQx4!hK_1^c_ zp&x%#@k&0@97me-c7HikI-@T9A=11vt1k4~tcpio3)O{6{PV+e{By#SNb|L6U%c~6 z{r4PuTg(af`m8ix6Ta||eZDZIdF`2%{onM(pRH@%QIbC+{_s4cKR@iRxncL?q06$6 z_KZ8iyRz;GE%1xkUk=|9I%`Y|-|4?BdU{=!+tZ~qDQ!wu>3v7&4y3sfdQ+ODH>Ej_yp-IIc)f4DAm8PYCAS(fndd^AL#vR_uYGyaN6$_B3)GqZWA^$&X}&G; z!c-T(h4j9K`tzhO($+RMS$o~&=%_mLI&>^{wF%e*#r)U=!Nk zqrdWtL+B&+E<*bwtoZmi`k1||MSOhJKl>1cpGQ2CANA+Tut~r1gY&og&p zq2Zo{5pKKxN>O_rI)*b5HzPj2-Uz(B!3e*+dy)7h$w>G06XmZ|Bb^QC$G&^`^P4`O zeW2%Ef9O!><>Kg!*0%n4%4RNa3yOW;%M?F&(wN@%j(^6XMU#`YZ8_q$ww=5GHM&65 zhK=x0JMwt4Ol)t39vwOHo&D3}$9ERQceWSCclPDs+#(8ghQ#Y#%a) z=C>^q$LYG~%f>P%D0oWISeG82_=l&5kyx zoS_!jMs~f4zT_v`2eqgl)VEy9&Z*?~zK!~_`&;|Gf)RH=G%q-_W@(yuQ1L+ zTizQmsQlyO!w+13p#}ABY_}*KyKc{>liB-w#=_$GAcei5!@hC2XY49*eDV=dy89z> zaJLWlglX!2M80hBiGy=S#J(NqAKye>mGuon3hf9pTM?*_)(@QLmIO?m$|_w9*Y&mWxd!=LceB7NWIGAtMSz>iPtdO?m8 zKD_(y(AOC7n-BiOeSR0l{J3Yok9#H65wSmhFo<@4Q{d0eeH(sG!WVfW_vK?Bt$rlv zpEI;%;=Wh@WSV#`VC23WnkauHVFb?=#Qyy8khu78A~<+1ATB&ydjH_#ucPfRp1kjs zs!Z`*^n?3eA)7ux`czlHiTe2h`r~3DhA5o;+5rEeA?2c<`{8IPf9OJJ-VnuEspC99 zP5kof=!2*aSAC4CGxyvn4)&v7<#JzB0lU_~zSXd^9DVA4A4VRz6T95uR1RiaAU#Y! z55US1iqn{=ot_ps8xkk7mcAMiV_B$I zCjyc4A#pMg7h*6NITI3(1~D-^5R9A-i6g|01S6+H;#3gL_)IWzG9=!j(DT8_OCd23 z0=qX983~Ceh&>#NoCt|yp^easbeMBj;Dk>k0|$I!&Dk%Y0w*2B(~+e}cJP+vo!fh2Mb>kTN}+;cs~dZp^|OvjIrl{U5hyo-zDCZ6p|qeW zJ^CU!-=yg-rpyA58w7QRG#y=lb0N+vaefSE0nS34G^bsK6YdkMajwHjhSlM0#My>( z2hPvo#F$C^SDeq_{0E#r!1+_06FBFhvM&TEs=-oEbcuAXFcOY7ay=FY9Hjh)eLt?kXdVoT%J=%#gR*ItjGy6e}j zUAIXJqAkshc-$q$o6B#nG%@mNZ|rH_8l`U^M!UAD$VjL+nrzXDN}0gNV%oP-*4yxq zB)Y958EtCm>ueL-x_UYqHHap=x}v=uc&VU(sI%*y&geajJDQ^^jw6Y!jmbux1|kVu z)Ya6O?CQC(_LDckse#?g!eY z{TOgyyG-&kQK)DW6)u4eXaPm_O)DQneVyw1eq4+yp7wfVPX|>m&*M^ZRN*Q0L$#+v zC!>Jk1DGVC|dReDCw~mv;Y+IFzQFE2Nf+F03~@6 zv;edl6kSktyP{=VK}lW*S^!!Lihj9zqoQS1pd^oj7J%LeO5IqAqGd&(B)=N805l4U zuC984qGdF&BzXX|05k&>WmGK`ExUluiR7<>QhA&LrSdqbX#Go|R30OW)}H{SbdG_d ztyCXXwCpe_rSl*t`Rgvwt3gXZaUUr>jlOvf=o6qTA#(kx*1?>Zu zRBu(ZEQvy=a%l&Z>1tZ5!;3Xupea=n+?xvDLuDwTdZlRnTcC73?(V8QwR~91_keyJ za*RVHZ2%>G7ASdpzM}Q_>U>@TCB067QhhlBO8y%LU5tDWC|bWC6m6>g2}SE414R=m z+zU$n8U-za{H&t&XF#t-_^Y6}7gy8$3$!ePN`a#=0O|uBLm`qqBcL~c4ug^(AJnuR zl=RO>{A)mw2OiyuZ0II%yUUJ(;?|dqHbCtl8)ZrN{cQMNTn-usje^35^h`Rt4ivY@ z?2Vx4zp|@9uLlL8a+T?zNy>C^%arL;dUQRSST^NP;c-yPkJ3XC%k(I`0hsjZ2SruL z?gpjs0Z`I+KPc%x0*WL141Q2`vQL9jyirj2HJg4=ud<_{@Kbh{ukNlaU-iZ;-mfbV3^Dg2J)yp)sW8<_RrtSsLXv-acn*sK%y zJw5AH{Jt~mJ^T*N-ZMMPcVPDL>25T%hrY#>h&{fIrP+iN}38lTsAFJbs>V~&bH47@ONK*Tks@$3xv zdqVpgb1JdWKOkmmfB!4ValN^I6+&4fh>!UWyxxI7-h&CNAQys>#>@1IaC*L*Ctth%dl>)M{Kj*a+0Pvyp2Y7(X8 zeOp_*DliJJ+_d4Ank2S#$70L2H1@VOVW$bLn67KOrDiz-n_3!s63L#%)@1LxrpihR zEal-cg;Z90XIgA#y1H-Mw&tF+*{Nxx-VNilTIam=-7>n96J;A6aH@gD%)li*L4LzEjyjS=6p``B^%`3{Rc> z(gihXF3{ob3vTzk;L~cQcvEw4Uk81LT$lICHC>%MntPJ9U2Exc>dTi^ZrrwULrVu4 zf(o)$&XjCL% z>MgO#N|NCX_;`)0dc%K0&PchuVzKtFyHQ_d=o;9&p-H-2VjP;9vkbodmKdyW>hEvd(z+vt_m-NK)Lx1y%P@Q~cqfi`7Iw)Hf7 zgvtVK+cM*2bW*l@Tc*B39siiHkt+BN|HRSHT#vXhCcFSj)d%8rT zqq(E0dnaPtsr#eqH07VJoZ)O!q$^hpC1pWU@nml%hPpw&F+t||HT;vLgxk8q? zLYBKiR*LrZwd>Tjs5`4;#nhE!Zy&zu*0`lzw&&{D3JS!Nj^=(HTD>NQ?<&xz7M9cZ z6>!qW7U)|Gt8kX!EX5fsq92UM<^H4+wc$wqUTS|*$*Q6v6;xL$H>rj^92qD=}oy$sY|D~Q(t$zBR%a-PSven z>OQ40onC{!Vi@UR$Rvhm|8Dz~s`NN?R1dNO7*|qyv`Go`I66{PB#@7@8$Z={na}oa<_+^W#;thL*q@+V>vXglAVf zC&RY&Gk@y(Szd$K*GKDTSmz-d`mkOymKZ5*!Ftsw_F_=j82o^ym9kd$0v=P_*FH?2 z$oN=yq4hah`x?c%ABCZeb1BT3wz>9Yu3b&~{a8B;Vyz{FHKZ{1ZTO^*Q5{m&4&O&w zZ)6)6UijR?3vXa;u2Biv0n^!`3C{ z`i$2a-u+mgBKgFw4bWpf)_m4s?c6WRTzDjwL?dCci z+5(o9ls`tW4%UD=){w30nCXuTi4(}zK>pUg8QOP3=?K_KX_5~H^qS(}HSvSdOmW=w zx5S2pQ4f~1giby#jHbUFxH5ha4>~4-#=!CK+!ueO;IpBx1cNGnX;;KwL;DSU+INFk zv&VxSnRakb`GpX!TmRYFUkT^L$J>nH%WYW8FE_&HT2UuRFHBc*w}3AQhK7PUVm!~6 zk2TEPLxD*7h2TKqLIJKX!1bXFwYO$Hu3uz?T-OJJ!J$F;#kBEPnJ7P`wcj6DIS1=` zAE1oxzq0&bz%b-~f&ut|()IcpGf0Vk>x+8_t`Jd~v*1GLf>$7$r z+sll6_}i3~x#nvxYwpATbM1T>{`~FN&L5zALm2ftf_uYs>~HYzqkVeR7TC9XZ;A8% z5Jy|73dD~ahS=~gUlse%xBZar4Hz13x(0oEmhC=4eJA!goqGy>SUL0zWQu(Snc|lt zS=cLR#7h(Z6MO5hmn@VC{&izJ?JL6`!qUVG#`dSs&xEFff5zBePJB+hH1tu{s_?vc z>2B=v8=jb~ja(itZJ(H2@vffcW}& z>39BZas|f3x#7Hc>4uLcS0oz6_N)GFvi29WwRDjsr&0-1jEGl4AtuY59VTILb;M zo?(+lc12*s5O)Recyp^9=3}42!m63rv(PZ}9Yb{Ah%F9ADob(~R2mO&_ezDh|kKkcH z0`%U7Vr+M?O_RL0JlxWij5bDfOu4$PmZ77a5cJ@IO0=sH$}Q!Sa7AjelrRhxN5WU6Tq)k5b?Tpi$6V&>Yai zpcL-_D2~Dh@k8;Fpi$6v&{?2^$Y%-Y04T{@G_3`V0~djoWBqZdqV-pUQoNaD&N%3Y6lVRJ5MfJt*E|C`U?vFR08Pv<$cfl+tei{Um4|XbjiaDq6o06ziq!)r!_v zfuhU{D?lSy_lzrARsxFcH-!;U${+nJ(Ru-jHd1&VdRz^PPDier9sz~C{jj3-hf#v0 z-vLn4>oHK$XD=w}vq#bTK~U1?K}GA)UrBxL1;rG-n%0Xz%ep~HpB7L&V<^l8EdZr% zj_6^~D?uLxod;SAiteuPYS5*iGqrpS`hN`g4Cqy$CpE^dFtG^u6w)Psj)BrT@mrwi z0}E;W4N(dOC`>FIMW;{kj)ATL-4D7N^j=MA9i7UL*5L~AR|iV|*a%Agr~oB@+z5I- z>@QKYz8JI^xJc3ZrJzu~kk;SGe(a@`>+9W$*0+P=nLr`tp>qGhRz=J9qmh%owC)cR z3hxCaeQQBU-y1>|>xXDf(;u955P6g~=!L$0&ugGNya@s}OP56U^a4m1S1 z5me>}ih7eh06GtJKPc)!_6R8Yr)&%v1Rh~!p9ZD)8UB;TDdV(};Xmv<;ydaC^&jyc z^=J48GxlWc&B*eNWW1CS@V%OG2EV5=P9x+(;9?-)+Y{Uy4EP=l4&wJ%5$->W%iax(lEbJR-z(OJi4VF$phQ}`X3^%B$);%Raw zbUFfM={T)1t#{Kgmz)YYt!L9wrtw`G)BYBc9{{D}Ny2cD`MmS5G#-X?>3C7&6B_?W zpsx@Q^<3Q=wxaFs-|r&o8gi_;Xr*t;X2&E02$B{J%6NvuPdt z38YEKRX7RL#EgzF;3RwmdeHF(PW!q$)dRv*|LFJ|jj4Xo@vg)p*!QY1{_jJkw@2f} z8o#6ce}~3{+P{AeOzZ4X{rvN*BuB$2()f9j`v=4yX?v)jrL}PL`S5ui-+UfR{qjO% zK#c1A76WTlq=Gj%aE${uIq+v3c&`IL?ZC9J)t=w$4*Z@2PlKNJ_;Vb1tpjg!;HMpU z#DQOT;9om1`P!a;oddTz@NNhGq67cE1HbLS6Aqk-dSK6=_MO=AH4a?rz_&UuwOjl3 zJr4Y!1AobZ|I&e}($IohY=xeLtn0*UB(OlIHxj6&Y`2(JQ|03G?|+|wOO+|}GS}lT zu{ppo8~cyj@Zik&_q^%Bk^FDE@xgIf>gETh&{`d*b#Bw)9!sT;4G?;j*1VuKb;m?& z`W+MQjShM%g+nv7!ku<^gcf*Sq<2nu$Y^oA^X^0wmbvjRgr1JpPHdbJ2{aG<8-ClG z_O9M$+U39@*lDsFTVFOd_tZ4vyXYx`oAD9{d&FD%I@Vy{dS`QcuOnDpn-Z#mHraEp zZcQe!mqqTVukE^}G1cKjjtn0WMqf8aePD?Ij?ICrmLSBNW!wveQ5D-r(} DIX#DL literal 0 HcmV?d00001 diff --git a/ios-m1-simulator/libs/liblibwavpack.a b/ios-m1-simulator/libs/liblibwavpack.a new file mode 100644 index 0000000000000000000000000000000000000000..e693fd339051be527ed3b9e85f46a86324aea472 GIT binary patch literal 175056 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 literal 0 HcmV?d00001 diff --git a/ios-m1-simulator/libs/libsamplerate.a b/ios-m1-simulator/libs/libsamplerate.a new file mode 100644 index 0000000000000000000000000000000000000000..c699bf58aeeb7311f25d904925086dbda5f6c159 GIT binary patch literal 1491752 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

U_7s3~e|W%ldYS}@j*}dz@1#cgBN@|q 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 z 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
$6m4!m=b;7+INOL` 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 z zfyk|v$M$9N(C!|9*5CmM(Hww@XZz!vO@FNXA%~VkIauh+;o_}+&~xdBn7;k+Dz7gL zP5Q#8wGZm|^}%~3L0_t-H`ub?So>NQTY_ZaF;)O%;Ji)-mS3eIij~H29cjF~B87S< zDfsr1f+$1KoigkNgQ9=j=gD7wO!+T=Z2pJ$9RAIJ)c@iiKmFtnw14s{`yYI7(tlj< z=6C);<~#Q^`o@3n_{#Sdec{jAK64YL&pc{L55MX6iT^zz#E9R0;L|lfaKm-)xo-43 zu6*$=|M2q-ub=vc?{n_v6Ea@&t4*)CP2X3%lfC5YJzwyPMO|E@?K$^Ue9n(Add9mC zc5=nq4zBa^DQ9X=Ijw5v(}JIHRY@EF@}ZSCXtna7b&t6y>Jjfc|BwfKf53-MdB9UQ z-sg&m_qgBH7T)paE;rP_%LAP6@N;R+{L8H-K1!yE8yVi_<}Qug;^-}bR(_Kk_r1x- ziEeNykL$cC_Zm;WC&c0VU*)~$T;b(AFLSekOZ@SJi`+^6B7bIlfm`ir;O7g^bFD|` z_`!ka_%)NWT*2!MUs80MAAAH}FcAEr3Foc5B)q$@o_~B;$KT4=@u$Y8_;t^dyt3c~ z4}EZ)uOD!nYt1>vyLO2A(Y#u|>Rt{1*{_CYh^o1PdlkQ$UCAx)RPg(~E4byXa(-od z88^r*<(Z8o{I^sIUo)ea7daR4o|HmvaJ_(g{mJKLdinhEraay!A(v0Ol*7&b%jO#= zWphuPqx?`*77sj|$pd>bxUW_Q_gb6IokG)ubt9>K`r8yfbaV=Tzap78_$ToMaU!?x zO5o#F68I~#cwV?aj@y^Va-}CR{DMLZ-!V6utL%#6lKdll{k=&3t#2fcnjOJ4T*7&6 zMi@7~70R#t3*pPBh49-B!F)wR5WjvgkT3XtnAd9`<~r*GcxHq@?+-uT-RjHhjSuml z+=JY__W?d=t2e)XZ7&bh*~4eYc=7HYPoBJHC!c%DgTEZ%&cl3M`NXH&`K5W=_{M@Q z{Ci(#9=Y9#kGbi%eCGW@ ze4f!jZk0KJd-m$j6CL~UGne}CPZN9dNk?S3>qjYme048A(EX3(+>D=+;9uV)w&y=f z7KVM47_WRMF<0r9xIB3w$trjzdG7jDGG|7cr2N-IiC)7!$))f+l3fB6uL85AOR$?vaF3I$4 zSIOR)&XOP3>?QRZ*GVMbEF`}p%_TmXrV^8SV~Odi*^;PN`Vv*YDU#PJ<0XHp#z?Hp zR3+b^DoUPs%S+^k_L1~n_pd%MvZp@rY*)R}*9Y}plWx?TZah<8l~h|_d$XW^W$)Db zFp8`{`}RPadv})BFIcQ!|Lx51`VNo3buJFq>!Peu>Tv%9El6&Gn)Q-ypi7dQPNI7ewneUKY(gd`f3zmE z8aa*)DjLtS^tD;P(-WEb;>m35-6_n@UYF@~>#@6Dg5KLdeO3`RgS8DcU@tNa+2skd znQx5|8!TdM-vwePml?C0_e@y5{XFLTYCapWb0LfPVao3Mo3S3bCG17)QdXn7jIGL9 z&Ms@OWJ9Z0u^EP|*`(8!?CXNHEb+P(>u<4+Sw2|LJnd|l({o!kX}dkU_+cZPzT1KA z{^`gfd^a;M*)42p*j9FC;C7}F=fbRpxiPymcQ$+U4%U^klR1ss#f}$yu?Lg)up5%)2>KK3aq1~S)We2cvn+~&#v4QMYMX;);y8Q^#$ckbUZKIirS`2&p zD25fK#66qt+YX?Ec6Y36p~44dnImi;&G9E)i?#|9*xXIso0 zSb@w1cCr2fyR`EnE788h+}kfPrKHO&-TVrZmAT56*Ii}a9@kjVxa(}!<#u& zShMZ-`zHHTbBoR2(#UqJ-DaUpx7mT|G$SUxa<+DvwO^L3~6PjFSN3ly=`pnq$jMY^$9bHZf8+* zpECaWDZ5h8!NgXb%t!7S8!vgrDqV%O=%c%sbz>Jh==Xy8Onb>}J72Pq@vqpa`LCJ& zm)9&Jznh)6e8cX`zGYXBy=7@m@0gj=dv>?sJ)5)Z0}Iml$V!?%vNFFGph?k>j@|1=XC}$f$wP9K*(^sM5%e3irXqcGLU=+4Wf0M29f%)L3F2&0(q`epnqiwwD+$9wXGa1myct3{q)0x|inOppk$&h8rL@4IG~wP*%ATM^y}gxa?KLHeAE`{- zRhgP0@FxZhqqFwID7AVR*-5F;APW^L%T=N2pH--6{&4D>AY|=&KAgg5s8U6sDoO6D z(s8X3l$#EoY7LTOo(rUEaLXGls)C7$UH5y_viY7*nqA5>C(FmQ< z^!dPOI(cn0ZBZRV(p$$+$cZuZpR77ru2!e?9CfRs8UCVR`1iH&ht97VW2LZw$i2kxw>TXR+ly! z=m}gFJ%KZ?N3)ft(m&g&R9Q5Y7JZsZ*Nmo-LEtosyg7}o57Vd5_WC4SqEG)m>C30=ml5 zfr8%S%0=`$b`d?kvxst)&1jXCnZQ>yBd14ZbY}a|!LzTuMJ2my&b-Qj$DhO5e21Y4~Py(kL(|#V&K|)>=lzPRnR{{xW*>Y#A-n z6!>2b%jtE_avIXHoYd7>d9O|$6HsB{m7N{aotMVnzB;RmRU&ylvk1AYJpD{ zyNc#DuA;F6E$HPE3rYyJpb3{OC`V>BNzGkNiw>=(-ICQ5`rm2_m}yB4o|ZJR%98HA zv83(VYv`HN8k(Q8hQiy{&x5>D7T(s=dY*RKI;X2qxB@+vz|Ur-aywj zZ=jH)8)(wQ4OFXWL+a)>53;uRpq3~PGC1u) z2j6*6q1p~QwsZ#-?%zQNOLmaKgB{e;XD3$J&*Hz~Q$S(Xcb4&=hUwp>`H zJr#U~sc>O5kN;da6%9ukUUs7 zEf26h4;s(s!HTbWkkvmQ)Wh;&QC>c%tj&j{^Z796OFnEhnGTzSIcGF?Iz+6R4&P2q zhsyWU;iEwT1o#y|(f9&bw5R|U94&yU?FHbbQwWdT3Sq3I5bnwgVaUEh$Z9Qw>B=); zs?`jLjhVsuZ8JbzI|KaB&VW7dXFw29j%VL-u zQ4B|?7Q6Oq)RtbL>SHhc(m2l}mC9G+wqAb`>!g_)~$x$ zJT5wIKsD^LuZ9m$4d$WM5Rz04StF}q^c21=<-ccE!@y>4<*tOkNM*1*L*HQLG{w`f^xeDhEGHIXtqH!vt43yz-Po>M%JV zkA2sUmqS#V9IA%PVe42q9GfhMQ`6;ev{Vk8YvfQqOU@Z^a_G834u{stA#Mwgo8Kje z;Roe#Q1WL1?-7cKxvW! zJku5MPNIOhqZBY;oB}pYQh?D^1(Z)$z?~umn3gLbxmp30Jl22pECp?Q^LXi|Xl2?b=G=Ir5f3aGot z<%$AkT<6!^;{1TS3ixzS0b3p_AfinH&z~wd(^CQMFBK5|N&!3G@HE~j!1bd7Mt)X6 z^;ZQf{;q(fKY2R86_E3nm!nf1Xerl0OXoTmuTlr9oKY~ZYaMjcsDl}rb#Pa!4hC!2 z!PxF~utKK}j`pa7>pkn>POmz+q+17v^y*+v?>b2CQwO^Gb&k3I2 zJD#r=7eihK16~$&UZz+7FCQ;w1uw5_w>o&p%b&;V@sHQ1kk{)uub*!hUO!&nE44+T&!5Lze*Copj(70;*{*=A&lKSIgg?he3ix$j z0Y0q?D7dYFwKo(XURA*9OA2T?uYi4=@i6bC0;J6fFh9oIgUFxX5e4)*sDKrF6`;3^ zx1ntcxVK3GgV*!+wuV2G6$)rv!rR~i1zelM+g=@S1GNf}RVpC1lyf3x@G|8oAax3F zj}!QF&Q`$V5xgB|@ibEv@FYP2#xV*Q7S8hx;?LGk0h2s=+i_Qbud@Pr+wuGcD`37k zud9gyZW{1ox(axpt$;9f-c~v*;O`$f_)Ls)b2(i1)OO2Z4%bDEb#j=-b@MvcQM1`{kk)cNE0aS*fgCPPk;AQVTsKGX zw9@6UI6)30BjqqKi0}87L!rBz^VIl$E502d=PXmM)4k*{K#S{l7oN^<865d6gNv_a zaN`-@-j~7Q8!}jMK?c$jGB88V%-GMF8QW!`wO$4bmvcKdUk20VGPqeL1M}%J7%@o( zOGe2+Oqap6I2p8t^0a(q(Bv+I)%G%&XdwgpelmEbD+7flPm|lr?cZy`g4@qU+>U{1O(YT=CXBQ>D6 zvj(oOt%0h=H87~I2E@`D@SR!%IHm?H(rchPx(04?rg>UiI@nDKRE}3c{r)Pj`%Xq&n^8WjZRTbPZu7YdYRdB3R6|DYP2|3Ry!R1yZygpqC ziyJDzaeE~+udD>W*_Cjlv=U4vb9RZe5>Ccef=WOoxDKs^R15A~=vP9qdLr)Cvk*sB8k zJ6C|@Q#nk2S`N9_%OSg^9HRG^gU$MK_%**Au!0|(QV#mka@ZGL4qiUx&}3f@PNv+y z>Rt|?{+5B)+cGG5PzHN1l))|ThrQ$e*w1BU@IzJxukty!epDH3i7$g(|1xlNDubu} z%Rr{XulrjH@%Kt0`ba4_FDivUlS^S|L@D?UDTQNdrC|1qbMTu=VCBjZ&K50!-Ek$b zz`g|1xi6{xvKThC6odJiVvrYd7E63Fs5umasTP;^B2a5Cf*UJ~K$c$w17eC`qjeEz zs}(^;+YDGJ&VYT3X279IGhkgX_j3o#0NX!>aOqYdBr z(&hPJFeM+#gY)5vX+EfZ&*OX>z8=7)JTNNGgZHs{u*)hBVwCdW(d}svw`&^gshS3# zQ}`IbVH!B8O#|BpQ=!NHsqjEH73OA41uN&Nuv2|1=s(JZaeQ2{NuCR5Gjid&6DM+Y z&4slOrohO3Q$VM73an3^0w(rTpt8#pxO`_ably3c_sf%EVEkn0Ie0R>{LRNWS8^b1 zLk`@_&w&^|=GogX2Y!B-1Xd>}f#1?e5HM~M*m+I@ zLAW;tI<}30vO>%!wk>iutAfLh3`n=;6^E|oFavZUQ)2qlET$H5|C_^!2QV*@b#3yJPiq)zm)~= z*JZ)KiCOU7BMa`UX2G^=nJ|2HCa8|hgoQ4d&`l{5axP@R(Ipx1O_~9Qwi%qMl@9$m zXGdjDI$TdqhneQ-VE--+ni|r;y($e>N2I}9{WKW-G!-Iurb1SJDx~?Of}dt8=-o_# z>#I{>#+Ve|m!xn8YchO4kqi;DlVMI`GKi+haIGT=ZthEh6El)vm46Zp@0J9;ZY9E= z)rsIbIuW+pC4$EH1c+-&fI3+M?1)N$M*RfN_=|^STjC)*Cmsg5#lz))aWMRJ96X&J z2T=)eu%&MtynYr7#yeucEjJdtJz~K{DHin3#K4o;F|a&72E2@8;L4L|h}aqphbKit zx1rGx`8x_qnxkNuEDGu)qF|wJ6ijW6W4&f_Fx3;Jrn_bi#Q9&CjuH( zBjDBfaL||+4tfdU(9I|uK0FG8mJMN0o*f1@wqbDcV`$qzydr=_R zdj*20av*q|90umHVem6#7#!<13?^R*fF271U`>1g80rT=Wvf55uJi|!On->!?+;U+ z`a$_dKPcvNZKDVKf%hw4P~GVZ;zVCaxA%p&AADfKejjL^>H{uAeW2uJCV-3{h^cZIaWuArai3N6mAknw3Kyxcn!q&Y+3yzNjhf8zq0ltW+ex}qxR4|!yb;f*~98Db})6H9SD=`;NuWGSoYEu95&iQgM@GU*~0Qx8_vwM z0nb<)nBLt6Hk`MHW3|?B!Ot4b{u=^^#UZdLe+cKZ4uOI1tl-u*E65*Z1sY~nF#Ew^ zP+m3|#>5Tg{_aqqvz2N}PEH#5Qv-#Y4kQt0r zHUlT@4(>ALu%`51e}38>TPq4gI2e!y&ca z;CoCDn)39($yN`RKG%g0D|G?lbfH*Nm$#{2aI2sfytnTKf7^S)ztuhAb9_&@uhkQd zwDbU3VGjs%=)u>I(Scp7bs#)m2Oewcz^LZ#&^En0MA>zReb2Q)eWf;^W73BCUA5ul z(Qfd1YBx|D(hd5wX@TJqE$A7p1^<+_;L#CHI51HYO3XEZwQ9iIIU2AiKm#0psl)L- z>JTtW9gZ2PgU!{hFsG&~v4O?f-J}NFQq|z5jv9PE$(d0zRH3K6D)e}+0$rA? zz?%paINw1bS)I9A3Czf=A@1dQ*tWzhb81s+qxbl}ZyZvP?^?%r&u78*;=Qj(#^NaoQ`o)%Q z{>l1x|H&5R{a{}>bILd1J1gArjjieRjqNS`%67MXVatNPu${-z#R{r!O z(+v5@D)xL}FM5AquEp=!w5RV_eegThu=_1Ls`r-doAHLtZ+p$M0$(%Zov+x*p08N? z^#54fgANwQ-}4>Z@{)DYe#yLZ+u67~FIW}4V0G)BvvRfPY$Sh2=z8@j`|k3TZCU<= z4g1%|t`Bcxk!K#W2J6SH*Stq8^~*!HAo(F{pa<-7{|D?w^?i1>;~v`?evg&yZDoFX zt?bM6yKKq*J8ZD`9ky-#ZDy=?n-!0}#V%jG$#fiUGT((a*obe}SzgL@9$kNpjWfN* z-}7H(W-qR=7eQCpitU$~kM?DDC+8B&ynd10ak&TVD2gSWE3vMp@f%gyX! z;AUpNc@vwgx{2)@xsi38*ueD6H!#=A^(^wqI+o_Mj%C!ZWr_dlSwKcT8%%3hXX7>O zdf{re{O&52;I@jXFImand-`{WOSj>I| zE@lCn7BN|uMXXu6kbP=ez>G{5Frj!pi@7(CN!;hL(M#sC5ntx8l-M~eaPMqp-F-Ie zI$;)jaBe2sW;v5hs;Ohv&lIf9N5N*Vku&E%GIlLR#Og6n#j@(C$PRZ#<6R&#m|eS+Ew7ibU&&c4mh-;WUPx!ptJ9dNS1ODCp3DmNCb6Ys6WQ(o2@LPY zvEz$k+0lp?wofgZt!|2B6$KG2!!evWz6xc3*N3o{v|v`Q7sOmI4P)&!0c?(!KePYt z%g*odVVT+9>~()HHnkPlm-&q4gbM6=XAc&SZtU1pS2nszvnD}z|AY#`g|ZO$%#H)DK#Nv4r)$_Df| zVeWVPvhaDvEIrtWjZ-pY`3?H4d~zQq8{C`CYSU%&mi1x_qI

OI(kvvkNle+=?5Y5+FK#Q_q7nYuS1A4YZp@IKNChPKN0e#JQ5U7?hET;T7_fHw}m#x zn?l$1*97NYSA@}(7lryy=Y&VY&j{u>P70I#TZ9t_ngr8+-qVPtgLCDHGB;0?o zU&u<_E4)3uOQ>?&Aq?EQRk&=hS*TQO5PW~F6*R}M5gy-PDI5!5E^IrxL|ALLNZ3$6 zU)bMcu5hVhmhkP9La-hw6DHlN7McPpg?et6Uvyz@Bm;+aR%fmRRyiYp%Ss8b#mCg@@M zcCW`YP9LzCwaQ~?`T~!QHgb;_zl%Kr)?|BR`^J03yzur=sk8Q|u-ErEf2*^{nO_gx zSA-sN*IhNsebVD#cMIJQZqx1?yKR$L9{GOe>k;jpVGZ4W%x*Zh>~MqV_PF8g*e;C= zkLWi>sMs_bM*B2=UJ>7T|9N)f72A@=QG&ejWyXTW*X64kCvVu?n15<-D5TG5o%*Sn$$GO#AF6e)$KYpQfJ}&^t){Z5l3)8WJN`x+IFRUTNa3Ac?3RGfI4$ zGES@o4Na&EG^V zv!CM5mA^&(KL5l`XFA~~6=hWTcE;G!E~tbmxZt}gs=IW>5tG$%{Z0)$)uD+O26n?k z5^bzn)g4{#>fkxup6DCZ3s=_ZV(TeA{H4SRSWF+E&hoSoYKs0KOm4+<~(lPRM1|I&Ii9c*4*heBoorS~k*{Kn@ z;KxYpYdspvGsfVtx!HK9c`RP|JPwx)nt@1B9+u;{X%%=#s}kR= zuf*;`752SWg?+NC@%O)Kytudq@g!P$=(ctr9ES4?7bH+=t)83_M8n6tl?k>Z=6PDx8PAjl!;R>8&xe~kL zO1|FnD*XIp6$a(4#%lF7xP9dsY_zM#ea-baKYlHyzFdplW~{@_-PWU3{d!#NxB>q= zu>l7qZp6@zjhHlJ6NY!&j8l|pJE@h0`ADah)a|&;pkbH&`AF>?q7Eq?QO2$+{0J!rq5OUd;ThFBwWK^kFMe6 z?CU7|bREr$Z{P;io2WMTCPoi>He>l+Y6&~3C3eDYKV;;W7t=?~tPQ1bWL2prh;Vt?^y~Eb)?=UX$J??3J zkFV1|pnBT}R2%UTpTGEs8?!%Q!0S(VYT{?K{O}pa=6=ChU%uen{I8h%<14z(_=fj? zf5WVj?|Aaxcho5Vfp*G2(WUYy8g}`GkE(uQwaRbQsQHbPRR7?Cnm>3)^)EiC;mkkP ze^^!X4|O|tqMN>*sHUP5Su}T|!%9lz=A%TL%alm1Nr@8vDe-tSWoju_rpL(RRDLPb ze;%FbRzYVT)83hizjY?ppMypc$ zMpf!~s!FZ>)kw@#BgHB;3c9Dph!a- z25I|fkWPsPDTx}?_DzHKIBU{`$(m%aOOy8V7#*e}?zUz_fhY13NNrljxuw^MhTKdC$EZs+X57v1S;e;u+<*P(Gsb!g#r z9onwlgZ2jZpp8{MsP7$EYVgeb$qbO?nX}b1vb+UKDw$7ZrEa zrKP^Qw5~{(mL1ZilJ~k4ZKX#&N9a-0Dm_ZStw-%TeEs^6-qcdroBsco__a4x+x4Nf zWBSmxwS3#!hpKz&Q(~At^{&>Z7SgATuln@d)__t*8xXBAAgwzF6ry8DQ-cg?W|<+6 zvo)m3_l7jw(unM`jHqLY5zV`7L<7}~X_Kch>E#(y&Q4=$cxFuRj5zNwwlA3}`cl8+ zeW@#t&w6CrkJgXuN3kpW(T8jOXok88ee^P+#5@z)vcrU)KQSR415>hyG^HWcrerLd z(vSD1)H0|)6{hv4e)Id&uG9T#$e;eS(9w+k8*N6`tIR0%ni=J*4WLpsfO01fptwx~ zsQ2GYA11L>LJAUYK>h!#`~ zqVPk5=wrtqs_JV&%Fz}yp~`|<4qK4QD+_Y!XGsy!mK0ZINr8tgY2bgBJeGejZHgRB zK^24P)`7tk-9DHO8CX%*Fe@5XVnvhoSW)#8E2_~QLb<~@e{uQ{(%CkIn(hsuv~Je) z)YF<0a;)j#T5I}u&6-@g@Hjgc8yYdnhSHbVkk1(#>hZ&dE)KS(sVTOkT4zgDqAk67 zWlO%sc2p5&M>~t`=)?{?&Iq)l16uYpi`i53czaS>X-_N9+mqQZds<-SK<|?s$W87* zTvHiP!B(JK*MR!|28tNyN!bye zG%4ScGU`3a?W`yL`rt`h4ZX-n4Om5A_T6q4Fs{bZMCnbvf=s<}ZE7w!1Hx4dvX*G+#Ph=}XhM`BKlT zzO>|8%`eGQ( z(Fi1&Z6J+}38bNUf%JM=ASo!2GgkwtvP%#>v)JO7(^rIaXAn~5x0ZL^k)#= zGY+OQuVCsX4W_E9V0yMGm~77mQ`W0sD(V(OWp*JnF*<|-azjXEQ3&li6hc0CLI{6^ zkf~89O=O|8Aw85%l!VfSH9S_gDU_DBg;JVw7^x2kqt$+4)OSP}PdkimYzQOmlVN24 zoX7d9gp=LCaMB70r)wj^sk|zj^f!dlvX*dCei}}3$`LfDe+2FKj-aN@2s&62K?_zz zPzpwn#=Qty_alPLc^vWVp^?-U7fHssk>ouulEQaKlHbKh>i;T|UUrS5r9AG~-am@= zN}|Z9G>RsyjG`?KQFP%}6y5n0MHh9VX`4+n<%C3&$>?Z0R2j`j|mx^Flnl0|SL4bMuX+WbUXFguZC8xv^+ zCeq;RiFB(Yk;ZmPqW0cN6mFA5%l(q*a&i*AnUq8ytCQ&QiX=M7nWnj?IoI?-5^esN zM18v^(~Q2!oNJd%?*fxaB|VusPf4c#YLe;5ie#F&Cz-TPCewnu$)xl)nG%&#xGhQ{ zv`V3Ko+;E6lR|4orO?R26zVlQg|@CuA&Y}4H0w+X-Mg1UJ>I2|opLI<=%vyC%T)T| zkxGZcQzRYN*_C?(I&k#^0P>z({5?x z6p}`@scFE!C1 zPVWBcG$1aWJ`Yc)UAgHLS(#3E=BHEex^!B*H=Uj|rIW^$bTWLDPCehI)5qWG)S#Kc z?|TOQv&^6p*9>|VkU>sy8I&!}pxT@anpu)Tg)=iKa(M=6ZONd$2Qvs-`1T6tzdp>M z=vNt3{5^x_s$^1K&rHrG$s{-HOnT*(N!6SSs~VF@IT@LBd~7ED%*!OB%1jzCCzE=u z;OA`OoPd3q6mv9_o}A63q??&^_;Duvd6h{+zGae+au#`Y%i?;JMIX$vXp>DA`MPD% zDc>w|49}wK#4I{4$)acDvgqBkENUywB2k`2#S5~?VpSF$;Y?VMBlE{o=T=ge9q2^~lv35C zWTz#i|8%4@OHWGrhEl5QC#C0RQnIv=Qp^x34Y!k0x|5VVU8STZNa={Dl%jp5bTvRq z9>G#lgh}amq?Fn?hxcW?lx`%BAF6A*DB5N-L%G zlS_J)ls0o|?A3rOpub(IGzWu!%AKkn-Nml#OtP-DW%9XUe;tO zElc1M%hQXJQf#=Cv_hn`bC{Hd`tdS)@%k|-`MB})oTW6wUP{xfrIcVPB~x>LFHJbZ z*ofDyx0DilN@;61DLw5fC6z8x()lN$&Oase;IoA4-$^L+KM6g2CZUu^5~8~jQoq65 z!6gYLpOH{{vxGuWLMDeKbbq&m%C|~Ld%c9JR!Zo}A_-Z}kx+t6LKDg*G`>(mvAMim zj_2)hgoFyydD}^lP;P{TE)0`UH!lgfx=JY6PQvYnga(;N=tFPb{yeOyt62NXck=`l0_cz`&8J?WH1ufAl`{r|ZBKFXwm z8<{ka>vIETk_*@G6U)*LzQ{|HJY#$#op(gJfoMPD&;f599xPWYSEVO!{D& zNnW~{ocWze3x8(N$~PG_>v0BWu4RzrsSLV)B!fn8=XPpU1_jT}pd}TYEiyHO-j2$k zZ%G-{5t2bC7`I)v+>V)M(Agdt6xca~c70B#zt6dyyq(UULpqIUNT;N2>EyB^oqpA& z)3%~?@|}=QE$N(Z9g$9Dp6P_P>D1PbGfTA7sr@gv&u`Oc-a~GyFQw5VN}~}w)9BjD zG#WfJjmFMMqXlEREl*CPbwS*QyQWe6pft|aOQT)f#=CJ_zn$Csu9s6Of>Nn?dnzqj zmP$)%Q>kKFDkTn2CB10gPk5$Mm~|?hGDziqWh&);PN5xbDRkjd3TFkS(CIBHw0=k11iD<7K(Um4wUSu3?aN)j+ zaU7K^$I<1Nv7~l6maGoOlG}<{vM-ONo}**wQ5a{#IL4B@ek`5*6GQB246QyBL;vlJ zq5cbE$ai`SMWn}2fNu;9vWTINnlZHXJ@>b6Mssd|G=;B@=B%D*`ZX$=97Cfi)-IZ| zdPP&>wTU(x}Qv zavc>(AA=%k>5xdW(vGA}?;}Y2dIaZwM$noi5!|nip!=y2bPpovlt~1wP>P^5?u)9Q z45#`{;WR)NPV=(E>Aw)}yIO}+X18!Ed>ck(mpNa4PZ&kb3nPOmVRSJjj3zjR(f3|q zG?DY?uiOZweg{J-aZxB0O$()&@u4Jh38hJTq2&7|gp_WE(Dnn|uU;5J&D_tnj}0N2 zV+dXB5ki072b1BIVCug+nDk}`)0gqV)D#*_`Br?tdN6Hm52695f=IC;h#ph~krC(N z1b78eTHheb_!UUucLT}da3H-|7)bR~0?9Kfkj~l!lDB3ct$R6)KAapzHtUB`T-h)h zozBH$7{&G(MngUa(EBR^RKGKTKoLNvM+Fe`3!v2|0eo)9pDgb9Q{(}ElFsEap8p@@ zPnPEX^yVKQ^W5_zIP6Df=KGQNL_gXP?8nE4e&pE6kJ9e>QtlyN%A4m)qsIG^Z=f$} znfX%lZyy?Y+lRjJH325i8@&v`m*#+G~Njoe*gI3W0{^3bZFg zpx$Nzjr-w2JFj@q{mmZqv&4f`5_JCb-KlV|J6Xxx=}d+@#k#oD1xtN>dgN zrSsWCsh8JK3f3J;6FOX|^r#D!E#PDJF)kDaE~MYng|5DErb5w~bmltKq7lxd?(R(E zx;c~B=0raaI+2CKiTpC0D8kW+0#%*JuGNuLb~)0yaz`qTcO=unjc6B>Fngj`#L-vc;Y*EVifSY8AX{=Zv?cG?Hsp5HhD_$#&{v5KiB2|@qhdpPx2i5nhc~P^sKtsDc~%q{Xhom1Q|FYylxa1Xw*9oE=jSY``wC048fQt)f+g8%T9Uy%3;MLpf~e4f@N;t~aNS ziRQEs%sKPPoZhz%pyI6q=y(1A8p|0-XLSdV!BaCz-fKpRQZw2fZboEeM#nlh59x4! z&O+`_V`KZ1UH|^{{H-a~p(&qh<9wt03k2f;6P{HHI`X#*nP~8Pe?z1IjySKx*X%Bo8y7KYa{n z_)~pq+@(*Q3-!q}K%d6x=#%_jA6mAl53QKohi0=rG*zt+gLE2Z>USj&w5eTu3nTpy%+iW_98Q_ zUYrBnlMbxuN!i&wsfSZf+V;B#4L#L^4$kSp*F)$*3bP*6_DYBMJ32J7M28jx>d*ll z9nSmgPM6kor_b@{8p*OXA9S#>Jp6{A8g^i`DnD-`m$P?v_^71)DSKolsLyqi9Q!8(N$k1TGv&H#$4(|W(zyf)#Of` zhu4Yvoco7%@&C}CztAxn_ZQ!N`GY&k{$PyeAAGXtH>R5Y#-rPQp@s`z|L53G%nbgC zW3KwW8-s8xg?{VJpceusu9d6zBmcI{sixV2(puO)K ze0cUX=10HAUw2;NxU5%rs{KFgHt9d~`r3hM#T_`ZO9!UZy+onsOH^Cdj>k;earmYe z_|f_WPTc<-Z@E85tEOj|J?t4SzVH-x#XQA*cb?$-j3<1}rZx;2+lHOqKgRXb9;4&0 zN4Tr(5%y7igcIr>;%=RX_;Aq!{Au_AJJ;XGADmTnf9pNmVS5k9?r%k1w^rPNchS-3 zE^at^2fKva!I(?8aaPQ2Jap?8UQD@#S0CQQ7U@k~|KbMbjJ<)@Z?EIc$=7khmuvWG z`ZXN=`zoF-y^02$XO&cQg}*Pnf@^19#_ioN(8TN;CcM9`5Y!#ox}Az&f+86v#7E63=VWUgSH1xqlN2f)M+?{FFj7-Zaj&jJWrxl z(+OPfa{?_}T5z?03wAlxjLCt`xaQ1pyb*jHf1Km|tFR{2yLb#WBaY#ROGoi^YCj;oGZ-H8F_YuZt*;74g&cMvRDS#N{^{@OE4Ss@yz+=J7|+`Q~ACi9d`MHxHpk z{2_dJ;~;K`JBVpF4q%tK1GxJ7ezc0+kDIUU!`?CbF#qaaJR7wawXf_!|HwT!{?cx& z3Ez$LFYLm(p}Vl`+)f-Gyc1o|?7+XncHohd+i`^dc2sWJh6{YQVeh7`IMZ`0e!(pm zC2YYp4V&??>t@tFvez>u}QmzLwb9wWw^e z7FVyVM;pU>+_Pj24$@nL^X9L{cimT`&#YA_(^!SgwJY&`mzCJ7Vg(NVw;Y{|xcpd# z7J19C`=_P&deTy)*GsS>dkMme#rRsf80S7(gqCTG@X(!w=oZi4D_>oJ#t{p!_#9sY zZPuX(scoQo~4bMe{!Irz(N4yx^#jp~-OQHgW8-kQw9t1D*WwmvhlU_l*1 z_d5KpP~cWo1x8iK@y#C@mKDfQ{Yx#%b87M5s~Q|Xx&|*lsm8$>)mU)13Y+4p@XzH+ zbPTP;^ivgB>QjMBu^hL!mgAm%Ww^_x3T!6jU@VT9 zn2qhyF_@Y-8k<5#VQ=q|nBhDE7h4X;%yBeqNk_1&Vn5P#lM8lVh=QL=0*rMPqbm6v{m#@t{Kl-ZT%#jy_@d zK_isklVE)CJ_wIL4aDWQhT-V50XP`_@$oJ{tXu1g)(d^GxyBpA3cT>*I8XG=0NfSD zu)CjtBV9ajpM^VqF>pg0EmutY>w*>UopJROC){(x5gSf9V8ao6+_TM&w;5ZkoNa@d zW!C68WeENmZiP+pgRwBs5^dZq@V3<;EHEC3y|m47(?2tG_|P8@JTXQ48z#8%WIyb6 zxGxrLF~+;gjL@;p5UYv|@bUzG)XnUJu~EIT&PNZ)Q5XLk&#=yo=b_kjzYS1r|6fy zU6gum6)Q|OiyJy^6i@T-iQY8Vi+USYi{8~M#R;R9i>m{didQWci(NGqihi%=iRBmO zh$nW=5;f=4iHSLKadUL7_{XtYOw_Fu4}U2WJ$4m~Jtr54U!10iFTUo8PaDRIZ;Qr= zYThG6yUtnSs8gxp4tb)e6do&%(TNlvUJnsREg2?uO7#_Y^z#(QK5-X?O)jFzSO-zx z)l@X%qG@{@A6jj>(b^_oN7yDX`77elwY+x$D{p1Ak5yP<=c$K$U0 z9)BKLdQ3Xx?%^~u#3M+O>aoLRyhnz5v4`#38jqO7IUa^hOFXJA>pd3C-QwZ~iwzCxGXIcy9bL@rUqt3#rH*P|uF$ngdKEm390O9uL zVBy-$aA98O7(v$|K}g9+5r)@g2)0M0g7|Edpx$GgU;vYZjxo7H!NPpu+_4$L-Tz93 z8yXdYp=p)i?NTH7hsXqrOoi|=ccxG)n=N!%HCM>oJ6~9Oa-p#6?qZ?-%~BypX@$^N zZxD7Wje=y_X2DsuRd~95yD(wrPT}gY-Ga`wy@J)V{X*Zb2ZjIC zjtKJ%8ik%iP#DLK3ai7LgsmCP!mLRrgy6DM!o#^|gpjr8gxPy92-}Wd5>{TlB8+Og zCa8V5A(VEyEnMt=SNPEHp76@%fgrL+f+Vy}xS#w~upaYVh|X&lLaRCi!}+fST=Pb7 z+WAf>Y5X9pI{itQbK{E;*Y-_#{pN>|`16;rNcFD}tKNzEcUNNl^pshfVP`hWv&<2s_F*w4`s{DH0h?EC$Ta0fZ0t;9wr5UXc7J|9_I8m8d$H7% zwXEpRYFC>vyR`$@(e>ucVbegS*fNNn*=E6B?XYB@b`55a_gJxg`#A6IfHmuU$c9xM zwq?(c*fE<%dzLIZuxxZ>>Ey(mk2XJKLh>)kkvwHyg#F^7X#^TA-Idmx1U zkD{}V%i?JQINjY1&-2hoH#hUx`ZKV*ySux)5EBqZKoJ846+xaE14Rrh6vY5B0UH%j z6nyvnV?NJ47rT4AbF;I1H{b1ex(f`+?h3t5#)8j@Zt(JGcUW|!2mCnH6S}AMg3T$t z;Ye~HNKfnwEB5pQ<<9=_EN%b{*fJ2#Z5RaK*9-=;l|#UI=}@R$FbodQ84j&xi~!Z- zkzh4`6vU1i4P%Fnfx!dDLQwB<@FsRV%>Qo!)U=rhkvIv)MoxyA!Bb$c-&9a|OoJOP z)1j-~3^-{%6FwTu0)4I7pxHDVp4N+Xkw4D`*Xnt&?Ztd}@^}HL-&+Ve*B3$c#l>(q zZwa(IwG_@}ECc-m%OSb*3Xor00lQnTgrBq$Iz+94)n``0$$-^x?dWPKabE+MQr1A4 z!&;cRdoB2zt%Jv#*15#j5(ks_#=%~*?U223JDk&qha-#QVeOB2 z=stA^XusP5nZtHM#N(Zi(|wotR(}^vYPB1V=I@3FL3^M!a}RuQ+Y3(;_QGki1em`e z0ld@_;mZ6(=<+2IE{sb8r^+N4*LNT6E7=FCw#iT|_;nn-A5t>+!xYy8;J)Vo6dR>L zpVcXF`*#Wi%{U0l-wB@GkW_e9nhNj#OM}-J(%@QHI_x@@4zX^B;Op)~u+;D{)UP-U z{eB*X^vN0Uq$&d%`yK(UTSwq`%SKu)iW3?)S)nFIRHlXT)iE zd-OD1a5@9aZMTqhq&=jX%X z+I%n`d>+=9oQGO0fUr{qFwRW{E8|tLMuTAbY=Sm#2%7pZ94un+i?{#>GA_U`n~NZ= zzX)R+F2cO=mtgwiOVFd^Ww6h?3^zOrVZ@$7c%gj-+RwcLJKkJ@;@(%`b>UTb7hDAQ z4i-V0=`|R%>>4zFyap==7sKZp#n2||IxNe$4hOAnz|mDVAmQr`m^SPt_?6s*yV18` z;E`K!)2akyt4d(lml9Yte?FeE{0BhcIKyL%7uN5Pps-1M@p&U=jTYex*Nxt0scQ zx9~9-zIhDmyOl#temMjvp1`23PhfJx6Bs%2DZs6#@Hgxkq#k%C)+B!pi8G(Wr>D=s zvt0$W&8mP7HkIJNyb^v@S3+iw7a#(;AWv2W)|;xJ|F)&q?R^jPn?xMYs1Fcu{R0g5{|K{oe1u62AEDilPoQ!66Qp~5 z2Cq$@g$2|lc7f_qg>u(wq+ zv^>}hH~uw4*zkX_^1?qTH&Me8N;P~kRSnzhSHt8IHLU(4VzK+iRfZ91VPsrh%*PYoNQDCguicV&qUwJSyV7j0!Yyc#S5e*@zghc3Rjt zOAAd>wb1ge7V0%=;U`~hEF7SX8`f!~@~k$#d8v(yOm$Elb#VS99jx4|gW*Lwxa6A- zo^jR1r(JciZlNyz%FxBH4|MUdnx0_R>EYZ#de~yUp5Qg;;iM`(tTWQb3DNp^cdR~o z?9j)_7xXdpy*?J(7+^&k1AINr0LzmMkgplwj&BCo&&3c8Ive82xrW#})ex_i7-Hlv zLrhc{;fHQU=)cGahaEP;<@by*?vD^pV_eqL7>6t|M!zG*SaaW4@Fa{e#LEOP^fbZf zB_?<%!vve}nPA61Cb+`G6f?V<;>CrgcrD!&>9#4RHkb-dq8UbaF%vO*X1Gnn^toO) z!<0HRG<7t`Y3fZ?eQIQp6cF8|;lcm|HRGTafz4{}6U?uh@=9Wnd5 zBX$?Dna|Cga6p6;ULNFx_RF1cc)AnrEOx@&4^CKQ>Wo)Ho$*wEXWY2hS#TSiQSXW~ zo_ObsN&^?X;O~Mhdb;4oIWG8MuL~NeTrjB81>32+Vh49u4DaZQmXlnua*HeOJ>`nZ zQdcbf;fj52-LNRy4HY7`bow$k%sl9Z_X^$c?Hf0&(UD=fw+zp9mf@-?GL*In#^Wg& z&c83i#&0s5WF^Pz;c~R>FUPJ61(H=ZA;R`JqXvACCFthez~U z;A2G#{H|<)e+P=+IW4d(t_2=G)&fTswLk;$k>SC{7AUv&$M`^h{M5-G!^imJq-FlN zCBYw)PW$8T5`SF!&L4ZK1)#Y@0A36Yz=5#=_+nfD_FfTyrxOG4-{}C1ED6A&Zv$|8 za{x}Y4a5OKff&>&5Pyse#6yb$vGvYCym>qjTU`yr^yeb3`bQx88wX)uk06|gK{%;z z5cZ!Mgh6YA@Mm%mW}X$y%#t81eI10I{{&%{MKCt|1Y=C=U>rRl7#BSZtv{uPYxOhRy&M+g=QnzTi)5bQo71Q#p|!L7SOaNDsETyiM{`#uUm zr;j0cM?Dm$*oI<5i%^`_CKT`Y4@KG3P#m%<6xZwx#e@?=E{p9)V&4aGOf3xWTZQ2? zpD=8|Fr3mW3~!GML&wEo*e5Ow7m674&3R$C@m3hlei4TMeGfwe-Ehoz2*+Ll;aJ`} z9J}-l$DZ9*TV&4A{>oBhhvFa1kSUJKx5AcjEjoErp^&K zU}yv$m>z-mRz~2Loe}u^u=vdrJkT2vnDQ(F2Y!mcf6WmXZx)HB@MWR{1 zNK}rG#QqCJO#Q}4j7^F}zvGekT@{I$C6U;vA`%~cio|Zsk$Bo93N>A$uw`Hrj&B)- zi@FOL9))A4M`b z|3#y#aSUE^h{0Iz7`zr9gT8HJa8ZvKJU283D<{QZ-TWB*x+Vsn#mC_312H(~cnr$( zV^DQ923y}3`zm74^nDEW{~3duH6%Q4BH=j)2~T=TxIIL|;YtbZJ4<*`Fi?Arl<>|J z2_qLsg2^Lc$u;W4TfI0zyYEgjIt%b|g1#n(p5KIQZvl9TrW&x%y2K==K5ViqM+6%b$AmHYsfJ;vU z4pIRst^$^q04^v4)T#trB3!N)p8@?F07aNLZqr3fF-1(aMO^EOILHgpArP@B0&$2E z@kM*YZn21&eGoqlMsyjCC{03aHxn^xfe6!Ij`(^lV&WD=*ok;EQ5-vncr*jC@dRST z8N^}d5ocXQoLMB&yoDHgAF=)sV%l?Y%`3#q)ri5L5Vw9qENejFqab=|C^1A=iQYy^ zG%#1N}SkU9Pgw=omeHF z>!HM+f;Ic3zY@C+R^qW?N?}8k=sQ-4T_z}Tz+`cJnn-u161C?j@$x(+PFN_?U97}~ z%ar(9@F}8Ki?r7&@yL25UfQU{tDBX0cB?2)oD%!Ti}LMM;?Z474BaDs_bSmaQKXxs z#Q1$8|70az+pomJ10wGfB`!UvL`YR)wUA|LN>oc%;xr+}LW~ZH3Kud+$S5KGghU8Y z7jj-4A1vg(xMqxyo8o#WA%jGEt3|pABK<^>&sve+Fp;lZ?Y5`AH0b)5|{$25G76Z<@0C+kVu<``p&vd}XB*6FafW;dCw=V~5 zKM(NT6u>#71tWPNV4og<865!M0-#wapqCGzuPdN~wYc6uFqGBAxj!Ye{wQq5O9`DG zOSrm3!m`Vf;2cZX@`Qx_Qzaa{N5Za~CG=h);kP*w9+@a%=V20-_mZ%8M+sGugeE}} zc6XO>iJgSIjU?QsCgIi}f}v6qgOSf;@XOs8+<7Gi-Sc8F?N|&N3R^fz*u=xaHkJt+ zSto2|qp+D@gzda9Y-mbE3=Z~*K@F!E+-nkpcIq*>?t3&=y^Th%@@O19D14I}g?lriFmi7cURf_1Xh9UFPl&>w1EMgZQxuLCoR_6OQMkrF3K!@{;lSUK z=vfq{IDSmUFU{jE5V`Z9xL`ohhex!7#f+2^Z$n8>Y7kgJPgI` zi=mtKX7`=`LqeTg798N5LR9b!l$Q#@Jd1u?pqmzBPIo*Rqr6om4dLHyWrv& z1);xS;;gR-#5+ZSsC6aN z`QtEie@tr-errVw{CTAX>ImOeYkLcX4Z4L;2 z&q{B6ImR3P|MSKPe%`pl#2b&-dEuFdUU*D!eYPig;n<~K=rh7gjIX`Kc-ITf^}KM$ zdr#E7?TMpKd16ky;Qh?@M5lh97!~D-?HoL@vC|7~f9tA#~ zr@%@56<8Cg!2Wg$%>5-tjVE$!bzY8B#kgzJLOJdkD90Vqa$IIF$3eek==ns3FY{%% zH9>~n3uJhvzfAaeGEB6Q;rDtsRF=8ng0pUzzS9kPmK$F0>4t?tZkT22CRlc^*z2|{ z8l7;(yiHOemnAq7Fy}h0Bh_*A@zIMX-mz=P8zZ2>$cEacZPB=K+38z^&;mj|N zIHtrA|2yi4&g&fU)hI_yXz7SbCr2#%<$y!W9I!0M0hQYvaPK4seAPiPj1&&o>7PB0 zeP)ld^XzfvPJ0|N-5y(Yu}5<+do0zk$F-Gq=v`okwA&6_&$Pq*u6F3^ZHMzU?eJ2i zEjFIFMUUOK*m{O7cI#q`v7Ul=B-U1Ner|(b&e@1|w!yJeY|yZy4W`O$(C4o;raiJo zqa14-zu6kkjbEv-@JV2y2lSYe+#RyZKj3S(DUVdxMmG>EXmho)Azt=1A_u2^Du zvZd(zEwQG%B@Xhj#0wghX!+bij4Lc~=Qa!E@fP@`l?7JYTj0BI=J@!QITjo;$GD~D z*tefK8V8zVo~}9et`fYYd@~#oZ-)0LnqhbwGu-4Lw!fL8!7Wn^7xOZ`7MtS8-ljOp z&lLM=nqtf|6Tt~I!DpLHaL*_cY!_pKZ_G__ZmlskUNXiR3C37H-55hV8siEVW4u&v zgmooGXnn{CTP!xhuwF(O=wpP=YDU=f$Pn*l8RD)rhS+7WA=U>Q3MQ^0y1g*K)La9! z-eQ1@M;YM5Cfx;2dKf)f55Kq4 z!-F<@*z%(;mR{Dy{(E)t?i5{&X`_n?wz^pRQ3nGGb#SbhON*PLgC|<+AlvBRr4QPe zcS#!$?$*Yole96mr8b&bX=8DX7S3cX!8+B#1LL$%CTU@UsTOLy(Zmt?nwTTj4XGcY ziT>f5I6z+$=T&In#vBdYwpIhz57fXp{u6KjM>oL={U%VJ z`U`LS{DnD55&K3giCRa@HkA!lizT0nV17r{D%Lo|AO~ZehF63FL;;R z0Idc!z?$Ztke&7uu6Fndg}G$2Y^#qDdhP?H^#1_$zurT5(t8*#y@%P)YhmWnS{UR~3;q{t;QjC# zh*zrtMQSyqw5|s2SMQ+Ts&^1Ce+PMmZ{hl=w{S({EgVgI0}I={f$&$a;n~X9Fh%wn zsxQ5QZX;g7!GABI;=oJLR=xzgiYl;KQU(7Us^Ec`Bi}jT1t=RTp=@_0^bf0qtECm- zJhK8unpQx3)^j+~bSc<9yAOu*@56hG`*7~$J(%A49$3G-3z;kLf{*iE*pq(;>U!US=r6Zn+NRsE z-QzYKyi@}F2baKxpSNH{{4MZkaSNVYy9ok26VV}9kz_U4j2Cw z!^^~C_!?RapKf1+C*!Zd8TD(hXkQTog%?5DovSc@!d0kIzY6{LU4h)NE1-U-5MX>E zj8!XyrHPkeb;xB{cw3FLeB!&ReK%=t~?JW_UGYrc0P3YFCT8c$OGm4JV-UkgCB>_ ziT94@VA8`}*g82E4r=5=TH;yQ9ds5J6rX{v!_I(d{b{(e`814|pN7BrIk2L;ct`a% z8-^^&hSL_=@H_Jq1h+f|1ItdrtjQ-~iTX*Hw>Jw$`DcOh$_X$Wcmi&IJ`M}l90v!7 z<8b`cF$idX4APz+1-%(ZVVL$&$VkeBs=!PzEII;SgN{J>mkbDBlL4Og8K8giFjTfV z42K>cf+155fsXniNZ*|f!M^E`Bi`95dZ)qq>Qty$oC=<1sW9@;LD&{`5VA^A;NplB zxccJ&6l^#Ehnx<;itPQ+t=)bwEl-9klapc6zkQ&&b02K?+y|xwNw6|D3EovDf^tqG zY!vHaT~A7Y-~I{Ua(ORA^w|rotM@>wMSCE`cn{be+zoXhyWv97E?72Tm*7h6geOaP z!d$bRpq0J@)`#za=HhsmFeo01KW+zy<=bI|`F7Zs9tStWd`aB`C81m3K+$Fx+kZ2-)oy}&i#EYrqfKCPU?U_4ZUooM8(?p*4WRXAJ&c>X z9$05R=qId$EarH@JYNHErmlgn&8wjuzKHWsd!kA+p%0PI>1K{7Y{-EF34>axi!Kd)PaJ_dQ*g3N|bc^c+ zjVF4--kUwZqoz9?((Vpcif%BsRV)+_?Ft5qyFkl?&M;2A^Iul_A8h#25mp;@gqc1a zpht)HARpZh-Ystn$;oY?-TBt=qO286{nipbnY4rveoDC35y52)z@!xt98HdaXZg{f zUKRxob&=p@EW{@Q9NUM3#>gh8;%XVMrdcp?|6nn$lS6(1%_JrQ{p0GH~0}{Hs!?8&UIK5U5*#~8CNaY4`k6dAT zoeQ)#asdl3XDDm!1aU(gq2+uBvA&%>tT|x^cEz@E=%o#K{k4XJHr8MfYz2$DSi;k> z77((+99AZo!S%DIpnKOuykj+nshY;H%h?FdL>j`)o(AxAvOc_Cs|RmVbfNOR4%~mB z4fIJ1QgyXpxl9xKN*dtVR~^1gQ-iVQ|D?)xO;VQyf28Bbe@p)=8>EgFKc&^}e@JH* ze3QzLf0e#fewNfMK1o{bKS)jUYo!mzs-?RXZ>6JVZ={87Ur8D4%r^b!js?_2p&+op5Uz`$H-;>a`7+?_en(xOw+iiRv{xz7n{ z;oxJ^jIEi{n2Q-wpSnX*Yel-`+c#A*U!Nk?=kJ#uzuzb2IVDNEx{2?BR_u{Fo!%wM z-|UcnTgOXxJH|n>TY?IQiD z=_q~Z+D>|%-Aa0Gh0@0b(Nfd%aLKlHh$I~jkS6N;NoiBPq__7KQfP#mv^B{|`rd3O zjU8<*y)HJFrnfMW^x_SqQ}sI1m_eFSk7fU2>O205Id5JUll-hUCgt#}n5)yD#Tdjq zjG3i%JEr+gQA}3ig_u=i@?w?*X2&EqX2!fON{#6ipA=I&WM_yirUvQrD@J20wgIaP9BYf>-XZ3bMM^ z7I@A1TF`x8LxFo?b3yMP8mdX_byWQv3{@DRYhFxpnBJ%vuaFLtSWnY zPu0!lKB}Cp15{(3hN#{i8?Fk89BBYT7D_}opZ2x*Jzu-Z0NLs6W{Z*#n=O^=-ddbwL= z_jHe{>_CEQ?&u`dPp@Rvz>oV?`?FJ2g>zC>*Q3%^r~V#N&A*hPa$S?DI@0l&%GB_L zs^6U~)w1|gs5Qwa)*f)!`3? zs+g>+s;p_(RDT1nt9}c^{s05scMz}v|81I79UiX-+xrS&it&Z z8243`~gUDtVww?Q`_#=r(<7m~22noeZgurxA_RG^T-7#w4)`=_Z*H z&oiT;z0IjQ(1HdTSyEn&B{g5QqJUIu>bTT~It{d?@NhdaFt?}cAMI({bq8urccgjC zo#^o(XL5^hp$H07f!O)qw%foU>ou~bgg{S~w+#GR~+J!pNk2fe)PNs44I>N?Mx zhV<~EKEA#bs^v$&1@rAlUJH`q{psAK0J3WrNF$wtX#39~%D5X$X_+Ckc4a7a8x%%O zA>p*cFoKNVM9?&fq}*Lm^lC~p{b(0MADtw+`9q?uB|zbakO~(oDZF<}+UnbiZm74W z59O_??o=DWY-&pN@o>*@Jt$jLy{7+1zyrq*!)_pQfcAG+b>ZVXy;Z)kTa~cgA zGo5t8XV6aVne?x0CUwb}MGNN5rZpYr&~%%*6!UH_z0I9R)7Q?YCw&%>+h_!2r8u$1IYOKHumWpp)hIn{-(psz_Qs6u@u6--!3>+Y_k))A}dL-HzG zqq&-lCatE`_f}I)#2Ui=YiNb$S~@KlbPw*XrB~tWsA}Ijx~;yRGRLo{S-01dZ|DZP zm#~4xHgBMs(Hm*djg3?gu!;0`ZK8I+H_^0Vn`!-(&9v2f3$5I`g~oi_LSg;4(s$KX zN^#pp(QCKS<=Sl&(JhV=Psh=Fo9*PYcsuodv7M&1ji-4>;%SoM4(d962RS|1K~Exf z((0t0X{Up<``AHBG)$!pQ&MTn?Nss$NTbSaX|(i98tL{(r)Amc zRAqLE{AV7b@%InW=HSDW9DkVh)*Ys0Ju|3hP6nBpAEEpiM=18*5xO0iNl|f`wC!^y z-HjD%rJp!TmPR7pWAZW5ym^eCdmpEi^~Wjp-EpdJcY-FRi)b8m!ND7mMe{FYQHIk= zy13{hT`50Frz1|$=3S?#+qYBHBw|czw-nmVsIO(QB!)5w@J z)Mf7(a{Y0JDtnxz^;u`h-XNFujLW6Jg}Kz#^&G8Re2$JiK1cbXd2}i+kG6lvqrn~X z$uvEmvYPWLe9(Ey$URSL<^|MlN&(F(E)Z*kt7yYg!O<&MQM*tgwQWR)Ylys+KGBQDbJf{QfS>Js@*yF{hMmuR%?GCf~(nOZ))Oq=`*i3MZt z$%{g&jJiU%;;&HZ`ztiO?N!oAzDm1)TqWb!BARlzh;o~X=xyI?)SPvV{%IFe&Cp^x zFXDt|8DA&MvDaxoT_+Q(8#I3M4LVwQgG%jh((4&F>3Q)@VwYRAcJ3_-FS$jx&pU(vtkuV`b7 z*VM51HFdf5n$|kJp+ghjP-gxcir0NhBl^81tHW<8>-$^sYx9ocw!fptmG4N~znbh8 zSCi?DYWiqXLnp`7P@mH^RQ0chdc@XJMp7+RRoBwLu=k{~>OFn9^Pch@KhUHJA4o0t z11(nnNY7$Fl55gO`tRLG>KpQjIxhP}E;m0>x%Fq7Kk_sEIq{iB{rXI&+J2!I+rH3` zCtv8J`&YU-{VQ!Q_)0o39ZrDJXy&LG-J|V9g z=(yi6nl<|uIjerr360<6()qXObAHqD^50bK+DO;NHBx3)BTf6!NH)?RN?ZAd%&-5U z(I$T>q0e8+PWns7tNzj^&nD_JrHQ`eG|{|o`bfbSXrsqF`J^!fT z=|8$@s>TK(Y7BkUc-TBOo|T}+3kuYD`g1kz*Q~}tZtC3FTAk00R_D=c)minxg-LApUb2RuzsRlQH*Wlk)n*1hQlP~wvl>>q8ebkN}uF*;m2P=_NH>hPun9lo2V!`hE^*zczfx3Sjc&SART zrnfHp&C+G-hhXUHsCWW47hQ> z0f(pzcu=_k&#pJ%B^HJ}H_(uWiMZIPiH5AP&X6h1kjGyX+s_So>n}srw>IKA!A5*9 z)`*=a8S%h%M!YV~h|?|@@u{aqob}U)lPrvRet#yt3; zG2i@R%-)73Jm1rVb6cD6n;|BwvA~4Qcbc%-NfZ8e-GnP%oA8Nd6P|2u$_^slH@}-H zcbsU-MXOCY?0|^>%{S$jrKarq$&_Pt1-DV~8y8AuJio7q8=h{)Z8w^+S-KhDCNp0A z$c$~jn(-lhbCxO01&7a^Yx|mW_;hogxxt+GryJlIl$wq5lkYdgEbFJCF#F~4)vgU=qtU1oahIhN$ z@a7mBp3%dG+l{kf-6b|$5O2dnj@a;Lvf=3>hWkae4J(^$c&mji-}18MUn0KSx|c1> z#@n*f5?jH`wB@S9wtTd}mPg*TWxY4Hobt<-J&f%*NoL2*;db1svmNgmX2;iN*>Uwc zJ8no4B4Wtj77AA7BRk&y-j2IAi+$$yf}Lj14$=0!v#UKf4!7r?v+a5BI(sfjwCArU z>{;`YJ!?O(=bvxw`Oz&Ps6P`lF8A zLgmQ4N*sB7g(FY;?8rm^IdV%gCpMKi@tt5NUfRZq9eO))#%L#&&2i#QYn=G?E+_Uq z>?C+1PQ0$jiId8lc>h}`-d69#)3u#hY3_iF3Hc|Bd& zXoQPk`?>InB`%!0$%V5MT=-;$3n!g*;dzBF-0GeS|Eh4|gCATt;aV}>gaT&6{t3I^yBH}>D) z#_M*v@$Ca{ta;3hy>s1Iy5z=iOB{RT#)dE5_{j%1-u=^!TdK>r+)&0NY-Ie%O~#U+ zjJJi$_+CpHt96#KYabc67$#%y2{N{vCF2i^Wqd|36(+{X*d$TLscABnpOEp6Tp8D0 zkg@W*V36LI@u8t(#ZSwynx$~o9f&M)ocyj&({Lticf~yB8c;+w#*Nj$hw}}c)pQhk< zvlVQ+P{EPQ6x?C8g4=FTaKKgt>+MkRy*&zEw@<--2Nitrkb+waW<^exg3V4Vc<4C= zCl)C9$^`{KFBJJ)Q}C0U3g$Zsjw@Agk4Fktd#d356$>|^52`_0_>pM^X3uy*G-TX!aV zcP@8y=hx2e{M^-@ugKgvQQ^)*J>1#M%bibqyK@^~cfRE3&i?-Hf_drArGf5j5bVyu zA@1BE)LrzA?hN7X>>T0FAB7x?6uj6dcdiq%DB7LB2^kRM&RIgf3Xw}9O(8vnbQ2OI z#7anoIJR4eB;>BRrk9YbA`N#TvqYNNBJF1)pPwSXW|8ktk^gg1j_e?Jo-NAcA<9`QNg1c6x{uXXh%`!^`8`c^1XulRV(<@YX#4$ zQt;d73jXhjXwNdyhW8b$E85Uqv}KTJQ(w`xmZFV6oLBJaTm_HMQLv%VfdiQeb`?4i zm!ja$NeULSU6e=Yc9PKX&gSAA1CfW8g1?JrV7Pb|&j0_J zcrWLe*K!{DT+Z{##4~h9&eMwJ-1Cy0<>%%6N-$O8kI6YOUCyd~a*o_37iE<5pEYuB zw^W=zSI((Z<(xNG93Lv@lYQm9JyxXGUd}R<^Sv;UUJG%)LU4y2MS2!;mJH;)MqSSI zOUAFi$oTg=88=tR_}fDnm)(-_kwRfx&db<7TPE0tGVZWn##eXBgq@V}mKDNA&6Ba& zR2fH)mT}L4G9J)f#@*V>I8>6cUa*XBdCGX1lZ@RgWSpZbCrCs&^E(v`!7y{^0N%E`ihM+!TBS=e)FuPYxC_WiH0 z^KEAeTRz5>Q~SGeUT0S(bQOB+%DWWedK*{v(|6^HKQ6rdvkRNQbm901F066Qg-7MP zaLzFo{+jHmX19Ft|EMz$Pjcq5o1J;c5@*4Rb7s3?&Rp5enRm8y=BOZNzU}7BJi=ZPHc0=iG9+Y*l(v3yR3F%wb@QwI?9Q6_Hq(@F(-Z}`s@Xw z@BS_N@JVV;!mo5>#}|$~I54geGE4XyBOKVIn*+a)95}_tfqU3G zaGjQe;O_`Orplh@+!j7efjxU=+VjNS_PlSEJ@a&XzB|O8OFP+fQG`8bD(rc&nLW2` zvg7ZycDz^kOMX}EIQx_xdnDWOrVVynHOG!UN80g_SUX-FE&MJIJ5DvXo&8B?ejTmd(GUdV?Qw~fp6+Bl{em2IGow}HEw_sDAWoydo1%GI(7^AGaVZzf- znQ-UbCTzRdgddF%`#PAgR|^wXnVWFS2EinHZptQYgAup8C&pB{MqHa{#2L$sxQ}4k*LO7H4T4)_WNyT(>J9n*6GLuy!H~C$ zaoHU)K5L$2$Zp*YIW*Leqiqd2_>X~j2E;h8(15RI81R}+1{^WXfS>j>;2Gft{L9XO zXZ_XZ$`|^Kf^oDpL!a+$)MxFf`rM+2zUXiDxu=ajcmJ)&EuZVL?4ln3Ox0svqsQ~a z*i+tFu#Z~kad%TaF0Iq$jt_MOKU$ad5_P%HVqM-bRF|)`)a7cy`Twga#8`_$!8%-Ip(A)q+FVzr&9n2gxh6rIyD!q_ql2}%9<({kMVrU{ z)8frlVw`n&esx^7#bxoEX)#Tibnk-GyN62ivIPB?w|QZJ*WSoeBWQB z`>ugRkRS~nBG!ShZJ=(YKS{pzC%x$SlU8f|BvY=Z)${A=MQ}aIKmMR@89!*`h#xe> z;Rm&P_?-;5eW!~ZztbS~?^IdvjXKTwM*IE0(bIQz)SOaBh6C$J&7zJfZhoco)nBP6 ze5INnUub;R7rHa{3%R;{q5h9P)52|^X;p{MG`IN^^*Hy5tfqaU%O0Pof5k^C+x3yK z>qpwE`H`*_e4v_{ALzUH2daMYp04hBPn%=kQ;gPodQebHeP-6uMXy@2tgNA)yJ~1b z=Nj6eRzs`KRnyoh)f6nRrs~JJ3pqNzmI5O)+3ra>=8{deMJ2)m5F)vGWsGbqvX9_e4AEx8vdaO6e0Y;=)Y=U<>xqc4!5=>_Unz_e{Fi?TA^P!Zi8 zM|8oQ=m4n%H%Uc47Aks31vG7Z0sR#7_fzRSm5w`4p62IiqAH(~#^#gCG@ovs&!g+3 z^XROxnE%f^M}tS6BWuHR#AkD<@335YuA57}a?VoTptEG8b(VT$ouSqJ&d}k1rztP< zH0Ad^O-CDZXk&T~4d|LfcJ>S zBD0NI!^ zlswL6Qs2RuG+!f=HXJ=dn|mCgWepiL>OclXw$Gry9}d&$9fxUP^kJ%daflYJJ48PO zFKhUNbW$x$Cq1`x>Ub@U=1obXy%uS7G(VM23`?bhTB)>7y!#o};~;tdOre+iQfN!- z6!NV;K)3oR&g@Do02TnsY<56ynUn`vX5G-@1u~6B(m$0 zL|?un()nG9G$%Td3?+Do?Q_t3bZd+3Pz9(s0oH>r2t zO%9)Tk>`$G*-{&$-Vz_n!N_A200vaUbVc-^UGO z?&IN)o_Na46D>wOaBr{&f`JE)uXV>N7k7NVz#Vu0yoZ8w_wcdmJ)Hl+4PWnZ!`VZ3 z@qXZ4Y$G%$Ri!K5z3qx$=elBVx(iM^?Sk5hF1R}84(e~cgSuVLIP;-13U!<@zsL!n z*g4^z$xbMXw=w3>Z8R1+V(~LaJYeXEg*6Unc*g-F<~iVq*DdtTzljsa-$d8F_E-^c z180|A$F0+^$t$B9Xeew!EdwCgGwOm5fyo8I+T|}2yTl~>^0R`F@ zsDGpUt`FyNe4jP;=~`pT<#TBF`7BNuJcF-Sok5MOR_K*ri8Vu~aSrb^ZohU4E%_(W zX4nEx@GNlcwf|6se*(V`9Y-6z<0yUA99`m%Vc)<}+`jTCKDm4Z^FAKN{@z0($lbWCZWmh5*@c0}cH*ay9hh9c zovwRq$7lPtp`HI$T>X0s_Kw+t0ozP*$$b-y`>`44$#2Gc>o?&)r;Ru(#Ta)BH{exf z1A5x6NAHj8@J{zywA5OQ`e%$#=A|KisWZS6vkg#iSRY*i*Pz&+)pV_GHD+$3DUdw@ zcV{u^BF$iw0S{SwJxobhh4FnW@tO8Yync2C8o$&<**YDJpQ%H~)8*LZzYMPyXk#x& z8;@;TiYa%raBRvFG#g!v-YXX)UeKg#Q;V>*aUpiiS%^)C7hqw)e5COX=)$G%3~ZW* zGI!MRL(*K_Gdu@dbmrhC>)F`zau)tqI}?9SpNSg#X5i(A(~+M&4ZCIOdkKb9(eTC; z-1liR{?|DPEf!9~LnkJpaqt9O@J9_rs%rRS^LX^QGY*ZC#$xB-7<{;F3@$pOiu?!_ zTwTG%go#{SxPybi;n%Kp@a_e9p47af-tyJiB%CXZ8vI zBU`rM1FIGg$8L~&$J$(pWqs>o*x23CZ0grnY|iqRY+>jNHeWT8{q7LXvK^spmXKbav)oKH-L>E@Mq6kJYtvp_GKH49>*nRHapFpEqiv2t+&6zw(h^kwym^bTgRPa z>$~VXML8$gg4ZY5^t;E{PyZceBMc9)4`-OM4x_u+GbP(uvrk)CqlcT>rRR;=six~# zg@uOfkjxskxrSlOlUK3%Pj%U>Ys=WLd$rh99ZmMD>H_wAyEVkIHG}QHGnM5Y zpTsWFS7Ucf8_U`cbJ^HpCART{JUibosi?4B_D3YuEgXhok>zj`9-yYw^XUjM6<;@uWll&$8^QN=;o|)tMT}JYJxHXip z@JeOETkDL3+*5B7Jk0$PekIr?e2-n9p!{N70$KAdUfIGhJ}Km*t~cLwl}Xk2RcmY} z=vkiMs5j@_bv^BmkMthK#p*4O&D7(*uF{(uIjpxTSDrU$qQ={vHJfL!PK%e3%3%;=f=ZyFWw!AN4&ACgLo&dhVrg{h~jPQc*AR2 z@R4V9g5@0!PT}eO$>0^J=I|D6F60?Hm(taiN?v4NJ+EhR8*li(9v*!_!_)gM;;oXA zWMXH@FcL(b(Kb_Jz?RF*x<7`gjvCM0NSnxXl}};x2d6Wq#>{3;YpOFw>*q6lM;0-+ zt}bD!eYBY=(K?Lgx0TGee>^6?pD-u6227sDT1HiW12fNT6Qgq8l*w`3#vBXT$z*=o z!${=pV^r!6GMytwn6NR&nFR|h7>6~dnU}lIFyU6#jJ4whM$!KgV;615d`P*@q!is` za{3&Yxem9PqYBQ9v+o_oYq~4r7*1XH^21@pKn ziqSj$ib?Ez&8XYOFy}>Yn5QmpnP}xWCdBtWV>{&|voQ1%lR7`1f!GA*u`bK}W|8SN zNMw35l9=D7Da@mSR7P*#SBCxfjhS&GgE4Q)WL(aDXWV*zFlX$t87)B$ljoSr?2yT4 z;_ekN-JIWy%EKZ?dBPv2@kt32O8IPhp=C_0`aeeUWd)<7S;ZK|Rx?`5YMH?gbxg?0 z24*(Dk+}`cOj2SC^GCmp$xdx&Le_RNCh1+w?+rZ+FRPcizNw#i^kabWG#O%!WDhe+ zTSgh*90Ak6MZ^T06oUv2ad_Gw4!2)O!0wZhFit}XlIx|wEK(ZE|C52O>aq}1D+>c* za07t77;J`CQFg&6JHNoduB8u>h95UI?xhiy(8BCUlo+g4E;1Alk76s+G0iO{Nx@J1qqv(T3ZD+Rz@i z3=GdMhnpHY5L%@JF@d`9Z1)Pd&Rq#4Yb7+?UIkY`4?6qwU~4Q7{7x~DHVfbn#XA)| zB=FH>HQbb514|Ouz}L(AV4!6H;S?;;9%2a7&5S@th30_HTnl3z*1_ME>)~F>+a34>7@xM9yNt`YFhxZw?MShRuJcH1EzBu?2p_I zhYs$5^<#Fzn9QB<)qWT3U%nd(8+XI<;5~48=U#X!X9iL9UG~Qp_JNhgewbahAHF;| z0I=>LgbW>ox|l=2F+U7b)sBD?eJ8%s{wVls9|P^WV-Wk;9JnUOVW;RgT#Y*cPXGM} z))Os&{IGxy`;%~c=_wehJ_XzTPJ`zLOL#S82`^t;f%~B|u$6ljdXvw>jSJ_XevUP0 z|F(w1F6ZIQN*g%XXah?EEpFqGhZBreJAtL1Gh})>gIc{a?1VdT%jXURHr|03t6ku^ zuM2oIyTE_?uCU~hE7Z5Rf~Ub4t7_+usd-x4OXu!+T)te-BQz-h(R! z?r`amJD9h)1JU;YIX@3bY4U(mt35&F;|b0Uo-oMVhy4%k!|U4n(7ehECVF~-Zj~44 z>plQI%C4JP{s8)ydIR6t8_xdm29Bl=JiX-ulM8&{&b){4@9IOCm;De9%%m|Pw!ZKn z-50zj`N54deqfg52eZaJg5nd8;Kt`iz)|pr`v?7D^o>946@LuRc0PvUh{rH8@EDXf z1%P5u01UPTK>nI15a9g;w$waXYjf18FcDC2Q`=Hu%PHU%%2wu zV=sq7>$gyNH$Du^{|f`Lk7006DjdXjg~N%kaQM(onRo^fFwr{#G%F)uu~sBZx)}-G zKO^DuloxQ?@&(8wyZ|p*`qs*xD6j~Rg7@7~(5C+q#(2GiIpr^5#-djscl8yNrN4rw z<6eWY`D>_*eGSJ2uOWX^G-y7Kh6{Dk5WXx1Qf|dS*3THA2{|Fi;tia9{|2Us#X^!v zENl*lg|xa@&{*~sF5P?!vESc9f!aH$F@FdD-n@ga!|%XveH?7}iG#uNIJmdqJ;+{q z57x==Aw}^6i1vH{jnEIkYx@AJR(*t-P9LEs`y;%Y_zCtM{{*cuG$v~B6XY9y26fNR zU|#$g+-Ai?pjA9P{umE8Me(q0V*)5XOn`S~31Bdf53DsGX3)5+a}q2>Ze}6NmxZEo z7P99dys<{O8jr9<{0n4n`~tguzCdQ_7f_#*2v$~!5cob3K8_?pf>9Dgx+j5sK@zN< zk_=7e$zcB~8HT%(!CWr|;v7<-Eh7a~xT!FGPb!RinhL!&sgSrZ4bI!7fl@r>^9j>H zY~5EdbN>nfd0!!I!Z#>B^bHEazCl9MH*nQThc%bdp^~2tmSP!Dwk`u!xo3cVZU(#> zp9#tPsf1)gRBa~MEy#jp=dz$ME(?wfWI+M*9kd+2!^N-P;kn!oh&TBGpC0^xr-eV@ z?8Kj-e()!xhx~-CH9sMFUN%g&%!Y$8+2Gol4NsQmfZydDuuI4RqtP4~Sp5qg(zv?` zUw?s|7I4#u49G32`z-T)rFup=Qq4M{u?C1e^cJ!Z?K$O1XoWK!TIna*iu^r zW9Jq_^6_HI87zj}>S9%eV}DUCLnk*D~-DFNcQJ<)D6}95yGE!`}XK z*tq;3%sKxLYNG$ay{3OKab5*@m{&kUa0M**TLIfARKk&+m9X2Z5|;j`gl?HC2sEsM zg*U6F{p*D*K6VO z$69depq~rsVB7IJ;6AN`4@GsLuTl^1Hr9ijQ$4K5dN|!z4;Pj+z%j}oT=A>{y8bkP zk7^@K+|&rpw;Q2|-w2$ZMp(3{iOw&YU_xLM)a5rpfI>4YH*AKutIaUsT{D61h>MT->u-U*alw=+92yn8}MV=;6Y6rY@XB( zty|i`#MM?09$?Ew3I9dP4*2OLZ5fJK8HP^#Gp=Z&r~&08+6=<$=YtTLHwZ4`L$FDE2)d6B!L0{F z(2+C*YdeO(e)=#xF&&1W8^hrEdKfm94#S|_2)L~r0nvXWVCFjlk5We*G0BxA`)VX9lS-1T zmzN?MQ>Dnz5}KUHK#E-0B}FEklp=4hN)eui6!{oTW6Ix2k(+5!B>OkzLDG10{b4C` zTuGW-nNDNTmr9e1hSKEFE@`sTLYhd}Ns~l3X>uk|nkdFdlb}RtGCfzCcvnf2zHVu< zSxScZjF%zb=gE+sl`@30QHD(3FGD6+$q<4g}5xqRh1=+X3LT*%Vfz1Ls?S2LzajimnCCtWyv@vSt9#Tmb8S*lH@p9;*u&$ zd4RH{zDkxjbjcD$aXI3uB1d{>$dMgdawK%M9H};yBjXOqkrij;$foOZWa~XSvMzw~ zDWl|w)Mq)8{f!<|C`Xpn$dQ~bIdVWuo|JOr$;N5&LHPddNJlb`~5!mE-eneFmq!>By@EU!Q&O;8|Ka}~%N zZ3R-jT7k%#D3EFU6v$i)1v14}fk-(hP`050i3(64Cn6Py%6kP8lcYf4rvhRBD3C>U z3dFrjfs_j{L@EcC!_U=MqKokf%uQtyd%$c2I`FVMQ{|k}?e_GxM6GB2n{H zBw>#g$*gci@*q}`bnq34e!3!Y%u^)q%M?jbgCc3_RwV5LMN%WDM6$*zk!RDD$SKN4 zn5m;gzOPmyCpIdPj-5)x@~{#qK1KNnwo2r-y%I@rRU)0yW8KO*bDc@7$tui?muS_B- z^C2fwnKa}oldeC?q_t9+6gMi9_nnmgFsMw37>BgTa>zX{hfJQpAy1}rh{8M$IkT8@ zL3KFvTICQOBM#ZOi9^m(PN=OJhnzmbA=@lCMB^-nblP%A)HM#-;m9Gat{igZK8JMs za>$WD4q=~jh>x~ z1ypLN)KV#;5>LgQ%2p~;R9@2k*HHOJ&q1h!({l>wxz|&1q-DLPWoFQ_3uqm3XdZEUOH`7$B!ud6I-lBx>b8UG*dUHeoMNfYqPe7$+Mt8lqA!d~ zTBvREsf}Jep~w1jiKZ`Y8@1sDPg-|3F6C5GJKm;kxWy%Yl%4YX3YW-Sq`Ep!b$f=E zeTqw#ouGC;$|Y?FsGj!H_E5gc*sWC8o491% z?=O1&WO2ydG!Ak5!XY<4(`(=zhv>fMkdbf>c^6Et!^iac^5&51?i|wZ%pvAC>2-RA zLzHYdWV0oQTszJofd@GxW;cht-9nkZ8|eA;IpnY&ho~>(kn)8b;xdOrW=`dh=y9}M zWqMsob4ag1nHcpe6X$ki^0A&WV*XKIQAB-44)q=B)Q2Q0lNX;TKjsbP2S-vL@>H2z z^iw7hp3210neKO8ne4PxCJ~m(r0JM4nZ8e%tlg$e4pPp{iPg&FF!f^_sXtSveywMc zGI^(>OpZ~1Cqez5AN79|Ta<_=^@lywFK)`A{_(34$)^5tkowJWFQ^ZFszhczr2f>6 z?sHR#q+e7b_bipjnxjgjemCVDZ&o6521>+f1@)_z9Pxiq2s}PMKU;*iVFQMrAU4bDv)Qb3dEvPflMz{AQ>47PJ#MiItC8Q6Z1BCB3CI- zLh|Lwd^%=^eU>LGbPPR5$I?VPriwYrljXMZ#OyzLV!c3q#IL?_9_{or6EJMQr^!|X&G{&SDGBCktRm@bPkmwO`2n+$;)86%~P5P zuS*kOOKCE7pEP;2fzG>DNRwl8rAgcvI?oc5CW|_x$j)*pa`uN5xt1VB>|RI_OFt=M z>Lf+x*hrCl+BQ@JEr`$LlWP<~KBgd~x9C`lGM zND`y7lEiesB-yk)n{Hgpa;tx$rn$r8jgMuOx9NRSOK66Ea# z38HjFg6!WcK>}CO`Rg1B(#Mq`oKbNysZpFvEEFg5$>OB-wKz%h7bhN0;>6fmob*$E zx&L}`vS^t&iJK-)H08y~<6bc`SRqC>Q6`bsC(0svE=IaM#0bYujPgar$gC}5WP+X; z5t}PU$~bgh-XnsNOc59ci@@7f1nG1hUp0+Nw-7Qjgy0t>gbg-As9Yz6Ba?;jwOs(5 zGy$yf7r3vD?S}TkE?`5u;N1BxP*~jso{C*C@TU_tMs|XeZ6`$N zcfuRxP6#RO0J|3*pm(tYs`NYHf^r8mm$bvC$ae6#&k2CF}^L}b)*IMEo=eBzGjF>YKHmun!$Hh zGc-(ZhB-}5VEn!bcH1|><_%4-K(z@vOB*31yb)HOYlP1$8)24sBiMd#fS893kaw^F z%GDbnzr7ybey)eh4)rjP-p41Z*29|8I(QXY2Lj7F&|6*yhevARY+5axaIb~6JLxll zDYcM7xlM;&)j+jP4Q$h^fhe&WXw0aFv0l|MZ%;MMnN|(*wN+5^stSB;sz7H|6(kEQ zVa2yf@N=((^6iztomdHr{#Af>cm>R~tbie{3Sj&G!AbTX2ps-_{rZ2z@jD!5maWE_y2delE)GodQ zMNOK6rRFW91il5Qoo_)$@hudl#=`Myu~4NQ3tO7r!0TskpnvZh(B{5@gXuAF$vy^d z>cqg6mS{K}8VxHb?@GXphWF{OVW0hLXkY#sY@1&}s!D6G8^3T;b6!KLmws62TN?pvP2fW&jy z`S}?~{oLMk5DF#CuX13`!%XzlQWol<^q`jao%obm;$$-c1n zC(R3V^C8GAeF#}qK5*-y4`{6Ofs}r4FpcttpZmOFwW2qK;sY2u`v44QJb;_IUJ&i* z1v$&SpsMCRH2U6$>UH-ar{5D|UU9M5aP&2@k@x>k07i32?0-vWt=w_xX`o8XyG*<4!oz%a``ye=91>3 zBOpe3UK)mn0Rj&J={*PwO%H-p`UDZmnZKA#|yjQ>i3;+boNeIer*Tz3>UaT{d+*$Nw$ZiP3lTR^J96pUAx z!ZlA52&~--L(edQ@NERvMgsgEVPMa81~MXfuwYaV zu5Z_a#K=|9HL?=MZ(j)uBUixE5nY(KO&63SbfA7{ImB*R4whldK#i_vzcv4G3t3nkF9VsUoi;% zA!2&Y3Yq090_JGk2y=bcFyq`m$XtIsz#QZCGrDEH%z%9l^KwQvvoWQU`D5O}?3HR~ zzD2Y$vp2Lb){RX}v|A%nvao^a`%%Y8oULWVI5kZBn<^%IYb6uZ`Hwm1UCwZpl`-$~ zOPO`HCCrbpe;C6LMNIUr-;8Wu0kg|5pYherW72>BVp=ZcFp_H7jPj=+jN+c}%t&7* zQ{k7veAZ28ZvXzu=wC`>dd8(PPd+3wy1SB?uRUKFjx&LJ&q~$e8&hh-!f`H-!SS{G0Y-`Xh!4ZD`t}MOGcvM1yg+|l1Z2w!MLV{ zF(&4rjJ)`B=1WKjb9!|!qg)=uyu2RBte*UY`5yn6*}B)C$?o%GjC_5W_sbqKQ}VnS zd+P_xA7w9QakM9W-^7DSYrMxuySgz3>UWtdX)a9Eu{%tG$cY(xO7kOvBV+a978B5U zgP{r5nLnqlFwNl?nchkprhlq6(_waosq#I|{K&OnVwFxX?#9QMW6p;e?c@W@$cPz} zymAk7%XTND7rTvVZ#HE@=51y+n;SE|PuDR4C58+$UY{x5MwlxeJVrHhCG%2JmszuB z8B=ggi#hp8lNst-z_>5gV5Xg(%e)Dn#pqW~XY!{^W&Ybci5d1$W4v<4G8zi1Ov*YA zbI?(d89_NFXi%Cl(2-=Cti_mxdq;R~IeonDb)CEuUz&N9I(0mY=nCH8oKl`&U?FeK z*k8Q9ds(~$iLX5OYl%Fo?s(n-%lEwf)iFHF{ZTyk{7~MPO;35^Y5qJj#)p^o-h*eL z>B=h%cjOK5?06S6&+;ZuH|KS5_wstgO?dNq^?B~~y1dyX3wdonX7E}Q$MI&z$@8Xc z7U-Q=)}S|Ia-QB+30AMaIb3f-;eEZ6*KPEIx31IsJ$I6xdVk5PkKvB1?(dFRIjMsE zoMh-4Z|`0aKiW7YVXUHYf^gBrgmU!<3A1z~6Ecl3A$NOz!pb9!3By*x1SL@5ryGpt zYi^jyXG|9HySJ_2Z{Kae-@VU-FFLrFZ*tU}5692)bN-`5iw}`e|bbLf7|S4{_>Cxe#w+RzTx9x{z?TgRx4A2m35J3lZ@n8GjT;WFHxCYcteFX z*Bi@T?H|utzn{piJwJsV(45Y?HqB)FBj&J%=JQyq=?mENrHj~|kCw2iJG9woWgT{Q z)(Y0vS&x0T2G|$Ft68^?2JHItYuU1e8(5RNjjUgY3Hy29RyJfHMb9Du*{;7bf7Zp)+iW2IkD&fM@%BZBm!M~q4=zoZd`cf+R`;`jr-L8t? z22^oI@EEjMI~D_)$6~^Rarkw`c*L^t7;;;UGO;G$!kh`1XFCy3Oqzr>iIdRu#AFPU zpMte-rl9JsskmThDryE#!^uX|vA1D5#(T`bQ`$38qG%@Gy*3L6r_aWnX|pllqRV_VShxUVvKOF~%|cu^ZV_64UW88jHPKO^ ziKm_|Mm?h?*ju**AK%qN^+iiDFncMESZm|jG0X7shh^x!XF2)}F2~zXbkGcRQSF~D zCf-_sTV}1KT%MJvabgvom)673NIk?2JWOij;Y&9LZ!82{`2(=Tir@*Q)mR+88nsQ= zpl#b4eCnxB^L!iNi);hDd)5%QDjT6F+6etj*5cUKwP@$Q4!)N7>M;~M zWR4dG%rVRRI7(@rz}e|1Q2pqCs5tx|7Cp2;=fx*+e8x$1KYEJBGMu7u7pHNJrX?DF zv!prFt+2b_3PZfkpw|4e7@B+*2hGmWT;1o;)Xf?<&pMBb6V7ATHXHPBr126C7tmvZ zE&hFDi;C+n;`H*1IPT&lY*Dz35zjB9{;DgOm~#cE|7V9sN9@qa`zqemxQ5nWuHmYk z*RiJYI-a|E1IxzR%RkDR)N%LTWv*VqBqJaoY8S8(*zGNf^zMq-t)%Wx!zc; z=7UoX`Jic-51woCL3^!-c;nJT8h7;&*NXchXM-O4=_y)h2IC#;VDyO#MvuN=ytpa^H(d`wrNj^ld3%QYjhL?x_e|_c8(vnmRW4eCyc#r1n*(a0|r zH49=X|L!d&Z+VMnJ>H_!_qTXg_8ktaeTO@4zr)8#@9_KRJ8aa8!>-G5SpPl_(>vqP zXYqU7X!#ynBj4k-n)lc<;{%!<{D4u9KVWU)2g>ODh|^3z;$*jvDDmwh7KwdAKlp_D zcAxO~`%k#L;}fPV{EQPUKI6XUpV6i4GX_tH$7eg@@xEs~p3IELg^~$aLK5(TT>|#U zCE$N;2{ewBkCNtmTpq+n(;`0ZP+`$v6N^)vS*-lR;)4Me7iuHMS|UylN3<(Pq?jaZ z+4=>g+`gb(>KE)E{(?En6VdxjBCd%@#NzTq+^3d=-?k*-RM#Xtn3RNf2a@oqRx$>i zOh%WGWZYkzj1##jn7lp(cic?DUmsIYw=D%-=B8rufmE#ZNyVP5RBRDT!|au57;r8P zw??F4$KN!(I_4|38Gpr1x4zOCr>~gW@)gTxeZ#7~-|&~`H++%y4Nnbyqt|>oMx98< zc~8>u{;zbbl*+&?qbL3Ac&R%YVL@mc7-F$)Xq zvrzOd3&+=I;n>OFam4gH{&f6~E+4<+f~N2IY3dJLwCxApbNYe#pMIcZ^ADUh?I+IM z_7jzyeqzBY zLI=ZNbo~E??h(JRz33P6%SYCoXM@rDjqXfUl zm*AMX64X~M#l55ycb_gr#;+9RQ%W(ZwGqwp7pf4RRAGHe6<%qo!VZ;c+_I_~eUDUQvP(4<##H04!fJdsQjJ$< z*WiMUHJD^wL-~9)_zY{XrMd>E$=BivtyQHRl;b$DZZJuc_fW8UF<+~rh{NiXVAgjKpHuR_Q z@1tuezwtyH+BvnMS7;l0q_m-RWgD&%wPC}wcDxSl*uTFW_g-zsr~d7j^|2kx3fi%- zs~zLG9e8;$jj`X{fw8ALaIQ-S-U{o$_+`{-6(&w8{@Baqp4pvX2f>myzkv;Rojh^gxwf9u?GW}_26Zb9$abBgXOn+@N_^A zmd5qq(w{wermhD)g+1syp%)#N_Tr9>y(n+qOF5FgsPV8Dy!g z)Q3`Y`|t}LRKVIkcqr`T~ zq&(S=$@cv?@US1pzUs$u$^AI|yC2hA`tgeR04h%yz`L3Q*k~|7c1E}6KfW88{pXwmanm34Rc!OxTWe^vc58~jZL455-e?J|>q__0{ zuY-89cn}{p4`R4r5TB?F;iWl4sJmhaOO1!{#DO6!JUc}D=@1_C8NyrPLzG=GgqE2@ zxTiWuY6r;wCqWkPo+_`iVMPwAcH;Mf6(D*GaA%MJb0Y<){f@FfSph!(CcwA9 z1Q=c-K>Hd2^4bJg-Y>utVnX~SFT|N+g}8ev<$|gU@!S$2jYk&ZBz+;K8w=5FyAX5s z32}kB5KmhQ@%{xN`d<^`9m*0lyC+1hj}Tu6P`2oEA^JoKu`E`Iil2ozBTLUJf|W;DK!z^oFc-1GetOi zo(MNB5~0~r`l&0zSv(PzuNI-bkq9M>MR>+Ug#2wHY~Lk9nSFHIAraOd72&HBBHVq7 zezy|gK5G%iT@YdCB@vFfD#FP(=)Si^SmY=|4`&h1bEQlXHxbHvh;aLT5#D+rLT?`t zy84RnIOU_xc`U-r01@s86k&3Z2*(AB&?H1e?@dK$`CNqCLPa3GSwLp?UcpllM$vLs((zlF01-_rI}+!SHYbrH7Mi7<<{*PXU|IcD!|j~0!*7E zKyi)$)g|b0{i8Uoc@(?LDPK2l6gPbv#hmz2TopZvt|6ny`i$c5J5=mOF~MpSoez)V z^6jITX*7yPD@HMF{wOw19>uZBqc~SIf|I*Ou&;UqKNV8nkxu=}=Mg;cas=a^j9`a5 zW%}BW;G}aSD0^fCOSg`okNya1YmeZ^StB@o%m|*7pzPo7Vf<1}C7*I_QistxZWw2V z4&!I}{C8v+mA2CDtA}yY;$a+`GK`4|!*s4YghLHOXk9dfKfewk=RNhc z&xg>+YY11`521?H5ayauAH04D#dLZLJ5; zYySXxuN%OtO9$w@cK}DF2k=p6KTi1Dk2k;dsBX!eQ4g%sbPCUfa7+XGIsLOs1crPP|{!iN7*Bao}|)$~@@AQQJ-|+1p9y zpPgttqZ9v1bkb)R9r!V;0|n6?sQI7+4Q)Gc%^o_J(d)p@DIFLlY)4Ynj)`gQs1Zr| z)^{n_+Oi$9P1>7pU+?`Tfu zJCgH#M`KMnd+5kJ^5M3fip)DI>HUt@w!WojX>X~{^DXtg`H5xkU?2=A;DBVd8@89tH18?X+@Eh(Ea(k3BzqQuCp~C5J zXu+S?bh+*|`6a$4a(GQC7hjXV+H1PH;598C^qR^fuV{bzD=Kn-MRRYyqEmZbk%QtZ z3LO55eBXAEMNS84`E=00JKSd8*Fkd2JIHxN2Yq-aA^BVh?edY(vD=(?q%EPaL zxP-)S+G$s2JJq5w&W~y$qvuW3|7jClKifnvRhnq>lqO!kp^=UjG?Kn|BWZAl zTUNc1+GQJg?6H9+S2WPm;0F46w}CeAX`nj`8_1(i0|nL8lUqbR-7u@CwL10mNui#s z``6R(`Z_X-s-p_?IvTydj#e+OBhCJGq)}H(N|CiR#H^Nbw7FjY{t(vY*tERu7tLQ>@6%{#G(I|r|TEC`> zbVpUuk&c(NGwCJC*}S9=x}43l_$4jt`;ro0R?_Ss&bYr>NzYX)>D{zS>hrmR`es(p zN6u@?IbK1QN)?<#RYCdn<+LrloD%Mo(=hJS?wDClH@=jSU1k|Qawwx)`emfGqKw84 zETi=57o;8Zg6ginpeFvt9LuA3OY*4wZ!YB&=8}VRE~)G1($^)qbpLM-4Jyo`OHMhIe>8`NEzTj~cQ)q2|H7ASv!kHwSl1V46GU=&SCPh!n0~=NohmBQsJ}-V%|4k%3W{ko_jf7{ z%SojsJ07>$mr7e^rBZ9xb2^^zoNDeqC#9{=$!yefN~upFiC+qRJIm3bD^jTAA5mH! zk(E8sY8|2$8KMjC7`=~WwD%UHNEJri!x+tZDW*;CV$#y*aVL2(E$>ODp()8!VwTL~ zugNrZOfm)6Cy|VA65T(YL`_SQXvU93+L@L}=PeWIrdlFh8O!TWG$hbs-vs*aR08=e zPM{6n;^{?7JZ(3Nr?_qL{~tF~uZ|-V_c-!B8b`77<0$H5EV;$UlA%#7w?$&9dq6BX z7sb$m$1xPPH-@H6jiH-u(UcPyO})=Xlbm8St^XE9TPTWF-HW0boK^K@NEF4EM$!=n z9`D;1Ne`z+(xA2ox)cyWg{LEU>?wk_{ufT?62r;VD4Zf(Hpfe zdO9kMmQ{sP+Otp+bVDg%Mkw`?aE?`A2;Dm!LP7E&l=>-{vSWiud^MOnm4oT>?;u*4 z8bojJ1}*?KJG_$bNxuF)0b|B_)^UoUy_ygrK2Bw$Uf4CA}{z*$`T)9U%V+e zme)AB;!S&(d(*hDUX+vIMaQps(btt;bnUw*y-D(9m|P4eWFxhd?J9ecXx6W;;J^o&dREHr0!>q^lz^t{T}N`Zz~*l&cuOS)g9=dlmm?}d_rQYC#1RQ z2{rb8Li^GmQ|_I|oa*qHZv3#PlmvVF@3K8jUSdxxK0KoJp^s?o$w#zA_7RQYvHeaD zJBr$GN2ey((b$)^6l-rwDr&ZrJH(cd`;h!hAJX474{7`F2V|Y}fauBtYF+$*zIWMB zpI{sMd(4L3&#A_zs>MypUi-x?`&SERh zDYT>$ftKWT#F7f9TGHDZ3;O-Uf_kf4(9gjZ)RARQS$ECJNn}pCJ!Uj6%8W8ko6%8O zGy2wSN_SjL>BlZpIw5UJ`S~U^-Hhi~R+~`3ch296xktYZ?$H>Yhnd-GOfy}LY3y!e z?vESu?{=58`roC7>vu@C>o)o8-KJONw@7-^Et-*RM3WX8(I1bSlsEDw8JXRn@!zhK z+o|g`q~RJJR^wc*w5yb_c$Mn>4Cy7WUzBWhh0K3mCK&MCQsX5$rhbX4(=O6d#fx;^ z_W}iuxj<>==PC2+If^`Sj?8P$(x$Cv=~J=+naLSYUsql;Y3LbxZgiTn+&Hi6z$sp{ zQMBuxxELGLD?pg^1Br1ndnT2AYeZrw4;-g=BCBp;^d_SrA>d?lKIyC?8K7Jpy zDNaY54&?2nPs{hxMc+NtG-3}a-Puid-|eCp?Ojx!twl|WT2$kyNzaFA(&HODN%NHk z_0rNH*Hm?ywNRa$oz>`9KQ-EZaR=RRRHeABs#F}moho?#G56s%3jVQ`Zs>2Nm1SF~ z9b4#j&}QmCW-}Sx-9*iAHjdVF(g?tyP@OfqfmGs#_`8?+tTeFTHY*Ai z#I+P@x`sAFO9|+I2^XWZtZ# z=AA3)0b4=yWmiyw?Q&Z7eHnQlUPk{4meP)8OUcGvk&*`}@;uiPdQ-EQI@c|xx)23o zqZP>Z)*{;3Ay56)$P@fx~({f)BG;>@$*||A?{?u zOy97(+h4QR(XW_dgM?l3YiC{tZ7gM3E6e}g%(AkYSmc97c7Im`)0$Gxq$IU0A+&~R zT&`xdqAI4<=Os(YuV54G%h@sQGUhe?1uK44!rp}!v!7Rr__~Th_P$R6E6dMg0grOo z*}XYz?zC)HF3Du)Lo?XFi|NcnDUE&m`88sy_U%y25{B!~< zUL4O#zs9m`ieXVE(adg36gx6JlFhFSXC2SN*i*ew2H6l+^)`qdj|yb(3wD~zU8B zwao6{Dt6UUV0)#N*;1z!Y{>LwtUh1~3tFVWE+#Bw%U8>>ui0~1><(FW_N5G)r8|RF zOQtd_gUM`V_XO5%G>+N!9mAAtMzWSs(#+Cj7+WMWgjEI)WH*=eXVa7Wu$;BMSnZ=< z;(1{;#m8T$iFbZh5g!^Qh#i(L5r5b4b zuC6*u$?J}n()!&WmHLdGu6*InCgoSJ&MGesv{pW=6|C@Jw})&Npol6&(>3c^ilxT)ir~ zC2K6Qk~SBe{&8P4v)xt{Ui3sHmEbH|>*+4qWaT58elbv#zb{O*aecJtiClsxY7`T> z|4ij;^s+>+^7BP&qf105ohwATcWXq`k2i|KRog@Zm%bLsPwWy+{r5>!E$I>MFZd}6 ziu@>w(Zhsu=EDWGZzF^er$!5Lbz=oVb%NlVGD+xKG*uYy zHC>oBQbrhIGFxc;GDomEI$xMjxj-;iStOLlEf)UHUMdW7TrPa+rzD84h=fBD2okL| z!p6*Xf|;U<;N`tZa2c^xIDdD$F!RF>A?kpJFsV>eIHbH=xEHurxII=!*kyV^81VU^ z@c7_i;d|jxK}q?zpc!ydP#Jwj7-4)?i0?WtEZuiWu*$w7BrLfmkoyhc+2C8k4#PWw z!3ASsYQQ}~TyG+*8)+uQZ88@|-m(yMqAi67udIZS$<{)QhK=B7{y;DmKNL27v=zS2 zdL%s3wiiY}d@LBJKM|^W9E5RlPleS7odk`?&ce2wXTqYNF2YZFHzDG%yRhBSLwJ$r zDXjYKB|KK}5lWBv3jaBB{#w4j(ETewC|wjJ*dGoS1cwlzFeg;l@FPs{UJxO4=tc@7 zA4Lf=8PUR|?ik^_Y@9%QKozujZR^Hz*~WpzZ2yDbqRMDd=R4deiSlH zKM8S>p9S;!FT(PH-9olvkFf0ESHa}|Hz6|ayTF=%2mwQW3Fnvp7RDd?Be+}t75c>g z6MWA1LQKEjhyLtv{#dk$8My6s~?8g-s@-(QoV+LpC+N?-elYwJq6?Zr@(E+R7mGd#o2w+koa~Q-WyGawA2ht@tA?J z3N!IDbtVcmWMI)MgGHBSA+67BtbQ^ZL9=A>J60A@nS&FRb8zd}T-@%S%Q-BF1>*aygy!RwsF|*W&EZP$5-FoK zR~f^0i!h^2gsJBR^!+WM%!*^`#;(GApH+xnv>LP6YTVwu25A**@J??n{=Qp_pV!u* zsqcD(*sX`&0umQ%3DtMowg7sTB;!fp8`08y!>a9cOISQ88WvGTs`{mfH!# z*qyizO&rPAgrb@jI;*r`p|=Y|-t5Aa3%il^eK&p@@4@)Ndojs=FZxW>Mwyp3%;)X< ze_e&wN*xSH)q&=w{V*%u57%7>;8cGAH;(9HU8gQSoIeQTuLtq{mL6y29KzH4hmazD z7zK`p!6qMpz4sBQ&OM5*u%o!Bcno!k$1rb|KK5tmN`(hOw|db=$yp% z=95S{dJ3c8oWc%+(=hmS8t1N@!S3&8F#VPRO8yz(km*@e4LFCz*5`0m>O9vFoX3;V z7hv@C0ya;)h_9{}aevw+{PVg5?OB)M=zke;bFUyV_zK(?7~*)iAx0@&g?H3dj8eSD z`C!-JvFtjM;;$oq#SJ(l-oPHEoA{M<6Ze#j@GjX1D@3<&OneK5qT4tjz72@(;7jry z*eKuS?6SL9GQ}8W`;Bqf)fjDc#@IFK9uoK6!_a5R38g8ueHG6I~L#- z9U%3~0)Lb&(R9@k5pkBBDQJlqi@Cn&tQ9mvtx)mCig%m)2snBl-@NWasp&pWO}2)O zwl&-wt>Ip74O?j&oL9BMn)^2Bm1Dy{;{i0*JV1-l1L!3^KuPxl$S-*aqq7f@9Q+Wk zJ07B+j4ehUw1t$5Eq=VTMde64c1_4XJx?lJyoJVukvV?^XUhC%Nqn1m-ty!r$iqMzXTyC;}C#{tHN9FXVY zfWMUvm@VxHrLB$-OdTPg;)vnj9MQD+Dcnv!#a6$kkTgEU`SDJ8qu~T~YbW?;I^pea zCrn%6j5X(-p%LT^^;TzK(lboZdWJTeXK>AWhV_4*aebu=_MdY>aexctn_X~gyepE` zT_Le_#h+AH^#AUPp9*ehI^l*WPd8kscEdDjcZfH+W8)onq{O>p)_Zqco9%(*{T_Jx z*aHI#JTSVqC!~}-(R0od1^%8~L&~*sqrK3$)eEPLy&y^O!uI!G@Sf!j$v$t4edLX$ zIo??N+Z)P?KA3UR2R-gSNUZR|iNU_;x5gKCS9~!r#1{t5zDOP8hkslBAb-~no8$bT z(dmbc)BG_{%OBq@{Si<8(EIFP5L1aIfr0!VF)_^ zguricD7GIBMYCfl^zuSc^fMH5jd`fm5at$cl@=uvZaSJ3bPJw?yLHjYymbiG*r>B&H6FLOr5jel`k|J)+=V z5{04vqM)x3jW9jV@3V{M_bVC$KSks3^cb|L#~|`<3{FMHK)N{wKEq=%V|6U7&&Hy~ zEfz9Gu~7dNi&JuOIJYkjdR+5~#5nYO6^EoT@zCB756Q)N&O?pI^OATB`xB2%3ldtuyQ2Vmaa~Ow?QJ5ToNJ9O~l-uL>S8?Axk|8|J_Q$@Q@^otxm## ze#vNGoQzQ2WawEZ<8MMTtlE>g?o*6|5F_}c7%dKB^hp8lDYzr^9IsWM zLv-yqZg@ZE+NkG9?BVRd>8bGCnu^PpQ?b-NmGc!-aq&|sK21!6&W1EZ7^LC7V;aV% zreVRGG_EyI$7oSHULQ$^zfC&S;?mLDkPf~68OW8-z@$AH*n1}fcLOqDUy^}`Uo&uJ zS|&Db%0%yTnFw^u#LARRL`yO;ZdexdmuA63Ckq+(vQQe7h1}9C1b^jPJ|$TzvA) zg<^g#bU)hQ3oVI+BW^URMmC zU&UyeQi6V~OE5~W1VfEW(B)Nv#Pkxb$t=O(zNN66Rf>NbN}+wM6s~5a$nh&heO4)I zC8bE~_X3Y*zrZ$?7w9_r0@qDn;JwcaY|nUs$E`1r(W?yg)63Afx(s=`WpKY$1|8Qj z^cI)lQB4^JeJjK1vE_(cT8=k6%hB&bIR@L7;~Uqvm*khj_H{W{_OC#`Oa)ZdRv=Kf z0^K(&FyFZXo8v2>R$hVCA1g3^SS4!aRl;OrCB`19g#DdLe08bBhQvzTsHlYV$4Yn( zeF?j{FL83iOUUWHMCHwwIPvr)+M{1$bMZ?!ym^U&zEyZLtqLENtI)Ko3JK?{aLu|3 zGyJO%lUjv^bycwIu0q}LY7C!WjRjoOzgV{#)2>yc`%yJwLaMPZtD4(O)j0gE8tEfy zFhs5f*ieJr2Wp^gScCPpH5eOMgR;~bT&bx+@6RjO7+N8t4HZEzP(uw&qwt*8c+{us)t`$J!ZVFhxzY%l#gt{z_|^4 zUTwhqoedawya8P|8xU;Q05!h`G$b`Zv$z3~tqthuX~3)@jZmJ}h!u*Bn6jx6Z}&CA z>ue)d-)lscLn9P}8ez#AkzLY=cdd>1(cOrT1DjAZsR@teo3M6m6JBaIK})|0N!Oat z-?|BcTNAV+nxLE3gl*+bm@a8TeNPjN2R1`$Vl(c^HKS2z#>^ef*m1BKhtD@d*SHyL z?VB;orx~d+&Cto@=TtOfi=-JY-OZ@%*Me_jTF^_DGb@+1ph%?!4|j2H#IY9SUT(o! z(-wF=ZowPx7EFldY|FG3D3rEfTvH1=x?14&s|BJVoHa3_6^rJ!!fbgf(l@l?)y`J@ zr`L+tXIqhJ)C$Y{tyt>R%KJzw*2T2KFSQjPidr$Ft`(x!tq?dLb9V1G^hmWKd{P^B z%x%NVrEUD#ZiB088)~)N&`ZA!!!Nd>@9j3UShaEAp$$8|+Rzc&hQo<%$jWGgbV(c5 z*S6t+qzwl@wqf(nHcaT>jxyy5{#FXpnjnQ7Rw}<00|y%kl?><{5?(1_}C|bIS)XXpOC=d z9RE8*2|gQ1U}qxX`g#fO*-234D8VQ<36}dvxQ{2n(g+Ep;v^_Zmf(7-1cS0AFfNdw zrBs5sFD2Mh$FJKg!5N8!+aeN7{UAZv7k=y;zxFQ)4)p3kWWNq{4(h-VsSb=8*};9w z4m3{afZLP~sLbd<#jFl&o!fyxxej#6cVOa@4lG*M0lAeO7%u8SEjsXEO$X+z??8}B z2S#r0z>%#TaM|7g@s18;sCOWGX9ujbIHjcLne*8Lb{r_DkT2VSamAXBvi&f7Y$ zdrJp?ZtQ@?h7SB%+kri+`S%ezkge3gZPN~vD{}s-LI>_F?0^DivgXP1-$;gk&uJa# zJ(+V`#&=-f=nfo`?tuDG{@V=ffTT|ctpD=+{!@a7Jrcb8B*Ee?33OjeaIuZwlST=4 z*6@2&A;F7c{tV>)s6`h+hH-h9rb#YuX@F+=kBdHaI1;ah5#q`<|R>!~6A7-oIULwITUJ8`6%oA&U2ZD?Scv;p4$4 zJ}wyZ@!W@`(Ym0K`bj*pd-TCihC3pV`ZWANK%ys2%5Q+_iPlA943 z)Qkzv%{Xn@48N<*$klH~`L1TpWom|xVlz(6Y{u9T%?SP51iAN3u&-}IYkm_ZB{cy7 zP1xkn1Z9&ZjJ?o=THPjCY;VF8IVqPOc;u~S%!}-N_ zd~Pvngx$$TNbhds9Q8)z$v2|UB+fS;(1;~p8X()$fW8F{D2Q+1c4-4fJ#4^}>kasG zv;jNS8}LxnfLPfEK4&)|=~q3Ty{g9%J~xi#b7VB1E0^2X!`G-DKlSS&(%|!_s2+y1 z>v3^-J@$OB!>qPC)D_loTfGkbJnL}Pst)BB>o9(Q9X6`eL07&G2glW6%fDJoep8E@ z7qz&PTnj0mT3A@u;>{(_ao%6c?GwJgpcW5D^Y?$%U|)L;rWDqoAf^U~Tx!sAuLj#r z)xce&26ZcI&}(`PMhvLI;P=(&s;EYixEklYt084o4X1O}7`(e0$AxNy&8$ZKz-sio zufq3=DoB#6z&xv9WL^c?GgU~^sKSaBRdAnNg%7=|Fz?k%>?nMR{ZTKW<@gfIxxLhz z+f9kwe%dqdC0d5@gb)zqVy4x=;pF%`(hcR)(0dWtji%1*~gcpep$VhPl3g{4LJu)_s9R zt6yOF^cSf8R|?yfQY=a@MUrq{||+qiPv)?LJv2#Wt+Wr(kx4r;bNd*}9v;bO{ z3vf%L0Cw^PupLr>>#y^%BP$=nz4IZyosXS5oO8Y+AL~Zv!{uWhnz?@=9h3(-vpg(0 zl!sZ!L+=TBDEKcIcT00IJ(P3PEpj1qBo}6@a#1lM7gF6hP%O>ChL9YrHP6BPLpk^( z%0bFl&S(0RjeiB%F!9gE=eyZZ)yc-=W!cCYo{hFQS?J2hLYrF_uTPN$dyOn?lgq-V zzFD}}n92RjOwM=8M9L}tdVMAqPT@XTPX@Mg9}R)rZ!^w-L^}g6OZfhf3>37bVu<5gKO^Tz@cZDrIQ$W1OqRP^r$aRF>iHPcf28#r(J!pKkD`Cg$gh zk@!6scZ-v;)F&A)uO{Q@_GC0qPsWz+BzWc}@!u*5qc0{wabprzO-#ay_lcO2o`_El ziHJU#2t6d?mvkb`xsU%VApwW16A+`DfX|B)Fs)w#l&j;hE+if+ZpUMiMm*lh#3Q69 z4tw(A@W~|(*U!e`!&MQ36cES zjYRC;NGzQf3GeR__>&ib&CeoWd@2G#$`MEz9D$75aKs0P z{Ok+U=bT+-j6VQ51c&jf$bs>OzZD~ zwo-REy0}B6?~W1$cWC`|Lw=SU6ztq!zRwLsv)s`4gDVy!xnhHfD^yiov1yzu7Pq)y zXow4{FT3E$Di^FB=z^vf&v4e|8TZkj;eh-zJpbwp=`?3(-gkzDrZYk(J0o4AP)8{`DlvZom2@)QY2o?_R6r)dAr5y!YnwaUy9$~zokJJu1EjSd(Z;DDv) z9I#`B1GN7>!R{O$U$uRLS$m$Kdn%8&c09(J@W&Ww_!vQWj3xaZBdpLK6Q0=Ps*XK! zX4+#==OYMFk8p^`bFZy_1mpgXU{qv>6Hn~0NyiT3X4;|VwJjb-*kY-nEsA&@ls$cH zQIYo$>+K%GclSelo%|3&+XGw*dH}a`50JF%0djxZAUDkhVhbC1@fh^AQ8rj#V~xM= z)(Agp4fXlfXy**A({cCFe&asW*W5=$zx()?Z-otZR@|1hg6~8tq&8Wi*w+%JCoPdF zZ;8+^7BEk=faWa=j9O=b?EV%wQ(%sMcIJ4bWzIQ-=D62jhSy$ZSfg(SoB3uacyEf| z(WaPr)fCDiQ*8We0+kFCth6w})NLmCDrJJqvU@OfyvG@B_s}@y9D;Rq03e4VI#w&x%Sp4}C zjv8L#Wy&tX^!7zu?0pfN%`af!;0uU+a31SMoCiHQhZ*B}e#GT0{HC5omX`sFXBi+Z z;0)a7pTW_v(-^IA8e!3=ps?%|+!9XWKc$mc#!f(Q)d^flJ&w!kj^jY4J{E7($NQXP zaNKeXa|@2bZ~IXUEj|KWwIg^|dKhUMhf!8`2ql__5MQAO%Uycd@bVzu?LLS*Rl4}S zM;H3l2avq?0KQl6$1LsrP_EH|psjtET3&kaxc(6kgD~oobblXns%GW^lW}f%TQHOzwI(#$K zkh4||RnK>z0y~f*R)vF-Dzp=}WAL)=2#nqaMTKn$3EPSha$9jUa0};LZ9$p$X1t%a z89kiu)iq%gUN~-q&!~+!Vy6P>VJZl*;URR?iUoY!B0w)ogy(BS7{-*bb%invqm}Szp%PpI zSHeMNC2qT~!0rhvF!jlDR7x#}k<~Jc?7Iw3x0hnrcST&hq=?+EB^Y{Q3D&kQhW`G= zxcO26chwbeC4Ui*+b)7aiadH&$RjjrAvEO{qSJQ)E>2y5w@>AuH9`(y_vdq_-+Un%-&T+$@8DNMqHz=@bQ zeIgQ{PJr_82?#eIk1>D7@f_bcuyVh4@D@w?KH`Z^pz2E(zUT?$G2q_F74FgR}-hOaafTb2&R!{8yvojwF# z9S38=u)$C;83fVyflxljIbxCl7^lPY=B53SwXr{JSU+r9(hpw)`oeWeUo3mvhx7LO zVDs(XNc++Yi%$09x!r$4rT<^y!lOUJx0}C(lls4eZ1tall<0@BcJ_BcZ}>Oi)b}3Y zU|YAaw&*|3`uZZ|dVUrR?tc>gT>2;&9rz%;+W1~rrO+i9Pk1Lp_kJssynQ3oRJ;~m z&?_O{zeBLJl?a=!wF}*PZGzpFR$;=D7Qt>}v(VkUN!a|hL9i;X7m~zvLbXq=AhE6y zS}s)!g*sJ&|N580Ik`$<&Zr8ZLep9g;Xhe- z;m;5^;m=1G;Y;N+p&{8>AP*4F%&XC zVL|tto{+s)sB5@aT63R_y$g`+_`ge&K_3q~up3fKQ^5)86b z1Z|u3f=F|%FnZ!@p`%$4A_A0!^JiBI^Oh|a>V7H;=IM)t`BsaB9JPgl?pQhDef?bF znvbmT`{XRaNMWYX-7`%%MN@=YlSzWg)(JwW^f*DPYP4YBHd4qvA}vgxFC|?5I7G;f zA0&*qH9$DDzMl{>sE^R${!esK?w9CS!dH>WhA*OlFW!r64s?p7Iwc}o!xqtqJ`Ey! z+iKC6$rU1}z!K4vWd$O?v~1C$9qA%gOCr_dNuri7v7(!IBSjO2g^I{IK%_70BN`jy zE-G66Ok`c?Akxr&B%0n~Bl>#LQdITVM09WbZPDo^S41bbpAp^CKOzdeyHE7)nTBX{ z+-A}9lGP%O&gG&%edR^D(`JjJlqZW4ca0J?o*yidwdp0AyyK&?qFJM|9V=8`@n5p? z+yz0(`bVECe|9xfb`927{xNyI@;}>Y%7^=ZRhs=FLdh*kUCCA2bman0m;IBblXUh% zTvF+sUrD7KXC|L4R7qCQIGH^1t$DJ0s8cdC2u?mF&yxM$7bTw!Z%Te{@F}@yY;W=J z?!n>@6{EyHF_XpP>}QL&o|hL3J64F_%B>Oa8MH-wr$a-0C}W@ax5p9jPNOs8gL|)t zWtQF+s|_?2cU-X)?`^XY`=~z>=a7RqbN(~2^HX>6#=bt{g7X1l*@h7Do-L8$gK@E9 z(TpT9Uy?4q^es(XbR=8+vp8S;OQ}R$;#)4hGQ3*+?s~m=S$ng1#}0{jMdBOrry1|X z*R4N`U;Ni2{(9i2_-*!I@gAq%%)OASWd8MMO-l!{niE4q0_zs3q=Z?a`tx7an~JFH-jG23|d9t$@$VZB{U*}5n*b~eYH zSu|KM>o1n<=Aip*_cUuZb(sw--THu?)qBXkU9n|ntnFBV=OZ>I-kxnOc+5^UKVg@< z9oUJ%PuZqvPE2~KGt1okj2$}Q!d_o+WqZxtSj;nb))Vf*W@UIX0 zM*6V`S%0=uIe;~)1~Sb7soNf_3k5FENn2K26qGHxuU&6fJm9mY$ z_&VVs6vt5<5-6w^8uU|-Khc{Q-Z5sjRD)Wm`c znwe)!3%l{Em96M*W0k!nY`1g=OPcbE{h9xo&06_}EmY}b<95Dft-9}+?ddKy<=T7p z!1M!au=~h{yM1Caff$tiCjOYd`WR?ng5< zc}-}(mb*u10Bvj@KxRh=Qq1dtRC;C*)qfmBRhI`->bJr4)MyCl{^M*n)1eeUU>I$( z9!5D*QnbuoitNX5zMIo<8Z%j%1P^J_m^p$p{YKD+xg%+2$VmFIa1;eajv@`k(bN$) znoh19L$%3ch!a`KoqEOI(Dn><=()1yPObhbs7Rvwx|UCndoq264Y*gTi)56+|R#(A_s zcRt;2m`}d@#WZ&F68f99gv!<{l3ki2tz5m73fNNGth|gO61eVQ>2eZ9FQ-F`R?zv-6?AIe zN>cS-Nt0xhsLVr&E=^XZKTgVYag2ycABkwZlt5cJFYai6(20Az*7+aMf*V}>(7lQr zFRZ3{U8~9W#2OmZzJ~T3TuTpY*HZYdb(B!b`ElFU)4lBVv~leQ`Xt^!=F3&6Pm~Is zl-o!NejBN4+9n$MY!i(hy_xzv+)Q-?wvdbQ7TWN03sqd+N~-U-QrPir)YH6;WcO{S zRpq>GS0&jjRqDYG3X9)C+ZU-(S%4a?nXXQbyxx1cv<7{()Sy1Sc2du^omBd9Cp|i$ z$u$O=l)p!d)|60KL+vt7;#eRMnxQ89Jn*w4a7X?5E^e2WZE$1C%>lm*$%3(%B!noVRq4LfQ|KkG38e z7wgf6^@pe{;Sd=uI82{B57V|WN9exQ5sLhMgpw~DrC5n}_)|O|;;l~*= zIb%S(8x6SD{VWBgouzq-=jeg&IeIzfJoT|SPouw`r$Hw#P;1Qv^4xln)`~Auw%jFB zaJ@vghF+#{qsx^3?lOt@U!kXkS7?u5NIydi>E5KP^zQyuQvPw3&YZkP#?{y8`ljo& zEB-o-ntg-f9^W8Q@0;Xv{w95Byh&43jYwW>L^AVk(GSO46xa7Q?YwxKUNqgNrK)%6 zdh#9ensb*zpWG$YUd9x+!kDDa8q;21V|r3+OsUfMsBz;x>N4Ujn!kR1kJ6@^&=V~a z+I!!Gq*6^Nw%dfZ$(d5Qo++t1no>f6DUIx9MhBLg(X-QLl;dee9hIDMH`tuIS98AI zWpm07;<~OzbJ7`QK~kG7DB8$^Hbq%bp~QmLPPC-J9hUUxo+WKeu%ugWEy;hH6{Toe zQI3TbrEv{e$OkJjletgod+yT^>-!X+a-TFl-=~Jz)}*a%O<6Y9G&9wj&VI3`5Lp|l z*0!N;8?IGLwV{8XZK!MZ11i}2fSjx!(5{pR)aTO!@|1Z<3wJ-H5X*-&Ui^@*bUmc> zX}0uN!#$EwQIl|LjR`@ncds{Fo*@eoPG+kIC-8$D}y>31#hiLYvH= zP(u6@8u#i6>5p?DzfBHQe$|0K1US&IDhK*Hz>!*3IFk6dBbh#RBq7IS-Q}vco$mN?m`1cx)NLMN(T*G z>C-b;x{&Ki&E2j988@<0ccYA3ZuBACl*MzOQ$EC@jQ>cE0qX z_J2NfRL+;mcKOo6yS`)?>`P%4eE*Lxwa@jV_MLuIX5>fV{(f||)Q=Ya@S_(p{&Ymu zpIQz5NzK!rg7f_8^JjmWGdX~^sszx!vjMdCX#lNH4WP+y0;qLFAUP@r(()sLlw}=A zYhnW_s6LSX_6?%-3xnwLt{}3%6+~`+LF7;rL^r#GXvdUbl2QpKb|#p1KMAHraWHAN z1yk(c5bCoegw|+>(8;?YbSHpoYKueYQg;ZcPY$Jt>qF_q$xt%13#9=Gp=8z&N+0`# z(dPMK^gum~o*RZyqbt|xriW4M>o7i7hm-TtaN4^soci1iCl|kPno$r=_8-IP)0hYn zL=kjZFM^!SA}BaGf&xn-=<$CMToW2e@~a}L>2M?&SwvF*P`>55;imui@d;6M3Q=T# zD2f8iq9`yZiX4lg==`TBS}`V?I#)*1{r%B2_HHyi^ogb~+0nG2Gn$Nt#ZZVs45ewt zP=;X)MLWlEU0w`nHO0`t-mw%gE0z>D#Zu_WSdzAhr9M~Q&_II(@_LX!bHWqIxj2D(-Y3xN;fZv4Q6f30C6f2KL~^lBq&pFbq+XIpLq8-^ ztW*+hl24)>)g)SCkVIBCNmLM$L_hMAXmn>1O&F9+L*^#a>y612bu5{VnI=;|pJaNJ zmP`Yilj-!IWJ;PWrZ383nxHMF`B%jx>ma7#F=A>h6_fXSF>N2psBIpjqnj9&9c48C z9;34!jNBQcq#8!gdl*HHB6_GmwCDdwI_tP9p0AIK2`07}sHiB|g>vU(VPK(xg@u8E ziGgCEf|PW3cX!^MLwDV4cXxMv&1ZhE=a2K+xVtm6duPv_Gx0u4i8}5kN^vBb5=)d? zO4R8#k?D6L@17-;H@<`_my{6gDxnzr5;_!BLSuOeUAb05J3ona?_El1sZJ?H&nu<- zn@dUUR4EM(6p~X)otjJO(X&#DS1BXofo1ekuZ;E^m(lILWi-{Pj7~ z@trWXRm&+ztDMYGPU>sQDZ{dyrn;0!g_$0})qr(ggiRtlY8 zNd{LdiNC2N&9+svcR&@zPpYE2MOAclOBE@st0>pAifjdQQJ<>l&Lwfp%PM;EuZkA- zsiwd&)q=@YO`lDxNyW07emYdsz0hh(&#tB&wbi6{r<#I3R+D;%8agtthAJl3(9Z=m zG-zWDjXqRE!<=fUeOL`$&Z;4|>KYn%vxfNF8k*Evc&UAA>7i~d^_x{o`YUT`{;pcW zsahK3RZA~oYbmm@mS#2zKEhqG{V0yx*3pZ;bu?&n9bsl2%{Q(i{q1$s*Se1GyVQ|y zcpZ(;s-vQcI?}mPM~=_xsQE`7{pnaw8iVR-@c4S_Hm9Cmn$%O~_IlcMtX|k%^>i|% zo?fKZ(`>3I`<8mjx>rwi?*${WRRiUBZy*<~23kD1fxgTY`>PsAbw`6(pWQ&!jt$g0 zuz_?E8;BJ)(6rhH(!AC{@1HhM%GU;3)~=E6_G+ZH!y8GO+(@c(8)>#lBW>H-NCyr! z()P2BG~ct4x-A-tt_qk2Lu8 zR9&o~`cefIRttVeqk>jkP|)wI3i7?JpzaS9bn=;k6t5N3>7%&so5=H*f@ZW*l2$t< zeNa?Q<>8YgaeU+l^Qc}hcC4Cz%I3+qtG90U<~l;k;ENh9Zp z`wW%TXNi*bEmKmuv68N>QqrrnN_w$gNy<%1irJ#1jpj7B=5ge6&LVVmr8tzJgFi=vpkiSB-Jd`v+$Vee-LavH)u0nK#42V+oF*yh{5bJEx=LECEy|=N-pwE-E!0p_T`wh#S67l!2&or3sDk>(M>fZZqR*bW7Sn<>a_t%5qP zP*C(j1r41e^3Ye%gNX_ntgE1fS_<0OU!>PVL327PsAp>hDgSGsV;@@t52J<7J!qll z*IQ_svV{)Sif^u@h2rvCC_Jr&&c?RT(vTKv>)k?$PAxR)bPJ^%X`zmLT4?o_7IIx9 zzNw`xly4x;Pj3G`d|2MgDB2U+M>Nv$K8@79LnHZrZ=g0W8ffE<28yn45W1*=UM4pP z?pXufJ>Nh@#~bLhMFWjBZJ>HXq2H%9P?>fE_3zU_TiZ2|-xtw#Jgyh)#Cl4ts3+&_ zdRiV;Pi;KwDaNLrM(?essCD)9&#;~r>DANO;q?^Vqn^@Q)l=-dI$@jEk#S=ksTJ2z zdO{t^{OTy*wvPH8s3VIFbriR-jvA)c(Jieyy4J0ZN`Kdq&&yg`eyx^%RMwJvmf#45 z*9vY}EwxzH3Vkk^LPoW;Qookgj1cW>_gWhKr-q)qsG)!>f-h8FL&a&LoeruYmvc3A zX@8AiUe*XbR6~=;*N|@i8tUAxhHkyDCjVR2q+e4_4O!JR|9|bjumk=bsHU0gs>xz* zHJu(?O=tR6(_WQon)|wnI$W)y!qO@-POhRGK2?GlUL_dKRrJZIibhTow#AStTBTM+ zMxQEa;_XUmRb5GxUP{lCjapGG-dYAmPcIYNTV>GIif(Jxa@2aU>U z=#+9Q>0eF@RLV(o7}7vR8Cm3)2?lYQ;CzE4$D3b|51bMl36;a5QGj}%aoNdf6hDj+MtI#2(QPnVSW^ej_|M?PKMC%8>Z z^67+bK21=|rz_9%XlHF6J&n&J6Zq(om~h zdSRR^_~W@WyGt%zc$GuT>T^g+$e~{LIkaI*4*AT;q5S?iBBn;Ru*tJ2J13jmJhN%l z-fZf)Fq<-mXVV;&Y^u1MMdPI`atq9&YlpL_>+&p`GCGSEb;zP6k248nnKU3QlU^Ll zq&SmIS~@P19;*pI@M#9!DbJvp;Thy*ok1-o8T4~(2K83UAk8P~)Tb<+eut#fMXPl3 z6aMFX-E?}=Hk}UN7k;Tcjn@08QQmy# z%FiU?my&3ES`z)XPa^w`N%Y^8B*8~YqMWCR^ra+`w1uy3ctH5<3xsGU()@1;q@_rp z_X!DIsBjTKC7ga4 zhEtz`;WYF^7!9lrqYlA>Q?)ltj0c3#zMf&!?|CQ{N})8@Gn6W}hSG$oq2#3+O80Ju zkY-j0Ejt%Nma9X^Zd3@_{|csKieSO%52mqJA~wTe96q#m!=r|(yyVul>f#)oey2R>Mi^kZ`yy%o8lIDQ&S(&SNF_|-WPh&YbP(dxyFm+ z+Fs=P&6Adi_!n&gJt<{}CmBrjq~^AswCIWl6~&3Z!6P1IVcAkbfmNy5!Pr15xRUK(7vaaa z2sV`qneBEVk7+KH+0KP3E}y5mnDbO-Df&5QoTu}h&ePhP&eT82nUq$}bj-k+)YY9S z;;s`7Omh)yWCXu6MEZI<->C%%M|>qljo?Nq3GZ3d5$9P+tJlDJ5o7rM?>b> z(Ij;{ns&#QCM4U^Kr37NJnw#YI7{E|o)PS#Gqk1i8M2H!O*>?#$>5?5 zwYRXL+`p%2e!wXz8-0p~RGy^WrY9-n-3iKZ5Yqny1!W(nouV&$;2mp{4q4Nz4%Utju zN(CcL=|bUJx;lR?)m~XcvF2-N_ovk~&~7zJ-B#1Q$WI_`lFzWE z5hLj5na?;|<7w&mp%3bEx9tY^6p8K498Ote3Y`rnn&nq4xo{ishNr}QbhojwJ4 zO{bF@(?u+rY1D1(G%739qs_DR=xxJP+PiWpUB5GhChwd=r{7N&cJE|*pfZ{MbDboZ znUm;y_(Y+bCsJPK1UfNo0*xylPnQ;sr(GAv(d%{N$n4Qrs@yY{`g|Tk>rRa!_cmiF z+if&e^&CxgVYd>cp7D3g(tbyJ(Pw`!B;ixKq9as*BI zKAiTP8BPK1hEultFe>RejCiOPr4H31m*kD6(a=`|Y0JTZ7Oe+}9k-H!%q_oGW` zed+kbzSOO#4~3u)^{MPl4u-wyS#vLvne-B4Nh1E%MlnA7um`o>)q{G!=}sDlx|8}h zb^3Kuoo@W=M#&D{Xs=o~((>#|%{{u(?w~G$;oOBzM|Y+#!#mUFlulGKwi9*B?MSQj zI+CZPCdLZX#5jj4eORDM|21}?ugf|J-d=lZTGO85ZndL>X6Qpng{GWR5lrP)^vSLj&1u(4j6eM2)_wo-i-Z2~Uc-NL1KnSI{e+)< zquzgfA%5_|2H*Ju!*AT(=qn$#@(WKe{mi?Yed4>#Kk{^o5B%2t_x#J@clNo z4X?EmX;?N2?o{a453Ds}u}n_B)~yBe;d zTFrl|Rq;oiDmm{`!5zAl^O@bt_=_H;+`d-{@79O7TVKxq6AUub{&Jo?pqRfLSi}cv z7VxS`_ zf=$*d_-}1rzD3)IOC!8_#}Qt9`EXC}I?RJ} zEqDHSs2guJ)Rp%d;=(ltpXZvI&b;>^C*EeDBY)A~fmdtT^T2-R_?EtQd}tqAo~Lt$ z_Z(@%w+%nZqlX^n3e98u%>XO$4i5A0y$|wdJr3}iZu@vZ=RJIlngv&Fzmuo8-p=Rz z+sYe$ZRQ3)Hu20a8+ezG>$ut5wLI?SYJU6aO5XmFF&}YnIiGgRh|j#XgzH~g#B~&g zyi4PJ{=8-`FQ}NqPn68!ljSq`qkP7lv-SC~^l7{xX)2!?H<_14PUKTU$Me{Lv0T+> zG~eN_!@2WFu4+GmFFP}gdz=``tE~p}ua<-O;JpL5!A=dnd23&OY-4Zkw6-VrHR;ZS zjk@vRg$ zc_l6B{7ibT@<=-S{jSvW?M*4+(N$^kjf+xQON+FqszJI`TqCW|tdJhYl}HvLa_NI- zfppvnP{~$lV9Gk_roXY2WV=W@zi*Co+Eib1oHtR5o1i0IA2?LfQqzze zzp6{E9;r(HidK@-v5)fpD;~<9>0Fe*X;UE|doNp_UK}mo?dL7ub--4>+;59~?c&+; z*D6EggRK4)J3lQg*3Y&n_8b4b$h$UcYOYWF>BblBr`woTPuH<*t-muzOaJpH1O2AS z=K5ddcKXRTee{3*h|z!BH&@?AuTnp8)g}GChac(JdwtU1v_?f1vt3P=dAPgG!B#`2 zF`oZX3(mKVK)S`m|Lx=kIRW8MVW*6TME#Lb}<> zuJm%0z147$J=XM)6%O-}?Hm;#`#dH@wqas~EOKg$tVBOSRyZR?<}xQkrZ+!FMhgpM z1D48VCd*4?+e|8Ci&odjI+!-d!q>ORI&8WqTe$hEZ1dKevc=|iWgT}sltt})D(hhJ zQf9FGt;~4ON7}GB+_BE#u`<~s8-OuXJGBO9UEg72ZN7@i}G*ydTPae)RleF2Qgi&l= zoGx1$GlmU|8prO1Phd8olh~i2DQs(i9!vI}&MtY$*gbc!CYPBk%xN|=vNvE4&dy`2 zY!)B|djZAZ)8T(+c zg+P$G&O#^cWKYIeu+Ag*uYKi-=qMfotNP+ztpz>l@__GgK%0c?_EAWJ%&Zzc{7VWxtPsbH|8+a%3StM zp2wPV@|jyo0h<_8$jX9?*i`Rg=I1PDH_k|`?J>^!?kCn`dkOopzLb?1m$Cf|%UPRQ z70hmGC3`ZuijCK*W}Exfuwz|o*^#z&Z0*lFCiojn`Luy;zun00U1(ynYMYq@Z(&(t z&T@Hzk`;trVBTIA*>ZZ2sksY;yG{)~4Vy%TM^i z3|&GX8oPb-}QrST>BqeW%!egnf8l4)&9-S_W8s9Yxh^M=l(L!C;!;h-K}8q zuocQpRWRs+3icSbMp9{OT$$PiAJg05&#<=m8QK<4ySGF6c`+aTUpve{)*kQQw8we# z4p6_<0nRH_@vc@C^Jb{QB~J|{Ivw#Ksv|!2?u5^7o$y$tv*4R`hWFdfSZdw{-*0q* z_p+|gsO}0c{ciZ0*$oSatHU)!9lUFI+_LYE=RdmR(f%H2dej4PYkR_?xhDqB>4nmQ zUNF)X%(uwi(CgU;Ue0}R?N=XkI@njto$reoru`sm?uQYxHSi}-163pY<5*aK^yxML z@#h9$@V5bQ-aQa^?+nD?6@##>Y7qA7X~HT+6MF{^#xk$L&}=;fx2%T1;rS5sUq2KP z%|p?7mKH2>w2(b)7@h_ULwnWX=yh^9y1p5XFPlc7RyhKWbF?ubPaCzvM`BUnNECM% zg&rqHVcn}yaNnSV)Mg#z&(K9mrY_tDkA|uDXsD}Gf-bQ1AnK?gl6najOsQE18rvE$BS7gTRj_=m9wEbehys2 z=HOcg11zyJfa?PT{VuV9gbDGzJ|pM(Q17*v>b>j7$?e>a!A-XIJ9! z^OcyjVinF6uR{8e)hIo`8bu#gBgk|O%*xlG%c!-8^;#>|Os$2znJE-Crua8z9s2pN zL*HNP@OSHaG}W)i+3_2o5hxgRzc-+@`9>HwY=qPJO^6BDgt%Xu;J(!i8|uuUK6W$G zd^cn4kIe|!v;~hVx1jH+t(fE?220LMpxD#*HcHzwaUHE!o7mTM^z&FSO@}Cx{*|Zx)<-6fAY!4PW?ZK-T zdvI{cUfj;ui_z+WQ+IeDPF>lDlY0AM7Q7$YKlkIxh6C7HasYQVEun8~iIWd45oK@? z$#Dk}*!B>1?>K}ZwTD33hryf=Bl`Jayf8e1-pNOxt!jk<7FPILXNBC6N3qKJC~iGF zin$Ap!6)Gus@huPhPgE^igjdJLyyDK_BeXoKaPkQC!iL70;WGtz}@sDVhc|qqSq;$ zI(!Paa0(B{+F-YvjaZ{;gJBC!V|CnV>}hod+curSOz8~%^f`;jBWE$}!dbDF(H48> z+2Y(`TewEs!a-pR%ip$Gs%r-gQ#;&rv=e&C4x=C1p{(mU%*8p#cb~(MpmR7;E%NIBYyUA!l=1USYYXd)nP*FoG|~h6Gjep#(#^QL4u2SFxDBp70yWg&lwX& zoJZ1%^XO`G9y^oHBkR(6y!dk-J#<_!W|a%3opr&aR2K}s>VjYYTu`s;3a8bsm}2XS zOR28ddes#V{<&g>uHfXY61=>#ZkUtehQpWL;Qz-B2_xN+WbBU6Q|_=yaL00`J9_-* zjv6fwSS`b#Kv+@Y<=m8)jhnR&%Dre zyB99Gd%>x|3%d8bP}<%b2IIX^xYk>&)%M2zWN+kL@WzuL-sm9KY4%^_gF%OU&@IFV zAIp7E^}+`Z>b}sM?u+Z2eX+~g7tb?&vG$rTivIYb{RltIU+O2gUw-fj^+RNZAHrVv z;e0oLY}fP0_)Y$JW$zFFRDX=S=#QfB{+OT{fZ%xnc)uqAdOiWzR}=u>y8%dQ6NogO zKtwJNgx%3VtPBf8uZlp_JPXA3&O!J*F-WW}4#It#Ah6gVIM)TC;!O}IXwh>Hih7oT?p1EhM>4H1nu63i1qcM*f%W{P8&ku zbv6{vaiQ2>7mB&BL(!pI7^F#I*tjMPZ%%|^Uql#gm4{*4lQ7tK2uF!-IG!1Wa2(ux;!v9%hj&WB416C4wXS0Q z^q6?uSrU)bJ@MG-5)bv{cqG@xW8Bkt#I#938?6MG%uax}Spv9C00u%c{!K*qfFu-5PZATplaPHl3BF!Q z*p{Az!3{}he3}IF*2#FOnT(Ar86|6z(b*~)3%!$ZI6YbLv6A8WBpG(CQm}Pk3dT)O z!ON8?@UcvRwp$8P5>wE>Qmiw-n}VtzDfrzp6okf{~g^-D5v80!CBa+ zmxU6eEd1J@1#O!w!N1KC42UdDsmMal8(FybE(?L}vcU#sqh(SymMqFf(dKM)JC-dt z0oj7Ll8yM{Y-9^2V)B!0c>K&3OtKsd(#}CW%fS}o96Z^XgVi=U$nz0=#Kas-r5vog zn1emfa$xZ*2PW#d7&RgnZ}f8!zAP8h&2v#S#O9;w`L25qiDPKHGJ{lk7u?1+GUx2|i1<<}$0FCDb`0>2})vATC(I~_a-9qHZ z3Nda;A%Zp(;_co-jJGMoCig;EhYO}-dLa%`AyzaOV!)k3Tz)Oi|0+a>PDQZqUxYV0 zMVO;sgmVjvkhQi5^*f6MyRQi44n>IcD}qIA5j1neaaj?>Tue0HDZ<3pMR549NUS3* z#{1ra|2VuD9VZpz=d5B}Gb%>phGLlPF2<*0#W?FwjPE|h*cerejPzo>k{6>#T`@*p zDTdC&V)S_@()d}7{0?&L>?KE=p>lYPm7}#xj_nKN$T5-QwV52<_sTKMT8<(1a&+{P z<3Xq#v59i5$d%(&i5v$T$pIF^qk ztbHRP_^Sl5Yz_B1a6D4yxU9jEt;KPCG{@K}94+8jH=pC85r^Iy4kt5?ik%!U4{-cB z#_{_M#|tNpGEWZsK#oa~;+_PKRT&(0`65gKaU87TNNnV2xX5w+hDhr^N6|A5m$!l& z@`dBWPYy>FLI+iXRaZhwFG7z21cRZ3%_B+J!-S2K3D75~&LWi0BWzzx_`IB8xtefo zJqaF*xNZl*Zx12Wl8|9V2s=R#!%2coOL*%{aB~+!RX&2x89;awLeLk}$PWvaNl+po zNem&!i{WecT*B5u!ca++qeSFWL3mM3Fs&!#H4%O)2xBh^p66A<+8YF;+k%I3kMQ>a zq4+Vu>>1(x3&Q@_qFiqYV?K!ePb9c{;(ozTDf&T3{wYEQ{}yTdC8)G2L5xZX#3vm`{G>P=+T&O4&K1O5=^{}TVlf8xIpTvMa3f(7%L@J>8u^gA*A^bMi@rPw|v z#5@t_9}-60CoH=|*m6_6pKFALmr3~9g!|0|j|PHvEkR6i!JslR&6N|Xi^O}*6M1Ee z|217K4M-OMdpzN0l=!d02(yC-SAE6%_Y~K<5HuYL=C%YeJcztw1Uf{>-AC}>CH~88 zBArcyinWB5CWMPiMSUUzpCPUysQ zLN`{uEyjljLdOc7sV;P98%c0}gf7h#I(3(CF*-X6ooii;fqRPKys;Sfmlb2!oMNn+ zT#UmbiUs?*7)R8KvG$i>_`WT|lY2$*yikPUl|@L(D?;CdB3K0$p~SfepN|)z&z>S^ zZzzJ+(js)4Q6zk+BE)GHVWr>(z5iE;;~xs~?m;1pFBT%Yq7Zj;3ei5c5CeS+G5A~| zx*aaW>#c<-Fcw_lIpTO?A)`RL=DkNaoy z5g^z^(>LU!eqlc5>xs5@SUyy{=fmi49?rhbL*$J-q}JpiK3BBaQF++xo`<0)@}S(2 zhrK3w_%c&$M~maWf~nj#4`v^7;d&<*arL=K6?Q^|uounGFn}eULbC5eb2d1M1|EPBk_O;5v ztykI5yP6H#GGY6qWaExsHr|~UvP}Gd=L#7k_InE(>u)ChKFdUbG85~IGX-lm6Z>5>>muySFKKvuD-G)_(omL^hMu0nCbdd~wavrI+Ms#LU=qfD*$5bkR+~(#{Du`7Rzo z7vd3{8;=P8csL)6#}?CgjFQFU{(yKm{fWbX`*DaWk3-McI2^N&L;ZH)+boEK{>V72 zQ;ox}m$BH<7%TYqu^8_ji(mU5M07A5-WBJs2?5|xRO@NyK)sO^#XZV(B-p@JRNDiR_0BG9fR0$ai&kai*h zPuE63T`vNyIKH@rqjYyTjvIzUYlQGwTZhB&K^Q7Z1Xn673{JAI!z9Po_ZLJ--cpiV<^@p2_M)Y6q;K@@oGjW68nc@<@XT0zZ?Ra>=69t9)exF zLr^n61U9@j_66XeVF0>m z1t9XbKQyoV!z;%hAKm;hZ>K+;XZwTt`{UskKm1Vm;a{@Yp7X=Qjea0KKRB!VVcsiW zQ3rkD9pQ^1*1m{Y;ftQSzBty#SJ>D-P%rd>p_dOVEqri(jt_kM`@r+_|2S3NSfAhx zoipBo1M7_l(SI^W)f?9ycwv*=3s-%-FmsO=LJYj{tiKnAfA+-6CQn$!dBXXWC)`$g z!fv!DEZTTt&TS8L&htRMs|Sv4^FSY&2a>vbK=-A)sFUt!AM6e@OLrtMaL1EDqVMOc z8zwcoVP2dY3{ScVo|7Afk8;DGzpiKyeMwH~u9#}?itFoKv1fuS-nVzfuDdR{kSF@1 zTwQQ-iwh(@7rg200`V$oMPN=pJ@ginALCm|ti5HFtEfIZbq8}}Pmm@OZh>-4%IR4B5i?{Jz9Z6DrS@54cjeYh>{#n_E|vHQ;+ctq|& z=&U{Pey|&scDpf6Yd4-(TENcS0&Uw`z%qUps^{%O>!&-R+6V z?m%$-c1)YM9p#VBG0EN>o?7O(T(J$Uw{AoKR@*QrYAe)cZpHmOTM%_>3l{d@BADQt zv3~7lRD3lPOj|Q7pJaxk7dFB1z$Vys-h}O`8!>s|M!bEx0p9i-FnH(&1eLDGuMO+5 z@V|Ai3tWfz$?K4N!4#?cO$G1L6dRM)qW8SDkUv<1g{Rk`QezE97OsZ1$!g@jTZJ30 ztME#Dm3X$5P@1ho>`xPH4KzWgNhXMCF^1M|V|cYS#*3&G7{gXz<-@sk?3TRW}Cz_9Ze^otpdn^Q-_ zwNY2_^>rbA)`9H27#|y`BfjBLSU-OhLT`>l} zj%_D~qj#6#D2^T`bigoNsMEsy4O&QhHxw%8hGJ3gp|DFHf>bsH)r!GTZXJxKFPbQJ z) zcb`t^sMQIla>bacK}Sr#tOk2?HB^39#TR>3^zWsL$?+X9drAk)scw&{tJ(|9dOQ4g zq#YXCw1c~!h{+|!aNp;)ftNuWXkBWJ)UB3iXV-rLF zGNEP0<`iMf7ft&+bnx0Z%yLg4&czu~IZ-1HP54prTu#0Tr>I=-;Qpx;X z6f7#Pg@u$fGrQ|eZ0*NJHn3A8yD+?g9iCaw+M3oeheNgOi)#&A8DGs}N~+ksYn80i zhYB`It%6O_DrXZ|85_8&l>OLO!m1pJosHydOp(Oum2$TFMKQbFN-)SYidgi-LiS;i zn3J$ApP8S`V@|%gEHpKTMOS9Cpj%n&?59k&u45(}p_RcN>!&kc<1{v9cPgv1O<_jC z$*d+TiA|_WWFGet*xj%3Y;c!&wrY4Bvth9;$Rvg(?2cwhwoxoBD3aM{MliFQa5nZ% z82j)klqIT#GUFj3?7dzvvoi`}s@nsZ{mB6KNzBz)o#e+dN_^SR%RY>~@@9uyd9#Q< zUaVw{C%bIm!S0&6v%3e}*kuP-RvPNUBD2r4qqWX#&K)P#=944i9UR&2K@P0zWP6sp z@Ep@Ovtt!UY}wf!XPL!}(`>fIDb~*K1e2Fov-K~IvR6H<#QDSQ+OC6alJ5a_n)b2c zXM5Nq_1)}`Y!~aWV+T|5GG}j!x3aoNo0(r{GqzlBBm1*?J&SNL74h)auGFB($#DaAJ!Up5X`IP|KZ98eWNgfQ zefCsv%=`kUGQG0NO!<5w+oV2$J)Ay{ZP+@7HM{7t$+@GL&n<2CwDkx!ar7{DWaUtn zacVHTA2*1pH4k9AUo_aff&JLpd41T{eZANY{~l}`sWa0jU72C$E^NY-POQg9HTK@V z1FKDI$AT`mVcUMGFr8to*wujFvSm+y$V#Vtm5p%tD08^{R(4D4l}zXGGugq4N3tCC z`?A-YZ_6~ZuFIDGy(~LwbU_vp-YhGAT`#*VtC78OsgV7>Q6lR$N|Ft-E|lri=E^4b z&XQq!nrv=fl5BD7c$u+rw9GU*T(;$Xu*_m+fb6h`kL>gv51HF&S6SFeCs}60IobJ% zXJlM?O!j@hr2sry$Xrvm$R00TCo_C*EGu?gESoxfuB@z*$<}S1B2#HKRwj=eAv-ri zQ?~I=AK9W)-DHdUtI9UXTgf`*eA0J*|5$(gxU2f@_t)xoPA}4*`#M=aLpM}^$sRZT z8LLj{ue!29|L&@p`nRtR(KlY(M&B{FY5Mje@9ADAM^BF#x@OuerESrv)p`Qc7+5^B z_r>CEZQIK|PY;t1{x)0Qt3svSJi*aAcIzv;cQ`MFpn~#+mOQ%RS8jyY*5uL<}#nPftCeomD z>!jk_TcmzdEu@*AmeQ!_$3!!FMjF<9PQq~~NpHBTq<+CeYCPp5nU4&RZeI$PCY=eF zEOer!Q&-}oeP@#-ecd$a$(2lL@7Y|bMW;~ed_^veI8!3^A5|f}yjU&yoT`_4jcArE z6-p`I`m&TWZ#6$$J%n*Kjg%+1-4d;(PkKl(yJlLm!I((+ZXfYRZERX3po~PWN zz=P5!@!hAV@WIRUxTHCqPk*n^!^#+c=rx0P+%k*zoiK;DZ#9?SP|o8XQ49D8%Y{5@ z=3@S{%Thl5t`T3GzMPw$GUl?yEBW7kt9k76HGE{DDR*~R&o7y5s5@*{kf$5HOT&YIVbIKi)c zJju&TY`BZd86Ko-%T3koc!zIxJpT4MKEA@9CnY-YuI`R}+aV_&x5k-YV(0lgG5_^P zJ6Hbxl`FrbbmMXP?tE*A2k&&olgDoJ;@XDZJaDuR|J==&AijKQFz+-Wgy;7R<%ZuwdF`z*KA|+6JHn)MI(e z=UDD}Eso3N@%%zq0$*_^k@GD{yxZJlzHCGaKh`0YySz;0j!kKNkKnP%yfXNwgPGjl zB#RH8lFj{l=kSl;a`^NcxqO#AkDm?A=eDN`_@0f0oXsfW-v$-)kiW%z_3WNwd3}oytG~@N;_vW*c6Yhurh7a| z|30tk{eV|~e83Z19`XYzk9dE_$2@h*6RwG;{Ak~2JnPdl-qP}%E0bUFeEXODl-Vn; zt^ZoQ_cwgRyEptq{ac$}JXs z<43i=^Xs50)PHn+Hdt2~r4}EH4rO&}PeI9da$)P7&vZ!w> z{z-2o{S#Z$eQ9eZUu?}>%Qn>Jv|)Jtww$-REqmN(%NxVm(Wkf_>*=*;h*x{QyW5`D z)*TpC(SdvQJMzx@j(qj7BcIrG;@K^onA^HDo&7pf|4CzTD7_w;pxl9-HnA+T5M0mOXgK=l}8HUXJcb`?8)a(d)%m9+DAv zs}~0hGo-4(kfsfc*m#u@uU|G|{9t1a&=^ZUm);z@xHpSV_2y4g6Iv#jaM3pt`a1TZ z-~K*y?Pkg`VWw>S%9Q&in9*^Y86UOm%jxU-a@Xy?tUjzCE%N$tMxFj#w6s6xoaxVD zX69^?XwKuG&AEK~0RE~RK#vXsdDCwojUNo;;*o(=nu-?(3*OHVyzx_TuOk>Gr(Q;OwBnNuR$Oye`rHf| z!m+v`O!_y3$DO24&i8?M8KUPiQ;?q;8^t9*q z0DE@0V^5>OQ`s?TDu2A0%DrQ!aY^1Z{`xbGo--VHeVYTjHl9v8W&F}-IY$I8r^nUh zj4@upD8ChSy|jXZdb;w_I#+s}b>$m_m9%x2Y`fztxxL*g?sr|qtp`>ytc4p#EOz6= zJ#KVqxSAK|tY+set7$KN^p;Ou!zG1lX#0H)^=#Kt$y!UhH*2|nh&$WFyK~wDcY5{r z;D#U%y8P$CK|MVA(!-Mh$2|F`l^5r@crkak7f;vq=C$eGJW=E={X@O!FlHS;rLLpL z({;Q#(1+bZd?YKJ5h^);p}b%l%8x5USvx6|^>&By&&^Oi`Wwp1u3-$Y4x?&W7$3!i(Qj)Q>t6|D z$oDXQY9G$YL&KT9Ae{F@!l_ph&i-e@IqF?F$259WwT_foe7s+E=BU$6WNSb|(#7bt{&kzhZfyeH>qkIM$jS$0ojUtgnva zCnb*OZpAVER~+rz$Mdf$o*A>^+1)3e*%|R{SQ*d7lH0fSTRh*iN?@Bo2{fOUz#;Al zR7qdr9@`RF?P3B?zmtB&O%mC!Pa;p-CDLJ8A}@v~QWPaJumg#PUVApsl59um8V*#vCuq?t0$&OR!17Igr;$2ZW_PsP2;K?X}tP5jV5~OT+=&U za*fh?W_~*F`=;|zS~{<8OXu#h=?s6K&apK!_`PEWQwL|TyL|?8Tr=1tJcCPfGq{5p ze0w#6tv_VYtYM}sx0y5Q?2S?pU^&BvY93>&Ow+sSHXE>*LBpqfiE)!emB z&5x(l?DR;@!N1fT-aiIzUUwXD}d$6zBJ-woB##zDu#6*`^_ zl*j2h*4(UPoufK_zp3N(_c|8U$)|de0B}Y=Yynt#zb?cs zFuZ_XQwr#`uz&;I3nXu?faNI#9A8+#Te}K4<9GoNUn^jT=aRYjy?|-;3R%^rkf#j` zd1`PWcaJS(;*3H%E-7Sl??UbgE2N$L@#joop=6X5GW}>FAN^Oz4vz~t@>3ya)F`53 zvm)9V6w%nMh~KP=xNTe!XE_$}!_p#pco)gGv4~?+ikO;L#7kQxH)4Mg_0JWt-R&Ya zepw_rNk!aOyO`@+6tkCPOdK#RrZtMG*c7wV^kS}bE@t`aV&3p8=EtaF{!B0C`+{O# z-d4=~{l#1;8IO85idpugnC2ggS^Bq_O(es@sdWi;-AZ`Itc1@+2|tV};WK-A>{LSS z@)FMVlKhLH5*Edluy3Z^N)AS&t@1v~`;M3J>?L{Mof3Y0UcwijN_g&X3A5{$a-M!E zn{+N^sZlA-2gvP^QZ}_I*Y2?9>>Y>40%3JURNQn-zD!m zAh##wb1uv0-7cl>Nh!~~E#tlj8E&A@nrKdX0?}0kM5E^*{6)z1IuVQq>NhY zGFG2h#>vym81Gajxr1fAvZ{=?y~=oTV;OgZl`$x;jKkB)_*z@Wkis&_?=9oTon?H$ zGWI=EM%UA2OuJMj{iWsg_sdxPtc>Ar%joc>jLm<`XVxgEef@G?Yg$g5R^=?|P|mMi z%h^xIqxON=cbl(UY5KkyPWCyPSIW8WMmg)>k?*@-&X14EY4@z02`|fe^i4URy)WmN zPcr;#IdA_c=l0+7`hVr@U891hYgKS&-3tCExhhtTDwx!yg4gsaWc^dYUM(v)pmhaJ z+e+?A`wG77P{E2$6`W&GA=wud4DD9If88s%sAmN$d&w}v3K|<%(7Ja8Cz(`mtmL)y zF|A-VvkD%Nva)Xl8}zGSqLljmE9fd^zm&gHdYe~pw3P8uMo8%)<*N+eA!VMFAMzf5 zDPQC>rb{W5&wC`F-9$=H`5qJbJ_GsQ>hk>;WIUo}d2WRuG89w)#5OT!9A$@FL<)5Tw=&%Nq0elool$#jd6 z>6a_hu~4RGs!Uf8nZCniI{$ns!)3Z#$n>wgT~1?}AK@}zE?+EXW0_9_WPXj6`DQ2c zPsn_1EA#X5&T?vG{*IFQe51IWjxyg*>&j^;^}t=~Lxt3f%h8gl8dlDif#tj@^=6OM zpCGA6koxpU>Xo6J4_>UHy)l)YsfBDt?u zWcis@RK~M9c|N_2zVT(;6JExL{$>2-Ez9HTGJalC#;fznSU97M&Xda6bgV2_LuGlh zC}V+X8SC|w&*)gj4E-`5YbeWNjWWLcQOXDJOL_EJDbw$ka^{s%);m+mfZGgiXKNhNd%FX46H5?ZV- zVeq079++9em*Y!VeMAZC4JzSpqY~chSi;TCO1QFi3ETfD=I+C9G4=Q4TM-hj)6!GMYA`Z8e>|Y_<6cZWN zsfcTu7BR6}k+l5^seM?;$jgP2!(YfgI}7=^Kpv+SvXgAna=Z%JLbh>hWm|Vhwt4?# z+t=GjvWnUkazgz=TK_1Z$%_J3zfr&=Ckp7fr+}@C3s{s^z#d@*OzS^XVFv&ubp}?CYE_+v$8c zZj{f| z(ns12?ef^TULN(nTe3GJJrk{pGTr|8iQA3Bp8lE)J(4@YG8$YOd z@P?Y74yxI*RLx$AY8v`TJ9mMaKW)@J-A~P^wrYy%YTkY>SxpzR_-c0+9d(k!9h$`k zE3;@bEsNgBVtThM7B$FX;fGA7T+ifMX={&=Hh1-yOm115$%(Th&uN&n!+T}&bmL4K zf6m~#n;EP;kiqAL8LS&4?f11AY&A23b%ti}Y4;57YLG$C_v!3;HJ!(mbWYDn=k?HZ z+N?-t+2nNo8I;bU9n!hFdODMy%6`V_G?r{hqb4Pd0X}J*=9I>^qtbZJFpX;)r?LLW zRK{IRWgR7zuDVnn2})(7C8-=eP9FD7Wte^{6TYV~>UIh}52VO-BvRNZJcTzUBPx7i z3VWKTa7U{Yn#=xCp6n;pJebU>`N>QTOXkUC$$ULNnbrCwvzC4`e|}Bk{ToT#%_REi zl4ubqkDZg~GbV|(jguJAD2Z?1CerR=A~Uxq@w71%_pC%(AyJlF$(5=m`*RNy z_)apVb`>OWRhaA>E=}Mz+XPyfB(SP+0(-rSXXu4^UfCMYR!Q-aT@ugb)8gqrD4rp$ zVXXr(e5{M%u8lEV=M+QJp)vfgQw&%9jh5`CXs+HH&AaMo!Z(`H zj?p};ie|NT(d_Xp|F`H*4U{4SJR&V(|*B$N@M zp~%-3F(AiAf>MI1 zSsl#M@xd%H3T9^QVER1>;Ce(+e@T5$bE9`X^k)U z_wc2|jrII5dOa# zSj!`I)^g?UHLSK|4cE07P28J%&u?t|yb&FJ=-m22A3sTN7y%G*PZ)Fj4ZSCeX!ug6vCAVDDq& z`F6#4YFdn^Mb$X&n>S95kBnn%g&nWk+p)<{TlUSirIocUEneHOW1xPZ`Z)-$pS*J&H4jk7DhoBdLoV z$sT4SnRa;uzj=+|$POd8;lOa_IS=RVdQ!@Vv0&0LZu~ryW73E6w-`#@y&*IW8p5)k zL)h|^6GVD`;|G*Mw`>b z)SN!&`*XKje?Dy1pTD>DW9_N^_~&z9K1%7!J%jqv_nH~ayv=yAjTskIn)0D!d`cDMB+Oze7_FVa|9e1hQ@x5g`w!7ArgWTJ4RI|1mv8fHs?b@*A z^VWPG+?o|#T65vPR&3alevJzlD8O8;q1Y4D*5w?{YOV8bTda=0kij(?GEvij$%7j({IZ;bTv?yC_3N`uem&k8Qcuo9)RkjJaxJPR zbvd`B4)2Yu!>M=WT&8zzwrx?HODk%zVoWVQeo&K5eQUB$tC}3Pr3S5SYjD`(>NNF} z>t3~~E?K$N6-do z*>&QZV*cx^lF{d@^1|th(lzn3GU~`DW%AdLinZZKrRS^<%KIoer@Qx^GW?yK<287z zh$(NBw4m3@-5sx#rcYlgy<5Lj`j35~bX)ga`B(Bx&ci=dyc<4MTFUuj?TW`rGtDE# z?d(HE`SU>e(C2~DeC~b4AoiZpcHdp)@0&Zy`Hpua!|b*)aKkO-bootX{Oucx((s1T zN?cdwEW4&8WL#CYow%YL`1YSt)$>0kciLseEBKOPx&5N@{J{k!MDK#qbm(~{%=Mh| zI_s=5^wb%}|NCiWbI;StnW?9gYk?<~3tLVod+r`rVjCS-rl^i7wU-=K3R8|K7KaZj zyWSsCx^+6F_}d*+&UhbC>K5)-`d{9s*j3x7OzX2(89z%_?_m;2wxde9a=%iEXF^UYF~-7`~^>cPp%&`nA5ABsdJtwy4<%_KoN;1I7I_K#DlN@JD6|6-KTztM`L zVYJd?N|f?weWa3B5TOh^AFkZ_9;Uc;4O4#Dg(_YiA<9c_uws8ANZI-!P^r^CP?(anP}^*1ZOQ!N?y-X_F6e92V>_bJMK9u>3wG@D*|RHeJ?pE zPr6Q1BG=k0U5-pvO7tfwT^CJIqIZr{p4YZh207R$o`qwS;;*BXv(}@O$EhQfw@-&D zuLccOZiZSZ`>qNlxu;5T@*J#mJT^!<-*TYhvB+G}+u2Xi)#|Hsn`)}4^GuWmpNtjP z5k|_fgkFmNgC5F^zTK6?ja`*P=M0n=9Xl&^Tstc5*k0+;u$?R$ZIsR>trWfQ`pS3f z7RvRMX3CbwO%;FhCd$~rMoRsQ4V1&3>nk2B>ndIL)>e)+tfe^5s-gTYuBNnq_ou3V z^v^0QqiFpRT&D9ItYkair@0=L1!a345z9_Nl5Gd1_bH=Ed8q+SJ@qwLw>2byt*B zSzRxvN_Wq#`lzR?vZ=_b(%Ga}eSVT$H6}2jDzj5;)tjows$tW^s**niRXvaMmrOIC zDwBk@Rd-LWs7kG|xXNBQRkd=TQFXt3a@DpcwpG!cMpdnxZdK(NKd5TTNwcb{HH@kj zimp`~+}l?bR_IsVe%iRIi$UEgkD1k~cJ%mEsY`!SS<&!%~onrM`+dKZ?ZGI^?1*^J6nS?3n0x>YMt-J4Uc z@=-RcKDF7dvh&=f^1ocEO6t2;6&Q0sHSy(P)pzUTD&M?QsyqMAs@lxHs50C0pUOc0 zy6V-cTdIW9cU4V$Jyf{_K2fFLd9KPC{8|;5^iCz-epH(xbii2S#)e{IqFULCPJs-74&xPjR5xS?p4&{#~jYAV8B=!u+^<|1#nzKDI(QY^@5 zEjo>ED-OSJCnl*oh@)dViLReIi^bY5BGIOsDEQo6=yW}WzpbGd`^89n)%6xpwtYmM zFQ&pp*H>(^=`U`5G8b<&1I3du7UJNC!6GP2C5%Ty?0jn_dZZ5(>xK^(TVIY4XOl*W zv#=Iho{SM*u{NTMg`L=RZ=C29K0&PRJ4qB>pDgzI+lxJh(?s$G2QkHahWOZ7u917( zQCwL$N3?C_B&_z%6C<4$2&0D1;@#FoB6Ws~==g7m2rgJAPT8#xA3nH>uW75qEvwZ+ z_h^k65#cV5n0kut|9Oc8>(+^loz@GV!@k0PiJu6m<1fx%_ZM}`0)**?Krw2fT;I1# zun?buMTesy;#I0-t}O`@_Ns94s$qm!b0oxIl#1 z7m86`i^SXaMIvZ_v8WMSB9_lC75k0L#GmhFqQ~)aVUbcH%olDF?fPvNFaK^9d1tnW zF_~M%e=ggE?ZEA#w8jqc>HH4SL$gy1U$#q(w%9GqYwZyYF76R0HI-uZvMN!-LJ{k0 zQrtOD(M!Eo%v`chxDVJbys8}#3(g!61Je(RcMA`RM6<)9!>_|4_Sg~eJmIJ?nsZD{ zF+467d^#>>?mHnYB2J3m_NPQ~r_%y2PK#aJ&xlrjXT{vH=R|b#^CJ89d689kLHN2| z6r)s^#K)SKMabF9;$P~2!fD z>vmhX4Zb7Fs@)Z5PTUn2W~*dF^v6ij_9eA>Me=J(%;^9Aq4 zgykQ^=Dr{0n#vzVd*zep;s04QAN@rEFed_CG}5`#;3E{GY;Z z$uH5{|HQg^)$sRVHF$KZj@!Z2Vg9r_)=S3Qj^Y}) zQ@1XUHrY4C;_VI5q(vhXtZ9Vaml`3bUt`os zXbi{qjiH^`1Q$0o!KcPeQQK9@nWp$`tcS}HddPmRhdE=Kp zFlYfMzZS^5-2zut`uLWvkGkLVQD<69eB9O&=k!`3ePt`j$!LYIMy(MQ)*4Now1)qP zHn^v2gFb)SVCk&3NZQ>NW%})~b#*%woNI@$-t93xygl@vw8w$r9WYbd0r!7)z_jTd zv3q+*)Ya>R(JMN^?L;R;bnlEfxvqTB?apu>Y=HjB26+3<0BLqzU|Q4#TWfSh*STHc zU)dF>^}C^_TQ?Y;?gr7bJ5&MP(erk9{2SB*M-zI$`*jbr9@7)~IX%(wcTWU4^um=b zy`bOF5JMLkV)}kV%x-Ih@oSCH`>YW@_cTVCzcI$&G{$Z7-k2WK8~dL2M)P4Nn4DpP z4IfRAV%G;5`F#-arw^PROkuLw6!+_zVdFeAG^{j3V6(n>va~PE5A}s>yM9Po(+>rw z`XRS#e?PqS53_)8ng!avwLtc$!Dx{+7;Ya1W6u~%ywX^r{%1=xvsIy1wh9lws8DJrFegXg z*H?j{alqFcNPkcubDR~<ey;Rwtaj`TNDhL1pC$_Pw*F#;{DMoK^0k+6F_62~k?p?B0Mth+l3TlJ9P$_g>l0(Jz1>*UcO46x{bRAZnT_3-Xy$pkye&9cMI_jc$sVjOIf#=+_FILsM19wS4?qs6uH(uZ&YmU~aYmlG4< z(sm*aEuDzkRTI&-!6b~HH3`E@CrS3&Bz(4!e7cOu82e%}&JC7~y6`DTzBUDyd)nid zhdmk`wMPy8sd%_xDoVFb#ms8c@L|FsGBq&Nq6R>j^P40tyusa7vN}}g}5|nA&zA(ME2u_m~ZNgdfv`R zIp~b~4HseI)J4eGEW+uhi*Vg+G0u1|M!~_wSk%A;4eec!p5=lDk6p0PWC?QIm*5ze z;6kmXI5=)8(vp|L{`OLQmE1eO<;(DT+cFIMxeV)uFGqU#a%j&lM|i6hlFzdOP4icv z^yLbe^m9d`mn-h=b%kE7l`ynjiSF?$QTOUfoNK=d>*udRrW0E1sC%#tS!Qd10u=3laCcu&0YR&MfrC zkpgeY-SftLqjjjWd>!J-*Wu5bb(m=8gAg|#WN-C>?xPO^&DX=meLX(!SdXAD>+x-% zFD7{UB6626O1}D{V$cR8dv3tIT^rE!>jvZw^g}xjKX~l$!}d>pxY~cCWDIPStgekn zekb{Qt)-vrAb*rj^T%~}e|%5!M}zJDXne^ZH9z>{Wzzs0HVr_`_yE|f2*9_<0Hl=! z!0%AW?npmrd_x&`9y@IV;O3&cXdK*Xy9v8gH$`>qE{&QBn=>q{Tr{y|tdDF_2s z2H~yr?ae5W`^STD_;CP3dWLIlE3E_j7Q1AXs|69-OdNY^mQq{12 z&k%eW5rU&mAqe#i!QhM#+};_2)t5r>?QIBFHVnnJUZLnWDipr+LQ&}(il^zJsJ$~3 zEiZIy&xJ^QdJ&1zno*e2F-q3MQE;CW zg||ziFe4}mJJgcsK)_s2MB$pkqdk zZai9ij>nDq35e^QfI$NjaK<(P_VW^O$|C{&qNI;~b^^}tOhDb!2{5~#0P8Oan9v{* z)}0e!IzX}oZ4z;AP9j3rB*H8#5y!I-@zZ;2?$CQXm)sxVmRT9jNlVCR_ z2~(#eVcg;*4D?Atk)Kr`(O2zd(QclYKn=3&c z+=@>_-JCRZ*_sBEgK6k-F%3;0q~ZDdG;FDsj-`6(&@)I!ky$!Sho+-oLOL4EO~*V} zx$m2f8&T=_lPRw$O-GB$bksSKj%QcXQTZetKA+QJTr&fwnq^?7K?bgyX29Ai19^5C zct0}(eU`{@&kVQ+XJBJu2G(U~V8Nyg2xg$xsSNO11{OY%yoitTe6>t`X`G3f?K4qf zn28SqGtqryCafn(-o%_t%vhEQ8?Q_lO76tB_)P57WMW}yCaUeuMD*cI)Vq+0HMcWy z_IV~+eaXbc>RIq=oQ2r7SxD)Tg{Xd6aI?z7D4Q(QlS~U`UKZxA$dZ2aGCU{?_hYj# zG*ez*kcBf_vhYL6Ld)Y>Fu0T@eZ{j-`*{}be#}DAA9-IrHEOp|BdentT@2Mo=`ZgIo3kMBc z=W4KXu?BBe%407Lj5f;iVH$Lelh>zda9yiGMxh2an>2W_Qv#oD^o;o};(&3Pa4pC-0jO?$&%KWZ9-&H2xSs~x8k#X1{<1$Xh>3?zC zCFA(Nxc)EB|BL$p`3-I5x6G5@lq$cC@*6M6Z~aex^RY2H6w5SNC)2`GrpYszHlZ?& zTFA7DlWF!-rrk7|hFY1H*JPUhlWE(smk#Z_>!8;~hc7biPqfn^vbFp!efdtAH!EZw zy{fOn%sMhIGVf~s(_)Cs%cU|;gJj-D%RCO2dA(fb`S3@QlX_3;k<mypEO5M34b*SbpEey75(WhJs!y>I@`bfQzI=5Tu-l{|`TE|FT3e#dhpcW;* zS~T&}V*Y9^3YKeeZIM>irBe51Ntr75$IGxWTI3Ix*9dv-KzWa;yw^}Zql*@8+H2va zFUvz?t>mm|(W;sjCO;(G^`izoUTIMOu?DwqYoNWN!K8B;kI!^W)QRzn<8VQo2=_T8iwz6GmlnIA_8F=#{ z10Ij%_G$*Ep3FeGl7UYZ88DXZ(`4CBEs^cjD%ox=lI_>HSsCayE(0%QyQVXf?OT@& z+-@%0v0Add`;soXfayrSo{pO*WgDqTo^W}(v=7oTB{m&nH_A5EO|pmQr{nZw$vYa6 zj$Y>J*xM}~BlXi!RVy6^U((?9Bn|tnq~Y_?G_>E9hW>?VuuM%uztA+a@l3<}MQPYQ zEe)$ir=j)0G;HpkhQa!>{g!;Bwx3e5=3y$7i>df>AQhdrq{32{ijlFYu-cFc!xgEh z>6j|(sZ>M`PQ{>JskqcqvXg41;?~C$jD3)T!t*Kkyf+2?%Tq8fGX)#NQxNBwf>>v{ zKP3fD!=&wEnt~7QQ;=6b1*5+uY9K;OUou=}Qw}I5hz;ha^B_lz`#-3Ap+<9$Q@d zJv$D)tm6=97KgKK;?ST*oNSw7G5x<-xa^gDr@~k`#>HZ&cP#X!y?xUr7KzgSR!K(p zf6^YG_c{i*|BHd`-WZe=#NcO44B#1qRdZvIWG%x?W3aWA-2RP5($i?HIu{M>ipEb( zG)hCFVdol+yHlgF0MWSCEgC}_%09!#C_K0kg^mZKU|Sr8rEyVM=NX0dbE2?vR21xc zN5Qyx6h3~BMEO10KRFhOFXfR4PKrb=pGbJli^NUqNc8O!39lBB*zzL+x9&yY`_Ty0 zDVLHc_q`%;drkzlj*P%M$vN-eGy-=%hr{P)IO@y3Q-th8{g!>Hd2ZoSkHhg#6%I=S z$w#jpj^LMJNIoBi)E!}Rtq93d_X~r~!Z5TL8;0{HVeo4fCi`8X*m^S*1NVobJWuxP z!b9PJZeO7J}1*LlDp*1V+_D zaQIO$CLIsP`O;tviw#Ep>R|kw8jKNxgR!A~Fv|W0;nag5+&L122St)W6&Zv>u0hbs zeypo`5KLPI;o*0RK-e1xLft43*WL!8_C?95+8%(x zDFGPb6#$Ew0q80MP_1JCF8=jL@_m2U9rDNLJb%Q8_@lFnKeEUAqouJwd>i_s{KiIU zA8o|(xf{`^%SNnw$?GcKKdd~vaGJT`=a(B zU$pzS9{PLMLy>Vey@-O;Sf z9VScNVb;qXZJw;fi`=!ynYR|hI<3X=TWc^dV+|r5*5Fu+HF$YpHNM2G#xvX1I9PWz z0*|<%cYqrdD>s<`lnkt0t8jD8D%3Yyh0d>5qGQoY)Lgg{7dx#)=uKC2OLax@WLL=y za>cR}D^L`)0;h+p!1W)?adyXY$<1AkRmRKF;mI;=)h&bRtYt{nUxtV0mZD9>QVbfo z6jpzhz+|`NW366-!^TUnLXJiK(YU~Kx(lxBxuDyr#c&8(jMZ2S&o6R3YttfFx-7!? z&WoVC?hLa8XB68w%d+l_X;ljmv1TC(jTfT);R0l3F2LF;3oxL;0^B_~A8Xdl$J@U1 zG4=U8McdMDiK?}WS;b1^l0F5WuKl^mwIxPN#KEPUp`yYC$2 zKAnwS>e<*aWj56HW@F_(M;N&~;+&Bq=H8oyYss^qvYjP)o-?s;$4uN?Iuoxt&BXo7 zGvqoiGZ0}V#|}SE$L+%DaCV%IYfYzP;1LJ-dOKjVi33jGpN31x({N<$G-Ust3YRTY z(Z+cycC?-<7d)~@g`Yj@_qWHSCsPoZJ_TC4DJc9q85vtA!_#>(hPIxJk0&P~!FLkc znN336gNb;TG!ZIm$=&)c*Yqfz0Nv~fNN+L$>ko{F?V9nZ-F-aDuE;^-uyLpyJPuu7 z+R3$D?67m39UlC##rI9N_~m4a7kaiha?l2mYiuNg$_6(tkA-vaSlk>i7I-p7GLXmM z$mlV6^~D;03as&Knl+x*mRzo#qv5}3H2St2jWb6^VXFHmoa{CV#+OIJJ8&en^&5#B z_ebDOoRlFWa6^tgZ&we;I=kU8`8f<{iicsw^kKMEdl&}q7>cL`LvcoLD1Pi4f)=hr z(7yc;G(BmB51v*y(A^5Ymw=xBz}`N<@LK}g!UdWQlH=o#R7i_gVV{)>mtR`qYMLdE zjj}|Z99LhZ9SlRe!8rfT0t@pk@N|*|9R3W#&XPf>?l1_V#vrM81K~4kApGhKgxj_O zm^^m?3>pl;ot@?gpKp$?jm=TIr#}pw`y-@jf840*hjxqm!M0gHEM;GKx%9=_=6x|| zuNf?snBiY@Gwj-HirGs{@xHk!++~EHy7a-A=6#S(6I@$tB00+@=%(~W-$lJ)(zG{P zR~qBP0%ItRjN!h^2p#6hwQuShL2Ng~*4c(=Q^ydln|opVj9z#q8DEXcdct68Pjvs& z18oX>;P-?c@*BG&F}pjgZMx&dhi>rA?1q0Mx?%0BuDF`i6~^ca*T-Fu6Ws+z2Xw*B z+XlE7Y=Hkv3{dr7XTYapg2&oc*x9xfp6zdmhKpOmpixWo+@_DtGxSmaZwoxmYk_SxEwK7sb97Bz@R_|swdO;7}JoT`qy&kq7Xo_cxnxb*Trs%Py3CyN7k-F6w?RAauXJlhs zeBKCYF^w>(en8?^*`%ji?$xFkEn-_ zPwS#uR9#dztBWskKJT_%!)bTBItbn;*K=ARd119{Bd4SmFuoQ}y|0OJ$u)7vq9%IZ zs(~=S8o1u22HGF34*Mn5v9V!wXg5{E*2&ed>cu~?$n2jO>G4<8Q~rou)&7Wa*1yH6 zs9&P*#h-G$sh?t(;}3Bq`@6XNd!rbgKsK3Ptyl0`dDvzBtx3Uj#Vi2~%~hICniq zIJL|X4<~1f8L>KX;FSEgpsrRd9;p!p8`a{fk|ln9%M{HAWQz7~8KO;jx~Tg+O}y-u zCgYhZBC=A%=xfR1OY>xrJ|Rh%MJ9^MqY1*IdV(lHylCnjCzfoF6}#TXi0?)*!gNuz zn3)|VylzE`s8*4ZnHC}9qQiy%@i4KthGdjkg$h0I5OHN&u!wsTB!(CUiAM_pg|8++ zG?M>e#5eaBEi?VZmnIv;!T;mvtmC43zCLaN1}X+9Hlo;w7{JaE5fv3lmF^Uj?(Pkm z-L?B`VPO|LAG^C-5nHjvE`IYof1KCdxOeWvnR905-t(TqOqTv5o%M=NV_P1lutDz0 ztnyqUduE-$2JVhyvj)Yom}Su{wPO^EE}Y9;zDF>ld2?8OT^K8$8Ony73TC^kg4nQ{ z0H*5a&t9s1*>D{n7MS71ir#s!MS<>Y$@ST+%x)Hot#xG+hr2MXRZi?cCr9R2G=qKq zHl3wMPGcYM+c7VvDQwS?NvzpuTV}o9hQ)N7z^aPJv-Q6j+Zrul8y;CQwW|e7I6jt5 z89RpQR-3a^-AA#+l95dR&j_|TdN>>NXeis|GK38{Hi(stHes*U4PaIV#w=HE#Q2ZC z>}_Np*5!ULX6De7O*&}E989~j8LJG~L_K{rBEJjk^tlsz6RgJ$UhlwUliM@9z3te) zfo<9Lg{_%~jt={ts>Lc_wPZ$KE!gI>&6s!6KgmqD-x4w%>9&mD>J!<&-AgV!YYR$P`0&bc6o@jolsVtqt80(hskeM66mN znVq{-LIH~;{U^+qX!TV}p8qSCoTw|2{C7w$$y!+?@yN-S1S3nLpOqpx!{Q`azau5) zJVf$3!%wnS;vot8W+*d)u23O&nkg}KGo)_(in z4Cr~_nO5$Bs)U^frUyMeP*&Zx_Rk9A+RtjLomcEu8=4bS8&g|YJ7;uNZSR`pwdE$8 zYWJ_&Tf4OTvD(qfOSJ`U?$^rlU)Ivk#@d;d%`|n1+8W#Kx|-~U&YFsWhMJ_nz8bS- z12u*L54Vst-n>6RYZPm2tv_mskY`|eMWuK;HK&|FT8Z^GD!yR2bDu4!IOys3%tzN5LCa9`7@v`#Z@?PHA*f2R3#?WJaULxaYs#d}Sz;U~?0 zvoD%6Q@?9=`v1}-CjZsw*frx5t~TePzAbsu%T_!tL7Th()!~B`ZTR!f?ReP=UEX(a z2fl1qN8Vz5CqDCZXI}2wmG8Q*&yR$4M=a0=Qyrh zYr%_$S@Ai$C43koe&g799%4U%-@aXOfcZshZr1qFPrdm(r0R>V#36!CA1 zrM$*V#%J}A^B4EzJaUbP_ATShdY5yphvoeH@(O;(w~}w@ zRmFoIRPnaUm3+02iW~P-^ZEDG{PU9ee7tz4IJx^mzV!A&zGdMezR7JdpWk%}kGj5u zo2i!a$1clwPRHe3=hAYXRkniH*{|fo+N|PXr&sY3>1w`g(tmt$^EEvG@EY!xy_R=n z>-gax>$v;A_54oa20nRIHDCU|nm^jIk++ZB#7#^#^Px{S^X{v+@K3&5`Ch{s9&$^( zORd_*bDX#HH|=)tNoRKOqN1IAyUi|s^3N`Q;=pcRlO*_TW_vlk-OHa;@8by}`}vzb z2e{)s!D(Ai%P+cU#I>A%KE?Tyd~i+&dDi!X++^1wUK@3oj~#S`FL``~KVNo~_i#VP zE%c6aI(M88Ejq!Q1h4Jj_mez$=PCYS?r9!6;0!dCkHqu;lAr`>n>khypHV557y-JN^Y3qF3$OK#-xiZ`@- z%@-bd%?Bkn@a03^@UIWwaC6mLKFjVM_xSZryf^-yw+sHjx&BA)boL`Zne~bHG5gGY zpMK_93mbXf^e;U8&lhgC{VRVM^o>V#{m$!7iI{@)AAH`hpIrLzCoib{#e*jP=KULg z^Hb~oa0mCle2>mQ-gMv}A2zp%FK^!rUBjCp`%p97HfWCivCZLkx;cvbw!nte7TA5c z1$GT;iPgC+#op~L;XJYx^yIB@w5}C`$7!LlTnow1weX6xVLx9RE8b|M-c|=)m+HXc zlMZG~YYnGWtzrAEH3mAi!OyjAaPU_f#JRRbmyK;v{jV*CxV6LbErJ2pToyB{o?})#GQ^k9hRC$*fe%Z1!1Y}Z ztg-1S_#{2i;bl(@k@OO=RlP8{z8Bh$?k!kHz470j-f$k)2XC|cAmvIQyzk#vFunSs z`gC8sGVBL~sD3a%)DPkT4n_wXq5B>qG-&n5W{>{x5b-*ne)UJXgE8K(Fow$qW309r zfCtI}(0)1qy~hlMk#rzB-x`QdCMH0t36jp3z|e3IwnPrXP|YALY&#h5y$56Tmca=7 zJs3qZ1Ve7w5GdXZL6nFu8ecjTzwZsjhM~hi8N+bo>@bWp9FEe6;kdDXINIopz)<%Q zuvk9=qrQxQ!6Z`=mu!j+^`>wgITA0kM{qnKV*fpwi1kRm*B#G z61cyU;JhWnup)+(%M4q35H5s?$KyN1@i(EyZamVI<6-(>JT8g&G0%8wT;d|0OnU;- zTqa=a(h0cmYyxhY+Td)O4XTgXAXaxG`nylW;Z+l1_gciHncJdEmMuI_+CtG`68`g; zg!QW@LG^kP=9*8&@XX1$eS9*abf@6$>?v?tF$LAnr{LKLJG4!)Lytpt=&C&x-yNso z#Db~Fd^i<72TsGfsA=f7XBv`zPlLvGIvR?nqs7(f(CTiFkN);Jx!xXyZ|wy?V+MHo z42(T81Bpb41%Mj=1pA5vk*xpqu4{;-gOZpzRE62WO-R ze%-=b&REsc1mFdGxr&c=T)X5;M;H^J(1gJg#r#y7fQ@HltDh;YY#?hfyN?s#G2 z0q;T&>^rs?xwSTqkYhvs4Pk9jz69))XBQ8=<83hMeO zIP{1{!>nk;mPh06sb~ys7K1>m7-S~IAbU#;LZ8LJtamJ)xWyu)A{IYR#loj47Hciy za4j|t&#U85_b3hryTv2lIUYmh@u)o%j}hPEAs>-|lc5P{SeAgsYYBMLCK3B=5)qr4 zi1ynOp?sEzUp!=kt@1axNL~nvyYXYzh=}Q&6)i z1^aKLU_+Z!q+6%LJTVoQt5f0nAQcDn($I2B8pfojVR}s(COu9QjLCF7o0g8UtaNnW zk&fc0>8LZvKzI8LSY&4i{mX#S(+s@R&lC)}OpMOV#MYWjw5`vCL+30cOwK}fN*1Cv zX2IrO7QVO3hI)K9y2NH9ZFM$|T+PP27CHDgItPuRBG!6A4oXhtVEFeO>>QLU^fDI_ zid-x`kc%C!a^a?%hsh#VdjRF(`>Z@*ULFz)^U!lyp5TY&!S-Apjy}%AsGoUI>*eF+ zpnQy&kdH9;d{ji|V{=hH_Akp9=jNmOY(7fr^AYep9|JoSpl(0`6s!QoGYhaYq5x*O z1^9140a|S>fakFSth!Tx+wTj|Osf#RdKO~Hs6q^yT8Qp`h4__Fh)aq>s8<%keorA9 z&laNmQ6UV!77E``1g(BWf+tyo1NKGu6HtUv$wlxiDMI|JB4q9|>=kUMLk@7%7UkN^$#$6b3h?!ahn7@mGq>PBP>Ulp)zl z246=R#so>KT$ZEf6FCllkz=-w0{0CSm^EAhSSw)Qsz6YP0xOdhxFA>H z%@PHEZ&BdSK?OcsR^ZxW1*#hrh}J5`fNsUOFt`|Df;aGSMlt6372{4!F~;Tc~?(lYQRWrA-~hB^Dnu;D}*Ze1(G_xdul{!oT?f6MT%Z8;uy7t9Bfa%7Gv z$0*x!+;J{PoL@P9%q>TJS~>1Z%Q046j=a_7KutMbYXmp(OgXyVEJv3o&xSbVVpA$Kd#?|B6-eyqUUKNa|)Q;F0rm3Yyo5_Ur?v2bi9ZrcdvqC+Kyc~rtW zxDpeiD={{$5{8A9cwb(LJ&P+bcWou~wpF6~KqW>V7srd@`<+TeKB>g6x0QJJtrFdu zS7CI!Dp>1Rf%UDzpdnSz8eN5JR0XA76(+b;;gMGrVnV9$A*u=iDOEU=>s6w-)>lJ0;dQDUsu@6ues{bi$R`8?D65WToIGDiKhm#HCUt zMhISH)>0+#pAzpjD$!ww5`Fh8(eIEFolh$9<-8K7uPIS-SMVk4m3aI@DY#Wi{Av_@ zkzY#O5X_OGIx57rS7AdJ6)qU6@U*WAZw9LHWS9!)MyZ4^P+{J96$VUF;nFk}BAitC zJWGWrFBNY4t6(0gLUyDIwJ|C@PgJ2rx(Xd~RA^VI!cVyhx5`vlr&J+ip$eUrsjy>} z;GL{f;qXQkM%JiMwNr)qy($=KRG4{4g`{ID$WE!CIHy9!B^CUxsbF?Xg)eti*!WNd zhsWalXDWof5*(E`Dopqw$mE|@xc5~By`L&r{87QFNd>nSYB*@AF{ZT|y6x1s(O!*m zJvGL4QRA|{8eZMixYk20Hj`9iQC~Hl7^%^FfZ%1Cs1Z6?jX1$=i5f1>GgV`(nHnw4 z)i^R*jhL|_JqtCKTB>0vQ45=_#!C{+7i%?AC#X?vqsEzuYTUI|GudBV(2ov?! z&`oehMSY&=tVRz}zk#Bj7q%5?>ZozEl^PG4i@N`(!olAvEc~HDfM_Q}(O$>ji?$W* z_v)n>HHr4TT(81#(Y|S-o%h}pdU#cZ=A!*O3O(o`^x^MO6&@Z`p{7=a7@;qHh29+5 zDs)EZ(ap6gOci>yWvL2H3sjgS^es*3-3p<9y9Aq2K>(1*d1c3UZLH1(ck)BSHkUr=%1n=&KLc0x#*V*ME}g$q=e@hCHgN@ z;-Toj#brvENR`-~t%O;M602gA_$T_iV}KIn9!eZ?7JYuI5}zk1@zp|!S0k0UI7rxs zzDmsLrbO?KO2J!E!uMYlo`0;1phk>%LW(KC24br&mG8rV7sEs-PHNgf73El2RgR!S;m=aaQ5#VXC!ccM zbS#IXO}Uuom7~+Za`<&C7wZn?IP<#|;J$IEbaukfwaWr!BOcA)UN zmxS+)6h8Q?@WlzjC)W$#Y%`_|%7MZ!8w)en{B1I zy|NSwDoZgXuM{uhN|7E^iodRz#*m_@qzh@P& zIiNuD1_hSQSBQS6z`-~LYW)@1;Glq1qJX<#H5nQxaH*vNNuR`c?vWe|FUZkZBS&7f z9QE_%7*!xgQmh=CedV}1U5Uh}(5kr%Bi~8ka90YSlR|b%;j}`EF~w4}OBQ32Fh@xACkQ^<eb}3!qdMAR|-op#;Z!pmPCUSQcPO{{l?V732D^`3QcLkNPwDa1nEZU1E-) zBh80%Og@S|#C*XfA2)~O<5lN;y#1YrXV3C*>7rmr?aM>PsyvV)48MRhM?1T8Ozx77koq)4i22>Dj5G|KnufYAX~?Qi zMT?qLi1(#%cuFdMbV^0Hx)k)@oPstfDR?k31q<4zVC>ywU|lkX#w8<%C8Jh58TYRy z;py@uT$_`Gjpj)R`({43sTm1hX|7ZYsgC@{Yy8HrYpBXD{{1QMbmpesZ3Z+Ic{c}Q5 zV;d^gkU|l4E(Aj=LU7471b%{nb^T5-MlTmn2?K&r(?1wzo(JLl#vtsU7lbm?Ak6p_ zh|jwNQIHadKbC>;{~dtM2Lr_Z4FUK&F#xSv1>nm`e_WFLLpj|a*6qYP%mqKptndSO z_CxzlewcpE7tv~8WX<*!a|d6z-|~UcA|KrH@Ig{{AN;xFjTo^8bk55g9ea3V!aXl| zF7<-9w-=`N@Is$^f|Iqx6UAPh=ws-K<##-wwb%om9v)a=-~rrp$Hn>XVog%8vpTyY z=c*eltK9Iw$qn<`yW!dS*_c)`8w;k*#wG39_;g|x{uRu^H=9|w^KT~BVLWbS>c5F z_D*=N?F6Iaj+mC~2yf;HkMClgZnp!v#ya5oPzU6^n1QZqW?-S;474zu0iPT8SXF6{ zOZN77ttHm}j!egs%;`8XZaRuTO~Zt((@-Bi4N*qZ@cjN%OkX$^OI@boR@gd<;JJ9E09hN5fJ!8n$dStUj8f?|O4IdYNNy2eJ3b@lj}% zHVVq&qoDiP49N@3aB;dBy8au9>AOZEDtshzdW=NwB~!!{m}15_Q*>__f$J+qAlr2W z^tDD{#ew1I5;YuYeTU=1wPENe8-|Hi!w~#-s8~lCiny6W;jc9mbU<*t<_*E|-a`;` zWiVP74u*2)RNVg7IczE%vt zM)3?_#%E*Htu;oVn=!6y8)NK&{*XuZ$JrkJ@%y|HdS@HK%+v_xkNROiRX^xV?1y`w z`eON-zHph<7mY3ZLcXUD+J*H&o_-%ZKiL~Br8n|TdSm~sUZ|7x5^I^g(Db4wek>Hv zIP7`?-+Dm4p$8_p3+9(r4^-?mMDH*|tmtZp_9wa{HnBU7_3sX?YuzBp?}k9LZb*A% zfV>I=WQ;dJ*js%}T&9nX_WHQ=qbqW&yTZu5EB3VN3ai~+up_7oy6bg8!lBMM6xA8O zdvwOovz;&_wG;dXc0%xVJ$UBpiG6DH(Bol8ye#R6^_Css_M!v6t2>}p4B z#dD+S?J@hiF4nFSdkVSgqDNCZ*lcYFZ?AR;({6{5-EA>Duq`axw-vsv4Q_?EfwD^* zOgPdS^--+_^R+d8ozy{6f)48Y=wQNmZ75TXkpe8r|-8wuDpdl(j3pmHb=nYX1Gw+45pUNpnbZDFYevM zJ0<<&3FrQDO~1dqA>|Kmaq%~AVf>pnr2XQWOFwzSfSSotSNVN@;_f}3 zH|!oa$-c{LFWuo5{qFGp;&1cs$8K@UuD5u2*iD|h?*^CZ+~BF6*SXuKYrNmDtNfPz zRi3fz3UB*XaK-2{|5$d3+daIW=t&8V*eed)9cJw)pgJ%U3>@0WiJHvl& zJW2X4?eb^kI>uCjs5p=ovnNM{hxdI zs;PVU%muso*C)HU!fcn=KW!(^KEH$4ci+Ly!?*L~-P`!aX509A#~S`<=~n*q z%octye=}EK+QhwjZsMIHHuBm%)qH02YW~o11NU6Io}YZNjvJ3&#}jkc^4;gx@E6_I z@V24<@xD7&bCW--c)w|@c)R&4`Kw1O`2Jxlcv|XmKJ551ex<`Q9wAs{jq8{2xKE4u zBU;QSDi-mD*BA1KeHQZWa~JR_d*}18X7j}(BQ?)msN(65m3)q1l1)vm;ysU5@~66$ ze5FSPcU)7>KfW#Fa*HzFsi2fsT`1u#x|Q(ApkjVvi-LFkCg+|ua$Z#;;|Fg@d0ii= zcots7n|2lQrauL|(XN0$tjg!Om&dCH{BLW2eqgCD4<7Ere;xGVdCs2vTfIB?PH^KjEobwO^Jnt@Ca!$aerG;= zniF@s>%i^i&ftT7Pv<{Mr*TcMsXVG?3h!t=nXkQM%LfNcGFA_jBmSH{b8W-^}gJjehmy4#hoqbaz8uRNakNjWgiNlU;f7 z>@Ga@X(#TJpvT8G@5ptk+VjhOba_QhTRxfE@K5J-_yR9&KI&B~eln#cchPFWudAE! zm6QKzq(Q$m{y9H1gO`2PJl+3UQ+4BmX5^>0nj`HSG?RzE)WGhU#w6sirYN^gb9>o+ zP45GDG@dtZY7`%@X=-$@Xig8lsJS!woTe`DwB~-+3C-ojM>Vy34rxSp)Fi(>ps{Pc zPoptQ z=%zXM$XT=Az+O|}IQjqI!?NX;n!%sVHJyiy&@>Air1`SYNb~+;PtAu`2Ac0oPotCA zR?}~DD^1a{zqR+xKG)i_0CQx^Z#KHspQ*4Ut= zwq?8Q+U5;mwUf>|)n43aQM+2vul7(xn_3Umvjf*>?K|*IUvZ##=ja2v@!R%0KB*oX zJ@>f9gCW+I*-qt_ljPiz9e!xhk>z`-YAKc#|&4i;b9S0r8&7)wKGbsKHOet z^)h6Q)v6CQR^2jdtsJyZT8&p;v1;h~z{+*QOREI4Myu(Xe^zgev?LWT+Dh7P(USzk zirwi)_mZf;8%g5%Ac;xt2+2;{(UQ*ER+4FFttGR{CQHnn?Ilk;xkw^zxJeE#^pU*u z43gCMm?PQrAWCApGC{IAAWibPUyh{lW4^@aYLR5~PPycfvPAMLzFhLlwMz16lv=X6 z(?W^or^S*tSC&bFcC3`}%Ks!kW7bIwovJ0hMr@We*R7G9ZP+eJIJ-;ow|cK6LUus1 zHE4m7etl08aO$Dt z*P41sV(wGP8J`!D9~Q4AT3z2t-hFs4*>V1p#IgE|skPg()Wmkou3nclckIA6)OKVRCY{(WRcB_{)P+UP z(`V~$8?bYey0g364cWDxJ=s2aFILdln^^_)Wp~c?V?pEkv+MsEGt>41S$vuaTk&)d z+vzlfZL1y1)B}dIz{(L!|CcG-8EVGHULM6(Ta9LoYsat=9mX-oGz;eT#F9;Nkg#t1 z7`xVYJWDLLX1_j9U~_yYGR;X_)@VAJby_@yb!|SC{Soi2p1U@kWw9Bo%Q^>Eq3gun zCpk0ohc3)#%1kz=W)}0%cVok{-Px089xU6zi~Zj1&3t?MvegBC?DT7YcGV@29o!$p zO8bN`CJkkm-h?sRnRD2Z0}8g;@Q&t1orbqBC~Wz zW}Z7!n5RJ+v&>9qKOSYUMU%6b!KQ4M+&-7xwajC$8uHkS<@xNoQvuu2tdM2xDr6R+ zMeMP@lx3clvX<#GmN8V$>hH_h*m4C+w=QN|J`}SHt4r8@*HU(;MHxG>yNs<2EoXD| z1%K^S1v{2f$z~6#VmEJBu}KOgTV<(YuU@HG-z91`dHQ_j{!_@N1#FVnLe{&@BKGXS zBDN%AF_Uy(!p@vt!X~FKWm`>_vF5jyFa~`&XuXcP?_0+fhOTEvJ8xijj%;A}W2)KNUK`n(a~s(l@xFF9 zlg(_`_07yOe+%1Wx|L}?*vcG=Ygo>>ZEV@oZEQ`|b~bu$y1^FvB%_*;J=}Ea2BZ7PMhMbDVjA_5XK(J>FEyO58N8S98u5ZRPBb z2bg`!gREfNLAJ*05Zlt~Fk89(FiZD7!mPE9vNzk0vOMo&tf`fFpMCprw%6+fd)M+L z>#*%4Gw?jcbXuHd^;=G}|J=?n`=&GO{>HOx_RMo^@9%T$-@5b6)ae4V`+k8+JoQ8|=Y@8-iPRlSK``#X8)$ z#TI7XW?IH~nD@CmY(e~8w!iy5cIfauwl!SrAKv}}lk9oG?s-3Cfz9jK`RY2>%jprD z_2m(ZTUyWJZ5}hP7mwM%vM22JsHZIE_EYvI>lt(C|D35$KWB%cUa(7@Ua}MWUb2-w zub6MM*Q{yXYbKxGz#88*u*s@7EPdQtroQ)63H{$Q%Tw>!lgJM&w*5!;c*jR( zG5ZsX`~HcQFa69a#y7Hr`bH)x{KB3O{K^u~d}Yt)eq)mM-&x}J@2tZ02P{HZks+O(l36>Vtt z!#1>USX*kH(U$Dbw52SAcC<3I9qriFj&?QErFBlaBwMaa9u2zG-LgHMmA0q3*W1(Y zejO+?rUNzb4rJe^BQ0_7NVnGtHr%IMr*aZ62dX*puH|W!@aRwA! zU_jk28PE>HZe$tOjkfLRMqU1Nqd8N%(aZcbZ_|U$%r5#5tqB>98AMw$2hot@gJ?n9!SvpBFpXX^n8ND^lXTD!QpOCS(!E0{{?8DaG-)Wc zEE!7MuMDMW-G&KX&M=y|ZWyg@7)Ec*M0{83aGG{-IC-}mK_1gbkZt7%>V9(s-S1&a zrGch2XoD$je`89JxXlgn-nsl|tke2-zdR;z-G*`z^ivC#Y<29CcE+0!~ z^oaQW!RY8>Mxpl@eeOv#&yVQxN}@jXM4m<>UN3k& zm98C6(r4po?m%mjgj>^>4c4^ur8Ny1Jb~6lOrSQKCXnar38WrkL;E9b==3HVI`Z0v z)(@FTiIE~saMMJ(@@gXa54NRSb8N|~+LmN5Z0X>@NmLg)i5k{UqDN0A(P5*>R2(>& ztXEB@2M;GxXs;=B+k1*=yD5|*7P7QCT(|<$k$tK*M&aJVh@sI3jNzWPd z$YTa|m_LI|uFRmpx(?KJnghKOpuP=<9mw&w1J#XlBu^2G$!i=*=d~lz04MSeaH8O) zPBinT6AjlBah&$fv`p$uBab*!%`a!_I@X0kVqIwYCKo#R)P>IUb|voNN{f`Pp?>FN`A3hv=S_gy_`e6a_~k9bh+cMrO5 z>Pa`lJn8UqPf}g?B*(U1^ufl9GE%+hZH*UAeda|aJ-lg;i#MH?dDBsN)7sD86g}97 z`U+NFt=fm!Ssz;W&xgK__9fFuUvggQOCHyKX=-af>NDPt>f-&VXoDYhx$j5C9sTLW zB!3!~=1-nm{VA&6pCY;jko~j(($5N@)7t|m@M!=&HVC9?_JOoGJCH8z2&A`91L>1N z5Y}9MmIi(k+X3)?VJ@(zeN1< z&^_T~^DLakcb!85dPjiQ)cQDpHbie9vfrYy^7`W_lhUdm`%eK49Xy^f~G`Z08W zVhm}bV<>M)3=KOOLkB;`(3oDaq?{T{H$*J>pB1sx?rbbIHOA82K5?{UdK^tiilg%@ z+SGy~b|Hxhza-I+Udgm) zQZfygmrNO|WZGMsOtAp@1oia_Kg>ES{BP)eotVyA;vnh1$Lke{vP`I$;4ebZ?1UGU(ux3|bPIL0;t<)U+dmif?4lkM9{Yqo?2nT4&PgpiEj* zlu3%}OqzWzlUlyZq{SVxsFQgX#mvs49VvntusDmJYO?71gDk54mqmg7vgzN%Y|0DC zrk6$8f=QB1!Kbq+6lB+qjPCnSuRc3noE1n=TgTvxim;Cj}CMdLDB>A1XC`L3@7D@IQcv}9F#|Ys3+T;yA-f9b!Qlcre4&6A+$|vA z7X_r>D7c4B1>~n&NN>6qQq;ggsv9LZht`6FXkSS6?uFDNq>!e>7E*9#AtlHQDN$WW zVXF$seoGXq8nWV4^i+E6NVPi*0Du& z$EJwB&M2Z*9z~=TTtq*jis*r0DDEyOqKxt)8nd{F9<3>&tePTfcc6&Mjup|r3q=%s zyNLEbE~2J4MP%_!d~YVDoVHRb?<%FTKH~FWDFvBJX)HooH`07L*(>%q@36|IVF>v zR@=(ypx}^Pa1t_GeD;=<#g`3 zoCY??DgM1k^Rt{DeG}>YmQ&{@IT^H6P&*w3eQv9ua~%{kzq5jz4HWdpP(e!t!*Ym` zf;JCOQ18JC${(hnTc+Z(xq{rrDkxX*EtfI{Ra+}){X}u?WCbNpRR|v?n3s+UI_j*T zh?xp%=BA($4+Uv?D=6MqL6`j%)Hg^lTtXD23RBR&ISM)-si14~L>{6Qv`6qVE8`X9 zlc*rWWCfi~QPA8pk*9P8{UZ$W5A-d%X$`tZIh-rm_5`xg_L;kdH#%2)QFzKS@ZwxZh53-)rLj&qY37i~Q7ye4P^cTPgAxk*^S@ zN5@mH!2nMl2jQ12Io2HdWT@KNgod*`0uqTZB~!&N!0yCA3cr{y&C zxSTu=2|cZqlWdQiinq%tYqOk!*UQOjwVYZklM@!mDWXbF+NE+@AQk$VCnrUQoZcnL zX;Q4<`b5gM=(n!0FRf(s?zfa&8l|+MK}zogZ^-1Xlw7X}4((|vWgimubFX02 zZk3YzS}6@*D(qpEl(x&I0Dwvc`jFQslK~m~0 zZ14bKiw6sv+(+1EZDFJ9g{|HyY<8ru-GhzncpENuEsVcQ+o3VSYWeOJLU3N9?7 zHEF_EL>CErT|^x{i>SL}5p}i|_I_Lu)eS46?frxg(J!JwZ3P4AUm-;_7EU0Hu%?h~78a79U?4^12>ww*Aq9mOlAU)U^>GsZYGNU+8(T=T zhKMwJ6_QM^klM8>q{8n7^tPdZrqvbD!mEOXbfSRT94H{uEd^w^vVfeG1vI0mfUHsr zsK?v_dgog}yPOLs(zbxQj4hz;g9^yHhw!h0qh#JB*u$Ul>BG}}lHAIt)HC_CK_h(p z)_l6ZGM}DQ<TDakXR#@Xi!B7Z)qN92q7cs|wY2?kS(eA?V77{|}^ zDD+ky)tt_wR|oRQU~?W>EXyPNvOIFh&ZB8Dd1M}tM|v)KRBw|2|q2kpgpZg3`VDg-8qf=ze}Ybrv>|IO)9x%rwTS?D$OuYrB%AAbniuq;D`&(^|BQDkd#8l zol?a3A%*(1NTCh)lc~$zWSUcvESQwZbj&81&KV}tfzL@)c0P%wim~)-F{X}p6XWX< zNiUip%6HljR$CLZ8c)B21-b3%iQOveDT3QrGTfO6GgIOHOwd2V7K`i~-8B6o! zvDC>gmXgh51$!!%zC4Jb4!dFm!#jq4_{7i|vlz;vdzYL{=`$H*79!gz3LTR~4D7F6E7KSGT$f|Rw+TWd~y(N>l{Rz>I12KTOfI71yV;b$KBQ~kj6d_ zp!K@~s3|vqCOQUCRF444f9X#-d;BRZ-=D@f`O~`|{#5zWk9zF!ql!E~dgI_n=7xS0 z{M?r^cluIxwl76a_a$q6U;10`L+iKt(6}@o!I$$P{f<5qa?hKVuJ`JBMUFk(DR~m7_ zh5Xeng5~5w`9?03@XDE-wmXx4iZh)eX9{WQOb!1d>8|6V_@V`X(+GkJD5ap3Gzf~Y za}V9!-Q6V}i!HW@EvSgy3I@zQqGDrWVi%&KqS*C=ci($|+|RJV?9T4&otbm*`JT&u z5L4#|?O}c(s^JIIUim`M9$$#g_XU3|Uod4co1dqB;J^YFzwz;b9t9upzwZr)8@=Jb zL~pRt_h#qZUXXFb3zAB`nC0dLsv=%+=bR^0FY<)Zex9&g(Gz~%^8nul4_FcJ0aV8W z?!0k_o_+3cDc>EoO?8K?pKhQ*-GJ7(ft!;XprjjUUUr3?rLM5kpLtq}uJH7(3p`ry z0_US$ph43GVqZ9e>~?3^k>(7>hR(3*y%YR9-~?_3P9U^&g00^inIY#0`^z0+HRlMK z{~W-m!vXHkbbvxf2lyrC0NLkQZHW2ypzLlB{v+(6__7@=SZoLLSq+H-IXm#UX3Oku zTj=n!h1k)ozQhfHggSup0RSor0Abw(=By;p5J+IF!v790a8S%*f{uY4{2Rl;wwo+g zSSJA9UjT-q1+d_{4cuI21Jb@WU?OJ&c2}&ycCj@Wd0KH`gL#A*l+Y~yH`~wWz_!ELImrOAX{6s6uI-Ds;Q6g2u24L>*Uwg}ExQQ&$C! zKT?Jh^~$ivQyG?uC_}=DaiEts4j$`{gL#j}f=2yV*yS-6bcU6n?wAq`WGjK4wi3+h zQH0jzig4dW5kCG=VB4es18EA-GeH54-5LXP7mfjEHoo!w>u6ZNXEd0_kA`Do*|KXC zY?wI;eoPw$uKn_`fcanTA@cA{Mjn22$bm?)9Q-wqgLh9x!sYsr(C9uA69379>JeEu zlPU|b>ay_Rx(wvbm4WBhGT`=M1Z-&<0sSE(z(8gMM4Xg{szPa4sV5B^A4tKPWl}KL zQ3_JOOM+mJB#6XH0zXC)($7hNbh!jL=K0@Jgp(}YQcZR=)*q}8TgOn9sf&m z#{VUOv;Gjx*T2av&)+2P;4ku3@fV3N`$<|K{UD$0e~_`;zmrKLzLRk|-^kY+UrF24 zuOxll7xLeqK_ZMBB(KkWCe!sklY)hxNd5Z(ve|Ed)F1gs3dVjU)@2{an+Na7EOwSB zzNMe!i}sUq$?u5xg}21S;4QIV{DzPZeMHNzj|?7qP4+3gCVoY|Ka$?;} zBJukLAyF?#41G>ACOjwc!e_+c=~E(S|CDrYc|uY|o{-N8k4gHON2E*Z5mA}*kOaJZ zK#H6mkh#r0L@3rnl9TQetIm7mi`G3hmVK9)zqmsVIou)Rn{Jb$;alWH92?I(*-gYX zy2;4un?&T%4f0%YgB)CcouvP~Mn;8QBTYxIl1WNe$! z5|2w{{?3aeN8%!JOu9hCPoF0(8s~|B)j2k1c$NfCKTA%m>Ljv*XNb4o8B)3LG+965 zG})GViZph1khv2(NM!X%qVWL94J#xC^^}Nw;)&3kC;hwHiK|3AS&`62F5wCCS@i^w zE;&x*yN?ku(_^G>;Zef(wi2O3D=}|uA>BWZkfh)veDb|y9yxYxF3HrJOB952$e}y4 znGH6ZT%0?LEI2-sq^H)9sbhuYZD$o(SXfCECsmNz>t&>`x|CQLmyomvMWnWN2C26y zB#U3=liZbggxIs1bRV+Grj1#|+#{15{GLwKx22I80jcD~f63(S-XtO&kw}yz6Np?( z9QhK*=3tDBAq(50h)rrFxu+08k~+f3 zhd5mIB3k91x?In<99X5<(V4frr`u~^|m@ep&Hq$uS%-Bm5F!NI5I|W zEa|$gNGi(}$VBZigugP1c$dhN+nRDD;F2skS13cw$B!U&=cLHnTuEZ1B0*|SixHYB zNs0 z$vV#d@oMgwNj+C7T)~aGzLeXlxtKG{ujSfK&Essx%;9Rz)Ns{F6@E-%?Pf3x;Q5|^j8ow_*qalwNG%Tp~4=Uvfln{KXe8%NK!b#EVNdvigqU7TpQ<3a0o zd2QeJAFGqvi>1rkJ8?mKeaXspBeTZ#+Pn4ukyQmWHt*plHD$wMgcIof~x`upDjTzt2GnKcp6!5#3 z*ztqC&b)%1Coi?mkMI5z%oln@@~@lXc+=m>ynA3KZ?z|n|0Yt*&x@$wUmvRBmx#~d zfWN4E3T z(YyF%l6(2thxYRkk%xFC@fQB@{-gYquoHa!a65l*H}d}iPx0b^&+zZJo#R`5F7mP8 zFY|qyuJQqHH~0+$-TaxgclgV8_xVG85BTEck9n2p&-e{bUhqHX_43n9-tfM+-|;S$ zA9!W0PyB_8gM47#H@>O zzA%DzsLE3L?2**tq#Vs3J&MjrWHo79$IvWEMQR_eL`C+DrThMjqfS05^z0^8YW_)$ z&UYBkYTizugD*9x^fXrIcK#&#>8=*-oUB7@%5)X)YQUM)xfuj@00aZ@1Wpldi zXuGHbO$~6QKQ=qj{EyD`8gZoxi`^*cai?CBJ*h*n7gg`{rVmH^(wVV-RA!$)E&mlj zuet_NiB+ry@beI=Z5l?UE5qr{3lUVP6h%iRMAJF@W9Xw_u~gYLo?5L;pwpiu((#7L z^ks1hU3NN^s>!9(h2a_WVRI&xAIPFQf*h(oFPDD3o<|R=6;Q8~LVD@o3_AID5lwS0 zp|#6O>B9SEG)t?3nr2thn@6i?@K7~9;a)@k)Xk)$SncCFh1pc}_-vXKHHWqiv3bYM zbE&rbJnHy<9t~JApZZN*K*{|DRHdqxzSLYuH+3$gZfT3?Q<=py^}u5KC}0V7__lz^%j?%Gy5(&{L!xqXyADm+HD#~i022anSN zpA)pS{{&52*hU>Dw^NC8?es_@Pd$fu+SN#@6^C@ueWaI)Pts2c9aQ8{2mRxHiavdN zite3%nkHzUp~D?#Xl-;S{q?hx2CY6z*GxG_PhUMp@38vc-4Yk*iKYv59$aMm-9`Ga z=n_pF&1!}3y-fApx@h`~F1n)n3f-)7m9A~MN=tpOQQNoIn4@-`&ega~_n ziym42o3?8Gq3e$Rq4Dm2sqDkQbbZc0Dl`0##;*L2uGSf%2aXNVJ?_JF;e%ni-AV*Y zYeZ0RQ3MA@i{h#XQ8d~riY@Qh(ozgpSBl}MPBA1S#j!kC9CtQ|lDJM=3Qe=5u=R)(8vSN@GY-=Du2vc?Zb)O6@(5fNI|2`E zAHj0GM_`Mk3^rECVA*LIbe5LIAzxYCyIL0A9?9Y@t&!-TF%s#)k*NB8B&M*dqph>$ z@Y+Q=?3ZUbKEd+%b%Q)UdnS)mZxq&Mk3y#-qj2EIC|m@iaqOJYxZ>hy{4F;IgM-Fk zbOqGduYh9*74WZ>B6e3Q;@VS+=q;gypFEUs&N3yGxTS=p%46|< z)L7KtG8WTbjm0(k6}XkvdMxRmb0l)bZdK=E+%&$CqW}F^M0K zH~)=iKF|a#pFIJOoSlFVBsK7py9Rz;q=B!mXy65TOY>jLJ^a3gb5yWGQsFsCiwlN30D6#!A~}(=wE7z4Xvhl z=d&sPF*QTEY%?6W+YEp7n&EXVbF7auN2dmJe0HC?bYrLB(|{@HuxtvhxI6_fOIqM( zM++3MVU4%If$tW0!NL+3=USp*k0sviwZzy-Q}I^xRJ2?-6>Dxy#pCkR@S(>v?4LUg z`#PrKwcpcl>ohA&$hShdy;iub*9!F}PRG@e({W(cbewj5I;M@V#<@<`xU||DXC1f3 zgwNJ!Vq}A_l5KFoCL0`k--dZ40{r4BKjT!KF-!Q^iQsRZ0u3Cz#bKL*`xSVdwf2YnRea|7&*rQf3!JZ%_j%^tmlZnF^()h+7T~Y za>SQIj`(hx6F$mv!V^tSSaZ(_&E=f2%h4GF%AA?O;mrIcXG~CW!4)i*bkA%TJaF6v z8{WHMG0QWZ9_os(7P(?&hb#VNIjHISZivxt_-}<9PGzW>X;{PEOzf4utLAJ6Iq zU~^~yX3q~mjbj1W)*FB@HW2qX2jcLIK(uQP#MJIUEENgD0`njYjtjzx%YyJW4Z_0y zApEHs%<{B@v7;myhqncz!L48G}hEbVloBcjKOt_V{ouF2B$rV z!8oZ{w*9e~6%mU*vtv5U(|DA~S6O(YJYZ3-$Gskab61E&qLfgklcu@eZKV=*uD!NP8rr9)q4VN2G(C`pLpRd!#FsP-8<&oct<%vnDjhdfr(@6N zbo_lf9mQUy7Sf|^Oy&ypOt|}mSmvLfedCLWnlZK4178!6ZYFa(YFFTGpZ1u8x-Per$W3LQ;1uc*$`e=h~M@UV(HmJ zeERtR&BDadGqB2F239)Gz=Wt7Xk0V{pDdYy#oK4#AkM(xyECxy;|%PQEW)Q6Mc89i zgeQE9P?%bT2Ern2UtNUe`-^bN*&@95un4~o7NM9-F@B#|jMt|Z<5J&ZoRU(Ed}T2j zt}MoyUB%eW+`|XAi}C5ZV(c0&#)fev7-(FA0}dsaA6A0*vrABSb_s^9Ey28fC76A> z1pV%oph|xUo*yc~NTpJ|rC-WSlTs`WD8U=3>9CNq5QWp z9FQ!>qblVXZ&;3>xN=PODaX^XRiru%c5{uSW;+<`k zsD7jp-8w2U>`Ep2Fk3|bbtS$Tti+{5m8d+j3g@d-;RBs2RGLzS7HkHa74si8LaOk6 zJhLFPt8jW*6*Fq8aNP1LjM-3y3%6I{hC@}jg0I4?^HpfX43nD=t1#+y6<+>Sg_?h= zFkGSg=#e>X;-7UNj2MEcH6!he|S`5cu+NNj;_YbDb@Hew;FFSTXOHrYRp_% zjiXjp^(ePb0F8W-J*O{;K zd#D;mND1+uoDlCS32~LW5T|Piu|r>o#%4kkP7~r$PKY-hgxKvS#N$3foE;=YiwGf} zj}@YQvJf|A2=PU(5M_#ls8Y_BLLok%EyTtJLT3L8@$3pAnynUM&3YlWHVW|?voEi1 z7vkaF%)#6*#L0(+*xo9{DJO)uj2GhdlS2Gn_6jkqPl#*Yuywy>@8O*gkMs+1 z-h1|*J_zw4YcU_${j7~15TYY%;j9I*X35%5cK=q^rm(h+J@+5`KaRCnwvJS`t{}Ef zUAFFruZ393UhC&e_85EZ-Oq&B^F)Xr9tpAU0ekQFg}CT0Tjy=&eclu@gI0)3t_bnc zB_Z~o7vf;25TBe9;z1N*O1lt;j|p*Bix6KQ6r%Y)A;#|#V$n7s=57(9cLRH`>x9@= zFGRQHY`Yc-am;)n`pptzL6s28N`;tQC`79qA-+!&Vr`-jN5lv*FN{4mK#1?WggE3P z#9wyoJ=(DE%~FW&ChU9H6Qb8dww;cE0@#_6vu)wpR%1v&HGX%i#wy!te8W5+8>4E>o5c1v)mR`_jqs}qKYXmhxv#2lsHY0! zuUFxYvsKvLR)sGPRAEmu`)#eO!s4Y>IDR&>e@d!QHLD8qxRbapQQ)?4h~2EO*u?sba@Kd)us-A|>q|0OpYo9PEf&uzFqic;D_Ebimi0Yzw^d-+ z>Ixh+zXA`GRN$1f3fvf0f$!W{pJZKuHu@DPP^rL)(iPbMqZ}Li%5mzway)##9F>lh zW6bt)T)e6rH_s`@^@ZhFo=}dq{^j`2wj3)>%5hM=9Q|acjCjjhcM&@9%=X<@glCo%VN7umK8Yzp7uO=JH!WfYX%W8ok2%1v z+41w*3|xO~2KsKAfp6!{z^oi*D+SL$EiwbcwP#?F%nU63T!``a3(>rz5c{?l;@l;L zC_SSPXG9d@S-V2~r(1~XBMWiTU;)bAFTiJ5fE$_%kXy)(_qhdV9$bL)YzpwS26LFi z3h=|5e0+R0pT!&UaRxh&P^n^$F*~mq=aP^42KjhcE+2b7=V9NSJbc`ihwY8bK%SL{ z`YG&h_dK*T&cpgqdH7&37p3p!;)J$bRBOn^f5Ke6n2?JV&bg>KIT!0k)xc5ZYn z2Wt-HV8hBBY%0pZC80SOXPv{`^&I5?WTW%rY-~N5jU%^Yqt~o#EJ)188mDY5(#ggE ziEJGEItx#q&%)rHS$J(h7MiDLVTF4Z?$yu2v(l`+$;5pZGqG}4CR)^H;*GRSW;{+EvTAEqPMo{sa^rQ?Z`boTkD z;~k51JT*EUSAJw3)RiA?a}DPu5*5~>zz8=XjB**jn(~8c;j>w%B_n+%iJh* za*jfx7KIw0BJth1NZib9D%*lcJntHb*5f0w{&NK0KOcco4a}!1h`@=i5h$z9%&LKK z+;lb^-I!H%KPMc69mBD0TsTVihoM797$(<;VSZW|bBV*ybyOIRei@2qkA-65qELJr z6N*t&Lh-nGDE_?{g2sD8&_&1`s{nQlsS|?oKZ5bbrC_XT2u6jxV611B)j!2x4167g zbti(@@hJ$eMF-&((;#de4#fHFTGeS=AigUO#7eh7{Gk$vvF`%#ARmD5mN4TgHUKA@ z1u#d)ABS)FhUt3YfiIr_=U{29@Wkn{p2!({vKXTWN?!E9E2}+F$l?a-Q#`QwKX+8V z;*O>3-SJE+GxjarQBA}h^{=_%q>XMUneK*nr@G-v5f+EI=8D%gxS~&*E3+P5an!I2 z23&E$nsqL?A=w4Dn7iQ0zs{I<(HU)4IpaW_Gu9b7qs9*>TzAF^|6A&W{t-^NOozou z1|0EPyCdG1=g9m{N8F(9hzYM9Q0cG(wp2QxovQ;LAMJqSAKGKic6;2DXOFj8Y~~&F zv)*5|!-s3_@OXk9))?90)Ni(U=cFwr)!O3Y09$lcx5ag@0DJbcX=BXNnrII=c?6(Z zH^Dy}2wqGgINO*olaxb54sGXixX+hENo5Xwp9*l!P62Mu6JYCfRxe@51~*)=!F*On zVQLtQO=;NR?AO*Pe}L6jD7MD;#2W3zt#M}8bUd(fI$nyHj@>NIb*aw^_Z_f8VKJNh zK&A3C;wPt%V|qov%nJ5d@NB< z(GqXnx4@iD7Wh4hEe$O2=Eo_h(>eu{%co$y?G!vDHU;^M=GeN_92)}7u|U}zr#&*m zzAa{0n_`CJ49&3qqbUv@F~x8e6Kvv4@!pUL{_Qlu(X}S1;BA6pqfPJy^SBPJHOA~H zV^r2O#=|d+&}N4b9?mdAWfLRJ`ecX)TMY4ei6M#!3{ml)0V! za+f~JFVn}J{`zR9$YPv#CgaF;lQA)JGVUBd86Q5;!~eGE;g}>=i$hlr#rt&e)h=CZ z&D6yrV_nq#sDq~u>Y!hN4qma)L7T5E?s`-kUzBL$1Z!>d_@#x(?OK>ysfDb98V3EF z#O%pQ_(M1e58F+`$YJJnotlW%vnDc=ZX(8uPQ~UEvsSjPYusd zH5LO`!&?G1Jo`%(cbrhg@={eKR;u{vs|v1eQ9+|Z6+CRNf(8T1Shrsp`?HjBnxQi0 zzZr)OJH}yq@;JPxH4ZO48;d74jl~VoV=+f`aTnzh8isIKYQT%2hif`YG;Ef$3xHnz|%hW`0#?E2-NNt!JFB_uC zB13d`(SNkI?;kCS{72odG8fGLFWqtE4>i~QLz~wAroTu0rh=+pH1Xq4S{VP6W_16c z9?n1L=wsh$$K>xcbp1DaN9G%as;_j(hcEPO>=*j#`XGI8KS&=R{!EW)eWqpgpQyI@ zCwh!IVHUj~>6(y_^wqf!RL$xGwPE8`j^kKuqWS$){`))Ho$`*>+<8mKy1b>UTi?(j z?Kd=_zK<>w?W3&)uj$!my%ha=Y17G9G}q)6)opl5&&#}|f#omgg}&!>a_DnfaP}G9 zZt;ws-SU)Pm48Z4RXw4b-aV#i;g6~M`A4+P@)31xdPtASKcr);9?-bAJ#!3e2C&HLRfF4f>Y7`0f#@xIF1MS0dT^6Uy4|EB zT5ixEY}~MW(RI51`!(vFc#Za7W#fuASLwjED>QiY6}r8$i@tn)naT%Vrn-2E8tPx7 z>h%}tFJ_9JO}{{^Zk?x-Sna9SUFWE!;yKz>eU|>|>!ePBowSUep&Rwi(0waT(>=dW z(KXB#%fHq^t*txg$EK5XrR+(n!%nNWJ)u;=ozmRHJZ)3s>6ba}RP93>of6tcr*)j5 z2KpzcY~67-j(&_bBp#z)T}SC#%cHcUp_LAbx6+uL7JB^75h`MPgbH>Xrit>0X+_B) zI_t?nTIPC?#vM37t;VtXT-E#Ok=}hY+-D#C*t(Y%kKarC=j@>Y{k!R|z}TRaAOE%F{gN^iEcq5hQXrKzZ4RrM4jdb|a2Kq8|13gaH(`v2tbXx5?`s~A6 zS{1aG%C@bcOElKd;W^A9d%KFB^j$?|TI;EsYCSCzuB01Z*3rZ6b+mo|3VKXo1>I4) zoYp>CMq?b7QN0~Y=?j^qv@UN6oqBsQy==Xh1~)FEH$@gv$JB*%=jB>DY+6gb>le_a zKjzajQS<4$j(Jo{XC76lol7UYpF@@X=TM2(+4PO_Y}!#diz=O*NmtLSp~K!n8mv@J z>mF9pwyhPkE2EsAH!oxL!AfZL$zp0fuZTYOnn80F3hCSX`P6@N9&Jj=rB94qQ)rA>U(m9EtmMb%D4 zQjK{LbhKwU9gq*Bcq@dKtqZ1;VuEPfq(Ex-+Ml-U@uTDNd}+F+58eI4i{9rw>5m!@ zD&g!-#iZTnr!E(Ib-6QLALK+sl^vYz7ePE$VJHIN^t;fdEqO!4+ z2$blrKMHg&j-i1yqv?SCC^}12o=Tq`N$1a#rN3NdXp-~@dghW8Raq=aQ@kbUE;(`f z{F*3LSRq0Sn}+y<+W+{6+kf-lC;#M!c7Nl48hzoP@BhTNnSJDE9q#7^mT&o&t*?2Z z)hm9)iRb)$o2UHO_D6gOdBE?)d;AC6JG}0xZrXI$OGfAQJHXI|UR_xLvR z_Sd)YoBcNNKdx`&-Tc?{bvM@Vcl=lJ3ODO`kAUTT#my!B_JBqFm75Fr4*~OdneN%V zQ*#ZU)m*_ZZZ77xHRtoknzQ)R&8hr_<^=v?b2NXpIgF>xf&AfSAAW1IJ73rA#0#5k z`HW^8KDc=*Z`*9f>o*(nip{$G(AJ6k`>pEyqpjok>s!b0=eCaIJGM&kxK)&&>HNFB z&iPaOLFd=)JyT6?ObzWq2o5I zEV;ebMuWOGFCP}$>`QF6u?y|8ne6e!##}>Q@MWBqAaazIAW6zoAUhNz2>f0kP%oV$ z2rpbJNX%I)uu5+d+)msp;9`ynGQv6pF#(qZ%3ikwtDPSU?n0lS$Lh0Sli44^N+mI_ zb+j~hbfg@&N?L&n5Lf2j52zsfuDpkn7<|a-WknM)!2vE`Z;*>?{K^?A{ormd`o%?v{N>t9|Komq80Km%M9J(NF_N)M zoY=mUAj1=+$iZ-F;$1(2+_@@4Jf%mH{f=_vZ* zlCdVY9c+kvxqz4-;)tM+5F-s+A|7H#Iv3lM%rg$;=TAqHW9CdQrnnH923KOy?M57= zJ&2X9CmB=ZMY?x;ld`8iM0~6tDe?3t*J=WY%+Ww%{4R)CYK9Qa;7~G98%DNaII$g! zAXG1kXhubol;tsGMQ1G8^dpYc86}XkxI{9so?S?tPbTm?g={fNBYpAdWb~>GGX6p) zk^P-T9vSD5<#D-0m(43~JeyB`d@mrD1~Z6%R1xuCT1?D4O32`+QnE&?oTvp?keTx; z$@ybd@WttGVO}oA=zE%H}`+H;*h_ zGoN^yE+9ka7LYA5wZ!6EEjhAeA<@!VL}u}e$o0U*WaPWW#Cp~e60EY6#2#EqLS2^; z+sDg@QqgkKBeQ}mZCXLhtn0|BYjwmnWhL47XC;wZSx*A=SCNG$SCNCkt4Zg()#TjF zHRR~HwPfYKwItSY9Z|l&j-1R{PXfg@klX7v5NA_1Q>}9&=?`xpS|1yT+nh!cp|XjD z@83k69XFE+_coK4SzE}O;Vr~!brU&bu$6Epx00s7X7c5AGqI@LMq);7C&kU%N%{00 zB%^Bwab@$?<-hDCo%45*B(>e-)BfEg!(k7bv%H5)NZ(5${_G_)m+fPH&4wBH7he(gkVd8rHFxl*JguHxsgec^;5ToH1V!pDKXzCm#zm6Uy z=yr_c^c*9SS;xtuzsJe1r6)+BW*b?3sEwR)XeST4+sVTuo?Q6Klg4?JM2|xvxf99y z=_kp!izi8Scn7)mrh`bApCU#q7r=V`X<}w@hRC;_A@|%n$)fw6L^u5`+4JKpQC@J4 zQ}_HRE=?oPcx`Z`(t^1zGa?DLCcdHyBhG<1nPWw{8+#B!1o^pXc5t z=f>P2GdJBKT1I!tzT>R^y7N6!bmJariM~&I-rOgBMLp!wS$=REa$%p7CM$aB57r1#)ka-G$kZ#?~u z1TgdMU3Wi8k9tqKUcM)a*&m4g*AFD1>LYOzA0S#w2FMG=Ph|eaPh^z#XHvE2Gr2Zp zkchVp5)Jz=?05Ht4EcN|=Wl-{1ySF~@bhnEM*4Sh`QvvYUi^b-|M@|5XZ<9yQoqQZ zCBMjQh2KPR-EUGm;SYJb^$$_k|4VH4|0SFSv*3>ZBX79>Nd2k*h?dI`slPNt`h13o zX7?~@G!lW0IU=z5pa^7t76Cg;Q4lK@g%ig_A@-*ze6tY)VWk-Sq+*ctpBQx5iNnZQ z;^28k94f>lV1u&+?42h8`_D_j7AZ-X>n_Riza&|HpCsIsk%DS3DHyv%3N~Gl0%bXA znC&ACkC#d_k4zepBef!)3`uyC0SgkO^ZRe4#s z=w1bo)mDT(@rq!*i5YSa6+uT;31)^W!PR;tkiMw|mhxl4*J~_<*N%mNb7R3qbR3Ma z8wd9)$H7vT2WI(g99)>93|_g)fP0idvrifFwV5dwrvgtls=(iSDlkGx6(sysVPLT; zT)LnNbz*AZZpU1?3N@H>Obw(4)u6&e9Ui8ugW)!H$aty_Yt+WWk&y8~SB!_FUE`rq zaste7m;lyQ6QKXt1X%KU0*p7-fQ_jdAl;+^Ne?w(|5#1v_0t5|MVg>_Rui=T(*#B9 zi7;3&5l-!8d2_uJL05AUVE80(S~&@hcTECS2`$L5)qdx^p+8C+ zuCLODrmNZzFR24^b~>=TR0pOU(t%xX*zHNW5EsGn`s#Gy$|YUs6VZcDHhS>7Ko2hO z)`N!UdJv^L8KeRxLsRW!FgP_CHvO0k!>0P+pQ;Z_8(IF~ZGE`GT)I1s25_O=0CpZS zfTBJFFx4=GyTOK#x!4fipEiW3pN4SU)Ch)?jbQplBZ$0d1esFCkPgNWIKvnWb{oTo zC&sW@$ppaD1TNN?fc;Su*!Io@zH6Go)DTmMTVx8Q9i~vpawBsL%)l$w493=*v7Aja zDEMmzB2&ykm|_lZ)|-RvHFKE7?7G8NQj2IF0W3CQ zIkeHXFk!JRTxhd}=r^|TXq+8$3+~7!zp^Zx`6Z{-gE~ z_0k@`j&^`DTLbXGXRrk#$EblVXWMV#P(i4#~x zIzjV%C;0D(6F5C}f*G>Tuxz?B)F(N^?B&i7!#l&IK4-Y8-~w5;E-;Y6@`_ix!0}Tq z@Vnmy^p#z~!O<0*b6jD{I#-bHbcM?wT%kn84dhs!^0FK^__fvze9y4I-@C!_aqiG% z&+?ix-Qmb8cbI$99UR`cL*Ez=DC0cfOR@)qFY|z%$35WLGY=4xVL8&4o*)(N32)|l zLd$+nNWaT&4|&3h$zCAl?*(yXUa(_}7u>z*1)n~7!B-V;cwz4iZRy@nxxyRtPIyE6 zQ*W@5@_{B(ANUgD17_7e5WLL?lDd2#de8@KReeFm-WNJjeIa(KFZ8uAhwp(e93A$B z-+F#v;Nu4lGyK4Dy&sr%uw3w7KR6}h59#Lq@H508W>osa-7Ws0ecm4;`u(ANG|MTU z763(&0pMQ~0AsfWK{cf%!W_VB@6_SjQ~C8o5yLH46pFfKb?37z$IE>DPQT6o&4Gg454X$Wsl2 zd4e#Q6BP!TRbe1#41+-ogZd|7FkvVRmTQK?JG*c&jSq*&ncpl1^agJF@dqa+fXR!73cmPoMb zj)WzjBH^-p6nr+0f?>}n_>mq3_vS~z=50~ncP0wnJdJ|%e^GE#EgH0~qaivZ8ia+> zP`f-DD)&W0$famdc^wU%qA?Jv83Q-D7?>I!12si4(6S;1uJ4P1TNh)PjTi$fhhxBR zd@OvK9t$-=Y?&Jiev4vZ)%I98bt)EaKa7Q&-(%tEm^hea%!~xLIOtA@gV3rtII|`W z#vP7>z^*tb>1B@(#X+%ZJOo(AgOX1?+jrt2kXZ{?*T;i-OFUFwiHH5Y@o?e4c(|mT z04?STFwY|aY!egUX+;90*C#;F-UOI(HUSDAF_-Xb0_+-@2wQX#K}Zt8B{&hjWF^AF zIf)>(F%hzlBtqMzMELM55oCTQg50Pi_@$c!S4a}f4@v_4%p^E6GYPcUCPCHyB%qy1 z@Tw;Xz78ZozeF-zQcs5EQ<4GPlA${~8GH+q;mCqy_^%-urW{EIuM5fG^C%gtJ|}~e zWD0bsr9hln3cPkofnerT?8#1nzL_a7a&-!*>`r0dFMI4p3ha870s%i$;Du}|L~5o& zyG1I9xTbHos$Lw!Zavbkp^#@n3vd+1~bp5!OlBr(E2(JcK=9&dD7|Nu9^;m2I(+I zkPd%6(;+%49kynr!;Q*xc)gez9UIf(+}?Cp!KZ^mS2{d+kk0bi)8W*wbdVpB0Zu9z z5I32b9#$FP?q!1WOJ+L`WJ1U9ObC-*eMZ@^Y-%>BLpCgT$%c16* z5(0vvfYJhz0yjfRcjxnfib}|1cm7mt#6(3!?8FY@c5KBKMFj-|vBg4BzAVlnif-mZ30ShN~vY@a9w*ewiV|pR;AyI#-4l3uHKN zkqoVu%J4*?46RnkaPBG@o?9csx5YC2v7Z00gdby*440P5(4~wsX12=EYddGl?2uv8 zPR^OxEkmO{GSublnKmw!`(!wBzl@I+8BRRF&xK2$av4T(8O~)WmjEu^xt!&{rEsa| z|3xlK`L@LOQP20+!1sH07iV?yV+8PHHE-kF^JCxIBE!DCEy=u1lX%;v^EPJlwtDe4 ze_JWT;vyOLE|lT2B{F=rkiX~W=*!PFjGwa?KX+Z;2X`jQ_}G@A0`Hs2c`~dWDMKCJ zXP%id3`v)vcd`tPd7nOslHuYo{ys>CtNnQ2feZ(E@OHS!aH@k0C)n`o)}NnWU*0Yw z{(TP_KJO;OU^V`K1sPuYosUm`FY92l6rh?ENU5@_ZDwH;lq` zt`mDMjlxE86n;NC3On|U!sgOZcx=rm%;mbI%5|!U>(y1k3*_~<=(*k@B7o-E2kmw9aBUBoE!A^U%{j5Bs_0VY?N#AI97!Xysx3-&_o8%f-?cx!Cw17v-+zVmC1t zJw$dR7u}=<`YUSX|U)k8B zmGf#Fv(e^SHfmR8^kqGi5@zTc; z=-xO2SJaHa+T$azqih7K6^=mpsUxr@YXlyM9)S{J1h!jpev(Ku%<2xuTd7B*pr2e zR%M~z41TX1o`qwhvan@P7W$ZF;e7QhJp6SSUT7MIXD8oPA9=^O$mm5N=Jjc>3ID_I_9qDe%rKk941Le(K{Xgn5LthLOS}sOhccV zG_=~6h8;`O@K}BtCPk%Ti(?w5>7-#*TPn)mn!E{Yu95P02WvC8Pf4WIQ$_89ll0x}W>7 zO2)|;+L?rt80IUe`jjK_=nAom2vnqKMwnb#$lL69A?VJVaDTF45^C6-o>%_h%>wA zMew(cpR{?%o-RX0s!4QF0{K4~#@T z^+@z=iNG)xfkB)_Za+E#{{}@M>l=Yt9pU)BHXJAJ3&*Cp;W#iY97j8c;|BF`&OHpn zgVkZ2D;|cU^TN>4KMWgYJ5TLIFERDE#e05`i6TTzE?w>!WsCV%Yk$J0QW`%zBUEaYZGw51%c1a z1nke_2ny~3-c}ZHQN0)1@Abm7Q@zk9)Cjo z*F12g^S}q59yozBvwk%U!U=l^Vf~arXcIgLvkeB}nwRc)@Ps>O6uaZzICorP z=8h?!-BACG8=hY7hDj1PY_xU5$WB*0SmTOa#jfZ!+!ZsNU2)Ps7o2v>1@kt$U|60D z8hW_kT_qQsUgwNDJZ4kOV>c?`jM-|=c=CZ0e%axK#^apO+1m*{G@Q_`VIXSl8i;i#GIXu_++dj`lBNjt2yF>`wpnI-2u%|kpL0ugiOl`ErqFvT_e2g{Lcv|CC1#1*7uZj8gn8{v~+U>xl!t z7~+CchIo61A*%ZsqMNcIpCcP!=1K$1NHoAmV*|8*s*itn=;OH@eVk~ok49}h@X)Cq z=r*GV9`xyf28um!>=iu}3-z!gMh`9Z^)T?EE+&=gV#-im47bq5fp2wC`JfKo8mohg zTy@Z?LmO|2+L%5^8yo$#F z*TNmUv~X&U7JA!h;g1iRxb280;si~+;iicZ9U6GLS_Avd(!l9H8hAlY1OHr5N4tgU z7#^aI5_NSPdP5D9dA!{>Mh$!Es^Qx@RnBcx#q?xV{MStqORQv%k_t zE8uqr1zhk+9#xOXKUv;MVdR9t`^p(&xY6#?W72*8CGPhWvziPrG1wMi>0|xD(POozSbX11_d^KtjV0 zxRLY&?CyVu@$uhb+nsi(jBbaDo8O=`{2PqA`W4KBzrxvzZ4m6=2B*$^0WCf=h^YPy z69;{Uf)k%$rqd^o9{LDYb|2y4o)0jw{|D&U+6u!>TA`}sJ#^^5hrX-d@mgB%ziANvYszJCd4N4|s)%`ZSv`T~?1THteB3tYVU9Oi{Q z2fGW+K-dhPmCvBe`5AmJe+sr%Pa%5S6UgZG1X7A019X23>Pwp7f_xKX&uoPD_D3*! z%pZcDoMR3$KCh@2l`{!c}N|cLjC~y#mP%HP8`N0}C%*206G4xyLTSY3obycgsa^ z)V~Pf%Pv5I+yw}qavmH%oCCS6b8xodEXbnHg384+u)^~UDDgT`IsH%bz9s1FMqpXM zz^_w;u+bv;w^V~wN;UkvQ3brvI*dM530iiQu(7NH40=?++{LHh(XW$WKJFx>{+}D3Z#~{z<7zm|D;ivXd*k5o2LOTw_gHeYe;prhb8+QmyE+2$k&x5eD zyc}x#mc#qi2jIKX0r)a?KQz7H2NfCnVBVd*fB}2q&8a<5V6z9bH}8hRZo8rLzg>{@ zbtmi`u@j!x?*N^!9pJ>agTKRe2;g+yKjMHo)SI>tT|{dPtnP4lF+u!#im) zY`wJ>LVVUj%i%RJ)^rVgUbz~E$*qQ(ajT%u^OcYjw-R=pUjg@>S3t-1BGA$+0)zR> zLHBDR@Bcz*xw{Oi{FlMpV@m+($1dcI_VB496pyId?hHO~? zhqM;Jr?%I~V2{&V?q8|6u3a*^p2(3qJ0g3FGF?fXA8B z`O}VRFu`~#l>V3uNA696Lq{jVx}ph?Gip3ogp7k5{l`Lv+!%QDSO)&p`B1!W6xC{l+W^o;(bm^SW?(_Cw&QY9{!;kizma5~$gj&g;vi zfkJF5C=N)0ugb}AyEzdyump%+9}nNg#lfP8SWvZ!fhls)aIY~E`ksn_)Ro~dFE0#A z0zzSHpAabS2!d&M10k|JfRFXTa6Z!?hI{(KcU@nY(&`OwFCm1L0c@Tsz>`=n(6RFb zS49s9dF&36r`*7Qg)7+PxPY9WGh8!rf(31k;C$TyYIoQ}=F9=moL~ou_O>7@*+7pc zR*-SZ5;hlEz>Sgp;gfeiP~vM!v_6@FT1{W*+|mb{CY!*qsNOKsvKM&$F@pE^djem3 z40a0)ph}_-;MxO@Yv@7W79IGH*95%3symqGc7q|lT2O4L31>d4!_!M@(7ss}12)?6U2|7Jr2z3{mg$3iD3f6rd3+&n>!GB7FP}T2&U{+fv%$#{gxN3b{ zP`!Uc5awPJhS*;brartR6fC$P6gZs|ranF`3|YbiaH|%&HCG7t3Qr0vJdO*#FOCSW zR~!-wgmS^~^*&+i>OF#)_by?>+wFpK@m3+&*n4550wl{yl|d8}tPH*iC2~tS;;=Q4%gZ{^tctet4aB{pc0)?1fj;vPQ4zgYJ6u zZ@J?2sOXGWnb#?=aj(j~;#cqR3i96Q75;9e*RXYqybKFwcojG0czL@edG#n7>}C9V zpjV7iW=%>Y5E_tLMJHTCM0_R~=Q*R6XSG%j!Xon zve@Txko&L7}}4S%K9@{X~F!DTQZjiR;*j6HLL4o%jSC9G2@{F*yj26 zOm(*dlU{LTo8Ap%=QW*Kor4Rz5#!1Z^SZy&*Sa(NQ-j#mdJh)W>B*{%1=byag-iLP zyxHDtW|oI?9LUaP1u?UNU^a4R2wQV8lI{Hnm44Tje~2t%w=Q#*QAw+zPYU(|yBPe$5Eh^kO6%D4)Y}`sT9vkjLhxj$*?m z=QE2nGIrzeXqI?m3_JH`EbFc`p81+hVDUJSg``emeJ4$34J)Ux@#Rz5$C_y@qGdW; z_Gbn=U^I&zbe+vsM9*RIdH=Cr{&Sg6?OZlaI*+Y=H;?U|GM^n#EMQw!6|i}I7O=zv zeC@TzLU#S)LN+>f5tDneh|SMi%-X*%W=Zq;n(gjO+3QV9nW6PE=6+%s3-IMUwi|`a zA!RvJd$F9|8&kxJeikwJMJw1Xz8*Yb%Sv|DW)&N7auu8HyPBQ3zM6eXTEjG-uVF^A zwM?&LE&DaEnAK^mV;eTCV-fw4v2V2{1C!4%}Ckrs$#s2Qy#r8PuWZ ziThd4U;A0t`~&QYMmd|erkq*zI>^_YA7t*fhgjLsL+q=^Vdip{ujLQsHNi}-Pz-JNxU`754eTb7<=FSJiF{q?7qlSu^|w4;LA*i$xM_upEW1`@<%x_nK4R=!Cb1tch`q=?&BTwV*~|%Nm{rFa zCeA#|Jmt=@Z41t^uWIL+L(zE_uX}+FU3Y<{8ee2yTP`w1^GmF9*Cm!{bD7tNzs$l0 z*0AlzYgmi>6{b~vg_+`2*8A*L_Rs$syLIUrD+syH%&%W(`y+2KquLv6T-;4|?A}e* zm~@M^Hr!&b(r&YwrrT^)MlBostd>0` zgtu&Z)mzrz{T(}T>>aaqe9z_|c+bvTwX)YcTG^MrA9!8(5A1~DM}M~MO{-d7+wZAJPVrbxFJDALxmiZtw}BI&y; zQPo%_iaNl#aW9o9!c>_~q$!hDu`;FHR_3|YDs*PB3N_7Ap?4K3^!AGiHQ1?A_H_hJ*e48 zpL)jV^PEk6N?`hw)}~Llpldf$+Ks`sQ2 z-=4H!63@-s-;-`U?a5goMsz#Wh$?0qQPFWDN_b;LY9_{XFxHrS7xG-cYGcmPFs3#A zdQo$7FX~&^i^9+LqLJTv(OB!=lq2a)F)MqM<;C9g?niIhVrN3WnI=@b+JtkqOo%#7 z$k@IQjTq90wyfzxmoN9Brp`XpJfJV#&+JPToJqInQeO(}=u2(3rc@*~CBv1bwBo!e zwSP0EFe@`!o@z#?mzmLHGNX5&%;=SwIo*yor#%bINmgM_W^c{uf^k2JkLX8tX7wZQ z!~JN(vwrkUr#~4C?oVD5`%}a&E)RG~ zP*aKx=`6M(mkJvi{K|%W^=-*6z?S4E*z&PrOVev@$>^^w?dG|prV=|^wA7B8D(%SR zwH-z151^dE18Cg10hC=ffWmHaw%yMG)L?B-^OEezxWJya9Oe0{Pwi>6rUO-ZI#An4 z2QpmiKsM(b$eQQ3>h*G@)?i0EI?<7aZ*wGtTaHxJ^CZ#H83Vz{Cle)XmDlZq> zFv5ijSGrKX=t7>aT&PXkmDUTcWHZv0_N;Uz9nqC?Ub@nO?r!wR(~a7*-00VGH~L)R zMzzguv{}QQ65QOWBg37REOsZQW9~G%(VZ?R4k87IK{POV5QY9Xh;v8=k@wv}yblIZ zOFs|V5aB@{lRW5BsR!X@58C$8gT5GelD&^7C1!h4&I(V;uJEMzr=Db^;>EdUUbHdE zi(F@OR^Bczvb*U;i@$l%on8Vd4Hn2EPavmN0$EoIr14ashe|+ecs{g8JkZr?KtWr9 z4qXP4`vBythm_}u#2>@a+yzLZ5AerlcaYS6AXWDErZ|6Zs?YYOkmcUA^O!fiulFXC z-`*sc`%plz4|(MKP|sC9^!%g`ZFuBEo_~GlQa@k95MRz1@}&k z6ldl~g980XCD)HLH2f&%h#z&<`O%~we$;5}PxjvalsD9$Ru}lw&OQFL{hB{5{oqd- z+JmXL%V4^cIG9qW4yO8zgUOEu^Xod8?#Ttv?|uQK8x%k~IRW%@NdVOz2%r@=d7k>G z0J^0eNRiHgR1qIYnv()4d>!ZVaX#PDhCo`<8Aub1gD6-CB4tSs9iACPgG+ zlOUS)Cy2y8!PMd%Oy4tt>FexZYTOb`2Tuo6?vr5B{u4~wOhSl9qiLQbgz9F5kk+OU za;^>`zlR|tbc9eJ!%%8<3#DBNp%gqJlzoL)cY%)h_k z6wg@!Z#*I>J28T4$3;-Tq6iwYKY|ur<}88d5w!YG1Wh)Mq(Jvb`W+idWwJ=JTM|jz zc1Dui*+>d&jHKD$BWaUP6m1_6MXQ6ONH&bK0cS-cHCYGY=V@du~ zER`w8k!7DaTIUu=pCjVPWq2HA&WNK)tK(?mzBrPejU&f;&T#k;M=KQL$)s02t#yj0 zZ^7~8ox!<-6XU6fb05}jji>pi;wk+`JoSDaPc=XId#wa|Xr4em9tpG}GJ&oPOQ3gC z5~#h9zivyQno|i>bUlH*pCwTJw**R4OQcICiDc}YNGU;yG&?Pkibf~WqIrpww=R*~ z_9xO?;-Bv%lGe*an$?j=4>Xc^4t^5(J10?6U=qcrB$4N+BvPH7L}yke(U2WU^zLL5 zNjcxJ>QNH?X-%R5f0JmiPBQuTOC~$FWcnSHOqD6gl%AJNZ)PNuba^s~TaroPNHV#c zOQwjs$rRO+%yaCMNmD6>uIi`I7|Rs;?VdstgHz~UatfK`q)_zK6v|tiLb44hl)5*C z94k3Du_lGq)TdCt*D18=dkXzhN~IwERGQX5mDakXQi*>mEsRYi$&ges9+OJvXQfhH zVJcnUm`VforP7p&RN8+jl`hq#(zWJPs`!*j%YUa*ghm>D?U_dNEz{_iOB!YPrP1D~ zG-^ywqwhIs)HNxMUe8M-T9HOGHm8yKzBD>|GL3A{r_s_|X>{*V8Y#a{BeSn*)c2xqAoxZ21lT~&)`HoK~|5@o|zc`)#txhLanodLa zrqjn`>6At3biO8?RPUyfM^ie*yyEgXojkkJNkdUWm$W35Z789yrV<)yE1?T65>iD8 zxdm|+O0ZmsCmAG;tM5oaIJ(sZjNB))27iB5cX-R2I4=Kg=l2WUgl=~x6 zdh8%2XU=39BS@*(Ps(%drL-|pO4H({411Dy8Wk zrF8MLl-k>*)V-bm_Crd)I;2$FC8fe&yiI?kM1T1?$z{+A`3$bMlDWstpk232se(a4|zE;U@*xTt7mkOG%C{QW5|`CQbwtm6NbFqNqY4LM6;(gGK_eJYHDIL2brJ=W^)NxHpQ)_siUEt?; zmiGb;SN=gq4rPRe4JPPx9-_4TJ z?Ws~)JwZx1T1t0vcpI~%bX>}>ZHkmU;-r)u!TF*=Qi}GKlC_tV-nsDWXfGuzD?Ua{ zrKDmkr35`bHZ-NQS4m1o{z$0ohlHknmXPOL3AHp!IA@oS*Siu*xGte>7bNsRl+d^1 z68d>SLhpC*vA;<|1#9?NUM8Wl^Em5tx`eillTd4pgv^IX$TwL+AyE>3Z>3*61nY2IK|nn+?M#2rcv?AG`cfCjebn#wj?i&{z%d|J2s8>`KOV@EsZ*? z(rA`(8ntSs(cr(SRPZI0U+Yvldq0&}O)71xN~JLeQpvJ3l`a>hQp|s;bYWa7^~p-5 ztb|lr9hge{+__k#az;}sjZ{k|^R5(rFHE82#uU1BJ%t9c6q;V1LWee|(DlL;?t`b$ z+58kLk)%+1L<*@u3T?JaA>&>tG*>-^?sjq;{x+E$8x} zHsg}%aAq=@L?zQCNTv$gWP08+nZ7G0)3ljuWK5~)KH>DVNZoIw&b$|q6Tr$mZqN~Gsk5-ICsBHi4U$hp0VB%Pi}1tSxw zI4+S^cqh^X+eGp+NTd$V>@E3_Kz!{!ZMc{~KMwPI=%xf3yD)(Y$0g7zNdnCcPM}oh z1nO;)Kvz`~D6=h|o;Af&SWP_l|Kq7?Q#>gwj3@oE@uZU$Pu~Z}(`Ea3nqwGG=A0jV zykkKBKF5KEfeZy3q_ zhyC1-XyE?DXYNB+T7dT==BB@1#`)Z%L-*zv8u2x1+>*fgR{4at&509X_kO`cb#te$+b8k4|O!Q9kg`Mt-!p-IomR`qIop zzI1D;FKK4`(xAb<6xr98Vt)FNPrVNrANQf=A|EQw^Wpx151ljPb0I!Y+S1@npN@NT z4!1WY=6TboKyMmt>P?cLNP`}5hWQbsDN#RUqff0=+F0X!$gOOyULFI6xppWr5N;+iFXt7u{OrMep;xsC_Vh?d?Uk z+dZl5mM2N}c#`seo>ZFRNoG!-v|7!RJ~w-iSG5O?U+qEb^E|j6^q{@Q9<;V?5Xr6$ zBA4xh=+(4A+}|5SJ!}Tiihu6(qu!k&4!cv)LU%eXb*D$J?(~w+eVd-U(YY!&TEiJw zaoKM47u~3&hZ~u_ccpdbT&Z)tD}|1BrG){mbkx|DGi6<<_Oc6I*z7_($Ggyk5EpXn z<3bO=I@7qToQcJ`Sh*9O=~}2W_3Z0RiQk-P_EjfZx5bGzPjI3YAx<>b#EE>`2GXy~ z18L8uf#frGAYBd^NP^KoD*fO{AI~|`fOU?Pn&(Ipyd7z#E`NQ+Sy|N%WLM-stwSAX zlbZv1syWcbCVTQeVo$s0+tY6zm+-T-r-{D@(7M_Iv}?xz+A(PM3n_9Nq@estKPAGx&iIMYRQQeSJ%IrHXJ=4?)PO;}}`;c9m33Z$?p_9u^ICI*B{#cvPvhTe~g~!zoTIRmyKxB8Y6n0X+)s|jA(O5PkMH- zC-qp>lRTt7DaxiNCA1q-*f~RTT5d>csfKj7zacIAY(VbJfNB>RaQkjR5BnHU&^vwF zbyAM( zEnTuG(WT-nUHWd%ChNntHZN9U6b!l{x`Z&d2u&V&Fn^r*4=3B7cII}twnF%A|c!nWipN zrn)#~GBsAFA(jGQus3kQrV+GCuIth zJbJp0pa}C}Eo%6=lm&wY?l2fAx<&8vl>I`tz4PT>6(C zH~7mYZ2!ZI9saOARlixUz~7w7^NUrc|6^o)@@{SeXe#<(O-m>5)Z`iC6Z&+#TYqopBYqp{56`L^k6&s}b zioGm)$!6-mWWP4OU?a_6u&TW+?7Kq?GdcO3*$dB^)wyP-5!}ogZaiZvY0piMh^dVpj4^OmR^oyP?s@X0Lq2jP)O}Z6yzxUZ00- z?Dhs$VcEdm?yqOcj`ghD@dr$9&;$0Q`aav^eV?VDzsG(C-eU`{*74d!bxcxwm+gzc z%bFkDVTx&YnBL=B)@?{F`}X`cyF7x|9eQ(%IgGl+E_}Gj0>|=aS8X?##-tl8_Q!QL zf7*4n_2)HqVAeIZ?eA4qF!w5pSGdZ$FSx=gl&`Sx#Wn1vS`8DHU1sYvFSEzXFEO3& zoFlgKBJsoW3u^#7He(^b`W^j(JS$CFc7;=`_`ZMf;;Tfi|;WTsV zd74FRAePvZ_$y-rdoupL$bT2v`1RGSn_)F8Sy#n$464}F;!1Y2Mqa&eGM7v(Jl}JE`ce9MzT`V+m7wdOzC;Jq%lkLB-gC+UyU|-pGHrI1I z`*U&|lR0l=HxF%PCU#p{#-1`>_o|E?FWbVd^xDF1t}kU5^h()*6`NUs#%30^XcJRc z*u*MkZ)AyGCG6Ft5|;gC18dCRzMLyY8BJizLIV0y^`6iU%__jtYEr@MQprs5xex?a;EXK zkOfRCWaB<9V=Hr)vF$BO*IJ&$Gln9Ej=oy#WN{g0JjoWpLNn#~^WoyBf! zoXPeU&S0ZwPiH1$r?C@5r!x2WDQp|BkJj!siMd!!Wa&LQmrQLu%j@D?viD<{S<`6N zbVJ7GQ9jc>G>R?XlE=Ol<+6Y|Ic)BjY_>OZBom`YuqvP7Y=>hOo7#66^Xxv9z5bKQ z{`;80l%7c0l$#R9HH4X#r?KQsscgp56t-+yGFy_9#3m*uvhbh;rsEdRF7%6IS-P?8 z%fDzQ`xM0TtGuZy39>E|fhi2w@H5gW07aL2P?eAd^7=v$7q`?r>gN zu96@7(&oc*pLw&|o5-w0V59d6Y-h0-yFSm8Js;!2-bx0sXQA%win|-z*3XsYX}hrg zzn$3aw*y)J14q_*-hoX$Y|q|o8oM5xM*Z%` zq;Jic|9vxNbk3B$DDTU*ZRo>d3rtx1nBJ@~y%#eGHfC!$!%V49PnM@<$XRCkO#4|6 z7JFTfEj*>m4sX+8Hw(4dvnk!#>tWqkOQaU7^U!2f{WSPm0ChIJQX)L~$QH4mSF_lo+f(s-bCY=Ga991 zzRo%-9(F%0%G3^urcL|BD~I-qBj@fGf5z_=7g}x?RXWSWIoC_YkENT$gs~;!G5__V zs(!JU_F2dGI^OGX)o`z~{U&=^1{Zjp{aNT`ccj=WXZRMcNj>*?#oajU^=D3{ z*A$m?Ui9j!*X@$KUgZ&uUh#ihye=GV_4=9B?$xFL$7|>d1;G+kgHyKz>0*T1uKQn!>fhXhPA>}`Sn7pU5OByxJg((yHu#!QzqQ3-6qs@ z?hy8w?-s^~?-k4@?iWsNE*G3H9TL`lI3hIa9~V@-PYOmOD+KMLD&hS}Q8@6Jgczl> zLc@UbLO{YrVeO2|Le2Io!jr4lg!<1ngyV*{g>l|@1l{4J zKxa~K&|P2xf7kYb`kj4Y;|Ws;y=Vq4b>@)M(hnNi`h&B)B}~<^g1x5JaNf}dYP@aX zRHPlOkPLvhQTFh6nggs`>FiJTa zj&#p~hMu|b!YmK!Y)8Q^mwb?b4B7)m!??&XP@6aw^fJbQ$H?*EGkOBpOr8keXH9}# z3np`h))d&kb}IbcG!5K$Oo!hGi##aQ9>>fZG;WdtwVb zbSVRk<7HsyycIl-ZUvWte0~1mZScu{I~*zB4w-g4;OD*_P++|ix_0jbiN!8Bz?p5Y z&31$K*4<#yXAf9y-U9~4d*RFay-=yY5AxUS15KU%u%T!_=x82*$x9AEjdD3C6qLgN zxr5+0`ylxLJP3}wrnzeSA-FN_FwFdT7V%TXzOxBhNywnzL}*_Z*C_ zJ_p}j&O`RW^KilP0;q1i0E3J!LiFm35UX(s_<#YO-zG(0wY7NLcv*HW8UK$%sg@p60NU;;nwSL-tYz_t>8H%$~R%q?3+-~eiN$mZ^6SB zo@iA8>s|+K3+h1QR~=}MzX#u5bLN}$ zKFq4S4k3SKC_hMLK*Va1!*;GOmc z?p}Wb5%?C$550x9zVEa5uF2@*k}E z`45y_og?w7~9r}C(&uYm4h3K%;_0W(f0pyaIr zhWAm#0r86XXOSYFV~RNWiz4>6RKnwFN+_&Q!V?#iuy2PFP9LC*HA9q9saP3ZuPS50 zZ)F_eq=MNaR4}bX1-);opst)MHn^(diX2sR->izaZ>wU8f*Rg+=Six0YFJXLhA(T? z&|Fa+V+N_?m^^iyUCO0a9Y-r@V6?jin&oO>%O(w6cS{33-C`hipxBCmt*Brif-Pbv?DN=SU;`?O zfh`s$f{MQL{_%YFc6WAmcJ}s}XP%koJ8(J306GR4fX7+`VATc?|C2N4d=0^!$L0NA z&SUgW8^Wy5oIB@c1ZTP#LCQiSIDf(j0^SF?O`)lp#|^fc!gen+c;CYeJo3#T9Ta8S!I#x`z)ssi&U-s3 zvEhumM0*e>+QY$8dsuVb9)`8sgO`^B-0SK9ljk^q+CB%E-QWPt8jcVb>Ih5wJHojo zJRbD8Bm92m2pxt_@JZwZH-|aF<^m_^eaZ(yc=YFaD!e}?hqw&2lZ@sIK9>#hM#hWj@Rxm&%^`1i#*`JOb^(;+ykB- z_W<3e9^j_q2|l5o;LyhtI`TZ>MujIVt@nh;4o|r0=>^@DUT}4a7xDjL${QY>^oH`M-Y{I-2TX!}puC3<1kLt=tvh`{?FNte{q6(Hc?|IJ zIA6Fv(id*8_JwmNeWC1$FO1go1Frx-xY5-Q22b;Y7o~pC<&qy9_}~XW&HN!qrDE{j zBZj`!V$SCi!{UEpnB%}8Q^X*w2ZIk28LVB!z;hpiZC4l=ykam|6=16)zzq?=tL^}A zCji`E0dTk+U}`mh&ohAPKLAP_37ij?fNLiSjLw#D)}90|mPz0aN}%SR1P*+Wa5h^k zh`eLrsXP`Y^oxa0Q(~be{1>aw>;BO%X>mVt#BunAQU?~im!Px}s zq%ivcKXzFPY0spv`j-^Wo6F#70OuGa%Aj$8463HeVE$?u#FWdR;hYRIAIjk2R~ayU zIoEA+IK$-dyqg?8kCH?4d^y)=a@c%S4n3~P;m>n9EdM13ZL>HS>l+7WWO4AjXB@bX zi-X8ToF7;c2X@Ee;8RT;=R?Fn_qI4_Hj0NV&v>Y1@!;Jx9!6xvL&5BL*u9R+-gsDh zHXcUaiwD0C@o-Nyf$L(<6%0s#K5+?fq-O$rADsX$c?l4+J^{r062RwN0;t?efb;JX zVEn%X(6LB_Wj=|}4vEmEOCqcrmdM$LiO|TI5l^-z!u8{cu;XeXWIav4%fR=wcG!y(H+?oCNoNCqcXs=T*2Q z!{e}I&`V4PH_or{;M_u!8OiWwc`}r5Nrvu+lHvWiWEfqS3=J=nA*eMO#%ia)Mw=8k z=*xvO4L7Ezz}S8%5I80U?$1hrQ7coRc}og(J;*tSXHwwBtrRe5N&zR%(XdxZ1$C2D zsCQ0AJoPyHeKS<-etTdR@i*JXgLAS|i;EGh|dcyqTH~ z9rL+x*5aFDer$I-OgowmZfDZrcuhKl-Ajj!&(h)D2hL(_ONVsz4CrH&0sq-@4v9ww zXmKXVX;B6YO2~i@$_&WtodFjzGr(wU2E^xPz~HD{o&tQ9DxkDL0V*36kXELEIlC25azFvQ zjw@gzDIn*90-#0#A8sok|GokYo+vo~RRMMH6#Rdu;JQWuy*m`pN1d};bd_Lhtc3d( zN|1ar=AS>>sORzD>qg(zWOq!M_$En!Ic&XOxh0N(swR2`j3Ukb9Ds{kRegjw<2!A%6aV5~?ed5Kyj! zS-X@_wOt8M%9QZ2LC%Ran}-Id_hMG3<)l&~gQ3FUE0*eg*&VT=++g)6~7 zND1{mO2~3o!fQt*Zy%Jf)l3PG4fuP~=Jl`2-|=tG^ZBlTi=PxQ>#YJ@o-5!$qXN9{ zDq!(V1=L?wfc`lJ1PBU06TQ{dn0Vg4QN&VVl^8DP6E0|J(2fbZN4Fqx78&qrmzmcbdE>68I? zGcuraTn3zo=HGf?2FTnpV3>6V9F7w*CmJ3 zA!1iLjNX(Et5&8%ab7yCosteY+36r3kPdBKxL!%*Iz^NYn*+H1aZZO6^K_V_l@6ut zX`J7i23wz|!Mxfu$l$t7jqA8=T-OD1owtqaJ~gfb6CdH%MGcZyqXI0g;dy4kqQSlr^3z^sjzT%Ds&!~3fhBGVRvV) zpE(z)JTw*b-BO{aSt_hl<7vO906kBEqqQkecs>P&97zGYZ7Fc7fOC@OrND*pDd06I z1#&v2z=7Bls0~bkXAUXQsGkC7e!-=`c@O5l5 z*!53_!1QGB7bSzaH*cRTl3|xxGIai&1g{<^!SHKIaHlc}ym#@oZ*3A3&P{^-W0K%d zpCs6loCH%Nk^o$j;JslIEc%rQ25%B!R$U@IIFksj`x2qshD4aKAQ5JaPlR#(IHM^g z5$qxo;kI)kN2eshzt#kp`aA&|ZzO;p=QIu7kpN3qCBUZX37mVB0CPGgKv$LkCSIJ| zWRd`#esiYqt9XFh@vu&ahx)ugrL`R>Z?M&LKvZco@f-#75uaVB_OB zFuoiI6Ap1ZWMdq(<;8*H=r{=M9tXa$abV&d2QQ7|V0)V!6wl=F;;I~m9pUWbO>zj} zcFhEC-)!S{&j0P5%iQikZvPa2lfj5a8E1LR;M`srbXg;VYn%ZUHdqD=Q)F-sc}B!)d-M37J~f}1D!cB2S( z%@Dzl{vrsKiJ*_02*zoMV8ZJd7<45D*xne>;I?B58ZSiJqlMgkEfg9hV!R>A| zWS)qIHS43{KyEag=p7CF#L=+QJ{tP}i2}RFQE=f@6!hK_1&?M&LB_x+*ei{K@6J)+ zuM!2Fnj&HF*+>{z776KdBf(=(Bs5DozuP$yB>y6y=1Bx3a!%F0k_b?p6#?=6B484W zfK_%8u(3TH3L1Fd zq%fG{5e5_0ct5Bq6kJb-!lU9)SU4>d9D0UASwtw9nT5i{mJm2|Jp_K0^Zr(T2*eBx z0g#74pi>AK{tkwRoNKl27-yUFep(&xuk}g`h8nM6@Kq0nsZWF8CcT7l4^69~$e0kHB+0N|zoxStaM&pHRd z1OEUxqZI(_p7}!$@(1np{+#LT58)a9aL~&iY*qbXLZcsFf4~nua0Zr1wja1AaBTg-A1BD1Yw*`qe(rZ;KCXp6UZNoqgc7uMd1x^MMbI z-cWzc8!A?K!-V19;KlpeS9zbi-)Ap)bj1rYwt7LuG%v1`y&!@!vIeSo!L)~-kaxrr zrY-e^K|?$tijO?~GWCQ5%^uMCoCiGL-~mI%dq8cn2ZT6#!0c9czJ`H2yxHLnYBM?i zzMDH}`MJX<6?eFF-wjqAaD#Zx&T8)K2D8K5I2+sza-OZo4LU4H_kBnlryxgafV4*&hSLy3?g%9nE%!ZPH}(8 zn>9|LlH~-t5+_hIbAorT9pM5x!m`zl5I@Wj-iaI`&&UzdzkAuk^8kCOQn815^>z@m#}1li*gIcIad zFogrhIG1aoDSYZ~3b|gU@V(Up23045q6z_2I!khWhRTxaUTyEJ{+Y0G_$Z}s5w2|bv*P!H7p(}O8)dhqzOE<~Qu zg*hv9fx{u7*;g0z+H}C-68B}U(*f%tI($6>9cb*}?5=CtkhM`8?6?o~bc8nir=|^$ zZ)ri#5-q6C)&h?hEtsOI1z4*IUrRN?evBqWi!~uhTN9G&xzBa02DpsXfOfG4T-4Tp zyn1yA->MGx#;C(+u{!+FQit(%YVf2~4Wy&hU~P;VJk(GF^E;{_D^Z1kBUNESq$*5R zRfTakRG`mB6^I$80=k^-wYmKt(<}JL2KxMC#b^F9>hYId{Mf;cEa+hQ_8lz#$RGAH zR;vX#M)_2B+erL^X-}w4D-`F45Z*0(suWWzXSJw383;Q$i3;U<_ zg}vMKnVkyy%yQ4SF#8@YY*+IqW;^Q>n{4ulo!tJBJ&)qP_^Th-mwq4E-In)kTi$!t z)ABw0zWW`UE`G<}UTqi`IS4zHEHP3jLljS8QS%(wkUY<5Lzl z`YFr#^MtKk{)BCEc*2(Ld(1ewmib?Q#2)m0#3sIPWIv`ivP`{3CTx7j{`fp(K9vtx zZ1Mvpz1P6}hBYvi@Aui+y!&jF>3ybJc8|>qy2n1yT^5&qm*qXEX9q^qvx`6K*d@M} z&Joi(wzRaCWdzo;U&0->HsubpzIU7DXWnMdKi^_Lvv09J`nUMF%uP1W^CrtVa)b4d z-e7Lmud@feuCrOMt}%m&*Vy8}HLPW64U4m`Ve__MW&4A#vWs|yUE$+Hm35a{;lRtR z|NBeKZ0aR;OzjejTUpIc*;X@;oflbd$VFC(7uf5h3rwY!k3sc6&wjl*#~LS|W91!Z z+0eyjnSuFPwzcF8bN4yJ)*d;{THrJj^L2_QbUDR}8i|z;d3?^1op*B zU`1tB%*U^a?KxV>tR$6e(xsE^RHu{dN5cu`FysUad4HURPd?5(I*u`oMaNjJ(J{7i z{ZS@zIm+tx9ASM!kFYychgo#oVYaO15WCs+5L0P9$XqfH@@o&U;7JFV!|(m9J#Rm& z*4xkKuGz=@?e?+itrbk^Tfr_J+RK7s_OeB1%Gr&ia;9-}5A*B3hshr8W=WZxFZOO1 zbDgk@ul2Q)(d?aUqUKI!y?h7TZ?=PlZ`{txowqaNUEA33fNgC5k*(}y%vNS_ri^(e zma(8~rOc;GDKopjg?;L`g$d6~*wm~N=J9DWyD(`p>(*Y(>Sq_TM2%urzGM^YFxtf8 z)@@|dY&Wv4TQ)Fs-@q>IS~5`PJG!l9 zt_^G0>V9k3m!<+1KdgW)XBO&fNUY_dtm{~NLs)`uFhvV8S`2F%{)H#mB*6m=dq7H=CQ>O<}&Mkb6Mo6In4e1 zY}S5h7OT8AlMT8(gMF@_&axg%V>OR+nZ@&|Ecx{mHuPN%%lWpO*^vAFRMx)t1(^2fLMK*h7J(At9%i^4{5v-rfaHiotj1_qf zWfne}Y_{JJRvR#wnFkMIv7rN5kMIGkcVvH-65Wrvi~6#6;y$bddNWCEFLqVhlf}t< zu-$RpS$q6{EGDrV%S`IZW+r!Gc`2RQ6uy32k2EFoNLR3?^bEE%Bb~V_(%3FVDzjCl zuo=o^R-;T}I-L?(WTynyxl=sr-6@WB?IdTSPBLcPNy_djW7!g=gaz_${aFQL@d`0J zks)F>88Iw7J(}%Hi(*ewBbjPy1T#+wXI9B!OfM;veM$)7(6v0ery5rWnV--tW%6PD~(k z*A*<3y%MjCc_E$>@=UDoc`7z{c`Uwa-6$Sw{6MU(eP6ufZ@u{Mk6Q7tkGIA2@}^kh z(RHz;u11_yb49%H+$Hha%8TN)2hWQa?K&$SRdSlM!$@qjOc39gS1F#IdqV6!?wFW{ z9TBJYJ0!l=^?+EGx=&mo-7D6M+QZpsyTs*gJH&5owuzmL%fzXgTg2JFi^X|gHi`@0 ztQW6;Tqs^!w^p2gwLm=a%qnq@<156W70bjLTbGD$7v+oBEng_^k~d$hojXrFwsE%j z?4{{q%_CF9u_Y75qZf}Aubh-E-Z@~n_(LS63$NLTgHKq9 zFO`{y`!6#Pf6LJkFCL^Jc1%|h4aMf5GZNHk5hQeX@pX17lwFaf%^VA$pPINz^notCJ?HZ=76c z$LnZRf{S zZ8w=+y<4G8!=X>%$X>>oIgc)Q!rgPUpiY5ddw4M_n$8W4qYf*&dwLo zCoJJ}5SIz&vsVZ`7OWETmKF#bSFaT|6cq~dHm?`DZrdmr?kN@y?k^F?Y!Wxby29%y(B0MuL#FXYJ|V$*9Cv;n*!L~7J?mX1ud6);k4U5p|@v) zaL@ap5b5_wm=f?r*bvkt6o)()=7hZz5+Ys;&5>_~anbLDyD=XGd+{eh&OQrC@Kx}a zd>1}RT7`mGK5ta|OPDDABOH|e6<#~5;0tF}yy>il<<9Cj(OCn1oi*{6lNM$=Y2zzL z9qi$#i^m-FP{lzX#r6g`#Lf_>+8W_>8)MA2Ho;^oQ#7?S!z6ix@=oY2GJ;6$}@a=>n z+&be{`!0CSqAOl8?1sm*{=@u#|Dmj{J3jf`12da@;`L{}(BWZk>{8o@&++byqt5rk z&O(2*J2C*TmJh^!TLo*3iT*jid)i`{pKOPHIC-B&Y3ApFOMAUgc3DfRR#&OqkaO$}!IQYa= z46Mk-N2Swn^t$Qzbny&~m^BkeO_+uAht0-Wz31RQuerFaY%cb(n}@dR=3$Lt9*)Y- z!#^tXarX52`1#v>>^g?eL4Umf-ws@e_74_fY}ZBD<=P_b&gZPBoXSW4sKxmAz+yb- zy#yzhaW)t%ik|Y%3OgD`TE>%yRF1m*H+@4_*J+M zSK-v~)fmF((m!x3!10?3u+?-8j#{z?Z>g+Bx7@Xu*|HYb4qt~y9U9lpy#-qxaGx8)Zp<7J+AMg)ESz4ifgo_+w0J|4h#0}tZi z+JiVW@erz29>NuVhf%%cFb*|7f`{iF!RBvA&~W%sbZ9t=)@jGE1CQa&z~i{I^f-o^ zp1_NFJbvT*3EVsEBzD|8iI7r>!#LM%nqL*>7FXe50|BFE3Hbe^fLjJ2hTYt8lN?t#w(rA;Ks9O@V}6=*j{=T7aN~L)j8)d^V2yz)c-ub zxqcqCxwpi$;sR>gUBu^$FJk%6i`aX3HGZqF#;Ng_@a171&*E|!r>(q<+x}d}W7${m zV8az$mvj{eAG?Y+ZZ&vvRSn8IYVdIOHPmmohMf|x9AL^N?kflt8%*LybYMBZ> zyQM-$|EbW_U{wkjs7iG!RcZ8TRcignW9J;z=t+heNoK0iiV8Kl`B05i_0-8rq)seL zo#NK>?Im^c{Gm=N9vXDLs|GEdr$M4aJU;J<28}Y*q)$wfhGc8fd@*P zI`rm_4h8?yp%DR`HP>60Di-O|iKDu7q)C@b4fSZISdY?1=#lO^J*qs*SI+yWM{jNQ zX=IWJ2eo72Alb6VWPoK)wUQ+ByIU8prD{XgcE;Augllom99ss$}Av!Hob zEoj77&akt$B((%fIyu^s`W0Hz=Tnw6`L!jzF|wkxXwI!0Xho0nt;pz*6$Lj~kyOQ+ zVtL$ZU}tO6&$Xt8Qfpdw*_vc6*7V5AhK9%5P}49QN?lvZF9pd&*9>r!`~j zseG+H9jvma9Z&5kU(2g-TlKurdY#KIhDK~G1bnU3^) zt0Voq1!ufl23A_IYq8i zQRPb2k6h`-KUdBfbEEP^H=3Enxp>Rm_u+vUVChc3qTQ);A9pI8=}uR+ zxKs04cWQg?POTaq^vuhHFvWxNvOOqfxd%1w_nEC~z6g|b0 z`mOh*@s*x5;Q{C8{qp4R)r)k%i_Z1)qO4h7^rys&=A8DTmM31M_{Uj#&fZif^`>6~ zy~%j4H<^`rliFEtdiK_?JU zegx|N zvcq9?_i7mRcpgRZ}!GYn>^ zMbJOn2pS(6!MTzVWHTs&I!%qBi7O*0Z)XI}rU)8d7eVY@1a+uHQiXLSB?d*(^@K>0 z_Kl=16C&wdek8eXiKOIXk<_aul6o}pbFGnNX%NM^V^OpyI*MEsQB*!8iX1q1Vdjb` zy1FfjR4b#%>qZnsKaZk_pHbvw5KZ4)qUm^KG!0FQroRKCY2l=3`k5b1Jvc{j+o5QB za50)X8luU7^8|HNW9YL*3|;hzp@k4bp`Bx>CNqZfzhdaj(in2s5<|ld$IzyWF@*PH z=*qhoI@b|HyG=x#`z4~tC=oqP5z*wnB5EBYqRhD>I<-bbYCA;~!I=|Xu8OE{qlh|x z6j9he5&bg}QBMO=>JKz=G*H|OppGR#J2wDD?*=+?9LVJ&U*@S6 zsIm#@)hD2Te}L5WCG_1!Lbtsnv>`%58F3PN-$_DK`b+3TwuF?q6570wvk})w=y$1v z4E9S%N089xOA@+RC*jW{p`ecvs&41(M6FmlZWhZ~NU_w-Kb96m$5L5*EbZwOOT~R- zY5Is*N}Lo+zh}o%$M! zs-~2F7)xn|os>*Gr8Fm4N)JR*a!!y^XQh@3*WYk(I zwQZKtgk4g)dr(TARZ<#sUP_CuNohm9l!_knyk1MGTMNIYO-iR#WYk?(M)yr+lxQcT zEp9S;;U^>Wa2W-0MoMJ7jJ(rjq}feIH~YvaZ-|WCvSoB&f{Z+;$tZuWjOz0_OJ$Xe z!iqSxu|!6a9WwH$kWuSl86B;Zab};4K3B_V{B;>Mavo&p0~t+vDx1d9ea;C}2eU_YPuAF2G z`Ms-nIl7&fQv)wo${AjlyquhNKu&_3 zpi)jrC*&kPCMWwNa(aD`Kl6TGM-_6q$)7u!GduTf=S&@5A2D0xG_Y7s6F10de4(6r zuaQ&GDmi^xCZ|n{M5sfE^<=X^WTXl$*8nlM#4AFAN|Pxdv9b^@Jz;amyAsA%INS-{@>&rpyTIcWP_YfdQ3*! z_RHwXE*U*2<=?;t8J#JR(YmEF`ft9BRA$O({bU*0jgisfVf?%3FC(8GGU}t0(bOav z&57k~(oSph%uaxq)O37%0l;*9J($fV}@|_{20TZM&cLe|b`}1$N8~?6TrNpFC`WYdm zGCwJWyGZG%CD#Y~QktS7rK%sX^!8mWsW-)v?p>~LuEx^C)3LPUXe{;F6H9+KbG=f) z&o7Fltm$0mjE$wALt@FLXDmggbCJf9TR6YYE0)gK#nO1ASTakn?5(1 zwI%eh9jNX-*Ts*47T@A5+H=79NkH>=0BIC)9i9(#Ef>f%o9ptvK!Y-X_%w7H9K@#^ zIP>EsK-X1x7{C`sTF)6RtY!4&Jfqa3yuH}Y=+s(959Tv^K8ex&Oh%R67%htD%L#=u zdhNz2m$yAXc^fo@w?$RFP3qunQ{Wjfr5zAc*Ag-3;EH+Oi|OY`-hTBGQ?Fz(y^j=A zwuhMRnTaV#RZNpwM6~0vh_g*abiImicZ+COp@?$kizsx0h#n3Q(YOo|eHMvmfH!CO zT8KzRjklvMocH@Eh6Z2dtR~L;m2ZzBi`6kyH#3IjjEo`c9x+rB7ehwDF*L?LhAOpr zoBl1DEI7l->v}Y~S4NZ3j%a$dDw_7rh^9UxqN%NGH08xcQ@d|8^|y?s11iz<{(Tf# z-H)Qc^HCJKpW7Q7qUc{9w=>2>(Y#(!k~l(;v+~L5J4K25hQek(}36E)N(VN#+(f2{he?MSsYGN#)ngRFV2UOh0{HsaJpj> zPL*w8w4y1DI$sH+e+R>8^ZGFI=Jwo{;bElC?Yr*W&MV~h-g$2KJ$lFO!8@V!fb*TH zG?bPv3Z=9$oF~;Sl=!F#nY)J4BJEIm^N};6>qBUQ5JJUeA#`L>2%Q)mLVLP~(Bha7 z>h2UmCK@4B*&IxrZUs~Av0zHzjH&H&f~jR_F!`kgQ`g{N%Cg`L>h>V&|0IauLJ;Zh z38D+jgJ{$Q&Z+JZM2o~h^wTMbda4J}jyHkSbS;o{4+WCTxfz&Pyq|5Gs zv_LzMg5L+w<(mPdJQ6?`3Ili>8bDL}1<-M606lZ#Y%0wF(rospKiB-}*#Un#R^U%L zll{rFr$3z+`IFLt+x>t2DCC(R_56yq-L;KJAQ1w>Mt;+MEbD2K0Gr@xH<}J0o}c{lSfX*SOL9J#KV$ z5$C24b))~{+(^a6jfy*5$*a+o^Bi4Cr^uBC^Zwr4alo#}L@Ga1U9Dc!-Da@(A!sNRX&-@Grp z+=-TEInnS0Ckl0Oq7T0vsp!5Vg&uVzTF&-b19@pgNX*4xw11NO9Ki9JOQwWm|D_7q`jPsQKt=<5wT678|033+z3p`RTc zjIyJXCVczOmWnRg(%3Dw6qRdBpSX`;y}vC5YuZxf6B`Pxw4vex8~UDYL$L`ql;zWIxV`DiVw+z|M%av>1|VwITJ`WJo3B4C!uyA@A=Ql3j}dd0#Xj&y5CT zIo5!F#u-qJwE?aApwHVUefm_WPm8nl$y};W1?Kvs@>Y)qlO7#gtw-%c^(a`x{a@TC zHu0G*%|5P6vzF-6nEtxdiLcqPg?ZjoEB*pYLR}H7O67sw=>kD>L$K+#8FM^x=52WdTUa-zb484 zYS7i&8kD$QgWI$kWRaplS#}z9;Db87KCMos1?m)>sm}do+=r;GPB9PE$c6hCe{(Tk8ud4Lof-21{R3)7es*UNeO51eoN z18-G+NA+Ic(edXubT0aaI+5S-LETp@nD`Y#OuypEgI~}~`2}Zw_>98R&-m2mGhffA z1)mRX!82;yXI%CPLt;N+b>l~rPvfjFtB?5Y=m+%a@&OY+y~ng=?=hOQz6`71;kCi< z_;_D4suVY4Zgex=uX~FwQk-5IaG4ukL^n8IUzCOnpE1qLlpXX?H;TdB8XQ*sz!kRTr7#!Gyb1px{lY^h) zgWpf^RpAqC41R*b)yFtL^D#ztJi^+dN7yUm5njF8i0+wap@z z9cE_KVcUyZoHnBtUzyc%KlvS;CBK7v8*bzIakuf3)@?jiatl{R+`?|xZlcDJn^@L% z1HD(>z)hYvupO^seAnwZ?d>%zo_!7XSX{%cduwo!tOk4DyNc$cuOg{l#V+fwU~Rw^ zj6HuDH}t%Wk3U>Oqr6KPV0{Ur_Elq`yc&(~UBsu^7qR%?1&m*J0ULZSV4qXx@k$rY z3wzBuVbjlHnbA2szwIpEjyj9iYtG=Y0cUXO*VCMfbs9TtPvfTjr_e)w3OCmis%8;( z`;EAECE{6E#KvO+zDO4E!NV#%HKqzzs#Kw3Z6*HltmOQnlYANJleq5j32YyC0yET3 z;PQ3H5xtIMLnU8xh>ue}esmP8#~#IEm7_Rl%@H*BID*HHAI5~_!+4?L5QbzQ!sWjY z;{D|Z(bVZ6iVhyY&awm8|-ibCgJMqHq9oRp52fn?u z9f$PTjyGOyL!X>&I7wq09$34Tk40|9ABW3ORbGaFZ$a|`y+--243 zN^qA?2}YmXj8%!7F`&K}R}U%1m!CJG-<(Z2*l-grDc*?Nd^h60lN)e%;s#t-w;m@B zUXO7tMW{Zj2#@O(Vebuv*y34;Q;x2~7TG%Nb8{`8=(`p*o7Z6Clr=b2eGL|`F2KW% z1t{!YjmM%_W7)-3IH$`h?EGXUnvYtESATNe*n$;kV7dY~mMlkGzvZ~>#4`LGw+xeS zEyXo`m*TBAOYq;MCFrKI1Y?#jM!C&mlX9Mpd^8~r+FVTk!GboQNz zt+6xk_ z7&c-o9-c7_`5K8$Ob>b{iY?e8*Nq$xvxD=D7#ibZ*}1dk*Gn)hOunI*<; zxgxx?I0jobL}SOEDEw6!iEpn&V0A+{u6Y}Vo!dgOLpu~VTZf>ZcQBSm1)*(HAWrKZ zfHgz?(QvXK%I5px&^10deXBRlJLHAa&Uj+xO%Ielc1ME`Zg}mNE6&n&MHd?vJnrR; zl1L{!8SjYhT^%rQkUiFqwL_a(w%B=@4Nl)^jq7(?;hy7`xbK1mZogxWE1sI+sE?*7 z`E7#gx+X|geBOtL5$cB-;#R2v`YZIYypJ9_Wa;99935=R)5g%%S~#Ud6A$mzz-K4b zQL9=FU29b_HVW*{0|A@w3;t^Ngk^U1 z!o#py!8ZN2keYc@7&+s*Fnw)}Ftg%{Fz&)7p*Xf+q)s`XBoR1H*knjK^M~7uzF@?z&5uGIED7dG0nL zYkir}<-ispxO%go{%DhM^Xmp-rS5tm(WOxM8nsqfuP6}0hOQDWPG2D?3ziADcP|lA zPv;9l{X)Ux{d{4OYM#(!Jy*!;H&akuk}E7fK3ULzK3GmBPZ!X~N1YNy4h{al&F3sW3f*3Bz)uh14D4g3s+>LFJFX zQ0MIunht({F(LttyXCFi1(L!CJ;IO8U_*hl=V*015=g99> zboN7)o6W1LCF34feYEJmsPdrZK&G( zaCKE$*pe!ZrSq!RUYJxBGihj5n_Ks)d$oyGwRurhEn(hOfiJA9R0&G^AypV0X;>Z_Y4=Qf6EaK-I6DAieD-^ z^rk>$vwWkdXUJAjcKsevm)t`l1BXh{rZfLz=&a+ac!B^@?$aQN zT3(RkN=eY~VQ+#?e5nsoKGYn9{y&3y7k32h1|?yFj+&rRttp(lt}9q>GZaEbnhI%l zmO|AR8=)@KL3nwo% zsXkQrShhpZzrRaxiVqhY_C*R>tM>?RChil?;(lR}Q?yX2en^ z;b_83L2FNrFmG9&aACx2AD-ktSv4R9PU*JH%?XwcAMS^tERmbF5x>t zZu?%i{jXlw!#QewA2bM67aE0$JDP>tbG`~qeZC3mPTvJ3rJq7oZJTgB>zCji`$xFE zy+imn>z@!~uK>>aig4ziBB*el+O%qAh<&93#fB3o*gt)!Z889lN<*0c+z9sEGltXgCUE+QDMaotgV`(1!EJ^G zln=Fp4S`mm>}Cy{jcuSt!4|x~*uwHkJ2?8x9uiX>ATiDnjz&AdvMtWwwZsLgCb+`7 zzHac_O9V@-#qd~N0-8T05cHPsSNzHyrlxto&`X}+a?lGJHhaU#MLys=&KK_V^aDq! zKWs1!fOG{J)N$5YTS+(gk<}e4k^Kz#>4BD@o=kb0<3*75$qEu!L8`YAPSiR zVKX^@ZNN0n`vQQ*>LmN9I)9k7lP-`gNuXbL#EdP$TV39 zaeo%V(zlDi{K;ZSytV{v4=sgt>z6_DwB=CPI~Yn`SHOL(m9X#YN)U=x!K<{@(D&>b zIKAUPC|$4?+J>xycF*-tWf%e%e}=$_@(oZ<8)5K;O>k=0W_Y!53%nb$70NxfL5hAT ztY{5|h^5;hyK+1H9KHk0GIxO3dnZUQ>;zlGU7)a&uYqsf1*hhP!HA+T_})JpcBh7e zo?8Tj9gpCwyGZC05($wXBO!CrZg~H6H~j6s2NVZ@6vrx zG%yMl-;IK1*Zna2*nW7V!WnIA55VNQ1F&aoG+fP!hIF5UkaqqcBB)qcC*#G1!uO49?(jxOVk8BwCz+qY)=y#g7xv zeJIp{4r4<)hZVXEE*c)95UNIzbH_2XjU*8Ny0b&rFl6LHY2d=aWvUWByDi?CzR zB?wHp1eJF2uxxKUeEJy={y8)@GHz3^pCiLEO6F#=y zgw50Wp7YtaV1f5-U?*?GKgDG5Se6U}ijrYij}(A}6tK|012rLc;K_KZ6A!_z^C9HVeFV#&J%VqZk73S{#~}ap7&>QUgXB>*^cFvXUi+Vbr1c5> z8~h4< zUcZ9t0XblFG6!b=&4J@HbK!1QE@Zmo!Oh4#*!?*VhK|UGpEvVix6x}*UiTUnmA-~M zK?U&XbOEUT<4m~Oh0vZ=2szG0urIs_d_ERICTGG0TrGyf+9goByaZHpOTfyz6f6#w zLT5`Uyckmk+mg$`%D5cP{Z|f}MddI(paM=Dt$_3&74UF;C8XS`gncGeFm!Ddd@HPi zQ2%Q9akv^rw^qZ^F>fIA)*HyzuYqSPY9KME23B~y1?zop;by~IkPfbesDxT5R(S_1 z^WK3~);ln>uY=!P>fljD9sC#g9<+|Xhsf{m;q&Nv2)I!X^R+*~=EWZ%B>MwQb@~X- zp&y~J@*^w``~-DJKfwU*Ului@0pwR2AV>8xJel(u;xj(OQp-j#S=R{h`Hf)h(FE%w zn;`976V&u*hQ^c4Q2o6b?u`5btFL?k6P2%UdgfQqNdF2`ja%Swa0}dg+5)#7zro4P z-(Y_6H!$^Xg=@Q8LG-Q_BH=r{I{F>jn!khUpdax2{0}Jj^#h{E`~=^tKOs%24P2(R z!P=BINYrkJta=zh6`UP=Tzrk$HZ&>mCH(Yi21204VKwj=2NOS!Q z;amPfx5B^hQqlnfws$~WNe9$pK+pdh;x+|l?9A#X)R~ai(l+m|Z88@n_V2Za2zL~6oe|D&##x)gG zFH*tw4izkSRmG%{s<=8t72PhVV$L&FT<}d5zgVi_lD=wK#CEPPiIykSCbL%>F(AZfQ3kU0B*a}^AJ*tcM z(sePYMi-M*^iW@_hjT~iVZvHHtT?5I|1$N^_`M!lXzHV`mp*7OM)*NwgxiK0q54XGJj~Bijj(4q_ucIM%YKmFQO|j^JDVE;i47>tU zO!{Gp+sw?cSD+cTOfkblo6XSitQlU&G(-KjW}N3?j^t#Hzx$b^+X8d!7h#U0E}P@f zXXYqtFh_kY3oMsf;Gtm_C~zL$>nIDHeBA$T$r)3YD2ukl zZZ|DalxK-*UoEj%&kB!tSz+&yR#+8mg^TxF;kzU&&YrQt_(m&i*0M$ysWlEAVvVyF zTjRV)Yn+&1jX~MgsP*0&Untq&CPy2z=xu}XGi}gus|`k-w!shSHt5aSd5hX?@PLUe zUh=cW#L>2RW`!+oi?YR0S8Y-MnJs44+u}53?kDbGhx2;c;j3wO=(^Dkmmjyoiz#;a zG~W&@o9(b#%N}z@_IRVeJ#Lx9eayGnV||Q0hTgMBjUs+*;paLIoPp?oTL(Dc%{kmR zeX9e$;hepyR0n+a+5zL59dNm(BRab};`82)ICDB@?S(kv*dvaZe8UkHUN~ZpdPiKW z;DkG@op4V#Ck!3qg!7j>VfRQU{1xkjiR6R>x$k_zHzypSe{~__>=KnvZfr zzeR2cp>F7Z!VN8Mx?$rJH%xlthSSFf@32jSaVu}Q*Lwq-xCR%S4nW%Hwi|mN%5*RXDIkc@%8{I zo}4Ph;FVJJ36tX6lTzGvU5Z){rMRm^iVdHooJ%3aP-AzzA#%qT;Eu(k-0{^scf1|q zj$!-UvHy8@Y)y8@{ZHJ{w899_>1ql02|5(*u{j_P{T79yq&=vmZDYLfe|N134pNSuaoAKE@Mw%=5%m>pXFIq$ir4 z^2AqH`8j!_QZBz<^FYHHN$Xy7QU-uTbc8(VvD#>EJ4jGf_)(}TTHWve&F zM0um_8E=fb=8X+~kEsvNaq&TszYmskcE-lhKBzj& z2SbB>@WW;w4BG31n@;**VuBAoyyJr}9&+YJz7NK}@!|cI54!*H!6J2ETw>~rO-{Zz z-NzTxdibK!FkcLu%+DA2;_@~8dZ;gskMc$LQ@;2$o-;g>eX-|#Uwr=37yFcP4&r-X zY;WTpKLKF&$}wapL5aAwHy zV}AJjf*&?;hRDyme)uJe-}}lBFPHk^qIZ61-0X+f+x^gA$sZGRID^F8AICcS<34wP zOqTg$b}xT?Jj5Swb1uo=8U8qWkv}T0_Q#8x{Lwqi9~1ZcquvRBoO8h+FI@4*oMeCe z!2GfCu|K}a@yCo3f80~!&$$i$__4(wH*)65FU0_y&)JM*#F;480qE}>fMeVPaE5;X zPT*{mpnd_UJuCp9j}5@JQ~B??oR_jB02NjT;LHsHm>3#>H4y=*d>{agj|HH?8P0Qz z3&8v<0eFP-9sAwm*E0fe$>RWg^CAHIybi#Fr2+V=Iskvv1)%0<9%l=G=4SvF{|&&i ziZUFdF2hzG8E!X{;a_tZ&b5_cs*?=cL^5>tlp*@buwQo>c0?6Z>17vu5s0@3L zl3~F({`_Pa^8K>VbdC(CERf;8B{I&yli{7!GR{4dVf04Mh}kMb+Z{4|5+=hLyJh%x zpA1Jw%P{G%41XSz@$#49h%+*reqM%?;$+w>UWO)#GAzC-!(G>9Xm?A7@yRl@OqJoL zdop~QE<;6 z#N`UVuLqY*{+v6Pa30Sq9$y!a+n$RDe~&AFpEiH*o7XZt%hNH0r>8bYh6{Q6%3jE@ zJ5TRUo^Cl$f6XHqwq(ih%Y7M^XUOmtli}KQ9tZ#Khj(N+oae)%oBVruzJ&1nxpP^D z)t6-WJ(ic*IT?O9&F?!Y!ziAweR%%9KOn>Zcz%D4l;LEa|JOOIr)3Mz(~Uge*2%Ch zFQ-6WUY5MvKF#Of$T>d4d3nB_#C3s}Z~jRBUA(;i8z95P-ZFd+Jk8yBKKb(WdhqfU z@jT-C^3O(wr_5#OXe7hqT%X$2WH>;P>lN3tM6Pf2H2^akI1h;HVIeXi#}_Xl7p*ZTyn|8sdg(B}0ame&hsUO$fT zdh(Ummq1=`R`B|Bh}WZ7UZ2kKdbQg*0B2eA`-}sykk`A_N&)zn*Tet5`C}=smy);s zxTw@0kL3E}wQPU9MZA8e_~Xv2{x~w$A2m+;$9AzlPW8#s2tura!7q z@JG=wf0Xs%%+>DxXyxgTU!8c{Vd0N+_586*ncw@{4;47eX#RUYyj$*vKXU!h{xN47 zrTbye8-D0}k#k*7`r(@>KRmg^4|}iYZPZdfoH)x5v&Z?N<6u8rihdaD5E$ z4+}XLHdDb5PyFER=qF#)ukyv4dA``=kuTo6>x=eReR1ts{`;UWe%R%U$|1g}yVMs| zXZT{nC||z7%ojJyd{Hd+#fMg$Gpp;1nO#0;-^$zW_db|Z;)5m6e6U&WgRMzE`2L&^ zK04@w2Y345u(dpFfe-GUgg0lyd85K2Z=5>G8{-CfV`+D9{3G&4Z3}PI)bPe1?VPvtk+XG6 zy>Q4=FKoQ)g_{z*@YgXfoEy&jyS1FfJKqasEd1Bum9@t*% zfv56#f1csN8K@p;e3JL?;U1W}#sfdk@<2V__uF$Dz>eDjI@~7s$ZdmL+(uZ$Z3UgD z?sz`M9UU&XV{{bf3~zA9?hD*;)fjg?-oqV}B%J$X>W&vU_bIelio?sLsGiO3mRnLB zd`617ky7mYpA;|6l;V#eQr_%Jai)V5H)u<7N1FsU)Jky1D+&5={&8!p1Y@Hl*egVW zFXu>b;BX1v=q5o`M+pwqmf*IZV!Tiz##_(Dcq2uOr_YLUeWVzBtrlbZR570IFGfEv zF{YY}(M?f|5uZ6Xs!)W686w045l-N2<{2Bf9XCgWK|@8T<1fNoYY~R3h|sQ?Go*^$ zc-!lShZDG6c!1l8A#S*2mKz=zwR5gGAcC`@ zgI#gp1XoN#S5$Q2VcM>^q16RXmAl}T2QHX+*#(auaKSa}T(IYK7yQ-N1!E=LmNjs} z2b?`63|Lo9B|Ji2dv%gfRbPboHfP)!(|Q_W9fkBJMHmEtv#;Kw#Ok?>`{9^U$nW( z9%qcV$L8+#7;J5iRsZZzcxQ*Zv+XcD(GFYp*`fYQJG35ahh{Q6RJ5?esz0`vP;HB| zAK0SiMO)4xwngb;ejLhKR-U#vSKk(|e6zu~g*K>m*9L7)+Mv@WK2Dl$gPlEWI7`+B zPbk{p@H%V!_ShQ3`It&`w>55EVvV&!tx?7~R~vP$G3kpH=I2>q-7PEpaL5WP)>vW2 zI4e9DV1?sMtx%maudbF@Vvl>4_~3*k25hjz6O%2mG0+mdEiG~GZwrhlx4@Wm3p{_y z0*`F8zztI@aCndf8d_T5(_iMeyv&@l9L;g}3C_b>Z;lHl@-e5(9Fnep+089r$=#nmrNQTK`|#zdN;`9f0+>u-whoJ`SI(G*wJ znBavB6MS%*^WQg`V8J94%$Av8qOl2X=HuqxdB*rN$rxieE6aB=A4?A~MjvNmJf&ca z->Z$V2jje~lSUZ7&IlilHNt#vBh1w?;{B5$o_}J9t1cR%|8_o(pKgfzf(+5Y%n&cP z8lYVsAM;-`z}iRybf0g4i+UU2Q5yqH{-uu(i@4m<$2(E_czm%wF72<6-VXZs;jbPZ zDAhwziXPrRpobny^*9ex58EB|a8QRX?k?3ud9p6P*{_S=7wh7me!AFdr;C-pb?|PH z4(`0EgT43aaGszJ9^!Ky&Q>~@_(L0Q^RzMiiZ;I4rH$g5+BiQ@8xI?4V{(%gK6;{s zPcCR7+oXkYoVB&dOAGsJXraP8O}xSQoXasytXZLna|df;nWHB5`pfqaDAK^X>l)|~ zsez+rYv8IN4cujkaoc0g-a4y}{nqn2pHb?VCsM~9d`|+Gay69SR>Qt~)sW_@ zp%~OK(pU}48dcHyu_}%}qlz2Ws^a0{s(8*t70>c{rUQJwX?2nc4hmC2{pl+B!e0eL zv{lf&P8qMrmC^ICGR7}aM!i1DxYRV#{#9WY{32b8$-xx3eYA%@T8m5BbruYy0IuWlFTV{gZ)$^uE^VNb`x8!u z`~+RcpRoAF54if@4=A+x0q?WFL*l@go zv_R0b77&zM!1>x&_%Ze?B>njU!{fd{(U33D|64Ph=JTPIy_!MkV-px2XaWsc6MU>} zgqxh{HB-_EKl48G|8qV=wasVneAEC7moz|xegj0Oeu5p-KEX7_PhiX0UeAVqgz2px zpzOp4z#bo9@4I?<5Lpj39`*3?^?N8?{~m5xzlZ-G)PdcCI!M;61MeH};P}{gP~TPy zcBgCkQvF&OTK5)uM!p3b_qR}&TLVYd@cl;2YT#D-8?c%22L4lc1IZVwp=w|?d~K+L z#;7VN@UDWmf=Zaat`Zb1D&c^<0@P+yz@n~lNQo_nhJJiL`$HKR?=Ay%X&KbNEQK4v zr7%ao6#m^Rfrzms@auaqOgL5yXSx+bPH7P|Y$$>j%OZFuFNDl#g%I9R0Nu_OKw*yp znEK{5~ut7oD%b z^DJk9;Vb^X%S(8(=_QZ4P*m85{?>J-?bodR#-lfkQZGAysS4X4)LhC6z< zAtUh?r1rf9XR2<(>h(84W^fZeUAX~!`rQD_>g#ZF{dG_?xDNBKB*BfoNzhPv4UE@a z0}s7x5ODb_xc9!w=g6RS(w-3EDS0-1GdY~K%L?lICb(g^zl9o<=HVXZ+Z+= zx1NH*drm>T{V8ZoJqffqu}47k=`h4>Jq%q&hhbvkAvo9L5R?@h1l7d{!MQUU{0~P%H&HaW(*ZCX za{wCa_ru*y`(dsAesH-I1y2H_U|P;TsGGA7X0+{v7kl@D#C|VqPT2zw2J!zuD|ds_ zs@>2_WjBmI842S&B4Nmb2=E&p0s5c9;mzi7h}92=Nf*OFp?esdeX$EXXYPXA-*$p1 zd?y^X*aCjf|W%m^y|3|#?9Xf!}e|g55C{lkK#=b|92zw zaNG!)12=$pc?fJev>xu)Pg-K(l!1cA0`G4t?z&3p%bgP^I z*f}1&?8k#{AO2tZ+_4ZHHU|6?M#JN$qo7a2NVujo5|lkgz@QPsVdIKna3XprT)Z^| z&b}TDVXcE;vhg6W4j2e8#}9xd>-xjbWBp*|-M&y-(g(cSd&7U`y&<7{FL*YoCzOZu z;B6@aNAbbMQUO-A2Z6hJ5EOR{gq0J!!>@JSVD&K>l-~&e-y(n5_}vd~8~H(*uP?NW z_JLn3y`klR7nEK1gxjw?U~{88$h6#{Ml6NRgCwB7Pz>Q=BKRKX2II0^;ZltYeC%`v zYa3_iEjYoX$&N64y#q`;%J-d1wgXYVE&OV>0j6yOt0dN7F~|y1=37GVofdHaygB$~ zn8Aq(Q)p>70W>v%O@79ZG|C7HmK#Fj9s_7k(1-R%deHb*7YaLd;D(hBZ0oKKeaCCT zpH-TWuwMfPT~&vwCu*>;P8I6ARA91=3SjKM6i_KM0|x-U}@M zolvh{EBxzOBdDye7JesH3RQLG!VRl3Vda<-!G3pCa91#&ct^Op zFIn)-x+Pp|yCGP5To*RZxhCWuzap5ux-5)SOc27lT@tP=ixVDQxF8f1pA$;7&I)FA^@b%o9|n%oe6*O&2ao zrU>s2O%P1~j1hXy9VyIsF;w`^Z;%ig(@)r`)LYoP6opjsigaxV3-4rBJTpl#@!i=Eny+#F@)$|UE+2$7nb}m7GGE9TYXQ&4y z|NR#D8;S#WZ%GTBpK&_SrgLkc$@cz%_ms5*jSVh#KeG5ix7a(X_j>1~-WxT`B+aLE zM4H{@U1{CsUPyamlaXdrTAr4Fuq{n1UNb#d(IWlO47c?E(gV_sP5Y$>uNsrS^X07c z(QYf!i?(k`j|>h^-xd>FXWh(sPDiN&mCqR(j{9d+9~_ndzY&+3B64 zob-|7iqcnYt4yDFb?C|uA2O6{ zyP3)t%Pr(rM%u`8-r38G);r5HwM6oL=cMu=KQH<7Y+t!BMJA7G3Y2GtqWrZ{Z~3G6 ze)6M%gX9BV4wV(jFP86>&yJ0ft1meq zkMTJuH~)1=9(w* z@}Oat<%bNf$X}OUmH$4QB-faKL*6C1C4ckvw)|3RihT5DzAm%(J^4(vbou?4a=Gdu zlKV}}ln=0eAn)-uOKu(iNd9I?wmj17sodoIGkL_l7xF5;_S3v~uDqK{zC7sJYq>*I zp}cWavHX;Asa#rGCO;QbA^$m}O789WMn3F)jeO|kTDkkuI{6omdimk6ALJIvpXA%u zewIJ$)+BHJ)hzFjf0cjQ@=c!7^SgYO!cTc)R-1g%u3z$td_Ue?)ed>tlTP`=$S(PS zOA72%m?Ep1uf+5QC^H{d71mo-mG!DuWnS58Ogmnkm4s=qgYz|6P=76!@2t%xDC@B2 z?{t{-p)Oy?tH|w z&>pPSr6d7`#^kSB&y;)pzA7-+&FI&;SAG>AOpH=?q&%P84U=2wF*{g^_?Bwjh zY?v^F)f*3Gi<^hCf+xe6^M&DT`oJ%u%krm}-wQ<-JyG`9Q3bXFZcgPG5m$+`#3 zVm-8HGts-*tUYZGONyS$1}&V&p5S~YHD18}YgoWy?=NI2#}=`x%NDbUK1KI@b;>5TD`GRtow9}f_1Ma^6t=OBf^956K9u#t?JPQe zJA0+KgZ&QK!7OTbF!9ixOq{ZlS=#Jkf5LXLoaSBZ;KVT2?|vBjC<^-{EZC zoCsF=Jc9Z9MY52XNOoOmH!E7Yn>7~fX5WN8>{HwxmZ!CsC9K)YmRIa$&fHhv`IUWa zwqX?eupx>~dmF{F2JL62H}|utW(U}Ttp`~0`vWX{STuW@9L>@#53-o;2iek(2bpx_ zAy$6p5DT$B%v5$BX4^jSw63ce( zj%CxEVwub6I98Do$F`VXWV)L#vb}FEvY&k}u@Ui?*kO%$_IO!5d!HN6T6`1O=c5Vi zb$bH4H1#r@pK+NPIV7^Aor%o9K9MC1y28}2@;&TzuCo0ruCkQ;tL%y2HTLA_HFmr0 z8rw5DiH(#eu`cWD?9A5d%&q1+JI#GrI%99JVahjI#Qd8qDf=e(5xB)D@)o=N=@#2M z@VwKU0bAGqz&mGxnwE8JptsoF(mh&Kf>EXZn3#F#EGF zn8mLb?9bSjEc^OPwo&61GoSa0oy&N|bS-k&!ZkVU@~a$H;Finkx976jid^=D`&u16 zkjI97%447V%T83Vv0p0K&;FHc`{_#7`mK@;A6&)upQ~c2KdM;v&}v2(s@dtb zYBp#18>ScchQ+nNVRj>G*!H*@_M*Lp{T=?68O6P2hV5@z`>hhrVNn z&%I-RxL@3mL3M1~={gqkwT_+b_nt+Zc+Vy_zGu3<>eue@#e%G&b3 zvhI#8Z070~wk)fKO*j0;{O5dQEw{e0Lkg|TVstADJKxHRzqB&#p5K{hKbNZSOvn8P zE8X~mMLhe#tjvG1BMW}AZz(@nfKnTqKDv!9KG(*kG_^5rp`Cq>Y-f9l+nKKOFSc&g zFZM9w7yF_0n`uq{%~axlv$}7;Swhc0Y~;Q_tfKS}8|w0xonQ5rmC;}JQ=@~mjqhNU z7dlvcQwJLt*va1S>SR;%I8o8+A8TFkj~U8doXN|gq8sglS^joSOGQQ9Ik zTDn(_^f
Dfbt!i|^M4dFctJB;m>Xfuuoj#paCsWR`^M9vKeN{B5ubT!14AvmC
zr5f~kp9bByu0iwiG)U_k_ro>PBx!&qU7Vmvx*?jh`%ySHiW)C_$T+J<+Dr58BkCrbE^u
z9qK+vhx#wlp+1p1uv-IfQHa#jkt4H@qkB(RB(ab-3WM-*Pnceki(nNi#S*uS|j_A|F
z+xldauTP7<=u@nY0lktM(8s|B)Vk1szJwW2MVtZMePBR4-xyHO4g+emG^E|#4aszZ
zAst?0NL|r}G~>DFb{9cnbD^Xeva#@U4S^fIA^(@e;p^YdB`
z^ROEx6!gM`vg=K#kD@7Ew=pG+KvNn&&Xl58n38;tDHUBZr8oCYsjR}39{x0?(*|ZV
z-`$LC2b$57*=96zvl-PNGou-tt@rqa8Ch}P_1Rr!bllRM824w-A7M_#i@2XV_i;};
zZBC)7=F~UOoPK;Vr(;SM4L6f>H
zsGo%;+4)-1ry-UUH`kJeZnmVlBbKx@$&zZh@BN@^OFH}0lHTcBk(nF!)9-0T!zWtN
z$Q4%9E5eE#&RNmdR4cl{efX!>ThX5mD~d3&CM6GR3hrl3Pp4Xw!5V8C!u|eNUEqAa
zd)Bl+*P3?LThqc0YYH;9p}!IvO6qMxBPQ8URj>_B3$vkTF*f9S+lF&}Z0K6G4HbX4
zp)Z=Y^wZv!nq;d{Z%dhRwlpfumU44!3F~Yr=9evf(6u8+XFD1e
zXh-u$*wM1Nb~HD{jx$i~$R^f~YEtd!&m>ZN&T85nPoVVNuDDq)H+gSt0P@faiVEvPNXDuqT@kMWHpTQ0;fAsQ?L^Wp-vQX
z(1~-moG2sNiJm;-$08?+t9PRHZB7)V&Y2SC&a_ADOy)t(bYzG#bxv`niA$a7>?UU_
z-0Mv3G0voU&6%{AGyQ(yOr;ghbn&w@&G_R?YFaLI*3yNXBrbF;(1qFuxzONAE)=oQ
zh5P1nwndl=l^t=Ryf_z1z3oDKAGpwP&LixscA+y(E+qNuLh+ieq;KI$i`-o4dVnjv
z>+4FYV_eB>mMfVCyOPpoS9-JCl@gD0PT?ia(@1uu)AwD;Hpi6?RJc;}M^_Sly3#r&
z&fw5@qq{b4M4ZEMtD74g?&n5xN4t^Z3^&SI!nua)-Kb@!8!d`If6jr)Uv9j1kekcoFrvC87^<5pBrk&*X_{QH6*ey%&+*R}l^TEu!Vh
zV%nk0StRCSTI(pLvF>8BlZmOUCl4PiCiAgkIz3HHx(mbU{{1KC~vV`okB_uMI
zkgc_Zl$<40B$d!nKMC~}BvjK!LW_q;=T@ngXl~SCRl>X>Tsh6pg)>ujDh&>N;kJ(W`DJSqKMB&Cnbr1W4VXG#9Y
z`H>+~db>$VtG7w1WrviehfC?+ZYg!`laef2${Ai#T6&DjNhwV_EhWEmJdO)ex_wbf
z6BDHLDN#y`uSu!ox|DoxNojMkl#=gAsr0UtKBsY!OR1csl$t4}&<9fL{!mKQoKdqX
zTT0)aNNM&nDP=t8Jj<6->itSei*k4zxl-DaC#B{2QX2YNN~Q%;%H^`IP)b@wQi|fz
z$z@uxlrD35%SEF^N_JcvxfpTz#=|nWY~bR+Ej$mGvOQdvRfs{_o;qRLvr3q6w*Jpy1
zo{#2bFr1h9ARb>oDX%A-`y)u{Kbe%`eWaA_&cD%3O8JgFZ8lOmY%ZnAMm!&MrF2uB
z>y{GFhYkrz+9kA;GlE_;ay|VZA(yuj>Q=#pb4XosdDt_4EsNj7xZbC7eZIljq=^!`
z5i22`(-N9|R6>XMbH-4Fgz`frRJ=h#PghIm@=^({pC=)|=@P0QFQIiKB-Am0bBKEK
zde%)suHF)wFOtw9dkH0(ODI)eLf6%KTwP*X*e)jVS6=r&h-v*BF)5XZX-kfn>K}^<
zI74-NikMQaim51;*XxsFs*UE{q6jf1Y~^)*t(aVviRt+qF-@B+rmB%*8a6;oi6Ex$
zzGCtei#hX2Ov_Bfv{FkN;=N;zXo#
zQbe#{L{oN(XhDdGW-k}fkU1i9n8@42p&~lfi(d~A(JQfthS`cJ&5*~VCgS#*8y)}R
zMj7uo7pcUJia96gDd)&uPIja93A{~>aig03ZnSX+XDF?6qYaDQ=*=`Y@*U;ISvGET
zN#@3Ro^JHonzz|{yiHbgqeDMjX$o)W^?7@L=anlB;_d(Q+pZME`-79bU#RE(gCp-J
zhV%Yn0q-}0dH*r5pDPWPxpLdom8yCFazM+KJUd*7HM>yv8W+w~b)k+d7aEY_LR&8J
z^J6Y_H^PO|LtNgB
zOc^(vDUY*w^A0#u<~C1@1qzR>t
z6q(K0PAQI*9_vVH(T;R^t0RRkbEGj-97%T&4-0Ulu}<7Z(08P9oem`b>_7%(4m5%D
zpY|p@(2esB^dQQC9&Y6J$3h1>I?jRS^>!d9PY24kbf9202m0M=Pit%Jsph3U1*O^3
z&P(>h4%$=Q7JK@$*q#(7*i##4L{)m&(@hI|TBBl5u6&Z>S*0CKd1^-$$=uF5XGd4}
z*wOE`b`&_9bEAgY(XMWGbkNa`qIB$NL%S`FduK~_+(s+AXG=S{&1S`Iw~O3{vz}{9
zJBQm+MK@b=aI~dK+P1XirwtvhvEkz_8`_s*Lo3hPP`^kUQeSOD@~Jj7y}u28_2f39
zxedKju%Z5+t?5{yH5HRJsU=vGTeLOjMsb;AO|C<&NyXoq3avRaTE&|BG+R+ku@wbp
zT2W(y6-|le%&8D7Qk`u@eFt07N*^oQZ(&6-3RZODlO=`aThg2~OY*v4NsW=5L$%V9
z0w!5fR!>Xn>1IjSbS+8!rv>NVSeB`b`Y_9a3I|%yEl&&DW@15n
z@ijHnnp5O6b27Wh8QI6oNqLJo&6#UXw+5TjS1)t2H#MhTf6ZuAEtjX9t$p2$9FCaL
zw+&{LGLw%L`kRru)QnE)n~@D4KSc9!#CJZP7!+?x`}Ugh{?L@_$D7jMAX8GbH>F?7
zrd0FEgzn{-P-wCV1)eaW+RY}kdA13u4ltqZ5)*3DHKD<+#&opAmtTdcly4b{UfXLPP2tY)Dn^hLohodF9^>$iB#c9^N&e38(ltZnFW6o@qe$dK-|w
zvjI&~HK0Qu^@*PAQ`t3r`mkT0-mlcB!ZG@E$6ueqP4#JTyB>9v=~1j)j{?u|vE){M
z5xN?4!yjt
zLyHgSP#b4ttskXBAH8*GsDTchYtg3n`PyWCTbueH(&pSsZCW};n-=+M(?mmU>i&&$
z;$Le~&Mht4bx@0>tF-9RC@mV{twk^Nv?%b4CY{LPoU9~G@`%!;ImQuc!oqQ&#(|VaY
zT{l*z(r;??ozEL6+~5+WMy*TKsAP~DU3XQZb;@d-p{GjKnX0tqj4J7FQl*2FR7p*y
zN-K<1>DgBmGR;xptTGh}k5r*6^HnIbj|x4tQ=zQC%5FU}NHau<=8RLKByT19tgS>=pA@ObV?`QwL6N3yQKX5J6{%l<
zBDokSQhTEUWjs}&br%)LAyk3xPgS5%-4v+MP=V`I7hA~Za_k3pv5bHJSl`rtEQvF?
z{yP3+zGaLFnV(%y;8&_QLZw8}jZKyK(#%`!n`xXt`X{@i{FA-D`-2rP`N8hn{9uRjzOx}azq5vb?`+k_R`%vpEAt=T
z%2xjS#*Xm$v$J!*v1pTTY{`=rCf(4&3M4ITZsk{29`%(4_Wa7Wef`3cIIk;f%omoa
z^o3naX=W?uH#29`W_CZjiS=9G#BRDZF{RQ*)-$q^&FS9Afqi4Bayh?srqC$@b4Cl+h`iDf?g$R4f!$Zk7)WV`b|utD2CurD4T*tW`g*0!gf
zO%AMQu^-;EqNDHG*S_!B_m(>L_FNrH9bU)Q{&~l&6W_6G6W%cw<##OdRxK;wJTEov
zTIQ1WmPr@9WmZOS+4syEmb$El&9SIqKOetgYgcowm+c$o@uHe7T3^lfIaRZhxm7HB
zQx#j~R>g#ZO7?YYC5w_&GLzy87QVfLy>+i(uBGK{{LXR~>{-rMm6fp>yUJLAR~h?J
zR?05yDrGXSQg)}TgxT#XVQV}~*saoHR=%T{HM$qGhT;iq3)t3;1uW00fX~stX8!A5vjKLmS-+?G%zafp`)85QC@YUGSenOv8|ASLESJ5T
zm&>~A{`!(z(JNo?vvp)TT?dNmfO%2bP
z?9g+z?0=HZ0;-DVi{o_n3mP7%fE^gTy_cVX-L2RyprY7~7+8SVlmV!O3aEg*y@QCT
zfFO#Bg<=sZ3J547#(&QFAI|r@W#8=V?9AMGvpah~*Q1a^-V{(|Z~-0ZT0k3~pEc2rY>{@&7io>QNaK@KWIIMhPa3jl^RX;4_Q;~J
zavqCj`*remzE1IXGO64rlhlm(nnh{`$tGry*7tOJcQTzW3F)->^))iuagAb~uTlFu
zSLwvktMpy}DtTSH!ud^CD7hhx@{Xj@z20eb^Jyxb+n7olY*NXCrO?OODLfX_Ws=5T
zrtm?RdHkPCGarDj*BH$cb2rn&eDHf&(hN3Gqhvb8NT*$hIS{Nrj^4_(}6z#T(qRh-ldNDbYzBESAx9|w6
z=@vmH#V6^!-%0YNWll-Tx9s-uuJod516>aVwNA
z%?Ty-wh$U|GK6-yhfwN+gH*EYAidE&Nblnh(2M>DD7Sn+#cbG5evAaTuN9shwKw(Q{eMiRIERXv|uK=E}ubtPkB?1lIbM>
zH;q1apGN07k8JGWDfA(CGA(MHM5WG?sPm+Wv})G`in}(RazBitBFQ+)^BPMDYsS#V
z_|eq&@hEzyF^V?z8cBcWkD!3V!|CD8VPxMhl%_ilr5$63(1~q>De{sR9V{P2eg=cc
zLphL|mJXm(C;C&LJO2?ic~TE&PdYXpsd_t*%VmM4mMdwkJ`XL}&x5uv?niz{`_hoy
zK4ex9XsEXj2`!(wQ4=+e%J0Ko7s)V?CVPFGrG{B_nj%iv@;#S
zPPEmxBTYNuM(y%k>219Wh1$7Lmk}L^t!q!7aqTFz#F->*PUPe2L@ARLR1@e(=9e6(
z%X51Yw77cMQI}b^WVX+Ss;}|5a&N52&(Ml2`&rWU1#%i0CZmTcDUGO-P`a6fBxpg4
zmzwjnFEe_dZAvDeOsJdGga-CEreS_YH0Zb?^|)z37Pb2HQKnDV2Ix`1GF@taLWhcP
zYLic`7X6fI(Y67a)Z(YX*>&nvn4?C6pZpWwy8RWGZ2K)fEBz(*a%mMeZf+5iOTLTw
z&duV3^^IcQy#_Jfpe->x0_$a=-SuGBhR*5l7KZx)6pTy*?*n573
zI57Q{=&4&Sy3KeYs$G62=Km`bw@rK^I-P$cX0$vMJw`qdlVk3SM)gJFoPqbmvquZW
z(yF^+bH6*H&VfA9;8m{px9d&uL*NZjEM?-(b|k_&l~{fEy13gaQnt=O^OD@|sxjk;hpvd;e+i)XNxgb?0ai
zwnmD-icgBE_9w*Y{>Q|hH;#y*riVrAd56U4v`|r^9wP3Xa6qhy-6sxi3>Hrg+9Q5A
zvP}
z#iW{P;*!0SMJv|{V$R($;*2FD#V^{!#5MdKriQ@-#6^`TKG>xcd$#K<9=z2{d_BLr
z=&IgD^gHV&CiL$hzN&B%jkY_8ee7*TZ)PcOoGBHL{xTDjB8^4zFc1r$>F{@^G{sjk
zH8Ib(Rdp|+QB_=3t150+rMfr2LUs4dGga>Ehbm@!PnG4Jr^-0VROw|Is!U0$iY6qg
zZXb$OJ-#2MsxdsKQXd(rYPT;~6%i7sYSUY-3fQwq)uuj86}5eYYJ3~095!}S>3mnH
z^jAw%ZuQ!#;^z%ndmfi%?I;nmZWf-&8g^%QR?nT2vivvOXPu}nx!&*Ekn7tONBbPv
z=-1C~$h&@U!NsFP(kzd2Q}%m|oqEnAY-*0j{HZTJ?o9daF|(7NGAc=?jB#tHoR`o;
zS>543W#@CFl--=Ym33#9DE;i$D#zX5p}c!=uhM#Cm~yDzapjo1(aLVSITwz7A>+e(M#d&*a7rAq%5&y|lmzEK)fS1B#xz9?&FHz|)<|5EPtQxiHB
zXbKq}bOo1P2Ew+t#sYbo3l&jPp}NIVcs$uwICsTC@HTN4n*2HlEA!oi2kp8D<~zCz
zeP8twJU#jf9gZo5x_T5MM-33#CwK{mG=>Q;XO9%LRAU4a=>*}2|70P%aGJ27{Y;^1
z`y64&i}}J%_r*eVs1J|nx=dI&aHU`ty;_KDUMKt>vq=yVwhA59b_j8of&@M9UBV3Q
zJwoJ_U?FezKH;VQ0pWGVL7`}VsBqr+kl?2Z7i<s?R>FNIHp8s{r*5OIbAB~41FwAetjaGKmJr0;rU#6RQW>i3@H~v++Pbf
zURDT?gWd{7ZtsQj4?YO<*H;N@_BFzeypO^M-_L@p*%x7S=2v0Tta<@7z6n~1jY7(p
zW4Akt*
z;qw=B$jjz@wJ-^I&Xqz%cNwfulf$Qna+nxv2}uD~@O7XyI9S*Kytjd&S8c&_ryV#=
zw1-9~2T1+q0N%NdP#>;cV>o{%-E7p!q|2g`bQ
zxWIaY&y0u3zC4Dt`$UNNGZBvEPl64HC&R#*Q{Y?s
zsj$CpD(GfSgJnU}A#V3eCzZc(Wn;)1DUIwoW
zmP1JCa!^F9fQUK%(A<6{^r>A5-d9$^{0#vx#&b2;X|90>1#4hQ*jjiyX&rc4uZQgw
z>me?F10?xugri+I!Mw&zV0L{o#BbRGRs*&|fYvs+Sg;KWLbgM}_&}Iqumk!n-vI_C
zJD{X{5bQo21f80KAb0Xk7?HUXZdvYv&YN~Y@XK9L3cJDh)NWAz-3?Rc?tw)&_rLD_lk0vsvUfi;*X)NO!w*1k;sMCgI|wg)
z4#MYxgHY=h0V-rK+pKchOUK$47^26Y=%OS80J_MVp4nh9laL_sz
z4m~sv!{`NvVQTJSn4mZULf{dQR2+eFJPJpmkAlaqqi}!vF_>`u7~GZ}2bZ2
zklEt|RE3=Yjjt!bWYkH}PdW*WIuUShQ3M>m6#+vPk??t2By25@gx?-fu6gEYH
zbV4+YO^Jr}hA|N869b3u#K3OnQ?NMj6u7@S1q~jjA^P}f=-qf4#Ia|f`^7VGSobWv
zTX+^6Z=QvbcCoN%V=VYRiG{g6;$UD%9GHKMgA%WJ*mx!$%-Z7N_|$Wtcl8|j7@vm>
zpYza=cOEPqFF=>g7oc0&1+edt0IdfS;8s-vY#fjXw$X`j@p~e;j!%Na$=sJlD;YY?
zO@6>g!TCsVY<^LaNTkV-aokn2fAGbhkcjf4ClS^H~V4nu@p%Dn!HUs0U_1#?uU#+$|F-_GH53*O`#n`#NZbaOa2**I}-Z1uG6`!P1Xe
zFs8o>>`$oR#TOL>dWm2jB|=z(2tS4rj5tLQ+(eK%g2Amb4069SNFJ39+helF8XjKAX!~g}E?t|8g6~54Z!i$L>IB%^e7UyYMUQF06Qe7w+}R2ebY8
zFz{7A%f`h(AaG8ogWy~3I
zbBp2Nm13Bvc^@>U+=rM8_rc-keb_&u1S+CR!1hZC4D@^eZ>wBsRM
zD18V6olD`)>Qd;HR|!=w1e5Y_Y;MtMDfsv}Qe$@?ep
zuxA;x3o3)z56fVO<5M{3{}i@oKZO}a&%l1>Gbl`Y2D5%XgXcq^0~~)2dp|q}vF8gY
z3w!}D?!SOM+m~>{_a(QTm(ZkD4%;S{L;aa@82+^!_6x7z%HCIy`{WgQwXk7vEd*Y!1^@50;N|%R{_g$)r;EQp2kBQhJo775#(f35&tE~=
zvkp8r)`3e-9emfWhvd=qF!*Ra+B(lA55Tt_jY$H^bbG&G3&k!*2EOP&ec|cpmr;0o<4L
zfW;5kH}wZBi~0fX6+hsOQwszvZh@M_78vxU1$K7-2^UuXgtUyGaQf#@SOu-%y1fLv&tcG(^)bP)JH4OWzhGxd3WxJGJWwvQIZ25aH^b6SYEw6OV&7M}j2g-Tm(yz8NjUQ@O4+8S+?9@fSs
zDcYD+q>U9HwNYC~2kqMFV21%ZsFEYdt+}HY;9?nYBLyKZP
z%&Ou3)|&eG%t0R~2>M7<^wBba^YB9SF*ZRTAKcQ%`q%pS@25VhOAWAz`*J@WVSpDG
z8Q`iw19XWp!29V2xcGqq)_pR-rCNsg$iWc1Dh+Y-BtyKu!Vs(W8lqO5A@azsD0ym#
z+6{(Sqi=+&c1F0((+GP`Gs35-^P9F
zEzHoklNslinc?c`W*EBC3?qZN-~B1h;!8Kf*+pj9>Ae}&{N(#g&9Rq@Io?Fh-J4{N
zmwe69ko)n^IAM;Fm&~!?mN|ZWZjLQ=T%5~SV`G8&JuEO{s0B`+Wr6yuEiien1;Qx{
zWLGV)Yk>uZabCciMhkS(li);q39juW!Qf#M+&4>tn*t;_GgyLMqa|3MD#6&>67+f@
z!LqLsoT?$k0=X1Bb(Z4R{!+X#Ns0|irD(oYitWOs*#4XprWVLBrCf%m>twi1U5=xrax`$2
zqe>~qX`|&>HHY&R0_6B`mmIsEkmKe=IbIj#SXnGbwKsA!`X)zRO-pQ&T4ITdB}RBy
z;-rz5_-Cdio>*atia<+@47Wt}I7{@tX34M15?_>AqFRk5T5`67y}lJnY^<=AGXhJ1
z^B+cA;jr0OSi8asw{N#X^+Q&;_KX!iO|?R|n^x%i&=y
zqK7pu9AJ%3<2g@ot~L6tw8rn-t#MVDHI|>^T*1rM7|5(KtH>JPzO=@lpRBnZSmO^}
z&J~o~;FS(GxSlgBI(gY($pjmmKhFj${cUi{HXFQtkaH}eY;ag2Pm^hb$8XzU{39DY
z`_=|SIsd}O<_@^U#sP1%
zbHMs84rtcb0Tuln&|$a(8clG(Pu>ogvA_XWEptGdwGMb~s{_Iw2fP~UfL5HVxZ<<}
zUb*0al_?IWbKLx@h;C~far-7m
zydCI>KlkvwLL50i!V$Yg@H|dC;-7d&EaE(teW{MvJA<Qh{T~D)1a<
z$9$ZuK)dM*{BNcL$Iap5Y{~x?@qJ4b_{o>2S{Q^W-CV&6RB|qj{D1=AA5`F}Pz4SM=yhCy5hoN_eo}$P
zkqYb<#m^V5K+hNjb~>d%-O~zu#1(o*fql;^u!L($tOAR;dc-Mk7uQ{`7A~uJ1-f!|
z;IiPV|Y`P
zaGTu4ZSw)QQG;g=*qhtz7;d{$xebruw%j|F?@w^Rhup?@b6a-{b3o#@|KBzTOyy&N
z*>VS*x6lF4%y8i2umjfeG2KE+XTKngzr<@VMJFuoa$tUS~5F~)w9EH
zzilzO-WKH_Y;pBdTg)!B#h=U;ozrX)<85)s30wSczb(3MwZ(t_wwOQP76T{SqRTLz
zR%we~U2IY1V2h6Cwzy7{|9*V8!TK5-l)SV-*J2y&e8UDEIhRQz&IZel+F-;U8yva8
z2EX{&;Px3ds5aULS9{vv<8C(CUSWfa&G~Peh7D#mS>xSGt}<)PylaieuUq5dL~Cpx
zX^oHfTjT1@)~LSB8h6aJ#`;m#I0mgTri(Scw6jJ%V{3Hz!`Z%Ht+3Z?D^%RK!oSQ4
zi!O22Z;Tc83$enoEmpW-nH9dBVTEHxTH!^`dTMpE!oF5kxJcIucmA;Cyk<)bePW4Q
z^7y>rswKL{T4L29OFX*W5_|G_MGl`|{Kw}Rm-u|c(A5%Wa28Y~pNACi`A7|)m$clM
z;}4Q!brNSlos{E=J$yd1hR;>z%Q11R9F-_X>L|x9mU0Z!lH=QNGHmxohEs}VxKSm;
zgBN6Y=%@^L?U3Qp6*A-}K=olV%ygIGEQO47E_u3EDb`m>aq1%}rrh96Ml;YZ9Qk?59MZr;uI)+lb^+SUG??O_&KVpD?HW=WE*#@ZaGQemz1JpM$K%XXk
z%zCbmzq0kQTf9C_-lvbtR_No}iTb#*pFYmC(?_McKI&KNVbMK33{2I-_WZt#`2E@7
z*?O2WP!Bu1=-~kaJ$zZGi*}rCKH<79Ziv>!LxH*&u}~L}4b#P)opm{vO&5DN>0rxK
z9lR{+;FQxkSRbT=n-}Zg&*3`g(}mwFn(ClK6KASFbTED9gozj;h~3W75hJ>o>?7+aTgf8>k1g!MGl6u)F>joKE=#XIA`z;4Z&lQf({fB)7s@pH@(~
zwnA{#Pk0>v6Lc2*1V;r|MGI)hw7?_p7T9Ci0*+-r;LMR9pfmmlOfvofd+&XRxV_)u
z+~DsJ!k?eaywMEiTbd!IUo-Snp#7td5P#q!7xVM$?^kgM8j;(|i?MkR*A3$950XB8|08a1T!;k_*=;M`v&HwzkxBdPtNhGDu-!N<&ZMA9KLFlgC&1X*lF2IaCLkMCXZi0
zMeqxV5MF?1-E%04eGY@BJco07&!K^yfy>HgFx2@Oj4yi%gZDiJXLt&qzm~zNvt=Mm
zDuZ0@GU%1{1j78Dz!SSCp!MJ}I0ik24(^XZR`rN8ejY*k@JF!dS1J6xSPHvlmqL?C
zDU7-K5RL>qgj>!J;q~JO@L~4@c-)7_;ixWw^(RZfbvWmH@n^21lJ3I|@B3h9a32d^g
z(9-5g&xdad@}bZ?A3|^51<#dt;f4KOm|uJc$~NDDJ{|8s(6ig1+H)ITyWfVd@ABaD
zp*(ox$+=&(x4<{@7RZO)g0$vb=o^;{N#k-s@6Sz`oO}~Prrm@qS~nr@N)F`C$$^W8
zIj}411`J!wpLv_#fD<>e!D(4GL|A6SpF9R*S1|~+W01w;rZgk87{W2bxWyf_`+W9(cewqnef-=FcOC}6`mH}ov
zGoYYL2KYZq2lbulu&YZtG;%K3xS(qg)%hAcF1reCfmgw-(^Zf>xdPhTuRxXS6}VQK
z1}nFuflY@rxK@%1!p2lcb4mqiQ3@W%#l3GH6;~hQGO-59W6XZb|t1
z1iJ_W7hi;Gqtz5l<|qcekMTH*#sWrC;_%N
zT!7&b7eHgc1-Mvq9=r~nhoZjxv*H{i?>Pr*UC(jeS3GRn5)X0CJf2Qr9AvMGgR7Qt
zaPmehEMFW8J&j_a`s!IY=zSIxYG>j6g)?9?<_rWjorbc=(_k~;G>or41sg(6L0GR-
z{Ly&~glvz2b?swd%)MxkuZo6;vS`>sQ6Qfm1+h9&;BYAt4o--KPd_5SBPIei4vc`L
z>XT4(@FZ09I0^5|PQbIxCm`GL1RT449A^6-2TPOVaO>(Zm^1AdeBt1ZWoM7VtHDR%
zzfVWtaOe?u*7FD$KRpb6H}m*K4u@gZt#I&O5)LB_!l6^jA^0=l5ZwA62Ad+oz}Yhl
zvfqZn$lak(=o$(_Q3#y!4}m805P*z>ux|Q6h-*6lxu*}nqk#wDY2|(>=4*8so%Tcc
z{e3Wp^Tiw```~fLUf48!FIcn%!>LojU^gHbLf`L!#@%~hgzFwSTDTiZm+c01likoE
zZ5QCgT`;tHCwQIM3B5gbg4N3)sNWI8|A9cN^%g@IkyLWBPr*qgSR
zuNen`zk2}WtmRL^Ggg9ai$Az}_=DZ170{|$4mW=-$eY#_w<4A
zZA(GSUIO?3EQTV_#c*xgBG{e15C;5N0M)nvHf)^_jWiFYwatYDVJ^JiGzWB5v%%`;
zERgh@1+D95!oBnvJQj{ObnE2}xvQqbfYfPxO>HXt>pT?(_)UQoiIX9?dJ-IHKMA&Q
z7TNT(6F^Zh9?ERT!+P&=pmlOAY=1Has?5iL$GFk3F=P~+FB}OuIwRqZ*9cJU7!Fa{
z!@%d)P-xe0C={<50t?axL-iLg{#)P$nTrR3X52vVtQY`GYzDyAsr@17$bYc5#FMY>
zdP4i52=9Xc4rL3_sZ|N-y_L{ql?NQX*bhEe_l54xePQA3KCm~UH$**lhZqxg2piE0
zR_^Wz19EzR+OO`A*1J25U)c@bCUu2*m0jSWLl@}b-5G+8c7j{?J3#W8Y6){!4{yOV-7(r
zX7HuE8I1HXh3K;;@aDNOSehGy*9aq65M&5zRR*x-n?9`Ts1FP0>%q`SU9cED21mo*pgy-#Rh43Sv1b4NMLf(pMp?`U$kU0E<@HgX~
zFsR*IVRd+g5dPs>*2#vQ@pZk}M=>z2@Z>ZVYppCiPr%NFLnBf)fxD5Pd(2?N_-
z7j7TQ5R`4#gtJSo3azDS!Vu3?VOQd1;hN-<@N9ds@by!o@MCg<(3Ept_|WN`kbgW*
zIHMLTEL(O)==AiIP%$7z*n2TbXfKZxGIyL5JZp~&swu~W&Nq(;M>-uA>W>`~2L1~b
z4)}%$1&#BDOTgL|p-`55T?}l#`vh6kr`y18?gKw`E
z8cwbhLYFNUZ2S8PQ5H)C!|DZsziO^?w*S7jlzip7vw{l#4=B{Zmq$lc;vTbyQ6~(na;vOQ{<6
zeTZt|g^8*G)8?vP=`L6G&DyAPN#Ch5HQKK#TX;ydfsU)1En-w-{NhxBxrwR}t5j9M
z$_!PvyQIpqyQS*Bra%=?SfbkRSf*OHu3Xi(=$-1G;-jkP`a0FJqGr`PMVl&7R1^PJ
zYKmy8E6!IMh$|Kvi}OOwMCEmf`17q?JY`@by7jgfPtI0|wZZMg_GvESfEOLbff`-K
z4xM|5wUgY%<6HakcPy3Sq5CLSeD5!sI(UgrLx+k|{}E!%@zG*b_BgR?)kN{E(Nyu9
zySL~xbC%eB=UmY)X@OY%V6hnb!$-8RUoNikS}9)fT`k@_v`);)*eHgVZxK;FP@FFb
z5-l$56jMERi^`%sV%qGzqO@V3xNzqI@r*P?%)bySmU|o$%kPDYcV`_DW9p8Ib9NjT
z4J}TJaq$si`#w?P;k(h|$7!d;j-O78Q#PL!{S4zo-8gw3Znewe`|uR8qf?qV{mK>5f8aH7MQOS?X?~{Y^zFL%bcae@V@BeSGfbS{{f2n;
zMvnM-Os=T+`j%+4{I>Yx*Bvo`f4;cQs!+5_xF<&TDHi|b-4{nqd?0Rl`;f=qeI)Mx
z{a9RjpiJy!^-O$t{<%2A{iRrNvs|qNtV)hgf&IMQq=xRfLRRqWgf~
zqCpYos!jPPc3q`LK7G{b=r46j$l=qol@O0E7mf9P1+s>xYwH^}-&sk*KI*Z)XXH$=r
zb4c20E>%>{rO-3;$a%(mIwf5|e@YgR*ZzgHlE?iH{IiJGU0+NS0+x_@=cSZcxs(Q;
z_Mx6*~+vsb@?PTMc5xq&-Bhq>H~qY^n=GyOklUI))baivvUTOY5j%pZ^kpy|>%EtThwY`WHG3&&
z;6Bog-bY)T_tEZQOk0`{
z6OQH_xA-Fz(sqPwCLN`SWFD7Z;}|XQK1P?*j?qWm<77VfICaWAPCboJklUgYWK1XM
zo%u;R=W~*#=A5J-vIq)Z9zj}p5wyxWlKa<0lI(6IjkSxSb*rQ3KtU9RIYiTrwb3;1
zUNm)A#L(AuF%(f0L%p0%@i_FSs7LWBI_7kms@I<;*W%MO#pw(MtUp6ri_Xwm#aWuM
z?ksh?cb2ovV(ILfSn@20r2@M+8W<2q33uYC%{rbu{o`r*t$5lmKSxLX&e4Gz=V&GO
z;~BW*JgJN4DaH5#4WEC39;RQQA$kdvFf)OEq$E%;jYOI`C6NLW6M6e3(xS0RG$=NS
zjGB`uZ)h?tiA?4;oJ?!~yGRw`7pc#Oi?p%NB}&|TiSE3(L?xXs({0XwyYS#Lt#eAD
z9&1wQ`Rx>1E>EQ|OH;{Pl}c9)(x_!-8o6CgqalCOXxz9fH010Ra{YFNng?E`lp|MZ
z@`tNb?S73G?Y>6$pIoDM9nxvhx^y~xC!LaI8I-a(gHC5;&}QvS8Z;%7zMspaqs^IQ
zKlnNwJ$jv*-(RNzy|QRyP!`2J)B+}TQA{7lKaz9QK
z{DJ6BPeyftj5JCZsoP~!t#3Bnyq-;g+Bc}vq#KlT_6GH@yFp2iL;v>WQ2(bnD2o2np;^5>1LIc6t#7#1&EJFGW<+rCV^tRM@wKG6PE}q@aXGn?Imt?+3Ie?g6RQKA?r}4=HuaL#oPqNSa2a
zq(8ZoTBA$p(T7qx+W8TAuHk-x;v*WR@t9IaJf^nr$JFEbV;bxDgeEU}LSC1jkWKRw
zdMT9APVQ$YDJY|ZCQs?>)9KyMspGxp
z6l3~=S|-0BA?gJ!e)EDhwtq=$d|%R(l$WGvdP$G^mDBRA&HFVyKJ}W8yn9W`4i%K|Q$e1WDmXu`f+~8wA%pdA$U*gntbV_tU;n+O
z+d*$>?d`W@r2CEzj(A7k4!)!RO5V{Lv-cD>@jV?r_MWypeNUsTK9J^&4-^;ufm~mI
zpkoe|R5Q1doMS7=>wP7SYF9+Cf|f=x>-|Ae_U(G*{6oO
zB-W6_#~S+K`jOI?ekAXNk5pOxk*2zQ;(h!ReL44u%qu^UUAxa@yx=oco&8L4Z$8sd
zhgvF~RZ9b-YboLdXVqDLp_VC}Q+MnO)t7#uJkzhVeau&KJouF^6nrHMojO|VRY#|G
z)Dg?Bqnp3#D7jxfZCYDT-LKTsy|48&s#619S<*m%;u@&?n+6(Y`;EM&eIu8n->9zS
z8^stjQum>aln~TN+S!dX;%6fTxHr)b|0Y_K)I_5zo5;YinNqx)sqe97I#<$6EqdJN
z*Xuit+4h~rU;j@1zI`XH&Oaz~(GMEKxpsxmeo!a#7Fsp3g`#)0&_&ilXTG=4rfxsU
zW9d&SKl76oKL1G%&05KML@P}XYNfR*F3!1|-tiYX&;LaaBYx3>hn#n(+eUr*x6%6b
zZ4`aEjm}lJ(Gl*)ym;bovfcliuIK!wzCV6bbeBK$VZk3Vi~K`QoPB4h{g)bqzm&4-
zFHN}cm!6e#A8GS{ba?1Ly1nHem8boqr&a%Grm-4hu4>F|kQ$phOO1uCS7X=1xsP?S
z8fSWORj9E?Kh;>Kg*prA!u_;|sxu?b#mm~H&ZZnyXO)-K+2XtE?D-pYhOO%CsD%bA
z@2tV(Lp0c+IT~y(_xD~IuEADuPTrzh8f-+l26JrIU>}V%SzHHAHugVFRy$RbZQ(xS
zzxQggm1i~C<19_qu~d@RRlnwH9masm0VsaxLK7o3vQjVJ()N#5sDoTFmW*
z7JJm7#a8HPvsOoKwxORks~OALc}uie^fqnw=9o5wb`6++H8iN4jbmE
z!#ecUVc$pVu*`)z%y+X6Gd`@t;uCaO#~Yln_e6&o*6Oe&>bmTzr7mmes>>V)>$3hc
zblHSex@>Z=E*l=B%er3GWm*NgteE@W?`h&b_xgIQ*g=nZ_ts<2M(D9&bM;ulT0Pdf
zUypg7(PIJW+=stVk6o_NV;N1H$;bWrBkc9rnqK;Bz%YIGXQn>8v`U|i-lNZ6N9wb=
zDf;ZuEq&JanLayM%eVjOGkvK6>*;2|MxgkOIJenVy&W5^6r4OvUBAuD@g
z$l_}Z*}`9jOk!-r(jAT1&|XHYaIg`>X+|v8mvaxc@NLdNSaa5hMPD^y*KQlJ?59TT
z`bYl#FC(_i$e4|AFlM?vj9JD&V>W4$G5fH{m@Qmy%pP;DLZ3)uwl~?B-6Lc6x7e6-
zQ;b=^dSm9PX2RUfO_+_d32W?S!pO^nt(|Pb>=&D`>+4L|pkNbrCrlZg
zH)T#4rfkD)&JcWT%D%rhW%iAxtdBb90-BkzevW3$shb&VLo;@Flo<<}VaB@nnz4cn
zX1v|aSm`k{)<52i#auCCpL5Ju#}YF({goNp@Y#&*{mG?c&NfKR*>q=f*0F~RDeCDhR=MCXF`QJ>rrdYPV9PmABXgYvs}HhZ)?u7i7-hjcFIcdC
zoKfh^xf_29Em%RB1>5z`f_49D!S4OEU{kd?x5HGz`rAraw2Op&>?vU#JSA-6a0y#A
zNy4^qj^P$x3G-bmVZ#C?Om;xR9v_piot*QbNS3hFbk6$7k+4&R688JCgpIC{u!A2Z
zj5rgd{I`VF>PT6wnUs~=NEx-4vV+~EY_x}z{T?Xg^&n;4rbt=J94T}3;XIK5DJ$J9
zWs==eHaJwu7N3x^4QHfmW1^J#U6Ha;qLkU^Nm)gal!ZT$vR<#H>^A2m4y}{2tRGTl
z^H0i_>&jS)sf@j~lras3j7i;OOy1-FEXB|LWh{G`j0KL9v7Xap?C~5KTf9WZKCY0l
z8S7+>ZIv;T-7+@epp5N0B4g(xW$gM{8B-<5*rgO1=UT|vJSJn#d7Q;qC}Zm%@_e7k
z*n!tF_WOg3&G{^2X$>;g_(R6p|B`G*sd@pCuIY;vD
zM>#uJD`%_g_&LAv@-)fW<{z9V(<*1XIdkUQA6_msOBStR$)0OjGHqQ;=A>`Qx*1xs
zPR5*BV`|A7%`Djs3rn_HYRO#Wmh6_LB^%4xl!Z2ytdE@~3%9pqlOIj+fJ)msiKul7;f}Ygt*c<@|c`_;ndbc-hS@nGe6-Kz`l9hL&ubJ}(ci576f2
z)8ysk^)&adoPFo@ww2dkBdC5ujS17
zrJQ}_?Q{CEoDF`+`v-5g`Gs=!jJKobEjc@SL(X3C_BFdMXML~9+2~ZB&qdy+5_p@%
z%bE5WIV*~iv!D}l=5|ERZiMoD_RAUVmNTava<*{`-?yHZD?rX{SIAi}A30Mll(Qal
z=5pTt
z{8O9%|4+uMf67>Dql_*6B4cLNGM4m4#(KSwv5Swmofga3iaXriZpc`}bs4j{B4fRi
zW$eFr8S{wYHg{ac{)Ea{K`^(?KpE?{QN{{aaXzZAj6Iw$WBgqn7BNxADo4tg!b`@+
zfQlfp--a?)tRZ8Ye@U5jqm(6nk}}tKQg-sWl>Kq+qpJ7rK
ze2kJy*##phyR0E)=YC39NS%Z&tdy`WFD0y!^I${oNSG^0SX!Ed
zb-o~B$D<{zAzZ>RSi;*v!p^Odu-wHGRx(4vipO!D>|hCtR7#jnHwklVCt=Smc{(Er
z(^uzX?sq=Ef3je6D=hv;(S5*E^}YcBx97drD5a80Xs4Zfp10Cc(H=y*Xs11XS}G+Z
zl~K_^NN7mLJdW+;h11KJPf^`99p&998abqAE8NRkVj1?yWiXm^Q0&RV!)Vv6y~ux+=F_LzTu)Rc=5+
zmD8sl)6pgs&bCyA#s?M7C6?X~Q{gNFRJf&{D%?LOYBJfVa9b~`aCMd{+{xW4T&0l;
zXGr_FH+m{u{S*~WllFbqhM+J7v!6
znlh(#Qkiqxqs;YfROU7|t;B_$RN{2^C~@}2N?a+>{(ZI*XQH7*$0ACc>!5(zq5{sXRKVH%
z6mWYu0XHpJz}0yQI2T6&x8S;fi#sXc)|k_A#s)h65DI8)5O85*1zf9)fE)Ff&&{r*
zW0X8Tw}2YOnqT?cpcfs#IP*D&TYL`A@VT-*eD0hPpX<@*b0??qxokCR8B0;uxRb|y
ztmIK=k&c_F&LkDY<0N15xb6o$uHX`n`*4`YS#9NUQGLFanmZ82>w<4EU
zMSbN=MeYu#$i;q85`ll
zwXKw2OL85yl3e_0NzQ(!BxgV*x#p>oG}cRUqq`(Hw_*uSj?Qtc=v*g}&UuutNpPDE
zNN_g{CAc?pB)G4mCAi1|aW14soN8P=6pU!(NYqP6RomkP>fwMn#;DL)BXszFYH-_5LBDNhD*|lSfaXZ>8x1%7x4X?j!
z!_0kcsG!w`v+MuhlE6QxYxM_5=KsO(J-_j&=r?xX_>CtGeq*xaZ{#PnBID4Cn>V$h
zk#Z}}&27PdZY>zRy9Es=v|vhEGcKfS7x(EJMznS_R@OIRb3hZ8oNU5xvzzeBpGKVY
zr4hfJZ^Ri38_}`50rSEdQ08g_PS$V0DgWw`$JS%Hbv?d>dW69`OycMo%gs7;Usi|3
zL$xRyU5gsGYH|GXS`-_u!OW-{d~mY{b(huP=fP^6%vIxm*Q=3Zs`IR`*R)OZ9D)7ze3QU_>fmMy=Smj@iDHi4Esa1|9m1WpZ
z*Olz{l;Mzi8SX16MSqu4EZSO%J^WJaPc6YFyAq6{^$_lgm*Cv!VvMye#+6Hp@k3V;
z^^%Hk$>}28Grb5;))wMnuR>h2w-8m-3o$A87an!~h3!Va&_d=H#>Nz&{LKOc{Q@-Y
z%Ex`5@^RCNe4M6D-LCRH^mv(v3wP#WxF8RwrsU%Fd$}03EEk)4b5M-dd=NjKgTHlh
zFs>pSZC_@i-i~Zcplf-CiCGwOI}2rnS-8G46E6m3qJu>yI!?^Qs|6Xj$vFd+)@L9m
zmVrA&=~!?+9aqmx$5+)qvC`uw3U>U&>54ybZd@8_UQfgR1!?%BITbJZq@uEUD!x>q
zGuD(8JY$oBkxNss?N2hQ_$T9}eaWakIvIyjlQ82>5<2K7;exhAO!P~{wR;mWL^ToR
zQWDVkb^=;2PC&O7x<=|9kB?2`@eDs6_2c5O?OGf@n;VB(wXyj6Wh_c>iA6K1SbQmp
z!9=SVET0;KwS_-0-{}W_TSeDqd%xr2;O|&;kgnINeaHHgXxwru8vPeUV`F_3s(VJ^
zqAgLlOfm`=MsPUh6o>Vi9KOpz-1q>oMu>RyH;cc#SX{i5MH^WbBUuraoe^RCWD&OI
zMq=56NQ@9h;_cQ5T=X^q3${hzQK<;54G+gHC&KalgmC;#YnV*23B%P3!f<=-H{9(0
z4TbB!p-O)!76yglqkW+`M=2Deetbo^@D<-r{fgrGA-LfIwZN8!;5%A3CF~__Mqki(
z;4|I{{)`*ldyDAvXo(ALPmBDD!5rqGF
z2jQV@L8vbtgu`C~@$11rG*J%3#_u2S#Muv6r1=5$GXm&mCjjGT2Vi^2d*nI3$1%)%
zRBrOef6x6f$Iu^N_W0p8Uq9^K?uSm|eyIAz7wz`@Vk^%VSKvFmcj6s})4DT7^qfS?
zMIZb##Rn@hy)pKtH(fjS#$82TC}Zb^0gJp)Sp61R=eIa}*;{mKeuEXy-{6$BZ*Y6(
zYrOpSHQH@_jSl}_;Z6TncyPxnTtv;VzF<%MXy%FAWjwL*s|Q*g@W47n58M>_68$V*
z;veOgI6dkG?l|!Rt>}3f>zLzWxMVb)Vph
zY-cRH?u@5(o$+_pV?21B)(_Hoj1#h)(8AgY-)cMI&x}XdeC-hqXg$J_pN`ml#Su#;
zJ7QR>1KzphfCicl*pXz9uIKG><^+5E8vhXISUp6Ku@ABThaGM_X@}27*5tWdu;KOlr5h7cn@_%EJpRNA50#(6)w9na-}*GhB%Q+jYNxRF@JZb9vE>mg4LOV^!-o)!4xz&HgSfip03OvlfS0cC$1_R$aO;D@cd@R{dMJX*g4r_JAix!1Sj
zsl;vAro0XJ@7ap1-xic?-;7I{&A8ik6Iy0$#Qo|Uam`_492;zezj`*{y%if!!+t&b
z`vf(|ULybS|FkpMw@F=iruyvvFqTEbLaBg`fA%MDuqu
zu%~G{+RU4dgIA{E@hDwPkkrLdMmqFb0d2G?n2KH+Q!(VQ7KR2)LH|FK(Q(maJZL=$
zr~S~x3TaKWH=c+(Pc`ss!33PIF#){~jYp~X<8XJYI=-E+j)hmoq9iv4CyS4v=L^(u
zzT;@r%^HP#wNcn$ri!6&RPbVrGU`lM#?;eFcqBxCe|q?MhT&tyEgr6oQ^Ys2ir8$d
zfHR-SC2+L91ZH0s$9vQ+n;|KN
z_D;iWz~~|NtLFggr`6Bi`_RW4&+BD}!h2YcW!>zQ_)gZvsDtguYGZ|_f7ml+t*q0L
z7WPF`6YG4ok-gAU&#t^)#}10svc3@mcJx4VkQVMmo!G|H&@@mCAnIlftT1Cb7pX64?)p@odTI
zICiK#hE=-!gH`z#%}U*jVjILb7HwJfww#Dv{3wDgRSIV>xqM@X$Aq%h9wBVQ#4qeR
z?@#Ot?T>8f`yh7ItU#803Sdp=zh{qr^J9-M^=0?5KCIy~Z&vHaTefr68#X-Q6>GKL
zlO3P-lEqCg*sWRaY|(Z%c6YuD`_uFpySVrX>$2CGZ76qQ=N)>)o~?0UeJ$tQgB9a*K#?p-^D4Oyqjj%=8~8g5i)
zA8b}*e{5A{ySFQ`Q+M&$ji&PKSu+{-@g7O`!#*)upRr%$7uPL{OZp=!O=}eW$*dL)
z=9Y@23kyUFrCB0gWvYl*8!u95j26kZMv5fczluh>f<=S9{-XW?FH!%9hiFLBO(ZGj
zEaKB^x-^vUi4IJ+7CoJ3CCb)6ESj{^M08_=k*Imwa?wfi1)`zDx+1?*<3)!r2}Db7
zN{9@3zaw{O=102Ci;7fQ?H8G_%PI0~_Q}Y+UM4bHQ!&!wQFugd?T8L(GkrrWAAa7&F@OzWVkU6{a>oYG|M
zET=H)2eg^TyQeWt+h#J;jps1NYv}ca%N8=rmMmcu^n?sMjWC-guV7-;S25#M)-v1W
z*E6TYjhUnWHZdzZwlaf_JD3-hCd{ZpGv-X@Ugmw`0p@$uVJ7UGCF2luoFP7^n4d4K
z7@_ld=HC5FOyKpaOz?SY#_`xq#%Hb#bLPVxMo0S|llI1z**ES1Q|4mF7zyl|cMlzy
zMu|tvgqu!`u=g>u`ur1yX?ecd#QddF;2^J6q0`!jhm0nDY_ADE%uK<4bZU?#QkBO^HUnPG~)Fk7~L
zWj3aSG7DCQF(Z-TOxV0gW_y5$`85fd)z3M`T@cM=-T%&X4*p>JFUB%W&2dchp#XQZc2B(vos!B(Q?XnN-C*bggEzg;O#YC=$JDN^lGNT?ibVH%%&M&
zB{38BM9hSRr)NR$@oS^_GEm%+BT5wPzku;}A5
zNI9?^)~T+5&+#ij?5Y7UGgiX>l9h1EX%!q=u^J3IR)g%jH4sT_Xm67-gxm;2Sbkz1
zJR83r($m&M=Zy_8JjV#S%8ek)*%;gmHp1$TjZo;l33hGY46MW!kPY1eaAYgZLD~j;
z;JG@s*#VdC?u5blyWmvSE{J_XueV=e3fgU^p!a4sOxa`x{R3to3N(iU
zW_zGTb}#G?-wP2I`{1wYe$a^757W*bfN>KKLPzRB_;l?MY}Y*uCAo*e=*|&%GuHwN
zODv%8p(PA0J_-%hMw!L
zYPK0{x&{Wl*I=smf6#1X4X)kRFy+m4c)IQe)VAM%2_83L(dt_;uk{uvx!s0FO&ee?
z+Q7{u8~8fm4iuiHc@}YZpm!{-?SASm6o0=9VWaNB-DCG)1>S?-G(Y3fVO!7$r}g0F
z?}O65`*8lteTbKQ0CJ`efCN5(!$S|?>Q+0r_0A41{k4O=8y>>KR}W$E&qMgO(jNA?
z+QZ*^d$18YK)<5{Sd=?J^gKt9yXOe2^Bv*Lv`6spzenIgb4?ykbb@PVooL;1Czv?u
zF%()nhP&a9K|{_N{LGwTQjjw|9CU`NO;2FP+b3|S{R!BwdI%3}rpwo{0y1^7DY?ZV$*>?FmWG
zJR!Ks6Kv+af>pO)L0398-!xu>=Bd}rcf|k@C}r%e}nkAZ(zv_
zgN~hHaN>0sq}PSPMC!zuT?q%9=x}h6iGZh@BjCDw1Z*ph09D;c_27*%@!W;#f2e*}jxz9OxT*g81)F@Cn
z83hZ!M1jHID9|U-F#c{dG$uuZ7ymn~-tir>UwnrR<=^4s)E_W#{0A)j^n+S)Kfppi
z2KL>I0fX2W;LFBBf^jSye-aDbd9iSMTpXnDi-Yk#aWpS14$jYvhZ|P$aQ-W`X1Lm&Jfc%FUV3|VAIr&U5Fvw9keaDcRsGmjh+%a$vMw4lGK{0V16XbJyh3&wDPU#pJ>j
zu{=;%kq34+^WZn;0rcm=dHsBNawQ*Le9MQ2o%wKZUI9#@4qaMM0qkumfM2@5Kxpv`
zY`uR$MENhsnNSD?y9*(PdUS3%g|Ju!u!QF>N&>LR_JH(6O#j;|E|F0N|!iu4w
zqZrsZC17`=1i-HZepQyh9*t5+GA)G(E~Q|SQ3}@bWpIB@8C<igGwVt^&MvR6vAN1%xM6z$@`eI02QQdASnsQza~Ktb`9!s$kH(3KqLo
zfk}E5?3byA%`2)w`&ut%&A|u?P4v=4XTB%
z>RNa+z7FPZuY*AQI#7tIgKd3va9gh)T#nX*^XqyzpH~lzVgodtRGOrno
z(c?%?6Xn_OoTcE6@1y(7y!lN~<5Ou8;@`GC;r?M5osC9RH{cq5_@f+el{|1Aa
z-{3Rm4>WK11L`;b!0a!7K&R#pNRMfQwDoOp<$4>)eQJZ-m2FU}+76S}w!`|X?O^($
z9gIubL5JS~b;~=z;amr(`EV$DiIsuM#!m1aYpqJ7K;{BZ$(66yNBE=-_U!EA58GydFq~9$0y*2i|)0Kut;y@c#9{`00Ov
zZ~7PN?*9d!Z+~HJ&0k1Y=>^817am#lLLAKnlk`NLj$mE#vr&;PcQ%WAoK+ef>^;Iw2BQu)T|-6U@`=}J44_QGz7o%
zhhUM|FdUdU4Ci*zJo;P1uq5Ram%_C5Jbp-g{BcPo+0+YK&KukdM
z^R>iC_!2QPXe34!9iZMG&DFndCr0c&#fZaaF>)hLj2!wUM)X_6h}ei2K~-^bTvwdP
zGUDXojNf9#x
zDe`=q6iGfTMVc;3ks(_tB0+70fBsUWDng22vJ|l^k|JxHsqfb>Mck;PFik_61kIKv
zQ
zf1(UoGe?Hx5E-&#qYR1PL(RWaGUNtz0ORasNdF5Nq8%VZmPg1C<3t&OeG$%aTvZvgF7lSt37ImUt6cGSgU=_?gKPmE*F+>WVChvXv!6&t!?7w=CKIS(Y4)
zk|n3p=C`SbAGI2so_{F
zPt@DxiTi*&k&;y)7ODy)e4+yBqxQzEMG9o=3I%f1NP(Q$MP0&!3S{#s1v34L0_nC<
zAR&$lWWPH#JG>N#Q;-4?gewr69}1)JTjcmBR@*1u~@?+YRxZXDXivXYk2VJwDM{%qLRRWXv<*6E{OXS+|i-nz!-E
zEmJ;`pa#p;!+cVHj87I*ukq#uJ_*0dCzUs--FSyjWbEiRkNBkh37=%R@yTlsKG{b-
zM}aS&d=B7~RUi2zA%yNLoKN1ce9|4wClJRc7nAtJGmTHeGWq0tE}yW}fAKG&222Gt
zAZz$Usew%q=R6q_W35c1h
zfUH&%5KVOfX&x^i?q4K-;>KtSS_3CQae0&;AnfM~52kc>3~a>`IZ`ql}^)eQntZzLdw8wE7p2}sdq
z0pV>G5It(ztllml8+OoR+9@D9y98v2wnP&Fxot}Kw_8BsY1?WhAnCL*<^uAPwno~f
z@1e&|+jZKUXnRWAecDdaWS@yB|F~X2rqRFW*;)blP5(w_75&=`1jKJS
zJx(GZd5nPM>kCNI5&;RM4(H7U0%;|QaEMR5`}st_mrs6l(Oc^O__XrL
zU?Y9+)zSAr6`zEZ@kwS8ec$ENmQC-c)9h@-zl%~0VtK8g9vCrl8Z
zyrXu|us5F=z2+0U7t{-K;geiy302$kNsTR^s
zpZqlE6T@9}A6xi@Z^S2N)E#=hoKIa>KB-^8C%v=zekLP%L_35>6a#sr
z#)n6OJbA>@l}D7FcqI5fHH>aiF_}jutMf>i5|2ER<&oJViX`fg|;G5qVZFY#?h5Dp01^FRY>FOWEy9C%N59vJOyG+Y3#Sx_$3X=WO5=Jojqfat^Y3ZAe=tLVm}n{x^-&5WjrIrU2IYxN
zhdg;)Cr@OH<;nRBd6G^Y+X)f!#5_ozIJ}i7!7lRThaK%(u2b{&tUP&lM4sFDG`$=E4!(kOTFCcVmYFbAxAdE$dO~;g9~$LXRRX|JSQv&G1N
z>SAQGlo**=IRbAYMxgic2rNE20%prb;PB`X*xE7-+Ofk>_F@=roE-)+!(lj~F$|HN
zL$p4_5Xih80_n>`be(Mo!X^)a<=;UVNE?JJ-h=S#${D
zp!?DQyxuSXvor_5tFs^a6Z-)?`{B^pemJwbANG&!hb46W&>j5`UeNi(l%xOPsqh~(
z@cw~TWgn~w?SqXE`hYR(1HtS*NEz;h6WP7c{;n7HUFn4{>wBSTd@soV{tJTde_`MW
zozEQp3lA3k1s$2c5cI1D#(wC56V}wdGVXy`jUGt)-3{NO={(7~8w?J1L*=|~I40f=
zdD&es-KPrT@);oJch`#a#=
zoDMiL*bd9msE75k9sG~C!{Vjw5G36Wa(QjA$)^pjoofS!R|=^fzr!=
z;KJ%Z(60Okc9s7I@1Wn1f9*H4ul)_3s=uMMq7^>UIp@*;T0zFJ6`WLCsU_Y5JAzu^
z>D3m9Slt5gN-ZENX$JTA&0v198Dv&8gNH&hj45b>|Gb+Z{&W-cE^Pu8$tD<`(FnsY
z8X@aQBdu%D2y^~XH!H3IW;||yd%GJTL8}4UTI)d~q8Y>7@9zKk&hrQ)>(EGj)
zu2V~^o~Z*yst&HC*Mg^eEd(5>h1b(-!J7K>25b$q-K~KK#x)>4x(3daRztLJHT0gY
z2KB|&Fm;F;_6b$c@u&*Ic2>b*jVkD?sf4RRl~8`666P|M^mV8N`{W96ajpP6lL|O8
zu>xk)mcy^WayWaw9NLzagV}Hy1jUy@g9CN+x0S*8v1OoARtlXyrGUpv!D?Pn+^&MKSA&PPgrs6Cot1~!sLcD=0Z_JSX<+vNv*-0}n36n}t5@^@Hb`yG}U
ze2001(V!d|4W$>O!BsCBn3gE`=^q6~hoc~TViX99IN0vWf$bI!eCV3y#{>jF8w3YH
z8k1O<5W+&zDHaauvQS?s0y9q$h<1rUMp*;~sgZEpHWF?wkA&NO5n%N-0*p^bz-ZkF
z_*oGS=U;|{Swr=`Uw>7egbFVCy?y;2$lgKA?(0M=pOSCrep*IxgQMcNHDDE3W8~YK`?YM2x7(t
z!R3rV7<)eu0w55kb$$T%fDh2M{{yU0`vBHy0pNQl0HT%#K*I0$5cQ5)U}m&7iqd-^
z3I5P-?GG;V{6VMQ5Bxo8EtPG4a7Bi$t)nkUo%e+Wy1uZrJ}~98
z540Zff%ob@usz)yTJLznl_lQL-s}bDZ@nONhZhXex-Lt&w{YOxTeznE7VZ?j0qaL^
z;0X1>mUX`dnSj^uW6x_isq`A8;$FeyE3ZI)<}0{V<_VckJYm8bPcZGJ=Ntk(z-u2p
z@1X1f!ErCa^U6!Gp79clN?(AY^9$fszJUGR&*^*pIb1e-4o!;BVN0|-_?>fy-&*dV
zlkWzb?cCsm&5F`4q%pP4?Az$!%97Sm{Rc&
zx*k7-$mI{=>>oQ&e`5#VHrc^ydY&mh_yOqeeE@G2AHYBMKCC@?A8g0nhwx-ux&~$o
zow~L#n12uYZSO(z!h4WWeHVP6-UTazyD+Qm4wSsU1GhHb0kr`ec>BQyG@k
ze&GuIPQMH@XIzFYwwGXU#YNc8Tm(J03((Vc9^M(92ch3Nh#WZ!lg!V;*>6_xUSI_&
z$In1+>}g2QI1S!cPQlTvlQ4SbNeH@k0%nyR2iGOXp@E)1oZ560Hmo`dyFD#oTek%)
z+++b_{zo8u_%N859)`-#hhV4NA^3XmAPhtvfH^7$!05z&*dDVFR*%~Ulh5ykhU7i)
za`GNne9auVOf%4%W=0*l-H?}W3bJ!dLD$v<=9TOModvr<+I}ZwSL^`$B|BiY({{j`
zZLpZx2CtrMg+KLMVD_>tVB)eF&NOX;vnw{iez%PvY%vD$mBtX}ZUiQ+8=z+82H5v}
zJ;b%HgR!gDf$4KYxZk=K-mY8=@7>pcXUl51X|NhLxvc{E=9Lh-d?gsW7|=R8D_{*-
z0lrU`Ls#uGm?vBY=1v4IRsmQq1~_Za&^1^gOr0;JUZXxdD_jbCvzG$iUIL4A7sDIf
z#qjsPMX)S=AzYli5MEqd0Ktj#;q$op;B$H&*nZao6IDGJYdIH^BIdv`g*ni>cQ#!8
zJPYc@XMy3)nc(g}1M>T(gS7E<(0M%#7Pslbl9jqJ%|!>~>$IU{3H8YyPKE8oTF^U7
z3m)B^0;4h~gTv&>&~<(iY>d-{=c6?t&vGJ&N6`9cavHF}YyvC_91qh6#(`ktIH-T6
z4xfLIg;UGN!Z_zKAgWLU<9TY3X)_uOvq!<_DWgE~f-0EBs(^>83S=BshVHLQAdpmo
z@jC=C?j0X^T|DSm#e>vmir`+Y0456*K>n^ge94xhV^BFLJSPigKV%?NNe1)}NQ3()
zDQFmyggKie;n*t)aBC5V2u2(-?8P87WP}ObGR(aCJ;{iW8Tu{Yq%&1_Foh)b0$&@jcJ|)b$<;BdH;zB0(@-OD5N&%zxF^}fWwzR-FdMXznfXzPjQs8dCbKh+dEgYw%$^>@#KwMS*6)jE
zqI)@pUc$=Un9VYAiIL2}!3aiYAdFez_Kh*p3uV@&gfNSbd|}jvJ~0jMADN(e!OWr5
zKt|r;1M_a^Ju~mQKl5dtAETA}j(K>*hp8O&VrIL)Wlrn8VcsUcViFH|GL`)=nKqXf
zOy}(9OjCjzlfU1U3G02vI6isG?3(d}86EqWNila~E_69Es*fC)_uBT%f+#yCbk_rB
z<{w+;`Gb4RfaYDsB*KQ-{Pq@8o_U?wEA}6gGVcnbedr=%_4FJQ5Oapf?l{RbPdUzX
zZL?&4-#N?_h8$o*tM)QBD(1|Jm8MMlxt)xQ*EVK))@CMT#F&|_w}E-J-;fz`TFsb5
z88F_h%b2POz>G20XI5G-W)6K=z+5TRWA4h%VeT)P$=tG>#+-H4W=!LzFiSc$8Nn0{
zrfkbN#{bqB=Gezkj8>^KQ=lMV?gww
z^xh`nMNy6L(wK6g)x|=gMOKb*=bUumN{1xjtcDn&${J4i*DG9DIP^uxngvV~Dvh{L~iVPn|Ww&I*0u
zG>Q|i}
zr@uX{aB0@mn@g8OKV6cUSP-6*?Hm!`-V|XVs}*@$ZA+y3)EkjfFI*#aHG?95zl(`9
zn^72f?9-n}hnEtf&n0}3_r!6cg9o%lOo9o0mw+*d<1bBPI}K*CU-)y_
z?ZtX*q5lGQ^~J^PvlaSmydtngzm~Dt?+n=Bv#Z$?V93hLZeSg9jM>)Lo7s6Mwz0bw
z?PSeIOxP8vW~{W^UN-Q+0e0@p!|bze3pOwM7~AvkB-^w744b2Ij(t>rfz|nPnf3VZ
z8r!n!Iy;_si+y&|hLz5|!ya9Dj}3cn%XSRhXU8A3W9P>|WEV|$V09ijvJ&l&*q=Kd
zvv(t$S)B<_*>AU=v3k`mtlL^QwlTn+)#bflx14>+TI6`J7K>l8TVA|owFlm?b^E;7
zCqKMdovH6wzx%$dpwW*#Z1kRe8yvtU2?E())KJUL31-6*39^PbE0^+>t1DX?!$Wr~QMyem{oot&3&N4dYo~{{%K)
zCW&o5n#?vOrm*R{X{`H$pR8ehI$N?flQr?nV#B3!*nuOttZrN$yF{yiopt9ID^*#@
z#x5^rEnb(fEd!;jiFrBe8(G2r8dJsoxm3+I=G3qW^Xk|KkL%ePtqts#4NdI$_s#54
zsaDqQ&~NsA^dHt^LOXlzS_eBlzmtuf-_0(2Ot0;2{>v5`_OX3F|JZ-S{cN%MAp1Ie
zh&50hVXK#jp=+%eE_p_49Iuc-{Gzg3W}&6p@^YJcu0$IVHn3pjS~XApr(WoF-q8cMj3hIRZt^Q1t(lk
zMLEq;Sd%gegD;Q9BU98+E?o^@T^oZFwa4P4%(2*Lt&R(H$KlEBarorMc=VYzf##b`
zz$Z5~@YM8)xG;AjHr~`khv}1WT<#=vy*Zh>F;j4R&J=XLp@ng}Q?Wd2D%M+TW3jdl
zvKcyPcTE=!w5DNQ+BCd!c{+A!&cMCNGiYAbOzapx3n#|U!o_E1Q@d>rPWwIw#gEU$
zBxOCkCep*vhv%WE!hGb1&c{=G7GS94LaYy3h*CQjA%AcYiuo?aa^ofVzH14ZdoIP^
zRr+|lSs&Y<3UMR7X5FQd!8kj>vbhAS@(E_%SVr?#mgDi%!(n9!fDKAPvaf)GdQOI3_8EG
z!r%I5siAZhO|PEABV*3vj^9F7{eG}#6Z=t{6E!16g8|}+)
zkUG!Xc4>jEGp;PreY}d2J
z)i-U?F4Y#J#@@#oi~HCgavvo|=&kVstbOqSqw5}^{Q^5&bK4Hv)9lbm{UMIGe26bX
z9-_?fL$oxq$8YZT)atTFZ9NBEbKL=VB{`tUC`Vj(z!7HzIpV-yN90yLLaWD*P`UUK
zzSD6+o%2rkoO8l|vX9Yt$76i_<}v_6ZfH>BhWWGI(d>#lrhj**`7O`!&i3aR>-iizYoDX?+!v^M^#zXq@dBmgUt-0!
zml)vj5)anAM48zh=y}NlHKRQ6skA3{Z1TjF?w)wN+!KRzU(tNESC|$43X_Ll;U~k_
zc<=FRG%R?Hy%XP{yX70y{`dyHy5G<
z(Is#E|JQB_9~@fmgU-%As8ryCH#KMu*5P+J^}{$JuA(mXal+_T9K
zwO#zMq|gs_?jO)*
z?+2VueYniJ4`@C!5Ob^oacO8E+V=)xG6Z4w?I7gE2cfE5FiLL>##-lK{E{1tC&qq6
zr9B_f`^`t3T>TLr>3qW4s?W;QA0$cMQP`=^+@Y^c7pSeMJS=uc%h=6?y8R*k%@r(Vn4bT^5Q{CVj)OgWqtG
z&o}g{`G&pPVaOZ}!;|mB@P1<$KAI7Zw@!xRzMycN)*6mwvm@~KnF!>4iopASBCvUG
zBr<0s@yh2&eBBm_U-U%O8x-M-&my#H6X9Gv7K^P|yzq&|9-1R~WDX*C8c{qLaefQU
zADqe295fEs1aLT|fx{-9D12oRh0MDsjH`;mrIVx4eSb7ozKTY*l4x8!?mHTo(tJg?
z?>Hv+J60+Gz~`HPp#GyD7@zV38QB>0ToZ#0cVckj_ZVD07=uQ_STwjoow?9hY;B80
z@7Zy<>O>s=^ozrl)p6*p8ILXI@i^&uJk3XnM?<9qWQ-GVtX%?D#3taA;RKw+Bx300
zM4TFuh__l3F?L!KQiC5A-XtNfC<*_KO2(|s$@s)R86lqDA5O;2!W0a@n1XVjQgBUU
z3ZB$T#sBuw98mXE+?ADzS_)}cxH=85-AqG?h%~(1o`yLyexmx3pSb?jPduFe6DJhdED-k5_$cXQBDl!LnMIT)y$i(~fX
z;%S#$3{1(z?2%loT%3nRr}B{X&O_T@dAO9Hk2$OI(d1e_#(vC4^_qO#rCxy7Hx;16
zU24`v6yTxO0-QPJ7Z&gOg_j(DVNdigJka$EL#7pC>z+bXdQynv;|o#HSBTBCity8c
zA~bg?!nVXBJl$V}S#yeU;-O;P;aZI6l8W(ie=&XUl%W2>68!tD1U(Z~2N5{irB5A~s@oceer}2nq%uAfO_kSd`T5
zvnVYk(nv^mcN_=&=J&_*y1U)mo!OaZo_+S2o%cf{G%85pNChQYRFG+41#626`p~bE
zR5U8-z~M@=d0I){{*~mLS4nSrSJAnJRWxCL6$P7Ck(PHAeaWmMDO=Y*cUCoR(5t46
z52{Jsy_%E~t0}O(nzoIvp%m>J!j&3&>`+4##(q~a8B|LW)Y79PwY2C-EyepVu3ly>
zdCJ#O+tfOmy19;)-l!vuH+3{JqK@(_>&S9oJ&hCBll_5uYI{^qOTO0A@uYgX-d0a%
zRU2sSss`$Hx`Di&HP8~j2J*~opdNCKw0cq_oz!lmOBWjHpmifHlr&P!zeciDXre(=
zn&{q!Ci;D$i4+-&Pc^WK)UumMS+1E9Cp44M+GZMYrkQLko2k{inUUiqmEWm
z9MeXpmbH=Jfi@~OXrm72Hfj!SqtwDSdacw>t0uKm^6GY4d%T^TP1-5
z?bN0$rI^W5GFl@g)#Fln`$$S6Hz{onmy$uDlx!3_=-IdqI={Sw<{#*w%zGVl!jXOQ
z9W*bagU+>fki`%gSuK#!y)81*xgaAs3mId$%4kTGjBXUm=!ZflRj756bV(=G>|%U}
z>z!m`)k)L5I>{@plg5;H(m7EVxiAJq(9$lVU0w9%S{EIE(M1ElvF%Y^G`y&bE_Zj4
z_sDKaR_~^)&E53tOgGt@bd!#AHx*Mi9ZBn^h`Mev5y=UT1LXu4H95g)rkr3VmJ?2{
zkrOnw$q5|?CAAazfoBIpNMrIidZHoN(%koDdrz$Jl0a!m$K)T(+DLRVF7C
zHOUE$a`Hk`UwNT~F)v~#$_p-Y83$vDyf9^*ypXz0UbuQdUQj+GFPL4I7rG7Qg%cL?
zLWrHb(9e~zGd$&mJ3M1)M92$135-dYB`Yfe
z2#xa?i(`p`(872eN46*kA$t^rfyWhu?H3gUv)c-Sr?G+%WvL(}*(nI|?-higuL^>b
zKVugLD+mi?6oiUo1>xmC1z~2Xf*`3=5Ee@ngpZ1fLa%;`!rq~bXQ-wqWKLBSl;$f6
zYETqrtx^WQWU;9u>ZR%3J<@s<9!)x
zB#50aLQybf+!41_MZxc%qTtUsB%i7k1wN*PI)Q`fBYC*QBV>thcYHgl#-AYuOxJ&C<%SDlmwN0
zB|)iFNvNn&5<(l41dBFSMwgP%q9_t_bs{06K_v8R771%wSsmJ0{W?T~BjeFH
zcC+vD%EDzu#+ei;3;la23%?k1@=|ZcnCz=8IP_B%MyV(ZPX{P7#*wnHYLK#E&R8~~
zLzIQ8p~^zf;mX305z4~gk;;P7C}p9P35`}3496%78mh`d0h4=-U)gJ{vhbKm8&
zvapd|^9yBVAyP?Ms8&!Gl;xF$|5)4fXKf^tiiGSok>Jt7+OCP|2W!jtT9I&~S|l`7
zh=lWHY=1H1cCxm&%o7Po|3pF$)+e)B->gj)30spy!Y0Q2S<3ou4C}+%2$AqTR3x1I
z$@-D?@uxtMu+Wd`nzu+$V>Z#6
zjd3=Hud=c1WuPSFFg|M6Wp++B)(5jO--nI;Mm;6rH?sxy>y(6@E0lyD%tm}-wqhBx
z8UME(OPCG$z-)3h~1f1@r!j!eWu4klvvnoNQ1Ks>&3E!?_AVY^s7VDNcdeAO*oYP(dj0
zP!L3J3c@G{1z|i3;*BmD6X4M`gBu=Z8u%M*G=(ZdyF6n^q3&
zriHCt)H}P2B7?i=gj*L?n{|=?`7Uzb+QnEvUDQ63NmnQ37If0*$WGe*xs&QFI_b=%
zPKw>m*iagsv}9B#ZS0cKO2&m!4VN)rMn)!PG8%YRMh|smlsQ*MLkG!7qq&2Yr+3gS
zNe6Ym?x4WC9kgSA2W2o$u@>`ZUNFBVg84VO%+JYX{!X}wl%AcC((-juN}npFZM~%A
zSKdyY(d{(jb3198x0A-{b{eMLPTAAi$+TBH4KHt_XHjib^|6iSn6}Z*<85?&bsO!T
z*hcD#%m>SFCCA`an);S8mhZJv)1FpZz_pV8@K!p~(n8x)T4;t(3za`>p{M6q_RtM2
zWHPmdvPCU4qOh5k1UJ)ar)FAsyP10LY^KNs&2(}=Gu2l$(ZT2@@^fpVdPC-O?r);e
zTodDNH&I@FBRT$VBu&PJjxuhf#RnV70*w?iw2`Xo8>ls|fyzEM&`+ZVy1TD|#%VOr
z*MSYBTFw04U-jhYTu)hd>Zxo8`byVF^
zOWi58)cUQK(oAZ}@jxxD*QlkO0kyQNocZPqhSV?DkPh?NH!$CQp0t{}m@n`1
zshV^Rt0_Uhnz*^u^rS~Mh2>OHp%BfXgNKNnLKV_@ZME+&3LG2Lq^qN&kEBsdh2#`z+0TwX+F1B+-(
zaUpR5g`{a#NVE1ZcKNJA3h64KlL-aX>RdnD5<{yi1{v)fC|HxqRKhjhFM}t$dNpQ)gjhD0O*Ya$dp^{BE
z{$MsjEOIW)q+{NhH1GlAXX#|pw2_%)RhmI1z8N&$D1+8*${_vG
z8MLMRFD>x@OWj6)$#2tN+CKU({VPkS&3@_h)i9kJHm1|Kk?DkzG+O49Ml0<1PbSTI
z$>iUWM8hJJ=M#Z2yqk!9Qd>?GIgTh$m1yRX>a;bDenlZ%8~n{P&yk+aK}j;>h7(H6Zp8mSsb@x`%p?prLiUX7)*OJXTbF_wnK#*psI7`m`4hVG7KF`3e6
z(qnO&iPxej2hsFUA({q7N0H^TC~DpjMQcY#k#WH<`sV(NLeDc<$i7P>$v8NY)|f<6
z(}qa0{4bIQrALslV+7?NilFIJB4~eAINkRSC$sC}WQcG&Di=-*BEqP~ER1Y)!)WTD
zF#4DtN&_83>D0kc`Z_U`vdTiJ)P>CFtHvKoO-dJB|%MWC6B
z1iI8la3EkF_P-Z^~P5BeZ`Z18q
zwy;>=z(9JN96*-V0d#st04*5GVu5M?WNGV9YWn{4X1G7~&hVon_I~tvmmlSh@FV$5
zUmEb*m-_AYrM3~il#ubAUfF-A^}D`PC5ubm{_8_6wmx)drw>Vn`cQYOH_JWYO*^)G
z)3HI`bR>!8!+7CE(>8liU4Jk7@Y|ELpL$ZZwkPfF!>JZOrE2VGv}L0=R+C^`5W
zmEUKauO;6oSNfHL1HaO<>tAW(!mrfMSYOtjUuev^FJv?Q3w4x!rp<1j$@=hTid6ed
zrP-gT)&3K;=zXHXL7(Vnf;*YB*zPKAcdAx)r$=Fo`(^Nv3|YqSlC}@T`F)^!mp+i^
zES5K<+>P?x+$ism8~qvMM&B}A>5h#nE#Bfvg?(M=L6i&iHg+LnO&6+>zNfYR@9Fua
z_Y^hrJ=K*uQx6ws>c8KaL?fK3D)}9STE3&l>)+8brFT^L<1O8~^_IF8uzV*qZz#k4
z4b49ChOV%9xO=)2{eIy@g&UlxOyop4KOHIjmLu6OU|g_j2O9d(fr1V?(DsoIl$HFN
zwpqL;TJxF)%e|(35___}Y)>IG>?ym*j!K>Es8G+25>)KyTa+!`F|;L)v!#lLS7iR>
z6^%Ojir$QVMgOJR&{Yc?ie7C)DqYsJ#^0LGpSLE{$=39O%^6s{vZ7nMR^hd$#xcd$)flL#k1Tp+qb`<*gh|4LD+M$xc!_m<~^sO<ICC#p2a~tn0$Zw|w9qDgDiV;uA=FU?ZG5;w&D|dB)t+N8tq_2
zsf;6LsANQAC5Gg4&X5+5HzdzA0~*EVkZx-lkX`8mny~o+*#zFF>aq7}rrAB(T7Q=g
z?z&6cL+;R=X?Ljp`E7dLc8g{lyhSd*Zj$1ho3#Gb4Z7KRoy`wkrzf%3=+gXaw9Ni0
zHFjU2=f|(mkl&ZdXu)Mlx4*>t^Ad@VU!=8h7ij7H3pCp9JQa4HqnAg{(e&uE^kw#0
z8e)BhPPCsUm;I;dSJ){^nR<$1El$$sh7)vU=Lwo59H)@6$7%JWW8_;eHxrw~tPD>?Kz=M;INlhyG67
zLy4xl$**D;8E@Q0%e?fdV4yx-zP6L9)AeX8r$;W1J1DnnJ1HO9PQ$~t(a=fTNX~RC
zrIu|W8|^K$;_GJ0=(m~nUD!l%3A!|OzAjy~+DI-s8
zKIn4N&(@?8XwqSaWfUu2%JNPvr4y1R^m_ObVz28_bQ(vI>Ku7ni^;rEgSKwfpq}1~
z>8r|O(mcP2g5%U_?hJK$X10*BOBc|HH4A8!>wMa;FrQ8woJR+K%w_kJxukk~4i%-(
zCVTbSw9IN2CDqL&J>8iU^JNCj>NSH5j!&nsuxZpXb{dViKb2-?vAkg#Q)q(CWKwRJ
zM47si=*^djw5{hvmhWi-JqsC6LsZAJ{uxKjX=6!u!C10;rbfw?s?@z!l}5Xcp&4>a
z_Kv2}fupE<&?rj2Fp}(JN6_XeBdFbII9cZmqjB6YdS^3~2GkFsD>_3c>f>NiQ5;O`
z_77tDMF!H#!2{|2h5yJcW&k-%8bA*XROmofe|BH#Pu0)+k#l8VTDPVz6};<17dm=V
z?T+4bguN#a)4LZi(um1_Cb{?+`IlU4lFk(K<5xN_d$ei^@KZYe*mpqNj#D&jA#F628}^7%{dd3^G&
zTz*`i9Dc8m%|ASs#oMZ8@^*jz@+Jo9{GoYi{PcnpKJR5R|8QjzKe#D@w|4!*%kPNi
z_lkb=AN*qZoMSP(($HvrWaKYi^?D@#-{c6sF*S^jcofQ;sE6>2ihuIy)<5_Ys~F3y
zk@%f1JRi7K!uL`Lplzi|5-&rSQvx2AvQ
z-Aq35Yt-HOjKUB6{+Dii+HzNZdF^}tjgvE9v*8^-Px^*G>F&h8)N|xLl^pnBAA3IH
zpdJ6Czb*e+u;HJaw&o8Fx8i3+zTnHRJm($9J>ysZvEU2tKIN}Yf5OYs&G=i79`jZ6
zP5B*pkNEEv#(Yma^42y6{HsUz`Nmw9*O0r#U$wr@zplB$d#t;}d%Zu;zn7ii
zAL^arw|O1s2lYP6haEY@9|_veHx1p(U%$AEFOSyabti1+UGHw;t5S9ODRXrA?T^><
zSM%5Krravt(rN|&xM~@Hef1K4*BdcEw{;OO+q97X;XaSQDnExGyL%=d<};1o(`O1_
zabzNYQ5eTp4_4z3pBv4`M~vX-s}AFzT_4OB#sA08o1((se9)HC5S8P-U$=9No2^9v=zU*`*_K!tVUc
zen{pWmPjTJ^py+_^^hoD{v@dz=PJogd?Sf6w3qnKvzENix0F18VJ0zLVJs;xxF<=~
zx*~~re^T;GVZS8)@HR7PZ2{>}yIbgE#hyd3{6ZN)WZt>^M
zK8ydoRn$ltI$LA5g}%m3Lqm-o!Yhr{EnhTd%?;7`aVkxt<$a|_`8hf9)ZTr>i$4qz
z578Pc4*oY?tZ_?Sd}r`-v6-i~_<;5faaYj+@zDpT#m`1u6F>O=Kx{wxk$C$Rb8+3z
zXX3McZN$IyUyJ44-ik-myNU-a{VXng>?yWR@fD99%ZneM`6-U|4;Poo$B6TE{)oM7
zQ^dOqGQ?RkbH(a6ip0l4%Ef2<)QZ>dXcBk4X%`!nb%|?-D{v-3N?eb_J-Exty}5|b
zeL49}D%|A8|F{LVgSjaf#wq2F;C>m6<}OcGH$`I$
z=bEvNQ@o?cX^q~+9S+*V9p1m6TiJb(Q+#)Xb6I|z8=rrYGcY{E1&uq;{SCRuC9?M^
z-Q}-y`J7dP(^es58kCt5TmS^0LRWG>xRxi2Ad@JtgTpKR>{wr?eZ(DBXD0}X~sn?uUfCKkZ
zec)bR{>UZ%bmydfKXd(df8lz4{L0lf
ze&c>D_vCI^cyYrsy*Zc3-?^bze7P$>{kVWW0bKFUKu+o+;o53>E(Zel#WaXJl>CG1
zQVr%Fo(|z^{6aY``Ec&8P6X#<8_Bs9{Nk);MRTWa#&8qEV!6nEzd2p~cusi#hf}Fe
z;MOlr;!YYSb7x~yIK3fh+@u5PT!#B!?s7v0SBETa>!WPWKK>sUJ}j3@KA6Y-`jpST
zX(-@!p@?gHSj^ptE8+47mvPhgm2-M-72L7vN^YlmH8=BK4ObLi%a*y;bJA@MoW4UN
zXJ637(X*s#Vf;pSUsUX3d8&3;&Bzm?;3y|p9a7~`#&^S{)ZVB1F>oLARPWP2uCgs#@7Fa
zV2;laNVg7!Z{twxu^xuHg~M?rbvTNyjljyGBk|0CB%<|3p{`{V%eg%o%8SRKC2b6n
zuB*avs2aBUtD$wrSUheX3uT*exVUgUqLRm>@0AHyI&dO(dr!pC&6BXFb`q9aPDbBZ
zQxFw91s6_Fg<`L1c=&M|YFAIknxg42H<|&-*qKQAF%wyPXW_SW7QWcc#3n=QUVyZ53sLlAA+q;p60;jQO+^EA;eHUagOtk9MJY^loVT?uO-tJqRq=gXmj(
z5i(#O-hJGMW6SnqK_aZriS6cga;W-MofN
zeXb+f={knby#cMz8`!j+vD`{-V#v)~_}%L^PCML2`OG`e`EdtUo9-eg?=I7WdyI2;
zAC^}4v1;N2sp4cG(?{#hGy2P5
zeuzni58)Q|5JLtSAJ}FiX7a`3yE2
zpW*h)XV6W5hC!pBgT4QTGj7k(UH%+KvtOX)@(bt(yug=^7pT^J2{q%FSRVBfTl!jI
z>t-vgu(rauzgDOlWetx5*4X1>jkXfTf}3swx$`zS<86b8CL8qEc!jlhUg11jFZD>?
z7Ee~$!obuPM`LWUxSt)`H`(FyOFL+%+Trgod+6=9N0_5MRCDcda@=b;A9;;vx7Wxk
zeU0L24#+s;0Q%+ti&_Wh%yUG?Wk<%ga>RrdM>s8Zg6NhL_VP|}?r=it62^nO_Xa(F
zzJW-N@!%L6?ziDv*oMA^uHrj1t$c^a#_!NO;vH^_obh+HGbWli<3OY{OqJimY0Y~$
zo4kirY6@6cY!9cvOhyM;tP)L`~t!H3%VIUZjQ=V=;(Zfp4nGyjQomuir*l=
z{2PAW{f1MLZ;)&GhKKV#&~)AdTfTU}q0|G36Fkv$z!OT2o{;&
z`^mH{e#d@`@8}ox9Um2Z
zF?*>m-rev;x3@2}t9)TN*$=J<{owQ358qP!VBOyzC)W96l94|W$REd>{ZTeM0D30_
z;OQKI=F9+09vq038w0VyBoLZE1EJOyh|0MVygwzus`nBkXG)+mh==zE9ty@hmI*wL
zH}SYNlW^lG;gBO?Q3|1@4_l|XQh@l50P+zqtwMm|xFAI62chX%5LA8zVQ^Ovl+=G9
z@5~Q;c>e?X89&gh@)LL0{6y{DpV0aK6E@{P5v3N4(jCF5dlHPIkYI$h2IJ|h5Ue;7
zf;_troQ@Acj$$a5ibG*~J`{pWD6;;BqPSleGPS}Wxe*4VuVGk}ABNN+;n=Soj->nH
znEO2(H%r4AQ!D~en<9|#Fan_g5qMJ>fum}X7_u!AUM7)P#7DxdIuhMue_`eJU$|uY
z3ugQ;JgNSLn`5J(yDbVTCQ*YJnS*eDv|zR{>CiAKlp7&L3gFfLyV
zK6=Dpe_jma2FBva%2>!Zjw~=C`rZEfoXWOEDi5Zr{Tk^G+2kG;dD(JrjATU!s>J!xRj2+j%*!vR62|r
z)8VW77xC-=BJt{92yg%5S)fw0C5WQ<{Jz}K?%
z-5z%l5t%5e$;8>=S;$_Ig@tFbaMd~sjzL-YR+0rbm28-3WJC8*HoDESVds;L
z;aS-*RQ!je8UN5{`#;RM`wt6U|6yX>Kgb&YA!t+%j;+i=Gvnr+dzphcNe%|*=U`>e
zTlR?`l>*GND?o=(0I&Q4=qMNB&-6lYn+joZ
zr4W&}g>2@Dtz&?-j7v0_9&
zF2=Jj#aI$wjKsQPHm*zHsa}Hioh6uly96s7OR)S$2`1;2pi#aQA19PTYjr8YkC$TR
z<5JxHREqC0rAVwSMQYzNgv=^~m2MeyE|j6_SsAW)l_5W&4C?h|xb$B+tmc)&aZ5R#
zTq?)m7v)g%E=O2GIdtpF@l&M&!{$^#PqzYh&sE^@(+b@AQi1I;6&PGz0qRkSb(1S0
ztg6JYBbCrMti*%2m9Pk^gi%%{_O(|+ZCDke7FI!TYZc-yRAGum6;6Gw!pmP(a4xEX
zt$a1Es8&NA)yUadjdNG4QSiJP%f3~^FuEF_imMSQUxROBYG5X=!G;|*XuMbh!>2W9
z`B;N3VKsP}Q^Wkl8vGhu3z}048|_-?9jk@xK`qQ)vrpez?D$g)>+)JKKsh4D)WM(e
zA}qJmLFY^z>Wu4f`%N7x0_w0lu?}}D>hMOf9v?^7!$!Rxr*!Kv@kBksAJjwJt{wqi
z_2?B{j}`g#IM~jZ6#q3qcUl8fS2Q3+zX2C7HlV?@0lVHd;G=&7GJiLqsi*;s9S!))
z7#A+n8nJzOBP#S7apGJfq8~Qmzt@e>^lHS`$VTX7H)2LZBkFoI;q{m%%vjI_=XFi!
z+}8xnD@{25xCvLB*ryNs{flkSV*BfwFkRFP`w`8knbnMGTFqFm*UVUw&EW1gqt8pm
z;&5xmen~U(;+nB8uNgLtj9JK-9eE>KkTbIdA(|~P-`WE4F~;<`(So(+E%@Nrf(nlo
z3<+t$#N-x?C~iShOACB^wqp0lRus=@h2GLueAR75*#X7{xzq|3qgHghY{hTJ3^Dd?
z#n^~eIH$6GC9T-e(#m{@HoO_y28YRQxVNYctJk!lVMiN`kF`N|wGF$B**>c_guQP=
zf_EE2gWK@>PaAgTw4uGK4Tc?UsOi;?6~o(cb8_GFy4$!R*
zoG|J@n>jnqssqsu9q8rSf!SX>AolIRRG|Z%VI2ryyq6ux9mvS+fL1{Vo|ktZysiV;
zt!!IY2LzD}5Bth6caRLBBV-VdmBD7R3~4iEkjs3$7Jw2ErZ7e8D3nKVb?7gl<&)6ZzRJ2QyI=aVf&uRkYXi6o~;ZC4l;ar
zE5jid8RS38@aVG)wclh|<}JfzUm2bT$Y9RPa4tv&^o4xWl+tQvGv$8oXL^lbgm2=^JEyBFGDyJy#n?h
zCNm0I8BDC1ykqi$$w?*?n1r+a>zVkn|0^-kV8?G|=h?!}w}_p$J4=Rdteh3BJP9jz
z7%P7ltA`=0k0q;@0jr-rtLI==Uq4pwC9MALp^T^bQ-;~>y4JJn(`MH>hh4AKONLMX
zzkb#ZfgjkpTx8h8+UF5#Co5al=B(Wgvi4JD?HFRhjx&-W;GPVo-rVz63J8(O~-H#Pq0)>C
zz+I+~X-qGNUg`jto~~y4s?PMb_r?xHFg-rT^tpoR^^PeWaASI&If&^p)B9$o|5
E6oj7p=Hw%6>C;lJ&7x+}hrXl`C7(IIk6EV_P9oX~l`o7I;*)AUmT4b-!9r z?$?57mljyQXaV=21+iyauyS_`-mPsx(L%8oT7<=|$GbZaaV}wRC8YZy+sWf9pM-%c(ny@vg37>+RQ0m@5m%2jV%Vleywzxg z%J@bc?bC>NO$`YB*MQi_2JoH@cy8AK9m59Ho@&6&tqmyU8nARi18(T zHmn}!ztm%fRXzUPuE(y!^@v?xkMZ;BacDT>^LE$aMM)iuf7fB3ZyiQE)FI5U4x1VG zDO|S>s_Jz(II0eh&TFkVsMcVyZ96wr%ob|O>%6tPO<|BA8Um=wF z3wDmcbfLGY|X*vl$-U#o(NeigJ(g_1ED=KmCVh!jwj9243g$NETL=T%n zEWT8TO&gg^W8X!E=*j%%VCFv`W`1-f^QZT1DnP*W0!T##n3SIn4Iv*3ZSyhwaz2W6 z^6`2K+oq6@AK7`B6_5wx7kLOjlZUF+dFWKjLu-33GLm!Q`YjhbO>@zBFc&wuT$BvT z#gghA+=fSf6-$17tZJZV$rI<@E!3N zqifS~E<7FX_UZV2J{?&r(~&%!J%3fF;Q@O_TWHI;SZC6(dwCk-2B%?4c`D8ZrNZ$= zDtwQnB0!u9*M6zEou9&NSqh3Cr{Lz^6tvDs!G6UQc%>zy>QgcX-b=>#&B+)&AsO;5 zN%#|$1XG73Oh2Cl|K&-TH7E&|#fiuWNQ8=cBIfK(gm`u$X2~U@ZxUm&yCmT8wFFFB zn*fjD2^d@PhsE>$ApGecwCwwXL393Kq}(6$NsLFSb38mQ$K$}tcytVkhhfogH2D68 zF5|#k?_kf;lYXP1ISyqJamciZga5HO+*4<4Em0ieQW#6im2u>+#9|VAK0n8v)1C8U z@Y5>>(GOzqLpKIaV`6Z!DjKR3jh|-G*q|Scu*uPw)EtE?VNv+{A_@ryqL4Q$3RxY$ z5EA{1-HU%=^RZuOoBs<><$j@0d?cF9i1g98@Z3z+B=@fyrrx|l=aRka0 zBjA`24$dhY;iuT=qHq>-4o7)>7{)t0g93|p z$yfWL`nxY8Z~MYxg)g*v`l2YFfwXg*L<)EKG-ksgFU~z zvBtt1YK-4iJlq@hIbMLP7h+F&v3UV6_%(S#h4;kH2cEE44B zrw)r_s(i$XB*yo${s7CJA25342iRr1LFug<4jgiW`vf=S7rUajyDP?>cE!}0u28LU zfuffS{$6r{;{q3KYJQIf|MxJy`5wyLd)(+?aah3_Q|~+Dq^2|M&dlZ}4WAYk%>=fDK zR=6FWJhX#_mK_Y`?Qk^M7UBoC=vrzEU)d|{p;u_Q^$NFHth=$r2K)SM5O~D~it}x- zyv`cuJgo8btTh~_Gbyuz#Rn@~WK6J?}T@Jn$)2#XrF{^Cz%f^8{ZNp0MeBb9}jNj#rD!aixJV!aU5N zc-jp9lgzLupRvLmALE|>V@L-*W^+!ah%qbU7P`4ls&-Cy$_(6a38N$-p7D|d$>6L9s-^2qGZ5bbUeI+ z)|T7IJarqc*|)G`(=Ako+{D?1HuX>U<8D2cAQ#(ODdCJOkm# z8OV}PW8$jQQ1?B>=2=c*p!G=>13n3>Duy9fV}qK`byi0K2CBC^@_zYKi->LUSK3Y$Mmec-|W9b6kz_Jys+2(kfidUJ3cND{;qL3;Cn8 zpl-4P*Xx$ETtLea9IlDz*_sHpTLxE!Ww>^BDb&-Jpg?m8?tKE32LX5Qa?DPMv2c?Z z*8(-*I!*&2=8IV#uSJO5y9k~U>M)tDjt#a8(cQfO?@unkf7rREn^ydg%oHPR3PljVi{V*i!4TF&| z6ywJag`epVaMgq1y>&1~1`fitF@q3lG!P19|1lojf6(_CfD6M0;O1QwT+Q!~BWwC& z)t7!4KA<0Rul9v~MjxzQ)(55Ud*gPG-jF-n3%3(`qI6+Tth4U{$4+Gw9#V#CqzD_Q zi*UhG2__ASc&?`iOZIMnfvN(I8_Bb|Q91P2mc#o!-JHsVF79}RjQil-!NuQ{a(SBV zT$XYh_w#oPXJOsUt=`kbm5giTE|t}Dr5<(MnrpS(bJTDV^3`0?uS%}kqJk^fR?dZv zDC3^ymT+2b#az+pBJR@MLaw|ypW8@z+#7>jE^~Dbr_kpgH!LBG8*Y=yDeunU@>TzG z?uBXGUiVb4>ud`5bY3#ovn7$c%qOsSME-F7SH^QIdi>@N$HsCOpT%(Jw?%WihDC7; zvm&|9HxZog;c#xxa3UUM(H?6}3jwp@bYD{kLP z8!ku5n%frnk_$3@!Hrt~oIBV18Rr{o!PPx|%8k=~!mU*?=ME=4<}SZ5%@?$sWw@jZ~_;Uy6s=19*4&Kb|TCU5z3Ese^E?>`e z1+U>ou2{uQ3t7RI{lRLn_5L!k$=*Woh21&g&H5SQX?iJQ*|tC8s4X#K z%S{pDO&f#7eKwFdY@NUO#u{(&lvQ8FsVhE;4K?43XDoFRr*L-Sdm2{aNsBDS@e9nv zH|H6P*Y3YBe!uIgSYgL$@u|%R#pxUL#JX#B#PM2MV*OaL^p%!0P#Sfj1X@4fGKQ2ih-5 z37n}}7IG+6SrH9{ia93z?E@JF(wHbpY7DnpV}mLs`ZTqr5bFOy8msg|tCY>;qi ztrDdqnIx%1j(>Vok)Kx};(s3K$uIubo44QHk1tAB;fL=S$S+J9%!@Y-<0r?B;5*ih z<^v*B`8`_W_>vzJczsOfy#l84H4A3&gS=+(V`k3f`?=5O3nr-Zj&B$97{&2FUM=A# z57gu@S*+mS^<2gKJY2)Ocdg?MZm~(-rj6`9*3GGJ>sL)O!6Eb{D~49e%v@)K5CC0zx$Ov|2N?^uhqwqw_EMR|9$X=7x8cT z(M|7o)!Fa)z9(JyB4=0rLzWxAeaJ_?QrDe7_xKZ^5%QUz)A5DBu<#pif6jyd`oWX` zlFBw zi>LB*a*_fq_@O|xdWz&wt4NCKc&6v&(`>obPb@>Hvf_7 zO!n?}*g&$_J&3N=4FQd_}Lx_)aI6{rlSB_D>9@sbh5Cyk(- zlOw6FYb4cLkD~19qsc#bG~L%5Lkp|MP@17C9UrDfgC@MTbw4}Z<$Js2Jwx) zz7};lYg5}%o9dbpi((|2YywBsf?j&lsL_5pFFzNt$H&iLL)Z+et(nPIWi$Ep>?|fU zpUpd#vpH$l97g-k;hcqY`6_oVzaN~(aX;sA)$RG*+H(O{zFxpF+B*Ckt3&&Z3yG?Q z47{+2L(~@YqUB=x3|YdQw@X+$cPVqzm(p+7GU|O;#*x>SGql|b&a_>@mm^p5Yrsm5 z)>*|RS*y5e&uY&4xSHLstzlN%wY+S-maT@b<5k~vESR&N15(#>$+ivLUbBIlE^MUK zY!jQBZlX`$&0OrVnX#H%I3{8XbysYqTftUF9oWX`&)evJZ96Zu*}<`ocQ9_?PA>M? zNiXeP{1>^4lUDBLvVz@QzJCuVf84{ydVA^9Vjq{9?qhs!5r_WeeqJ1ZfUo2O44QY4 z0m%nxweb*lygS6!M-S8H>tS}fc7#V;9;KVu6TJ7~2vr?Zr=K54*>9bFd>pZpjI{j_0v!VDpyKCIwggrMn-RTCU${QR$!hmW= z44CU?K&u7=E**c9A5Pt*q0ddW{d$uInue^sV90q2Lq7Or$avi1H@#cz5`2pT{@r5# zSw`$|-H7kQj2PO)m^bDcbMj4N=0qCvNb}qLF#k69-MY>A=-V8ic83Ra?(mt>9Y)98 zVX@j>R_ffP%IGfRV(!vG?H-Tm+~Y8#drXVI$D=Lo^ZWe!JZ*TN#gX@^-RuDk=L-JY zjR&j?d%%{BP1tpo2|Ef7-0vV0=KL|C10Hg_@VjcIcu2?Z4>?ZLlrCpY+0Dn4Cq9}| zG0u#ij+wEKn;ECnm~r}Wb57ZB&c2T3{8D00_J71v+a9sI%_F+yKH_+F3p%c`pqi-# zHz!-rwvAxIEwp64p(Xzdx8$FHmaLifm@&GKY3}!!D?UHw&v8#^e)I`@zZPlv6aLb$ z;)?B7d?XlgG1*qE>1@s4%Z1#rW=*s;W1HCU(F_}|xMahhzBV-bXv3akY-w`PmR}rf zsiU;z?Oso*Sof5<51$I&<5QNjc*ca;&*-T4j7R*RQRCAyMvZ>X4F{ex*X}uW3ZK(a z{RQ8ze8CZSUvO2_3m*9Qf=9INxb2J`XSmz3t?az{9f~ zDC;`#r?&%#)H!hG5J&24cjWZPj-pRG@>5GEdd+s?wo6X@;q4^&Tu%Hp=p{F8eMy%` zFIk=VlHHm+bKG=iYMyiED0gSJD|cp5pI5YAD|`;`y<%a+EAIOJikTB%bMoQWye_zM z%oVI(OPfafx91-brFK*5BqH9ZUR!s9|`%~T=sQ=QBpL6}Vx{W`dP4{Qk34i{u^QT&-KO46QVAa$B%7+4Y(I$WclLF}f zH-K8>6?EFA;9oNZ=R_)a`m2KXhsu1kL8g(h%zX-(<7#A<^&$;% zG$T1^Pb4i&BKe7t)UJx;;jU4ro9u9(f=<0Y@c21ypBgpc-35>X( zz`K44oURm1Jhen_8=uI;jfos`J&^}rC-PBRB3*t8(MY2Cq9pD=mBc|-NsJ3k;-;!3 zrguoD=G0`~*q+P)!(=f&C-a?P<7NIzrk6$v&o4~j&=V;Pwn!2D$`rc2OJU}N@u!jIxnQAv-#I_>h;WE;q(j+-JQXWw=#IfC4(1}Gq~?l2B)cK^0#&-9k*q2 z%JocoI%cwSY$kWqX7W+{EP7AKqGD|pUtP%Jb?Yq73Cd!fGK>06viW;(Hh1b|)BR93 z%kE~gsYf?>nn8QXzIn?}{!?pc$xn))^m+Z>r zpc}a?wa?|fh+Ot7%jJ`1c_QyTE|{OkOZ)O@X_zN``txWUmB(%6dFD0UvcP zr1SVfIxH`w(a}P#xl>5BS7JY^ki$z0`KVD5tNRvlD2ljbV-Yu=E8;Sj zX9+(|ETPTP5{}+qLdR<*Y;IM;rQRjfODLgvSqaVlE1|CXJL-&k$3HsnXub0t`|G~r zUDJ0|zJABv;qN#zUvMKnz2mgjrBokS${g)d>aQwgr$eQ@tzXKj$E6(SS<3Cvr94|y z%2QuTxxP&q2MsJ^j+WpCt|;S|eP!ICSH?GHWvqTx##SL^!uPt2jcUu7-Kd<8)XS+o zx}4FoMY^G!7DvmObG@96AD6SUTRBDCU)E%m)2pVOJN}jPOP30s8eYMyX%!r>s)B3w zRq&W@1&`ma;Cj0X4)LvEVQd9;3oH2deFYCUtrVQ#O8yv8$zIbdg%5KjyX>iC&ACdx zGOpw@n@Z-pi!@a1r;Fdq#Q)#LajmM@t9KQDjILtPj4B>lS;hZ$Rq?`^D(2p-qK0J^ zS2|bmKtL7u##M1qzTkhhU zHFrI&W+V4%-U_Vd=Y(qN6jbv@O*I{VR@1#@4WD+e;hCW|oG_(^S#xW+Yjq7XcGhsT zV38cXQbY5*HGCo1Bo@v!Jn37*i4ip{NUhLVnHN4rPmY!W|g+FvHv4|l-08I zeJ#iRuI26)b=2!5q)#3946EaWiFGWWR!4oEIyPA?m?~TADDSW1$CGtzce#$84D0y& zK^+sH)bXZ$9S6GA(OGa@>*!TiN5ijmob|U(%zNs2s6#z- zy4Q2`fO;MrUe7z@>uIi4PlH+Y+_bQs>MQGoLux(e?Wm{k{(81MF1U{8>UmPHo_YrL zJbtI1I;Qn(@uZ$^&+4h|BvMzg?_JLY0pkDQdR~qc$H$BFQtR0^TjWz9@++yQqN1MN z>gu`iV?D2btEcJjdKx!s;J)S!9NxNt8SNXmw@U*Hx;Iej)4;0(8t5{(fq}yt_;z#y z&Br%z)8qy=*J|JsG_do`2A-bNK*jt9RxE4~Jmm&{UEaX#RSkT$RxoTfG_Yh-1GjB$ zV953cs_kmv)IAMcwy%MU4m5D|p$2|C+(74}4V-aY@NZ5uu>YwB9v1u?n==jcIom+* za}8pAY2cm<4eWNYfgVD}>NfC^kP;!?E;Vr6|4Vm~mW$u4giIFVCywnW~Yo&^7t`*k~5oPFfM3hUE>3}HPQBlT?qO7Atnaf1kZ;E?pv$=s6 z#XTj8dsAC2>TE>=$1fGvSk%DJq7FPoU91*$QXuMPiB<#cCpSa6LQ2DTs3z<;7H zb48t6in^WFqk*xauF;`^7NYL6nm6!|Xp7c=>iJK!O}=O&ThUhYE9;ph+HOf0%>QS}@UB90Yp9x2-Xq?=%VzO3if=k+WW&&E)*dak`Ip0}Iz+;^p(3(wcH z(}{Y99}v&kPVo$Gtmm{$oMOj$`8MSQ%PJV}HRM@~Gn#$2w+Mi*3_7PBg0Hv@7D6Gj(i! zNc4s6;@q`${Ju!^rLJc; zEyjWWYN-FAh8m?ce4SOp9YLNO%=C1ucG#YD*n~0qRWvg z&e&W<#lkA~nOepDL#p_sOBKBv3wd8jo1#h{NvPyNMJ2;tR&wE^O8Q-|WZM&!T(q^4 z#}`%dvSuYu465Xkj+JcxUj^mr3NFpAU`%)gM|f87j7ET@5UInB($J=)JTuer6eeI+d})q>R)pp0 zeLmqG4SKv|`o9vk7A&Zd$t9fVTOv5UCH#Fuuz?SiaR15@e%CDFslFx5Y+AzpH7c%7 z6 z|K2F#y!}Nyy{L${M+@m7wm%heZdM`x`WMp9x{zb86w-c2q2O&5QfIK>OtmN!Je2~P z#ure}t$-^Y6tL~d0(!41;H*gn4Cq?Gp5FwMIVYc%0r~W{67#`J`E=Tn&nwgNIlXT_ zEB_O7%HlkJ3(gbITpnLv%VUY)JU5w@$F>9V#PglUB4sWeLUOtKc`j?O=JMF~T;@&B z<(R&?Jo+bx<^?%)lymspDu)JQZo5*$D+%hEY! zgy35>OJ}`O@U@x7wU%i-a4L=amZov(ur&5-lE(bPROC-ZqAtg!l zm6K>;p2VF;lc+vFiT-_)IOkg;{gVYp+&PhZt|iiHL!z+bBr-~@t0>l2Hi9*Nz$AhF z4kR#SMgo_pCosG|o`a*}#q$}@*Jt9HusEK18u3j35l7#YINp32#~D}RSh^;Tr$@%I zzEK?417)BLEv!72i zcNs_X;kIbHOpN9mwP@NEiuI^hl;CJZ@z>@kT8)e1pk`6D&W+?Bw@5C!9?2W)BI!IL zlK%fi&?hZItWhF(TsMMamPH8t7Qqu=!uc^KoI7m98u@rQ|IH5Pgl^$nAy`@)8OG%g z!Z>c1U}{YYqn}t~Z_Nv3y=y2BUkzpE%219R6v`uCLueHfLLaLTDvpS?`t%TCp9tZ) zl3=#=38v@GV9s10Ob!d?pr1j!5Ff+`HdGQgMvX>NQY0hm*$?JZSH-*R8Cx6G^bp|-CNjc)ib zVucUu`uMPEjW^Z&z4_C?n|Uj}`LeIzbJcjUwZ9i%7hE zy3-2obZFsD>ohm&+q!Y>0XKG^=*HMTt~?Oq%CDxbJhj!81w&nhZNY_?=|V3<7r|X} zVO39I11o*aJonf1zwnwjXTRpGHm_Nm`HDB6y<(e#uXtm^D^~t;7L0ypUcK+kH|s_G zhW^e}RlQ`f*Gnc|ddXLFU-C@bmmHJj#O$X|Jh5Nc>&80q=yyk^hd6SWu_F(!bmY?> zjto^fFzuBC(@#1uT+4xWjU0F~)}CV@+OuGTJumjRXER|p)c3Gs?KwLxm~O|1&FmPT z@PePsUa;-v7woDb(yHhD;_;k`=bqDi+H)>$`kWu*p3&&xGq&IGj5qr}V@>H(&T@Im zTPL3~Q1dC@{jueba9jRoY|GEfZJF2AR_HDpo_k><)~hy5A7#TsAFcVp&zcAHteHI9 znnTsBc|6gIFHNnOvfheSy{-6B^@O!fPndo93B80ZR`1JWYAGJG{K{kAm?PqMs6FO` z1Yy55vE;V3mUQo7$@hg8)UdPQ+mPBI*CS3n_lWJa9|_yCxv=w?Q@Ux+ zEFE+1YGY1ivYA-do6&up8UO2H#+iktJpJ61k9V8WZHOs-svgqS^&u^eKjg^?4>|3N z34i&S@U^Z97f&-`;ok?`8TNo#1`h!o^UC(c<2p|VTxZ9N z*J(HPItPE(r;VRJo1fR`?kW1*Q+(VdbA`2E?WM$L^=Fhpnw;|_we%g8VSDfRUDd#xc`z(#e zo@I)Qh?z6=47)m&wAE(prV@y1Mj0GQ$ zGUMn``cxj_<=sa(rsy!EHyq}o^h12R^blLd9OV4j2YE!iozb0gfTuk7bM=V*?BlSH zDSh_wh~-{>?68+RZ|`A1lRf-(c{hiA-9<^n4AQRLNsXO5`6YJ;Jy-4Ey7=uZpR=7i zxQ*eHwy~qzRxTX8m4|J&@IqG+hv?pBu4uNIz4bOR?ej*SKC+Sjz1tvc^c$F&wx0bL zt>^mCbz;7`js_lUd1=U6ZnIs(kzLlX^!92RHCj#e3#({azmnhgtQ7W#6}+`_1wEse zGh&($?`8BHzKllCmU3~|rTle!2`&FEX5Vv*X^G>V2Hc7W?P&O8y*{ET1Fn46}K1>TKG$&JuRhSqw0rNmsR* zynA^DH@%prt;v1sazDV z$)3|Snd3QyHwR8(Ka0tHr8b!ZE=}UCx``~ z@n$HEG=_4!*$@tGI)p`M2Gg)?5c{qhM5m~M?58=9MlUs3qOQTwMgw@@dw-f8=ugj_ ze!}+Fk7BYymtlQ*=W!oyRqG>S1odWmMK4}h-;3>{dkULoPqugJ!HZpch(6z)13#;C z_ilBXr*)&>tZq#3?8@|hT?MzU3;q6drumW1+@0TvgBNvTj(xUwIgDEo;Rot6OngXiN4T+me56)R^8%jaC<0 zaBX>WHeJ)4PNB_+vCSB1)0A^sHKot_CL-oRW1d>on8Cq~_-|Ar9+>z~mfQZ7zgGN_ zdxrg%huZv-d!PF$|62Y-4j=wqKGWoz+^+D8Z0h@2{`=sQy#C-v`SI)za(J)za?a;^ zIVZ7B4t1)PEw0wcYd2KOf5%nHW-Tk_&L!oto}x@nH!YRB9)2g!o>L-k>ZOvmeJYlh z#TUsV>?0zCjZX#mX&F>Q-U-%RzKaLHRou7rs z&S!&Vi^W0mnE`?F>~FICH$fr0+6Bl9FZj#ZOa0_E1AXPN?>=(>Byah+z2KN#cq11t z^_2fuz6_pO4d%v$AyM@0TygY6H*7&04aZK((Or(q_Y_CuSvwBNrOgh=XI=Kn zUsmjv_kP_WM_6x@JI~r8uPomvU%RtjeE(On_i_gg04idZafJ-ARF)NX-X zn;cm5x{+}xpZKZdL5Bf!l_?TRUZTn2c zfpsa0k+$)Qig!^8n-O7(B_{(FU;X?QHvf4mrp@zEK@ogz zqM}FB5sIr1`zt>5RacyJZL9dJ)l@O{{^tO*SE_)Hkx2nQN;%-lZ|8uM-7Ny{Pr4D{ z@qBy0^IWZfPo261YYNqCP>8-UpdzRMj zC;PQ(M&Huf+|Ei%zur}AV^XkIiCdahuX|-$jgEZRiXGfsyWG6Jc6O5<+E%ADw8yAM zYMU*etQ`|LT|0iHj<(H{mD*Y@Hf!6R*`uAQI;x$v?7X(6d`;Wb{H8V+-PVrzcVFAj z*G${!$YX6S4O{Jm>=)WI?m1~cob93={>?)>-PK1sY-fP>gKk0EQ{%(5gRe$wYfMVe z-cgyNt!tC1eSAfp_VlL3+7*89v=1Jx)DG`kr~NhcgLb2vU$x(9{?fLo{;S^|1y}C4RK~L%Wv)&TF^_2>j50ENe z4wQ2K4wgLE50j32jF7st7%e^DHdgB7J6<}}c9P`0XNnXrPn9w{NmA&+X_8sU3~7=2 zY^n6 z$*;eObb8@KsrM;U$;--2njCH}In+Fo{&lvL#Mjx9-kvAY)4NuZi;uPBP+%h&HGL{= z9Q91$cu8f|-cp~AZ>8y)zLL&XKS{dbFR8x@kn)ohlJRF*>en++ zvYinmHQ5_1t-2i|8GD3E&KY5n`;TzRwr`|#dQOxy?m)DZc{fJd@g`PE&y15s|BRQ8 z^-Yv4W+zDw`;w){w^O9k?y1tGv^1&Ui{PvE$dn3@B~9LuEuFcMBRzJ?mF!~kq=&Wn z(%$xkQr`(hk_g5p%{Z@=UOrJtpX3s0V9`5i>c3KHyhgeBX1GF1*;^@{y;UXs=Ugov zimQZf$d^p`Y5d=nj*`bV1d;Xmnqhkw%E?v3#2Wh0!_Yz$>oW6WIF1SVxokaDIe{xxZa z0cOoGL8Cb)zG;p@Gh3ipatmZ_RTD9y)v(}FOH{OMh4YVF;oFeb*!Q+IBImS0=d?Ch zv7;^Y>f7SU<#upr)gI3tw}l;>xv;#H_VFZhJ|a@F|$M+gO7K|k6+!PFzSIrU3;R1T~C;e>4i3OFPvV`8!_p< z(RxQ8NVR>i@j_qhY1$84P5NPO@BUDC?vI>_18^&N05leBz$Hrq19lC>jk2>BNW?`?oq_HfXJV*wCi?B4g+}$Wka%V`Zv2`Jjq7vZ zqBa+OAI!z2uJaILJrC~(%!iuue6$*~0AIZqAWlmMM!`B5J8vO^;ub=4#Ueb(6fxU3 zErz;sF(&O@0rURZ`bf0p61{&E~?zC!p^tw6W-E3v?AC3dQ>!Y=Do zSkiAb`r5BX&X6^@_<9YRj9DwVCTo#2X&u`6uY;!e+Im6Idd!%$0evGjpltp|n8j|y zuqB(|n6wEkS8m3d^vy6_y9Lj(x8V84t+GO{L#yI#aN4mQ!%McqboUOFl_9LWrKkgqn zfLXN%kazeXHr5fp18!8sTQ zoWs~D=Mms_9z(}ofUe60cn-aYc>9Zp>!%A>Yh9dHzl1(!m*Cp&GWy=Wj5E#j;C4+9 zalZub?c5c3e7J)1N3KGn;ws+kyoP}V*T9kb$UUHsaz`O0`pE8g9RXXe}pW_CyVs2n{GXsRoGC;p81~{QGz?-iID4lQHgLa~<-H0q78Zn!Zn?J-8HkRJGjc!r5k^E0^;iNn0a_$bEdEP;peUkcOM4?7jC%2eZeif4_);KXua|Q?%sZYKj9Cs?au?j;W5F7 z<0jB}WrDdSCRp3+A=a;X2%UQmF(T?Ae*O0l)HKD>6Q*eQ$`nskrs&txOmJq*&~V!f z)5Fc6_sa~f6U`BS*c`d`=E%-BM`Y(muv;wr;ch&_2>B7RK0d<95f=Eh(*kFoSfDt? z0-9=;xH`iUe&;Mv=qCK?N-goD*JISJdW=-#$8ZRFjD6o8Lw(E>`0sgw1=ddxmHI?* zpRDk3x)ln}SV7&z3bRyJ*raZaT}!R8;f6J)2Uw$1gEcY-*}!O%4ThQ6z(3Lkn!jw| zFwPeL_S#~xwJi)%Y~k8W_zr46Ma=Q1pu10SI^f%fwdR78c~YF!8#cL~J_?NG$-2u0glp@3T`)}@DH^N&!WpTaP7 zUKr{Qh2g157_@!E5Skx`iH*WxG9(~E{xyw2?C=O&UKW9# zrz2o*83A=h;G8l7!A&FaaabfeE{#OblaXlmC=#{)k?<{u#KC`&P#Y8llLb-2M>Pt& z?nlApO%#eUqVVfm6q@vk#@A`lNZ%0+>l@Kn>J*Ktm}s1+iH53e45p2X!Hrch@IDiR zB#RiN`^O+WF9tThW3Z!dEZWbE#mk+s7;z&OmJYFKh>XR!idbw>i^HkmaX7sw4qFe$ zVZz-wymyVmlf*cTs*l5~cJb&iHXgf{$HVq`Ji;EtBh4co@yYS8x9!cog4ta+P+LFq{-dY^>r?UK=9R5FYfCZlR!GA0=aCf|!>7zQQd zett5peow}xt|{m@Aq9!cQn2@Mitukv!Age|IEAF3v>*kof25#y*HoyFPsOh#sfaz0 zifaaf)%QFVujN$q%}&LokEsZ4n}!d=($H$I;38~K6a6F&N#<#|=aGiVacPJuO~b6e zX>jb3j*k=5F??A%79L2)s_W^PCwL3}ebZ5%oDTCU!Cq*R0oUFc=r$!ou*WjsbRYu> z`WeWx5_~`J4EPAn-<7fqjQ=kKN!>EBW^5+H7G$F5j!bO6kO@PROgwSU#G{Z*=;mZ% z;rmSdYmtQ){jxAZQ!pZyW#RkYEKJkO!eR3)=(`9B%fi9jEJ*LO@TGY+9{0({;7QrA zT9l3NJF+q3d^V2X%Z8DCHf{%G<4kh4VDDt3>91_O>W~A?AvtiDa?oyNj$p6l!01vA z>`Zdt=$M0tiX7}s&cVRa9K?Rl!G^YiAvhox-sl+RR*Bs>;Qu-?>=bArCeK^N=_t4;2gZP`xD&naA_+>UtjbJ<3CC=R7=7# zd^D~U$9~U;qGbV2_bfn{k%CPqR$A?s6yT8He7GGcK+fd?)ZQ&XrA+}6T?=5v0<1_V zKz)7z&eRm(-OmDOw_&n<%K$|AhkR)m1VMR;|g z2>LgRFw3+E)lZ9X$)yON{fe+Qq6p7YijZ1Rgqq4C)O{{O&c7nKv=OYt?!{<1s2JvB zi=ieJW6%6zIIk>5#+G7K?Jq|8DG}L7uNam_#aJqMiq*EoIN@B3La$;>3@pZ}=wiWm zD27vhF>K3O9hK%trE`L zlvuG}3Dt3>SXU{bxTZuCVQXV(Kd;TD?&U_NNkiLzHNUR$@o8I5ta( z--SvHDN{nLR*8w9l<4|X3FSW}Ok1chx}6FhT~z4VONFBYRD$EILi}hIvL>n!tEGa2 zU_S1jr$VR2DmboCVZb^S3^uEfvO|R?`&8(6SOtv}DzrPRLdiuHY_F&=>xK%6w?ukZ z?3<{dGFPGP6LGGs3VmLv(8y8z@2tXgR~7nts$l1>LVG_Ib}LkP9;iY@hzhCUf>jeG z{)<&%UxEsqlSSE5Rf4Iff^n88pI}e6&R1brp}2=)QGS&Q4J9hLma4F_T!rEa71mU# z@TOXYuQe(Rs#8I$UIont6?(r{p<2kZ4=POis6x1qai3H$6cQn%TF7@H^+FPamuArowG;eR*$F`4^cllKB7%T zeNAu^dA(90P}F0wsLv`_r$i53S$jK{#R8f)K#J5ITc2o6!&>V zgSJx{11K zFRtHGv_WGPVty&{{<9MQ>Xi6iu0(FJ5-)O;Se2?oZLAVU!<5KYC^6hyiQO(r7}_iG z&{_!tGx2QRQDWc?B~o;i*mFue+Xt1HFZe@d8NKJ$H)Wc%=wQCySukQ-p%`;RW&!rvfy$EI{{L1?Y6X0AKbM zAaq>;&dnF&@f0!M4lY2;t_9fDv;g*>@{w4Q4`pgT3PSP`>XDE8PxCSFp5V-05}esX z`GPB&53L3H(3_kuxLtxp+c94-)brq2mxr_Yc^Dg;hg4s|Vsgks+C#B_H4oIxizil3-|I9^Mc`nYT=b}D17b{$IVf|R>GlN{zoyf)KEx9Pw5p3K^ zxwzIp7o*zbBJ^7hX1vRRQ&JAT1>|77(1~k>Zrmw!df+NSf*qnN0E&tj@jt;ARApSX5;6sY{V_ehQX9<4DFu{@0Nnq`zZ^?1zAXo%tBL- zEcAbzg(3P`=z1s%^{cW3t1e6MxU%q}O%_gk$rS6`OpJ`m#D2jBzGsmMn=4|jurCuA zmStk@luZ2WlL@P4nHX4?0gH?be3CPuZ7=2`w=;0_WCn~kWZ?Xa3@jUxfevjmAb(27 zioA3rhoocb%XHkimyVdz>1f!Pj=wX~@pEuGidv_`^+THA4yB<*U>eNr#9YZJ4Tp}V z;q9t4RB5I`t&d<#HBLj5ic~1$Q}NO>6&oI<;?u=cT-cV1irJ}{H8d4BTc^UiAqDa2 zV&3ML0)=%79$rnss@*C0Gd~4pBT~@0T?+I*BqJ?D%mMwAp>3UvrB{-%c&C^L3jS2{ zp~;A7nT*4=N%)hL1l>1DP?;rR!nq_I+mHlv?Ibw%PQr`-5^+nJi1lHK=;V+H|C@=> z5%bY-F)tlHA`ur`C&H&T0lA3@sCG|4*@Fbcok)Py$^@*NkbqyE1W)=?JX&PLz@zv0-IAC7w8 zaKRJ~NBGfjv|kvG1%twI=x-Qw^TKfUZ5XzQwb9taVx1(`N{{=8Va%^kyvYnjKhIEH zyd8>=J)!tGJro^!greuC5Ohck!6&B>gkB55rA;Bwm=uDyZ9_1zA{b9Yg7M`^Ftknw zQZ#~K`rJO2gYns_O`!!t;*k%LgaGYEIIgV3jQ5Ugtg(JUemTWkXH>`Wk%mIR`D zP@tG=QnUpT>q=M}5UaLOu)&DCt%gV~?FF(BF-bynVZdCVKjXM3Zx zt2g#nc_Eu#m~7&OYrDOmnBoOxOD}vWc!O^qZ%}dl4Ira}!Q9t%hwEao-NzmA^=^V= z?*@m5!alOg4U;FiVRth(T+MQY@k>`+zu=043tcfoaQz$CxZthqg0**DP`bqhyGFYp z@y}}vOL~oyPhZ3N*lQ$Be~prMuTfU?3fbxl!m7dnNpBtS>4pQEuX2EzuuuIIcB*{Y9xlfAIJDj#JqFvu|Dzq|h1enN zo*l+)w!`gVcF6kj0v*C%Kr(rOHCta`+lUuf|Lr+uL_CN3!{;d8`WzM`o@4sAXUGVD zhRr6=kh1RKy)RFZ9{Ln&_n%_)rl*)aqC!lZQ>(T{5Hq*D03J-Fh}qPb5sp5N7EWJbo4Pp zJ3TXDcQQkMJ7FKqHpQ{$rs#jr6cOW1vFYbSD8n9N!<~l+UHuTfdOyVeQWH41njr0r z2|mI^u-Q$}Jn;d3nm>SY%LDigdVp)S_o3}`ALW;Y=>P+SmJ55j%MBEr zxPjcsHxT{vI-G;A%$}F8g8w;hIx5cQMKzT zPS;#P>FF!LZ$0Q5=;3J_J-jl%4C~&PaoXV$CXTvrnWjA&N?7{-8sE6!$Z z!Kw{g&?9d%;x})`zQRqY-L?r^l^fx=b0hwgY{2L}8$`^c^;oiRJy5X@>Ic@LpmHtl z9b7B8n`_{HXbt+;tj6WTs}WJNO2i>pg)X%#(f7zobgEr}Pls0^sAf6N9$t>_HOt_1 zXqkxhuoQ*|mm<4z3A!Fwg6S2Dv3lQPtSwt4VrVQv?{^EK+PM&BN*#>ft^*b>z{D*J z#5<4qDBmz28rk!(c$PDi-sGz5;G21mgfyEGJ-?jWI|zl8g?+UVI+8;>ls@TZd&);ySs z$E~L#{+1?cn`q+K)hYP?Yck%QpNzmylVEs!5~kHmM9Dt!9D zOc{p_i^t(+)L0P@YAjqi22SFg<^!+M*gtwS#yXEexyC5mvmJ?n-ABUNbOide9f9k& zh9j%daP+)949mU_#iWTvI^jvDiB=+U+tv~G6A;y+!m{A?G@tLu!>dpn~= zVJD=o>4g7Lbk}iFJZ~Jp5evZ%unYZ)f`tJ$kAa=of!!^3VW5O4Al=>FeK#K(F6cPy z7Q4ISH@`pTb=Bc0G4DiH#+^tbu_K)x)RCU~cc9tACG)@3 zp6>kBp>8L1X!09vTDx7F_TFwsmdo1FwhAp;Xr@I5d2Q+2$hO3z+t9&2ZK#)LYs%4T zO|#FpqKYpqY1;mll>A7Obk=AJ*RBOc&uT&Uph4}8HE6?nbx^mY{|}>%x>`w7G-*!r472q;>>u4Y|LtJva!mF%=u1@n5ZWPvvn%&l0?j>ea>S?*=5^{G;pv#EqFpHs{p zj4ER5bqksDPd*#`1Z;mbXE9kaRvRc~&usG8``x+h#o`>+Ffp4Y_RC_&T4l14uhQ9# zhBS6mn#%r#rm!;?li7=XNo?-2MCNarz;5-AXB}F{G2>S;Y;Hp|TbdUo#tw{RCUy}_ zcTYHbwkV7xjSpp8dWW!f8o?~)Ngx|n6~J=R{n>C|Kjv}9m%Z8S!zRu4X4ZyYEW5KO zyZ6PN{l4YKIu*OJ9x*Pgv(pv!?|?IFUhc&5O&ytIzsqca<|U^2>>^96vS&-v?bvf~ zTXx*ahJD*`f!(vWX59QNv(-J#Ozxj#*W-?}9fyvx`=*E4oE8UJaK(Oh&tos^w01We zHFzhZm)qFH%q?ut=}qkCv<5IkUB1z-njB zW9>W4VbnB}tq+>c4sJDL$A?d0mhXvKYZIn5YXYm$8OIzN$FOk$qgc}>BewUy z5$wzBVeDAeQ1-$~pDi~V#IoBAVA?f(*($Hz%zsT!);K_yX+G^Hh9vF6<{s(9HVN;{ z@~<{KTCT;8IJIGWmb7APbT!#U=|9Q5nZG10>c2{o*L{>MeD+3i|Huo;?!S*EPaPjf z*7mp~DG$Fc`Oio#vCgX%Mp>mquU0OxSW_bLdYms&9+XPH{LGT{cSw^=?~)|h8XPM* zH!M=(lNlmOnj9c0PZ8*jucT zBpp~HxnVy?q7yVlGAm<(X1Zr-oaw;xKBj+@?M!uYx0xR5YGyk6U|&;T{|_b}%M(pf`_DExv1#MP3%62o zgAVP;>-IyIcPv;#`iO=|8*a^!PO{o3b$7lboxCFH-(*pqzhvt*H25+TO+NlWE3OgKhD&d2@ikp__|v%^`1s)*DdF6fiz@Pp3{n3NC!w!AkJ!mL*svpLmw;sWb$cS4U8pZd< zjNw~v8FRBv6L{;HCOqwwgilE!p7n4tZ?9{{7tEi|4_MFS$1`X1%}?j@(Y+V&hvw$| zq|IXfK6@!&_y@OBB*u^cI_i(Eo z`}xi}2l!a4L;P;y5x)D*G2YnWB=0lTiqAN7hR=&Q$451u=ciiOa8)l`-qzTTkDqVP zmu|ht*PV9YD?Bf8aTCBhmpXFwO($;m!I=+k=fYD5x^e?kH}1CBoj33F;6trF`EnmG zejwSKpDgp?`)>Ji^ACQ!k5&M`+CPw=nGnP~E)3=_TSNG_Q=#14EsVRxg!2MK@M{f` z{MNH5UhyZIM|F$kdxppHUQ^?F_KF0~_9pVg^GUpwPcomEn8HsLrE-s^H17Q(o!k7) z;H$d{Q_UcomrTmxE0*T+`W<E073I8Xmz=jbqu>Kvm3&}?ifd(8@au|7?s~I|8@{gQX@6^Y?=E$GzkWTB zp3uO{<}`BE8a2<_*Tn75UFGC`$$!CLRlVdkw_ow!FJJSu zKi}}6cJFv`&-Yw4>;uo5_>tSp`ozbs_{`;7zi>MIm3y84#%o=^^H)JX_^X7UygKg} zcbEU>6V!ir{)4}Kh!{gU@0djwrR(Zf(;OLUhS*dh#wnj}glDBjaGfy{1ItGubmk~%$wy(stkDRQk4E*ZF?cE;gO{_$;+A|Y za%UOCT5gOnv&Nyed>kxhjz@Lbco@x?fRm*YkUDK5>WU}g_EZxz7MdV?vMFrxO(7u( z?#LwAW6JO_mtn>Pf_oN0HFgqSrcJ`vk&{I{-(=JdpMrq6DOfyoD&9s;#i@a2cokxX zd3~nA!+#n|drZe&&*{QVnt_HZGmzMBCiXkbM9-G9go8EIb&s@xXG8eQG7*#ER&FqCJDp@GJBXfMoGshd_MW{_# z1V4ktm>0De&Ha{OhyN1PcU=m7m!;U)b{TAJmf^~;Ww>yBIo7>fjsbgCpz_fQY+Sz* zH?OY5q{XY?pjrj#wAE*G1qzZa;4*X#W`(Z7W8Jmb=e8C%+pfc?3+u4=`#QKD zS`Yu{>*2I{1Ge7SfWb>PLZ#e@l~aZ5mb(cVWoEh<&G!t z>DLLgIdBqx?~B-`rKb>Bb_!D`SV0+Uh4DR4!`|^UWIs=%Vc!|l-Z_I*^RqZocow}z zpF>R8IpIrLi+Cn$1i!aN?&kBzsy~nU124eH;sXA;U4UG90cZYQzz`9SRd~P#^J8tG zylaCAJ#68#&=$|^Y%v11A}-Sw_QUNEwAl{Pes&10wS!}8d+eNKk8wxs@iD<3kq_)K zQ|}_KnP0?O`-`aK7ct?(MO+!?fTj%&=-}-DlS&6H)3}696E9)?{!5r2DPqoUT*8kI zmm!-WTsW)C=#X|9;g2t4NN-03EOx|Sdq=F~j>3#|gnEb*eywprcQ+^WD|bTAA5PF5 z<&3*qosr<@j2+d^=-T26(k5KNq`gJ8!t)M0;19 zG;_u7W3HGN?~2}cTyeXT8(e0%Vbn=C6eqf2`aL&fcX1c-#_rgC${mR!X7A2Dcl_<* zfzGo$(B+f|S|)km$z2cRcJ{={8J;jW;facPPprM|iCZ1KFyG7ziATKfGujK1>t5L1 z&KsA=8$Ooa@C@_Dg$8eIXz7FD6MXPwrw`oyePCGWgWO*}7&For0ULes!Oa(v5?>tt z=nFr6KcuekL)Jw<#0gi<`I#R!_VmY~dH!g$@)r)1KU&`QhpkQk-is&u=KBK>7#x7B zA{O%B?*QS)1!B;KK=g76#J~JNTzwsgfWARkxG)HB&jjIoQV{;#3c>;HU{pzh(Q{8Q zmiq_eoH7_bUxN`mGz4BNLU7V91Pd}l(BWYS3Oa>i!xRy>xjz)UfAFaPltm&kClV(fMMBak3NI-Nj=Q5o+*1@hOQP`WO%#^(j)vdtXjC4F z#_P~%{Hlz`_pi}t9vp-GMKQ2F9Rrit7~E`#!QMYHcy17j6)R#zc^He&iLn@QEfxz~ z#9@O`9M-Ll!yMZ<3`&W^^XqX4(TvB`k@2Wo9gl^!@sK9Rqx1E6tZI<}C&L6JtxNzv zpMczi1ca#*aNE8!oqXPg>`B!J~ZTF@t0f# z^vpv&<>Avt;o#Zk;dgW%nw5FTd6|b}9i$jAMvB~J!ooW);>rD_(Bx9gy(7h$zfuGY zlp$)m3<29^IO8A_*S-vzl`_P?l0njeBX<kG$AT|jOE zI9mWytbp4Azzz=Fx&_cL;8LG_6j45!*X85mnS8ts%10ye5q&#fn1=b#?o)tJR)GF% z3*cx~fCv5s7%VNo;_C(2{j~u5dlX{*_(GU0FT|h2A`aiZ5DU`^akZupb6*!CPP+&n z4T>;qP7&tr5b^qUMOYY7gwaJs_;aTSxj&19*;b5~6N<58c`+&v6{C-9F)T#<|9Mq0 zJf9T9O|wMAYL{T)q!Q??DM8Nh5@A1-pfa@t6RJu?c~XMvmZkVUpcI`Zm7=SKFb0m6 z;<{TY0+UKHSJ(p&AC+Rq-%_Z13723(8ICL|L&Ux^z@ZE!5oO58FN5>-GA#XA2F(uT z2pJ}fzUk%gUSE#)C(6Yu#^uW5oN}zh*w9KeWmaOVQWzAsD?#roaj8`m z3VK%Iu2B`9nN{J=iYoBkRj@l-g^BJ}P)Ai^t#B=>Dy#6{y(;YcP=&x&)yUEl7RHEb zL{F~9nI+Yjysa9~k5|L`ay9-0R%2I6HF!}qzBN>1z~gF+5q5@=Rt>uJuE7Jt8U#$P z5p6Ny3~sK0*^wGV*wx^*cMS%`itl+fn5(J*-K>G$%NpGMSpyfHS`6!3izK635szDo zL*~LC+)#_VmbLhJt`_fIYH>597Rf2K*j-SIjy1Iiy;F;xuWNDUS1nZ9b@&&oQ;x7P_Xtqxsn>)_{Jhc;n#*qBm>2-Kmbq7IL)i}a)pRiEk*+M*t7 zJJmy@Up?GM)I-~}Uf4kO;LGaqep5ZVSk|NW>3Vd$RF79)^~emb$JUg3{FVuyL{X2o zjrEv$zaAG~)g$d&J<3`(ptw^5;`%h;)UXB^k88lSDGk^@UzjE<8$eqcaB+VFWGBUR z+XmcqX+Vv?m_Mok`%)XwQ`UgAvIdNe7fk!eIFo+K3Zz zjkuL2=94yJQ*k3Ms2brUOh)S)jac`f5rdvLqTyX5_I+!_+rPqZY@u~{qbs?Oc9@%YRt0~_Q)nwj1nH@m?k)nZ9=87@NdR7q1A*Y{1fT%#3p2#G-0o46SO5w;(o9RT1>1< zq-2rqi1bCI?;<@GNhZ=Mkp_vBDdrs|lBZbqfmlaRkxa$<#Jeb%IKBzp#ddCqZ90i< z4;kHrSdo`*Mori~q6u*#kM$z2k3^pDiM*GIeee+bGOuqFUiNCjalIzI5c@j2YZF{M zHK9=a1~Jb7sL{Dpja>z5BuLe0$`Z#pRgI?!YScul5gMk(nm}=kywz}W zQ$y29jji@-BwGs~=#(0NkEqegQjIS=g%z|}4X?Fon5_`!kGUGF=ZNEPrbZ8@#M%*|dmbGlez3q)CUe|~#%fx*18u4JNxNask z;Y`n=nKAB_!gQ8hrPumMN28Xy-Aszzu7 zhI%z%!sQ0xMm3=G5pm7$Y=GCg2H}M_pm1gb#!4FCHnIWN2Q{FbZUcsBH(EF{-@MA+0L`&d2Fch$pht?*gR>oM4@9tz`n ztQ=a8TD^LV(XPk2-*w1(TZg6xb-3SH2X%QJGIQ&2CcX}%0!3NqEF7hCbtpSfhyI)E zuzhJAyr$P7Wn3N7hlp~rhj3xr)WP&yEuK6RUf>!e2UF ziwS#c(QmCNzvqdvTT+YV!)x)lXDv2q)k6NQ2Hl_4VDYsY9F^C=HoFFAqH2VTPy<7o z8Z;lQfy2fcbTzMmBh}#5@ET0)Sp&;9qQ3ZC4gW{gaH+3`Wnnc;lB@ALpc>AXs?lB4 zQb0|?ep@T*xxrOcXcG0_;pi&-5cS}`b5&67sY0h! zRhTxt3L8gN3EQU%tJ_pz+{a4%yjzLnib~AQsYG3PC8k}eM99fXJlifxJTa6BX#~R)LdN6)4_TfluZY=we!dUV|&pp?w8j2?IFi zz6yIPga?(Sf@iP_Z5>qDbx?&&3l*ME6VnY<=-yogoj*#vd7^}@R*A!TN^}obBI2?V zy$>s4y+(m1DPK zIW`NUVG&=7+gD1l;BYBoSC-<9q!a`CmtwM}@SC5OU{YlX`inN@OOFyni8kgO z(bl{n+MFu}mH;hF(CJw*7F8C*Dy10i?#1vrS`6D&#aJ&XhJN2-T>V>wqYsPlx2y=q zVvBI?auJ3It7@Zp5$s17!M95hygwD<{MACN%qxUmKq2I(3$b~9A)Zby#F_zxkZKg7 z<)Z?yvI1;~E`a4l(azpkfF*MZFvOq$kF^Tm@gg51D)W(+n2$lu`LN!X57h$USsCVI zaQl3WeGM2@1KpE>7tTP!K48@X;Qa_da2gQ9WngZF@U`PPsxNW8-^rmln?qx$xL;_= zQSwNJizPBl2$!MJT84ESWN086#`l)N{<{>#*QCNTm*StNxKBAO6>f)Aj2R$>ueKBm zpXcG7JP+1U!oa$ahwb8ihl~53KjQvp5hiht7}FvLE!*ZmuQ?k%i?Y!sC>sw?WFv7|Ha3sSMoaB%aUYn4 zE+ttw8=QrvlUeA!JPYQdvS8UR3uhi@;zUs`s>n=)|?8SpNedsR0JJJ#i2Q=7&kB#&EHdC+mM1zi79ZhO~I$NDVR4d z1+F?NC}~c{BP8R4S2Eu1OUA7k$)atLj5D8-Ft#cQS0jb3bvg;pmnLD=@FZkuB;nun zM3|-}VzWacPHYg)*7!sm&`HGNM+w3ZO29ogaeu!v0YfJz2pcy6!(PV2wKyKlzVR4l z8ILtH;&HlHJe=Oe2}?Q-$AjXqpz^rc!dVPq-BY89e1EVqRU^K4Hh{n2}(WrYJ1!K|AVK4eS z%O@x?_BrJG!59 z$J6=li0|o+4Nu*mneB!E8#fGE?1sR;ZfO0|6 zh59VI>^zG>-_JnT=?p&hIfI;()7UumG~U)*VaHZ0lzlpdwii!fobD;iiaUuZrYF(A z;slhxZ` z*4m3NzI*U&$R3nr?uNbDZj7njh4OW~Fzv-o#GTlQuPt|Cq{j{{>c0c4leS~N>2~}l z--eexa+VU)O9`VLe?S2U>zE=*5dkUqJ@#54?el7kJHHwc?N;Nb z*D6fzzY6=}SBgHsmAIV00w-p#z~cJl=(ct_N}HEqz2!1I{3^!hxv&(;?Uv%B=MoI* zy9Co>#Pgp~i!nKG5&D`f!c&zf36`2;%B_W{+PV-kUoAlV(FOSNYd$8}&&P)L^KsaF z9**>#hmFy5G0|wQC}-v%iRNH#*=#h-pN-j#vk<>#7QQ~1iLtw9V$Hi5*neUMEdNXw z&ljd+yv}s|@|cFSp3|@-%nWyjn!zG@DvFJ#qPuJgR!yA(2l-?~E|`quhDnH8JqefZ z64q`b^m@UdIKZ&wvji`#B-s4V6y^4&(A74@N;ebObvF?X>qNx&pNR0N32-o&fVC;( z(a(51YI4WHlE&d@kugrpG{ytfSV+vr!lq#i@>Y()-J7HFe#2;ddN>MCc8r4j#YlKt zj>Pg0Mrd)|2qE7MG5o9{qW_IRC%X~Y(`E!R9f#vp`{C&3ZUDn>1~B#=hT*-2p>yzm zc-sFzq(ltGwjo2&E^Y|Ih7ZAi$@&N$r4P-F!B{hHFv4>N;kwBn{F4oY-lTyTP&fcR z%?3cTR6HY{(I0X0e%LyvA39d_Me_W|(c6<0TQh1vZs2-(y{ zjN#B3BR6-(mIs~Su(=aLA9O_g=8lLF9+~&%4mk0kJ?3w2k1h{%P`OD5C+=&b$0lvW z-D?NKjqMP1R|_3BXkp)-w#Z-CRy>DjgNbX~V9U+cu(oIox9hFowW<}IueQXA6)mw+ ztqFr=n&P@|f%wHOu(DPI-xg}1m)}2bU!EaA`&L5dP<7(rlJbmO7e$wDEH_&h9@_vuFdC!Nuxa$Kxpu>H>r|mr++Tt!R z`gNOEf4RlW-`(U1FK%$F=Ieao-D~{*wX6JieG~syq2@cv8hJ^618(S4W2PwnM_WQSVSbqjLy1ZxhVt{SM@kj{&^*bASHst{=}+`|=|dV$8iF zZ(f@1#aAbK@&{oae1nfWuW@qYV=uUJr{gaC+TJT%Z?iLBxYCKAnD5BFr(Wi9<1g{F z;SM~h|3x0s&7Rw9+40SPY`F2q3;aXPdA=|29Ip>Q!v{K9@%2Yf@{8+_^T1h0dC;iC z+)?i!->zZFN50t0n;Uj>2fmZ*MQ!JP&RcowW1IPw^&5H0%=P@4(OTZQhXo)0XC*g& zvYd~oS<1WREatC+&3Uf<0)A-!Jl9$WkI3G@2! z`q91k7F|95{C9W0v$-q3UD27(PVdMQecSU^=d}5%ZCX5HUK`##x)txQtI4Cj|C9YL z|0SE_@lAGd!zWqp@OQFXUtY>SmOPdHb9p4wSbIKCZjh(twHvZaN8Cjai=Cm@E ztqmG2J7zpg=2y{QR=QbN_U&5-nWxxFKK<^ zn56y9vyyiqwvx$p4w6F}&XUVx-6VEfy(C+_{3L_RgCvU2VUmSIqa|4@<0Zc@CQF9q zrb|XY&6f1kl}R4XDv&rHFOhVLkxPy?RY-DL)=HX;8zpsHu1VtDZ%Nh_-IKh0^GLFy z?=wlj{8y5^Q|~0{v7aP1P2VJjn!hF2^)#6MC{5OHRx1{x^Ls1{$+((F@tTcK~x&QDy-T<0xi=hrW1D-Nz??QK`HSnoAVKW?2EuU5RfS+$8hxx0nE ze7B9&x7f*iyX|IEhVEsGiTl~;xd)ilnnNsd?-7=C<{0z3a)PZ3ImI+nPqWK~XW5%t zYvzCO0!uh)!xGNhGXG0IySZ zyRa3vT$$xVH+Jl~JKOWlgU$cy$$I_qVpm)GFl%jJ)~$;l^VRcbt@{VCEkgoX!iXSt zcT6z*J28Z5PYz`*XN0lmbHkZ*Q3N}-B9ir88^zK#MYEARVwm6FSoZp095Xr|&sLpI zVEfM}viD*&mbndg$IuDqY&O^3A z=MfvK)6CS`kJ%3GC+v2+r)*-oXY9Dva~9C{1&e6&l3i*2imh+;nssXVhQ+pc%LZw@ zW9R?AW5vJUvnM}4us7d7vKwDNvDnX_+3Js9*sFJ6*_Joo7=QVleSP+Wb$jxYb$j%S zeYy9W$!`B)n{NDN&zkerE426hy#P$vrW>_kl+JJS!R&eXnb7wTl!g*5(kp@*lt zQu^1fbnr+w>if1EN%wT8=})>-{^lMurd&22T<6n z0d#hUhy}Pmkp5T_+yROvK|mTHcsGON)v_`_)0zk3Wt-5*2pRb#2KW-L|DG^Pv~la28>nw&6> z9uF8#Cw<4$m-Z8AlidW$`Z0k%9h^x0pH8Il>rH54qX`Y3Yf3)~Oi6US((VKaX^2=2 zJ8wqs+Y!w@PvrEO#BVx@>h4XVhUJq*eD`GXnLLG7WlkZ@VN=OJXsQ?=-HdGQ&FK1f zGwNYEjix*laUv_H)541BWITBWX=coz{2?Ny#D6Be(V0ct&(EUrkF%)b&e=5W=4{%y za1QM#nnNp$=hDcSx%5tN9tAngqtSonQOd#j)cw(X+P-1|1uGU%q3J@ZNL)zyea*?= z)tokHEFzsFizuRbkuVn)(`ChCx?!?}IwvflvAvfPb6!eDzn4-Q%VngxyG)#u%c*tI zaymbH1w9H|K_fe_q)iuA(&_gr>FnlJw5xs>2LSa-8K8@ zefd6mF?zpP*M7Rv+L9(5vZV4`mSj5X0C}bzpoU%t>5JV#`upY}y;*&TN=goqm58s> z^Epg`e-D%9?jy9g;RxBVqvRKLlswxXqoc=>GX(;RJ-mXb#u8$^9wK1;dd9wX`lmnFLfYyTL(Iu zBoCGI&dc%oMXgSk26KC4J%b6;DovE+FnKpfK zCeI;PD0lf4sOudxd(hzm4@!FJLD%#=>4S)!{B_uqzJz+x{VGqAefK20p(5ULnHN2^_M-Di zUZi!yi)>nX(~B|QG;M=7IXZe%agH}Vd+1GnJNQs5Cd|1VK6Ky1hq4QN=+p}zGV0+g z;^=&7>waH);^#}N%X~@t)|cA#_M>^T{OHsnKk^ImqZoxS=sx(7TVH?LH^-k$j`-7u zV1Eiy`qTK2{#4L6fX2@WprFG6^dTsKCMW`E@B099=^aR6GXp97Kp=Ve2hyR^K$`kG zkbd_FqWGynG;>c7)p`ce-25O)e-cD(I|Y-uX)xJt38q-5V3KBunAbbOl-N3i97l!F z>eV6C?Lr6@#fQ+Eh7fxALwpVnrK0(v)ct5Etquw$$FfjLd=*NvZef&1VHCYBjLtiU z(cG*s(zqQ)ahl;YX+$^`Ee)r!R^j9s9!?LH;ne?KIL+6MpzV_*X#e&I+U6WVb2B5T z@68Ch`!9lA{);3d^GK2&jihmbkrZ4UNuQoZlB7cv?H?CKu4|$w^n4Tr$3)TPswmp_ zA&Lz3qUq73XmZ#pEW67hwphd(YpJ7Y$MlZ`Mr^isI-7%!^5<~xG#*psy82bDx zhKdKq(&<^TGteRjH80xaikV;&)3uAsG=#3;=jky z@xJji#w?z0Y>TG@m*VMTVmxiDjTdH2Jay`kK=Vu!=7Do>!*&k|^` zb|T#tvDY@jz3Xu#k$k-qsdZi=ZN8aEiN6x*VZS75ZI(p3Ta&1Vy@=Zuaoo3+Nfh}a ziB{<((>J4Ja#)m1nun5UpGPv4WC{zfDVZjINv0LLDYVHXg;ran&}6F=>J*qlbv%X6 z-cBLi-zgN*HhRNhils>Ez{?PENV$bl_?_P5qoszq@8o?AQ#Nyd;B4 z4rGwAO9r_mWzfxv4C*9ezU;9Ig@m{ zX3_r9;zjd?S@d;J7WKQ7MPs8yD#@b$_p<2w&nzm`6PDiiZ0fW$n}RH}shd+aos7*U zRcSW0zMoB_er3~4y&Re|E{7&8&Y>>*a_ELb4qb`NA)~?^lHSarv0rk?w{tE%Hxx#| zoLpMGHJ5gr%cb4^xwI-Pm&VrS()Z`Nl-x2;ICOb*-87FDFVCYa%RFj%Igh4B=F#qa zVGUf%qjT@`Xs@O}I z8LeF*qtTW!`fyQ3p`kJ|$&*ojos334myweOCv{IwT4OmG%;Pj+3#XA*oVt2&dKAwo zw3yTE8=P*wuMstwMc2L|IP>LrgECF<`7&QC3cs1}1D7aNV4eygr z5o7bI_1t_~xiO#IkL6RIQ$AIO=aVWopE9fS>GGp|n)f}QzIG@eH~j+YCcFo`MFn(k zTLBFf?%!(H0y-X5K?ORM6M;BAcG+|q;D5kkPi^=j-F`aWNCad6L+MHTU z#>K_-uA!Lxnv2QsOED$3DWUE?OK9)#5=vqvbbUbyyd{dY?*YW6M%n3U0)*=5wUqKs%;8C^Ln z%#ZVB^v

G=t0NUqTr@%PS);FC!~;84Z3|M!9dxXu|I@3U60VUvz~jGNha~k1ZFD zOgWugP)^${%8BhLr{9OmDZ#p2SX<>(=2tGRp>lFeFQ=OPa{8qzr|wtFspmss9=<83 zhu_O7ww0V#b(YinK5{xSOioXYcj8wIuPtf1Il3L2xYplBmu zsZ3Om`BVkj&Q(yvQUxWgRZ#dg1zp&$pasVjq+u<-J1EG|P5j?aK`p|CyBII#PZ#cr zR6(i53W`xF=wiKsmfld1)&m74JX6qwcVb;%6~e<*(3;jtauYsdMmHrD^j1>#ASL-4 zC~50xCH0!9BurA$+!;zLnx~{eOO$kAm6BrCD@nOkNlm+zRCPc}smGLb=CqQGFNkRu zm9)iKNjKeDxKK$SOO7kO^K2g$(=Ss?Zt)zqRmDJ_4lES_zN$;1Etp198v{2E%Rw^1S ze45cZDjL>NMcQ3dbiJF3+;mlB+)G78eN<%9UqyifRrGwYiUtl<2~Si-ONOgxuAzzy zN2=)iC>5oTQPFZ^6+IZIqBRp#!q`<&J5v=+lc;DrQ;9N3MSCWxXyIfP^`4@lMv;yS zw^GwgMQ231E0WSsAK_qXHu84F{q{$+E5&!oW=|7P||G%6_i^V!Fi}fXm^~%Kh zGsSj%#P+s{?e;Yhc^COGAFm>X$k*_(Dmpb9eiV!San%?5GDtbn zP||}pO6v1cNoG%#wB(Vne(nk1=ax7g*TnhJprmazO8Tr4$D&+G*NT)h3}RZYlAJP> z6r8LS9;7&)kxE(`qNI-gO3L*V=Z}k$6ql4V%2r7>XT`a6LYxPOl=N$_l74I#=f*~H zd@Yo8VwsW#EEMP9EG3Pfs-#d;C4CyJq;ZBy+Bif>$AmLeNy67P0IU}bhhvf8ihnzmHmDA0| za!Q&hr`-}cbsiw5+_GMo7!)O;R}p zhn3SruX2JzIT@ZVCkIPWZf!27f6L3M@0@bs&x^8aWI25wP)?;?MY-2neE(iX(J#xW z@7*#wUspyoC1unmyNnEDMcL|KMkY>W)cLIET1G~C z!eP=Xqo5z9l>M@lq_;~czPgm`3QB2yYAO8=Eu{drQW|`rl>82r($~$UG<|6)SxpmV z`dCrs4=SaoE}}kYQA!pcN~p)f63VYHp~b}|RGTL3+OQIGb1k9zb0ze5e+lV|I;W4Q zdvrt{^vs}yQuRt`i>RA4L>=WM>MD)KV%jR|t~61HJr{LZ2WR0qSrt?7UB#rivY4(- zFD9Qc#WbydG2PH9rgcAxsN!i64QVQ(y(L8yoLWRYsEEogi~90-5e057qTP#y^)#u7 z6b41KxME;P=UIDeiRna;KTx&=uqXO zojJYwE~BysGP8$wQH2pcd3+` z!lV@JAf=_2Qu?%9D*6bd^n0L`wzn1Syf=CDQ=LZ!JddV_=h1wJJesm!_{_`l=#5Dp z#rG3!M$vw37VXF#qCKe=?aGk>xpdrG*i_qcsd{cM-5QxoSG(p?;kO*}x|1V(v>a+3 zn?n&!IW*#+_*|YttxR)hMc*9q)X1Uy$Jx}R%BGvi*;M78O$o=c>4Zf#jh>WER|jO% zo|f74;%OGGuFRs$lq~usf;Pt-%cAA0v&3=CqRst;Ppy$f`pud2T%Jim@tH)3{-!kav%?xrEo>fpt26>;)pwnA2$b3cybsU;O1#L2D&GU46RFO_= zlG3U0N;-8ukWNb$r_;GH>Ez!fogzM_k)Jw^&Sa;NxlbCkKaobVRcW-sB#rLqrP1>5 zsg!pkm9%83G&evPS5~Ryz9y9dB;vD|`2Hh>=G;sX|4*S@{}ftwDuwQ>P7%wCpmlMt z)A4Ka{}?*!xTu;a44a^0VWDCdScoXX&QT;3L`4u45ySu$K?D^9Te`cuyPMs4SFx~L zu>-riKZ9@nIKSP!UhbVc&YhWaX5QzJMQb^E*OyafTsf8QD5w0TyjEwoH>MqPPP^)NWHmHabO=*T0DFeki0)=L<=txR6x+3#s=y!BeL~I-*iY2fq~1 zluHF7-d8}&0}JTl`U29KQ$SIJ3+Tp|d{VlUPnxCqWE7B3#_RG)hw@2fP(D5Xm`4S| z54J4Kqxar-+AE;%aZinxjJxgmV+ zc;R!q3bxjQ9FmXDA@)0)imzu=*UD^K8k9{D>#|8I$);=lvg!VtEV^+bi<&dCL|iC~ z)|w06mUX1dtZ)eh-noKee&7=nVOzJ_Iw4{F~`M$}Z!s8hvOUs}`?ip0ID1&0h zX3)mp>7;foU2x6QX^(F@^|VQ+$mxQW-z{CR)zhe^DUCiyrqS3#zt zcZWne*P0+0QVDeVU;<%z0wsyu0uKM;Y1FlNx>zLg4(yAkKNj)Amx-shzv5`g#W>0q zxe1<5#!nwMKOz_Xzhq78vZGgE*_60 zx5P;5d1qJo&kZ24!HmKU1IWBz0Cj!rPZc%(Wa8sb*Dd^M`6z!n z`N5ASHT#ioq#vEL^P_H4{b<%7U$Q>uOD?ItA;6QrQks;osbNL{(x*R0y?g!~u!2#-Lcz{eE>?emk`)Sjl z{j{WZ9}Qo!kFLJjORfQX>Eo!qWG&xAMJxBv{m;AUSHy1mqrRJ-9p6QbYj)ArUtXjX z??q7>Uc&G4q$LiX6!do|6({Ya>ghWv>zoJe+~`4C?e26l*`4gQ-08--9i+K&2kj8C z>GY)SRH3<@3eIe!0Q+rZ_S=pA#<@}a6gTSM;!1l&j*~Orwo-@4tu$i7RvLfUg$7u; z(3^K#s5D>;Egimv+UlLjda*M}pEyy6y-qZ}pA#)C*(_K|n`zcfN9ykCNG)9)$ti6U zeV@LGww&HbXV+{b9vAZ!EKj^03aO%Alc%z=hIv8Ow`?8&>gJ@w6BPa%@^^!DO9 z(%rC5JnLEti(E@_W7krEbPcUD6P&Qec68m-j$D-N=zZ2|vYEM>s!rR|ht+}=_Q{5( z1lZ7|AvUC3v5KDPucEB$)-->!HQo5Vk}RTDQsbDF)V0xy=9*g3hI=c>-E9TAbXq}6 z6PD8`_2qP%FQWry%cxhIB?axUq_XXV&1qc1 z61q5HiO7>-Mo&!5$o%eNDs)*)ul_C~m8eBDebge-saZ%94HpX5s3~1`Fr|R63ur>X z0;(G*)@uq)M9v5kdUDd3Mz1ucMK9*ldawE9pg5l_ljf0z+C2K!XhfyPMxq}vq+1&e z$?}^4$@~qd*8l@D%hRVlTKW`!bS|Y?%%$judbHhDkLLcJL;r=%p}e7UNKzu0Vmh-) zxX2W`oT&9Nqu$#Y&1{zlUqeC*RRx`)M3)BX=u+DW9ZIp(p}B3d=-SpNtxp`Nxfzo<<6N# zJ~&=l(5e+qTUnoLh7O{Ut$NwnQ?5{en__#1Y0)+_y0_+j|VP z_83EJ5=PU_k)ugpFvn77j-scBN74w>kz{&p1Z}h%LEB#pC)e%6$@cd!k^~H+ZheN) zsbp2!HAa<&lnADO2t`W$O2;FL`Y5OQ(PJq29iI$fQRf z+7a8EqK1lGS-HI^dr~ioukA^DSWjAZOo>J=RHFM=dWg7m57K(nolbA=PD?*_ql;eM zXimE#Wd$nI*ItS=J3)cGhAB{CUROFbsjJ|?ccEvxU8t?OGhH(7Otlv}QSkCkWO=tE z^|9|rM_zWIjcy(2_nUS$;MYGkP~ji@+wU*CIPwn*obsEgN&aKi^MA21mOt6PH9uIh z^LO^z^Beo;`<4BU{K6ikerDB$pO{naN7m!;2bOr|J?qi>jybixWi@Z!uqWSNvwt05 zvo5_}v9BsG*~Kw0Slra-%ux3kyJz^6tuuSVF0FjbCfYw@t}bmXQ{+ICc|Tyyq4!x$ z{5=+#d6%s$zQcOf-e%>v#dKS4vYLxG*uYz@Y}2FbB5&L^cK*v%_V~{g_O$C2cCEMA z51?|1?HYBFX-vGpu1r7A?AbZ?(C{oW4Y?ERQ>)*SY)eNX&b5$$Z;n5Xrs(LvK*C=E6XO^;&RKk`T6tkTs zMJ&XukVP*mU_q<$*|xQUVYV@sscgw%t=qC$fM*s{-r~*^t~MW?q!Yc9$oxgqnC(&=|*x5X&-;#IWF&Xtwce6q|J^lKmF@MCxyav-S7G zSf|IKEa`a&8~rAjWqk-@{k{gW-9H0Z>mPqMp`$-@>FURdy8E)5y?oeTWpAcA`ANgz8v$ECfXsrzkmsvBDBUbF=$>l8Mf+bVFZoxwDEMcG97PCb!7P9zv3)sak z#$s>BJT|a{5gVgmz()6+%lh@3BiaqIGs7h;daMpxI8mGZ(3rszXHI7m*)&!?cPg7S ze=k65v(>9w)4P1=Hl0%tqN9V zvm^SjL9xBq%S0tsoz|Ug%T{FS1zp+AlFsa4Wk;sBsa@jc_FEFO>xZP!=ZmB~^n;`z z?u{fi{e@&l!4rvb*qn9q}Ws)p0Gmn>qu8fwPSQ{?+?HDYX zw#{E+zsp;q)^WEaSb4kT#b_sqvDSJ?q2Vft;C|-M#aKu0~S5ZbwuUNf)YUpYN!PEJlCF8-4V`&fNjmrTPtysrH=L!Om@XVjv!=%ig-w>8&zjtK z^ph@{s3om>xKx^&uw5EZ5G?(7Fj=Z?Q!Je{Q!2gF>$G&QuZ5}K8zHGA0bnXn<_DLjj8E7P99Tv&%zP6MtZncp`HrvaxN}Oc} z<95iV?B63>Hp55uLoGn&JuF1_zHfxgplgh5*ROb4+`D91?4xv3-HLqGWJgHu08Y-2o*e{pqZ#yDWayTJtSaDjWx8S@ipIw%{oN`^(W8^JaH)X*{ z>(nMo`T9gQ`S}Z3%FQ>jN2fo?I`c2G4rM=Nt!cky{^9Miz{4GRV`FE2wX!R}U8u;< zXLc8R6_vP0WG}8B*oU9mugooW_UFf42J+DxRQP7wAw0!WmDigN=S}(}dA`nQzFT7~ z*BL*aKTuWUF8wC*$K57#gZ3#r@S6s&d!xxuJ<{UGZ_ecT7iRIT$91`?jPdHq*?dyI z9uG~?=a(Z5`ES2@Txqv4Z{NCr-?m@KlU6R~lEq7Sv%UqNsBOtTCobnj!>u@!t$A%% z8y^14mM?f`$6vIq<&M|a^RuTMcppJ=(5`gkvvZvI`1mdSec)D}yxWbBb=l4%*SPcB z79vNkkr(f+y_^4>u$Lbjyq`PwILLqP_vYoEK75IrFMsIh$Jeg&=a;Ml_|&C=e79*3 zZ!iev4<#Y|$MjJCZ(cW@Z%>E`5h$j2erxkQb`Ig&raoDNojm)WIDg>pTXDe&E$8tXK};L**sxQ4!^!U zm$!@kxPuJx`Cy#_t}wNbKO9rU^9C1l%ibmYUFTB1<5wwv{JxCOd0Ni>ZddTSipwlp6K@{lt!Iz(KZj0mr5cf2IsYVYOFYGkLQZq5eP{Sv z*R$Md{W*Sd*?F#Ne1R{~y~v#=UE*7YUFOSrU*TgrT;;bvUFDunuJK>juXBf!t-QYJ z27g_AlPjj);@!h;^Ur(l@FOmFxrg07-h0V?9-;Suf7W=&XOC>-E`1(x@AgN0&xgm{ z`r#8k?9x+y;_x%RwDLJWmhplQj(90JY_ItCEw8z|%^PlG`j(H^eaEj&c+WQt{J`&Z z{>ZgIf8;ybKJmDVpLwGE3*TS*m764g<6i^5bAR_A{KvYVeDRWB+@JpAS?a%e`oKSY zZ>PU}&WFFe?e0Im>2y1HwCRAb%N>wo+!00cj>y#NguvoXSUaLK)Z;tjarZ6=KiCCo z-@2gIxhtl&bw$bw1$;ZJ07HF69B5EP*`#hboz)Gk1G?jCNOv^<>y9+{9@zY{2gcbc z;qnzFxES}uPu>&m(|X}SUN7hl?hW7Y-av;wc;e9qzhCx2C%eA*b-6Dd%u`04R2g1V z`e9ObKb-3?_V5Sw$G!jhW1;H+6h9h(ugeEw+UbF?7TLSDRStsJXcf4`tH45WFvjc| zj3;jgBX;c&OuIS+eBMyZY#NI6iK_UVrixj;hr!W%7=k_zL&ApPLPszhdl!s=B_9Em zDI;+k}3ilmGV@B&}co~mDanl%_QXh+JDPwWI$2ipP6*<=5j)Sq? zczn4q9+7$zFtBO@LPo0LO_UlW9n|5zO&w`%>Zr1qi0UH~k)b&WUfGkN*LN~L9-NHm z50jy~b_(JyPQi~kQ?a08D*T6Opdw5I$Ntm6ai?jhzBLWOCYms7)WqL$(~%lC9b-Ca zA#s})zCF-_zS#_TVFpqr&J-+}naJ*{jR1FTtazl2zUH&gB%g%^lXTFMqyvqvg5kD9 z7tIfK@p7?5a3+LJV0a!UUYZVsJzELm?hv@~Y)I;6BY)%^{0y4|-Jf${zd;Y4m-Vo7 z_FSwfo{Q-N^zq@KK9b((Lw%(I3XT~-Ny8AfDTYYsVg#9+5l-DPLi7B2$f=%(t*Y|{ zA8$U6ew>emw#JaR7-O)e3G7l$5Z+}0@?968;MM{}8=7K6xhcjBT8J|T7h=_`g}7?D z2s7o2aB%!$)I~1F(ZAJP=!-3ItiS@_do4wO z&!rghU?~)gEpe~H5@`dM!C?O~p{HJk1&f!XsBSsl4_$!~zAK>pN|=QehBaB?&G41T z^Ir+WH!E>^sWo(@g84RL70&su!l&1(@Xx{qpBrs(ahNS)eQh!4r7bR*t%hmcYLpJP z6O0kTeS2aD-34nft6~jQ`>n-u&$URoyB0I_*P%Xt9aOuohx69;$hxu~(6-0n6nhl? zwTIVw2WYf7;GFsfED7HL>4y#IzHB4(8#lsk$R@1cw+V|LZi1?zBd+8-!c}oIK00m2 zs`Hystl@-v(N6gB*$F?FJL5s4vnbCN*zMVZuXnd##~c^5X1ZWRhpjMMzZL6`ZH3KP zS4jL_@lSB!is!ot29+Di6@;eDaU15J+6E`J?Qjp;j`c6LL)&Br-WTpbxPm)+Z*qrc zi#v{w^T1a>4=6qHfP&#pJkQ>V()OKLzQz-e<(^os>V>l1UU+fS3yQOLK`DM0zJA(; zW9GZzUa=e9mG;1I^B$oq-GlLC_hOOvURd4Vi}`FH1}E*qr7!#7Y$3FD<@>Ry`vJsm zJOKI812{MQAmqCbBDVD)3I}_`!`K@$J-qQe#~Y!SyfNypH;N|t2;Hs^LIZs8qE@iu z+I$3q$rlC87pEP4aWCFiEaUs)&U;@RSM@{20zWwI6dJ)?KeS%-gXeEQD60D-Y`H($ zz5TJV!XNV6{^+U@06nb$IIjsnU}ym18v_vgH~@aV1F?YxV%DZW{1+35szZTT@hT8+ z2L!=GKM3!(1Yu=T5bBNvq5WMDW)Bfuxp~0|bqf}n+F+!&1S9feFt)3PV7_q(dTb9t zb6N;CoeaU>k0A&U`pJLuL$P^VD2}CuqIXLu7JdkY=a4YO8HFKdYZ$TxYcA?&7~I~3 zL4RO4I?fG8?dEW-h!r|bgk#IIa6IT80YlvgB(0CYz0e5stB-*0eWCAEh{TF%kyvaU ziJ3l;=vf+x>sKQY{yP%d(03$0u-Dtwb+U6hP3=aRAiV={gWNWnTu3Z!;|S?7}i z?ZOn;o=w5F_bKq`mkP&OsaR-}3e^LtxR;ZPu$ELz5}IOZ&osezNkh)EH2e{IW8>5` zcppkbaa$UiJEx;%LOQr zZntEh!^;ez3(SP-luYzll8H}lnK&Mk2|uBWp5B^?OW!kvK3j0@Bw3hin}wu(S-78( zg?`OhnAMgA(~j9N9g_`-Q8rXIWaFuSHnIw`vEXDj+MZ{_Q85Si)N(L)K@MUz=iq8^ z4my_P2)$|!CcetSSfSsSb-k%dT@U5K7Gh1lUGs1xypP^c}$tV@Mh z_O=jfx))*Pgd*q}6`|j{BDC%+LO@Cp#x@qA>S_@t3VnREQZb&X6+?ZV(9N$ahS$Dg z_$L?RKz%VbUM>c`Eyh2^5>$>Yf!W*=+_ou!rKjNP#gw3TMG2OkE`iSz!Pom&g3=+S z$P-%q5c5*lIhSH&Kq)R}mBN{q;_LNNxO^zZmF{I2JFW~4dS!^QE<^c_GSr8cp|r3J z5l6~kcc%=hU(0Z+S2@-H`aT2J5=lV(^Gs$hB%=W>SlDwzZhG ztrijfwYZWjxPKM37u4pwXHaB@c-#s=2G zC8Z9z<#lLj7A%RYb+|0p64IY_f*n>5^AYvHIIIB?8iHY=-+;)a4ft%|00WN(90+JYQDOt+MGZJC zZ4m621_a${z>+r&=p=Z8xjh9VV|XKqrZ%FNp5O{DX+-*(Mx1hO#DfEkcof-)E18X` zsBFZ}!;P49u@UF)H^TZ|Bd-2wgl^9!gsC>+%%moKl{BHJX%qTdH=%=L6YlM7LcV_! zR>d{pcTN+6tDDfNxe1#u2wunCCj5NWgt0%Hz!apIGeC-|W2ES=DaDmJQUolLV*Dy8 zYBxzS*+YtGAE_vdR4`Zsv#>;pHH}iNJ1)hN%TlP{m*T@KDRRC`q2F1CbA4nm94147 zx(wfD%Ajc=gSD9qE~|uX6yLXtWBXa$p^}2GX^yRoclp|0uOh##PF_w#C^Eq~!a~xj9@zsH2kSoWyU0lrTI68-O zv?g%GWpT_Y;kZ`Iu|m#qyoF=Rxjk`XWC6h~HfS2jQj+R{@TX1Xid6 z*EE4S5+Ke1Xf*{oSpvgsfHC$!e`ny+b^yB}xV%8W5FjfW5a?4J$O1$+gr1dRn%4j< zlmm+dj!^e3pnL_maZ{iP9{^*Y0cCH1QJ(?tpTPNlK-aEvOjMFXqAZ8DiX6j-%kgoH z9M$S_*lNh}WriG{5;>mf$zd>0j$l)9@g;KHUM9y=YdP-P$#KYDj&Mggj9motahqVs z?3ClrZaFp`kVEb($KOCXCWpx}FG>#6I5}9794cvYv}MYXkSp$6D95o9alAr~tZF$v z)QR((qMRqi^-s%@c21627sY)q%b|Hqj>uL~o||&?xg&Tr_vD!S zKs-;I93vmg@#%>imCxj`ej&%ZmvXqi7G-`T$IN$f?0zpt=?6JZew5?VCpnIPmLulT7xgyFq^|`3;r=nb+8CFPNKWuljVqymkZXQ9D(72(-|y>y1yvXK{@v9m7}Yd zxYrKxw_8QooW%V$$Pu+xj$9i#a#o1{cMCZj7RfQeSdLbGIku4;KeXj=)|89BLXH9B zXN6!qUxw5|U{8~zH+dJpgyz@$f_o!$X1UK4Hqf@t?A0gYy0 zf)r4y0q&Ln$pVFIkS5x+K$ENthu{{7cW6IgzY~Hp0Mu?2?}!~xvqJnf6UXO^cW91y z$7Tv{(G>AsjRo{ofuw%odfml!I|6DyIi`K!f+fSz;@DA+BTXE7l^n(S z9RE@|3}QIk1m`GpKS!)PM}QN@#oP>0k-_A!=!a@$I8Y?RpEMaZMav-fm!W-^3}TNq7Ot1Ua)mh0 zR0j1qqMy^0p=z8AD+bH(Qb`8Kb}6oX7JcV)DYo4fedBp44mV42x>kzj0x5EnrPv-O z`rHFj+}I|?76&Qbt&qZYfndZkDgI88V){ramMV+BwzE{U*(T_{XoB)>!I(YUgnjZR z46JNIYL@8pW18SBc(V=eO?bCKoMR>Wb(1EH(rtp$#3no*(uBeuO|bgih%av%vHxBp zzMgNy%0ptuN<|}{W;6;;Pb0>O@kZUX5rfx=e>ZEy;W>@)5aW`{a4|lKacZ0xuOh^_ z^;C>sYG)g;Qq};EVll=giO;|W;U6?$;)Vu1w`@SPfjCFA0c9f^FuYd-_WrIH%n32J z-mDkxryeuw>oFr&aCf8Y@ne5I4sEH&wpI1$Yf_Jlne|W^Q;!3E>ctpWhyJhYU~sbz zt54KnV@(}wGR3$aR)?Ou>TqU59o(1Jp@&`_A}7_MgG!yKuR76x)Z)qAT68~Mi{bUc zvTLCfUW?~mf)VUciw%MirAW0%nouivMYTBiw+1&~)?nE68kjfNz^$|f`x0v4WaPfQKqYCS6t040I!Fy^IJO)+4s=X2uUJ9nv zJP#Dq#Dx0_Nu{pjBUiPU#hB7A)p1 zTPo0HSp~vb1v-wYz=rM>X!ux;uQ$svO3WQe%pr}$T#|W|V}z|>QyG+_MqSJ|`;-f& za2W#cmEqs9GHfU*gDk2Hzju~l%IY#KG%UkP^)guYE(7~o3gtVcxY1mS(1KDimXv~T z6Wl7RQsh%9{*5Yyu|g^KzbQfP2?`IEz;8ndEKEz#L!$(B{YtR#hhSLW zEryX`SQX?Ki@GU>w%}OVFBS7}?P3HAmX*)nB5ZzCggGrm=u}c9=FCM{v8@QtmKDK4 zrwEsZ7Gd(gLU=q9?CcYTxL#CnlZ{gRt2>+%=_&Lvnztc@E4@0{N-{+O^h0Y58RjJ^Ghvj0Yi(q1z<>JuPT$uFE z#nJb|m%5Y#pQ;?3j>I=g((haCsJ%hh^cQa~4ufvyiWzg$%_k1U}Ei+LlaA$j`(B-%JFo7yhDt zCUQn(LPhYh_TA0E6U? zqwK#VnB7Q1TTK$|Ba+a%ISIP+k`O*J377v9e*KL^Osq+SUU(vm90ix&FcG7MC*sGC z1RTDa0MCj9j0jFZlYIgV<|F_r34-e?IQQq{alSAf-F@OQ%U1BWwBuplCm!ox#fiC1 z9HwW)p|e*US}fwQYf>Ck1$(Rdek`<`Vo??yi+;|ra5joXorr6^6Y&j|OEH)s7+m^3 zF_>c$gDEp&pwu%4_nt;0#IV>%bZ{2&7=uWp4vB>2rwIH$9f5@G2#nqpflTuV^i+$0%fE0O zZWVE#ig3X*3Wu$2INY_uv9Ei$VBCbkp(zXokzwe&F$`BJ4F3JXgfAb8=H^hCB!=Rs zODLuqg(7rFC~kiU!B7!c)3W#u0{vL z=tmIlo)5yt+#o#i3W9}M5UR%nq4Uo`EVvMegSmky_6o#_#eujoTG;mh96uL;;_Lu1 zFAadn!T@w08G!09{;)Xhk0_rdDz4-Ed500np!5;lR81!s6QbTs5v&L>Lzq$)yp1V*ybQdZPdm-803(g8&7*pzr zV`iRM@M$L+<97-!^iIsb>w(P&Jg|MV2kcL{gE_k6S9f=0mG8h*^Bu?)&c(mD?J%6R z9b0d0!@)hqX9l_0T=E z4$ExU!TQ%)7$>d8aP75ta8)qDwynXi-fIN2-3}d1?XdLuYJ~f(M)j!GIDANO!E9`i z^uq@B@itJIZiB`PtDx_^3Uvyr&^ON-)^n{9a(5*PyjG&T|4O7+S;1?O6=uI!fwv-- zA2?zKl=yP&S+N|~KQ6#!O)bjhm0G$@B5<_&iKlJr9e& z8evVi5$whpVS(HbBbST3IByIP?`HrlRRhRt^)X|iSZjGS7cX|r#rVE+VP2$%O?rCR z(mDsLUFLvwo&$x{*=W|Bjg3OS^wW;8`zynXP?4i&G(%XEM6@{xoau&Lh+>?zX1{@Ge^y)qq3 zHciK{-oSvV`0)|Ebb(Zf!)M0xPsA`xnwkg+D75rj!|guG74iw?j@ax zBQYBzFx^b7^F17nciV=ezSD4Qi64gk69jXtNvsW;s-pVNP^h{Lh1cI9Xo(zx&ZCAv zt7b4P4F|*FnhG{;P{FEigP<2U2m@3G;a<@|BQi-UnBQ^+98KZ-me8jpgTiq0j1G5Rf(4?CpuS zJ$hnWsuG@0RDy-92g(-oz^|L#MW4_euHU;MKA;;a2Xq6^Q-n-Qtiv8vK(vJdHb3l& z8LnML4vj9z3+sXfL%X1@xHDXII^#`CC)h3TgyWApV)*usaBlB_(ufXtpxObwmbdfy z+y3zl;eYv-;y>Kx#BV;m?LYqU_b;BL@{3QH@snpR`N97=edi_t-}tWVuOeFig(ut) z`M*AW;wyT7;{DY=a&GW}FI@eepYVJq*k*6JN7)-*+VYy8d-zK5rC#zg{a^B;sV}&j z$#Xtt{WIRY=P5Uif5N2|kNJR8kNE1gHXixwAusFqkk?IqzzgTy=K*33-Q4po?-F%~ z7Zly*(~sQZCAV(!UY~AoyY4r5%IH>pRC1lSF1^NYI9=t(e6H~Hl*`<{<`N%p<|40e zyTJ8-p69YY=lLkLbKG6;EU#a2hCg;W&HwqG;)-b}`9HA_;K}I|yy4+-?)m)~AK&X3 zKRWg(U(Am1lNQZ-9Xo`c*E!{x^r~^~>R@6SDaWmc`Y~Gr6@x2H)$I&SS#T zcuH0(kE=`J-lvlJ+Pg`7`iDgRy;CBu9F)LUO^WB==fv@#rDE^K#u)CmE1JI#i{fTk zkvyw5f$Ys;r(e19`MtODO06xt z%StD1yw{O?W^Lqg#~paai}gG~X&v7?Z4EbHwwm|zvf;;4t-1YSEB^7(a_-u78NaK( zlppH{(t6k<&pDvyMZBputA?!2I&b`V>Tamf$_5+bou&z zI{eK{ZSJ^o2EVa;I@e8~#v=|-<*jX#xpL=8Tz|YecQBd2_c)E?fnj5KV8tlD=h6u7 z@M#z~?61lPX%FEKtyFmCu7TV#wLkw0WuAGz57%z*#gC8b$rl**;3ov@OgBJ*=N5M1 zT~2r6YhQKX_5=UPzOVdGwlDR&?908+vehF$$ePx_k#)&`A)EL7iENj8n=H%uo{X2@ zlAV2jU3O9PitO}`3o>c_8Ck~n7TIpyW3t724$B6~x$M^8Mp^9KI@vs*D%rVR%UK7Ot$da0GXLp zFWJi5U1c|5NB-NStvy9Sr~8ZjI_j6XPJ7vR9bcm%x=ETk zx^srF(B0PET{m%0u&(a5B;B-)g}Ti)4Z1nzCv^4aUDHj|eXLtG<&&;n-wu-Y5JgE^ z=ROkU{evXyz7LlKxs8_uyqqGjSwBwEsZ3%&MuU+8(KP-(V!z$G(#?_! zqqj-Ar+7*F_dO`_H1d<2`4=eZ#6u;cc1B9ZX~s%=y-ASVDM*oougj2(R?U&5w&qK| zM-@wEE-aTU?@}$XI$S4VyP72b1U@tG&0)#Jf@6}%H76xkRnAJjUA`ds5pqRx%dl0F z`1_V*di^~~sY{!recV&Y^!qO)dI@hNYGxlKue*Gagvh^3I(hsjSw8unME_Fub6(Mb?9jAJ~&k``C+(JJ*MGDO6?`z56pi+ktHCEEQJKcZk^gIg}k} z8OB<&MzHU@N3p)k$FTky%~~*x#g3lNZv3akI$od2 z`d7?iJp*;w+ck{U>daH+}K*yTX{W;dSTB#AKJil;y1B1 z&YRgLeP?Dd$c3rC-O5fKbz{quwzH!y?yQgDPBuryi!FM)i?O47m}25SR_}a(Wsme` zH@f?<-(P%K-v_>Iz-d3GSnJPTr3Ek^5Xknp1u^wi!R(}A2wOTOl${?K#%8vMvGAAS z?8=o0)&-Gle0~(uj)-Pjo-u6L+F16@B#v>-c;-4Jf%Wc`$kJaYGL>sd>>!fa^}G}| zC_I(T^GIXsR;M$^c^S-hN+z2T(&bck3I0oXEU4%n7c(G z%hV}i4I+=Rv}*|~cw52_Tq|XUyo`O!E@z=Z6|A>wCELHeirr+@Om%b(GgYi*_U~%h z#%pzKsjQx=vvPL2>JU2|f0$+LZe|>l%Ce;hM-de4QyYv@(~Z8%(zQCVOXl ziz(>cW(uS3u(uuWvZg0@nN!O>)}iP=I}rSUwK+Xx>WkW#)s#ofsn=t+{{3U7cj*c1 zSpAe0M?YgTMGotNr7zg;=`WdfzgKM8=T~gy)z?g~_6_SE`_DA6dvwHS}#U202YIA;KrQns#Pv(t)ltbRe^F9Z443kp^|_B=*J&7Tf(!bbV20`YP*8 zUDdmgVqzEi)miMV-`3-u?S8Z_rytGk)t?l1_opLI`;(K!0O}|oK*4GQ>2K^n zTK{h#)jJKM@7D(jt-K1&FH<4QL4#?D&tQ_g9ZdaJ4x!sehfvg%p)@0DD7AD{rTH$Z zRDVO2`Wg%)+cLpy8#tVBa5!ClHJq+38$rhpji6k$k>naPlGJ~Xq)Qt{3C-y!dZ{y- ztaCU|=Cel%%`zV+-iFRgAqUj2g>F(Caw7qpQeVILl?DGY~ zO=&81ai2=McczlHfd*|T)}YmWrjdc?G*Z4ljV>B#l4q$VDJf5pJvW zqD%i}>e9E)61uxtLgg0(+f9p6pCm>(zZs2KM~{{$ z8m=dFetLBBsUB@zFqhiP=F+}C`t*2*KFzqHPi_(eicdG7{B{G%v^ON*7DKX7H==G~ zLgVw!h;%IGQAO=M>N#*eS$WN;(A)E=h>WQ+!K)!(ssME^@ zb1o84Y(gqn+2x1aD*s zwZ$!=FJG3>hh^qMOKeWr{VmAK-GaVdwV-`kOX*F_QkwT^DfwGiQe~ATHTPadvaQP~ z{roc8GnYe$=*cSVX>B(L z8t>phR}MMQhQS-?!Hx~2cVPnssBNS=pN(|#?nXMQy@_(8Hj&e-O*F{JkxJ7YY20^5 z@;Bd1=ZZJe&yG&i!`6v9*E`YUp3YRX(U~j{JJXXvTWFQr7HT}Tg?^26q0zfsXxe2L z8mqpQ{v6y&xVe?qO>?E!fv#lpz?G`C-RMoY8!0_?BW2n~e`2=Lg_qmNckXr?p17Sd z-)^VQMmuOp$__g4VF$&{cc+LncXIjUPMRhjbUWRH96x)|9h04;m9djtKkuX{6HiJ^ z_ayI6o@8O{MP1UoDC2_{4V|}(_9gG4<8OD-d;Q(?H-0yLdbyj<%-%zR(R)bk=^iTA z*-Hb%_L9Scy@IK?kIMY_QNhi9(l{q8FG*Uw;Uw@ zLkFo&(Oa+ryvcc$H);BM)5}tCioND7^jhA6Q|Lov=0oK>eW*{S4>_Flq0;w0^mvdj zDb4kz368!rBg&VwntW-@LtpBm=tnm-{3zYZk1P-P(SHSg6nDXoMtt+5v|;|#ZJs}E z-r_GbonlwA%%3zK`O~s)0pv7IaOSK6$a#N&U?K&O=D7g+^C^HZIFOv@29naIK*|UY zq)~!B7k@jDezgaZ#e^VAUK~VMb_CJy?(`YeF^7k-$KQvtMI>O1>L1<-z!l|?@oN6x# zKHZmaN>GU)H;N#(HiEwSMo>;+1kDkgy0h;h$V54k8fHdPf9puH-y2CenUQq)Xe51n z8c7|xMNx;zQ9`F2MOU{)QGQ$$ZETDpmD^Foe@D^c5z%x>Kbj03qNyMtntl~U)9ka+ zwC!y)#rKY(V$B#Tw~V12j~EI_j3FCo42`@KL)U)C(5~UJ)N5`m#jcAbMc-K3k{3%y zPQ+5z=dr{T<7lmV9J!mu(JtpWatRZfqkJe`k@ zr)f3uC@WN9BS0Y954O3{| zvlP18DV5Aer4r_(l8S9A+3!lF^n_GusZFH^ms07O;Nsouo<_$eq*0Pl8riN(qu%?4 z-aI9Z3>(wv_|-I;@ga?3l+x*;S~?Azmre`TrIW+HbaF{fr;YW3op(8%#=T9a*NPdG zDYWc{b2F&bCWEXzGw4)I22H5QAdk}-RP!W*?*Gf6pF=XKqjo0!XP!xqoHMB@Ad~iG zXObo|1w%HIHhj#ar#-UBa(ot5&&{GgtFlPPBa7BYX3_5AEb=~N~+bEmn+GW#u&ulV{&ZfGOZ0dD9n^xS*rtojsRMR_$PN?P3Dg7L3T9rddJ921a zSPqTO&!O{j@x3*N-n|q2J%wC4JtCJ>b#lqhJeMLIbE)j0;O`~nQe9OpWt_^Toey(q z_K#fp*gKEnC*;w1J;5AUkw^Wv=Fv9)JmP7BIZ&HNs%P_P`lCG3{+UN=eFTGVLO$J? zolkMg@@cMfKHc)pr*%oxVSuH9gN5N6pxU-NfLknq2Rv~?@ zE2Og1g=BuekRE?3BzuJ-x-ztgrcNsoTK6KVURgvpwiMCpgGKZBV$;UNH@~E+*?O#pH9Kn37_ODLucKBAW#N?`$#A{bKs@ zp_sBem5`3$|H;)#Xc{Y_sKq7pU`+`P-CjaQekEj^P(tg9N@$s^gl3#8p-%Tp=E+wTsr8Fk2l+@BoX-Gw>;MbPY$&01r`>>QI ze=Mb=9m;6Fav3#^7TiFsGIB616FiDCY7q>ZW-;WEu-nj%IMaW zGIDuTM(;nC(V7nB#04*->&SANtx-<)bINJwVqvy|qv2dmdb`U>A-J3lC6?2=f^zy) zS1$OH<#g|IIcYyEr+x3rsrq+0UFlvyZ7LOXe|!ae;qbtcwqmqs> z!74PVB#&j4RI|2{?ry21&t8@E!>^KFMpe@3v`UIEs-z`#mGn(84MWaWQjZ&zwEIyd zwZ5&S5kD(wMdvEo-MflHhg4DUxGHj=Rz-_h74@56MJ?w4Gj!H*Q8qywR}@7>1q?tD zP*G9901<8n0SN<86az)E0~HH9P`bOj?~djU18#qI_iJ~zVxVHzyMN5*x!b39pJ$() znSGx5P8}`rsiRMe>uA-QI=a49@DIc4$UmWu^0Mlvv80ZURttW~zBU#d^U^`L#(w({?E+J5oXC5*5@WxQgEj74%WApj&kcs%}uwszVCueM&+5E(+G- z4F&DFub`gK6}0rNf=WLt==@IwJ#DR|ml{gC)m2IRdMYWnkCG%NN_sFvDf+OInr)Oc z$6l;+QPOWWB@LgVq{-e&n(HfAE{l}pxLip+)+p)b1|>yoQwr9RlB&X$)Hha1VM$85 zmaZi2TqRMFlDwo!no+5w@pVcXxJOAJ8gW}$81*8*cK(Vd=s3RUrN&dr=$e6ditm?7?B<7DNwVXfu&TdhYeq z-b3soq;_IGEtynL9X!Q$Li8rr3%yfMcZC>F5yum%$^n}o~}GEB$^u|7}8C?N;L zej|jWisL*M$1@P(B984N&ND}x&wWBYnTm6N6!j<<^>KHpr+cD)K4a?XxTvpzeLXF( z6Z?yHC`Ee?h<5E0?aLGGTsvH}b7(!?7wz9XShPW0kM)AFc}-lO{zmmQ&!CM2R9o>q0PC!3D-^uAp^rL?IhlUDUq@>_6yekf__7bR7HRMNwDO8WO&Nt!Q| z)b5Fr-rrZ!(c9vlT^C%>%i=zsSCaQ>agUFQesoCmHLj$CdzJKBp`=#TN>Z0A>07br zOLsza}b4 zcbt;WI4a4HDd~%qlGa!#>Bc~@kFkMJQn@J9D_QqrNeO4|EJJU?F*wBmz;Oa+(d z>LbA^y)B-h%L-a@RzW9@DySP2Vti20rYZ%+mMSPAS3x^d6*MPSJeQ#gdbmwNVF3!# zU7?`N1qy0AOF{D{D@Z<0LHFzx^v_yBT`d%(X(FD_UJCk8FpknS6g2){9liQeM;qVP zQS*~JnsvL5>i!dB$%#7ZzrT*g)QfSZypCK8>c}juj{Zg0(cxWU4B1#momSRS+I+E` zQAcat#TesQN3BQI(NMEG8gE=jlY5B$I@SpWOD+BQTub|2)zZTIwe;(9Ed`$xV;!$0 z@48yS6sV;qnYE-DC&tO3S{l5emJIxA>Cfz1I_FtS5ze(V+@@A=2Wkb+w3ZHN*HRz# zT3YeFhNMk3bn!tAJ-b{(ua4Ky?FKP6SJqH?ehoP$iL#Iy+PSetaI$M?y-y8Y@u(pq zhZ^!3Q9~j9YbdKn4du44q4*!ws&=QEUPHJUllp&RMGv`RkZYDB|UglNzRu9U-wWY-K?#o z_63z>5?@Kfc2v^fm6fFBQ%NtzS5k#dCCwgKNx!;RQgj=^;{8-XYaUh5sf!iV_1qZbxpsVDxo5#{ft0bNR7NAOmkEDMu%*h&NSabcQ+Je6^O7>!?pa1(Y|ChFzcTUcmC^5(QnGwdN;6KC z(sD&9t;{Z^IU%JaoDS+Zt&~pLmC}X*rPNi}joDvINJrR_+k`!NS=g1jStaBVR6=Y0 zO2n92LgBV0w8^-HW@wbqfaYR)db6044i%HRyjZZAi^+0RG3EIdQ;SP6*_jv9`fkOP z{j-Q_9}C;}bP>twiYPjxh-L>Ck-_33y5Lqst40*jZ`~r=_P3B;J}V@bbA^NdQPe)TA%E58aT`*8tHK2<#xkGpvn2Ki>Um`SI+u(t7(GH6R+25p=xxaJNSVDwC2928HH~f$NTWLS zG}`n$l`KxA(v7lIS{;^3-xsA)fO9I{@0UsvwNwg!oI*zrr%-cY3U%F;LPm3ij7}jf zgB1GoGnr1@PNwL_WU|jprl%W|Y1_19YHgKFTeZdi4@oroViHAFC(((RB>Lo+L|WsL z1T$4g8^PLooG9$aL^_?9Nb%be$$4fXHCZQ8XtzYt{Fp$I7Zd1nRRT?pPN2f23G~o8 zfwcN2kmcWaa=jZ*ZjFMml^#!~0rAw@GoH?w#Z#n4JdJ!FM^}%;(V~JldbTZ2@YUmJ zzf~ORXvNX2w}O9vI+hNU#nSDdSb8bATQ6*5>1Ov>QZ>g=!g;~nDvzN~VKKC4UJQ9s z4BhJ)Lq4CP>D+~AG8c0kL1EE!a$Yq3VbL_OXEcrZ7)6uLN6|!i6xoMFk+E+SeX)rm z=tR+mcadaxI+9Q#7+isobk;kP>?|XxSTmBozlb2mBN4PcH-gGHM$jqG2)aEug6_46 zpey&oi8q9cybR$&XNQxKYdBpp45#(q#k|jzFiNTlqmJQWw0UkA-LMIxLE2%o@=Yie z9}A^3d7<=dV<>%^BxI2I-Aa_*4x!@u5Ly`|YLX!OrWHhoF7KjE!MjLj#4bvGw3B`% z?xYD0J88%JK+4Duq;!u!+V*P)jjh~4-)8Qh#P&O=^S(_SX-f2F@*B08mOb4>9!Z->Z}cWQ`+6fS z&e%xLoHmmChYggSyMg`_bAU~s*9+#=db;Jlo+`fu(8AIHQu7R;=%4H8n{*vboU%@^ zk=IhKd@ZTG)>6%%H56ICh9*p1L!bYwrm*tW^v7#8`Tki&GWjaHF=Z9K`{hsXr2cfx z)1OLztfbkcE9s}lN(%nELOc&EXxxMq6!~d6)#fgzgD%Ty-#b6b$nc}N4t|2czKqI~ zmeCN2$gS~sDZPkZN_{PtlIxu%G$mvSjUBRt`d?X0ueUCyEW!L5er6FV)-Ix6dW*>a z&_a?gT}bCTFQi+07SMmQ7f`L5n7^%pw zd^M8>#?PedBWBX-8{YJBn>Wof54}6-}n?&XdXRg(tm=@}ym6p49r{ zBwD?85}neSL>>1|B#HM#n)<_oX6Aa(gwY-};GsLc4RWW#e(q#{+>K5zaih`g-Kd~^ z0yT;Ge3Pc}G(K)T&9WFz(=U!AyEWrTOKTimQj8V8!C2}p^1o!IxRQpI$Om)Pg{s%P z(Bp0{q_)Rdu*;pPLyHrANOhtkR!$UjbqtxUA4A7<#)!NKj-;C6NV*>#Xkn5As*^zvp9a)_qs#!$TO^s+-5u*xwMmO(C=<_xS z{n3+9%RXDWJ5p;Cn2=e?loX+JACu`f`lyGerU0*9WVx5Q4(2Ain z#&sw;KeiyNKnv2*x1fi6%!OZMPUGI1(c?%nTG3xH#SRW3H=iL?^kp!;NE%GN%mrd%7`ceJbesoB@^V(n5SG2z`Mcgu`sR72MrD;qDrA9Q{!H8bpG92)dM{F2-HUFv>m}I4`ZU#6pMGA_qtxYkWT2); znK`&h-@6y(hi>)r0z^^&orm9)fG!oo3AGP981YXk=VB>TJ@DZb66Ars|MW zlQumG(WVW(wCS5tOS~7-5`IfpGT+jbHh1kxdt_bc+2}5$e!Vm4`FAG6Hl3+wjwZDl zp-J~ob)xFIoy2>(j?_1-ncnQuKi(25rtba#gaIds#Y^osWM(4jr`zR`}{ z{M!k3UONiTQWrTs)G6$ETVc<)rD@G=XmCUu`q;aTU@WT9>~U)J_g-sC4QNdU8m%ci zzZG?`YDIUG{xK1i&icOi!wR+jFm>^s)@#Wx7M1vuNmV~s<?!%w30`JF6XV)VZAbZI6 zUwFViw%ljh2KSkP^F5}s;x21Ry2Fk%+-6%J++uyyZ?S5#o6OYf220#>ojoqN#*9x~ zW$sN^*dpyKY^lvu`>pTzr-p#GGOC>Q1wy zYo}PvkCRMgc#8Pgp5(K2TK~+{^$l4Q?rkay}XxwYT3i$_4Y75yWK2hUOoFAqGU5<3RZZg zj@^D+%ha@LnSoUe8#tqy8E>s(9rG&Li-Q$R`M8{|Zd=ZJ50W$01Q{FeFJ-3_%9uo1 z%JQz3u;wqt%v!IQ`LiOHHm8u)?kr%uD4#VR&12=ya#>8fTsGGNvSX6u_ z8(5dY8ZMr}R3MhZK&Ihm2!< zVVAVTHz|`Bvbe~CjZ)_dY?HYjcu>wC_db?i8UJsv-e$s@hk?30sOD|Jtn z>O7J43~^`ChbOSNf5$QV(PLT2b{Do+<;3oMb7UW^9oU!kqnVfjVK+WVn9{?%gGcP}hilF0}*VBs)UTWG-s-xqwdUPIVVZ&T)(K9FTyF=5xc_Gj%T_GRWVM$Gk8 zA2zM60rMWyi+S$UW24cN8GrB2zK`t2POj5tF|}QpYg1?TWsoMzU))i=u-0Jz-EYTc z_flsMX0&0mQd_gk!he#LdcP&ZlD|uyb@(EQ3Hc~7{`F2$vHp#u|JxUm#Klh~AMQPr zjG2B<5_#d4GBC0e5{N=$3dN=6PmC9x?uCK=ZAu*5K7zobn&mE=+2Udi4s zN=fjlTFKbwm6A5TatXgyDp}!CBSuTlbDRPk{DT= zOAJj0Ncwg&lnhqWmDqgjD)D%vAzAicYe~<*FSe^^zqGw0xozvCch2_X*ZsBy*K2K; z>?yJxo0?+l91v!^zr^2m_=3r{&y7af-hZHL%j~|{OvFK(Uo65Vc~ftj=Z^=Eir0wW zSF+2d;gnrk!{5g94U!zS#`v3tjoZ3YY@Ee<(T?Z zHNMA7m3ihH)my#ys_2}Ls@4WyR8#Z6tAY)GtD+14sjQP)^VG?0_PW;>xk;AsomCNRg+xZVvnUY_E?`*=>`n>$VB z`%X>aw?n7$hYr*E*MwA6rN?6%2R)&@*UUG_|&>|t{aoVPcP2o zOC7TKC;e=3zHEN!Vh-s;MLlNyr8L&?>JG!#}*dz-&;y}p;sxl zFfS9=UCO&Wl=AtFGM=9-=O5knD5#t{E`7*-wmjml?vHs7!zcV~^AnNV`YC^&{*1f%J?Clc1wXF&lHYppl3!B1 z;FUfhw^H#p+jdmY+W9Md`_n?_CuKUQffyv-=F=MOkG4kd!D{H6qz2t@YWVBh2G@_bL4jFYc&D^Qs~>HV zJ5L=0PpYHXyd65Hw!`ut?XYiNdwf389(~OJ^YbwS1Ct|;5v6-m9cuws`M zMn2QRyYbq{sL_Unjt=&0(t+7s9V9t)!}HQ^FxBXe+5X+J<5G9TkL-c?tRC3@TQJ+^ z_k_vuo_IJ&7g4dgF#ezmxtAUc_UR!=UmsU@=%d>seKyKXd`U@782^tGb(Dcs)ofZs$-q8W*)_)*=h7QDk&jupd zbr2k7gK)2%DHbm?#hp{87;QQjaZ!VD`qf~396to@D~6y$2Qz&4GsCshX2>%&$CM~@ ze0ph)UE?h9LuP^b?S_iD_o4WBd?@;u48zFKVX%EN41>lDN1LMIIQMrrcKMEg(f$#r z>Sc+3TP+cB(-POMt)QJ|1)EP+aGN|5<7-F4Qqvk5E39$mlr=UD7==D1!9?sY8@pQNYR>wKu=}QN3UmTH8;E1C?9PxPC7&O(5!NZPD zIIzSC;fI}I)7u$WH#)=Tk~7W?alwFa7p!>bf^3N^lp^M7&pTHXjT?(i#bYt**H}E9 zHV*4+$Dz6Xc+6NZ9x^^2kGf4jn^hB_b#emQ8M%o#Z8y|ia>Ihb?)Vezj*vU6LGj{BFda6AwaO;27jJ}Gj5)kQsOD<>WMy6CS!j2WW@fPjG`G+ zkY6(eA#J@dWwsaE*Ly*(F%`q+O-13}srcS$8YBy+VPWGmZ0Ir_s~1nlWIi3ewPxVr zk{R%WV8dy7W5!Z%RKgq2wPr$N=}dIPOtjOQg-45Lp;R>s6TA4}(Lx{iH24UJ!ECgh zKO5G2W@D1Z988)s2cr~opx#!15WIacOT@rE{Ob!3uem6a&c)sDbMe=G9yAK);m5~$ zxa=|?NtyFu^JYGd+bw`3aRJgEFThQ!g=iJA5ZbpELSx7xyx6`7RTmavhS6fYUb|St zx-G`hZcCuCWC^SVJ8pdYrEr?L6#Xlf;?0kx$aGrE1 zj>sL$vF!YESQxCp?UgIA5-aem<4QRBtVBe`N+`as#F26SXvpwK>T`cg8@UR89*0Xk^v3Mtp z-|WOn%U#IbwhMJfcVVh}5XKA^v7{4&@M&!j_NE14MPm?j?ggRhUl6SO2cv#$F#4_t zMsR#Et}23|do36q-vp1YR|w)qhahWyh=}TL+VbqPh)h){S<3&opF zp;(_CiuVY`><6JxwF*Or{$X$vv9W>6!cY<&hK8yz9J(NuAHq-CmhcWBjD~BfzkznPZtt_L1hu}IuU_2FCq}wJ`#bZkyte$5}qp} z(JwX18ijk4qA+ev6iO4L@Ubom!!AW(ZgUiNYDFVycr;Qb z3ufKgXe>{PhJzv+>X)LiU&ItI?izzXLt_v*DF$k*W3W0t24|~dpm#n7Gn!%$-Z2)^ z!LiskJ{AqjVo@0pi+E`)795YofTyvz+d2-x#&OVdh(n=o9CUZYAt)yfcN*hhax)I| zzQiG>TRh|=;<4K^9?DfBJ~}oYffe!aI3?nwpT}drS_0-6C*b|)1gx2zfX7=B;F6Jm z%-spNdno~3-zUJTlZeSSO~gdkL^v-LkrulW@h>+KCmRz5pDa1RJHHMv{gzQ`2x`RT{2Drr}_58nPjHdDqj>_k)Oe z*GR{*e(Cr`=~y*A9XD5}!!jxzJBrh>kEi3|)pY!Ln+~;h8Te(GfoC=u*grV~VaqdM z7m|UeIfARVI|HrHXJGTQ4BY>n0jnOF*kX~18rMu*_RYkLjhT2YV)gG!GjZrZrr9I45{+G9EBaytjP?{lEnHWy*~xp*kJ1%q93v1nE<;#TLPEHoEYS%TMBlZ(is zxuPz)Fn*hhtF7{|u}2=-4aq~KeICAg@yV@0Et6=^u z98w60T_IXcD#YG-g_yOjP(0^_Se;gg2hu{p*(yZb=|Y^jU5J)9h3NWQFeEw`LCdfR z-vnFYyhD+QD=mWaf+9R$SA>lrf;*8?goUL=IJmnA9gi2mgG4v#9qEY}h|np%Px3k6tcZ3(*UDuHKw33la{prE1zRShMOohU)l z)e1r@Iu~Pzu+nU zAyOH%Yh*~+Bf}2}zTz<%a?i?e`LYaOZpqO8k&u@%e0?Xwl@=NDf5|XIO^!brBHKY% zIePSzBho;Qm;K}zIarRh!{o@ZmP35i1=SciYR1WtI8l!Ig6Cp1OOEq%8hwg5bcU%8{QX$NGFZY)a&KEt4arN)A1R9O--HXr+>4 z)&V(+jtKsvV8?tvBS(jea%c$t@9g%TfGK4yjr>vee75Rihl^1Us^AmvYo;m1BH2!LaF34i~+0$a|IJhe0`P zjRZrouVB~oFGtLPa)b!Zq~G9j*qI5YqMWOdR_^agNvGT+QN~&&9dVh&tqmy7-7XX;_PG zL>-4(mP01$tU0V43oOb}D%x^QwCS^GTdRTMT%xVd`j!Kt?ZJJ@F|v0#Zis8Lv}ZY< zifc4kyBw9`ntc-2Zg7WkOl((<`EA6pT8VXk7ZRODVD|kcSWC&`O zq2RSl@Z)4CyDOf_YcedlAQS978SWjFVP}I3T@*6Jm&@?8NQUXzG887ua5Gva{2v)~ zw#m>VKs;Y7WO%tihP|@{?{ta`eJ04T&rt?@TTwPl2K_-Y_#4Vl+e3y2nlk)uBSVK@ zQmB8D;{7WrPCk?({)QAz7o>P`Oo}aBith?3mdT|!kuMc~rxflnQfvs4B5souDgIJK zERU$AyHC>Jc}}9^({k4k21{e zAlR^iwRF2#aATj9Lg!W~($AHm-Jwz}tuMtMX(>KsmBKKt6p~$~a0(~|Eh$C6nWgyd zR*LZ{4BwTwV3B1VzV6pxP^VO!5*mWS1acu$tBd zmSE(X61Sd~?X?vaJ4*jR|6iwjZWRS5Mlg_t=^@S*w?;#{XfH2o;Rua^b*DOka;juqgf zvOsV$3xtjpW!nmn?pGlArv=D%E`ZvI0?Zc7sM1aaxbr<9tzYCr_i8>24(AJfkdLp~ z`8X4ikNEZZaGalyCm#9OAj!v<0r`R-l8=*r^U$+N*h)9^5OypNC3SgF$HdY?4{K$pJ^IYt^lnbr>xq^?Fi`0}{ATSr#{Bm(`s#x0R zV*g-K-aQvS|8k)HMzEHzZ zvG;j4a{kN48kJyBm1g5*T(;=**)SG1W|^=x^@Pp2L)e~|g$>%{Ll!37%EGE6SqQEa z_G)Stw(iJ+?~*K7PRhd9QCX-o%7Ujx7M?a|!tb`QdyizosWKCpDVeypEfYG6GGXH` zI967fnA%%#r`u#=cvA-2UCqD+E^O%6p`N|4POF$Em10m5S7wR4hwPh56Q0Jeeza+b+V-7?KKE*HjpONfEr- z6g)nZ0yAj}mc|HH_Zs1=OiKYIDNq@vK;A}d^C}tMg7K|apNz8^$yl{L8Lj3gBitn! zKTVS{U-&@{!XNr4{32VPgoOo3*b$N>Y>p&^yCorDXcDIAB%$xuL_EHoh|~j#7*(8z zGhvCCF}VCT8d(>jF{L&dzZ1moHPIM2Ia=t?Xy|E2WBbP_kuM`kT(>ApPKmjZy3 zAp*6lBGBX!0e$lbNIFHp<4riGoC(MH@^FlZ3>VCuaNKbTM^686c&LS=`B4}m4uzp> zK^S6ogyEY{7`!E6sL%})JhM=kTnoj-`cU{K2`2vPP;B-P{H-COVm>Pr17C!o`B(^Q zibF7GR|x*j2@zSXLZGK7mS2ML_ewD4i205hG4JtF%zq3TAB@QZg5j?gjBO8tuzi0J z)?^1^#-<<)n;L{)!-BvygK+c8E*Qt{f~V^)Ec&|>z70DudhJfA4c>{G$APfV3B+En zKWyA3CTx4}>%=6ag9B22y&$#b_N zw8vJ=Ill!4p&}Q7WD6!WZ^jYXX7u*mjM?2bBlyfFB<$LR5bI6wZQ2OK;*B^tVb(~CJFP|ap*2{zehvN&T!XMXtA#JS8ZKj2V^_;6l*m`1+GiCCJFmjl!~S6F z{qbyoKQ`W4iT5!p;W>IGvOcW9>Eac5Jaq-0sIS1;hULgzzFg#6SdK5}{jhVV$O|#d z4-+0QLu|@2>~&s-(=AJJOu7`Z8A}l$<^u;dF2ONBF*m5c1pCe`hUT`#a38W5>+dW= zSj-{>vPGEpW+8^;EX4f@3$g9T0{kmqfYmb>;6(ccXxA_w!_qqo(cX{Bg zsRtUaxMTGWcW4cCN5Ow?(B0~W?fu+v?%V{l-#7t74JTmCsqt`FJ064e$K&6TaX7MK z9M*Ij2aWw>5x;mW{%MZIoV~7)`nuwdx+{LyxS+!f7qt27jMq|UV4^d&eQ|J|toH%E!PITY{BP?Kzi?2%^Ja8u;b*){~<42Gca&|r*OI2ile4u+-N6d4mt@uq1I zED{D`-ta*Px+31?Y!K3OAc7kQV7|`)4Et?@_xUEsb1;GAaetf&=?@o^{!pIihtA9T z!AGMXGAjDwm|I^wY%)euoH1Tm7~|SSBPiDxiTO<t1lbE^-rX)JNMM`Z&8s55d#)Ft|k*M^km- zVWo>xS9-!KpeK^F#d|VE4;W7F0nZQJ5s=Uw;TGKybG{pbS9Zhlj@{r?p@Yujb#V5D zHnxOoL(fDTl}EK;u|NwY|GJ`ML02rY>x$YtUGQd07wGGD0o&Ud6Q_0-{7p@`C2C@% zg(kGlb;1L`PAF*C2~)~C;@g;xNPO4<`hgvg(W?X08#S(REPs{kuEiQiJ zb?V=^-srD<#fC4utg3~deDaxJ*8j|pPyWP;pGl_?{F#K0o3HrjPj7IS)CKAMh0??{oEE_jt^(d;I63yL?909iDgoHow^FwqQ=(;w^qR z`K!De{Pd;kJgx0@?rwXHzh8Nk2Nqu8KdxNn^V?nKdnA{5i~oPzxacC6T)n{U+g;$p zCFglp|8x9K!C9Vq`3$#hdxoDIb(*^^KgAmapG@cC2|laU37%+qoYyZt#*bzk<%drn z;Wa-G^GNf<+;i?BuAX#|R~|XQ?LP142Tk^Kiy7dtk(}RZRPpX_8o7P%M(*v=z~=|< zz;k6%~MN0cb}i7N^|zKw#zs*W2juI1~}YWSYx)%;~k74JBp ziuajb$@_*^@Sc0i`LAbkeyO{hXSm4tqzzL3wX}>UUM=PNZAy8XWeIP+u$a$HF5O=Zja$7E24Sv z%_zQBJ&IddMe;ZEBY1j3IJe#(#?QPCiQ)cr&6|?viwV6D9_6$CD&ousAb1L7kWD5Uyz?1v- zoWvVfdvLW=ZhW-S1ip0hI3Dz$D~}oE!ozks@zpmS`GjE(yhr3{e&qr2pizt)CD?Ms z^HJP#v^AHdS#iy`Blr^M;k+(qD1Z0SocEbv#vO_V^XcCP@p+R5^4U@o?*6+UA3n7& z*Qhk&*IF6!G;aewp|%(Q+*Y3_&(`Gw>U;1Sjqcoho(?bEtHnELcIAExJM#mLop^_? z9l84w4IYMee7Ckbzq70j|9+q~@7%o=x4iaSML|DQR_0$-y>ER|wS<099US&nwdL+B zl}Y4t)lthQs;LhisBT2xRk>T=Qtf$kO{E=oS+&sSqDubctm;wxDOFd=ah27x!>Wmi z2UK$zS1o?NPqi>#tK-JK1w(82}X{xv9 zC#u@^8>i~M*->S6UZQgEYo%JU$y^nDZh)%T*hqD3qn@hithP$mxRYwa#AxDo z9Nsr}fAgquZ`##HKZlcz!{0PEc1f>lRC6q7?AnynI4UEw@k5AzWA*JRjnd&ZjrSuB z8oeL3ZZuncv0;>9c0*16xCYl&d|&j@S=LilH;=k1;m(-cIS4OS3?fx#pHrhVT_IP5k?TJUVwlO32+iHiLv7LS8hV9~h&uq;CKH4gd z{I%Vp(N6NUPE#`3yPG8Zuf8NhYAgx%7$kB1Y$17?JyJ5uktDJgV9n^t42~>s*ucX*)93*(jeKC&LuaWACTye zIwG-)I4*I#aY`~^;5o_bjTa>eCoW5LdR&)mTzpHiZ}(lvO|^%T>r&W!B-fAsmQ3i-igj1CW*5Y_jsbt#GWD`{EYwYdeQ55$ z#%6Y6F{3*()zdEQTC^6sJ4}aNxZaIbZtuYY`s%U)r}WrS|6a^Z$AIl`=)?4Vjo3W3 zzARDRk5zb>uwGXz);W_rfq{7chc_^|WGp_(*ns?kILn z&6d^6BrM2{nDu)*b}8AOO|^DpxHX1#+~Ld|ja=F6qhr~eCF7Zsh8ycr<<1UIoXBQ0 zPhyu-CbJRNUTo9NsjP78bXMKlo8=#v$pYs2FtgTk*r^glZm8x%y&-^J0BX%%%+C0t^Gn-!^cqe>~I)sofOVG&x>FkhDNf_za!cC zb5SfkCz^RIk71u|Vp(LnIM(rc9NSSE&+e^DU_%@e*|IK4EahGjtEx<9^;=Syd~7O< z>7K@BKS^Wyigb1&FoVr?&t%W_ve>K_S&Z+_W*vfan9HPGwyJj?3wf2t!uIB~^&th! z)3cE28WgefuZq~Jy~XTja0%Nmsg&L6RmRL;ma*l#r7U%qj8(YHS*30{%Y0hS*3?xn ztL>HS$=E6us8h|_Jg8mb*q-xy z*yPN;?8XA|4Yhd#EBe~No*!;x-C|YDY&vJ=Mqqlc!QP5o(N#MRFt4!(+0(9v*xcKP z*pZUMth4_S=4^eGE%d`ov7Weq!$%KeN2; zEzH9H3oC8)mHj&UmDz*~Hru%GY*vRK%>LXD);|6x+db(Q8>97`?Y{h5U}XL<`)Plf zcaMK;>WzOa+r1V2sA@&-nyo3`zcn2>-StI@AGHBx)0Mn62-(39#m1kJV-?%$Ri z&$p!}Gj)oLRj2Mv>Xhu(j{a4&qq!a0Q;lDHdV8up84S`Oy9f>Pc&qyP>JCgEHN5QP>MCyT^DC2G?(qozwoux@{zG{-)^v)ExyED~jccF`Gy3m6QLd?3- zh3KwS^Rg>#chw?EsTRF#rA=XTwMl!wHpS`d(6>!Gc|GXV{vH&q-;>y;o^_aZ$S{zs3zXX(?b zz529HyB955)r(xt^rG$qdefDl-n8>xZ_=|hpyE^m()(aQfo_81CgM+YS{u@sIfgW^ z!H`zy7}4TYM&y3li2C+7re}f1lrCaeMq2fy!|{EIz3NLPPW|Y6UO%F5{m6exe~PK< zPZ{balsM0XHmXc$Lbn0bY1IHyog6^ZjR(?$tpjQL)q&J#K8QL*45D!l2hloPQ;JSD zrGz)86y!XZ=H?BiAtDav$;2TPDH|e~3_~c(+l<;M%xJcTITg+~r%R3I^j^z?zWZ6w zhrMLuyVLysaq>ZA&H=}5Y zqYd@U5b;V)Hbi4=sW!uwI={6gZ;@_0E<>>2nk3Zd$fz!zQL=apd>x2-q!Bf~A{sl| zjt(W;QU4cq6u?GPRl;bx^kg(W9A!_pW9;d`1AB_IbfB>j4%BqpfwoyV(&r#Y^1kLs zvO!}6A7BirT^u9gJ)KBngA=_u=|m0s&a~QJ#Bd#QrW|b->bls4*6eekMh#bb>*Got zYFtVCpDU?}7_bK=W2v-dEP0I;Jh;qpwCeRZy2HlPa1l4Q=Kgrf9y)=l|0n6J!=ie+ zI4+7EC?Ez1Dxz3m!`@?Hp-3vIAV>%Z0#XV{NOx_MyK8qR?0oGOTTHOAJF$Ph^E~e# z=ead^?#!9HbI#1(^O-aU+I-c4O8d$YBrBqn@u&MIW#JN4wc=SLrnwRspm3x8h6~C#_M^|(1jk{Y3}a%WchbKJ#p})>@rW%Yx1NFYcFa{_TsUo zUNqBi0WI)fKpxu{a5m5a`Zv{^c8k5qq0yVp5A>mtu|AY>*oU<37SbK}h4etPkS@Mj zNNdOVl3$uHwW{+av7sNe^z$R1Eqbom|_WuYV z>nV#!TC|87ZY-h>rh(KiB#_K@2a@j3K)NzHh%yU<$hba;s*Qt5Cn%U)w+Bk=|9TSBkzE#VBP zFcO7@5q5`B|L^IY_JtmfPZimK+^xyKPyJ8&tDi&#okdzMmD^HS0u zA4!8UBB}qGNNUwFiq5-6QJf-*+TM+#)IQPF7!XZ;Hb#^E>u7SfiXr>h7&1E;L-&8i zQ2K;e&M%Cmgj2C}q3tr#<*}yyOPA5WYs;vM;c~h+Z#ju8my_ka<+Q;xj@kyqk?XoR zN_iGXC4=HAdr3U`ZHuSA@8apSRRXz1C(zM731sjkft<#yps=_V6mf6`xqn|lX10lR zbwwftYZK|=&qSIiBvD3E5^ZKlbl_JKZ4iwdxq*1R;Y4rPP8u@oir?Df_ z>5oe~9ax%9e#LyBv+Ih^r&Gt5>6F@rbLs|UknPkAN)N~&mX<-!)fuFFD1!_dGN}8H z3~FbTN$*By(#hGGoEMo%_9dD0d21#~&SjF>^GsUZDvJ#IWzmX>S#;Sui;NPp$h9ns zlJ;d$`PD4i@QzD|Y$_j=O-a+T$u%IGx~FE-rK)U-ugRuvH?m3dF`G;}=TOn$9C|xF zhbAt{q0H1As;SDM2M2Sg`Faku_>e=tJLJ-ffw^>g3TNE;=F;4xTxwI6OI!Eka?W8c zoqCx|q?@wQinB#w1gFsw!V;ly)C3+ZHma%tcU__izsw< z5iJZWqG?%0WUMNpru{{vx>Q8dpBM2yrij9O6w?dqV)B^DS$Y1&)FQE%CP|AaYD+Om zju+FKyT!EbQ!$mbFQKGCZ^ z$!S0-B~U5J=kWOZC8eZFFQtO=QVQ8wO5;wK(znJ^TK~C}rneWe$oy0UG zP)sR_Vmc}o)0YimGCCxtq1VM^{ZdR8|B0!Cp@bd{me9sY5?VM{Lb~A+s!o@Xc^Ths zBu!H&3Z1S zv%jP?Mo&gka~VCbk&&^Jj2!%B6tY}KarrV@rjk*>ZW-B~l2MmCGP?9eMk)VzIs-Xv z9Vq9c7dcfp%jvtnoMtSSQ*NG|4pzzO<_Ehi9igN{Q5sCws4QdLLR&xhu-43+Dsol$X=njpa1;U^x|>E~le6%IR5CIsN`zPAyti(ATaN zbl0qcc34&Lez$_mohsPsz zypN|jR>^s@m6Xv?Ni$wl(w{Gtw7NwVjpEy=5*8S*MJTvbI^xAJobtH|g?6|K2cMaFkI^W!OJ6@I9q0l%xrn{z-i zyH!(#Nj0elRg-K~HN{V;CWo2T)XBY?jx4Mu|Iljs7+X!zE34^IUNudWRa3F5n(8)I zQ#0p_=%bqYoUW#xSE{My-D+xlQcdgLat2~EKW?F-iuNipHBgbvL`BUODw<`jqGDSW z9huBoh_h7m(OpF!d{p!xSVe~-RaBUuBKvd|ea=@=iBv^Bs#GLhtD>Jao+ z8>`h+zeY_THmT_s=P`cUr=|y5HPswdQ`%`Yjk}=c3_CT&+~U_7dH#>pbm6(0`n*+> z?egFBzTG)vsH=ufchu0sHX3@RqoF5%)KvFfO=~{$clVu|Okb+$ps8A2rG5s%evpnzqhRliH5|9z<%IJxWdbL)CP`TuqBi)bz zzqGZQh_j6HnpJf2y^7vH=fCBLDl)juf6rHVKXFDymydAH(Lv5d-KnCl8+gBca)`~@yRMmi&fFyB`Uh%ucGJkRrJC|MYpG`sAfFRdo=GyhVXm)^1i2siu!g@ zky@8O=XW&)f8uP`7uEFkel;20sHPEh)g&C_j8@KSHQ8QGU)NOAq4H{4R#Hv9vv}GS z)npS{P1^%`f9F+AAuiRlZE7_=w5_IARy+^$YU5&sR~?;VN?Hyx6@Pt4OE1itNO^-_EL{;)E)y3a_FHzbeXc=WN*-oV`R<^v0@+ z%KKN*Xrn4R+P;c}zm>G{VLw?L5&wGsQz#Tv0W7; zl{f9k-pwxeeXS zZD|^}srH<|`-j`ub==kpiToPp@`@Ie(`wG>{VtT#M9%AtH!del$8tLGyNnLM;r70< zjMNu6`w3+FKE>t}KsZ&OAy29;5UQ5kJ-T}EfVD(PC2 zk}h6XQq6HC$#*NsZukK}-0+|58f@_5UcRko%l%TqmcK zHF9d;T&c%WIo(Z_(}{37Re8!OXu6zCN6G2DDc|oXrw`v{6!BC>cdyE5++i7IZ;{bS zrHsC0$jBg4M&=7-WMMC(9;0ORs}J|t+H?Qzo0RMyOXT2${Uf}-g^Nrk>m5AwMl9(O_iRp-on8dbXa_cXqR-MGO@mnd; z!%{kau9R%{a(}tHlzwEF(v-+jS~vW6lonCD#3EYiUqmNn6j2B3BAQ~vkN*}@{?kG# zyHH4qy@ixhSx6!2g(QR&(m&@y&burmUt>N-(J7>?mj%?~N&!V3D4;9V1=KIIfPzB{ zsLG{)j*lszhTa97FI7N~p67E;Wj^iP%NgMn`81V}k$wc`(<(k@va!ym6Na3P^(&9I zKg^>}r}M~nYaVCI=W+gN9{uymqn?xUXuyCx>eoJxy1vh)&)50bttOWWRk<`dBbVL; z=Th#hTr#lECAmQ^>Hf%}kb60F_*f3L-oVF!1)O)jG>7tM=TPO?9IEb>L*l=D-1wM} zBTr{j?=9JMyEvQjqO)nRM>ZYi%&e)#*>vc?EE@DAi?UB=QT^sD>Ry~hv!b#ndQKJ< zjLjlN&n%Mt&ZNu-nG}3HlZ5q|q?4CPSdvMhPMOrkI+H58Ws=F)43gc-px?C_G_N{? z*00QEyOOoko|YQ@iMNx;8tVibtoD&^?{@ze}UW z-D&hVe& zpv|jR&@sOibi`~0t$Ub2k*gBO%rAjzOcQAAgLtY^$J28k&fhYLrxA^DWL*_U-M!-I zagR98|5;Af%H_1neL3~eUrxbSmr)g;6FKO#jIfNzRgvT{FOuT)BRLOl zDW6MPNvr_XySw=r2ZaCPxpk9encoAGlY`mqY%=o3ZaMYAyn2mgfsmY(~8@>oR2 zIxQl0Du7fe0TenWfK1-{lXjgyP4f1qUHbmiw$6`cX86%ETR+PE;7eH>eQC);U$Qmy zrH^$BNt&^cOl*mtI`E%)d$GLR(s0Y<8^PmlbJSe=;os7lqba0A0QS%(yx@8XOE}TO%yUwA6le0-0 zKbw?;XH)h)H}Vy`QU57!bnUAvg>Q1Dk6y0i*U6RG5f}Q$Szp%XF64OAnP%rX(^Qc& znZ0qM7b+*-k2sNS3nx0h$C1VbI#QXTBRxJni+U#TKL;&m(TuweWLM}w7UV$R-pr)k zs+lz3c_zL7JA*=Z&Y*hV8Dyz9gTjv5Q$>_L?J={bgID;vAZgPn+j=@VKjhpm@ibaL zaT<+$&({%APo=KTQz_uj6k4@y3Y}jtg&wt^LQiTZ)3uPvw8LmJ#htd}OjkRq>u*P% z*Cx^Rv`J)ZHHnJuO{5Ej6X}QTMC$fp0`*W%pbk?f(Cd%msYWxNqMgQ5k6%RFHW3Zw zxU|ZaL|=9ZL<{*}Kpg~<)re?qkcd`w6H&ntTh8^fC5xW6bo-PI#mCr?uBi>B){Ud* z@#AQ``8Z0uGM08HkEJVv#?rm|F?1_!3>_Idh7`9))BLQ_)ZThDZD|-q<8nvQUOvxn za(^T(%O6SF(Ie^IgAvrVa0K-oJA%v}SyQJXYkD!(n)W=hq9sLE)ODN{ZFn@C1{V#d z>aoM=&%zQz+P0?p%)F_)05czp4`vwK|9v>pstQRDCmBo8fxi0msuf>@XiGOb@6wG1eCJ>yf^d9`)es7`A-=B{jVS%|5vz^@keNX_P5Zl({G{g>|a8=vY*23 zh95$y*$-h@(05_q=4PSayKlmZk>7-xxUa$k?HA$Q-_OFc$)ANYIiCda`HzBK=Z`{z z+Xul{@m{FA{Z247ekb_&z7?|9yb%;nUkjy!UJEf{uY?IZUJ746ybxrgUI->}&joSK zGvUq8r^2Z5PldqLCL#6M6CtbR6CrlmW5Fr+ki90qhKU!5JuGB6~-Fg6)fi75p>FK3+Ha#5|Vq|5_);w6xLSU5PIIN7ZQ8b3unBp z3;!yw2?H9g3S)b7CfR~3f^pSl;nUqq!oFUYghgH#g})USgq%Bd!ml26g7^IM!q&2L z!n2!ah0fj23g#YXgn{zYg3B%C-3;p|@~Fk(V=qE-m6sTGENs}b&usu7k)9~A!WI3Ogw*)KF% z?ia={-X~=0s$whM#KZ4)l)ZW96~ zb5_~PErJi*ESzZGB=j7;N$`)_D3ov8AROc01l%=WFFf^ICp@fPD_pp}M%ZGoMo4g7 zE!Y;V5?-Cr2*oWmLf?sMVPm37Fg;K$kq8dKVxe(Wso>vGBHS@75vI8o3+oDs zgl{Jc1^TZ*h_fva*2U%vr?=+`4bO9hr+ssUCkt|f8;Wd!UCt5|?XrZxDVf5clnmkF zfpnqg!!*HrPO6Z9Iz?Dzn=Gu}mM9dPt`GvG@j^e{IN@UaGGWoH7@^5KT5!D_DQvP^ zD!kqsF7&bp6ULN>3PSr3VR&+|(D_}UaMyQ{Aie4@*i7*g>h>)ZW?A?MHDwC~{dQi$ zg2efP^z~fffVYQm?&2Kb{Dj$pcBiXQZssBcNt}d!I*!7{7zZKb$qeE19D5<+6bbF8+X_GSj}z_=7%Oa3j25DFM+p|oM+ldi ztb`Ev;lkGwLxp9dh6vBrSn_Wc1_^7^ErfR;%!Q$T{e^{>`wCeT%mnrJKEgI*6JbYT zZ(-ffofcs{s| zFtqnPTW9`>BG&y8eN6i)3i4?dowNNSGVcCSb z(anHIqAL^bi_ohaXr$d)(P`sTBG>Q7M3=4~7ERvC zMB55#L>+_oivsNSh;|w86n$ylDjIQplPGA%dXXf5jp#t2MpQqsTJ*YCh3MB;g{bva zsi^(7Qc?TdB2lY=e9;fe5xp|X6m4%>DN5z*O***7h`O{67hPsSqWoxI(WHT%qR)-9 zMQf#wBDWdSMSuTH6m8jSEAj{(CDJh+CfZqVAzD~qCeoYKOLXe1z9?mDCz0UaM)aq9 z3sFJ&7u!LtUf9-0HrR?AF4_9nAGf8w`)#dFH{042R@=^NF10OQlxbV54!13dpJQ9$ zDzbfO+1GYa%eJ--wT(9J5nF67PmZ+dzP-JTfv@4Xg&$TP{MLCuO|WZrjYavvnz0XF z);P#I*Y-Xzu(s&-q}r;Vp0(4AV{4~sa%y*3$!eb-(bPV1*;c#pK~3$5$Wyhcf3Mbx zi|^M47{9Llx}~|cze-0tq^Ye|Z%7yI^=LzFOigd?yT5(4)20p5#upCPW?mhw4KWh5 z7Cv@btg+WxzHrhm9pfiOfk0)Tld72siOL_v_JirbAdV2HL_sq*A8S>)|PB72DATW3}w@9 z3}dnWR;=KyHOpTyl11x|W_FS>?1%9(%|3>>vyGoTm|gNb zc0|{c^)2;cAw9gAbhQs#J=m8?_xiCA3SefZ7BM&lG11LnR=qHUJ$x3*T1SSlF3sWW z=gOt*bn7U#yd;|Gc8_K8s%7lFc^vz@HJ%ypHGiGC7;=o0!9v>f|z`Q@LzsZXO%wkk58>EMNwg3s|V6kZqq+ z#2y$HvwydWnO*8I?ew&Ed?FVAEdbNakEt0Z-<}xOKCSyjM%BYtb5!>wt37ZHt6dnCf&E0y^P($hK$rw*~^jKl2P#3Ss% z?;~ti?NJsUcZ}(cI?hz@k28a9C-^thCmGC7v9}LTu{NsHti9(M_SN7lJ9p(Q%Pu;{ z2G2Op4z{dgLyy$4{KO0F@|cV4_lJwD+qO%r%i_!IOW!N(XyX;OyzDB|n|+PRJ6>mh zPhV%Q>GdpMxWTr3y}@?xyva17x7hOjx7mn$w^_aN4)bxn%PzHRU;|Dxuz=)7mObVk zD}8s5rER>==K4Kg-FiM``>#G^;|m_KZId6fe?K2H(cUM_Gpva%?EjR_Xn4wc$eyuF z4$oPL&I|UU_62i_e#w-BUa?aTUa>pM*X*j(8@996TNcIMGNYJxY|Wtetm}jKEJ*Qz zsb+m-wJkm|?ZHn>9r2kh?$7ybcfPQ-C107*)Nd^E$2YcRM>9LO=sUa6;|JS)@dr!H z;Om`_`^65t{>3a;{bs4|f7rpcf7x~XWmlvAV|&d1vAEm+SjqGjn6s({+VWV2opW?x zzg-7cTDOFQUrX$-ZHaFBt>7Ep3M$TPyU<4$Z{l_F`-(39TDHcAjMhAEy)`zB=DfDz zHZXnG2B#*p#e%Z7c=Wz4=Fez{BdglM=tn#Fy73r{&FyitMF-sW?0`qRJD{OmN1XKU z2vu!IEbiI~W}%$hcC-@~_2`VZk)08IrZX=0>4HIVT@Zb-3pShU;aZX&US89~N6W5w zk=7NLZ*|4`;oYz#yBo|JyW!+Weaz3-N5cbsIFB{Jt|9}pcwzuMTSG+i*c0(nL#TxA zsFZX^&hzf@A8&*qG9%6fGeY5n9_T0UfsHSFz<6R$q{@5Z%FCYUIz#|+8C`eIyqU(TiJi?~7kc#LvCL|pENi~ahecU*tWJ=Y(p#^z8)nxpc# zIf@JiAUtFMk2M{D&z&q#<;P=x_F7<%?m+aLKM-kK2IBnhfzWXo1dG*!IBSi|G)tJ5 zS>n$NOPmx9Mtsp=7~LO?byh>rCw&OAuMNSS{zK7g`B2!O9twY>VF(Es2JhNop!UPj zcENBQ-#Q#2zd8TS(F!Y6R%m)_1)5-uG#=};>%KKE4j+LVD@UO2(ggMRyfLu6H3n@g#^TDdvB)|x76ZDC z!*0KE7_@U7XH$$r!z>#ZR@y*#VFSmpwwRe^i;>rCp=&0>$p{f5nFy`g3CNx+;Nw~W zGd>Eu4GA@cgsZm+HwKL7vB%?~Ix-#s9Veih=LBqDKLH~@O~Bd-6Y;lzv*B({#Pa@= zAdZ{_C7XoYHg;Gv#}1a94|nI49hQ%sjGyU~5q5DhPW70A4uMl3+BpU8Kc`^+w5hNc zPlZ{-R6H3l4dSS27|5n!v+i^lx=u$}<#cRmnvVM6_IQzCk7vj2ajD}BteQIm-m7My z#j6>RjGBq|DKimqdM0YSIN-y42k5PFK+o3>ocA&duaY@8?$j*!b#}zhxsFKDIO64V zM@+PK!pa0EY&`0O+P2P|4dslAa%TiTbcV?w7aWdsf&D=j)c$pW;dEDc6}uw0-WBTJ zZcqofA!oB2=6`TQw{f#^AZ0ctpPY?@?dQPIZ4Uqa&OyPwIat%*9cx3~QMA(?3%|Of zr{Dpk@p#13eA{6zdbrJnk8&;w8|GrQ**s{1<{@XxJb1jHhmNB;S1w^bk7=HdwJkjH zYnms70#D9}@WiriUWl0M1*b|cbieO~(|s4fH)sJKY+8UBZx*23${SZ=yzzl^=DvUT z#&f|3M^^gq_&*<*w_1q3(-*=re<5<}7NV|`FTT6@qNCIoZR>sU#?TK3=J_F{!VfwP ze#kWT$7>&d2pWIHJoJaSFK5mL1R!H=0OmFYpzDA|*c-G6v|$mpKU;)W0|PN-aUeoA z24eYhz8x5Z$%})~YGV+#Jqv3D&j^gYon*Bxi=<_|Y)D z`xAy1LO6cLhvUw^aHv0qW9IM(G%Sh0?2QrF^&|qHO_##NdntyMFGaulrTE(=5=Uo6 zVsUOHz8sH4$lpjDv*q!)JSNwCR}`#XN5Rx08ejdQv8yT?vu{S@j$RC=&5A*Jb_^~b ziNV_+F?c^J7Pli}v0-B@JRim4Q?F%+a$kn};$<*7vkbHTErYM^a?FoejYY+8HJw&M5)SSqbn#0yce4!0o{+ z@Ya6?o|mt{smm*n-#QT^#wX%%Y$B|;BqH}=B93=Y!ehrIJkLnN)tV$|-X&qSc`{yl zCiB?vWSl;kj1E7OG1@8xQvy>krXmF$FQwqD&Ps%gTZuPeE8($fCDzohM19*-&Vflq zQ&cKWtV>1q?Nkiyn1+KB(=aeL4T&4lu;)%1UbId}h*>)B+NNW|oOH;;)6tlnj_w-H z#j8n&|J8Ivze-1J%M2_w=G?n685rQ4f%m}~*qWLF&+-h;Dab&)Gf%wkJwD~D$2yrb(ye6CM@bR(dkVlp0~`xp59rA9F+x=Sy?z7kOkMo zEY$N@^_iQqu={8h+TG5A`}-`2TW902NjC0}&c^#$+4vNYjpr+}aZ#L&^&7LX^l&yT zZ)D@<>ufC3$wAAWImoukLG!d6czfqyPfQMe@c8+W8h*S#2MKjK$a%!mH0N-xU@qqM z&&6QdT)cPA#ri-Vcb}MxXFMK1inI0JXmjCtB^NbMbJ6x!E@tZGA$dR^R*CX(z$Fid z0`stcMIO{8d04SF57TP$(DEXW?|+mBw{LlP(mo$Srun$TnE(@JR5n%z6B6s3$Qn*049|Mh~Hko ze?J90M!x{Vo)=)&&jKvyR0wagLO72q#E9vI(Df|D`LIHytt`YKNgKGD2~wE^UCv5STF@$UbGa$Q=~YVC&ete6vs7ESZT>&2+sNF&_#xuJ!O!X%P`(bhTFEBRXA0KN6s=hdCIV5kqpfd zGK@)(VNnKW7#7J;s+6H*l?=&SWboc6!;r%=ygnmC)m0gU1{vy_WN>^Z!=Yvw`m~TE zs=XY$^*M{gSPoqaIeJ*h(aT1TPIhv9m?_7J*>dDAkV6zG$Ng|QVwTJCEk%y7962tR z$hi+EN2o>)^+q{P?v&%sK{*~Ak>kc0IoM@6B)8<4|3Ho|&*hv=D~IDZIj;YaW0tN0 zdpau6-arAj-U{URQ((8H0_Qk0<=QyTQ=GuBPg9`KQ33Zk3Uu;PaK4@bE{heo6QRKD zWeOls0mF0!d~+43C|2NvOo4k93Ov^+@OZrf7q%*}akm1|2Nf84i1QhbD-d&5fj<`& zNVu-RliLbRystn3XSkexq2TN*{+!PW^!(2A{i8q&9VPCyR$_ApC1+_W(bZ6i?LCzc z^-PZFME?0RTlew(rd4Az} zkL9wMKP!(vvw}anikG2?mt`q0(|J(Sm>f!AdMualV9?HaG6 z?nWi&tMc~YbsxW432TiK`YI)!aoud@I`ZMV`p0!9=ejd0<@)Bje9v_{h3ht#>zJi0 z@qp|63)lVk1SQ_`wz$UIWFv2z@NgyihAMG}x0yF@yT=PT7ifVJhj^RnyDQ=4%FE%% zb|&fZaAQN051FDbC(oB}sbC@}J{f-}uH zXK0TCFSaST9u&}Dt$<#Y0)OQSG?pl^m2*i$GZg5NtiZwL3fM;~a3(~7aRCaHE#UXL zD=^4e0WW(6k|rroY^y-&NCnb|C=h7Q)0rsn(~z@HJM-UO8wH;I$NPZqayF1oCdsmFT7sSv%B1YhDG1jl;Hc=tQ&s;IOB#L1WE=IeBVtjBB z3Xs zp0BawJg8o!c-6iX3BOA4?R5!)8%uEJLJ4{vDuMU*5{OkL*k4?N z3n?YI9>KRhB{<+z0?GIi_zWvSFOw3S>sZ3a^TnL4Ta2WJV!S_Jj5*q3Y~Eaq59P%e zlvfP5_+o?ybB2^hF_ur|JgHH|n9{Ep23?DB>%SrtzAJ*&y&{~hD}s}jZ#NZTL|GAv zvWsvhwg^1}iZH{KbEYN~A!%q4QhOC)dD|j*e=Ef3CeBN~T8P>sg$UxDXwT?LM|dKa&cKN7yW+aAmnKdR$b1) z`C87cUYmn2#a!a~zCS-Vi(ebV)0pO1(G#%%mOm5ubB+4xqT4WEo`91P2b zjz>1vQ#PUoW<#o%jSWAtu>ElsHq>Q7vM&ouRauyjlZAgvv#@Vo7Q7~9fv-!5m0h#& z`$s0i9%tebXLI-4n~Bh>OsvV|$6=XxGbaGC40a0|y&2`20);XTN3O zt26@@i5aj8$UrUUUyT`&fwes{(CQ!OUOi8T>QXvx?oUSxRXR+w(qR>rj#0DIF^G?+ zy7F<=8$P~@xtoU18`I#qJPqq7r{QLoG`ww0#mmj9I3Je^=@ib#(o4nF#+8_{c_lV1 zUx}A?E77gcd{cpsgD9ph8r-Y$jnkdooHDjA!?lF>9a8Etfup?5I}|CJ@- zdH`pm4@-j8_eAVJo``C6?d*I$9BjR{z?Ap!M~ z2^e6@$E!M=!(JE9=K|vq>JtxMi8viDp~@gzoD=`7K)Ksq3CTNiZ|^-vEf1p>`Oy%)hz^53_?(Sb209h zFGjlsi_zO;F}gnp#*bB;!xa#W1oL1R@cEK*K5wEM8iWOd`Tpxb9N89#ixGi1H9QdO z-!DSMu0`k*y$CfU7D4zFfDL;B@G~X=<3mGe7!b)h=H=i1bApD_`_@w-EZ<7os_AAx;inh{TsZ=())UYl3}XFu(^S&%=ma^KdYH9tK&?L*~=DIJp?SMPiXL2_FOn6S6iKO2% zkhgCJ(!ysT$b1IIG}_~X%$~2aV2>d!?XgA6=Qm^c{HEn}?07g0_sXWB*?AiN>Q2K4 zOvUBcsi+t{6|Rq_;B(m&WH?XZ+}0@wVv|uDJsCd+PR4-yc90W$(7Ai-z?6c@%rojxA&vEvc{nqa?*IE$39 zqa9(|VF71j1lSG~P}U&AlTs0SPZh!LyDjEy>M{y$^UdG}a&1dc_%(O7IfKL*;AF*s;F25X*-Mv`(gCeIv=Z@)&Ne8(tQ`j5g! z{ZY_AJrWTKBe8$*NW5tr0lm@@=x;Xy=AW&hzup=j=30ZbwZ?KSUpFP(3j0i~V0(Eu zwx}gc+)Po8iwnQ#dD>qSV3^$LjmwaYi3}vF?L!_f7D!$OLsF6R2MpBS2}4 z?o*AS{n#5Wn%<~)>h*y7 zkP*U{7-6W95$>Jnj+If}(bc3o6z2@lK92vN)6WoRFBza~k^vkC8X*3yu0!ar@wM8DyjGj>Y{-_ms8G*|~^*IS@Ixdop)Xo1zx}seUv2w&)u>u6r20ZJm((Uf4z~7=-bFDmNu~0>@FMB?k;nkdxtGr zdz%G(xWydD-(r0WZnDQWZ?Ka7H<(3KJ==`ytVg@+EY{;1)2_bC-oCxUI*P6^qnyjE z%e71FlgTA^JoF-4x&Hzi*x~{^|-D!JJVRvz@uJZLFc?Hs;~Dl^vCDVZHBd=HFy&W@{og zu}k|mvR8jNqios+_O*CDYr3(HoiJI)WI=10`}Q@g_1D#GGp%OhvsSSabs8qp*RVBS zYW91zirK%cW?9zNY;SxOt3O=Hp6OPy*NzqJk*u7Zzgx!E_bp>FA^f|7oeK8kEC0@b zC&v18WK-9*XU8quv9UYbu+^hm zGaYR!<~gw?+jO!8yCeNiJ6rWzTf6axw)38E+Bx{F%{~1=yY@f zmT4Ehlxqikl4zg(EYYrNS)`rYF<;x-Fh{%FBvZS6R;u=s_X_RsrLo#YsS#RS*WUer5RJA2fj+UFj-YfBQ=*Uqe} zsO@>Uxc2YE^x7}2!)i^P=F}$3gj&73{c9V|I@X@L^t{H|r>17!o4lI3ZzF1&hps>9 zQRFl>$?5huS>`O8n>!UYM~qL|{FnE|=6qr|Taoo(Tj!^Cwyi2XZ9Sc%Z8x;YwheC( z+y32GZR=IC$u@2AKHH^}j@tI)>w#8(yk*;P?ul*V>i4#q6~An|S+)}GHE1sy^{Z?ri%5~*rC8ByAz8F}MTTf`Q?6)oezE9lbfw60g+$~#zgiU3 zSSNC-Y!qqaP8VHHnkg!bm?Ki~pD!wKUMRX?vsk2Rx=b`mdxdDM>S~dB*L9*UUp9#3 z&o_(0Zfz6YII~lP{d+{xt%7KC`#urPIVjptb3{~LbX;VWdP;OG@~jAc7eq51FN;oE zUK2gkzbU%W?~Z6wxBH^_&ksdEo;(qyU41Uvcl4F$?au#1zgE5%J)84Mv{Cj|6qNTv zbSeI~Xk^G=(dgw}*nZ7!%yxzXTd3HBy{+iU%)cqJNg2Ia&eJ}uC{mfFURGgVUVYhs zgKF%IU4NFjNuB*M(qM%P2eNx=n#`hhFiZKP#b)H{u=ZEFY{}#ytooWh3-d8#{SO(j zJ$A#G$3|mz(7==#&NpM3$|Kkcu{nQt*Mgl&vt;szR%}-2C>C;hH0yM`yl&R!aNGP`+REVZ`}la={0 z*?T{h5*NU1t_8BE9>J_w2w|ViLs`($FgCZ}M7B>liJkfy!Q{zNZ2GNe&f1#H9`BvP z;zq`?V@uXY%SY=@@t9+5i zV#5pA&=ZC1lwC3NUtPj>YLv0xvT|nhrGm}1u427kRk6%vVszRp71KahwfsI<;$d-gRu^%eU%;jh^D=C@I zmRq&3-OpQ?uxJL`7(A0T^_s;Z_s?RQd9&FOvpFp4!5sE@&RiDmJ&y_h=CMAz<}=UK zR+cwp0c*axfX%L7$Z8$i*woK$%x>)>_9<#HTi9<2v*hnaZ!cNO3@n$i@+ZsKvH8o{ zZ=ZIi(`5x4v2z6*HgzRa)>*|KTv)}HNLMrOF>BbP*K1hflC|t=&^l(>V?8VASkKm` zZD7asHnIzsHnO9#O>E_u%`E%%W@fT@3p*LGm4$ZO#?I~B#;lUJvx>nx*zPks*sb!N z?1kkn_TbSjc6jz~*5bB@d3@i)Uajq5c@c8~{4H<~I5!Ykhc=U249? zKC;{F`-|J`>6|;P!}%`Dd3Tqox7}k4J?=BbFZWr*vIlIo??blZ$3xb!@)27R_?YE) zK4v4LYFefekh-1`f= z{rL;qw&*L%aQnuT-+f~(^S-mMjz5^wiythbBCXHdpIt48G(U5Bj7oA1d<<& zK#rL?(sIoaxX&C0iWYbnXo1Fs7BGBjfi)H*F{p4P@(+&Wx$u_w8f*#8MV2smW(mWQ zR_Ie`g$D<$u(X#oe1ojc%oGlrqda#ZcK72o@b}zi0*-oxHrcUOK&;CPtOU@IdPP%#EaIFW{obo`vk|!*9F5<=M zo`|~WiOc=GU>)Mc^UA%j`I;Bb4D`n3aBm!L^~R!G-k7501C>Z0tZ4JW(7QgEuH%bG zQNGYy?2GaDd=aAS2j6HvST6R%ue*NOqT>($D1TgQ^N0H#e=O4qz!RQVskR^h!)^v( z=%7F-g$3g7oIuRG5(rWMARG-0f~X}3^Unq0o>DMWyn``}Gv|zt2ScrU2%b2HU`b^N zT=#|G!mkjx*-yZV{0VryeFC&TOu#6MP>fCuh0dB#yn7OgwfbT3i4Mc{1!3^I9)?x@ z!|~cb90MD}G2%ox%oHX<)rsermQ2K~-4kK;X(IMmOv12~Nhn)63G`qR9&1J5V`v0k z&WON?GZC2HGZJH+BXPBq&p_^ugzzB}y+=gBDKQE$OQVo*D+)Hb7jLH#2{63G7^I(!=qs``W=~!!@nmZ!e$C?r%!>)swtRxZwgLm z#Nw%6EM8T|;`+W=tos^^1dBNIOpHUzqBwN98i#PDc+7K&$KK+2oZ1?XeJ|p%KraE2 zp$X{Tlz_R16QKMv0jZXW*pirtJ8g-0cPSAs6_apkY!YVXCc$Z460Y7)LLleZ?eI#* zpNeEy>`dk{AQ{ejQ!y-LD(5pzMf={VU>~QVV^|7wBT|quJq2xtQ?T<}3U&-nMQcnd z5@w}h(D77k`I(B57HOC>B@GW}r=kCeGz|Zh1~ZFvs7y)6ty$@4IL0}5Khm*ucm@=r zGvM2jfwDsxnDsdW(}!hZT6iWz^_h4fWTN!HOnlYNLMUh6wN+)|#I`KldYpwz>e-y9 znT=`r+0b5{jdjVWL9(NG!zGS%vUFP>73f3SqBV1ljl^ z?9ML2xkW`dd9n!Wz7!!-zZipki?Oz_7`iKXZu|LS&gm+~jiDuY5Kw}%B_&wAsss}* zmf-!b5@Zc4#g%|k=$4eiXJsj3&U235k5X70mf@368CvtpV7Ro5^Xtm+Aa_G$~$IJcYnD?R_W@;5!ZeM{vQz|gFz5=n^Dv)-I=jwN@#Bj4p9Z(+PyNi)LNDTAgVmxsWqbWcPlQ=PU=7}-7mNN$yh@rSqjHvx$thgw~-N*dQh)@Hr%13qM}h>I1pVeouw{(|PI3tjp618hm0;mp2|oViyaP2U z3OKW`eUuc3T&1`?L5i!1Qk*Q1Vsot&HLX$vu9HGZkfP(X6ybNIc=<+()J`exE6Xrm zSB6CvGCUhAgTB8EelaqnXUb4kAw$J<8FH4$5WZQ4k^5!%eolsM_hg8EE5q+j85)$U zp`=rdiV@X#%&KAUU5&~~)sRoE#*;$M`Kzsl>bz>GaQ?&J9o3xKSB+hls!{r|8lyP_ z@a~^#6e!m~LAwT3W;OUQrUrrTHCQpBhTlJGpfjxou9Y>2Y_36KTMf_St%2X38kire zK_}-=?0Z;)Y|f$>(8;-hoJ(Ons21xvqhi3QT4Zrv#a`c9{GL>c5y`di&8x*^aV_Gf z*J5H@Eu7YJro}GK5Ij_i#pi3`b*C0DUeu!SOD(>4sY8lN9nKA|gMo1!rjFvA497a0 z^sd9>usXbptHYbjI@~I$Lq|;=>SuA@;F3Dd?5)GfU3FlG>NxY4Z*TJNPx$_Kb@2UF zhlU>YkgL_>mUcbf7}w*Sbv+(C)Z>IlJ(dL5BPqHbLpZzRbPi{Dl-J`^Z9TGQadyX| zdN{AC$E*4XP9@anVq0+4Zx0D(%U!wu;LmKehv;jq< zIIj>5$aHJK75@g9O>97RYy;M%HsEq@1KyT3;AeFMzD;ky)Adjon= z12!IMfb-b~oVeNm$9oM}{fsk6-ZsGd8|RYzZNT=Pjku`VhzFco@<5M&Hg3fBk&URf zYlOFBBmTKHVzpl*#)dZHcvK_CB{X6~S|b#58!@4z5wpaNI8@h&M=g!`G_Mg~7B}MM z%0`^s(1_*RIa^WQh#?0Xaq@U0;?6bVzbky-?M7UC*oaXt8X& zO&E2bm-(oPb7z|H^FO|=19p+i)JGZ8MbYn(>*-xiQU{Z{Lg% zQ8WH=S;TlbXvTUjS`M6A#wC?Y6_;8rm0YHBap9uE&p)>(GtM@6r4_uh#)yzXo1UcV6Ew7W{v_{)YTI+WGaU z^Xn?$*LR9vrz*c*SAN|o{QAYZ&8XLIhGcLvGI;xV@^;eT?RA;ATNQ6Vecp~+d3%oH z?Yfe;Z!g}?QM|p|dAr}_?cas#VKCQ+A=is8*H3S*r{`Q>JGkC*xc&^e9*=N+hH|~$ z-swsZU3n!@dp+v`$pw_57!1vcR`fW7~v$ZvPj}c)f=rQZH(V<365*pFAqY>vfHgbk2-?y|8eOtL-bEeV9`bM0Q zG-7@!_wl?&bjxT&dm{JOm`3ajYlLY)Bbq!K@z|*mX7=2#ts2p2%HxDSj~$wg*s9jZ z$3u;%?9zz99}Q6dz~j%02Bbe|fWnOiG@frj_u~!7+Shs*L8c@5i0c&US zgr2$v9H?x-&VmNCWi%i+p#ftf8}K8jfpfST;NsMPOSTONHgCXD!v>fPZa`Vz1|06e zW99F97=5b8*q8P2y3b?l)q2>SuE)TG^?1n{OB*)SWAgHP^qgOh#ZC1v=Dellg*^6V z)FUmfo^vbe@!Pi^7B2M&9K&O}Ip@wA@OVCu$7-c|4CgGS?_cV$>s1{R@7F=`N*xxS zsKb!Gb(p)g4u4kGA$&m{+MDZeUt9;3f;w2FayC;;9bAIzVCP;3T~>#$7MyEqP=^wY zI+*mX!|~2qgny{TttYkcyTLiRr)$w?e=UNy)uMT2E#&iSakGKn(rUw4^Yq08K4c;BDf$1*J>0MKU+yym| zHrAlJyaq*CHHe9=fo(_){*AAJU{`}=Q_k|$s=<7v8ffu*{PcI#`1+t4e*E6w%KHFU zd0#+*_X&)6-@uml5ky7Ruu7?hW<)hU@jk?URHNLy8Wy_MxWHM$@qcA_^-hMk2Qr+! z!1+)IWhmS#L&q{1UeA!BuUH1-X);*G$}l`ghC$9Ue6y0_guV=oYBG%LBE!q~Qb-<1 zp?X1zru|a<*(Al}#Zv5SlHzx%6gFv6Oo@=9!b^%~dnsm^aOTuNDbjjK;rd0w8Qv0{ zy(B@|K?(G>NU(jegwMtBZHWZBoHbPvF2QLx2~=z(a5m)ZDK*Zd`YT5Bf4m>a`O9S| z#hAQX44ai=bj}oGPosRm!lu=Cm)?@^sysi|isuYD`rC4ZQiWS{TG3#atXAhUaKvsf7 zlS<%WS%MwiOVHzXF~)8wMue;wF_SpoYGg46DHP+}jUr6lScKPAMSQNI2+PchaP?0i zAG;Oe{i;G-D=tL4Um-#b_`WX%$T(SmD{TcBl2w2pmja|}6d>hgKKv;kTGR7!c1k`H zN9W^dk9>ID%){LEc{o{?he!Tg^z(4yQ!eHl&4tIjTs%t7MVu%Xr#J&^(A^yPZpuM& zMGjH}auA}Q1EY`AaO==C6waE4-*MBBJerTS6sFb$8rZa!@MOEKcX{n)jSiezcb)^Is?~QGvJ?`fi1Qf_^yxv zlgsIFT$T=p%ybw!q~m?>bgaCQhHU6+2W@ zk$WcvI%`v~F)sx}ol_uFNx|7$Q}KJ%RH)~0hL+=0{OmmyC$A-=a(OcJGLo^%J{cO_ zlaYQQ2^$tB;c{XU9$O{h*6&2VK0+eIGZSGQ#kpF>iSYiIfE~og*)<7p3{2p2Bz&Cx zG#=5L<6&PEkKfMmSi{HX4%gx!UlParuW`t*j>C#yu{d%h7H67bL7}mjs~3y#7gNw} z>lDl_nu7k$Q&8A@3XWZxjNc0;LpyFVh7O+$jZd7fC6B=laSWz-#o()24DxP9juG`UWIr{V;>JspDb=^^+Y z6oN>N5Ujt+*Ar+9M$gH?P&W*Q(z77ET@wT$H3-uzg82O{5KFfQLL)yAg<}G7_-6oq zQUJ6n0$@BY06N_Q@aKp>PF4G(%EO;C`24Zyv>%2w`JvX&4_8(Fpmfm}BWL=;A=sC* zn|(3(st;by@j-j24?G6?;O2F2gv{sbC-C_$WleAHA7035^+NSTE}CA*y6FkGR!=BS z^u&%qp76clfs6Az;1uS8g&H1sbk!Z|bKLp-nLAj2cUWF>gW3!?-1B$iOg1;Lv*U5P zVLaTu#$&T0XL=oXg^P@@2jSw1nl7$r*zbapG8cp~7wG+P=6z#lq`y$8mph!j@%D*dFbKb}c7V+;D_DpIhwYbBv2s95LebSgfuY3su*#i2LV& z736?Rg${T#+5w;51J5@ACz64=MnK>LhVKg*n!*@V`ZJWB6X9l^2>Rni2>WM`V!DZv;`e-=J7>)nDMx%kx*ACn_3Ns2u;k)H1_`b5njCN}rinPYV0i6AH&I+$; ztZ>=M3hRGZB5Ru^j8ZLe%+L~{cShps?2#DfI}&Z(N8;ID3+U!sz}3P6;m^zwx!4@O zq2@4GF~{$tBhXPc0tq%F@bArV)U6nfE|J5L+@CYSPMM*r*bFxIW(a$4isaQ?qD}ca z4yLda0xTQG= z1I`YFQ{_NJj2ejKXBtRs)xZQF4cPo0fF9ch;6(fYlnfkzA*c8=kWzJEq&jv!>cp@mSaoL8|=_e^3p{IckU+ss`8VeK~)+FP@9~@_V%^0v4;{oxdvY zv#O%ob`=!HtKj|s6^uEq3~`|{_M0l>?JXs!HY!2iK?%d&_JQt_KIj?H2ao^t#@4O9 z`MA6{jQaP+$-})cIky*H8TCTqRYhEtDZXnWOWZDhV?*7 z&mNevyF0v-y2E&2cYHgh0C~OwGKVQ((6w&ZF6#zon{GJrq$})acf~T7uK4}23%r+i zK~rECNdEm}SEBzhrM-XIaIL@0s^|~X<?XG>xJfHl>jyV3uj2FIPxnEzib%C$h$qldAg`Th2!Pu9qZSM;f zGw20V&Uwz-&pu;@CeK)t_$hmM=Lyrbd&0)gc+5gyKVpHLIcB@$A?yC*0oxb!fW>aO z&)#>x&yr*AvD16*vO)dsvVhb(Ea%8=R;hEF73SY!5$A6*QvG+wbzWoCG{PR4U9(0~*tUJf*x}0M# z!q2kNTh6ewo@ZD~^l7$y=P9;C=@hGrJIN-?IfG2?1iPAaoaO90#yZuHvAooy?AE~} zY{Z}=EG^?On}6gG+dlXZlV=@dTaF!Iv$PMe_-Xr@!HIqByv{y0HD@pTc!F56F0r#Y z0vmEt&Zg+fSxZg_+k9dV6Lj{lUDI~6rN?)%BJEwwDSIdTdUOYCkg&dv7CJ*Fm zs!g5C0)#niwDKI*J7zY!v}G1+>^h5yLT0jCD`&8@Z!PSjM+-|?Fr8g}-ONTiG&5Oq z6FYUkk#)6dWai=q=6$)IMH$tzxV$tFfqH?AeRmQe-mN3)BoLx4yh~2tZ!1`6>vr&3^%yEAX zvyGX?H2!9>M~gFA>(~q?x|ha|m!&dCofOti$?Ri95;Ommz(N+pvn2aCmULqZ3o4k* z%rs)yyB$$%S#TtC`Z$T5ZkfnjM~1WYXG7WF)Cp`{?+})?CWtk=1+vyB{%n@mkChJb zWx@Nr*`P=-cJ_w{%bw@X6l~mB^(9yKJ=29vRCZ?T);Y1)?v70RsRQHF&dgtru|TqC zt`o;Fldra{bEXYDG;%a6I%CZYrdl!TZpl2BTd<>J&6&;Z;cRY!8GF^=lv!;tW+^_y z*xVOJY^T(a9UEf6PSX%}BwUYe{;b2Mw`jB25n9ZYuQm82ZV;ROSA&gNIDlQSRcBF` z`my`zYAm!@Uv_AP3Nv(4X2rMruw(hXnPR_Q%xPm!mf_KZ&3vrDHk5Z`do{bV+T?#C z>EcdN#+9EUx8C1H%1&QIhx0y)lGeWy{d(|5RIc$#^wImdXhPK!(b`=PMQ>l<6B+5> z5qXE+6va1O6J;K_EK2)wK@@3rPUIMKS~Otx3DNx%M@4O&heW>C2SlF|_llYp%0=22 zc8iuN>=bF)Zxc17Zx(%Awn5}~ZLMf|@71C=V^@eQa+ZmbS1%T|-d-p=tlBDi>M~dK zuV9u)eM5`L;6anfOua!g+@n@xTq+akY!QpJkC%(SS`>+n&CL-t|4A45B_@k{o{JU9 zZK6bpi^4=I-GfA1(tJdISKLG|**H;EI}>U2u@$YGW+}ogGts$mLq#!b^+X^04i?D@ z)kRtlR7Bg{dx?BEcN1M5@ymYj?|1ger=Qp#T5!{TSjsv3R{O*Dn!Wbeuf4Is-gC_| z``-m~?GL&)*pIfTu?#fo@=Z|+#}OWsjze5^w=_+m$S`JIlnYoB+_zw)ue`)_B* zlmXr4rR#dj3mp5(1FsB__nxXHU)DK9t}%0%JZabn`5d{Ge2Jf(T=EEVmwadWon9Vt z|3$v?g_gnceTT#4^3Z5`~9`t1iMYpKikSjS51ZY7e1Hc2A-BlA`c%RBvJQoIXPC zS0!P2n2I3mQ56npstG%a`w6pd_ZOluKp3z{L)gyOgy&22g~xvlgp)BwLhJsaLa?5(@V(qbsJ>?^{BamAOkOlXSpVBxcn~pC=#*Ou z3WKeMPlcm|GuKB8jkdOe%^W-7_@^<#xFC_Rd0LwiQbQjDbJcZ&tUc#0EKEl~)zQXzQe!}h%0fMY9P_Ta%BwTV15dxM> z5Vrpc6@G<<3nn`z3ZlLdf@NBy(C0*yaLO=7NUxYIe7-eBh_;OrHqM9_?!QS8KD#Fg z|1D1zPIgWeYQj?m)9q=(M&%4aJvmc|I+P{UYEKj9=I02q3%Np=S-#L)S|BXGTPUd8 z6$_~?B|`hlQem%ixv+a-g)sATrC_|eO2`Wq3)}ySg@@}U!rw5dpsXMh`fQO2-y^Dp zYdvd(<=bn7n3!6jPoFwr)vh|hDz;u&uiPN0cQgp;@r}X`)h6M!oO9L^n*}4a>4Gs$ z7c`Svgr90NgcCGFs7{(GSofPHoS|95grwQR8MQfr70nT(iF1Xcedh_Eo#Vqt8LCBpR0ON6uGONH-UmI-~= zFB8;5_&eI2%Y`Q^+l9@3D}=;vD}>%lR|*R}RtWx9@x>xAI?^@64K2I0re4Z_B%je@V~CgH|~O@e>nW?`G&7UA!)Ey9?LtwQ90Z9*z- z6B6RK3tqi<2!pro5Uz&p6iWW=6#A^(B~*Lw7T$c=Enxm0A%AR#u<%KTu&!P%v|9>7 z%{4&?DJ4P4V6U+8_+G(2eV?$Y-+n=P&we2^>VQz&^`Nj~^+92+&mm#{heJZv+{1zu zJ0jeO^Fna^1-^#(ML~VtMd5E1snG- zg8q{)!pF+5!YZ9_f}{MKz!$t0v_5?oqNo25WW#?7EysTf<#E4+fWNE=J-f~X6b)^?$st6gZ5L07t!*_FOiSL)Hb8}$t9 zM&H}J(XIF0c)p|p<P}O8^`I*gdeF$_J*ebu585N@NzbZ# zQuoU}NnKBo)Ke9y`));g*0mSy@#{q;3wn{ovtD%3sy8K+^`=)RdQ*&gA374#hcwss zp_s3IXwEn#qDCdUbX|#V8Yt6+bYtFw()&tH(m$z5&T4}xXd=%~S~i#*IQLD{N{b#BYEjz(Epk=V zrrZA7G4~u~oT4H0ZvPOP)I*=P`{>ipnfhdLQ=bC$3@A3ifTpZBAioa=WNK$fA4&~r%^^eb zQ8c1^zD5*1%ZN_jFd}2!p_COjlvb@7N~iuCN_VV>(Vc=}bdrW~-j*??x*3yxgE1XG zZ%iTTCUh~}gs{kj<~%f^TSHArImMLBH<|LBOH;D3H6xv3Gy1sKjJ9_fPO;;M)1TVm zRC|VRRXGoJA(eZIf4f2n3Kh1bFykTC;eyU^w-3KPNZ5;#U=|f_+UZXMvWwk z{E;+&&q(_3=SZ@2u%ze;ODaBSN#br+lt12z!fJSK+(|3C+uNEXKGrm#*_vjbx28XR zN700!QPetX6rH#-ik=MM%(&3ebbsDx+J9p-HE7z9%Oo3mzQBeGZrji&EnA9+w582$ zw)F0fEzfVaBkL$TvRPzDMtAM#ul5)^8aajv+Biq<&KO#vWl!o6_LR54o(|r$ryqkv zq#Z7z;qyc^^qPqJ3}AF8m{IFYM&m9r;s|jH_5#ZD|4XvhaE`P zWh_NGjwSuFv2{H1ga>CrdGcITPp&IZdbQb;T3&k65JN9&jr5|qp(~{HZj84Q> zX@^FUTTK*A+!Mt)S5ag$IGX-?Mbp-jX!70=O=s>zlZ|o=RXfDc{`44nuqcLJoQ^9Zwr#;>oTlp4Q0YsmqIa8aE(; zlARN%ATxo|+7ig~WCAIDO`zQdiR9^@NQX)i$zV+)O}&yx^Zq5$`VmRAIy{N$rAZXB zC5aU7BvD(>WZpK(R2iL2XX=va?~Y^|^dOlu`%I;OHdE=`k~K z6q;z0LM<^Vw4pAAwro$K1$R>@wPz|BSn+)INvS-)J(V_ZGW!DI`!J0PRh^I>AOk>owCiKs^|>TtInYI zjTxkTHG`smXV7fJOxo&|NjtJLY0>;lO52}F2G25SFVDYs9F;|@CT7v+iYzi&l||#u zaQT=;#)GoyqeC{Wh|4C_WmCtdY|^=sO^H9UX^!qRTJJKARwYm4Oo?gayKNf%yf%#* ze@!EWAvqN5%DH>VIdr};hwg33q03itXw&x`%Fxawb*Eff8kfs+SaT_PT`sLWn@h*v z=hFH9c|^8(G<{+od6eeSv&DIoaxjlBb1t8Lk9-O>$)`-Oe9B16r{Ly%(%F(vXD{Yc z?5BLXqh3JZoW82C0?uhHAfdH@w#W-O%dvpGe;3eu?LsPcD5O_Wh2&UXNJWbasdZl= zExK1oHGc{zOt*;oj4h&-QAK1}Rzx*zMRY+ZqCdBasNc^b>aAH!FYJnGeP}TSbSE3H2FXLSH>f=vZP2l}Jly!15BBy}yLM-zg!dpCyzru#~Ds zmr`M1DNV>IC5?tsqSdA3&bfcPAC!_(XDPX9mQlP-86^dlk$-v_Y1fs}xfOih0nUZE zT}F=I%1GL;oHm-5li*QKo8rnzR$fldt>yG+JLd$RE2m2@I9H-u1%>ETP?}u@O%1Fd zuha_aE2|)3G5@@$g7#gkAdS}*6s%B5xjLK|Xj@6~{*^Q;xssk&R#HW4CH>l3Ns*^2 zY1yMnI{mYf{_9mm&j(b|CH*SyuT@mZ85qvvtLR$*=VU}yk!^An9n9gJ!HO!{R9{7^ zbE_zBSrx6_P(=@SS5cqCoSVUU8n!p9$nHrMnZ4u3{H&s93S!!7ZClj~h9caITpCF6G;GVtTYgO#AnVsriJM z0xpTE+Z{2jc`7EycVasET}-ZBCA5|EKhy?DC{|ZOtBfUd$5KMwL=w_*k&vkm=N3+o zkVdqGz9(|7VWxy;6iUdmNIjh1SI#vtijmUzL@9-*ODQr}O2H*kVq$(=os=F;m(tR?oT0c#N*~*$oJ}gFK3klG4=+QtEMCN~U)?GvzTa@1>L+-bu;iixUDLKf<%2`Gp?lKDSk&#!RjO;>XG$2Ao zPh&WzC0<68rpoAVx{T&clhKd@87(Z4kz%EclBAsNQY+(m;xe+BA)}BvGD>TeQQjgM zWiOLa^hy~ytd)_W+kx`%TGAjNlqg%gu z`G5JjyHwNaZq;2YFfp`dPFsC<)Uw1O=2$BxM*2aQ!tlOF7vpwb6L)1CYM|;9$Zwo9OK7ka_Pfm zJ}+Y+ml|H?D_;IsE;4?uz5hQiKYuqaeR*B_@;Y_lb$en^O&z?hmAuaOyzY;6_-B4C zD*T$7`L+EUSWWT#T07MF@%-9FybTg~TS%0vIXi^cg}0H6x7AeMW=_2A6nPsS`onoX zyiJvO+qQj^kq&R`86P><=beoFxDMvMlF_B-+%}%@-?)w}xUQ_Y&W3W`DRCV>xg?`a z=ee%9ZU=E4@8Mh^FRt^m`()(8ZD9Rwu0w7U{@ga2Hpqz9$ms408NFXBqc3gTR_Dv; z>TDTpX^~MGw=u?T?Tv)%yh6tNo7^_?Wn{o@vXR^7%Vci1+*S)>`2I;UIyZrzKY$CqHrDY~ent$9;7P_t}0cq*Sm-O6RyQ z4{VWA5clm0?&FKOuW#W#zn%O3S{?&hcq~W>my&IulskYKPFj1?_wmR5+)%%KM5I*myjkT)Mb=}ZktMI z^$-aq4wTS96$uFn5(@YwrW+r4jDEr6@I5irPr`->=LX%U4~717YxBD(EdLl46oISPQEsvN{9xd*YN6+u&k_P3{h}K*(&CeyJ z;9R;oGM8jZxupFvhgy&3Q0KB7axc%J!bv&QVw*$F{cdI{TUXe}5CuLK)O*U!u&88)XlHO1 zk$D!a>zPFr4|$TTkV*GuXHs%TCf#(;Bx}yD%Kn)_^Dk%6stp;mP?kXjye}@Y%b=&K z8I=Dbo!%cvr-0UUnxCCc$34^Ou0CgB|45?)oM+XzHjSLB(&%=08bw>C(TSdEH28ih z1@B6w+@@42jZdXCmP#)DQmO096k4-Ch3w|?@kCk*^>#@if6WvseK(a_j!vbfg;Oaz zdn&Z zdz(o24<(Y>yhMsh<@_s0&Ia$FNQuuANF*fCm*xa&jZL7Twh6SLR|0*#6Hjal=Zj0? zsXR2EN=@S__IDgvosXjz%i^deH;z=@ zxyO*&pcqPd5ltKRMAP-!XnGwU&F{a_boP4`wVjBfkoi&cH7SZJ?V{*Yk0=Vb#wn#M zBk5>vB;9r4pTCAv{*iEcG$WkG#Dr792tMZi5k}jOh0*3&VKirQ7$um8 zk>1ZxI(#gY0%vi)R!k_FjR>W@?-OV}AJd=WWBbdI6X>|f1X}SqgwhU#kWOO=b%gOb z0M4%8{5F_+apHxaESO3If@zLcFwK7!MAch^D7rL=hPVgOS+yXFzY|DLR|QgFb|9_h zPg!4d4E=y(r@iRuOfQ-@$%{rCc+p-yA7i=IlcpDX(k(|%QtjzUR_8p(VGieUMS75?p$ENq z=}ybHxRXbLJKb_{r!WO~I&g}!xn{W0gfKU%(s85K$K$DO?RaX)98ZZhi zO6AqA)XT?}D%4!*(KQ#cY;&QMDK0c)mNSPU&+hy%Yy}pj6j*hW3fzOTIa~jLX zO=D@-aR*Xpa3Ci?2TE3Rpt37``R;k3be^*4p#$psfYH(AjFJ){lYXxj{rD zGetDbN<_;(+0(wA_H?4ap7z_@Q~R$ml)HBfSyznV=iu{vUB^)8VLQr}+0i98I~t;B zN0BFONmg%53%zY=iIOeNIBP>$%{Byo8~UnhLyIqrrcpCS)2_hLoH0F`sxOVAOEX9D zSUHMDbGDb~Woz=CWzAXe)}+(lnqFP9qLnkP$Un%6o~c<;>P1Vs*J4Rd0hTmfm9K|! zZY2F^8cF?qN0OG(NIq|9L0{`E=#+;AHT1L~cFde^O3f+J#he~>G3Sim5wxOw1iiut z8uDv6xpoYv(1PI zBT`E-BF|w)l>Nw%Y8M+)^CUx(Y8X<=B?EG7HXsEr1KQKwfFcj-)B93=${nLm&p!K+|Z$XP(v~k1(Eyj-5 z!q6}+j8M>GeLGFGnx=_TPMUb(tp?87p@CM(8hDn?6@*_^$E!>u#@$ODH~dt?_lMNb zUZ93qhH6-IR~5IcP{lm~OjkxqmCXvOU|x|5f`tkWK2pa0Yn3r9Oc@8{l^Jh&7!H&V z!!X-ncwj&Ye>W+iTci>eC@JB}(~7u9tcZulDdPSY3b<~g0#-yRp#LxhRO%dxr^G`s zcid2vej$%_8{|*jiHBuPs#WZ}rNuuOFN%T&Y#4>G3 zY`iFeEwd!B(@BE$3;)qVkAKv2_h0%|{V!cU?GM!)_)TX_{!Op64pKS8L26p_i&}m8 zN%azc(syTm&^-`k()InPhD za@R+yuKJO#EdN0N_P?iL6W`M%``@v-=64jU-qM3?-fW5g8yepHno8=trfa6ZqPkCC z(m4Sy>CNUBR8{8%b)5d3dOsPUglQ)YKlqG3)qFKJ|3HPkS2sXryExJ(+orYFxNW!)@-;X)Er~ z<=<}8y13g^e4>|zGR-H|1-B@^?4jYoJ?tEAQZLP$bZz+!djIZqs^os1nr*&Dt!1v! z(b-q&pROzPtko4dt@bh<`RNkfJLM8JZt14gdfoJ1)kQkI{{o%hd4a}n>7q$8T{I-? zJheD~j(#yeM|anpr9p4c(7uo}G^V+eo>J?iy2Yny!p&23snaRCcXbDC`QA>OW7_Fz z{v;I)KS?dCPSAVzj?;?q$Ej3P8?E|-^l>6m=M$7xj-qtW44!uNx6)hgt@Qea7TWgr zKe{UEKbmmj7*!v2jQ%&B>2cjZLNAU#LdQ2Arj3J#=4fb&XrA;A zx*&Bstvk7mR*&39ORBcg&^ueGzRMPRd*x<2|I;RF6uOBX-oKGLC~lLupO}oqlFDwKrT%@61?5i|?(Z ze_dA6X)EjLn-42!Nbm}}b@y`mYRGbGoK{CePt?+>!)xiBvSoC^^`&%%%~G0My@dJ= z)KDGo8hWp(n%4hZOx+?E(|gT}Xr9s{`YC%M6`o!|dq*vxF5>yLre_|#VK^jx$faevIkdeyi+-JzNwu9asL{(b zI-)6+%}b}yYck1nS!*Jji%+1JN5|8!8?m%wK@1&5qG`_CNTv@rg`SCspuMu;w3iR1 zXGD|f=FuTkcs+<3&kv**T>@yzt4Z`}qaTf)JdyH}zEtt34-L%nrd7ILbln9Hx_g>C z-DTrOS3d+=x`NON6F4gK&4nJ_=}f1@I?(|IN1D@SPy6!5QP0tKboEsm+CSTx>Nr?Y z@2BjWlvU<5f8tnL@ZFTA?J}X0VvXq-1tX?nWw&^$D_WLK_9sixbK)>++>3!mtSG?!rd*ARH z&aZe}`J9jV{FJ{N_LvWEe!x@Z`@DMIT|VJrFW+F^!*?#c&Od&3h5zhxiT}3w0{`aU zIsRti8NL}$@w4>Wd7tv*{NPQ>@33#>{pybKeQyu**@4ac^IiM-MA^N3SNbmAvST|x zZ`4-)X4NKM|4tJh=e(Y;V>*u~KCI%O1=sU3d+YcS^2>PZ%o^VH)FOWT=mk7Xo69@i znZ>hlYu>`Nod5lxkUzUt#4m`*<~@d`@gL46@atwp^X?>^@B19Ym+bfB<+Hu{HDla( zGEYC;jN%QU72V3vyer)|y zGtg@G?_O(s(Y4lf&(5|!i)m|h>ps-F)njL?-jT-EjixJFo!2dF?a&vux=ClYK6y2{ z_1JaNdW@R14s20vU8()O<;?T$mP~$2%SY|P7P+<&Ef$@1|DDeBa9YsR?%c55(PiiK zc`hG!9&p)u?Y2webV=8>%e7tSY`1jP;XPd=yCYr61A%Mj$C<7_XIHyEP*~-cdsz3gw>&nypt~UZ+y570=*>zjYU)Qw-GTf=dL%Hs+%G@zm zO>SnD9yj*HDDI$yF{kNc&PC6+;mXcAa79BoE+EjI`?JJ{tGPUh`>YbeIfg}WAuD1y zuN#S+l4d%0U`h^WwknS+>nY;aYgKToBByhQ17>q`U(My*s~2#O%@=b8T{YZ5&N9wd zemS>fXFb<8aW!}2*&6QJy!Bj*(FShbsZE?q>Q?UBzwKPuhFx6C_`RIez5Sd+Wi#im zbA3e_JBn<) zJDR*VF(BrJh9soTh$PCHkmztz0!?OQ=!>zWgK6oePq!rR&smWSbsKUz!ImiOv?K6w z9AShL5;NbCOt|7iboE?FPns(c@8gKvH$tX)j3;*(sAkl4cM_=YNs=?XNc?_p;`Ysl z$a(mZ)`b&E=v6;*S=XO9qy~@~y8}t{#~^Z^3n6D`PbRy&LP@b&I5CWkApdQeLhN2d zl3Lqnakm5|nxr6feAoSdChK}IjF zB(c}Tq?9q%iejge(54wg< zeA4f+fG9s&Ky2nLByL8F$oS4h#4>X+k(aF|w{}#M6@E3u{Y4F{pCu&Cd?~rtwUqb> zmXUP|wdBE`TA~?PM_gXlkx4bn$t24a#O2}&qA9E=4-{6CwR=_)&wy3r*2`5SZt-f; zJ+^^Zoo^uG>^0;+*|p@s_O;~ugmq-_$vX0G&U$j$ppmR^ZzNI4P2}&NCQ{$HfoQ=- zGXKs-@~C_hvDDs7QjcyX^TM}~l}vDN`LeAyGdHa9#ZsS56NG;mqc0YBNpfOk(cTF$x4X>#IlL$X>$jO{;h+g zxTu-5Djy=x_Z%Wpeus(Nlf&f4j3eac@S|kie@97B_%ZV0?J-iY_&@ToCZR&s4QPkOB=Id_hd%?u}=^#_U8nl^I4{y4F_beuG0pCF$lPZGz*lO)NxofKYe zC;5U75-D?vm~1#j9=Mz)bFQ5x%EC@ESLO_P+;oPRyPPF)SI?4?+;gN%>O4tZf1Wry zc9BorU1Uw>1!DU50%=@*kqp{&6Q6V4q$v3kss4V6)YM)k#b#HC&&ey~chptV`0gq( zS#XW48hM?(J$jv31>GQ1p4=d5;+rH^t%tbm>S3J0TV!|7E#fBXC9P7o$?&zeNxJPF zvhvIwvN!%N+4J!(sa<%F#EmWfEB}BfZ+Jk)Iy@v}&p#x} ziI2#=kB`XG1&@iT{u8qO;1e=*!c#Kk_ER!X^o*>N7$B=x4v>nm&xr?%$#^~a1>@_z zAYaQ~l5mArWM$JUf_AUTxzn!+&-iV%FW->BX>ZAE<#(iT^E-0S;XSc9`<^7md?2N- zK9HhmA4!DrC!)9M6FEKZGYLEWnRHJ1Li7i|kf`#nq*VSJsaX4sBwKtZ7Wkdq3H(7s zeLu)!(N8k|&rc#=`ira|IY>6`A0&(1ev>JeeiP}$KV;RLKSW{LUy`o)k8D`?kMwIw zKyrcvT;D1IPOl}P+FlZ_RZ7Cp4oR?=mx7?lQV_FR3L@`Ifse5?7z(A~(;;a%`a>GB zJ!C*(fedWymH`uuA+SDn2uN=l0`UVwV7rwpJSdU{1zr|R|H*=buN>Ib$ib*;a9LdgRHHP&d#whf z_h~@MXiX?d(}eWxn&ACH6I3m=;BuZ8h?})Q`?D5oangnn723d*iJ||uHkf+oK;mp2 zn0s0W)(p{wMn7GsU91a*7j?mVm>x(@)`R9cJqWq32X{4wLuBM|IJtT_=-eI-$$I** zDo!8x_4;tBPam#~904bjM!<%RBS7?U1dKHp3D;9cf{?|9eSSO=a*am8rSwrSX4@!8 zeL4#2j7P)%jM2bv8_k#tqhY=A7%0pb1J2vVz>6niV6hR4K}$D)m0Jwp-y;KvF))OU zDTZ)kqal3jHw4*HMldAN2tKYif{S;JpkB`yCdC-To7KiJy~h{^HB2BU+ypx6SPa}1 z6L2493aNpnP`KC>3eK5A+z>Nx@G*m*v&>-s2{Q=!Z3cbZScoYf3++e8g3hP05NB%+ zH6nA^z1tj)4w%C}BMVrOVgVUV7GQkW0*t)T3< z6;%JUf+bGYATG3q$oqHX!b`fk*1L;1psDWs7ZLYo{%={j-Hr z#14*?+QG_ZJ4ktL2fC)?peg`f>Fgz5U|e)(w{j&)+lF)igpHj7908N zyff^Vbb(;v0=J7?VDerUIP}B?Bu2Obnc@m5OI)F_lQHLhyF#=h2bLlZUT@`~;T{Lp z8U&gH2#lITpqwYb!o=XM8Gw8;fXZqBsY?J4rN_f=G9D5O$HSkU<6%+%c=)U72FZbL zuy3{-JZW(Q*>`TBY3vTe;@nxCxb4hcV+kpgGF}EE_#w`85xCEb9rQ#(RQq zp(jM|@Pvqao&c&|FwEBrE>wC!;Q=p@dEy1Lb-dwapf|uQZ>Tux4Vzwg!;uj_&>ZRm z4J@WLx77zs-}u0#(Gws!VglS-Faf;i1X%HQ0$d*B3tu99L1v*Z{N;V&$s1odJbEIC z!Y6{t{E5)iG7+?1O@xXOe$W}>2ZOWxV8jtW#sg$aok=h_X%cjbCqc!&Nubp~2^v-W zLD|b6a*G(VZmU1^-}Hy?LjvHJa{vrv2f*<)0WhO00LK0bfHsRjAn`2bwA_6$;2)Gd&0Z|JgpyO}^ zXg`R62*oKNc9{Z;)2G1f+9{C6Vyms5Pl0~*NT_s=gul6wAXpU%?d@#+btIVRM1hlc z6jG2piF%SbDs^QL769@aQ$ARi# z93&dW!}7p*I8Yo9N7l!~rql6I`Z^vQG!o!8Nr23>1h}_20bCCyz>M1ou z$>2oTR+0!s>l4B3R3db~NQ3~DBxrF;0;Pl`m^3E|@^&SG_;M2De@TLX;mM%vnG7^D z8G>t);e2y4Sl&v8GRD)}H6{g4`KCapAO-fYM`$-O5mdpjw zm|Xbeo(oBdxp1f|7hbK+1;y4}P`{N65?^xRrkViiYz1H+EC3V;z+#aAW^EV1@lyhL z_&@-!ehc89o)8W@3t?)65VWQWVbc=E_S-E4!5Ja!ek6p;e}r&XPXyggBG?`#g3LS- zC@vO3!!{8pw2L79o(Q&n6G4|+9^A6ZgD$^3*qW9HY18vyC}TgYI-Cdcm)Q36JlG>Ds1$c3Z=1A!LD#BTwgR5;xMa7Q_37Vz|7QaS2Zr1KcQvivz{r^{W^fhn2v6#_EuEECE%&5|D~3 zVZ6u^STnN(#;+)WGuukQv84nSca^~DdnNGXZ3(>mR{}k1rLe=O6cU|E;n&1cm=?o0 zAi1SrU&WXpOG;rzQz=Y8PztFhOTqGLDcpU?xP~7~;gw_=1gMumonaZY*_Xj3#ue!d zFM~~KWsp|HSch}Upka9#4BcD?sm*1u@njjCx?Bbq@0S7pri{HyW#Fe!4gCVEZtx$+N@dFtNQHmRu@_*1P4<^}HO~zm!9x zWCbKDSAdLu1uQqKV0BOdah?^>5LCh1i51YEQ33m>R=})j72vX{0($BzAbMj3oZM3Z z!~UxPj}EroUBTE>72x`~0wms6z=7`-;3ZWFyb@!s=r9J0K_$$wtb{tJN|@_W3Gx1n z$rw=yZ3&g&n^nm$CY2ytSqbiQDj}h!5|UR|!lb53(B4rAT?Z;5wWX5rYAeC}d?i$0 zt%TOwm2mN4C7gay37bDuLdK6uP?8YCS~)Q&sfZy%TMU~=ilNh(@f|J2z}t(Vh7&VB zuNWRq6hnHj7%oJJK_^ZO{wZQe%@RYRNDLlDVvwz1{Fv!t@SQ7$wnbvlT_%RudNIse zBZehSVwkaou_AYhL3N)P4mFFx<(L?@@?!XMTnrYc*l}mYF!6#ItS*b;`!zA_>Jfw6 z9Wk`_vAiCNA?b-277d7D%}X&Xdn0Bn1Tl>LB!)|0#1Q>m3}=6eLI1ZHBL9k^M4}2R zrK%uJhVdt5t6)H`3T6(ig1-tZO{og@4y%H@%2n`Ir3#*_R>2vyDp;h>_SL9@lgu16 zt6&MUE@p3;eP#B9*?-LPnJF==W&3?+$4p>W&W^8T`7B}i6|j7rS^iHItDuaP_fDSi zFj@Iahg88a=_)uSSp`S`v3mU@hDn2Bc=baJMc)`x^RpPnePq}5P7L#3i(%mlG2}lJ z13VVP+kTdIPYjZ`**&-^hP_wCaJ!owdtMBWI>n45#Ok??)kmusjvWz$*+DVP+{5m} zb}{sC62riHG2B=!W}F9Bk4wZbxPaY{*(|+E431@t12mQGFA&4@3^Al6i5YiL4837u z5Cn?h$pkTYyR-6L#Bk7#m1Qo5!-nkq^~DgN$=IJtVyGM0Ryipz~Es8`1Djj zz=aBMK3M@nk5)j(t_sGCs({DKDGGXts z9(y;HDnL%60-QdVga1G|c;6`pgKp+8PLxC4A-2A)92!=a!{C zSUEWRl*3oYa#&}|IIGORtR7kpZ+?}5IrBS#%>P6%Kjg*ykrwkyS2mSF0rOK|XEQ&= z{MHfXzg{yxCht=QN)Bc4&9Ds4sFy*NR2l1|l){=vr66&Qv6I?MVa~x)XxzYTDO;b$ z(uC}{IJVEEQqXZJg(?%qfz>F5?~_Z7C_LsoBizU#)mq7N;68OEc1S;k*KV47) zMvNyL7El6NE+vp^Tms%|C7|$^`TkeMj44wLXHOS{S#vSuH5SAAMa6KSq!@Ok6vLvR zVwmh&48M(vp;o0Bh7J}%?m!V7yjBE#ZAI{5XA!(yQ3PGni=Zy22;3ry;F?31QFd0q&P*9yS~3qfUjA@nXQg!vVPFg&dgRs|NqcgI5T990MfaxDGBRG58d zDrB6R3O0MELVrE`Kb$rdK4(k?ro#bSou)$1$f@vl2(z~ZaHFRHHXSd3i0uXNZb<=MvH~eD-uFcs1Uw52q8&F2nT-&;Q4(4 z$aM%nd7A+KED*r;T-FW>5`ZIX3$?R0kt1sx)v`9yHP%)dT$c;OrspzVQ7#O4=E6Zk z)}E5dg|E+YpyXT*+})J}W2D93H9cgtW%f?-2)lmdnN;RY|Vi8vopXTB?E|i2EYi`9{rUL-+R-c`B*wc z)ThJ!sp&8|Bpvoxro&tLbkH401FO?%V74g@6sM=b?btL}>YN4^8fkFweJYIXPKDxK zsf?A93U^W%k9vG6Jkm{tjxQ$B=l)y&nhDkHvv_X&j_vvObDi9K6(wgPJ$7pxqe@HS1&HWl=2H1;j$CK`d1L zh=G|`VnDbf2E3=ofYg*2*lQ63?vgP;d!u2@foPaIFB*2ou|AVsH1x_wv$2{e*nc<* z$`(a|c~TUdafpJTp;6G*9|>AVBO!KiBrHgZgeHeb*dQMXi|20WTvX;D>nxeE1U%H?D=l#_iz{#rlZfSzmF^7`FTz2GQrj zVAHxVxS1CQpFP9a_)HkQ8wh3m%uradBornjhr+{gtPd&^${1IZ!D07gsH~a{yMre~ z=jh4M^^x^q89Qs`st}0H4gq;C1hy)${%v0{H0%$Ck28Y7IW!ou41!_Sry!VrItWTv z20>_M5NJ6E!CBcLNbL=T=Q{%-rXmoIP6~uU-9WH@82|x%0E90N0N>aEFftE-H$VJg z(|LdJSmO^}*=*^;wq^a{P0u7S+Rpe|C6ge+hq1NPCxP7~Kagnl13JSGQiJ{AlfEAm zuyKLgtrNj&;Y1KdPK4D)6Jh^HUpRQu7n+v(LRq{oFgQ27{x$&?c1{456%$}i@&tHf zH38VST9AH@v9?zFz{*q~SZ3n`C4=5D@w_)kukwcdsovmY;|-m^yukjP7u3{y!L?*B zkh1cEF+V)PqSF(`)Omtbf+t)x^Msnu9x(2t2Xt0@fKL?TaT$1k>|1vTXk}w7bKRjK z#2q&4xx?zGZcuU14gADzAnEG{yH(u4?e2IuzHK~M7L12^+<3Ui#&G_!v7C`>04&k~ zjI7w}{Efi9lLXc+Cg2xA;Nb`YSp$sCb&vzsN)G0GGx;Dz4xZg~g&$3>@H5L525eoS zvJb%oupi@L{|&7%*0s=OrfyTIB@3iB4c;;>6m* zj&SOzBNR?^gkckyW`d$4sN8UXl64MnF4Y0#%pJh#gFS?`*hAb5w)C|JXC-@(zcCKF z){cX6HjbuYHVzu!+JWX#JE#=f!6i>SP?oa;w@bDVUvCRpv9^#h+7|qt*}%xXHt=w& z4Xkjs0sG(9(B5GUZVRnpSCBPGs$0XPUMra1Xa$>7t>CCBv)7iet=ST0ms+y1G)s{G zX90&!TY&!}3%C+w0Ta|LU}ujx{9J1eB*`2EhUTp8I+igG$HMabu~20{79ziy!ANQb zH>aC{*vkx5*jQ!#c~g*GVhTBvP1#tEDH}UB0rRyc;Fn+mk)ur@?6EPpZ8rwp9AkK5 zVa%@22z;B3;C_)2WI7o!ro18eP(xTV%@F$C4MAPf5L`|hK;V1>2=Oxjub~EDd~pnX zTQUY(L&ktWbqpw89}SK5qhVy^XjrB_8s7Jg0*|$$U}oGXXx1MESNlf7!zN})BjM`k zk#LBO`_A4x0=&{jz$e2IQ2#_9jJN5-_6&W{HqnQQXT#yb_TiwEH5@!lheO(c9+d9T zgUT#D$TQW0@Bv*g+o20@Gj(CBi7o^@(}Bm^bU=`y15b=}Aoz(k?A)RapHj8K#y}h5 zA8J9xMlD#Fqy-B`YC(CQCS!tYf<>Gryw%l&Exj6y5vc+9r)WT?h6eOsQwP5~b=VrB z&f2ExV0BRq;uovIG(R=g23Lc+)2c9UwkilbRKe?y3MilobXKUqRA&_!_C*;Q4=KaQ z0%fSRQijhjhk^gjVNjPb47v=4!Iyp|P-|3zF|o|Fl|bW$B7Cn^giAq+ti7iQp=TA~ z_Z$US@1X#ezlXvBHjiLbIuxqM4TYy~<-vB3Jmh7`LzAIAwD-$F&pJ8ii;{y|>T;}~ zDhr#dWua)IEI3Qa!kgnmU{&Q180RzuPJWO9&wVm*G+PFS8_7UPzcjS3m4?4lq`^*A z8X_-BfoOpglzT}*$!|%>Y>|XXMUpVuS`uD9mw@eCBp@=8Y3Ariz^Lv2$hhJEh-K|x zq9pT|++h5$*>8Un?X=%y`K>|nC18-ao%}`e9e$DdJAaaS`ag-F_6Kp1{y|=seJ2ZF zeItrV-$?1TujKrMuSBZ#3o*9*LaaA@CZp6olkams5&j#~{mK1EKHvL5L?Iu@rS|tk zhs`VbZ+}P9b>5N8#cxU2;2UC`_l7*|e@*6xz9t%{UXjHPugHsSFNvM@OOm?q1*!V+ zoXp65P6T%ch-csc`HRoU4y$LxrHN@24SPzoXFMSp?;ex&Nsmd}LE#A_JDDp`pKcZe&TxnKG_v?pGdd$vANVfQnBtHSuyk;SzU3L%zu7|BuCvLMrUr5 z>r6*UxTTkTQ0*njGj9?4wuk(S?;*AqZjwOPn|rWEW}a zI8Q8X&XbyT=g4i@b40!PEOC8sh6DyOYw0AeMx8{x_B6Tk>l9gP5~RCgRFtF4Zcx`sAVA=O5LnPjxuZAwmgQ*y9z-0>gTW%(cJUUiJz|96!1=N=`OZX6+d-Hwp*orj6N+F^2Ee2A1iZ6<$% zn@L&ALDDzoAhEALK*~SwCwmk2lPhQTk;gXs$g_sMq*r1u;dA$pn(Mns5Ssz`vvn8Q zsI-gNmF^^m?(ZOm6L*k#2ey-2+S`fl%xxs#`BsuQc`KRKvW3hWy@gaR+)R?*Zz7J- zo5ccB*&_eoULC^v@j&IeQs-b!jR2<*=0eUb}>R`d35lX4WvRuxc`ITs4{4u$T<~UPQK~Eg~N0 z7m_R13rSf00&@Pxd}5z8pVXe7M;?uxM@*N^CCQ)XkR>s5$o}KA$!Wvcq5bre!4leF-UQEhfdYi%3!c`yN4KD*1FT zpEPdEBjfT!q}fSG^#10O{Ifaaz_M&|Cn}4)AC*Zy4y2R*18JnCER{@iPa)Q_$>hSN zL=v$ofpjIr6HDVbB7Pl1jvbCB{gqMVvu7mvCO3r)Tn;CvSA~&f387@7(PZ-WWiXlD z97Lqc14)Tn0J$OUPsUvEBMEgA$-*dKvT4Kwviq?&*}Th(EXwyJNsb=G_?H{Gb8RF~S3mBg0R{j(<1JFQ6kVoPEf zVnN=jo0HAGW@KWcDd|r!Avq?-~#$y*7Cotwql3Ym!Y5)QM=T8nMn+C66ss$dY%%h~;4=a-vj`_;CuP^S3;4 zZI>gP=E{=46Nj+5a2e8gNs8R7lO$?WBuJIbU+(15LGB~@$*FdH<3{>@;dC#3|a}Q?T6edigW-p`g5Cq% z?f8A1^TXX-b;eHa=8J8dX5JPq@Z(0VqO^%?`nitdr?25INv`H@&#&kDhA!uBFI~oU zt1aQ^s>R%9y@lNDrg>bv!5l6rU?w*hCgzsJmU5b@Q@Q0iLT<>^EN*IfDtCQG0%yG- znwz~eoV&a-nA2*U#6@lO;a2Q%=eiDY+@DrQ&Z^y(i#=z-&An{G?duuCUGLLp8jsrC zsMl)TgilJG;HMn7LPDA=SNZLFdE_ToORE>IwWQzm*QA@S1<@B=-)6SEmX-YHsyKI_ z>%Qe%ToX5~aUF4Rnd|H0^IRL&mby-FNp-F633fgCnR6YZZtA+DD~C zORbka-)jB-;9={li?3R@wR~wc+4{HD*-wVY@k4nddu3i|ropcoq04Vj8_6$}HRLA` zn)2V?Tk_(kcKrR@PW*^Vgm>-m;BAjh;H7u_^M@Kkc&;vjUq3g7?=4H@U+1Rrw-d7Y z#>pby)w_`2<5N%%8(&{hh}O%~`_hJX*%r#4hKbU#sV> z0#@^}r`GWKWIZo9+{A}iY~uB{Y~e5JZRazV@8qAz@8KuS+Q-*_Kfrh9AL8#mJHq!Q z{Kp@?(aKi_AaBrdoIl{w&W}29iZ3!g!|z^qjz6t>fp1^X%{XtD`P8Coyv&Ome0Ab2 z{=@a#yz8WUe9H0ryukh;AF=Z>KXSw~{%qZIK6J<{zP0iVFY)djZ<_Xzx4iY4R}T2b zUp@YVFBmt-zuxwTH&T+ICwwL8q?uB*y;Yi;ev+YLOIg~MAxGad$QHO4rp-Vgd)1z134X0hEBj|yo zk#xrDQIuRBO&>7&zLROzQT9c43t>ZbeBpA8dfN4FoHD(O#Uodf6`K_Gp$A&A=E2&PGLlW7Tr z(y0YuG<<6~)$5I*=M*Aota}u_Rv1lfx5v=J+p%=5Vm#g9oxik5UllbjpGIYOPNx@c&7dyQv*@pNv*-c) z*);6JZ2By94i)^I!}wTpsn6JXwBh7D+7~sSs=b>}o#ro~{v#IB;3EsESHL1_@@NtL zUcQ)8WyV|EUQLIMub~^R*U*udTL%BrNfug z&CSbc*~Ar;>svuz7uM4yax1BR(@MI=eifBDzltU$uBJOat)_ho8>qy{HB|jDGrzS| zqHis|H+3D|K4d*jSht=^*f!D?ryHqyOcR~?ritE}wSgLFZKP4VH_{5XO?2V4O>|!7 zW}5eNGxb@zg~}RirT-n>N+Tw1qkZ?b(eQ%p^r+MhD!qCK^)TN_v)gvks>!=()#F_> zr*t>Q~#&U zba>ez+ADXM&RBbxs#_kRb!|uJ&)}mp_`y-SWa=^6BKaTfUhyBjXw<^arG?h`w$i{` zt@LXaPpiN4bm$^Vi*%8m-Gx+!Yok_OZPX+7IE9zTsbS>_`bqvI-M8i>)2MEz{VnY@ z%8$hk-0GlGS*NJ;*Hd)LJQi1=(Mf~0bW+oCXXwk5XXxsXv()nbS@wBW6a1K#Bx{c!3Y?F;Us&A0ogApJg7Wc;@Jihe37{eVU- zeL$D%Jfuf9Kcr~+i0(f2h|chMOu4Sd^ltbQn%eh-Ue0_<4c|Yd@fFXgSaN{QtRA4b z8qX?Yzo0eyU(jLBFKO|Km-OVsSM=lMS5!XwHI;e5H14zB(7o^8(CD(a^!cB+ zG;#hr+N$)Pey@K|_4Pkc<1HVky7@=?^x#Lj-uV-CIsS>Z_Iq-+dIs9b^;J;K0{?U&o{?Ql%2^Nbefv>ko;Kl(7^c^dSeYujDu~!oN z-$2z6qb6gh3|CPmQ?s9lwh8$i!A%{=@%HeZ&dF-1Zj~yrEvEi>g zCb`}&?7s~jbsS19{P(j13D(LY@1%pSc zVql^wa_d!5`;IC;(N@DvQ`9hcg&MxPqK0L|)bUe*IwrEXF8+)<%1CRVyQc=`OlPrQ zR0C_iYv5c*O%xSsqR#C;;vEw`Oi9(lTaAnpcUuqZG=}4ikl`r9 zV%kj33`ZvkeRKeQ98;!`gU$MQ_O(9FG#!DasUz_C`Vr`TYXlxs9f>-DBQaHae%Uz+`yP$LL;9n!G;%bKtsRZ$&yU7vsWI3CW6-m746Zvc1|L5k zgSrL=I6lq*L+TB1a<>7x4KYMLcSC$yW{6D(4bkU?A>JNigmJNqA-CKJ%`X^XsgyAu zB*u8F$Qa-3F~;|gjq%}d6FeDif=jARaN;QweD~7?=Z-T)xm;5$-(-rndQH(##SG&o zn&F)3X4r7l4A;Ci!$pQ;F*9~7+SZN5fwN<==FeChpYd=D2T|1wQn# zKq;{Wsx@2SumKDFrf-Rt!Yr|Fp(T19x5NjZEHQU1i;qmS!in`(jAvqnxBgh6l!G-6 z&#}faP1dM>-5Nj2+Td|EGgLa&2KBew;Ql){XvJbM*Ld6Fhca7q+G~s14{UM1h8@=V z+2NupI}{zXL$@b(_)B{nZVMQPWX3pbJ2Vcho{htWy7qV_&>p2{+N1GddmQ)79xZhp zP&Lp2A5V9{P0bD%_=K%%Ib!A{N4zO^MBDw0MfboF_ozAH1s^BuDRsh2JDu>*9VeWv z=!|Y|&iE|f87ntAkol^)Cr2&Qi&$Xy{g_?O@=8$holz%xq$osI+6 zy#c(XKc2<-jz?4Rc(mC)9u04gM@cz1>~?a)IT>zfRPTldJKWIhgBwv_2?x4Digo_J+~CmI%cV)8~$T-5D}jXync zov9bji}1pjSzf5K-wQkLcwv;RH}=?jqi3==uBu_{E#CO=i8pGg`k>Z$AN-f?gFW>= zxQfLjd%R}r+7ob!_XIqdHvu)*GR|G+1f2eU0xlo!i*>%fD4yzzA?tln>8vjv`{0X{ z^e5t3--&2Fbt2AMHxb)9C*qTL6Y&e<-F@)(!&@Rh+_BmZQ`-Gd=9M4TYfM5Vw@Fx# zH3{2lC*haYNvQRB5*jG_qqd_zeoOGj_WAx;a=;(ed;M|UKYvsj8-UrN0l2>+0Pk-K z!0+b+@Yja`e4!hNCp`mkc1|E#)dgZlOCWka2*h2oK{#j~gf5Xmm^dv6^R@BYhHjXQi%(C+y)PzX%dk+~XCI0+(V-YIEfj}r4#kaULec0|C@xnH z!{_#4XcirYp)B4#ePb9Voeo2v=V7R(7>->w;g}m9j-N}zF>7r&o@xt6xrgECBprc4 zrV$wIAA!!I2pn1)foBdyVD8Nb{QfNh^Yy0SC76QRNmCf_X$q!onSxoJQ!spB3XYYJ z!~ye2TpAdOBl9A0^|DC(aWE3SuSH_nr$}6(5rqwoQ8+)6vG&TMP`@DxPq#$jl-p5w znZ^Ix=|y7|7mWvFqw!*8G+tdBjVJhMTy-ZJr~Hh@LERXvag9Nlm>A3|kHO~EG5Gjc z4F0(pgOXoj@U40*o*Ea6Gecw1q#zcLER99;eX+RcLM&c=5sMOXaj0t&hk8D7D3uzA zHyFEMX=5DP(Kw{NacKQD4i~A%W4CQQ{s@XkB|$vOFO0{xTjPTvssBavM~|e zS`yLsdLlZ#O~hgHNsPssgk^3?C>xW6Gm4V1e@POW?o7g{jwCF&$LwnoMyn*FnRzny zdneXDzyubo2BwN#P4C7XqJWWH5UupP4B^|e$q@zEi zV^3&0PRdHhtySsxtS%i@cBJDNOh>(|>G<<$I(Ga_$EnI0C})&`^IbCVbzla%ret7V zNd_)nlz~ecGqAil1N}QQQ2KTTZhM`9R{t`vk+C&Cn`ELrmx(b!jI)uPiE%}l=sZ6Y ze>P;|wmoe9cqSgal8LI1Gco#0CSz4*VUunauD8g-S>v;qZ_Pr96t-QMg(K%?;ewS} z*t%L$ zeJ-x|$iIIJYSTHku%w{CKrv?%EMfI z{5qF$G;;BslmJ7N1-MF2fStwyykjfC9>z>*^%dZpPysr`3-Ds500X89@Ss?Lzvl_i zu9j`D6=2|20Xps%pmd7>`F6%%yugmXA;1au1-N=ZfS2D3@a+!)evuU7BLyKI(-7j+ z5kgcm5#l;)A>(WcG1*;+O%sLK9wNkxQ9?YPB*ax&LX6B8;$W!|7flzkGKCnuM2KtZ zh1ju9h*viY@hoG%Y&|H%?EhGP$A!4%v=H?#2vK~M<#kJlZ~BBN@kEHfUI_8tJGSo^ zA%_1F;`4t(Odle`a|$9UHl(=-(OQI&_9EzhE!emQ!O{OBeV8F^4A;RlAB5YO{Vd*dt z8pw+T59=&Asl&I<5vn*jZe z2(WCo0GDnQV9hE4POTB(_}Kz{UnaoCA^|F<39uxZy?a3d9P|>Po{IoSTd{Nl0Y1>L%uKrs+o3>3Qs3qkaq=Xw7)&+gvXnBAS3b7sDulRK32P=-=L&`>Jptk%0W zL+Op)P0f`3+NO?;E`79}*tfB(S9a%up*#%@CT|keK zGhiJHsHaf@P48Ji_kRx|gLgwH@BwGV)(xSkQ$xs!*TLUc520PNhY;|(SI{Y%P%TMw;eKD`w!*1r&2VU0~9>}MU8~FD8d@7lcPnEg(R3DR17a^ba z+2+#(-F&i<&!?JCc@)@`M-`Xy=-)BUXWEuWnI(CYHzki!2j@}0xIAiuJlfnhkDPnu z(Vi~O#eFxJ67CG9In{%yw0tmaT|1Z-77wP35rau5bugXuA54CZgXw7R!K5lTm}1@! zqA7PcTlXwy?Cu*x1*-;;ThSnTl|P7z;|7s}Fo?!j4x(DsLG<_gK(cx|kX-8qlJybJ zb=o+PF3lQ96NV2Ym85~hvw6~ItAXULHjpNM&!yFmb7}L1Tq>!^rMxw{WL=a?HwNcY zE@wbBx#g0#VJ#&sc)=J4>nv@iB zq;x+>N^9(-yze2Uy4Gy+y_Zd;ESp|$<$a(z*_@G@O`cKNWZ{}kKYL|!CP@}$Hf7QK zGg&lvM;2Y2n?;&KvnVJki*jAED4(;XlD}t?6Yr0G5;JK%@1Hr$%%nZMzor_@c~gBk zYf3qjj&au1>1!Eu_)rFwtjM5*@w|V>nNu4$m)W3C2F+gAlw``^jDZAzl+my&2vSrYY|okZtyl88@&q-};t^!ZmJ^}U-& z;l~mwWqBe+jZ7rRh(!8nlSt*=5-FmY^ROv_f;S}4j)@8MHa>w2oD;}XC4t~oJUN_; zr|zZkbh$8|rXkD##45oA6gf?h;M&??R)ckBqKBaPu?zCWD)D-Ne~Y2no75>A?m;iUH@ zj8sl=9@gS8Iyx|nhDgFlQ8SEIz6vGf)1fqcRVY;s4W+NXp`_b8l&n95klDEqQd}QG z4@QR2+Q1O<)eoWDpSZtyp8K8~f=Q3_vND2#X`y~F?feu(`)Y$|)A}GP92rCb0YUV$ zcMz?6A4pc!fwXxw_h}0PDb72PO0)v$*vkOAR24uMmjuw!+yGkW5kS$(0o3`(pVl4r zC(}9pv@+G7TJ8PGr;GEmZu-%NU4FE0vLEe^@S~;1el+NdFIm<4(#1&;-sM1Eh8 zUZf$J*dqmX0Ht2#wgo6?6p*nmP>Tl8S{_^QJR;D!Vu2umv$iY*`qnBT_gV?%u9DES zK@ytfCgJfS38mcfBCDNV^mLpT%@6P*BW*7#eKvs9jtrn-GY8PI*a7s;WB{pu@+8yK zo@7$uNy?d?)MDpJ`+j*)_9YMMTH`?_gFQ&e&4b3tc~IRAcTy{LC!Z1SBo*9gxRN{N z-F2hrU2bGK&W&FAy3sl{H}YuePc?ga+-6dL+8NlNerfh6e8S^8<^4F@svoTn?nkS% z`_Z(gt`yJXKfMcGsVm6wES_k4fP+I8d zK%;)zQ@}ZUQdnY7$5ZVo$-#on}oILDpoe zW=%$St>|B=72O_UMQdHHD6HL*-qu*s)J2x`JAre&3@xdy#e(z>SWwag3z~%%RH|S> z6 zN-_-Tq?sYzd}TmQ2YAeMoB^HlGN95feHwmVpKKTD)16p-8n3HQ@=blHcv~O(lGlgg z9Qx4qFM8B+LXUK(>5-S89z}K6qqr-*DR^0La!Be;^7_5$%41!cwL_O2hv?Ep2VF|| zqC?k@>kt;|&_-_^dMBqt_B=M6wWt@(i0Q?jlU}s`t~M>(s7;fk+7xS{P5Q62=*~VZ znl)03%=&53;cuGMuTqnCP17VLUroxE=j#_V=qrcW_wDFB9*_NyFJO--N$5oZ4wf3Zj<2^}la!-nr^rZhfRA|F# z723<=>HGavXiGO0ntef;GUqFkb+|G;SK*AXt4h>=sS;g?Ria2OC8}*yB=qu%QPPX7r#{hCOKOqwZ9?r90=bcBcuZ-6^tJfpoVkP-CtF6ZJHhy8C_l0$>`pouger7&PJ~2`G6EmInk&Tf5$hJ@az^Z@0XO||uXD3_Vv8AKl zvDkNSS$iHI?|JryDP_N5Bk#XvV&ZG|_4+HO9r218UUkGqJ5>6G|_!Q#zN}>qQq? zH@S;Ub@Bx!_whV?G4MP)cE6U5iK%7!=g+ajl5@=M5YO>sRl~Y%tY$G9)olKpv#g^1 z467M+hMj9U&5opd)h@;G;`3RfO$4Q%c4y(SxVJ59O z#O9bCV(V8OWLtV1WXlUH*!T|zSg`B>Q*10}RYBz}JF z&uTN*v&^gO*h^f;aw^ucYsPDt)6z9;de>@RUaQ&9C##rA>?-DUb|njPS;+#nu3&B& zD_HLt%h~%+%h+-0GB*19QfB0{lu^YJ7H7PK-7P6$v7L*VID9eFZ(77gL@Z)Qsur@h zwhNi=`UT8gaRCdRG@nJkoX0|w<}vr$xlFhJT=s6;9ClP=4jVOnHZ%P=i=W#pmU*R^ zz4j_**P~~$O8XgXq2hEF^x{AEx_TO$uw^QHTUf|KQ>L(G{U@_(^+~Mh-2{FQ#%vh<7sHpXKJ8>gAiWbX&F0T&0c zj%@>3`LtXXl9I!&xyqPdPbu5_GK;-Go5?IUX0Xr+=`1ZKjiuP8GC%ngruQg`Jvx!d zmM%+RPDA5aRX`kbH;QGOzDM)-Gm3fajbuZLBREDjoUL&SV=GldS<%a2mU0$m%*W8b7Z1-Urjoxhheq@(s0qdD5Fkd$b8`RT_O>XgI)0hVvv&x+%4|ih@ zf&E#lK|i*?)rBQqab_R4JFzK+j_iA!0~=&(&uahLGTnQ9S^7a6wsfvFJDFw08r&?| zV-*Yb=$RS2UTMmXE;C_^@{L)Nw-M9UF=Vyx^x2S_KJ4#0J+^pMZ>AEg%Zdzj*vqfl z%&$(1EicvNW560rEmEBc=4veKXHPc%nhKk-Q<=>yRAQ5371==R9xSLsff?TH#@_6f zXZ!z?V;6S*6)j``h$Dah7I&5X66@lAhz~m2#QVFyiWlNPi`zOsh(q_h6U`Fdh!;Cw zidlPF#OC;CVshsbv1<1tQ8oUd7~gSEoL6>7ERVeyJqSbtQ^^FJ(By{i!ASC@OYO9i6d|UNwNORRtWj?2C|Fx=RQRk~%K8aNimK~{D z+HY@F%&pQYqls&(e)TS?dR{rJs_OXIs)k?Es-E6aRl|!VRo^byRP9#LshSfjS7m1V zsB+!Wla=GVS5yvNo>F;nPtVHke`cJjo$ltj#;9Vzxi)hz@!klpyV;w)E?uwja`Juc zC4aw%WY;o%NqdN+M83;MA|8*Im=7N;aW|hVX&*jUa^T`piJSR)$>M3-B`5CemmG9C zE}63Mv_zxjqGUWaNOrAxAldfmxnxM_2g#4E-z71>x+JIeDhT_Nl!Y1p)Pw;Cw1tLL zJt3l-kx+KfOn8=VEp#f_3qKAy3)eH;gt^_l1cSpUlw|k|4;4a$?uQ}-)$~~5qkNLE z|3I4Hmy#_U`I{?r?9CU96NU?YIz|icc1{phM->V>--`s#8^uDD&e2Ziz7I;xa+mV5Kl;E~FY`M@NB=)`~ywATQQDUV6S0Lg#%D7TozH?6dkR>>J-E%s=;C2-5l`G|PSq83#LsBb{BsH)}cg6D1Gd z$9IFKjS6tMraO%1{4^^KC8+gKhPW&hxH79Jxb0Jg1vk{7{<}JK7;1ukfEHL5XoJDh zUeI++2W~vjg_6I$!Na-_)JNz;^cVwRYYah`89_#~F_d&Sg}wG>a3t0oc1^H=*&8e& z`ivFGwOGS;#lGO+Xbaoo?BMSNdkEj)07a)AVdFC=*wNhuR@=G4=;(gnKDIx!tagKG zmG02lf9~iIa2P%R;EX)dkFVh3TcY6>_ ztPO^hFGFCRVi?S}3y0Lm2+$fC2}hSkfp9n)_TG$vKdrIgr4tVs9tn_}k_fSrlfZI) zGCZnGfoTs?;a__i3^T}pDj^d-Wn_Wkv~1|HNeXX8860_-1Jd8Q@L7Kl8@W6MOG`|&fyhc=)Dr+F0X_M z$*W-gvsJKQYE{Y!)9=`+5&Qiwm`L{6h@pcg&wh6VabE7AkPQ=2YuQGM>&t}v-}R| zvt$Q2>+OX8+joM6!!G!Dd>35tDTCs=GO$kA4JVs+gInGn*!*b^v`yX%9&-C2Z_z%O z*=s*6*t{S9vo7bXy>hS}Z~&g2JpgmVDxmkx3Rszb5Pm;92r}28 zw-z0N8ttR7Y2#7Iu{Z{r`;Wnae#gPB>Nu47odEf|6A&4D5~klh37fM|LD`E_uwi&5 zOlhrzfWj*H@wW=r%oD*>jlrr_48H0U2-^ro+MI^P2TsGP{%2rr%}>+8&(TGpKHN;!g;W6KMy~OF2E7_i;yz^BE0CynQhB2 z0n@1ig$;Eu!1yvGZodqv)>j~S-xV-)s)we-^)TE0D)g$n3QOP`d_Hpxgn;WX@&eEQ z9(Dtk)Zc)@mp5so!Af|m3aq%_}xIRkI=oZh!#ZT=mY_T~e`x#99zQ9KM0>8b!g71m1 zFsxrI6jrpt2)i~2E^7mM^KYN`VKAXKR|EM4{+)J6C7s#gq|Hgp<&`L znDXTpbRXUhlU}yN71?j-_V72DC3S$=^$t)7>x8Q{oiGLdfZ~ZiFx9yW8uoO7iuqsY zyYVmB_WB2^CI8@^yd3)Z%Hh0ea(MQX9KLOn!|tx~s69d+HTTNnzZQ9XZrTlxXLiFv z&VO^h)eY~cE8xfo1^hWz0ms%T;NwmO1h4M6aC~>Xe6TyVzvVh9>mKNw!}U{}dSKtX zJy1XJm{+5S8l8%`-%|-a#wy{_a?XQ$rG!Oh%6K(H8CBOPqxTJElq##> zm_QY-LsY@MQz{t#RRxV5dgAlJJ#l?$PxQIp6YprLVpgOo-kPI|a7GnZ{Zz$Au41aEvnV=<1cmG+fM_NhH2pE9U3^TNdtfM(&X$iO*}J4 z6ID)YV#s%{NpsS|C3#x7VT%^7xubaaAu| zbEOx4meb)A=XG%G7#-ZOM+c8Q(ZMQRT|6A6i)&}=;z&^!`+wEN*L{0qiL^JGt>MhL z`rg=EUJs{u>EV@8df2l}51~m9Gqn03pOcOGMSU>wSRZtK+Xp*L^zlTJKFSv9LFvN^u+_oBG*lk0!Q8vO>ZzHT2XN0MHjPP@l z5l+@L#*ab9m{4epWfjKwnrjRD^fti(5hfTs-2?-UnxNAw6I3)X#T(J4IIq|g9Zs0y z**B)>Z)Ao?W6e-&wi!xKn&HN`W_aGn93OLCW6Laaynn(R>5VxqF|@$w7z^x}X@TpG zS)lnV3*6Yp68}Y5Vseost~+Fjb1l)ahuEO%1{-v`VuRRWgA&KSXqnA5n_RzHbEYp&_}mwD&1`X3 zoGqGh{@kJ?w)pIsE!t>v{#<|^P8ny1^LE%_aibj$mA6Nq{`M$0&>oMju*bL>du;k* zkBMduT&L-Psxurg>YxKoee8g%RUL6N*PN~#=7ZubxQFF%L=!`JT8Kc)bW7I`w^!nzES{5#NH`WCg7P+8pxeK1S?}E-fTyeFV zE56EcMVqCrn7~|d_#0OoquUP$1@yy!(fv?ub3eRT*AIt%?}we{{c&nce|$N$KjNPL zIP+G2Jp8vmUUP86yQyy69dN^ghupBJ$ql^}-SKIE&a0EUb9RP1=A3ZHs%CfW>gj>5 z13WNhpa-Tc;mbiBUl8!eM*&lN1Mc$SdgpvVxn+Qwr+_mw0NZ*X^5VleDTvO~ z5o^m3gRUVS{)VVzLd2sXnN>oi8u> z;Pa0@=%V9``GPMl$nnLs^L%mH0biWZ=!=2Be6h>e4|fInp~p}^Ji62m^^g1EhzEYS zugeb`E&cITm_NQ8>5n&7`s1!s{+wauj~a3TSY{o7HW2~1a#R4mT^WE5rvfmoDFDa( z<-9!0K+FjZM6cn2*ts+i_a6f93PSn$L1?%?2+ghqp~jaW ze5)Od6&}HuofeEgrv~G+Ey4KiY%m5r55|QGAy{b>f;YoL@XoLhJYT}K?*~ILw;=>I zxfXt3uTXUK2*r(DAKyAT6g@VC;y^JJr#6Lh=3gidH4Z~RAFi#Jg<-{vFbv!lhPBmU z==>}UXUm1-IrDJ*;2)0va>KE!I2>PX567ySaGdlk9F657@Ss@)+WSS|av5jsO^-l> z(g^f99f47gA~3ik0{a?7;y15IEKiNZs7aA{Z#7>Y)IYwb*L=<8{ z6za{3!bdx!aB)o(T0M=zJ)KdgV-StQIa{DSDH`vNjmCFNqw!67G&a;l|a7K5WF#2_u_tbzkE*z0l(8o!J|ExB0yWE6`hykapwDHi3%#Nyn=vDmgd z79-BZV#(uJJoPIU>wCrFW#>3N5*~-M2FIcIj5vJ0Ar8kJkHa_D<1qYf9Ioybk9EfJ z_-a5revFUDC&S~ha&A2Sw>6&gf8w#aF&_Os#N+<%3HZk(0VQ4uD2q?PQNt2&$ZXF0 z+nm5P@dR(m9&N^}z9;3Q0&mW0xkNf@;+2`#IW@WtIET>3Ey%@vYyi$OAW<1C5z z&}3Ygos9d&C*!e&$+&wf=LMcf=Deq5{N9|5OMWDynraG8GEc$Fo++phm4bG;Dd;&V z1)UbBpz5|1ymLGS=Uq-g^Cu~|t2G6+6jL$ZFcr&OQt>Kh3O-6r#XG}O@zjh|oV|*3 z2KS`mEio0-ucz|*JrzyAr(%v$8ZIzG^x~nxvz?YdYTWPsdS->G)%CI_6JG$Ljg%D8C^co%VAs zAxlTRnvUj=)A94ibS&#i$6$>NylR?(-mV$A)-MC^$7P^=ZU*X(%|NZ<4E(-41J7;C zz$u3_uy=I^Zn=?xYELsT?^6cu{*!?>R5S6JVJ1GZ&&0EmOk5n6iN2|PJ1-LlPRPWD zS(#|FA`|nrX5x~HOe|%Yxb|`;PPvzf0WUN0TWcmR`RCA5Fbi+lW}&8M7J39` zVPISq3fWnxKP(HICuQOC*;#0}JPY@4&ca^%vM}#N7H+M{!gJTM@Y;hcta+J*TfSyt z?w>4FSI)*=oSkTHmW>M>vhl8GHmU_=qf>M?dZcBeHRmaIjm*ZgQ?jvOb~gTAl8qDB zXXCvc*=SLbjVY(Haa>I{PO8twL3gsz>uENAf0K=yTC>rvGaI*dmtvQ?6odOnae}!N zOE`0-#7&A5QHmkKQv4e&#ce54&Nq?b<{?u2Ia-Rs6e;G-l;V^H{6EX3n6_Su*4w1` zV2>0h9gVT8L3ze{Aez*mL}!7?m}km2!I8NN-DVfPFfs>o#c zYmf}D707V$NEzq)$*_8o3_YjGaLo)EKH}U+)de!NEaA4Cudn8xt>fQq;=kD{!?QbN z=(<~mi}uOz>H!)4I3z>mWBgbrW%#;MhDVtU^Uugou11D)Yh~DaL53l9GMs%yhI={7 z=EQXwmN&?7VWSLVZ_Dt{9T~2^C&OM3WH|Mq46iit|2~%S_eq9!Pi1J(%=f|V*fSYs zKbPSrZUrs;ciePd$S{=KKyG>5;<#CHYv$k0;ikoH9{+s{|F12#6uzGke4oSkzT@~Y zOdrYcEPV9-OkJKB)>L` zvof4WGCWen_rb6IIWL2IhxzqY@ax#mkH?ukXLribdz%c)Hp}qadKo&dkzv#d873`} zVemp3n#|?rI+K^>fBYCzWVmj;41bT}-wl&tVID8@92suR;W%v>I;qOAp}Pz-|4Q-3FDW{-N;w-wid$Yt z@#teI9=Yx{ zvvFAqUw@E|-)>~1!o_UtWZC%WNH*@?lZ|Oxvaxj~e-{^IAu~~R@a2DQA&BE6aS@_gD3#(nTaG_-uV(%=xr<8@69hq47 zF%ylOGcl_%lQXI_arH@FkL}IG(Hk>)Kr<6R74bT6G-tTxX5!3*OuQGEiG4hH-DZ=C zNqU(Wr<95A?YvHXmw}ZJGcc__1Dja}CLGAX1DvJwr6dE5i!!kPNX}Hs&OrTW&R4<= z+~t^op+*^at7is=b)@6&cj@@)K{}dTPDiiGbOg>@>bo`_JLjaMI6fT*4ot_^IL=}6 z!SJeP)whtu%*mNbl5oQ9XDq+$R3G@O%|hSh#) z_|hp2+YHk1onji+e@n$Ryj=?8?bA!%P7UYnRTFQw+-Gub(}+~uk(P>;LA*V4O~tK7 zshoqBiVojWuz@q2r1dHMT}Z(JJ5sQCNeZ5vlEV9LDfloZ1?wd#xZ5fPhiast-tS~Q z_#zoyZY1M|s$~4QGZ`J0CS$@B&gvbQjM-7i=GWikK@oOs`-S3K6Y$6@8uI9zstvyIE+uyc7F zuACHy+F5b^?UZ&kc>mp)s-8(LWX^>&4>Z zju>=qj=`blV{qBt7~EPCgB!=h;EbdgjPZ)$eft=!_#4eRjL~@VVl*1;kH(=(c;9bK zG+s=M<_ytjysjUOM|oednD-flb5ZzYR}_wzAB8W6MqzkV6s~uU!bZ&~{LvbT-S0$V z*U3n1Ss#f0+gh2h4EFdVxi4BbYC;j^eP zEOZRRKRv^6#QRXZcqJ5j?hi#=7>a2Hp(qOt#dw=gbm<<7zgj}D;#>$uZx6xyGeR&% z%9&Oef?Wn7IG{ZkGw%iC@Dst9&v{nSV}sE&HW(i}2ID-HU^ILagqtq}q0-JE%$XU4 zJF|nZQ3%41dO_IsEf8Pc48+=lfmpIQ5d8}R@p(`njy4a(*M9;q@?ijOIvIfXxZm=Z z`!Cv&-1-LKANc^h{lp*FiJS$#)}M2l{IMX~ADe9bQBd&5xljF&L_d7G#t%P@@x!-~ ze*FG(|4Gh|`$fK}amp9>tnfvL5x%%N#20^=`J#V^4^Fz{!+n1r+_lgLO9%Pj9B&^? z)#GgPuijXF#T(OhdE=uZZ;VRy#(l2d*sAP}wk?PegqXetF=-Sc@*>nUL%jJ5aQaQa zKKlW;&H~iV1RUoEc(y0-@)Xd71njq3K-Uoh8U+dX-B3W*Cc#nl5>(qM!3|R-*egMT zg?19W`p*kh?|Y%wAumkezHB=8X`|h}(5a^vc03z^Co2b_blCuG%NxM^LId!HHs@!( z^~6PIJ+WquC%zo+i9h^3@tYp^nLm19WvvHJ-{67$M|)snkOyb_d*Gwb?ihT*9XD-s z$0wuRQ6tzLoekVk`0U2pT{kq?;D(<^y5W%kH|`s_;h*>YaY1!|lv~puhYanHqIZAn z)as88ulixA*bfty_QQyQ{m|93A1bKu7{Oy#oOr|)wdcBGX__nQIlAKXzb<&I(FJvP zyI@G63+6?+;5btk&faszlnc)2#N!jKJWf&O?TjIs&Uoj!6DFQ;!n5<8P(Q;7a~+*< zU6&(LgCpM9;fM_r9C;hL&-hzJzo8We)h>)d6$l9kBM6J?fO%W6~sh zoE2)%+iZI*e`|+jq8%<>Y=`+-cIfD2htK}l;+*TYsJGP?*N?VEML%22*R;iB&3*C9 z;l5~C+!sCK`=XCIUw*YgqZ%8|uD8LHIW{=V)dto6S!3x9Yc$@aT zd}M`XVR4~N&1_SilY=9;O2Kdp?S1gs`9A2rybn&!?1TGl`r!4ide}mG_-4KyK1tBS^Tv9(=}m7ObgVZT zP4A5t!g^y)uip5cbG`ES>f)_&y6Ebyi!&5;@ytyf{Ip32HS%@P!c_;YfAhQ;=X+rn z&y8^>wHIzS?}f?lwXuuGLN`p;Mr+Ra+M%V5T1{Fwc9#~O8>xi~1GLcVpC)Es*2M8E zHE~*|CQh)@MA=6Tgp(SmJVOKPLN%~ZQv(ejsNgYa99n1TxqfUn!j;>Whwpb0@ z6V=epNDU)isABd3RqlJKVmhi~fPyL-U+u|xr#*3RW=~AF?1>%kRB-uG71W!mg3J6> z@VAl*rZy49ledf-E!9vIub2cE3&j+!gGV^&&s++@-nuf0&f*8K{oJXQg<2PmM%pKjQ7 zt{XmE&<#(t*4E_NQAHPH9#P2Zf&o>x5_Zy_DeFN(?ZSc^j zjdPJ&;g3Tr3_JFfj}Cu@4$cZQ3;zO+4WGe0^)qxm{sgsyKf&1dAEC#%k1*%g2Y5gI z0|?zez}Us_VTIOv*tqT;EH-`zc{}-7h}~Pbb?^-gaeo6Zs$N5c?`zn2{uMNazk;^w zFQF^(CA8ju0XMQ=z?$bR5Im#>p1yw$xnrKg^>5F>l8?y@`qK<0#m%s_doyfa_!MTV zJ%z*-Pe5Jw2^?Mj82pVMgShn(7+XGqVY{1PyIm919(V{hTpq&3qYq$@#{(Ewc^~ZH zK3q9{50d@vLH)VA;1qlp3NPJ(!{K+}X8mn=!gB@Py>Sb~_*<~xRwMW)H^M7E9yKZL zCbT|ifb`4;IPmBOyvx1;I!~{IUCwo|e|8P@23~_N&#%JqL02K~MLo#n)x)BfSKx2n z707vY87lHG!>dB>y7pcy$31^Dn@cm*-(>-g)@?q85?| z*TU|WbI>yI9H>990h`^7 z8{+xcX+>Ze{5rD>+=X3`dtxUPx$cBTZ3oMB+n_~j8>}wb3Lc7E z;ZkuaM09R}Gn2M}<=4$nID9kIyxausvQ1$5a3gppZG?#H8z3}n0}ME~9`tZMygjiF zDqPmVpnYpW#d0klPg?`dz1KkbvejUqyc(v>S_RiTRzk0dD$m%x4JC9rT$2{@XSz`6B{AyR8GTw1sYJmnX``l$=yW9tI& z9KHa?waka@ne*ZNt$FY;avrqQ&V^=}3pbC=ffEjMVCl};kYP9*^jC2FUOmLqFYb++fR?YFS zs%tEa{V)b34@bkhOQT@kiIJeXa|9GE9}f45hJo?$p%9%`00qHAU}XP%kecR!pgI`j z+6Th%m${J8m;;Z_$RNI43dh!E!@t>CAQ_VhvaAdk6PC^yglUj&mJ0n;Q{em0B>s#h zLePx_xFNIWW4zA)3r2Si(Mc%jYbRCEf^mC%HiHirOkwsx6Hr@c3=3x%!LK2PkP&A9hrRUSmsuZhSJs2UUv**r z105)>=>_}tX~W(XTCk~56K3UVfHYhkocpOkYadlO@J|IY-YCPL8%nU|lp{8i4!4BdUk$>v z3)hADE3XQ3WLJdoj&(v}`vt+~Vy*CQWsR^yc2LpAc=kN0|6+m$0&Whp@Y3n{X(tR5)a{St$FmL0CoWgvkrm z2nk861Z%Su!squ(g`=lRgb}kB38t|NgnEN{!su7C1+}BaLg?=zpeU7U?>wbj%El=VJX6vr}0ACq-de1TDWj>XONI7_zAxoKv*?ofY7(A zzi?u;v*71oFI=p#7Q)lah0C9egwVNtgmZ>E0v^>6PK5OooS*g(c2ATSK(9mM9MmeY z9Q#&cSlTSYt7~=hrwl4SNk8V@{v1LHS@;Vs#RO+swND- zS!E%4Shb}`OVx{8@2h@n`&QLB@=q0?xGuJKQxesNsfsEMn&MjzU9o(Vz8EWKBHqro z5G7Y_#2Nh@#Im(6;{FadacPd17=Ho9uXg_8=%vBpmDX@kJ~c+vWeH+;(^T=stV}-F zP$qs0A1p>!6o@l4M~aKbj}=GVohaH%ri!OGO&3@HEf$Zv&Jn9~=ZPm*E)dt%E)oZR zD-rdqmx(8nSBO6IR*8pCt`SvVuM^|+Hi|`|o5hurOT}e-wuuw(?GOVL%fz3ad&E`w z`$WC9&T~vFE`CaZgjDXsvuloa=c{tQ+(|{J6YHY&-o}Y$ zywqT2?V3zUU7It6da<>hI;=WEm)(>0W)H{du`BcXuss{~*_eX{%=(-myLiWlCB8Lg z^_?cnRnv^kv@~brX~9~;E!ht~7q)G*HG4G6h8n9^8xRz1su<*xQ*@5=@-*(onRS6;&89tzCmJ+P2Y zWWj1a%*n);{c-kVCw=`{N?ZVYniI(4#s;yy#lh^&iV&u`Bb1pQ4P(0J!dctR2v+$l zk`4MA#eV#YW@9vCS%YaD>+KTH0(}x#YIGut&q`wbh9|Qhg(+;uf>h?dE{&C!r8A}D z87$&lCL7z3#il>WW@A1`S?F&W>!y^;cIpmfww8m~O4q@x**lN*ip*#BX+xNGUI9}W zHVpH-hEu8p%!_9>w0%Xx8oW7}j-rEPK>Ej&1ocp85Zp!0Nh9V*NBG zv;PdHu>IDBOmv;f4!|@vGvq%uAijv*$ehl?@@KGJV`j3i-o@&SAZq=djAbb6LdOx$N4=dCaeM9^1+1g8%qEpGju$+|}I{vSsrZvK>7a zv0cj+v9-MxvnlHqvv9)_rn0q!F^eTEbN3SV&Tc6ys94JGx-MgG$Ct4g1C}!;E@v;j zSFpd;E0|)?O4fC8C3_LRid9`*#foBAGndBItRZO)%el9PJxO27A|9<}Wt_+Mxp^J4 z8MK~7y-u!#A>iA2+hDQJYxhmrX2Z+-CNpZ8MuXaSQwKV+)I%Qp(o1 zm$JsGTiNf9txTh68`JLE#^h&gXU%`Nv;8x7uz_-%%QkB#+bF+_>CfK9=5{M%PiB`f zD}~)Gb7m$TT|-vS(8dvC{TKEM&@I_VCAHmND@NyV!Pw8IL>4a=skp z`jKO7?}uZoV%TxE<;`(cn16!#zBs|Y=AL9rpPpoT*{9f|ho{(^)JoRxP9@7rsA6+& zRIw#dBAaztWVs=X+1E1m#Fx0{g;)>CX;ygRG`rXD3^P4=h9%gaWutbVWfLu`S$=6X z^EaqrJ=WH+6I$n3^pbO|L8+GEoLaW>Z!IsY^Q`mxd8RS;0#p5PfwkseWHrw&vT0eD znDMS!6^byL+yYMZhh#``9h^-r+XW z+jW~c7~NrgSKnbhRqwL9v+uG+9e0`a_%$v%TlSU}-FnMZL*KEP;yd=x={+;p{+{{id|(mtKQQ?HfoYEX z$j^c6h!Q@r*7KiO_JGfo0aDx1DXc z+0N4af3rV_e{-!%2m7+DgZcgKVB<$|{nX=5HZSTA%VU37U;8e0eSH^8Q~b*=Oyn%M z7k^n~!ap{s`X4*2Cr4Xjr zw47_oy4~nO1qzCETB1k_qZJ8uDbnBvoDrw4L<<6yX!aB(8dIS}(a)90P*0g2Mk>>y znaX5;LYdfGW%4mmp(6<@q%&WI3YZF2d{&_r%buj1)|1RidXjB5Uw-4;wyN|zQFY`Rnq#&*X`A4fK-i+txzMg3u;vKOO38LsFR{hojg{mQ{n}6%KfEIISv{WE7c(9 z6&m!XR)gq=292=Oq@G!tv}vg(8P;gh;x>d;rbW{hX;C?8QT-<^YBJNNrUY%e zGDn;CpVX$pH`*jI=tXZhPi}ruFVa2Ki&i)HB6)2c$_dn=gA;VA8ss9gi}hNmEV8X0HjIzhgoP-Ap+H$&|dLrnF+QDLtq( zC5>06hr-I$)^tjQS{Qh!%se=XG zOtqlDvn|Nzum#yXvLI6>OX}fnNlh|K+Pc`1;!au8m*B~~;j&x+V`EB;hl zk;iK*O4GKc0&i=|FR-SBRo3Kq#+tryE$qHtHWck+Lr)8AxGvp>>QCE{%^MpUt=*S) zV_&N0TH43Uxru!J1^-OlmPUKolFdL{y0X}ovN*Ty(Gy#WP_m<4{p{!?XV+QIv7^um zJ4(B2N2!19DA3lPjNAf=HG6uriQW}J4QtuGzu zfSM!i=KA0z*^V@Dt|M7hIMS`#jx?szk=iYtXiTIN-5%#e)*GE@P>mBU`yWYX9Tvs+ zHE>c=x~022cFv&|cIjHNTkQIZjiREcC@OY$qN0MLB6E)&pkSe*qM{gx3U+|~-rw{7 zah}ZQX_b!l<4f)>ekRY<^9YoDDgJ{c+Ad0#aL^oQ3C`l)nj`;?YX4ha!oWgl{8-i&C z1=G4G!BnUmLL;3+C@4OJ-i`{PWlQ;f@UjrvR2M=jUqh&eStzZSgwmxxq0~4tl%8)3 zr90FD!NnxPg({;pwE7av9gM}<+t;xLLj6h zuv$Xfj!P)Lo^$lRNocB>Ky9G{=ky4)X_`QH)(g~eQXtI-0;zWh^v)dk{$rrIJ%N0t z0bN=L6kh>UQ4eJB4XCFHQehBMaaW`x6Oi_-Kw40Sq_}~+Es+lEgj2X@I8`Kslg)^5 z`fouv9oijE_2WH}oCDya%eesVQKTj348Flpw0c$)i5sJ+=0p@# z)kV?acTqG)E1Du*qNyc1nsWO^)30gKG<&z8X#L&CwLCB&C=xQt}IxlBPmR z*TzU`MuC(}c1md@NlELTl!ktkQi*m9J#>zt?~yU|r&kPpm>5IXmd4PU;uwlQ7embr zF*NQ=3_a70rD)e!DvXMy)4gJ;aY8I-FvQa1-LZ7)R4f(L$5Qxv{=JioM%u~fNtleH zGGw%Pq>OV0Wb}N4jNTuSQS%iURW-?IRfmic4dm47CZ}mpa{ACiP8t8nY3l+x-Q6Om z@5ki)`6{QM&*b#DLr(kk<7l9394SY{QBh_bsf~`K;dA1sd|e#9ITT0Q7vnf9G>&vX z#L+vocoMDRX}o_t>Bq&>=DzV{Fd?3@3*w13b5`IH{=F)mtRBUa-p6=;eF9ZjCeUck zn9z((pp~3Ap*A*wvN(I9WK9A+-k(4}P9=~MXHtB6nLyV&5@@w1j|R4UJEv zJAD$#=f6anFgKBQtVtwsUm~4iiFDw4BF$||q}VTs^g%s|7FZ-vC$A)$5Rt^$Qv5UL zVfal>qSyk?#MqETo+U~2n>euhdJ+wKnna&CdvL5uGTk;#CI^>f>KmF&dGX0q)GL`5 zj7p{vGm-|$`#JCiC%bA6}mZs2=%_;P`g#X4;DCjDe2mEtO3Vr&PLS<^H)WbNHUOS}HQ2$h_ ziR3(x)Ktpsn@ZD0rP6|FsWfvzDh*hjN*+5?>1k;ye@3Q~MolW^-cO|mFH_0xb1G$U z?%^2SG#YQ2Mgv^aC@d(Aenh3w-jp;7@0~`chNY3~#59^QJB>~*<}8wRY4mYd8nuD@muB$I~hGOgd>?;he>~bP^t=(~+0y zWcZ$6+n!DJP5ejM;qoCf|3c5I1L1xnx zlsQX5)8{IvaDjs66)I?Wk%EF&D(LMR1?Pw<$YhIx7HwBh^DYH>7b~d$0R`u5DJZv0 zK_kl*6m>#DN|g#KVG4>ot)Nq96`X0JpvjjMR940FzM`OKH9X&I3Su`DwBVM4gxdlJkCo`Sp{C@8x@LE9ek@;_2g-&qQp#rwf` zih{22en}mxAmaUGJVZg=1}G@6w}RI4eq7D_b7qo)(&fBgqj~=WuUiOjQ$GdSdh#+k zD`=N3?^g?+uaSZ-=<>RB;$uWfK~_IAsNzcog}=+7gReM0v?+rU8Zv0g?F?F4n?XgF zI6vrg2BlPFkak%HmG8?S*^Uf4w;_XES7y-E!VEexH-qj>&!A@$GU&mm3}S=1KJ?Du z9GMJiNXVe9=nSe4%b-BN44UrB^~ENGE}3M|Rn8--RLP(fKhi1lBWIg(HqpAqbTYr2 zPIGJ0>E5|?GCi425r;YRbay(XY)q%1<>{ohAf3+6NT(s$T(5_v)0n>LbR#33y2PbZ zS4^i#{^@*9O{d9LJY9XR-)iY}t0Rs6dzVJvpQX{rduep3CXKYurV)P`le+IqqduF{ zC~o=m2P#mSVqE}2ReB-7`~$>cmVnWUM? zln|3l5Rgpf_Q~`_kF%KmB#}>B5*>e-L@rm8DF0*q@TdNbOEH8nkk4YduKG)uiNuWM_?!Cq5 z-~jamn#Jej<9u$u$LHu5N8{BnQ}@1__UKR1SIIaA6wjoVzoF*MvNhI5i)Xyhv?C0&z}MY)u2ua{EJEN-_Aky1f| zl-~PDDb`rZxo6Q-))-CI7ow?lUo^3$oI5okn)-9*lmYVJ?4k+OqUq@CC^EjzSyM-& zXzSW2x;Qib90U1=1Zafza}T2a*VT_km?i=-XLBgt(;ByHk+=#BxA6wB?^8UM3e zx&3;G+p+s^M9^~1r5dt^bET(6(9PZve9aa?ZMG4dnG-?ci*Qn{3Ma{a&Z=4*P9w*L z(~z`qO7!QpGiOyj{(`iq9?AYB(%ub7W;2i`^+h@zj`Y=rfBy&M+63fy9!Pr^(9?XN z9YcW9WI%76fwI+sUNj3Ns}g8su|PEi0(~4VkZL>^H-SEM66ne+2^CdID7siePZvmN z%rFVPlu0PjSwfptCG_xl7H$Yo9#nGX!3_J}aLXdOl~e}$6c!%(WI45iTZ zp|pESDE-L{C0Sr7a*R4+@|}`v#vf==*@ZToqRac%A3qZZ^~KaO;uyO zNmcGmzP8?!(C$U)w>U5BfET&vd(qE6oS_xO`R;t3+^N}4*MrwMN4li)_Kc5bBi-IZQmbEN~jU8(;JS5i{A(n>d1GWzR6bMLy)(-If* zp6fy*d%DnS9~U~T>OvI_&UCoUnbs_DrqO+!$v426o_BJl1&^J`yxfU4EOa8x{!TP9 z(1|KEoapOgM{+24q=cAZsZ4wN;AT%ozwOBRmL0k7u_N;wJL*X0oPRqzTJ*)1B-OTbf0Hc@|Ie11 zrM8r5YD?v>ZAj^q4Mi-sp)pxDv?#=e)@s_&sz=t8S87fD=30|`H*0F&N0rB-x%fE7LUx1vTBE2_C`N&AZ}X-bYI1tnS1 z^DdS&hx?!O&sxy36&Cb&umueWvY=8m3;IxRPWJoEDJI99x+R)Z4=Wxoq1B9hPMMK% zkr`F>H=|r%GjjN6N+)lcQY4SHP?2p)c2ZNyF*KzM&rIm|QSLj-Hz8S9&g^nDq4du@ zcEbf@vRP$J?*|)GS%5KRDI0U2h!MBXjmR$Bh}K3K(QiE?>i)!#wjDO4hM9(>o?=Lj zT@1{l<5u?h&0SQl~RnHRw`Hu`U%))}6!%<cA`PkI?=e;PBd1(6AgHz zPBHt`$zqZ^J&RPQt=j68d{2#9cdF6sacZO{aR05E8nxV1CD~?GS~Fag?gyxn?jIEj zxuQbpt5vA~02LbGp+btU$`p21nG6Ef7yJ4zwG6nKg>(`!+Kr+&BhM?&4zvZ#o`KovCcNX7#;b^(q%tc z&HW$Dd(00u0p-lQ}dGZtclJJQQfB2D|AM=r^{`tUsmVIE+b{`lVdC#n+ z@7b%mcWh(UI~Me%jaAHRV-6;5Z1SE~Rus4Sm9ve`;iEd5vs{ZX-Li@iBYq z`k4Jb_K2xU`Tro-AF`W$9{hr6unQ@nWRKLp>ue`(bZ0@jG`){)cLAROB**cb*RL4fu-(uN=Zn3P^ zn=E?jO{S%Mlbv32gY`GN!QSk+&IWm1XBSRfV}{Y!SaMA*o6xP6%W-#R< zyYuG)%P+XVZ1pd&ee2IN8~gKY&i-@krvEvnE1qScQqC2-dWIWsC)yF*a+f$SRyg_V{2W`xIEozKAE;%jlErLUjdOmc|)l z^(WZpz9(4W^W!`Q)^RrX!!h<^$}tx7yPQqTFK62|%NZ>@%BoC`va_3xuzmJN*zDpm z7VBNcI*yjI&0(d?=k#G#7IT={T{*<^QV+2kw+}MiUI&@bSi*W_m9VUq18l(911#~= ze&#%NKYRakAKRa|k9Aes$66N^vnid6+544ySx>XQ?8v4)?1$|h7Pxyi>+80gO*y!W z<@xPm(~s?BL&A14ZbdPzs2%L`h3#xY+;*l{vyE*@-Nvlywz9%*TiKiYTNw1+!g8N% zW~GBSv$~g?*sBqnSlio;?8Uf^toGvuws+D7mi>J_^Paw*J^ZzfO`pAvX)CW|OXscS zeYTbjU$lmu(O$zeidM5&{nadc z)EpKTF^9Fz$YW`_v)QKHS?oscO!hW6mwm{c!5-&MXXUv$Y(nldW|=#c9hfnNIn9{N z3Z_qDw{s>k&729$ZCW<-pE{m7PWg}hn>3DHo;a3GoiK(OWRGTR{~N{B#*JhH#*ARQ zMh$0mBZjfoVME!+AwyWx;4DT12eY~T2eH7u1KF)!16Z#f{n@q5e#}SFmrYOW!;U8R zX7vfZShKt*dmht+)kg962Ex0sAwniI3hm0{qA6IIUj{qumCg*^(>S*)m2J0AVYSxD z?4?B#Yc)w^O$G_HRum?}W z*{_Gl^mrIq!#aVfUX!qwRblMJ`A|0XR0wlB8O*L64Pt!`1+quQ0W5W=KP%hp$5ht& zvbYsKY{p`5wtc=AtC;P{PUm>Aiiz%Q$5=NubGR!@9OS|@`#3W((~0#>bz~po9N5%o zd-g%FV|{~cndoi9v|O!Oid`3$Z(+qs3@urewgszKHD~vKo3iWQOxTI{#%xuK5zA^a zWUdVc>`9$IE3DCD9v3^a)BGKixZ^tP;vsDoyjP2D;&J@Gt<_-iWt~`IfjWWfnb9i4~Uq74x?J76&c+Df-Or5MPb^E-vl=RkTh0EN%<`C~AAZ7l(Ff z6Ax;?6`Ovvh$?TIMdJrAMC0mbqH@Jk@yVV>@xbaw;;{S%QGddHv1DMq7@T%TEDf&{ zExm4vQ!KBG=QV1@zu&HiJ};}p)Z3TDf#)uWS*7R1UR%zH(#5C5F8no&H^VB$lFSNm zfb_Vi?pH4Eus$OCX_t!S?FU8A<^$ro+xx`!vwOwV!@I=|n|6u~3%85Pm6;$7SN^#-(Cv&0^8xbTj5DUyh#h8x);*Tpn;=!FBVy_u4qH?B#SnOpZCa778uO6F-^G+Cu zHp_Iyis71KYLuGz(p*XW*3@30ox@q|MVECz~_!PA0z$Kl$q8*NSB!gDNgucL`a%bYti(U;VHt z>l9%d{uc6hod?674Y?Lpz4l$$njsnz<=^HK_ciVkO>aT6{bHh|wND>O>!;C@EsJs` zv-Jxk1$~xDhU{G@G5ffUlaTgFI_8&2TyCC}I9r~Re9gKdS##)?MD6=7JJzWkJ20k{fVxE(^^l# zywX=_dl)F}_!BAw+oMn%6D70{jTKxM#tVT5l7%j{>B6(NOd(&dm!Ra|Pw1@}BrKgc zRM@n7q>z7ntPoqDEj;-)Sx}fw7q*1X5(XWdBlM?yA+C15VEL#(c<^?SkpFYBV5VIp zthHP&{B>U`WJp#EMe%Ee@*eAj3&S=FZ1QGd^SrIX&{f+7vzL?-m=c}h4i^o;Oi!a3o`>c@*1J(%rzmi_J&Y$|CaFb#ce_P<6S}d_dVf-MuV{5_>quq*C^cg zd@4vop9w|M7XnLZ7OwPc5h}9Y2nFL>g^-+g!sYxALP*gkVgC9r!m*v-g!2d6g|ZVr zgxs^g1lOy7gtFWJ1fBOvQ2JRJqS{s9+%Hw|Q&NW_wNB8WsR72FH6h$k3o=c$p{Jz| zB-!YKmqTax;j9NI-1T9Aw*h?fGlc0uM({S&7!tt*)z z=wlYdhYf+DK|^7f-!Mq>8V)9IBjAGLNa$ue3TiAzgR|)v$TAoU^L55SVWAteb0tDpC-Wf)`^hzY7#7Nnhg6NPJsh=r$W(sx95Biisys2;{vGN zx&UTc7J$v#0w^weK!Y++PpgM06bo;vq)=e*j>aT^+GJY|1yye1UZNF|>!uJ_0 zg?0CqLU%*E8xBJN-*8N61*%|f&c1N;M{pN zXe?X}4N7ZZ+v}kF!*y^tb3J^ywjSK#HbCOp4bVrj5qclp z2yvd9z+v|$c-v(&>|C=M;yQ1E2Me}9@4s81dg@ki`mhzojo1czpKgPip4;K^O)l{} z;Of~OuqSLMj4j&_JGEiz2NeEFZlN^2De+q zpc}sr8c*+oO~Ly?evt1~a5w-1HynT)dL`hwpadrUDuMkI4syQTLAcld5Zts( zhJ|MjgDj*J-j|fZeETv`Usnbbb&f#ooFicH{Rl|M9EJW(M`399a_Ci44xv%UK>7GF zsBk|HJ+~g`@3^0Uz6B@X%+C{`Grj_3oZmKz$AZtPJqZ(|Dxv4GN^o-%;n^k;7V0rD z&*vPsZw%T;5+pn($WK27`!Ae=lOd0gv9E&2RaG!j zwHk6KS3?fpw=$r|74WI%dsxD*!a~k)^TRIy7tDfJM`9fXSO1P}u7xysEwl-eI?(Pw_3tHm!s4^Xs6;mpX9Cx($uDZo|x| zJD^s22PRwJg=>rNg6@yI5ImwDV(aSxWAB00(R=XR_CBm!dLP_=-iN&-9)M2$1Lzgg z07YdDaKQQ@94>qa8#wQ6^pHp3eCrWh4u1@(2Oh&I(?&4LZ-k8ZjWD^-6PQ!=1SSSP zh2(8dK}Wj@%BM6z)UzfymhuerDxX1y({spK_8b=ecn&j%zJQ)LUw|dNgbRCKLWX`b zT%O(x_Ai?uEA15&@;y!K9a~`W(iRx{y#<^Hy@sn-UqknxH&C_Z4cK&g3w_4Fg;@{Y z!UAb4Oe$%GIO8_HPofRBy=()=)OWD-#5;Is^B(jI-h=!5_u$s!1L&Oj0C!zJLVnRl zF#YzC$A$j{trtImuh(bjzUng!{_z>Q4*CM_)nDMb&sWG_^A*&8eTDx9^A{?rzrj17 z@1VNoJN*6e9U2F=!;Z`Ckl@t;cUN?P{Cfv%?E3?5pZftHTzXWZ&2j_hLTsmp(W`LXq5c{9pk_7W$Irz^YAZ>i~I*lySSrRMF~d+D`BVMO1OSK z-@|rQ377s)Nx3gI;L26 zLbsGo_&K)|mL2Sb{T_9~U)mbD1T;`*vNVtC1GgOSP~pTMKiyYhl<8Eqw7?3+H-iqdwm|xNMO&{;kl)0nOT2W~_rBr8?-C zt%LGye6Qg(9qjv42Q%DtF}Q~=YR}ijn@4qV!BbuI?%WwKLT5}G*%>da?TnrmJ7fOG z&RA=shib`s=#!&|@q6`9aa#|Q|LI|fw>}#5*2jkn^l@#uK1M&)$45E_I9y_Y&pB@{ zb)^CBKW%_t-x#2u8E4ML7~<6b3~}xzL!4D*h$BB6VyvwZ>LnTB)hR|ec_;sT-3T{! z7@@JVG0sXi#``mj(Vp|?`qUZYyx+#S+06v^bTz>(vrKUQeiQ6_#{?b!nqY&wDduHz z{@iR++_c{m_3xPCq(7!u?Z!EDUCl6JrWp<_Hp24Fv?yWn4QYrGT1 z_s@>7#)Re8__o3tXFRdS4s{zG?qh=&y4j%KOdE{fZG+i0Hn{MU4HjA0Vt$k@4jXQZ zVMVssam*I?J+wu+vK`jB*L3ITx?5fhYC}@WlA8p6D>i6W^@% z#BIktd0joR?wcp3nR%fY>V<|qy|BkLFDzWo`FJP2@Z^0jJlgKX`G4LxKFk{fdV1rt zsopqyoi}P$c;lRUZ+!XH8$(Tea7vI5?&|7;G{FZitnk4TWj>ta;={R2K4_=wi`AaK z*e}r+pN#Ouv;to&+2e~}F8HG7Gha;o=ZpPq{IDY?as z%h?2Bp%|GFiteLA@!#A~JijRvCmah!-D{z^`ei6;{0YSoreS!@Ck)%~J1 zq3yCT)F=+a$EU+^TYVTNzYD`=H3^QfmSAI$1Tk5H3$i3goSo3PLV~TF?bm!pg4gOL zxUEfs{Z$3juo7^qzkv4f0xs(>;G0RD!LV4stR0;9S0UiyYy8Oh3`05u4A28?bpl)| z06L}v?idQFJp*vya=@K?0B?wZEjIw$UI0Gs02DhT<~t&Wh9TbL__(Y=hz*kwBMK3h zZbhsjjQBe5Yi62rPj;+)};STQXU?=6bN=NlvOVM!#Orbt|R zEfV7zBeCsWBrvW<+7oAkHJqjzWhyQTStd6rS47nS^Cg zsD3sIm)wZL-;Gh&>s=J?_#K6JbfWQ-RW$zch{lhSXsqMB!mT}`vD>g{Y@fuL9r@At zcSSU2ZI8zC!_oMTqS2%#8eJYlqvNY+)cG2XPdN8utG*QDZKT-fDaHO0DPEOJ(IHcc zLk9gn()pyXQvb+OQraMNpVTF6pimnv7kwcFWaQ(^FxY*)njn3A!m=+ z@S{fzW`)F{pOmvlQev>MR}7jDjlt#PWAN*Y7>q55!C5O~aQBuNJhm?e%gSSL-RT${ zc_jv2@5JDZ#uyy@ItH6Q$6(T*7~HNAi%$(>QQJBe?OkKh!9Nx|Lo7DO#^S!zSnS?2 z7T*tw#R;Qhv1w8)!mL=#D~QFi<*`_^fiqHe#^QyNSlo6j7KfjTMT^U^c;b32M&66X z@+Yxq&=QM%KE&ek_E;?a7mK2X49oOoxWb%s8SP|fV*TDZ>-vIj3c+45Mes@YOsSPFpO)FDp3HWj$v+ZslCZ-7+*Rk)iVu z89G+TQ0J5kpPrZDwrUwBT$f?vZJyr)o@S#AZC=Q5z-t*6zLVjO&obQAF2m)&WjI_} zjvk%lcu!l7GCp#Q43MK`h#a3vU@-f&jQ^ue7GVIRB<|IBwXYsK*k&oF- zK6Y*S7_OJ`aT*~*wNQRNALC7~GW6wRex$h!i?|MK(~#jtt`l>(Zgk~3@;_avC0wVjaoy_RI%dGxM8+FA=X6CZKIA&Mo$F%yXN z3|b$E!7kfkPcJS zQXI~?uSVfgEb-;fI|nIlF_vPxx)dWiqB)N)8jButhSH5_TyicN$CO87*q&(oz9m zQCM6Yg`L(%p<-baE}F*AkBCCCC!aUsqi|DL6pnR^LQnH3yxS=XM}LpR*5*j;T_1_% zmm;|x9El#g`Mk3#64U2KqAWWST?R(t=hR4UZ$@HUo-G| z?|cOAEQ`S6tr56>Nd!)w9)S@fBJgv!2wWW#f%g6poQo2H|Fk1e(GiZzn!~a3b~xTR z8;-XQ@i}-S=kpeX#`7Lx(*?w5rHD5+ zA?_10>jJi&6i{`SfSs0d{_qq5Zx0l3Q=)+BK>~iV=JrV^ z0e^mwU{-?!D=tW|{h$P$*Ge#QwglxPBq+&{poPF~9|vytX!CPl!tnm1Fzk6L3@;uE zL+iC+m^CX5*A5HA{JkWU^J_U*xlbr| zi3!DS9-)|P5Q@v%LvY!X5S)2A1bZ9`L7UYfST{WcCk_fh<#>MHhjXWlLlAxj{yz#KRH%4lC51^#gWEqISX=CY9Sc0rWS9rq$vn{9$pil> zd*IzBcieE+9h0}YW7|x3%;gNMAA&m$=j*Zad|jqf?}o9*+;H?tH_RK)xmc-gIK|5i zduq9%Yl|y3UvkA&yZBmI`R$@^QvuEoc1Q?1a(_PB>+o6KMw^w74)1265+@~j=^Y_!AbNp`57W`}|9c9^bW zhy5PgVy_BYl&!EuyV17zHr5vR+Sp=xyA8g%WrLGSY_M&f4R-HugQcOIucdE;es8R? z=LKsVzu6k6P3Ff`YwY1_jXwXnaPA>z-XH0LnT1{O?cgprfit#V8+F07Rx8|l(F)r( zTcOirD@;nU;=T$P(jqEIDu00!K0ne74d8lSWzK zo@fhvXKsORA2^@C${fdTHOHLE<~S+Y90xj@BmOW$P3||T;{KCKv&_(_n;Gu(G(&r3 zGhA`s6h9s|Md^G~oY%(`PxzbSgHEQ{_SghJmYZPnA``3~V1he?O>mU92|6?x8KHit5jyA?p>vZVnx8P_wv-{>9$<(Y zgA7rjX^1}`^H>H)4bZ;80JropKy5z*9HnZ2;(dMmc~BpH=IEoMn?4SA*T-?c^>ElN zJxtr9hwj{m^_Baw%I)-U@R!c0T-_O0Z|aO@|8>SC($4sa$5=>wt&6Kj7q2hV#h-(9 z(ISL1yEJvt;}K_cmFl4KTpfInse?OQb+FG5ZR~VS8~1F}#-It>cp_FC-OaSI=(QHU zWLoG`q=h2~YT=pyEj*^Gg_r6zv3j2-UvFySu4GNjwb8`54;rX?UIUM<(!g#*HSjf$ zCoxV#1DhXo!iK6e{p|dxNRpK|3Mwso>RxeE7kF2mO35}QpY`N>bRg@4SN@> zq5U*9&UjVB1r}=P^hOnri>es5SQQWVQAJZP9_Qkh3ZAJ|!GD`oIMY!DdxfiDwl3#; zJyymUhm>*5Ol3?@QAQVQW&F^pga=6p`z}$!KYf&Nm8TMheEkPrtN(#U;6JFj^%o|N z{|m}`e_`sOKTyYgu10Tu11$Uv2`;}O{NgV#AN&g*{QU`Yw)_Nr_zCmx|A42He}JRW z4@fTSfW9dmpm@^`eg*CD)v+D6pZyL2{l3G&j&Go|_8Vjde1rV!Utz_N5;Kzf{uzK=mFg5rLc?Unit+-F1_534v%=!oc79YXk7>`Sm`T;6mzlVYI-otzD zryf@M4lZ?l2RiTCcp2NEt3w;#3Beg)-CIHP!&^AF=q(I(d<$>s4fO5)29Cdf4ebkG zgM-6s2w^SYpVpzFweb0ETlxJ|@UK7~;*95cGo4AktDRcxq1(Vt*V43vrsa*W%e4{G zPCtg1nU7(}+edJH&Lglle*^;#KZJtVhp@h(0alN1fa&TDkhJ*$s0BQL16B7y=yxB= zKivcKh4)~X^*z{rv>qO5B5r~H?VF%G{3d+;aRaUt-GGG-Hz44|b-0pn9TFd3gNpIjKwtG5WUi}) zc^-yUVyK39tNbIhZ9fE!H@BrA*Or|;#Zx8 zu1;qm@%S0=m7f8nd#B;-@Y681{SLJdI(m8 zAA*9KgD|GoL5O};0&0^>;G}X1^j>}dTCESj*pmIw7`7iGF7Jb)uKVEH(_;8Fwiv8_ z?gfv9d%@jgFPL$M(N~{6aFOkXx$(Qf@9r+RF=!X`f437JPu~g2opwUWsvYptb_d|W z?JzcMI}}~q#^Zx+gPo7I!kQ6VA?M2$NX^>blL4?YJ2!{ycM;HvF9ID23%>YiKV=?3&D}>+Sg^*pf2=1pZf`EpFke9U(&bAi7=g9?N z@pl0PE?fXn1`8m1<9rBmoDW?N&Vz43^WfsCd{`jQ=gzgc@Uq8TnEP}N7>=9+-p}&D z=JRa$rZO8UjAy|>=b7*^I2T6AXFzTD>0mlM2NI@EgCPY|VdT0g(7kvvcvVb-x0gAS ztbPJGH)q54uj4^YZ9H@}{tp&Aj)Ox1W8q}<7&x3h8j1#tf}Z0>g3inlP_lS91Z^A! z`}Pe5^@<^oeklv)-5w0Png+q)_XA^P3-{>=XHnAE4o4Z)=X$A=?a%mDq#7g42Y{shqsMskoz_jetu7ZVX7%`Mn4(U ztdl^(S!I2K6JS(yJd8+*gRZ^g;5AeRU&hD6f!r8KT_}a8tD<4>wkW7O5D9)KB4F0J zaA36vukHaTKNt8jQNm+Lg~5B3FsSYv3d=1*Ai*gZKKcZ~B1s?^#st=tu=Pr1O7DrX*p%?Vl>9AVB22he_J z4-3EB!MA_>eGDyIIACN0AG%nBn@bny>T3n#!z>{$+5++u%^|0&8D#Y}g~*{Mpf}DK z>ZTZR)|nw60|rpHTpxyP(1SNSI>V3yx=?pi2ZES3EWV%x^);GcdPf729(96AFVtaW zs~YV6q6&w9sX&RU3T)L;h6Tn-P!;-D7#H_j_}BfXFl$(c@M`jRA$m^Apl zP&~d~xH9XG@Nh|;(75rYaC6^v;pmB4VZp_#LSkLD@b}4OVNcsdA^higp-SVNAT>QB zlsTRf^!=GIIHFQ0PO1=|^gJ$T4J#MiCLR%lyiy@@=^;U~u|#k!-Y;k#D;A!d-6ND- z+a-){*df@z+9uR~-Xe_sw@FaZ-6$-#ST7j5tQ8gqtQLMotP}<(Ef>!AC=yJDED;8c zFBJCXE)! zmv<6Lw`R%Z{6@bw*_f(N=AJZK6pGQ?#QA=@{ zQt`sD)mJmZ9>yDmv7&vUdLbnt@)yn(t^eJukcGIO3@sme(sBLDlPB&TIeE+Q*2(c{ zA5JF7H7d$t(Bw>|Sa4b!cVOipiC_X8D!3Uldl3Kf1E= zeknUEGb|5O%3mF+)H_yLS(10I(lX^rWp9gHm7`wXuS`7hw6Y_&rE+TghstwC?UnZ% z|5o7TkZ=PyACiSDbxep7^$WfhgU*P@KQIP%NLfM68`u zB;FXZTs)PzQd|?eTI>I4ACi*c4nYx;Y&eyBk)BqyC)~hrAQT*heI4UOg=yuQ)5p z_M8{l%8R0D-es}d*lIDS_f>vhtvEL5x)@=9Q~ab`CocMNTU32@R~&r%p1AAG1Mzan zL$P+O?=i*8EOVKUhl{n4%wRk||t$6Blt60|fPRzgZK@2_iNvzrW zMT}hZO5kmw3hhkGR3=pXijY#NJL-X4}W8Fxeng_Mn>@>yxO?Y9l%^ zuRskp-BpuSSZT3mdfM!#iVjn5*J15%b=kuwo!P%7Q>^~*J78~!t6=Leg!d)+KpL%b!s0#F#c%YjO1t%#_If{KcPh>BtnV&U(;&-=%Dc6WAmYG>}fb9c|@lFhB& z)R@zU@(=Z;sXO{n^YZ?*aQXl$A3Bg)bRI-K!v@nBw;?plWGG3$hf?#qVRWK&I7wGV zP-aFn8SWiP-PezzIWePY>BuoOz1vu78!?W4xs9hi#uLc#=LA|)HIa&oC(%EeOjbvy zkkO8*^kK;~N}o8Ldi9+_k8vio_nt*N&1Tb$U$g0X)f_6j7em>3b15cm9$9amPs#KD zBdt*jsCSozv@CcLZFN{ot2CF;pifK4xNIpM%U?zwN0-yett)6WuB6$SD=Eff6^&0^ zMV$>-ljDlj^z!>^N|?BYq^E1BxaV3LbVYb zrT)X?sQbM*3X9qxOs)-7>b;RRCvBuKqfJz_d=vHiwuuVIZKj|{n`wQQEmTBXNKL+# zybf$7rTI2tfNdj1!!|OVw4Gi(*-ok5c2MsNJE&H^lNKM?NsVUlG-h=?aa}xVPDmgW zM%$RqyXe2XU9`w=H%;5So4Ok&lEczOdh#ie)<*9kmwS8YXzL_$&P<}!u6wC$+g`F! zOQueHG9W;*6?b%1D^~)o)zvof<#7D{7 z{}}b$Bm6d<<1}X8aq3lhoP7J7pfC9+MBYI`N>(NS(ZgDqq1pCMmEi{ zKTFfsou&TY&XRZZIjXvKj<$s5kb7zlr5T(leJH3ulTj5@pI#SeMcxHUa?huf&H1#cF`vedzDPc|FH%|P zC7K~@w=X)EX~gWylwE$A>e^i)ms3|L)cPugEWb*Q@2*m9?`xEvca8eGU8mO@uG8@E z*Xh!*8)S6t2DJ~kN#o;h(#+pCY3#THY9pLC?a*74v-cMD)+nTsDTUOkq>y$hZ`1t) zx9NvY5$Vk=BK5K&s=_;znRbW9>E9)_*>`FEqr245@*ed(bdR>^7t{G!#Z*vMOjqze z9X@!UX6crY`-~F0_@IQ^D<9CAln11(`H(=UsswC=yB^rQSK^=TR?@eRmDIZD8=75qRq3bXl_XrwG}R0{m!?vweBsM z45+4g=c?(7)jO)6_fA~z@5m_pJ$)DXU-|X#Y36_rqX;f*JgA}Q;EyzC z`$wAoEdiYm5 zpZAqo+I*v9bH7p3{cj{!e5Wp(zEkJ--$~Z7jv5Zu(V^x#iX2`~nYs03Xw^VHXE)H? zI}Nnlw~=P7ZKSAIjr0qDP-5Z_vakC=D|$6i;fW?{()vk;qkobn|D>1Jzv#g1U(~+n z7ZrK^CgsZC6!-Ku<%j(dc~pPs!TUdy-R>_f*!P!Q8~@VD-p%BAqM2rD{G+48|Iw9m z|LB#D8utxV<8!0bSZ}i$_s&z}*eW&7GE?WfE!FwyWOXi2Q0KzS>U`>xIXYqjwEYvn*t5K{au5*xM=eEu9|E!Uy~=NYVye<;mb8@vbMVxJN49JuZ3FddPs{6 z?up#QCN0kK(B^r)wApi!Hs3s?%|nGVSJ9-+{XKM8)l-Mf7wYh^G#yU3qr;aPb@*8e zU4Gw9k7<^f*Q2SvI!T=eCpe zdGQW?QR?XP)i?TFY-GT9!wvYtNCQreHQ;GyM6PDJ0l!c;~#QFy)*zrks#&%HvB+MQWreKXftU zxgE`fHDtzXcbaj1o*55(X~svi&AB?joNfCFn{J^wciC^wU9X!n)R?oQnFW6ex8RK7 z7973Gf}4+8@YXvPZ2H}TSJ+ze%a)cLIM$M9#ai-#Qi z;wc-g*eBD9OCMTsOp_J=bF${8B1iZA1Z(cF(VDlP7KYseYi?|`W-~_{c4%Y6R^x2= z?|K`4ly1ZO@7eIc@8Y$!Eyqi?Y#(jQ+g93g{UKZKQeexQYHazEu^qn-vg5k`c3l6T z9akmU@%0OK!q&4B-kd%E^Aw(4XM6UYYR`u@+p|fgJx?yN=d3z={$TCEW=aS49_GNZ zr4H=2-+{F+JMiPz4xFUv$lbjh`C}(XUOd^6n>IM|gp-bZMdUmie|F@~rcOLN$cf|n zI`Os`Ctert#8b~XaqBWCR%>+PY#V3p7wOEEgPnQwLTA3a$C-Uq&OEo=nNR(6=2CkX z{wTTdx1l2cdXWp?N^;@7Divo^08{laoe!vhgxco|WXumvcP1xkR{n zpFO#wffx7k_TrB1yx4D~7ynu0#reCuczTu>>)-X_g!f)-tmVz~T)p`gc(dUkZ*Doq zn}=`q=1IrAdF)kh?pEQ=ZcX0&*20Gqd$(|{Dn2? z&tZ@KS@Ff6t#t#q#wCC=A_6$Nm#_&Y1n|0L0o@Ff@9zN|r7z=d zEo9s_QrLaHWZW=b#%Gtvc$DxCnvTnO`6U^DFOzZqPclBJA?FG^IqL+<*{P$PU5Cqs zH74iJ>*cK4C+C=KIosV5zF&o$1M1|wM^C|Z&I*Q51<&fD;2pwTI2fbglvoAF?o;r{ zECsvYRPe*63ZC;t!GAOZd7fP$Ka~ZtJSvc<4-Dj_DS>=;Ss)9vSeSl+yiFx6z`Mc* zd>zP_>jQb9UJyTa4B}3KL7XNWh>rt<*lkJ>cU&681GfcnzqBB3nG?how}SZ5(;$u& zR-l(!FlSl>vyWFWZ;A}&imt)zI3k!k%?##|D}#C5&R`yRIGDrE2lKyzV9qTM=ID>X z{N+zD&ol|)a@P@c+)fq3pM^2F{%Hss zehlGdzeD)BVJQ1Jh4Ls_D6ef9%DZ}ma{P!;UOqjP2Q3u_;pR{-N)F{ICqr3ei1XCj z!XYdVWf$RS3~v&j(GBBdn=sz*6~?JDW>O&_pgijO2YY5ML5r_3Fl{x;T*0R!AngeIMXqL@A*XV z(@^0Ywu#`p?h(9Ua0GWA7s20VMsV!n2sT(R?86-q{AgbUyBv?;{%0e2-o*%BRT#lb zN+Wpe%LopuiQu~W2tM#Hf+GzgnXMvO<{HTx{37{5Xe8^kj%5EXk*w?&$)O`6*gp*?vCUS2O_!CiAdg_9mxeOUSAikqVN^#9!2uAmyw+LK9XmB zi)6=Nk$g@=$&#Ux(=C;(=cMF*!cB>jDfwiWl2t90oYO(c`+6vO_5dXZjZpIQaY~*y zP02rFlst8@k_%QT*?fbNJ8xI=ltd*j*stW6BT626O3AXbO8%%)a^htr2No##>|G^$ zlqz}UQzaL^624=#l3i<+EU#0t&rc;A{}YCbmL%*0iMyCd{L)(Dv5pcyXd$uOTjKcv z5}ybX4otYjk3iz$HWHufAo04c61VFmT*!VBuO2M1)(DAXMoWBWyu_AMBo@+IzZNi6@0SkE=Fz8hk_1!Db$65qWow zu6ttpip6%`7u)+lZ1+Qn&z4GjuT0{yM-mr4miV}EEa#O=EPE>PeG#LdNn9bK({qWF zMLZXwUm>xF2tN^yB7TZ#*F`KA;Vj~mnBP~#Hu3p4Vp$#{`iSLD7R#R@)-zJ955;=5 z#QLd3;t^tdYQ(mUzbkQ3k;E=yd!uhj9CuUf^L2?2UzIrFve>VS5=$3^v8j@HYp&Sm z9B~}7CH|c$JkAV>H>XRSdra)lVTnr)N_=_0#QT!Pa`#AVze{4(4zV9wCBC##Vy{?< z7p##uXNCBlmq^^WK`!Y=|Ym&rm#ScTTM@l?%n8fb}igomr_&^VFJUUCP z+g@yEYl+<@iOs{rHYp@N?OUWa* zD%meq$*)!@dCfv4Th3AP_9^0e7^CD~!^HD`O1{)h$>r^o{2G*879y@8e$?8}G&fD|Cxm1*! z+6ThfeP=k!)(JOhVL0ne3+M9aaNgY~oTJ){=i%WT?HkVb9Ku;{9L@`csdVOB7?-^X z{<(!I8o^wysEtf($Gc%M!QbRdydno@~8OmMfg!0NUp?tV+D4&lC<#WNI zoaz=T{F+d1tsW{o&Jf=5Dui9{hj7xR5LV9&;X(UDc+Zv)E?64ERntTrH!OtTb`9Y| z;p^`83E`nOA*`((!u#uj*{d>`_uLQWpBICM4B~^AMSY$T#O}$Wevb>{A@fCy4dM>HgV?pDaG!jG zIN3UgTWbXIz0ZN%<5?i*76h`{xj-JA8pxYA2lA>J2!tOEJ_ zKLy8sRIuA)(H^;~VBOQAJ(8s0Lu(cMXqJK-hY63klY-TP6>}DkZA9Csm%Xr#HRT*$D`S(#GA?Ez=!(>u(D+U zlVwm<*=3kSNBi5~|x__EG(UoN`p%PUU!vfFlF&ic=n zgQ9&orM)lz^z-HRX1=_%(T5K`_u;&&K78T04`*)m;qCK$c+@Z-c5ds#x4nFLf}sz8 z{_4#WA9?d#_Gb5k;`w@SPMYQ|I+lc49WL6~4&I#e&x?0ddGYW zKN&9k>$YB;>FLGl`d%DW>&df4JASKZ&nJs^eWGaJuNvdY!#jGiho2`uHS*+@Up?5m z)Ps|9J=iGOgJ&%F;EQ8CxVeJ|%X~eAM0i%`+}SqKonI|-=RLx;YSYG@ z%iP>~n3g-=t9Ij%LN{J}(v5F!apNDe+{C@98~cO_9DdV*UmO;``WgpT8|%P}+B$Hhiv#0ddtUp@p7T}qT%BmoYX8}@{s4Q{ z2(jl+ruKZZ){eIq*>SfM;$C;XaI?nSv3)x`PH?s3e}8Ow*i&0Rnrq9I3ASt!W6J@( zZCNR^<#2sl_NW$i)-@Y0K48OJm)dZvp*CC*Zo@MyZ20qMYaUf(%~y_Dv*lWA9yHpT zH?*|o3_CHc-imMD7x(n1tT-*siWiNy;wW){|5M!Or~REdg5PFXa6_C0{}^Y%HLWf9t}yTq)|>OBVsmy*H|OhX%{h9M=!cNZ zd9;K?yp4!%gFW8&#zwg5Izhlh9ju>;ya${aH*qHwdGUl=R#@wdT zh)vjti{nNA%XB056n!x&(I?YZj1iD`&yd}Z8S?TKhFmn*kPU(i8TAY~T3B3j@(g&v zb_1R{*?@<%HQ-P?16KR0&zB1HdDa1awpbwgg?j0;%v+xi|J7rYGCiJpN{{o_=yB69 zJ@yaLwV>#$p*4$}-_b#>6;YYsXb z`c0d66=-u!iZ%z$)8;AN#OoH?e6~@Guieq&n`v6iqCYIHm$14#wYbYKP1e1y$*Loo zJYtC^*Y(llrQVwSW`CsfIXzH8{yzgRlQq=gRx)Tz5pBe=Jt#+TQB? z$WxuOf2#4SdurVNkQ)D3peEWtYAm^_3A^tfZBF<{F|Gbl>*{9uy0w`$L^hM|tG_fY z?l0v8{iW(Bf9TK3KlIc04?VyCn~pC0O@mtercVXGXv(Z#bjRiw*}(UY9@Zp$DdBn@`$7GC{h$Z+jigL&q;*k^qp8kzi_x?u1>%Wp?(pS3H>MQlD{6e?ae<9z1FEp$8 zGo{S^OlNIBQx?}!;;34hpjk@}$39VBw@=jS^G7vU3EU2d6_TrJ>(w*qHwBw)XKR#GR zkK0wz;Ho!tdEFbb^m#+QZdFpuluBA*P)Yxtd`$y;ye600S5&g)6-`&XqHp(J(x_Q4 zDcAHRHD$gak3KIb@@oZ!Z?7PypbDxjeon_{J*S?g&*|CeXX2PWqw}>-Nn^`XQp%pv zkRoA#O)aNE`sLy`r6=^a(-S)L_A&Kb`6s+8_zJ*1_*ACg_|1KPjw0h#(fplLTsC~Is9z4>>a)Kcz~9^9wjkBX^$ZZV~q z71N-Md(_zV9<8drOFvfMrJ=5O=_uc!mxJ$+W_=M^ZZ9GeSrIi9+@@ROZd2^PLJCeU zq=JY->iXaoou6@w%=B;3pu+_e*QS7uKD|kq^Ka5ovzrum@&*m+bc4)aU#Gk!*Qtli zb-Hur8Y#P9qaAOr(&H6ZN#Efr`JNNMiS)Wc0q-x9+3L$w>3Eq^b1qSj-j}HA{Y9F( z`XW7dyhxanPjS8S>FT=+^kL-%`fGoInzNZ|yE7G55ydYf>L%>4FQ>&gJe^gf_9~BN zF3h7svpljmkxN~oa%qMbw`av15&Gw8#=#uwD&>%6$vG;Te2!w&&XLZZv$P@bEd9Ef zO+!bDaex}K=*{LVGWN_OZ$3lverL$zLni61%%o>FnUs=ontF9OO|?%mXz82``l*{i z6ZW5?%VDR;py(vEA9IqX|464bTheKxM>?%kouCQ5PmuKXIQ?CGoU+W0Q~#sKs2Y#a zq>`glKJh5QpChzMxMD@#N9Ye9Ca1oKNmhM`0+t*iN3%op`*0c+Nolm{-a*1~2kH5b zRGPjym1ASe^ZJa&HPq$;QRfsQUG^ZryrHu~|^akm5Tmpy=`ck@?#BlyPVtg-srI{0G{oV1j_~SSlqCbw@e8y5) zhcPs7>}YCUF^cAeSK4i1LH+iJ>BIk=eN$Y73deYFHlFYkP7kM|T>e7{F zjPF8KD>_rx04V<^odsV?^;XR z_Ci=?KY^B70zH*Wi+R2k?ad`E9;9OFeF7JE{0yaydU?r1eE$yzcp;H<*;y)bL zlpSJ4Y27So-B=46zSx|+cAC+f6Q-1K#e}4CV=DP-L?iW#=%uS64Tvr`{K*Q#a) zu2zj1x>B`QXPIi;uth58)ALn@>M^QG181t5j!#uB{WDQj*L$35c{S`D%+Zls=!w5RIRtSR&{&>s`e3)D%=pN3V0r-`npXL$ z%1S*|89r{R6^or!J@4A9Y+Bf;p2t|I_TMm3McWyw?5F9f9^`APHkzraR@`jL`!MZW zUSIQ?yxjAZc`hTK<*ipQ&HH@xPTsH{H}Y@qB`aZ2~RGdV5u)~PG<7WQ<_+n8jQm;Y8h&vSfr zuFc@X%uIoGU@a>S*P%D*#aCE?S$W$cK{;Ydvhv2IG^Mspy3%2KmQwp_p7OfwW#!-*1qJw3T!+9HhuW zE>ib@Zc@ABUXoK^Kk4yLnKUmgNUG}=CiSa}ly)Sel-0hCbmn6_X9unkz?0-@Qjm`FF=j7nOZY0{5%(!0V~so%a0(utXyq>pX4NOqRnq`AY-@G^RO8YAjBc<{eCtp2ZxHWE~Dl6RZzOvDJsA9l1xPwQ~iNphAXO+PEGYMCQt8s$pYpXW)JPLXtQ=>=&@kBgFx(`D(z$19Q>Uz1jBydhm3 zS|HW<7D|mjZcFcO-jOcsx+l#ae_yf)eIUiFmr6g1%cM5@A4^lGmrD!bnKW6iLc&Kc zq;H2_NpW*3C5<*!QnXRElwAH!QXTyuspfu^_O`8+h8us8n#;dRE02Dcs$%LTpEiwB zH^U~W=i{GJ;Gy5rx0!#Xo$yc6U!w+jlht8xFAb;))r2wjT5z{n3w*1zA*N6V(ogF` zNxU9ZFVu&cXalHdX9)Q|MzGn)7`lElhPpBn*i5Eialj1LuQ7-BlPn;zhb7DlvV#3q z){xU=4XWohkbc<~;ttzE|2TUvobCW;gsm18>I4^UoWb{(Gc2!gfyQPy{8Af4Dy+U(4H#B{4QGq{iD{xn^S9HoZUJoU9%3tzpR5;F-CadjrH(5C>EUe z38PK;Y@so6;9U_1`dv1_^Xv_9zR^d`{1wF#DlY=(+`A{Rh+3(TIg zMdT}Nfh!%iLP_RUxNpA=F0B#cm)CBCse`wJ&z0@)(0>QaOxOWUe|JF4q@D2e{!R#i zcvyHS9x{v);K6)hwY^Aycb#{^lQX*@*M2vwTfH0FecTPT{SzVfLL!)Y?Sb`M_Q0ox zJ@^z<0aZ+je!jvj~Yh9^L6&IyQq zbOMfHI=o0t2Q{6OU^eX}7~MY!^EX_!4U z6OQF)LZRCkc)acmlzcb?xjnOBLsk}aw$6sH3$tO}^K8&*dlu#%ItxWQ=fpL84qD$m z2Sb8#U{rh#^l8ii`Ox#wz~|wFOD=R-l?x?ra-nmlJUDhd559|>8owDT=vJ(PLBRyQ z;t7I;^Y(WTLr$I;Leb#@yj^kuqAM=IrPldioSF|E)GxxMu@_<9wTm##^Ahx2cM0r; z_g38LGR!`98Gh?tf!UL{vE`(J> zZ$n}3ZTM|n1lIG4!2UrIXb0VaXIt*T-j8>nUDvzt;OJfGp>+>VkGTiGF5Ux$Q!#X3 zR1AF{6+@fQ`(U&EK9qgB56ilifXUGkh}C!iA4WcaP<{XtY#+kPxesAY@k5vuPzvp0 zOQE^46w+FkfnskNq&1Ymzdnzk{i#PVOZPFX8T%Mk=0Aqm9HTIDj|MnB`m6`gih_= zz|W*N5dZBBSaq#}C8j62M12S10C)6 zFktw5h|PKr2X#Nd!RQaL{_F?nr(XkFqiSH^xf*aV_z25JeT0H@AE8nI6Bv&A1UlzF zLA72joQkf6A=$N1qw^WY4F3%InV;dG<`?i8@&&?9eF1N^uh888EAX+e5dHfryzTW3 z`lWq?!wuiyd6)0dl>8ljef|!wqw3&PLLEfEtAjeJ9%gK=hr2K8!Cd4I;+h8NTGjw9 zeHy`XQ6t>H-3W7>e!!0zKVZzIA8^L33Eqrpg5TLq(4_ej$_M;}{YQR6m&Tv)sM9a# zlK2Y_y!!=DBY(rs*x&H?@o%W|`2%Mb{DIL0f1uvxFHD>G7YcHOIj7wW0Rx&L^iVUn zes6})ZU4c+ZT~=e@ehXCsNsfIYM4G=4f91#<<)F8RF$jYK{a(;;-ik8d#R)Le04mR ztd0Y(s^k0j>Nwq011rNdu-ga?JiJ;1zZ}=VfMN|C+Mt1p95r!clA3 z!?)U~YoLP-3LSjdUk48@)WPv7I%soM2UXQN*vn8CO9OSW+W=k6UMQTp6kQx7a#nY| z)x~^$J$xqD!w-E$%-6&6Bt4{jJ>2qI5Bq5Aqqd(uruWdtwzKuIAYMG?>f`aJ`l!*Y zk3HQCgpncgW+xfogN+9GD#HL@-Z#K|b;7Q*F~pUUAx4cb#QNoin0U|-1Fjq5nQBAy z(l^3Q0Y><`r^wBnZG@wD8sUa>Mws@<2v0T{;SmR8VZj*Vw2{UbxzZTx4jN;s@a$T> zHOAXICfLQ-1arHZpv^Rq8@$;Bk7Sr&**z0%{9+wGF~y(#gl9L`6f+V`adwU= zx<4|-8;zzo)Yc52N19=uA!c}Pp&9BW3F}T}hO5fW@aRu7WP5YGESY1@P;=b7$Q)-U znPa%h96vrW$L&q#=xt|#ry@mu^I!{%{m%j`c3GfDjs*@awZP?d7MNgRiF<=Baa$it zoIlGFyKS{Z(+o?zQDlizYb^1fo)xYU4qj77D;zQ23bR&QVMD4F`d+fa9u-zN`nMI1 zv$w`Uk=CdjXpM$*t?}-5Yg~TX8e814#;gz47@})~X`VKy(ar|@jk3WV!pFOuWP>ly z+hFZO8?5YY8#(r^%_k^?3x9dKuV2V6SS0S9exK$pV~_~@boE-QCH%X$agW8#R$ej@+9y(3D-*mh@R;x)R9?8N$O}(ZcwzPzFFdO5jd7OVIMmAVccH?FzCQR+>4Py{eemBHHstdl-i!an$_$OoT4^TC@Reel3HAmYSaW^*ZKfqzy;s| zJsDYchmEqG9Vj0;ojA0pi2=nC19U1l%#^TKi8Oo}KxA<9xR~u#ctyzX9x^lELm7}Sx z9P3@=c+*>s>lJbgi;&~JR&pHNQP?Rx^HQd8g_Z3VtEP@s*O0>N5=-5nIz)m4FEo(fT(DX>(oz_<_v z`b8=*55@Gh3QXys!1^uisc+$Z9d2=iMC z3>MK!M5G885p`mEj)?Ih)J1F(pV1UCSuBIZ@_vcs`iN*J*3nI@tBqKvyIA*ku^nf` z_6%on?8Nph&QoBm*xp__Vtr!!AB+7^Kchg~(+YGH{*F<)LYR*V%srwIwwMC#4l3}} zeg!J_DR6(10)LC+)G3jDJ~9J_@I44SXN%sC2l zm?@6URPnt`RN$AfV*f@du*Gl%IuBN$Zhr;7?4`iN-4r;ulLCK4DR5mY1*%EnI}TIe zr9iQt0pk1jR$zZOalD+w@wZiAl!Z8Vj1~AqSDXhL3iSRf7Y3;u{lCj``zJY8Rm;)q zwHyaLljH0%IW8%dV@#nq->->z^5yvPyd0Cxi0dF-_(6xnV~QO2>=x(#Hu3%jG2d!2 z{}MSao+my(Lo8>aSe`J4ss_t(M;|!`bd}@TC^`Cp95;u^g{3G*M-Mr6c9i27OL46j zigRC6j#0m5Xi+D_`!zCLS}8-Dr!q__5z`7~IRCN?Z{*5QD^rF+M`hSGMTUJ7WY}qw z4EQ1-rpC14m(8|78`(Vmx{7&P5`=048ZTh z0`Oe#036pL0M(@c+$;}39rpm7A>7xi2IBcYe~hg2$3gFei}cJNM;41R^_oAryQQ77~hbwfu{M|g?4qCV0Ovqjwz zE$WaTqApo3>Xdp>w+wmhizh{0^HJ0}4mrLUdDIu%C;DQ`IA8Q!em{q;fFXCEB*!UyB-`C#%zA51yzgIo6d;PkCNs9f%Y^}^gu ziT1&8;Wu$h9}JTDV7#LbzBTYcuV3ES|ARNqe&Q{Txi|iIUew7)yfHk%8-K0##?y1W zvCn94eBH|%N4N6Edja0)@8FH|^}I2&(F-3}dEw^=URZb83#(6iVc|Z}F4*XWLl=6X z-b61v+}{g>qP&Df=Y^I|UN}|X3(quq;@dZ#s9)lVju$=A>7*wb?h$Q}wVrr>jwi;9 z^hD?G;(4U-p*%e?$4t!k*8^vL@W5>06jxpGK<(2WXua11E!TUXdW;8FM0?=zuEH=5 z_dr884?JY#fqqTyc;JmYY8JcWU~xW&R9 zJO6bPZ8|sH@W2ht^4&1@m>YiD;f7I5-Ei$hH_YwhhUMUfHJ&1bD^)Jqb9tg&w@$S0 z+MREKpM@{AVS})l=ZbdUh!)t`u?6-L&eSfu7FeX-0>9O`qE4wR8sxiT^AT5kz10=Z zE^x(pqg~Oft1I3J7VfiyE0zj-s@+EyJn+y3Kd}q?9d^Nin_Y1BJQrLt!UgAdaKVu> z7gSogpxPg2%zNXEql<(;mFTkIHYi)B`}IIu|=SI=zF=aLOB zOtV4NIve~r*#?b!29UV-H!P`8rEHGtm;; zcCo}OewM;?w!~eZEbzUs&}EqxIA*&AuAgIp`}$enp->AW*E(8n3`;c50{u>({M91X=#QwPU7*8DgJn7D%!iI zn362+X_uIy?r>8)DnJ>FVVxPL-f!vTo3n~ z>!HVIUEF(HSX;+*apW3ZJUL1iYfu**?R2qqy$<%juYEM7k9c(jR2c6sMV6CGt z`hN(w|DiS-WNPD~joPS~sEsG1w9(O78<#a{VaY=+w9VAQJ{z@g$pkG-YO94O9JTOd zqb8=7Xky$cO&k-eiHfnB_^G8P?zh#%sP7v1R7C+j(M-uFkYBkV|S^c$1F8`+(iwSyQ^Vf(?95P@*i{_ zDSR&Tf6#cX8IJzf46Xc{LG|n}IBxw52NS`D~me1NV)Kfq9J z(Jv|bDMO>*!ymo(ka6xEbRPWwOoZ>+b+0-2si( z!UL-;fg5pK&kkRAlUE9IdFAb4%`aNfeXdwVE?RhFw^uL$TH8ulU`>b=5sdu+L8@( z)eIKDM^7U@q1XIehM5o zvJWOk?E~kEWVo>~8KSL{;a%ol7}I?(+^J3i-_=Pl-#H1+=Iw#X{(C^C#8$J))4L2Hg!RGC|pku%;_;MowHjPdIyWjDUxJ!(~6ci6rZtsNr@jF5D-wtuU z?SOHiJ7D?U?XYpucG#f49Tq2VgXr*W5L~AQr3f}@7i#LPOl+CbG zV>7%<-ULzMn_%<3jZidcBm7a@2(EiKKt$*UXmckHU_u=DHOGQMVyyVhIu?%JS`VYg ztOw&?|0C(V<7)o?2j1Sh+g{A%VtKsk2RZz&!&N`^S5}?Zp$PHQ!{q`+`Gq?VO>Z+xnQZ9ww zzDuCr%Ei#-%px!?SO|Il7Ql-33&3>JeAvDt7`|Pf2Yuenh4nUb;Z(0VkQ_W4k`B*; z@Vhf%a?K2IaG3$(5Ps&@s%da1E(p|*r@~UsBTH&E1s?fNhF6;d;rWG0aHnJNqj z5uGML13yb__xAB%esvtIel->zn~nuZcYo*~GzO;a9u4zujDo4eme~8@H4~AUv zf$HadVY7Z;&~4ub7LW6W2b+3>Jh2yyF6asCni(AMU~qIeK=?`l{)^GTz#K0yt?2=z z=mCK~-QjC+H&}SEE0j?e==Huc-`~&~9(3yjzXLmhV^{}hd$B#VEoui&f7-$ykG7CM ztPMmgZw>vAw}Ohymax961?btgfHmL=<cB&!liVD(;-Qn9`H?V5q2ClHuJAuB9FIA#Hk>E`g`qZ!<^FoU&SOrd>%2^4NHhQ)D4@Gr*@ zLaPnnx4i)b3;OV2iXM1u)rBRAIxzFZKcS%FkI<&eZ(-s3U&66_jlwmX20@%yCnTQv zDTGzm2*Whr1)VL`LTug_p`AmOaCXWk!Tel>Fs0^$a1!1Nd7*EGj}P7m-yB{GAEuNE zxe2Ah@$b)tDME>0wdI*`A-9m9C-_uIo%BRdpLrx~`tnf7>-In}+K?-B$;uIiTV@Lr z$7TuRPh<)MKBNok_G!Y;<+p|FH*X4a4M?yYCJJ!}Q-yY=*M$VtHNhb`MOcx1MY!L1 zNwDs7QSjYEOG_`Al6`NNIaTd#j%p;41B98^a^DA?OM?Gf=V$L+-kpC26_M3@9n+4;A zcMW5Nh)_SFoAq$vAqQzsYB5lFlk6h|_VO0;bC{s<*9g(Cy9qyoI|~Eq+Y1pPZG<9= zmV*5ewJ=oeCTzImBqRw6q2R8AP(RX6a45ABI?Xm0d~1w_$?FY-CC0kKKaXaOBdgVP z8}(H)WX?y;lnt*nOAnT4!V;foj@-%BTrA4e+^xE)Dbu~7`6auoaqMtT)2II_&4P*1 znv+WoYMyP|qmi8m)1=MbpqX`WvBo8Bn&#`5F`B1}ftn`+HJVS$+Gw0kIcXN;TWLz0 zbuD4sJ%DVUc24HU2FQYgLY_oPwmisL$oH7 z1GFJ+W^1oCEYteE-K;&8vt9e}Qn>bMx{}#68sx-tj`aaY4Cut6!ydVz+NvU3tBBW%F2qtD?Eiv-^9r5OrbTQX9Q@nNet{AoIp6K5uM{In_8EX6T#IJoHir%&P z;)?jk;=X_aaj#jSxcFv~*nLs4_{#OU82sdg_+raTv0b-U;`9%%#kEo8;_^Z7M8C%O zqIKd&@$!U9u`@q+_YhWzFM_{{I*#8&uF3`aPiMm+0Sr3f@^s!|}1JoE9qF0$AdR{X^z1_x`Kg|SpYD}?< zwHfAqFvC$d%`xkM1-6=JiEF&AP;{`yk5$&Fn_+`yM{H4dksW^MXOF2039kAkL60m4 zyd5pY0ZU|v1LWxFsKDUw3Ot*o#D~$2_;#@qzVGjh1qv6uQ0;=tGF`F75jV_Q;EsNM zRhaFd#x|eTxaPJ8UOV84FJ`yEFVGS{S+&A~x2-V#Mr)k4s|{LDX^Uq&w?j|E_PD>K zJ$^jj0b6eBh@(e$!nvNEac*O09L;%aEl+mEk4w7YzJA?NCGCMRl|9gqyl~uJ4ep;R z;MLB6Y5ELPix?hG=!rpVdZFFW-gwc;8#`Bf@wX4Cv@$H^9=gqw4(ml zH+}$`ts00lXb}3#eX+387ki0=F?{C`%$_h5D_Rf3>ZW1%>i%%Nc60>yM;VDS!4J=v zj6zw-DEu#BG+tdf21^I{<7dfOeDiKB-b@*X8$-rpOTPe2b(w(ezD~d$G!b)mPQse; zf%wmJGXD5E8S~Po;I4gBvBTsb)V7(1EgPrd`mE`A{lE+?oH`Rr+Regr&SML|HyisN zoP#A(=c0eRd3ddH9yZ+#MpeXo>@;}+y0>144Ydm~Ic*V++_M-Tk6(g4)Jt(w^-{bb z{)acWF2gG$m*aNj3iSD~0^eL-i9u^u;obhL(cF3sc7MJG`^K%s&I{L}p4WOz)!Bd} zayMZ1!HuY%ya_wmZ^pD$o3Zc9&3Ls>2uja}V6f>Hyu5G=zJIa>&3lBRDmoNf|K;KI zt!RF4E52_XhL`t-;k=qKl#JbmSG3!(rxQQJeA9OHc()xx2JXQ8#2sjExf6vYJ8|68 zoj9Y%E}X`BZ6ki~!gf=4V^jKWekT1MoUwfm>U`dVdxq^rlgoQ?xotQ;S{9DVXW{6t z*@qjW_u-M>`|#A1{dhEupSiAz!0}rn(D`Eo77RLos}c{OnfXE7%l#()K0Jt1J4WK= z{gL>!CK4UT973;ahtS6%3VW`MLeJtT{OxrZGmad_RZX1bHt`6a$0OLz@hCq({U|n+ z9>sn=qjAIWXgvEn8Y%D?rrkV-DNe`n;QHe@{pE3V?Rf(8j-9}n%_p#G;z}Yfr17@DZMHy#tsarfw+Zd0%UvkP4Bw*U%1e{ryfOVtK;j$~|@RemE_L!fD zYjYCuyk`>L-;#uduahvZ=Xtzz^gM2=KaXt81^jUN0t>Fh!$5dE#xYe zzPyU%Uf1yHfopi>>or{CdmTH(UB~=C*KtC?4Sbw(1G`$L;^sN2D5j@knIq@Etg5hs<2Tn7;&_aoYVMqJa6@WF9HvwFg=BX8osb2qWS?k#LT@fPY{y@hG! zw{hOg+xYwDZCvYc2j4BcgFWuu!R0P#czk6VUdm6y^DWZxz{Yf(@hlx(J7nP9unhDs z%fS3@nb>7dCWgGrL=o;{X~bQusJx41-dT7nDhs!N%|hsZ4@;u&;nbRY_;^q@wmF%N zi)yp+_>dgD8k>XH>T~equ=|{Qcpp19-p6Odb8&WDF1~KeMV}FQ7#^30nT>f^KAd|b za6a7gh6k83>>;i=^$^|bAL8{P`PelkAESTfhxLEVeK#JX^2=j< z<^2SAAAEvt6;JRa6re$P0gfpzz+K&*V$$}fnDXK&=Ux`#`pt#d>uDi=^en>FtBdeQ zZV~!BKf{>C&+rNNWvj9;#_Czc_&l{3&zqLutVtzka zdx0+^U*OXZFYsEAQe3~i6x)@QVrHwC=(C3V)NzJfy`l`;2A82PmfuICJo8{Ceay23Eett6p#L`?fde@azq`dzPbQc{x^Rl;b7aw>U27Eq=K47AO9B zi#LY8L%wGY)s^qCTaWkHb}J|T7re)Zt{-sC!VhT1eFZ~JK4SUUkJvKqBaZ(55oh+Q zz{$HRuxD`v>Uvb-#U+*4`&K31F#UuM<38bp)1Po_^(Tyk&$xTrXPnD9b8TI!uy9@# zPQPA-#X4WG%dju_-{CKKlg`)p+k~H7YgV(0|J} z&W!tptEAs?deC?5ob(+({``(1y=qWrdkxO!?71t7ANXea53D=?1HaY&!2Di6@!+aaSe4%2Mvab-X~+Qru6fr@%;=+JSZ%#yZ=VjoZmR@!fy<#`Hg#e{K3`h{-AH#A8a=Giw6h)MQiS#y13vkUX}jC(ux1D z;^aRpe)|u{+Uro~?mF~uoDSVttwT$qb;$mv4kec9P^W)9bkik!A6;59LzixE)uq4O zKeki0F8NpL(mYc=TGB?3<_*;&{{?!~X|Epry{JdG^YyqdxE|Tr=u>g`24wxzfS&&_ph!DI>f6PT zUXL=Q#Y+w8`+h^3eucB`9vPD3H~!hmh>o^5qKsiiR5ss;Dt8&theRVP%rT;?6-Knx z$e0Ft8dFn0V>&V2n7W2=XPy{i>U`UnqF)+Q?Jr~MqcEZMUM7?@)`W7FnNUfD2|d4T zLU|8O=u(vlZ80^aK`l+`Pk-*uJl&LfZZ@T?6Q<-%rj%4-N{02OG}_*b_IEO)JHt8i zF4&B|Z8xLuXUynrx*27?GNYr-W;8|4Ie6X8NgQQPqZXM{$u1spA8X1qCx#=3r<(ldNd}O70ULVMX08SW)#oD>_`8adLI{+nw{VIj7(GuoEcU*-Po4{WL12U}|V zV@nsMb~LJ^9eo^RN5MgM^m?@&^^dTlqltF(D&3CkU)Yi6haC+!v!~H2dm04x)PA%* z=>^+!=8-*TRM?YyvOT5da3B0P_LR(h@uk)hn%_b~S9(e4gTI7K7f8q@R6?p~3CWTr z)SNA$N3SGwuuejQEF7px-&& zN-0|=rE~42w5Few1kMilv`9)jw@OJ7Ev2KErDT#NrP(i}bp4x@ej3QgT`8m99c47M zzl;V=kWsfqGO`JkQR!hBMO~0l-*o=DNJg_b!|&B!9>-ozF)ig(!Q|xXC#Qj&Z4kIx zPSf|uDIiwPxe;>C5tGxiQaSDXCZ~4#3c4dzP@gsmO6jE_yHN_7F;hXOS1IVpE(Lu* zp`gE46x5ulpo(V-%KW6DeZLhn*jhtg|(rZT={oRo?x=v(e=R^f6C)(E4iCXt}BJy{lp0k|j;tD6S*yhBUPfm0s z-ifkqI8pgMC;IZti9UXGqDS>kbk4|`7IT)MXA5V_>&{t%1DxrdzcY=S=}g*X&SVnm zOuh%4Y1JubI&{UEPTz6n+(c*ES>{YLzBp6cW**!XvS+)|#Q)sr(Q~KKmhSXc=1$X8 z?v&roo!WZ2)5^Z?bY-YJm5k-=!>R66H_x3uFLS4d8{8>oyE{#da3`x{?sVadI|-NE z=~}8gxum<(s$6%v{nVXmU%Hc=GfLWibEo!={5M?{{V`Qho}G%eJF2LQhl(DwQ;~mn zeyx{^It^6O))AbsI8H^4Q&c3MqoS6JRphZsMK+sM^m&_#u7;~FKHIw27L!SgYxZ zgPNS2)U-;argY9-Y3iUR*Y0ZS&eWvotERSt)MP$fO{Jqbt0h291E#3y%?!?SoTsL@ zi`3-1Tump|sHuFTnsY$Z)NQAl`h}~h??E-SKcXg+6KZ;LN=-ZC)ztC4n(kg!(;&`* z6t!wn-cr-NbT!3iaVF$_HGO%grn)C;`dXx>r_a@tP{#8q=jHpLrkjl0pPZ(jBjybhJTF6xdRG?dqE2Cw5hUf0RI&V4+2{nZ|v zQ^(8A+r-7mgOYd~dB{9yFK@H=yzSard(c$gmRoq6MjCn0A$HXrKU>W z2NAq4T631qW!^WQpVYL2_tgvDXO6GbH1q}U-)EcwTA=1kD>Y5Z<$ZTgO}}`bU*UZ} zR^(}LU6^-;|A*^_CP7WxPOB;71lIwsJI0Y}vfigAqg`sM;<|NblbW`y!TuPjf&26 zRFR@3kL#kMCk`sIw^UJo&M}(F*{c8jaHl1o+$r#lJ86pDNiW}>=&n1>Ab0we>`t4{ z@%iMWI|Uqar=;EP^d-cdoL0M2&qeMuWTra}n&?j5{M^ZUpgTQh?sTBDI|1jpK5=rV z@pkU?z}THS{c)qvA8wRY;YRf@ISaPHjXbmY+sdF_M!V5}``pNJs~cTg z?M7^&8>LKhBiT4NS}=sqmA&2QZ5KB(Xz4}{jyw%(H!{?Bqj&YLl>FJ17QW(hdVwol z%W|dOqAR6da3!}`S6X$@m2PiyrP?+8_l11!58`wD7+3Nb=t@R{D;2lpYlMp{4YK9T zC4E;~Ue8&#l`b@;)P?Y&3+L>*P@fbRns>&9wnVwm?j1Z_%fByhA@3>tcRwDlFOT2V zg?@Or&&eS8;nbZ-^q_f4D9{lG_J7zdj zSH4c>_jjfMzHUD8bSB{I=s~`omhyGguEL3gVka7z?L=c!ooHx+6LmW5M26d)=>AG4 zT0h%~+{ST^?*J$2-rb23Je_jG6- zU;l$0Nq2%HogCyyZF@MV>iQg2k!;B!jq7p0^QTa{$; zpOOluDrwJf&WPgPH;-B=DL|^EC;Cc)8U-DArJ&M01xYv`s%N}{{0}N9a5E1V^6wM* z^+5`H*;PT2ZVFR8Sx%xFe^C^KyEASWdQE<)m36C%-^$TlvaqWH&i^ zxyi}eLQcgEoU!~)MqZC(^ay1%K3+zTBREHDgN!2P%IL)y8QFWwsAn4)jpJPAsX8*6 zP$i{)&!ps>E~Sd|QaT+arQsn`s+=#SW#gput&fx@wUtt;gOm((q}2Db11&0apxw6} z=;%2II)wsG5Y7PmpWaa**O+oWgI4m7~hfu7Y%X#5)q-M=rPwpS&z@wkN2!z5I< zNJ5GL33cczp{{Kt)Y@J`*1zrP<9p7bdT39xZrGDmj6EfAK6U3M_H;gg+sB+uwX`*7 zRomKAbCVsldTU1mbM0ts3YTa*8nDHVS_Ios<0v~q!HyQX+mWrQ9mRjQrFJE@+_thM z(*#?Z7H&&PD{Sdqpe}^ix)trB2Y)-mWW)zigMlLBlJY+_?Ys_eJpcy53o6#qg z87Ym-sMjY`8uh@G#$Pt2kq1mkv%-`l0j5+ArWE6BN`5+~^y94wZObwti*qKlb(aZ! zU0_0kN19MnXA^p6Z$ifP#?+?7n7onS!yY%L-W!dnb&xR``504?+L)pYjmeka<9_A$ zx?7Ws$a0Sn?cltux)Da?-^qyLZH?&D4?}V-G^9b-4JjzfkQS~or1=4cG)XX|-bzEV zZ#Lj_3BS+2X+Yj545(~_0WF$hK;L^C&@5L2dhk!5TD;Mx|I+j+IaZ&_H*@yWwW|)bu+yR2<^NC~^AE=b{=;>O ze;D@cFRnQF7l-)$MI+05*lyrUkyed@8kxeg<**P&u@9d2z^htJAu(fU{|cJ!~s9+tJ}aqlNK zZTyMXy?)~O??15o+z%W*?FT0DXGWi%)S%6-8g%xlLAzhy@munDOqur`C%f~{CEsw~ ze$M6^^bPI)Rin?1YMi*R8Yg&EW1rHmXm#K#-u3;8)Bk!)#Mt2k+^RKLO2r{3V>F>f%)=nX#CzQ&&OU*mS? z*Ld^MD|`|13g32pg#{nV@Z#YzTr#)}ott0cwF@t?+mx4hg0sA8(n_(zf2HWJF2$LJ zFK|lO3-syn0<9~aWA@?aIM??%{%kD4xrzK-j0q)ZV^)Iwuo#1ai*b&!7z1*jVYju< z@K@_+nDo2|`|m8m98D2=RTkoYe&$Buz(Ulke~ON0pQ4NZQ?%gca=cG2z=WUz^tUd+ zFSnlH;ssBzO!)+R+<%N~Rz1c9&&Qbd^by_-d4yLxKEl0a`8Z~GKI#kkc#^ZeJR%=r zRNsgAv-$zD;}3Ar;0L(3J`WG`=fivb@^ImwT!f@t{4p*U59#Nk$CdjS6L=pDP4DCQ z>p2)XEeCH~=HOE?8w+P;W4diNM&G)JQ|8@6YlnMyAuS8LEy%(|Sr(dQ-o^2Y?&5yM zUA%EO6LS`4;yq<1UdhV9?MpInh+_seWu@bxCH#C8$8* zAjb%2yfmHgl{sPaHAJH+ zh<}X`-(42*Mu3PbbwyMsY4P@GEe>o>#hY=d=r$}Bm)73E%g1lv%lydz8+jdT zdtS$q_t!9S&o!La?HWq?`-J4stH|13#gu{+l&?*}1@0+$DJL0UEl$SY(quHfeFY6> zUBPPeD|j#EGVYmh8T;y7#`p1;aOLnz*zofr&W^r_cl%sKn~DoKZ0`kJ+4TbMdw!mu zvvVHzdY;E+c}eKIGzraRNqGBaA_h%Q#2Vv7Tzc^wmh*Qi-i-;k_e28b`XpdOMLgQ? zjYrom@u)05iw5h@;w!hacrNPs|PJ(=H5k<6+uPoI7nNX6x=m`RN@P=(7V4zTJ+u zwrt1es_j^ru?;^@--fUCwqf?^Fg)!OhD+aW#V%X6;z#$b7@i)At)_+I4V_Tb#BRY0 z-doV&bqFrm7=m}4Ls0kDX4C|3#*F$+_@~<@bX~R)TP1Hm#kciX({4Q`2d~2k=hot< z4{I<;y#~{QR-^IBRp?c^5=Y8cqTkpRs5!74%^oeoyXMPqw(oyfvvn!XN?(E*e-@(& zEJm-Di_kA+A&#nEfIZtRK%3d~G5=IBt|*&_Mv8eD;y)KZ?3;sK^Je1$quChVcNQL7 zKNBNTXW)N7rep8+)3J8WG>kkQgl=V1@sMmP){mNkK6@tP>U)70trLg|FbQLpPsA;k zCg7;b05n$xVDhB#=yPZsrsa>t)+S?dLtlTqy><*%T^)@EUq_)?i&5A-#Sfn!9*Jij zkHAT$Bk*6};ka+@FtoTj6jxRa!F=@)vj0;v2-xnE z20yrJaPK%T^w`@2&u4Z=w_n{btW!7s?!PO#oaln1o_59+rky#ruoLcD(GfTBcl|-- z?Xjz@J=PCvhe=!7;s|XUeEYRE&QZ6&^(INr-0y%xBk=_yxySmc6R%v`Xww=-rebHd^095MH$5(Qf&9vh&*Z)@b({gMn9 zzLnxpDQA`qalq`263k1n$MlbOn54AB?IUb){1zKj-mu2UpR91LvlYrlS>m~^7T8{E zj%TaP(AL!qmyR~YdtoMMB^u+9FGje|)d)|GHbe|Fz#OeU=2huori&h49;J&BTXish z(LZrk;UDp%@LL=e^Gi%HXc8;uHHeZ&bz<9Y+`I1R57FuGcd>5zH<7ZxiVNC(5zQh# zi;;Ded@oLgxajr=@wV!{*u3qn*rMu<*n8w_vES7)(M$GHl&^asR=g?^&-fIJe(^rSaC}nR6=}bHi}D5XvJ^;ZiqqCuZx*?uZr@PDdNc=4mxSuy))oOrzXlsId0tf;zkQY>^kA+FnUOq9MqD#i~uBDPD25)(`g ziL&5>;)c8k@p-%bV%zX=aoIP%$H#BCSdqL_w71_Oc3-|t99gtg4C)ao&O00;KKZ^$ zOix)a#x7qYF6psS?9}+5_*PsjZe6!Pl=qq^p8PvYl%`D=LqevCuYCf=P6iXi6nMU$E*3nKh%*n{iZ$b{#I>Az_OHZP3^{5b{+pmH)^_`? z{cycb`=rM=Ev8m#V>EBITf|cB3@Fm}qkOHpXO33yR=W0GFVfz-eNCI>eMx&DEkV1n z?eumksUcI6Qv+rlPOU0go2soCnCjGEmkL(5Z|F~Lccc4a z%kGu-%X%D}S>EH*Ne{2AT>)O-V4Ih$Q><5s2YPi>6nZHvtGx#67-$|g*=S@xoi!d` z+GuLudug_n_16>^jnY&+oT9mwHDA-~)@n_k7h5#9$L`d~pX}2N9~PyVoPAs~&?in~ zdMi;A=XFIRO}U{7YIjSsDLzxP!YxFqJSZ%~SAe zZY8LCv=fS#bQBhy?;=!w=q~hk6NHe7J%yM^Zy_e%N7!UCQ1JE{EWBPfOqg;;g(~pka_)-kTNn(*!Ag*Ff=q?sB=0e z?6{FA82FtR=6<>$T-$O<_~dv+Fua~Dn2xwA)P1}rmt)DvNK z`=`Q$yM==Dq-R1_O|dX)$8#awrBskye<=(Z`bwBt{#poHRW5j2z7urf-V0|mAB8sg z6~ciTpM&ssp(@s@CQdMik7)fy73Tf?4fZD8Ws zwjk-#4zz~t!8flxWbE$%Eys0)RgRq?feklU&kgn#J;>`HGaSmq6*y!rtC>I3Gt z`@+BwADGv_A1pWS&-eBBhk<(sfVtm55bXxR$f7~;@USm*oj4dm_<7daS3}@g>`-_) zeHh&L7!ENXhr^_EBS0s3BM?=}vk zb>kr6`gm|%82}r4On{8~3GnsCMEJLI64dtygu?njj&z(1eOFF_$K9vGfV!y=do2jw zESm;KU8jTXkLjSBJOhds&x8XVW)*xCqWfEQZVxOCZ~PDO}E33TwmugVsLF;O5_D(1n)6o>hFW zf7g}p`P)jUKEDcz=B(zvJZoV1>orgoy%zk&t%G>m_3-M!dib?{12p<RnVHi92FlPXYo-!cA{bJj%Y9|kA|JXF{q0;27aH9LA1|tcoKaa8h#uH^PwleGVTQY z`E>$HN1udqNhe{tUJRH`jDgtX7*LzW!l9s8s7sCI{$HnH!|YRV_SPvN$!WMV|1>0L zoQD01I0#%42h!{~xaE8XMlU}Dg}L0{#{Ddu;;gr-hi5_M5f1~`#zVm4co^Rz0s5^^ z0H=ZkC~tWVA~&3aZcooadaFcW8x!Hw(?qCkl?2^3Cc(6)NwBWfc?j8X9+nrJhcPWL zfb04TQ1bW!Z1B7YR%uR@2EtI);p8mI!U!JnjSaQDwOSm}2i z9OACS$-3(x@x1}dqi;a^mmAR3I~ANFQlZVeRPgAo1+(p1cu}H-s5T<>S}($*hawDj zMYz5M!88NG*PdYMOoDCKxftDqCF5@b-xCK$O*bKV@GTe=eG76v--2%JHtgDc8}dqT zLw(yjV7Z>lgFDdZm#lgISWiLWWo4fSrG1f4=zXD1ANcJF4+*iIUC01XM?Fz z4xE{n18q`s;HbfU_%Z4}bc?wUL0|5}3LzJkZ_9kv;peN_YE%JH@yFwqrzDEyXgJVAU&&dbL)qJ@1Hy`|lJc7JKkDz1uBUs<=F(j{g z439G&L$T!($O(7?v2jmedi4{q5DFkBv;Z9Q3t*G{DLk0|6m%~>1=ohB;Munj>~|MJ zRbe3{xfH?Zxkd0cxda|R|0ePl)(4G z5}5A%9B$5f4u38_=YDq2LBstFJ8yddcKI)$)S(o1Pc8+Iv!!t6ODULldkGWQy@ZI2 zmvGs%46gf?LEPao?h{l7-8^4G$^2I^BjptoHNJw5-mhV4*lReN_Zkvy-$3m6H?Z-< z8|eS;4Sa7^4qF$M!@sNL5Y$u-iM`*#^U$~OJ?AY{TfT#*qu;^F!|!0!%XjeE?LEw& z^&Scm--B!Qd+_h_0T!?P088-$O#J(S&!ZpVb=XH(cmE^&wWxr(eifiSSOL|~D!^P> z3D(@dvoWR;a^61Rm1`WepGeTIWxRWN-`6-cQH zuKcco&b`0D;Z0xQecBh0>V1U{{k}rGtzW@5>npr4tcG0!tHEu1H5|*XhTq2Dpr7wI zSiIvKgyejKH74I-obPu~?D!5D+26s>xCSx@)_~Kt8km$-1Dgzfz>a=DVAYl%Ff{!K z80!3lxZXdZ<%XXSK|kSj(@(J1)Iz(Jwb15TEm-}ig=Zb>VC%v{$=( zX4J!&*m{^!Ru3bU4d5}p0bU(!fQ^qEK-aPnf(JK(Hmngor#FJ`-$wW&G(p*lCODnk z1jD{IL20XBFksgY&bljU`wyyS{)6%p|A3zTgImTr z%*sQDjq0Prwgu|2i>r0my+|Eaa7BmZKi~|!N*#96K$k6b(`DUz>as86by?&xUDk1* zE~6w}rn#rf&Xwyjvp>3QvRsdy?yAS0kI-X!!FtRoOpmpS)nhG4k4c~DvBvLuEYDn@ z?Q5aW2684|^(5|hy;7e^BJ^3rd3~mHPoD+7(Pt^Y^jW>cfVJ&tz(x-?V8JsC*zyeq zY{_8*HaXdVu{;B2@xg#`jxO6QH)Nh&3>ghIWc_9tvYQ(XS<54aEHv4WJ@{=C#C_ZP;PVuEiR&ms(?1|Ja!6d@^RgbvQ>)Zo;xVnXtpYCM+PxgtLiE*oA#2 ztWSaoyLa1!^?YW+&U`gtzYR>;Kqpfc($$n*9Ae6HrS`*0G}*yD@-=foAN;e`f5*4l~v}#*D4KZpIS0-+flO87pkyVrkB@ z)aERKGx*kyG-thLnX?~jIfrk*Icpzp&aRO;Yxl&Q9r|d_zBQXO!PbH;Z(+e=nFYJ$ zXTfr3S+M(SEtqzn1v_%ag3T2zSetwc_VO)f12kALI}1y8*v*nzbhl(n2V1h7$(GFe zKh6@^X2}*uTe2OOEZKn!OSb13XAFF{WMlqXGFLk*_R`ae?GiYXU^r*^1zB-6l@*KM zZpDm`S+RgiR_tiH70WBMV$~H^Ot;yJ8Cr3cpPMy%)zz9^8)(heOt5C17Fe@q8?D)* z2y0d!$HN=etT=~XFXg{~wPsiU@%XkjtVwOd40_lw9bX&vWr7XMnQy}mZLncu_VH_{ zY}m;Z8`l1=4ZBce!yGGY*xE)LmTPLu%p7eQYiG*>d)cyuBW&5CskSU=i7oR9v1O72 zwygNHE!%aKGaK&Ovh+e**8hVo=W*FGCnGzyRBFd=w6J5Jd)P6XL3YfOa{}AWv14wl z?3mGZJN7b)b0Fe5FYtyP*K0d=xX6yVe6VAOYVFt`eS79_Z_kda>{%ga2>$M4&m^29 z=romwi}?5T_N-{PJv$j~&&DNkmSCzqJ95vSxfj{9=y&!^|A##b)RC~WRucA_vnov5 zN|?JKVQmLVn8#Soub3fW6-zjCaHE6;?~yP`w1izukT9?75_Tm+!jz9CY#C<|-uf(I z^$il{X6V2KI|t_D>cD!ob6}o=1N+Na8QG&9*ygDYtn~s1ma*D_4GnW(cOx8F`;!hV zEXjf8-*8|?nGUSOBL_C9)Paqx;NedP*6|;|ZZ2i{QYi~lNm=_2Qg&C6vY`W{EW=OA zS_ewmra7GB@t>6a-XLYFol>TWlyd!+vaU%|rnoL;)tv8fHCM{!7IC)68!0>WS;{=? zr0nQFDf?q8W1~0=B+^C3vRld6=Pok#r>BhRa0cQJKN%~WC}Z)Qg*a!Cj44*j7>3B$ zkliwt7b#;L?7)sC$XL}C8EbLP;U9zR&YCN1GS#}z!CwF;)$tl-QK1zWpI!9w@(Fp_^i%F{Th zU^;OMb|XQ-0xu|74d*|uysltXqJoXQtzf4!6ztM(}XTj7d*qTNKd)BOA>VNz<&XL?>sALHyoFQYbWEZVCQ_@z+ zmP(WiWJ>l^p=8ILl&q_(lJSkLtc!<|9c{r`Gp&@Yds`(7ZqIo%9hEGuGf$%{kK0|z zHhL-9D1q}QnUZDoRI=H$yUV5hC?yNy@{o(+X#O8A{kRO_(ua#DmuCLk z9WKkc$hn;7|Lefz6i-K=%UGUn6i+{!=Tph^Y~*=2@-kHLvfLY_WRbjFqj~vscsWn- z^0wjSPT=LY=k-{`>x00{$hn)Yyq*HDZ$Dn|o}GE#9hK})JDx@x&fnziy?5fzEH5#XIwuD6f7=Z!9sEsYy{T_bFLTKTMFjS_2kVp zt~*?Bvd=4+itEwB(+YO(gn|_uQLrzZ4^$VfVBdBsSjkqdE1S4(aDD8|_44^*1zXDX zv~i|_E#Z1wJVC+Qb3ITa$fr9z)aTCwSPt$if>&eH{Vm_`S`1p$B<1C(!wNQuC?AKGDROq3kISii ze17NSbSWRNZ~3_O;p6upAIDGmc-CJeXCAZVtlJbh>pD)()Fb${fpS*B=Ya#=Imf8I zoW0@m!(t~nZ)Z81Y%XUv_2kU_7oU4-WNb~Pj2(W>=OxZ$J@Zh;4&Ifqr6gm0Qe^D! zIT^bcBV$9OWbFAK84C!Nv3qM|%yWs1Et@T4$$>KVW;BoID`OVkGS148u_n%ZEpg-N zNo8!7g^Wq`WGtmY%KCogjM%qQ*0Ds&!XHXmS%#E3X{Bt~MJbzqTFTZPma?^bq%1f@ z%7(0zGUa?JdofkYcKJ(Lo54~>y`-#X7b&~YLdvWhrEIFTl*Q^xSwVvX`&s3{4Bt2~ z<3b1aE8Bs+BnNi+vIF}sj;|Sq9oYR{4s7y92Ufn+fsLKzz{CItW;M)#jq!Hi+(ZX< z$&;@iatD@c?!eOiN?1aTgl&8;VFQaL?9Y7(i@zyhy)R2x_9+SL6DeVd+ayeXjf4%K zFJU_-OW4(s5|-ar!d`ThuxFl}+a!~)SW^jG*lf?*ezj-MU)i(OkL{UphCSPU)t)t+ zv1b8M_AGI`J*!%6&zytpnfD}nHhLIeS9@`0ZwGtU(bb+A*x0lCI`(XHjU8+8){fmS zuww%=d3e>1wLD|TLL%+hgROjBUt!0(%(7!6#@ew-1MFBpcOK7^ul){otj@rWU9Yue zv)ZHIl_hWHs_%Y3;_5zcLkyWGa8;wjt(p5&Yj$9mHTx;>I4!N&4v96pscX&N zR$H;gQY-c^$BH#vw_@d|tr+dIV%yhSv3~QcSj|`~w%^B!bG5A4DMu@2Z(_w()>^W> zHHedv|0XJB(@OhSO?O00|(ASc+YH!IZ<(4ekz>@X+Zo!_ETCj21 z7VKe)1?zs&f`#w2U?s~fm?X%8`3&W3=pGhqiMs_`YGJ`YR-(34p#TJ85 zBn^;8KuV;Wdu9Pe2|+?YLJ*Kf2|>EwegBxx-NExbyHCx|&g^_gRC-EARG=p#O461Q zxsR6-UE<1!=KhfuRpd$2>~v|-xVO?GA4|%zx+X2MIv_1-Tq!MLW=e}5C`pSVJEcS= zWm2N{Pg0`6_fn$1mr|nNcces_$E8G`8z}Q?o|I^Us+1_TPf~P>vcucbBt_RlB}KIk zlA&3AYrwPQR{(ORC! zN{c62sLT_kcW_1eKe(doB(7+=A6MjQ#TB(*<%)!RxuWX~SL897D?%Pulu7yL+1VV* zN#}@yoH?SW4>+RT|8Yd4HgZIt=Ws+9_#BZ$r-aD5L_#E;C?UH2Rzg(rR6;cWk_6T3 z5~46|2~inku6K2fz__Flm}W5osyjxYam)z#mJh=^|6#~57=~p_hrwcC2ogUHL8;Xc zl-U1BS}(Yi_JFEa58OQ617ubY{BG)o zq3~|#z0pk>^WESx&;`3bbWx^H7o6JI1u1e}pq$+aD_?fP-aVbLTdfmxesloWqXS}& zcfj_k9gtn~50(V{1JeutAa2e-$Zu|k!mxJuaIGC)YPZAY&NgU_ZG)?K+Tf?K4HozR zg{$N*yn65#JXZXL7sIV^;X^CTHfe?Y)va)f(+WS5TYxcZfyZlGAe8z-K7VS4k7mu_ zzqT2SxHL2VQxkkPZGuf}njl)D38X*%fwhnSz}c05;M&k{IGyktRvG^WF8qej-bPp* z-w5PZBWNsbgiHS#z%!x&@M;4j&1-<5KlSi9upXA5tB0y-^NQr*o>-%=foXibNQ_ksFwjXr_?j87n2k_^Gt$sk%m{k(ra!c?D+aC`4Z z5KDiA2Jr{rUj6{`lRm(3P7+j_BtfWl5?rWF1c6f`_-#sr8PvDz5R?F|M-o6siE_V^ z2s}3=G+sl%H4nke4B^lcgh{n5^b{kaCKF2ODCbx-%M<`9;I+J<;ILjfPK=QIK;o z3ex#e5Jvs(Pp(A5=82Keml*+W_aZ<`D+2tB!a?vf94;;ihsdfhXm}9@iYvolN^>Yo zbqfWR&7siV6+*d9Az-W@0y9T~;bTZJY&jeZ$uhw(D>euoo(h6weh_pfya)A5??FqQ zN=hJ%y&ecXlL8?%^BtJoc?S!ozk^H~gV^^l0CHys08``-_GbQ2w!j}$%lts}%n$Y~ z@q@#azOc*27j$%K{hAsd$baqwmf!>P>)*oXS8rkSinoy1=na~$z2VL(Z%F*(1^*nq zKz)rD%y0GtZD&u=TI&h?mN!u6{02hSzJb#%G~VLk0lqZ;GOxuQ{GHuFd96EKY<7bf zT7T#7YB!kBnmoM3{k6WIT9 zgaIo@*tf(Hynnui@~5vse&K7FUE%;>>OfMnu zZ2C)}>%$;r>`Ty1egWS_&btF7TqqZPEhu!1AHR)7_jpkQGMJLX%$lkd+U)c6@>Xg-7D z3=1f^W&v617WAEX3U+6o!ePayFh2STWFLA0MiNgz@trxiY&Qq>PBXA}Go!~ggDnlF z;Am$Gg-c99uG9n;nV5jyOcMxqc??mtkHBNmBe?qDAp0Mb<-z>X8fkQ8(u#&qAK zHJk3iecQWWS$qc`Yun$S7Qc zfxU)M?0FSD8n3`s?JH1iYyhWIFGIHSWtejC5*&Mb5zPNw0EZMW>_uLHqW=3Xk28SgjAU zXX}Hh;Vv2%+zH(SJ3w{q4wz)Q9aM9+LAUBQNIkR_Ouh7APTdyxIA;s2yS5o(VmHC4 zfsJr<^+s@bx&c@kkIv##*}D$VbuBnmtbvo$)`0qj)sPsn3U;;Ac=ocDu=f56@J?C| z&D`ZMYm*4{ZGh@d2Ck_xaQ1)@wz%uUq)HvA)YO5O=a#|Zpr!D!WeKcWyad8-YJ;M9 zF&r9L1Wqd#(Q$Jj{7P8>%`yw%x88gxw3`Q!-{!(2)wv+rPiv#O%m#}xEf_sn3mi_) z0-oN?u*l5cE~i?-l_?w7HPr-qp5H*W(wtOYQS`%2DIIq454Ha92=Sl z!z(AkE0YPJ_GvuW@y0{<`f;FdF%~@2)uBRG9Rzx6u*_x*Y|k1E2b4y`o*k-`Kc@mS zzKwzb!6^8wFM!APd{|JR4Bu3h;p|=|Xnm~+mkSkWtVjV??Ux59CpoAtl7*@2vas)f z3_Ng_2A5(f2vnDXkOPwRUFU&)F&A#Cb7AWN4yZXxKxpU)qdtF_xg0Xcyq`P3cDO$b5yR?Z#EgL`p1B+!%N$)2!>kOCVpQiwGNl3GjDuzvt@#(iRE!H|3?1Jyoq|Bd zz&3y>mhoqnnfo%9!*7|Kd)|y}mnWlh?G1CNiLSLd=f*s!a$z1Gb!Lo;9hqahUo$JR z?HSe0ub7HYFBq>C&zb#VTZXs9h6xC@VpeNeGT(eGm;;lZGKJ3OjGl@a6K`w6EK`2O zG;@s^`<^?DR`X3J?ALW>M&VV)F5@y&mw16$7Mm+{#6Vo?;Jrg>04RdhJN~Tv<#5^C=WhS&OWxQ(^GZTszFwZmR zGJT0!%+bghjMz_;QF75>j@V3Od>)NsYObp>8fR6ReFp`M#a1OIYNb3=x>$x8o-WBu z8p~mBs0|AJ2fKuM)qjP(Uw#WGgx3hcv0S*{xL9cTU!L&Urmw;`^HYV#^^UL`FAJ@ooe(bCyGPhC zWs{JWl@dDO0-@D2O`-E%HDS_JdErR;fG&HtMmI$Dt8Q6Xlrgp zox-Mg+3{TQ$}P&`6?eyrIqznQZ40%gRLp7IdSz3U?u+XafJ_=bs3ietogvr&AZ`lEPZPntMeAzQq9N`csF z=?`(h=1Q^i(K_*wYfa*R=I!Fc&OPGSK||u)3J$xxQIdVtF2iQ`%d_n~Wp+Su6x%dr zG@CqGoqafKJgc#266-IV!j4)qjs0)SOx96!)|w4&mMfUiCyof$Bqi#&L&3gVz-F*urW#d*^!h(tk&0~?83Yg?C9cC zZ1K;t?A_`MY*)i&c2~<)*5coF*0tv*YdLs_-OVv(d!!z*%PBMMqKp}9Ze`BeC_H5! z+gY$D_?GPaS5|DjiVbV~+LoQ9_MCNhe!)tPd&M4fvu9liWH7H%@=guJ8+DCr%Gx>wH65 zr)lBrLf;5BQZtGj?-R{lo=R)qddIP;8e%rvlVuYo5!T)#f!#SFiS2Oxz&;$C%(gmx zVmFLQVa**<*?>{$Z1{^Wtfx{YYh?44ohz5kW?JO1J0!ocai)1JZzP{x_TW3awXcxf zaJ!hD-ciEV8)FWc26p$B-)v#Z z9~M?Ov!Mki2rq70jGIRmh5lFM-pS&l*1 zSD>oaN<3Gw5`ABvIAI~|5JIc->*Y-TREx&+cTP~pSn~StY_$6!|x`ZR4m$8eo+H#eypk3k>Ty*6s zQUD}sW*MT9@ih#Xa~%_ZTu0W@2win=;L-XU$aB1j&)40;!S-9Y!}~Ux@3?~=gLlv+ z=q}zpcn?APKK_cnPxC2^@w@T^S_}OF?!EXBFQ`4jiq{iO@wTcN8eBBPJs-?)?ih3IxMYr@AInkLmN;#+6&78v!h4BUsH9?zug+Oh zMxQla;@e=-X&dB;ZBSRy7LS~?#cMIPcvIF6FC4YQZ4q`jMe;e;9(az@jnILpls)qeY7hps;+Soq`3LVp}P zJphA@0&sS606OyDVe7GXxGdxyUg&>^R+|IS*(nh1YXkAV_Iuo6@*V{_@A1QgAUu3A z2y5bk@StQcqJA*SdIjV9=3q2nLeSJA1kDOU@YTuZt1r6B~iAC>zdTdn7J#jl}xeNSgN%g`*xsp=Ej$HmT4Y zuH(^o`+YRN>5RsRRWTTD9fPigF=#j?78hTR#md-NyeAQd!+LRe)iDmgR>q;qoOs-L zGak<-#iOCD7|;Gchs;BaD)nN_T*%_pdn^uqqB&-Yh-Lc_=XxQYYeckLOwjW_LHExD z%@q@H|GorN^-REo`UKpyFcEX^B%+Y!v)Rff;n!VB*yWOh@>NMFH~Ry2T>C)tH$I@H z#7ETL{1MY$e8i2#A2ED#GD@CH#2ycv>->1~lG6#o!b8xUe2Ww{2JVk?C zGziZ{<$t;8y7U_=(LBaW>^F=Upv<`ydD#7!N^%}n^71iqLp~Zj%SS;*K6=O(;HYf{ zc-5`|V{!_xhW{P=cTsuu9jo)dW3*}^8tg4ZWyeBvDJ(<^m7FQMbp54^nR2fniZfu4Ck&_Pg&*LIeo&ht{N z$tuOW3T4=}r3?>QmSI3z8J0>?9^KlX*l+R^>ymz=cVx!j`OGs3BK{%myl^RX8=V z3fp?CFkopl&4a7PFTvHgq@fxuG;8qVu^Rm4QiF{JHCU`%iy>QT@gil{DSoI$r@mU0 zSz3oDuGXPvU>&AZ*WtH`_4s*zJ-&HakH<3WQBtx2?N>CQ%$){2714mczZ>wYW+Rp! zX~f*ujToHWh*zY4quQ$9=zr%oj*s|_w;O+>c*-BFI`{|MUjD(lFMsf(L=&0`n{dvx zCKSJG!g-ZV_)M)C)3-Nc>yu_2AoTMe{XM${El#%JT;~>y%WlD$lCAgxYnOE3`|};R$Groqb7<}}w-ck5bz=L4PE_;g z#3{L*DByNs-O?`fJl};Y-Ma8oRu|42>B9SqyD{u^H>NvwV`_Rg2KII1wYfbw=~xej zKkva=A1NQNy$4e?d-2bnUhI0(i*>QR$kzAL@wpF2ZSF(IyL~tmNSS#*`p{UeAMKfb zw7b}kS6usXaYjFu_V(iitpO}MFo4?62JlMU06wo9K!?$T_+TB)88;flLGM9y$Q?xf z@E{t_8^Y+rL-^Bj2!F>7VQK9UMyL$qrPaeIcXb$T-G{N`%P_9&9>%NFM$l~62;P4< zf(L>|P`!8rD>xEl+E@v4Xn_PVTQ5O84%7VhYZ4^TLV~z@ND$*F39{>p1W~V$Am2LZ zZ#fQ8*Wi$Vr5rL#k3(EfP}bf}4%uhTA#c1mq&S8{Br`cgvywx!J2_-2W$$TC<`U&4 zTvE4*OTv$G$))RDqHe(@ac*3)DV$3(KXb{-5-#y;=8{1P9@#jCN6cpPNcajK$06iS^HL+WJXDo^(oRMyil4bQvSi=UTNYcCqpvF%aE42GDKp943XL)Lk5q_kXl0- zl4v4Bp1qPG>wIKLTa*lW@mYp45oCyWtqf7=k|DRHDC=*GEK!+B`3pL-#Au@|vD+_8 zT+Yc7$J?^R+(MR|a*`!W0%S>7tSkwn%!X}+vZT6JmR#tRCBJxbWQ!_g18T~Vzl-I_ zyft#<@Gd!W?}Qw&zA8s-9?FqNwsPc@yByI8q8vf79EnMnBS(wmNOvu@*gE9MAV;2D z6v&hG$?`;PzC1Y~k|&m1C{yBqJV`n$Pd?p{Ct_21;`KtF+<7BURtL+IKCwLUOQYYv z%afccd9v-VJRyVfWP-c`F;G_^Vbc{z^-9AN;V6GymC{-l? z>J&+Dn<8l)P$WgtN+fKQ61g*xatmiEk+Q|~`*J11+oVKH^p!~K5hb#n@(n$%DUtH~ zN<{go5?S;@iL7%~A{%{`h$vKvOo>+_-5)6jF;j`$qzsUW6-p$wL5ZwtS0dQ2L}o}T z6H_H+lB1?f6sIT?n5|3>X)BY9A}Z^Z$&u~KWW|1EA~>N;3eGE&XV;X;ynD*zlc_S< zY^_W_*ejD+?#jf(SD9o4D-&LfGFgzIOtw%a$-XRQvirL-S@lzyOsZ8T%}vTAxPu;Z zK$#43`Q*7gp9m<&#C#l|)KB3P(BhNF3;85ghcZuA@X5dRe9}j`i|xDlr1TJ<#GK@l zN9XxOc$H6TZ}N$WF`p=!@rku1pY%TGll_i-;_uEUb#M7(Ody}=Qg+H_%4yt+l;QZ1 zPo}2vN!M3C!8|@OET-F(^GQfGpDbzQli(IUQSIOpgI+#~8={OA%5$oz={B0p6?e#{UMmpKBmX`z5LE)kHsLILStE+7VL1SDsJfK1gBkh41k#C5lT zB<&ZF?}r7X^tgb0J0&3T=P38(l7Jk%Dj)(Q0l`}WviF{VR6Y=p!zKcfM!Aui&jiHK zT0lbV=zcE+q|ZS>WSyzF2}rL8ZQn~kf_((!iobwp1PaKfAOYD=c`~Kp04^jQJ1Bm&Cc5|A$+1SBt6K=qw~vYKcg(rJ4c0y5?+-9Jk}j^_wSbFP3~$`g>1 ze0tvBDX+3nK+=l@q^DRw#{CeGIi>U(lu?GwPXXbTQ%(&Pj|$pOCEbRK9c9~$t`ZPi zDxFleR||*}m0T+QRL0cMeW^^OB1fg3{w;=z5tXS_lIcGBRPyO@)=}~Q|8eQ@MO3cR zw(M!U?`Zp>v>(2-KUO6Ia+3BVK&H{Yhf?0A7Co2O*#go=&u@9AfZY2+ z_odvOv=jj;{6z1`M*&Gq5|Drd%HBZ%VZ`+OW9fB?7Le(Y0umS|Ad^A_#QZ(It^u@v zegbmnt$>(%3W&SAfcUuxh?gU6)1Kbz7XqSfDGgO@`)fw8^CJP-VodMv9r_&I zq|e4R0SPw{km?HpB6U_k#{Wm}-7$K-4pHvUUV6^E1jKEdfb8B(f3Fh|$5r%NiD+At zDJr8aAZO+aNTe2RW14_W)(}uO4dslEq4!%r8A1y5yrl)CTY|PXK%eby`fRt;XS#_` zwCgFm^cSC~l<~>sLi%py(q}t^PbQ?$_ali<){FUMZ4{p@4x#U20H0KOQLd0HpX_nq zlWto+v9jP3B@;d|yT>PuMtri$fKM#W@=4Nh`uhN%aP{dssK+O=>-eNo#3%Vn`NVrZ zpPZPpAY~%yqfDY*sScrB)*4G?a@Itdl-yA!%MB^7^_(&(I!1NYKFVy}rcAc2 zQzrX?GLRP2|7$6eu^P&xevC5lQ&c8-+Pl-HjQzEid_ZgQfk;(!kvW)6PW2zgY z5?oFmTSch_x-po=W zom4lkP@#HRMv3@PhSG<2MUqvoNHWW)PXDGz+$m4#3M!IC;gqN3t4OR}6v-4jMG|PL zNT%LaB(|3nNyBkPvUHCkG1{a^-cr_5@AWude zmnSN_$)EpU7F;0g3kd+~6J<`Ol zUYgvZ_L45Oo0_Qo^orV1vtLq1GPSD~Qf8FL5ot2GMVjmo(*MnrCTXLkNh?>H$h1ol zl}afh$d)1_)XVcLP>RG*j?}#;Qe=^l6e&F+MQ&}UcAZFym}yCo&M{KtAWw>fwo$vW zT#_vOO6@_hB)RV|Np*=Nv3)E_ObsN-g+r2L%|=P0xI~g@bAfb3-&5GlZ=C5VrgrM49kGlr|m2rrm?IKEfcL>mI_G#Q9(35*gKsDIpkoW2e@h*zlDyv7FoR^yxMn zT+oIO`u}20>R;4;^%u_{{fkd#(YflsR=kneiW@Ckab$NZzMa&Hvm0B`HL3;M9<<=X zO)a=@R12OiYsQ2A&A8OCnR3{h(U04V!mK8Yc5K2iCz|l2RukH{|G{AVgQ4bs&}rKr zJU`|SYE=Bjj{(1Ni{Wo%b${b1iQlOIr4jGFY(%Srjc7Kd5l=NX;2b)aFQs#Oqg9ln zCEb8WbLug~u^#J=)}zeydK5I(AvdZHf8M3OfmL<5MVfxks>Op2wU}_I7GaDXtI=h2HTM6g!VO+kc<)RVI?b*^cgokYil%I> zyT5SCieH$)`GrT)DzV7A5}BQqXrW3uTgBA>;a-6?C#XMUS_OtRl;ic_a-3{fjxpNh zxTO0hy0bsA<-t$XTKyBZ@qXfA>SxinD#OLw%5Xrr48!wEaog)s%->JhTjNU6qwEJ( zzWITQCx75HO)9k|s1#6wRp(34Yjz24Y%0d$kYe0(wHU<EBo>=MVyCA@8;oi-8}r>{SA3>-*ED+Z#a$mwp2TEu_coFysqWq>4mvC)RKed zAvxH2DF=7X&OxV!Y)tph#+uXF_-AT1mRDvWzR5!KBUz|3E(;5bzT%13U-7&CS6s^f ziY8f^7;lw{KQ?A!1Lbx7`j~+!4>M@3fehT)^98%3zo6x{FDO0#3ts!3j;a3XD0M0w zwI`>eUTGR`cS^$*yVG#2avD}?9VLDdO-cJOIh@37UO3>G3Fl?W6o%bKgo*6=TG8s z_wsm@q>L}$;5b}(Iu3)z$Kj~_SUhhPi$SYnv9u=!`@&*S>Rb#CPmIC(f@mbx(fD{x zG%o6m!rZVZJbE??izh_k>ikG_wv5D|DLSi zd21MI`GwK##_=J)_q&+*3~Q-7Sh%pW}({cyh~i8Jjzamjj5T-5yr zCk4L2{zGr@i^3axn&?4wma$P7NY>OM-?srAkU{?$| z>WUFcuIQiSf;NUOcxs9Z&dzhjYEx&l(RRieHBK1e;DqzmJE2>rBlh|^;--C$Xes50 z82cK_&%Va?F|V;F)d5>?IbhKY2aG7RN8_jVsJqM_>uO)&)7P(1ZT%~BrLh_%--%Vxt*8 zb2Ot%mdw!euPHitn4;+xQ#{#ig4(_&*t63FPxd`V@$Sdi8~g}0q#oh?;}20Y{sE2o zJiyNvjPYvnedLV4kH$v#usriF&YE@?4;kM+aQCWfc+SZX&$L`cz4cddock5bYd1in%?3E+c^R*DUBc|Gmr%v$ zBChSdfQNTnz+-;radZDUoV@ECmiwPYi-9vZPX7!#2Asyhfm66${}fsV{D+|fCoyr? zNsRYDf$sgs@zT!YINk3Ue(61m2eu!@ythYiS@&Uls&^PadLF{Me+RL9<3arAb^uFT z_habV{dn1FACCF67lT&p#d)vxpiAv;Y}eh5IyU+=zPk&}7wU>8x8Y08Z8+`LR`gBRL;iR@ykM{e!;&^*m0&Y+Xq;C$b|ckK8?o)+222TBj~0XL zP-n+FEbv;3$J*D>nC==}{(3dOs9S}3I;)Ulxe_P;Sb=lqtib8U%TX~)gw+#8`0fhe z;UoqJl^L`jG}c6`qAo`j zAMQ}Wc=u6Q(4wfSKB2q-<5|l^;}%6&BdLMICv^k0xzjaV0Owd8-8?% zHSQc>7u)u;dDHsXBczA@w!52M^rw@(Z`#3zjs3^wgtxIjHvVOE%UjsUo6YQFg(g<$ z^P4RfHnLZ9>)EEWb?n~38aCLznr+dlVkdp5WSM;x?7F6(ESQ$DlhsSvwvZAwf-=mG zl@zjlSH836yaIN>C6E1Y0bLjJIfv~(n9a^_{mSk%&ty-I&0zlvO=tDjrm>5PQ&L${1?TlbVaZN zt8jK?Vi;Q$5yHl<4`v^fyl0mg1hUm50j#NmKRbGsAM1ub?C2eDS<@;nw)&6{G~5hmGtLq%ON{9vDt<-e{9XJ zQn6y&{hqOIx)v;CK4HHdHD{0gHD!O9ny~R&k64fG#;l>yT~^!q7F$P**k`{C*>O@= zSdZD4SpJUl>`kLHY^KwH>?m@a-CB8sz0EtsI?me925jBK1{v;ReH^y4&*Syjt7V(m zwIl0Ug=uTqjE$?<2ee+}jOPsdIZ}r`Sh$3(?Onv4o4A1ewQ4S_e_D%0iy7?rAWimW zwg#KpHjx#K9?$O8RcGxFk7hF;j$#MAm07J61$JkHEPGvEntd^!#|G|_V2vC4#h&xK z#N@_baUT0yTr*N5{=1<<++$NB9>~iV52|O22actSdwr9|9lwdVbzz+N&#ee?9SIUw zbNt0so4mx;cCO<30ta#HxaZ>j6P9B605kF0l6&I&XReBq+fIqq9v%?im)j<8b6hRH ztGP_98a`W`BAP6={-Pp2zfVTYru4)YSNw{f+m{g^ry3pqaDhj>$(E<_Pcn|i+e$2q zpCshO-})607v!rJ*YcCIEb_$xo&4SDI;*da(!HX+O7~Bff$rg>cDkol_~|N4Cc1lu z^K^A98g*k6M|98bP!M9Gny_S^rtpLNe4&9nBdol;UZ~cvQz+PXM40vIoKSC(kd= zKa)H65L3iC$|MvYXG}x?W2T#*Vf+uCXCxO~Vpj96Fo#PFnO&hq%rvuGO#c46%(1z~ zOv=bZhIh$?QTcAlD6ceUdfq)@az znWJj{%z;M%jHvz{BfH~0lN1}o9G?`z)ISMj4m5``k$WPT4vb_bYeqARtzwwDZLy5< zfq14QQOwv(M`pSWVf@<@7^QP) zMN1~*w>yhzkI!bNO`;2x&Au@@4SCGiZ3Rq4#COJOOc68oelcTHQNq-$rE6v1l`*U6 z+S#>+70m2{N~Tk%it%x)W|j=sFz^1WV}?`e8KG7qv)AS~v#0eBvsAyC>4|P(Jk)pxlx!ugr=^iF4wU>D?tDjM{8eks%8Dw&|4l^9O_E+wi1eob^ zps9fa>s`2DyO{^6y*y|Rlmy8`QXnrU4IEY)>MzIu87m8qzsQ32T{-wZOCHV^%R`-o z0_@dMgvdHY7=BIbD6dzBQyt21--iz-`U1EmF$xZZj{>dZD$t;)3XVh-7F`+*?AS4| zFntWXzNH5B)6`*RzB=qN84FhzjDy=h$AN+Mc*@M002=iZ;HSexuvjw*CjFfRZ#^c% zC_N1@?9l+$Zwj>OPX*PHsW2@>6EqG@16k?m@H1*Uyg4xg^b}`8jd&(q!#)dsjM4&~ zBrSM+X*NWw&4GeXbD-ktTqqnr58~72!4sqTuwwE8sLEIX*KRF@rYVbHSJoo%zOxw0 zG_`?~qYb0(Edj;pOQAhyDSW!O3?59^fvLGV5OGfzW=|J_U5*e+?=qk=4PZ$&z^XeU zSUPn%sD51zWj9xV-Q<-p`^!oQyS@r0PFM{$Q&vOll{HYQwif<u5?!6JP)UaSwgk9I@P^gZD9bq_2s+6#VT_W|d_KG<+}KU`Nh z0OpYg;K6}|aAfEpX!;(4+|7sKbn9U#cQ^ton4|Ed;wY`HeGF1*t@01q$HB|!1e{Sn z34(-^;B)dn7$EF#Z-?Be&r3(c5r+=r(NjyaSw7cfqsrE@+tC1G6djA>-qH z=s0N%9L@u1_kI8=s~^JsUk_ol$s>57@fcc@9>ds$CJ^+<1m@?Mz}rctAalhOjwhHx zfPxuR9ySBHATyZWX9kNlo5Or(bC_6f4g*V{K&JTYO^dMd%P882U@}PI4hVdX$?jC)^Od+ z8U~wb9t+q&^)nk-S!e@RnzoQ?XbbHLwxA?$2V)P|!Dv4_7-_SEvK7xE!1_7-SNxnl zn=c^X+6!2e_yU6DUQ!0)OSt0m65?84LMzSQPr6(N0D991Kx*Q>4wG*VhC4 zyF-b<1FQ~vfR>*J#L>JYZQVEU#^eojWxRpqs-AHDs3$o3dqO}f60* zyrJ!|H#qrv!<=Ss2wwUYCOmu#cT;Izl#&k&?(+dnPan{&_W@>sFKFHN1?ePT$dmE| ztL=WU$k7iz|DHZLX*&q1P{&1+@A6~2pfEddFNX-p^6t#B{aqJyf`@Mr*P47Tb zI}rTu2EvjLfeP7y$_$5g=0)0V`)j!l{dt9Tyr2SK1?C-?Au}eUGx^5~9FKg0kb*M?>_pXqfgj z8XhahK)QYm48D$mi6t?hH6a!>j>iJ;Z7k&1#Dd+-I9Pfy4$_0;U_)yhgfEH*$s6&o zAvPY2dg8&F5rdtv7#=2y;lPL(Cas}7IWrb6r?Ai|g>ZfoLYgIlAQNE&4UL@JM!?99 zz=a$FTlonvc2@#?dzk$>J#** ze*!D%&mg(sGh8tL4DrdIp>543L&kjFm+xU zm|RSQjDR#4s!4OG)ZT`nspgq`ZxoE zNd|oA$$*3)Mc0rC`I=whcqgUTm)(3Y47zq|9`>%x3+x{wcgZ}XwyM?PFpDS$G)0?;-u z03%WW?i~dXGWRHiD#N`8Tzd=oaGY8T+PiBZ-mDfhqif-2O)Z3})cOh59>O$ee)Wz92z}T979kC=v8(}F z2b!UIK%Qz7gsyIaYgd|JoLdtFrZvIjjwZOT(F_S&DLd~@Gj#YiLt}0;d>&|q zr?V(SZ%+&0Bg)eYY5~i_7Wg933axWnp?`lXG@G_UYDg=X7q`MJ?q7(S_ZKt|{Dr%w ze<3#bFBBL4h02k?kUhH%-tK9G!w=h_KcEdBe`|w3eQlKW*bYY9+Tq2mc6jC44)@aA zVPji6^pE`q4r~5_%B6pB+x{PX#DCCMO}Tpt9U!r!1F8;pz&o=J*d5dXwRs(InDY1H zrgTE@rcTf>q#Qn{PMDn730*av5GCIQdlz@X&jVesOAD{KXwBSCtoYM!+?S1fmbU%3M_QU$u6W)Fbr)&VfTG60ue48XF;0jSF#fcu>T&^cxh_UI0R z)4@SVx;F@!Zi7G8wt@%R|(P3I|H9MRfk9Ff{Oj_Btu$`3rw5v?-d zh|2D9L>HfNM898iL`Qr$qL1Npn?#Q2cqT{WQp^#h)^bEO?Hp0ZFh|s_z!m+We8F!s zxS~L9uIR=pu4v&luBiMVSM=~Kmon+NB8Nv@k(>?XQ#eyDg)e0eMsP)Y6SyMtFIrR`+A-~&TDpOcW#_H zckaFC&V8TLnM(Yk5+%N~j-BsR;x|f^`H}(3{OJ+wIEgU~=PL95yfWXlLYZH@L76|Z zLz%Zfq|AGtR%Yod^FAiZyn_wn8#*fUn$MJZxeq%ZsLXE;VeF1??ED{gOk>{**!fEK zdlO6NA4{jZh<`Xh#J?IQ;{C>p_?L_YVy7@jE?5{0(1r?FSL>@L9xLM~e6hu_AtLl89H!6!FOg zBHpY*#7}4t@j>k(p1O&7{~ls~$NUXffZ&cqQXziTNe!Vt&&iF~514m|wj{ z%-C6CUU{3C|FuWVTOJnk^G}NT`16dncvZ~j-4^qD7GgfwM$GqSEJi(NF>m88=7YS% zd;;S#<_3uQoM15@7s5Cw5n|pvM$GHPiFw6jG5~aE(ag%z z!Tzft;fqBQzIQJPKe4}rpEX#*Pi5SdA)_UH<9G=lIYq)-%#`pP7?`)Lt(fSg;b-RQgzDL5(W(=1FM;N!|xP(_ZE#a%qNqFIsgui^1 z<#AKOM;S@@EoKrv%~HbaS~FhcJ(fS?zvw@b@b@1}_|H!m2j;1SFZYn}6`m~LR}%gU zW5hW6N%-CGSlI$4eE3HRzmqX0OCjM6LL_`jn1q)ymW*|zg#YtR!i!^AU4BaVRlg+s zrZ|>Qyo6tr$jX;2;Vb`2__wJN{y@5fmt;!#r&$tyQjUawmMh_Vpb7626I*`86y123ChsR+n?EPL-@~+gTlhSzX0x5`J}x zguljg;GW3z9?x{mbn}tv$eroxI@6i8Tm+5yW)BhI61==Lx4Rx8`)-Wc} z3JJe@0B9v_r{BP&!1vGJxa_gg)_bo#Qf9`Vt(>l zF|X>)*r$v;^z(_BzyCSJGH+9+%yW#3l=4@ZKl)3VuZU3Q_d%Ke{!W=6^NO)$-IV!PjFt4)N||rDt<3kl ztjza2smzNHDDyR2mH8j*lzFFR%KR2ineWbcv~MOT^ZyM~=A-*5^Gig^ydPuL_NrCl zcN8h{uIWnrpE$;@ja1_ML5Uygufz}bWc`b?5?^Gi#LG;S_?wKiwBV!?pS6$mKl)0% zg!MNTno4}@JSBejWF%kaDO1*8Ik0}~G3&qXv3~3_>(4f_er+UU zGG(%U&X)Ceb8mNJEX{7b?vZYM%=T`)`Z{*af8F>Z#^Rkixf{QCSU29XPdDB}p&S3U zL6P?>R^*?iDe@+Y!BH1#gy`Z9)-))_^1-xc}Mn-%%%jO7#~ zRpfh2SL7FsROAmZrqeY=Mc%AIfj2Hv;LoP8u|W*$`#&l0mA(qR*HiZWz5-uktiT&x zP~epgEAUsgDDZi!6nLIf;H{=9@X^B+_>SHRyjJHwI+Oj6OvC@tjpzSpr`bOmb%c#g zR{f(bQ~yy+&wn(olJSdw$;tGsoUH8_)A+2M)@_uNXr7#243yKPhAy&8WK5{QF6!^l zMN=2TjpT2j?Pim@Gx zE#E;4tUBnWK?ilM=pdTVLA$$k(2?AB+8o+WQ(W6A|7ts#Y;7lrdOMvT*iI2OZPXsy zMyjvdXc!vPbGQo(j6x)7#uS+Am{cbh|pbW>80Y znsqdLNFC$EuyK84Etx#2r4#4b*j~Gq8b;UBgXS6<@~ehSU)0dwt2NYrLk;uS)ezrV zP16#pNzuES!fsa6A-!s)I54&7Xr zL(7NfP-AH}*#>1(KeKGQwlSN2kIJTAm02`b$fEx&vPi0z#pW_uR9KlwkA+NHV3A4K zlu1)ZXOc-p21N#EP>pE@DQ(Cg#Ss})T9Qt(z;rr)JDmpWq|@^u>7bB*{pkO`b_)d5ZZW7ABGZzeL91N+hEPiL`1* zBDIZ6B*%&b8u1~4Y;Pn`>GA}c)hB`WB*)Vgw|KgFIG#?G5^tGXpx|BE5t z$Qb%%6+`K|F_fSZLmyM4$;>U9v<^g5;iPD~T=AXi{lC-Bi{I(3l=+l8ztPYy-)Oe^ zH=3vYjmGq0Os+ps6y^{`XSYRBpAk{ym=j68UPRK#BatMV8cDU45j6N+1WmjUL1Pz2 zP|vonl>O-|x!?LqI!nG%q0(16_U#L$-}ypPoiAkE=L-eLg;N^yo0aN?Q^DYH`jHYw zZq8w}d*}aix?W_5(v)YR2&*b9sna&;mOzP7= zQ*p&7GV}dJ{Z6shl4pLRiYm~ex1ejMK`&>4LaPOecq>rQX@MMP2`p}cj7GebQN$@3 zZJQ~hw8~&w?Hf#9CxWSZS};v44y-ht zNI8H$e|bmKZ@(kUMeiuS&7XP(`_r6@{EUK8GuXPzIef9gl2 zJN)R3svi|4`qG;FzT~#nmvWfjwqMj6nq~Zk7A<~5(ze$$o-w{U&%UOp8L#O^sSl0w z^r7IrKEx0AA-})g)bF7;?OW$f?%loVcf>2^=YK`5+$(Bqd`UU}FG)E5l1wMQBtF-R z3S7MCn!Xn)_V*$~7N;cB%#-G7dD5k}7vvrIf_|QQLD`dEP;MUMem!|kfy}3E*6%s3 zi1DCi6AyA+D`N4nd!G&~-=~eRquFeYCcCW3c7QeA{dSkGUcXB_=G>)OMOM`4 zY(;*$RMbbxr3JO`u%J=>EJ!`VoUQMf z)1v9-G$Y51`r4aO;Yu^|Z8s%@x281YfGGtJHYJ@H6H2^cLhI(3(5C`p8sTJ2XV(~$ ztjmb%-x<-ELq@bz)rkBYZc}LcE&90c7TJHhN!w@KB+aJ3iq1Jtsmsn&+$$FQ zsMk3%Jad+&B%YzK3(wGUm(%pN>lAg{e~L6C8B=WXNji7;1Rbq9POCQ@r-6aTD01*I z+IQtB6{Q={=EVl&>wbi)6_3!+Lx*YBw?i~@${`wj_aK#493ani2WXA|e#+>-pY+e~ zBP8yn9_o8(nd2TZXxUAdw(X|V!Y|`BCMvtJk+x=Tpa6aYwYaROY3;hS zdb=*^$<~p!>N*y;V=Z+i>5y!`4()rmhMH=%$#A_k6|wcx|9Y>cJI7a1Nc2j|nY5Cs z%~nuF{&GtCZ#lhrx{S_rE~PO$mQq;o64DvGgrd&>M>GFuk;zOg`gT{7T1pnvkQIw* z{PRUL>K{*%T|DK;h`a_9Z9mUZCtCxyoi3$5cQojF;X+FNZy`-^Q>VRc3&=`;0eJ+> zC!ap^>DjS)WDzx&c8;A(V{Xo&q*NCBYr$;l#o~b3R?H-YRWs?p^BMG^YdSS;n@*EI zOe5`n(`YAKzup}+h1QRmLi4UqCgs1AD0gZH-!zVfZWzbb z?#9w5<+0SfXAF%MMw6z>Xj*$}6s`R}lC4>eq|w($P(#vilFb@UXYUN7q4`7U13#4h zd!$BT)v9d0Q8>yD!B|>PzQt_o3dYy~$-xZyI6Miyq|lq&BW6=|Aj2Ugh1XbZK`Q{X{}*8pL!| zM@-jWh{(7@nQrJQ(}_1qq^qPv6L)r_y7!6{&{L6)98jQ97yofP#>=_e37y68Q^|gQtJ(JH(ADPFQ{>b5?4YRq930d5*gbZ%dZT3FKj5JQ1mcnJ2 z|K;4~C3EX?61fWN1kO+z&(#&iaXTLT<^mS~;#$gnax)x%a2uA!a0jZtbBA15Oudy+ zoJM^F*Zt{NE?WBwceN>u8|o3tyh0gxxE1QPgmgd+JiYKuOKdV!$+>6BarL$ z>OD7TQvlbm%b)9f^_I)nR5BIC<6?fG8CD**ki@V(Qf-8UZoZGm` zgL~8I&b7UK%JCcBxU(HkIA<>xE_l5&7v1K>{eI!d#jJb8$y)3=SC5C>C7lP{vL-uD z;(m_{TW!mouD9j}xZdU7tgzzv8cXiWV+(HaQghC~!jw~cWWrt1H0E66ZgU#rZgSxl zuW=gR4LP@=m$-%#=Q)kgGu(;(r#QO<$2rdr2Aq%hF!yxZ0nYsOUT$~iE^e~!4ldt) zD|f$cGdE}1CN9EZJ*Qo~mW$9>!_Bc;#XU%0&J|Bz%FVf{#hw1WhH=v^X_hqE zDpeXZEm3O!^OyA0$!O`aJ`qyYw;|GUU77S#&3mc!eLv~Wx!%$l3D2cn=iQ|7DvzZv zKRlG)(zliFXttDcP9{=1drjK={TXRl!y##c`VMJ~;d<$BVY#%RgOm2qoGo2qG(l?f zb*Qvbxu10ZDrIT9N`uB&=PV89QPCPJJ>P3go93pm;+>@icj}PFex~B?clv4^p7DL5 zqy2$}dP{ezug@*}xN__LpyletLEU@Ir~J5aXFVx-JVYl`eo>pWRxz+&0$2^!jxywvuBD0c}s@Tb9oNrMmxsx8 zpGL~Yx5migH^#}fyh)P1S5B7|?aq-^2NlX<`<2UXAFYvzzckAB4{ev(o%<(?KGaPJ z=r0mXKT8D7qdkROl|I7puzo`3@qxm^A%lg>UsMIRlf#79sw0J`Uq=gur^X2j)g}t* zUndKPPE8XMRA&kkzRnhQo}4FK9-=N>4A&6YYb3(3L5qbiAzFft!BQc({|Z5bRf77# zHNwi?>jde?^+K;bn}krYzOc!EtMF~>4q>RmZb8R;udsW=0YSI*kTCL@f$(G1aY4W4 zq!8+OMi6P97p4|n6sFo33gY?Kgs`+5g1*sh;h>7KV0FYqa1%_0r@hSu+r1XTvG^bDA{=J#DLeL-Ao!gG-#2&1_g2PSbL|29|9WCy zVNZ;>(+l6H_r|`s-Y7fY2m6Nf#W$fZhVSl&JqrDCpK;gTtsH>RvH|#HGY~IltKfEm z3RYekgih7LaK~WG**ygQ|At`rb5&eku7=QJH8k8AiXqd7Ve+qGm~dt|`VAO?()T0a zw|OMn6EG70oJPTh8x2v$Xq>pg7;GcQLLNF6)Ao(SGR5&&{d_!V*#xK+PC$X#L^w~J zghk&b;pdUbSSgtTzgJVBuzD)AN~hx3ooTo|Wjc(br{na|8CcbQCVG3%#HUrWu%%=c zvMgppchVfZiJF7@Lvt}vc^;O&mu+81Juvj%K6 zq)1AZLUfVC*nxye?+8P5dDK?$2((&+eUlfXC2}#Y9MDAmKTRxj)51mi4=ySH;myS* z@EoudmT#9rPiGmrmoCFgv*nmMb_Lu*R-k$NN=Tbm;=sdIxHM}u&iz;o{Uh2K*KG|_ z+}7YCr-Sw+9UMKo7NNb?q4VWBj9bd~1Z3%A@|E>aR@s0bej9LQ^+xn5*a)ken^3K) z2kyNdPOjYy%i_(rW2BFB!?s|_hb?GZw-rt$TQS0T8}1C-j*P(V7_@E&)Qfju(e0g> zs<_hZZd$5%~7 zG*7`R=@j-IKMe(iGcbE}236C}g2K<@r2aXWl%K0E(w&K3Bwy(3b_b@O(>w*67{9%HkWCboC}m zd)>mlr?)UX_m`2UEPtG{wIOW>|g748|YL;M-+}?<>raXlsr?$>z+KE#P+80w?_}Fr&!=S&J-j z%ghq}V=ZB?atGp_cX0gq9oDAqpxaz4NUvC7cbF9}i0|U+y1O{*a2H!M?qb$BYcw6T zhM&JRHaAQRZQ-}Y7EP{f-%o)pwoJW;(`WAC@<(>;xCi|uc9>~t zhsIbtycu{Oo3`CYncIDwDPRn^DG#vb^aHpDK0smX1E^^}#3Iv&SRefmoBG&e`6hcz zbh1ZthCPDDIN&hbx1{{q0S~Jk&~N@D+%SBEluwT^PQeko*j^{|JC1CtpCdf`JHchM z6K+3tf?lQ*oeszIF^aLHN zo*;|y;okmwg46w7F+$H3vPZ61mgqf&ij&NL2Iq^H!#bp0VZL1|X|E0AnY=$Hs&2amxKYE@!;Qan(TR=mkQ}E)elQ7;jGe0g|O3V0QBZ zs$?IqtdV`5{Sohue?*MeNBqwH$e4IRc(Nr32Ok7MH8u#r;$SRY5)9#bFh&Fg<3w#R zyrwbU+#wk${y z@KJC$8-+lxD1@d*;eEevxWD`xwqN~*-fzFbC;uDfsD8(Do$u(n{T)j`e8>6H@30;b z4Z97|xM3EJ&9Z0=u8ccaLN5sNMHx_9|v1oiBi`K$e6b<=>&#Qmo#l6pK=s0M!#Q{_QVA761xN-LnfIrAD z|AU5M@u*r8k3ZMq;rcor8`I-a(<1?wxdap+O@P+p1Q>r$fNygG!Y3voWOE{(n0V7f;Na(|`ZR(lGRC#T}PUMga4r=q)WDrTpq zLQ6Rf8gtU1wkr*}mW-1Zn1*RNY4Gitj=>AlVX!|P9yaNS2u{cE{B(r($$*PA1G^7q zp!+@cS(bsp1sS-~Cle7GnP}RdiT*a3PzlOJS57AW^vJ^9`B|8`I}5=US(y4R3#MsV zi0YP&>gm}~(9cHO&1|H<%*OM$Z0NOSqhd@BPH5*K;am>Jx#VEm*Bls@=deArxi~?& z`0qe2x~y{H5s-_SY3!(whtA1)&|IH~W0&)A%`FcXBJ-eEk%!>}^YK%fkNtb|kz<~Z z6~6g+n2?Wet@+3sRe-|f1^9iu0Pgn-uq~(ntr-QltyqYvNrhOpwh*_^72<_sA>Mu} zghy^6u8E4kp!LYtEyB4AMJRD9!m`gru*@yOd*xz8PANvn+G4n!Eyf{-VhofO<5fm6 z#{Vm3jK326Sy2LoVnx_qoKEp`yNwu~N&iRJ|Olwv=POVL3#P%Mm6k$DXuu z6tNQU$ViRN&vW3W%OmpaB*5o?Zdt_6m#}RtX=j5<|9E;`o(HcsW(#TTmr_ zC07ECmAI!;1?_oNDBDnlvuCQ1ZCi!8zEwE!qYBoHhwxBbjaw6{v2kfNdhV;n>zmb> z{iGUCWYwrjuExZMYAo+xgVi%@Fn>)AlniPB(;94jR)dVsHCUcj1N){LL=UJ%;mleT zY1iV{;aWT~u7$2!ElOpzIGV)H)zo5WuR5%mREGmg>acfL9hMo^p*Ld&e)g@y#_x5A z&8x%A&N^HiQV)+g^$1*358p%exO=M}x{vG88c>frKkFectjBhFJ)WpG;Om?Q{MK&3 zmjexOzRs9}4h`t=ZGd@H0~)g$pxxX6v%Zb+oYaWdnvHPW(g=gojTmLoh)-^fSp2aO zUa^g6C}_l_jz(w=Y{KHHO&I%M6Dqbe!R1sFW}7v^hp`BI1T`YSk%~z#_lb6FtP=M=C$C) z$`-`zXhG*`_T97v1DsmW___t3LtAh>p#@z#j*u)N;o8JMyB^`)c z-+|=a9SA?sf%{iGu!8Xwa~(Rc_jv~*{5#Mmqyzkq4y;e z`>hjq;ya<8*@>FsPF$<&L|I2CG{s%G(!UFi!@A%yp$jInx)@ud3yMp-@K~n{gY>&_ zX-^kE8FZoeY!{lYcA?y)3lY}rzYblP=+*^4uPzLG%a|;T{rEhz3!&eb{O-bwzg;+; z-G!0GT?nY^!qlcNSax>dhmst1J>}>cAV;;D9Fe2txIIaZ(KF?EF<*{8B*#w1j=Z;0 zj+blYc)m#vvu$$d?2)7Spd1#*gISuN;CtNRB%ta_lc-<*tw;qEe1E)hxdn#=NYPGp>vr zI~rI$8rkP2cCJ|t855lrR$nG#Tje;&tgy4kgISh0MDvixjWz9r>yOk(BGX64z)%B981H-MEhI-BLe%3YYo%9bL>BUYct zcsWvk%aQO?j(5>=TwwJc&g$~ z^cwO&4iVGye5UUeOz(@B{?*uhNWZ{z$?i)pc7LuPl;h8CIeKnm?4C_>%vvjlD!ZRW zT5>$*n4ag$@pcB&KfCW+N6TTV#>&U+!J65Hfs!1PnVtM`jA!;)!0a@g*=rE9+beszFpAmnYi7^G znO&b__U+5;{1>zL1ZMXk%>HdzJ6PJ;i7eJGc9nGE3u`C65;{TOJF)&VYc~O%nDVj{ zm8@Mk+I3=rStlM}=|ug>PR!ZgiOu?**rUzb-{MZjvhGCMgiaW$b)utJCl3AVKwv#< z$Bdz>kk$eD&kp2=cEC5F13NrBQ0>@(qgEaGe!T;|PIo|kUk97BbwIkj0|OU!AYpO` zE)VU1VlVa_>1@Zhs&**mv}5d_c1-@#j)CvnQSiJS&i3t4H)}`G#deH5+>Yb=?QmVu zjzD$xOq$pZ`@!wlC2B{{rZ%`0wqZz88!kn(0q@&T=+TCT`)w$@-G<21Z7|>6hUshD z5KL{DI+bye7&|sp)P}qU#+A)$MQU6td_!7s6BJj4sL~hw^sD1X~Bz(7L1Q>fz^i=Bt2_^*p_i?ueM9AI((-1^{>%E7FU>gP+l-@5%~);Hj6SEDA=}yv?WL@rnbC|5ZZ$z$BBTgBy zBV+K=#ztJ_8sR>+5pQ}l;%Qw24AUB*@udNo-VHcqyaqMk zaYsGQ<<~QYZaq@`>v71D9dEGjjQ@L1yB?1j3)pLLJ)Ar0aDnyl>a4HNWPSb#*7xVK zF#yll!MB#y;nn0i1of_iUtKNk{$=BbPqk=uXP?b#(d}3*_OGkO%el2k99)aywi@JS z)!@sQ8d!PNK*OpAzfRUbdqWNU=GUNQNDZd6SL45|YG{SCam^YjohV1@nsUaiD96DbddmX=}l*fNCvE5-2aQtba+ zihC}lcz&f6?psP>x}X%g1544Zwghg!N-*Y439RpwAp39$hAt}sKc)mLx{4u9XXDu5 zVkFrY<0c!|_FGpBtEt7P5EVn6aj1`k7Qx7+2qu?{aB@=-G-nl|wMP+LiV88|OCg+G z3sGlShy{9u*gLBb=X(_5RAB)&h819>O9A397U0zS0@P0}z+UA7e8|p6y(}MU_W786 zDjy?P<)dp%KBC(5a49JdectB5&N2_J`|_}c@?fr#2k**Ue2B`0&(mC380JD}LoV8< zY8$c9oxHey_|VR$|p{nli|ZY-ORv}Qr) zPZlg*W#RQLHgD0-g5QiR*eGRTb9yF30hxGanThdxGGVuXal(7D&v_Zp3C_SS+YD@B zb0dz+fVf`63*E%Oh=2JPn%Dl~(Yn7# z9`hFpjma4Fo$;?+lF@!L89%j>VL31vGm4V%IXDUGcaz|}D+$H3k}yg!30jGX(D6#d ze};(|qn(KIVTpKJnSe#135c>wfX4m=ILu2xhEf80C&#mAc|2wr#$(j#c(kd-GvD1G zoMQ7|iS-{?@BD-I>3^Wt83(7>I7GR|A)B$`^A^Q1JZ~JlGk@a*V`UA!@f!g;zp-HW zZ#*ymg%05tG_8K&Z`11gML3If8v)uWD&zrtLH1Z3mBpf>f!g1_+I1a7|hjzbkj7SSZ`tva63kt)? zg<*L1FO-e5LUHP0D1vr|qH;ng`c{WvL~saHjhOFeHREp$2!TWTXXexYjLZ|Cad5$B z{AK>4g;AeiX8Q>t`kzoZ@)KH$fL1@C=n@dN7_bll^h-d7gMeeZ1Qd=Ju(m=5kM}Y* z9*{w0i43z@+ypKz7;_whF=%%%ipB@Svpfjv1A&y@F2c4I!c1MgwOd~qKu z0}vY!fcVP+%r_bUPlW)Sk9vn$ci$mR_Z`luyhCe>KTf*(BW|BR#!O^!B+A~x#_ug& zont;g^|$b8^MhT89}XJ(VbTgeq;&U#VXQAi_gQ=jJzrD~@x_YtH?VbkgUEevP&WPz zi)Zi}a-Y|zIr$oKvtPrl-UmBA`apce2hWK4D!aV#Jj@$COuVsoxi>t;-bjsph4#Cz z(0ko0^y&8sU4LF8^C63=vH2wohP;GIsu%p7y}<4CLf{B5HXifDC3jDR?DIt9SWgTq zV18E57g%`s1*T1Ufqo^=k^kyB>t~*0`_$*?C}V!w*BXNtEUqNL_4C|+!3FaIpV6KBc_BsLiCMC*umbc z%xrPM`i~9>Jnw++EVjz}DtlPGwuirgJz^%1+uSasQbscx`YtXUzKd65?&5cb6^b3L zP`A+v)xE8d{rwKYP42*9@g3}JwZx!6ON5`Y#GWaZsL8j$c{dA`ZneP1ffn$MHAlOJ zIcSMFTYoTv16vpIJ7Wf6su_X{OyT2ZihEm4ad?0!=KM54l^NrNX_{b3t1(gojB((E zF>)ptV|}&}0-e};%tj+@?rDT^mbYQrb_=m5ZlNRVCI)P{i9TO%pl<#ReD-3@FxBhm zZgmZJ+OMMa#8qfzUBPADD{u%ig!3FjSa@7!EY8bNGrfe*4Huz(h^-$bUBJ*47qI)| zdEA|N9#0>g!xPat7+pHc;#8f1lKvTZM4rav1*hTk;uLBIp2BRClh|H&0w?yJz>&D) zSfhCys(#1tYxpsox_cB&tp+eKFu>R3BakdV0`>QYv3AU1th;vz($0hEef%JPq#VHc z6$hXkxF1Gi_OmtHeNgY%i!(>}!ajKqo-f@47ysS3HDWh(tad@Ec_&^T*opaZJMf0z zfxh0`v2)ON*c)v_aOGA+ZQF{l$Srs=XA3U4>SI=SeI#Ajj3YUEC|IKhouEy4Hg*$o zY&N1->jsQFxB(M?ug4&6J!)R)BB-w}j$K`c?uBdNpt}~m1Rb0iuY+*gHRx>7#-sz< z;A2-qbKz>te6|Wbdagpkg_XFIwF1*ttpMIFhsLnw@GxD5*2<+=v}Gwyhb@8alqGO^ z@E;u7wQ%F07BZI0@B-#DT7W!@`OvSP2bumnwq`dMIuqvNhV>jgsh^EE+h@Zk zd={K0&%(ufGqI#;2IM*dY zG<}(f`pFZKYdZm94dZcd`*`Svjbm$l$gL(S7j(BTv0W&ozm9Dv0S`eSKRKk(c8VNyt6D39%nWV1eSF71sCYkQ;J zzZV{>^ukobp72ZWfeD&DaNnals+GHA$x+59`zc2FEHSDdh#2!x856fDW7a1n%owGF zQO4b%T&Rfbm5T85QNY>W3ee4#3ol=E38hCng@Lm=gvkwU!bDlC(EDbKkiDc?a27WS zT0a|vIJ->!dPKK>knZbVuaZ@qJ`m_--YIXQ9}5aNa31kgfM=^ zSAjvCh2_y40EiUBX8}+x~;FaC4wAc<_6n zF!`O}<>)VL+xk}MQuPz;Q{M=~onH%%+kJ#?!@Pw9=`V#q7cZf8ho>-m_zPishKF$Z z$uq%nr@LT1{Hb7);VPVBJTsl0F2bnc&O%|jli=>+DCq8ZB-9Oc5UkQ33PYS92u|DX z3w_n>gsUmGLb{`kFlURkaAWXYAtdRJ&}eVTcxx8IvVrEpu6R@7n&mk8Kc+6t5Hd9n=wgb5;wBcdZn@q%ISr`bz}QcuhfB zcagCD2PZsVsUhTjT_6nBnkQ&|nl0?rm?>NeoFQJHN;Sk|{-$BBqy90!|;(kJjac{w?tB0`UszfMkR2EFnb`zwj|782)+GR%H znq*EPwKA^{6|y&Pie+z}=gD3;XUZJ!r^rk#6J#fD{gUZkik8hf86oR=FjQ8sU65hJ z2btX}f7wCJ*RqA`Ub5~pp2;%DJ(0Z|>L@es|3J1&Vk289w~(nc8Ow@OuFCwQ&d7`d z56gCY?3Asr+bH91u9ER57Rz+D&zGH8HC5)SK3bMNez0u8z+N&p1x4Ay?5g0spVESZ z9!CXhUJeLu)pH9jnQIk1bj4NtUrQ3s@q`N-5N;SWDNIRomN+17tBkdpePI@TuqtreHQn!pSsc}xERI4CH z`nUMEbY*#>^j=k})UP&6>e-MlJ=a_!9n@ASwe6^rrgt?2a9X8pJ=qJf-~`5-P#q{_va59PjzMsP38M{x$CvD^Uj@!WIeNt~M5 z6z+o3bnb)6OfF4v4p(3_k4yNsfb+bi!R_qgxTfoixby9rT*8$l+>n-K9Divgx2$0` zH}jkh*H*obdwFsLr(V8^^EA-s8Vk2_6A$d*)N^)mlXmUpnp5|4FZB;`3lffS&vlP+ z)jv*fYO79jV-Fd{rxNeXN%}nDidVaG@66n|!{JXk5qrn=Uy6~Jk%vfsvWu9EYgqNJ+ zzE@n2C*E8~vJaQi{|)D=}E5&mfd;(W?K9Mtioy2wJC3Aa+rf@Ge zq;m0=XS=VyI!t1!I#(K_UY9ptyr-^&}u$k-ry@gxa z(aPOcKy^3eg*^ltzKI1QwovsI|^n+jduGl*)N2GM5Q z!Q?ez2o-)BLIdF@nxM8$m@2N7AZa zBgygLC`xP_MV)q|NoCR)8uEDzi8qay(;mGkw4rng&AK_2S_e#{w=bvBdVV@(#Z9Lzhh`93XHYNOnY423 zEIR#h78z;JrdwIF>FBvRv`93UIv>xamow(kqVRbXqBozWmdvNy*A~#1KI&BUOr4Y# zEF{tQg;cj)gT7a4(4E^-nm>@E7*CG0HHZRZ=>Oi~Us27|DWgSXG;lH9@LWs>7HZPm zXicivu0{7Mv>0FNKYGx23DvnTAqJwMQ(u?T9ld3AuW%XNxU`({G*-|crxg@3c_nR- zt)!o;SJCXWRdnOnYI@(cn*La6Q_9da^xbC-xpO+SH%5oLZ(mE!rE6*6m34GMqDvu; zx>Pf9J$3)Mo_a3dK#d6-C~E&kx>dW8M&I5<-hK2)%~g-iPTNfWvdxsdQlAQw^eOGY z7W!Dbg|6P(N)vi-qaf#PG<))Pviq=|{w~=;%5ghr=&qeKsB9-SU)n`s-Pm3XyWONb zVhmb({+#IRhFQN;6WEa{{sx`2nJw6unsoa8k&afoyQ7`t#9>E;Us^YHT2t?<*0fx(rju>fWX9Q$?Nu8x z7i{Qsn+=N;ZcF{I+ER?{e+->=k?(XEN$o}knw%FZ)frTv=wjxRh0xF0| zNeGhrqr1E7Ub?xq&-Tq9=d*EVcV}bHoH=vP_ZUI%n-SV+J;dX457FNLAZ46zs$+^)j;7G9 zFh$r9GpOx0!!%nnY$-N_Zr{f^y7@77Jb8@S*^kkot2vUj&7uEL#C#>0!=a4@2LEe; z2RAKH6>fove=Tru#uGfc@B|KiPvH9L32Y}>3O0@<*1xtyk7`TA4zrax`aFx3{(Cv0KlYK!?*wx}NT0vEQvzz_2m zIGFYV(QWO}aiJX+U$w(=*$y{9*@@W4mpG^M66@^*TdwdWin`h3)=GQyy=xDfaC>z6 zX^#_AULpACD|~Z&g+V2+pxN6&d@~LhXXt=-Q4Yxau$IxyFvBN4J${uQ{c_6BcydP23_6TPo{Lc`w^ zQyV-nVz3vQZ}1YlIxk!g^}?{vUhp3E78AC=g}I2)tc`w)Q9s^d-2`vw?(xP+3vba5 zy)o;LH(LGUgP{FB*ly*6x+EX$YvPOe$-d~Lb{Ke zK{7lVW%M3MoX{q`4T#dW#Lse~N%ug!Ul@p_vw<*k3dEwkKvc92!ci#*Wru<=*E$GB z2|vS@ri7Y)r<(bz6xj*tI}#^F&h&|VjV!PjC?=qgxvxiRS2JQjB+#G+wy zEO09pdY-X(To{WNE#qLJA!3@h#bNH9IDGYr!{eej^ludpV~uz;Y>mg{+ws`v8ILOk z@wlOufRhsvuyj)b)UPKXK=AQaW+x!!PXe??CBkrZBH}M5;=O$$nkFaW=a)p33`l~< zze(7CA_=Xml3*GxmUUvgOETP%4CS6={J5Wtzi*S#Sdfh9W+}KcCIuR6QUr%C1q$H&&>?sTpYYIRiPp zGGRJ16Iy#R5pz2evs^P_o0^H5Pnqc3D+`)4vVdJ#7aXI*JWe#jl=0M|d4qp4^pnZN0HvP=OgZ{a2 zo}CN#-MM&rBNrzfaxp137kM?gIM_B1C1dk2cZFc|9m_-Tqdeq!=AkfM@cKUH!Mba{ z=xg%vYh6C>oyo^v^L%Xg%ZGhVJ~F=Mqqau@YBdXxzM%kiXA7{!q5waA3ve^L0AD^A zU{$w5m`pB2;F>}tpDaY2aUopa6yj`3Ax1YABD!4>7LO@{&*CDq)+xe*TSYi%Uxd@) zVyP^`!rw(`)3+GDTE$qpp%}5JiZRxt80S5T;g(p8_?lv*v`~OU6nHdSfo0nicz<4j zOXgzfrNHtO1&r$y2x_TB+7Km@W-0MzixT>0m6%|vM7+Ba%i{$PutJG8O-eAoZwdBm zmf-m6671G30q&IGr(FqN1(je*ZVB8zlt5j*6zfKm;>Mg(SZ^tX<>^vfeOQX+&ZTG; zQ3~6_QVjc23gZrCs2Ev>fpg0+Z%Y|goGQcY2W9B(P=OhbrtHDnv`L2v=00kKhufovp%A!zz5Vt-^MnDtN|Kp{}S3?LJhYYl~_$ z?_G`jan*P-ryA4ORU=lX8qlxCGAwyVY;pK7#^6Xgo4QQBAyhbA>x-L(eg!)vfz z@C<{O)}Y1q8caD}gCzzvSY%d%F%C8O>{kQFxEjnVs6j}54Tk@&fnJANI1a2ugkW|= z&8>yUnp#}hTZ^fuYms@g7Msk)eurB0^s9w-Of634)Z%H>e(SC)A_mjCy!2smJ_{^$6NmkA8af*mJcWj~>*+-l`tY9qVz`yB`0B)#FQ2 zJq+{f(W4j|Rb2Xh89V2DqRBTNVih2+o^*4KEahdq(bN8 zDiOP@5;m#|b%GD``nn3*cT^}gRAIHT3a*b;sJB$1%X1Y5*{RUYL4|kDDtNl7u*p+} zYHt;``K#bh6}|_nFeF?BjVKjH#H!FdL2xURR5+fh!k=^%&Sa^Ok)uNQd=+LFs<5h9 zg@2VQ3@cTkrc4F13b9_L!n0}>e$PzBhX!=47Hz4h0go~oFea`6uE7oH=G}n3&Vn)Y zya9fu4G6r`0LM!WIDfJM8V4GXzD2Z2!5@m5-++EvVtrf#^alxEYPSZQZQX#Czv|K9 zy=dd*LQmw@!!My8okIkd$g3V#Ue)8_lX~2~UyuEl>oN93J@WPly|TU@HUHLQ8S3$P zTs@)()T6jlJ&KyuBl2?{jH~LfFt1MV=IgL8unsA1LO5) z2%Xkc=r)HbbDae_GUGw$OnGg)TfVbmDQL8&~?(qMKta!iCPLWfS> zSBqnoEs`{9kvvGSkvi7m)}I>8XskhDVU4iIYmgdHgJFV|w9C8(H*eIy_+$-k z>=gQZMGXc{uR;8%8f@uNgUseNnEas{`ig42POL_FKs7=gL?2*UjZ;^vF-o@@(VMCT zzqlHH8r5h!pc)I?R^#B;Dx4~-!hw`3%wZLpIaa|<@Ns8eu7cmeD)d}egc6 z%5XweiXqv8=@eLsSuacBa<>$}j+J8C`ciD2UJ9MTrP$W06jEae{$vQdBcKHHY)TM* zqXeT4mEhdU61}CNp_ZL83Sbz~D3ZUPz0IbSKSxi1Y zIp(ABc0SS%Hy~=~}jXcrz^Mvn8*sg=}5b-w`PZYUW z7o3ZqPjm6$VlG;4&c)$rxq`8h3)QC_bjZj-FV7sP3vPAoksNp~$-%CXIryQLgDYj( zXb8>5{O8%Yc`+MrHfAGoO19`vv*Du3g1)fHr#WW{22U1rcW0q;W)>Fr$%6UUOeAGw zqR}H0-|lCk;Xo!5=VjvY0KuyIk%5Zr3>@*wK;eT7OcU(wOY<|}Iv@j4-_sG7l@8xG z=`gyVj#c~9@oRQEO#7sxtKe2$NlinhOB%WgcGb)sX;`h5hE-kCpw*BH^_Wz|+onSA zLMqhOrov!cDr#G#V!AQ~=K@k-W0C^T!zpl^p8~UfDcJWV8G}-i5#yMQjaQSAxiJ~i zq+}Sj7W+z)giV-)KgLP;aZvEB<|M(pR}xOVPejkSM7Y={V#K*bJY1QG(&331_&Wjr zW+h;&7_V&+Y%HRKVzJybR`e~g=szCR^C-N^jl_D_NPN5! ziHmC@p&A~ERf3OYog~J{wh{QM7l9UwBG9yVgy7SJBPb*s`X=ERxi1_cn&Ft&CLCUc zVQB9WhV|FNaCc1@oQH+M_iHHJ<3eF-9g01=p%^qP6!9HHv9mM;C2vEp>ShRB)`#Hz zh!70>7L57v!O*r2#^NKvm@p$4f7OFU&Wj)%^a#S=D?zxiDhQtk24VI4Kv;(bBHcI; zpLYeKxkezGG!2CKD;+{#5Z6x-8gq!0j>JZ#jARcPldj0Pwn9d5KN;2a0r<@TG`$~y zkDCIJHZlNDzxrcsv_HO?310smf3y*Pk+XmOkecj=9?$%+?64nnwfsc;^TW9;U+jA6 zi)kl(1v}3dZtZ-rEZ+yYjy_m@+6Mu1ebBz6;BFOps50#A55dLmTM69Kb4VcXUdXL8;^ z>*X8N9({wm(i`+>@dhSo9-l!=q3) z{CnRGjqBWSeV`j!)VboUk1KMnxMJ86SM2WUiU-B7;pp@lZ%&Hk^w%(K@fy2QT`<(j z1zCGsaAuqf)V?~yAk-PEyUtj$#u;XPosnE2xLoc|Xm`#Do#!~AWg92draL0Y+EI)_ z95G>>BT_y)V0*9w3U4`J@k$50>fwNQidPup^a|^azrxXJg4gxe9!F#CvF?#Q#%#35 z`vLZFsCtQ|9xtId^AfvfzC@Oq$VHK4hkIsrNZ4YBpM&ktul5DTdkQ)C0{v#az%R8I zNKCZFeN&O&VzVvs2HN64l?^J~Y_Rr}4ZI{9{QdhJGh?3P$b;v&x8}L9f1bl!@eDUa z{)|0`pJCFZXL$GJDQp6tVy3}UBrST1Ig(hxR=yK8u z-88Mx>Zc{@LoE?{(-JqASVHPx31!9;oO$vDzqg9zpeHD6k;#K!>-F}l9%`E2!;gr&_Ap6(o6a{_~RmS&RxXV zFBhPrcL9d)&cj0YJnq(>!|ns;Fr@q}5_g`()}k}W*mMRO*{5-S^=UXIpF+rzQwWOI zgZ*4RoD4pRQPN4o_?!^TvJ(h$J&tZ8k7Mo2W65MM$5%2roPrV(ajQ zXl}g#mK_$L&yD%G_uo8J9+`)UC3CTV-CW#@n}eq_=D^x>Hf|4_ja`v^71OaH9I%-JWIIXt(MLl2hg#^+R13dPO%wSbG~v8i6MK`ULVfmB zyz-iYu_9O13yaBU(PlC>>Hh=kMh)=|XrMlQ5`NB~gzvr+Q9W`ZqO2ysxZMOSzdRoQ zsm8%%*Esac7z>N}WARsT$2N}`gO^W6qpsLf z4u_7hnCERe4DKg~LMj^q-!(%pByupWO&*L?`$6c?Z4hSP9Ee??2S9J%0G!S0k0T5E zL))hxMh)wS_hxZ=f=!H`ny^!-l%uRRdDaIK+ME;iU$lcyu z_+Yw0ZALe=bnS{Cy}P31ZWjdn*BLhsbjIB5PWUjt6CS_qh|z;P!s}57jQi6b*1GNS zvp^jym#D+sza3JCx5F>9w&>TaEhe3415HJ1Xe<|8GPXjKQLT_|-V)E7x5So{A{Uxc z4IazYu#nA>KC(Ghn>Q1F=w=vyqABhbH$lPDCYW{NujIM(kEA~Qx1{}7>BWR1`@&g9@cN zj|-#@y7^Mv{5 z$gDuAXE#c}YXhW=P=CqN+)r9{#8>)nj*s-Hhqu(b!Amj=_muuxypgu)dPuHw-KF{- zZc_h-*V5c@7ipt~v$XSwleBq`qqMNQgEXwpUiupHQVKM)lk^V0kowKEmDt%vT3Yo? zO5sy!(IacgYp<2mNy}2&tNuiKU1Ba(`aG7p-7}M>Z8w#)HB6*!EsUid`46Ra?jlE^ z!2@Z~dPC{UsQXgbue*{#+8t@ytJ_lfxm(h$WjCe%18+#K9}T35G1sKEldnpe1(&22 z1{bA>k>{nODQBdXXHH2*eNRfwB92Kq2X!TOI4u1ZY_o}5_e-mr?v?gB?UMGd*dcBD zv{jm6wOQ&kd!v+7u}(6&zebuiNn6UuULoz&UnVIBEs@s5ERq6_ERZ^Po+s__n=RRH zohfBDnJ)cu(31Kr)0D=&pDax_*N`S*qBKM~PHKB|j8rpfloXUaT)Lw-R9ez=u+%JQ zfb@1(KWTG|KGJuWo|5s(?$V%7T_l$$oun}{I!Lcd+DW}`wUKU(ZY4D&t4S;Lnn^A_ znn-`n{M51y`KmRo)km$ERgGH9Eo-#mOUkuok5+2ApDfVo&TOr-&C<2fmnLbAGKVGc-i2qptXSoR5!|<*zqd`3qdNdKo!tZOFFMGVA|bD|Nr6mb!zn=N|r<{)WU$VT&|H#mH{=I)U30QfsZNS>ht^uQF^$$pN9uY93>!g4S zm!$xM>Uja{R*QV0TpzH0*vUw{Z_3Ak}JG@wBvDqvDYT)+y8Py^gH;nboh{HJTOY$7d%Fe?>b)YdU&EdFHA$;*kg*Ut*a@IkI<6e^_(u7ADt-=h@34O_L?Ub z9$g@Jh+HHO>$ODgcXXNjHGGBqwuiQ?ePoTC7P?NJ)NP}zcW|@(IB2W-kmyf)Z0UHix1se{uTG-R_!0i3#J;$N4Gze zZ{B(&-*GpV&t{v*Ykr%`eTP4mQdu!a|8OU{0>W3s;-@G(I4?n&8VMxeZVcaYre zcCh^Bb%^{=YN-6|Q<&V?GeRCQBU1i%SCqW+X0$xRIY#cB6e}mci<3`uO_0B9Cdvo5 zB*`I{ljR>TQsjP7sq(PuG`Vxz47qY#rfjn+OP-;ZEr&hMkw^LG%4hTQWS5`$a(Mqj zIe2!FY_q#q-giSGcW_Y3&tgjC4mG9nzBc8u&6o-~Xj!EkqFW`~8&%6kJZj{gskO4> zyE?g7rv~}xq(<36TP25{cqa!Lzn7nRevr4PeUzKN|0Lh-_(gs{;j4_5|H%iAev?l< z_%82p{UQI8@Kdg+`6Zug^+&EB{#PC}qzOgx6)u|7lyg&?iah4c*ru@=v-O+Pq^%lf zTB$LAq+qZ4wP4ADmRz3Ml1{r@@#DKz9CxKPH>kJaaqBibKdLQH__gJx1?@N?qa8o* zRHsX$I#=koXG!Z0++)#!nL|5rvR6kM%<9C@#7?Z+)R`@+I71X_U2TJ-kd+A4`+My;b`<_)0n=D zS>2E4i~F(Hq5gFE+@FK44G=LW16gD-kOPJc;tKacJft<4dXa;9aODs#%^$)(`-U<{ zHI!E`3}ZL7;k0--oGp5f;7M>qoOpIhx*w#_;&3G3_nc>p2X$(lh|#K24m|qxc}5YRQ>#i zdu~o-T?<~5$oW+HsXEXlIY);dh!-qk0m^yDRf5gpYhgI`L z?B6_o+A^P!CG&atzyc0xSU|Uv3pwP!g}ioY5#yTv%kQ`UWf%3u>~6A{O?oV0mh}>v z3|vahS4#yOWf`ZtFQc`_a+dloXJ@S7m=Ga?<<>Q3B`cP!qD}HD&R(s}xGZf-n^x1T za5b}btl{s{HEh3sEnC*CW!2$zbZ=b8Z70_A(?`K|JF|hg|83yViyOJ=*G8VYvWaJ! zZ064En>k5s3#)H!;q6viseW%O&$r#iM8j=t*?v1mJlxI+9e1#w@eaQ4w3DtTJGr9E zE@qqV;{2|=`NV8DGrI2KC$l~L(RDAY&Gu3R*7B6uK6dH4pHEEpvssq|Tx)WG_d4m& z;gJpW{iDmmOGo+a$5GBb ze~d|Aj&a7R<1~JMobg9b2rj`1*6N&Odc{dT+pWjt3O$x?ImIoxr|7@-G{2{w=78mA zI4bT8dn`E1+R(GKoqmpz;J^9*b6zkd&U4r33%vL00-p>NF+tWBxxKqSyBq7%tL-If z+`2@wzn54bIB?BBUuLIcSJ<@X3bS@!<^95|G#zt|+B(4FP)?goRrZ_wu54eE`(Nll%bY|6|Huov#-DhMMLxwCjq|0qX z-U>71>K}$|KjneoWj){qrw1%AdBEL$jF__4h~tcmL>#*j{r?)VQtKhr^d7Q{>q8N< z_>h14Jz~-NM|}P85f8>bVvi=q^wBcrypzTZb1~-lGGpHFW5V1uChTTt!nu(q-2T&q zhbEhH-w{)4+naK1p((#~5%FzH&A9ox89&Nq)c;_{Poo}l%dW@tdh(dxQXX?cOLMNB zY0iVE&8h2Z&YflEoY&ie-Lx&3eOqwlf-N}wvjx4!JfX(!C$xF;gg=s>aFLoNufdWo zCoCD^Xvz2@ONMo^qQhbD>yyVBlFBz%-lGi<6a$@OACUmvu+C}zEIB(C1uJ*iMY|qG!ulQl^ zE4DxViai})v18sVere;txakhOchrGewhqirbKuTqj?A6x$Qk<``N+bNX|ay{^UaZc z#yD~4Rwwp(;KaW{PE2cbqVWJ{&RFHl+^f#q;pxoG5@$~B>>}cmTo`fEg$;HtRLgK- z>t?U{L*q3IcE6^h$!qQkf6Z1OUi0Z7SN79(<^8L!tn_f@1cfX2ws+(08E!Ne%sNwR zH|oc`arHMhb|2}^==JVGce}IktvmOXx-+(;;MUFZ;09d}UbFV#lQ<7P{pvx(VQ+Y7 z%^Oa>_J(!tZ)jBbhW*=k(puA#&G&h7vx#8Xg?KWd-jh|myr^2}#d5*3i?a2iX_6P0 zfA`|Y;ct0s&0Ds(`j#hL-!d-uE!(SkbJiqpZr$e1eRsXN#mAd7O1#-t-G|ZBe0XH9 z5C1&$;br=;w$g`lI{WhG3}1Tdhsz5q* z2;xo6Ag4lVD&~c<^`TG>cqGI(lx+(`S<)noFGqxNhn881-6(({5b2fcAxp*z<6@KMm)duy8J~4Ck*l5qvTsLa-boXml=uHBTcr zAuNJBDk6BXbtJEii{we|NG?Ae$u5?Wj0}wAPGux3n?-TM2*K1_62))2Q5L} zLzDa%&iWa{oPM#~G%HrH24V#dHJ007#`11tENv=;w20%~5pmr9Zyfs`jAPW@IBs-_ zV|IKTXVk^Z)@>8`cyt2WElHs6!36r< zNnpKW0^7zUuxn)kTc{<9INe0L%uVFxT_T?UN+QocPh?eKB4-yQ(%@Sn-FqZ4Vv3M8 zNpw4r#H$aJIKxeF0OFH)x;jb3_$71gkYw7;PG`dVd!5+A3nL<~e6o#dxFtj0s&aG3aKP;7+b5dEfHI+xsrLx>Km5V%5 zX%e5xn2JsjZjJeh<=_?vTzCq3QgVm(D{U(;3+=gRO>VaLTL`j7gDm>wIZA5-?Q1IV-D92%b~H9L%)?djNY5Wpz}F=Zj{3VFLT(- zKZo9lIhQ&Ssj?m^{KgZ zEz4!ymt1yflgA+*7`Q+Ywb~+>0Z|C#$lYHKA7G>moZcWJNu)=)i)aUcW zuY7(~FW`>;1@szUK-J6wc3D}#K|2cAHZYW~%o+6$)Uc{!C zig^BR5py3Gae!Ts7?Tunzg)xv(V~2M5eF6*F|VeG7e5zKtw}M@wku|Ok79NmQp{Q7 zi@8Rtm@DTO^PiQ){IjW;-g}F=>R2(e&lhvvjbd6F6*K2aF@M<=vz=QpoB9>AB(#{$ z@x|PjSY+VTdd$e ztHp1d74+JzVA3J6@1%l37Zfx$P;mJ@1wR-oc*Rn|PqqqbJ1J=HpZIg?9!h@htEACjB|D51 z?8tFS#%UD|-Nv=|I-#R6~Zc_5(cBQa?l^l3L$u)JY-Dmlhm$u_=9ruiv(H9*OpRMH|)lnGLDWr&iuLzQ$4 zQ}Ru?lD2|>c|KA}DN4yQA*Z61Y!tFGMoCK{2|_A_R0&BJVlQNekfuT&h;mJYY!%1Z zigP52b1B6+3&pv^#5Ih>wdMwked5~tL>%)YVwj`MA51nyyM# zihH@_sN^qkZ~N?&^bz;kAnv)nm6F{plx%6HWQlktb`O*yZePjbTS{)cE}ruh!QRnV zQtOmr_~x{@;h_fo+G!2w!orl7Z>f@(JvoOwyXou?H%q^sbz zeF{$7rr?jY3OX)RaQb|O;Cm_9{~ra9j8@QYkb+@76^!j5_O}omp9)W)jcB)v zi#cItF*W`vX8)1J{Lr_U9-WH0wnZ^ZzZY?ns)zw)MQoB=Bv=wcZ-f?cxpxsYor>7@ zX%S-{7V+@)B7Qql#AAnq9@$nT#uPZh+TO8A`i2XYjF~4aMuY4|KyXrz3 zPv)|)L_ei1`YU(QZ+#N|*N{cIoc>QPXAQ{Z=(f51 z`z43Lr8(T6oWrjHIXwAFFqj_YaHxI`w;agf#nm~&e$L_fkvUx7C5L@~3m#K-Huq&@ zvpOi7>zo9~*Cd;D`l6pbkj)X=q8~;!TMx@-Ui)mC{FlWkrCAJ1$fBlC7A>AR!7p8hX`6OAcc6o#su`1yetb*OSw@$vcfbt$s8fQ#Q z1 zRwO0S>P-?Q(k>F~Y61uJ5H{`Cc-rU2b74R{Gc4n|>_WWYk;n75 z6i>}Q@!a|&j)x24xSw%cYAtN(i*d}|9LFnC96R-n6W_XEQ02yQiGM8bSO^x?nOMfG zi)HNOSiTiJs(T+|1dl9+-#vugZWP1rx-q=9G=|Dif>G5fh8ruRc{(zhm+Yc>;%YQk zZI5Q3>CsH<70r`hqxdH?is!tdSokoCW5xL4fEY&@iSdMO^C&(qiR7K&NN%%^WdC!K zOjsK!xZ#nkQjg?@+6a0@NAR0n1jk;9;LwF!8mkc2p9*2&3cao#4uL!T5R*n>gbRTju*fq^tJ3#7VkAWts{6n1o=U^tRm$>bUb za`Ro5c=D$j>02aotB=fghBA-um01Ltnq6dGt`%d~umEN}383;=01Flhc6+}7 znt$@=#so3ewe#nTbN(E?(w{cN{Mq!UAGOo{Xyha~@R$9BuStxPNBc4IuP91*^QS)Ods#gjWK-|$ty8|E3l;g20}*zTVrhZ!tb%!jR(fMamsI3en@fUvlp(^ z)N^IXd{<8C?n> z%)egFynfx8AJ;f@%}{5)_~b-|$SctHu@i^wbK-<4P8^};#12`Gtgv^a%PB{0pYO;f zT^(s!=D@CR9RxGof#uo`)EMNzWA9!GzsW258NFiowpR=s`--oA*z;1nJ?C56^Tz>u zzL+XlTx#}Y#!F7Hdr8ydFIh43B}b~irV^jMqBWKu?7FxYQebS7F_k-oUt_Lq+8~^zsj6hz0KLN;xVUtJm#kJ zk9lC8$cLf+nCo-QsQJQ-tq+?qak3e&{x;>XSW^ZXn{wV3u^cM48%=oC&xA==P1t6M z3AMVIa8sc%54|#`?ongz(lq9xzmM2IPB6WUAJKO6BQ6{ANN`L=9uMz_{Hp(u2NyhK zqWVJ)$~L0TbHVl6Z^ZcVMy&YqfFFY&@WZVKEL-t_(cK@=y4aAr91Pj}s39Y#i1lCh z#rJ=o#|`hZbj^J(>T{pZO797K_8teFxX0zw?os#8U0#m9%WDtr^6c8X+|lPQrP4cW z;e1DMUGMPB)I03`>o(s++@{vO+w@*_n}d7Yra_U&ck=QUdmp+*?TNRj|K%nv18>sF z;3i-Hdy}^9Z}Lv&4eqwO!HGL>@ZGQ*f_ZqIi#@Ni^vreYPQT9jCfB(=#(?352JF4s zfO~rw(5~cKy%tzgK6N zIPMJZ_?+gL8K>zRd5R;Ko#OQjJw|QTqpIX2|BAVY@2V3lJad8$zm9X`jpO{#<~UCo zAETnjF={+NO5LGHY3!oQXA^Y=1L_EmO+UgZ;fGni=rAuP9pcZ`hqy2IApN!-7EBNWxa-O@qoHf6f zalw^kH2SlY5m%P7?9URuzp{k2e-<q$t?EyhgKT@aDj&gi^pj2fYT%v51qsXFDBBu-$W`b zC$MYx3Dh(h&n4~0i*esL&S)`?{SC%a^=k}0&X3`a&!hS0_-Go{kD|KHDC(DqxzX(- zIVOJu53L(P%hciYUpkzz(Zd)!XBhnhhtg7WC=YoJ;n;CQSnN2M*9H$}*Jp!h*<%pf zn+)VBF*h53YXCbp8Nj6%`}6eYetdMSAD`CrrRAQ!yi?SNIve^>O6$#EOM25YvKKeZ z>_wGdPoA69lOJ7rh@44181k&Un1krfHIKUScI$3*H|WZkA6=L(=9N<$Ix}>CXOU;7 z6VGn!#F=Rw`E_we+J|@GT!=a8x9z!cYn|9Cg1@jyu;N`|qoljaS#n>u1%pIMxp$2RDnFLTfQ9d zH&-4}pCcROWXtj4S@K`EOnIP42TfRsJ|XMV2Qd%g1^r$(_^^Wjj^8 zJSaa-ei#`m*SW{YQ!S(A@?r-u!UVFh-*57R- zKUwlzcGP$#JN14lKW}O+->S8g_oP3OHDn9<%L{Ya{qAFV^9eKg+eTB_Xts&meWbB$ z+ToF`_SHx}T>L{a0m&$(LpAruuSq%6VD$*;!d}=(Id*nx1T^c0!I#KPrE;IU={yJtTLPbmX=z z_sj1y_Q)}|yW|JDJLGxNHo2z77Wrz%M!BW!dim;+wQ}vW)$#(hRkBIiayjkUQn~4& z#qzMJi{$A|7sv~e=gM=eX3G=z&y>4pOqXkaY018En)2z#Q{+**{*lwhPLhxPH(qWU zIaa>+aJ1Zd%Sids@ZoaR`yukbL4#zQI|Jl~HT`6b0e$3SwLRsRKHcTit6l%+=q$jZ zdcHnxqS#o7g`Hrc?0oG)QLs=^QL(`m1;wVjySux0?*SHem+rN&<7YQ2cD?g|AD;8v z;NH1&=bo84Gdt&VgwLzhgua9O3gaI45@u!e5ZKx70$Zvg%Bzt6(|Qt!K15>%oqIrd_jWPSe$k|hg9 zNEVw9l&tmdDLE$XBw^P+i%Tc}CpNQb5wljQSZ7+Mc!y)SIQO2b_^A0w@hx>jaeDP+ z@vE~c;z=8-iYgCYDbn2jw6MdLTRP#3C(Q-_rEa*<ei-+{)M8cCk|TrDm({Sj9`-ZU=wr>UU8Q?YYrMv?fVi)b;ErkqF3s( zL~1V~>MB_#s&Y0EZ7|*}N}jMwRQ=_kD68UxXqUgW=yi^bsM`=nQMW6uqF2v6MHvQu zqV@Sfq8l3FB4!gUy7W9=6l0Jgip$Fo*$v4RExKGNy2Gpa27Re0F-tDGKA>9k(7Ik! zalcvQu=KiUWb!SMZ_oRp2PYnjI$eJz`ltI^bUpmN=*quOqE7q1iMCh$5>*WB!1VMw zvAnZgSoc&Frhlh9JJqu%bDH0q*&pl6%%jwpZu0>4{@)by$z)xoqlR5u2_(k7?{! zz@ED;V!^@^ruA|eOBk%jI;>d57M)(rcE=j9{mpCH>ObpQ|EWf-Wb0B^LDe@=6hM^!2PU1c91Q9Z_Wya9$}qV9%HjkpJ0okE!dR$)2#ig6^k5W z&Bm@h&z#R)WHkww*=I8wW^u`u-S@L&q7-{(Tk62XR~^~C7f$T`Z)f&F&6VAo;Kn5L z+?maK4>tFJC%b*liyiXvX3yh%*m|)qORD!{uO9j{jrIUGr+W}vFg%#eoDss*mWQ(Y z#$hb*NH`N+iD1=!k!%T%*PARvv+oTtOy^N7Gx;3Hj;SQDLmG)}gH{q7vnZK8+>pW? z_ouSKXVaLkYdZT9p23!9WwMK$trm4Po25R@VNqXm*~RYpY}wEP);_h6c`hhoebsc*jEv;qj;>&WT_Cv-zR28gEqk>^dB|C~L=D50= zIc~3EM-SIBoUdaaTwF7Q@ zb->L59U%|ti0BcWa5SzHrtmf0x6(VqYDO1yF6;t3))j4~U9onl3c{;YaC>z(bZhR0 zaYlTNcx!iPo2WwLp(?)Y?Sb;=J#hYTPmFut6Qvftu;NQElvwx1*x$WjeWeddJN3m! z$G#Y#+7IJBxb#)SKtDBn9M~UH&Sg6{bO6Rg4ghHm#NxPtC>%EkLy`yK(B#2LO&^S# z+Uod}t&ZP(Eqr_a5Zsxgfh@5GPOzaESv(Xa^M^rCIt*othGV>JIINeBfS?$Gm&-?@ zOVvp9Ua5)BHJW&_Y81q^qhPgqH0L3VhGfkcENB>mY=g1r-8dH849CH@aU6;a$D_J& zJSq(*AcwE>cQ%}eHH{PT(_j*U8zw>1U@`*gC*#ZNDOg%J1sC+EBBo|4a#w00t4a$& zE3|Q>LK{<;O+%|}8cr;pj!)9*+#hNNii>BUBW7ZjWG2?lodx59Sy(-5HYVlF#z$=( zB&F+M#pF3?Nt%NdO;STV*IkR}Icw20c^#tT)?w?g_4whx z9(KJp;IqR982;G+FRP6ZzuSnK14fYDH$vRzO*q`R3By)wMqbHg%+lF{(DW^MF~%4p z!i+IbZ7UYJY{k@nTk+3o8-%ypV6tyJp4{FJqxB|8t1`jM`8&`%e+Pz4-ie;kJMnbj zE+n|^!s-sDxMgLEHE&Fjw0k#R+}MpiYxZDx`5yF}vlp*Z_i|s>ec0%~4-dQT$Ht5M zk>0i+ulFB7zuN~e%I0IqJO4A?kbx?q?36;?*Jix8pFLHy=jx z(j$l}Jc5mrj^a(&Q5^1l42@TgVeqG8Sib)_jBg&tx>YBjMJMon>PZAdp2VoW7VxpL zz_X7Q(A;+l3$CBS;uWVcvFJ2DPq0Knuq9Y`E96;Qq3UNKu7KWU4nNwzS!Z;PY>cKFD7 zaoRR^*j{9Zb8qe7I>sLETkUb#%N~0x?4kS99)G4gpzweLc7;3Ody50?RUGkeo+FN0 zIHEqu5kv1eV!N6XJoKE9b-@X;94Ayh;|#f>&WK&-jI$2TSR^>(`#XL-#s%|?T~Ouj zf~Do0C)e(Ro|9d%ZKo@OeO*yi>5At+T=7-g4PW=T;bov3>T2B(@y89OGu_eufIEsp z+_AdB9nJqZTW+=oQV)9IU#JIGGVw#wJ`lWpAd~U!XMQ~17w3$9vBcFE z-^mv-Z+)RV(ht&ge$cV?Ls*_4+Mf7f?jV00(esDTS$`y^_#^eUKO%bsz-C?mjE)9i zaAW{#8Ut|XZvcKy3&eTTK)m)2gnoG-LfQgxb5syIZwSID+aPG=24UjkAgHMY&xhh~N+{m6hN4C# z4E}S%V7NaFU;V=1B@4r#wlKJl3`d(mIF?-qhf``e#I51D*);;sW=G(^JrQW~jzDT@ z1Wv!R(=;T-4G1>{B{>OmCue~!i_Q8YFl zh{j;QXjDt1Vg4o>U)5u9dU*^Uo{WJgG6puaF(~>HgS*_X^qpZW-k*!b{lr+1l5^|+ z#B$bV9A0dS!zG(Ibj*n3bs-MdI>lr3w0P{?77u5KctmG&ztubO2PLjk9LbFm_uSM7C+X!B4{!Wg1j|q(M0<9WJZVxer!4??=-) zGcp~i&(qPlPX_eoWZ=?{3`E*zAU!PuNy-d(eb2x?%}k8f%f$7gnK;RPj(-T5IPoYG zS5>kwMmr0pMpYcOvN1j-8*z=<==C`p`-bEo zc|i_Z_vWD8IR}3;_*Th}zw-0LaZlo=^ziRfXtug!_DZ79usf5D%1v=+It>K7)(Uo%@8p-&Tb3 z3q`mRS%k@DeE(4qmUa>&cdQt_R*13jpcszMVkD%9kyR^3;%hNndP=ZGO9C}R3B<=F zSnVZ2O_l_+nk8`gAVFPU0pF(!=)Yco`bhz*J_4R+bM9WVfPEhXbm>d*nMUZomT=@4 zq1c1)HJvcLo-qA2L0h#L>XVA`R<9VD2a2)Xp%|ayig89(jOP!FvE*+toQIcyP=eO2 zC3t+M1UCapP?T2!yOt8L_a(U3vlNFXm*S~jDfIW3BGk4NH=;`Mr?`~&TczmpwG`j_ zOVKc03J(J*M2Dnkc9dd6oD^kJDTdsYV#hZr+y|5)X?htl)|4UAtPJPv%dj-M4DD0~ z|C?nP{;3Q;z01)ysT}i`mvi=DIsDF-BPy^QK{@5Ht}ln)^K$&{AVb_R8D`FvA$`3J z{f@}6+fjz_Xc=UJ3|Fto(DY7*!ftZ7jFw}?JURDwm&4|`9DkkVI2bDjksLp+$uahw z9J(qB=xQo3TBN|&^$HXnQecmr0^hgp(9p3GeKaaDZ$>3HuB^nSU6oj3RS69b&SHqG1fS7> zCg%pmKIhl{slqd@OpC<-X5vKE!!$&2Up=_W)+4js*rc93bWr=A(}G< zzYM9y9L^Qoy{sBmTe%$L`*!?Xa5dV~s}WURjafIUk^8C|L;qIec>fw?OsK(i)ZoS1 z8a&-w!`X~Ah;pmJ_NW?k%&UQ4Wew-y)!_8o8YuqN;BWt0jGa)6S*#XQ4QkQXv=;X* zY7yvA3sG<_DpPAQzoZsXO|^LSs1}-^Yq6*+XB4W}@%FI}Bj?rOg+U#{c5z1G$vTwT z)?uc99lR3iaJ{gOGlc7)d8-cNUe#g1&pN#AQIDKq_1LLZk1zAM6XzN>;iP^OXV^61+)I0A&-Dcbhn;tqH0ho8a)P>Hqm99Mlerq0R6g*No_C%?K1V!)hsKGa5AG z)8=M)n>J(cp=LOrYR2OW%^2_43?r{*90_j5v6yCTO>KsDUNhbjzgN+WNe#_NxZaE& z_nWcp8Bh0JGw%bNq4?7b>e_;^-YqyVs0A7$T2M5u1q-!WIA5m)J?6FW@mvco>9-(o zeG7t(TVTf-EXD^~F!*Q-%1&_}%efXbU1{M=%NE#sw4lVV1rI}7@HUF`A`@C5Piuik zP74+nwcvhn3--%eaJ{Mp(;8ZEO4)*#n=O#sZGrHp1@X^XVEwuUb3e4;!RHp7_}+py zzd7%vqY_bFmAI*@#P{Axbm_0ek3mY@(oiCHgc6%ZE73Mi39Cs;Je#V-!s$xb&Qc{8-|sS-!_C^&eA{r*np<=f=}@;pv~`&sp+6CeA+o zuKfAac|KBjetPhHZRYuN=lM+I`OV*=L?X|>9esw&NzxUJf z7VP5RUtZXPeq0|`alJUq_2UfJlOtST)^NQU$n~e%k?RQ8r#IFu*unKne53`x_P1aP z*Sn=$|5k84oXPdE8`sMka2?`$s-o2b2d=kohjT^{*W+_spQF2S9p?I-!u8yP>-%=D z_i9}K^Lag3#Op%=uNMQ0o3WGE6JK6mvU$BJ;`Jwm*CPjBpY$&_;|H%_{=A;4?{0?U zmS)`N^-ptIGuE(X?3vDGd@~G&HDi=oGajn&`uMvELq9bk_(c=`-fP0Tt4(mL<_w~e zCY0qiK}c#sWOx&f_%vaxV-qURHDTlNCe-Y0!erwnSgvV8>Y^sj_HDwoiJa9stO<#I zn{cdi6EwdyqU3cWmOW@hp|TPEDjTsy(g>&YM#M%nBGI=I0S=8gezp-a4|4|W4&IKf zYsAkbjWE+`gmgk9I%qUPt7jvY{%OFn4-J_1xB;E7H9%3(fMZ1s=#hg5by)Sd4qIF5U{uEYlB_zY zM%F>$UWY^H>+r+84wlAsxU-@TQ*`QZU`!p{`_&=hZ!Ln~*5cBgTCA<9g=$ePa^h>T z#J3iumwDfIv=&y|YLTl~i(9j6@p@D(UU2?W^UoT@y{Lid^%``S)gU~x1{z^Cuyd-x z%~LfPWLkqoYih7bm&@21EbLo@fxoJ8<9Rh~uU11{T8+@uYN!NOW0y@eVvkg#c}q23 zF5w(tt!ms=uSQ{~YMg&pg{izxua;NAkoWOryssZ_SB3pYs}QoKikD>-%BNJJa9|Yz z|5jqp%SxzUt%OiqiIs_!DD$esSnEoh+Ea;))s?t9yAn@^SK?vUN>snEKv-)9ww70* zQ)&etyH-H`d%jDUj!;!1_}P+}Xyr zOBBeR#LxFtVD2|Lwm*>LaHSjvGUPDumt*94IqvP2!)c`)!=}j*IZzJOUoz}{EJISY z3^y}n_~*bFlw*)_Ii}7p zhZg5LYp9gt)9W&bo6BHcP=>CdW$?OGhR%D-uwSnXxl_vUx=$JUewJcXs}v)OrBI2M z;+~xpkq4z%vs#L0+EN@=9J$?E!tK`w+>U+6?b%l=OVKi=6bZdcvA?YZ z{jQZDwXg)!LP`*Qz65`Elwjqe5?mTxf|$-F$bMFg^lHwvPA!I+dod;*E5?nr#W*pe z7+=+jVg8votBf$Ph`__S!NQuesJ0Poxs`on7-89O0p0Ek5SI$r93|l4Wxh2PAS~kc z{U`x?9RxmhlEA540@oM`XBSGadA9_bizT?BDS`DrF}gqGV+pAkA0oxjyCjC|4l!t+ z7_CFa`0qy%Zr>_`R9pn_pdzfbD#8z=BF?8Tg1TA}+&&cIHD`hAW)#B0tq>vRoL!|? zh^%pii0D)ZYd+>#!pA<}`4}ktTmiI<3y`K$fWiF>aN8Re~cSXq#VXFhqbIF`p5HF?-LArHx&IJ^8oE;NdBF*i6DOHStk>vAz_ zYA)JUa#8qS4)#lP&@n6r9#%Q%vLOeDwQ?ZsmVx@J0%-E zyJn;DVHPe?7KR08A^AiWMz79->$ogD{F{lfw==OhKNDv>GvQ#C$@}$893Ga5rC&0j z+MI#Xlnib&XW*kr22S#E?R`GJWiQiVFH1*pSUMh`PRAF6bbKG5j#q!vP}`b@;G8rV zxu)Uo9=?w>j2w`LfH$f5u1Lk2h*Wr3rlQ0k6?ey_;^prYJh{%fSQ#lua^U0g9Vr;A zlY;7=DKL4GjC+&}L%(EX97@Jd&dbsrlFY|+Nw`#%1n0;kT(L~Tfi+2(Hzo-kek3Bl zIT2fu67k|ZJe=aO zWJf%n&y2^pZt?hiFAm4^;?Uw8hfzD@uzOYs~BMa`_yGQ!J8AVqrfc7VEmk zqQ{*W6lBFXlzf7hTo-V2pgi&GCmqNe?+07F$#IHQE;}3 zf}wsCI*o`za$6+kRYamZI1)NXA`!AM5^vQaG2>YT_Ddq*;vRwUT@i?$83F$;5jex= zdse4~qtB&q$k&DA;FxgyY!Acb>M(o?4TJH~Fk~zY!^eJMnD8VNYYIcL$2k;c+d{E( zYABZf3Bj=D5d0Stg0NE|Sh_rf&xM3w{|nCDk_2-GS}@``hwGhIFed*E!sg~6oQes; z6^kHTS{j6-1A?&TX&{Cb2I8J$AUwAOV#dTkD82@Qu%< zjY{(e&iiAW^u!{m_g2aM#rj;oJORFxe09zx%?j#uq9fzPM=Sizjn^F;B%8 zjyHTzmf(Xor+v_UnGe+ab9wBI?m6CgbJ-hZhTd=(?u~hGyzo@;!etjPs2Y30X}lNO zKYL=6+!IMYo_Mv(6C<@fvEr8pcGh~pEZ7744tQWapNE{@(E}Zt-JytZhxK81jO6hz z#9iI7usP|9um!G2>fwsSRu=>%xNyd+3k(;! zU|>%dG_~^h8wt)(w{S+v0%uI=;mqS5I6)=e3A;}?A!D8sUUzfCuu|-c8Tc{h^V(>^?sJ^nn`+OTzU$%jtz6~}Ev_V(t6|6P7g3B*2Bk%mD4CtJB>aGr?6q} zDO{+rfai7#IK4dy^UEhOv)@TPi9Lafvrph}#c`N#IS%2)F?_b>bN4-tVN^Je>7sQM zA4-lO&+rIL9~?&ean1qzcL=TChcIE(A?(aC$EC&QaBeY!^=>m5wH<`I%|TT3J&5hm z2XK2DXM#!h!{2Z}8t?7H$0Pgj@8@28aox+=`g;+byaz^e_i#4oZk#dNjpvU|vG}AZ z9RBV?uE#Fa4&8;il$|J?yA$peJFt4=4zxcsfy*%ysQlWF<1X7#K4?4s#BIa)8QY*+ zx)rlmZ^h77W4zsGjFh%5Sa)d)9;hCHiD0l5xgF5g!Pe) zF#NUwz3n$Z(q{wKg{_Bj{CX_PU5AkQ>u|q%EqWWR#pDNun0d&M$HFi`mn#NnRyBZA z0B442u7MFqMwnC|?^fwU``RjO-MI=UU#x_c#Y!CfrH5sXdYr?k2SvyV-j1xm zm-OX0#ea{wD_w?}tCr!kaw+1sFGcy2C8#~R1m#~ABjNI5San;B**=T#V8|kzja`U8 zlNaJ--U9H^Ax0_YW5=5LaJ)7TktXvH_XG$$0$6=!Sbl+_LuZC`HxZWg7oj#(7Yj%0 zA~t0%K24v?V|~nl>B2dW5;F%2D3w4pjp8=VTY`0plKC@-4|=M_`2pneMeTR#P7Z%)Q< zlgT*wcoME3oPQ}%=5r!p7`u7i-$YY?Km z2g0%cK$r#&z?2~a@G`7Ff=BcRi%~=47&UB4?1#pQ{UA!~i$JZuc%IbGF!y#xXm9Tbjk_K2!=wYkgnw*G@n05S z@`rVi{$^{-eleT!pDbMVgT=_dGf%}gw!h*l8(aB>HCDDW)2h$xUezbIwE83St!`uW z)gRc0>i6tV^*i>Z`Ymg%e!~)~U$Y(6uh`$Jm(0D2bIGcnvjdgSSboJ*_EzzPsVV+r zqvem;aM>f)x%?r!DSf~KOYgHqCHL4(y34i+cUX=1HXB!TiybX!WwCiTnLOtPYstFK z8Zxf2g0!p5HATq`l3LjB_+}Os+r-94H?pXR2G%94o^1=RV-W$htiiX2z45AMKisQW zyGtc|=vcudb_!;5Mb744l(Bo(<;=pWjD4|?GV|l5tp0Eb8);U|cJJeEA*KS$H<7SP zV==2XDq_OALKeQJfE{0%&t@*mW6u`mGFRj<&AHhuab^}9p`FPbCuOjQW7FAG%`|2{ zG?fJnN@3!D$*i_#5^GdRWQvXnEd6&JbNUv`j6TJ%{_mn$#fvC*=)XwT;eG^jZw+Uv zSHsx32EP8IDum6E1+y!~K}=d0$l9_4*x)pOHY350EsXMIi$i?aTt9C%%EOCwaPnl= zu6VGBbM9>0X*bsMm@CUW=)%_Sc4iN^IkAIAj_f}J2ewJio|P=JV;ans9i3&v4jW%) zuk}Q{K?883;cB5@I%Xqwsow=&V zW-6AmNBK*cO~PU}FmNFYbDYlxo&mExC}RI@nagxn>M$GKSxh={25VEF#?-rOvDx1z zv*j-*vemc7vz0Yt8Iz1=qf<0lhmaBMhVw8Mdsc((H&bULjR&z7y#egpTs1ayLSL3Y zs5e{DwI^$C@6I+pRbfrny0B#mzBVbZ1JhalNA!Kn4^eK%FQQ$K+C&}7-im@FUy8I-4g|>-xB@%a!s`7db6lFuU^#0w_0R!LLrJXEE7GMS}fA+Ar@_UnJ03s z$`Xka(nL?}l0-fC#EE7uiV|%e5hgnOD^L`C+gBtOdx}~ET}59{JBkKxv=yD$eO{D5 z{FLbTtwSRHz&)by4ckQRy*G$9)vXehI4u@wEfa~7|4kQZl}r?sT5F27&*AI7KJ^hv zvs6UAT7T;nuYarSS$9|0c6q&SxRiA7iPCiS@ zeX{w^T>0{lx!=vT=9WzwJ;x(aTzK!DX^~y$ydw3!?M2sn4HE~c%@;Qh+9^J-aap{^ z%UkT#H%9E_lOvv?CKJ2)D#Zb6|B2W5ei9qIbd=n$R+Y@{)?czuZ>VIS;~2^8iYb!o zon}i`ESV>9xUx**Te?Pa^p}yOKieU(KeJy_mVZ=I(Pk;})4n7bSZF6%dd*2<^wCYS zvah#fgtour`s!fGG4pWAbH`}O;`n&U`SN6m|NV4{$4?%|RJ}klL`Nb?Utb~_cC4JQ z>#LCXCDurSWepPR`z;ckAJ--I18++f%(yRcS@T$uaqyWW)%KO-O2j*fw)mqYU-?DS z@9huCGL^rQiTyeXgGY20K2Gi`6wU1>99*U<{9D&ku;0;JXfy9Cth7=SoNNaO*`9+0 zS*W^DoTwp0<_;6gOGgMpYc++!>!XFakH!koZ^jEBzD^V-bebY8@2w@Q8Zu3oHFk#3 zY1%A7BGM6zmdzEe8;S&Mh2XGvzEE&Qx(ZKjxe2;=-Gy^}t!m0cPoeU$ zm(cXYTc~{IBc#6Y70$i#6LjDB3y9;!jdmx!k(|; z!m)1=!v61(!pa{}!l0kgLi5iU!SYwE(B*fWVDmd(c>X&<(EXDroc@y}g#Aet(*L9g zNqN{mK@`{>l-K|I8KQf8+`B@A*RQw*rB_7777h zii9ogVxiM#i4gQr5C*o9aPEDvQ2n+<`1`t482(BsjD1li^nX?^y!uZjBtMc1Yab|t zdv_~@4YwjsHqo}6%E1_S)(vO+9Y^Uv+$v)MbOPx z3j4FK3fAe@gj31ag$?mH1oh~ff;_BM*cilPGyC2a#(Lfn_Pg8_TS zTP+_7Y9}5E*@qqrGxz@|gzS1EJlXnG=x_8)7;pGo7{2m_@O|-1L5x?zHl5ePL+v+$ z{=~OJ(5QDpwZ?nlPX7;rvS*u+-sPiU_UEIZ^7WJ8^8T~%?s>bQ^YDwXv-PWRsQH^< zT>V{`SoTA>UG!5pn)OTgFY&j)_?mEwfWLx=`#)j%k`9zt(t*@O9cg!dM~a!&iIl0G z=;OG~)G4Mjbs5%$GeEjfYrn3P>fV)(sHpID`YKfRONBO^=|)%Ey3z6@-6`=|clv6o zO1gJc$!t>(a&GED!K->wpu8vdXYECMih9ws8NKOEYHtb}+lTvq^r7OxeM!fsFGZ;K zqfd7INc6iO9kWs+pZ97MZ`Pj@9`z^xZ3F1k)d93<%|QC87)S~82hse(L8QIEiM~OrqiilWA7|WD1-# zg`P%Ep-}^-(khp!Wb%j0DJ@$0LW?waXw#DxZSq?&jsEvnIBhyjil0u->N7~mW3zYb zFq0-(&ZIdnXOi}gS)|r7iykeTO=05Mw0NoxDWh~agKQ2JIL;xJA9HBg(YbWw;as}1 zQJ45~VLBiZ5la`*w-JnDd>H9;2IX0ShP?zG-#(8r8h9-Eh4bk}4)*~Wvw-RY7EpxB zLhi4%kp8|}NM0t3s9WPAIZyToc^eeKV*`m}7z zYI3byO%k0o)Dpjjl>H5eYz@ex&45;#8q(`VLpn2mExk@#ODi?jk%#j-627dX=6&m_ zQMsN97HuHA%nihbZKPW+8_D$RMrzt;MB|l4w143ya!cPtp+h#4x8r6y_GvTCHr>K~ z)wht9$e1&#jA@J7R*Ji{m2SM+N*}nt&qvudx}&|F(nGh?zOE+J(ZYoLhL}+M${nPi zzk?h`?xZBwos`|alcG&`kyYI;nmxyqTBA*AZ;#z{-Euc+J={%4^!JcY{vL`Lv6sA@ z_mbJiy)?mOA2n3$BjaiNsWx~&jqZ4Wb{{@K4%ZHl_xyu&CGj9_>0?Iy&ze!eLo=Gc z%AC@2%<1otLnN|2M8>ZUk;#U`q$eDv!K05*y~`0g*mi_o7#}6WvZE9-;TY9;9-{~C z$LO}naT4Um>GI?goB?!#BwtUE_Rf>!q&P{HlP&0_w*|F*v7q}Vr#Ls_6djy+nmT%( zCfiS^>6x)5O)Ise9b>HMxU&`Qe{01#duQlh;Teh>dX}bKIZMG$&eDsO)-)``nsoY| zqnVcHsQ;~V)H?4x*+ieGUY##+?%xGc)?T0<+81ep50}puNp;I5YLQ%`3&Spx>gCIH z;n8JkS$c(36R(heXB+a@u^|WU!)6v_L-VU`sMB{FqDi*2pY!DYx!RID*^=rTTRJz) zj_z=#oc2XKvdFNbqz!%z z6=%Ah=}gx5oT*Pw7Ybl5)YIIBP6xSAeT54R`s_mMM!VAab*>b2$(7>LT`BsuD|vQv zqa$q({iJ;}<~lSW8AsqnQYEl~HOqGevBdD4rlBfLmn<3+#Py=eSs zZ(3yNP5S4&X<4E-O;dVP_dnirb&?NxZt@{r8y~uw?n66TeWbt(QU&W7(&GaL)9h^_+>_=1b{OI#NKT7ZBPn%}>)7u^XWa-Sex&CBy&!5s% z0_fw60GenLK!%P1v@bh=%x?$K&d!0fL_3fM83)oWn?Q0;3ncC9fmHSYs!Q}8Jm=+8Sq382M=<gp9j z7m7kS=Ou*ZbmI)W>7kTv97>H>Lg_(rC_QWrrKWG8l%W|$=T?T%+!JB+I4F!RNW-Yh z^Dw&9JDi^CgcEjz(-r%0%1;ZYo62x{@jaYgYI1*Cy$C8i7D09a5wx&4f?hu6``sg{ z$Mi_D*&IpFFGLdJBI#01BxSviq~?L#R~J!qcXt$3J4I1kMid>n8bxEjM^WvFXxgyCJr`yrA_-`~F85={6oPFnYjBov7=&(437T$}Y4jp4DcYG|ZUmZ*L zkH^wh|5%cXV`=EUSlZnojsnNUk%Y7GYLCWIjZYjE7Q~V7tvK5LJC6E~iYLjkcrq}H zr)IZ!&Mu9oNM$^|ZjYyNLlVevUIOjgl|bgU3A8;Sf#y{wP>Ks?li_B~7Ez57Nl* zPa3riPp5hF)9JJc_Z>f-< z)Kfd3e(2@X_1*ataXz2c2jo**W$me~KIIH3pbuIFG)%96_mu^tYh6H- zd<&>+S^+i73&`;dUq}xKCuJ{ZRkjyXjY z4Jjd?DJ8UdehGD3TS5t@C8T9hLa}xw)G>gw3KKcAu&9KRtNFFJN+{=52?hNu;XI5| z8b7?0nzTx3--1$lVpvM+c9l}{@ltwyxs--@m(r~0QW9mC(v-4N>ekFz7!OLx{(UKp z{aZ>|y`?mMgp^#gq;zARl=`lblFoK1Ek7is#nw`q0yDKs*B|mCYRIJS~+!WkyGGJISslmrz=n7+=i9Y;5Ioe{VJzzzvZ-} zlY;a)D{@R9&S)8+pg;`;P1jUV!8iqtpTZfE(-l;$qo5y5L4y}5XykGQsp%`I%}~LC zCki@lte`$S6coB!L46N!-sB+#l^#>j7YhZcpW$ho=l5JzP$xSDDIFE$;i{mSo(hut zC}?4Tf)aui^p&$>bfP#jCRRZw5_p=)3NlVpkXELG-exN(I8Q;^g$l|RD`*%g=yZvK z3Z)8qQm&xias}s+Ddx9paw46?kcE-%j|m!&S2p0$K?T+_gr3bY2p&i#e_>IE&=>n zH7@7*y-hrw-duEfng%>=1O5yVe^wv<%ohIqOG*U|;&};eQt(x& zk>~%rLP4)&3aTnokQe9YEG<^hBZ-0z7x6sg^RmiSkXx35%F`9}UkcAtBL7}-{5_%- z6cVAJjiCzq7RcEf`)1;R+g} zuAqHt3JU9~ppvdUFaPAE_#vm{&vH8ZPEIpl$m!N2IUTwqr{~w?w6;-BaaD49TqdWU z0@vR>IgLq|Q=bI>{|Gsy26CPClG7(Ae*YEDGd(M(8mD7v$a=N!l zP9=-wA`Oqb#0f?kT<*@|0ko4w`J7YEaQAT z8LcRl(fxcG?M{EbMC6mZME z+G$fxzLw>bV_r@rJ2=Z|eK`d#FQ#(%BcBK8U4Ce zMgw>oIGDGEU3r`MIJ%6I{mN)NZ!3SCEhBs0cK+B=#@S_MoPAnG|M9l9`-C#m7{c%A zQAYoG+k2h2!2u7Yv_vVT+j1%GDv(lBqLjb8luo%wDe0V)st$8zt%;QC45XB`KuVXU zNr`Dn>2Y5vS$2?8ds``)J}xD(vXp+wct4R>N_ugnwAQbbme`fj=u@TiZciyCZYU-F zC8czGMk#F`RZ69OOR4|A659B_gs$8#p%BhjiYP82&$JRc5?Vq!E+zEpObNLkC?Sna zCFH-fgnn@5l7VIkx%Dog!e7PI@T!aOFq4R&230!9t{$6epF;0eX+}l|}P zaVUqzugxK=Sviz9IEU{4fWYdH{Srqmt zi+(GzINK_VT(~Ws&u#JsZku15okcZ+vncHcx8Lt&5-ZE3=dqb&?AZbAc)dXcwxpf95ZRafR`5CleWCp$amrfp!(`kqzo%|Eh>9=D# z8JY1h#;SB`n4C`Ud!*CfH)-^{A&p*Urjf!cjXX}I(X#bv^lAp@R;i`YzmKVO;%X{2 z<)zYa|5P$Qol15_sT4Llm0|~^QqboVI)5#N4D(Z{w|@$io=PE;jVbhEW(w_9OQHHU z&ai4pro-8MOy!kKiet%i(;%5zrzTT%k7P=Gl|-j&l4yEz65V#>`+R)%i;vSzjplsw ze~F~^Adya#BvNcxBFU{2>FSn5QtBj3AEQNfnG09pxt8< zsPbPtY21&eofOY`VDXe|8BekeT&BfScF%b7e96a~m2spV7st6ZakSGUj-Knrk?BA_ zCT)u)&BjNqFjE{@@LYz!rS zi>3kBqUlstG?lqV)1Up(G-Yu#=?#mfjbEcUyEcj#A6pM}j-m&9q9|m36fIScqI(}B z`B*NJ9wbH5O4~?^Hi@Jcb0SHzA3uH_L8cWEbTBG{c3DTzij5I8Tq}Z}bd8{}hvBqD z2&Y?q;beN0&jG9mr}>)U?7e>Z&!)R?^K9}$^lzPiT=|*TM zd7cWTxoh}b!`M(V{vARs*F%V9hLFEw2;JWqLh5rvXlb7i+W9<~%%#D!KPZ^i9}gyN zykj4CXZ~&RS^QY$uf7%=7PfaKNNo%D)ogd*(!e>7|PWPi8 zF@7}Sj313M@S}la{OHFwU(QbSrJ#6UT6fNuzOVHq|8c&g`O}BOn|-K9BIjGCPVl)Uv$fu|eylf5{q9BI8@#A6){FL^@uIG4ym%}LFB;nJ zN!~Sl?kd8Q)>?Q{@Cr}5rr}Bd-g(eSxd)FC;X%_6d(ha09@M?R2R(S^PRW8h?eXMs z81}eRnvOen`f{h@yKXcs+l>P3-01aYH<~@!jgJ53aUGgnNr-c$IxAOdSmjExVXl<& zo^!cmF0>}Vh1Yc#67zYwt-W06%>!q$$aSVy_Rh3%i!=QnNoN@r)fcUC5yfs)Y(-HK zK>>x?uLY=Jpr}}&Sb&rwf`}+0-QC?ebj&b&*@4}P9oVhdfBWux?}zmab2w+mI_K=1 z_qVFYhti*)AvEJc2)X5kQ1bQ=s+t`_P5lM0>qRgX@L&pz45pPf!GbXzOfBt#Y2Vc# z8delURh~gKN$|Rg)Pkt{>p2LNDJBthS!wD{fp^kCOslBw+_4}}j6TEu!qW8cGHC&yXjWH-E_9z zn+lhDlWp5B>KeO?Qnhzc_w!!l=Nw}9S&sM%YhooH`CkMo2lmmdm6OMo_h4Pr`HvBR6EyB@a}Et`z~9- z)w89i6`M#hcN6V=AlBTyHd0mZjZ|7L*k2|aXw}{I)N{vrs_wp?B*p8fV#Ye^a>GWv zgEr)^VnbOuYboDgEyZ74L(ZGmkoI3|x|3{8?qVO{%Lyymu-1y?pI6iOh}ER7zM3R_ z6-kz?qR}r_(tmqbl0tPQ*;cHe|BP3V_pRmh)O9(rj>~CxrX`i=TGGK&%jl5JGOGBz zlmf$-lIe)0^tEvb#VlAt{aP(3$kT#ayIRn=yv1ZabusNayNCkB-iOy0b6Op4P8!3_ z=|TNM3NTwp{q8NGShofAy~6@BPoGaw+Ve?qbRJz^ohjC}XHrPR462wrgAUxBP6wQ(Q`xU+6c9a)7L1ri?dm{YnIP-yI@mQ3pNBPtv7}V|3|t<7E0WXEMFJK8bGFO`@tVI^+?gL*rF-=zO6z zt=HG4$Hyj;<+6#?_(+R7Y}caM?X<`}c7ll6F@bWbG%0hsCWW0FPj=ShY4WRa^ww(} zrKyY~{p7K9X!KZO^%_)Uq(T2Kj-drMV<`B|XsYubP3Jp}rd!GCbbYis9jzNh*|SEG z%Y~6Ne$7a_@p1%t?i?Xv6O5qX_~G>l41HS&|eg5&q zJ-+R~yZlz?yIg0`9llNTHqU0ac+>ow{E*cRUgy-pY|e!1Sy9P}vo}RB@SK zJ#~p2-Mq*%pI_ilznq`39pz|%nj!i@y6wae9T7ClWooCx4rZDh>%>qIw6M#=4A7HX%?@O zXL8xG3|?_DohRK%NlSQ5_@XUB0Ri&(zN zI)*Fkqq*|-C~o2t$vs0Ocy>ZKr|d9(zAThqYY5?&4h8cg;&&yb*8_RL!vMbgwLc&7 z)sNTw+s9S=`*QmUKD=PoZhmh0F8;`ACx7C*gI`T_=QU++eAhu&KI!Tfe*L*KclhPV zU-WX|E63RLMu{zNw`e1uwsAe*>}kXIg|Fe^*;YKDZWVWKUcqPIw&XqDE#;@$E#dB} zi+PXn<~(EC0zSxM9uM1O%3piV;WNWccuL7g)8t_ZzE-Gb+67ZU>(Ku02os*N*>H z|EoA{`co0&{7qpP^GR{9?!CgZ<+Y;2kLQZep-&V_Mh_Kkws#dbLT)PbrPmZ;7cMET zx1Cd{sh(D>Fg&4%v=*S@y$2Le^Aw6sCmIzRFKQJtyH+VIwaXQDONte49{GyhDcK5t zo~{VKm#hf=7q19Yk5PoqjZg$ThA09f0~E?Odll^pJr)06ZdJ6Kv{})?bDg5c{*{Ws zN)`%jGc$!*^elzrHA6+hpvj68>&GjUN=7Q?y;W0W>h)3l+|@;~`LL4WNVhLdSJIv~ zDUWSwTG7zlbjC>DwCQ3=)2OwnO`TqcHcf1EYs%}stZA#Jep8C6YSZ-7ujPF^RLLFv z*U9t#YnD|>PE0w_S=C_SiBN-ufz1Y$c}j)``$ihhvYBPrjCF?11NRyZ`x$N6$1&UR zKue|J@Yx3pr_`P^{4?~fp;!28!~Cy53=hLnX$c zkrLAlu@W7YDEZMRRZ{XgLo(%fj-)8FK=Q?-M519Xl^BevmW=ydC;5I&CMl`l68*q~ zk{s)!lIOb3lI~s3NP4xNm%Nu>mXt?dm&~%eC8@(b$)Db>k})ryNX8s|A^Dr|MpEzi zK{9jZXGuZ7?~(^Ee@Z?b{3~&tuf#6tE3+ZPJF=ynJ28(>o!P#7U76>}?rddkPc|~6 zH@hC#m$`3MWj|I9U`|GA?3m_Yrrd8R)A>D&89f`prd=GxhBb|5FLE_lde}Iow_TIf zTWPUDCfaQCgh?!;uP&4Q)MK*8Q&{F%1LjaKVS_TjYW=4(EvK0*YKalMVrasC4WGlh zsF3+m*E}qG=ub zo3(*057@*a9qd@4`DT`->&QF@I5VAJF6{Kft<3nuHkMJgon4LcV6WXg*`wuNOfKl0tL&eo58UGC3zn+CA=hJkFUW)LeF9Lyed3t_$fgs_S4Lz%(DFs5@k zoT(m-V6W;TnY18^Stmxb?}0JQe@86)VJG7Hu83!~a}!wG)I>IPtl+8*NM_SiQkeF) z6xRKDD!bK^#^RdO*%Vm@J5iJ=Vj*X-vcPQi+dYR(-;~Q7m*%m3M)@pYQUP-tUdZP6 zC}KT+7qNq{i`lB%CG6g*QnpB5#!8FI*}DWW0`RY3hTAIHG@B|mVPQ2>W;N{O*jnbH zTF1JyuV>*O>e=Ue4b1FpBMWSjvGOAETjKa8R_Ci=i7uSktR~ib?tT$h`2f=$evsvK zJ;XkLJH&LK9A>L89budIA7yJxk1-@3XG;4{uo~xPHfQBYcGUP38>@YqxvQOF#mZ;d zk@siW(c9;k^u&4QU2}m=&bY`f1YKfFwq0gqb%k}CbCsFsTx09iuCq<;TiC+4Eo|_O z8|>2Io6NcV7JHp=n=SFV!!qsfvh$1YvB!q@+5M3Z*ugFjS-_`dh;*>Dp^{nBK5<1#g)~_&cWU_MWM& z`oNygXk%$(J~HiYpIGt7Pwd~#&uqq_FU+RsE87t9jm>rY&U&o;k2OvE!Df&8$?8;o zvG#9&u_;%6vw8AAY-Z+PHo)&6bJS}GSy4ND9-svEa3vW3Qo_=$?XmP>dzdU$#+c*E z_&TKnno2srNv$KgM|4E)uZ|eCRRu{8RPf!R6BZopglN6aI8xXdk5vVqEw~H5f9rx* z4qb8XR##-r?*<#{h8|koQI**p)4TV;exDxDd?$XNZ_^XkF7!mNnZ1DOURXZ7H*8{h zW5wUznBm$7{T}qetwntib+9jVwEN*mRzDbZS4GVpRdj!&iq+Qrk$9#*4oC*zdg%b% z888qRg9oDa%Ru7S& zVYn7M4D@FhqFsi=;`VU-H5Gb>#t|5!J`$O+Bhl{9NGx+6h4`DJ1mi;;H|x~#VEAZU zjU0`J|3<^#ehj8x9fPMcHL$Bf13w3jg=5fI9B&(oZZ_j!bY>hjP8|=|{PA$?p$Q9b zO{hQ9{69@b^nnQ&J6;RYL@f;Yrv)!(q1$Mgh_6Q47*MH=(F1ja{#OS|?{si=)g;6o zn*>Ac$vBrf84KI%qG^jRdfwErtI$JQe|_Za(?`rJeK=cAf$qU6csh0}{Ntvg z>(8n1wKc%~^9C4iUKk4d>V8| zOov10bcBAGj)YY+gqC6k9LCLrZtP4v`!*AS>t><*$yxB#Hp1N`!F~H}1WQ|EY&~lX zcU==~Ofv!dXM$h$vr&3}HfHG0!GZKS&}cUoUYq9%-q&2*)-%P+G*h(xHN`PIGen;? zgURH1c$hp-Xm;k|#)kQrbaFo2wH6>dZUO4PE)blgg-AZU5O!nCF*Mv92j7{)blD_rdwMOw0*@tVcXJ7Hu@qx-mLf%I8Q$A1gU;z?SgB~)yo(4fwuy1ElviVD5~KIGME(I=?rt zHBN|7IDz^*I?WEauoGRFksz2M|z1kg`4emJ9!vhjW52POR zz}=xcpzO5+y|3&*do54g3i3qa15fBncA_bMCq}&4i7j)ykdy6&hHqY|ve<>FvRzoL zK(JaMs!RfLYD*xl39aJgBY`;d zI#6iegWx(d2)d3zcp4vs@clu8brFQpp1~L)G>_pMgYh&X7`lzYaJ?UlY?Tlkm=uBw zt3zVQyaY#0eL$ymBn&RS6D~m(Moj7>>i^GgD@%T1RFzvR+gC)e{ zxI7-y@5ZC}Up)SePQbi*3Gm;N0BKwTjyERY{H+8u|4u;F$V7z9NyK8uM5sh1qPj-t za<3)g!nZ`s8JvWQ8A(vuD73smN!VMOgu=5)P`pdR!QRQJ*H1=@(EB=jCqp|c8Lfws z5%4G(svT00GByRB=BL2XB?XG;6#Q2sICxi6F!xIeEC-}wsU#IMty3}BCl$}LQ;~l- z6$>Aw;#vDNxQi0Be@EGfaQLnTPRS%Ud(C3xPs z6mFwRg?6(POO}C^D?acQwB%Xa%|En#{!dbjIb)lqiy9#2r0+p>~idHD94nu z<;ZL;N87h@==G3d<7g>-nH1p`QZcrX!eNgT)8YjiutW;!0VzzcN^$9h`1~V9Mc)ei z8CQYnGb-S;OmGq$DiG;Y0l)YP*p^g4e}4r&UaCOW(+W)aQ32{v32pUCL>pA%?t)4T zTwjS<9+g-TS_!L6!4j;g#JJ;?_EB8`>r(}LjVfG|R6)nQ3SR50Q0ZPJ zcyd)}O{>EFiYlBwRE4}N;=HF-82G&kOHBU zudHfxtggnZ!`0wds^RrSFbTg_gH&oTORWZVnl

tp;n&Ymj17gM+R$xV*0hSK?}L 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"`c27By`!`75IoZlY@^|NuXeG~`xA93*O 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

  • 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≷KR4YxL4$D+J8C7o}KqqDXj{L21en_huP94Q>R{WP* zm7K6tyANXU=1(x5aJ2K4K5w=S2{rTW>#IJixyLT9t2zKMt*+V&F#lUskM!bFyX9D` zSoNm#Vx>L4sOGe^z7=T+LeWTtf^s;C8U}%9-7-jC){RDs4O>jcbHaefzr}}mQ59V>(m^vD1xG7r z%%4&DG=Ics|3#Ru6D~h?aM0)ht{J&7=Eb-$f=v@L;!UFAl!zu>wr_D*oSlFgSBPdk zv$Y289Cmlu<1@HdW2Ecif8p&I%92P;qzZ-L71PY))I3;2U@NAOiv=uP0;ErD=L6|w zc{1>EAjv%fM98HVagzH!kmSmNQ-BpH`Xb^$O235TMZhb-9l$GLdQRiFD({|O|4co>qXV)}L~RoD-tiXy;8NZ${niar3k z5dRJkwj;;uK&mJVM6c#92Ey8!J7CuFH6SefxlO=Xz_luF(CxW0kWBJaf1CpE=Tl!2WvG^$&r%;CSA>0G8Sby!GYz3Gto$Nzm`szigZOs%~>)7>8p4;;W*4c&08`K z1*}E{g61uu3LXa;kMvDCmJ{Y6y$wj|gcFe7siWpB!5G^P@pM8MC{vE;SWbu`veDO` zC_kY}?woYo0LuwyL4dp^BtV#sbn=z}HLr;U>34&dVSYUVgyC!{AxvW_WF`fc6HbNP z)0`7xTG?I(l00DsP&B@WNCzKOn9@!27DFY$7dyeQ>PBR3)V8R@hyAikUsqiMU^g#M=tS0jSlJxg>fC(MSx?VJ;0I@st-cO*}k z1^Id%%L(ygdzy1X%ro1|K$0hPLO!HpIpGwfcdI;tzNVavh&+rDO%hBbZ89N~)>3r8 z) zU7yDV3|<6IUA_cJT}>5G0R~?V4yA21Kx#k(a58WU5X#z`fFy755IA~xy5{epuI=Ii zJwW2UKm^VIlM`HU!jYwF^iU&NcvPZiax=vpqoS&@Le5Gx%?)afri1 zzZSYVZvaxDeT&kKufH$k9F4|YLAahr)YA|kG!Vz=8CLH9yJ+9YUin8oRJi}<~0E(J2P5&w72XLJ4@=Xu~ZwAQeg zU&uM_iWCe!GlrM(KhQiRupvgEF@|@=aQ^3uhw{(FiAljw$oLBlh61a3y1~_kn24?z zZq=swa0}+e@YONAfpg3o&HY2Gm;&aH&M^-t{1g}5L#oh#uA;CPm-ZD^jS0dM2olFc z(}MA*U>Z0-tfhwpnyeI(Q4#r@R&!4K6Y(NGDX-@|4|9RS!^9J=t`V#_kSP30i@T zc+j!gk};;9M{NR53(A`<=ZvvKUy@1(PJgg^vjtZiu6SGtxU9GmaV6nO#+8C=3@#fk o36~w$SX`;N#^D-|YXYt`ToZAn<2no1*|;)rWj0rDb|l~MKmJXU$p8QV delta 219 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 diff --git a/ios/libs/libsamplerate.a b/ios/libs/libsamplerate.a index d5b04c3e79ac36453d0083fe699b4c87cb344a7d..eabe41f4b4d7d444bd46b4c5c4b74dedf92ebe26 100644 GIT binary patch delta 49270 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 ZnF7<2=F+21n=tHe8L%fFE5Ap7{Wn2axvc;I diff --git a/mac/libs/liblibnyquist.a b/mac/libs/liblibnyquist.a index 732f6282feebcfef37dbf09c064762eddbb9a5c1..f93e532a3dc42d3f18640786ea4d7cbd9cfa6470 100644 GIT binary patch delta 1309018 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%0Dycp;sFOins0pDC4tB_e4!PVRH%yTJ-%5dX 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

    mJ4xFd%}?d&l>x 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≤a076S5+o0q&dWMRQ_$lt^EP}^Z4tV|=NwNyqF5k(p>toz zVDfP=v&H97wHB;=xXdzjvzKgphxKA- zyK$zjzqxngS9JZCc)>61c!A@CMn5qzUNE7&rFzkeOv-L~zS6m*!G9Dfc6R){y(`l3 z)fc`(T2>`eKuKc@2UjC@fZ6AH>fpfh9uAlBdqln2?yw`)+0%m6A+i;O^3$5EX(zbd&Mkja6V|kDYibwS1Qlgku)UbK7#;uBn)(6X z``U*PyNwY3rXJ<*0B1r7q!G5b(ziYLFX3x16kz&ZqOm2E;H%Ih@s2mY(3;-L`u{16 zqGinNv%aIv%S8zZhzIiXosGKF*F|3RcT3qDey7Fy(x69SGOb628|JlcNm!CNU$led zcMyF>W9FN}yl;T&M~-@ZCyjLxN0sUOFn#HN>be?*ovmDcp1(ZsCunl91`j7MkG}w8f|6@Z;)&ypoNc91I!oJ$7fp zD&2zDEfON@A}?_+GUex?qA-<5nqUPZw6fRJYsz7fa$pN2Eu0B`mtPK_4b7_wC`V9)0*$M(lBD@ZDc=LjhH|WZ8vq5B%l;*WqQHfb%_5uxx z*)MCjdSBAmD^FMpbJ$}c4?(R}3C8Yjsi+!Pf-f?ZLIUwL* zxV!K%l`8yFiOMLQnr37FsaRI+!-Qekg4X*>CAo#fBinJKSp-ZRJxwrAQ;E&NKh~in z!g2Kwo{_ytJ2d7WVsqH)7AUlA{L1fna@OmI=JUpum%Mc)$%USVl6lJxU>Uc%mrSrc zhr3!;yn6l8;7vOC0{~FC8dH|xK@v!w?$B88l$d|i%`tx|f5TlAC_x%VHjN5zT|;@$ub1Nfvgz1NAFf*^8GnK^b;4YFHw&0@ZH_8Y>Mn&tLo%=9aL z87(7l_HNOja$LcGmZy7n&(v+9ZtdM)(S08G@iD&;MQ_5n3p#l5F%#0`;TV{8@IJ{y zyzT7(Z*#PyhD0e#x9&?aLu{Q&lT-aejg63074d~7ZIqiMTIawKo&V-I2Wwvg!8x|D zWEoH4P8GTuW4rFqo!;29<|~9$0D2}``~SQh;c#klMODBfar2=(cu@1~stwA+DNB8b7L-&UtD#zhHoGeOqc9 z)(f-5@-!f5i&!37<58ZG%i_g*(+{_7}n@6)7~x^lG?svd!D-3&Wl2 zzWST_u__bTT5@De#&!`$|DJBNrFkI=HTS3*^C`;Urc*s6oynImSC2H@6-l%KxHYgP z_2u!(?gb4PYvK+}<06d{tmhgBwhXG_<5VGbb>W1Dfjux0*?bq6Nt@-&VM!u!sNcW@ zLOoI1x_tMrKa1ERn6PRmjFmXK^$h8RcfH0EIMB3K4R^pXj_}QHyFm?@=%NM?PES5{ zzk=RYC@A^?D$k&Ey;5Gr3&IzA1^XNJOJcNSY#NqxE{_)fiAkwIi` zbag#DMqm~QDJ$Pg85%bziqY@z#^#pH4R@qX@fd|m*KVn zQt>gjup`HoY2s8{>7SZYD5?1)T;d^6Uy7{BM$#Efz5uSVF(DI zv6z7Cywu16(}@gDL!=HO9+M#_bqfyiD$^<2OB&s1phe~Hs6Ky;hY9TXpH6+zRJLCE z_@lc*m#XN_sAiLcUOMgRY)w|G!s~inZ92f*^5iv#pP76w!h)?A4h(jJVPQ8^-&rwx zUtb-)%hAz`x%MNgHiCBmQ6BH1=r8IA7T--ob%EAaUux9+&M?0y^Rxiv8{Ft@40?V& zmO-Z032<$$9nP=jf~mI+@@^YTV#oqAQFD!*ic$P>+b8`pbdB0t%DaL1QsZSlW^j{^ zs1E5k-dK9%nmUtAy7|AOwrN$wP=UJlW(fULtmm54Bk@1-MJ80@Tzi^$G2`YXv!vjp zFq*IV3V3E?v#Ey?bk?aZN|cqB$XaPbg~9me6c~(;&?R+Y-)Em=pip!=<&E|C+Ogu2 zGMojk+LJhWp@&I3kyUYeNq*Tz-W^Dsy3n(ccZFIt3(Ms2V_Ty0LQldQdtitvFr-Xt zTT`OrLI8E}MHSi5s!XfD<9)#}1mz9$uJFE~b;VoWGH{ z^Ti(5*G_x;L6H7b0xQ_%>F6np6_*U33Nf*&ONz^yyvV=wt*6OpYv0Q^W(f>7QNx~6 z-$VQY1A?E`065)HbXA9)JB`#+vvQ*6Dtc~N0_4)8EIt={Jxy>h<_l96|T4<6@ZM&|)=^Acpl+YorI88YSHtQEDVLH+uiJ>~=dVW@v^td{Xth|27dxHPlVH zteI}nNg_4gkQU7=MRn%ZQz^PxvXXqRu3Eh%>nQPtjH(TvW9bEk>;q_%~or>>N{SV zpTE4f~ZE?tb$bl2vqjqZ@T#`nejr*Jlkoi~;LBw+TWa@o;L`*@>Gc zky5#xm_KB8Le=rIS@`8f!()4+d#ejlUot$JKiUu~@y$+*3Z>fvVbT0g&)(enTiHo? z%QsuUY8a$CvvIfy2NNy_PB(B!-I(c!^_#LZxv##uz@_BpX9gNW9rE;Jh4gw!0nZ?2DQ2Q0`SCSnRAe1{Yytg01ylP>e=E5}Uvp zx3FY2X_wh8PGjO^;p~&I62p4FVRnOVaBkz-&Q21>QL%uXsDJq87f2R&HQn|f0AR-B`ZCBIS82J{)U=vmSC2}DPjreEoDMYNteq9OZO5Xh!1#?YrdE=_jk zcydfF`Lo)h4u+G!**o0%3^vXYq^j=@Pn^v4G$Jh#$i346!pCaw zH@&xJWGTjMxRXtggel&akWOG?VAaj$RGgIx3Cszn(e#bp-m16d;D52mXR2sLi#)17 z6CkQm^aoRcjZ*UKq?G3WfXSjK8!GVM;#96QPCvxV$!E1r$$Dz6r11>I%$jRqH5Rd4vDeC z&6KIoH@o5Y%n@(6fu~lWoV|(8^SsVUZ{p-dPE(?*&}VI6$GHl5?enj3eJydS&~scN z7DsS9yR21h@!U)Ea&l_AtqpdYL%db{{nqm`>Nw8lo&$*v3*4Zc60#&bO#TgskXP;D z=Sr}jOq@jbU=Gc9%F3qG=XuqGht?}wCFZ*PU$t$OqT!XVa@|4VR~o%%_O;XYg8jsc z!lz5>DZ1{E|GdPlh{@;^WKfv*&6Oy(XP<={n~k|&L)a}R+S7E@cElLtOhe6QI%4-} zr+C#xYDF)ZbdfysQh^CxPF0RYQIieA=aHiWo;_A+8xDdwLGBLO|C%OP^3#VyP^A14V&9;H~Rw>Fo z(>@|_8!wTrQ=o+=P29Q{&DqJ>WupflzE7QS3!O44u$8GjyY>IoVWxA zFVIp5>A{|&Rjp4YK(Sg%EOX~bsE|49Hjn*d7D^c0poln;t~Vn{8wQ$54}S5G1N}v>?um7*I5wGdi+q&A6X}?c333e5w@4MyT7!eLB8~RJ{D_J!mMi23aR0i zID|~2(_8jO!pNM2y%|Cv2D z_G(tNYk&qY*}hb=m~?b%ifsumdnL|khff((&=Sv1d|0W=tmr=w(R;7U;meNa=U&7? z25NpAt<@QEW%Iy`5s%@_xjp)4@g)?A2|6h73r(o0gT|UG6WeEv>`Yq3jgNWIt@%IB znl-DZ=G~Wh+WXeX)0{^9(#qfFMs9Og^RCN0P37&@olf7j|0aQDN4>V&zx6W5-B5U;#zF_QyVF_)`PLchR0!^!yeiE5N78qn z8^_4*6kh1b~4UzzMSXQucmH5xqjAc6wvFffJM&fuAWT3eaolanG%y`Ii0@beY$O+7G35XMz zki0*MG^zY!bZ9>|bBFPj{5O_8)nzeV{DSll?bIMWJ9;kSSw4do{RcPB9*#H-DB$2R zKUc*IKX-&{>a)FPU^=LDRSO$#3zi?Oeh_uBG1Nb&MJ5YY0`bAP7xy&l%?TlmAmyR2Q#KyPttkMsy+m2gP-n4Fi`@!c-c;m6& zG_2CMQ!6Q@tIsWa6^&`M_hb??jkDgVpS#o)T?^949r4_O?RyPN>ds#rAiaN`&FCEN zX+sngZ1g#eXofgV?j|vGNxT@f$6bNh$J~LO;ZQE~?D1@at!Z(-Ut+EDBONrG8jn~c zv-Ompy%>ah};?l;*arKkBXs!19My8uOzh1A_ z3RM6Blr|;Ia(v_r%@DJJ%@cYDOMe%OXbO(r1?Ox$zew!mY`7%j}_eR+&b1V zu#LhZ|FqL-(aU(kE1o`hH>#nM|F@x*G_28 zTILd`K}0VJ#vd{e;AIBeH&l|m8r9mKq^h6m8_ppo!OgXjlad5&w_qg~W}&t-Vo9^G za(evF_P^mCOuNk@UDkkfa$}{y#7F+DBK$`KDubRkm5<#A=HkPFG>TsPDJNlEWJCAVlh$LVkwg zSH#C{Kqb4M=J=eY&?#n1T4VBJ<_P%rJ@C4kFK|DFw>62CL(9L&y&H;ZND(fpg{0}( z9ss;=W3s|92}{k0db5A{WHV|h8k^SRf^lIGY2f0JDSXmK2y8vR+I_1b+B|WnF3Ah{*yXNlno|sF{;I?f@|Ddzr>UpP%g^mmif#gPn-S-MJ_VGg~gAXdYu(# z=p(AeBUA%q#e+0lXqD9DY%4lHpRC!Wi3!Zr*A3(}$Vj=Ap*X>XdbJ$vmlPHtV?1n=>EdG73BWAFrt}<#L-u|wLgqd95M?M0}i-Fe) zXaooCt|Kcy4BbjocsTZ@0uc6AGahBZq|oh&lWbROhLA~ zW1eW=iG(9wT&vofzSYQDSn@27+Tsm<_s6mj`x5#{wL5Ime&~Fjc2E;|5abR$bmqPu zI%C|gq-jlLUOgJ)#pEh1#CfZ&MLJarR_*gT4I(RJDiB&o$GRe3yr=@CM`tHgWe-$^ z1y=@nuUe5W8mdyfAW&}av?9YrK+=$!#skIIfj=aL-70tS6Fu{3+J3ftZ!#(Pn|6p9 zflbl0lINLMCC>*U+dM%J>L!x92I6;0^YpcJG9W|t|D>esbEIYBqI;bN|2}87GoP1U z7{5@;ewCgB73FQA<;f>$VztT?T4fpc=qlr0Gu?m3&16+JG95Yn3?-p*q1Z(a} zRUspH_gIn9D#2%^bEE<$CqDGgq{hHU)CIcTl=^J8P1@g5_YamIvZD4K6arD1Q5pUM zqfaYffbq*%rlw#;q?N`WMNvxYXJz@u>h;7^Zh^8k?5>3=eUi!W0@q`e_|jni(s!E4 zWMVuG$Cd(oVcnu?UvQmX*xVKsT!$7u#HlOv=j2_a3y|U=KqtKj(B;1X?fGVpb1HI} zn~ot?ivs7?|Cd5`Xapx zzB@7iRPr|_{~ZR#B|6ob515??+7F_FS?F86n8sMWQZ(mTNC)zFgdxvrIxBFs0vk+V z39n4pm~_|*YIx48??p3v{$yIe5Rr($MLImph5o14M)3qd1glR0V;Wy=T}DZw);0sY$g ziD0C!07hC|E$XVaeA(cy#N%075|B6W<2f?^uE(^Xl)rtki8FzS#sBN7?@5xB#t%L2 zi_NRY3#a69)}k&Nuc8WnZ%C>>&V69O=*_NkxkTg;exBXMp7~Rnw@HJhbkLxmnRcB8 zqpfEBKeTpslTM&TOV(4BENEBze}U~fS5rDr-WdYhHBmjoEs54?z{b&-MEoz``YPzy^Q%Wh5k+}N(cjET^8w>iymT+nsU#V&WOh`)1yRt3JQ7reEw=M<*) zqJ5mJ8b75NDKL_kg~w`Vs-p(x_04>5)jmb@+7kE$&B?WRX|Y6bL{?Pr;N!K0wW62n zRvQYdb~v|dCG|;O#GUp+y}He@=UYh6)q9oPYxL&v+IF$+Q*QQ!qc?jRB8mL*hPC}L zwm`Xq-KXOkEBXUsx_f7)dfH9<1POCnX!oRnR0=?<%D2c5sq zYT75CQ7cFm-Is!jN@u_Pb+DnS)hia3HX-tl2+|dhK6TJ5`JsixM5b=xM4x#BdAc=ATI``uG`QKLB1KX;lpL+If}H- zEmAH;>XbVte4D(XSNNr9wMV}u(1NwpFzB>Xs4u%^*pMz$ce+diddmb8*wI_4(vnN8 z(&|f~dhc0H??d(8hU$G_O?wA%jWzf~tN1;uY~&?Y8Bv04A3-m#px{pgah@8@Z|}Cd zlTTCf@Tp#X&C1;wea&41w}iLUP*M~&52qD22kw);<`(od0Y`N8HFqX|xd%&Gi3U@7 zYmJ5vgKD}Cz;X6&MPEO{ZVJT$X@${ohz2BqHg|seX}cZoLq&cV$_kdQ_#fjwuvfh(MG=07|vR;GI6B_AC^TM5@L&$=pd4X1}ry+0U;O_46 zITM%z`T>c=>r4hCYW)$uVrtD>jdHlQj+CX|s$IhrQ6tqp%?*cG>s3{MZ1PmRUGn){ zfG9h=?dwSB@fb1E;xohmg@gBFe@fx^Bg58i#EaNt^lKTRNA_lfv4E^?`peqCJw%II z8(vj91{G!6{z^Q^5rYl%^xc7~ozBM5C*Z}cN48TCVfWNF!T-RN6)dYL-~Ira`~?Rq z%3GkbCz8J-iW$v}&V4@3Ew&z3)0<#Fi(SiQ*-nq)!>yw?YY3mJb8$B!j)roxRd^lt zE98#ny@OoZIGVDifeb_Ymkzb~nTs!sQhTG-)C@pb>XBqIL{tkw z?_$Pb5e71)Y@MdT$CbWIyVyr~;AZN3l&dheUB5Hib15%@*rH53&YzCX%y}B&)>MHN z6jisI{e(Oqu%CF+*(gV6@%3u8gE1+=G-BrsTte;xxD4q`A+!gS=xx{@IK0w?)s&#w z$8nC0{mbCnXgN6AgXDaWCP`ruLuI{ z2p_YNwdg=-J)RP(ucy{|qazF+O`YxfoxYvQu*sXQ%_57qHjdL@Q56WcrrL*fJ99g= z(cZfy)HKWQEYe72TDY`X5V`JY5{?M0bvq-+hNY)Wyt*(iKDY3wj2Q zyvC2M!wFVHKEBUL9`C_9H91yfD?{DclX(APurWxix+U@Mu$X@#D&Jp=#if)ITOo}V z&&wP5?Y_o%o_pY8X+y8m{w6*Rzru=Emup+2y9dr&9P`(44suIPV|VJ}UY23jVuH}M zz@=#Q-$+SfM zznT_1Wg*dE3~3t8ud1<_5LRp#SGBVs|sB zl2_0q>ETg5#M!d*-LjpLc~8R^ryvD9~gE>;Me5c17=EoJ~g}!I4^Vh`U8c-3tZI~}!;_*f{z2i-s2Eo@15SO4k ztr%9<*SOwvVRlwpwU3fzFE>?vaUi~QF$8-38|eW9PMqC8wp2qkQ1)tU%{{vDGzH4`m;%Tulap1)4BzZxM1M#`ygvSo z+^y(Rin{(1m5USPfO9IHR$UoTSRMkXPu`?83PG0V53{+LtL4()X z<}d4FuTZv62Sd_`f?Z+{UT3Gv%bh05qv~9o?}3m6EAl_ z5GQ*;xRca$uhNg%t6Rt_X2xIEt^r1B0*z{4BotG%4P+o|_h3G)d5X8LLPvT_ggKIX z{x-Vr{vkE`6Zu>Ff5hN2U-KzWU4Bf2L*slj4Cj;<=P_A!t`)7RSy#yGoa*yv?`1gR zFrgZ@vBy+S=P{}H`JDfHg-i1zt^DerWv^>!-w|m68B64dt(iy#XL;o<^Ud$f{Xlc= zlj-BVimEqoAFJlUAtczYfwJAq&Y;tEL|+EuYa|I^Z^M3-Q1ddjR3Dq2t?jg@`&#hc zoqp#CvocFgz>=Qtciv0RB!72zo1Dh2v&ETG6F%v#knfXEtTMAg9?B0N$`SWa8HJM| zS}*r-(&Ziumj?eK?m_b(_95BBJ}lJ&o@O6*Z{WU{ePGhK?8CQu*oTX=xQAP765XlK z^l}f{?`QK5=SLRY12Ls0`B}bkN14xgKisL!OZA1;x?_9|3iZdG=LyJcVF zt=BKg5zP~x^EgJG*UckziP#FvOgj2$7V~%%_N;81XHV)<*L;{{a+1*wdMaMm#n_dZ z-bmUe1liY^YHOtX5ueYGa5ua0k^RnE~@ zclPwv-(~gHH`G^!NM7mx>^}O$6nna8eoq&TN_P=F-IWJeBXN8Wo&+*H<{3vOqqkC)Afc-D5LZoVN`&oee= zn(S5zHUu+!npco8(sP5e30B>dTM6#&*B-m@vHqi4#^Jr8fRLI){jKO9_`asIe`o?{ zJk~;OPJGsL^Wpd2xi0jT*o7)`t$b9wh*4)|W?wxyp8GO@aQQf-y|E&k zVB?6~paEQ(5{!id@yd4sPP?;b^e)pu2(i!ed47~D*lO7y(bTvTFqjrSI3c!iAfQ25 zPqy7)4%EF)|2VtL!2Q_8U4?V1{El2}VUxMv;&nbkoAX}IU6nU*L)CsXI;;)88@fiH z7=N0km|(4d2;ukf?n2CEt4B*U<1TB%0Ffq-j-4@zZn7SKkn|Yz_73l3{Yy@#zCQXy z`iszZYr{?b_+S=pc77NiGpWyK6Wq_-uL?Ys@%ugAx_+qw&7VqK1fJ?=e~NX=ir&r8 zQAY9U+)z&W9jiv$dn2@K2htedq%O|M#@i~g*II$ecXNMUUq}k`?n}PQ+tIsBeXJFY zo^75c&mImsdyBs|kIx>vpytr&n$7(x;@4A(^Q{e5xbqZWsxa2$d$_}d8K@ju(bJTi zW%^aLHeCeeWm^k11-*ap%<`5`?gw6hv+u@uF%8^^oDw0y_q%jLR70E`;N$Rw2Xfl1 z@`4|7G*|t;4%dQ$dH6{pKCwH1hsbcJDnyyRAo|3|UCp5nzFw_`x2U(A?Lp3_*O~(1 z;_-ny{f^z4yohH(f;nBDZM_xTPqPIbn(DFs1^sDaZ{4>%EX~f|}{k#FU`{XA6UgrQLUr@Ne=jC2pwQYQ#n~mJqEmOE_!Jv72MLAXu zoz-9L&EH@^6;B?0B78D4vZZTIo4V4H#9Sm>8^%oXboI8|lMsdMc60U?)OhQz*GTPW z2Bu^yLFao7oPK!AK0^OR2jvA56vrF)(}}1@g==bRq!>3TUQ!AxhG4lhaby@9)Bz&s z;g54@!nqZ&ZT(#9TdR^2y7u+mq(s{zdt;a-|^$IMQ2*gtgw7a$v59 zwsfV(-UBXHf2H4=?=9Qp_q^w=+0^Z?yIgQth}c2hXkeIPqU{}?@WM=nzKH9-_>J9O zGmIjg{e0HM%@17W`e(Lk*HQ#|?8Ad!Qp8;M$yVLS3t!ib@i7eTCgFzsldSsn38W2aDCeTwNz6(5q+^XCJ5VvVdt3 z;=NP3LvWAkR1Kg9@{w~Gz*S1!V*DEWTR8N_>neUmF&4ThKJs4F=X9PzOytum-4?qs zR{hSA8?6nu-F-3$|7`{bkJEYd99LkQ2|NuOZ^CY}HdNnzy25inVI3x{i{aM$U6=W8 z%sVCs>X-Ey-HJoxO`JO4-NGq&WZsS(Xc$;=KnZ>ddA)rX%~cO7orjWYNkMkopZ9O# zFk8pfcuPa)qarruU^pIY*j)P_8g-1!oXV?UvLIk$MOpP>HOl;|UHt(8qOGuuo zeIR~IrdAo@ijzom47;oa=Wr@OFPpTnXZ_AB-=&62bSmqCl?b4!;(Q$F;}8ea`>^c- z2j%)>Q?O}XD*blszbjE|tBrE+kHxiBsEF6@y^?-_1q{Z&#tU^QV-D%Yft$Uz_X2ng zhpX_${2b%5xAW@|w}YzFcfZz0ZVPA3{AA_#w#eV2ql5`RCDNU*16?~QD-N_ZrEqdf zM}@Pa0;Lh-He7IxpQhRzCS-iSa^|0R+Yj8MRILLAx9az{Tl1}NZ??X@3+)3;eyp;B zC#S@QLAyGm8FiM23z-*wse$s!Si{nq-4Ywn3kj4sLyz zOs6#p_rENc)PqlO{+FnRNh-`MnBx}6+E9EWnhPAha3tgEK`hEh)ejp{$uW&}@x|V? zh15ELpDr!_H+P2`zT5TPoIad&ps!EQ;b)+oU=4DjffJm`5G{k+Y1+GY={gI<>ShMW zD?pv&CrbEL&M9|9*ak}~*B86>p4d+{B4Rhr^tqnMe6g6>I>sZt<6%58G*GcKy_xyZ z1LiiI1ZJ9X^1c?ILsaq=@7f_mRxDMHkuxPdCN_=j9m)1N9gTW#ldDlN8vhSnjh^Lc z6g{n4TT&Z_?~cGZeT)XGh6OyQyc@9pK`r`Hq^b6`;U>YDM7plB7FY$Q7rS&h%im}n zEMgyDn8`gR}@&ew3yH1jp6+L7=JO3)(e`xM6(0%RqiPMwB`{$pT#1Y;w|I=BNoK;-e==B6& zepc}C?BJWv3jRiR@RMf+|I!U+{;7U{I4k_O*`GgiR`Bn#gImrDZp;q;(^`1b^ray0b+Ux&u0gJ`8?=P-(gjj9X|T3&#%f3zUHjpuVn|jTea+lxjH*IXuh_y!zX2jPd4G% z!GY}He>f|6dUo*4vx4vBO=Z=r+)B@f6>)RWzkcx~>Tie=TS2H-pQDP{b7{O6@%Aj_ zCLS(-XL_ASpMtRAC+|`5@;MW@Y2^yF(iv3?7m4J!-OH^&NP1oWRXC5XR``Jd=^cIRYk6l+p4s}-Tn?CkZNzfYF*?-AJI_cd5E~Uh zP7}S)WVQYkidWkm`fNqjqfu_pjfiJb0#VP3s{LIs604T^Cj5y-`tII@LC3RJO`hpV zB)>?kzNL@X$q3eME&2OcaGA1qCOw?|XXTnz(@azBWaQHn4=0yv3S>oyaWJb!mxYeK zK!OIQR2`|9EhQj3&g8Ml@1F5dCe^tnRb#A>^qmnWmgAN((wS#PzT}p#dc3hxj2;h3a+ z?q+4wH<=@f#8K01vCX$X-z1K{dX+8cEVkJlMc&_9o zndBzVNfu?LWovV-adQJMb(r?|7r8xaCaYC@y}ofK-ItX3_FRb`<2}{AFDVC{=Zb)D zNOV}u6gv}wqVo#yCmeS1sG!X^dowG#OX>BWe2bt94=p7AO6N5++WRQhJ5ug_8s_eng9SS%0<0o@Tu-H{!|Eo1ff z=!Zb+n!X{J7d)YrTdTYH>eRJ;!{L8W{P`+b*AUBeM(Vb{QRF|qx=0C#V^7y4HPUUt z)D_v0nSIU^Po}dIOP`L74S3de{2KpWtM+wbu@AP{+iRbr9g&gD_eqX%sYQcz>Ha}k z<1+LNjW9QP3pDhM=mAfrWAA=w5q+vkCCi8>dM6#;R_(L|{Q!4_;{ff6f~ z2-J*DWTF$r7BFG)(xuDR+O1X-wJY!dlMo)q5wG%UG&fWPT~x6Hz=d+rTaTh>p6m3j`)4Gh0coD z1$pp#lDzf<^x(Pgmo{HxuW*v?#oVelH*APFmCccaWA2kGP?a|SO{2X{wf~y{u4R>bOo@uXA!_JCeL3lx=Fi&Gb zrmngVqw%inTQ2MyPs&IEuSAi;eB1u`gY=@tpCoNMo9jFnY0|B&?l9yhB3G8d)c zv8Z;Oxy5KFEPHX**cpplKLdr>lMtkeJYOS^hQ!YkoVlsPi60tr>p+xN4I(Y6q+hMK z@osN({9X8JLjnFOL$H-bhUW1b8#)k1*deTK)In5uh~h_?_~EWeFfM+m+^PSgA78Hc zi6%Z~qNl|VU2jddDEsw_zS%_o#6-`WduR?>Yi}cBu3UUQtt7pVfyWNVC=+u-D@vdJM-@lj+y-q)iBN!_BO@1|5Y}?*Z@KQ~ zDm~UXQ;3#%b5XZAkML(#_G~MVlU5L-n1&NCL%o2p4uQfzcs$F)Wp78EE8pW$eJGD? zz5#gF|I9n;hl*8Y@;Ni9u%^AZ;U)r{1==zqi7cKpG;(QEn7BHa%sUmSf+lezM9Nam z!fiBDYzcdqAZS4xKsc(tqkQ1&Qp-4F8O1DC7GA>Q&y_yA)v zcws5Vg#*rFZfFlc$CAnKYyB7NY%+N>iK0ov9X2sTqDaK^XpsI)UoI9e4xY0|LyAuE z)(*|C9W#!{sII!{1_aXIefN3>vcg$$DGV0dE~;Pm^Y3+>?c;=5*+`xG9ZBFZ;ul}N zyYA=Tvdj}cPppiW9m9zFjgB8!-b9!*)}wm0{o(8DhJ>H|A%(!GQF}u8NfaQkCpF^_ z8{t8(wWHKBUH~IOR;(9;k5h$}QPib9krh-Qpdob0{do{F183a`ui0S=HNW-*(|Pjn}u(%W^504y+Qttjc`VEoM9PH z<;=4p1eOK9&lBCqK2LN~L1rrVaf&+3B=z1t3@x{+F&)|eGwc79@5^-j-@`=U+;bu` zM7Enyb~b%8j1$NSTo*+qjx|dUjz64eg-oA;sRw^iEnf+le)v865J}kCR@mn{gnh0- z_-E=4tbDvD3m-dV;p6QY9?x0_qJfsE8*lBZdo^_*=x(ZBh$A-rjo9>7j3devZ^TRDI!BK)eY7YYYD>=JtQFn);|KYI>F>&YzudWJoYdDHZb8iEnci(iKRcEl19k2QsP1hhzCZC_)b-oh_qNg|cxqrB zJPP}rSP8SPOb$Jb2X6xe>8dz{B)dT}h9Fy-6@vdqsuqHOH12<41Bi{d7o&kzv<=m5 z(F?BY)N7}T1mk{_^7pvjs0wU08J2Y1?t}YHYH3i7G33Zvb|ON0J|j>F#0M^sV#utv zV1Gr2+w^i^zEF6!13~jKM~lE-!Tk*ZWC+?8EZE)P62$rX%~&Le_rUyzixOLzALtmQ!N3bxz4*&0nX)2mm-G4_)sX z@1t5voRYdZywNV|yWMLrB9(9$MC}u8Q?w~W<)D-HgGezvpxs&%ld3Cu&((Xi)(^e? zZ==bg-)NDO-Bc8XZWm7oPmQ-b_C-L#1gHq^aPzo9Y4R^&o1%#j_dMN#Jo!|?uHwY# zSU7qbu2OMxSF7Va@7Js59_?4i`@jaje5dhuG^SS_k%Up6<)Jb;EA3A3ipU1iqvvRzT9>McVZ$IcGUTw|_+(mjmy zsy&t%Qq{1dZbAyNOdehg5S+$e8Q}4_=2rNSu#H;yOCnM`O}Bf%V#{#qjV%?pRftY^ z;%S^nBH7b!MFRC6bU*??(d6Vud_bxbzh^z`+lkNVg!@*a>XC419+oej4^)i(X>jJ# zsrgEqF)F5MvnNLqW3(5@qyrU+pPC9=sn8cFqCKkb;^Wl!p#>TXeF!qYz%$z0$0Hi9ueGH^Hd$JF(SfXDQhpI7#c9d#Z6H{`- z$x3!fFNEXo_D6Hft;5h*@BuA?;RzhOjMCwCGWqJ(no?8luUHqE|KJ6`JG@q*pt&vK3zp8OehiH}!G|KkNSnWTxn z;UWNq;@H}6^o-K+I>g2;taazTO3xjT`W0)nIfBkuG#%%?|4V-#QBJzNO8|1Z+!-0} zdylv_BAqauDE(EqC|}=u!0t;aC}FPXf|tyq+)Ajkw>%dY#>O(X2XO9*O}nH*f6K~f{AJ)5yZO86sqiM@tALOKTEY%@+3-*KX1l8TXZLSm_Mv77Hc zaQ8WHyX^uS%FX@rc%SH-iG`&y;vJ^Jo$~nWph1|7qkE;di(?6f0OFlF-qKtubsBfk zo@g>Zj-J`*^x#|=le@M>&B>E9idj3_D%>UkvUEceC*`as<$hKWHXNx>%WJF(_kd5J z7C@mysmJ-YRV-szvP>!F`SMwnt!F;0)$sF_Tpg38;^F)3&KP~_(#RNI>1T6XoHn%? z*byZB2R~t3g#--LHZAS8ZOUoeruKR>moD>S%a?hR8kWV9BdRY)jZAXoM4I)~B%)*9 z9t)=AN?CpD8`h~XH#1>;rA8~ud7$A+zQEH1Pm+rOJ0$gQEhj05#Kd9^fHaskBVB$jDpQjhW;Vcf2**7M#)SxpA98b@U##*D#CLVFQ`iRf zIcu5$Q$ssW5OWH(X znq52wx8aU$n1~C5y5Jf@`3=|OOSmBEeHh%eo2%sTxggkF@QQsv!;iX?pMY-wK4em8 z$uhav1)@?4U$cCP22CLHO(f+Ioay}<-fFx|ttK1#JOcynH5B7TF4y%M*2;zPgNN?J z(J{7X-XW|iAfe^O$94`bD1;y=-dscxaz)23UBt(!|3^ffy-l3XHM#Et;#rDKo#gnK)s%U8^E^Y=BW)jJU;^bm(85R&KbpkVohUTo) z*k{!a;_8?tmJ{QYtQ1<9W;(^jjX8%zQse~HsiFpu0#%5%^ErHU7E+1m-yZhZB}|Os z5sNDMT+OZ5(qff(kCeyES*elDs+Hy+Gn?ZE4PbMd%@&YOHk+~*|A>!Na4x?dM-KoO zImN-aQ}eu29E+nz{ADSNX?>%=l*P2Z)8CoY?o4vuatgkO0x^`RMB+pIwCGwnURsh) zI#0^R&NB!SK)*vvzqlTpe-=T9;U zwk)nz!KlUH4>RF=kf;a+;~C|-DiBq9d8ZQ-iK8m7S5=BRh2C;(LB(Hd9im)@3=0+V z=KAzv_BWm4Hs|V`t16&B@s*>f5&=Xr?<^MGdM3N9B#6dA#VKBI15?WgnBih}n{k{- z9{-|HMFSgsrZvzWEWz4N(zG|7Vw6_Yyod^m%?ecllRVccMtABoqa%J=L#_g24H$h@ z4m7HyQ!4~WHS^BWQuj-m5_Q?F3{NjAvB2)qbplc00#h%Y$5EqWXaGekh$hs%+XH}t z!nu{$mxxyIQ(S?Rn-Q8@IYbaoEN|x%^A5oX8_E!8owHKwv`+1Va>~K?23HSG4O?cP z89$7~otYa>@nTWGThW-5(moy7iD&@Xhba@>zn^o7kNc&~fD~0G!A7`~`NkT-^B1Ho zrI8)FHXVO?a@XJc0Ulvn8K{WyV@1;(0QbfCF%GuK| z;5V9FWdNZdxKQvD@OF8d#+oH#*4I6h?v7h{pxw>(*O2oYv;Z0kBItbZUDWFv3WsvK z`4GEJ^t}qTLPIK?CqnSYC(IrLY9V^nQJmR=a^QOvw7_{I#W%*v}O{5uUbh<8baMvxWsHz(C4Kf z>^S1%Z$SA<(^O0cmuKdRGA*bJx0<{}`eQf4@X2uc;_{PV>U)T)ttz2a1m z^-pb?;Y@u&=}=?;!DWFg)J^97hUQ&wo98$7M?H;o(>0sc{8z30A2jyQ;V*5hn{MqD zwzaX}glMk4j!47yj-KZJueTQcKfPcZ{qp9fTl;$!OR4hw%@Aj5#hh+5s95md#R2KR z^~XEiH#^k-6%IhX{sJ60Gu_Tnv~y8UJMT-kQ~O`-_x=}$f3fXAVLP~)f9N8$v)GhR zdxf9Pe8F3br_8_nM!2X9Fw3Dl6%TSceo=qIGiFI6vesSWEOC=`NJD&CJBHh$ zN7=+kR(x6FQ8w}UHgVn;Cw7HS=iAg{Y--&)ehECr*u>*(;#0mn@i?2f+$QFhtZ&I~ zChC>j)DfFnm#kmXj)+YhwTU@>d|6^Y)v3Kx1yBFfm2TqS#FzrD%p0qp_%|_ICg)Ac zTpw*YsF@N9o}wCKOuk-;CvvjTvZy4H`7wQB^GOpLH2VTGA=xc5A=!v@$3`gulN3}3 z|3^V=e$?iT5S)=XVvB+(q!TM`xlKE+ciM3_?U>$a$Jn&z_fC7hO*_h@bxkW&@F)cb z=j(UU{Na8U?G*~-HN7e(6vF`5*&XrxVw-ko@3cd0+9AEu4zXzm_D(zSQ}}NH*MQ!M z2iU}gy%QJOfvxvMcpKS!`r+B zVAFJP`T>K@;N8}Uhcr^hJJ}FExtI4x3c9;tBFi8Sz>noDdt}(;6mR3?u$@CA2e0** zJ=yF`e$APpmacV1zJBY4q?OSVp4Cp;d?FT3=+j?q;Xk=hx5$<+H1IBdet4JPVWWbN z*SPAJOj}Hy@E_S${biLpaqS6h#jIl&p46&}*UB_E|Eaj$Rvc8t(@e!gPTR!ZlJimZ ziz!|Dq#>e{musNaG0=atV!x~uY-W8B{nN(=FgBPn3+JPDnG!c!rGjjmS?^lc0-d*< z$uBumG_I}A$d_;ZBh|?=j2gLKjU*isntvr_lrPvu7Sc%9ZzZ!|w!e(km{qA-?YMXu zl~T99gFpQI?m_p*y4M)9;qTRfxAyoQ@Q1ih2i*VX9(-X3N}K&NmDA7n1zyN?1~qwBhEEgFGyZ5SMk!D z^(k1aJ3c40SnqJoH7_^?N!?HG!{9-~9VW)S$vM|>i?MXI0*W7Xzg?3}*WF~O!s)hVY$P3&^24|2h@2p2fDjk#kQ zKs!v2tG5$i`~Hx6?3e)K3O!^xY67gQyMxsN!w&VIPH;4f0I$!;O&+hrmf&$ zANt{nQ4msMLX!qR!)(Jtv~s+}6$w6)$@ezYP5hT8JtdSY!-we%W}%C%U?rUv8+=5h z84oAjB2M$1PupwDI3iCki#9-OZ=^#gf?wejTw2cGDE@}<7jgDew`GVll|zBgO*r zx$&ccx=WBccfSh*@`ZZTNlxg({?azy#mvf*$O|PRq2M(g=ax3dxzGEncvru=$>zPl z-0aI7)6WNVd>hl(2Q43N-390)JX_&+3@T}v`IQ@*O(WK+5wIc8ZB;X{WwPOhS9jo2 zvDwlj+`h^?Xi9sb!+qb5soJBfqF#IqJy#CL$omgK2|<_+gr5QQmQB=YH4gEe@mT{9e`||N z0z`GS#RuXVz^#uL58-Ny7xF7Jei%5DSpO|wizdIH2R}#&#)_P{BwA3y{Y@|cj_Mbj z`7H#LHdlJBl?OIdxq%OKjU3;VU3+#Ov;9BR*Mm~GC!(}AIiSv0{=#& zJ08cRfKrOFdQzYtu2YOF8y8&F%~*1JzOEhSm7<;+W-QXBO=X$;dhOR?!9Fc-yZ}_& z5iVQh?&OWE51Xri`Hv*v;tBiPvx>QnIkC5ujdHl(CymWxUeHr4EtGv;x2I#pC1|lI zWuey7F7erUWpCDwREN~0JsrP{yWG|O16Q{c20y+nU_f^PsapX!0)us@q;8N4?622V zN|?(l^WdtB3a<|4-&t#8Jl6tQjqW}7(p0#t#8Ei7r_bP8+V!aVE6fgicgwOrg_E==CP_W`+Jlq3G-XU=Ga*);&TPqDcS?|&Xf?{aNQ zy;jq4IKAi4Clr;8LsDqwX&|i>4z<_qF_{`jnhGhWw>tGNd=r<$z4^+lO7yQ7=mTY# zGc5E;lLma@@c=J18V%P{2;(VAqw(x`4DDG1jDDf1Tp5TgMG}|iCVxhaFgk7PA3xe3 zty61nJ-w7$>7yx0AMuSP+`6^Ke5N=M6cbJUQe~o}N2n4hdlgQDeaWj~K$zbvoCk%f zy~zo1AoNbp%LM5sz=CkxaAt~8pg&CT^T!^<8){sEZ@l+>)P@(hC( z)NdQQuJ9hjqR4CU!zVa*zebb82{Ac`J+qpnT1EfRZdH4w;T}U%ontQ2!)@l4E-VR5 z@~k-_D|H`ElPHXZcLJS;Z_%}|H^5KiZHgZb-8zIPn;)o}?gCT-ngUM93Zx{ABplis zP5zAcg#!@DAoK_3*+Z}k@p5qUt&a4dm9mjW1HY6&LL)nQWmf1{O(+`EZps;gQ;z&^ z$l=^H=v($X>;n58agqIwo?yS@ue9I%tNHf4vblxdnSuVbR)dEZmwi1N5Tq< z{KLCJ@xa}bfBCoRP4`l;h_hkgcV{?9lmTTsha@)BQhPdUX+4ku#tZZ^X_eMvHfHjG zFl<{1qwNmucS59ln}@Wcs4M1eMNg`?xyt)wVvoj}V#~wl8lg+GK5Gls!`CB4liury z;lR5U>Ji16<-G{OM-Zo0f;cy22;xjf5a+tE2NA8{rL_uS9J3j078US!q?y7vldUk0 z8}ZP~oR-ExbC}csS&1CxOUPRV8T)ox`$We%PisOk?*zVn-kHbB<2-%PPe7|lRJWyr z`-u$sz&;%W{;+w3lh8CJqh%Eh${*vFM}YA-)k-b)P|d@&=q*qUJkIut-# zVf^Tcv(Do&(9F@%8kfYlQHjW?Uox5vz2{-)hNy}@w9QFV3B(WD#kY%+?X}oeBk=+XO>N=F6v?i*bi=dw zU;@13EaNC?n_1*<%+2W_d4BHPHQFhKZ&f6kU3q(8Uv&B*L*7gyU`kLUda6b@ zAT-LU|2GP+@;>&Pmf4uPYKqErzlX-X_B2R(ldV(3-Y7%17;>WbuBHsx!a}(Ky zHuaZ)7X4HoE4|Gr+264mh-5H?+MR~W2&(YTgUsk3sy!(nvjrRbIZh1bB_nRssRwZ$L;d1yZU*%`6)I3P{##JLE$YL&6qG>#hnfgO z084Nh0ys(z2;dm|9ae6?Bck>@dZPV~ueRU(>-kc250!!cK1=keaG;@9-IQ=(A4)iI zh>1^A!hyXh;lOe~)>6WOy(!_q>-|_u2?s(6JLaS*q1#Og-^-wcBafkkW51jdvfuP6 zA&1Ct;-m_cHVCan2{H6?@2VjiofYsHp}1>bmAC!--Q4mnD=7k>wI#$EVrfYrXZ@oQztbzo^w7H}S^Ma@#+4{f3#$Ebp+;dlnKBwwX8!M>|~SqEbcU)<(v43@4S~xVEj4lN3v>1 zRwaL94nc`4*uSltU5vh-+zKPb@Jf7V|1cT~Zaqi)-1n@8*Ddg0????~E>uoG0p0uB z3dREOrA{*QOKiMmSNz^0SeNbgca_=XVcWOrt>l&LivKY)xP{=&$t&3uA1|0a@v*_k zf3YV%HavMHJL2O7vmriSF#F+SgIQ_AWrr+VE>|EKT)EvHa_46Bh`op;n0Hi8KP7g< zdI19q!D+Z@*V`^4p`*fvMU~0BhuRJ9>h68-_T**kd!OkQ-oi$5SMoA8zQ+xB+4&wf zg01gy!`b^DH=NDyal_gD9w*#vf7d$=7r4+S%titotRNnzN7@1dlJ}~TzY}6blZyu$ zKdW6H%-Gg&=?mJj}LHLH3*D~I6e=~gJ%RiLkYdFr6<13dWCq2p~ z*DoSvhidaKNfx?gfb+fnSy`7PBO}m7{sj!Z+e}{{%~I!>a-Q1|!Wq4>d6G{gnz^yr zwiiNB$!;wEtew{v@X8}ta^bIT#XK&JwpSv)44Wg_y9`wbU){A_h5h)BG`$%DaGOaF z6+l?GfrMR6-0^mewG<{nGhD7z7LKIZ{&?`-V25K@<^YEi-|=C5!8|c2-_aLxak(d$`EsHo66gRM+w?0y`p`v7S z7!wCA+fIxG+FQ2goY*1(R$3G(=_FuV?mrzk7{z$U4ePA#f1dh3K==Q_p@H?K8ziwD z*&KG~J}V58Mi11d1f7b_kj=?~RhK3Uv%SqNhq42Q!pZZiE2qy!6Klt*GZuM|FKyR| zNs6xQt=e<3O**q9oS3hcB2!oAc=wtF9e=X7UXir_<@icX68P6dx^5In1 z3B97+p*QTU{wgUanv^cPOWl5!ZYXPU9%v10nA<8fQ)+R&2HC=$`d5LKnyoiH@tE<*axOqHBSCXlRjuXMITwY7c0UR)Ub|MdQHXI!y^II+jfib z(0^L|g$-cdtItM@qzrexneL=h z587+o{Eh+-K{OGY*VEs58U39{f9I*c^VHvYw!i9UW_MlSqyEBPm<+}Ry?GO($>p^K zc~?vXf|RI7olx+Y;tH0JXeHx=V>yN(!z@F3E5yKS4ZfcNUBl41eH~7K6-bY z+2kIZ&7XFO<=O^*bGh(a1e`?-!|pA~!X!|z!WAVO8`eqTc$Ra;Ti)`Qs3h>|+{2yl z#5}1V_GmuMsT-k_RaslzFiQwpwq=XpI*+a5{A*h$>fyEe4TB_Tjlr5DWwL;??g$NI z$(17S*r|a*UXt)yQ|+P?p44TQ+Agy|r5B)4%-sd%t~L8nA(6k>^We9P8H%VJ_rFIy zD+-)gtXZp`(pKIXd?3XTv=<0^ zt~iivhz3?M3QCY|2!%ujv14!C6^ITZ|8A+q-R+zWJHEqvMP)aLlEHF8$y?)fvc@GA zYdp9!yrLb&0XU%~3oE()6B~g!=K7M7b!Yc^&g+|?cB_GpG4tW}T)7xQIvrtS)7Kk0 zU2IlJNH^DsFCtVR@z%lOj)l;{SQbEpbsrZx=*XOw9lWgoMB zGL`O6=d4@PAuSCNd$#+Mv!H$A(AAbb3%Z$y!AajYIItTcYH*-4HoXT2p6i1HBf3Ww z9slRwV%aCwz(SI9UV$u-3PE~dgj2sz1$SdbmG_Fqe_vJL=rL$vu%cg8pbMn95=_Y1 z8tT3}z1UUJDZ}C}7Qi5J^`Cj<1PQ&0ZdeYDC zG~dFrGn3G>m_Zsn-}WF4IP-`d`B`ggFX+aZgGP7yWk&7#Wj(snucZxEclxoYR4V?D zj5(FYs99_4{=EY$9>=}8ObeeQZEtkDa7T~}82|gi=VW62`+pQZ*Rk*^U97}SV)XB3)EkZy z;oNhPa%N#+iuYQ7Ij%_jwH6$7$0sH~T-prw86xhrvcxqMn104H?m{Zcc5)fANpF*A zpb1uCCeYh6^QqJ>_Wa#a=vjJy>D4f!f3iE?+IPxmcS`5maNE2zn?hyVJca0AIR2D5 zD?0V(QAI`KV*7yiI@_;s;$riH2U&vp>Iu(@OHGY5Hn^Kp4P0+`SINy=pBAaE?&#z( z(T$nWzdk1VK1HLXAl`{4aY=+CbVN*32s*y1@e+-z}_*W!u5gw&=1h^;(sPbOVz@-;RM~iyl(r3aY)nCdTp5*uc z28{Y(=HscQN}PeeTzh)+bf7&JQu9fgdZ15pyY-KXV4f-%+pO~?4c&F zq6^X!a3bp!dIC07jJ*s!0cOw`=-W@p9AiyvFUvXP!JXvDG-=`Ui5~e+ZeSdX2IFSVFS$IQkA!_f~_=<__NPCcK+Xb zs#H2|O>NNolN^6e!%)Fd`*e?uGXuj`YUJr27%sFhw83h~K`u7?q*iy1CNBeo=KVii zh#w3Hdk4EVIWX)UZi9j0@q&TjvBBvV{fk(Nz^>YJx>wIW4Of2-a)vh$bOB+%=nZ=X z!ZhH_gq?laF|^-TOp;0Z>(1#rRr`|tnXO`g>qE90bdP}MwYjU!`&Y&WK-*&;7<$cr z!-TRaIe`)QV+L8k4zHABhzI3(!HmH1f*FC#U^iU~Baj)M4rT<77t9D88*HxIVL!1W z&_@eKCPA|uGJGhmRf9304}j|5WnW~*gWHiI^1 zg3|>kQvN}_*y$_(&A8JU)8EYW3R_5;-|?3YPqS$D)tb??mtoI%1A1<+-d{~O_1<)1 zTR9X~DWo4)k3@Y7KD;`ZiOtIn2+){o4R;o{$^saqW!Y{6vm7bR|M&b zI;;vA&|M`Pbyf_kc?EMbR4V<5$P7GykD!UUj7`Sbr^((_*n2Hp@>y+v6FBRf-iL0d zL5garL4{<_CnR0HqZ~SB|A4bUHyCEOYmaKu5b3U_V@4gM;q5~wq!a|A1FgzSMUxFb z!qZzF7zn#kekYbWZ=+Oq-iQlTnR*1}xxaM3Sb`QeE6ogI!VA{4HT=-;n-86+7a5ux zO^?4-W*C+J*3Woq?E$B+Vbez&XTi5r<$&H_jKZ)e2|-irq|?q7Ai(=d$W`&)CLevq*<=1-l-Ti((r&FNU; zPrI-b-Dh>2lAbl;mGmSFKA2+XF(V5w_n_34I13TJVy78=Ub-171G{6%yDKy}oYT2Y z7;1s@Q}y46$?Vf3*^dgi5zl;3rEM-0oCPOP651~nmxgn4rTT!)P`w0UHJVG+Pr6~- zL4&xv6Hvo}=e_1i?5A6tg}Gj^<$4HPhY7$>{qa@QxYKDkmBytWC#$#KDkOc{SaW@^ zr6YL57Guq|BV=Kbx{IV%yXezeH;q}>?$rHm*m5UlvX+hlKlLOBZ(zr z&Zce`h2ch-`C1wlb}-|XXgr??xE&)U2o^+IBS}wjSWtB;*Ude&oeqbcSZnFJNLjOU zZ%fJAC)+wN1mw$js3w(K6a^oLI|&O@X!XW=z>OhcWSpLKhowBob(4 zGvhUy{H9ZL52?X3^X9gW0fwFl;~w$kaFawlE8xIKdAl^#xK6vjk~kWU+_WPv?FgkEg=xotv}0h}F$4$v ze=WQVy-@d<3>X)4VYo0lw?zeKvPIhpga2Sz*4NkVgOTB6XPz#?y;iiP!gT?QZ|zw< zGac?Z+O^|MY7k=xH_CM%VNzD`fEl~<_Q~mZ*Y;pHDNWFaX~*8QCSG}mH?ME~dKa!+f=zhtNhNBaSf28G=won6erS!-{1fUCzS zdyY50L}i>e8zcyn)?t&FJSx%HPDJwNK)kas{4DbgvKQMQ?>sO3j8p;R**ShUbm(dQ zII(vkiED;P7e~A^IO`kXw#FuM^Y0?=|G!tQ7aNL4?>X$8jdS2e*-Ko<$AUP;Zg5B9u=x7s7a*$*lh2ALHG_{0+QybKsqbS=~&3+jvaRW zyU$Ro4cdt3eu@oKqtaoqDM1t1{~3gc(}8zis&^j3YwG*YWY};O)L(jpFs4e7t{kDO zYGd7ENWbZN50TO%>gO)&Z=f@pBWgv!9KZ=DbTf54rF<;Lf}`o8KWsi|DQ^xj$-)3) zJ~o${YxQH5w9IW0dKh#_th}CtLOx*uis2@9O&%pY;6ZneOB6+^5|~8w@o|Bgg_CSH zIn|r`o1|n6vWu>y+m5oV+to1?xjdJ9`pXAMxzU>S3!F7Ae{zcR;v}n$hbo-ncOuT3 zx4y>DC$~Gr`@&B3r$}&yooR$u?~S-dlyeP&noetLz$tzu>|BlRqn%vh79#q(%7(sZ zLpLgPy;J=fh3DUz8(<-jU~KU#_=j14%}Zb^!)NE5rR1Yw>j<*5AD;0o9 zrP1pb@zcBF6i`_oacYV-oWT8K1uAKr;)71j_}3_!&L1QT0+Frn1f1g0+f0}N-?JO@(!nUwMJ(2FI0kt;?I=7J;!Nv zQ-s$Hx}0#byoG!GmDa6R9IkM#eU+3)h@AAfQ@jWGrVu#>GEW|cu1|S^@PjnzmIH(N zy~)6vL^X#r?w3*!g|s-=Zgr~PAuCXw#y2#{2{LkEYMbM#ZAY?bUl0V?;7me8$Sr#Z zJCk1J`^jLzy#w}5LdO)UU}}GvQt00_R4Rq)oz+ZAKngYhf8dC@@uJlz3~{Eujoy** zr*RIN;Z(!IUrpmKJhAyi{choRDuX(;8Trd;?I_II|Jg$YzIyK1t*KDyRy>d(m%u8mX$m<^E+(XWnU1#zhXNts%KOn5&k-W!& z6NT`ut-tCmgjV10oNrdg>URhoH0v{yVo-~~MR#h9zZx}X*CKsio&Tu9H5U1%tO|$0 zFfPLW&8Y?GihbOa$^LTc3$s4^4_{@A1QEyTCQ&2=0+A9cl^U&*Ed`Pg|93`%m_smIKoykX?DbUDbzJ)!UuSrzg$xltEGxF$dfBUI(>MKr7{{1kW zrb82Unkw`7*lgbzEO9AllV2enF?p*-g0M&IInA@1Yz`iZhEQXDDJ}m?2xN2 z2A@)uZK*$yqh}9ocPOW_#N>~*_3X*0$CPNQ>UU?9(#DUlC4(k4H2B(m!cVTLjo!Xc z(aFSuDBx!s_}M~z)oVINR5-5RKGTYh(Y-Uh$;f7AvXEq9n1oFC8g!2jT@$@y?n#NNUSP1ROZ$@XIt2k!LBrtRGK1~xd$Rl?;#mZK*QSqPoqXS9V zihtVu28*0YZ#a`bbEfQL`J&T1Au=zhDbVDRFPR~F3D6zMVu-@dsi_Ru^^DPPIsa;q z_N51DA0-WY|5FAD2uZ;}%`5y|`vO0q!lx*H+WOQ*9F2R1NrkVYqI*@5bLxi~^$=CV zj>n?IYmgq5m*1$;!DV#g*X(o|s&@tT9#Zl{;xkDJ4S6l~IJvvqY1)!{k{~qvODW$a zZS@ySWCy8#Y!h`fVVk&&7|s-> zDGRi@oZh(FmMO)m(Yc0z2H9>JEwbEGF-1rJfI|!4@%lnjo7vB3vmqT41y&0jYn}CJ zpGlG}srv+f4vV3sa|q)5kPa+-AHCjup(<<-I9-Iy78T?`ok&62{cbpU#U4&4EkH77 z!ag&zayEW!z*|GL*X<^O&deqagF(WOQFoRuD5U-GrxPGnPt>2TtCvbl0L42`#h#K# z5n34<+UdU>OUq4*3jCH8_$@6kEst7}gNqY0mjz9y>FGysGbiWJKQsZNa0FebyoljL zDJCUFOZEvsTK})!A_!b8ItRl~O*2bC;ft(?G!nHWr|YW|EQ^4YB|&OfC?iQ=t^QO) zR#0?OtRvgB;N5=UHhb)D?Tn%<`CkCpL-*R&FWp9Wx|PP}9_9SOok=rF4%@^>^2oAw zz`)FAZ#p7>m}_F_!*y>d=6;jetf|%c`FoT*G+JM0LN+6?@r3e*`)I$9ySqV zRt`5a%ib@_GG>6P^|NH=m}4T;o<5bV?Ue(aK{Z8L2AoqjurDZjkm20tT(x1J>r54X z(e7(M002dw830_PrHpX?*a5$2JERFh&}N`^-HV@I3Tw{tIhvgircmJS z%=;EZlG%5Fh-s1JoYY|aAXMMk-g)5ED+JEx^HY&2dpvCYatHRjcz z{<%#2P|iiTn4O7gPtn>BiN%pWRv2{k4!tN|{Shqo z=Jr4FD5TBp>L~1?<(SSxEz{poEw(h^{zJ8D6O5mnl=hdbaqf9T)Av3+STQT#za~&S z?n&LhMoUCj#{PG@Ua4PKi@utBKahg@qv_Fv6=;T5b~5=Ca5S*V?1=-wp{nu%M(mh!qc z2q{R1T&L#Oyi4#-PAez}LdP}*PkkE=JcFu%@(gDrtF(4jH3yyfzZ10>`MERyAwxFE za4zlRC_QqYGyfk5)ryqq^XiD_$7JXpojva zBs<*-!p-ZQ))p;;Zn_R-_=%svu2sT5Eqn!wLutT)6ZIb$RLFS*OtIH7f1-%|pV?r+ zOgl#sPPZWjbo6(Znz-_a?Lhuz>Ev!P`{80WbEUR6%J^+RBk<8liH_-oRh10#a~W8Z zvcOL%P%IWo5Wx_!=`>?nt&5ROs<+`8>cyi0$a&93s$uIsbxHkZPiofPnw%GV5^xTx z$$!p|r=*(EE97BIsPkmVfYy{lvIiBzzET_3&_e<)F~XpnyZizb(IDUw0XeP7uS>E2 z5~|V5WTAmR=uZN!CX{h18GXDY3k0qv|8iRvfZnH}(e6l?N8-^LwTu|9oM`A`GJ?;l zAXGGvFp4qQ3(%ol)h&#Fs3_MY?#6q9h8<*h`93OaHrtV!)ntLLRg2aRdq>fL<28QF z=ICwpoN3O&ZgQBKnH(tkqtnZU%~UP+Tr;0YxLC-{{hyQ>)-bt@60XonA+c#Bq1pwR zVPdXuz^loZkeE{9e~m;2xZ`Y?j#M={-?Z(jZpK&8Fu*{xX8c>bOt$f#zptIKPXMw^ zMXrVFYMVlHe6;Vj11yB4Ce7mfCu|}!zE(TF%A(f)un~fc!BtBZ@_%K687hNTb9z!) z?P?+^ZfL|cCfpw;p^lHNrg!IeXQ~-C(7Lx-K!yfo*^D|fGwDG5P|=@vs;AwggrN=< zePqMZbWFpX|Go)hg18_LAkivT^rwu38nwkfs+y8t$|zabI?!V4h__96sKM^e(Y3G5 zf<=<&iK4B-bmo!4!9mMya)Y;oZv_AJBoxa3XPX!pnq9SMDaruBF7CgCHd-{KhcmR? zqNLU_=!`+W&-rrYYUmC-C)Q?KZx$p1H9~;0S{l%miM<$^gp@)+mrxZ?z1r+s{KIb% z5*&oOaR|b(3&(qMe1L=fTEU}31Of_rRDGu$Gs?GtVZE8R5rR%msh?QI80Hfq4Al$zIc$$|-rr$bVzAO2 z8_Z&r|E>)dZ3HZCP0mg~9RY^IeBdXb^@}xcee$xZCz%$#{0IDGKB=1NN0ZB6a6%() zHenXCDcz7X8wP^V`jz+U{6mc9UH*-Jfx@n#fR=C|8p@w;OVJ4BT=K3ZYb38uC)d2c zS{{%^ogII%&7i9aozBn~YGY{#Npyk7JxuWjYC)0PPjQT@$WZkq-F%R=1lThaQ5~ zxmwsXJIo~eg+-c2wS^~KxNIiJPi?q)b0b_;zrby?pff>Hlq-a#jDlpbotWmei?sQB z02y)lCv6w#lqV^iRMf}s!hg_HmNC+z@ZC0xUqv##XfN*_?624P^D=@NixGFp51>>0 z)a2YJAEy*ej?r;>fb(8O4XeTDD&e?d5lpZo~ew@|vyHqyFGX4aT(qM3Vnr0`XUf?G($Y`E|m0^Q2uaGl zdzi~{`;*^nsX@Gu9haO}-?3>IDis1=x?)n^`oYn&%>|P#gRt+BoS2IcR^@sa6Ao++ zw4+vz$3t^bq^|Ke8CHO9qm=vZ!4c(lLQ851;a)8C+ev4#|JYaIgdRJepa`-M*V6fK|L2vf2Tr#YwZcB(%H zD~5BhRlyH@#?i)PJR*ln@(0G5B9`%$RS0ye~`%KWw1ii>63pD+J z!v(kW%28-aSZ)A_|1tS#&F-+XX7?sqlDCIr+lX~015Y@kUzMwdleo)66beZNVD1)= zLKk*bIBRy1x#l%Id+_X$hX=z$qzE+*v^70wx?AvEt*NN^kTdNFNaj&2AmRkJRDk3( z#JRuT)XI6WVDT~nY0VjnAIA{@zaDi*;Q~KK{L$b+!K3m!)6DC=;D-{Bb09QK)H$P zMf`X#yD)E6HhZup)4x#8+rnvzXx6M*YIbI{@VBnehY@CJ)(|AvFQcy*}JRiGXs zUeN#Qm+=*tXjOd1!iPy1P^*?aVzbn|Nq0EW)O6Ut>JOxUyWlZDI<#b2Ivw`~9i-h) zxZzh$hFId#2>_2krgu;`>O($;GrXDGycU zJh@4JZJTTIm*ZxZil`{+*IN|D%eHSgLpSVGTezOepM$iqDJiXr`F4{ul)Rs;LUB_@ z$SE%R4$08}cH!BJMRG731e-i4)@g!qyhev(P= znnzh(MX==xjrhAaRRg+WR=S>-@is&O&{z)oG&WMbk1iE7M>>`4erM277}! z!e|`W+U=T$yt{r!c z7Ui1x!%}M(1w>0pWZj|e{EV`p))rqNriKc$LQh>QGN2u>MMVggi0!q_ns$caO^*7( zle7znKi3Y(1N1*sbPe~atn0O>nxWVsOl3@#81_aAdCo8g;#gw&979XhOM9>aNaB=oo8U52zTe4Qt*KG2hOLyd9Mn^kVdSki&(Isa}{bn(#>Dhr)vzNMFGt zjjGlJimTG8`OpNa3DNP*q^})iB9CO`=uGDjk7YWC7%$;L$nE&GdiB7OL1yaMwsj6- z|6_s&+6BaK^8kN2c_53-jJr*3vZ{&Jf@faCHrew>)w z!VX`2derg*|fT;~c(tB*E zXuhqjJ+n4drj)9z(JM0 z7v+oeeIS{gCC%Zo#ns90eY-s6L-Z37A(85}#C{inDfp(j>jDyFJy zPjx~p^wB(Ojt$jsaAhG3o{0&$vBY(uio_jA6e61O2}vpv2yuSo+;gCxG;dWQzxjc5 zT_bpL1QGqk>NMi6z;t|9yGAgSe}RE*sOYQko@*C8VyEN}c{JP4x;bpWrXHa=+c#QA ze!KD!QnZnfnAN67%0UA`v5pLF>3TS>e@OI4>U*lnjyUyypA9p0@)E-``)#b>Wn+SI z3(BwSZZReWdq80H|CDa&3Gn%HgTDp?)aq%!4uW;MBCD1|ND}#VF5Yr}%!OR-uk-NU z%un@RlsAd(7CjMvs(Z51TP1zlBcsW2zs{^;5oH7ilP5TU^~cXt_Eudg8rVc0XCz1Z zHfR1fG=R=Xcnw>f`Dfw*#rAWz1?$S{3>K>A4F}b3t+Gs3O~h)QK2B;r5u+o_23bbY z8M20LMfIPf_X+ohW5r~Rc0`eIrnD8zsm>6y<_@Cf}jZSBi7aIO74Kp2r@+<5|ROr z(M*euuNVo4g8CdGxmGJw0b4_<1}fP;RJb|vp|asGg$nx*A60sR<$nZ~ze+>pdpIfs zt11!`F(i*v*=EQ^6~-DWyrbdxPDsQqk%;92np?{AZD{=aFIlJ!vd}9E_|O>f5&>xn z@wN}EoHie}`74x7Kzovqm}RXO67>V$I!+Z1{U51QiZj0%43f~9jYj_cRmi{9 z)utY#C4d+`GTr)@eL7IT+~3z|Q14$J0sg?I7dfb39yOso6yfpZF&mO53Tu3#aG>rH zLlpMcqP=^ZigppkLfX%lOrnn91)y1Q6qP_s$XE7>=)&Irujm5ne=ou?H%%Ba=D=S- z7c$lh88kT+*()t08M0Sq=`otp*)2E)6VRJA0lisn|7hC;Jy3VGO&BADz-mdx7?{QB z`xuozjH#w#Q${p#=a96+*Q}bj(^spLxHH#}8jFBI?qB)xv)u(6l}qo3r+hz>I0@Yj z$($cZ{{(Cq9ZvT)9C@CIcM|ea#kYSw;=LHno*F_@Tw&3~SECJE>V~C0Ht1rv?a{>4 z+-UN0lp9=z0b3<->On?CQCBtZWU{ubx-c3)oZ~d|R*RO^y!&E-magq8{U#VuMr=fMpN_j-Zjr1D|u39zEmxx{)K{+$eDi?UXv?z1uh#lzB}wfKkW8V2;fAs zFH3hLmMBe~rBrIU>o+}J!wE!mM55?qh$d_3)KnJ!($rqi*#Nc*MWN?N8uJ`Rk*&$4 zL-fO)S-}aFZI_yH47Xis2GWT6mNuKuqEjh$Fn_v%P^iw7Sn^JEM&;mPAzx#i$UxFi>8<|Bk;2?~g3|ZlLxW;%1)V_A9UNy5oCdmJNtdBt{|42o;~Nz>~A>@Qm0hq?ef8r zwoDM7Gp>JDZ3%77fSy$5H2i|}R$aQU`Q0dfNB-CjY;-(B?B3pno@?<2rD3e0UJ>=qv(V)5f`rselzRYf2Zpmr;Ymo`X0)&+RAg^EMGA0WT_{qocptoz#lXy00#BVt`f=e|IZu`2$ZBnVHyBI)!0kum$^D*NXCwdc95gW0WJ(^eo71YEkmLZLdC@>OTyRy;B9a8+Pe%uW8? zvL^>pj)bwjooQL4HIYHf7}qA#$HF;>>11bl*4Fae1LX^57A>=b>#Ueov~12{b#qJI zhaF=X$*Z1A{%nX4c*VMMXT=-NCF>VV>~dD*vhWA$*VS!}HvQzL=|A|%k8Zj( z`t6Ek&J$=?iGNZXJrUJp{pnfiLyi;Oln!xzffUI%%}!KBjp2hlp_q(fUeXnB5%^ld z?aM@*x@0q-#W$PJHFKPjzggsz{N002N!>E1WL9$qVtEyaH8Qeqw$JO5L&rC>t3LGr+RKr#c2{KE}+!? z6hR7Sel$d%(mnBM((b{y;1%!*b(tbl-ui4}(`C&%Q zU_m!|9sggF*Iw!mcGsQ7imP$#DrHresadv6f62KZ+p+Mlk^pUk$M_ zgho9Zj2#f_>*_dNJ|vl?|Jcr4=vUX|ZD`niA#=nd-AXCY_t#y~H+omZBDKl%x~EWE zCZ+A@Hq9cn7M(&1Z-1qip*YRWr9n)GkolN5K4!yt%m$$~vq7^)Dnrd@shuJZ*(vhH ziqn`2=8~N0z`|9W>!$lDDRbMU`@LH zXZf?Dr?o1Y`v+&frbX(X)Mk`0Mw7GY3#k%k8Ec*3--9tm{`pO+v>h0{}cK^bk*im2QPs(kiKawG*e*T$hhw7F1 zheNt2U3)je4^?ZEb*OPUX40L(6dTfw{Z4v2kYE3EZgvFmwsN68YezM^Jsy4dsRHC^HHaeJHij#( zYe;)sc-# ziLiHF@pCuhHI-I+6GlOhL9VACB*nApkBM+uP|Dd=jp3Y#>es7BMU%G-M^nH=a;CMK zFpx~(c1$YKKTMLmWpYZj?IcoF)PGd_({S4a=|`qTw~vZq?Z`MMM57*BuiGxwYcE$P zjROFacWH4nIr%=ywDpI*H5KSrS@3nTQ_3AGg;f%zZq1^q*q|5{^AJ&69nCmQMU&Uu z_us10bis;IQz1&h5><(tMuig%?)6lNf4FdrqjDs9a~B$L)%}R~Ni;Fer~PONLGc|c z;o*S0wKB0%2`pq$*OKA>QQEEM2@K)*gqeZ9fTj6SZ{Sc`<+2zGvav*!tqHJtUl+K% zH63U+aB-sMJGF=D5`K0LzRI=<15|Jtg6XeP=|Q|_0ZC(h2JP2+)=O!o`~Mg1r@4rD zKBe<#k20D68STFgdI@TO8SNiNHPPwgp#5)l?Ml;rk$(3trv30){kLd;&)OABT$Hjq zBGG=^+VryG8rr{rvYGMSvC7fOSc>)=ECV}5&x=LAoZ44Be!Z>9rOJQNj=-$d|{i_?Yyn_HNQEK*QSo`ob^`F%vSzh;qPPq zw7n|gFTI=#359^g8iAf=!>icaG?Qd5>PT{Lxlk%hp1Shpx?7`v^MfBo%TBK=Mj-XX zTLwXyofWflQC?5cO@B{@c$ahg$wZ!Z>(`s^#NVrZXb`+g^~_zZ>i!DdUMr@Y=vkA- zPh5JE*RY9V5|`$A=8@l7acRg!ThgTk;g)R!TDFBECpNcqhP;Mtq$2oKuVDu+YZ-Lf zxIpb+bDT@WTiFE%ZjW<34czY7HqacWQMNkU8g`R|y0g5+I&x_ozB;4rk|9|Eo@Lbu zz253maJg3PQnxuZj(knC`AMC}Px4|6e)e}7&&C~1UR;C#nbRmPAXDFo^3Kb_>#Vrq zG%u;zv>JTMS3N0=c;=`V8Pnp-dxt<73M&o=)_UtpyE-tz*M{o;gSDq~==^SxI_4Ui zr_HzTO#R-Z=JrMpC(-1cL%4n`GNYZkgb?G(P#|P>AG*Qn->u7K%J(OtYb-G#1U>x* z3uh&@p>Ju%qRPYx-do+Ylwc`cs>DQ_`@UP5_^v6s61ymA#{hGAWj4+!A>SglezoIz z$eFn!Ijk0xaI`OBrAW?dHkl1^zXM$u70pg@Rl5)6jw#Sa6_luGr)?v8+Q$9M97Slk z`GO{Lli(Mw8ER_5vB@~Fyp^%X@1eZi+wSy+V}L<+;kq*~PJPI!GdSw5`YcxR-Yrwmh=ZxpJON;2Wpd_Fdo#hx=+r+5n(4YiR}=gF z?L^ikYa+vRF>(_yJRH2`^s2zliUbyCR~^xo4#i2avfZ~9`dEuyC%4D2Q+V#@pn!W@ z|0b95?$}PfL8Hs{LmG@4^GA8}(3ZmvlNRSUDwB1Ai`#+^6G2lZcg@MH5?WCGU6}M0G4sf@S6{^hCm=*hrP;Vj4IeFI(XUF-iPzgp;Op-+EOGqKT8O z5s#8LIH)bs>hE21-;9xNdYv%)^jPBT=ydJ|?(9bM+A2u|3&p$drm#|XR@RkX?dO`c z3oiBsHt}7A7N6SN+2Y=(wp^TuGzCR|cxL(h|FU*I@KIG);?IzP0RuNEAhlSr#WquI zC5kO0pm{JOZ*T^%fm<)_F?9eczGLGvXJ=>1f8mvUD1y8tkCx^nC1e*scy_Xxa=T> zXdPI|j)EBakMp=n2F>MohJ9@@h{#Pw*N$@LzryRdpgkmL&n_emQgrWZ{qNPZR$~cQcVxq|~#SEjF94f!7I2`}6M-y?Hq}6?+_2j)4 zTbHq zF8Bl#)#Iu7Rv%x7QQPB^ zm#E%c5I-xB6A))1mLNp}I=P^ITnb41^Had~VX~lT2&oC!?#aM5X9c>d5Xk+CVpPz~ z)q&&9=jDaI^b$|5;#T0^9xCUm2`fuWKXhqHv)0db(ZkE3%sG8O0!`U+>5I-wAl6-&c`Msa>M#{GA)5Dg!~04^Th3 zvIGn9Hw@cq!sxidP-~}tlRx9W5x?%S_#D@Iu{D0pWAS_3=i}b)2zz~I)psD$VLnXR zf+5dOW58ab2r`3(X+1@@L8!aTun&}O6tY%pixhuG4GY8i^f&`DP1ken`H=3XK#psJ z^|S@V8-=i|)nVtXPuST{^ubDbzTIApTQ^K!ROv5DTN&Nx^ z%aqcl(v4j0{`uVM{cM%EBuYbZbH&)8Gij6i^@mgDzZQ9CR=i+{DD#;&i;3&IS~9na zECl9V1KVO<%#Qs^#@-}j9}_BXlS-9eJ( zI1_fcms+izbQb5|){Yw$U-DRdwuXS3u_b<|U>znXChRyTvm4#0i`yexX9&z(r0YmM z$@2bhR2PhwK@hFc_qpXBoBEK_BXr|?2JtE7Dcc>9f{P9Xoq2~)@c@jW)3}w>(*pnD zWf(6_IKMcdL&c@r(z(r^W=R;UOGxo1Pdg+~ASCdN2!thEHgkxfWR_6Vnbe`{9--^r zAssh;uSeb&5Nj=TwmX@%!_vm!ImL~_ICN0@3q+UYoCZ8o=jWDZPBGP~IuH3SKsT$p z9)Nt6L-eY(m&I?;lzSYoZH*?s#dSF3skJ}#^v@_&v4EQ~NHQ#lJ^jhWDkeH4KFRO@ z$z<2sM@B*aj2l$!7*jyT;Qkr&RBW%CF{FP6-D-0)PIEJ?OzVb}*U_Wxvtiiw9C zjSTIdag~ZyyBWj!XWS6Eh0>?@Pn;RKhQy-&iAKb_oYdj{Q-cvNi6iW*3>Y0PT_;mTwHcP6V+b2 zvF7+tb>Btee_^Z@C3FC}40I_Ki(7BJ$mZIcXrkTkJE)eQN#$y_d?qFM@F%;IM=-JZ zJstki4tqq}#+|b_%w95G`=Ps%3H_?IL*nLR@wt28v}y)+uds@pC-E=gMKeA9v#>Lt zmd+W}KZmLP2rQ9r^84p7gPrM|g8n&v6%%eC-wf`b1O3MyOJ@z}9Sz0OIj0TyNX34b z&MEAl144@aK^hv`KW933jiz&k<>pw?V<8ngC!KYAZdUZz92Lt?=M?qN0V!oeD-8|r zp95Bk`-S9;=$}L9#N|kGR9}vzXJW33{UV)J+?SWw7|>ri}Bkk}~W)x8gqU%Jt#sT$V{YfJ>aTimyv zX_ouy7Q3BdL2k>?E$D60??FO$KZYGRc02X+<66J8xi}a-!DWmAbTUsd!1|m9 za0Fdlup-mrV#Dq7l+1wQl|ZbwufvsqtGBPimB6Z(4*$x^R%p=W#NMLBz9Ighn};6O zzq{=niT!NiB5n2l5xpVUVf0eiVg1w*T%f^z~aX5GJ}K&?KkR&V1b*`b^l zTiuq}TRfELpsPPI67P;RhQ1n%e|JyFo4Ru_!ez=d;?*vF7%x~f2$fVAvI}%>Y74R- zLKV-B&~=kxYjF`|sl(aNbZ$JqkUQa|RYH3>Ud=r^i`v+`VrZv{w;{WSHKF2|!@lTYZYaVp=PPW7)(C-yJn#9PahLcV z|0M*bRqn{fbhc>}~9$Y_^r#8a;BT&N)5G}c1v2c@qDJ0Uq zCo&$B_&9e0LfGY!m(ow^zW^Xv!pn4L-k4&&2~(R8(MAQmM}ofXQufZ%-S3hfiuvtD zzxUhW2mI`b?L{lp>cHccS{;5Sv9}QCmDPbJbkOu4!kUs*sZMnczb~da(~0qzFM?Twpgd z(>#VQ9z1kY)H+tI?meH(7iL`j zYsLPPmz4X=aB;A!pXu{n%4`x<-CeXUpE=df;BNs4G$@ky@(qj1fVG+RYO$L!P^3WG zn3K-Q5h*MYM35ZLCrdWJYHis7v0^5kb=k}Tk_B=~3d^~SNEWyO(#1v6?aa)ny6^RX zF0W8Lr`uLq7NXyOc5_bA@1Li0a{8U__HE?+-EQ9j;L@2VcYD5@X~~EOc3Z_JXFnYv z79lEpKASlJ`m=J0m2c0+)HM(y6H5v^f{@c(VlC~o;iHj*~0`-f@?uv!NnSw zX>>&XCH{mAIK}%T0II0d~ z#Q8s;z5t8Jb9XIhLUH3vjfu7vnI1fr+DtDS5bix#dK#1NOg$6z^mtQkHL<~v<2$PE z{aE_hJ3KP1w(87+py~fs#VGvmm#mT3xuJQ1$e)v3xyD^0*PmJFcWynCb--d}coi6( zIdUp;fXJKwsB_g%E^XPba5%j`rN#W3u+I2^B?l^hFY5{#u}Ft zTufq!#DhLb#F6oj|H(I-p7vCXKE+25B#gE6C9e*H;2Y9-b<+qTraybsy|NhxM;Zg_ zx$6fFG42ly8dkISw3>wF(Q5flqPISG>!3on0^@0qJAS;d-8Jh+tNiv&E9?Vy-b>^y;P3mJ@qz_nisU1`s~GC;SIBe1&)9MCSaQO@x8t|yhgG%??&gG7a5cJ4 zdBBcW@F4ytO?JGJM+B-GX1N|{)esv+HdCf;OvJ`w8@#y^jI7!N zO|%C&3c~DnGUil^{7v4+Ot@%=P_32V;=Yb~hYeVtupzjq>{8Sg$%T}+kFNcX-~H}) zCinjyFcTl2=YG$QX}~ARJigF3hD{x!?h|(>wR+y!#YjCI;&*sO_PWpX93AkPTV3y- z_^59s#X-MOrahHUK`#Djy7P>hse^heieQNz%k%}BA_r1qbjBFTh!jhPn-0ru;yX-W z1WA=5D*EaXbUj5E$L}s-3zM(zUBkP*xn|$dn&a&iXz3R_UG%VyZ=n0z)6H;yUvtEcuDn!~_TN{=M}d>rqH zZK?dk+k==a`?Ub^-;N+r36SHS=@MOqr9!340Id*f>*_wMMYJ076L-(4< z<=lqe1ECUkjbEYo8utT8(q#}-G1;wREtR{%v>AW2jfqR0;c8Com)T5MH2g2r2l-__ zb$g0e=-!H-WYjHmA?<;j(;0b;Kf9kQHBYh=T8WIxJ@SMZT_e%e@+!D@MVBDz@&OVu zPLXaK)2ezc8M&DGlmCZ5#v0z~U>aEQH8KWWx#^D3ea-?_4qJ_uolxz10eKFq&?R%{ z+-z;4ZanyUdMoab`E{-ksU)#B<3^mC)~7?txZ1!q+pcn6x=8#MEnTs^^?5FeIozDG2oDpHWkZWo zw^MFTe9}e1+706NIK!#CDD5@*$FwJnpFbH#3q&WI;9>(?b*_WzyW>iLx z4zdPEk9s2C#~oBEu`u7@RKEfD3GFM?cT`QQ&4SK-(qcc)oDHt?P>;vj8+6u5wjKh{ zIewVy`bLvoS8&aB?kUrS({8Xlv;N|4u)s}qW{eem#wa;r2Z`rcID7Z>f6u*yvLD@_ zE|mSZ{-htZN^n3~JrdcnHBc!_L9jelBr|KrtU_3tnb^Zwps8hjeHHf}xotQYU$j76 zj^$7I7QFG>KZRbru_k`P@!vcyRms}0W-<)$g@=Jf#>+V91n|C%O{Df<{MpGgihgt~ zZ&09VKU<=oFaa}uy76eE^dhZV4cWgLue0CJvW}orJsx*t>ATT8zffNJEe_fNOuDob zYvL9|;mE3fKI4Qth3)`GP@WkT*+nH5HFIUR5Qzno5 z-Q>wUKF%ZOt>tkKj}R1HjMeanX_+P7Lo-K-6OCDv#tUg2)lVKjsc+=cy^u)5?>Kwl z+0D&eXZO-OUyrH6UA1T{i>*8)2I38bcbZ(+SiU*v-MW@R<^@%-%k&+z9j{;1heu3bD_73Q1Q7mUd6QwAFCAZ_$lFXd}c9!{abPY_8eU~30g0^z}hQ$E(BCv zgS^ClBQRw>4BM?5vKXYHDi>~l$imHVW&*MO8HnK|>E4fcQ(kM?ej3s1xG2`$j>#G@>~gv4FKDD3#ogYz0hQck|>8 zm_a}wCSGt5Pq=KoZ8VsvZ(4FB283(_s{SfI#H)(-rCh~01|dBpMv%-p>`QQfZflGv z*BD`$`7wb{&@P+%{9Q7Ac3fJ;O;IiT6Wr8zkwoDXQ$d%>RKqAH@;H`4hBNm<6PH_H z&nzH|Z!+Y{dvHjz6gkae$Alx0@Hn69_hNZ3Z zta8UZM@*w@qkysJ7|7H+1fYo7e z$a!h7OGkBs1ze2lD1Bz|GJo=4*nTbf&$KE_$3}F`+{ZgsYURt(?w89(%a<6;kW1q7 zb;Ufp*>cO&>AX<+6QgB{!k+bhXPNFzaBrWzq4j@yy%(r{dQfb$6l z37V)hHIkm>^oyKud^SC8mR_<5JuI+}_6!0OCmuomtNO8=^tX;PrFMh3KV>tjM|00B1zymTp~B5X`Ulj( z#T(tGGzwXg7;P#6ptsX8j+%shNZavZUR1-YTD|H{u)F*SKgL;IOI0u);Ic|mro?ZN zpR|a{9SZK~gjO^*J8M>uPt_n6b;92DyZ3!7*a5iT$DzG9qypWvAM)-oaX0ehg;nT8 zrbccE1j?*hj6gqze3n@;*L3Ebyei#OD45IYVvPqfrQ76U6%m&V-fyQa|CCam1jS6{kL%`a{Tgz<&v4QJ z@@D|l=n4p0pnxF>xVanC#gK$XMUG81{7B+ICPmwuT~SzMTsfp~4mC_%MwIU9DXRLC z)Fl1w?`c&AABYRqRD8vZUybHO^B2Fbq5+=J5wYGjr#vW3LESrsUTLY9ZP^uS`BYIW z+Ap2s67PfVfFC$VXxN!!dOPf8=LoI(?Pt!>OR`;eju525vJXcS`tBPDH*UzRo}$yY zS$b2Z!NaIE5_548A7{D0Y8Xc$cTGV<0>kT9OjnKMwTF*VUM51mhP$SbRlhkpS7HJL zxs<2w6}{X*-+KmIrt`>P%}8RqE8lvd2Dwf=uGd;}`Gah~FjOxej&vgT(-9hc* zbqCqj|OOUMBKDYB;>_h^QD1@95le z;zfyhK7_Q({m%8)8w61GM>o*ZSBVhi`>T4ix$4Z2eXzchdx>Tc9p;SG1@b}Z#!O1Z z=fj?lg5Fm{b~5BiqUqLOwN(FsMGN!h@#sDeOzj1+_@m>|^qo3=h1t<#CXNn@HutRb z;GERaLollG$?M(ttLMT>?VaZxBpLOm>DfZmoH_%7S~;kqwO>Z+MNGxXZ<1xk|3zcV z^L?mNo2UhSKok{w9gI!>6MvZU12XgOdYSwL%u72eu||<&0WslxAA-2D!pU+j<)c-e zv4~=FAH2CZCTo^nG+0n-6Dy>3w4EgSokDO+^XBMrgw&h$TB*5dn$nS9g}f1=H0z3M zX=Uy;X$HF9!nq*L%=Eq@)|BQts(zic9oG^RTt^6+LkJZML%!S0imOk_`Q!41X8Rux zVEcEHlc}WNo5eN^iNeZ> zPbOh*W>lO2QuW=yLMjN^Uk^H0nzL;GltRNBHbesNGzH8>Y zu=8W#>CzqXA~o#U7rK}PI4em^eofESDFDrM9Hl@I^>G^3Kgg_B+_>ASSw9>?PX=2# zi+Zv!x0eeO57L1~=@?iet9R`&p5e%)q$4GIwuv*3D>RBAx%hx9PplD$xe$PiT?v(q zF_N3j({}2aAg64S9j)Pk?n>v`&QxN1MITgt=Z$9hj9bk7J58ib=2hEURVDkHw5rlFZdlaf9_&r`h=crMdSn@V z%bkjT+Rlo#I-j(=_nU& zY(cjV@U-$h%sy{}`VGrf|S2kBlB`ap-e%88qmJ$^?(M;%jOyXb0{=<`)4)(Lns zRazB`|L$NzHdwKM1MFoIxdLAN|9R{(bc^T(r*O{h^M1z&5!+T-rtJc9bfRD9D@xMv z&?kY@0FeX1A)767w&y6J<&;b2j6@#}fB{xIwh;zk-jr@CwI=0-ko9sGCjQZ zny6Lj;Y5giT%!z>23;3J$9hn1K!(%-9XX;81e}YOy&-!0aebKVBAoq}i>ygOD8X1O ztt`mQi8HfAtWY(QFW)*dFC6&pJFw(S6l1CMA26Mn6Jtm2&UfyrGRwD^?$*}v7g7oP zRm>0Dv-=uN71Y=7d+YC1F!4XH;LHDM2i!e19e4ZCnbC;IfY{Mi!@Gd$psLwX3)Of9 zvdo3-;|)mkbMb3EzD?ERWLz8xU)-%%A5UwFV@Pu_yS2_up`9m|1y6)$NN?ql$~fnF zf#;M+c1>=JSBNgY!sj-Kr_ps5;H&%^TzPT3G!=CGXK-94bOw~a#Vp;R>P4qwdfN=r zCh^Oe^4P{D_k`S*OOFKEXX^iIN}IF=r0Qb6pLa3ecbKK!mFJq?*Ms(PKEHTU$g_hQ z&{OD^2yEDqT4jMHm1l-<_Vc}7g{8kG=fv z*D0Wp)RH-|54Zq1OG9TI9Nb&l#0=$Eo#)J~N{x#qdhIsJi@f8^sU)j=kaZe%zKTI~ zMCPSW6k%63crI}4Z%NgYJ(#K%wKU4)=ggC(vHY63I$g@CWt$k4Ycgr#N%u@Oi08V- zk1IXCHo=cM6YZvq0OV-{KjJgzn#3;wKlBs%hs?#>T>RN&I%CZX&Q8-H!r2Ddj);xV z;vYhQ_kg+XH{Q|TKlk#MKbl?dn~4w3FnznKW{H}=;W64qL6!H$U;^Kv*KHGMi*9PT z_#UxM>t^4UD&(x$wyuMSezo0Fr>#}(+` zjuo07)RCL2VY+Q**C#A^?0}?d^36og8M@H}X2((DCQ<|(bjhi?p7Khw7nHqzK~Vu52!R6tDVR8VM$pqFZyiU2o&?{9hDy%(igTnMcH(jiv5r;XPD}d5Z(HaT zjjjWk++0qj?RxXBaap_zKRG-dv`@I$`H+6;5;)W^;W_N9nlM)_yOT$wwQhn)q4J+R zhtkhMp6f{yq%&Im6DkLZ{*A_2wCg4a_@xq4#SZd_IRUeVt2fmr3XDdob|n|lyv5KF z{`XpnR!x9*ZwNaT6Nq`URP3&pT`yo&4O*NNOvh+gDumn5)S8XcfT?w@WNQlIImgtx zw$Ie+j)*P>%l#8B6nmXv`zKVvPA5#vkgDVNj1Af@6a+F>4dvxO1m@J`u-^&zpw$2# z*jfeq#;OV9T_q-g8zNr_+dxNx0JsL*XW+`wFK#VYl4tw5KY8aHPWkGJ#4 zCkxz98g<5_bNN9vw~`;CVjQWsKot*B#j}egZXszHSEK}6AsGqW>+bWDUq1sB6M-b? zTsv2re_a<5q1Kp1_<|7>K&>oa7||tg{o;%y&5V7#9hDKgE4XNt>fO42EQJ-rG)fcE`FDf_HdA8o7T8&iHQ8$gDqEFI?SU*Z# zdGm_t_A|d}r-bmT3jmNPH~pR-!|n=~zsoJ@H;Uyv7@stRMOA~=StF3?t5D7pib`Q6 zTeD1Y!+Bsx84XEb=FP(Yg3dETQHS@?HGD_ zZwJIMy|qpQtPXon^frg=4(ubo zZA)(P+wFeuQE{=+4u3iyDJ3GLeRW6m*?#+VzqdF0NvaT`vlNcd zF0Ms5DV5hfC1O=@s?K0>zRa={T^%MjVf(gL z?MPj0cO!7F%M?zHBTPrX8m*^XT`)4|1nt(uA(hMJaGS;lj=oHk6K*jH=$TwCz@h!2 zG_h0af2|(?h(n|rerkcJ@uJhv@nr`^aFgEDuTMrq6qQ2V09^QIACXr;8TmV|0lj-{ZARk0G{wa)#>jVqI?r!Fv&$F`9(yXYoRM-dTA&U~?%dKd*!p;%|80|O) zc3+79irjeN$H_V9XiqV}oy>7RTQAlyjLj!>%)V3lidnG#tg~3q{wq$BvVs!DyAmcw zzgI}V3CNgU>kMc1g|aCaEGwJyo7>4{y)u0M37--=i%%r-La=tdY&=4Q4|q4ZyAV3i z(f+zX-AX<{@haBa!@zc8s~P`Q35J_WKuJI}6?VrlPALBw_B1fAIvgU&-^X#`P4 z1PlA>5+izLl?U1Amqv802BT{DAq^(0`5<=0(V~fp-5`BrzV#1aulP0Vz%TT;{2x%tTsTxL+`*&D#@~F0Zw}(o1 zsQQEO&yc+>!_e`C|6dFxkMJHu>#``BV|Xu?E94I}ZNw*wxaxh(;&cKDs& zKikeg!sUMp+1;44mW)AJrs{*#PE`G)%mA&lr!HgRT0-bN!1x47IZH~k+3F3IejpuK z_BdI7`-9YJrQ0Z9`8BhAn@PY0`!sw8LZ#a(gLIfRNP>`{eSpt>s$%zmoyi>n5*Xqz zzV6zE3s=>qY!e~xF=}7(B<>g`+H9~R^<>bOs2UQ2D|-{BWy^uVY>i))8t>C!{Ge-_ z^Z}Q!Wmie+9YPA8m$QJ;QSSrxk}4!D4$o;>O{0<^uPCDt+a3l!!72U;uUY4baQ$J> z)?{Tk1rrQ=X^qG~ty%;YU}2-8cv@&>(*5=tk!&+6djM$9K-Zo8CfH=G`Wtn?zh z|Nm|Ev<5Dp8l%$7=lLvOs=f-y{GBEACwhOoF?Tg2*zktTYS`>z$ptcdtJ!XxVl|Zg zpU5^is&p^;(;?Wvcd{5J5=p4^s01Bc_FHlY=;hK!uh0h$HKZ#1uaS4iWTj z4B4Af%R$txc6MJlbS;}MpkB-$!?QIjZ6qZ&GbS*>GT5zP*w^?|fkDSQSt`5wWE3;9 zI2^A94u2oVkRu03XoJ(@8LGJE>CQ88;aG;Zi||CE+P5mt&KWY`HcQduwO5U_52U_n zA8-fOT(vuOk!O1r3aPz0HE9XiK7e<@kkTe}WM2XngpRR`#ot29Wt>Qx81}uQVg&-8 zQXx6m`cSIhfrCXef?4^7EVMK-cBlrKym-OI{e^7g=G5bwPq#3w{op`E1GBVmG59Ye zYS_0~+OF!YZ_pcg0d<8ze^>JZy@BRXwP#Z8F%O%?=kxgUqWn?eU9~NF2jNn_9cuZd zl=e2;9mxxM5XK@Akc6?+Rbxc#KjS``@!K;Zxu{QtzgPoh^8aG?@B3fO{;cx4^z3Wl z{A!s5OQiFxE>}Vfmu@kA+mX&Uq`uKd`I`{Vziw|w``EW1N{ubu*1tyUDQ$Elgx-d~ zhX4|FJM~R>_O(=QZK`^G;M6aP#U~AtMJb0C=k}(4yTWh37q<1T&ahXDupt{cK_`r$ zS~7QKC(ilY`-xr~GICuhKB2iKlK)7)#v)6$^|F1*&co2Q5OcfigiLbZXb}};Os=r7 zY@e(xyD1Rnlz#o0x{94S-5m-$?Wp=(P73ISZdz8bU$bs$d@}3?z5Z$OC$^N@gbhxj z%F5e7lbjx9Hj6v_c6Z3Pt2!`4yo36nle(01WA+ZdzWW0C`ZU?Xwp4vXdfPVuy?sqr zpqBp|XcQ{%2zspMQkpi6I0rj7`3MKvrYa$GPxgT&)RV{~>RO z_G*1r*64K<747NYE6R=x2iSTGhZudmO`5}{#k>n7`Fs44k@nx5!J~9QSaDetU(j9^ z!2H5S8-j9%np48<6_=%MXcXySK=PMTc)hzud{)fCTAOM0FBAC+=5f)?<(%Zvjr1>8 zu~W-AecJ6@y`JRwotc%!OVxD25Pj6L<;6(PcqU=OP<4Y4M77fPZc?p)bJc}9?$xcl zg`FQx4E9kY9`uut?NK=AN*IXY;dg@0q7QNDHA{D~5PCT~ur*jdA3M?OqEz#CSIu&F z0WZrgfF&%n2JzWuwS2a$-V$hjSZ?HG99M4~=>P;ztjl;V=;Jc@aXcj<$ zAQ+D}8ROfH8cyHb6?U|@LojM}_g4JCaDE}%F19fj{KDixBdrQ{5@7C&xKn}99YNp5 zs&V$~oP;WW3-2(-9P({c%YQ8`m2VAtAOJiA=dUzNJ5+rcsfZh;cKSg&Xr>TSS264x61mZA`K9tv zc>tI;E%_pmmR&s`l1}_uxacMfI4JNa!#)Z*Z8)xr_AXgtX2_(-nJmJ?TGg+~e42K+ z(Qv|_y2oVUOd*LVZa*uocbuYX(kHI!M@eN;!!i0FLNH%0dit;vc_Sce&Ox#bhcn(V zMs|pA^BQ($m|;S>EdL8HqRNSLE?sn%&I9?PEW`dTO0h;=G1n>(ZKM7{{lfYz188_u zzhPpSiQ){#t?C_8u;=@>tH%hv$8k0FSi;*zw;KMBltoh{3+tDqI46jS>lNb~lgQ($ zeuGY`UWM!wcK*%P)mblUT`0cJJM^6Vc{05cO=#PM{EE3#^CR=*%;+-N?s1~?TH=qq zeMRa@ROHFQx?{U5hr8;X&1#vbZ#8bfeRrycde9gTB)Er6NHWf=d$v9`#7OHwE6=v< zwyyS---}#`+O%;G6SGcqr^kzmT-(^#odTfLD0LXU|FX%ft$sZ3o$K<{ zBZc-?&#%Z)hMbE0`f1ZW@1Op$9`# z!YkFX^)w_nc0qV0OegtkY1gSjwCglqy+Xw$@DgSl&Wbi6N6WGQ;FLRAzujB1>b}4@f<%TjUaFBw;dgaD za1+nU+odQDbEVsG<&m=oVc|`&&+FWUIP0yEacis&Ig6~ebbpz}6|{#FoK#>Ex^($^ zy?FK{?`Gl1uE1fWtB(Cq9aSo?Vkp+1u}RI*xk$s^imLjvU0suSTiAieLDfbPg-Y90 z{a0o2XI34OCFZL2pwPaGcgb*tho)qHSnoQz4ei3rexiRIOt8cam*Cw}R^J+mkGsym zsTm=GeI9g=`!t7Ro|Rh5>R-ok7W>Aw$mdcQ^*Ohd9?51@SYu63leizmCy5?kDrl}@1KnZ|~xF#guSGJT|lvx-;W%sltuft5i7W(pt8<4$;) zXJc)*oXJGKmV=pXc6eDDN5Y~SmEaVDD*O_}ApR{7k%hWU_eA4P2q&xfvqxz)7~CB`ft67o#-)rAP2r-2sloY6NgU&~Eg;PdSP6X-5C+i^)w;5&SdKoEa&s zqDfb;qu@C69~SXJ?%GMCvZFg!IaD-Y4Xtz`=zIqSXWlU08s1CV8W1IsuxgRt;e zv$q3+T0TpL7Oids{jYH8BxVPVu&-gR_jL(qMDH@Qz4Ke`La64-;Ga|wg2dsQ=nrimp zpzlso)qR`l2GG9&X$9@KPNx03Vrlz}LX#&!2l-z&sq9tKe*w|I%Y%R@THT&kd3zQD zw%p*A6di_u+m>4}l5(S)tjy<_zL+paT6kP7>n1hi=o|l%a`IE8a?D)W&6tOsl3pOK zs?z|PKuW$$%05b_Cix@%73XN7>_Cmn1?N9Z2x6e1mTzY*Nq$d&AHT|D`nJHY;ZexD zvKMe%vhZwU>)`7^NFa0olPGm?OlAR{RP{d;Ok@-EN8(>FyNz;s)t&yM>FHm>?Wl}j z)z3*6{emvZqBF3hS}yk%(9Oo=BK_d@TBAXYphEI;H<<{qPJ~m1xa(Ip>0_hen6<6) zA5atPbp;RQDkaX;Qv3qFYCI16ZclDtxS}(-L%3+}Mjb3f82RlP%h+I$ab1=>}cO5mw%noTI;GO*qB3?v@v&Kl@neHP;pB8g%Fx zT?s;r+qLA`y8ocee=w`bWiqvbK&3ob$(8adEeJ;;c)y$rs(Vmyuyq5SLoS>FzKh;x z0KQ+x{0p)J)K%_r3wNcvLhwRv0kDmMt6f`ax^Nop^RMrjG_AhfCiu5f*&?hadzkW! zP#{>7?p5rE(j7uw+xJvu1Vr*`g0_}0g6`d3&a=Xx!fEzY+Jwio>9RvpnRraW6%P>^ zH0?_y{Lgqvyvb$pTPh7Z_ldj$gea@(pA__qRzI9qsSz-Oo)r$IITai$&8cQfA;%q2 zzX2Hz+q2qk(c!UO=Cr!8R`z%y6+TEb3HEswRxnhMAvOD8*!vfvJobj-|1MjT)U>pd zi65^n`#I^7eV<6oeLhjyK}dH2D?Jt%Hhjpt-?>j@F`V7xOGkg{_cakCx9Lb`HtbP`9jEEp6$GNrlBkU$FR2p-8F!>sFp9Gy6^F1o$hV7 z@2jE57_|M|w^qA;KQB4T5Y0t0So$eTZ1UUuac3~~s-CF3HzenS(;_$L=$3;+6Jc~> z@vw)3TOXuiX}QsoeG7-oba<%bkMtn7DZ3N7J^2iO*srV-(&xs&9FrV(t+I)ft=50`~W%PC)~JO#1}18nYBHhaVvY(qin{4DsYs|*e=#e zt3CN`RK>Cr04ugHqvaiNDG5 z>(Unaa@i66miiL0?L|!7bQ(vkcF zHL_K#{Ja^z-D3_tEG{dZu6oV%?37bsDQ;F-AM|oaI_=>6X2|zm^>0&u5D*QuH;J)n zdsRqwqDcH=TtZjUa1O{9A2&jR+}InE);9zf-PuZtxaW1F`$*o4P?5d4tJ5ssEvx=A z@uiXh2N$b6yUKMfEKHLF)NM856SEvYx`!=B9o?BoPl5@n*rk30z9 zb_d+oIr~Nd8vLacrViJQW_+$EG!&6`Q&mmyyk;$({K=zl zIdg?jTr#b9VeVsvQ`2Dzfty<_-`)ifj)i1ok# zgT!1u=cpbS-6(%lsCim`O%Gv32JzR=1=az3?L5j5OWAcpWJ{7~Y3GuP5#jQiaa8>- zrvW0vQ$Dz_`%>}s+MXtqACZe&1H$Q;C+*o`#;0<$u5~VGV8$bF2$Rn9=U2ax&i3b5 zQs5xh_9osd&`r`6q)Cyce#`Djgct73=_aUM+w6Feu=u<%JAMzoKiklT zbN^t;@Z$@qUX`4a|84zy{^{=T*UsekuwNBl`d-L=82$6B+=s#KJcQ!s*kRsP@$h$N z>ECHFeluHJX-b1!--ZPH3wvG(dtMGrnUAh|1bqXT?|}b3#j0Tzh^!?-abwIoOt`60 z^VD^_53A-~Y#5ikdES9Ts`!yk87vP^bk?{JzwbQiK0MQz2W$?jkxz8ik#e)T?5sz0 zAy0IV$50EC{M)S-{PnOJlRB&x?BL&DN&3{V)WUbwg7b6-N$&`mZ?wHHEM5XY>T!Ts)R1wu#5OV>gz3K z>Sr5BUNG*@ht-9LZ#L|T(RrzN5id zd}*^rg)xA0!5#r;KrMWg?2j2>lJ|E3Gt(g8W*#do7h+Fj;QU0UsV6dUej)?sOctM| z;hfH*_ScQYy_f#mn!&ZLKP>;;H`I0S95&Tg-}k$TMke*6!$I}cPne0$!)hUOzVPG2 zmb#uEEqGg|AKhyHzc?ZCn(j)5YFK4FaLZ*g^b|><}&kn2a{8fDi^t^u8VYO(d zDtVpHI^CJ0-~+mYGHzEDA|$$UpxD7XAWT(qY3ChiOnH z)6Tk9sNuHJTW9x25x+E0eBlEYz}v4%URH}XsOI$^Rr2P|YVxQzRLQHVdCOpRZJR1d zNJ@$_hHB<0yeiow30u{IR{?`$<~84JsO^62kJ07=#v6H(J#l2Loo1W|SW|LB*|jk7 zgMC+Osv3T^HB&!~w)utN&G_gmg0PS;Yb=#1ctcNtS}@^H5XYwi;xO&tuIp>7_@$un zh0B;ohQKr~+N-_}ku|@~I6hVL4ypNj)wS>4)d;P^mAsewwcY-6 zqsx->8-3ii8sFgwY}S)g_>*4!TJID7FaM6T7Z}b<`q+V?jZOHKH6$34 zvNDGbzAT3huGYr3-;#l`?MjSod*s-`=+q44r8)sYp1W_?Ck~KIkFtkOh(?Rp7K3&}J!SEvU_IXG z!~cGMyWjrND{A?7r6BPk02<1NirI)rA`u3i)gme3nrk@UtrA_n1RlXAOYp6*z4e+~ zYCey4x?KdPX=P_4s_|h2J8YoP4!jnYl@|+!os!5-Sm|A{%bEWgimk>_e6Z}l5FQgh z$ooN_UcRNC)LB`ixOs&rLQ-nE7}Z(TwQ(B-jx)bqHEh@V(N_%LDp(+_Xj$(QU&p#%EDqoU}1YFKsUa1639^@UgFFU zfCJW5Ss(*o2E}=i?*8!gG54*wsX5ga;om3S=eOS`j?L@DB6H)%B15LnxZXuxW0P^jY zfc_x?y|g(@DkgOMw`foU`yo1!2CDr>o>M=9!(c#vRXE6X8DH=ypGUh3Ra9s+z4Rx) z3S?!E#Hr5B*&`L^(Bn`=h|B1feI!;xtIs+sljV6MDZ$0p<+TsWOMWgrp&a5xgRlRq zF+Fefod@1bMcM>1hEI}@Q`@>c1jgiEirSl^Zy%K-%!!ZlIb2l37KRPEx^4KUGxU0t zV8!_HyeSiJX8pPBiw{hBoVGlq$#XH7Hz@sF1JdV9*+-@vU@CR$BU8S2TBh_PQ`!qN zr5~A6HcU#Z$2tZ_&-}%ui zS;SVc5~eiyeg4>;xZU(A5iNbPGLYVXajdf99_;L~CVQ8vzn2Q-r~(%R>*XW91t0ZP z6M8w&H{okvGE^^N-F#ppg*}xp%Q>_A-k@OqYUxzC{6v^7M^N@l64%|{q`Pc*-eMyv zc$zxPc*zn&VQQS~tdtrB@=0sNaH=3y&XrY$9e`EtfhkSSQ3CRreDz+IOX=lW_KI0g zC@#synM-bs?2!#%&MAXmgXQTh@Xy5mI^gK;a5B{03?5YtH6+V%19x{kBv^iJ{~h5x z*%5Xy=B?p0Hz_~JZG=zbOXrD9={OFEiPLBAVq<7%2CT$y0+>NtiyXm+!F)=q-lhH5W*jjdq25&!nzWE*C)3UnIL zeZ-d9Hw58DsDxc9Y!1G{6%kw>fr0pGe6kB>$1fDEKJEgTMd23I|Pr+LG zdwuUwHbdv_Dwdkho7ekkv7}DuRSS2i1v_t6)@A4Iar6AWCyLd=^=d&2zGH(_2~K0j zBdZKdyo8lvy2JKC&}kEw0i7N8bW1Ho_Td>cceFrS=qSE<20ukdsiZ?KXm&4?pUWj< z&sBstC7$T@#|s!hQ%}4qPXbXR%1x>YTIEOegG@r5urEpuicdNNM^uS(bV5!bL^pY| zFrvPy&@r?8O-k_P)a%XiBl26J8`71{+AK?!gd z>~W7BSuaH$NADiBHY@kl@}d31Ur0Y{1MKO%z=fAGK1pCbQ!Oai9SOZZqTO$WsXayY|%h z6@t2F6>Rr_&m;ZYA-iTe-yHV6t?EQT0g@TA`zT9xA7znJsA1mkT(bL}Cc9)mvP-7P zE}0>_KB}|)$t>BuEM!NtY9TuqlqNe25{M>vxJDSxn<3ABpi^9QpKkHv4CM)J7k!+e zyo;b#S0j|qe7kck79)-ZMBhI_c#0Ep93zn&goD225mRK{8nV-~G?sg=6H)5g-&i{XiKrqJj&mqdNzfvUyPCB^gx3 z1t3~GMGNY6WmX~kl~-jh%xGJ2|C)=2gnX~7*aIw@PI$c_DCa$pzwP^lfCf+|);Ow< z{5rKc^{(jqWih&DE>tNh$iE-KN#t*WeNkBhA4y1!8nZ!<}9}Woz)ChJngJ zY~X4**|52S9S2>k?b(o87F27u+mTn)Qyc8SGsvWgJ+2Ij0HVz3o&%;AdcLViB=frW z=q)-(LV|#m(dt+7RKtTp2j~Rj!v%1?-+oI-BVP2fWCOh>y-CMS zm-`{hdqS4;qeiwHdi^HHgU@jR7DZKeIrWCiC#- ze{f!M3omP-s$Tmzx0a6ews{Y-f1mR@>p$eE^sUrMF$&{_MW7!*5sJ@085G911QyrG zsNGV0{cxTY4@xH{M+Fb7uRbWoI*JYcYpJOEzWV4byfaUBaZR=p| z-rg&)kbIF~=a|UH!;Y8zmVP`v*k5wc-rm{cJ%mXm`7}wCkVo+dX{3%`yGKBMX`XkB zHz81cT}CbP4)Me7?bFrjqA#N;G#snMyVbC*lFI2(VjZE5sTyUsNB5i-Z7WPzALQ3G z_u3tudpKq5Kv!?FuV8j7#jsi@cPC}3GD+1!8PVo`wq-wHK2Atrd#mRyX{K~z^aIZw zMSh!`)>emxgBc#T{kw;o5;rs2BbHxlGZ%dl|KV`OXxMJLV=8_V<4OwT;Hc7t*g0%_ zT}%__;LbgAA`+KYkQ(5H!+|LutQPF*7{L=F#$viD6Y7jZB=w7jh+1E{`%H?9T zN#4(vd;mTPB_IM829f|I9&)bA<7U^&yXQhAi5{Kgn`3v(-e0;9q zL7eRg_$(|Lq0i(@~kvA=Jy-~Hi3s}Eby9JJDZ33HPWJ> zeQ#t%uXecIzaZU$!~`1pX7Wbh#YY{P9_o&QRiY7YqpNMUn9`{e&ul&u??$2pej0*4YdoW}b2SoWzr`)k4BCY5fzw{7?2>LfS z-Mbf2AISLWoeKb?^F7OddZa12M&pc-hH8+Dq}eZJOq+U_Ao%nU>1lidt{SCkm;nyk zweiE6oV<$?etQE;b7>QOJ7>~GGW_Dr&Eyq$5RC>N!dusMqRJE_~v>6J2jg+Dbv0YLZZV(yH8X1{*ljQO%xl7y~#q~ zD!QNXY|-rLei?^vb7a4maR^xl=gu-G0$J*PK<;*ZfEX_FzrLsAe3YZg6MMk7vSPR~Pz*=z|7FOS?i6kEMaQ$^xWVe>Y9}IacoK({yct|~UAjm22j2ON; zD~3M{l-zOt2TudUaDChI-F@OW-i=x;$9YQ@q_h|w;w%7?xQO9DOpD?p zC3$7)!B%|)^nsSL@yFwpC!$RU>UJwX0TH$vj!&(&I=kTRpT0BPs&X+j%w=&>- zXVlNTj@#9*_`R=3Tle5`9X=ZEEqkGiuBZ_4Jhy6zAbPBz>Rc_!q<4Qv>_*~){HI5h zbaYB^s^}j4oN5tNf?J%zl{$Q=Q!tLg8t{Pu?TET{+_Xq*0Qyl$UzKY7NMtpLE`^njqwa6o7HYrIz?`WXj?jd2CE|Nv_6`*jj7DWSgD#5SddU5O6EQ-h^yyqje0E=)l$?HjeO_G~QZc+=lLJ2(bZHhd#5(UdP zIscZedDL>eDO{ue0_*^2oNM8wCU?XbF7jzh3M*P;i34c83u@CuuY{uqv1nf6dgB&ad z5&hi%y3y$9Mr!hVw2R&V8a*(5;uyIx$3?z$?+CBUQYH?Ll%S ze^6@L?K%K#i#@Z%nK^;y!|(umvlkFe-{r^T7e7R&O#E*b@3?mUd=ykWOiRajO^x@o zB<0Fx*KT)`9DtC9)Gy_QrF88;+A0}*UP)fw3Zcs9_%rW0kq54SPUL|bpPQ(zYg5-T z+>w$wl1z2o4t3ogkqxBCNQ!{0$OBdr0)YqvU*f|8sVPL^lF=`J1x|5Yv$}2*r6qkN z>0+k)3N5dc%!~xYCq+M_J!o%a(a%JOB`zrYHP&1&y_OSOwEEO5x*?isT7}6_9YRS7Ic!hR}%N~^0pQtuNDWcPQLtZv;5g4J3R35j3)r+a%82eT{NE)sI9o*A*r)T9*cg)UrWn@Zs#8oO9x>hRNa%z zJu~cTsZRA-?pKoUe@Ix6TW{!R`dQ>lU2llnzg!ox$TNa7%c`k8c@=-K_E~~71faG1 zV-4Kf+YH*g26b)f==L$zMbD`CCWaIr^%wr;sWr{f17AR?VRO3wkTUeeXJV7K{IysN+k5Iw>Zi8IguefhrOGO#D|0A+#>N`2dTO*gL+21;CjCA+@qcO z4ZY9tHQ&LFp6?lUi-&#ro{s(gc+u@pTCdT$*YDk>%ZQ2)f5}aE{MK%P+VJa1YkSia zBYe$nNlgxTHu}Arg@!bpzoF@ThvhpQpY$D<(7)54&|QWYZc6MMVej~PSGO4EkAP5! zNgZr(nf?9Jw5G}jGqeNNV2a(aBaa8{lN<Ayun7Ip^Y1ljV{VQ#e78|5i;#lUDOs zwOT03zgj3Nw0a^=c52~qweW4+?9{>!)PhgI_X!jnd8;mXqb9vuA-#nyYT;&GaE~sC z@8ifDr5Z}6sScuxC*_XTE^C|L(;T0gp3>IbDbP#m;vc8S3y43-bm~b;PiN~LgYCo2rr)#AKA>mQTF^J0ZyDMb zAw8d4@Aw0DZJE&DlpcXWsMtQvJ|{i68F1b@`7Yhi%T#!!a7>}EF?~&zZbW37u?1gX zbnfwSXZXGQI#S+UXfnJz*mkO?nmdRsw!yn0*(UP8uD{|E;9MYp4{3O2rsI_0%)lLn zq+(x`E@^gL^);By%4lWD$f_^F!z)SxYV}_5S4SJ@Ll(iSN&Y*J`quh> zCFHcdBZYRC9clGcjP4^31_x!%c*V2R-b^sfj#T^_4?5AO4tIPk=OJ!t*B;0&Zpx!` z(=)Po^kK2s5r#7LvUp+t;uvRLFF+70ko>|o-FZ+AisoG&S0FrY6g=*bTKaiNfERe& zF|~9AFLKa&yV-OLM@9XX2R>l5-+@H661Y$6uh zI|%WrPMkpG`<>?qd-o5hqGCeAG%_K&vt(Lf#^M=!Ih>4+9sDzEuMjEz8G%bz>C0{(oOLEO+5p1e@$zIOg&q zK>be_j@%VM)(s8Bwu&2ag~T!~qz+tia=$!`|IL4U@knu2`yC=sIEyA?hADRLLPC5q zEg^P(?8k)QzhM3&$cc7W;uB>b(sE+wCy8U{dUmU)P}e3tR(3ZMV&})To13`O$kU1Z zbA;g8iQaQrA^fNR=wbdnFe4uN3(L&UJ;#Vf!{vKu{JbNl<&~i&{xXp!uhe>MI78=q zUE7WGE_ptWx{T-Lm;*vkav@WfTcYzlU52j_n~WEvSn^WJ*onm6Vr8v6unw#*gL!oi z$Hrcp$g4q;>@Hq>umQakX9W2$(W7cN%pWhT|DfjxX*K7(oxpAVse|eKkCk_eBy+w@ zt=qyFyNeUORM%bGs;lcQUc6OTm(bO9tJ;KH-Byd!<}^ut-PE_0XK62~yxo$l>+3KQ zdrre~q9&l$H5qEnPC(Ajv1r%1@vA-wpo;3;7oYQqA0hoc@A1UG)782oi?{6N+M#r9 z(%cDX(jA^#zoFJ0Ufi?$GmBEKy3Jly+v=9;NvC|GyvIG8)w<0H0d0MCp&xkM|9?q4 z5BQqy|No!N8{9~Y*dbQU5L*xugoK2cwMS#ts1`+y6JkZgD0OYI)z+4%8LOyKlvazD zs*!J~U0Nmo*ZaKR=iYNqlIGXPKke~6pY{H{Kkv^x<9<%UJIxc?;2Bb9uY@+%gciOD zoeSdD%OJz87n&gOtob86Yknfnn(2;`&(vD5J?@`H&`UEfuc_KnvUp|V+sWFZau0?M zw9SGk+>L#@{7gN54>~*zA=*N54=#Hs4lOUWfq^6SfWHjK3YMFJe}>MWIlA_A{4-&?HeFBGrt9h1 zOxK8*Z>Scr-wcX4bcUMEd`)r?74vl}6$0}$J!93LKUPLU_dU22y@v(3Pggu;(5!S3 zSB*YhXt`{Kl`d#jqCo*u)YKSEQE7c~f4N2~t+i{B1X4O`x=LE>WyyN36Qv zR7hYfCS-jX?)jJ2gZlZR6i@;q}Kqcw)p1HIw!<3Om_S+r@`4e17*Mm*D0LaL4cI=s%)@|MZ#C z2@!P>XmKiD2&Fqvc!?$|wg#{_F;^IV(4RCHBEs-Bnx+XQu>B9c`|3stB;W}z*0Ww= z^fOMp#gyzbw<=W7CE|ULgl{x+X>Y)Bq3ETbB<-P`7DAWPv;_rrJ{W=DKZE>G1;1d{ z!xLyP_k@!n6CfI&%Y-A1-Z;=cEP@ZwjUa>I9d+#$o6~rK7H@V@XW?&85tp<;_(~N;Bx!qPq^rS>Dw>x~9c58PA8UiiBhhzMKg}HK$sEm)z@Hw# z4XR~Y@lpP)icb&V?8W~8jcmw=3>8Vce;yl+Z3OVvp)@2mID9l6 zwRVEJtE;25v}(rwUrwztQ%T2`iOeFWQ8vAxxIuJ4lb!B?eLzO%*84_!3of3cbUo4k zc*hXxM|3|+YZEH99eq!{(M=-pdwJ|f<`p-=1z(H}s(~LQ<2T?l5!*1dW1lv%1ikt_ z`6P9K^n}CIQqrd+HuHsP@kzID=*`9E_+52GBJTd(GVF={4H6%x4=}r^w<8i8^8PFM zz@3+7C!7?~PSR*c2u*6*Cpb$unO2rORQ!`x6#v*?OfnBVUCT&d$rPISnMf8n@gtAJE6Gm zhcz{9OTn6=G(Z$X61;|q-%;a>zz9I1^tSpqfW6=k(w?g{_t9FDeh1{Xn>RY%ovI=v zI`%Ezv%r^lZo1=pl@;Y%63EA%K`_!$wG{&OsQ8YA2R;17v)ehRP(k>ihX?6y|BOTh z`b9^3?K2Xa5bpSlMB(&sdoxt=D_8BN@c++8Byfpm{655g*$W=_SF-qsgk~|i_l!~2 zXU+`_K=_D+M;8% zUXd=-=pCH2@34-HG-!YyYNLI87Dn#^B&h}Q@rvKDAKz?0D#_l_C^PMBiF+crsfRt7 zUj7mmf54AEXo2nQ$0OIsuMvg*RJ9eUGjy>@1z@qU-4ZTF(bgJACiKD%&z?0- zV-tsxG-=SD&3PjdJ?UvB?*Gvj8~z@BB#kaBDP1nwQvfPVxIsHQ;+1@QP8ob;(*7i? zFHW(6MfyHO;crHqny@r|cft`DY}=5UzLqzPdyLte&6t=(W{DqH8&NP0NK11y_z;P5jEmu@O#uG@biFuTs`zvFYMM1 zyWsgcD7yt|c;r;Ery3v9P3f@dh=1 z*p6zBqRII!RSE{GQ(8?O3&(^{a>tTJ4ypJ#JpCjiLEG&-A{Sn1d4ho5ZPF zgNlm18J+N3WTmH*Drq}LJft!uJm^cBwVB>R*x(*tSrqCV!J~A@7Z9h2WaY( z)B)-@$2Yoo7jEdC)*L=jDt}^VLT+r=M8%J$&6s{jkB3@6;LUPqHer8SImG1sY0(mW zW_N_i(+gnTK+P+$eQm8CCLv!u@)Xl2(B_klU&;cP%L{7h@C5q3 z5MG+rY?oMtuLj) zZt9e3_BcxQ43-R|4V<(=PR8%VX0^lcu_|aBmC!vPI$_03oMLAL^CD8Ig6CC0*tvZrL#zyyxj13f;jAxfoI#;9t5!?Vy{AqK9@u$P7FXp#*bMtI?*aXd-<0>xXbGU(rrRw+8xqq zab%@%?Dq;~XKPz(QfKg)x*Y$K-ZPJ)Cjg< z&t<*RXXrLFm`KG)P#EEfnq49jqH!JgWWuj$MUV^1I_(8SrRAY4wX*5&?HWyd$7kAi zh;@j}s2fFWrkR$_Hfgv)qeFH}si@a&WER7-)ld>+sKf6^kIYFpc1zc@*6QO>dUx9Q zNV5k3F3YWKB(IxtY=s+`i8S}0i0LG_$d~a9NN{(T>4pH*ddi#?zECFSpVV`dD@qn zw%ur^eNHY4n^4Q=^01GKM^JcTKab}0#%EY!bB~Cq#QpSh*k~*}67Wb8FAa&Z_)Z2m*1KPy~Tl8sd&RN z$ z=?`u&?2W2}j|@`Qcu&0|-pGkUX4?16Fz4aABsxJoL2p!xLZiytbvYSNrKCT8tH}5x zpr{1R1kDq)Qa4Z7LWPF*sR;|H*!BXCX1VD;l<5H<8la@0;is?@D+VUzq#CdPx?Edw zXggC!C62^zzMFeiOo*o)KjOzz?L@`KPS9?^VjmFNMJ6#m2LGajfg$<^F_%eQ*#Rap zsS$qhtZxu=S4vFx}fDO#^o5jf6h-DFp(u_n~>4R zcF@qZIc6W-3zC}`5OpCMUnOX6zxLDn7Y&LZK)lPP$$uMm?z|A4w6hpm4D}ZLgf7Y_ z`Y|nw5~4|y*l)FMy3|u)+Fh+EpU6~v5+^FSCAugz>z$+8A9(P zO{oS%CEyF}cr`rZA`Mdg5D=ZvKLU>e7i*TLu8S)O`n3h$2Z+XRD79VFp7?sMyK5xO5dVAa>0@v zd59kr!iMjoN=4ua8@@0#6SuK0;wP{TKkEajBfTI&`zR0!g5HOIoR$`g0OLqRo(6&O z6Spd(@vF#*JC#XRScjfJ%}a}IX=ZxeaW0w1E?71NXTNXye6E{QmD*1YVG!o5R=@F!C8@X0k5bJsgECiJTii91`Kz zei$+Fwins}e%8tjU?2jb5=J^2Km_((r{96HZSj*mx`h`NeBTG3K*ZgQPCHMACsURY zDo+vV4IEa}tBY#W*aqX0-cCA|Ru4v51fgZPQb3VxpwKQUFA;ZbJNhsYnl@h3gfw>T<5_Vwu80oStFml4b8w+WZDr{TE8iEaJ3hvMcfZs?&K z+3%j^+OJLNt~IVD;I};V$$9-A5RH_wdx&OXhg;$i{eZvgk<5Aw%1xaJetsS} z|Ij_p-Za92cN*djDM|qH2*QziIQNfh8!1Y1=!pO-tQv}c;!+_D+MhkRbV<=e58CYo zmozCgtxA){xnk!D#=|Qgsi8Ph;ddzN^eUKjItgevV88~Lw&-EFkv6UcjtC{R1Th#gP*MdY-xPN2 z#iqu}+YIt=fI=R`Ia!U|Xa#ZMD!QPWFmq<3F=wmP+CZ8xVWDy z?D6V)A>E#M({T{z2jO=JVTTas5aJ#}nnOr?XvVBvjf=-G zYTT!6WaHyalR|JD#Q7okQP`o0AsZWCO3Y0M&ee@D-#nDSH!S)GuO`ty%xoNSYbok} z$RV#gjY`5~2tO4D^B+`x)69q;Qz*)#;J@ECt#-GG@GvYu2TDwhSZVThN|pXC{a%v$ zW>D|rp&&}DL8Bv&kdmi1kkMeq2bqEXXrBo>4>cW106gd~K>Jsr zfsF?@&0U)Q4aNUB_)m|Z(-w3fU;DgNPDfd7W0zS2IwC&CL*t>1kNP;Njg?4+PR)m2 z6rJ!#vv(XXG4R{MVu}~=WTV>V_s?G-j0QgAfgD4fkGNDwu^+CAo8qo`D4vQ1_X=_; z7Td0}1q<7DF0)oFnhS2@f7C$e&)0TwnYD1Q>&Vx5aAjG&y>eN-scs%+_$bEXamJ$z z<3X=-7!P_2#c|l~F0Ph4E?JaKWJmbf@qx41Z~cU+uTuDCdN zkGMF+B`(f_Kij79`Afv;+GzsmpSPyt72JkHg(}7at0JfWY(hi9(b-g!kP<<9?!hhA`n(iefx|%_yZ94+`rTV4L&0u)m6F5LwGX^Q`gUK1lsgKeYL_1+>?X z2%H;_`fwW$%*iw_%R%$8@lYDjgls(G!V%eUC}9XU9ty28;HTJjs>(b<-*~6-kT-lvIodh6I}H`LK0aVeJzMm%@uCI-|c&Fo1kQ z8uMSW)yYkZG&=O)*9!lq*p95Qj#Yh~{{l>ZL8iY@(_f6~uaD_(gy}EN^rzBt%y`fO z#dwt771+dh^v|_3#CXuGX*y^owI8(5F&?z&F&wJ40-{xre$Z;jcu?k)p>Drwzr8+a zJbu0Ty0P(adB0{8<8gj-%3CQSRPf-IxwN1D(78;zbZGgmiyBz8(&L z5vIpbXuZ#X&RQB$nzt*$PPF-wzS%e%o^4by|I{st?aJ=u0| zu;NP{Hn)w|%ATBwt?EW=d7~U#%tmV=V{ZL7TC3sKm16sJqqVlJ!l3+lZQpFP&eYRK zZL$`rpey|3&=*tRZB;3+^6QZmv)>P{fWglAXB)lAno>-`+^Q(mA><2%e&dym>9L$+CW!s`etiI zFFn3(`(|qi%2u&`>*W8`$yIENwKlB;?SHm5Tdc42I?wZQV@y#d z#ahkQCdJyAZ8FxhDCQ9G-ihGO-wnFVl9Qw1KDmJunx3U z9FpIf5^>PF#M7S3&12Rjn#h#V$E~#sE=WG&Zu|VI^)^ntY_or|mT*y0*8gN3n9DZ% zb>R}WfYlyewsN^IU{#CTC9-F^nisg4}Zx=@~2i&o47E7n(y=y({mU1c0+CIN+ z<_cUCl>5hur(3q2|5zhz0VCY4DX;#q2Dmv@#_l5CL9QviUA==`>eKRq{#-t3uegl$ zb@8=Yyyjs+QVxDpfLEBK>903MqQ9`bzSCWsdD{XCx)sSsqk;A(zMi%x1>6eT=GFJk zrRrXh@s`=1Ngi|D=Ta9@s^TyTUVvt%{rw-~+xxQ~KPGGW5xVBL^h(Jlfw`pg!)BvG zww-=%rL!xIIq?EXtDDI)EI!LpfA8;{iKnR)X1V#gn+0o@4*O1TFnZylovmS((>0Tr z`3<~_3^dn4i+HWR%yl)I$ z?7A3J(arJC|9kvynOf!)vqGi}%(lI4j;~wMHou%(5qk?V+03lwTeFQ@IoGH;{v}g$ z^~@%Il-?ic9aZg5x0@+}xmeNW_-N9$3HjapEh0c03VbV@^wxaU>gL4F;@#({| z&>YWXC9_h^%<)C8DPFz|dTB}fb5gcSmcDgOLb+h{(}~Oy{Ic|Ik)`j)S>_g>l`riM z&wqODWMi-g?xuLA#%VV2f?WTn_^N%te>aB&CQE0eiG1_OXO8#89M7rdRL6|-bv6;r zC7bgfE%8blkRe>Ru+ehJKhxA_A9`Jz^DriJuUV1a;%^t6!vI!BpV1A9sQ)%qp2;G? zzr}Bn!^~$cz(aR>I!k}LMy6TGoFLuQ+&y!c>qE?@&lDfFrs~wksw?Ip)mT@EXIAL_ ze^badtf_Yi`!Jj-Yv-KjnOjv3rr2AU?1sM_OsDEa+wG`B`J zT_yW;ZSI(`#wYmIQ)G-sb`S%Il)1*))X~@mk zSXwoe>~p9B`^qp3ckQ%4JwX@esn%?vG7?>{f`7Gzd4e!&U(VLInA55t%X#rDzGiYX zs~kGOklCgp<E?+r2Zc_VJDzEzacWg6F0B@snpJk!41wnUU=nN|4Cx0<+MjM2Q+!fHyN93; z8HXjlQ~UPqX%b_*P|v%luX$kRHGD7gpq7KJ9_n{%bQN=mk6rrtPmk~1`r2n|O_%;X zL8iIhTv)!KRX3XJ)U;+co4!7cOZ1nuo|&@6dx`v~#}}u_wPh4=%cbr&N6JBokIh}x zJQ^bt(o?VgEC1e;GI!O(=D{h4+Ustvj2z-S4}R2DovS-jZCCk^3f(pjPA2(IU9~v6 zYB{q>pQ^dQd^Yzd+sY1O8Xp@Edi^nkyn3 zMIJa!7ifY`oes-ob4{Ex*F+9AH`Ux`bBI6RI6wBoojCKYBeO!Ib7)Ft%Vbm2#mzP6 zWQfdHO>4{s&Zec;C?gU7y{04WEq9?=a1KqbkSRW|+QQ7$#O?WM4(-ltEV*8C4D{JF zquJ)MHS48jX?rOOYLGVM>Vr)=(Q{?{b{eTu$Z36Jds4`|NHg6;rj}{$nJ(s@X;9Zz!r#r`UfyhM{Zwz;dWJdZe=LW)&SnMG zqUL6sLk8~uvHScgb+0!|)6&;5ybm|A_nj2XT88k6JRm&m%D!N5LFJjq815<)>wy?r( zMVzK&wR7ecrQHHDHvw<6`6IJ_IM>kn?^ZX-&7bk9#J4NWJ+jt+9BQwco1LjSnexpT zX^t;yNIYBhg1FYDtvR(ny-7r5eVy>WyD44{tLLzAQ~a#gVNLB*ewaCfD7L=2R3D05 zXJgue&J=Y#2{-9x7D2n9X@7c|rT?1a^)TC}W!BHsib$(h?K+uSrFpFU)7&CWHEE82 z$gHqQz9?SQZp@;l1lqVYxPi&nQ_W`F*rcA>PSvxllCb>d_ML;6Opo+!`Hp)O z(MJf~wpvm0>FX=qSAQQOpLebzdaatSo2uH5l=gPq6E{sOW*dw*4}B(+o8y07#?+=v z@pYRO(Qg7pnvBMG`%Io(tkS#9?Zw={ZSC;j+pC2vRc!5!6)jTFT-n+5Cw*O{TaqU} z`eB6jC&px7dM_!n@1v}Iv#BA~-K>_WC}z86S|ylk6`8x^(9Jpm@5^a_dMj|Qhs^7? z?q-Edt<M!)zl8buh3et6yn_K3j56soB%^U5mh5Ty~GtK&$ z?s=L_Ue4xHz&vN-g+Kn&Rm^5C%w_K5CfR1|t#YzPw)a#j+v_vGc?>pZV7qwCqsTyA z%^X@sivCKB9^dpx!dwGcc8+{)&4sYtI_eSNrOV91<+LElS0PjSzGd))%3RVM%5vH) z#bg@b34gqDm72@#;z2+92DO*V{a{1v+ zVY9JJLd{B~<#21ttVDK=O5$m&>U_E(^hwn-`=yMpSs*tk{aL6kfql)(9^2zGZl#?D z7j>8zMNf$P=vhAS?rt`|sWX}Fl*>Htnc_?Ni`hr+ICDjCBPmUS=})h8lN@utnO^oW z#W&YaS(fgQFK&DN+%nwWl$*$A86(ZM$>svTjoBtS^qah5632ytRE}AJ$>u`H^lOgS z#2hc1;g|Lh)&AJ%s<&r0t3mrKSbFVbbIEhpSzx9IhGs>3I>oPri9Z_!PMb|H*P~f2 zQhJ+9pUpaIy&g|rAZN3fDd?mmbTn0`scEVinQqnpdxDHicOr6#PoHSg{`A^#ieEYN zv!M6&lIjWc$EG_^c$gk$^fX81?)l8@ox>`my;()m9Byt1k!Bk^cP+=luWC+rxNR4U zm{zTWVG;h*i=WLyqJ?Iqa~M;Sbh&NxD=d2ZUj5oE#;JNT-yNHsQ<0F3I}Ux`x9QpH z#c>`5+S?=6F-Od%++UjGnI8e!@|81OB4^W`GTnj6W{jAhQ*H=17Pq0q?_!@CvKh_F z=z{hBoXs$v^&FbDui1n=-)8a+s_N}L-}?5|m61x)68aT4Hw}8QWZQPaqlD9J?W^CV z){CsAE}Cg>)(dF6g}a-M3k|Imeq+wc)B{bUR>qcpze3J*`Plp4TW#hW`}%@fFB9Ly z2+M7rEKPcvM+*I3wMonylf6C7Z5ZLkR#n;@pU1gOjnkx!*=qhdtl4waUepk|yjFdZ zgHW>)H_U@)4g=0|v&o&~+g25FE9R>YF7`II8g0z}Ks1|?B;-G85~%k&JvV1fGBr9i z_&;Xw%J{Yhy{wT#1_P;$(4Vf5^AwQzK2fpfj3Zh;&D&@&tsjMUFiSP{BeNFf$%DsPvvBs+Z`SB_WSc+P zuZwMGY;lj2ZQja&*GjgE-dLL zuE*>F_IxcDaL+mm?|I0#uZx?O)V6a0RLYmfon5Ivxr?U0E_|YCsfSxajaptXI!LIV zm*ue|hhp?nx1`t3^+<~%ydAc1GK}p)x8m+@E(#aUX4lDZHsXE6D6P1%*7JJ7rR&J4 z^)UB&XcwCG45=wT`#H{bcF=2!a_7*{Z}PGc3{qlZj5!C*H&*CQ3@&={EF%mKTPPJ) zN~Bpq*Uyp){p=3<4T1S#-rJ{YR?qFRD57T7bqV06S7T9D0I%g3k?d!kT7 zld{}2)S+{YJRXEn+Y=eoENV$DY!H`fY!azfLr4tt)&;oJOA}Hlde?At65EBYhU&E3 zG!~flz_gb>rl~`uC8nOkVW?_**R!F59gW07<+htW70+07-7F(!8yvn4Gdfj>Wu7CT zsD<8Ox2M05&)`T#Be3iH*w`X`sm)lJBd4Cua=}osPPOciW7%n_AWNvR@!7kEh3d^NG!7=Tm+hvp)JA*SM)Wll)M5;> z1R3pa9P=zekgX3MW2T_d_W#@olnu6DtYp>1amV`-C(4TJ2ZOS9`@qw2G_0}B<AbufcSdd9aavC^Zf~7YwtYCBRT-i?5+tEjJzM zi&{oF`mu8drzuR=#$H>-4p7X~sINA_JM=XalIy}=e&gutu)b68vyB*NY!d-^p-I=o zos{R1)3+TWNsh&AF=z98YKslaJY34@(P_|=8O)JT>yUPR3?m$@VH`B*2fn%>OB}9( z?2csg+bqj!2{o)ZEHwD(X{Z&*f`W!Fd-kEoQE!ZvP{V{l4PFw2I_jvX^XL_aO46*M zdF$=nwzI#{elg(=H7qgc`g(pg`}}U{V;Ju&F=%bNg4|tnm&MR}i+LJah$Yp~Lfr%4 zV6{SVre|jfHMR=-s>TvvD4wI#hAwWO!z{+3#*&JrV6TNZ<4~Gf#!+HhP#?XAJLDM0 zamQq72{0JP-sWwNLEu7rsS=yx%pugNlTvfj>)t}o!tIVe21{9tBey#hh}*Wd0MzZ~ zPF+T7Im97|Cv;t`L0wur>S-;;=FMZMo+68pR}Zp`z$@{(X&sUsmi+fKN7Wh^RJNN} z4QoYv^%kQoMD&cE$4YygqP(WnHF93h+4Zx;;D(1?l3j@`o7B#Jh8|+ui6-KhgPf|4 z`b%b+7U$K4aRPMY>pZg=2Lrpx_7g`@?Oyg1N0_6jY9pup0>DB;ims*8WZ~`@A%bvW zY>(3?%dSX$MZc!9Y2&NC1{HPL~JTwUa$4jxPS}0*&*Fg|yV; zX`Ngj${a?}QrqLuIze}s8gi&{STY*Mw4R|E-QG_e7Z~<4r;9bs!g~9^cMLE;Q^ ztD&ll%cW#P^*B}+#>o_GXrma6{YKql?6qQ{F+$hF=42D+d6xUSJ*HE&*bKVa4QxL# zj(7Iuk7EpUEQGWR3caH2W;0yvYeut2a7=(SitCzLb~=rXMk6?nta<{wiH#T5$W*^@ zcP_Yb!g6TlH0C(XsFq}7JBQWm-NA6KE&TM(U{vpyUs>B%>_&2&Kfg!>` zp}&x}RiyAY5Jh|_ydnHn_yQ{#3co5`FHB^rfgg&;yTZS*nB0K`FF;g*-;ZD&SH=Hl ztdPn73P}DbAofuV+)dxp;+eGxGTe z+~TH$)B#mW5Qr0s&=_|Pi2dubpl|T7h1_jGiq}HicWa~3C`zCwNd9kYNxGWM>p{%l zsxw=H6t9W6Yl!=GHQsb1aC$Ws*dL?}KMrI|^sUPNEkN>5ufp!-Sdf#ukuVR4_n896 zS7QH>AZ0iZ#9v_D3hb^1QaX2#{9nBT`;*6_ci7|o^2{gL`+)?cffRmA*cBI68(_jG zFe#bv&j=2$+LBog9Hc1zbz87I8Y^x}UkOCgKsOMg0m7rO^DRln0c*<-Ho1TrKOuM;MKBzQaQN{Y+{$(;=IRB%-Sw;@APXcS24 zI)D_ua0q9ZJQQELLcAMr`=aF2hGFwlxL?A*1^Qp0=Ws=70FUnxKoPc%P?Uyny9)Du z$O@Jm!^|!0G?7i5F_|-Zl*kHR0!e`zFe_OyVm{#B6q#11VnrMc8c_3U;!wqWhL}#w$Pyzp_kGmLj|+ND53}%IP;QW(&;| zMt~|M_$rwN*g$f>zmgMH2UkMS)D`Tm1yUO+3X-YsN`}6x6{P?yH-00_=>w9Sm<=31 z7$il!*D?QD%Y3*N{htJ;z=N150h5I9i+?w;2o$lc;e;hXihmOs6PJOML4A-iUb%x6 znGBM9Fi7!Q3;SNa+76Rr@B*~0#vHZ!Ayb%i@VXaCQHlZEer)JQ!x zvBhq~GGw`9!ZoUxYRq2NxD!YkR{=@me8R4K*zGTTwwv8&gwMXjAcAfj2U5C@!WP0x z!a~B^UvNCN1gW4v}fuq4{h*t}wcpe~? zwD|#cR}x;|&+%t~h_Cv$!wDsL2c!hP!ae&~!zIGu!mh$E#8RV03U)-%gDo_KE6sZYPK7QXz|M!r9Ht+8)rR`8fTM-oZ*fK%v|@GUG8xeGyPwv3}R9AcNC`wJ3 z{(rwS_kt9m!cQ!)q|j6N<|_Li7jFKM8}9<)1Yv)nKS=V=!Q`ZP{=c{&N7a`sXedYl z(_XN9!E=247YY=7#+Jw$FaxGWRRmrHseA4dt`p7zN%6xd(RPII0jcUf7cLk71>%ku_6NsN|1WEG(dPB< zbGv97P5?<@ycfHlT3j>*+?jqY@ffuREK?RFg{&aOzlqO5P+PewyZ~-RcxjMIJ{$QE z#|wvP#QML5c3Fj4L762*3?|nI5Z69_wD8%V~L5lwr z>1b9=2T7i1SC)6T3&$@6YU}^5?`kFV>yDQZ$#flre{^K`U14Mg7JLkE_)!Ke+A+_? zFk1>QMzcFYSgJL%Y;=+kF*gr9d`3PHKk_FZZ6NMwIyQo?~ck$>@jT5vGt_tLYQNn6MU*XfL z9DbmRi?-UOZ*J47cckz=VLM@{u)45h75w0V5_pTplFBS_GDsuZ1duG$7{sfkfv+lY zqx%u`hkG)(2Js>)x+p)v{dolrpD64Lu0?nd7>Mw#?{N5M!n!I>XaFi*-bI@%yumsc zD1I-;5yL?W-&cm+9>S-kIsP56Hsa3%SGpAl^cDV-!13-2FAGzJO+jjW&t@{O36E*S z`hSaf9G$@tMhLqKn+mH4y{B_q_;v~_epKf~^b%NV9Y}5FV~`5)E=U%L9>)w3mIB=| z|M(RVk3(ZQf(;}ABZX~+HHCh{Ji=>ZIR0hfVc}OGW!&)t<}brJ-j5*p&jq#qKT|xS z!SblvE<;%J_3v|nULY;e{uwL+gcrbah(B#0hi~gCty|a@q>QSAR}s$##0Lul|JQ@# zt?z;UPh<92cu>UGc+HZ=^!~y|UAYmJ1IfP~HmIHs0kuG~P+{S7G&&k;AA(fZUY~Iz ze6*0$-vLSfh6T*Y!e$Fp_PF~g^8;a3;V;O5#`@<=IQ)U|=f$kR9FPR7!uvM%zbWht zQuv!i%=I8C?knu8LQ~SX9JKn4U$M z1z`?~|J=(}8^|7kFV6$RK^m!MyR-jjVJ~45kXrQ$ zH&*O_uFO5cIl@nbU%GI(P1s-9ld0mpT>4ax;&%Y$rjoB0t`OE076K{W(hN4`rnfHI zdVU#5Bj(2-rLQJD|AyVWh1-Pdg`@wWaLoV1v=j7CVVE#jSO%nwi-ELi%`N^9UvmaO zfE0cnr0_%HzW^kY@A;cKQaBVOMVmZ#Q7q{Hfm@%sD9eyA0;GUhPdULv;oB$d|1MY$ zC2a-P1*?d=l(+{z;&jP>Fc%67K6KF*vseDdy=W@vg?!(nq5o62dV-TM)cHM-CX?nM zO(yRM58r12GeGh$C+>y!*#GHW7v*Q9?+=o^ZND>D{KkquxW(?DKq}w`kXF|RZ=(N` z$MTyTPy!@V<^#!;8-C@I%mv9kM%YIfEqw3`+5r0hvKt}?)Z~Dgoa-V7)Z_^JTvyp6 zT09WnQ$;j3Ce+_ zc@dB@{QWZfr-J0(3X-6O!imE7g_pnQ^rt|IzYrw3BiOC_^}q=UXf6yC78AC;#C6(I z`1B&X?}9XPo)-7J!nVRj7dXRO!YUxOwKBrOnm_t~(eF5-uh0vmh>GyVc@CcnQk_iz zN#PD4mE`$3_J079{~3_{dw?XTgRqd$TX^*>!fF2BixV>OW{^x2A?^m^K5&M^cY+i? z5+p^2fRteykTTqRnltPNdZK?961O+_1G?LoQye}Vr0G02NI!A*dwY@to(h)HlrTWAQN#=nYcc)&OZh zaRo`>S4TOctsrF-3X%d<#a&SN<_L%XPdFB&^lgO2Kq^4qBk2Dm;BqPpJ`0lIjv)C* ziMzJYUzl5HJIsRb9OC#lKuUi?xLvqR_%29_q`Xx^i zFTZfn?$;jyY0{VsQVE6&+X;g}YRmz`j9pqm0@Js1frf8k#tOS@ME~y~9<4zV&{P;K z+_i}l&e_PEE*!am<0q_V{~jQvuPQ7nEDTa(&b5YD)mv9{K}LXD|F4b{GI`fz=GUv3 zV^^~2N`kcH>bHXZTM6$i<;7_ed>V?@j-^0a8(ziwjpFYU_5-QER|V;^J{L&&dBLI5 z70bga>~R#NgmXbE$qi6k|mnpnw=~Y0FwI| zZX8kDxd&3d*J@z=qm#4Z(XP6y@(C=`3MBt9VSSJiRu^{#VF{2*YJ=%1zakY6c#CQG~r9m0+cChVVmSZDAphGOmZMn8>tG zy0hB~k{oy8Ki$~{r>985uXUtgoTAZLW?k?3&(#cOcV|Tse~@V?>ce3 zlfn>?!s`mpx1(_C|Jn&=FJUubWv~uL#zT0?hZ61)?htMSDLh%+i-mK9jiXqBy25H8 z$$3ZIA*~Tk^Z%cyORDpWAXULW;Yz9F^ZnS=J3%siXOIM)j%B*^;`HlKB@}-01CGBN zqr*bFjssh6*s4bx+;I7q(=ra>knZ6H~m>~+yoXp zQuufVH@o?qYM*Cas!6U*R8%*#E3>vv8(xfUvnLCuM|+@R!e6zyaY>;aFj3VKs0X zF3AFxx@x!UUN2$(Buo*0CLAejCseD;iMKF)F$*{?+$fwTj1`6nO9@>;QY36OTl8@< z(J8}9#yWA$JEzmYOFVwhjHCJerC}6_5mfc!Vu6{V)p}D}4D4 zD{vL0cwd9}knuXO5acWZ4}s&r!(bR_Mcp4g;i?pbdplSMTmseyXP!{euW|AoJg_}m z;Gf4?!!sadu=6Zu_!(Fq8O;P2q9lVs3hyrdZ9r<>HN;&Gbb*^(zg za;Jg~(fOE8;cQ_KVO8Nj=Q-Y4;c|`W|B*Q9 z0!@R!DQE*n&T+(9!Z2_U!u`bU1rCM#f2d7ysH|9Q-SZzl-_@*WL4n%rzj*YCB+hnoQORJA&jt z>oNOJ6jlexf0T!twzTR8lI6OAbC6LOI1Aw~&~Rv=y9m-iw-%&$>Jpq##5j;5z5`N3 zYH1X)lAD{>Xx?*00?Y;eE^gYacppuhX2*db4dE`}OfdN^E94K>g?slK=0M?(80|=5 zZxHF!z&WqkBLpOks)D3YZjcoE3gabl-(MUa0HVOqlJZqU*=~2%EA{I$SK}!;o^L5T7OrC z(ZZVGC|Du`ze6J40Y`&h2p5AN!`&ZL=_Cjzhlqu_5fuZ&V3CYMZrZH&2&94IN09u# z1lfVmpZrZFiA0+owFfSss6t{=) zH70Qs-v2&G@dklpkw{^D0d|iUKF-hab_wT$AxJ-7+{5#ulhUl#M?Bhs5pV}f#ERly z9HiOI2V4lAhl$A|=PIzpc7o*o9Bc|p4gg8Pmcsq-uzQ^_N%*lUC%uIc!WzP2LO0=q z@+|0z@Q`q$aGr3S@I7G&NRwQ35c}Q)-YUm()WdSJP&gPIgoxdRG2$Nr(yUhk90(pS z%RDIDA{-zrDD)P-F2nKn2>UTr|DNK}TIebKsx&9qCR`@$EOZyX!P1!&N*8Vrb`(Yn z8w&p{#qpPDMF0O(JmQ3Ph1W`Q#LL2?!g<0FVO?Q4;bVU{We5~nkG1v&n0k)z43^r| zCQ?AMq(3-B#mQgjZWM95urElBsc98XP!6QYrzkiXbQk~UmDxWHB>x{k%HS9{3GTh( zzft^cAjz36{$oIu5)71p9um+RB>!NL1XUCN;^OZGlHzYFamHyN#s3MU49<)H*W&-V z_^%ZIB=H|#3H_fk7$E^&B_I+cL5;<~lK2-D|GeV=sv>862P8Q^gJg;0;=cp?Z^ES@#ZMAe zsK)7vffV0G_@^4k9_hlhASE0Y!vl*ony1?pQ5>%(I2_@Tt(kwfVtRsy;J>h?n-T=p z0x6>^!m`2wU=xI=wBUGZO`K4~%EB_j+uAEasZ>t?LLF5&0GksxLKtSN`53vUa*2dShx z#Jy3tO4v~g$NIlIPDs$WFgK+<=nifq!J$kakSstuWe_tUmH4@EwQz|r79=?@8@nkp zz&jys3RZQ23qk57vp}*?H*#bB8CYKes)1yI0C5)p$#fp#evRb~g+ByI&~1<`G@0DU zs6PlD11n2-07w}<#&s6OzYCJQ)8gJn*IyK{Rst4EzzmQw8Y}MMAZ6rEZe;L17KoJ5 z`e3%ibdcnX0%>XXv_AXa5#|$m2{Y<(_@DLA|H+hph{qjaO^^ictjn!?7D%l-qc$ge zDSRX>3T{C7q*`uDO|WMT?rtF<$*&=NM|czUO;vm#NaYBA@SqH?RcH4J@Ce-d#l2iO zM;Iq83zDG2)p*F>23CUNgT(FIjtlZUhIvzX0kpxQCsgs+4U);XhpKvCLZq!uXo@G-w1EDXZJC1 z3ueXDumE+h#bekKlR&Dv0m50MS&=Eif}I25E_5(QE(sRHz*RH>r1Xu1 zf5vhAhjG&XTcR6Mgz~dFL2i)TZeSH;I5*KvDT~%$6f6g3%wl&MNbWPjBf^g*+*90Z zB;$R{SiTJ;`BRo5V=~#f1?+KTJx6%5j@@^`JP5xEQoIXm-4rW$U?p2(jc_U04*p}s zU3dkT@Q>v@K2!n8a=xGs_?IZKklw!{6Al4sAgT8`yQ>RrXlWEaS2#nc3daaP5DpOb z6t)*O5>7hG1?&rw1=Mahp}Mas?6cjC@8xcF)9%^!2TAj$!t%nSNKFFT-eiGGer5Nk zAjumb48INw;uh@T?^y1_Z&+?!5OUQ(e?AF(dxA6iS@8y+_Z;D ztwC5Vu+~c~MiE{WoB(!w&I&~dn+qEWYYG2&%JJ?Be-Zv5JV&Jd?}ii7^cG4$JSN;E zCHg)OYyKrjnr{W&5%2Td?pmXa1<4%+dV@3EIbL}mckKq`xx5^2hqt>@0pWA3uq%4a zSWv}n8vg+}!R;IWjv(%?`2UdKUAsZBydY<+f|T+60_@)h{15_)gQTzmQuy+c5+5Y@ zSnv?S8wm6HvHL#cX$38a@>4`xc}_S6B=?=NC=o34rEtA)j4+zn|Ccfx?}9K@*tsGylw!URJ`i3nh3B7?(Pi;CE8Gl{B7-ZsD~(a-y}=N$wzvbqCU7qea>q?1tmUdR zpGR^*I)jux7^L(yL5iP8+%6!=tEEP8gsLD#@DTUwmK>ofNCL`(6#ljayPtz3puD(C zf)xHToWmc26h2PeAAuBpuNjBm04ZGECLS9=itvfJM@WQ9P280p@b6iZ>+DSpE?JjW z?%M1ZC2T0HEG#Tci)D-a2$Ds*_GODVVyb@M_F<0?L5k2>+-rKX{}PZM%S{y)0coT> z(u@7Ow&!>;AjJz3{?LxyhlF#YS^m$TutMv>9+-auKf(#k<4uI+gr35`$8q>m;jhAN zASwI-hJsmWjLXd++WA0*$9%`4W#hfYnjJ{`-Q4- zjPL_tAz@x&${H@f4&g@Ol+`FdWiV_tXAmt66BZKQOy=-2!ehey!Y_qegi}^={7-}t z!pb07a@R`c;*}~#90m_kBt{qr?u5z8iF@n{POx_g$6F$tBb+X*1X2d~7je8I!W;A1 zzv>)jdEqHFi6ib6t_5+!I&iu$ZZ_9lmsuQd(oCkG&|7$K2K)a$&0Sdv#V<@{_i^D@ zAhm(?c=o?4R9DJLWnqIU9HE-9jL=1xKAFS670wop61D-U8@2#gRSzoey5I7ccd_a=(^b1yS z43YYO37k+s#x4$s6IKWNAz>k~Ir!I3j`u`(OLzsO#(GxVn}l_CaQreL9*+3u61O5; zw_WdV>`10aEy>EgYUAbP@iwnf-s;;I4#2 zZa7Hs%WOdTDdUstIl@Sg#&&OzOzCl$P5Jd9c5eVF;Vj`N!r{Vh!uG<(!U|wvOw%t8 za{9Z%EeECl&xHpmQcZaKfV*~0xD%vqGYX`P+kzDD!G7k4Ao({G_v3wB756~$|5f;- z@EO_$`KJpnt2iMO9ssGaeJKH3goz+oqR0uh#H-`%?sAj`wE#(>)~W1nEc6$if(0qV zZo$?JZZ<*6lck`Ea#`kn(4!TfN4cZn4{36g*sAZ1iZ`1?g}R2M)hz+B-BkmA3* z!0{gm<3Nfx7Nqd{?63M&kO;%S;{*eQkI!?0`yeIQ1d;+a;k|S0{#E!HNb$OYlu1W%`sa+?fzeR?F1VK)aQh!KuS0cq=a|tF;nX@ ziwSSn@zCCuxen6XG6z7i)K?&-zf_CerLeg(`ELkh-l@t81Xn~=(EQ)20()F}hj|2~ zjCX-C5R@S9iNdZR)nP56xA0zh_CF$ACLAs7EUYIi0;2sZemBZ-!W7|r;SgcCu#B*X za70-yQFnh3c(cb#X}w>8 zbb}zUGdIqsow$xuL9)ymkOWo`p6%$NEm%~LOg#pqcsDw5yeq=dAcYSDDLkly$`MLQ zgi-C;Jye(*q{g)Zico@u!uN&kKw4V)c4tK+yKwwp;ZNyK^IgDWI3Qf9=Ko3qe`~P6bK8?*mxiagf}l`gv#YsJ(GQnsf$9ftJFC5@F$B_D>W}0V)0%kOVXWX<+dNN$`meIHR}2*?kCd$iMK1 zoX$r$a)jnq{f6*~U#zgZu!FF*u&FRuSWQ?&_;4&MdPmr56ld5Jq=E$tKOD*agEeCQ z?>yN<`5LpDd%TCX|Ho%jm_tA+X*gH_b=(-F#c5R#Z*2v>MmloeM!G%Vci?>Z?*k9O zJtKiF(I4Coe}9lH;Q@N%j_A0VAo_pc#To2TL8wk=g$7My|7ue?Vfa=SSRN!nk2ZT~ zYsUY9R29E~RMG*$N}Jd{VI#8wNCld`f!%M`OaI@ojy)!?Dpim$01H!dr_u-8L{D>0`uQb20iqdAzohE6JJ|mSNR9Aoko@zD{|`t{jd5lQE7Sss(wM@ zvH3VhTqCS=jNO64-ACBHP1rb<-Q|V;!kvdav`4qAK+0$+NLAKP`0^mTA817X|4KZ5 zIluwC_cMnIU4+lRX8+Z~CBlzDs?(+*mDue&ZY#f@=lJo$1LxS?KzI)pa;5oy+$B!% z#bpm=3QXDbM~Nu3fGA1-TR*V>E|5yLNZiAPGp}&?1Yrd~Pi^hkEx)I7lG*@x7%WAE z!nJ%o6_px?A5KbxzxXiMfaE`47$*#n@N0QF{9BOH%@%hnVIAQ+LNAcwo$}^%DZ<6x zo~o8nKX{Nv#U;RIW=PoSh0Z4*=7hV?*21&8L!fwJ2!U7=m zo-z0>EycU5{>^pvJxJ5&&wnwyfYhk|e#QOurtq|IE=UR#5%zn@?q1KCTc0u431ps z>-PtHv;e6@B_A?>dB7Z(?xD5Xk^f`EFty+9YRH=h6b|9#6t=>v~`AdPTse_?^mg>^tu?8IO4!8(R%9zk@^%M%YP0U#dMcZKOkFNvLl8gL3M>s$#QGuJ--AG^~&UHh`THb`!-L7Z;&K+f1h_+|k5KWX#=C&Y)sJHi{n zE5ftFBf>4hKcEm<;5bN%9z=$;2;CwXPY0=678%C=9v~HD^-%PG%J`oltiW^O1L5z& z>%z;zv%+J-y~0((Y9M9!>HDnMM<6Ly8YKS}gPDB?qyJODhtMcLG#U&Rfcrg=MzHtC zad+$iQdKk*o*v6X>?a@%u~8t6fEJLdV#FBcqEXB#!oI=_BiX;K`VpU8{m@gvJ41m< zAhm_Q!e=9RNVS0^_#@|r0{5qKqx&MBnJ|UJUr%Np7QPQse2dT)$KhpRaq^!(Npq_q zGjT#5|3EX!uLmk#m9gYuM0^2&54lnH{#J{ z{(O+~8K_ak%O|thV~TK?u#>PgxETUM#Jx0;GiVQzz_3}&lgNk!m!Hd)?75%Q6$Z)w zz&`d@g{_Fx|MQE-jjuVvQILk@t>T`tm;GO+FrV$=@bMs3SuOA)6nwp#nE;Z1tS}U$ zUiRcG_WxOU2~;WK7vix&I18i%9}9bme>;#eiULW&n&MwpSXgKQJHax~zw}f(qtR8{ z#Th@?$vg#;{4aJ&|6eN}%Z1(&@%|2u_`PtVaHO!Q@bPwz=MPeWatWVqWB0ehBf?$6 zRol=SDZxnb7$EE@Y%Z)Vd`IXfvi=)ov!LIF-wF>3w+UAWlY}FL?+RNA z1BLm8FV?aA+rrDjv!K@hSFPm;Z`Uw?6P^O!idzVY2xR zq+WGNSX)>Eq;$UGuCogLpCaB}$qCK~j|n#l=Lq|Ov{sA}_ox+~N-Q#bvz*hv5URp4 z!Vr*N=dT6Qz*An_#h0W1lSk?@7O+}479{^>;`SAH^iqyjRQP%cyMF{J{u*(Q5ciD5 z96m<)fpDPkTh+!U*$k2;CJFlqy9?WcWV+VkZYq4Xh%>$`{8e~W*g;rSxac#EKT@bh z%So89vhdYHj(A^qU3f~kPxy&&IJ19uaW@kFwt(ea6&_{wU&B=W7D&KIVGm)HFqiPJ zPg&5%!hzsYOfvW9^ZZ^Hd=G7*6i6!|i}3zDc3%+o1Ig0e=F+r``Txujo~O5fG*379 zf2^Ggd=pjr{wK7w1xgZbQsfpCr6@>2km91I(n< z!iOLOx2oQxj4K)h{ZaQvL&U`hVah3CsbRVKqjQbseis`v4ERX{9@s3#pFm!8E&^H5xynf(<4*>e;l4Md;Cqn| z<2?VA^v~e4pw0=&uLIZ{%WZip!wP`+fUKbX2c5Z9S*{!n4np9%H-!s9E?5X|z=Fqv z+@xDjU;^9#a#KGCz79SNZU(1=kAc^0l@*!^vZ7;!_9@3>hHLWa7Fm;O)RY02ZkGiv z0-14#ZIb?kX7B;hxdx5OSC#)z&V5__%axZXCo2boN1(Y6@94~66#KhU(3kJXn$>_? zQNSE!I>?HAiFmI0HSb9Q<;shd#mbMHB>oMM@za!}l%46@Fj`PB1KtPOI(;9=g5SO` zTno})4$_Y*F9BJ>k;>d165kDE{71-#@h^akyF+cgb}6`86Oba5>0+Izsgz@Mw0!&Y4a{UIe)YmCAEKZlOYu70v-!;r*R5oqhfZ zI2g+xrMe+Y^bC;Q+dc|2?AKc}GcCNLGyF`D3zT%owD88w@B)yVv^RJZ(vu#EEB`se z@yCPo{UH7P1CpKzGW}maN&5L9^Y8wn?2=#hJ6ql!{xxQ}M(dTgfNVsQKyHyS*_qap z(8EElSs#!`z)m2K8{c3H@f`5EvI$&`xNRWM0k=jXdw|S1 z4P?e2BCtCa+^Sp$vSN3`XZr2Rn?a`c^h!lDK`!5dbQb(C^@w|x{r^E- zU?IqiuT{)rgNilFElH73N*LG2#{@MRrgHmG8B0A5wdFz_7eYF<>$&bl~;g$ zu-wGsGA)}YnQ@rmrtYrn0J712Jyg=0lp6<0`ZXZCTj4-yM8|`kmGD?I9CS(B^B z2}?j$tSMi%#IvKN5kCZS`D&2MU!**6qAh`~BZWgo$Qpi$U)tt#fR*4D@R5Q{>qsnE z4E6;totWudj$Z_Jz!lLs%E`)?&&YJHl%7#Ou6#gwuktQiXO1h9jE1MYg7zxEP=2g@6y#0naUchw1XNogSrPl`Gv$CX6=b9EfNXU6QzYXZlQW%T zegnuyDyu*~>9}x`=rcj;#96Y1PA$!}BGBEGtENhN9>^`Xe413~nRA>tyMK+$^k03p zRHQG+z-P~u?(?YfZ{Sm?*pI5eR(=XThxFnyIg$*e^c0pxLEHAp`K@_OJ>^)FO^D#+tN5y-evAoCprGQV}#$=R{$I`n^LFbfGh z5S-oY}%0Ge3@D`96_E(nPBKtfKrCduy~AoIBgP3Ym2xybl2tLPMT_43L?V0r@xh zF`*&PhrbzQ0VLA06GB6df`0&{Pu>sT@;EePe|$#s4#Nxs$OjORCp6?v_|w!UAB0~f zG~~VbqO3*glPlma5gPI=EWb*9^6&8Lg@&}>L%#G{^~qK6lR`t@3qKvlYi?okG5A?RlZER)s}BN3YXJE;0`i5191MS!`s5Sv%Y}wK z2L4^@llAbI2@RP8f4%zTlkjnjAx$HW{~Yb^-J=2IQwV4g8gerHemG8Z4aleA2ZV;i zq1#)cKDioxsnC!k;a93pJ_A1@G&W~&lJKt50P!oc zKOi*ZMEHg3lX3VVp&?I&KL_OU!^VBE*34cKrwm)Xf0wmyI<6W)+~SKDi72N}(ZfI`M8-pS1slfF{g)%))xqfAOSRFE&^6*0Qn{SdZ8f)!QY`ixf^~`Xh@uY zyxI7q>a-DX4}8DSkR91Z)F1D~_Ww5mf=B=jiKC@=js}ol!LJY+62~I%a*zd(U&D_H z4T-Mr-K;*@0zV-%BnCKo52$~@#>`#>aF`-!$d3^)3}gW$e#$pHPiRQ=RPS{4$#3C@ zg@!x3gV2!2BVd;Xko({_3k^9OezspXG57;~ztE6F zu>zyjCtKm?3k}%}f4cbgbk6KYKv-zV&k?Xx0;ZEc!mkw?G949oNqzDs_;H~jPlvxp zeG-@6*)2jt{sw-(Zd?HymsFVf836&IAx9#h&$9AE%^vIBgMPy-ElE&O4i(?-BF_<2G@ zj)6a2eKH+>SZK(-+`^#E3^>yf0kuLyo`eiu0_l?(@Z&;5j)lKReKHe%i_nlK!|&Ha zmM62|2ZV;im9@8|2ev;8z>L)i0i{Ai_C&xukUrTN{sN&PkAS~ieX!Vd`zSp|Qd`ea}D3xtN;gDtRJeX<|?n9z`4^Yi~^ z4Iuj?AR#p56cq5C`s4uktwKZMoe=Nf-m(JZK=`>rLoUVg)6^#e@XLgTtj6a*Z>0v1 zgAfoA8WLX|>Rq8ec@+GWLPOq$<+rO(9u2=qXvkCHA5fnh44)4XKttN6Az&D0oJIm3 zgMd7tAt%G1rapNr{4${-&x2p7J~;$_L}8nP?=Me36$!e1gZWGDEm)h9>8Zx9-rGiM=Smj;ky5YQ|%S>hU^A^y!zx=_(7o|yThNOKA8`{LTDS#;L6y$Tm#5)2#5&{iR)1BX7$OF;U|QK z{1XcJPJQw>@LPq3#BCez;C{M=!SV2O9pdvpXD&m)Gz}n6K|q<%kVD`vQlC5({t}@f zuZO=%eeyK;^+H3=gTF(4G6+9O+USRznU8?%{vJn0<(8i46%ykG@uK{Ec0vd&eTm*lQ`s5k#TZD$Jf!}X{tN=L? zen4o*JK&e7Pln)^4nY6MjKK`Q)74w40c0@(B0@tBg}*|5auWQNLPH)0f4lnRWcW=& zLr#T%Kz*_VzBLg2A2WszZiXRX7{ex>^4RQM60 zAxFbsp*~p(f2A!mW+iwc0=8=ac@_eigoZo=etJMENS+NpOK8Z8;Ez_HJO_Th(2x`1 z&r+Yn{p4)BTxJY88v%D|0C_F~mI)0x6aISj$@Abh3Juu<{&(t==fiIm8nO`n;6bti zByM2a*|{=f$WL%6Eztn-0%TAsG-O9)Fi(B*Lih`WhWv(yYW2yB;Kzi9EW+}e)hGG; z^Vtb!2KNEME4c<5K+fPA2o3pruE9~d2B3kTD>UQ{@TaLyUJSoXXvmx3SE^5j(f_j} zoIxWbD-p0l1ISC@uM`?`8vO0*lfQ-EBsAo7_~}P$8v$p+&k`E)a`?m4C+%4X$iob1 z$e*zZr)dCrDf}{_AzR@uQlFd+e~HkLH==-5>XW~NUoSM|rCb5^LE9=vKob%`LoVPN z4AwOOFN2>YG~~JPN2^a>4nJRL$nQ|WS?ZHlz%LgX@*XU|RQ;ucZOfX2fLbJghAc(E zY7HQ-gx?@EXX;O4+#y4yD;8)>XX;QUm!H(Q&@hv`1W+pEI>d^Xvn7#uwDYDlQ+O`6dE!L z|2y@`8{xMK4S75KenVsh$eZ8?goebcnchOj$LD{}R3acGG~^!;FvkhN{d#aA{0gBV z@gT~3m-^(*@Rtb<`3(G*)F;`^<3dCJ5&kavXn)f=6G1?;(2&azke#cI2)qTpUuej` zz#p$Zc`N*&(2#$IKSzDC3Vwyqkhj8L4mzLzIkN}>F`*$(M8IZ{XG3x^{Djbuqv0P= zpZq<1Yp6p*PJurd3|43MZfKs6$@rt!~9>@&HDEtLNL*4~{ zh5F>}@K*{AnS{SxeX<&UlhBas;U5@^?au-ZAYmy2tm7OS@>K*32AwqkYvAV!4Y?8i zH1)|pz%LUT@;Ug6)F=N4e~HkLe}cc-)_~PuEdm;ZhP)F2yVNJ|fZr@M`__ACt`??OPi(2!>$gQe<|e}-QxG-N6K)#{UX!*388 zaw_~C>XUWwlR`tT!1G^k`Y>4oav1`$gogY(G8nBs`4{;4LPOpUf0p{>J@CtghWs1+ zrRqC`UrWtHJ?KUI^S-13XUzi9~2t$0UH_2(Eu`rfC`}@AB2CG`sDramkAAtcSgPI)h8c--zYTXqgZ~A`s9P~ zTZD$R>k-iN1Z_m%3IyZ`4Y>;bc=gG@!w(7#iF=dYIqH)S!LJY+@<}YeTz&Fk_%WdY zZEGb0HfsR65&;RJA)kPMKz;HN_|^!AhI|NFY=Ut=$_tuFj@o1dIaPP4Y>~fboI$6;fIBWjKg1~KKT^LSu7gEdsV{ z0J$0gO+rI%fPX-J@)`KnNQZ`e4gO%z*#+RU@Nc8A0CF<|5<){Jkih}<$$!GP z#yB(%;SYo63XpHY&l4Jl@TaR!z6C#Q%Zv$wZy;ci29OB^ED;)VGyGNRlUv}|3k`W4 z{O#(KTj4he4Y?hD`bpY`z-{pDESWLn+Xxt~0pxZBbC1^#sP$+zK$g@$|u{!;bH zci`6w4f!(s)#{V)^7DU#%oy?|1nkfNvI!X^g@#-JKYOgK0r?($ztE7&;g43Id>?+k z(2%{ci)Vq{MdSzk{9o?OScb&?Wba)XK<+>W%Y=rUg#unupZpMhTxiG{@OPbSzkT=4gr9SyF{BofoZ-Rf9`s63@mkAA7 z3I8SaN&8a-#4!UJ(jZ`$29UepHwz7U4gBnJx(mR6!S@Rdc?tZ{>XV z2q+U8vK#@6z*#A@Kp& zn{QjV^MM&$Ra>`#DAf8r7yuW8Ip8AD4_1L$;H@BF-2&EwSAZ*(G37F4trBH8aS`PL zrCp&j<;t+KOj)W7DTB%u@N5*^44wrhLBx8Sz^PyYJQHjLr+{&=1kCf`2ngnaD8u#! zFmpZif)yYt=Pd^(f?@Csa0z%37y&N?V_*@u z3@ij|!3k)8-Z*9^BcTDD1lEJaU=uhSOn{eyt>BaRAkhM{@ic>MWJ!>XF{gvM}QHq7q|fI36_IbBQ6YH z1(tzVf}~pmAs2(Rfy9T@T#=+FYO>GiVS_qdFS}1+cG< z1+jUZHz2~``Opz?6c_{hgK=;tm<0JEf`u({7IXl74-A5nz%Yo(*%co_$DoISaa{j7 zuwbCcz@m!itOp1K`PE5F7`F!SP@O zJOzw_zX9WE*#0MBCW(Z6kfR63f&uV!FbJLjhQWzo1Uwatfdyb3JPk~O6F`nGECd5! z5DbF%fMM`HFaj2XF)#$i@%_Wj$mS$?JQ6ti@Hj94q8)gH;JaWLYyuj|ZU<7;zjDfiwtlr)@W(FZ431TaH ztY9l$TA^~Rt-2IC+?yh)HF9IYD3Nw5>hdv|An0q|@v2zCR*V0SPAVt0FE zAoiL!4*m)0NpKd(dv}+C0gyvHf*^--gh341u)Pt?%tt~DI9XReF0CIdm5ac+5FgO|qCvOBZ92XD+ z`TRc)@;QGJYNw5f-pLnkX10Wx6 z2f-V_FnALOr$sQshte^S51->8A2KIFK1}APk)M%a0K^H%8wB|bI1KVxZv@1N#~TCr z=r#_1#|nUa6w7P*QZN9%$mPKjFbvwyVaT(Ua3dH5p98}K(EtC0nFtc@ z1Y_XcU>vLili&(&!h!OrCIFTqJqS((!{7=q0{$J0f%k)P@NZxe#G%A%1>`|T0E{6$ z2%?93!!~9fKtcq35R8F*;1CBNWd>k9$PWXnzyOG@?G1uYLWjYXU<7;ujDZh>aS%P& zn*`Alz1C53mpuTYV|jz%BZ#xZnE3}Y0M{`CFwP9XHDD543-Z&%1~34=1_r?wz%ck2 z7y%y#V<67`-Z;p6!b$L4r1QhZCNKatfKT4&{e$=@MdNJM!+~Y6HJ1$L0$mf z0tUbvz#zB~41<3KBj8pr2EGNx!EIm?L{IkeLNWmz0RIUF!8bWLHH?`zkPrbkgE8IT!(P%<#s*-$BR0E5IaJ4)XKVTrdF62ZP`|FbrM^MnD`gyfN@9 z=s1W&fHw(NKwHD)V|@Ue4jmkZws|pT!bm_@_eQ|}R^81x-fQjes@X--t@1w$!@WHC zP?2tJ$2PP)=~fKC`!o!C{8JsRyTIlV8F()=-P$t&-xCY2pTVzjO1CP1FX`*?{ZiDy zO~QJ7eG_#AUv@+;|1JX`a?-6aXs}*hHS<0Xrvgc^60eHBNOfSp=*v|5FYq`CH>nN| zK}9j$uDbLD(f6hFDAA9pPL31(f}>G>#Ux4irv@ah7X6XxFb*7?_N8<(&Cy4q$6yVt z$X?OIRM$p3I{s;@TgGHK`r?!xFS?Q%cTKI}sgm#)4M-T#FRPARDf&az6*q|9pVBvp z?u9PM3MH`%IOVCXeOvSysw?o7J)BCRZ7z_vUlK0VfY=e4PQZNCi2~6aqQiK9Nc8fQ zK2P-1s!Pj6uU8$pMD%;A<1U!04RL50ccP#clE0EBHDhO9pmRoAMvYcyfO-!q*}wn}yQA<^qqSE$~hI;Q$7)laCla1`YhN&G{W@2ofp)iKpKs*bC^Q*}c1D%DBVuc@|HNrm21o#$xm|9@*jL<2lH zj<HkI4c@s?Jk=qUxY(jQw%q!>VVgjy*2R->f>Rx=ywA1bmclJ)K&B37Gz=x<&Pu zs)P07cfxss6%4B$kkU_yKSp&-^<>p?)w5FiX}-0L=_XC^ua*q{tU9dvN!7Qi-lTf5 z>W@_io{{ChQk|!|8%|8DaH;CiswZeuLtA0s!=^A`%3a1Y>A-qO3PI*p-6{@|eTT~yb+FC2|V^t^L7G0p) z|BmRhQ}OSLzDRYRtqHSJ3%n-*3slFFqHj|j`B?OyQ}LgQeo%E>^;4<%&&A)A()&a= zskXzdlJL1Elho2XtG-rsh3dtkZ7Z$`cWOY( z&ywLo&;v4XdOj%nAF3Cqeq41_^;4?vQT?pyM^wL{`UTamI2!G5t0t_~fTZdTs`smY zU3I3F<+Pc%RQFcBU3Eb9d#aC7y;F6r>QAZht$p}{A<3{=1D;p?Z`JEmf1|pWN8*1_ zJwWvV)kmrJoFH3pi0Ta0!&G;Hwz-MNXo6n@#;fk7dV=aBRfkj$g!W?Zl&T)8y4!my1}KBE}fOtzJNTJE_3N6j>i5^RiMEY(CpIwPVEcG zcj>T8*Sd7vrJJdF{!3LLr*r!PLN2|)rB}LilS^lHX`f%dOP52l{6iI3<_c(Z=~kD{ z&2C>nnM*Hm=?0fhX7gK1+EgH`Yx@lITsrL1wJsfZ=@yp`I8Pl9uW-m~w=b~56%cdj zMwf1N>0Dp?{K{NQw&y`T-(h-+l>C#Ou zoz=a40r@Un-d@{QZTkc(?$RwToztUz0U?)O;Lr z?$XUJ?eFEvzpb`$_A76j0KLqm8(q4^r2|K_FCgU73tW0-8*TIKmuQnfZS`)SVV+Be zUAoq#<1XFo(mDK=BiZ6|{tq5ba8Ab+E**2}Mwf1J=|G=D1vvSITzbJFjs4FxjvY!6 z-RROSE}e5^`vQV4UGCDgF5QsQsq=qxDnZZxIelFPxO9a}$6Pw$(pJCr`Q@oTbp9`M z1uSvt2A6Jj>74%U3kbS&g-gdoA3pylTmh{vojag?0c9?|#HAZtI_c8>fy@v4KXv-e zcM=Zka+hA_(v2?N;?jXY`wE9#dI2@hf2j(@Tmg+P-Qv=LLG24Db?Jyp*SmBQn&ls= zfd8oW83tXt!ljqFbljzzT{`DzSN=!4&i@szfS5}+x^#<62L`t18e* zcj*?F4jk{wzpdu^zoKmdPev}CaA|8;`wa73I_%O*T)MuEcFzAzZ4#XG|M2z&1IxchRB`)3I(n**0k2q9-lV83|hYxA&f3ES8LkXfA zT)Nq%bMo335OV1XmyWq~BBfL3|JGE3p8s=4wlAQ}r6VrA(xnqF-RjbTQIh|m^M6Pa zQYWJdmtN-5jV|5l(t#7(uRy6wM?@b!|F3ifBwV`HrE^ES3UKKKE**2}Mn_}+r`EW| z6%ZKHzJQQRSGe>tmyWx1vrFfkg#3B_O;sSogf@DCORse4giE)&bYN`z{7PLq0?qOd zRbZtnpvk4J{Pr2)>s`9ZrL#_Lmmi-0wNJ3hUAoq#8(g~CrE^YeSAZ3A=>_dH+W*RS2^gH}(pkaw z8Rolmxl7l&bc0JL+iITw{ROT9Tso|JB+m^9tyO)d>V#^ex?+OlcTFl@b(QLR)ptYN z%&@dj7Fd;9K=oSH3Dr%i{Y4U=j$?<9;|FH*DB_HGa&+WO(E|bc;jcvFv7n=q9g&D> zERTN-@NacAN5eb1-YdFPb^Hif;8N9oKC{PEsk$D6Ryh4pbpo%?b6TOgmP6z*y{Nig z^_x8Yu>yg!9G~Cw>*(-BqCZJ#k^Ev)$B&mw0$0RYfj>(Dy;UbLz=+c@)$!#Lf12vN zWunjG_zz}~H(3&l>exG?uT>op$?uMk0=MIFCnmhc@96N`qVYzwqwBAf1@QK)qieaZ zFukoh!Y>cUWaF(kCm{KjB;eI6%ZJ&Bj%dION#f6S;`#E4qbsfx-CK2FzUaZKt!qS& zR9$j0-P|s&(SewdF=mR@*q z%`oj#9qS>wGa4TodA(0`Kh=Tm`uu;mCe)rQ0r{%K*`iNREua}pR-MrJ^HsN~A5JZ= z`s$SKD)}u=#c$&CS4_(^A>Ks-9#S3C3OuVi4?j-GX`SlQ<0L+zI>9fT$Mj)pdB123 zqI0%DqNnIq)%CV6&=I@ZIS%LoJyN3#Hm2Ff2!!SRF~=&Fsdt5 zU!mGgo+b-aX@aE%-jmWn@gG+m{!q5SE2`t&#NVho_`Uf2EdpnS@T-ZOK262zF4!yD zwt~(lPK-4~92ZEc_NflwR}?w*Q=Nw&rsOnAbt!&vlT)$kFa{oSI$w1H0}we~s@nfN zO2))NbUwT_Z6)+%@+S>w=_<{-UUi=O-1V$r5MwGieX2UFCle1g1pRo-v8^LhdX*G7 zM0JFl64S}lJpTI^Ny3>LP|AIQiKFD0VZAOeUv&aQF*#MM_OBMbQg!$i(XXnGsNS0L z2cqVfK7zJcKxB|4e4_!S?@9(4==1dR8btR^>7yi`AM5GI@El z_*SQU>w13v-~ttT!BDFKN&M;|r@yO?VelxYXI1-`I?`IBI-x@>-&Y+tRpR%nw$wke zlT@(wH1YF0>G?mxpSr+wp$4?*p>(0@09zZT<*I`^LLY(+59n$R9&i# z(k{`2m?m7NI;o9pk?O$HvQJ~F_=xCrs^c6;f@!|$pI04mH1_}dnh?~0eW?sI zLvL59V7>assIFCgddlxD6_};k(gPEI8^CGgi8bQisXE9;&-4ESnozq#0-jD~poiMm zRJXh*{&v-+ABf(qIIiq6K>G<#WquhwBYR&@p9S-y3WCL}e3iK^pTfwGj| zDH&X?I&lX(J6=Xn9k}0-*1f7D4~u>zwY*-CypZx6q3w)MZV7=)5DgO!4 zo$=n6bKt=n2b>0|PD~O#QgvQ0sqks4lb6b&yF|6MlfN2=X$BL}{^}pZArRBGs&}Za zQQe~Y0o9Qe68|zaHbyC4t>Cm#bsk3-yY!dc5PC&z~h>bhgYRI zy{@{YT)O3#s%xX-r{VP&Zm|{}NZeQTL%M~=P@{nOd9wUD)TmHED|EGJ+e(~{R7^`W zgZp$K@gu5Zn&Db%ZZggA1IfS&YKGsdZqfWYcb5v@tNHa;{h;PI($Q%D5e*1wz>TUe zrAC4EOJtK>t2*x^*WZ5r{w3A^55?a~%{K9X^oqTz^Bxx61+PTWFI9a^PoDpg5YdFw zG@xGf1*$F8b5%E~u2mh^UG@*vwOWCfRhO!MS9M;hf<3YSS%C^o=z>?Is1rJ}`54u; zs!yZFE=!J-Ep)c(dfg(IqUQu1akGYuMO6e)G zz~`#{dV`@=bqudkamvOKkp%=UmH0ubV-JacqUzFnMB8U+LjApx@H^Gva><}lwKZGx z9Vv~s(KtP*I<{W)vnih+t1-Qyx&`laar#ts@L!I$t$msh$4g)Ujn}IV z^9SQFy{kIG4|SNnR9(SOnV8b?78-X!%L>s0s8QiOt?&uzC-HKrbN)LewSe~1vsB0M z0xzeTssk-j!Ru7l4i`U~^6_>nC;lh_D^S6o(8Cm0ow%Bt4PS($y5(WK7|eupyp86x zN_Dz!Y<2veo%3e~q$BXpj=WAYc(i~g>k|LZkjnf7D; z_y8-EyiwL*x9V876xa!`zcIr{wc8%AdaLS5s$;5WtFBjVs}4WN`>&Yp)`W=eqerPx z0spH~fmc;mq>J8`()?VFX?IFLFMb-{$72O+b&Zcw9oOrHQ>nRvb{AP-nkKaHgFB|H zbb+95ktM2Qn!(>R-p@M;nAWIH;w5uVTU5sei2u3j+JT}EQllulMGvKYac#yLMew>R zr##iMV`PC6)yeLn=cN3eqH9zKjup+{4q$!>jo+5iVOha{i?*$ngR($ZyhO|e0vAcZ zP}PYJqJyeSd8-6dDK%#E^u?lb)wPevE{&*e;m2Z3{AmEjm#VIJG~53(67UuiP=S`u zWD9(%I*Iq`IsKs8pDPv4z)Q=_(9%YA1T~hg*Ija)>RP zL^?{qQq=*y=6fXN<1KSeYg1Y)w38YYis+k9zo^br-FKk)Vbx=yo%4U*2w9`43_yiy z(?rkI1zL3tZ&rOk^>Wq4nqj@_J?gJlU7|j}`kxj2O#M9rar|MzPED`^Qi1w8+^+aG zjezJNj#!+=1Vra$qn4NoRoCjr_w%W-Xh2`LD_1}GNBJCZlj`_V(SHbxlMGunSNA>+>?|=2m)-u{#fPzO_VL{O#e=gIs!qOBcBGG?%`}rDwL+_|p0I z3D%V^J=djga_K6Uj=FTMOV_p2Hl9GVOTg>zF8#PmKkL#jy7XF?e%+&wU*8e&(s0 z@CR>?y5=cFeVRw0;BTqConQE@1)VA!4t=vII8ZkC%r>>U)hs}_3_{zk4N#kKljKu zeoz^%7oCY7rj+JE-1%4cWVvU=5s%>}h%+IKOPApiqRzV0yLMDJ{`MlLLgtLAzHaYp z>8Ex34mTM%rD^habp;!c`~yCjb2?67{ZMzuhV(&o7k=v*&_5R+iaFtnRGcXnA9y(H z$C3AfJMUQ2Uf#hD0ez^JAGs?=?Rr{|re>jV9B@Y#e@u!ArMmz9hv zMRPr_?#VmSd)ygYpXGdU#9SmNhT=@sx$g1HJ;!y39aYz@BK=tV+)(si1?Qa;s@jtm zihf&CGry@M`a>xCPBU{1)huibMR%4&zj5Tgq9)J0PNC|B&Ei%sY?PU*^?4T+m>KIr z(T$Q2UFVLCe&jf{EDwcMgrf6XL)9JZP_!tHe+{APNm-$xYeLZ}jjz^Y9Wdhdpg8(VD${Dzqo`>^Q9NT~(VDA&_dCmXe%#kBGqiD{vrk{; z8OO=IIJ&+#dPY`pG$RyU7phv9QyevZ6pb~N4FsLFuPE-BXLEBVv_`USDCIXrP4oRF z(H2xKa8beZ0#k7DjCGpx#wpR+StZfW9l1NLIJ(iv=x{zI(SwdR+c$6#ccR5jK4abN z6WZx7=*;%n0}Ca9Ys~e{Esnm+RgPYt)pkFuYquMUqXP=|WqRgk6jyEZ>`tFjZDZ}m zFvnEkp~dle!+rja+%Udwh1dapXYIHjoCdZ**4eIFpNpo$^?Q}El8TKc*`>BusM^Ur zRE>|WYz@+wilZA+v&b{G(rs3#;9S{>p-{A?IQny_dhBdpZjs-YJ0;+>3amfdMReoH zts^%%%P)@m7B50?Dz08Abz#CFv_K}jauAc$5Xp<4VRCfCq0mrOtH-x^3sMWJvGc2^ zWJL?oF`FLsyc$5Y@wM2vnZDJ@K-|1yyIr>5gnYx|XjI^F@#5;DtZ#hXf?35gO?vf$ zJSlit$oIrLE***%_}fqi>9Eu1-BfuviOVS_*393d6xyU z3x#T?B%u1Q1*_^5E`cQjIJXS$*zm1|N?61o@+N+`N-3QD|3>ELyzp=B*{w z#W_=I&O2BX{kEX$)3k!B&kjtfDaanVb+_L)Fv2>8s@8f!Y)m%eh!pGe=PPDzEkLX1zG=665Tr`nv@I|$LIIfdfB0x@oClb z(gIa)b`%q9Av4h?^j@5t4)xyMUZ>G(;XL)S??|+xQmw?vdjYzkoTi-Yc0Ykj0nJ#F zoqo>`1I{HFFF16Q=7)Ir~a zb619<+d@OX4K4oQ<|A;*z!~`KQ1tzSrQy)HCg0*0kpGm$yL^9$Vx}ZIzrMKYK<~L- zC)A`5UQ*OhQe)45e)r(wn(2f6p{h??QhS?g7A6%V{5sQA#r0fK>eSHr;~c8>BKPpo zi|M0l$Yy#O)soi?`+~V|tb4r~??;Kub$LbYnRoownrlHPR7vZw&a0S}z z;v8IS<0`A9+P1Sws(*)Ty=2MI*3g>P4xw=^b8jfFJ_%a~eJ-@-U~$I?K1clMY^W*G6L=9DsxC^{ zxK8#vg<=M%w%o|emqi6n^p|r7~=vZ8RWrfDQId|CZG0v>#O(r6tFSaqg>WTi4r!iy? zMW@ST0ps4hwo52&s()l0v)AE}=Sx*NbxFknN5*HYYpX-mnW5t+X3bcKH9mN6ACDhj z(q{Gdook)eaf+w#_(PxJ58m6$(}lkRhJPLJ_INPkO!mQp9`Cr$k9n-J?ByP7)=Z`% z&ClP{!av`09{lRkP$#X@is2eQ*3tJ;XX}ZMBXA3@Pt32&z%AO3 zGJLmoww7iNiFLM~&K&Uj&en&SJu$yG6J|}8FVfjso`p}yk7oJq##ojYvXIpmSwrsY zY}Ixeum}mAdSd>~PKf@plkb;K*8WcCaqS8`Cmoqx*THj^Kia`_$)KM+o_bGr%)aO8 zxZmU1={b`FH9IzRz_%~r^5(@39UD7%;vI03Ppz!1*jC7`o=*5m#t%GK!NuBU^NSaI z;-_%>4SnvRwce9F`TD`y^4xf~VM5os zK+m)sKd-KwscmX`>TWG+5AKRWU5I&^Z1 z!k@OKbxYmyNTp`f4eH!AFd~)bgsSvEAUAhjzx$8!y1RE;r_8pQ+o>BRhceg2u*;mu zb7N_Vv*9xD<(m0Zo6o(fS8IIM=ej*p)te~QbI0E&@!hRoEl_vMfVAE=FF`r|%AQ=6 zvGmXe{PiY(T^9TGa>Z57QlsIw-9=NK53|22$J@2tzN)L~)3vYttGc*$r#tUr-TnXF za_((Y^dGN7X4ed7U)NpoNcWTP_IrGF2YnuY-PMnDA6b_-qi=fpAgeCyRQQ+j%Ow=U@-v0P@|;PUQ$4$ag#0hf5vG`{6RWVNNNV=AlvQs#x*m0NK^-wcnZ z?&FDF`(%c(_Q=K&hYO1z-Al@^D=qDto`xzr0nQ544Jz;6?@(wunK zk7*ZxXMv}JK@i^Xv6`L>=0W3bAHVv3cxP0BaR)T+TM&n+;akAr_zLw6;0fT1Aa=qj zyx_!<_LN7!ix9F5yb!0>;rNLmrvh()tN@Os4p)M|g}xm`^|HJQw^cI1#7z;rOCne6^?5zZ#s5KtAy2ns9tP zjz<0Qm7@-)f|nwFB8ctRe>liB=?}6Z9K^|jdw?uBOEqr`aK)0iiCPN222KQD2D{tH z2;Uax6wK#q47>-N4E_n61pXf6f^)zL;7o8T)?hkV2z>^K-87sdo^g0TWf+KCK>hoH zTyqYM4k4Wbgt_J!;6$YVg5$D{!9D#s0FZ0m4AMw~ex$#n=^W_GioFc7V$XoA*drh- z#)m+x7{000sTjw8vtk@N$%9S5%j@mMwt`>*cr`c-oCD%Z-1(lya6WLX z0O#QJ!`?CrWE+_d8t`meXQqJYdc#izXMiKYDd5o{*E~)2k7!J1L+=Dn0v`tH*MJki zMIg7#LXcbLbg%?`rn40M7|1Prfzlp?nah#zGYViU-UxjTxE5qZx^4SkUD{g4|@2) zpO5d)=8VCNbs_?a#V{ngz8BvD?JPhZg9Y#<%%man;NPN}%!FPJvHb)-H_-A-a?S^ z-}1;7VZKyhgHo+QX#LX*8A0J71Su~zUBD4o;IsskvD(_d8AXQPd9N@_wp zTXZI?jm%O{J^QHM+*SPJRqs-Lit1L?Q&n>mIj2ihFI7EPb;8z!#hS27^)l!ISk=_? z)#a*N)sLzEN%acVU3^mDO4TD&uTnihb-il)B28GW3Ad|mQ2l^veB^a1^qJ~4(ERq; z)YIHIR0sW1fs`(HX^x@hq&~jNq^RfS1 z+a+L)y0_1u%%y8xn!ifYw!l`G&cj7WTfbcOHf}LqPPJ+Rx;RD>MXaPY!qKV&+Nds3 z9aFtjb*<_KN5}a~0?zcEYW5CJJcn?kQfk_Pd1ok7g{GX0KnAd%a^j)b=ZW(d2%TxE zYIZwLE1?IX!WHN}ocf``GCqKV2B(FpOSRiQPMs0461u{8W%3Lpp!;dUCk#lBSY5RZ z{N!kiBGX291U3=lQ-cFIpqLeiKR0rV_g&9f{ZO#h&8Yyt+o7#4c4@wA)z+_Y>4kO0 zK^!CbMpfIe2A7Vz^hTF{)1}{b=^ZY;tG%|ZJ?#^$eJ*{_rMqH>w5@PIm(F$R-?(&f zJN?{s+r2qiI)>%uP{w_ATV{E3pF96U9DikuO8!UQetnJ}Ibu|P;P5o^BptO)uv=UA&_odan_|LRcdIj$nW0`K3JiJhlR#(u}vqxS1H=b_8 z*x4{$eDSoRvS~8UzfBLcU##(=G<@{_`HZf8?~Jbv^s3;82282%+zPKuv(kAlq3@mH zb%9>~MrrxEP7wZVhOWEjJ5TSryeqn=*R||V4-CrJpm3f<_t-8HG_LLzrNsWpe zEnx{nvA9M=^{cxhHDo3}4L`4h15ryapA~L(hRk$aiL@N9-O;@ zNPtCgU(E^x6h`-IeM^oW|9bW0tOC!Qc;pb;_DPn%pz4>b%1fTi zI&Lz?&a{TMHHWGv=PW7kAl+YC{G{KN-T~=3l_Q_baiwEm!Y_f!K6dqlteQ~ZhxdxN zeZ4qd=qto%f(bc=OBSRT)SQut0SyJd;tklQp=BXYTF5gY2jdws3!`(hb{Avl1D?b* z9Q?((;c17)ZSegu9rMoG-?HIwq{gwxqT~?!y1&F6be<08edx_|-0W;#a$%pyo_x8+|VOBC;mO*&Sc%?g-yLIV-XT z&%WIIW1?fU+flMZPJqF1JGK90f8=0yJeifdrg+=u{|9?xKQ}ttqI+*75A6-R{qD$e z?Ttett($VMz z+iMRij$R)qMvKM6ZaHkChxDGp0b3LO#c7#9P64*j7qhUH8Hbi_A3jJF__|H><4 z9)Dd=46#HGYg-ci3d0yn^cj3{w5hmyV$P(R?7ZUW)SM}vv8QiH&%>i&r?T^2oPf0& zV^uBOj^is@)|Sw=uXcBc?&AYdKBKe`4GJhYm~@VWvX2TH&_68QP3<1jIjh~rdFqGt zan1-lrCS>(vRPP%53OyFtp91e{i_B3xBb4&c_(^3o`x2L+=PK>#pAZx z*A-#^&c!)LHd&}TeN71a$oK5n!sw=LUlmlfcB(A#J$t_A$*jWMP1`={^bV4`RgOba zhbR4#WHYT#<*`UhdooAEiWYC0*AwZ3D!oWgFWC1UGsNE2$oMcs1VOY81Cw4SU=+uE(Z%bEWE;Sj(Jk$%3l=ohm1? z?$CY|oj^*r$}y}uQnECqPvz09cwux66Sz5gAZ}1)S5}*Ay=L2&of6S_!Im!zqiA}~ z&ksUPhwk0-1?HXAu-7?_uG**75B+9pV4)wa3!Blp9Z#3HHCH9uoUgS}wU6(v@lR$R zcX)}mjTW7*q}o?fJu!fX;#F%i*ZhdxxV0p@22ZWG6p!0h zrv{6zz>-cofiGGh?T zI}k%NaT#-QmMxu$jj$nr$_{OrJFtW&kVEak_v@{2epaF9os#Oz;+oQQ2AAOQ(68pa zL(K{Y2(+q3`-R2(e2bQI3(ia+E~m)%Y@dRfNjU}EKCSu%#|G5f#)VtWBtLpwr*&1o z;NXC?0(7xSS(=1n1C!9lwm2z87^Be>JIh(?0;iL0+18Au3o*(Ieaz`v7+|{POQ*xt zoSBJA6u+6;1Zcc$!#Ig#;zBNZy^UthqlsLG^N5EbwByz;9F5Mx9c6KZhtmgZuJPbX zx@v!Bd#zky14lQ6Ga6Gukd+9rU(cLsT%>y^Zhl zJ$u%XxQ?0Ujr^E3*X}xU-^lnEqtMUU45IH;ebySPIis~W8vlQ^y$^g;)wSrKAp;CH zdM0hqsHm}xHfhzHRN69?)(p(RIdBGI6$xHZ+EnVhwUz3O(wgK1Cy^YF15rzhy;`~N z-rmdm-S=M6Rs_A`Oi&WAY64dI)5<>!jMJ<9u@C|!@4NPy$xINdulN1@Namb<_TRPF zUVE*z*IL_19e{C4df@Z5wrVn%c2bY;I;9`mI$wJ~`69A_M;>)F#Qmu6ODs5;u{^zX`P)NqmLGSFr|%9ZZghIl-fNBLpd5CT-s=ZQnza z(Kjf=zX`R{<0~&!J>Fscj>1$Q{XJj#H=%Y5HA*7YpGwWw7WBNwLk|zBS#C-TW=(HK zFH|^EJJ{M(d*NW6wyfLJFNV{4;Bf3+neib2y}wa9q_y7xkCFNJLI8!>%GE0vzXCE$41)!GYY3Dkx$;>Y3*6AVPtMVLk;KWNk*i#i788Vy=|yF7xsGehPw0IpK|x- z{31x2FCqdGESG@?MeHnDTbY^syCY(E8Sy=*YLA*Ovnbds1CV12yDPQFmpUNiw&d#C zRPgFD+wM*6@}=IDB=c%dZC~(euMK*QFhH+fh2R&SR!UEx!{?N!tixunnOZI#xz}`V z^{bwEnOyz!K1c_o{lB#XsnqUlx67`s?aFnaq|@%v9jzmHuKfMhd3Gw5hM_yJV_G?5 zRA0`|(^}fkQa+L2hwO%x0!RV=e~b{<6dYazk+e1m++f&8_4cFDSwZ`a_RS*DnOOL? zMD*un@$jD&vUlsL-QL>G_;ILZYBc;7 z+bOg9xN%LykBTj4$jWNpWL6L8fnIH?#LS$Qu*#4iQ$;6P^?^;(62F-s>sr?$hn3ff zopbRL5_}s4bSJXLup>Uh4x=QxZH?(UVc5SnQh&NuPn{S&EiwLcLWGo!YRvVTXiq9w zYVF^qxarv|g9o=ThF&FRp_V;&r4wEQvV0|otC!R4H&X9-Yj<=S#m#sMjlbA%Zn)Uz zj;^ukVjszV!-hkTulE~)-{WKF+_o~}IcY2!JOw6cOFl(2M&g-Hej-k!BI1OrBF?M{ z%A7iW%6r#k(-YoaBaslIro$s?@#B;u@k>U+3uWD)#ig~{LDQL=G_m8y?6y}2{_!49 z@aP6lbgb!lE7g<1LFD}9z%;`CzS)raz^>>9NY*mk|)Ze5e98izFcny(p zm!$Nol!N^BVlJOzhP%A6UyHv`!1VMnIix22Mxq2ll=2y=y{s>q>~B*|ma5|Qs(8Ju zCL^#VwjY2N4p?jd3W_H-4b#&bwksD!?1@$~V!t5BGP%`!*yAxhTMT>d1S8(wL7JyF zN&6^kC>88(Um!`$din|8hgh_%-p`p@!;;gh53!FSL{89_{&ztToH^F+R8(P579UHN z&cWgKTGPZpTDPz)Pc+q3m|A2&_9vFm3zW<5w}=?{)J?A7OBG-KGVIG)vZ0#xeKnbh zx^qn)BhIwV4a1h)W+S`3rQqRiqRMwLzwr!>5MM?JC=Qt6gF5bb{Gz0tfi7r@_){Hx zPGF)|DAfqJIi$49QdX5=t?&jzYPal~nBVDo&E`mNJ^bke{p+$!g3rreQ!}@QYd7lg zYm2nDFguKr>L&6KMAE}8#XcH;F)AH^Mn}ITUza4LT;uVuz1`@3NkGpoxVd(aUGOuq zoqM*r4rYh7wz$IoK!3|foZzel(9{ZT^|+^NH!nINjYr==XGdZc4seHY&$I_JU9`~h z9XxC+LiTo?M{1LutrHgwYV9x32k=w;>SFj=yi4l{h_UJEhoPt0euQgxWRu6ICA5m@ zxGWjT5efvKQ=@iUj`=d5mfW@PxCOMf>E!R8R6p~(-@Sf*_ax4hbmzwv4^H(Q?XC25 zOqvycP5~h{vSfsM6I3mVG!8^RWd?pcfn+bqW@1u(_x+MlzMA&#j%hbq9se*JmkC@V z{2h}T+^6!6Npsw%ijGM)xldIclm6a)s_B??vz|&%=$JOwxnCGJd(thsbAKyOwL2ga zgSr;N=~U^gU0HV?OJ3U+%zZAZ`gyb0qe5x`B+$A0Q9f zI7ehBP-}mXwVsxP@R0rXkZh7NQfXw9lq;LO#8=Y>Np~ZgY!lX7xT`zI-qR{V$(3PBkn{P$cieia6+Nb;tKwn zi)$!wFjw+;zU1Ai|%4!`sz>ZdPvUiK4}YX@?SNG&^%SWb!f^AUoI8F*W3pDonWeko#)3dXxG z4B3y|0jQ0}F7fNuEoX#YJPEJvDQKT3ovqxrE zm)vi^Lc=Z#Y&cVLEb!)xG1P9h+4rjQ%A{e=Z^5p$?iD0ZKs=BE?#{9XZLa+#3p=q2$N z6%`Va9z7Q!K6YvC=7L>7#C_n;hv>Um8XnvI(OX4M(<%GhXH^5^?7qS#N~MX<)^2vY z=GHEikI7b^b6+axKLVBYM~E=glv+zvt)ra9(rs6RA<3GEU3n$`T%^Jwo=(1BF5f>a zY!;llD)%)hri9b0hUK@Y;X}u?Sx?b32!m1&mp+`KRQ0e zxwdaySgJS9F3~-Qkw&bM_Usaw$9(oPh-&3=%U2{rhhaa@Y`oP!Gco=Gsl=?_ju=Y6 zjbQQAakYc6Tp>aToNI^Q2zF1wlvXy#JFW6a<9EjmCA715-`1lo@qhw&z9PwdKN?VDQo&NPck9H)K23+V7Oi+UgnXSHTNm0Gj^LwlP{8bY_m5$)1G@ z>%u~BdU8%I_Z$z}GsnR`TOQt9F3NDGxk@wZ|cx9rjM?Pe$n&Jhj{CPlxJ{6?iGudo@%DLecd`9;bIuaJi^JS>+7 z5db>mfurwmt2`hYv@e9w4m-DE_8&FcbQ<Obx;^hTyWVvEQP@Y*`K62|64)Dh zaMoKm_pZ^}rU{Uxm(JumqmcvlH;w9}+LBV0JlW4+D-5&^+Wq^eKVly;;=51I*R>xc zjYROI0qP-L8xn@YqVWYrBkA77EC|dx-a;COkKD;VyiwH4caFXOp5h|J^P4*mnp?ip z0nfK%JOB3Zc1H(tZ_D@&USZr$W%z}UJS7a}m;W$dJHb{p;mdFH@QMh{qGO0XlR?gx zs)I+nh??^S-E)ZG9xY`{@=9!AsB z6A8Q~@Q9vkdR|io3?2TX@e;_6y8Rro@P!7>uHRn_OWi*S$(kkS`W5qL^#@C7E&SW`Ruh zfn_Wf5$5&4@fIy)&+Wl$+pvjzQk?k~+O!kk1F~~gpkLIblxCt-dzxCZ*_C)7*d(PA zzftOPQLD+WXvbFOHdW1PYn6tb$V#BV$|AG_ZF`706I+vu4`6y4VUAAstZBK36pH^qUqh zNi+)NS>3*G0%N$ZE_2Knd1&Mvdo8r|OG($_@;GGEa*gQ9D5J12e1mWaKMJ;Gpg zwi8~J+66x|s}r5|n66@C;y95NXj?(8@NzVZetirM{(CC)FjE#Wbg}5DPG^wn)G@(O1E#8f%1733Ve^CC&tGXkZ^UJPu?YIoRE`Z-yBow-b{tW; zawH$&kh4wZ5Usx+X*^*DtU7JUdn#de#Z<@pT<};@R*KfXj6~R#gCX1MTC_(%8(efs zifZi-@R#jR{yr}sq`}F~&ChuyK$f<8{jv2byB6L8x2iNn(Ot5y%n2^qC3r4sp()sI zu@A80aoTTq`b-<*p`b+~`^VHOBelQ6w2$j4>-a_3&9LyM@P3akbD@E`m4aU8$_Q~3 z+KjHL$1%*-LkD9Fkdo6|Ms z?C+FtnUkUvb#z6B3a!*NT~$Il*r>OUc-P?k;Tj9sdVv5eso7i=kX(K zdocjJ4w`;lIiA0Iw@hA9chD#Nmt-pc>zP!ZicgTI>J#Lt8J5TTP>)n&Xx0B(uT>sM zQ;NlQ@S&V| zgwA9?)>)_7c1-4EjDU6BQXWKwb>)znW*|^qf#uLQYU|Sqb~V_;;wX*=`3o%wwwc3ZAmXZ#L~y7I|1DZ(wPCH z?_ES4eGI(vyA{#V`eXXB!3;+y#|ShvrKZ~&C2N7&B~ad?I_fzb)V{Fkur?=k*wDVv zcUZdx2Jma2N_tg9J<62lGV79A@_i^vMJ`MIM`o$gWx)#k$JJ5k1Svs#Nh(}4PfAJr zK0YvMQ!o+A3%s)K$;_Tr$G;l>K_Zmf!0^p!=qT58ekDzr&bXeLy}14r$hsLp&k8*u6toX?hOn*F?xH&FYEz zLA%dznqKvTR|POZ)jvXe=+|V)8YdQOGAx}97+d7$(~t2b3nvq(0Hh(nw5L%gs;$7V z;x9@oZ2Yg{I|8f5a2HDo4A%3cG~XB>INQ38Dw|Du>GJv64mM9PoX}s&9o?6>PEFNj z&Df+TW}^-mEU_-ib<5{=>n-YNdO0)7?!x|f;IQ_E&4;y{do7vz&0azJ?LcmeOvSed z7C8ser|QbG|0Z(K?DS#n)^`tUb6+Kg%+o7}wT2#wlr9zI0UM=~l;BSo>hvb%i5EkwZ*pR!_@S@ZUXV^}*)LL9rE7W_q^%2=!H0ykC1>JTkS&_E2Iv ztn}8{Jt2FOTI8>gu8J{5vXO%sDZ!aqdc5^td2X6&K`W5bLp7KQY4k<8&t^ZTg)$UpzTl26Vce zZlAltW65+IjYK?e5MRtl+)z21ei)kZ27$(kgWZd_(!Tl+iw(cCz?Wzl9p7*cJhgF5 zdcur2H?&N4cQFEBv5O_fm+JO{a(Dj%5&RpxrA#mt3|k0leh*0nsePsBX3@GuJ|8S`2qWn}cV_(*g%g z9MgEqgd#!K;Dx;Lmx~CVh4&u?PYi3vG5@{C8 zh)pKCqJmE|yNHiRxHHJa3fd{`thO{ND7DlxfM#U~&9)+*rhma9hHH{3f`IhTQK*Lg zWn;8jmQl?28-4l^J8)gSXcjeput9cky}PwHJO3_Y@0wI*1qHRq zO_`^aKF~^oks_{U~ArGkHcm;&8yxn1v8MacxuGi8DNs&jO? zBf_wcy~x@wvewB+56Cy-^Z`^Ezo6E{aT_9u@A_1xbyc}MMEirG@vFYkkvhNLU01=! zzwWDd#!7^b&`R0={!6t8tD%+t?Uh(+Kvn<6T2v)9e@i9S>97?}=)W=`)s?zWTuIjd zinCXpGHhvLbzM3Y7IvykdcnMk_YnUoHh?Me5$rkRyw-o>wkKBcA6bi-NF zDfADy4D;RzhW&sLG{gQyt4ee&W3eoT;w-=}BjVYQ{UGt)7h(=M)SaApT~5VvJrWmT z=AV?RBpPOQ?#RWt2CcknNvNR6o|x7DoAwDh7$c1KYU!5j23HzR%L1c#we&;*SNdQ$ z52$W?6bOxO^+pEP!<2>YuNr|ox`*o71DjS!$#sx8>Ks;PduUqDvuekor?q(@M}Zif ztm!mi%CVv}f3<+IxE*tX@1(XHNik~J)ShX3ha zEU=RQ@=9MN=}1%t!y(-M$G8&%E58dQ=N8nk=&y&=#R}5He2>Xop37W;|HH@TuE^y^ zz4Wn}t8$rZK0)RhGJ}5%al$9aJt0?h-6zOgm&>ewOlIKk+*1EBnaI=P2I3`i!zakx zkZXS4$7QytdR{I!YKV`8@a?(G3qC>S1-Z-%KPt1uFNED$?b5MfO+FTi#pU->C~^hnpvV>Vp=4>*TRU{#3{xKYvCS61*Wb?&*{d zCJJKnyzo)Vszh}L(WZSlNfAd8x##N%Nn#Y=T5}pf=WrR5dauOUgw@jR29!0S$^~w& za>~2Fu)P?75@I}S;O%5pL3FXLvX^$}tEc49lZ@R>TQT$`<2N1KRT6E~l*AvwWJHui z7Fr@5g4y@pM`(!*qJk%>AlU6j2baMD=e)W|`@(C8#7bM#dzvap%C0QPe+G?_C3+so zCmqk#`w?m*$)<><{NcZGb&}G~4ns z8}WFEHs?aIOMqw7nO_qWyH4~z?`UnOC>xA7Rr-sxC5L%79Hu7TU#C6vj=Tjzl|JpE zZSrUzwP*b{=m0OQOyvBV?uiw-RvK@mHZ84@vK3!&k$!f9UP_8aRP z-9beYt@OEHRdSF5Y_OQb*oW+c^MSue$V4hVfaD!N?y*z%eh^=edCaYh)2#H>Cgp_W z9dg*4oaWzRyRu4686!-p{C(t4l7DK6oJIAK(MVVosx9SY-aR2GU2yvp|BuQl)+5Hm zA=%s-o2<&pb@NDYKigApmnp6+LIuM9nRvWXR&Vgd`DB(;<^oE9rsmjmXZ%UMaTJ(< zbCcM&UaMma)tAQUfJK!JbDdcHj|iVeqgh#r9c%NaMaQK(3vcIKdLBOf-1@Rw#=T}*`V9rZK`XHp-N(ztZ(AXm_~|Prb+C3 zx5h$CtWN5)9wxSA83ySr0Yy@%j0XnV_nmaL9Fx)J0g3jg|I$7g7ul!+Vs1i`GAmB2^HH z&Jkz5sW<(13fIou8)m3N4hgynx`X{CI_)Q!h2Xl|=mc&@`8Hj|z?7nFjSU)#Xg5V1zqoFVLOAbP+($Pm|g^JZ2! zeBl4k=A&-OVoyUjm{Mal-s9ERw$l4L{&9xt<%XQrPRJ3L?o2HS5d*(_aX+70>7+{FuBfDTZV$O7 zd6k=HRfnZWmnk8nJvYM)nltJ>5B)V{Bt(6Z9sf!W#qE-a`%Es3hX{)=|I&re6VkYJgzVB8Myj%9 zJ0VRC>x8hd(g|yEQl7})?pDjN$9`K?3uygg?{-tA6Bm8YeO8cYbf1C5l_8b;cA1GB zB%~85skB^W%XUIq8rF$k+5Z(Nwz{1d>&Z69*xsIzgTzJe&r*<34exiK6(n}L&jN|0 z$~_DcG9}XQvwxzpWji4)abt?hs#G7d*2(;2QGW3*o(<>4etrt6*5ZRCpi!wCV%uFp zrL2#Rz;X|fP~qQQ1rXv52S;|e7l%#f_L{6TCTf%N^y`Y9`%g&|{zI|%|Do8biCo(< z7(K`Bk2A3{`vAW!wuaM8ha;20Xbp-Ns?TkLyba$3Wi2ZyQkWu)K{1QV@?;M3!%&@g z@+Pgnty0WshgDjht+c7KLHc#4_|M-Kj5otg-C{Jh3)5t}cHQt!7#ChUSYIKZM_5f? z8_p8ZV|cTNp14BsStYM?)znts;B^()^_DB9BfcIF7{zVijZAw(Ewf_}M(0b*H&Zoi z*DPt-cjlJIjcBT+;ZF1qp~`uxL2??-um;DSsljEl48_8%h1JOHnpB> zeBAu8KV;sKv@Bd&K-}CYSUb^cq)!X;X~ICZ(*5Bn9m7&`;T$X%iVsMBU^iuf{Fx_z z>g7+J{Hc*Y74k+?}LJrD`fMbPK`zMk1hg}v>==G zy!15pyrSTFO~G?-{`tO|T;^T*#ODv@p4W*oC&&M)z7wbh_PMWX_(Z3Y$Rxlbx77%kIPh-*$u0g{PJ8l;D7H--M!?r>#2uSn}^BayT%QP=0!miqjKvI@zHjF1*}UEY(b5yA$0SvwU6jY?Uv*-j}`!2Co1M zr!dpW=obq*J*>m>lIv_%VzfL9^Tu;uT%m=zc$DF`yB0X3(e zXiBq-oc$*|ugU^ao&Bm!ENCCarJ2(dB8UB32gr2#BI^!SE+m=s53M#-b*=J=|KzKb z&aVT5uaYAF1sy9~If)=`!D}KF&7*`^WbU4n@Gc12VfF`%^R*?Hfn{7U3IYW5M&g_9 z%eiBcWP79thCoeUR|IB=tSGZxqcK(?b_rbXiTTE`aydbLs^t~A`prlpjH{NmBuS?t zjgd;ZV{z)BJrLg`kq3&2Ja9B~2T=-Yk8)3%IC#4aICByFBTV(UBf5t@Y1|>{so~5e z$vlKd4~DAd5xGEiC=ug&l_&-IXSrF+v#I5no71CXv0qArqOTaK-6Qg2lFcJ5<*40@ zNmUQ}fkVnZ9UGR|-pptt{&IQ5K43W6D=jyIJecH zrwQwg(<{aH+S3zU*9_`k1MOOBG8y*dO7SYX?+Sz-x$Qy!B36dii28BKmGYVuwbK>6 ztZAjy1JX3kCETI9>!4oEh06P-bPSPkr=>oM!0bzmugjHnCRf^%Yn1*iQDS&f_H=2I zja3k0Bel7XN%8(*Q%fE`vI@|eIX9pP3Jl=wfU^wenyLLGrWH3G#Iek~O!cH%^x11G zcy|47B-b=2M2^PmYY3~^iHS=maBVdkCs!KPy>L&@xw$FAZp~$~8=9`pOmZoqGu=;c z*u=zkJ{Hl?A*#8%Qm@{SM>)4hbEz}AMzjmk?Vj}Yz%*QI9o6$QfK5v5)8cKFxJ_w@ zvvd8fOxI3W> z1D+*moc5Fxec2)-@TM03-?V8Y${rxjj28bVUI?rZ!T;Ad)@yi@qW)*KMX#Bjn7D*n z^h{i6662nN4N%cN3Ur^H@bunaqlMtScLNqt-7FY_P8rph81)xx_n%EK%<3MDd0M9> z${w6A`9q5cFj6|{1NDf@Qt2fAkop1gSLr0a@qCa+2{{7mkvtiDC5@p0qIe3|seU7I zUB6-X<|Be_*4iG1VFytb(TRhm>O5Xk+liXv%qyGpg4TTlDK0jhwsY?IiVlJRH=(9AAW~| z4}Xv=7}Tmu*6}B_j@Tn9t^Hrn66J6v{KfCqOPrO&+)gfZ4B30u3V$cK!TDd~RIUvz zd4Lm{day>Jv0UGt_#tz$Gk+;DeyWussVouo6Z6j$dk?r%OstuIMYpWQU!+EC{#O`* z*R;6!A~D4#QAdt#Ha&Z|6&9cO;^;&oKbX}USu!2OKj=P5AeSZjvA6Lx8&YqpIV)y9 zyi2j*XO7o1$FIp86XjrlITocQ?n!1fPBamwxx~&FR?CtZ4KmxMp-!3HpiFtFQ|3G< zh!E-&Oz`kzg*t(;iuNLNemV6^pN$eJM(<$b?1D;(44=m=KOO(t;)NaKjvz`e(X)t zvoBk8l{@vN=Bjrhf!$i$_r%cbVJ4?`Pzq}8TNq6G1OA9pThbF-oq-?@5egwTnr@we z)MPCd6l<4@j3W2R+piF_8_Qty=ftBLs)&6fG1&tROzm=mA`Bz-?}$mV-nawm`v;(R z`etCsZeVX6OvcW}fcVQl3>6opP1I%vJ5QqI2`P~|FWVupc=i6C**dAmGoHJ2F-m9m zZr(2s5_H3UyATURt5I^+5$&dpJbap83~uLOP~HHcAy6IReTcSXHEqwV6hmxprL;dV zSqzxx9OURBDf~beq>cBH@2d0$^&2EKV1lzH46BXA%zhmBP#K<`{JNC%kL@KVQJ2HD zgjWr(%3PE0(fm%1C*M9iSt}j)K6Of|J%=sr=Doapz`o!MipYbTWF*i9ZwwWS*uNvp z3nxtjBb4KfHi@u7>0lp}_4tU8HVGBwRU5R$64@$}nB}2r|2XW1XKxdk^id-bX63-V zoGQh!o2jAj912qbSa(HtdIq04 zcrg+aQD20Uq3Q!JH(E@cu^zR}%1~*WVBHCwyh#~t{CM%*pCNJNOF%G#ldP+&!4X=w?xJq;%v#I`ksyt>>%k!!7 z$e>f8`=;1GiO}*@=>6-pEC>JD)>X8g2cWP}B$u&FXo}|Lfx>tS2YO?Fj5jB}cVnB7 zUap3~2v1_4Pq;4ZjnnL%5|Dh@l-@H#Kt{+}(MpJpY>ehIVymwP~!87t|2{L67=a-~ zm?wv}L>5sbVO9m@J`}9coND(gXlMimhi*B7q^gU+WwI< z8g{t2RfCRW2`>?+84)gA7jf>bF`OqlWV)Q`3$W(zK^UtStA05VW<%%@zZums;ykMZy4ISFE>h z#QlKvH88>`o>i|JN-Q8*yb=(HPmR!t{y*&8+jB^%6k!6F_JWs~ZLDAuhV#SeLkuaL z<()DF&L6KVjQ^wT{XT4=NYoQxi{z8ht=@RzF(?F3lIVu$zj=1T6AU|8LukP|!~PLU#)xj%MxAI4&Qq!)iO>Zo z2z16nT8R=)yEI@rlqMjg6Rzjh?;711a~jm((d+fhqk_{67+qVK_GG@nI?7j+vJVLf=F8{iOb{g(aTZf9ZM8E(J; z`fKOP+Dv-Dk9j0o!3MUP6(MJ0f7t$!E(ax3SSGg?Ggz!IbOu|7mBX8Q>OBlU-o%FL z2*yxHaHOjz+bx?|LiSJ8fo($%i)!S)iE@l`D+{c&Scn1Puh74&F&h_nr)78Li1RI( zxmM|3V13I~qF$}dA2Z72Vz2AtGe}V(XeV5dEi+k^Ifwm?HIexot{W=(u~w3El+8s9 z*u5YtXKTd1)Wl>bW$k8LN)hH}c}qkZ`~2|64Er&eWSD%E9b%i15a}BO=(!t6{8bBL# z%<#O4amzEx?*cWF5#NtMSaJ#dZkaB9{=#W}_NYD^j;)s2ux>}}wNh*DJO=d|D~hzu|bM+5A#yO;%2C9v60gq#Mqhh1m&Kb8R8ar!Ro0V%W4CvVod5869N= z!u8E_1o_;P{q=e(1B}+|edvnANxgb&@IM5Fg+;zcmXs6eG||st4P+9H#91uHL`I`r zJe1PM2!tz$%7yFaDOp^X2D`&GG)YX$pj9vRxV5E4ErDm~Q3??#PD0y^fx^k!lV>TO z0cFEU$-^<7tUFP?j9*-x(i>UA*+^}X>StB^&SJIPiA;4CE^eHv%PSwnGC^-dT?eJL z8fT&9k|A{k?OB+THLp>6$Cm3@WPX&p?8MIw)hwSzG=1eXT_bipvnt)}6Soe_FU%|Q zH7LHmX*PC^hG zGM|ZfVhx$Ijp{cI&uau9h}f})5TO&}FEz-yWL8>x!f1>zQTXU?Qa-v+LH*cq%cRz-bOz>jOfgu>ZLa?oj)<&daHw^qKUoJTFv z8?={6BHJu3054*?!wyeaT|2xIC6?X%hN%5y{>6h862Av6VcD*T)4q#B5f4l3eJGS+ z|5++2a+(Ro`5v3|O0fVO(`^ungXL0WEb5lq+l;_VP5dai_?kre#T2oNWOIw`Mw^lELNQ!7IaNES(2Ziq4(o6*DL#j5=Z0`Y{PH{GuT zk$QBegxJ%;ETe!7ahB<_4O|q2-|RDj?MC$p!@cE2A|fV!LR-XbspqmVYlP^LooOI| z%sz{JlioLgf{AzwBMi^xOzDu~kqB;-ZvJ~S@Md#8bFM0O5^Bz6srIX-dcN8waq^B& zTvQZ0FGB>Otm0C3&11(TIr>tZ7z#UamKo@49*HP9cfHZL zppfc)E=%=LIrrwM89QIEn;hu2n&)ONRy405M{H-v?v+G6(B1rX*cO3teB#=o*b|Jh z!1fC@cl07U?}<09^|I3*i~grXs|{=jYLBN>cX(C5d9F7HH{GcRE>_7Vk<=6i@!FX< zhzAQfh-b#T9E7;Kx6-Hl@n1FyhCdwzP=xa76&F1JgK?k4Ug~9k?8F{LEaFH^Wc7EuS z=ulhe@4fYGLt9SS_f~dKt&)YvH3|rn*3^dXsWmcoz5D)M{KzLaGEFOQIfy`TIkBkS ztcV9B9#2wNz#9swrh3Ww%cIgaIqmrqE1GU4qk9!^N3XVjxL0>)dv$kZ_vFG}O>XF( ze0r}kKmV}sy68_UfshI)p)4;g-=~F?+zNGhQaWNf*K_XjpldlESY zoQ2kjNW*Vol}1DwXwTGnBKX_O<^cf$)3B}G$VNlTEMyHb5Hm=C;|f1Y?sR6%gEx+i z%3MGI=Xqpkuq21k9p6RU@`#@=cUR5RolyjFQ@63nLGcN$O*QQ&7Lp-kC)`W+!krPJ zd~ij~n6c%!K_u5L{p>6&OnccurKA2PSGNohXZC^R)XwkB+X*2CD{RfYUALc^Kpu%d z`@qWV*M+&S3w8U21AG-a!YtC0I(Z|MJUNTBP?sBDj)At?y+JLs!EP7NUuUwHtgBGC z3SYDmM{!Y3+dZiRmw0;m`pw293Z4~qzr6SN^#>DWMW)rb%Yvw9ajXr;5f zO>p1l@fN9;&sC<~UZKiMt}4O z4ch(H2T>M0nS@+aXv?~MU3L!_L7AcyZr8~yhhFwG^{Uuke0AC*n6QTj?YFBpu9p=8i$-n$D3P=v?T|} zs6-(ch(9HIV`RC`kzoF!y6I?`h{Wc%Bu8TW!>!G4QrC^pMnbJd(Z~qtq}pr^9CjAg zfPN}9-I+)Y?JgwHGCGND7dVnv9eYo8EFminaj}EedI5^bwFU9!74&f|2Z*g!^INog zF^@!bokhEOeg`gf*tn$31;fU5hF;CY6roksSqoc=Anv>%SXkW+%2h-XS1d9T<65P! zbOrg?u?Q1*Ka%iD)-J*1Q4@IY*CjC7@rzLr%<+yPr6ewoW;-NQ6bYpz_nV&mik=5H z#9oy(3s0O(-{*r#Q6sx|BqLLu*e{(pn)dUF@w*r{@!{!-vd$TD&h9*6l`Hfaw;T=C z8s7a1L{}^)>V)=4dzHX0&>z$uSr5m^UxKgmk}?DDX^(X20faT}k(WblPe?|s{a-ma z3RS#fD9@yRmGme{aw368dJ<#--XeCgd{xjzjY|b6~|@ina(nuGSWpkqtMz{k-@Z|5wKGqaFj(P zJrXhont|;vG>}@m(NOiM$;iq90A-0llvDlz-2$XQ?S|5K_MEdlE3tVtm z=0z`najQ%l@W~-9mQVc(!X5=-&uI|0fMpJEKN`Y$%+)c>KVOR=!0v?5)?yx~m=Lr{5;~wMwkscRR%(B307_M#wL9_T7762t({4BsmHx{D8 zuJ-?Z8q#X*a^*STR_N)>l12025ME}NxXiy&nGD0qk3-6jhgcy_?i8GSQgCtzVq*l; zO#WDM(T_`(@pv?TMaGV&CwRb*Y91Yr1XJ{(d>HttZskF8Xo13OPJTm$&TsS zZ3G4+%r-OfXSK7qYuH`9)LRbDR3p{yt|-+1O9QKN4G8ToRW1Blh=0jbxh7V@nMe~l zw^qC=i!8f%60Nj^BpFu>nU6WHqm{eQcDILF9q9$^tuh(z3W8QFo5!OCZggT1l*@Ma zCFJSI=V?_aFIhHe_g^Jd#9vrJTDinh<0x`4y@VO0Oi!*%qU0&+PUgxb#y!pJ8eWHo zEf1+x^1KCsH=kdDNyyqxZUI`m0z7zrm89Y16KZkVuq0M?Z5a z6B_xNH1ahX2}mOWX~YN|j}f&mv7ADBAhDI77;v7uO3nCa0TS1x3o8w+wzo^HYq_aJ z_u!p~h1Df_L_322xobK6BigDX+(lUJBbCVlO+Y#P0FM1FeI5y@=1@=SS=C$*jO7R< zi%v;46LrOM{|1UmF5B!!-3Z1;mK$68gC4ZEeVMT#Cn2Iw$VLM}oI1B+)5$6VrdG1& zP7tJYoLw?qqMvBnt|l(q_Bh&}Oxrt9?IC~m)AlUdF59dpZX$WJZfOQ=-3bm+d$^g& zu;Z#CapqN({j#vKGAf&-N@)i7lYO|dVRfO#XwW5G27$-5w%zohrXZnev141lg^S%cs{mv(yEw&HN4&lImUn~Iy&;>?+P5}j?!@}#v|hIV zJupI{qWT=2fv;u*!cL2dEUseLNkh>~u}BFa14%o(P_5xZqs`oE>03?&tG7z^M9bxy zz9kd%YzqfcVU8jM@Wcd_;@oIk17*SA@g>n96=-O4N+!J#qiOMBgzgQ$PS%ZlcD*Q) z(4QEwu)9sQi`6ROs&X6>7i?1-zPogEMl+2Yj`^vLf%Y~M6&AFIj zC!<%+NR(yUYNJmw##^Nr4UXHwt!>zT_lZgYu?SOa6h~}Oqr%ldF!}eQEme9!#_u_V z?Z;V4|8~vHN^7L0AWVSK;pX?4+f|@sqq~!89_$cp96_z?h{(CMHHETkz;r5%Ehlk~ z_ZeGGg`7L9#3rQUQ%sD(73rcwgZc+%)^l>RLTkSOMk8c@pA!tR01)lmtd$|>$AEay z(w4l*#*JYQ(&cY?B0eeO3MYedVdubTZLvsCL3=|mzR!aO%fP6`v^NtJ4~zH<@^p(4 zD#jpiN^5JUnuv47AuiGK#Kv&p$~48$pbPS1>sciv3j-6icXU`n%S=b;n%SYKn>@pk z@<%L2N=tYu^*VAOD2(ST#1M%7R2Y*`f;r&e$Rlo+evwW&TSHEepHO>I`UfluY+=&9 zqBLMLoI%_|F}mVDU~D&gm7$VP;(wvgM{BssL~~i)hYALLNqCJIJD)9<&XK@hTw}bM zjyH|qx(crT?sG+gmDZIs9oTaBNRaZ{PVU3@;|5=_eNTeYo`rbxG{57X)=Iz0CVm0^ z7Qw-s^J2yEBd z=BTyLaT;>He4>m%^wE>q%rvH+{h>}wY5XORO1de}rCwrlTV34AvN_hB{?H2mJum5uiF4 zsXeHb-b_kqh?LS2!4(_;dSYAB-(XNGI!N`ssIkBQM!5RVA^XlM6wmdthKbQ=0b$Hz zoLMVbvlEQk_1qJI>FoDdNwPvXkO)=p;zqV$DsxHDvp(2&f<>b(xepYdobX<*V$lA8 z7qz6aOU!6|Mb;m7qCr%>K~FN+hXKdS7+0z5R19s#pJ@zC39rKb<4-Cy=gpNKPH;r1 z-lZSgt#!65xz3*3!S=x-6kQSbIy@e+w}=I3HES#73C4F9gW;zwL%G%?5*X0hzD|9h z)T(LD_+GVA65}4gN|xy9M9Pm|`5dqrthF|FPDzaa!jVZJ&T9UadVdZ0AY(*D4Qz~| z2YnZ-2mQXVf&9991mszcn|;z zYyqN3|JaHGz|RAWu)T+U1CVXZoSz#4>mRooMjQ!nTi;3)a0FFhlav!_?*kzD8h9cM z<|7=?T;+l+*%?fXE0e+eLWca9(u65^b-5f=HFwePsfK)>D!%JqgxWFMTzevI7Qsd2 zU}1R|B_`!T#!DV#i|pQ9Ht!MSgGC4eiK?8dRmk&=F=Yt&Hc6f4gLBZ`?dJd zV<8V`w0yVDkOA=f;}|^R=^R^oG~DWmUUaN4UvG&Z0 zh`l}C%|Jg)ddliGWdT2atYC(SEMAc|859ESc=r^lx|xig~TeOtGjAY4^VZDq$1iE-Inr zf_l)3H6lG!ALKkkuxt(g21A?$35u%wc3C^Qb5eD7H;d(irJtM?S@Z}~^6ZhzvAL_T z=;2JwPKBy>hdjIO$Z}c5;sfI@CUB9=GTq{%V@F!q061xqWsw=1or3MAqY|{X-KxU_ zGt~}&wQ2&TtD`z;B*s4=n}e+XQOM*hq!gx0=pxi2TEdAJiwMexE~!^r{4Y#t=q$Bj z+*GaoVRx3%J(o~ZZUOyN7SN?x*)IYKACe{4IIDiGM~MPiW?Vi7{skqs7CKr4^sn*__fKNU*- zQz{r#?nEa%*1mKfI3Bk0d%~w(E_G-xV0{1o?*&%jX7IP~1%lCG`$)KYuV8Q%w-suK zJ%13EC*--6&=Qb@KAA~p8e1xwkr%}NHq!Vq{%sKOjqnrVUWK>o=1dgs!WFUFDN%4N z1;YgIqC_okFA>&pLPgZdC53tswMYwzsFhDd)KZBQ%qJpgA%BuJD{A$Ls0C*tGDaRL z=AYIeM}#z}M6FbTsO32vu7cWqq_ve;lm4A|a(j^hmXTg3hVUv{``xi>-75K;&J_Zu^%oubZCjyCJH#G`x? zCtAO$t-Im^{zNYr3{Utoq1d^FEqjKOGhme?+HB;tZIQrx(Pzciq58Gj&DA~89X5^~ z+5CNJCQRZ1_T2kHri=J$_WOjkSM6tEN5`0xn+#_Lp#|r2tM&OsQ7(^ioqrBxreM}o z{YrJub9AmKdQt6WD!(dMJ9MM40Z#wvA3af3ZVpKhhx873i4r7ho;dw%nMJVQ2#YGD1yOCwBKY4W;bzDF^c*oEyQPn7M@ZV_wlDWrB*&;bS0af}brdKc7;9tCCp~}@GT3@b^-Ki~A;yKnYON80XoI}>@GME;R!sc{}4}`ZS zqlyEDZnPLvi}V-bA+tXLWg4V&1CCU>rXLJCH`Xu*YLXNRp!?k>3fh-^!>C>xbL0{( z0$2`4KW!fuh_OltS~=*kU%&SQSLek2KiuDII$xF8jMs@F*wB={mYcHuCBvpnwLNUc zrZ8bhq%vXqn6S4qRk@YA7Wr>2!Bpovae>`}HLjmPeecBF+rVFM=l{ftQ=cC-h6)+fO+E$DVYP5%^t8 zIpJYtD=CWD=inhC=8Q$@z5JC(D?9jQyWl493+&XEOuYY4(>Ju$cX^)jRi(D<8*?Py zf4u2R5=K1bcN4&@i+C@7syvrrOj8L7UORPko0M3z7kn&A%(O;Rf9^6CtXmE4hcG;^ zM(nHLLb>MFx9EgybXxlyx*(koib;PwbskJ`vB`N~^=n4p&n;g(L+_35(X=tB?0R36 zr`pXC`_&9LFMf$Zyr-@HG5xpb-~KVj(6CDPa{WK1JuCKFBUEqVFOQ%*(ig+NR=Q9t z@GES+;*70N^+}`Ye*%zHorP5vf+217w^d_SaLYSmjs(a2o*ww~5DSgj7qma%VmoR; zvDsCe?MZRAClUL*zS@n-_Kwvh!DI_)Q)l0M!iBQTj@|nK8VkN-gu6dv@5@@v@*P=B zeYZaFY>OW+Z>htzfJl(I5m*xnVx>5Rk-c)8E~e~6pl8XK7c6-J%$P{vRW0!>$2V$@ zxUTR^+{65SvF_nIdzsh2$h_`mUT65Uf8L$cLyQ9uV`!9irJUqdoKYZ zqE{@7INxO+Uv_ENOWgk?CPK=7Azb~Z=()8=5rAYrKLBSzbOBG$e(B!Bxd7W@N~*PO zfpJF)7W~gag0lE@@d_5Tk)jlQ5<5D2b8BF4bp7>tR zM?x8jk4o$(Nw&Ur7G@FK$xCd3qcO28PRtn1>QL7Yu`7wdiP1Vj+|nnQQVs-q#o#nI zP1ygzkW*LN52!~?*o`9ky4Lv0y`Z@_G1U`EOoMj4+H`Z~!l2VakQgZ1jTPdBQSkBF z#7tj~u)Ue344=;r_S_s@Q()af@Py=K_=6i_$|vT}62 z+$}zsxiQf&QpPwop_eH7ve~80+S1!#qP5lE0QKLG_j~VxR7t-eU3!JSu57QEdHr#HpLS((T0O!D7^a;I* z`jL8Kra0I(eO&-PMF39hDHq`Rj}_9><6QNF&)X>%;M&qY7F_#gMsze2qYME3s?b|H z-gK?D`c}8&d&j&T?=NY($|A+3x+>N7AGdA zeJY1NB1Fi(Qb5@+&S4MnYszKGq_+$xOY625SX?qth`MI?1-GQ*10$QJWQW?fWp8lI zHZE~%8lN3%E@f=fXSLOq8f-4tDS9*70LjRNkU=9`VpmqH& zGSg`KJPhWyyc_QyDa$OT z&S-WctxaNdw0zf|)hoi#OTuGw9D+oI{&VavJj3{FZY$*2m=oo2QthPJvv3-VQg1Ht zK5}x>R+vdwWdqYqfTCmD3RUQtQ#g_b_G!OhgBUlNtq9rZK93UI)JCIZqw8Jy+q8RB z8jLXA`qf*1^KU!}XDtex3UsDAyRM#&Bq6hW3qg`e;7gu)mR`2@Ea+f^Pdb7>r)- z`UeMz1Te&txEZF|B?sK|;y=Z9$$okVjZBL-?Sf-zpT~3hO8(@*B08n(>*JPieN&Zt zW+CHurWlMh#9^$+#bWH9TqoVet4N7{ZbU%$alI=oE2Y(q-1ppmbm4e}6e3lKxk6x$ zujMl2$|`3(#|1&ludO2lqWzZL<$}N=t|4B=l6soxldaI`-XN=kqho(j%UF8uf(b8M zG=9^G8$Ny!-nyri72#8r&&3mRrs|l3n7S43uh1SyDAhX*BTmrWT~a+O2>xybLkz)g zOiq+(y2Dk^w^U%yLu{E;Q+Z;NJH=cNsRy=M3nlQ#GPXWFAsVkD&WkV@x~Cj*>9H^K2S>hSxJM$4yB#n^m$2wvSyPw@r{WB;6Z4x>G8o zJWj;MrI;}Z*NgjcnyU&oYxZRTv}-5n5J8~v0J3BP*pm(Wq)YQK-}stZJI^|IkNp&0U-@{ zKM?Ofp9V=%Ku}2%8svN;#UX?=ozJI9zyZy28aQ-i7(d$g5Tk9}Y<{i`oLoN$EPjN` z*vS#v(sP;6EQCTH*;IwkL1j%W0V^r9-Nu%;P;kIbn$=rf4ds0TMr~8b?pw55U_XPt!q># z4G%g<8ndJ|kGA9-TGRUuU~W(zDEaw4+fd$Z55adSCoShy9hMdhGARh3P_p)zMD31 ze$(ZWq=2uI!ffoH5ez&>(y>YqDL#jQ8?=rM%07H*-6Y4m3LNM#r5E_TYU@l7D>XUD zFnmG_73P@sTX;|zffL%2oydQ3Iin)GrhTqbMk5`j|5MVTdy}+vW#vI(>_WS2->4?Qp&_ao}NU#V!3*=xbC@;2$`Iroujl8qjcAqIWye@tNhn8N_Ce9 z31JBf2M~h=Oxz53gI7$;zBovoA;f?JVOpI2oFQ=9zky$OZ9udjiWB-QRtJ~KgP>9Y z#d=`&2`K$x{$NChjfPkt<&Zu7IdDXX1!?K?coyxr8vk(8D52I6)7I$2f(j{mt1S^V zjKTcj&)RKlv*LVU=TM9tbPF!{T@y*M*)yHbAc1beqI`s2JiTJNUGgV) zFMKbC*~?~$s=zHI3Z;aX=>g;(BXO_SY_v8?j8kshHLKUxZiN14#<~mxa=2MMx5vbi zInWpV76Dff;iF&6i|Z5L5aWoY*rkVls_cq>dXf;eZ}@VlLuY;d;y%u2&{STbI z-D0Lkj=vkc*3Z=O_s=p*&1=5j(=-HE%xVSkID&eypt5bFTy~4lSe{roqvRQa^B?_1vLGX^lBAlaaUnOW-$s+I{VK(w9!J89L?Kd}%nv6YhO;4bznU-ki~YeO zX3%@ToX_45rDCo�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

    NwKsRO3pw8jzjU+ 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�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�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 iI&|sLXTXpVVBzZ*|F!qk<%mASzdm0hb;X7 diff --git a/mac/libs/liblibwavpack.a b/mac/libs/liblibwavpack.a index fd55799fa893af80e1e90539b4c0acf39b58559f..a911a207399cab52a3deb042926cd9f2129f8996 100644 GIT binary patch delta 160428 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%0AxI&j(8r<1J)2u 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 NYLecE^O}D9e*w*WF4h15 delta 20 acmX>wTl~UxuJ#X#%s|Yt{evRwh1CFO`U#@| diff --git a/mac/libs/libsamplerate.a b/mac/libs/libsamplerate.a index bb06b8436a4aed21e979c0c7fc1d4c7f4ed09b40..eabe41f4b4d7d444bd46b4c5c4b74dedf92ebe26 100644 GIT binary patch delta 37964 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 - $ - PRIVATE - ${LIBNYQUIST_ROOT}/include/libnyquist - ${LIBNYQUIST_ROOT}/third_party - ${LIBNYQUIST_ROOT}/third_party/FLAC/src/include - ${LIBNYQUIST_ROOT}/third_party/libogg/include - ${LIBNYQUIST_ROOT}/third_party/libvorbis/include - ${LIBNYQUIST_ROOT}/third_party/libvorbis/src - ${LIBNYQUIST_ROOT}/third_party/musepack/include - ${LIBNYQUIST_ROOT}/third_party/opus/celt - ${LIBNYQUIST_ROOT}/third_party/opus/libopus/include - ${LIBNYQUIST_ROOT}/third_party/opus/opusfile/include - ${LIBNYQUIST_ROOT}/third_party/opus/opusfile/src/include - ${LIBNYQUIST_ROOT}/third_party/opus/silk - ${LIBNYQUIST_ROOT}/third_party/opus/silk/float - ${LIBNYQUIST_ROOT}/third_party/wavpack/include - ${LIBNYQUIST_ROOT}/src -) - -if (MSVC_IDE) - # hack to get around the "Debug" and "Release" directories cmake tries to add on Windows - #set_target_properties(libnyquist PROPERTIES PREFIX "../") - set_target_properties(libnyquist PROPERTIES IMPORT_PREFIX "../") -endif() - -set_target_properties(libnyquist PROPERTIES OUTPUT_NAME_DEBUG libnyquist_d) - -set_target_properties(libnyquist - PROPERTIES - LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" - ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" - RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" -) - -# target_link_libraries(libnyquist PRIVATE libwavpack) - -install(TARGETS libnyquist - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - RUNTIME DESTINATION bin) - -install(TARGETS libnyquist DESTINATION lib) - -# folders -source_group(src FILES ${nyquist_src}) - -#------------------------------------------------------------------------------- - -# libnyquist-examples - -# if(BUILD_EXAMPLE) - -# set(NQR_EXAMPLE_APP_NAME "libnyquist-examples") - -# set( -# EXAMPLE_SOURCES -# ${LIBNYQUIST_ROOT}/examples/src/Main.cpp -# ${LIBNYQUIST_ROOT}/examples/src/AudioDevice.cpp -# ${LIBNYQUIST_ROOT}/examples/src/AudioDevice.h -# ${LIBNYQUIST_ROOT}/examples/src/RingBuffer.h -# ${LIBNYQUIST_ROOT}/third_party/rtaudio/RtAudio.cpp -# ${LIBNYQUIST_ROOT}/third_party/rtaudio/RtAudio.h -# ) - -# add_executable(${NQR_EXAMPLE_APP_NAME} ${EXAMPLE_SOURCES}) - -# if(WIN32) -# target_compile_definitions(${NQR_EXAMPLE_APP_NAME} PRIVATE __WINDOWS_WASAPI__) -# elseif(APPLE) -# target_compile_definitions(${NQR_EXAMPLE_APP_NAME} PRIVATE __MACOSX_CORE__) -# elseif(LIBNYQUIST_JACK) -# target_compile_definitions(${NQR_EXAMPLE_APP_NAME} PRIVATE __UNIX_JACK__) -# target_link_libraries(${NQR_EXAMPLE_APP_NAME} PRIVATE jack pthread) -# elseif(LIBNYQUIST_PULSE) -# target_compile_definitions(${NQR_EXAMPLE_APP_NAME} PRIVATE __LINUX_PULSE__) -# target_link_libraries(${NQR_EXAMPLE_APP_NAME} PRIVATE pulse pthread) -# elseif(LIBNYQUIST_ASOUND) -# target_compile_definitions(${NQR_EXAMPLE_APP_NAME} PRIVATE __LINUX_ALSA__) -# target_link_libraries(${NQR_EXAMPLE_APP_NAME} PRIVATE asound pthread) -# else() -# message(FATAL, "On Linux, one of LIBNYQUIST_JACK, LIBNYQUIST_PULSE, or LIBNYQUIST_ASOUND must be set.") -# endif() - -# target_include_directories(${NQR_EXAMPLE_APP_NAME} PRIVATE -# ${LIBNYQUIST_ROOT}/examples/src -# ${LIBNYQUIST_ROOT}/third_party -# ) -# target_link_libraries(${NQR_EXAMPLE_APP_NAME} PRIVATE libnyquist) - -# set_target_properties(${NQR_EXAMPLE_APP_NAME} -# PROPERTIES -# LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" -# ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" -# RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" -# ) - -# if(APPLE) -# target_link_libraries(${NQR_EXAMPLE_APP_NAME} PRIVATE -# "-framework AudioToolbox" -# "-framework AudioUnit" -# "-framework Accelerate" -# "-framework CoreAudio" -# "-framework Cocoa" -# ) -# ENDIF(APPLE) - -# endif() diff --git a/sources/LabSound/third_party/libnyquist/README.md b/sources/LabSound/third_party/libnyquist/README.md deleted file mode 100644 index 28c0a71d..00000000 --- a/sources/LabSound/third_party/libnyquist/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# Libnyquist - - -Platform | Build Status | --------- | ------------ | -Microsoft VS2017 x64 | [![Build status](https://ci.appveyor.com/api/projects/status/2xeuyuxy618ndf4r?svg=true)](https://ci.appveyor.com/project/ddiakopoulos/libnyquist) | -Clang (OSX) & GCC (Linux) | [![Build Status](https://travis-ci.org/ddiakopoulos/libnyquist.svg?branch=master)](https://travis-ci.org/ddiakopoulos/libnyquist) | - -Libnyquist is a small C++11 library for reading sampled audio data from disk or memory. It is intended to be used an audio loading frontend for games, audio sequencers, music players, and more. - -The library does not include patent or license encumbered formats (such as AAC). For portability, libnyquist does not link against platform-specific APIs like Windows Media Foundation or CoreAudio, and instead bundles the source code of reference decoders as an implementation detail. - -Libnyquist is meant to be statically linked, which is not the case with other popular libraries like libsndfile (which is licensed under the LGPL). Furthermore, the library is not concerned with supporting very rare encodings (for instance, A-law PCM or the SND format). - -While untested, there are no technical conditions that preclude compilation on other platforms with C++11 support (Android NDK r10e+, Linux, iOS, etc). - -## Format Support - -Regardless of input bit depth, the library produces a channel-interleaved float vector, normalized between [-1.0,+1.0]. At present, the library does not provide comprehensive resampling functionality. - -* Wave (+ IMA-ADPCM encoding) -* MP3 -* Ogg Vorbis -* Ogg Opus -* FLAC -* WavPack -* Musepack - -## Known Issues & Bugs -* See the Github issue tracker. - -## License -This library is released under the simplied 2 clause BSD license. All included dependencies have been released under identical or similarly permissive licenses. diff --git a/sources/LabSound/third_party/libnyquist/cmake/CXXhelpers.cmake b/sources/LabSound/third_party/libnyquist/cmake/CXXhelpers.cmake deleted file mode 100644 index 2263254b..00000000 --- a/sources/LabSound/third_party/libnyquist/cmake/CXXhelpers.cmake +++ /dev/null @@ -1,24 +0,0 @@ - -function(_add_define definition) - list(APPEND _NQR_CXX_DEFINITIONS "-D${definition}") - set(_NQR_CXX_DEFINITIONS ${_NQR_CXX_DEFINITIONS} PARENT_SCOPE) -endfunction() - -function(_disable_warning flag) - if(MSVC) - list(APPEND _NQR_CXX_WARNING_FLAGS "/wd${flag}") - else() - list(APPEND _NQR_CXX_WARNING_FLAGS "-Wno-${flag}") - endif() - set(_NQR_CXX_WARNING_FLAGS ${_NQR_CXX_WARNING_FLAGS} PARENT_SCOPE) -endfunction() - -function(_set_compile_options proj) - if (WIN32) - target_compile_options(${proj} PRIVATE /arch:AVX /Zi ) - endif() -endfunction() - -function(set_cxx_version proj) - target_compile_features(${proj} INTERFACE cxx_std_14) -endfunction() diff --git a/sources/LabSound/third_party/libnyquist/cmake_install.cmake b/sources/LabSound/third_party/libnyquist/cmake_install.cmake deleted file mode 100644 index 1db5c564..00000000 --- a/sources/LabSound/third_party/libnyquist/cmake_install.cmake +++ /dev/null @@ -1,92 +0,0 @@ -# Install script for directory: E:/Engine/env_develop/cocos-engine/native/external/sources/LabSound/third_party/libnyquist - -# Set the install prefix -if(NOT DEFINED CMAKE_INSTALL_PREFIX) - set(CMAKE_INSTALL_PREFIX "C:/Program Files (x86)/libwavpack") -endif() -string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") - -# Set the install configuration name. -if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) - if(BUILD_TYPE) - string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" - CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") - else() - set(CMAKE_INSTALL_CONFIG_NAME "Release") - endif() - message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") -endif() - -# Set the component getting installed. -if(NOT CMAKE_INSTALL_COMPONENT) - if(COMPONENT) - message(STATUS "Install component: \"${COMPONENT}\"") - set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") - else() - set(CMAKE_INSTALL_COMPONENT) - endif() -endif() - -# Is this installation the result of a crosscompile? -if(NOT DEFINED CMAKE_CROSSCOMPILING) - set(CMAKE_CROSSCOMPILING "FALSE") -endif() - -if("x${CMAKE_INSTALL_COMPONENT}x" STREQUAL "xUnspecifiedx" OR NOT CMAKE_INSTALL_COMPONENT) - if("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Dd][Ee][Bb][Uu][Gg])$") - file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE STATIC_LIBRARY FILES "E:/Engine/env_develop/cocos-engine/native/external/sources/LabSound/third_party/libnyquist/bin/Debug/libwavpack_d.lib") - elseif("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Rr][Ee][Ll][Ee][Aa][Ss][Ee])$") - file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE STATIC_LIBRARY FILES "E:/Engine/env_develop/cocos-engine/native/external/sources/LabSound/third_party/libnyquist/bin/Release/libwavpack.lib") - elseif("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Mm][Ii][Nn][Ss][Ii][Zz][Ee][Rr][Ee][Ll])$") - file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE STATIC_LIBRARY FILES "E:/Engine/env_develop/cocos-engine/native/external/sources/LabSound/third_party/libnyquist/bin/MinSizeRel/libwavpack.lib") - elseif("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Rr][Ee][Ll][Ww][Ii][Tt][Hh][Dd][Ee][Bb][Ii][Nn][Ff][Oo])$") - file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE STATIC_LIBRARY FILES "E:/Engine/env_develop/cocos-engine/native/external/sources/LabSound/third_party/libnyquist/bin/RelWithDebInfo/libwavpack.lib") - endif() -endif() - -if("x${CMAKE_INSTALL_COMPONENT}x" STREQUAL "xUnspecifiedx" OR NOT CMAKE_INSTALL_COMPONENT) - if("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Dd][Ee][Bb][Uu][Gg])$") - file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE STATIC_LIBRARY FILES "E:/Engine/env_develop/cocos-engine/native/external/sources/LabSound/third_party/libnyquist/bin/Debug/libwavpack_d.lib") - elseif("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Rr][Ee][Ll][Ee][Aa][Ss][Ee])$") - file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE STATIC_LIBRARY FILES "E:/Engine/env_develop/cocos-engine/native/external/sources/LabSound/third_party/libnyquist/bin/Release/libwavpack.lib") - elseif("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Mm][Ii][Nn][Ss][Ii][Zz][Ee][Rr][Ee][Ll])$") - file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE STATIC_LIBRARY FILES "E:/Engine/env_develop/cocos-engine/native/external/sources/LabSound/third_party/libnyquist/bin/MinSizeRel/libwavpack.lib") - elseif("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Rr][Ee][Ll][Ww][Ii][Tt][Hh][Dd][Ee][Bb][Ii][Nn][Ff][Oo])$") - file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE STATIC_LIBRARY FILES "E:/Engine/env_develop/cocos-engine/native/external/sources/LabSound/third_party/libnyquist/bin/RelWithDebInfo/libwavpack.lib") - endif() -endif() - -if("x${CMAKE_INSTALL_COMPONENT}x" STREQUAL "xUnspecifiedx" OR NOT CMAKE_INSTALL_COMPONENT) - if("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Dd][Ee][Bb][Uu][Gg])$") - file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE STATIC_LIBRARY FILES "E:/Engine/env_develop/cocos-engine/native/external/sources/LabSound/third_party/libnyquist/bin/Debug/libnyquist_d.lib") - elseif("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Rr][Ee][Ll][Ee][Aa][Ss][Ee])$") - file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE STATIC_LIBRARY FILES "E:/Engine/env_develop/cocos-engine/native/external/sources/LabSound/third_party/libnyquist/bin/Release/libnyquist.lib") - elseif("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Mm][Ii][Nn][Ss][Ii][Zz][Ee][Rr][Ee][Ll])$") - file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE STATIC_LIBRARY FILES "E:/Engine/env_develop/cocos-engine/native/external/sources/LabSound/third_party/libnyquist/bin/MinSizeRel/libnyquist.lib") - elseif("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Rr][Ee][Ll][Ww][Ii][Tt][Hh][Dd][Ee][Bb][Ii][Nn][Ff][Oo])$") - file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE STATIC_LIBRARY FILES "E:/Engine/env_develop/cocos-engine/native/external/sources/LabSound/third_party/libnyquist/bin/RelWithDebInfo/libnyquist.lib") - endif() -endif() - -if("x${CMAKE_INSTALL_COMPONENT}x" STREQUAL "xUnspecifiedx" OR NOT CMAKE_INSTALL_COMPONENT) - if("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Dd][Ee][Bb][Uu][Gg])$") - file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE STATIC_LIBRARY FILES "E:/Engine/env_develop/cocos-engine/native/external/sources/LabSound/third_party/libnyquist/bin/Debug/libnyquist_d.lib") - elseif("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Rr][Ee][Ll][Ee][Aa][Ss][Ee])$") - file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE STATIC_LIBRARY FILES "E:/Engine/env_develop/cocos-engine/native/external/sources/LabSound/third_party/libnyquist/bin/Release/libnyquist.lib") - elseif("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Mm][Ii][Nn][Ss][Ii][Zz][Ee][Rr][Ee][Ll])$") - file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE STATIC_LIBRARY FILES "E:/Engine/env_develop/cocos-engine/native/external/sources/LabSound/third_party/libnyquist/bin/MinSizeRel/libnyquist.lib") - elseif("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Rr][Ee][Ll][Ww][Ii][Tt][Hh][Dd][Ee][Bb][Ii][Nn][Ff][Oo])$") - file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE STATIC_LIBRARY FILES "E:/Engine/env_develop/cocos-engine/native/external/sources/LabSound/third_party/libnyquist/bin/RelWithDebInfo/libnyquist.lib") - endif() -endif() - -if(CMAKE_INSTALL_COMPONENT) - set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") -else() - set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") -endif() - -string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT - "${CMAKE_INSTALL_MANIFEST_FILES}") -file(WRITE "E:/Engine/env_develop/cocos-engine/native/external/sources/LabSound/third_party/libnyquist/${CMAKE_INSTALL_MANIFEST}" - "${CMAKE_INSTALL_MANIFEST_CONTENT}") diff --git a/sources/LabSound/third_party/libnyquist/src/Common.cpp b/sources/LabSound/third_party/libnyquist/src/Common.cpp deleted file mode 100644 index 595e9759..00000000 --- a/sources/LabSound/third_party/libnyquist/src/Common.cpp +++ /dev/null @@ -1,393 +0,0 @@ -/* -Copyright (c) 2019, Dimitri Diakopoulos 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 HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "Common.h" -#include "Decoders.h" -#include -#include - -using namespace nqr; - -NyquistIO::NyquistIO() { BuildDecoderTable(); } -NyquistIO::~NyquistIO() { } - -void NyquistIO::Load(AudioData * data, const std::string & path) -{ - if (IsFileSupported(path)) - { - if (decoderTable.size()) - { - auto fileExtension = ParsePathForExtension(path); - auto decoder = GetDecoderForExtension(fileExtension); - - try - { - decoder->LoadFromPath(data, path); - } - catch (const std::exception & e) - { - std::cerr << "NyquistIO::Load(" << path << ") caught internal exception: " << e.what() << std::endl; - throw; - } - - } - else throw std::runtime_error("No available decoders."); - } - else - { - throw UnsupportedExtensionEx(); - } -} - -void NyquistIO::Load(AudioData * data, const std::vector & buffer) -{ - - const std::map, std::string> magic_map{ - {{ 'w', 'v', 'p', 'k' }, "wv" }, - {{ 'M', 'P', 'C', 'K' }, "mpc" }, - {{ 0xFF, 0xFB }, "mp3" }, // ÿû, mp3 without ID3 header - {{ 'I', 'D', '3' }, "mp3" }, // mp3 with ID3 header - {{ 'O', 'g', 'g', 'S' }, "ogg_or_vorbis" }, // see `match_ogg_subtype` - {{ 'f', 'L', 'a', 'C' }, "flac" }, - {{ 0x52, 0x49, 0x46, 0x46, -0x1, -0x1, -0x1, -0x1, 0x57, 0x41, 0x56, 0x45 }, "wav" } // RIFF....WAVE - }; - - auto match_magic = [](const uint8_t * data, const std::vector & magic) - { - for (int i = 0; i < magic.size(); ++i) - { - if (magic[i] != data[i] && magic[i] != -0x1) // -0x1 skips things that don't contribute to the magic number - { - return false; - } - } - return true; - }; - - auto match_ogg_subtype = [](const uint8_t * data) - { - std::string header; // arbitrarily read the first 64 bytes as ascii characters - for (int i = 0; i < 64; ++i) header += data[i]; - - std::size_t found_opus = header.find("OpusHead"); - if (found_opus != std::string::npos) return "opus"; - - std::size_t found_vorbis = header.find("vorbis"); - if (found_vorbis != std::string::npos) return "ogg"; - - return "none"; - }; - - std::string ext = "none"; - - for (auto & filetype : magic_map) - { - if (match_magic(buffer.data(), filetype.first)) - { - ext = filetype.second; - } - - if (ext == "ogg_or_vorbis") - { - ext = match_ogg_subtype(buffer.data()); - } - } - - NyquistIO::Load(data, ext, buffer); -} - -void NyquistIO::Load(AudioData * data, const std::string & extension, const std::vector & buffer) -{ - if (decoderTable.find(extension) == decoderTable.end()) - { - throw UnsupportedExtensionEx(); - } - - if (decoderTable.size()) - { - auto decoder = GetDecoderForExtension(extension); - try - { - decoder->LoadFromBuffer(data, buffer); - } - catch (const std::exception & e) - { - std::cerr << "caught internal loading exception: " << e.what() << std::endl; - throw; - } - } - else throw std::runtime_error("fatal: no decoders available"); -} - -bool NyquistIO::IsFileSupported(const std::string & path) const -{ - auto fileExtension = ParsePathForExtension(path); - if (decoderTable.find(fileExtension) == decoderTable.end()) return false; - else return true; -} - -std::string NyquistIO::ParsePathForExtension(const std::string & path) const -{ - if (path.find_last_of(".") != std::string::npos) return path.substr(path.find_last_of(".") + 1); - return std::string(""); -} - -std::shared_ptr NyquistIO::GetDecoderForExtension(const std::string & ext) -{ - if (decoderTable.size()) return decoderTable[ext]; - else throw std::runtime_error("No available decoders."); - return nullptr; -} - -void NyquistIO::AddDecoderToTable(std::shared_ptr decoder) -{ - auto supportedExtensions = decoder->GetSupportedFileExtensions(); - - for (const auto ext : supportedExtensions) - { - if (decoderTable.count(ext) >= 1) throw std::runtime_error("decoder already exists for extension"); - decoderTable.insert(DecoderPair(ext, decoder)); - } -} - -void NyquistIO::BuildDecoderTable() -{ - AddDecoderToTable(std::make_shared()); - AddDecoderToTable(std::make_shared()); - AddDecoderToTable(std::make_shared()); - AddDecoderToTable(std::make_shared()); - AddDecoderToTable(std::make_shared()); - AddDecoderToTable(std::make_shared()); - AddDecoderToTable(std::make_shared()); -} - -NyquistFileBuffer nqr::ReadFile(const std::string & pathToFile) -{ - //std::cout << "[Debug] Open: " << pathToFile << std::endl; - FILE * audioFile = fopen(pathToFile.c_str(), "rb"); - - if (!audioFile) - { - throw std::runtime_error("file not found"); - } - - fseek(audioFile, 0, SEEK_END); - size_t lengthInBytes = ftell(audioFile); - fseek(audioFile, 0, SEEK_SET); - - // Allocate temporary buffer - std::vector fileBuffer(lengthInBytes); - - size_t elementsRead = fread(fileBuffer.data(), 1, lengthInBytes, audioFile); - - if (elementsRead == 0 || fileBuffer.size() < 64) - { - throw std::runtime_error("error reading file or file too small"); - } - - NyquistFileBuffer data = {std::move(fileBuffer), elementsRead}; - - fclose(audioFile); - - return data; -} - -// Src data is aligned to PCMFormat -// @todo normalize? -void nqr::ConvertToFloat32(float * dst, const uint8_t * src, const size_t N, PCMFormat f) -{ - assert(f != PCM_END); - - if (f == PCM_U8) - { - const uint8_t * dataPtr = reinterpret_cast(src); - for (size_t i = 0; i < N; ++i) - dst[i] = uint8_to_float32(dataPtr[i]); - } - else if (f == PCM_S8) - { - const int8_t * dataPtr = reinterpret_cast(src); - for (size_t i = 0; i < N; ++i) - dst[i] = int8_to_float32(dataPtr[i]); - } - else if (f == PCM_16) - { - const int16_t * dataPtr = reinterpret_cast(src); - for (size_t i = 0; i < N; ++i) - dst[i] = int16_to_float32(Read16(dataPtr[i])); - } - else if (f == PCM_24) - { - const uint8_t * dataPtr = reinterpret_cast(src); - size_t c = 0; - for (size_t i = 0; i < N; ++i) - { - int32_t sample = Pack(dataPtr[c], dataPtr[c+1], dataPtr[c+2]); - dst[i] = int24_to_float32(sample); // Packed types don't need addtional endian helpers - c += 3; - } - } - else if (f == PCM_32) - { - const int32_t * dataPtr = reinterpret_cast(src); - for (size_t i = 0; i < N; ++i) - dst[i] = int32_to_float32(Read32(dataPtr[i])); - } - - //@todo add int64 format - - else if (f == PCM_FLT) - { - std::memcpy(dst, src, N * sizeof(float)); - /* const float * dataPtr = reinterpret_cast(src); - for (size_t i = 0; i < N; ++i) - dst[i] = (float) Read32(dataPtr[i]); */ - } - else if (f == PCM_DBL) - { - const double * dataPtr = reinterpret_cast(src); - for (size_t i = 0; i < N; ++i) - dst[i] = (float) Read64(dataPtr[i]); - } -} - -// Src data is always aligned to 4 bytes (WavPack, primarily) -void nqr::ConvertToFloat32(float * dst, const int32_t * src, const size_t N, PCMFormat f) -{ - assert(f != PCM_END); - - if (f == PCM_16) - { - for (size_t i = 0; i < N; ++i) - dst[i] = int16_to_float32(Read32(src[i])); - } - else if (f == PCM_24) - { - const uint8_t * dataPtr = reinterpret_cast(src); - size_t c = 0; - for (size_t i = 0; i < N; ++i) - { - int32_t sample = Pack(dataPtr[c], dataPtr[c+1], dataPtr[c+2]); - dst[i] = int24_to_float32(sample); - c += 4; // +4 for next 4 byte boundary - } - } - else if (f == PCM_32) - { - for (size_t i = 0; i < N; ++i) - dst[i] = int32_to_float32(Read32(src[i])); - } -} - -void nqr::ConvertToFloat32(float * dst, const int16_t * src, const size_t N, PCMFormat f) -{ - assert(f != PCM_END); - if (f == PCM_16) - { - for (size_t i = 0; i < N; ++i) - dst[i] = int16_to_float32(Read16(src[i])); - } -} - -void nqr::ConvertFromFloat32(uint8_t * dst, const float * src, const size_t N, PCMFormat f, DitherType t) -{ - assert(f != PCM_END); - - Dither dither(t); - - if (f == PCM_U8) - { - uint8_t * destPtr = reinterpret_cast(dst); - for (size_t i = 0; i < N; ++i) - destPtr[i] = (uint8_t) dither(lroundf(float32_to_uint8(src[i]))); - } - else if (f == PCM_S8) - { - int8_t * destPtr = reinterpret_cast(dst); - for (size_t i = 0; i < N; ++i) - destPtr[i] = (int8_t) dither(lroundf(float32_to_int8(src[i]))); - } - else if (f == PCM_16) - { - int16_t * destPtr = reinterpret_cast(dst); - for (size_t i = 0; i < N; ++i) - destPtr[i] =(int16_t) dither(lroundf(float32_to_int16(src[i]))); - } - else if (f == PCM_24) - { - uint8_t * destPtr = reinterpret_cast(dst); - size_t c = 0; - for (size_t i = 0; i < N; ++i) - { - int32_t sample = (int32_t) dither(lroundf(float32_to_int24(src[i]))); - auto unpacked = Unpack(sample); // Handles endian swap - destPtr[c] = unpacked[0]; - destPtr[c+1] = unpacked[1]; - destPtr[c+2] = unpacked[2]; - c += 3; - } - } - else if (f == PCM_32) - { - int32_t * destPtr = reinterpret_cast(dst); - for (size_t i = 0; i < N; ++i) - destPtr[i] = (int32_t) dither(lroundf(float32_to_int32(src[i]))); - } -} - -int nqr::GetFormatBitsPerSample(PCMFormat f) -{ - switch(f) - { - case PCM_U8: - case PCM_S8: - return 8; - case PCM_16: - return 16; - case PCM_24: - return 24; - case PCM_32: - case PCM_FLT: - return 32; - case PCM_64: - case PCM_DBL: - return 64; - default: - return 0; - } -} - -PCMFormat nqr::MakeFormatForBits(int bits, bool floatingPt, bool isSigned) -{ - switch(bits) - { - case 8: return (isSigned) ? PCM_S8 : PCM_U8; - case 16: return PCM_16; - case 24: return PCM_24; - case 32: return (floatingPt) ? PCM_FLT : PCM_32; - case 64: return (floatingPt) ? PCM_DBL : PCM_64; - default: return PCM_END; - } -} diff --git a/sources/LabSound/third_party/libnyquist/src/Encoders.cpp b/sources/LabSound/third_party/libnyquist/src/Encoders.cpp deleted file mode 100644 index 1e0a5d3b..00000000 --- a/sources/LabSound/third_party/libnyquist/src/Encoders.cpp +++ /dev/null @@ -1,442 +0,0 @@ -/* -Copyright (c) 2019, Dimitri Diakopoulos 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 HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "Encoders.h" -#include - -using namespace nqr; - -static inline void to_bytes(uint8_t value, char * arr) -{ - arr[0] = (value) & 0xFF; -} - -static inline void to_bytes(uint16_t value, char * arr) -{ - arr[0] = (value) & 0xFF; - arr[1] = (value >> 8) & 0xFF; -} - -static inline void to_bytes(uint32_t value, char * arr) -{ - arr[0] = (value) & 0xFF; - arr[1] = (value >> 8) & 0xFF; - arr[2] = (value >> 16) & 0xFF; - arr[3] = (value >> 24) & 0xFF; -} - -//////////////////////////// -// Wave File Encoding // -//////////////////////////// - -int nqr::encode_wav_to_disk(const EncoderParams p, const AudioData * d, const std::string & path) -{ - if (!d->samples.size()) - return EncoderError::InsufficientSampleData; - - // Cast away const because we know what we are doing (Hopefully?) - float * sampleData = const_cast(d->samples.data()); - size_t sampleDataSize = d->samples.size(); - - std::vector sampleDataOptionalMix; - - if (sampleDataSize <= 32) - { - return EncoderError::InsufficientSampleData; - } - - if (d->channelCount < 1 || d->channelCount > 8) - { - return EncoderError::UnsupportedChannelConfiguration; - } - - // Handle Channel Mixing -- - - // Mono => Stereo - if (d->channelCount == 1 && p.channelCount == 2) - { - sampleDataOptionalMix.resize(sampleDataSize * 2); - MonoToStereo(sampleData, sampleDataOptionalMix.data(), sampleDataSize); // Mix - - // Re-point data - sampleData = sampleDataOptionalMix.data(); - sampleDataSize = sampleDataOptionalMix.size(); - } - // Stereo => Mono - else if (d->channelCount == 2 && p.channelCount == 1) - { - sampleDataOptionalMix.resize(sampleDataSize / 2); - StereoToMono(sampleData, sampleDataOptionalMix.data(), sampleDataSize); // Mix - - // Re-point data - sampleData = sampleDataOptionalMix.data(); - sampleDataSize = sampleDataOptionalMix.size(); - } - else if (d->channelCount == p.channelCount) { /* do nothing */ } - else return EncoderError::UnsupportedChannelMix; - - // -- End Channel Mixing - - auto maxFileSizeInBytes = std::numeric_limits::max(); - auto samplesSizeInBytes = (sampleDataSize * GetFormatBitsPerSample(p.targetFormat)) / 8; - - // 64 arbitrary - if ((samplesSizeInBytes - 64) >= maxFileSizeInBytes) - { - return EncoderError::BufferTooBig; - } - - // Don't support PC64 or PCDBL - if (GetFormatBitsPerSample(p.targetFormat) > 32) - { - return EncoderError::UnsupportedBitdepth; - } - - std::ofstream fout(path.c_str(), std::ios::out | std::ios::binary); - - if (!fout.is_open()) - { - return EncoderError::FileIOError; - } - - char * chunkSizeBuff = new char[4]; - - // Initial size (this is changed after we're done writing the file) - to_bytes(uint32_t(36), chunkSizeBuff); - - // RIFF file header - fout.write(GenerateChunkCodeChar('R', 'I', 'F', 'F'), 4); - fout.write(chunkSizeBuff, 4); - - fout.write(GenerateChunkCodeChar('W', 'A', 'V', 'E'), 4); - - // Fmt header - auto header = MakeWaveHeader(p, d->sampleRate); - fout.write(reinterpret_cast(&header), sizeof(WaveChunkHeader)); - - auto sourceBits = GetFormatBitsPerSample(d->sourceFormat); - auto targetBits = GetFormatBitsPerSample(p.targetFormat); - - //@todo - channel mixing! - - // Write out fact chunk - if (p.targetFormat == PCM_FLT) - { - uint32_t four = 4; - uint32_t dataSz = int(sampleDataSize / p.channelCount); - fout.write(GenerateChunkCodeChar('f', 'a', 'c', 't'), 4); - fout.write(reinterpret_cast(&four), 4); - fout.write(reinterpret_cast(&dataSz), 4); // Number of samples (per channel) - } - - // Data header - fout.write(GenerateChunkCodeChar('d', 'a', 't', 'a'), 4); - - // + data chunk size - to_bytes(uint32_t(samplesSizeInBytes), chunkSizeBuff); - fout.write(chunkSizeBuff, 4); - - if (targetBits <= sourceBits && p.targetFormat != PCM_FLT) - { - // At most need this number of bytes in our copy - std::vector samplesCopy(samplesSizeInBytes); - ConvertFromFloat32(samplesCopy.data(), sampleData, sampleDataSize, p.targetFormat, p.dither); - fout.write(reinterpret_cast(samplesCopy.data()), samplesSizeInBytes); - } - else - { - // Handle PCFLT. Coming in from AudioData ensures we start with 32 bits, so we're fine - // since we've also rejected formats with more than 32 bits above. - fout.write(reinterpret_cast(sampleData), samplesSizeInBytes); - } - - // Padding byte - if (isOdd(samplesSizeInBytes)) - { - const char * zero = ""; - fout.write(zero, 1); - } - - // Find size - long totalSize = fout.tellp(); - - // Modify RIFF header - fout.seekp(4); - - // Total size of the file, less 8 bytes for the RIFF header - to_bytes(uint32_t(totalSize - 8), chunkSizeBuff); - - fout.write(chunkSizeBuff, 4); - - delete[] chunkSizeBuff; - - return EncoderError::NoError; -} - -//////////////////////////// -// Opus File Encoding // -//////////////////////////// - -#include "opus/opusfile/include/opusfile.h" -#include "ogg/ogg.h" - -typedef std::pair metadata_t; - -class OggWriter -{ - void write_to_ostream(bool flush) - { - while (ogg_stream_pageout(&oss, &page)) - { - ostream->write(reinterpret_cast(page.header), static_cast(page.header_len)); - ostream->write(reinterpret_cast(page.body), static_cast(page.body_len)); - } - if (flush && ogg_stream_flush(&oss, &page)) - { - ostream->write(reinterpret_cast(page.header), static_cast(page.header_len)); - ostream->write(reinterpret_cast(page.body), static_cast(page.body_len)); - } - } - - std::vector make_header(int channel_count, int preskip, long sample_rate, int gain) - { - std::vector header; - - std::array steam_count = { { 0x0, 0x1, 0x1, 0x2, 0x2, 0x3, 0x4, 0x5, 0x5 } }; - std::array coupled_streacount = { { 0x0, 0x0, 0x1, 0x1, 0x2, 0x2, 0x2, 0x2, 0x3 } }; - - std::array chan_map_1 = { { 0x0 } }; - std::array chan_map_2 = { { 0x0, 0x1 } }; - - std::array _preamble = { { 'O', 'p', 'u', 's', 'H', 'e', 'a', 'd', 0x1 } }; - std::array _channel_count; - std::array _preskip; - std::array _sample_rate; - std::array _gain; - std::array _channel_family = { { 0x1 } }; - - to_bytes(uint8_t(channel_count), _channel_count.data()); - to_bytes(uint16_t(preskip), _preskip.data()); - to_bytes(uint32_t(sample_rate), _sample_rate.data()); - to_bytes(uint16_t(gain), _gain.data()); - - header.insert(header.end(), _preamble.cbegin(), _preamble.cend()); - header.insert(header.end(), _channel_count.cbegin(), _channel_count.cend()); - header.insert(header.end(), _preskip.cbegin(), _preskip.cend()); - header.insert(header.end(), _sample_rate.cbegin(), _sample_rate.cend()); - header.insert(header.end(), _gain.cbegin(), _gain.cend()); - header.insert(header.end(), _channel_family.cbegin(), _channel_family.cend()); - header.push_back(steam_count[channel_count]); - header.push_back(coupled_streacount[channel_count]); - - switch (channel_count) - { - case 1: header.insert(header.end(), chan_map_1.cbegin(), chan_map_1.cend()); break; - case 2: header.insert(header.end(), chan_map_2.cbegin(), chan_map_2.cend()); break; - default: throw std::runtime_error("couldn't map channel data"); - } - - return header; - } - - std::vector make_tags(const std::string & vendor, const std::vector & metadata) - { - std::vector tags; - - std::array _preamble = { { 'O', 'p', 'u', 's', 'T', 'a', 'g', 's' } }; - std::array _vendor_length; - std::array _metadata_count; - - to_bytes(uint32_t(vendor.size()), _vendor_length.data()); - to_bytes(uint32_t(metadata.size()), _metadata_count.data()); - - tags.insert(tags.end(), _preamble.cbegin(), _preamble.cend()); - tags.insert(tags.end(), _vendor_length.cbegin(), _vendor_length.cend()); - tags.insert(tags.end(), vendor.cbegin(), vendor.cend()); - tags.insert(tags.end(), _metadata_count.cbegin(), _metadata_count.cend()); - - // Process metadata. - for (const auto & metadata_entry : metadata) - { - std::array _metadata_entry_length; - std::string entry = metadata_entry.first + "=" + metadata_entry.second; - to_bytes(uint32_t(entry.size()), _metadata_entry_length.data()); - tags.insert(tags.end(), _metadata_entry_length.cbegin(), _metadata_entry_length.cend()); - tags.insert(tags.end(), entry.cbegin(), entry.cend()); - } - - return tags; - } - - ogg_int64_t packet_number; - ogg_int64_t granule; - ogg_page page; - ogg_stream_state oss; - - int channel_count; - long sample_rate; - int bits_per_sample; - std::ofstream * ostream; - std::string description; - std::vector metadata; - -public: - - OggWriter(int channel_count, long sample_rate, int bits_per_sample, std::ofstream & stream, const std::vector & md) - { - this->channel_count = channel_count; - this->sample_rate = sample_rate; - this->bits_per_sample = bits_per_sample; - this->ostream = &stream; - this->metadata = md; - - int oggInitErr, packetErr; - - ogg_packet header_packet; - ogg_packet tags_packet; - std::vector header_vector; - std::vector tags_vector; - - description = "Ogg"; - packet_number = 0; - granule = 0; - - // Validate parameters - if (channel_count < 1 && channel_count > 255) throw std::runtime_error("Channel count must be between 1 and 255."); - - // Initialize the Ogg stream. - oggInitErr = ogg_stream_init(&oss, 12345); - if (oggInitErr) throw std::runtime_error("Could not initialize the Ogg stream state."); - - // Initialize the header packet. - header_vector = make_header(channel_count, 3840, sample_rate, 0); - header_packet.packet = reinterpret_cast(header_vector.data()); - header_packet.bytes = header_vector.size(); - header_packet.b_o_s = 1; - header_packet.e_o_s = 0; - header_packet.granulepos = 0; - header_packet.packetno = packet_number++; - - // Initialize tags - tags_vector = make_tags("libnyquist", metadata); - tags_packet.packet = reinterpret_cast(tags_vector.data()); - tags_packet.bytes = tags_vector.size(); - tags_packet.b_o_s = 0; - tags_packet.e_o_s = 0; - tags_packet.granulepos = 0; - tags_packet.packetno = packet_number++; - - // Write header page - packetErr = ogg_stream_packetin(&oss, &header_packet); - if (packetErr) throw std::runtime_error("Could not write header packet to the Ogg stream."); - write_to_ostream(true); - - // Write tags page - packetErr = ogg_stream_packetin(&oss, &tags_packet); - if (packetErr) throw std::runtime_error("Could not write tags packet to the Ogg stream."); - write_to_ostream(true); - } - - ~OggWriter() - { - write_to_ostream(true); - ogg_stream_clear(&oss); - } - - bool write(char * data, std::streamsize length, size_t sampleCount, bool end) - { - int err; - ogg_packet packet; - - granule += sampleCount; - - packet.packet = reinterpret_cast(data); - packet.bytes = static_cast(length); - packet.b_o_s = 0; - packet.e_o_s = end ? 1 : 0; - packet.granulepos = granule; - packet.packetno = packet_number++; - - err = ogg_stream_packetin(&oss, &packet); - - if (err) throw std::runtime_error("could not write packet to stream"); - - write_to_ostream(false); - - return true; - } -}; - -#define OPUS_MAX_PACKET_SIZE (1024 * 8) -#define OPUS_FRAME_SIZE 960 - -// Opus only supports a 48k samplerate... -// This encoder only supports mono for the time being -int nqr::encode_opus_to_disk(const EncoderParams p, const AudioData * d, const std::string & path) -{ - assert(d->samples.size() > 0); - //assert(d->sampleRate == 48000); - - float * sampleData = const_cast(d->samples.data()); - const size_t sampleDataSize = d->samples.size(); - - int opus_error; - OpusEncoder * enc; - enc = opus_encoder_create(48000, 1, OPUS_APPLICATION_AUDIO, &opus_error); - if (!enc) throw std::runtime_error("opus_encoder_create caused an error!"); - - std::ofstream fout(path.c_str(), std::ios::out | std::ios::binary); - - std::vector oggMetadata = { { "artist", "dimitri" } }; - OggWriter writer(d->channelCount, d->sampleRate, GetFormatBitsPerSample(d->sourceFormat), fout, oggMetadata); - - std::vector outBuffer(OPUS_MAX_PACKET_SIZE); - - int framesToEncode = (sampleDataSize / OPUS_FRAME_SIZE) - 1; // fixme - - while (framesToEncode >= 0) - { - auto encoded_size = opus_encode_float(enc, sampleData, OPUS_FRAME_SIZE, outBuffer.data(), OPUS_MAX_PACKET_SIZE); - - if (encoded_size < 0) - { - std::cerr << "Bad Opus Status: " << encoded_size << std::endl; - return EncoderError::FileIOError; - } - - writer.write((char*)outBuffer.data(), encoded_size, OPUS_FRAME_SIZE, (framesToEncode == 0) ? true : false); - - framesToEncode--; - sampleData += OPUS_FRAME_SIZE; - } - - fout.close(); - - opus_encoder_destroy(enc); - - return EncoderError::NoError; -} - -#undef OPUS_MAX_PACKET_SIZE diff --git a/sources/LabSound/third_party/libnyquist/src/FlacDecoder.cpp b/sources/LabSound/third_party/libnyquist/src/FlacDecoder.cpp deleted file mode 100644 index 979e7655..00000000 --- a/sources/LabSound/third_party/libnyquist/src/FlacDecoder.cpp +++ /dev/null @@ -1,258 +0,0 @@ -/* -Copyright (c) 2019, Dimitri Diakopoulos 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 HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "Decoders.h" - -// http://lists.xiph.org/pipermail/flac-dev/2012-March/003276.html -#define FLAC__NO_DLL - -#include "FLAC/all.h" -#include "FLAC/stream_decoder.h" - -#include - -using namespace nqr; - -// FLAC is a big-endian format. All values are unsigned. -class FlacDecoderInternal -{ - -public: - - FlacDecoderInternal(AudioData * d, const std::string & filepath) : d(d) - { - decoderInternal = FLAC__stream_decoder_new(); - - FLAC__stream_decoder_set_metadata_respond(decoderInternal, FLAC__METADATA_TYPE_STREAMINFO); - - //@todo: check if OGG flac - bool initialized = FLAC__stream_decoder_init_file(decoderInternal, - filepath.c_str(), - s_writeCallback, - s_metadataCallback, - s_errorCallback, - this) == FLAC__STREAM_DECODER_INIT_STATUS_OK; - - FLAC__stream_decoder_set_md5_checking(decoderInternal, true); - - if (initialized) - { - // Find the size and allocate memory - FLAC__stream_decoder_process_until_end_of_metadata(decoderInternal); - - // Read memory out into our temporary internalBuffer - FLAC__stream_decoder_process_until_end_of_stream(decoderInternal); - - // Presently unneeded, but useful for reference - // FLAC__ChannelAssignment channelAssignment = FLAC__stream_decoder_get_channel_assignment(decoderInternal); - - // Fill out remaining user data - d->lengthSeconds = (float) numSamples / (float) d->sampleRate; - - auto totalSamples = numSamples * d->channelCount; - - // Next, process internal buffer into the user-visible samples array - ConvertToFloat32(d->samples.data(), internalBuffer.data(), totalSamples, d->sourceFormat); - } - else throw std::runtime_error("Unable to initialize FLAC decoder"); - } - - FlacDecoderInternal(AudioData * d, const std::vector & memory) : d(d), data(std::move(memory)), dataPos(0) - { - decoderInternal = FLAC__stream_decoder_new(); - - FLAC__stream_decoder_set_metadata_respond(decoderInternal, FLAC__METADATA_TYPE_STREAMINFO); - - bool initialized = FLAC__stream_decoder_init_stream( - decoderInternal, - read_callback, - seek_callback, - tell_callback, - length_callback, - eof_callback, - s_writeCallback, - s_metadataCallback, - s_errorCallback, - this - ) == FLAC__STREAM_DECODER_INIT_STATUS_OK; - - FLAC__stream_decoder_set_md5_checking(decoderInternal, true); - - if (initialized) - { - // Find the size and allocate memory - FLAC__stream_decoder_process_until_end_of_metadata(decoderInternal); - - // Read memory out into our temporary internalBuffer - FLAC__stream_decoder_process_until_end_of_stream(decoderInternal); - - // Presently unneeded, but useful for reference - // FLAC__ChannelAssignment channelAssignment = FLAC__stream_decoder_get_channel_assignment(decoderInternal); - - // Fill out remaining user data - d->lengthSeconds = (float) numSamples / (float) d->sampleRate; - - auto totalSamples = numSamples * d->channelCount; - - // Next, process internal buffer into the user-visible samples array - ConvertToFloat32(d->samples.data(), internalBuffer.data(), totalSamples, d->sourceFormat); - } - else throw std::runtime_error("Unable to initialize FLAC decoder"); - } - - ~FlacDecoderInternal() - { - if (decoderInternal) - { - FLAC__stream_decoder_finish(decoderInternal); - FLAC__stream_decoder_delete(decoderInternal); - } - } - - void processMetadata(const FLAC__StreamMetadata_StreamInfo & info) - { - // Currently the reference encoder and decoders only support up to 24 bits per sample. - d->sampleRate = info.sample_rate; - d->channelCount = info.channels; // Assert 1 to 8 - d->sourceFormat = MakeFormatForBits(info.bits_per_sample, false, true); - d->frameSize = info.channels * info.bits_per_sample; - - const size_t bytesPerSample = GetFormatBitsPerSample(d->sourceFormat) / 8; - - numSamples = (size_t) info.total_samples; - - internalBuffer.resize(numSamples * info.channels * bytesPerSample); // as array of bytes - d->samples.resize(numSamples * info.channels); // as audio samples in float32 - } - - /////////////////////// - // libflac callbacks // - /////////////////////// - - static FLAC__StreamDecoderWriteStatus s_writeCallback(const FLAC__StreamDecoder *, const FLAC__Frame* frame, const FLAC__int32 * const buffer[], void * userPtr) - { - FlacDecoderInternal * decoder = reinterpret_cast(userPtr); - const size_t bytesPerSample = GetFormatBitsPerSample(decoder->d->sourceFormat) / 8; - auto dataPtr = decoder->internalBuffer.data(); - - for (uint32_t i = 0; i < frame->header.blocksize; i++) - { - for (int j = 0; j < decoder->d->channelCount; j++) - { - std::memcpy(dataPtr + decoder->bufferPosition, &buffer[j][i], bytesPerSample); - decoder->bufferPosition += bytesPerSample; - } - } - - return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; - } - - static void s_metadataCallback (const FLAC__StreamDecoder *, const FLAC__StreamMetadata * metadata, void * userPtr) - { - static_cast(userPtr)->processMetadata(metadata->data.stream_info); - } - - static void s_errorCallback (const FLAC__StreamDecoder *, FLAC__StreamDecoderErrorStatus status, void *) - { - throw std::runtime_error("FLAC decode exception " + std::string(FLAC__StreamDecoderErrorStatusString[status])); - } - - static FLAC__StreamDecoderReadStatus read_callback(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) - { - FlacDecoderInternal *decoderInternal = (FlacDecoderInternal *)client_data; - size_t readLength = std::min(*bytes, decoderInternal->data.size() - decoderInternal->dataPos); - - if (readLength > 0) - { - std::memcpy(buffer, decoderInternal->data.data(), readLength); - decoderInternal->dataPos += readLength; - *bytes = readLength; - if (decoderInternal->dataPos < decoderInternal->data.size()) return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; - else return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; - } - else return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; - } - - static FLAC__StreamDecoderSeekStatus seek_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data) - { - FlacDecoderInternal *decoderInternal = (FlacDecoderInternal *)client_data; - size_t newPos = std::min(absolute_byte_offset, decoderInternal->data.size() - decoderInternal->dataPos); - decoderInternal->dataPos = newPos; - return FLAC__STREAM_DECODER_SEEK_STATUS_OK; - } - - static FLAC__StreamDecoderTellStatus tell_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data) - { - FlacDecoderInternal *decoderInternal = (FlacDecoderInternal *)client_data; - *absolute_byte_offset = decoderInternal->dataPos; - return FLAC__STREAM_DECODER_TELL_STATUS_OK; - } - - static FLAC__StreamDecoderLengthStatus length_callback(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data) - { - FlacDecoderInternal *decoderInternal = (FlacDecoderInternal *)client_data; - *stream_length = decoderInternal->data.size(); - return FLAC__STREAM_DECODER_LENGTH_STATUS_OK; - } - - static FLAC__bool eof_callback(const FLAC__StreamDecoder *decoder, void *client_data) - { - FlacDecoderInternal *decoderInternal = (FlacDecoderInternal *)client_data; - return decoderInternal->dataPos == decoderInternal->data.size(); - } - -private: - - NO_COPY(FlacDecoderInternal); - - FLAC__StreamDecoder * decoderInternal; - std::vector data; - size_t dataPos; - size_t bufferPosition = 0; - size_t numSamples = 0; - - AudioData * d; - - std::vector internalBuffer; -}; - -////////////////////// -// Public Interface // -////////////////////// - -void FlacDecoder::LoadFromPath(AudioData * data, const std::string & path) -{ - FlacDecoderInternal decoder(data, path); -} - -void FlacDecoder::LoadFromBuffer(AudioData * data, const std::vector & memory) -{ - FlacDecoderInternal decoder(data, memory); -} - -std::vector FlacDecoder::GetSupportedFileExtensions() -{ - return {"flac"}; -} diff --git a/sources/LabSound/third_party/libnyquist/src/FlacDependencies.c b/sources/LabSound/third_party/libnyquist/src/FlacDependencies.c deleted file mode 100644 index e0e73786..00000000 --- a/sources/LabSound/third_party/libnyquist/src/FlacDependencies.c +++ /dev/null @@ -1,108 +0,0 @@ -/* -Copyright (c) 2019, Dimitri Diakopoulos 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 HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#undef VERSION -#define VERSION "1.3.1" - -#define FLAC__NO_DLL 1 -#define FLAC__USE_VISIBILITY_ATTR 1 - -#if (_MSC_VER) -#pragma warning (push) -#pragma warning (disable: 181 111 4267 4996 4244 4701 4702 4133 4100 4127 4206 4312 4505 4365 4005 4013 4334) -#ifndef _WIN32 -#define _WIN32 -#endif -#endif - -#if defined(__APPLE__) && defined(__MACH__) -#define FLAC__SYS_DARWIN 1 -#endif - -#ifndef SIZE_MAX -#define SIZE_MAX (size_t) (-1) -#endif - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wconversion" -#pragma clang diagnostic ignored "-Wshadow" -#pragma clang diagnostic ignored "-Wdeprecated-register" -#endif - -#if CPU_X86 -#ifdef __i386__ -#define FLAC__CPU_IA32 1 -#endif -#ifdef __x86_64__ -#define FLAC__CPU_X86_64 1 -#endif -#define FLAC__HAS_X86INTRIN 1 -#endif - -// Ensure libflac can use non-standard types -#undef __STDC_LIMIT_MACROS -#define __STDC_LIMIT_MACROS 1 - -#if defined(__APPLE__) && defined(__MACH__) -#define flac_max(a,b) ((a) > (b) ? a : b) -#define flac_min(a,b) ((a) < (b) ? a : b) -#elif defined(_MSC_VER) -#include -#define flac_max(a,b) __max(a,b) -#define flac_min(a,b) __min(a,b) -#endif - -#define HAVE_LROUND 1 - -#include "FLAC/all.h" - -#if defined(_MSC_VER) -#include "FLAC/src/win_utf8_io.c" -#endif - -#include "FLAC/src/bitmath.c" -#include "FLAC/src/bitreader.c" -#include "FLAC/src/bitwriter.c" -#include "FLAC/src/cpu.c" -#include "FLAC/src/crc.c" -#include "FLAC/src/fixed.c" -#include "FLAC/src/float.c" -#include "FLAC/src/format.c" -#include "FLAC/src/lpc.c" -#include "FLAC/src/md5.c" -#include "FLAC/src/memory.c" -#include "FLAC/src/stream_decoder.c" -#include "FLAC/src/window.c" - -#undef VERSION - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -#if (_MSC_VER) -#pragma warning (pop) -#endif diff --git a/sources/LabSound/third_party/libnyquist/src/Mp3Decoder.cpp b/sources/LabSound/third_party/libnyquist/src/Mp3Decoder.cpp deleted file mode 100644 index a48a300a..00000000 --- a/sources/LabSound/third_party/libnyquist/src/Mp3Decoder.cpp +++ /dev/null @@ -1,79 +0,0 @@ -/* - Copyright (c) 2019, Dimitri Diakopoulos 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 HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "Decoders.h" - -using namespace nqr; - -#include "mpc/mpcdec.h" -#include "mpc/reader.h" -#include "musepack/libmpcdec/decoder.h" -#include "musepack/libmpcdec/internal.h" - -#define MINIMP3_FLOAT_OUTPUT -#define MINIMP3_IMPLEMENTATION -#include "minimp3/minimp3.h" -#include "minimp3/minimp3_ex.h" - -#include - -void mp3_decode_internal(AudioData * d, const std::vector & fileData) -{ - mp3dec_t mp3d; - mp3dec_file_info_t info; - mp3dec_load_buf(&mp3d, (const uint8_t*)fileData.data(), fileData.size(), &info, 0, 0); - - d->sampleRate = info.hz; - d->channelCount = info.channels; - d->sourceFormat = MakeFormatForBits(32, true, false); - d->lengthSeconds = ((float)info.samples / (float)d->channelCount) / (float)d->sampleRate; - - if (info.samples == 0) throw std::runtime_error("mp3: could not read any data"); - - d->samples.resize(info.samples); - std::memcpy(d->samples.data(), info.buffer, sizeof(float) * info.samples); - - delete info.buffer; -} - -////////////////////// -// Public Interface // -////////////////////// - -void Mp3Decoder::LoadFromPath(AudioData * data, const std::string & path) -{ - auto fileBuffer = nqr::ReadFile(path); - mp3_decode_internal(data, fileBuffer.buffer); -} - -void Mp3Decoder::LoadFromBuffer(AudioData * data, const std::vector & memory) -{ - mp3_decode_internal(data, memory); -} - -std::vector Mp3Decoder::GetSupportedFileExtensions() -{ - return {"mp3"}; -} diff --git a/sources/LabSound/third_party/libnyquist/src/MusepackDecoder.cpp b/sources/LabSound/third_party/libnyquist/src/MusepackDecoder.cpp deleted file mode 100644 index 90ea049d..00000000 --- a/sources/LabSound/third_party/libnyquist/src/MusepackDecoder.cpp +++ /dev/null @@ -1,191 +0,0 @@ -/* - Copyright (c) 2019, Dimitri Diakopoulos 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 HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "Decoders.h" - -using namespace nqr; - -#include "mpc/mpcdec.h" -#include "mpc/reader.h" -#include "musepack/libmpcdec/decoder.h" -#include "musepack/libmpcdec/internal.h" - -class MusepackInternal -{ - - static const uint32_t STDIO_MAGIC = 0xF36D656D; - - // Methods borrowed from r-lyeh (https://github.com/r-lyeh) (zlib) - struct mpc_reader_state - { - unsigned char *p_file; - unsigned char *p_begin, *p_end; - mpc_bool_t is_seekable; - mpc_int32_t magic; - }; - - static mpc_int32_t read_mem(mpc_reader *p_reader, void *ptr, mpc_int32_t size) - { - mpc_reader_state *p_mem = (mpc_reader_state*) p_reader->data; - if (p_mem->magic != STDIO_MAGIC) return MPC_STATUS_FAIL; - mpc_int32_t max = mpc_int32_t(p_mem->p_end - p_mem->p_file); - if (size >= max) size = max; - memcpy((unsigned char *)ptr, p_mem->p_file, size); - p_mem->p_file += size; - return size; - } - - static mpc_bool_t seek_mem(mpc_reader *p_reader, mpc_int32_t offset) - { - mpc_reader_state *p_mem = (mpc_reader_state*) p_reader->data; - if (p_mem->magic != STDIO_MAGIC) return MPC_FALSE; - if (!p_mem->is_seekable) return MPC_FALSE; - p_mem->p_file = p_mem->p_begin + offset; - if(p_mem->p_file < p_mem->p_begin) return MPC_FALSE; - if(p_mem->p_file >= p_mem->p_end ) return MPC_FALSE; - return MPC_TRUE; - } - - static mpc_int32_t tell_mem(mpc_reader *p_reader) - { - mpc_reader_state *p_mem = (mpc_reader_state*) p_reader->data; - if(p_mem->magic != STDIO_MAGIC) return MPC_STATUS_FAIL; - return mpc_int32_t(p_mem->p_file - p_mem->p_begin); - } - - static mpc_int32_t get_size_mem(mpc_reader *p_reader) - { - mpc_reader_state *p_mem = (mpc_reader_state*) p_reader->data; - if (p_mem->magic != STDIO_MAGIC) return MPC_STATUS_FAIL; - return mpc_int32_t(p_mem->p_end - p_mem->p_begin); - } - - static mpc_bool_t canseek_mem(mpc_reader *p_reader) - { - mpc_reader_state *p_mem = (mpc_reader_state*) p_reader->data; - if (p_mem->magic != STDIO_MAGIC) return MPC_FALSE; - return p_mem->is_seekable; - } - -public: - - // Musepack is a purely variable bitrate format and does not work at a constant bitrate. - MusepackInternal(AudioData * d, const std::vector & fileData) : d(d) - { - decoderMemory = std::make_shared(); - - decoderMemory->magic = STDIO_MAGIC; - decoderMemory->p_file = (unsigned char *) fileData.data(); - decoderMemory->p_begin = (unsigned char *) fileData.data(); - decoderMemory->p_end = (unsigned char *) fileData.data() + fileData.size(); - decoderMemory->is_seekable = MPC_TRUE; - - reader.data = decoderMemory.get(); - reader.canseek = canseek_mem; - reader.get_size = get_size_mem; - reader.read = read_mem; - reader.seek = seek_mem; - reader.tell = tell_mem; - - mpcDemux = mpc_demux_init(&reader); - if (!mpcDemux) throw std::runtime_error("could not initialize mpc demuxer"); - - mpc_demux_get_info(mpcDemux, &streamInfo); - - d->sampleRate = (int) streamInfo.sample_freq; - d->channelCount = streamInfo.channels; - d->sourceFormat = MakeFormatForBits(32, true, false); - d->lengthSeconds = (double) mpc_streaminfo_get_length(&streamInfo); - - auto totalSamples = size_t(mpc_streaminfo_get_length_samples(&streamInfo)); - d->samples.reserve(totalSamples * d->channelCount + (MPC_DECODER_BUFFER_LENGTH / sizeof(MPC_SAMPLE_FORMAT))); // demux writes in chunks - d->samples.resize(totalSamples * d->channelCount); - - if (!readInternal()) - throw std::runtime_error("could not read any data"); - } - - size_t readInternal() - { - mpc_status err = MPC_STATUS_OK; - size_t totalSamplesRead = 0; - - while (true) - { - mpc_frame_info frame; - frame.buffer = d->samples.data() + totalSamplesRead; - - err = mpc_demux_decode(mpcDemux, &frame); - if (frame.bits == -1 || err != MPC_STATUS_OK) break; - - totalSamplesRead += (frame.samples * streamInfo.channels); - } - - if (err != MPC_STATUS_OK) - std::cerr << "An internal error occured in mpc_demux_decode" << std::endl; - - return totalSamplesRead; - } - - ~MusepackInternal() - { - if (mpcDemux) mpc_demux_exit(mpcDemux); - } - - -private: - - mpc_streaminfo streamInfo; - mpc_reader_t reader; - mpc_decoder decoder; - mpc_demux * mpcDemux; - - std::shared_ptr decoderMemory; - - NO_MOVE(MusepackInternal); - - AudioData * d; -}; - - -////////////////////// -// Public Interface // -////////////////////// - -void MusepackDecoder::LoadFromPath(AudioData * data, const std::string & path) -{ - auto fileBuffer = nqr::ReadFile(path); - MusepackInternal decoder(data, fileBuffer.buffer); -} - -void MusepackDecoder::LoadFromBuffer(AudioData * data, const std::vector & memory) -{ - MusepackInternal decoder(data, memory); -} - -std::vector MusepackDecoder::GetSupportedFileExtensions() -{ - return {"mpc", "mpp"}; -} diff --git a/sources/LabSound/third_party/libnyquist/src/MusepackDependencies.c b/sources/LabSound/third_party/libnyquist/src/MusepackDependencies.c deleted file mode 100644 index 22a6a472..00000000 --- a/sources/LabSound/third_party/libnyquist/src/MusepackDependencies.c +++ /dev/null @@ -1,54 +0,0 @@ -/* -Copyright (c) 2019, Dimitri Diakopoulos 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 HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#if (_MSC_VER) - #pragma warning (push) - #pragma warning (disable: 181 111 4267 4996 4244 4701 4702 4133 4100 4127 4206 4312 4505 4365 4005 4013 4334) -#endif - -#ifdef __clang__ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wconversion" - #pragma clang diagnostic ignored "-Wshadow" - #pragma clang diagnostic ignored "-Wdeprecated-register" -#endif - -#include "musepack/libmpcdec/huffman.c" -#include "musepack/libmpcdec/requant.c" -#include "musepack/libmpcdec/streaminfo.c" -#include "musepack/libmpcdec/synth_filter.c" -#include "musepack/libmpcdec/crc32.c" -#include "musepack/libmpcdec/mpc_reader.c" -#include "musepack/libmpcdec/mpc_decoder.c" -#include "musepack/libmpcdec/mpc_demux.c" -#include "musepack/libmpcdec/mpc_bits_reader.c" - -#ifdef __clang__ - #pragma clang diagnostic pop -#endif - -#if (_MSC_VER) - #pragma warning (pop) -#endif diff --git a/sources/LabSound/third_party/libnyquist/src/OpusDecoder.cpp b/sources/LabSound/third_party/libnyquist/src/OpusDecoder.cpp deleted file mode 100644 index ee48c379..00000000 --- a/sources/LabSound/third_party/libnyquist/src/OpusDecoder.cpp +++ /dev/null @@ -1,183 +0,0 @@ -/* -Copyright (c) 2019, Dimitri Diakopoulos 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 HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "Decoders.h" -#include "opus/opusfile/include/opusfile.h" - -using namespace nqr; - -static const int OPUS_SAMPLE_RATE = 48000; - -// Opus is a general-purpose codec designed to replace Vorbis at some point. Primarily, it's a low -// delay format making it suitable for high-quality, real time streaming. It's not really -// an archival format or something designed for heavy DSP post-processing since -// it's fundamentally limited to encode/decode at 48khz. -// https://mf4.xiph.org/jenkins/view/opus/job/opusfile-unix/ws/doc/html/index.html - -class OpusDecoderInternal -{ - -public: - - OpusDecoderInternal(AudioData * d, const std::vector & fileData) : d(d) - { - /* @todo proper steaming support + classes - const opus_callbacks = { - .read = s_readCallback, - .seek = s_seekCallback, - .tell = s_tellCallback, - .close = nullptr - }; - */ - - int err; - - fileHandle = op_test_memory(fileData.data(), fileData.size(), &err); - - if (!fileHandle) - { - std::cerr << errorAsString(err) << std::endl; - throw std::runtime_error("File is not a valid ogg vorbis file"); - } - - if (auto r = op_test_open(fileHandle) != 0) - { - std::cerr << errorAsString(r) << std::endl; - throw std::runtime_error("Could not open file"); - } - - const OpusHead * header = op_head(fileHandle, 0); - - // int originalSampleRate = header->input_sample_rate; - - d->sampleRate = OPUS_SAMPLE_RATE; - d->channelCount = (uint32_t) header->channel_count; - d->sourceFormat = MakeFormatForBits(32, true, false); - d->lengthSeconds = double(getLengthInSeconds()); - d->frameSize = (uint32_t) header->channel_count * GetFormatBitsPerSample(d->sourceFormat); - - // Samples in a single channel - auto totalSamples = size_t(getTotalSamples()); - - d->samples.resize(totalSamples * d->channelCount); - - if (!readInternal(totalSamples)) - throw std::runtime_error("could not read any data"); - } - - ~OpusDecoderInternal() - { - op_free(fileHandle); - } - - size_t readInternal(size_t requestedFrameCount, size_t frameOffset = 0) - { - float * buffer = (float *) d->samples.data(); - size_t framesRemaining = requestedFrameCount; - size_t totalFramesRead = 0; - - while(0 < framesRemaining) - { - int framesRead = op_read_float(fileHandle, buffer, (int)(framesRemaining * d->channelCount), nullptr); - - // EOF - if(!framesRead) - break; - - if (framesRead < 0) - { - std::cerr << "Opus decode error: " << framesRead << std::endl; - return 0; - } - - buffer += framesRead * d->channelCount; - - totalFramesRead += framesRead; - framesRemaining -= framesRead; - } - - return totalFramesRead; - } - - std::string errorAsString(int opusErrorCode) - { - switch(opusErrorCode) - { - case OP_FALSE: return "A request did not succeed"; - case OP_EOF: return "End of File Reached"; - case OP_HOLE: return "There was a hole in the page sequence numbers (e.g., a page was corrupt or missing)."; - case OP_EREAD: return "An underlying read, seek, or tell operation failed when it should have succeeded."; - case OP_EFAULT: return "A NULL pointer was passed where one was unexpected, or an internal memory allocation failed, or an internal library error was encountered."; - case OP_EIMPL: return "The stream used a feature that is not implemented, such as an unsupported channel family. "; - case OP_EINVAL: return "One or more parameters to a function were invalid. "; - case OP_ENOTFORMAT: return "A purported Ogg Opus stream did not begin with an Ogg page, a purported header packet did not start with one of the required strings"; - case OP_EBADHEADER: return "A required header packet was not properly formatted, contained illegal values, or was missing altogether."; - case OP_EVERSION: return "The ID header contained an unrecognized version number."; - case OP_ENOTAUDIO: return "Not Audio"; - case OP_EBADPACKET: return "An audio packet failed to decode properly."; - case OP_EBADLINK: return "We failed to find data we had seen before, or the bitstream structure was sufficiently malformed that seeking to the target destination was impossible."; - case OP_ENOSEEK: return "An operation that requires seeking was requested on an unseekable stream."; - case OP_EBADTIMESTAMP: return "The first or last granule position of a link failed basic validity checks."; - default: return "Unknown Error"; - } - } - - //////////////////// - // opus callbacks // - //////////////////// - -private: - - NO_MOVE(OpusDecoderInternal); - - OggOpusFile * fileHandle; - - AudioData * d; - - inline int64_t getTotalSamples() const { return int64_t(op_pcm_total(const_cast(fileHandle), -1)); } - inline int64_t getLengthInSeconds() const { return uint64_t(getTotalSamples() / OPUS_SAMPLE_RATE); } - inline int64_t getCurrentSample() const { return int64_t(op_pcm_tell(const_cast(fileHandle))); } - -}; - -////////////////////// -// Public Interface // -////////////////////// - -void nqr::OpusDecoder::LoadFromPath(AudioData * data, const std::string & path) -{ - auto fileBuffer = nqr::ReadFile(path); - OpusDecoderInternal decoder(data, fileBuffer.buffer); -} - -void nqr::OpusDecoder::LoadFromBuffer(AudioData * data, const std::vector & memory) -{ - OpusDecoderInternal decoder(data, memory); -} - -std::vector nqr::OpusDecoder::GetSupportedFileExtensions() -{ - return {"opus"}; -} diff --git a/sources/LabSound/third_party/libnyquist/src/OpusDependencies.c b/sources/LabSound/third_party/libnyquist/src/OpusDependencies.c deleted file mode 100644 index b6614277..00000000 --- a/sources/LabSound/third_party/libnyquist/src/OpusDependencies.c +++ /dev/null @@ -1,275 +0,0 @@ -/* -Copyright (c) 2019, Dimitri Diakopoulos 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 HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -// https://dxr.mozilla.org/mozilla-central/source/media/libopus - -#if (_MSC_VER) - #pragma warning (push) - #pragma warning (disable: 181 111 4267 4996 4244 4701 4702 4133 4100 4127 4206 4312 4505 4365 4005 4013 4334 4703) -#endif - -#ifdef __clang__ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wconversion" - #pragma clang diagnostic ignored "-Wshadow" - #pragma clang diagnostic ignored "-Wdeprecated-register" -#endif - -#undef HAVE_CONFIG_H - -#define USE_ALLOCA 1 -#define OPUS_BUILD 1 - -/* Enable SSE functions, if compiled with SSE/SSE2 (note that AMD64 implies SSE2) */ -#if defined(_M_X64) || (defined(_M_IX86_FP) && (_M_IX86_FP >= 1)) -#define __SSE__ 1 -#endif - -////////// -// CELT // -////////// - -#include "opus/celt/arch.h" -#include "opus/celt/bands.h" -#include "opus/celt/celt.h" -#include "opus/celt/celt_lpc.h" -#include "opus/celt/cwrs.h" -#include "opus/celt/ecintrin.h" -#include "opus/celt/entcode.h" -#include "opus/celt/entdec.h" -#include "opus/celt/entenc.h" -#include "opus/celt/float_cast.h" -#include "opus/celt/kiss_fft.h" -#include "opus/celt/laplace.h" -#include "opus/celt/mathops.h" -#include "opus/celt/mdct.h" -#include "opus/celt/mfrngcod.h" -#include "opus/celt/modes.h" -#include "opus/celt/os_support.h" -#include "opus/celt/pitch.h" -#include "opus/celt/quant_bands.h" -#include "opus/celt/rate.h" -#include "opus/celt/stack_alloc.h" -#include "opus/celt/vq.h" -#include "opus/celt/_kiss_fft_guts.h" - -#include "opus/celt/bands.c" -#include "opus/celt/celt.c" -#include "opus/celt/celt_lpc.c" -#include "opus/celt/cwrs.c" -#include "opus/celt/entcode.c" -#include "opus/celt/entdec.c" -#include "opus/celt/entenc.c" -#include "opus/celt/kiss_fft.c" -#include "opus/celt/laplace.c" -#include "opus/celt/mathops.c" -#include "opus/celt/mdct.c" -#include "opus/celt/modes.c" -#include "opus/celt/pitch.c" -#include "opus/celt/quant_bands.c" -#include "opus/celt/rate.c" -#include "opus/celt/vq.c" - -//#define opus_custom_encoder_get_size opus_custom_encoder_get_size_alt -#include "opus/celt/celt_decoder.c" -#include "opus/celt/celt_encoder.c" - -///////////////// -// SILK Common // -///////////////// - -#include "opus_types.h" - -#include "opus/silk/control.h" -#include "opus/silk/debug.h" -#include "opus/silk/define.h" -#include "opus/silk/errors.h" -#include "opus/silk/MacroCount.h" -#include "opus/silk/MacroDebug.h" -#include "opus/silk/macros.h" -#include "opus/silk/main.h" -#include "opus/silk/pitch_est_defines.h" -#include "opus/silk/PLC.h" -#include "opus/silk/resampler_private.h" -#include "opus/silk/resampler_rom.h" -#include "opus/silk/resampler_structs.h" -#include "opus/silk/API.h" -#include "opus/silk/SigProc_FIX.h" -#include "opus/silk/structs.h" -#include "opus/silk/tables.h" -#include "opus/silk/tuning_parameters.h" -#include "opus/silk/typedef.h" - -#include "opus/silk/A2NLSF.c" -#include "opus/silk/ana_filt_bank_1.c" -#include "opus/silk/biquad_alt.c" -#include "opus/silk/bwexpander.c" -#include "opus/silk/bwexpander_32.c" -#include "opus/silk/check_control_input.c" -#include "opus/silk/CNG.c" -#include "opus/silk/code_signs.c" -#include "opus/silk/control_audio_bandwidth.c" -#include "opus/silk/control_codec.c" -#include "opus/silk/control_SNR.c" -#include "opus/silk/debug.c" -#include "opus/silk/decoder_set_fs.c" -#include "opus/silk/decode_core.c" -#include "opus/silk/decode_frame.c" -#include "opus/silk/decode_indices.c" -#include "opus/silk/decode_parameters.c" -#include "opus/silk/decode_pitch.c" -#include "opus/silk/decode_pulses.c" -#include "opus/silk/dec_API.c" -#include "opus/silk/encode_indices.c" -#include "opus/silk/encode_pulses.c" -#include "opus/silk/enc_API.c" -#include "opus/silk/gain_quant.c" -#include "opus/silk/HP_variable_cutoff.c" -#include "opus/silk/init_decoder.c" -#include "opus/silk/init_encoder.c" -#include "opus/silk/inner_prod_aligned.c" -#include "opus/silk/interpolate.c" -#include "opus/silk/lin2log.c" -#include "opus/silk/log2lin.c" -#include "opus/silk/LPC_analysis_filter.c" -#include "opus/silk/LPC_inv_pred_gain.c" -#include "opus/silk/LP_variable_cutoff.c" -#include "opus/silk/NLSF2A.c" -#include "opus/silk/NLSF_decode.c" -#include "opus/silk/NLSF_del_dec_quant.c" -#include "opus/silk/NLSF_encode.c" -#include "opus/silk/NLSF_stabilize.c" -#include "opus/silk/NLSF_unpack.c" -#include "opus/silk/NLSF_VQ.c" -#include "opus/silk/NLSF_VQ_weights_laroia.c" -#include "opus/silk/NSQ.c" -#include "opus/silk/NSQ_del_dec.c" -#include "opus/silk/pitch_est_tables.c" -#include "opus/silk/PLC.c" -#include "opus/silk/process_NLSFs.c" -#include "opus/silk/quant_LTP_gains.c" -#include "opus/silk/resampler.c" -#include "opus/silk/resampler_down2.c" -#include "opus/silk/resampler_down2_3.c" -#include "opus/silk/resampler_private_AR2.c" -#include "opus/silk/resampler_private_down_FIR.c" -#include "opus/silk/resampler_private_IIR_FIR.c" -#include "opus/silk/resampler_private_up2_HQ.c" -#include "opus/silk/resampler_rom.c" -#include "opus/silk/shell_coder.c" -#include "opus/silk/sigm_Q15.c" -#include "opus/silk/sort.c" -#include "opus/silk/stereo_decode_pred.c" -#include "opus/silk/stereo_encode_pred.c" -#include "opus/silk/stereo_find_predictor.c" -#include "opus/silk/stereo_LR_to_MS.c" -#include "opus/silk/stereo_MS_to_LR.c" -#include "opus/silk/stereo_quant_pred.c" -#include "opus/silk/sum_sqr_shift.c" -#include "opus/silk/tables_gain.c" -#include "opus/silk/tables_LTP.c" -#include "opus/silk/tables_NLSF_CB_NB_MB.c" -#include "opus/silk/tables_NLSF_CB_WB.c" -#include "opus/silk/tables_other.c" -#include "opus/silk/tables_pitch_lag.c" -#include "opus/silk/tables_pulses_per_block.c" -#include "opus/silk/table_LSF_cos.c" -#include "opus/silk/VAD.c" -#include "opus/silk/VQ_WMat_EC.c" - -//////////////// -// SILK Float // -//////////////// - -#include "opus/silk/float/main_FLP.h" -#include "opus/silk/float/SigProc_FLP.h" -#include "opus/silk/float/structs_FLP.h" - -#include "opus/silk/float/apply_sine_window_FLP.c" -#include "opus/silk/float/autocorrelation_FLP.c" -#include "opus/silk/float/burg_modified_FLP.c" -#include "opus/silk/float/bwexpander_FLP.c" -#include "opus/silk/float/corrMatrix_FLP.c" -#include "opus/silk/float/encode_frame_FLP.c" -#include "opus/silk/float/energy_FLP.c" -#include "opus/silk/float/find_LPC_FLP.c" -#include "opus/silk/float/find_LTP_FLP.c" -#include "opus/silk/float/find_pitch_lags_FLP.c" -#include "opus/silk/float/find_pred_coefs_FLP.c" -#include "opus/silk/float/inner_product_FLP.c" -#include "opus/silk/float/k2a_FLP.c" -#include "opus/silk/float/levinsondurbin_FLP.c" -#include "opus/silk/float/LPC_analysis_filter_FLP.c" -#include "opus/silk/float/LPC_inv_pred_gain_FLP.c" -#include "opus/silk/float/LTP_analysis_filter_FLP.c" -#include "opus/silk/float/LTP_scale_ctrl_FLP.c" -#include "opus/silk/float/noise_shape_analysis_FLP.c" -#include "opus/silk/float/pitch_analysis_core_FLP.c" -#include "opus/silk/float/prefilter_FLP.c" -#include "opus/silk/float/process_gains_FLP.c" -#include "opus/silk/float/regularize_correlations_FLP.c" -#include "opus/silk/float/residual_energy_FLP.c" -#include "opus/silk/float/scale_copy_vector_FLP.c" -#include "opus/silk/float/scale_vector_FLP.c" -#include "opus/silk/float/schur_FLP.c" -#include "opus/silk/float/solve_LS_FLP.c" -#include "opus/silk/float/sort_FLP.c" -#include "opus/silk/float/warped_autocorrelation_FLP.c" -#include "opus/silk/float/wrappers_FLP.c" - -///////////// -// LibOpus // -///////////// - -#include "opus/libopus/src/opus.c" -#include "opus/libopus/src/opus_decoder.c" -#include "opus/libopus/src/opus_encoder.c" -#include "opus/libopus/src/opus_multistream.c" -#include "opus/libopus/src/opus_multistream_decoder.c" -#include "opus/libopus/src/opus_multistream_encoder.c" -#include "opus/libopus/src/repacketizer.c" - -#include "opus/libopus/src/analysis.c" -#include "opus/libopus/src/mlp.c" -#include "opus/libopus/src/mlp_data.c" - -////////////// -// Opusfile // -////////////// - -#include "opus/opusfile/src/http.c" -#include "opus/opusfile/src/info.c" -#include "opus/opusfile/src/internal.c" -#include "opus/opusfile/src/opusfile.c" -#include "opus/opusfile/src/stream.c" -#include "opus/opusfile/src/wincerts.c" - -#ifdef __clang__ - #pragma clang diagnostic pop -#endif - -#if (_MSC_VER) - #pragma warning (pop) -#endif diff --git a/sources/LabSound/third_party/libnyquist/src/VorbisDecoder.cpp b/sources/LabSound/third_party/libnyquist/src/VorbisDecoder.cpp deleted file mode 100644 index 0cb84ce4..00000000 --- a/sources/LabSound/third_party/libnyquist/src/VorbisDecoder.cpp +++ /dev/null @@ -1,262 +0,0 @@ -/* -Copyright (c) 2019, Dimitri Diakopoulos 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 HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "Decoders.h" -#include "libvorbis/include/vorbis/vorbisfile.h" - -#include - -using namespace nqr; - -class VorbisDecoderInternal -{ - -public: - - VorbisDecoderInternal(AudioData * d, const std::vector & memory) : d(d) - { - void * data = const_cast(memory.data()); - - ogg_file t; - t.curPtr = t.filePtr = static_cast(data); - t.fileSize = memory.size(); - - fileHandle = new OggVorbis_File; - memset(fileHandle, 0, sizeof(OggVorbis_File)); - - ov_callbacks callbacks; - callbacks.read_func = AR_readOgg; - callbacks.seek_func = AR_seekOgg; - callbacks.close_func = AR_closeOgg; - callbacks.tell_func = AR_tellOgg; - - loadAudioData(&t, callbacks); - } - - VorbisDecoderInternal(AudioData * d, std::string filepath) : d(d) - { - fileHandle = new OggVorbis_File(); - FILE * f = fopen(filepath.c_str(), "rb"); - if (!f) throw std::runtime_error("Can't open file"); - loadAudioData(f, OV_CALLBACKS_DEFAULT); - } - - ~VorbisDecoderInternal() - { - ov_clear(fileHandle); - } - - size_t readInternal(size_t requestedFrameCount, size_t frameOffset = 0) - { - //@todo support offset - - float **buffer = nullptr; - size_t framesRemaining = requestedFrameCount; - size_t totalFramesRead = 0; - int bitstream = 0; - - while(0 < framesRemaining) - { - int64_t framesRead = ov_read_float(fileHandle, &buffer, std::min(2048, (int) framesRemaining), &bitstream); - - // end of file - if(!framesRead) break; - - // Probably OV_HOLE, OV_EBADLINK, OV_EINVAL. @todo - log warning here. - if (framesRead < 0) - { - continue; - } - - for (int i = 0; i < framesRead; ++i) - { - for(int ch = 0; ch < d->channelCount; ch++) - { - d->samples[totalFramesRead] = buffer[ch][i]; - totalFramesRead++; - } - } - } - - return totalFramesRead; - } - - std::string errorAsString(int ovErrorCode) - { - switch(ovErrorCode) - { - case OV_FALSE: return "OV_FALSE"; - case OV_EOF: return "OV_EOF"; - case OV_HOLE: return "OV_HOLE"; - case OV_EREAD: return "OV_EREAD"; - case OV_EFAULT: return "OV_EFAULT"; - case OV_EIMPL: return "OV_EIMPL"; - case OV_EINVAL: return "OV_EINVAL"; - case OV_ENOTVORBIS: return "OV_ENOTVORBIS"; - case OV_EBADHEADER: return "OV_EBADHEADER"; - case OV_EVERSION: return "OV_EVERSION"; - case OV_ENOTAUDIO: return "OV_ENOTAUDIO"; - case OV_EBADPACKET: return "OV_EBADPACKET"; - case OV_EBADLINK: return "OV_EBADLINK"; - case OV_ENOSEEK: return "OV_ENOSEEK"; - default: return "OV_UNKNOWN_ERROR"; - } - } - - ////////////////////// - // vorbis callbacks // - ////////////////////// - - //@todo: implement streaming support - -private: - - struct ogg_file - { - char* curPtr; - char* filePtr; - size_t fileSize; - }; - - NO_COPY(VorbisDecoderInternal); - - OggVorbis_File * fileHandle; - AudioData * d; - - inline int64_t getTotalSamples() const { return int64_t(ov_pcm_total(const_cast(fileHandle), -1)); } - inline int64_t getLengthInSeconds() const { return int64_t(ov_time_total(const_cast(fileHandle), -1)); } - inline int64_t getCurrentSample() const { return int64_t(ov_pcm_tell(const_cast(fileHandle))); } - - static size_t AR_readOgg(void* dst, size_t size1, size_t size2, void* fh) - { - ogg_file* of = reinterpret_cast(fh); - size_t len = size1 * size2; - if ( of->curPtr + len > of->filePtr + of->fileSize ) - { - len = of->filePtr + of->fileSize - of->curPtr; - } - memcpy( dst, of->curPtr, len ); - of->curPtr += len; - return len; - } - - static int AR_seekOgg(void * fh, ogg_int64_t to, int type) - { - ogg_file * of = reinterpret_cast(fh); - - switch (type) - { - case SEEK_CUR: of->curPtr += to; break; - case SEEK_END: of->curPtr = of->filePtr + of->fileSize - to; break; - case SEEK_SET: of->curPtr = of->filePtr + to; break; - default: return -1; - } - - if (of->curPtr < of->filePtr) - { - of->curPtr = of->filePtr; - return -1; - } - - if (of->curPtr > of->filePtr + of->fileSize) - { - of->curPtr = of->filePtr + of->fileSize; - return -1; - } - - return 0; - } - - static int AR_closeOgg(void * fh) - { - return 0; - } - - static long AR_tellOgg(void * fh) - { - ogg_file * of = reinterpret_cast(fh); - return (of->curPtr - of->filePtr); - } - - void loadAudioData(void *source, ov_callbacks callbacks) - { - if (auto r = ov_test_callbacks(source, fileHandle, nullptr, 0, callbacks) != 0) - { - std::cerr << errorAsString(r) << std::endl; - throw std::runtime_error("File is not a valid ogg vorbis file"); - } - - if (auto r = ov_test_open(fileHandle) != 0) - { - std::cerr << errorAsString(r) << std::endl; - throw std::runtime_error("ov_test_open failed"); - } - - // Don't need to fclose() after an open -- vorbis does this internally - - vorbis_info * ovInfo = ov_info(fileHandle, -1); - - if (ovInfo == nullptr) throw std::runtime_error("Reading metadata failed"); - - if (auto r = ov_streams(fileHandle) != 1) - { - std::cerr << errorAsString(r) << std::endl; - throw std::runtime_error( "Unsupported: file contains multiple bitstreams"); - } - - d->sampleRate = int(ovInfo->rate); - d->channelCount = ovInfo->channels; - d->sourceFormat = MakeFormatForBits(32, true, false); - d->lengthSeconds = double(getLengthInSeconds()); - d->frameSize = ovInfo->channels * GetFormatBitsPerSample(d->sourceFormat); - - // Samples in a single channel - auto totalSamples = size_t(getTotalSamples()); - - d->samples.resize(totalSamples * d->channelCount); - - if (!readInternal(totalSamples)) throw std::runtime_error("could not read any data"); - } - -}; - -////////////////////// -// Public Interface // -////////////////////// - -void VorbisDecoder::LoadFromPath(AudioData * data, const std::string & path) -{ - VorbisDecoderInternal decoder(data, path); -} - -void VorbisDecoder::LoadFromBuffer(AudioData * data, const std::vector & memory) -{ - VorbisDecoderInternal decoder(data, memory); -} - -std::vector VorbisDecoder::GetSupportedFileExtensions() -{ - return {"ogg"}; -} diff --git a/sources/LabSound/third_party/libnyquist/src/VorbisDependencies.c b/sources/LabSound/third_party/libnyquist/src/VorbisDependencies.c deleted file mode 100644 index 8caf7c9a..00000000 --- a/sources/LabSound/third_party/libnyquist/src/VorbisDependencies.c +++ /dev/null @@ -1,73 +0,0 @@ -/* -Copyright (c) 2019, Dimitri Diakopoulos 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 HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#if (_MSC_VER) - #pragma warning (push) - #pragma warning (disable: 181 111 4267 4996 4244 4701 4702 4133 4100 4127 4206 4312 4505 4365 4005 4013 4334) -#endif - -#ifdef __clang__ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wconversion" - #pragma clang diagnostic ignored "-Wshadow" - #pragma clang diagnostic ignored "-Wdeprecated-register" -#endif - -#include "libvorbis/include/vorbis/vorbisenc.h" -#include "libvorbis/include/vorbis/codec.h" -#include "libvorbis/include/vorbis/vorbisfile.h" - -#include "libogg/src/bitwise.c" -#include "libogg/src/framing.c" - -#include "libvorbis/src/analysis.c" -#include "libvorbis/src/bitrate.c" -#include "libvorbis/src/block.c" -#include "libvorbis/src/codebook.c" -#include "libvorbis/src/envelope.c" -#include "libvorbis/src/floor0.c" -#include "libvorbis/src/floor1.c" -#include "libvorbis/src/info.c" -#include "libvorbis/src/lpc.c" -#include "libvorbis/src/lsp.c" -#include "libvorbis/src/mapping0.c" -#include "libvorbis/src/psy.c" -#include "libvorbis/src/registry.c" -#include "libvorbis/src/res0.c" -#include "libvorbis/src/sharedbook.c" -#include "libvorbis/src/smallft.c" -#include "libvorbis/src/synthesis.c" -#include "libvorbis/src/vorbisenc.c" -#include "libvorbis/src/vorbisfile.c" -#include "libvorbis/src/window.c" -#include "libvorbis/src/mdct.c" - -#ifdef __clang__ - #pragma clang diagnostic pop -#endif - -#if (_MSC_VER) - #pragma warning (pop) -#endif diff --git a/sources/LabSound/third_party/libnyquist/src/WavDecoder.cpp b/sources/LabSound/third_party/libnyquist/src/WavDecoder.cpp deleted file mode 100644 index 467512a7..00000000 --- a/sources/LabSound/third_party/libnyquist/src/WavDecoder.cpp +++ /dev/null @@ -1,326 +0,0 @@ -/* -Copyright (c) 2019, Dimitri Diakopoulos 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 HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "Decoders.h" -#include - -using namespace nqr; - -struct ADPCMState -{ - int frame_size; - int firstDataBlockByte; - int dataSize; - int currentByte; - const uint8_t * inBuffer; -}; - -static const int ima_index_table[16] = -{ - -1, -1, -1, -1, // +0 / +3 : - the step - 2, 4, 6, 8, // +4 / +7 : + the step - -1, -1, -1, -1, // -0 / -3 : - the step - 2, 4, 6, 8, // -4 / -7 : + the step -}; - -static inline int ima_clamp_index(int index) -{ - if (index < 0) return 0; - else if (index > 88) return 88; - return index; -} - -static inline int16_t ima_clamp_predict(int16_t predict) -{ - if (predict < -32768) return -32768; - else if (predict > 32767) return 32767; - return predict; -} - -static const int ima_step_table[89] = -{ - 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31, 34, - 37, 41, 45, 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, - 157, 173, 190, 209, 230, 253, 279, 307, 337, 371, 408, 449, 494, - 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282, 1411, 1552, - 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, 3660, 4026, - 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493, 10442, - 11487, 12635, 13899, 15289, 16818, 18500, 20350, 22385, 24623, - 27086, 29794, 32767 -}; - -// Decodes an IMA ADPCM nibble to a 16 bit pcm sample -static inline int16_t decode_nibble(uint8_t nibble, int16_t & p, int & s) -{ - // Compute a delta to add to the predictor value - int diff = ima_step_table[s] >> 3; - if (nibble & 4) diff += ima_step_table[s]; - if (nibble & 2) diff += ima_step_table[s] >> 1; - if (nibble & 1) diff += ima_step_table[s] >> 2; - - // Sign - if (nibble & 8) diff = -diff; - - // Add delta - p += diff; - - s += ima_index_table[nibble]; - s = ima_clamp_index(s); - - return ima_clamp_predict(p); -} - -void decode_ima_adpcm(ADPCMState & state, int16_t * outBuffer, uint32_t num_channels) -{ - const uint8_t * data = state.inBuffer; - - // Loop over the interleaved channels - for (uint32_t ch = 0; ch < num_channels; ch++) - { - const int byteOffset = ch * 4; - - // Header Structure: - // Byte0: packed low byte of the initial predictor - // Byte1: packed high byte of the initial predictor - // Byte2: initial step index - // Byte3: Reserved empty value - int16_t predictor = ((int16_t)data[byteOffset + 1] << 8) | data[byteOffset]; - int stepIndex = data[byteOffset + 2]; - - uint8_t reserved = data[byteOffset + 3]; - if (reserved != 0) throw std::runtime_error("adpcm decode error"); - - int byteIdx = num_channels * 4 + byteOffset; //the byte index of the first data word for this channel - int idx = ch; - - // Decode nibbles of the remaining data - while (byteIdx < state.frame_size) - { - for (int j = 0; j < 4; j++) - { - outBuffer[idx] = decode_nibble(data[byteIdx] & 0xf, predictor, stepIndex); // low nibble - idx += num_channels; - outBuffer[idx] = decode_nibble(data[byteIdx] >> 4, predictor, stepIndex); // high nibble - idx += num_channels; - byteIdx++; - } - byteIdx += (num_channels - 1) << 2; // Jump to the next data word for the current channel - } - - } - -} - -////////////////////// -// Public Interface // -////////////////////// - -void WavDecoder::LoadFromPath(AudioData * data, const std::string & path) -{ - auto fileBuffer = nqr::ReadFile(path); - return LoadFromBuffer(data, fileBuffer.buffer); -} - -void WavDecoder::LoadFromBuffer(AudioData * data, const std::vector & memory) -{ - ////////////////////// - // Read RIFF Header // - ////////////////////// - - //@todo swap methods for rifx - - RiffChunkHeader riffHeader = {}; - memcpy(&riffHeader, memory.data(), 12); - - // Files should be 2-byte aligned - // @tofix: enforce this - // bool usePaddingShort = ((riffHeader.file_size % sizeof(uint16_t)) == 1) ? true : false; - - // Check RIFF - if (riffHeader.id_riff != GenerateChunkCode('R', 'I', 'F', 'F')) - { - // Check RIFX + FFIR - if (riffHeader.id_riff == GenerateChunkCode('R', 'I', 'F', 'X') || riffHeader.id_riff == GenerateChunkCode('F', 'F', 'I', 'R')) - { - // We're not RIFF, and we don't match RIFX or FFIR either - throw std::runtime_error("libnyquist doesn't support big endian files"); - } - else - { - throw std::runtime_error("bad RIFF/RIFX/FFIR file header"); - } - } - - if (riffHeader.id_wave != GenerateChunkCode('W', 'A', 'V', 'E')) throw std::runtime_error("bad WAVE header"); - - auto expectedSize = (memory.size() - riffHeader.file_size); - if (expectedSize != sizeof(uint32_t) * 2) - { - throw std::runtime_error("declared size of file less than file size"); //@todo warning instead of runtime_error - } - - ////////////////////// - // Read WAVE Header // - ////////////////////// - - auto WaveChunkInfo = ScanForChunk(memory, GenerateChunkCode('f', 'm', 't', ' ')); - - if (WaveChunkInfo.offset == 0) throw std::runtime_error("couldn't find fmt chunk"); - - assert(WaveChunkInfo.size == 16 || WaveChunkInfo.size == 18 || WaveChunkInfo.size == 20 || WaveChunkInfo.size == 40); - - WaveChunkHeader wavHeader = {}; - memcpy(&wavHeader, memory.data() + WaveChunkInfo.offset, sizeof(WaveChunkHeader)); - - if (wavHeader.chunk_size < 16) - throw std::runtime_error("format chunk too small"); - - //@todo validate wav header (sane sample rate, bit depth, etc) - - data->channelCount = wavHeader.channel_count; - data->sampleRate = wavHeader.sample_rate; - data->frameSize = wavHeader.frame_size; - - auto bit_depth = wavHeader.bit_depth; - switch (bit_depth) - { - case 4: data->sourceFormat = PCMFormat::PCM_16; break; // for IMA ADPCM - case 8: data->sourceFormat = PCMFormat::PCM_U8; break; - case 16: data->sourceFormat = PCMFormat::PCM_16; break; - case 24: data->sourceFormat = PCMFormat::PCM_24; break; - case 32: data->sourceFormat = (wavHeader.format == WaveFormatCode::FORMAT_IEEE) ? PCMFormat::PCM_FLT : PCMFormat::PCM_32; break; - case 64: data->sourceFormat = (wavHeader.format == WaveFormatCode::FORMAT_IEEE) ? PCMFormat::PCM_DBL : PCMFormat::PCM_64; break; - } - - //std::cout << wavHeader << std::endl; - - bool scanForFact = false; - bool grabExtensibleData = false; - bool adpcmEncoded = false; - - if (wavHeader.format == WaveFormatCode::FORMAT_IEEE) - { - scanForFact = true; - } - else if (wavHeader.format == WaveFormatCode::FORMAT_IMA_ADPCM) - { - adpcmEncoded = true; - scanForFact = true; - } - else if (wavHeader.format == WaveFormatCode::FORMAT_EXT) - { - // Used when (1) PCM data has more than 16 bits; (2) channels > 2; (3) bits/sample !== container size; (4) channel/speaker mapping specified; - scanForFact = true; - grabExtensibleData = true; - } - else if (wavHeader.format == WaveFormatCode::FORMAT_UNKNOWN) - { - throw std::runtime_error("unknown wave format"); - } - - //////////////////////////// - // Read Additional Chunks // - //////////////////////////// - - FactChunk factChunk; - if (scanForFact) - { - auto FactChunkInfo = ScanForChunk(memory, GenerateChunkCode('f', 'a', 'c', 't')); - if (FactChunkInfo.size) - memcpy(&factChunk, memory.data() + FactChunkInfo.offset, sizeof(FactChunk)); - } - - if (grabExtensibleData) - { - ExtensibleData extData = {}; - memcpy(&extData, memory.data() + WaveChunkInfo.offset + sizeof(WaveChunkHeader), sizeof(ExtensibleData)); - // extData can be compared against the multi-channel masks defined in the header - // eg. extData.channel_mask == SPEAKER_5POINT1 - } - - //@todo smpl chunk could be useful - - ///////////////////// - // Read Bext Chunk // - ///////////////////// - - auto BextChunkInfo = ScanForChunk(memory, GenerateChunkCode('b', 'e', 'x', 't')); - BextChunk bextChunk = {}; - - if (BextChunkInfo.size) - { - memcpy(&bextChunk, memory.data() + BextChunkInfo.offset, sizeof(BextChunk)); - } - - ///////////////////// - // Read DATA Chunk // - ///////////////////// - - auto DataChunkInfo = ScanForChunk(memory, GenerateChunkCode('d', 'a', 't', 'a')); - - if (DataChunkInfo.offset == 0) - throw std::runtime_error("couldn't find data chunk"); - - DataChunkInfo.offset += 2 * sizeof(uint32_t); // ignore the header and size fields - - if (adpcmEncoded) - { - ADPCMState s; - s.frame_size = wavHeader.frame_size; - s.firstDataBlockByte = 0; - s.dataSize = DataChunkInfo.size; - s.currentByte = 0; - s.inBuffer = const_cast(memory.data() + DataChunkInfo.offset); - - size_t totalSamples = (factChunk.sample_length * wavHeader.channel_count); // Samples per channel times channel count - std::vector adpcm_pcm16(totalSamples * 2, 0); // Each frame decodes into twice as many pcm samples - - uint32_t frameOffset = 0; - uint32_t frameCount = DataChunkInfo.size / s.frame_size; - - for (uint32_t i = 0; i < frameCount; ++i) - { - decode_ima_adpcm(s, adpcm_pcm16.data() + frameOffset, wavHeader.channel_count); - s.inBuffer += s.frame_size; - frameOffset += (s.frame_size * 2) - (8 * wavHeader.channel_count); - } - - data->lengthSeconds = ((float) totalSamples / (float) wavHeader.sample_rate) / wavHeader.channel_count; - data->samples.resize(totalSamples); - ConvertToFloat32(data->samples.data(), adpcm_pcm16.data(), totalSamples, data->sourceFormat); - } - else - { - data->lengthSeconds = ((float) DataChunkInfo.size / (float) wavHeader.sample_rate) / wavHeader.frame_size; - size_t totalSamples = (DataChunkInfo.size / wavHeader.frame_size) * wavHeader.channel_count; - data->samples.resize(totalSamples); - ConvertToFloat32(data->samples.data(), memory.data() + DataChunkInfo.offset, totalSamples, data->sourceFormat); - } -} - -std::vector WavDecoder::GetSupportedFileExtensions() -{ - return {"wav", "wave"}; -} diff --git a/sources/LabSound/third_party/libnyquist/src/WavPackDecoder.cpp b/sources/LabSound/third_party/libnyquist/src/WavPackDecoder.cpp deleted file mode 100644 index 28c0e195..00000000 --- a/sources/LabSound/third_party/libnyquist/src/WavPackDecoder.cpp +++ /dev/null @@ -1,196 +0,0 @@ -/* -Copyright (c) 2019, Dimitri Diakopoulos 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 HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "Decoders.h" -#include "wavpack.h" -#include -#include - -using namespace nqr; - -class WavPackInternal -{ - -public: - - WavPackInternal(AudioData * d, const std::string & path) : d(d) - { - char errorStr[128]; - context = WavpackOpenFileInput(path.c_str(), errorStr, OPEN_WVC | OPEN_NORMALIZE, 0); - - if (!context) throw std::runtime_error("Not a WavPack file"); - - auto totalSamples = size_t(WavpackGetNumSamples(context)); - - decode(totalSamples); - } - - WavPackInternal(AudioData * d, const std::vector & memory) : d(d) - { - char errorStr[128]; - context = WavpackOpenRawDecoder((void *) memory.data(), memory.size(), nullptr, 0, 0, errorStr, OPEN_WVC | OPEN_NORMALIZE, 0); - - // Since we are using OpenRawDecoder, WavpackGetNumSamples won't work. - // Instead, find the first block and get totalSamples from its header. - WavpackHeader wph; - auto headerOffset = readNextHeader(memory, &wph, 0); - - if (!context || headerOffset == -1) - { - throw std::runtime_error("Not a WavPack file"); - } - - auto totalSamples = wph.total_samples; - - decode(totalSamples); - } - - ~WavPackInternal() - { - WavpackCloseFile(context); - } - - size_t readInternal(size_t requestedFrameCount, size_t frameOffset = 0) - { - size_t framesRemaining = requestedFrameCount; - size_t totalFramesRead = 0; - - // The samples returned are handled differently based on the file's mode - int mode = WavpackGetMode(context); - - while (0 < framesRemaining) - { - uint32_t framesRead = -1; - - if (MODE_FLOAT & mode) - { - // Since it's float, we can decode directly into our buffer as a huge blob - framesRead = WavpackUnpackSamples(context, reinterpret_cast(&d->samples.data()[0]), uint32_t(d->samples.size() / d->channelCount)); - } - - else if(MODE_LOSSLESS & mode) - { - // Lossless files will be handed off as integers - framesRead = WavpackUnpackSamples(context, internalBuffer.data(), uint32_t(internalBuffer.size() / d->channelCount)); - } - - // EOF - //if (framesRead == 0) break; - - totalFramesRead += framesRead; - framesRemaining -= framesRead; - } - - return totalFramesRead; - } - -private: - void decode(size_t totalSamples) { - auto bitdepth = WavpackGetBitsPerSample(context); - - d->sampleRate = WavpackGetSampleRate(context); - d->channelCount = WavpackGetNumChannels(context); - d->lengthSeconds = double(totalSamples / WavpackGetSampleRate(context)); - d->frameSize = d->channelCount * bitdepth; - - //@todo support channel masks - // WavpackGetChannelMask - - int mode = WavpackGetMode(context); - bool isFloatingPoint = (MODE_FLOAT & mode); - - d->sourceFormat = MakeFormatForBits(bitdepth, isFloatingPoint, false); - - d->samples.resize(totalSamples * d->channelCount); - - if (!isFloatingPoint) - internalBuffer.resize(totalSamples * d->channelCount); - - if (!readInternal(totalSamples)) - throw std::runtime_error("could not read any data"); - - // Next, process internal buffer into the user-visible samples array - if (!isFloatingPoint) - ConvertToFloat32(d->samples.data(), internalBuffer.data(), totalSamples * d->channelCount, d->sourceFormat); - } - - int64_t readNextHeader(const std::vector & memory, WavpackHeader *wphdr, size_t startOffset) { - /// Based on read_next_header function in wavpack's openutils.c. - /// This will find the position of the next WavPack header in the given vector, at or after startOffset. - /// If a header is found, it will write the header to *wphdr and return the position of its first byte in the vector. - /// Otherwise, it will return -1. - unsigned char* sp; - - for (size_t i = startOffset; i < memory.size(); i++) { - sp = const_cast(memory.data() + i); - - auto headerStartPoint = sp; - - if (*sp++ == 'w' && *sp == 'v' && *++sp == 'p' && *++sp == 'k' && - !(*++sp & 1) && sp [2] < 16 && !sp [3] && (sp [2] || sp [1] || *sp >= 24) && sp [5] == 4 && - sp [4] >= (MIN_STREAM_VERS & 0xff) && sp [4] <= (MAX_STREAM_VERS & 0xff) && sp [18] < 3 && !sp [19]) { - - memcpy (wphdr, headerStartPoint, sizeof (*wphdr)); - WavpackLittleEndianToNative (wphdr, (char*)WavpackHeaderFormat); - return i; - } - } - - return -1; - } - - NO_MOVE(WavPackInternal); - - //WavpackStreamReader streamReader; //@todo: streaming support - - WavpackContext * context; //@todo unique_ptr - - AudioData * d; - - std::vector internalBuffer; - - inline int64_t getTotalSamples() const { return WavpackGetNumSamples(context); } - inline int64_t getLengthInSeconds() const { return getTotalSamples() / WavpackGetSampleRate(context); } - -}; - -////////////////////// -// Public Interface // -////////////////////// - -void WavPackDecoder::LoadFromPath(AudioData * data, const std::string & path) -{ - WavPackInternal decoder(data, path); -} - -void WavPackDecoder::LoadFromBuffer(AudioData * data, const std::vector & memory) -{ - WavPackInternal decoder(data, memory); -} - -std::vector WavPackDecoder::GetSupportedFileExtensions() -{ - return {"wv"}; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/all.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/all.h deleted file mode 100644 index 2851cf59..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/all.h +++ /dev/null @@ -1,371 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 FLAC__ALL_H -#define FLAC__ALL_H - -#include "export.h" - -#include "assert.h" -#include "callback.h" -#include "format.h" -#include "metadata.h" -#include "ordinals.h" -#include "stream_decoder.h" -#include "stream_encoder.h" - -/** \mainpage - * - * \section intro Introduction - * - * This is the documentation for the FLAC C and C++ APIs. It is - * highly interconnected; this introduction should give you a top - * level idea of the structure and how to find the information you - * need. As a prerequisite you should have at least a basic - * knowledge of the FLAC format, documented - * here. - * - * \section c_api FLAC C API - * - * The FLAC C API is the interface to libFLAC, a set of structures - * describing the components of FLAC streams, and functions for - * encoding and decoding streams, as well as manipulating FLAC - * metadata in files. The public include files will be installed - * in your include area (for example /usr/include/FLAC/...). - * - * By writing a little code and linking against libFLAC, it is - * relatively easy to add FLAC support to another program. The - * library is licensed under Xiph's BSD license. - * Complete source code of libFLAC as well as the command-line - * encoder and plugins is available and is a useful source of - * examples. - * - * Aside from encoders and decoders, libFLAC provides a powerful - * metadata interface for manipulating metadata in FLAC files. It - * allows the user to add, delete, and modify FLAC metadata blocks - * and it can automatically take advantage of PADDING blocks to avoid - * rewriting the entire FLAC file when changing the size of the - * metadata. - * - * libFLAC usually only requires the standard C library and C math - * library. In particular, threading is not used so there is no - * dependency on a thread library. However, libFLAC does not use - * global variables and should be thread-safe. - * - * libFLAC also supports encoding to and decoding from Ogg FLAC. - * However the metadata editing interfaces currently have limited - * read-only support for Ogg FLAC files. - * - * \section cpp_api FLAC C++ API - * - * The FLAC C++ API is a set of classes that encapsulate the - * structures and functions in libFLAC. They provide slightly more - * functionality with respect to metadata but are otherwise - * equivalent. For the most part, they share the same usage as - * their counterparts in libFLAC, and the FLAC C API documentation - * can be used as a supplement. The public include files - * for the C++ API will be installed in your include area (for - * example /usr/include/FLAC++/...). - * - * libFLAC++ is also licensed under - * Xiph's BSD license. - * - * \section getting_started Getting Started - * - * A good starting point for learning the API is to browse through - * the modules. Modules are logical - * groupings of related functions or classes, which correspond roughly - * to header files or sections of header files. Each module includes a - * detailed description of the general usage of its functions or - * classes. - * - * From there you can go on to look at the documentation of - * individual functions. You can see different views of the individual - * functions through the links in top bar across this page. - * - * If you prefer a more hands-on approach, you can jump right to some - * example code. - * - * \section porting_guide Porting Guide - * - * Starting with FLAC 1.1.3 a \link porting Porting Guide \endlink - * has been introduced which gives detailed instructions on how to - * port your code to newer versions of FLAC. - * - * \section embedded_developers Embedded Developers - * - * libFLAC has grown larger over time as more functionality has been - * included, but much of it may be unnecessary for a particular embedded - * implementation. Unused parts may be pruned by some simple editing of - * src/libFLAC/Makefile.am. In general, the decoders, encoders, and - * metadata interface are all independent from each other. - * - * It is easiest to just describe the dependencies: - * - * - All modules depend on the \link flac_format Format \endlink module. - * - The decoders and encoders depend on the bitbuffer. - * - The decoder is independent of the encoder. The encoder uses the - * decoder because of the verify feature, but this can be removed if - * not needed. - * - Parts of the metadata interface require the stream decoder (but not - * the encoder). - * - Ogg support is selectable through the compile time macro - * \c FLAC__HAS_OGG. - * - * For example, if your application only requires the stream decoder, no - * encoder, and no metadata interface, you can remove the stream encoder - * and the metadata interface, which will greatly reduce the size of the - * library. - * - * Also, there are several places in the libFLAC code with comments marked - * with "OPT:" where a #define can be changed to enable code that might be - * faster on a specific platform. Experimenting with these can yield faster - * binaries. - */ - -/** \defgroup porting Porting Guide for New Versions - * - * This module describes differences in the library interfaces from - * version to version. It assists in the porting of code that uses - * the libraries to newer versions of FLAC. - * - * One simple facility for making porting easier that has been added - * in FLAC 1.1.3 is a set of \c #defines in \c export.h of each - * library's includes (e.g. \c include/FLAC/export.h). The - * \c #defines mirror the libraries' - * libtool version numbers, - * e.g. in libFLAC there are \c FLAC_API_VERSION_CURRENT, - * \c FLAC_API_VERSION_REVISION, and \c FLAC_API_VERSION_AGE. - * These can be used to support multiple versions of an API during the - * transition phase, e.g. - * - * \code - * #if !defined(FLAC_API_VERSION_CURRENT) || FLAC_API_VERSION_CURRENT <= 7 - * legacy code - * #else - * new code - * #endif - * \endcode - * - * The the source will work for multiple versions and the legacy code can - * easily be removed when the transition is complete. - * - * Another available symbol is FLAC_API_SUPPORTS_OGG_FLAC (defined in - * include/FLAC/export.h), which can be used to determine whether or not - * the library has been compiled with support for Ogg FLAC. This is - * simpler than trying to call an Ogg init function and catching the - * error. - */ - -/** \defgroup porting_1_1_2_to_1_1_3 Porting from FLAC 1.1.2 to 1.1.3 - * \ingroup porting - * - * \brief - * This module describes porting from FLAC 1.1.2 to FLAC 1.1.3. - * - * The main change between the APIs in 1.1.2 and 1.1.3 is that they have - * been simplified. First, libOggFLAC has been merged into libFLAC and - * libOggFLAC++ has been merged into libFLAC++. Second, both the three - * decoding layers and three encoding layers have been merged into a - * single stream decoder and stream encoder. That is, the functionality - * of FLAC__SeekableStreamDecoder and FLAC__FileDecoder has been merged - * into FLAC__StreamDecoder, and FLAC__SeekableStreamEncoder and - * FLAC__FileEncoder into FLAC__StreamEncoder. Only the - * FLAC__StreamDecoder and FLAC__StreamEncoder remain. What this means - * is there is now a single API that can be used to encode or decode - * streams to/from native FLAC or Ogg FLAC and the single API can work - * on both seekable and non-seekable streams. - * - * Instead of creating an encoder or decoder of a certain layer, now the - * client will always create a FLAC__StreamEncoder or - * FLAC__StreamDecoder. The old layers are now differentiated by the - * initialization function. For example, for the decoder, - * FLAC__stream_decoder_init() has been replaced by - * FLAC__stream_decoder_init_stream(). This init function takes - * callbacks for the I/O, and the seeking callbacks are optional. This - * allows the client to use the same object for seekable and - * non-seekable streams. For decoding a FLAC file directly, the client - * can use FLAC__stream_decoder_init_file() and pass just a filename - * and fewer callbacks; most of the other callbacks are supplied - * internally. For situations where fopen()ing by filename is not - * possible (e.g. Unicode filenames on Windows) the client can instead - * open the file itself and supply the FILE* to - * FLAC__stream_decoder_init_FILE(). The init functions now returns a - * FLAC__StreamDecoderInitStatus instead of FLAC__StreamDecoderState. - * Since the callbacks and client data are now passed to the init - * function, the FLAC__stream_decoder_set_*_callback() functions and - * FLAC__stream_decoder_set_client_data() are no longer needed. The - * rest of the calls to the decoder are the same as before. - * - * There are counterpart init functions for Ogg FLAC, e.g. - * FLAC__stream_decoder_init_ogg_stream(). All the rest of the calls - * and callbacks are the same as for native FLAC. - * - * As an example, in FLAC 1.1.2 a seekable stream decoder would have - * been set up like so: - * - * \code - * FLAC__SeekableStreamDecoder *decoder = FLAC__seekable_stream_decoder_new(); - * if(decoder == NULL) do_something; - * FLAC__seekable_stream_decoder_set_md5_checking(decoder, true); - * [... other settings ...] - * FLAC__seekable_stream_decoder_set_read_callback(decoder, my_read_callback); - * FLAC__seekable_stream_decoder_set_seek_callback(decoder, my_seek_callback); - * FLAC__seekable_stream_decoder_set_tell_callback(decoder, my_tell_callback); - * FLAC__seekable_stream_decoder_set_length_callback(decoder, my_length_callback); - * FLAC__seekable_stream_decoder_set_eof_callback(decoder, my_eof_callback); - * FLAC__seekable_stream_decoder_set_write_callback(decoder, my_write_callback); - * FLAC__seekable_stream_decoder_set_metadata_callback(decoder, my_metadata_callback); - * FLAC__seekable_stream_decoder_set_error_callback(decoder, my_error_callback); - * FLAC__seekable_stream_decoder_set_client_data(decoder, my_client_data); - * if(FLAC__seekable_stream_decoder_init(decoder) != FLAC__SEEKABLE_STREAM_DECODER_OK) do_something; - * \endcode - * - * In FLAC 1.1.3 it is like this: - * - * \code - * FLAC__StreamDecoder *decoder = FLAC__stream_decoder_new(); - * if(decoder == NULL) do_something; - * FLAC__stream_decoder_set_md5_checking(decoder, true); - * [... other settings ...] - * if(FLAC__stream_decoder_init_stream( - * decoder, - * my_read_callback, - * my_seek_callback, // or NULL - * my_tell_callback, // or NULL - * my_length_callback, // or NULL - * my_eof_callback, // or NULL - * my_write_callback, - * my_metadata_callback, // or NULL - * my_error_callback, - * my_client_data - * ) != FLAC__STREAM_DECODER_INIT_STATUS_OK) do_something; - * \endcode - * - * or you could do; - * - * \code - * [...] - * FILE *file = fopen("somefile.flac","rb"); - * if(file == NULL) do_somthing; - * if(FLAC__stream_decoder_init_FILE( - * decoder, - * file, - * my_write_callback, - * my_metadata_callback, // or NULL - * my_error_callback, - * my_client_data - * ) != FLAC__STREAM_DECODER_INIT_STATUS_OK) do_something; - * \endcode - * - * or just: - * - * \code - * [...] - * if(FLAC__stream_decoder_init_file( - * decoder, - * "somefile.flac", - * my_write_callback, - * my_metadata_callback, // or NULL - * my_error_callback, - * my_client_data - * ) != FLAC__STREAM_DECODER_INIT_STATUS_OK) do_something; - * \endcode - * - * Another small change to the decoder is in how it handles unparseable - * streams. Before, when the decoder found an unparseable stream - * (reserved for when the decoder encounters a stream from a future - * encoder that it can't parse), it changed the state to - * \c FLAC__STREAM_DECODER_UNPARSEABLE_STREAM. Now the decoder instead - * drops sync and calls the error callback with a new error code - * \c FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM. This is - * more robust. If your error callback does not discriminate on the the - * error state, your code does not need to be changed. - * - * The encoder now has a new setting: - * FLAC__stream_encoder_set_apodization(). This is for setting the - * method used to window the data before LPC analysis. You only need to - * add a call to this function if the default is not suitable. There - * are also two new convenience functions that may be useful: - * FLAC__metadata_object_cuesheet_calculate_cddb_id() and - * FLAC__metadata_get_cuesheet(). - * - * The \a bytes parameter to FLAC__StreamDecoderReadCallback, - * FLAC__StreamEncoderReadCallback, and FLAC__StreamEncoderWriteCallback - * is now \c size_t instead of \c unsigned. - */ - -/** \defgroup porting_1_1_3_to_1_1_4 Porting from FLAC 1.1.3 to 1.1.4 - * \ingroup porting - * - * \brief - * This module describes porting from FLAC 1.1.3 to FLAC 1.1.4. - * - * There were no changes to any of the interfaces from 1.1.3 to 1.1.4. - * There was a slight change in the implementation of - * FLAC__stream_encoder_set_metadata(); the function now makes a copy - * of the \a metadata array of pointers so the client no longer needs - * to maintain it after the call. The objects themselves that are - * pointed to by the array are still not copied though and must be - * maintained until the call to FLAC__stream_encoder_finish(). - */ - -/** \defgroup porting_1_1_4_to_1_2_0 Porting from FLAC 1.1.4 to 1.2.0 - * \ingroup porting - * - * \brief - * This module describes porting from FLAC 1.1.4 to FLAC 1.2.0. - * - * There were only very minor changes to the interfaces from 1.1.4 to 1.2.0. - * In libFLAC, \c FLAC__format_sample_rate_is_subset() was added. - * In libFLAC++, \c FLAC::Decoder::Stream::get_decode_position() was added. - * - * Finally, value of the constant \c FLAC__FRAME_HEADER_RESERVED_LEN - * has changed to reflect the conversion of one of the reserved bits - * into active use. It used to be \c 2 and now is \c 1. However the - * FLAC frame header length has not changed, so to skip the proper - * number of bits, use \c FLAC__FRAME_HEADER_RESERVED_LEN + - * \c FLAC__FRAME_HEADER_BLOCKING_STRATEGY_LEN - */ - -/** \defgroup flac FLAC C API - * - * The FLAC C API is the interface to libFLAC, a set of structures - * describing the components of FLAC streams, and functions for - * encoding and decoding streams, as well as manipulating FLAC - * metadata in files. - * - * You should start with the format components as all other modules - * are dependent on it. - */ - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/assert.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/assert.h deleted file mode 100644 index dc9bcef4..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/assert.h +++ /dev/null @@ -1,46 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 FLAC__ASSERT_H -#define FLAC__ASSERT_H - -/* we need this since some compilers (like MSVC) leave assert()s on release code (and we don't want to use their ASSERT) */ -#ifdef DEBUG -#include -#define FLAC__ASSERT(x) assert(x) -#define FLAC__ASSERT_DECLARATION(x) x -#else -#define FLAC__ASSERT(x) -#define FLAC__ASSERT_DECLARATION(x) -#endif - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/callback.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/callback.h deleted file mode 100644 index ce8787ff..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/callback.h +++ /dev/null @@ -1,185 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2004-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 FLAC__CALLBACK_H -#define FLAC__CALLBACK_H - -#include "ordinals.h" -#include /* for size_t */ - -/** \file include/FLAC/callback.h - * - * \brief - * This module defines the structures for describing I/O callbacks - * to the other FLAC interfaces. - * - * See the detailed documentation for callbacks in the - * \link flac_callbacks callbacks \endlink module. - */ - -/** \defgroup flac_callbacks FLAC/callback.h: I/O callback structures - * \ingroup flac - * - * \brief - * This module defines the structures for describing I/O callbacks - * to the other FLAC interfaces. - * - * The purpose of the I/O callback functions is to create a common way - * for the metadata interfaces to handle I/O. - * - * Originally the metadata interfaces required filenames as the way of - * specifying FLAC files to operate on. This is problematic in some - * environments so there is an additional option to specify a set of - * callbacks for doing I/O on the FLAC file, instead of the filename. - * - * In addition to the callbacks, a FLAC__IOHandle type is defined as an - * opaque structure for a data source. - * - * The callback function prototypes are similar (but not identical) to the - * stdio functions fread, fwrite, fseek, ftell, feof, and fclose. If you use - * stdio streams to implement the callbacks, you can pass fread, fwrite, and - * fclose anywhere a FLAC__IOCallback_Read, FLAC__IOCallback_Write, or - * FLAC__IOCallback_Close is required, and a FILE* anywhere a FLAC__IOHandle - * is required. \warning You generally CANNOT directly use fseek or ftell - * for FLAC__IOCallback_Seek or FLAC__IOCallback_Tell since on most systems - * these use 32-bit offsets and FLAC requires 64-bit offsets to deal with - * large files. You will have to find an equivalent function (e.g. ftello), - * or write a wrapper. The same is true for feof() since this is usually - * implemented as a macro, not as a function whose address can be taken. - * - * \{ - */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** This is the opaque handle type used by the callbacks. Typically - * this is a \c FILE* or address of a file descriptor. - */ -typedef void* FLAC__IOHandle; - -/** Signature for the read callback. - * The signature and semantics match POSIX fread() implementations - * and can generally be used interchangeably. - * - * \param ptr The address of the read buffer. - * \param size The size of the records to be read. - * \param nmemb The number of records to be read. - * \param handle The handle to the data source. - * \retval size_t - * The number of records read. - */ -typedef size_t (*FLAC__IOCallback_Read) (void *ptr, size_t size, size_t nmemb, FLAC__IOHandle handle); - -/** Signature for the write callback. - * The signature and semantics match POSIX fwrite() implementations - * and can generally be used interchangeably. - * - * \param ptr The address of the write buffer. - * \param size The size of the records to be written. - * \param nmemb The number of records to be written. - * \param handle The handle to the data source. - * \retval size_t - * The number of records written. - */ -typedef size_t (*FLAC__IOCallback_Write) (const void *ptr, size_t size, size_t nmemb, FLAC__IOHandle handle); - -/** Signature for the seek callback. - * The signature and semantics mostly match POSIX fseek() WITH ONE IMPORTANT - * EXCEPTION: the offset is a 64-bit type whereas fseek() is generally 'long' - * and 32-bits wide. - * - * \param handle The handle to the data source. - * \param offset The new position, relative to \a whence - * \param whence \c SEEK_SET, \c SEEK_CUR, or \c SEEK_END - * \retval int - * \c 0 on success, \c -1 on error. - */ -typedef int (*FLAC__IOCallback_Seek) (FLAC__IOHandle handle, FLAC__int64 offset, int whence); - -/** Signature for the tell callback. - * The signature and semantics mostly match POSIX ftell() WITH ONE IMPORTANT - * EXCEPTION: the offset is a 64-bit type whereas ftell() is generally 'long' - * and 32-bits wide. - * - * \param handle The handle to the data source. - * \retval FLAC__int64 - * The current position on success, \c -1 on error. - */ -typedef FLAC__int64 (*FLAC__IOCallback_Tell) (FLAC__IOHandle handle); - -/** Signature for the EOF callback. - * The signature and semantics mostly match POSIX feof() but WATCHOUT: - * on many systems, feof() is a macro, so in this case a wrapper function - * must be provided instead. - * - * \param handle The handle to the data source. - * \retval int - * \c 0 if not at end of file, nonzero if at end of file. - */ -typedef int (*FLAC__IOCallback_Eof) (FLAC__IOHandle handle); - -/** Signature for the close callback. - * The signature and semantics match POSIX fclose() implementations - * and can generally be used interchangeably. - * - * \param handle The handle to the data source. - * \retval int - * \c 0 on success, \c EOF on error. - */ -typedef int (*FLAC__IOCallback_Close) (FLAC__IOHandle handle); - -/** A structure for holding a set of callbacks. - * Each FLAC interface that requires a FLAC__IOCallbacks structure will - * describe which of the callbacks are required. The ones that are not - * required may be set to NULL. - * - * If the seek requirement for an interface is optional, you can signify that - * a data sorce is not seekable by setting the \a seek field to \c NULL. - */ -typedef struct { - FLAC__IOCallback_Read read; - FLAC__IOCallback_Write write; - FLAC__IOCallback_Seek seek; - FLAC__IOCallback_Tell tell; - FLAC__IOCallback_Eof eof; - FLAC__IOCallback_Close close; -} FLAC__IOCallbacks; - -/* \} */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/export.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/export.h deleted file mode 100644 index 9cc9e137..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/export.h +++ /dev/null @@ -1,97 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 FLAC__EXPORT_H -#define FLAC__EXPORT_H - -/** \file include/FLAC/export.h - * - * \brief - * This module contains #defines and symbols for exporting function - * calls, and providing version information and compiled-in features. - * - * See the \link flac_export export \endlink module. - */ - -/** \defgroup flac_export FLAC/export.h: export symbols - * \ingroup flac - * - * \brief - * This module contains #defines and symbols for exporting function - * calls, and providing version information and compiled-in features. - * - * If you are compiling with MSVC and will link to the static library - * (libFLAC.lib) you should define FLAC__NO_DLL in your project to - * make sure the symbols are exported properly. - * - * \{ - */ - -#if defined(FLAC__NO_DLL) -#define FLAC_API - -#elif defined(_MSC_VER) -#ifdef FLAC_API_EXPORTS -#define FLAC_API __declspec(dllexport) -#else -#define FLAC_API __declspec(dllimport) -#endif - -#elif defined(FLAC__USE_VISIBILITY_ATTR) -#define FLAC_API __attribute__ ((visibility ("default"))) - -#else -#define FLAC_API - -#endif - -/** These #defines will mirror the libtool-based library version number, see - * http://www.gnu.org/software/libtool/manual/libtool.html#Libtool-versioning - */ -#define FLAC_API_VERSION_CURRENT 11 -#define FLAC_API_VERSION_REVISION 0 /**< see above */ -#define FLAC_API_VERSION_AGE 3 /**< see above */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** \c 1 if the library has been compiled with support for Ogg FLAC, else \c 0. */ -extern FLAC_API int FLAC_API_SUPPORTS_OGG_FLAC; - -#ifdef __cplusplus -} -#endif - -/* \} */ - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/format.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/format.h deleted file mode 100644 index 7424565b..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/format.h +++ /dev/null @@ -1,1025 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 FLAC__FORMAT_H -#define FLAC__FORMAT_H - -#include "export.h" -#include "ordinals.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** \file include/FLAC/format.h - * - * \brief - * This module contains structure definitions for the representation - * of FLAC format components in memory. These are the basic - * structures used by the rest of the interfaces. - * - * See the detailed documentation in the - * \link flac_format format \endlink module. - */ - -/** \defgroup flac_format FLAC/format.h: format components - * \ingroup flac - * - * \brief - * This module contains structure definitions for the representation - * of FLAC format components in memory. These are the basic - * structures used by the rest of the interfaces. - * - * First, you should be familiar with the - * FLAC format. Many of the values here - * follow directly from the specification. As a user of libFLAC, the - * interesting parts really are the structures that describe the frame - * header and metadata blocks. - * - * The format structures here are very primitive, designed to store - * information in an efficient way. Reading information from the - * structures is easy but creating or modifying them directly is - * more complex. For the most part, as a user of a library, editing - * is not necessary; however, for metadata blocks it is, so there are - * convenience functions provided in the \link flac_metadata metadata - * module \endlink to simplify the manipulation of metadata blocks. - * - * \note - * It's not the best convention, but symbols ending in _LEN are in bits - * and _LENGTH are in bytes. _LENGTH symbols are \#defines instead of - * global variables because they are usually used when declaring byte - * arrays and some compilers require compile-time knowledge of array - * sizes when declared on the stack. - * - * \{ - */ - - -/* - Most of the values described in this file are defined by the FLAC - format specification. There is nothing to tune here. -*/ - -/** The largest legal metadata type code. */ -#define FLAC__MAX_METADATA_TYPE_CODE (126u) - -/** The minimum block size, in samples, permitted by the format. */ -#define FLAC__MIN_BLOCK_SIZE (16u) - -/** The maximum block size, in samples, permitted by the format. */ -#define FLAC__MAX_BLOCK_SIZE (65535u) - -/** The maximum block size, in samples, permitted by the FLAC subset for - * sample rates up to 48kHz. */ -#define FLAC__SUBSET_MAX_BLOCK_SIZE_48000HZ (4608u) - -/** The maximum number of channels permitted by the format. */ -#define FLAC__MAX_CHANNELS (8u) - -/** The minimum sample resolution permitted by the format. */ -#define FLAC__MIN_BITS_PER_SAMPLE (4u) - -/** The maximum sample resolution permitted by the format. */ -#define FLAC__MAX_BITS_PER_SAMPLE (32u) - -/** The maximum sample resolution permitted by libFLAC. - * - * \warning - * FLAC__MAX_BITS_PER_SAMPLE is the limit of the FLAC format. However, - * the reference encoder/decoder is currently limited to 24 bits because - * of prevalent 32-bit math, so make sure and use this value when - * appropriate. - */ -#define FLAC__REFERENCE_CODEC_MAX_BITS_PER_SAMPLE (24u) - -/** The maximum sample rate permitted by the format. The value is - * ((2 ^ 16) - 1) * 10; see FLAC format - * as to why. - */ -#define FLAC__MAX_SAMPLE_RATE (655350u) - -/** The maximum LPC order permitted by the format. */ -#define FLAC__MAX_LPC_ORDER (32u) - -/** The maximum LPC order permitted by the FLAC subset for sample rates - * up to 48kHz. */ -#define FLAC__SUBSET_MAX_LPC_ORDER_48000HZ (12u) - -/** The minimum quantized linear predictor coefficient precision - * permitted by the format. - */ -#define FLAC__MIN_QLP_COEFF_PRECISION (5u) - -/** The maximum quantized linear predictor coefficient precision - * permitted by the format. - */ -#define FLAC__MAX_QLP_COEFF_PRECISION (15u) - -/** The maximum order of the fixed predictors permitted by the format. */ -#define FLAC__MAX_FIXED_ORDER (4u) - -/** The maximum Rice partition order permitted by the format. */ -#define FLAC__MAX_RICE_PARTITION_ORDER (15u) - -/** The maximum Rice partition order permitted by the FLAC Subset. */ -#define FLAC__SUBSET_MAX_RICE_PARTITION_ORDER (8u) - -/** The version string of the release, stamped onto the libraries and binaries. - * - * \note - * This does not correspond to the shared library version number, which - * is used to determine binary compatibility. - */ -extern FLAC_API const char *FLAC__VERSION_STRING; - -/** The vendor string inserted by the encoder into the VORBIS_COMMENT block. - * This is a NUL-terminated ASCII string; when inserted into the - * VORBIS_COMMENT the trailing null is stripped. - */ -extern FLAC_API const char *FLAC__VENDOR_STRING; - -/** The byte string representation of the beginning of a FLAC stream. */ -extern FLAC_API const FLAC__byte FLAC__STREAM_SYNC_STRING[4]; /* = "fLaC" */ - -/** The 32-bit integer big-endian representation of the beginning of - * a FLAC stream. - */ -extern FLAC_API const unsigned FLAC__STREAM_SYNC; /* = 0x664C6143 */ - -/** The length of the FLAC signature in bits. */ -extern FLAC_API const unsigned FLAC__STREAM_SYNC_LEN; /* = 32 bits */ - -/** The length of the FLAC signature in bytes. */ -#define FLAC__STREAM_SYNC_LENGTH (4u) - - -/***************************************************************************** - * - * Subframe structures - * - *****************************************************************************/ - -/*****************************************************************************/ - -/** An enumeration of the available entropy coding methods. */ -typedef enum { - FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE = 0, - /**< Residual is coded by partitioning into contexts, each with it's own - * 4-bit Rice parameter. */ - - FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2 = 1 - /**< Residual is coded by partitioning into contexts, each with it's own - * 5-bit Rice parameter. */ -} FLAC__EntropyCodingMethodType; - -/** Maps a FLAC__EntropyCodingMethodType to a C string. - * - * Using a FLAC__EntropyCodingMethodType as the index to this array will - * give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__EntropyCodingMethodTypeString[]; - - -/** Contents of a Rice partitioned residual - */ -typedef struct { - - unsigned *parameters; - /**< The Rice parameters for each context. */ - - unsigned *raw_bits; - /**< Widths for escape-coded partitions. Will be non-zero for escaped - * partitions and zero for unescaped partitions. - */ - - unsigned capacity_by_order; - /**< The capacity of the \a parameters and \a raw_bits arrays - * specified as an order, i.e. the number of array elements - * allocated is 2 ^ \a capacity_by_order. - */ -} FLAC__EntropyCodingMethod_PartitionedRiceContents; - -/** Header for a Rice partitioned residual. (c.f. format specification) - */ -typedef struct { - - unsigned order; - /**< The partition order, i.e. # of contexts = 2 ^ \a order. */ - - const FLAC__EntropyCodingMethod_PartitionedRiceContents *contents; - /**< The context's Rice parameters and/or raw bits. */ - -} FLAC__EntropyCodingMethod_PartitionedRice; - -extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN; /**< == 4 (bits) */ -extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN; /**< == 4 (bits) */ -extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN; /**< == 5 (bits) */ -extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN; /**< == 5 (bits) */ - -extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER; -/**< == (1<format specification) - */ -typedef struct { - FLAC__EntropyCodingMethodType type; - union { - FLAC__EntropyCodingMethod_PartitionedRice partitioned_rice; - } data; -} FLAC__EntropyCodingMethod; - -extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_TYPE_LEN; /**< == 2 (bits) */ - -/*****************************************************************************/ - -/** An enumeration of the available subframe types. */ -typedef enum { - FLAC__SUBFRAME_TYPE_CONSTANT = 0, /**< constant signal */ - FLAC__SUBFRAME_TYPE_VERBATIM = 1, /**< uncompressed signal */ - FLAC__SUBFRAME_TYPE_FIXED = 2, /**< fixed polynomial prediction */ - FLAC__SUBFRAME_TYPE_LPC = 3 /**< linear prediction */ -} FLAC__SubframeType; - -/** Maps a FLAC__SubframeType to a C string. - * - * Using a FLAC__SubframeType as the index to this array will - * give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__SubframeTypeString[]; - - -/** CONSTANT subframe. (c.f. format specification) - */ -typedef struct { - FLAC__int32 value; /**< The constant signal value. */ -} FLAC__Subframe_Constant; - - -/** VERBATIM subframe. (c.f. format specification) - */ -typedef struct { - const FLAC__int32 *data; /**< A pointer to verbatim signal. */ -} FLAC__Subframe_Verbatim; - - -/** FIXED subframe. (c.f. format specification) - */ -typedef struct { - FLAC__EntropyCodingMethod entropy_coding_method; - /**< The residual coding method. */ - - unsigned order; - /**< The polynomial order. */ - - FLAC__int32 warmup[FLAC__MAX_FIXED_ORDER]; - /**< Warmup samples to prime the predictor, length == order. */ - - const FLAC__int32 *residual; - /**< The residual signal, length == (blocksize minus order) samples. */ -} FLAC__Subframe_Fixed; - - -/** LPC subframe. (c.f. format specification) - */ -typedef struct { - FLAC__EntropyCodingMethod entropy_coding_method; - /**< The residual coding method. */ - - unsigned order; - /**< The FIR order. */ - - unsigned qlp_coeff_precision; - /**< Quantized FIR filter coefficient precision in bits. */ - - int quantization_level; - /**< The qlp coeff shift needed. */ - - FLAC__int32 qlp_coeff[FLAC__MAX_LPC_ORDER]; - /**< FIR filter coefficients. */ - - FLAC__int32 warmup[FLAC__MAX_LPC_ORDER]; - /**< Warmup samples to prime the predictor, length == order. */ - - const FLAC__int32 *residual; - /**< The residual signal, length == (blocksize minus order) samples. */ -} FLAC__Subframe_LPC; - -extern FLAC_API const unsigned FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN; /**< == 4 (bits) */ -extern FLAC_API const unsigned FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN; /**< == 5 (bits) */ - - -/** FLAC subframe structure. (c.f. format specification) - */ -typedef struct { - FLAC__SubframeType type; - union { - FLAC__Subframe_Constant constant; - FLAC__Subframe_Fixed fixed; - FLAC__Subframe_LPC lpc; - FLAC__Subframe_Verbatim verbatim; - } data; - unsigned wasted_bits; -} FLAC__Subframe; - -/** == 1 (bit) - * - * This used to be a zero-padding bit (hence the name - * FLAC__SUBFRAME_ZERO_PAD_LEN) but is now a reserved bit. It still has a - * mandatory value of \c 0 but in the future may take on the value \c 0 or \c 1 - * to mean something else. - */ -extern FLAC_API const unsigned FLAC__SUBFRAME_ZERO_PAD_LEN; -extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_LEN; /**< == 6 (bits) */ -extern FLAC_API const unsigned FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN; /**< == 1 (bit) */ - -extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_CONSTANT_BYTE_ALIGNED_MASK; /**< = 0x00 */ -extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_VERBATIM_BYTE_ALIGNED_MASK; /**< = 0x02 */ -extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_FIXED_BYTE_ALIGNED_MASK; /**< = 0x10 */ -extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_LPC_BYTE_ALIGNED_MASK; /**< = 0x40 */ - -/*****************************************************************************/ - - -/***************************************************************************** - * - * Frame structures - * - *****************************************************************************/ - -/** An enumeration of the available channel assignments. */ -typedef enum { - FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT = 0, /**< independent channels */ - FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE = 1, /**< left+side stereo */ - FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE = 2, /**< right+side stereo */ - FLAC__CHANNEL_ASSIGNMENT_MID_SIDE = 3 /**< mid+side stereo */ -} FLAC__ChannelAssignment; - -/** Maps a FLAC__ChannelAssignment to a C string. - * - * Using a FLAC__ChannelAssignment as the index to this array will - * give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__ChannelAssignmentString[]; - -/** An enumeration of the possible frame numbering methods. */ -typedef enum { - FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER, /**< number contains the frame number */ - FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER /**< number contains the sample number of first sample in frame */ -} FLAC__FrameNumberType; - -/** Maps a FLAC__FrameNumberType to a C string. - * - * Using a FLAC__FrameNumberType as the index to this array will - * give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__FrameNumberTypeString[]; - - -/** FLAC frame header structure. (c.f. format specification) - */ -typedef struct { - unsigned blocksize; - /**< The number of samples per subframe. */ - - unsigned sample_rate; - /**< The sample rate in Hz. */ - - unsigned channels; - /**< The number of channels (== number of subframes). */ - - FLAC__ChannelAssignment channel_assignment; - /**< The channel assignment for the frame. */ - - unsigned bits_per_sample; - /**< The sample resolution. */ - - FLAC__FrameNumberType number_type; - /**< The numbering scheme used for the frame. As a convenience, the - * decoder will always convert a frame number to a sample number because - * the rules are complex. */ - - union { - FLAC__uint32 frame_number; - FLAC__uint64 sample_number; - } number; - /**< The frame number or sample number of first sample in frame; - * use the \a number_type value to determine which to use. */ - - FLAC__uint8 crc; - /**< CRC-8 (polynomial = x^8 + x^2 + x^1 + x^0, initialized with 0) - * of the raw frame header bytes, meaning everything before the CRC byte - * including the sync code. - */ -} FLAC__FrameHeader; - -extern FLAC_API const unsigned FLAC__FRAME_HEADER_SYNC; /**< == 0x3ffe; the frame header sync code */ -extern FLAC_API const unsigned FLAC__FRAME_HEADER_SYNC_LEN; /**< == 14 (bits) */ -extern FLAC_API const unsigned FLAC__FRAME_HEADER_RESERVED_LEN; /**< == 1 (bits) */ -extern FLAC_API const unsigned FLAC__FRAME_HEADER_BLOCKING_STRATEGY_LEN; /**< == 1 (bits) */ -extern FLAC_API const unsigned FLAC__FRAME_HEADER_BLOCK_SIZE_LEN; /**< == 4 (bits) */ -extern FLAC_API const unsigned FLAC__FRAME_HEADER_SAMPLE_RATE_LEN; /**< == 4 (bits) */ -extern FLAC_API const unsigned FLAC__FRAME_HEADER_CHANNEL_ASSIGNMENT_LEN; /**< == 4 (bits) */ -extern FLAC_API const unsigned FLAC__FRAME_HEADER_BITS_PER_SAMPLE_LEN; /**< == 3 (bits) */ -extern FLAC_API const unsigned FLAC__FRAME_HEADER_ZERO_PAD_LEN; /**< == 1 (bit) */ -extern FLAC_API const unsigned FLAC__FRAME_HEADER_CRC_LEN; /**< == 8 (bits) */ - - -/** FLAC frame footer structure. (c.f. format specification) - */ -typedef struct { - FLAC__uint16 crc; - /**< CRC-16 (polynomial = x^16 + x^15 + x^2 + x^0, initialized with - * 0) of the bytes before the crc, back to and including the frame header - * sync code. - */ -} FLAC__FrameFooter; - -extern FLAC_API const unsigned FLAC__FRAME_FOOTER_CRC_LEN; /**< == 16 (bits) */ - - -/** FLAC frame structure. (c.f. format specification) - */ -typedef struct { - FLAC__FrameHeader header; - FLAC__Subframe subframes[FLAC__MAX_CHANNELS]; - FLAC__FrameFooter footer; -} FLAC__Frame; - -/*****************************************************************************/ - - -/***************************************************************************** - * - * Meta-data structures - * - *****************************************************************************/ - -/** An enumeration of the available metadata block types. */ -typedef enum { - - FLAC__METADATA_TYPE_STREAMINFO = 0, - /**< STREAMINFO block */ - - FLAC__METADATA_TYPE_PADDING = 1, - /**< PADDING block */ - - FLAC__METADATA_TYPE_APPLICATION = 2, - /**< APPLICATION block */ - - FLAC__METADATA_TYPE_SEEKTABLE = 3, - /**< SEEKTABLE block */ - - FLAC__METADATA_TYPE_VORBIS_COMMENT = 4, - /**< VORBISCOMMENT block (a.k.a. FLAC tags) */ - - FLAC__METADATA_TYPE_CUESHEET = 5, - /**< CUESHEET block */ - - FLAC__METADATA_TYPE_PICTURE = 6, - /**< PICTURE block */ - - FLAC__METADATA_TYPE_UNDEFINED = 7, - /**< marker to denote beginning of undefined type range; this number will increase as new metadata types are added */ - - FLAC__MAX_METADATA_TYPE = FLAC__MAX_METADATA_TYPE_CODE, - /**< No type will ever be greater than this. There is not enough room in the protocol block. */ -} FLAC__MetadataType; - -/** Maps a FLAC__MetadataType to a C string. - * - * Using a FLAC__MetadataType as the index to this array will - * give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__MetadataTypeString[]; - - -/** FLAC STREAMINFO structure. (c.f. format specification) - */ -typedef struct { - unsigned min_blocksize, max_blocksize; - unsigned min_framesize, max_framesize; - unsigned sample_rate; - unsigned channels; - unsigned bits_per_sample; - FLAC__uint64 total_samples; - FLAC__byte md5sum[16]; -} FLAC__StreamMetadata_StreamInfo; - -extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN; /**< == 16 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN; /**< == 16 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN; /**< == 24 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN; /**< == 24 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN; /**< == 20 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN; /**< == 3 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN; /**< == 5 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN; /**< == 36 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MD5SUM_LEN; /**< == 128 (bits) */ - -/** The total stream length of the STREAMINFO block in bytes. */ -#define FLAC__STREAM_METADATA_STREAMINFO_LENGTH (34u) - -/** FLAC PADDING structure. (c.f. format specification) - */ -typedef struct { - int dummy; - /**< Conceptually this is an empty struct since we don't store the - * padding bytes. Empty structs are not allowed by some C compilers, - * hence the dummy. - */ -} FLAC__StreamMetadata_Padding; - - -/** FLAC APPLICATION structure. (c.f. format specification) - */ -typedef struct { - FLAC__byte id[4]; - FLAC__byte *data; -} FLAC__StreamMetadata_Application; - -extern FLAC_API const unsigned FLAC__STREAM_METADATA_APPLICATION_ID_LEN; /**< == 32 (bits) */ - -/** SeekPoint structure used in SEEKTABLE blocks. (c.f. format specification) - */ -typedef struct { - FLAC__uint64 sample_number; - /**< The sample number of the target frame. */ - - FLAC__uint64 stream_offset; - /**< The offset, in bytes, of the target frame with respect to - * beginning of the first frame. */ - - unsigned frame_samples; - /**< The number of samples in the target frame. */ -} FLAC__StreamMetadata_SeekPoint; - -extern FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_SAMPLE_NUMBER_LEN; /**< == 64 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_STREAM_OFFSET_LEN; /**< == 64 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_FRAME_SAMPLES_LEN; /**< == 16 (bits) */ - -/** The total stream length of a seek point in bytes. */ -#define FLAC__STREAM_METADATA_SEEKPOINT_LENGTH (18u) - -/** The value used in the \a sample_number field of - * FLAC__StreamMetadataSeekPoint used to indicate a placeholder - * point (== 0xffffffffffffffff). - */ -extern FLAC_API const FLAC__uint64 FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER; - - -/** FLAC SEEKTABLE structure. (c.f. format specification) - * - * \note From the format specification: - * - The seek points must be sorted by ascending sample number. - * - Each seek point's sample number must be the first sample of the - * target frame. - * - Each seek point's sample number must be unique within the table. - * - Existence of a SEEKTABLE block implies a correct setting of - * total_samples in the stream_info block. - * - Behavior is undefined when more than one SEEKTABLE block is - * present in a stream. - */ -typedef struct { - unsigned num_points; - FLAC__StreamMetadata_SeekPoint *points; -} FLAC__StreamMetadata_SeekTable; - - -/** Vorbis comment entry structure used in VORBIS_COMMENT blocks. (c.f. format specification) - * - * For convenience, the APIs maintain a trailing NUL character at the end of - * \a entry which is not counted toward \a length, i.e. - * \code strlen(entry) == length \endcode - */ -typedef struct { - FLAC__uint32 length; - FLAC__byte *entry; -} FLAC__StreamMetadata_VorbisComment_Entry; - -extern FLAC_API const unsigned FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN; /**< == 32 (bits) */ - - -/** FLAC VORBIS_COMMENT structure. (c.f. format specification) - */ -typedef struct { - FLAC__StreamMetadata_VorbisComment_Entry vendor_string; - FLAC__uint32 num_comments; - FLAC__StreamMetadata_VorbisComment_Entry *comments; -} FLAC__StreamMetadata_VorbisComment; - -extern FLAC_API const unsigned FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN; /**< == 32 (bits) */ - - -/** FLAC CUESHEET track index structure. (See the - * format specification for - * the full description of each field.) - */ -typedef struct { - FLAC__uint64 offset; - /**< Offset in samples, relative to the track offset, of the index - * point. - */ - - FLAC__byte number; - /**< The index point number. */ -} FLAC__StreamMetadata_CueSheet_Index; - -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN; /**< == 64 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN; /**< == 8 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN; /**< == 3*8 (bits) */ - - -/** FLAC CUESHEET track structure. (See the - * format specification for - * the full description of each field.) - */ -typedef struct { - FLAC__uint64 offset; - /**< Track offset in samples, relative to the beginning of the FLAC audio stream. */ - - FLAC__byte number; - /**< The track number. */ - - char isrc[13]; - /**< Track ISRC. This is a 12-digit alphanumeric code plus a trailing \c NUL byte */ - - unsigned type:1; - /**< The track type: 0 for audio, 1 for non-audio. */ - - unsigned pre_emphasis:1; - /**< The pre-emphasis flag: 0 for no pre-emphasis, 1 for pre-emphasis. */ - - FLAC__byte num_indices; - /**< The number of track index points. */ - - FLAC__StreamMetadata_CueSheet_Index *indices; - /**< NULL if num_indices == 0, else pointer to array of index points. */ - -} FLAC__StreamMetadata_CueSheet_Track; - -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN; /**< == 64 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN; /**< == 8 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN; /**< == 12*8 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN; /**< == 1 (bit) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN; /**< == 1 (bit) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN; /**< == 6+13*8 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN; /**< == 8 (bits) */ - - -/** FLAC CUESHEET structure. (See the - * format specification - * for the full description of each field.) - */ -typedef struct { - char media_catalog_number[129]; - /**< Media catalog number, in ASCII printable characters 0x20-0x7e. In - * general, the media catalog number may be 0 to 128 bytes long; any - * unused characters should be right-padded with NUL characters. - */ - - FLAC__uint64 lead_in; - /**< The number of lead-in samples. */ - - FLAC__bool is_cd; - /**< \c true if CUESHEET corresponds to a Compact Disc, else \c false. */ - - unsigned num_tracks; - /**< The number of tracks. */ - - FLAC__StreamMetadata_CueSheet_Track *tracks; - /**< NULL if num_tracks == 0, else pointer to array of tracks. */ - -} FLAC__StreamMetadata_CueSheet; - -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN; /**< == 128*8 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN; /**< == 64 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN; /**< == 1 (bit) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN; /**< == 7+258*8 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN; /**< == 8 (bits) */ - - -/** An enumeration of the PICTURE types (see FLAC__StreamMetadataPicture and id3 v2.4 APIC tag). */ -typedef enum { - FLAC__STREAM_METADATA_PICTURE_TYPE_OTHER = 0, /**< Other */ - FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON_STANDARD = 1, /**< 32x32 pixels 'file icon' (PNG only) */ - FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON = 2, /**< Other file icon */ - FLAC__STREAM_METADATA_PICTURE_TYPE_FRONT_COVER = 3, /**< Cover (front) */ - FLAC__STREAM_METADATA_PICTURE_TYPE_BACK_COVER = 4, /**< Cover (back) */ - FLAC__STREAM_METADATA_PICTURE_TYPE_LEAFLET_PAGE = 5, /**< Leaflet page */ - FLAC__STREAM_METADATA_PICTURE_TYPE_MEDIA = 6, /**< Media (e.g. label side of CD) */ - FLAC__STREAM_METADATA_PICTURE_TYPE_LEAD_ARTIST = 7, /**< Lead artist/lead performer/soloist */ - FLAC__STREAM_METADATA_PICTURE_TYPE_ARTIST = 8, /**< Artist/performer */ - FLAC__STREAM_METADATA_PICTURE_TYPE_CONDUCTOR = 9, /**< Conductor */ - FLAC__STREAM_METADATA_PICTURE_TYPE_BAND = 10, /**< Band/Orchestra */ - FLAC__STREAM_METADATA_PICTURE_TYPE_COMPOSER = 11, /**< Composer */ - FLAC__STREAM_METADATA_PICTURE_TYPE_LYRICIST = 12, /**< Lyricist/text writer */ - FLAC__STREAM_METADATA_PICTURE_TYPE_RECORDING_LOCATION = 13, /**< Recording Location */ - FLAC__STREAM_METADATA_PICTURE_TYPE_DURING_RECORDING = 14, /**< During recording */ - FLAC__STREAM_METADATA_PICTURE_TYPE_DURING_PERFORMANCE = 15, /**< During performance */ - FLAC__STREAM_METADATA_PICTURE_TYPE_VIDEO_SCREEN_CAPTURE = 16, /**< Movie/video screen capture */ - FLAC__STREAM_METADATA_PICTURE_TYPE_FISH = 17, /**< A bright coloured fish */ - FLAC__STREAM_METADATA_PICTURE_TYPE_ILLUSTRATION = 18, /**< Illustration */ - FLAC__STREAM_METADATA_PICTURE_TYPE_BAND_LOGOTYPE = 19, /**< Band/artist logotype */ - FLAC__STREAM_METADATA_PICTURE_TYPE_PUBLISHER_LOGOTYPE = 20, /**< Publisher/Studio logotype */ - FLAC__STREAM_METADATA_PICTURE_TYPE_UNDEFINED -} FLAC__StreamMetadata_Picture_Type; - -/** Maps a FLAC__StreamMetadata_Picture_Type to a C string. - * - * Using a FLAC__StreamMetadata_Picture_Type as the index to this array - * will give the string equivalent. The contents should not be - * modified. - */ -extern FLAC_API const char * const FLAC__StreamMetadata_Picture_TypeString[]; - -/** FLAC PICTURE structure. (See the - * format specification - * for the full description of each field.) - */ -typedef struct { - FLAC__StreamMetadata_Picture_Type type; - /**< The kind of picture stored. */ - - char *mime_type; - /**< Picture data's MIME type, in ASCII printable characters - * 0x20-0x7e, NUL terminated. For best compatibility with players, - * use picture data of MIME type \c image/jpeg or \c image/png. A - * MIME type of '-->' is also allowed, in which case the picture - * data should be a complete URL. In file storage, the MIME type is - * stored as a 32-bit length followed by the ASCII string with no NUL - * terminator, but is converted to a plain C string in this structure - * for convenience. - */ - - FLAC__byte *description; - /**< Picture's description in UTF-8, NUL terminated. In file storage, - * the description is stored as a 32-bit length followed by the UTF-8 - * string with no NUL terminator, but is converted to a plain C string - * in this structure for convenience. - */ - - FLAC__uint32 width; - /**< Picture's width in pixels. */ - - FLAC__uint32 height; - /**< Picture's height in pixels. */ - - FLAC__uint32 depth; - /**< Picture's color depth in bits-per-pixel. */ - - FLAC__uint32 colors; - /**< For indexed palettes (like GIF), picture's number of colors (the - * number of palette entries), or \c 0 for non-indexed (i.e. 2^depth). - */ - - FLAC__uint32 data_length; - /**< Length of binary picture data in bytes. */ - - FLAC__byte *data; - /**< Binary picture data. */ - -} FLAC__StreamMetadata_Picture; - -extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_TYPE_LEN; /**< == 32 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN; /**< == 32 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN; /**< == 32 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN; /**< == 32 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN; /**< == 32 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN; /**< == 32 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_COLORS_LEN; /**< == 32 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN; /**< == 32 (bits) */ - - -/** Structure that is used when a metadata block of unknown type is loaded. - * The contents are opaque. The structure is used only internally to - * correctly handle unknown metadata. - */ -typedef struct { - FLAC__byte *data; -} FLAC__StreamMetadata_Unknown; - - -/** FLAC metadata block structure. (c.f. format specification) - */ -typedef struct { - FLAC__MetadataType type; - /**< The type of the metadata block; used determine which member of the - * \a data union to dereference. If type >= FLAC__METADATA_TYPE_UNDEFINED - * then \a data.unknown must be used. */ - - FLAC__bool is_last; - /**< \c true if this metadata block is the last, else \a false */ - - unsigned length; - /**< Length, in bytes, of the block data as it appears in the stream. */ - - union { - FLAC__StreamMetadata_StreamInfo stream_info; - FLAC__StreamMetadata_Padding padding; - FLAC__StreamMetadata_Application application; - FLAC__StreamMetadata_SeekTable seek_table; - FLAC__StreamMetadata_VorbisComment vorbis_comment; - FLAC__StreamMetadata_CueSheet cue_sheet; - FLAC__StreamMetadata_Picture picture; - FLAC__StreamMetadata_Unknown unknown; - } data; - /**< Polymorphic block data; use the \a type value to determine which - * to use. */ -} FLAC__StreamMetadata; - -extern FLAC_API const unsigned FLAC__STREAM_METADATA_IS_LAST_LEN; /**< == 1 (bit) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_TYPE_LEN; /**< == 7 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_LENGTH_LEN; /**< == 24 (bits) */ - -/** The total stream length of a metadata block header in bytes. */ -#define FLAC__STREAM_METADATA_HEADER_LENGTH (4u) - -/*****************************************************************************/ - - -/***************************************************************************** - * - * Utility functions - * - *****************************************************************************/ - -/** Tests that a sample rate is valid for FLAC. - * - * \param sample_rate The sample rate to test for compliance. - * \retval FLAC__bool - * \c true if the given sample rate conforms to the specification, else - * \c false. - */ -FLAC_API FLAC__bool FLAC__format_sample_rate_is_valid(unsigned sample_rate); - -/** Tests that a blocksize at the given sample rate is valid for the FLAC - * subset. - * - * \param blocksize The blocksize to test for compliance. - * \param sample_rate The sample rate is needed, since the valid subset - * blocksize depends on the sample rate. - * \retval FLAC__bool - * \c true if the given blocksize conforms to the specification for the - * subset at the given sample rate, else \c false. - */ -FLAC_API FLAC__bool FLAC__format_blocksize_is_subset(unsigned blocksize, unsigned sample_rate); - -/** Tests that a sample rate is valid for the FLAC subset. The subset rules - * for valid sample rates are slightly more complex since the rate has to - * be expressible completely in the frame header. - * - * \param sample_rate The sample rate to test for compliance. - * \retval FLAC__bool - * \c true if the given sample rate conforms to the specification for the - * subset, else \c false. - */ -FLAC_API FLAC__bool FLAC__format_sample_rate_is_subset(unsigned sample_rate); - -/** Check a Vorbis comment entry name to see if it conforms to the Vorbis - * comment specification. - * - * Vorbis comment names must be composed only of characters from - * [0x20-0x3C,0x3E-0x7D]. - * - * \param name A NUL-terminated string to be checked. - * \assert - * \code name != NULL \endcode - * \retval FLAC__bool - * \c false if entry name is illegal, else \c true. - */ -FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_name_is_legal(const char *name); - -/** Check a Vorbis comment entry value to see if it conforms to the Vorbis - * comment specification. - * - * Vorbis comment values must be valid UTF-8 sequences. - * - * \param value A string to be checked. - * \param length A the length of \a value in bytes. May be - * \c (unsigned)(-1) to indicate that \a value is a plain - * UTF-8 NUL-terminated string. - * \assert - * \code value != NULL \endcode - * \retval FLAC__bool - * \c false if entry name is illegal, else \c true. - */ -FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_value_is_legal(const FLAC__byte *value, unsigned length); - -/** Check a Vorbis comment entry to see if it conforms to the Vorbis - * comment specification. - * - * Vorbis comment entries must be of the form 'name=value', and 'name' and - * 'value' must be legal according to - * FLAC__format_vorbiscomment_entry_name_is_legal() and - * FLAC__format_vorbiscomment_entry_value_is_legal() respectively. - * - * \param entry An entry to be checked. - * \param length The length of \a entry in bytes. - * \assert - * \code value != NULL \endcode - * \retval FLAC__bool - * \c false if entry name is illegal, else \c true. - */ -FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_is_legal(const FLAC__byte *entry, unsigned length); - -/** Check a seek table to see if it conforms to the FLAC specification. - * See the format specification for limits on the contents of the - * seek table. - * - * \param seek_table A pointer to a seek table to be checked. - * \assert - * \code seek_table != NULL \endcode - * \retval FLAC__bool - * \c false if seek table is illegal, else \c true. - */ -FLAC_API FLAC__bool FLAC__format_seektable_is_legal(const FLAC__StreamMetadata_SeekTable *seek_table); - -/** Sort a seek table's seek points according to the format specification. - * This includes a "unique-ification" step to remove duplicates, i.e. - * seek points with identical \a sample_number values. Duplicate seek - * points are converted into placeholder points and sorted to the end of - * the table. - * - * \param seek_table A pointer to a seek table to be sorted. - * \assert - * \code seek_table != NULL \endcode - * \retval unsigned - * The number of duplicate seek points converted into placeholders. - */ -FLAC_API unsigned FLAC__format_seektable_sort(FLAC__StreamMetadata_SeekTable *seek_table); - -/** Check a cue sheet to see if it conforms to the FLAC specification. - * See the format specification for limits on the contents of the - * cue sheet. - * - * \param cue_sheet A pointer to an existing cue sheet to be checked. - * \param check_cd_da_subset If \c true, check CUESHEET against more - * stringent requirements for a CD-DA (audio) disc. - * \param violation Address of a pointer to a string. If there is a - * violation, a pointer to a string explanation of the - * violation will be returned here. \a violation may be - * \c NULL if you don't need the returned string. Do not - * free the returned string; it will always point to static - * data. - * \assert - * \code cue_sheet != NULL \endcode - * \retval FLAC__bool - * \c false if cue sheet is illegal, else \c true. - */ -FLAC_API FLAC__bool FLAC__format_cuesheet_is_legal(const FLAC__StreamMetadata_CueSheet *cue_sheet, FLAC__bool check_cd_da_subset, const char **violation); - -/** Check picture data to see if it conforms to the FLAC specification. - * See the format specification for limits on the contents of the - * PICTURE block. - * - * \param picture A pointer to existing picture data to be checked. - * \param violation Address of a pointer to a string. If there is a - * violation, a pointer to a string explanation of the - * violation will be returned here. \a violation may be - * \c NULL if you don't need the returned string. Do not - * free the returned string; it will always point to static - * data. - * \assert - * \code picture != NULL \endcode - * \retval FLAC__bool - * \c false if picture data is illegal, else \c true. - */ -FLAC_API FLAC__bool FLAC__format_picture_is_legal(const FLAC__StreamMetadata_Picture *picture, const char **violation); - -/* \} */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/metadata.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/metadata.h deleted file mode 100644 index 89515329..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/metadata.h +++ /dev/null @@ -1,2182 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 FLAC__METADATA_H -#define FLAC__METADATA_H - -#include /* for off_t */ -#include "export.h" -#include "callback.h" -#include "format.h" - -/* -------------------------------------------------------------------- - (For an example of how all these routines are used, see the source - code for the unit tests in src/test_libFLAC/metadata_*.c, or - metaflac in src/metaflac/) - ------------------------------------------------------------------*/ - -/** \file include/FLAC/metadata.h - * - * \brief - * This module provides functions for creating and manipulating FLAC - * metadata blocks in memory, and three progressively more powerful - * interfaces for traversing and editing metadata in FLAC files. - * - * See the detailed documentation for each interface in the - * \link flac_metadata metadata \endlink module. - */ - -/** \defgroup flac_metadata FLAC/metadata.h: metadata interfaces - * \ingroup flac - * - * \brief - * This module provides functions for creating and manipulating FLAC - * metadata blocks in memory, and three progressively more powerful - * interfaces for traversing and editing metadata in native FLAC files. - * Note that currently only the Chain interface (level 2) supports Ogg - * FLAC files, and it is read-only i.e. no writing back changed - * metadata to file. - * - * There are three metadata interfaces of increasing complexity: - * - * Level 0: - * Read-only access to the STREAMINFO, VORBIS_COMMENT, CUESHEET, and - * PICTURE blocks. - * - * Level 1: - * Read-write access to all metadata blocks. This level is write- - * efficient in most cases (more on this below), and uses less memory - * than level 2. - * - * Level 2: - * Read-write access to all metadata blocks. This level is write- - * efficient in all cases, but uses more memory since all metadata for - * the whole file is read into memory and manipulated before writing - * out again. - * - * What do we mean by efficient? Since FLAC metadata appears at the - * beginning of the file, when writing metadata back to a FLAC file - * it is possible to grow or shrink the metadata such that the entire - * file must be rewritten. However, if the size remains the same during - * changes or PADDING blocks are utilized, only the metadata needs to be - * overwritten, which is much faster. - * - * Efficient means the whole file is rewritten at most one time, and only - * when necessary. Level 1 is not efficient only in the case that you - * cause more than one metadata block to grow or shrink beyond what can - * be accomodated by padding. In this case you should probably use level - * 2, which allows you to edit all the metadata for a file in memory and - * write it out all at once. - * - * All levels know how to skip over and not disturb an ID3v2 tag at the - * front of the file. - * - * All levels access files via their filenames. In addition, level 2 - * has additional alternative read and write functions that take an I/O - * handle and callbacks, for situations where access by filename is not - * possible. - * - * In addition to the three interfaces, this module defines functions for - * creating and manipulating various metadata objects in memory. As we see - * from the Format module, FLAC metadata blocks in memory are very primitive - * structures for storing information in an efficient way. Reading - * information from the structures is easy but creating or modifying them - * directly is more complex. The metadata object routines here facilitate - * this by taking care of the consistency and memory management drudgery. - * - * Unless you will be using the level 1 or 2 interfaces to modify existing - * metadata however, you will not probably not need these. - * - * From a dependency standpoint, none of the encoders or decoders require - * the metadata module. This is so that embedded users can strip out the - * metadata module from libFLAC to reduce the size and complexity. - */ - -#ifdef __cplusplus -extern "C" { -#endif - - -/** \defgroup flac_metadata_level0 FLAC/metadata.h: metadata level 0 interface - * \ingroup flac_metadata - * - * \brief - * The level 0 interface consists of individual routines to read the - * STREAMINFO, VORBIS_COMMENT, CUESHEET, and PICTURE blocks, requiring - * only a filename. - * - * They try to skip any ID3v2 tag at the head of the file. - * - * \{ - */ - -/** Read the STREAMINFO metadata block of the given FLAC file. This function - * will try to skip any ID3v2 tag at the head of the file. - * - * \param filename The path to the FLAC file to read. - * \param streaminfo A pointer to space for the STREAMINFO block. Since - * FLAC__StreamMetadata is a simple structure with no - * memory allocation involved, you pass the address of - * an existing structure. It need not be initialized. - * \assert - * \code filename != NULL \endcode - * \code streaminfo != NULL \endcode - * \retval FLAC__bool - * \c true if a valid STREAMINFO block was read from \a filename. Returns - * \c false if there was a memory allocation error, a file decoder error, - * or the file contained no STREAMINFO block. (A memory allocation error - * is possible because this function must set up a file decoder.) - */ -FLAC_API FLAC__bool FLAC__metadata_get_streaminfo(const char *filename, FLAC__StreamMetadata *streaminfo); - -/** Read the VORBIS_COMMENT metadata block of the given FLAC file. This - * function will try to skip any ID3v2 tag at the head of the file. - * - * \param filename The path to the FLAC file to read. - * \param tags The address where the returned pointer will be - * stored. The \a tags object must be deleted by - * the caller using FLAC__metadata_object_delete(). - * \assert - * \code filename != NULL \endcode - * \code tags != NULL \endcode - * \retval FLAC__bool - * \c true if a valid VORBIS_COMMENT block was read from \a filename, - * and \a *tags will be set to the address of the metadata structure. - * Returns \c false if there was a memory allocation error, a file - * decoder error, or the file contained no VORBIS_COMMENT block, and - * \a *tags will be set to \c NULL. - */ -FLAC_API FLAC__bool FLAC__metadata_get_tags(const char *filename, FLAC__StreamMetadata **tags); - -/** Read the CUESHEET metadata block of the given FLAC file. This - * function will try to skip any ID3v2 tag at the head of the file. - * - * \param filename The path to the FLAC file to read. - * \param cuesheet The address where the returned pointer will be - * stored. The \a cuesheet object must be deleted by - * the caller using FLAC__metadata_object_delete(). - * \assert - * \code filename != NULL \endcode - * \code cuesheet != NULL \endcode - * \retval FLAC__bool - * \c true if a valid CUESHEET block was read from \a filename, - * and \a *cuesheet will be set to the address of the metadata - * structure. Returns \c false if there was a memory allocation - * error, a file decoder error, or the file contained no CUESHEET - * block, and \a *cuesheet will be set to \c NULL. - */ -FLAC_API FLAC__bool FLAC__metadata_get_cuesheet(const char *filename, FLAC__StreamMetadata **cuesheet); - -/** Read a PICTURE metadata block of the given FLAC file. This - * function will try to skip any ID3v2 tag at the head of the file. - * Since there can be more than one PICTURE block in a file, this - * function takes a number of parameters that act as constraints to - * the search. The PICTURE block with the largest area matching all - * the constraints will be returned, or \a *picture will be set to - * \c NULL if there was no such block. - * - * \param filename The path to the FLAC file to read. - * \param picture The address where the returned pointer will be - * stored. The \a picture object must be deleted by - * the caller using FLAC__metadata_object_delete(). - * \param type The desired picture type. Use \c -1 to mean - * "any type". - * \param mime_type The desired MIME type, e.g. "image/jpeg". The - * string will be matched exactly. Use \c NULL to - * mean "any MIME type". - * \param description The desired description. The string will be - * matched exactly. Use \c NULL to mean "any - * description". - * \param max_width The maximum width in pixels desired. Use - * \c (unsigned)(-1) to mean "any width". - * \param max_height The maximum height in pixels desired. Use - * \c (unsigned)(-1) to mean "any height". - * \param max_depth The maximum color depth in bits-per-pixel desired. - * Use \c (unsigned)(-1) to mean "any depth". - * \param max_colors The maximum number of colors desired. Use - * \c (unsigned)(-1) to mean "any number of colors". - * \assert - * \code filename != NULL \endcode - * \code picture != NULL \endcode - * \retval FLAC__bool - * \c true if a valid PICTURE block was read from \a filename, - * and \a *picture will be set to the address of the metadata - * structure. Returns \c false if there was a memory allocation - * error, a file decoder error, or the file contained no PICTURE - * block, and \a *picture will be set to \c NULL. - */ -FLAC_API FLAC__bool FLAC__metadata_get_picture(const char *filename, FLAC__StreamMetadata **picture, FLAC__StreamMetadata_Picture_Type type, const char *mime_type, const FLAC__byte *description, unsigned max_width, unsigned max_height, unsigned max_depth, unsigned max_colors); - -/* \} */ - - -/** \defgroup flac_metadata_level1 FLAC/metadata.h: metadata level 1 interface - * \ingroup flac_metadata - * - * \brief - * The level 1 interface provides read-write access to FLAC file metadata and - * operates directly on the FLAC file. - * - * The general usage of this interface is: - * - * - Create an iterator using FLAC__metadata_simple_iterator_new() - * - Attach it to a file using FLAC__metadata_simple_iterator_init() and check - * the exit code. Call FLAC__metadata_simple_iterator_is_writable() to - * see if the file is writable, or only read access is allowed. - * - Use FLAC__metadata_simple_iterator_next() and - * FLAC__metadata_simple_iterator_prev() to traverse the blocks. - * This is does not read the actual blocks themselves. - * FLAC__metadata_simple_iterator_next() is relatively fast. - * FLAC__metadata_simple_iterator_prev() is slower since it needs to search - * forward from the front of the file. - * - Use FLAC__metadata_simple_iterator_get_block_type() or - * FLAC__metadata_simple_iterator_get_block() to access the actual data at - * the current iterator position. The returned object is yours to modify - * and free. - * - Use FLAC__metadata_simple_iterator_set_block() to write a modified block - * back. You must have write permission to the original file. Make sure to - * read the whole comment to FLAC__metadata_simple_iterator_set_block() - * below. - * - Use FLAC__metadata_simple_iterator_insert_block_after() to add new blocks. - * Use the object creation functions from - * \link flac_metadata_object here \endlink to generate new objects. - * - Use FLAC__metadata_simple_iterator_delete_block() to remove the block - * currently referred to by the iterator, or replace it with padding. - * - Destroy the iterator with FLAC__metadata_simple_iterator_delete() when - * finished. - * - * \note - * The FLAC file remains open the whole time between - * FLAC__metadata_simple_iterator_init() and - * FLAC__metadata_simple_iterator_delete(), so make sure you are not altering - * the file during this time. - * - * \note - * Do not modify the \a is_last, \a length, or \a type fields of returned - * FLAC__StreamMetadata objects. These are managed automatically. - * - * \note - * If any of the modification functions - * (FLAC__metadata_simple_iterator_set_block(), - * FLAC__metadata_simple_iterator_delete_block(), - * FLAC__metadata_simple_iterator_insert_block_after(), etc.) return \c false, - * you should delete the iterator as it may no longer be valid. - * - * \{ - */ - -struct FLAC__Metadata_SimpleIterator; -/** The opaque structure definition for the level 1 iterator type. - * See the - * \link flac_metadata_level1 metadata level 1 module \endlink - * for a detailed description. - */ -typedef struct FLAC__Metadata_SimpleIterator FLAC__Metadata_SimpleIterator; - -/** Status type for FLAC__Metadata_SimpleIterator. - * - * The iterator's current status can be obtained by calling FLAC__metadata_simple_iterator_status(). - */ -typedef enum { - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK = 0, - /**< The iterator is in the normal OK state */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT, - /**< The data passed into a function violated the function's usage criteria */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE, - /**< The iterator could not open the target file */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_A_FLAC_FILE, - /**< The iterator could not find the FLAC signature at the start of the file */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_WRITABLE, - /**< The iterator tried to write to a file that was not writable */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_BAD_METADATA, - /**< The iterator encountered input that does not conform to the FLAC metadata specification */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR, - /**< The iterator encountered an error while reading the FLAC file */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR, - /**< The iterator encountered an error while seeking in the FLAC file */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR, - /**< The iterator encountered an error while writing the FLAC file */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_RENAME_ERROR, - /**< The iterator encountered an error renaming the FLAC file */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_UNLINK_ERROR, - /**< The iterator encountered an error removing the temporary file */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR, - /**< Memory allocation failed */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_INTERNAL_ERROR - /**< The caller violated an assertion or an unexpected error occurred */ - -} FLAC__Metadata_SimpleIteratorStatus; - -/** Maps a FLAC__Metadata_SimpleIteratorStatus to a C string. - * - * Using a FLAC__Metadata_SimpleIteratorStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__Metadata_SimpleIteratorStatusString[]; - - -/** Create a new iterator instance. - * - * \retval FLAC__Metadata_SimpleIterator* - * \c NULL if there was an error allocating memory, else the new instance. - */ -FLAC_API FLAC__Metadata_SimpleIterator *FLAC__metadata_simple_iterator_new(void); - -/** Free an iterator instance. Deletes the object pointed to by \a iterator. - * - * \param iterator A pointer to an existing iterator. - * \assert - * \code iterator != NULL \endcode - */ -FLAC_API void FLAC__metadata_simple_iterator_delete(FLAC__Metadata_SimpleIterator *iterator); - -/** Get the current status of the iterator. Call this after a function - * returns \c false to get the reason for the error. Also resets the status - * to FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK. - * - * \param iterator A pointer to an existing iterator. - * \assert - * \code iterator != NULL \endcode - * \retval FLAC__Metadata_SimpleIteratorStatus - * The current status of the iterator. - */ -FLAC_API FLAC__Metadata_SimpleIteratorStatus FLAC__metadata_simple_iterator_status(FLAC__Metadata_SimpleIterator *iterator); - -/** Initialize the iterator to point to the first metadata block in the - * given FLAC file. - * - * \param iterator A pointer to an existing iterator. - * \param filename The path to the FLAC file. - * \param read_only If \c true, the FLAC file will be opened - * in read-only mode; if \c false, the FLAC - * file will be opened for edit even if no - * edits are performed. - * \param preserve_file_stats If \c true, the owner and modification - * time will be preserved even if the FLAC - * file is written to. - * \assert - * \code iterator != NULL \endcode - * \code filename != NULL \endcode - * \retval FLAC__bool - * \c false if a memory allocation error occurs, the file can't be - * opened, or another error occurs, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_init(FLAC__Metadata_SimpleIterator *iterator, const char *filename, FLAC__bool read_only, FLAC__bool preserve_file_stats); - -/** Returns \c true if the FLAC file is writable. If \c false, calls to - * FLAC__metadata_simple_iterator_set_block() and - * FLAC__metadata_simple_iterator_insert_block_after() will fail. - * - * \param iterator A pointer to an existing iterator. - * \assert - * \code iterator != NULL \endcode - * \retval FLAC__bool - * See above. - */ -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_is_writable(const FLAC__Metadata_SimpleIterator *iterator); - -/** Moves the iterator forward one metadata block, returning \c false if - * already at the end. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval FLAC__bool - * \c false if already at the last metadata block of the chain, else - * \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_next(FLAC__Metadata_SimpleIterator *iterator); - -/** Moves the iterator backward one metadata block, returning \c false if - * already at the beginning. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval FLAC__bool - * \c false if already at the first metadata block of the chain, else - * \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_prev(FLAC__Metadata_SimpleIterator *iterator); - -/** Returns a flag telling if the current metadata block is the last. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval FLAC__bool - * \c true if the current metadata block is the last in the file, - * else \c false. - */ -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_is_last(const FLAC__Metadata_SimpleIterator *iterator); - -/** Get the offset of the metadata block at the current position. This - * avoids reading the actual block data which can save time for large - * blocks. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval off_t - * The offset of the metadata block at the current iterator position. - * This is the byte offset relative to the beginning of the file of - * the current metadata block's header. - */ -FLAC_API off_t FLAC__metadata_simple_iterator_get_block_offset(const FLAC__Metadata_SimpleIterator *iterator); - -/** Get the type of the metadata block at the current position. This - * avoids reading the actual block data which can save time for large - * blocks. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval FLAC__MetadataType - * The type of the metadata block at the current iterator position. - */ -FLAC_API FLAC__MetadataType FLAC__metadata_simple_iterator_get_block_type(const FLAC__Metadata_SimpleIterator *iterator); - -/** Get the length of the metadata block at the current position. This - * avoids reading the actual block data which can save time for large - * blocks. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval unsigned - * The length of the metadata block at the current iterator position. - * The is same length as that in the - * metadata block header, - * i.e. the length of the metadata body that follows the header. - */ -FLAC_API unsigned FLAC__metadata_simple_iterator_get_block_length(const FLAC__Metadata_SimpleIterator *iterator); - -/** Get the application ID of the \c APPLICATION block at the current - * position. This avoids reading the actual block data which can save - * time for large blocks. - * - * \param iterator A pointer to an existing initialized iterator. - * \param id A pointer to a buffer of at least \c 4 bytes where - * the ID will be stored. - * \assert - * \code iterator != NULL \endcode - * \code id != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval FLAC__bool - * \c true if the ID was successfully read, else \c false, in which - * case you should check FLAC__metadata_simple_iterator_status() to - * find out why. If the status is - * \c FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT, then the - * current metadata block is not an \c APPLICATION block. Otherwise - * if the status is - * \c FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR or - * \c FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR, an I/O error - * occurred and the iterator can no longer be used. - */ -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_get_application_id(FLAC__Metadata_SimpleIterator *iterator, FLAC__byte *id); - -/** Get the metadata block at the current position. You can modify the - * block but must use FLAC__metadata_simple_iterator_set_block() to - * write it back to the FLAC file. - * - * You must call FLAC__metadata_object_delete() on the returned object - * when you are finished with it. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval FLAC__StreamMetadata* - * The current metadata block, or \c NULL if there was a memory - * allocation error. - */ -FLAC_API FLAC__StreamMetadata *FLAC__metadata_simple_iterator_get_block(FLAC__Metadata_SimpleIterator *iterator); - -/** Write a block back to the FLAC file. This function tries to be - * as efficient as possible; how the block is actually written is - * shown by the following: - * - * Existing block is a STREAMINFO block and the new block is a - * STREAMINFO block: the new block is written in place. Make sure - * you know what you're doing when changing the values of a - * STREAMINFO block. - * - * Existing block is a STREAMINFO block and the new block is a - * not a STREAMINFO block: this is an error since the first block - * must be a STREAMINFO block. Returns \c false without altering the - * file. - * - * Existing block is not a STREAMINFO block and the new block is a - * STREAMINFO block: this is an error since there may be only one - * STREAMINFO block. Returns \c false without altering the file. - * - * Existing block and new block are the same length: the existing - * block will be replaced by the new block, written in place. - * - * Existing block is longer than new block: if use_padding is \c true, - * the existing block will be overwritten in place with the new - * block followed by a PADDING block, if possible, to make the total - * size the same as the existing block. Remember that a padding - * block requires at least four bytes so if the difference in size - * between the new block and existing block is less than that, the - * entire file will have to be rewritten, using the new block's - * exact size. If use_padding is \c false, the entire file will be - * rewritten, replacing the existing block by the new block. - * - * Existing block is shorter than new block: if use_padding is \c true, - * the function will try and expand the new block into the following - * PADDING block, if it exists and doing so won't shrink the PADDING - * block to less than 4 bytes. If there is no following PADDING - * block, or it will shrink to less than 4 bytes, or use_padding is - * \c false, the entire file is rewritten, replacing the existing block - * with the new block. Note that in this case any following PADDING - * block is preserved as is. - * - * After writing the block, the iterator will remain in the same - * place, i.e. pointing to the new block. - * - * \param iterator A pointer to an existing initialized iterator. - * \param block The block to set. - * \param use_padding See above. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \code block != NULL \endcode - * \retval FLAC__bool - * \c true if successful, else \c false. - */ -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_set_block(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool use_padding); - -/** This is similar to FLAC__metadata_simple_iterator_set_block() - * except that instead of writing over an existing block, it appends - * a block after the existing block. \a use_padding is again used to - * tell the function to try an expand into following padding in an - * attempt to avoid rewriting the entire file. - * - * This function will fail and return \c false if given a STREAMINFO - * block. - * - * After writing the block, the iterator will be pointing to the - * new block. - * - * \param iterator A pointer to an existing initialized iterator. - * \param block The block to set. - * \param use_padding See above. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \code block != NULL \endcode - * \retval FLAC__bool - * \c true if successful, else \c false. - */ -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_insert_block_after(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool use_padding); - -/** Deletes the block at the current position. This will cause the - * entire FLAC file to be rewritten, unless \a use_padding is \c true, - * in which case the block will be replaced by an equal-sized PADDING - * block. The iterator will be left pointing to the block before the - * one just deleted. - * - * You may not delete the STREAMINFO block. - * - * \param iterator A pointer to an existing initialized iterator. - * \param use_padding See above. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval FLAC__bool - * \c true if successful, else \c false. - */ -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_delete_block(FLAC__Metadata_SimpleIterator *iterator, FLAC__bool use_padding); - -/* \} */ - - -/** \defgroup flac_metadata_level2 FLAC/metadata.h: metadata level 2 interface - * \ingroup flac_metadata - * - * \brief - * The level 2 interface provides read-write access to FLAC file metadata; - * all metadata is read into memory, operated on in memory, and then written - * to file, which is more efficient than level 1 when editing multiple blocks. - * - * Currently Ogg FLAC is supported for read only, via - * FLAC__metadata_chain_read_ogg() but a subsequent - * FLAC__metadata_chain_write() will fail. - * - * The general usage of this interface is: - * - * - Create a new chain using FLAC__metadata_chain_new(). A chain is a - * linked list of FLAC metadata blocks. - * - Read all metadata into the the chain from a FLAC file using - * FLAC__metadata_chain_read() or FLAC__metadata_chain_read_ogg() and - * check the status. - * - Optionally, consolidate the padding using - * FLAC__metadata_chain_merge_padding() or - * FLAC__metadata_chain_sort_padding(). - * - Create a new iterator using FLAC__metadata_iterator_new() - * - Initialize the iterator to point to the first element in the chain - * using FLAC__metadata_iterator_init() - * - Traverse the chain using FLAC__metadata_iterator_next and - * FLAC__metadata_iterator_prev(). - * - Get a block for reading or modification using - * FLAC__metadata_iterator_get_block(). The pointer to the object - * inside the chain is returned, so the block is yours to modify. - * Changes will be reflected in the FLAC file when you write the - * chain. You can also add and delete blocks (see functions below). - * - When done, write out the chain using FLAC__metadata_chain_write(). - * Make sure to read the whole comment to the function below. - * - Delete the chain using FLAC__metadata_chain_delete(). - * - * \note - * Even though the FLAC file is not open while the chain is being - * manipulated, you must not alter the file externally during - * this time. The chain assumes the FLAC file will not change - * between the time of FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg() - * and FLAC__metadata_chain_write(). - * - * \note - * Do not modify the is_last, length, or type fields of returned - * FLAC__StreamMetadata objects. These are managed automatically. - * - * \note - * The metadata objects returned by FLAC__metadata_iterator_get_block() - * are owned by the chain; do not FLAC__metadata_object_delete() them. - * In the same way, blocks passed to FLAC__metadata_iterator_set_block() - * become owned by the chain and they will be deleted when the chain is - * deleted. - * - * \{ - */ - -struct FLAC__Metadata_Chain; -/** The opaque structure definition for the level 2 chain type. - */ -typedef struct FLAC__Metadata_Chain FLAC__Metadata_Chain; - -struct FLAC__Metadata_Iterator; -/** The opaque structure definition for the level 2 iterator type. - */ -typedef struct FLAC__Metadata_Iterator FLAC__Metadata_Iterator; - -typedef enum { - FLAC__METADATA_CHAIN_STATUS_OK = 0, - /**< The chain is in the normal OK state */ - - FLAC__METADATA_CHAIN_STATUS_ILLEGAL_INPUT, - /**< The data passed into a function violated the function's usage criteria */ - - FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE, - /**< The chain could not open the target file */ - - FLAC__METADATA_CHAIN_STATUS_NOT_A_FLAC_FILE, - /**< The chain could not find the FLAC signature at the start of the file */ - - FLAC__METADATA_CHAIN_STATUS_NOT_WRITABLE, - /**< The chain tried to write to a file that was not writable */ - - FLAC__METADATA_CHAIN_STATUS_BAD_METADATA, - /**< The chain encountered input that does not conform to the FLAC metadata specification */ - - FLAC__METADATA_CHAIN_STATUS_READ_ERROR, - /**< The chain encountered an error while reading the FLAC file */ - - FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR, - /**< The chain encountered an error while seeking in the FLAC file */ - - FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR, - /**< The chain encountered an error while writing the FLAC file */ - - FLAC__METADATA_CHAIN_STATUS_RENAME_ERROR, - /**< The chain encountered an error renaming the FLAC file */ - - FLAC__METADATA_CHAIN_STATUS_UNLINK_ERROR, - /**< The chain encountered an error removing the temporary file */ - - FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR, - /**< Memory allocation failed */ - - FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR, - /**< The caller violated an assertion or an unexpected error occurred */ - - FLAC__METADATA_CHAIN_STATUS_INVALID_CALLBACKS, - /**< One or more of the required callbacks was NULL */ - - FLAC__METADATA_CHAIN_STATUS_READ_WRITE_MISMATCH, - /**< FLAC__metadata_chain_write() was called on a chain read by - * FLAC__metadata_chain_read_with_callbacks()/FLAC__metadata_chain_read_ogg_with_callbacks(), - * or - * FLAC__metadata_chain_write_with_callbacks()/FLAC__metadata_chain_write_with_callbacks_and_tempfile() - * was called on a chain read by - * FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg(). - * Matching read/write methods must always be used. */ - - FLAC__METADATA_CHAIN_STATUS_WRONG_WRITE_CALL - /**< FLAC__metadata_chain_write_with_callbacks() was called when the - * chain write requires a tempfile; use - * FLAC__metadata_chain_write_with_callbacks_and_tempfile() instead. - * Or, FLAC__metadata_chain_write_with_callbacks_and_tempfile() was - * called when the chain write does not require a tempfile; use - * FLAC__metadata_chain_write_with_callbacks() instead. - * Always check FLAC__metadata_chain_check_if_tempfile_needed() - * before writing via callbacks. */ - -} FLAC__Metadata_ChainStatus; - -/** Maps a FLAC__Metadata_ChainStatus to a C string. - * - * Using a FLAC__Metadata_ChainStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__Metadata_ChainStatusString[]; - -/*********** FLAC__Metadata_Chain ***********/ - -/** Create a new chain instance. - * - * \retval FLAC__Metadata_Chain* - * \c NULL if there was an error allocating memory, else the new instance. - */ -FLAC_API FLAC__Metadata_Chain *FLAC__metadata_chain_new(void); - -/** Free a chain instance. Deletes the object pointed to by \a chain. - * - * \param chain A pointer to an existing chain. - * \assert - * \code chain != NULL \endcode - */ -FLAC_API void FLAC__metadata_chain_delete(FLAC__Metadata_Chain *chain); - -/** Get the current status of the chain. Call this after a function - * returns \c false to get the reason for the error. Also resets the - * status to FLAC__METADATA_CHAIN_STATUS_OK. - * - * \param chain A pointer to an existing chain. - * \assert - * \code chain != NULL \endcode - * \retval FLAC__Metadata_ChainStatus - * The current status of the chain. - */ -FLAC_API FLAC__Metadata_ChainStatus FLAC__metadata_chain_status(FLAC__Metadata_Chain *chain); - -/** Read all metadata from a FLAC file into the chain. - * - * \param chain A pointer to an existing chain. - * \param filename The path to the FLAC file to read. - * \assert - * \code chain != NULL \endcode - * \code filename != NULL \endcode - * \retval FLAC__bool - * \c true if a valid list of metadata blocks was read from - * \a filename, else \c false. On failure, check the status with - * FLAC__metadata_chain_status(). - */ -FLAC_API FLAC__bool FLAC__metadata_chain_read(FLAC__Metadata_Chain *chain, const char *filename); - -/** Read all metadata from an Ogg FLAC file into the chain. - * - * \note Ogg FLAC metadata data writing is not supported yet and - * FLAC__metadata_chain_write() will fail. - * - * \param chain A pointer to an existing chain. - * \param filename The path to the Ogg FLAC file to read. - * \assert - * \code chain != NULL \endcode - * \code filename != NULL \endcode - * \retval FLAC__bool - * \c true if a valid list of metadata blocks was read from - * \a filename, else \c false. On failure, check the status with - * FLAC__metadata_chain_status(). - */ -FLAC_API FLAC__bool FLAC__metadata_chain_read_ogg(FLAC__Metadata_Chain *chain, const char *filename); - -/** Read all metadata from a FLAC stream into the chain via I/O callbacks. - * - * The \a handle need only be open for reading, but must be seekable. - * The equivalent minimum stdio fopen() file mode is \c "r" (or \c "rb" - * for Windows). - * - * \param chain A pointer to an existing chain. - * \param handle The I/O handle of the FLAC stream to read. The - * handle will NOT be closed after the metadata is read; - * that is the duty of the caller. - * \param callbacks - * A set of callbacks to use for I/O. The mandatory - * callbacks are \a read, \a seek, and \a tell. - * \assert - * \code chain != NULL \endcode - * \retval FLAC__bool - * \c true if a valid list of metadata blocks was read from - * \a handle, else \c false. On failure, check the status with - * FLAC__metadata_chain_status(). - */ -FLAC_API FLAC__bool FLAC__metadata_chain_read_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks); - -/** Read all metadata from an Ogg FLAC stream into the chain via I/O callbacks. - * - * The \a handle need only be open for reading, but must be seekable. - * The equivalent minimum stdio fopen() file mode is \c "r" (or \c "rb" - * for Windows). - * - * \note Ogg FLAC metadata data writing is not supported yet and - * FLAC__metadata_chain_write() will fail. - * - * \param chain A pointer to an existing chain. - * \param handle The I/O handle of the Ogg FLAC stream to read. The - * handle will NOT be closed after the metadata is read; - * that is the duty of the caller. - * \param callbacks - * A set of callbacks to use for I/O. The mandatory - * callbacks are \a read, \a seek, and \a tell. - * \assert - * \code chain != NULL \endcode - * \retval FLAC__bool - * \c true if a valid list of metadata blocks was read from - * \a handle, else \c false. On failure, check the status with - * FLAC__metadata_chain_status(). - */ -FLAC_API FLAC__bool FLAC__metadata_chain_read_ogg_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks); - -/** Checks if writing the given chain would require the use of a - * temporary file, or if it could be written in place. - * - * Under certain conditions, padding can be utilized so that writing - * edited metadata back to the FLAC file does not require rewriting the - * entire file. If rewriting is required, then a temporary workfile is - * required. When writing metadata using callbacks, you must check - * this function to know whether to call - * FLAC__metadata_chain_write_with_callbacks() or - * FLAC__metadata_chain_write_with_callbacks_and_tempfile(). When - * writing with FLAC__metadata_chain_write(), the temporary file is - * handled internally. - * - * \param chain A pointer to an existing chain. - * \param use_padding - * Whether or not padding will be allowed to be used - * during the write. The value of \a use_padding given - * here must match the value later passed to - * FLAC__metadata_chain_write_with_callbacks() or - * FLAC__metadata_chain_write_with_callbacks_with_tempfile(). - * \assert - * \code chain != NULL \endcode - * \retval FLAC__bool - * \c true if writing the current chain would require a tempfile, or - * \c false if metadata can be written in place. - */ -FLAC_API FLAC__bool FLAC__metadata_chain_check_if_tempfile_needed(FLAC__Metadata_Chain *chain, FLAC__bool use_padding); - -/** Write all metadata out to the FLAC file. This function tries to be as - * efficient as possible; how the metadata is actually written is shown by - * the following: - * - * If the current chain is the same size as the existing metadata, the new - * data is written in place. - * - * If the current chain is longer than the existing metadata, and - * \a use_padding is \c true, and the last block is a PADDING block of - * sufficient length, the function will truncate the final padding block - * so that the overall size of the metadata is the same as the existing - * metadata, and then just rewrite the metadata. Otherwise, if not all of - * the above conditions are met, the entire FLAC file must be rewritten. - * If you want to use padding this way it is a good idea to call - * FLAC__metadata_chain_sort_padding() first so that you have the maximum - * amount of padding to work with, unless you need to preserve ordering - * of the PADDING blocks for some reason. - * - * If the current chain is shorter than the existing metadata, and - * \a use_padding is \c true, and the final block is a PADDING block, the padding - * is extended to make the overall size the same as the existing data. If - * \a use_padding is \c true and the last block is not a PADDING block, a new - * PADDING block is added to the end of the new data to make it the same - * size as the existing data (if possible, see the note to - * FLAC__metadata_simple_iterator_set_block() about the four byte limit) - * and the new data is written in place. If none of the above apply or - * \a use_padding is \c false, the entire FLAC file is rewritten. - * - * If \a preserve_file_stats is \c true, the owner and modification time will - * be preserved even if the FLAC file is written. - * - * For this write function to be used, the chain must have been read with - * FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg(), not - * FLAC__metadata_chain_read_with_callbacks()/FLAC__metadata_chain_read_ogg_with_callbacks(). - * - * \param chain A pointer to an existing chain. - * \param use_padding See above. - * \param preserve_file_stats See above. - * \assert - * \code chain != NULL \endcode - * \retval FLAC__bool - * \c true if the write succeeded, else \c false. On failure, - * check the status with FLAC__metadata_chain_status(). - */ -FLAC_API FLAC__bool FLAC__metadata_chain_write(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__bool preserve_file_stats); - -/** Write all metadata out to a FLAC stream via callbacks. - * - * (See FLAC__metadata_chain_write() for the details on how padding is - * used to write metadata in place if possible.) - * - * The \a handle must be open for updating and be seekable. The - * equivalent minimum stdio fopen() file mode is \c "r+" (or \c "r+b" - * for Windows). - * - * For this write function to be used, the chain must have been read with - * FLAC__metadata_chain_read_with_callbacks()/FLAC__metadata_chain_read_ogg_with_callbacks(), - * not FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg(). - * Also, FLAC__metadata_chain_check_if_tempfile_needed() must have returned - * \c false. - * - * \param chain A pointer to an existing chain. - * \param use_padding See FLAC__metadata_chain_write() - * \param handle The I/O handle of the FLAC stream to write. The - * handle will NOT be closed after the metadata is - * written; that is the duty of the caller. - * \param callbacks A set of callbacks to use for I/O. The mandatory - * callbacks are \a write and \a seek. - * \assert - * \code chain != NULL \endcode - * \retval FLAC__bool - * \c true if the write succeeded, else \c false. On failure, - * check the status with FLAC__metadata_chain_status(). - */ -FLAC_API FLAC__bool FLAC__metadata_chain_write_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks); - -/** Write all metadata out to a FLAC stream via callbacks. - * - * (See FLAC__metadata_chain_write() for the details on how padding is - * used to write metadata in place if possible.) - * - * This version of the write-with-callbacks function must be used when - * FLAC__metadata_chain_check_if_tempfile_needed() returns true. In - * this function, you must supply an I/O handle corresponding to the - * FLAC file to edit, and a temporary handle to which the new FLAC - * file will be written. It is the caller's job to move this temporary - * FLAC file on top of the original FLAC file to complete the metadata - * edit. - * - * The \a handle must be open for reading and be seekable. The - * equivalent minimum stdio fopen() file mode is \c "r" (or \c "rb" - * for Windows). - * - * The \a temp_handle must be open for writing. The - * equivalent minimum stdio fopen() file mode is \c "w" (or \c "wb" - * for Windows). It should be an empty stream, or at least positioned - * at the start-of-file (in which case it is the caller's duty to - * truncate it on return). - * - * For this write function to be used, the chain must have been read with - * FLAC__metadata_chain_read_with_callbacks()/FLAC__metadata_chain_read_ogg_with_callbacks(), - * not FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg(). - * Also, FLAC__metadata_chain_check_if_tempfile_needed() must have returned - * \c true. - * - * \param chain A pointer to an existing chain. - * \param use_padding See FLAC__metadata_chain_write() - * \param handle The I/O handle of the original FLAC stream to read. - * The handle will NOT be closed after the metadata is - * written; that is the duty of the caller. - * \param callbacks A set of callbacks to use for I/O on \a handle. - * The mandatory callbacks are \a read, \a seek, and - * \a eof. - * \param temp_handle The I/O handle of the FLAC stream to write. The - * handle will NOT be closed after the metadata is - * written; that is the duty of the caller. - * \param temp_callbacks - * A set of callbacks to use for I/O on temp_handle. - * The only mandatory callback is \a write. - * \assert - * \code chain != NULL \endcode - * \retval FLAC__bool - * \c true if the write succeeded, else \c false. On failure, - * check the status with FLAC__metadata_chain_status(). - */ -FLAC_API FLAC__bool FLAC__metadata_chain_write_with_callbacks_and_tempfile(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks, FLAC__IOHandle temp_handle, FLAC__IOCallbacks temp_callbacks); - -/** Merge adjacent PADDING blocks into a single block. - * - * \note This function does not write to the FLAC file, it only - * modifies the chain. - * - * \warning Any iterator on the current chain will become invalid after this - * call. You should delete the iterator and get a new one. - * - * \param chain A pointer to an existing chain. - * \assert - * \code chain != NULL \endcode - */ -FLAC_API void FLAC__metadata_chain_merge_padding(FLAC__Metadata_Chain *chain); - -/** This function will move all PADDING blocks to the end on the metadata, - * then merge them into a single block. - * - * \note This function does not write to the FLAC file, it only - * modifies the chain. - * - * \warning Any iterator on the current chain will become invalid after this - * call. You should delete the iterator and get a new one. - * - * \param chain A pointer to an existing chain. - * \assert - * \code chain != NULL \endcode - */ -FLAC_API void FLAC__metadata_chain_sort_padding(FLAC__Metadata_Chain *chain); - - -/*********** FLAC__Metadata_Iterator ***********/ - -/** Create a new iterator instance. - * - * \retval FLAC__Metadata_Iterator* - * \c NULL if there was an error allocating memory, else the new instance. - */ -FLAC_API FLAC__Metadata_Iterator *FLAC__metadata_iterator_new(void); - -/** Free an iterator instance. Deletes the object pointed to by \a iterator. - * - * \param iterator A pointer to an existing iterator. - * \assert - * \code iterator != NULL \endcode - */ -FLAC_API void FLAC__metadata_iterator_delete(FLAC__Metadata_Iterator *iterator); - -/** Initialize the iterator to point to the first metadata block in the - * given chain. - * - * \param iterator A pointer to an existing iterator. - * \param chain A pointer to an existing and initialized (read) chain. - * \assert - * \code iterator != NULL \endcode - * \code chain != NULL \endcode - */ -FLAC_API void FLAC__metadata_iterator_init(FLAC__Metadata_Iterator *iterator, FLAC__Metadata_Chain *chain); - -/** Moves the iterator forward one metadata block, returning \c false if - * already at the end. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_iterator_init() - * \retval FLAC__bool - * \c false if already at the last metadata block of the chain, else - * \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_iterator_next(FLAC__Metadata_Iterator *iterator); - -/** Moves the iterator backward one metadata block, returning \c false if - * already at the beginning. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_iterator_init() - * \retval FLAC__bool - * \c false if already at the first metadata block of the chain, else - * \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_iterator_prev(FLAC__Metadata_Iterator *iterator); - -/** Get the type of the metadata block at the current position. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_iterator_init() - * \retval FLAC__MetadataType - * The type of the metadata block at the current iterator position. - */ -FLAC_API FLAC__MetadataType FLAC__metadata_iterator_get_block_type(const FLAC__Metadata_Iterator *iterator); - -/** Get the metadata block at the current position. You can modify - * the block in place but must write the chain before the changes - * are reflected to the FLAC file. You do not need to call - * FLAC__metadata_iterator_set_block() to reflect the changes; - * the pointer returned by FLAC__metadata_iterator_get_block() - * points directly into the chain. - * - * \warning - * Do not call FLAC__metadata_object_delete() on the returned object; - * to delete a block use FLAC__metadata_iterator_delete_block(). - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_iterator_init() - * \retval FLAC__StreamMetadata* - * The current metadata block. - */ -FLAC_API FLAC__StreamMetadata *FLAC__metadata_iterator_get_block(FLAC__Metadata_Iterator *iterator); - -/** Set the metadata block at the current position, replacing the existing - * block. The new block passed in becomes owned by the chain and it will be - * deleted when the chain is deleted. - * - * \param iterator A pointer to an existing initialized iterator. - * \param block A pointer to a metadata block. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_iterator_init() - * \code block != NULL \endcode - * \retval FLAC__bool - * \c false if the conditions in the above description are not met, or - * a memory allocation error occurs, otherwise \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_iterator_set_block(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block); - -/** Removes the current block from the chain. If \a replace_with_padding is - * \c true, the block will instead be replaced with a padding block of equal - * size. You can not delete the STREAMINFO block. The iterator will be - * left pointing to the block before the one just "deleted", even if - * \a replace_with_padding is \c true. - * - * \param iterator A pointer to an existing initialized iterator. - * \param replace_with_padding See above. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_iterator_init() - * \retval FLAC__bool - * \c false if the conditions in the above description are not met, - * otherwise \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_iterator_delete_block(FLAC__Metadata_Iterator *iterator, FLAC__bool replace_with_padding); - -/** Insert a new block before the current block. You cannot insert a block - * before the first STREAMINFO block. You cannot insert a STREAMINFO block - * as there can be only one, the one that already exists at the head when you - * read in a chain. The chain takes ownership of the new block and it will be - * deleted when the chain is deleted. The iterator will be left pointing to - * the new block. - * - * \param iterator A pointer to an existing initialized iterator. - * \param block A pointer to a metadata block to insert. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_iterator_init() - * \retval FLAC__bool - * \c false if the conditions in the above description are not met, or - * a memory allocation error occurs, otherwise \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_iterator_insert_block_before(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block); - -/** Insert a new block after the current block. You cannot insert a STREAMINFO - * block as there can be only one, the one that already exists at the head when - * you read in a chain. The chain takes ownership of the new block and it will - * be deleted when the chain is deleted. The iterator will be left pointing to - * the new block. - * - * \param iterator A pointer to an existing initialized iterator. - * \param block A pointer to a metadata block to insert. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_iterator_init() - * \retval FLAC__bool - * \c false if the conditions in the above description are not met, or - * a memory allocation error occurs, otherwise \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_iterator_insert_block_after(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block); - -/* \} */ - - -/** \defgroup flac_metadata_object FLAC/metadata.h: metadata object methods - * \ingroup flac_metadata - * - * \brief - * This module contains methods for manipulating FLAC metadata objects. - * - * Since many are variable length we have to be careful about the memory - * management. We decree that all pointers to data in the object are - * owned by the object and memory-managed by the object. - * - * Use the FLAC__metadata_object_new() and FLAC__metadata_object_delete() - * functions to create all instances. When using the - * FLAC__metadata_object_set_*() functions to set pointers to data, set - * \a copy to \c true to have the function make it's own copy of the data, or - * to \c false to give the object ownership of your data. In the latter case - * your pointer must be freeable by free() and will be free()d when the object - * is FLAC__metadata_object_delete()d. It is legal to pass a null pointer as - * the data pointer to a FLAC__metadata_object_set_*() function as long as - * the length argument is 0 and the \a copy argument is \c false. - * - * The FLAC__metadata_object_new() and FLAC__metadata_object_clone() function - * will return \c NULL in the case of a memory allocation error, otherwise a new - * object. The FLAC__metadata_object_set_*() functions return \c false in the - * case of a memory allocation error. - * - * We don't have the convenience of C++ here, so note that the library relies - * on you to keep the types straight. In other words, if you pass, for - * example, a FLAC__StreamMetadata* that represents a STREAMINFO block to - * FLAC__metadata_object_application_set_data(), you will get an assertion - * failure. - * - * For convenience the FLAC__metadata_object_vorbiscomment_*() functions - * maintain a trailing NUL on each Vorbis comment entry. This is not counted - * toward the length or stored in the stream, but it can make working with plain - * comments (those that don't contain embedded-NULs in the value) easier. - * Entries passed into these functions have trailing NULs added if missing, and - * returned entries are guaranteed to have a trailing NUL. - * - * The FLAC__metadata_object_vorbiscomment_*() functions that take a Vorbis - * comment entry/name/value will first validate that it complies with the Vorbis - * comment specification and return false if it does not. - * - * There is no need to recalculate the length field on metadata blocks you - * have modified. They will be calculated automatically before they are - * written back to a file. - * - * \{ - */ - - -/** Create a new metadata object instance of the given type. - * - * The object will be "empty"; i.e. values and data pointers will be \c 0, - * with the exception of FLAC__METADATA_TYPE_VORBIS_COMMENT, which will have - * the vendor string set (but zero comments). - * - * Do not pass in a value greater than or equal to - * \a FLAC__METADATA_TYPE_UNDEFINED unless you really know what you're - * doing. - * - * \param type Type of object to create - * \retval FLAC__StreamMetadata* - * \c NULL if there was an error allocating memory or the type code is - * greater than FLAC__MAX_METADATA_TYPE_CODE, else the new instance. - */ -FLAC_API FLAC__StreamMetadata *FLAC__metadata_object_new(FLAC__MetadataType type); - -/** Create a copy of an existing metadata object. - * - * The copy is a "deep" copy, i.e. dynamically allocated data within the - * object is also copied. The caller takes ownership of the new block and - * is responsible for freeing it with FLAC__metadata_object_delete(). - * - * \param object Pointer to object to copy. - * \assert - * \code object != NULL \endcode - * \retval FLAC__StreamMetadata* - * \c NULL if there was an error allocating memory, else the new instance. - */ -FLAC_API FLAC__StreamMetadata *FLAC__metadata_object_clone(const FLAC__StreamMetadata *object); - -/** Free a metadata object. Deletes the object pointed to by \a object. - * - * The delete is a "deep" delete, i.e. dynamically allocated data within the - * object is also deleted. - * - * \param object A pointer to an existing object. - * \assert - * \code object != NULL \endcode - */ -FLAC_API void FLAC__metadata_object_delete(FLAC__StreamMetadata *object); - -/** Compares two metadata objects. - * - * The compare is "deep", i.e. dynamically allocated data within the - * object is also compared. - * - * \param block1 A pointer to an existing object. - * \param block2 A pointer to an existing object. - * \assert - * \code block1 != NULL \endcode - * \code block2 != NULL \endcode - * \retval FLAC__bool - * \c true if objects are identical, else \c false. - */ -FLAC_API FLAC__bool FLAC__metadata_object_is_equal(const FLAC__StreamMetadata *block1, const FLAC__StreamMetadata *block2); - -/** Sets the application data of an APPLICATION block. - * - * If \a copy is \c true, a copy of the data is stored; otherwise, the object - * takes ownership of the pointer. The existing data will be freed if this - * function is successful, otherwise the original data will remain if \a copy - * is \c true and malloc() fails. - * - * \note It is safe to pass a const pointer to \a data if \a copy is \c true. - * - * \param object A pointer to an existing APPLICATION object. - * \param data A pointer to the data to set. - * \param length The length of \a data in bytes. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_APPLICATION \endcode - * \code (data != NULL && length > 0) || - * (data == NULL && length == 0 && copy == false) \endcode - * \retval FLAC__bool - * \c false if \a copy is \c true and malloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_application_set_data(FLAC__StreamMetadata *object, FLAC__byte *data, unsigned length, FLAC__bool copy); - -/** Resize the seekpoint array. - * - * If the size shrinks, elements will truncated; if it grows, new placeholder - * points will be added to the end. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param new_num_points The desired length of the array; may be \c 0. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \code (object->data.seek_table.points == NULL && object->data.seek_table.num_points == 0) || - * (object->data.seek_table.points != NULL && object->data.seek_table.num_points > 0) \endcode - * \retval FLAC__bool - * \c false if memory allocation error, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_seektable_resize_points(FLAC__StreamMetadata *object, unsigned new_num_points); - -/** Set a seekpoint in a seektable. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param point_num Index into seekpoint array to set. - * \param point The point to set. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \code object->data.seek_table.num_points > point_num \endcode - */ -FLAC_API void FLAC__metadata_object_seektable_set_point(FLAC__StreamMetadata *object, unsigned point_num, FLAC__StreamMetadata_SeekPoint point); - -/** Insert a seekpoint into a seektable. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param point_num Index into seekpoint array to set. - * \param point The point to set. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \code object->data.seek_table.num_points >= point_num \endcode - * \retval FLAC__bool - * \c false if memory allocation error, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_seektable_insert_point(FLAC__StreamMetadata *object, unsigned point_num, FLAC__StreamMetadata_SeekPoint point); - -/** Delete a seekpoint from a seektable. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param point_num Index into seekpoint array to set. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \code object->data.seek_table.num_points > point_num \endcode - * \retval FLAC__bool - * \c false if memory allocation error, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_seektable_delete_point(FLAC__StreamMetadata *object, unsigned point_num); - -/** Check a seektable to see if it conforms to the FLAC specification. - * See the format specification for limits on the contents of the - * seektable. - * - * \param object A pointer to an existing SEEKTABLE object. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \retval FLAC__bool - * \c false if seek table is illegal, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_seektable_is_legal(const FLAC__StreamMetadata *object); - -/** Append a number of placeholder points to the end of a seek table. - * - * \note - * As with the other ..._seektable_template_... functions, you should - * call FLAC__metadata_object_seektable_template_sort() when finished - * to make the seek table legal. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param num The number of placeholder points to append. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \retval FLAC__bool - * \c false if memory allocation fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_placeholders(FLAC__StreamMetadata *object, unsigned num); - -/** Append a specific seek point template to the end of a seek table. - * - * \note - * As with the other ..._seektable_template_... functions, you should - * call FLAC__metadata_object_seektable_template_sort() when finished - * to make the seek table legal. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param sample_number The sample number of the seek point template. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \retval FLAC__bool - * \c false if memory allocation fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_point(FLAC__StreamMetadata *object, FLAC__uint64 sample_number); - -/** Append specific seek point templates to the end of a seek table. - * - * \note - * As with the other ..._seektable_template_... functions, you should - * call FLAC__metadata_object_seektable_template_sort() when finished - * to make the seek table legal. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param sample_numbers An array of sample numbers for the seek points. - * \param num The number of seek point templates to append. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \retval FLAC__bool - * \c false if memory allocation fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_points(FLAC__StreamMetadata *object, FLAC__uint64 sample_numbers[], unsigned num); - -/** Append a set of evenly-spaced seek point templates to the end of a - * seek table. - * - * \note - * As with the other ..._seektable_template_... functions, you should - * call FLAC__metadata_object_seektable_template_sort() when finished - * to make the seek table legal. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param num The number of placeholder points to append. - * \param total_samples The total number of samples to be encoded; - * the seekpoints will be spaced approximately - * \a total_samples / \a num samples apart. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \code total_samples > 0 \endcode - * \retval FLAC__bool - * \c false if memory allocation fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_spaced_points(FLAC__StreamMetadata *object, unsigned num, FLAC__uint64 total_samples); - -/** Append a set of evenly-spaced seek point templates to the end of a - * seek table. - * - * \note - * As with the other ..._seektable_template_... functions, you should - * call FLAC__metadata_object_seektable_template_sort() when finished - * to make the seek table legal. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param samples The number of samples apart to space the placeholder - * points. The first point will be at sample \c 0, the - * second at sample \a samples, then 2*\a samples, and - * so on. As long as \a samples and \a total_samples - * are greater than \c 0, there will always be at least - * one seekpoint at sample \c 0. - * \param total_samples The total number of samples to be encoded; - * the seekpoints will be spaced - * \a samples samples apart. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \code samples > 0 \endcode - * \code total_samples > 0 \endcode - * \retval FLAC__bool - * \c false if memory allocation fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_spaced_points_by_samples(FLAC__StreamMetadata *object, unsigned samples, FLAC__uint64 total_samples); - -/** Sort a seek table's seek points according to the format specification, - * removing duplicates. - * - * \param object A pointer to a seek table to be sorted. - * \param compact If \c false, behaves like FLAC__format_seektable_sort(). - * If \c true, duplicates are deleted and the seek table is - * shrunk appropriately; the number of placeholder points - * present in the seek table will be the same after the call - * as before. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \retval FLAC__bool - * \c false if realloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_sort(FLAC__StreamMetadata *object, FLAC__bool compact); - -/** Sets the vendor string in a VORBIS_COMMENT block. - * - * For convenience, a trailing NUL is added to the entry if it doesn't have - * one already. - * - * If \a copy is \c true, a copy of the entry is stored; otherwise, the object - * takes ownership of the \c entry.entry pointer. - * - * \note If this function returns \c false, the caller still owns the - * pointer. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param entry The entry to set the vendor string to. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \code (entry.entry != NULL && entry.length > 0) || - * (entry.entry == NULL && entry.length == 0) \endcode - * \retval FLAC__bool - * \c false if memory allocation fails or \a entry does not comply with the - * Vorbis comment specification, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_set_vendor_string(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy); - -/** Resize the comment array. - * - * If the size shrinks, elements will truncated; if it grows, new empty - * fields will be added to the end. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param new_num_comments The desired length of the array; may be \c 0. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \code (object->data.vorbis_comment.comments == NULL && object->data.vorbis_comment.num_comments == 0) || - * (object->data.vorbis_comment.comments != NULL && object->data.vorbis_comment.num_comments > 0) \endcode - * \retval FLAC__bool - * \c false if memory allocation fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_resize_comments(FLAC__StreamMetadata *object, unsigned new_num_comments); - -/** Sets a comment in a VORBIS_COMMENT block. - * - * For convenience, a trailing NUL is added to the entry if it doesn't have - * one already. - * - * If \a copy is \c true, a copy of the entry is stored; otherwise, the object - * takes ownership of the \c entry.entry pointer. - * - * \note If this function returns \c false, the caller still owns the - * pointer. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param comment_num Index into comment array to set. - * \param entry The entry to set the comment to. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \code comment_num < object->data.vorbis_comment.num_comments \endcode - * \code (entry.entry != NULL && entry.length > 0) || - * (entry.entry == NULL && entry.length == 0) \endcode - * \retval FLAC__bool - * \c false if memory allocation fails or \a entry does not comply with the - * Vorbis comment specification, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_set_comment(FLAC__StreamMetadata *object, unsigned comment_num, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy); - -/** Insert a comment in a VORBIS_COMMENT block at the given index. - * - * For convenience, a trailing NUL is added to the entry if it doesn't have - * one already. - * - * If \a copy is \c true, a copy of the entry is stored; otherwise, the object - * takes ownership of the \c entry.entry pointer. - * - * \note If this function returns \c false, the caller still owns the - * pointer. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param comment_num The index at which to insert the comment. The comments - * at and after \a comment_num move right one position. - * To append a comment to the end, set \a comment_num to - * \c object->data.vorbis_comment.num_comments . - * \param entry The comment to insert. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \code object->data.vorbis_comment.num_comments >= comment_num \endcode - * \code (entry.entry != NULL && entry.length > 0) || - * (entry.entry == NULL && entry.length == 0 && copy == false) \endcode - * \retval FLAC__bool - * \c false if memory allocation fails or \a entry does not comply with the - * Vorbis comment specification, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_insert_comment(FLAC__StreamMetadata *object, unsigned comment_num, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy); - -/** Appends a comment to a VORBIS_COMMENT block. - * - * For convenience, a trailing NUL is added to the entry if it doesn't have - * one already. - * - * If \a copy is \c true, a copy of the entry is stored; otherwise, the object - * takes ownership of the \c entry.entry pointer. - * - * \note If this function returns \c false, the caller still owns the - * pointer. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param entry The comment to insert. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \code (entry.entry != NULL && entry.length > 0) || - * (entry.entry == NULL && entry.length == 0 && copy == false) \endcode - * \retval FLAC__bool - * \c false if memory allocation fails or \a entry does not comply with the - * Vorbis comment specification, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_append_comment(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy); - -/** Replaces comments in a VORBIS_COMMENT block with a new one. - * - * For convenience, a trailing NUL is added to the entry if it doesn't have - * one already. - * - * Depending on the the value of \a all, either all or just the first comment - * whose field name(s) match the given entry's name will be replaced by the - * given entry. If no comments match, \a entry will simply be appended. - * - * If \a copy is \c true, a copy of the entry is stored; otherwise, the object - * takes ownership of the \c entry.entry pointer. - * - * \note If this function returns \c false, the caller still owns the - * pointer. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param entry The comment to insert. - * \param all If \c true, all comments whose field name matches - * \a entry's field name will be removed, and \a entry will - * be inserted at the position of the first matching - * comment. If \c false, only the first comment whose - * field name matches \a entry's field name will be - * replaced with \a entry. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \code (entry.entry != NULL && entry.length > 0) || - * (entry.entry == NULL && entry.length == 0 && copy == false) \endcode - * \retval FLAC__bool - * \c false if memory allocation fails or \a entry does not comply with the - * Vorbis comment specification, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_replace_comment(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool all, FLAC__bool copy); - -/** Delete a comment in a VORBIS_COMMENT block at the given index. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param comment_num The index of the comment to delete. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \code object->data.vorbis_comment.num_comments > comment_num \endcode - * \retval FLAC__bool - * \c false if realloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_delete_comment(FLAC__StreamMetadata *object, unsigned comment_num); - -/** Creates a Vorbis comment entry from NUL-terminated name and value strings. - * - * On return, the filled-in \a entry->entry pointer will point to malloc()ed - * memory and shall be owned by the caller. For convenience the entry will - * have a terminating NUL. - * - * \param entry A pointer to a Vorbis comment entry. The entry's - * \c entry pointer should not point to allocated - * memory as it will be overwritten. - * \param field_name The field name in ASCII, \c NUL terminated. - * \param field_value The field value in UTF-8, \c NUL terminated. - * \assert - * \code entry != NULL \endcode - * \code field_name != NULL \endcode - * \code field_value != NULL \endcode - * \retval FLAC__bool - * \c false if malloc() fails, or if \a field_name or \a field_value does - * not comply with the Vorbis comment specification, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_from_name_value_pair(FLAC__StreamMetadata_VorbisComment_Entry *entry, const char *field_name, const char *field_value); - -/** Splits a Vorbis comment entry into NUL-terminated name and value strings. - * - * The returned pointers to name and value will be allocated by malloc() - * and shall be owned by the caller. - * - * \param entry An existing Vorbis comment entry. - * \param field_name The address of where the returned pointer to the - * field name will be stored. - * \param field_value The address of where the returned pointer to the - * field value will be stored. - * \assert - * \code (entry.entry != NULL && entry.length > 0) \endcode - * \code memchr(entry.entry, '=', entry.length) != NULL \endcode - * \code field_name != NULL \endcode - * \code field_value != NULL \endcode - * \retval FLAC__bool - * \c false if memory allocation fails or \a entry does not comply with the - * Vorbis comment specification, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_to_name_value_pair(const FLAC__StreamMetadata_VorbisComment_Entry entry, char **field_name, char **field_value); - -/** Check if the given Vorbis comment entry's field name matches the given - * field name. - * - * \param entry An existing Vorbis comment entry. - * \param field_name The field name to check. - * \param field_name_length The length of \a field_name, not including the - * terminating \c NUL. - * \assert - * \code (entry.entry != NULL && entry.length > 0) \endcode - * \retval FLAC__bool - * \c true if the field names match, else \c false - */ -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_matches(const FLAC__StreamMetadata_VorbisComment_Entry entry, const char *field_name, unsigned field_name_length); - -/** Find a Vorbis comment with the given field name. - * - * The search begins at entry number \a offset; use an offset of 0 to - * search from the beginning of the comment array. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param offset The offset into the comment array from where to start - * the search. - * \param field_name The field name of the comment to find. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \code field_name != NULL \endcode - * \retval int - * The offset in the comment array of the first comment whose field - * name matches \a field_name, or \c -1 if no match was found. - */ -FLAC_API int FLAC__metadata_object_vorbiscomment_find_entry_from(const FLAC__StreamMetadata *object, unsigned offset, const char *field_name); - -/** Remove first Vorbis comment matching the given field name. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param field_name The field name of comment to delete. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \retval int - * \c -1 for memory allocation error, \c 0 for no matching entries, - * \c 1 for one matching entry deleted. - */ -FLAC_API int FLAC__metadata_object_vorbiscomment_remove_entry_matching(FLAC__StreamMetadata *object, const char *field_name); - -/** Remove all Vorbis comments matching the given field name. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param field_name The field name of comments to delete. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \retval int - * \c -1 for memory allocation error, \c 0 for no matching entries, - * else the number of matching entries deleted. - */ -FLAC_API int FLAC__metadata_object_vorbiscomment_remove_entries_matching(FLAC__StreamMetadata *object, const char *field_name); - -/** Create a new CUESHEET track instance. - * - * The object will be "empty"; i.e. values and data pointers will be \c 0. - * - * \retval FLAC__StreamMetadata_CueSheet_Track* - * \c NULL if there was an error allocating memory, else the new instance. - */ -FLAC_API FLAC__StreamMetadata_CueSheet_Track *FLAC__metadata_object_cuesheet_track_new(void); - -/** Create a copy of an existing CUESHEET track object. - * - * The copy is a "deep" copy, i.e. dynamically allocated data within the - * object is also copied. The caller takes ownership of the new object and - * is responsible for freeing it with - * FLAC__metadata_object_cuesheet_track_delete(). - * - * \param object Pointer to object to copy. - * \assert - * \code object != NULL \endcode - * \retval FLAC__StreamMetadata_CueSheet_Track* - * \c NULL if there was an error allocating memory, else the new instance. - */ -FLAC_API FLAC__StreamMetadata_CueSheet_Track *FLAC__metadata_object_cuesheet_track_clone(const FLAC__StreamMetadata_CueSheet_Track *object); - -/** Delete a CUESHEET track object - * - * \param object A pointer to an existing CUESHEET track object. - * \assert - * \code object != NULL \endcode - */ -FLAC_API void FLAC__metadata_object_cuesheet_track_delete(FLAC__StreamMetadata_CueSheet_Track *object); - -/** Resize a track's index point array. - * - * If the size shrinks, elements will truncated; if it grows, new blank - * indices will be added to the end. - * - * \param object A pointer to an existing CUESHEET object. - * \param track_num The index of the track to modify. NOTE: this is not - * necessarily the same as the track's \a number field. - * \param new_num_indices The desired length of the array; may be \c 0. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code object->data.cue_sheet.num_tracks > track_num \endcode - * \code (object->data.cue_sheet.tracks[track_num].indices == NULL && object->data.cue_sheet.tracks[track_num].num_indices == 0) || - * (object->data.cue_sheet.tracks[track_num].indices != NULL && object->data.cue_sheet.tracks[track_num].num_indices > 0) \endcode - * \retval FLAC__bool - * \c false if memory allocation error, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_resize_indices(FLAC__StreamMetadata *object, unsigned track_num, unsigned new_num_indices); - -/** Insert an index point in a CUESHEET track at the given index. - * - * \param object A pointer to an existing CUESHEET object. - * \param track_num The index of the track to modify. NOTE: this is not - * necessarily the same as the track's \a number field. - * \param index_num The index into the track's index array at which to - * insert the index point. NOTE: this is not necessarily - * the same as the index point's \a number field. The - * indices at and after \a index_num move right one - * position. To append an index point to the end, set - * \a index_num to - * \c object->data.cue_sheet.tracks[track_num].num_indices . - * \param index The index point to insert. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code object->data.cue_sheet.num_tracks > track_num \endcode - * \code object->data.cue_sheet.tracks[track_num].num_indices >= index_num \endcode - * \retval FLAC__bool - * \c false if realloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_insert_index(FLAC__StreamMetadata *object, unsigned track_num, unsigned index_num, FLAC__StreamMetadata_CueSheet_Index index); - -/** Insert a blank index point in a CUESHEET track at the given index. - * - * A blank index point is one in which all field values are zero. - * - * \param object A pointer to an existing CUESHEET object. - * \param track_num The index of the track to modify. NOTE: this is not - * necessarily the same as the track's \a number field. - * \param index_num The index into the track's index array at which to - * insert the index point. NOTE: this is not necessarily - * the same as the index point's \a number field. The - * indices at and after \a index_num move right one - * position. To append an index point to the end, set - * \a index_num to - * \c object->data.cue_sheet.tracks[track_num].num_indices . - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code object->data.cue_sheet.num_tracks > track_num \endcode - * \code object->data.cue_sheet.tracks[track_num].num_indices >= index_num \endcode - * \retval FLAC__bool - * \c false if realloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_insert_blank_index(FLAC__StreamMetadata *object, unsigned track_num, unsigned index_num); - -/** Delete an index point in a CUESHEET track at the given index. - * - * \param object A pointer to an existing CUESHEET object. - * \param track_num The index into the track array of the track to - * modify. NOTE: this is not necessarily the same - * as the track's \a number field. - * \param index_num The index into the track's index array of the index - * to delete. NOTE: this is not necessarily the same - * as the index's \a number field. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code object->data.cue_sheet.num_tracks > track_num \endcode - * \code object->data.cue_sheet.tracks[track_num].num_indices > index_num \endcode - * \retval FLAC__bool - * \c false if realloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_delete_index(FLAC__StreamMetadata *object, unsigned track_num, unsigned index_num); - -/** Resize the track array. - * - * If the size shrinks, elements will truncated; if it grows, new blank - * tracks will be added to the end. - * - * \param object A pointer to an existing CUESHEET object. - * \param new_num_tracks The desired length of the array; may be \c 0. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code (object->data.cue_sheet.tracks == NULL && object->data.cue_sheet.num_tracks == 0) || - * (object->data.cue_sheet.tracks != NULL && object->data.cue_sheet.num_tracks > 0) \endcode - * \retval FLAC__bool - * \c false if memory allocation error, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_resize_tracks(FLAC__StreamMetadata *object, unsigned new_num_tracks); - -/** Sets a track in a CUESHEET block. - * - * If \a copy is \c true, a copy of the track is stored; otherwise, the object - * takes ownership of the \a track pointer. - * - * \param object A pointer to an existing CUESHEET object. - * \param track_num Index into track array to set. NOTE: this is not - * necessarily the same as the track's \a number field. - * \param track The track to set the track to. You may safely pass in - * a const pointer if \a copy is \c true. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code track_num < object->data.cue_sheet.num_tracks \endcode - * \code (track->indices != NULL && track->num_indices > 0) || - * (track->indices == NULL && track->num_indices == 0) \endcode - * \retval FLAC__bool - * \c false if \a copy is \c true and malloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_set_track(FLAC__StreamMetadata *object, unsigned track_num, FLAC__StreamMetadata_CueSheet_Track *track, FLAC__bool copy); - -/** Insert a track in a CUESHEET block at the given index. - * - * If \a copy is \c true, a copy of the track is stored; otherwise, the object - * takes ownership of the \a track pointer. - * - * \param object A pointer to an existing CUESHEET object. - * \param track_num The index at which to insert the track. NOTE: this - * is not necessarily the same as the track's \a number - * field. The tracks at and after \a track_num move right - * one position. To append a track to the end, set - * \a track_num to \c object->data.cue_sheet.num_tracks . - * \param track The track to insert. You may safely pass in a const - * pointer if \a copy is \c true. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code object->data.cue_sheet.num_tracks >= track_num \endcode - * \retval FLAC__bool - * \c false if \a copy is \c true and malloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_insert_track(FLAC__StreamMetadata *object, unsigned track_num, FLAC__StreamMetadata_CueSheet_Track *track, FLAC__bool copy); - -/** Insert a blank track in a CUESHEET block at the given index. - * - * A blank track is one in which all field values are zero. - * - * \param object A pointer to an existing CUESHEET object. - * \param track_num The index at which to insert the track. NOTE: this - * is not necessarily the same as the track's \a number - * field. The tracks at and after \a track_num move right - * one position. To append a track to the end, set - * \a track_num to \c object->data.cue_sheet.num_tracks . - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code object->data.cue_sheet.num_tracks >= track_num \endcode - * \retval FLAC__bool - * \c false if \a copy is \c true and malloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_insert_blank_track(FLAC__StreamMetadata *object, unsigned track_num); - -/** Delete a track in a CUESHEET block at the given index. - * - * \param object A pointer to an existing CUESHEET object. - * \param track_num The index into the track array of the track to - * delete. NOTE: this is not necessarily the same - * as the track's \a number field. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code object->data.cue_sheet.num_tracks > track_num \endcode - * \retval FLAC__bool - * \c false if realloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_delete_track(FLAC__StreamMetadata *object, unsigned track_num); - -/** Check a cue sheet to see if it conforms to the FLAC specification. - * See the format specification for limits on the contents of the - * cue sheet. - * - * \param object A pointer to an existing CUESHEET object. - * \param check_cd_da_subset If \c true, check CUESHEET against more - * stringent requirements for a CD-DA (audio) disc. - * \param violation Address of a pointer to a string. If there is a - * violation, a pointer to a string explanation of the - * violation will be returned here. \a violation may be - * \c NULL if you don't need the returned string. Do not - * free the returned string; it will always point to static - * data. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \retval FLAC__bool - * \c false if cue sheet is illegal, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_is_legal(const FLAC__StreamMetadata *object, FLAC__bool check_cd_da_subset, const char **violation); - -/** Calculate and return the CDDB/freedb ID for a cue sheet. The function - * assumes the cue sheet corresponds to a CD; the result is undefined - * if the cuesheet's is_cd bit is not set. - * - * \param object A pointer to an existing CUESHEET object. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \retval FLAC__uint32 - * The unsigned integer representation of the CDDB/freedb ID - */ -FLAC_API FLAC__uint32 FLAC__metadata_object_cuesheet_calculate_cddb_id(const FLAC__StreamMetadata *object); - -/** Sets the MIME type of a PICTURE block. - * - * If \a copy is \c true, a copy of the string is stored; otherwise, the object - * takes ownership of the pointer. The existing string will be freed if this - * function is successful, otherwise the original string will remain if \a copy - * is \c true and malloc() fails. - * - * \note It is safe to pass a const pointer to \a mime_type if \a copy is \c true. - * - * \param object A pointer to an existing PICTURE object. - * \param mime_type A pointer to the MIME type string. The string must be - * ASCII characters 0x20-0x7e, NUL-terminated. No validation - * is done. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_PICTURE \endcode - * \code (mime_type != NULL) \endcode - * \retval FLAC__bool - * \c false if \a copy is \c true and malloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_picture_set_mime_type(FLAC__StreamMetadata *object, char *mime_type, FLAC__bool copy); - -/** Sets the description of a PICTURE block. - * - * If \a copy is \c true, a copy of the string is stored; otherwise, the object - * takes ownership of the pointer. The existing string will be freed if this - * function is successful, otherwise the original string will remain if \a copy - * is \c true and malloc() fails. - * - * \note It is safe to pass a const pointer to \a description if \a copy is \c true. - * - * \param object A pointer to an existing PICTURE object. - * \param description A pointer to the description string. The string must be - * valid UTF-8, NUL-terminated. No validation is done. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_PICTURE \endcode - * \code (description != NULL) \endcode - * \retval FLAC__bool - * \c false if \a copy is \c true and malloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_picture_set_description(FLAC__StreamMetadata *object, FLAC__byte *description, FLAC__bool copy); - -/** Sets the picture data of a PICTURE block. - * - * If \a copy is \c true, a copy of the data is stored; otherwise, the object - * takes ownership of the pointer. Also sets the \a data_length field of the - * metadata object to what is passed in as the \a length parameter. The - * existing data will be freed if this function is successful, otherwise the - * original data and data_length will remain if \a copy is \c true and - * malloc() fails. - * - * \note It is safe to pass a const pointer to \a data if \a copy is \c true. - * - * \param object A pointer to an existing PICTURE object. - * \param data A pointer to the data to set. - * \param length The length of \a data in bytes. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_PICTURE \endcode - * \code (data != NULL && length > 0) || - * (data == NULL && length == 0 && copy == false) \endcode - * \retval FLAC__bool - * \c false if \a copy is \c true and malloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_picture_set_data(FLAC__StreamMetadata *object, FLAC__byte *data, FLAC__uint32 length, FLAC__bool copy); - -/** Check a PICTURE block to see if it conforms to the FLAC specification. - * See the format specification for limits on the contents of the - * PICTURE block. - * - * \param object A pointer to existing PICTURE block to be checked. - * \param violation Address of a pointer to a string. If there is a - * violation, a pointer to a string explanation of the - * violation will be returned here. \a violation may be - * \c NULL if you don't need the returned string. Do not - * free the returned string; it will always point to static - * data. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_PICTURE \endcode - * \retval FLAC__bool - * \c false if PICTURE block is illegal, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_picture_is_legal(const FLAC__StreamMetadata *object, const char **violation); - -/* \} */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/ordinals.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/ordinals.h deleted file mode 100644 index b1e1acfc..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/ordinals.h +++ /dev/null @@ -1,86 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 FLAC__ORDINALS_H -#define FLAC__ORDINALS_H - -#if defined(_MSC_VER) && _MSC_VER < 1600 - -/* Microsoft Visual Studio earlier than the 2010 version did not provide - * the 1999 ISO C Standard header file . - */ - -typedef __int8 FLAC__int8; -typedef unsigned __int8 FLAC__uint8; - -typedef __int16 FLAC__int16; -typedef __int32 FLAC__int32; -typedef __int64 FLAC__int64; -typedef unsigned __int16 FLAC__uint16; -typedef unsigned __int32 FLAC__uint32; -typedef unsigned __int64 FLAC__uint64; - -#else - -/* For MSVC 2010 and everything else which provides . */ - -#include - -typedef int8_t FLAC__int8; -typedef uint8_t FLAC__uint8; - -typedef int16_t FLAC__int16; -typedef int32_t FLAC__int32; -typedef int64_t FLAC__int64; -typedef uint16_t FLAC__uint16; -typedef uint32_t FLAC__uint32; -typedef uint64_t FLAC__uint64; - -#endif - -typedef int FLAC__bool; - -typedef FLAC__uint8 FLAC__byte; - - -#ifdef true -#undef true -#endif -#ifdef false -#undef false -#endif -#ifndef __cplusplus -#define true 1 -#define false 0 -#endif - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/bitmath.c b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/bitmath.c deleted file mode 100644 index 5b58ca99..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/bitmath.c +++ /dev/null @@ -1,109 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 -#endif - -#include "private/bitmath.h" - -/* An example of what FLAC__bitmath_silog2() computes: - * - * silog2(-10) = 5 - * silog2(- 9) = 5 - * silog2(- 8) = 4 - * silog2(- 7) = 4 - * silog2(- 6) = 4 - * silog2(- 5) = 4 - * silog2(- 4) = 3 - * silog2(- 3) = 3 - * silog2(- 2) = 2 - * silog2(- 1) = 2 - * silog2( 0) = 0 - * silog2( 1) = 2 - * silog2( 2) = 3 - * silog2( 3) = 3 - * silog2( 4) = 4 - * silog2( 5) = 4 - * silog2( 6) = 4 - * silog2( 7) = 4 - * silog2( 8) = 5 - * silog2( 9) = 5 - * silog2( 10) = 5 - */ -unsigned FLAC__bitmath_silog2(int v) -{ - while(1) { - if(v == 0) { - return 0; - } - else if(v > 0) { - unsigned l = 0; - while(v) { - l++; - v >>= 1; - } - return l+1; - } - else if(v == -1) { - return 2; - } - else { - v++; - v = -v; - } - } -} - -unsigned FLAC__bitmath_silog2_wide(FLAC__int64 v) -{ - while(1) { - if(v == 0) { - return 0; - } - else if(v > 0) { - unsigned l = 0; - while(v) { - l++; - v >>= 1; - } - return l+1; - } - else if(v == -1) { - return 2; - } - else { - v++; - v = -v; - } - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/bitreader.c b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/bitreader.c deleted file mode 100644 index f61229bd..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/bitreader.c +++ /dev/null @@ -1,1059 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 -#endif - -#include -#include -#include "private/bitmath.h" -#include "private/bitreader.h" -#include "private/crc.h" -#include "private/macros.h" -#include "FLAC/assert.h" -#include "share/compat.h" -#include "share/endswap.h" - -/* Things should be fastest when this matches the machine word size */ -/* WATCHOUT: if you change this you must also change the following #defines down to FLAC__clz_uint32 below to match */ -/* WATCHOUT: there are a few places where the code will not work unless uint32_t is >= 32 bits wide */ -/* also, some sections currently only have fast versions for 4 or 8 bytes per word */ -#define FLAC__BYTES_PER_WORD 4 /* sizeof uint32_t */ -#define FLAC__BITS_PER_WORD (8 * FLAC__BYTES_PER_WORD) -#define FLAC__WORD_ALL_ONES ((FLAC__uint32)0xffffffff) -/* SWAP_BE_WORD_TO_HOST swaps bytes in a uint32_t (which is always big-endian) if necessary to match host byte order */ -#if WORDS_BIGENDIAN -#define SWAP_BE_WORD_TO_HOST(x) (x) -#else -#define SWAP_BE_WORD_TO_HOST(x) ENDSWAP_32(x) -#endif - -/* - * This should be at least twice as large as the largest number of words - * required to represent any 'number' (in any encoding) you are going to - * read. With FLAC this is on the order of maybe a few hundred bits. - * If the buffer is smaller than that, the decoder won't be able to read - * in a whole number that is in a variable length encoding (e.g. Rice). - * But to be practical it should be at least 1K bytes. - * - * Increase this number to decrease the number of read callbacks, at the - * expense of using more memory. Or decrease for the reverse effect, - * keeping in mind the limit from the first paragraph. The optimal size - * also depends on the CPU cache size and other factors; some twiddling - * may be necessary to squeeze out the best performance. - */ -static const unsigned FLAC__BITREADER_DEFAULT_CAPACITY = 65536u / FLAC__BITS_PER_WORD; /* in words */ - -struct FLAC__BitReader { - /* any partially-consumed word at the head will stay right-justified as bits are consumed from the left */ - /* any incomplete word at the tail will be left-justified, and bytes from the read callback are added on the right */ - uint32_t *buffer; - unsigned capacity; /* in words */ - unsigned words; /* # of completed words in buffer */ - unsigned bytes; /* # of bytes in incomplete word at buffer[words] */ - unsigned consumed_words; /* #words ... */ - unsigned consumed_bits; /* ... + (#bits of head word) already consumed from the front of buffer */ - unsigned read_crc16; /* the running frame CRC */ - unsigned crc16_align; /* the number of bits in the current consumed word that should not be CRC'd */ - FLAC__BitReaderReadCallback read_callback; - void *client_data; -}; - -static inline void crc16_update_word_(FLAC__BitReader *br, uint32_t word) -{ - register unsigned crc = br->read_crc16; -#if FLAC__BYTES_PER_WORD == 4 - switch(br->crc16_align) { - case 0: crc = FLAC__CRC16_UPDATE((unsigned)(word >> 24), crc); - case 8: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 16) & 0xff), crc); - case 16: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 8) & 0xff), crc); - case 24: br->read_crc16 = FLAC__CRC16_UPDATE((unsigned)(word & 0xff), crc); - } -#elif FLAC__BYTES_PER_WORD == 8 - switch(br->crc16_align) { - case 0: crc = FLAC__CRC16_UPDATE((unsigned)(word >> 56), crc); - case 8: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 48) & 0xff), crc); - case 16: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 40) & 0xff), crc); - case 24: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 32) & 0xff), crc); - case 32: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 24) & 0xff), crc); - case 40: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 16) & 0xff), crc); - case 48: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 8) & 0xff), crc); - case 56: br->read_crc16 = FLAC__CRC16_UPDATE((unsigned)(word & 0xff), crc); - } -#else - for( ; br->crc16_align < FLAC__BITS_PER_WORD; br->crc16_align += 8) - crc = FLAC__CRC16_UPDATE((unsigned)((word >> (FLAC__BITS_PER_WORD-8-br->crc16_align)) & 0xff), crc); - br->read_crc16 = crc; -#endif - br->crc16_align = 0; -} - -static FLAC__bool bitreader_read_from_client_(FLAC__BitReader *br) -{ - unsigned start, end; - size_t bytes; - FLAC__byte *target; - - /* first shift the unconsumed buffer data toward the front as much as possible */ - if(br->consumed_words > 0) { - start = br->consumed_words; - end = br->words + (br->bytes? 1:0); - memmove(br->buffer, br->buffer+start, FLAC__BYTES_PER_WORD * (end - start)); - - br->words -= start; - br->consumed_words = 0; - } - - /* - * set the target for reading, taking into account word alignment and endianness - */ - bytes = (br->capacity - br->words) * FLAC__BYTES_PER_WORD - br->bytes; - if(bytes == 0) - return false; /* no space left, buffer is too small; see note for FLAC__BITREADER_DEFAULT_CAPACITY */ - target = ((FLAC__byte*)(br->buffer+br->words)) + br->bytes; - - /* before reading, if the existing reader looks like this (say uint32_t is 32 bits wide) - * bitstream : 11 22 33 44 55 br->words=1 br->bytes=1 (partial tail word is left-justified) - * buffer[BE]: 11 22 33 44 55 ?? ?? ?? (shown layed out as bytes sequentially in memory) - * buffer[LE]: 44 33 22 11 ?? ?? ?? 55 (?? being don't-care) - * ^^-------target, bytes=3 - * on LE machines, have to byteswap the odd tail word so nothing is - * overwritten: - */ -#if WORDS_BIGENDIAN -#else - if(br->bytes) - br->buffer[br->words] = SWAP_BE_WORD_TO_HOST(br->buffer[br->words]); -#endif - - /* now it looks like: - * bitstream : 11 22 33 44 55 br->words=1 br->bytes=1 - * buffer[BE]: 11 22 33 44 55 ?? ?? ?? - * buffer[LE]: 44 33 22 11 55 ?? ?? ?? - * ^^-------target, bytes=3 - */ - - /* read in the data; note that the callback may return a smaller number of bytes */ - if(!br->read_callback(target, &bytes, br->client_data)) - return false; - - /* after reading bytes 66 77 88 99 AA BB CC DD EE FF from the client: - * bitstream : 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF - * buffer[BE]: 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF ?? - * buffer[LE]: 44 33 22 11 55 66 77 88 99 AA BB CC DD EE FF ?? - * now have to byteswap on LE machines: - */ -#if WORDS_BIGENDIAN -#else - end = (br->words*FLAC__BYTES_PER_WORD + br->bytes + bytes + (FLAC__BYTES_PER_WORD-1)) / FLAC__BYTES_PER_WORD; - for(start = br->words; start < end; start++) - br->buffer[start] = SWAP_BE_WORD_TO_HOST(br->buffer[start]); -#endif - - /* now it looks like: - * bitstream : 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF - * buffer[BE]: 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF ?? - * buffer[LE]: 44 33 22 11 88 77 66 55 CC BB AA 99 ?? FF EE DD - * finally we'll update the reader values: - */ - end = br->words*FLAC__BYTES_PER_WORD + br->bytes + bytes; - br->words = end / FLAC__BYTES_PER_WORD; - br->bytes = end % FLAC__BYTES_PER_WORD; - - return true; -} - -/*********************************************************************** - * - * Class constructor/destructor - * - ***********************************************************************/ - -FLAC__BitReader *FLAC__bitreader_new(void) -{ - FLAC__BitReader *br = calloc(1, sizeof(FLAC__BitReader)); - - /* calloc() implies: - memset(br, 0, sizeof(FLAC__BitReader)); - br->buffer = 0; - br->capacity = 0; - br->words = br->bytes = 0; - br->consumed_words = br->consumed_bits = 0; - br->read_callback = 0; - br->client_data = 0; - */ - return br; -} - -void FLAC__bitreader_delete(FLAC__BitReader *br) -{ - FLAC__ASSERT(0 != br); - - FLAC__bitreader_free(br); - free(br); -} - -/*********************************************************************** - * - * Public class methods - * - ***********************************************************************/ - -FLAC__bool FLAC__bitreader_init(FLAC__BitReader *br, FLAC__BitReaderReadCallback rcb, void *cd) -{ - FLAC__ASSERT(0 != br); - - br->words = br->bytes = 0; - br->consumed_words = br->consumed_bits = 0; - br->capacity = FLAC__BITREADER_DEFAULT_CAPACITY; - br->buffer = malloc(sizeof(uint32_t) * br->capacity); - if(br->buffer == 0) - return false; - br->read_callback = rcb; - br->client_data = cd; - - return true; -} - -void FLAC__bitreader_free(FLAC__BitReader *br) -{ - FLAC__ASSERT(0 != br); - - if(0 != br->buffer) - free(br->buffer); - br->buffer = 0; - br->capacity = 0; - br->words = br->bytes = 0; - br->consumed_words = br->consumed_bits = 0; - br->read_callback = 0; - br->client_data = 0; -} - -FLAC__bool FLAC__bitreader_clear(FLAC__BitReader *br) -{ - br->words = br->bytes = 0; - br->consumed_words = br->consumed_bits = 0; - return true; -} - -void FLAC__bitreader_dump(const FLAC__BitReader *br, FILE *out) -{ - unsigned i, j; - if(br == 0) { - fprintf(out, "bitreader is NULL\n"); - } - else { - fprintf(out, "bitreader: capacity=%u words=%u bytes=%u consumed: words=%u, bits=%u\n", br->capacity, br->words, br->bytes, br->consumed_words, br->consumed_bits); - - for(i = 0; i < br->words; i++) { - fprintf(out, "%08X: ", i); - for(j = 0; j < FLAC__BITS_PER_WORD; j++) - if(i < br->consumed_words || (i == br->consumed_words && j < br->consumed_bits)) - fprintf(out, "."); - else - fprintf(out, "%01u", br->buffer[i] & (1 << (FLAC__BITS_PER_WORD-j-1)) ? 1:0); - fprintf(out, "\n"); - } - if(br->bytes > 0) { - fprintf(out, "%08X: ", i); - for(j = 0; j < br->bytes*8; j++) - if(i < br->consumed_words || (i == br->consumed_words && j < br->consumed_bits)) - fprintf(out, "."); - else - fprintf(out, "%01u", br->buffer[i] & (1 << (br->bytes*8-j-1)) ? 1:0); - fprintf(out, "\n"); - } - } -} - -void FLAC__bitreader_reset_read_crc16(FLAC__BitReader *br, FLAC__uint16 seed) -{ - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - FLAC__ASSERT((br->consumed_bits & 7) == 0); - - br->read_crc16 = (unsigned)seed; - br->crc16_align = br->consumed_bits; -} - -FLAC__uint16 FLAC__bitreader_get_read_crc16(FLAC__BitReader *br) -{ - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - FLAC__ASSERT((br->consumed_bits & 7) == 0); - FLAC__ASSERT(br->crc16_align <= br->consumed_bits); - - /* CRC any tail bytes in a partially-consumed word */ - if(br->consumed_bits) { - const uint32_t tail = br->buffer[br->consumed_words]; - for( ; br->crc16_align < br->consumed_bits; br->crc16_align += 8) - br->read_crc16 = FLAC__CRC16_UPDATE((unsigned)((tail >> (FLAC__BITS_PER_WORD-8-br->crc16_align)) & 0xff), br->read_crc16); - } - return br->read_crc16; -} - -inline FLAC__bool FLAC__bitreader_is_consumed_byte_aligned(const FLAC__BitReader *br) -{ - return ((br->consumed_bits & 7) == 0); -} - -inline unsigned FLAC__bitreader_bits_left_for_byte_alignment(const FLAC__BitReader *br) -{ - return 8 - (br->consumed_bits & 7); -} - -inline unsigned FLAC__bitreader_get_input_bits_unconsumed(const FLAC__BitReader *br) -{ - return (br->words-br->consumed_words)*FLAC__BITS_PER_WORD + br->bytes*8 - br->consumed_bits; -} - -FLAC__bool FLAC__bitreader_read_raw_uint32(FLAC__BitReader *br, FLAC__uint32 *val, unsigned bits) -{ - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - - FLAC__ASSERT(bits <= 32); - FLAC__ASSERT((br->capacity*FLAC__BITS_PER_WORD) * 2 >= bits); - FLAC__ASSERT(br->consumed_words <= br->words); - - /* WATCHOUT: code does not work with <32bit words; we can make things much faster with this assertion */ - FLAC__ASSERT(FLAC__BITS_PER_WORD >= 32); - - if(bits == 0) { /* OPT: investigate if this can ever happen, maybe change to assertion */ - *val = 0; - return true; - } - - while((br->words-br->consumed_words)*FLAC__BITS_PER_WORD + br->bytes*8 - br->consumed_bits < bits) { - if(!bitreader_read_from_client_(br)) - return false; - } - if(br->consumed_words < br->words) { /* if we've not consumed up to a partial tail word... */ - /* OPT: taking out the consumed_bits==0 "else" case below might make things faster if less code allows the compiler to inline this function */ - if(br->consumed_bits) { - /* this also works when consumed_bits==0, it's just a little slower than necessary for that case */ - const unsigned n = FLAC__BITS_PER_WORD - br->consumed_bits; - const uint32_t word = br->buffer[br->consumed_words]; - if(bits < n) { - *val = (word & (FLAC__WORD_ALL_ONES >> br->consumed_bits)) >> (n-bits); - br->consumed_bits += bits; - return true; - } - *val = word & (FLAC__WORD_ALL_ONES >> br->consumed_bits); - bits -= n; - crc16_update_word_(br, word); - br->consumed_words++; - br->consumed_bits = 0; - if(bits) { /* if there are still bits left to read, there have to be less than 32 so they will all be in the next word */ - *val <<= bits; - *val |= (br->buffer[br->consumed_words] >> (FLAC__BITS_PER_WORD-bits)); - br->consumed_bits = bits; - } - return true; - } - else { - const uint32_t word = br->buffer[br->consumed_words]; - if(bits < FLAC__BITS_PER_WORD) { - *val = word >> (FLAC__BITS_PER_WORD-bits); - br->consumed_bits = bits; - return true; - } - /* at this point 'bits' must be == FLAC__BITS_PER_WORD; because of previous assertions, it can't be larger */ - *val = word; - crc16_update_word_(br, word); - br->consumed_words++; - return true; - } - } - else { - /* in this case we're starting our read at a partial tail word; - * the reader has guaranteed that we have at least 'bits' bits - * available to read, which makes this case simpler. - */ - /* OPT: taking out the consumed_bits==0 "else" case below might make things faster if less code allows the compiler to inline this function */ - if(br->consumed_bits) { - /* this also works when consumed_bits==0, it's just a little slower than necessary for that case */ - FLAC__ASSERT(br->consumed_bits + bits <= br->bytes*8); - *val = (br->buffer[br->consumed_words] & (FLAC__WORD_ALL_ONES >> br->consumed_bits)) >> (FLAC__BITS_PER_WORD-br->consumed_bits-bits); - br->consumed_bits += bits; - return true; - } - else { - *val = br->buffer[br->consumed_words] >> (FLAC__BITS_PER_WORD-bits); - br->consumed_bits += bits; - return true; - } - } -} - -FLAC__bool FLAC__bitreader_read_raw_int32(FLAC__BitReader *br, FLAC__int32 *val, unsigned bits) -{ - /* OPT: inline raw uint32 code here, or make into a macro if possible in the .h file */ - if(!FLAC__bitreader_read_raw_uint32(br, (FLAC__uint32*)val, bits)) - return false; - /* sign-extend: */ - *val <<= (32-bits); - *val >>= (32-bits); - return true; -} - -FLAC__bool FLAC__bitreader_read_raw_uint64(FLAC__BitReader *br, FLAC__uint64 *val, unsigned bits) -{ - FLAC__uint32 hi, lo; - - if(bits > 32) { - if(!FLAC__bitreader_read_raw_uint32(br, &hi, bits-32)) - return false; - if(!FLAC__bitreader_read_raw_uint32(br, &lo, 32)) - return false; - *val = hi; - *val <<= 32; - *val |= lo; - } - else { - if(!FLAC__bitreader_read_raw_uint32(br, &lo, bits)) - return false; - *val = lo; - } - return true; -} - -inline FLAC__bool FLAC__bitreader_read_uint32_little_endian(FLAC__BitReader *br, FLAC__uint32 *val) -{ - FLAC__uint32 x8, x32 = 0; - - /* this doesn't need to be that fast as currently it is only used for vorbis comments */ - - if(!FLAC__bitreader_read_raw_uint32(br, &x32, 8)) - return false; - - if(!FLAC__bitreader_read_raw_uint32(br, &x8, 8)) - return false; - x32 |= (x8 << 8); - - if(!FLAC__bitreader_read_raw_uint32(br, &x8, 8)) - return false; - x32 |= (x8 << 16); - - if(!FLAC__bitreader_read_raw_uint32(br, &x8, 8)) - return false; - x32 |= (x8 << 24); - - *val = x32; - return true; -} - -FLAC__bool FLAC__bitreader_skip_bits_no_crc(FLAC__BitReader *br, unsigned bits) -{ - /* - * OPT: a faster implementation is possible but probably not that useful - * since this is only called a couple of times in the metadata readers. - */ - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - - if(bits > 0) { - const unsigned n = br->consumed_bits & 7; - unsigned m; - FLAC__uint32 x; - - if(n != 0) { - m = flac_min(8-n, bits); - if(!FLAC__bitreader_read_raw_uint32(br, &x, m)) - return false; - bits -= m; - } - m = bits / 8; - if(m > 0) { - if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(br, m)) - return false; - bits %= 8; - } - if(bits > 0) { - if(!FLAC__bitreader_read_raw_uint32(br, &x, bits)) - return false; - } - } - - return true; -} - -FLAC__bool FLAC__bitreader_skip_byte_block_aligned_no_crc(FLAC__BitReader *br, unsigned nvals) -{ - FLAC__uint32 x; - - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(br)); - - /* step 1: skip over partial head word to get word aligned */ - while(nvals && br->consumed_bits) { /* i.e. run until we read 'nvals' bytes or we hit the end of the head word */ - if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) - return false; - nvals--; - } - if(0 == nvals) - return true; - /* step 2: skip whole words in chunks */ - while(nvals >= FLAC__BYTES_PER_WORD) { - if(br->consumed_words < br->words) { - br->consumed_words++; - nvals -= FLAC__BYTES_PER_WORD; - } - else if(!bitreader_read_from_client_(br)) - return false; - } - /* step 3: skip any remainder from partial tail bytes */ - while(nvals) { - if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) - return false; - nvals--; - } - - return true; -} - -FLAC__bool FLAC__bitreader_read_byte_block_aligned_no_crc(FLAC__BitReader *br, FLAC__byte *val, unsigned nvals) -{ - FLAC__uint32 x; - - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(br)); - - /* step 1: read from partial head word to get word aligned */ - while(nvals && br->consumed_bits) { /* i.e. run until we read 'nvals' bytes or we hit the end of the head word */ - if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) - return false; - *val++ = (FLAC__byte)x; - nvals--; - } - if(0 == nvals) - return true; - /* step 2: read whole words in chunks */ - while(nvals >= FLAC__BYTES_PER_WORD) { - if(br->consumed_words < br->words) { - const uint32_t word = br->buffer[br->consumed_words++]; -#if FLAC__BYTES_PER_WORD == 4 - val[0] = (FLAC__byte)(word >> 24); - val[1] = (FLAC__byte)(word >> 16); - val[2] = (FLAC__byte)(word >> 8); - val[3] = (FLAC__byte)word; -#elif FLAC__BYTES_PER_WORD == 8 - val[0] = (FLAC__byte)(word >> 56); - val[1] = (FLAC__byte)(word >> 48); - val[2] = (FLAC__byte)(word >> 40); - val[3] = (FLAC__byte)(word >> 32); - val[4] = (FLAC__byte)(word >> 24); - val[5] = (FLAC__byte)(word >> 16); - val[6] = (FLAC__byte)(word >> 8); - val[7] = (FLAC__byte)word; -#else - for(x = 0; x < FLAC__BYTES_PER_WORD; x++) - val[x] = (FLAC__byte)(word >> (8*(FLAC__BYTES_PER_WORD-x-1))); -#endif - val += FLAC__BYTES_PER_WORD; - nvals -= FLAC__BYTES_PER_WORD; - } - else if(!bitreader_read_from_client_(br)) - return false; - } - /* step 3: read any remainder from partial tail bytes */ - while(nvals) { - if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) - return false; - *val++ = (FLAC__byte)x; - nvals--; - } - - return true; -} - -FLAC__bool FLAC__bitreader_read_unary_unsigned(FLAC__BitReader *br, unsigned *val) -#if 0 /* slow but readable version */ -{ - unsigned bit; - - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - - *val = 0; - while(1) { - if(!FLAC__bitreader_read_bit(br, &bit)) - return false; - if(bit) - break; - else - *val++; - } - return true; -} -#else -{ - unsigned i; - - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - - *val = 0; - while(1) { - while(br->consumed_words < br->words) { /* if we've not consumed up to a partial tail word... */ - uint32_t b = br->buffer[br->consumed_words] << br->consumed_bits; - if(b) { - i = FLAC__clz_uint32(b); - *val += i; - i++; - br->consumed_bits += i; - if(br->consumed_bits >= FLAC__BITS_PER_WORD) { /* faster way of testing if(br->consumed_bits == FLAC__BITS_PER_WORD) */ - crc16_update_word_(br, br->buffer[br->consumed_words]); - br->consumed_words++; - br->consumed_bits = 0; - } - return true; - } - else { - *val += FLAC__BITS_PER_WORD - br->consumed_bits; - crc16_update_word_(br, br->buffer[br->consumed_words]); - br->consumed_words++; - br->consumed_bits = 0; - /* didn't find stop bit yet, have to keep going... */ - } - } - /* at this point we've eaten up all the whole words; have to try - * reading through any tail bytes before calling the read callback. - * this is a repeat of the above logic adjusted for the fact we - * don't have a whole word. note though if the client is feeding - * us data a byte at a time (unlikely), br->consumed_bits may not - * be zero. - */ - if(br->bytes*8 > br->consumed_bits) { - const unsigned end = br->bytes * 8; - uint32_t b = (br->buffer[br->consumed_words] & (FLAC__WORD_ALL_ONES << (FLAC__BITS_PER_WORD-end))) << br->consumed_bits; - if(b) { - i = FLAC__clz_uint32(b); - *val += i; - i++; - br->consumed_bits += i; - FLAC__ASSERT(br->consumed_bits < FLAC__BITS_PER_WORD); - return true; - } - else { - *val += end - br->consumed_bits; - br->consumed_bits = end; - FLAC__ASSERT(br->consumed_bits < FLAC__BITS_PER_WORD); - /* didn't find stop bit yet, have to keep going... */ - } - } - if(!bitreader_read_from_client_(br)) - return false; - } -} -#endif - -FLAC__bool FLAC__bitreader_read_rice_signed(FLAC__BitReader *br, int *val, unsigned parameter) -{ - FLAC__uint32 lsbs = 0, msbs = 0; - unsigned uval; - - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - FLAC__ASSERT(parameter <= 31); - - /* read the unary MSBs and end bit */ - if(!FLAC__bitreader_read_unary_unsigned(br, &msbs)) - return false; - - /* read the binary LSBs */ - if(!FLAC__bitreader_read_raw_uint32(br, &lsbs, parameter)) - return false; - - /* compose the value */ - uval = (msbs << parameter) | lsbs; - if(uval & 1) - *val = -((int)(uval >> 1)) - 1; - else - *val = (int)(uval >> 1); - - return true; -} - -/* this is by far the most heavily used reader call. it ain't pretty but it's fast */ -FLAC__bool FLAC__bitreader_read_rice_signed_block(FLAC__BitReader *br, int vals[], unsigned nvals, unsigned parameter) -{ - /* try and get br->consumed_words and br->consumed_bits into register; - * must remember to flush them back to *br before calling other - * bitreader functions that use them, and before returning */ - unsigned cwords, words, lsbs, msbs, x, y; - unsigned ucbits; /* keep track of the number of unconsumed bits in word */ - uint32_t b; - int *val, *end; - - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - /* WATCHOUT: code does not work with <32bit words; we can make things much faster with this assertion */ - FLAC__ASSERT(FLAC__BITS_PER_WORD >= 32); - FLAC__ASSERT(parameter < 32); - /* the above two asserts also guarantee that the binary part never straddles more than 2 words, so we don't have to loop to read it */ - - val = vals; - end = vals + nvals; - - if(parameter == 0) { - while(val < end) { - /* read the unary MSBs and end bit */ - if(!FLAC__bitreader_read_unary_unsigned(br, &msbs)) - return false; - - *val++ = (int)(msbs >> 1) ^ -(int)(msbs & 1); - } - - return true; - } - - FLAC__ASSERT(parameter > 0); - - cwords = br->consumed_words; - words = br->words; - - /* if we've not consumed up to a partial tail word... */ - if(cwords >= words) { - x = 0; - goto process_tail; - } - - ucbits = FLAC__BITS_PER_WORD - br->consumed_bits; - b = br->buffer[cwords] << br->consumed_bits; /* keep unconsumed bits aligned to left */ - - while(val < end) { - /* read the unary MSBs and end bit */ - x = y = FLAC__clz2_uint32(b); - if(x == FLAC__BITS_PER_WORD) { - x = ucbits; - do { - /* didn't find stop bit yet, have to keep going... */ - crc16_update_word_(br, br->buffer[cwords++]); - if (cwords >= words) - goto incomplete_msbs; - b = br->buffer[cwords]; - y = FLAC__clz2_uint32(b); - x += y; - } while(y == FLAC__BITS_PER_WORD); - } - b <<= y; - b <<= 1; /* account for stop bit */ - ucbits = (ucbits - x - 1) % FLAC__BITS_PER_WORD; - msbs = x; - - /* read the binary LSBs */ - x = b >> (FLAC__BITS_PER_WORD - parameter); - if(parameter <= ucbits) { - ucbits -= parameter; - b <<= parameter; - } else { - /* there are still bits left to read, they will all be in the next word */ - crc16_update_word_(br, br->buffer[cwords++]); - if (cwords >= words) - goto incomplete_lsbs; - b = br->buffer[cwords]; - ucbits += FLAC__BITS_PER_WORD - parameter; - x |= b >> ucbits; - b <<= FLAC__BITS_PER_WORD - ucbits; - } - lsbs = x; - - /* compose the value */ - x = (msbs << parameter) | lsbs; - *val++ = (int)(x >> 1) ^ -(int)(x & 1); - - continue; - - /* at this point we've eaten up all the whole words */ -process_tail: - do { - if(0) { -incomplete_msbs: - br->consumed_bits = 0; - br->consumed_words = cwords; - } - - /* read the unary MSBs and end bit */ - if(!FLAC__bitreader_read_unary_unsigned(br, &msbs)) - return false; - msbs += x; - x = ucbits = 0; - - if(0) { -incomplete_lsbs: - br->consumed_bits = 0; - br->consumed_words = cwords; - } - - /* read the binary LSBs */ - if(!FLAC__bitreader_read_raw_uint32(br, &lsbs, parameter - ucbits)) - return false; - lsbs = x | lsbs; - - /* compose the value */ - x = (msbs << parameter) | lsbs; - *val++ = (int)(x >> 1) ^ -(int)(x & 1); - x = 0; - - cwords = br->consumed_words; - words = br->words; - ucbits = FLAC__BITS_PER_WORD - br->consumed_bits; - b = br->buffer[cwords] << br->consumed_bits; - } while(cwords >= words && val < end); - } - - if(ucbits == 0 && cwords < words) { - /* don't leave the head word with no unconsumed bits */ - crc16_update_word_(br, br->buffer[cwords++]); - ucbits = FLAC__BITS_PER_WORD; - } - - br->consumed_bits = FLAC__BITS_PER_WORD - ucbits; - br->consumed_words = cwords; - - return true; -} - -#if 0 /* UNUSED */ -FLAC__bool FLAC__bitreader_read_golomb_signed(FLAC__BitReader *br, int *val, unsigned parameter) -{ - FLAC__uint32 lsbs = 0, msbs = 0; - unsigned bit, uval, k; - - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - - k = FLAC__bitmath_ilog2(parameter); - - /* read the unary MSBs and end bit */ - if(!FLAC__bitreader_read_unary_unsigned(br, &msbs)) - return false; - - /* read the binary LSBs */ - if(!FLAC__bitreader_read_raw_uint32(br, &lsbs, k)) - return false; - - if(parameter == 1u<= d) { - if(!FLAC__bitreader_read_bit(br, &bit)) - return false; - lsbs <<= 1; - lsbs |= bit; - lsbs -= d; - } - /* compose the value */ - uval = msbs * parameter + lsbs; - } - - /* unfold unsigned to signed */ - if(uval & 1) - *val = -((int)(uval >> 1)) - 1; - else - *val = (int)(uval >> 1); - - return true; -} - -FLAC__bool FLAC__bitreader_read_golomb_unsigned(FLAC__BitReader *br, unsigned *val, unsigned parameter) -{ - FLAC__uint32 lsbs, msbs = 0; - unsigned bit, k; - - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - - k = FLAC__bitmath_ilog2(parameter); - - /* read the unary MSBs and end bit */ - if(!FLAC__bitreader_read_unary_unsigned(br, &msbs)) - return false; - - /* read the binary LSBs */ - if(!FLAC__bitreader_read_raw_uint32(br, &lsbs, k)) - return false; - - if(parameter == 1u<= d) { - if(!FLAC__bitreader_read_bit(br, &bit)) - return false; - lsbs <<= 1; - lsbs |= bit; - lsbs -= d; - } - /* compose the value */ - *val = msbs * parameter + lsbs; - } - - return true; -} -#endif /* UNUSED */ - -/* on return, if *val == 0xffffffff then the utf-8 sequence was invalid, but the return value will be true */ -FLAC__bool FLAC__bitreader_read_utf8_uint32(FLAC__BitReader *br, FLAC__uint32 *val, FLAC__byte *raw, unsigned *rawlen) -{ - FLAC__uint32 v = 0; - FLAC__uint32 x; - unsigned i; - - if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) - return false; - if(raw) - raw[(*rawlen)++] = (FLAC__byte)x; - if(!(x & 0x80)) { /* 0xxxxxxx */ - v = x; - i = 0; - } - else if(x & 0xC0 && !(x & 0x20)) { /* 110xxxxx */ - v = x & 0x1F; - i = 1; - } - else if(x & 0xE0 && !(x & 0x10)) { /* 1110xxxx */ - v = x & 0x0F; - i = 2; - } - else if(x & 0xF0 && !(x & 0x08)) { /* 11110xxx */ - v = x & 0x07; - i = 3; - } - else if(x & 0xF8 && !(x & 0x04)) { /* 111110xx */ - v = x & 0x03; - i = 4; - } - else if(x & 0xFC && !(x & 0x02)) { /* 1111110x */ - v = x & 0x01; - i = 5; - } - else { - *val = 0xffffffff; - return true; - } - for( ; i; i--) { - if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) - return false; - if(raw) - raw[(*rawlen)++] = (FLAC__byte)x; - if(!(x & 0x80) || (x & 0x40)) { /* 10xxxxxx */ - *val = 0xffffffff; - return true; - } - v <<= 6; - v |= (x & 0x3F); - } - *val = v; - return true; -} - -/* on return, if *val == 0xffffffffffffffff then the utf-8 sequence was invalid, but the return value will be true */ -FLAC__bool FLAC__bitreader_read_utf8_uint64(FLAC__BitReader *br, FLAC__uint64 *val, FLAC__byte *raw, unsigned *rawlen) -{ - FLAC__uint64 v = 0; - FLAC__uint32 x; - unsigned i; - - if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) - return false; - if(raw) - raw[(*rawlen)++] = (FLAC__byte)x; - if(!(x & 0x80)) { /* 0xxxxxxx */ - v = x; - i = 0; - } - else if(x & 0xC0 && !(x & 0x20)) { /* 110xxxxx */ - v = x & 0x1F; - i = 1; - } - else if(x & 0xE0 && !(x & 0x10)) { /* 1110xxxx */ - v = x & 0x0F; - i = 2; - } - else if(x & 0xF0 && !(x & 0x08)) { /* 11110xxx */ - v = x & 0x07; - i = 3; - } - else if(x & 0xF8 && !(x & 0x04)) { /* 111110xx */ - v = x & 0x03; - i = 4; - } - else if(x & 0xFC && !(x & 0x02)) { /* 1111110x */ - v = x & 0x01; - i = 5; - } - else if(x & 0xFE && !(x & 0x01)) { /* 11111110 */ - v = 0; - i = 6; - } - else { - *val = FLAC__U64L(0xffffffffffffffff); - return true; - } - for( ; i; i--) { - if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) - return false; - if(raw) - raw[(*rawlen)++] = (FLAC__byte)x; - if(!(x & 0x80) || (x & 0x40)) { /* 10xxxxxx */ - *val = FLAC__U64L(0xffffffffffffffff); - return true; - } - v <<= 6; - v |= (x & 0x3F); - } - *val = v; - return true; -} - -/* These functions are declared inline in this file but are also callable as - * externs from elsewhere. - * According to the C99 spec, section 6.7.4, simply providing a function - * prototype in a header file without 'inline' and making the function inline - * in this file should be sufficient. - * Unfortunately, the Microsoft VS compiler doesn't pick them up externally. To - * fix that we add extern declarations here. - */ -extern FLAC__bool FLAC__bitreader_is_consumed_byte_aligned(const FLAC__BitReader *br); -extern unsigned FLAC__bitreader_bits_left_for_byte_alignment(const FLAC__BitReader *br); -extern unsigned FLAC__bitreader_get_input_bits_unconsumed(const FLAC__BitReader *br); -extern FLAC__bool FLAC__bitreader_read_uint32_little_endian(FLAC__BitReader *br, FLAC__uint32 *val); diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/bitwriter.c b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/bitwriter.c deleted file mode 100644 index 76be1bc7..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/bitwriter.c +++ /dev/null @@ -1,843 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 -#endif - -#include -#include -#include "private/bitwriter.h" -#include "private/crc.h" -#include "private/macros.h" -#include "FLAC/assert.h" -#include "share/alloc.h" -#include "share/compat.h" -#include "share/endswap.h" - -/* Things should be fastest when this matches the machine word size */ -/* WATCHOUT: if you change this you must also change the following #defines down to SWAP_BE_WORD_TO_HOST below to match */ -/* WATCHOUT: there are a few places where the code will not work unless uint32_t is >= 32 bits wide */ -#define FLAC__BYTES_PER_WORD 4 -#define FLAC__BITS_PER_WORD 32 -#define FLAC__WORD_ALL_ONES ((FLAC__uint32)0xffffffff) -/* SWAP_BE_WORD_TO_HOST swaps bytes in a uint32_t (which is always big-endian) if necessary to match host byte order */ -#if WORDS_BIGENDIAN -#define SWAP_BE_WORD_TO_HOST(x) (x) -#else -#define SWAP_BE_WORD_TO_HOST(x) ENDSWAP_32(x) -#endif - -/* - * The default capacity here doesn't matter too much. The buffer always grows - * to hold whatever is written to it. Usually the encoder will stop adding at - * a frame or metadata block, then write that out and clear the buffer for the - * next one. - */ -static const unsigned FLAC__BITWRITER_DEFAULT_CAPACITY = 32768u / sizeof(uint32_t); /* size in words */ -/* When growing, increment 4K at a time */ -static const unsigned FLAC__BITWRITER_DEFAULT_INCREMENT = 4096u / sizeof(uint32_t); /* size in words */ - -#define FLAC__WORDS_TO_BITS(words) ((words) * FLAC__BITS_PER_WORD) -#define FLAC__TOTAL_BITS(bw) (FLAC__WORDS_TO_BITS((bw)->words) + (bw)->bits) - -struct FLAC__BitWriter { - uint32_t *buffer; - uint32_t accum; /* accumulator; bits are right-justified; when full, accum is appended to buffer */ - unsigned capacity; /* capacity of buffer in words */ - unsigned words; /* # of complete words in buffer */ - unsigned bits; /* # of used bits in accum */ -}; - -/* * WATCHOUT: The current implementation only grows the buffer. */ -#ifndef __SUNPRO_C -static -#endif -FLAC__bool bitwriter_grow_(FLAC__BitWriter *bw, unsigned bits_to_add) -{ - unsigned new_capacity; - uint32_t *new_buffer; - - FLAC__ASSERT(0 != bw); - FLAC__ASSERT(0 != bw->buffer); - - /* calculate total words needed to store 'bits_to_add' additional bits */ - new_capacity = bw->words + ((bw->bits + bits_to_add + FLAC__BITS_PER_WORD - 1) / FLAC__BITS_PER_WORD); - - /* it's possible (due to pessimism in the growth estimation that - * leads to this call) that we don't actually need to grow - */ - if(bw->capacity >= new_capacity) - return true; - - /* round up capacity increase to the nearest FLAC__BITWRITER_DEFAULT_INCREMENT */ - if((new_capacity - bw->capacity) % FLAC__BITWRITER_DEFAULT_INCREMENT) - new_capacity += FLAC__BITWRITER_DEFAULT_INCREMENT - ((new_capacity - bw->capacity) % FLAC__BITWRITER_DEFAULT_INCREMENT); - /* make sure we got everything right */ - FLAC__ASSERT(0 == (new_capacity - bw->capacity) % FLAC__BITWRITER_DEFAULT_INCREMENT); - FLAC__ASSERT(new_capacity > bw->capacity); - FLAC__ASSERT(new_capacity >= bw->words + ((bw->bits + bits_to_add + FLAC__BITS_PER_WORD - 1) / FLAC__BITS_PER_WORD)); - - new_buffer = safe_realloc_mul_2op_(bw->buffer, sizeof(uint32_t), /*times*/new_capacity); - if(new_buffer == 0) - return false; - bw->buffer = new_buffer; - bw->capacity = new_capacity; - return true; -} - - -/*********************************************************************** - * - * Class constructor/destructor - * - ***********************************************************************/ - -FLAC__BitWriter *FLAC__bitwriter_new(void) -{ - FLAC__BitWriter *bw = calloc(1, sizeof(FLAC__BitWriter)); - /* note that calloc() sets all members to 0 for us */ - return bw; -} - -void FLAC__bitwriter_delete(FLAC__BitWriter *bw) -{ - FLAC__ASSERT(0 != bw); - - FLAC__bitwriter_free(bw); - free(bw); -} - -/*********************************************************************** - * - * Public class methods - * - ***********************************************************************/ - -FLAC__bool FLAC__bitwriter_init(FLAC__BitWriter *bw) -{ - FLAC__ASSERT(0 != bw); - - bw->words = bw->bits = 0; - bw->capacity = FLAC__BITWRITER_DEFAULT_CAPACITY; - bw->buffer = malloc(sizeof(uint32_t) * bw->capacity); - if(bw->buffer == 0) - return false; - - return true; -} - -void FLAC__bitwriter_free(FLAC__BitWriter *bw) -{ - FLAC__ASSERT(0 != bw); - - if(0 != bw->buffer) - free(bw->buffer); - bw->buffer = 0; - bw->capacity = 0; - bw->words = bw->bits = 0; -} - -void FLAC__bitwriter_clear(FLAC__BitWriter *bw) -{ - bw->words = bw->bits = 0; -} - -void FLAC__bitwriter_dump(const FLAC__BitWriter *bw, FILE *out) -{ - unsigned i, j; - if(bw == 0) { - fprintf(out, "bitwriter is NULL\n"); - } - else { - fprintf(out, "bitwriter: capacity=%u words=%u bits=%u total_bits=%u\n", bw->capacity, bw->words, bw->bits, FLAC__TOTAL_BITS(bw)); - - for(i = 0; i < bw->words; i++) { - fprintf(out, "%08X: ", i); - for(j = 0; j < FLAC__BITS_PER_WORD; j++) - fprintf(out, "%01u", bw->buffer[i] & (1 << (FLAC__BITS_PER_WORD-j-1)) ? 1:0); - fprintf(out, "\n"); - } - if(bw->bits > 0) { - fprintf(out, "%08X: ", i); - for(j = 0; j < bw->bits; j++) - fprintf(out, "%01u", bw->accum & (1 << (bw->bits-j-1)) ? 1:0); - fprintf(out, "\n"); - } - } -} - -FLAC__bool FLAC__bitwriter_get_write_crc16(FLAC__BitWriter *bw, FLAC__uint16 *crc) -{ - const FLAC__byte *buffer; - size_t bytes; - - FLAC__ASSERT((bw->bits & 7) == 0); /* assert that we're byte-aligned */ - - if(!FLAC__bitwriter_get_buffer(bw, &buffer, &bytes)) - return false; - - *crc = (FLAC__uint16)FLAC__crc16(buffer, bytes); - FLAC__bitwriter_release_buffer(bw); - return true; -} - -FLAC__bool FLAC__bitwriter_get_write_crc8(FLAC__BitWriter *bw, FLAC__byte *crc) -{ - const FLAC__byte *buffer; - size_t bytes; - - FLAC__ASSERT((bw->bits & 7) == 0); /* assert that we're byte-aligned */ - - if(!FLAC__bitwriter_get_buffer(bw, &buffer, &bytes)) - return false; - - *crc = FLAC__crc8(buffer, bytes); - FLAC__bitwriter_release_buffer(bw); - return true; -} - -FLAC__bool FLAC__bitwriter_is_byte_aligned(const FLAC__BitWriter *bw) -{ - return ((bw->bits & 7) == 0); -} - -unsigned FLAC__bitwriter_get_input_bits_unconsumed(const FLAC__BitWriter *bw) -{ - return FLAC__TOTAL_BITS(bw); -} - -FLAC__bool FLAC__bitwriter_get_buffer(FLAC__BitWriter *bw, const FLAC__byte **buffer, size_t *bytes) -{ - FLAC__ASSERT((bw->bits & 7) == 0); - /* double protection */ - if(bw->bits & 7) - return false; - /* if we have bits in the accumulator we have to flush those to the buffer first */ - if(bw->bits) { - FLAC__ASSERT(bw->words <= bw->capacity); - if(bw->words == bw->capacity && !bitwriter_grow_(bw, FLAC__BITS_PER_WORD)) - return false; - /* append bits as complete word to buffer, but don't change bw->accum or bw->bits */ - bw->buffer[bw->words] = SWAP_BE_WORD_TO_HOST(bw->accum << (FLAC__BITS_PER_WORD-bw->bits)); - } - /* now we can just return what we have */ - *buffer = (FLAC__byte*)bw->buffer; - *bytes = (FLAC__BYTES_PER_WORD * bw->words) + (bw->bits >> 3); - return true; -} - -void FLAC__bitwriter_release_buffer(FLAC__BitWriter *bw) -{ - /* nothing to do. in the future, strict checking of a 'writer-is-in- - * get-mode' flag could be added everywhere and then cleared here - */ - (void)bw; -} - -inline FLAC__bool FLAC__bitwriter_write_zeroes(FLAC__BitWriter *bw, unsigned bits) -{ - unsigned n; - - FLAC__ASSERT(0 != bw); - FLAC__ASSERT(0 != bw->buffer); - - if(bits == 0) - return true; - /* slightly pessimistic size check but faster than "<= bw->words + (bw->bits+bits+FLAC__BITS_PER_WORD-1)/FLAC__BITS_PER_WORD" */ - if(bw->capacity <= bw->words + bits && !bitwriter_grow_(bw, bits)) - return false; - /* first part gets to word alignment */ - if(bw->bits) { - n = flac_min(FLAC__BITS_PER_WORD - bw->bits, bits); - bw->accum <<= n; - bits -= n; - bw->bits += n; - if(bw->bits == FLAC__BITS_PER_WORD) { - bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(bw->accum); - bw->bits = 0; - } - else - return true; - } - /* do whole words */ - while(bits >= FLAC__BITS_PER_WORD) { - bw->buffer[bw->words++] = 0; - bits -= FLAC__BITS_PER_WORD; - } - /* do any leftovers */ - if(bits > 0) { - bw->accum = 0; - bw->bits = bits; - } - return true; -} - -inline FLAC__bool FLAC__bitwriter_write_raw_uint32(FLAC__BitWriter *bw, FLAC__uint32 val, unsigned bits) -{ - register unsigned left; - - /* WATCHOUT: code does not work with <32bit words; we can make things much faster with this assertion */ - FLAC__ASSERT(FLAC__BITS_PER_WORD >= 32); - - FLAC__ASSERT(0 != bw); - FLAC__ASSERT(0 != bw->buffer); - - FLAC__ASSERT(bits <= 32); - if(bits == 0) - return true; - - /* slightly pessimistic size check but faster than "<= bw->words + (bw->bits+bits+FLAC__BITS_PER_WORD-1)/FLAC__BITS_PER_WORD" */ - if(bw->capacity <= bw->words + bits && !bitwriter_grow_(bw, bits)) - return false; - - left = FLAC__BITS_PER_WORD - bw->bits; - if(bits < left) { - bw->accum <<= bits; - bw->accum |= val; - bw->bits += bits; - } - else if(bw->bits) { /* WATCHOUT: if bw->bits == 0, left==FLAC__BITS_PER_WORD and bw->accum<<=left is a NOP instead of setting to 0 */ - bw->accum <<= left; - bw->accum |= val >> (bw->bits = bits - left); - bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(bw->accum); - bw->accum = val; - } - else { - bw->accum = val; - bw->bits = 0; - bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(val); - } - - return true; -} - -inline FLAC__bool FLAC__bitwriter_write_raw_int32(FLAC__BitWriter *bw, FLAC__int32 val, unsigned bits) -{ - /* zero-out unused bits */ - if(bits < 32) - val &= (~(0xffffffff << bits)); - - return FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)val, bits); -} - -inline FLAC__bool FLAC__bitwriter_write_raw_uint64(FLAC__BitWriter *bw, FLAC__uint64 val, unsigned bits) -{ - /* this could be a little faster but it's not used for much */ - if(bits > 32) { - return - FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)(val>>32), bits-32) && - FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)val, 32); - } - else - return FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)val, bits); -} - -inline FLAC__bool FLAC__bitwriter_write_raw_uint32_little_endian(FLAC__BitWriter *bw, FLAC__uint32 val) -{ - /* this doesn't need to be that fast as currently it is only used for vorbis comments */ - - if(!FLAC__bitwriter_write_raw_uint32(bw, val & 0xff, 8)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, (val>>8) & 0xff, 8)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, (val>>16) & 0xff, 8)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, val>>24, 8)) - return false; - - return true; -} - -inline FLAC__bool FLAC__bitwriter_write_byte_block(FLAC__BitWriter *bw, const FLAC__byte vals[], unsigned nvals) -{ - unsigned i; - - /* this could be faster but currently we don't need it to be since it's only used for writing metadata */ - for(i = 0; i < nvals; i++) { - if(!FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)(vals[i]), 8)) - return false; - } - - return true; -} - -FLAC__bool FLAC__bitwriter_write_unary_unsigned(FLAC__BitWriter *bw, unsigned val) -{ - if(val < 32) - return FLAC__bitwriter_write_raw_uint32(bw, 1, ++val); - else - return - FLAC__bitwriter_write_zeroes(bw, val) && - FLAC__bitwriter_write_raw_uint32(bw, 1, 1); -} - -unsigned FLAC__bitwriter_rice_bits(FLAC__int32 val, unsigned parameter) -{ - FLAC__uint32 uval; - - FLAC__ASSERT(parameter < sizeof(unsigned)*8); - - /* fold signed to unsigned; actual formula is: negative(v)? -2v-1 : 2v */ - uval = (val<<1) ^ (val>>31); - - return 1 + parameter + (uval >> parameter); -} - -#if 0 /* UNUSED */ -unsigned FLAC__bitwriter_golomb_bits_signed(int val, unsigned parameter) -{ - unsigned bits, msbs, uval; - unsigned k; - - FLAC__ASSERT(parameter > 0); - - /* fold signed to unsigned */ - if(val < 0) - uval = (unsigned)(((-(++val)) << 1) + 1); - else - uval = (unsigned)(val << 1); - - k = FLAC__bitmath_ilog2(parameter); - if(parameter == 1u<> k; - bits = 1 + k + msbs; - } - else { - unsigned q, r, d; - - d = (1 << (k+1)) - parameter; - q = uval / parameter; - r = uval - (q * parameter); - - bits = 1 + q + k; - if(r >= d) - bits++; - } - return bits; -} - -unsigned FLAC__bitwriter_golomb_bits_unsigned(unsigned uval, unsigned parameter) -{ - unsigned bits, msbs; - unsigned k; - - FLAC__ASSERT(parameter > 0); - - k = FLAC__bitmath_ilog2(parameter); - if(parameter == 1u<> k; - bits = 1 + k + msbs; - } - else { - unsigned q, r, d; - - d = (1 << (k+1)) - parameter; - q = uval / parameter; - r = uval - (q * parameter); - - bits = 1 + q + k; - if(r >= d) - bits++; - } - return bits; -} -#endif /* UNUSED */ - -FLAC__bool FLAC__bitwriter_write_rice_signed(FLAC__BitWriter *bw, FLAC__int32 val, unsigned parameter) -{ - unsigned total_bits, interesting_bits, msbs; - FLAC__uint32 uval, pattern; - - FLAC__ASSERT(0 != bw); - FLAC__ASSERT(0 != bw->buffer); - FLAC__ASSERT(parameter < 8*sizeof(uval)); - - /* fold signed to unsigned; actual formula is: negative(v)? -2v-1 : 2v */ - uval = (val<<1) ^ (val>>31); - - msbs = uval >> parameter; - interesting_bits = 1 + parameter; - total_bits = interesting_bits + msbs; - pattern = 1 << parameter; /* the unary end bit */ - pattern |= (uval & ((1<> (31-parameter); /* ...then mask off the bits above the stop bit with val&=mask2*/ - FLAC__uint32 uval; - unsigned left; - const unsigned lsbits = 1 + parameter; - unsigned msbits; - - FLAC__ASSERT(0 != bw); - FLAC__ASSERT(0 != bw->buffer); - FLAC__ASSERT(parameter < 8*sizeof(uint32_t)-1); - /* WATCHOUT: code does not work with <32bit words; we can make things much faster with this assertion */ - FLAC__ASSERT(FLAC__BITS_PER_WORD >= 32); - - while(nvals) { - /* fold signed to unsigned; actual formula is: negative(v)? -2v-1 : 2v */ - uval = (*vals<<1) ^ (*vals>>31); - - msbits = uval >> parameter; - - if(bw->bits && bw->bits + msbits + lsbits < FLAC__BITS_PER_WORD) { /* i.e. if the whole thing fits in the current uint32_t */ - /* ^^^ if bw->bits is 0 then we may have filled the buffer and have no free uint32_t to work in */ - bw->bits = bw->bits + msbits + lsbits; - uval |= mask1; /* set stop bit */ - uval &= mask2; /* mask off unused top bits */ - bw->accum <<= msbits + lsbits; - bw->accum |= uval; - } - else { - /* slightly pessimistic size check but faster than "<= bw->words + (bw->bits+msbits+lsbits+FLAC__BITS_PER_WORD-1)/FLAC__BITS_PER_WORD" */ - /* OPT: pessimism may cause flurry of false calls to grow_ which eat up all savings before it */ - if(bw->capacity <= bw->words + bw->bits + msbits + 1/*lsbits always fit in 1 uint32_t*/ && !bitwriter_grow_(bw, msbits+lsbits)) - return false; - - if(msbits) { - /* first part gets to word alignment */ - if(bw->bits) { - left = FLAC__BITS_PER_WORD - bw->bits; - if(msbits < left) { - bw->accum <<= msbits; - bw->bits += msbits; - goto break1; - } - else { - bw->accum <<= left; - msbits -= left; - bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(bw->accum); - bw->bits = 0; - } - } - /* do whole words */ - while(msbits >= FLAC__BITS_PER_WORD) { - bw->buffer[bw->words++] = 0; - msbits -= FLAC__BITS_PER_WORD; - } - /* do any leftovers */ - if(msbits > 0) { - bw->accum = 0; - bw->bits = msbits; - } - } -break1: - uval |= mask1; /* set stop bit */ - uval &= mask2; /* mask off unused top bits */ - - left = FLAC__BITS_PER_WORD - bw->bits; - if(lsbits < left) { - bw->accum <<= lsbits; - bw->accum |= uval; - bw->bits += lsbits; - } - else { - /* if bw->bits == 0, left==FLAC__BITS_PER_WORD which will always - * be > lsbits (because of previous assertions) so it would have - * triggered the (lsbitsbits); - FLAC__ASSERT(left < FLAC__BITS_PER_WORD); - bw->accum <<= left; - bw->accum |= uval >> (bw->bits = lsbits - left); - bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(bw->accum); - bw->accum = uval; - } - } - vals++; - nvals--; - } - return true; -} - -#if 0 /* UNUSED */ -FLAC__bool FLAC__bitwriter_write_golomb_signed(FLAC__BitWriter *bw, int val, unsigned parameter) -{ - unsigned total_bits, msbs, uval; - unsigned k; - - FLAC__ASSERT(0 != bw); - FLAC__ASSERT(0 != bw->buffer); - FLAC__ASSERT(parameter > 0); - - /* fold signed to unsigned */ - if(val < 0) - uval = (unsigned)(((-(++val)) << 1) + 1); - else - uval = (unsigned)(val << 1); - - k = FLAC__bitmath_ilog2(parameter); - if(parameter == 1u<> k; - total_bits = 1 + k + msbs; - pattern = 1 << k; /* the unary end bit */ - pattern |= (uval & ((1u<= d) { - if(!FLAC__bitwriter_write_raw_uint32(bw, r+d, k+1)) - return false; - } - else { - if(!FLAC__bitwriter_write_raw_uint32(bw, r, k)) - return false; - } - } - return true; -} - -FLAC__bool FLAC__bitwriter_write_golomb_unsigned(FLAC__BitWriter *bw, unsigned uval, unsigned parameter) -{ - unsigned total_bits, msbs; - unsigned k; - - FLAC__ASSERT(0 != bw); - FLAC__ASSERT(0 != bw->buffer); - FLAC__ASSERT(parameter > 0); - - k = FLAC__bitmath_ilog2(parameter); - if(parameter == 1u<> k; - total_bits = 1 + k + msbs; - pattern = 1 << k; /* the unary end bit */ - pattern |= (uval & ((1u<= d) { - if(!FLAC__bitwriter_write_raw_uint32(bw, r+d, k+1)) - return false; - } - else { - if(!FLAC__bitwriter_write_raw_uint32(bw, r, k)) - return false; - } - } - return true; -} -#endif /* UNUSED */ - -FLAC__bool FLAC__bitwriter_write_utf8_uint32(FLAC__BitWriter *bw, FLAC__uint32 val) -{ - FLAC__bool ok = 1; - - FLAC__ASSERT(0 != bw); - FLAC__ASSERT(0 != bw->buffer); - - FLAC__ASSERT(!(val & 0x80000000)); /* this version only handles 31 bits */ - - if(val < 0x80) { - return FLAC__bitwriter_write_raw_uint32(bw, val, 8); - } - else if(val < 0x800) { - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xC0 | (val>>6), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (val&0x3F), 8); - } - else if(val < 0x10000) { - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xE0 | (val>>12), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>6)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (val&0x3F), 8); - } - else if(val < 0x200000) { - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xF0 | (val>>18), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>12)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>6)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (val&0x3F), 8); - } - else if(val < 0x4000000) { - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xF8 | (val>>24), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>18)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>12)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>6)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (val&0x3F), 8); - } - else { - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xFC | (val>>30), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>24)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>18)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>12)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>6)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (val&0x3F), 8); - } - - return ok; -} - -FLAC__bool FLAC__bitwriter_write_utf8_uint64(FLAC__BitWriter *bw, FLAC__uint64 val) -{ - FLAC__bool ok = 1; - - FLAC__ASSERT(0 != bw); - FLAC__ASSERT(0 != bw->buffer); - - FLAC__ASSERT(!(val & FLAC__U64L(0xFFFFFFF000000000))); /* this version only handles 36 bits */ - - if(val < 0x80) { - return FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)val, 8); - } - else if(val < 0x800) { - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xC0 | (FLAC__uint32)(val>>6), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8); - } - else if(val < 0x10000) { - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xE0 | (FLAC__uint32)(val>>12), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8); - } - else if(val < 0x200000) { - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xF0 | (FLAC__uint32)(val>>18), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>12)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8); - } - else if(val < 0x4000000) { - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xF8 | (FLAC__uint32)(val>>24), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>18)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>12)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8); - } - else if(val < 0x80000000) { - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xFC | (FLAC__uint32)(val>>30), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>24)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>18)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>12)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8); - } - else { - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xFE, 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>30)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>24)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>18)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>12)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8); - } - - return ok; -} - -FLAC__bool FLAC__bitwriter_zero_pad_to_byte_boundary(FLAC__BitWriter *bw) -{ - /* 0-pad to byte boundary */ - if(bw->bits & 7u) - return FLAC__bitwriter_write_zeroes(bw, 8 - (bw->bits & 7u)); - else - return true; -} - -/* These functions are declared inline in this file but are also callable as - * externs from elsewhere. - * According to the C99 spec, section 6.7.4, simply providing a function - * prototype in a header file without 'inline' and making the function inline - * in this file should be sufficient. - * Unfortunately, the Microsoft VS compiler doesn't pick them up externally. To - * fix that we add extern declarations here. - */ -extern FLAC__bool FLAC__bitwriter_write_zeroes(FLAC__BitWriter *bw, unsigned bits); -extern FLAC__bool FLAC__bitwriter_write_raw_int32(FLAC__BitWriter *bw, FLAC__int32 val, unsigned bits); -extern FLAC__bool FLAC__bitwriter_write_raw_uint64(FLAC__BitWriter *bw, FLAC__uint64 val, unsigned bits); -extern FLAC__bool FLAC__bitwriter_write_raw_uint32_little_endian(FLAC__BitWriter *bw, FLAC__uint32 val); -extern FLAC__bool FLAC__bitwriter_write_byte_block(FLAC__BitWriter *bw, const FLAC__byte vals[], unsigned nvals); diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/cpu.c b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/cpu.c deleted file mode 100644 index bb095067..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/cpu.c +++ /dev/null @@ -1,487 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 -#endif - -#include "private/cpu.h" -#include -#include -#ifdef DEBUG -# include -#endif - -#if defined FLAC__CPU_IA32 -# include - -static void disable_sse(FLAC__CPUInfo *info) -{ - info->ia32.sse = false; - info->ia32.sse2 = false; - info->ia32.sse3 = false; - info->ia32.ssse3 = false; - info->ia32.sse41 = false; - info->ia32.sse42 = false; -} - -static void disable_avx(FLAC__CPUInfo *info) -{ - info->ia32.avx = false; - info->ia32.avx2 = false; - info->ia32.fma = false; -} - -#elif defined FLAC__CPU_X86_64 - -static void disable_avx(FLAC__CPUInfo *info) -{ - info->x86.avx = false; - info->x86.avx2 = false; - info->x86.fma = false; -} -#endif - -#if defined (__NetBSD__) || defined(__OpenBSD__) -#include -#include -#include -#endif - -#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) -#include -#include -#endif - -#if defined(__APPLE__) -/* how to get sysctlbyname()? */ -#endif - -#ifdef FLAC__CPU_IA32 -/* these are flags in EDX of CPUID AX=00000001 */ -static const unsigned FLAC__CPUINFO_IA32_CPUID_CMOV = 0x00008000; -static const unsigned FLAC__CPUINFO_IA32_CPUID_MMX = 0x00800000; -static const unsigned FLAC__CPUINFO_IA32_CPUID_FXSR = 0x01000000; -static const unsigned FLAC__CPUINFO_IA32_CPUID_SSE = 0x02000000; -static const unsigned FLAC__CPUINFO_IA32_CPUID_SSE2 = 0x04000000; -#endif - -/* these are flags in ECX of CPUID AX=00000001 */ -static const unsigned FLAC__CPUINFO_IA32_CPUID_SSE3 = 0x00000001; -static const unsigned FLAC__CPUINFO_IA32_CPUID_SSSE3 = 0x00000200; -static const unsigned FLAC__CPUINFO_IA32_CPUID_SSE41 = 0x00080000; -static const unsigned FLAC__CPUINFO_IA32_CPUID_SSE42 = 0x00100000; - -#if defined FLAC__AVX_SUPPORTED -/* these are flags in ECX of CPUID AX=00000001 */ -static const unsigned FLAC__CPUINFO_IA32_CPUID_OSXSAVE = 0x08000000; -static const unsigned FLAC__CPUINFO_IA32_CPUID_AVX = 0x10000000; -static const unsigned FLAC__CPUINFO_IA32_CPUID_FMA = 0x00001000; -/* these are flags in EBX of CPUID AX=00000007 */ -static const unsigned FLAC__CPUINFO_IA32_CPUID_AVX2 = 0x00000020; -#endif - -/* - * Extra stuff needed for detection of OS support for SSE on IA-32 - */ -#if defined(FLAC__CPU_IA32) && !defined FLAC__NO_ASM && (defined FLAC__HAS_NASM || defined FLAC__HAS_X86INTRIN) && !defined FLAC__NO_SSE_OS && !defined FLAC__SSE_OS -# if defined(__linux__) -/* - * If the OS doesn't support SSE, we will get here with a SIGILL. We - * modify the return address to jump over the offending SSE instruction - * and also the operation following it that indicates the instruction - * executed successfully. In this way we use no global variables and - * stay thread-safe. - * - * 3 + 3 + 6: - * 3 bytes for "xorps xmm0,xmm0" - * 3 bytes for estimate of how long the follwing "inc var" instruction is - * 6 bytes extra in case our estimate is wrong - * 12 bytes puts us in the NOP "landing zone" - */ -# include - static void sigill_handler_sse_os(int signal, siginfo_t *si, void *uc) - { - (void)signal, (void)si; - ((ucontext_t*)uc)->uc_mcontext.gregs[14/*REG_EIP*/] += 3 + 3 + 6; - } -# elif defined(_MSC_VER) -# include -# endif -#endif - - -void FLAC__cpu_info(FLAC__CPUInfo *info) -{ -/* - * IA32-specific - */ -#ifdef FLAC__CPU_IA32 - FLAC__bool ia32_fxsr = false; - FLAC__bool ia32_osxsave = false; - (void) ia32_fxsr; (void) ia32_osxsave; /* to avoid warnings about unused variables */ - memset(info, 0, sizeof(*info)); - info->type = FLAC__CPUINFO_TYPE_IA32; -#if !defined FLAC__NO_ASM && (defined FLAC__HAS_NASM || defined FLAC__HAS_X86INTRIN) - info->use_asm = true; /* we assume a minimum of 80386 with FLAC__CPU_IA32 */ -#ifdef FLAC__HAS_X86INTRIN - if(!FLAC__cpu_have_cpuid_x86()) - return; -#else - if(!FLAC__cpu_have_cpuid_asm_ia32()) - return; -#endif - { - /* http://www.sandpile.org/x86/cpuid.htm */ -#ifdef FLAC__HAS_X86INTRIN - FLAC__uint32 flags_eax, flags_ebx, flags_ecx, flags_edx; - FLAC__cpu_info_x86(1, &flags_eax, &flags_ebx, &flags_ecx, &flags_edx); -#else - FLAC__uint32 flags_ecx, flags_edx; - FLAC__cpu_info_asm_ia32(&flags_edx, &flags_ecx); -#endif - info->ia32.cmov = (flags_edx & FLAC__CPUINFO_IA32_CPUID_CMOV )? true : false; - info->ia32.mmx = (flags_edx & FLAC__CPUINFO_IA32_CPUID_MMX )? true : false; - ia32_fxsr = (flags_edx & FLAC__CPUINFO_IA32_CPUID_FXSR )? true : false; - info->ia32.sse = (flags_edx & FLAC__CPUINFO_IA32_CPUID_SSE )? true : false; - info->ia32.sse2 = (flags_edx & FLAC__CPUINFO_IA32_CPUID_SSE2 )? true : false; - info->ia32.sse3 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE3 )? true : false; - info->ia32.ssse3 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSSE3)? true : false; - info->ia32.sse41 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE41)? true : false; - info->ia32.sse42 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE42)? true : false; -#if defined FLAC__HAS_X86INTRIN && defined FLAC__AVX_SUPPORTED - ia32_osxsave = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_OSXSAVE)? true : false; - info->ia32.avx = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_AVX )? true : false; - info->ia32.fma = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_FMA )? true : false; - FLAC__cpu_info_x86(7, &flags_eax, &flags_ebx, &flags_ecx, &flags_edx); - info->ia32.avx2 = (flags_ebx & FLAC__CPUINFO_IA32_CPUID_AVX2 )? true : false; -#endif - } - -#ifdef DEBUG - fprintf(stderr, "CPU info (IA-32):\n"); - fprintf(stderr, " CMOV ....... %c\n", info->ia32.cmov ? 'Y' : 'n'); - fprintf(stderr, " MMX ........ %c\n", info->ia32.mmx ? 'Y' : 'n'); - fprintf(stderr, " SSE ........ %c\n", info->ia32.sse ? 'Y' : 'n'); - fprintf(stderr, " SSE2 ....... %c\n", info->ia32.sse2 ? 'Y' : 'n'); - fprintf(stderr, " SSE3 ....... %c\n", info->ia32.sse3 ? 'Y' : 'n'); - fprintf(stderr, " SSSE3 ...... %c\n", info->ia32.ssse3 ? 'Y' : 'n'); - fprintf(stderr, " SSE41 ...... %c\n", info->ia32.sse41 ? 'Y' : 'n'); - fprintf(stderr, " SSE42 ...... %c\n", info->ia32.sse42 ? 'Y' : 'n'); -# if defined FLAC__HAS_X86INTRIN && defined FLAC__AVX_SUPPORTED - fprintf(stderr, " AVX ........ %c\n", info->ia32.avx ? 'Y' : 'n'); - fprintf(stderr, " FMA ........ %c\n", info->ia32.fma ? 'Y' : 'n'); - fprintf(stderr, " AVX2 ....... %c\n", info->ia32.avx2 ? 'Y' : 'n'); -# endif -#endif - - /* - * now have to check for OS support of SSE instructions - */ - if(info->ia32.sse) { -#if defined FLAC__NO_SSE_OS - /* assume user knows better than us; turn it off */ - disable_sse(info); -#elif defined FLAC__SSE_OS - /* assume user knows better than us; leave as detected above */ -#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) || defined(__APPLE__) - int sse = 0; - size_t len; - /* at least one of these must work: */ - len = sizeof(sse); sse = sse || (sysctlbyname("hw.instruction_sse", &sse, &len, NULL, 0) == 0 && sse); - len = sizeof(sse); sse = sse || (sysctlbyname("hw.optional.sse" , &sse, &len, NULL, 0) == 0 && sse); /* __APPLE__ ? */ - if(!sse) - disable_sse(info); -#elif defined(__NetBSD__) || defined (__OpenBSD__) -# if __NetBSD_Version__ >= 105250000 || (defined __OpenBSD__) - int val = 0, mib[2] = { CTL_MACHDEP, CPU_SSE }; - size_t len = sizeof(val); - if(sysctl(mib, 2, &val, &len, NULL, 0) < 0 || !val) - disable_sse(info); - else { /* double-check SSE2 */ - mib[1] = CPU_SSE2; - len = sizeof(val); - if(sysctl(mib, 2, &val, &len, NULL, 0) < 0 || !val) { - disable_sse(info); - info->ia32.sse = true; - } - } -# else - disable_sse(info); -# endif -#elif defined(__linux__) - int sse = 0; - struct sigaction sigill_save; - struct sigaction sigill_sse; - sigill_sse.sa_sigaction = sigill_handler_sse_os; - __sigemptyset(&sigill_sse.sa_mask); - sigill_sse.sa_flags = SA_SIGINFO | SA_RESETHAND; /* SA_RESETHAND just in case our SIGILL return jump breaks, so we don't get stuck in a loop */ - if(0 == sigaction(SIGILL, &sigill_sse, &sigill_save)) - { - /* http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html */ - /* see sigill_handler_sse_os() for an explanation of the following: */ - asm volatile ( - "xorps %%xmm0,%%xmm0\n\t" /* will cause SIGILL if unsupported by OS */ - "incl %0\n\t" /* SIGILL handler will jump over this */ - /* landing zone */ - "nop\n\t" /* SIGILL jump lands here if "inc" is 9 bytes */ - "nop\n\t" - "nop\n\t" - "nop\n\t" - "nop\n\t" - "nop\n\t" - "nop\n\t" /* SIGILL jump lands here if "inc" is 3 bytes (expected) */ - "nop\n\t" - "nop" /* SIGILL jump lands here if "inc" is 1 byte */ - : "=r"(sse) - : "0"(sse) - ); - - sigaction(SIGILL, &sigill_save, NULL); - } - - if(!sse) - disable_sse(info); -#elif defined(_MSC_VER) - __try { - __asm { - xorps xmm0,xmm0 - } - } - __except(EXCEPTION_EXECUTE_HANDLER) { - if (_exception_code() == STATUS_ILLEGAL_INSTRUCTION) - disable_sse(info); - } -#elif defined(__GNUC__) /* MinGW goes here */ - int sse = 0; - /* Based on the idea described in Agner Fog's manual "Optimizing subroutines in assembly language" */ - /* In theory, not guaranteed to detect lack of OS SSE support on some future Intel CPUs, but in practice works (see the aforementioned manual) */ - if (ia32_fxsr) { - struct { - FLAC__uint32 buff[128]; - } __attribute__((aligned(16))) fxsr; - FLAC__uint32 old_val, new_val; - - asm volatile ("fxsave %0" : "=m" (fxsr) : "m" (fxsr)); - old_val = fxsr.buff[50]; - fxsr.buff[50] ^= 0x0013c0de; /* change value in the buffer */ - asm volatile ("fxrstor %0" : "=m" (fxsr) : "m" (fxsr)); /* try to change SSE register */ - fxsr.buff[50] = old_val; /* restore old value in the buffer */ - asm volatile ("fxsave %0 " : "=m" (fxsr) : "m" (fxsr)); /* old value will be overwritten if SSE register was changed */ - new_val = fxsr.buff[50]; /* == old_val if FXRSTOR didn't change SSE register and (old_val ^ 0x0013c0de) otherwise */ - fxsr.buff[50] = old_val; /* again restore old value in the buffer */ - asm volatile ("fxrstor %0" : "=m" (fxsr) : "m" (fxsr)); /* restore old values of registers */ - - if ((old_val^new_val) == 0x0013c0de) - sse = 1; - } - if(!sse) - disable_sse(info); -#else - /* no way to test, disable to be safe */ - disable_sse(info); -#endif -#ifdef DEBUG - fprintf(stderr, " SSE OS sup . %c\n", info->ia32.sse ? 'Y' : 'n'); -#endif - } - else /* info->ia32.sse == false */ - disable_sse(info); - - /* - * now have to check for OS support of AVX instructions - */ - if(info->ia32.avx && ia32_osxsave) { - FLAC__uint32 ecr = FLAC__cpu_xgetbv_x86(); - if ((ecr & 0x6) != 0x6) - disable_avx(info); -#ifdef DEBUG - fprintf(stderr, " AVX OS sup . %c\n", info->ia32.avx ? 'Y' : 'n'); -#endif - } - else /* no OS AVX support*/ - disable_avx(info); -#else - info->use_asm = false; -#endif - -/* - * x86-64-specific - */ -#elif defined FLAC__CPU_X86_64 - FLAC__bool x86_osxsave = false; - (void) x86_osxsave; /* to avoid warnings about unused variables */ - memset(info, 0, sizeof(*info)); - info->type = FLAC__CPUINFO_TYPE_X86_64; -#if !defined FLAC__NO_ASM && defined FLAC__HAS_X86INTRIN - info->use_asm = true; - { - /* http://www.sandpile.org/x86/cpuid.htm */ - FLAC__uint32 flags_eax, flags_ebx, flags_ecx, flags_edx; - FLAC__cpu_info_x86(1, &flags_eax, &flags_ebx, &flags_ecx, &flags_edx); - info->x86.sse3 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE3 )? true : false; - info->x86.ssse3 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSSE3)? true : false; - info->x86.sse41 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE41)? true : false; - info->x86.sse42 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE42)? true : false; -#if defined FLAC__AVX_SUPPORTED - x86_osxsave = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_OSXSAVE)? true : false; - info->x86.avx = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_AVX )? true : false; - info->x86.fma = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_FMA )? true : false; - FLAC__cpu_info_x86(7, &flags_eax, &flags_ebx, &flags_ecx, &flags_edx); - info->x86.avx2 = (flags_ebx & FLAC__CPUINFO_IA32_CPUID_AVX2 )? true : false; -#endif - } -#ifdef DEBUG - fprintf(stderr, "CPU info (x86-64):\n"); - fprintf(stderr, " SSE3 ....... %c\n", info->x86.sse3 ? 'Y' : 'n'); - fprintf(stderr, " SSSE3 ...... %c\n", info->x86.ssse3 ? 'Y' : 'n'); - fprintf(stderr, " SSE41 ...... %c\n", info->x86.sse41 ? 'Y' : 'n'); - fprintf(stderr, " SSE42 ...... %c\n", info->x86.sse42 ? 'Y' : 'n'); -# if defined FLAC__AVX_SUPPORTED - fprintf(stderr, " AVX ........ %c\n", info->x86.avx ? 'Y' : 'n'); - fprintf(stderr, " FMA ........ %c\n", info->x86.fma ? 'Y' : 'n'); - fprintf(stderr, " AVX2 ....... %c\n", info->x86.avx2 ? 'Y' : 'n'); -# endif -#endif - - /* - * now have to check for OS support of AVX instructions - */ - if(info->x86.avx && x86_osxsave) { - FLAC__uint32 ecr = FLAC__cpu_xgetbv_x86(); - if ((ecr & 0x6) != 0x6) - disable_avx(info); -#ifdef DEBUG - fprintf(stderr, " AVX OS sup . %c\n", info->x86.avx ? 'Y' : 'n'); -#endif - } - else /* no OS AVX support*/ - disable_avx(info); -#else - info->use_asm = false; -#endif - -/* - * unknown CPU - */ -#else - info->type = FLAC__CPUINFO_TYPE_UNKNOWN; - info->use_asm = false; -#endif -} - -#if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN - -#if defined _MSC_VER -#include /* for __cpuid() and _xgetbv() */ -#elif defined __GNUC__ && defined HAVE_CPUID_H -#include /* for __get_cpuid() and __get_cpuid_max() */ -#endif - -FLAC__uint32 FLAC__cpu_have_cpuid_x86(void) -{ -#ifdef FLAC__CPU_X86_64 - return 1; -#else -# if defined _MSC_VER || defined __INTEL_COMPILER /* Do they support CPUs w/o CPUID support (or OSes that work on those CPUs)? */ - FLAC__uint32 flags1, flags2; - __asm { - pushfd - pushfd - pop eax - mov flags1, eax - xor eax, 0x200000 - push eax - popfd - pushfd - pop eax - mov flags2, eax - popfd - } - if (((flags1^flags2) & 0x200000) != 0) - return 1; - else - return 0; -# elif defined __GNUC__ && defined HAVE_CPUID_H - if (__get_cpuid_max(0, 0) != 0) - return 1; - else - return 0; -# else - return 0; -# endif -#endif -} - -void FLAC__cpu_info_x86(FLAC__uint32 level, FLAC__uint32 *eax, FLAC__uint32 *ebx, FLAC__uint32 *ecx, FLAC__uint32 *edx) -{ -#if defined _MSC_VER || defined __INTEL_COMPILER - int cpuinfo[4]; - int ext = level & 0x80000000; - __cpuid(cpuinfo, ext); - if((unsigned)cpuinfo[0] < level) { - *eax = *ebx = *ecx = *edx = 0; - return; - } -#if defined FLAC__AVX_SUPPORTED - __cpuidex(cpuinfo, level, 0); /* for AVX2 detection */ -#else - __cpuid(cpuinfo, level); /* some old compilers don't support __cpuidex */ -#endif - *eax = cpuinfo[0]; *ebx = cpuinfo[1]; *ecx = cpuinfo[2]; *edx = cpuinfo[3]; -#elif defined __GNUC__ && defined HAVE_CPUID_H - FLAC__uint32 ext = level & 0x80000000; - __cpuid(ext, *eax, *ebx, *ecx, *edx); - if (*eax < level) { - *eax = *ebx = *ecx = *edx = 0; - return; - } - __cpuid_count(level, 0, *eax, *ebx, *ecx, *edx); -#else - *eax = *ebx = *ecx = *edx = 0; -#endif -} - -FLAC__uint32 FLAC__cpu_xgetbv_x86(void) -{ -#if (defined _MSC_VER || defined __INTEL_COMPILER) && defined FLAC__AVX_SUPPORTED - return (FLAC__uint32)_xgetbv(0); -#elif defined __GNUC__ - FLAC__uint32 lo, hi; - asm volatile (".byte 0x0f, 0x01, 0xd0" : "=a"(lo), "=d"(hi) : "c" (0)); - return lo; -#else - return 0; -#endif -} - -#endif /* (FLAC__CPU_IA32 || FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/crc.c b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/crc.c deleted file mode 100644 index de2cb188..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/crc.c +++ /dev/null @@ -1,143 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 -#endif - -#include "private/crc.h" - -/* CRC-8, poly = x^8 + x^2 + x^1 + x^0, init = 0 */ - -FLAC__byte const FLAC__crc8_table[256] = { - 0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15, - 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D, - 0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65, - 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D, - 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5, - 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD, - 0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85, - 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD, - 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2, - 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA, - 0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2, - 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A, - 0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32, - 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A, - 0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42, - 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A, - 0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C, - 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4, - 0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC, - 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4, - 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C, - 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44, - 0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C, - 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34, - 0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B, - 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63, - 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B, - 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13, - 0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB, - 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83, - 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB, - 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3 -}; - -/* CRC-16, poly = x^16 + x^15 + x^2 + x^0, init = 0 */ - -unsigned const FLAC__crc16_table[256] = { - 0x0000, 0x8005, 0x800f, 0x000a, 0x801b, 0x001e, 0x0014, 0x8011, - 0x8033, 0x0036, 0x003c, 0x8039, 0x0028, 0x802d, 0x8027, 0x0022, - 0x8063, 0x0066, 0x006c, 0x8069, 0x0078, 0x807d, 0x8077, 0x0072, - 0x0050, 0x8055, 0x805f, 0x005a, 0x804b, 0x004e, 0x0044, 0x8041, - 0x80c3, 0x00c6, 0x00cc, 0x80c9, 0x00d8, 0x80dd, 0x80d7, 0x00d2, - 0x00f0, 0x80f5, 0x80ff, 0x00fa, 0x80eb, 0x00ee, 0x00e4, 0x80e1, - 0x00a0, 0x80a5, 0x80af, 0x00aa, 0x80bb, 0x00be, 0x00b4, 0x80b1, - 0x8093, 0x0096, 0x009c, 0x8099, 0x0088, 0x808d, 0x8087, 0x0082, - 0x8183, 0x0186, 0x018c, 0x8189, 0x0198, 0x819d, 0x8197, 0x0192, - 0x01b0, 0x81b5, 0x81bf, 0x01ba, 0x81ab, 0x01ae, 0x01a4, 0x81a1, - 0x01e0, 0x81e5, 0x81ef, 0x01ea, 0x81fb, 0x01fe, 0x01f4, 0x81f1, - 0x81d3, 0x01d6, 0x01dc, 0x81d9, 0x01c8, 0x81cd, 0x81c7, 0x01c2, - 0x0140, 0x8145, 0x814f, 0x014a, 0x815b, 0x015e, 0x0154, 0x8151, - 0x8173, 0x0176, 0x017c, 0x8179, 0x0168, 0x816d, 0x8167, 0x0162, - 0x8123, 0x0126, 0x012c, 0x8129, 0x0138, 0x813d, 0x8137, 0x0132, - 0x0110, 0x8115, 0x811f, 0x011a, 0x810b, 0x010e, 0x0104, 0x8101, - 0x8303, 0x0306, 0x030c, 0x8309, 0x0318, 0x831d, 0x8317, 0x0312, - 0x0330, 0x8335, 0x833f, 0x033a, 0x832b, 0x032e, 0x0324, 0x8321, - 0x0360, 0x8365, 0x836f, 0x036a, 0x837b, 0x037e, 0x0374, 0x8371, - 0x8353, 0x0356, 0x035c, 0x8359, 0x0348, 0x834d, 0x8347, 0x0342, - 0x03c0, 0x83c5, 0x83cf, 0x03ca, 0x83db, 0x03de, 0x03d4, 0x83d1, - 0x83f3, 0x03f6, 0x03fc, 0x83f9, 0x03e8, 0x83ed, 0x83e7, 0x03e2, - 0x83a3, 0x03a6, 0x03ac, 0x83a9, 0x03b8, 0x83bd, 0x83b7, 0x03b2, - 0x0390, 0x8395, 0x839f, 0x039a, 0x838b, 0x038e, 0x0384, 0x8381, - 0x0280, 0x8285, 0x828f, 0x028a, 0x829b, 0x029e, 0x0294, 0x8291, - 0x82b3, 0x02b6, 0x02bc, 0x82b9, 0x02a8, 0x82ad, 0x82a7, 0x02a2, - 0x82e3, 0x02e6, 0x02ec, 0x82e9, 0x02f8, 0x82fd, 0x82f7, 0x02f2, - 0x02d0, 0x82d5, 0x82df, 0x02da, 0x82cb, 0x02ce, 0x02c4, 0x82c1, - 0x8243, 0x0246, 0x024c, 0x8249, 0x0258, 0x825d, 0x8257, 0x0252, - 0x0270, 0x8275, 0x827f, 0x027a, 0x826b, 0x026e, 0x0264, 0x8261, - 0x0220, 0x8225, 0x822f, 0x022a, 0x823b, 0x023e, 0x0234, 0x8231, - 0x8213, 0x0216, 0x021c, 0x8219, 0x0208, 0x820d, 0x8207, 0x0202 -}; - - -void FLAC__crc8_update(const FLAC__byte data, FLAC__uint8 *crc) -{ - *crc = FLAC__crc8_table[*crc ^ data]; -} - -void FLAC__crc8_update_block(const FLAC__byte *data, unsigned len, FLAC__uint8 *crc) -{ - while(len--) - *crc = FLAC__crc8_table[*crc ^ *data++]; -} - -FLAC__uint8 FLAC__crc8(const FLAC__byte *data, unsigned len) -{ - FLAC__uint8 crc = 0; - - while(len--) - crc = FLAC__crc8_table[crc ^ *data++]; - - return crc; -} - -unsigned FLAC__crc16(const FLAC__byte *data, unsigned len) -{ - unsigned crc = 0; - - while(len--) - crc = ((crc<<8) ^ FLAC__crc16_table[(crc>>8) ^ *data++]) & 0xffff; - - return crc; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/fixed.c b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/fixed.c deleted file mode 100644 index 74b31b32..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/fixed.c +++ /dev/null @@ -1,419 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 -#endif - -#include -#include -#include "share/compat.h" -#include "private/bitmath.h" -#include "private/fixed.h" -#include "private/macros.h" -#include "FLAC/assert.h" - -#ifdef local_abs -#undef local_abs -#endif -#define local_abs(x) ((unsigned)((x)<0? -(x) : (x))) - -#ifdef FLAC__INTEGER_ONLY_LIBRARY -/* rbps stands for residual bits per sample - * - * (ln(2) * err) - * rbps = log (-----------) - * 2 ( n ) - */ -static FLAC__fixedpoint local__compute_rbps_integerized(FLAC__uint32 err, FLAC__uint32 n) -{ - FLAC__uint32 rbps; - unsigned bits; /* the number of bits required to represent a number */ - int fracbits; /* the number of bits of rbps that comprise the fractional part */ - - FLAC__ASSERT(sizeof(rbps) == sizeof(FLAC__fixedpoint)); - FLAC__ASSERT(err > 0); - FLAC__ASSERT(n > 0); - - FLAC__ASSERT(n <= FLAC__MAX_BLOCK_SIZE); - if(err <= n) - return 0; - /* - * The above two things tell us 1) n fits in 16 bits; 2) err/n > 1. - * These allow us later to know we won't lose too much precision in the - * fixed-point division (err< 0); - bits = FLAC__bitmath_ilog2(err)+1; - if(bits > 16) { - err >>= (bits-16); - fracbits -= (bits-16); - } - rbps = (FLAC__uint32)err; - - /* Multiply by fixed-point version of ln(2), with 16 fractional bits */ - rbps *= FLAC__FP_LN2; - fracbits += 16; - FLAC__ASSERT(fracbits >= 0); - - /* FLAC__fixedpoint_log2 requires fracbits%4 to be 0 */ - { - const int f = fracbits & 3; - if(f) { - rbps >>= f; - fracbits -= f; - } - } - - rbps = FLAC__fixedpoint_log2(rbps, fracbits, (unsigned)(-1)); - - if(rbps == 0) - return 0; - - /* - * The return value must have 16 fractional bits. Since the whole part - * of the base-2 log of a 32 bit number must fit in 5 bits, and fracbits - * must be >= -3, these assertion allows us to be able to shift rbps - * left if necessary to get 16 fracbits without losing any bits of the - * whole part of rbps. - * - * There is a slight chance due to accumulated error that the whole part - * will require 6 bits, so we use 6 in the assertion. Really though as - * long as it fits in 13 bits (32 - (16 - (-3))) we are fine. - */ - FLAC__ASSERT((int)FLAC__bitmath_ilog2(rbps)+1 <= fracbits + 6); - FLAC__ASSERT(fracbits >= -3); - - /* now shift the decimal point into place */ - if(fracbits < 16) - return rbps << (16-fracbits); - else if(fracbits > 16) - return rbps >> (fracbits-16); - else - return rbps; -} - -static FLAC__fixedpoint local__compute_rbps_wide_integerized(FLAC__uint64 err, FLAC__uint32 n) -{ - FLAC__uint32 rbps; - unsigned bits; /* the number of bits required to represent a number */ - int fracbits; /* the number of bits of rbps that comprise the fractional part */ - - FLAC__ASSERT(sizeof(rbps) == sizeof(FLAC__fixedpoint)); - FLAC__ASSERT(err > 0); - FLAC__ASSERT(n > 0); - - FLAC__ASSERT(n <= FLAC__MAX_BLOCK_SIZE); - if(err <= n) - return 0; - /* - * The above two things tell us 1) n fits in 16 bits; 2) err/n > 1. - * These allow us later to know we won't lose too much precision in the - * fixed-point division (err< 0); - bits = FLAC__bitmath_ilog2_wide(err)+1; - if(bits > 16) { - err >>= (bits-16); - fracbits -= (bits-16); - } - rbps = (FLAC__uint32)err; - - /* Multiply by fixed-point version of ln(2), with 16 fractional bits */ - rbps *= FLAC__FP_LN2; - fracbits += 16; - FLAC__ASSERT(fracbits >= 0); - - /* FLAC__fixedpoint_log2 requires fracbits%4 to be 0 */ - { - const int f = fracbits & 3; - if(f) { - rbps >>= f; - fracbits -= f; - } - } - - rbps = FLAC__fixedpoint_log2(rbps, fracbits, (unsigned)(-1)); - - if(rbps == 0) - return 0; - - /* - * The return value must have 16 fractional bits. Since the whole part - * of the base-2 log of a 32 bit number must fit in 5 bits, and fracbits - * must be >= -3, these assertion allows us to be able to shift rbps - * left if necessary to get 16 fracbits without losing any bits of the - * whole part of rbps. - * - * There is a slight chance due to accumulated error that the whole part - * will require 6 bits, so we use 6 in the assertion. Really though as - * long as it fits in 13 bits (32 - (16 - (-3))) we are fine. - */ - FLAC__ASSERT((int)FLAC__bitmath_ilog2(rbps)+1 <= fracbits + 6); - FLAC__ASSERT(fracbits >= -3); - - /* now shift the decimal point into place */ - if(fracbits < 16) - return rbps << (16-fracbits); - else if(fracbits > 16) - return rbps >> (fracbits-16); - else - return rbps; -} -#endif - -#ifndef FLAC__INTEGER_ONLY_LIBRARY -unsigned FLAC__fixed_compute_best_predictor(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]) -#else -unsigned FLAC__fixed_compute_best_predictor(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]) -#endif -{ - FLAC__int32 last_error_0 = data[-1]; - FLAC__int32 last_error_1 = data[-1] - data[-2]; - FLAC__int32 last_error_2 = last_error_1 - (data[-2] - data[-3]); - FLAC__int32 last_error_3 = last_error_2 - (data[-2] - 2*data[-3] + data[-4]); - FLAC__int32 error, save; - FLAC__uint32 total_error_0 = 0, total_error_1 = 0, total_error_2 = 0, total_error_3 = 0, total_error_4 = 0; - unsigned i, order; - - for(i = 0; i < data_len; i++) { - error = data[i] ; total_error_0 += local_abs(error); save = error; - error -= last_error_0; total_error_1 += local_abs(error); last_error_0 = save; save = error; - error -= last_error_1; total_error_2 += local_abs(error); last_error_1 = save; save = error; - error -= last_error_2; total_error_3 += local_abs(error); last_error_2 = save; save = error; - error -= last_error_3; total_error_4 += local_abs(error); last_error_3 = save; - } - - if(total_error_0 < flac_min(flac_min(flac_min(total_error_1, total_error_2), total_error_3), total_error_4)) - order = 0; - else if(total_error_1 < flac_min(flac_min(total_error_2, total_error_3), total_error_4)) - order = 1; - else if(total_error_2 < flac_min(total_error_3, total_error_4)) - order = 2; - else if(total_error_3 < total_error_4) - order = 3; - else - order = 4; - - /* Estimate the expected number of bits per residual signal sample. */ - /* 'total_error*' is linearly related to the variance of the residual */ - /* signal, so we use it directly to compute E(|x|) */ - FLAC__ASSERT(data_len > 0 || total_error_0 == 0); - FLAC__ASSERT(data_len > 0 || total_error_1 == 0); - FLAC__ASSERT(data_len > 0 || total_error_2 == 0); - FLAC__ASSERT(data_len > 0 || total_error_3 == 0); - FLAC__ASSERT(data_len > 0 || total_error_4 == 0); -#ifndef FLAC__INTEGER_ONLY_LIBRARY - residual_bits_per_sample[0] = (FLAC__float)((total_error_0 > 0) ? log(M_LN2 * (FLAC__double)total_error_0 / (FLAC__double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[1] = (FLAC__float)((total_error_1 > 0) ? log(M_LN2 * (FLAC__double)total_error_1 / (FLAC__double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[2] = (FLAC__float)((total_error_2 > 0) ? log(M_LN2 * (FLAC__double)total_error_2 / (FLAC__double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[3] = (FLAC__float)((total_error_3 > 0) ? log(M_LN2 * (FLAC__double)total_error_3 / (FLAC__double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[4] = (FLAC__float)((total_error_4 > 0) ? log(M_LN2 * (FLAC__double)total_error_4 / (FLAC__double)data_len) / M_LN2 : 0.0); -#else - residual_bits_per_sample[0] = (total_error_0 > 0) ? local__compute_rbps_integerized(total_error_0, data_len) : 0; - residual_bits_per_sample[1] = (total_error_1 > 0) ? local__compute_rbps_integerized(total_error_1, data_len) : 0; - residual_bits_per_sample[2] = (total_error_2 > 0) ? local__compute_rbps_integerized(total_error_2, data_len) : 0; - residual_bits_per_sample[3] = (total_error_3 > 0) ? local__compute_rbps_integerized(total_error_3, data_len) : 0; - residual_bits_per_sample[4] = (total_error_4 > 0) ? local__compute_rbps_integerized(total_error_4, data_len) : 0; -#endif - - return order; -} - -#ifndef FLAC__INTEGER_ONLY_LIBRARY -unsigned FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]) -#else -unsigned FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]) -#endif -{ - FLAC__int32 last_error_0 = data[-1]; - FLAC__int32 last_error_1 = data[-1] - data[-2]; - FLAC__int32 last_error_2 = last_error_1 - (data[-2] - data[-3]); - FLAC__int32 last_error_3 = last_error_2 - (data[-2] - 2*data[-3] + data[-4]); - FLAC__int32 error, save; - /* total_error_* are 64-bits to avoid overflow when encoding - * erratic signals when the bits-per-sample and blocksize are - * large. - */ - FLAC__uint64 total_error_0 = 0, total_error_1 = 0, total_error_2 = 0, total_error_3 = 0, total_error_4 = 0; - unsigned i, order; - - for(i = 0; i < data_len; i++) { - error = data[i] ; total_error_0 += local_abs(error); save = error; - error -= last_error_0; total_error_1 += local_abs(error); last_error_0 = save; save = error; - error -= last_error_1; total_error_2 += local_abs(error); last_error_1 = save; save = error; - error -= last_error_2; total_error_3 += local_abs(error); last_error_2 = save; save = error; - error -= last_error_3; total_error_4 += local_abs(error); last_error_3 = save; - } - - if(total_error_0 < flac_min(flac_min(flac_min(total_error_1, total_error_2), total_error_3), total_error_4)) - order = 0; - else if(total_error_1 < flac_min(flac_min(total_error_2, total_error_3), total_error_4)) - order = 1; - else if(total_error_2 < flac_min(total_error_3, total_error_4)) - order = 2; - else if(total_error_3 < total_error_4) - order = 3; - else - order = 4; - - /* Estimate the expected number of bits per residual signal sample. */ - /* 'total_error*' is linearly related to the variance of the residual */ - /* signal, so we use it directly to compute E(|x|) */ - FLAC__ASSERT(data_len > 0 || total_error_0 == 0); - FLAC__ASSERT(data_len > 0 || total_error_1 == 0); - FLAC__ASSERT(data_len > 0 || total_error_2 == 0); - FLAC__ASSERT(data_len > 0 || total_error_3 == 0); - FLAC__ASSERT(data_len > 0 || total_error_4 == 0); -#ifndef FLAC__INTEGER_ONLY_LIBRARY - residual_bits_per_sample[0] = (FLAC__float)((total_error_0 > 0) ? log(M_LN2 * (FLAC__double)total_error_0 / (FLAC__double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[1] = (FLAC__float)((total_error_1 > 0) ? log(M_LN2 * (FLAC__double)total_error_1 / (FLAC__double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[2] = (FLAC__float)((total_error_2 > 0) ? log(M_LN2 * (FLAC__double)total_error_2 / (FLAC__double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[3] = (FLAC__float)((total_error_3 > 0) ? log(M_LN2 * (FLAC__double)total_error_3 / (FLAC__double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[4] = (FLAC__float)((total_error_4 > 0) ? log(M_LN2 * (FLAC__double)total_error_4 / (FLAC__double)data_len) / M_LN2 : 0.0); -#else - residual_bits_per_sample[0] = (total_error_0 > 0) ? local__compute_rbps_wide_integerized(total_error_0, data_len) : 0; - residual_bits_per_sample[1] = (total_error_1 > 0) ? local__compute_rbps_wide_integerized(total_error_1, data_len) : 0; - residual_bits_per_sample[2] = (total_error_2 > 0) ? local__compute_rbps_wide_integerized(total_error_2, data_len) : 0; - residual_bits_per_sample[3] = (total_error_3 > 0) ? local__compute_rbps_wide_integerized(total_error_3, data_len) : 0; - residual_bits_per_sample[4] = (total_error_4 > 0) ? local__compute_rbps_wide_integerized(total_error_4, data_len) : 0; -#endif - - return order; -} - -void FLAC__fixed_compute_residual(const FLAC__int32 data[], unsigned data_len, unsigned order, FLAC__int32 residual[]) -{ - const int idata_len = (int)data_len; - int i; - - switch(order) { - case 0: - FLAC__ASSERT(sizeof(residual[0]) == sizeof(data[0])); - memcpy(residual, data, sizeof(residual[0])*data_len); - break; - case 1: - for(i = 0; i < idata_len; i++) - residual[i] = data[i] - data[i-1]; - break; - case 2: - for(i = 0; i < idata_len; i++) -#if 1 /* OPT: may be faster with some compilers on some systems */ - residual[i] = data[i] - (data[i-1] << 1) + data[i-2]; -#else - residual[i] = data[i] - 2*data[i-1] + data[i-2]; -#endif - break; - case 3: - for(i = 0; i < idata_len; i++) -#if 1 /* OPT: may be faster with some compilers on some systems */ - residual[i] = data[i] - (((data[i-1]-data[i-2])<<1) + (data[i-1]-data[i-2])) - data[i-3]; -#else - residual[i] = data[i] - 3*data[i-1] + 3*data[i-2] - data[i-3]; -#endif - break; - case 4: - for(i = 0; i < idata_len; i++) -#if 1 /* OPT: may be faster with some compilers on some systems */ - residual[i] = data[i] - ((data[i-1]+data[i-3])<<2) + ((data[i-2]<<2) + (data[i-2]<<1)) + data[i-4]; -#else - residual[i] = data[i] - 4*data[i-1] + 6*data[i-2] - 4*data[i-3] + data[i-4]; -#endif - break; - default: - FLAC__ASSERT(0); - } -} - -void FLAC__fixed_restore_signal(const FLAC__int32 residual[], unsigned data_len, unsigned order, FLAC__int32 data[]) -{ - int i, idata_len = (int)data_len; - - switch(order) { - case 0: - FLAC__ASSERT(sizeof(residual[0]) == sizeof(data[0])); - memcpy(data, residual, sizeof(residual[0])*data_len); - break; - case 1: - for(i = 0; i < idata_len; i++) - data[i] = residual[i] + data[i-1]; - break; - case 2: - for(i = 0; i < idata_len; i++) -#if 1 /* OPT: may be faster with some compilers on some systems */ - data[i] = residual[i] + (data[i-1]<<1) - data[i-2]; -#else - data[i] = residual[i] + 2*data[i-1] - data[i-2]; -#endif - break; - case 3: - for(i = 0; i < idata_len; i++) -#if 1 /* OPT: may be faster with some compilers on some systems */ - data[i] = residual[i] + (((data[i-1]-data[i-2])<<1) + (data[i-1]-data[i-2])) + data[i-3]; -#else - data[i] = residual[i] + 3*data[i-1] - 3*data[i-2] + data[i-3]; -#endif - break; - case 4: - for(i = 0; i < idata_len; i++) -#if 1 /* OPT: may be faster with some compilers on some systems */ - data[i] = residual[i] + ((data[i-1]+data[i-3])<<2) - ((data[i-2]<<2) + (data[i-2]<<1)) - data[i-4]; -#else - data[i] = residual[i] + 4*data[i-1] - 6*data[i-2] + 4*data[i-3] - data[i-4]; -#endif - break; - default: - FLAC__ASSERT(0); - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/fixed_intrin_sse2.c b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/fixed_intrin_sse2.c deleted file mode 100644 index 6785f92a..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/fixed_intrin_sse2.c +++ /dev/null @@ -1,253 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 -#endif - -#ifndef FLAC__INTEGER_ONLY_LIBRARY -#ifndef FLAC__NO_ASM -#if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN -#include "private/fixed.h" -#ifdef FLAC__SSE2_SUPPORTED - -#include /* SSE2 */ -#include -#include "private/macros.h" -#include "share/compat.h" -#include "FLAC/assert.h" - -#ifdef FLAC__CPU_IA32 -#define m128i_to_i64(dest, src) _mm_storel_epi64((__m128i*)&dest, src) -#else -#define m128i_to_i64(dest, src) dest = _mm_cvtsi128_si64(src) -#endif - -FLAC__SSE_TARGET("sse2") -unsigned FLAC__fixed_compute_best_predictor_intrin_sse2(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER + 1]) -{ - FLAC__uint32 total_error_0, total_error_1, total_error_2, total_error_3, total_error_4; - unsigned i, order; - - __m128i total_err0, total_err1, total_err2; - - { - FLAC__int32 itmp; - __m128i last_error; - - last_error = _mm_cvtsi32_si128(data[-1]); // 0 0 0 le0 - itmp = data[-2]; - last_error = _mm_shuffle_epi32(last_error, _MM_SHUFFLE(2,1,0,0)); - last_error = _mm_sub_epi32(last_error, _mm_cvtsi32_si128(itmp)); // 0 0 le0 le1 - itmp -= data[-3]; - last_error = _mm_shuffle_epi32(last_error, _MM_SHUFFLE(2,1,0,0)); - last_error = _mm_sub_epi32(last_error, _mm_cvtsi32_si128(itmp)); // 0 le0 le1 le2 - itmp -= data[-3] - data[-4]; - last_error = _mm_shuffle_epi32(last_error, _MM_SHUFFLE(2,1,0,0)); - last_error = _mm_sub_epi32(last_error, _mm_cvtsi32_si128(itmp)); // le0 le1 le2 le3 - - total_err0 = total_err1 = _mm_setzero_si128(); - for(i = 0; i < data_len; i++) { - __m128i err0, err1, tmp; - err0 = _mm_cvtsi32_si128(data[i]); // 0 0 0 e0 - err1 = _mm_shuffle_epi32(err0, _MM_SHUFFLE(0,0,0,0)); // e0 e0 e0 e0 -#if 1 /* OPT_SSE */ - err1 = _mm_sub_epi32(err1, last_error); - last_error = _mm_srli_si128(last_error, 4); // 0 le0 le1 le2 - err1 = _mm_sub_epi32(err1, last_error); - last_error = _mm_srli_si128(last_error, 4); // 0 0 le0 le1 - err1 = _mm_sub_epi32(err1, last_error); - last_error = _mm_srli_si128(last_error, 4); // 0 0 0 le0 - err1 = _mm_sub_epi32(err1, last_error); // e1 e2 e3 e4 -#else - last_error = _mm_add_epi32(last_error, _mm_srli_si128(last_error, 8)); // le0 le1 le2+le0 le3+le1 - last_error = _mm_add_epi32(last_error, _mm_srli_si128(last_error, 4)); // le0 le1+le0 le2+le0+le1 le3+le1+le2+le0 - err1 = _mm_sub_epi32(err1, last_error); // e1 e2 e3 e4 -#endif - tmp = _mm_slli_si128(err0, 12); // e0 0 0 0 - last_error = _mm_srli_si128(err1, 4); // 0 e1 e2 e3 - last_error = _mm_or_si128(last_error, tmp); // e0 e1 e2 e3 - - tmp = _mm_srai_epi32(err0, 31); - err0 = _mm_xor_si128(err0, tmp); - err0 = _mm_sub_epi32(err0, tmp); - tmp = _mm_srai_epi32(err1, 31); - err1 = _mm_xor_si128(err1, tmp); - err1 = _mm_sub_epi32(err1, tmp); - - total_err0 = _mm_add_epi32(total_err0, err0); // 0 0 0 te0 - total_err1 = _mm_add_epi32(total_err1, err1); // te1 te2 te3 te4 - } - } - - total_error_0 = _mm_cvtsi128_si32(total_err0); - total_err2 = total_err1; // te1 te2 te3 te4 - total_err1 = _mm_srli_si128(total_err1, 8); // 0 0 te1 te2 - total_error_4 = _mm_cvtsi128_si32(total_err2); - total_error_2 = _mm_cvtsi128_si32(total_err1); - total_err2 = _mm_srli_si128(total_err2, 4); // 0 te1 te2 te3 - total_err1 = _mm_srli_si128(total_err1, 4); // 0 0 0 te1 - total_error_3 = _mm_cvtsi128_si32(total_err2); - total_error_1 = _mm_cvtsi128_si32(total_err1); - - /* prefer higher order */ - if(total_error_0 < flac_min(flac_min(flac_min(total_error_1, total_error_2), total_error_3), total_error_4)) - order = 0; - else if(total_error_1 < flac_min(flac_min(total_error_2, total_error_3), total_error_4)) - order = 1; - else if(total_error_2 < flac_min(total_error_3, total_error_4)) - order = 2; - else if(total_error_3 < total_error_4) - order = 3; - else - order = 4; - - /* Estimate the expected number of bits per residual signal sample. */ - /* 'total_error*' is linearly related to the variance of the residual */ - /* signal, so we use it directly to compute E(|x|) */ - FLAC__ASSERT(data_len > 0 || total_error_0 == 0); - FLAC__ASSERT(data_len > 0 || total_error_1 == 0); - FLAC__ASSERT(data_len > 0 || total_error_2 == 0); - FLAC__ASSERT(data_len > 0 || total_error_3 == 0); - FLAC__ASSERT(data_len > 0 || total_error_4 == 0); - - residual_bits_per_sample[0] = (FLAC__float)((total_error_0 > 0) ? log(M_LN2 * (FLAC__double)total_error_0 / (FLAC__double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[1] = (FLAC__float)((total_error_1 > 0) ? log(M_LN2 * (FLAC__double)total_error_1 / (FLAC__double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[2] = (FLAC__float)((total_error_2 > 0) ? log(M_LN2 * (FLAC__double)total_error_2 / (FLAC__double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[3] = (FLAC__float)((total_error_3 > 0) ? log(M_LN2 * (FLAC__double)total_error_3 / (FLAC__double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[4] = (FLAC__float)((total_error_4 > 0) ? log(M_LN2 * (FLAC__double)total_error_4 / (FLAC__double)data_len) / M_LN2 : 0.0); - - return order; -} - -FLAC__SSE_TARGET("sse2") -unsigned FLAC__fixed_compute_best_predictor_wide_intrin_sse2(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER + 1]) -{ - FLAC__uint64 total_error_0, total_error_1, total_error_2, total_error_3, total_error_4; - unsigned i, order; - - __m128i total_err0, total_err1, total_err3; - - { - FLAC__int32 itmp; - __m128i last_error, zero = _mm_setzero_si128(); - - last_error = _mm_cvtsi32_si128(data[-1]); // 0 0 0 le0 - itmp = data[-2]; - last_error = _mm_shuffle_epi32(last_error, _MM_SHUFFLE(2,1,0,0)); - last_error = _mm_sub_epi32(last_error, _mm_cvtsi32_si128(itmp)); // 0 0 le0 le1 - itmp -= data[-3]; - last_error = _mm_shuffle_epi32(last_error, _MM_SHUFFLE(2,1,0,0)); - last_error = _mm_sub_epi32(last_error, _mm_cvtsi32_si128(itmp)); // 0 le0 le1 le2 - itmp -= data[-3] - data[-4]; - last_error = _mm_shuffle_epi32(last_error, _MM_SHUFFLE(2,1,0,0)); - last_error = _mm_sub_epi32(last_error, _mm_cvtsi32_si128(itmp)); // le0 le1 le2 le3 - - total_err0 = total_err1 = total_err3 = _mm_setzero_si128(); - for(i = 0; i < data_len; i++) { - __m128i err0, err1, tmp; - err0 = _mm_cvtsi32_si128(data[i]); // 0 0 0 e0 - err1 = _mm_shuffle_epi32(err0, _MM_SHUFFLE(0,0,0,0)); // e0 e0 e0 e0 -#if 1 /* OPT_SSE */ - err1 = _mm_sub_epi32(err1, last_error); - last_error = _mm_srli_si128(last_error, 4); // 0 le0 le1 le2 - err1 = _mm_sub_epi32(err1, last_error); - last_error = _mm_srli_si128(last_error, 4); // 0 0 le0 le1 - err1 = _mm_sub_epi32(err1, last_error); - last_error = _mm_srli_si128(last_error, 4); // 0 0 0 le0 - err1 = _mm_sub_epi32(err1, last_error); // e1 e2 e3 e4 -#else - last_error = _mm_add_epi32(last_error, _mm_srli_si128(last_error, 8)); // le0 le1 le2+le0 le3+le1 - last_error = _mm_add_epi32(last_error, _mm_srli_si128(last_error, 4)); // le0 le1+le0 le2+le0+le1 le3+le1+le2+le0 - err1 = _mm_sub_epi32(err1, last_error); // e1 e2 e3 e4 -#endif - tmp = _mm_slli_si128(err0, 12); // e0 0 0 0 - last_error = _mm_srli_si128(err1, 4); // 0 e1 e2 e3 - last_error = _mm_or_si128(last_error, tmp); // e0 e1 e2 e3 - - tmp = _mm_srai_epi32(err0, 31); - err0 = _mm_xor_si128(err0, tmp); - err0 = _mm_sub_epi32(err0, tmp); - tmp = _mm_srai_epi32(err1, 31); - err1 = _mm_xor_si128(err1, tmp); - err1 = _mm_sub_epi32(err1, tmp); - - total_err0 = _mm_add_epi64(total_err0, err0); // 0 te0 - err0 = _mm_unpacklo_epi32(err1, zero); // 0 |e3| 0 |e4| - err1 = _mm_unpackhi_epi32(err1, zero); // 0 |e1| 0 |e2| - total_err3 = _mm_add_epi64(total_err3, err0); // te3 te4 - total_err1 = _mm_add_epi64(total_err1, err1); // te1 te2 - } - } - - m128i_to_i64(total_error_0, total_err0); - m128i_to_i64(total_error_4, total_err3); - m128i_to_i64(total_error_2, total_err1); - total_err3 = _mm_srli_si128(total_err3, 8); // 0 te3 - total_err1 = _mm_srli_si128(total_err1, 8); // 0 te1 - m128i_to_i64(total_error_3, total_err3); - m128i_to_i64(total_error_1, total_err1); - - /* prefer higher order */ - if(total_error_0 < flac_min(flac_min(flac_min(total_error_1, total_error_2), total_error_3), total_error_4)) - order = 0; - else if(total_error_1 < flac_min(flac_min(total_error_2, total_error_3), total_error_4)) - order = 1; - else if(total_error_2 < flac_min(total_error_3, total_error_4)) - order = 2; - else if(total_error_3 < total_error_4) - order = 3; - else - order = 4; - - /* Estimate the expected number of bits per residual signal sample. */ - /* 'total_error*' is linearly related to the variance of the residual */ - /* signal, so we use it directly to compute E(|x|) */ - FLAC__ASSERT(data_len > 0 || total_error_0 == 0); - FLAC__ASSERT(data_len > 0 || total_error_1 == 0); - FLAC__ASSERT(data_len > 0 || total_error_2 == 0); - FLAC__ASSERT(data_len > 0 || total_error_3 == 0); - FLAC__ASSERT(data_len > 0 || total_error_4 == 0); - - residual_bits_per_sample[0] = (FLAC__float)((total_error_0 > 0) ? log(M_LN2 * (FLAC__double)total_error_0 / (FLAC__double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[1] = (FLAC__float)((total_error_1 > 0) ? log(M_LN2 * (FLAC__double)total_error_1 / (FLAC__double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[2] = (FLAC__float)((total_error_2 > 0) ? log(M_LN2 * (FLAC__double)total_error_2 / (FLAC__double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[3] = (FLAC__float)((total_error_3 > 0) ? log(M_LN2 * (FLAC__double)total_error_3 / (FLAC__double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[4] = (FLAC__float)((total_error_4 > 0) ? log(M_LN2 * (FLAC__double)total_error_4 / (FLAC__double)data_len) / M_LN2 : 0.0); - - return order; -} - -#endif /* FLAC__SSE2_SUPPORTED */ -#endif /* (FLAC__CPU_IA32 || FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN */ -#endif /* FLAC__NO_ASM */ -#endif /* FLAC__INTEGER_ONLY_LIBRARY */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/fixed_intrin_ssse3.c b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/fixed_intrin_ssse3.c deleted file mode 100644 index 50c663d8..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/fixed_intrin_ssse3.c +++ /dev/null @@ -1,241 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 -#endif - -#ifndef FLAC__INTEGER_ONLY_LIBRARY -#ifndef FLAC__NO_ASM -#if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN -#include "private/fixed.h" -#ifdef FLAC__SSSE3_SUPPORTED - -#include /* SSSE3 */ -#include -#include "private/macros.h" -#include "share/compat.h" -#include "FLAC/assert.h" - -#ifdef FLAC__CPU_IA32 -#define m128i_to_i64(dest, src) _mm_storel_epi64((__m128i*)&dest, src) -#else -#define m128i_to_i64(dest, src) dest = _mm_cvtsi128_si64(src) -#endif - -FLAC__SSE_TARGET("ssse3") -unsigned FLAC__fixed_compute_best_predictor_intrin_ssse3(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER + 1]) -{ - FLAC__uint32 total_error_0, total_error_1, total_error_2, total_error_3, total_error_4; - unsigned i, order; - - __m128i total_err0, total_err1, total_err2; - - { - FLAC__int32 itmp; - __m128i last_error; - - last_error = _mm_cvtsi32_si128(data[-1]); // 0 0 0 le0 - itmp = data[-2]; - last_error = _mm_shuffle_epi32(last_error, _MM_SHUFFLE(2,1,0,0)); - last_error = _mm_sub_epi32(last_error, _mm_cvtsi32_si128(itmp)); // 0 0 le0 le1 - itmp -= data[-3]; - last_error = _mm_shuffle_epi32(last_error, _MM_SHUFFLE(2,1,0,0)); - last_error = _mm_sub_epi32(last_error, _mm_cvtsi32_si128(itmp)); // 0 le0 le1 le2 - itmp -= data[-3] - data[-4]; - last_error = _mm_shuffle_epi32(last_error, _MM_SHUFFLE(2,1,0,0)); - last_error = _mm_sub_epi32(last_error, _mm_cvtsi32_si128(itmp)); // le0 le1 le2 le3 - - total_err0 = total_err1 = _mm_setzero_si128(); - for(i = 0; i < data_len; i++) { - __m128i err0, err1; - err0 = _mm_cvtsi32_si128(data[i]); // 0 0 0 e0 - err1 = _mm_shuffle_epi32(err0, _MM_SHUFFLE(0,0,0,0)); // e0 e0 e0 e0 -#if 1 /* OPT_SSE */ - err1 = _mm_sub_epi32(err1, last_error); - last_error = _mm_srli_si128(last_error, 4); // 0 le0 le1 le2 - err1 = _mm_sub_epi32(err1, last_error); - last_error = _mm_srli_si128(last_error, 4); // 0 0 le0 le1 - err1 = _mm_sub_epi32(err1, last_error); - last_error = _mm_srli_si128(last_error, 4); // 0 0 0 le0 - err1 = _mm_sub_epi32(err1, last_error); // e1 e2 e3 e4 -#else - last_error = _mm_add_epi32(last_error, _mm_srli_si128(last_error, 8)); // le0 le1 le2+le0 le3+le1 - last_error = _mm_add_epi32(last_error, _mm_srli_si128(last_error, 4)); // le0 le1+le0 le2+le0+le1 le3+le1+le2+le0 - err1 = _mm_sub_epi32(err1, last_error); // e1 e2 e3 e4 -#endif - last_error = _mm_alignr_epi8(err0, err1, 4); // e0 e1 e2 e3 - - err0 = _mm_abs_epi32(err0); - err1 = _mm_abs_epi32(err1); - - total_err0 = _mm_add_epi32(total_err0, err0); // 0 0 0 te0 - total_err1 = _mm_add_epi32(total_err1, err1); // te1 te2 te3 te4 - } - } - - total_error_0 = _mm_cvtsi128_si32(total_err0); - total_err2 = total_err1; // te1 te2 te3 te4 - total_err1 = _mm_srli_si128(total_err1, 8); // 0 0 te1 te2 - total_error_4 = _mm_cvtsi128_si32(total_err2); - total_error_2 = _mm_cvtsi128_si32(total_err1); - total_err2 = _mm_srli_si128(total_err2, 4); // 0 te1 te2 te3 - total_err1 = _mm_srli_si128(total_err1, 4); // 0 0 0 te1 - total_error_3 = _mm_cvtsi128_si32(total_err2); - total_error_1 = _mm_cvtsi128_si32(total_err1); - - /* prefer higher order */ - if(total_error_0 < flac_min(flac_min(flac_min(total_error_1, total_error_2), total_error_3), total_error_4)) - order = 0; - else if(total_error_1 < flac_min(flac_min(total_error_2, total_error_3), total_error_4)) - order = 1; - else if(total_error_2 < flac_min(total_error_3, total_error_4)) - order = 2; - else if(total_error_3 < total_error_4) - order = 3; - else - order = 4; - - /* Estimate the expected number of bits per residual signal sample. */ - /* 'total_error*' is linearly related to the variance of the residual */ - /* signal, so we use it directly to compute E(|x|) */ - FLAC__ASSERT(data_len > 0 || total_error_0 == 0); - FLAC__ASSERT(data_len > 0 || total_error_1 == 0); - FLAC__ASSERT(data_len > 0 || total_error_2 == 0); - FLAC__ASSERT(data_len > 0 || total_error_3 == 0); - FLAC__ASSERT(data_len > 0 || total_error_4 == 0); - - residual_bits_per_sample[0] = (FLAC__float)((total_error_0 > 0) ? log(M_LN2 * (FLAC__double)total_error_0 / (FLAC__double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[1] = (FLAC__float)((total_error_1 > 0) ? log(M_LN2 * (FLAC__double)total_error_1 / (FLAC__double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[2] = (FLAC__float)((total_error_2 > 0) ? log(M_LN2 * (FLAC__double)total_error_2 / (FLAC__double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[3] = (FLAC__float)((total_error_3 > 0) ? log(M_LN2 * (FLAC__double)total_error_3 / (FLAC__double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[4] = (FLAC__float)((total_error_4 > 0) ? log(M_LN2 * (FLAC__double)total_error_4 / (FLAC__double)data_len) / M_LN2 : 0.0); - - return order; -} - -FLAC__SSE_TARGET("ssse3") -unsigned FLAC__fixed_compute_best_predictor_wide_intrin_ssse3(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER + 1]) -{ - FLAC__uint64 total_error_0, total_error_1, total_error_2, total_error_3, total_error_4; - unsigned i, order; - - __m128i total_err0, total_err1, total_err3; - - { - FLAC__int32 itmp; - __m128i last_error, zero = _mm_setzero_si128(); - - last_error = _mm_cvtsi32_si128(data[-1]); // 0 0 0 le0 - itmp = data[-2]; - last_error = _mm_shuffle_epi32(last_error, _MM_SHUFFLE(2,1,0,0)); - last_error = _mm_sub_epi32(last_error, _mm_cvtsi32_si128(itmp)); // 0 0 le0 le1 - itmp -= data[-3]; - last_error = _mm_shuffle_epi32(last_error, _MM_SHUFFLE(2,1,0,0)); - last_error = _mm_sub_epi32(last_error, _mm_cvtsi32_si128(itmp)); // 0 le0 le1 le2 - itmp -= data[-3] - data[-4]; - last_error = _mm_shuffle_epi32(last_error, _MM_SHUFFLE(2,1,0,0)); - last_error = _mm_sub_epi32(last_error, _mm_cvtsi32_si128(itmp)); // le0 le1 le2 le3 - - total_err0 = total_err1 = total_err3 = _mm_setzero_si128(); - for(i = 0; i < data_len; i++) { - __m128i err0, err1; - err0 = _mm_cvtsi32_si128(data[i]); // 0 0 0 e0 - err1 = _mm_shuffle_epi32(err0, _MM_SHUFFLE(0,0,0,0)); // e0 e0 e0 e0 -#if 1 /* OPT_SSE */ - err1 = _mm_sub_epi32(err1, last_error); - last_error = _mm_srli_si128(last_error, 4); // 0 le0 le1 le2 - err1 = _mm_sub_epi32(err1, last_error); - last_error = _mm_srli_si128(last_error, 4); // 0 0 le0 le1 - err1 = _mm_sub_epi32(err1, last_error); - last_error = _mm_srli_si128(last_error, 4); // 0 0 0 le0 - err1 = _mm_sub_epi32(err1, last_error); // e1 e2 e3 e4 -#else - last_error = _mm_add_epi32(last_error, _mm_srli_si128(last_error, 8)); // le0 le1 le2+le0 le3+le1 - last_error = _mm_add_epi32(last_error, _mm_srli_si128(last_error, 4)); // le0 le1+le0 le2+le0+le1 le3+le1+le2+le0 - err1 = _mm_sub_epi32(err1, last_error); // e1 e2 e3 e4 -#endif - last_error = _mm_alignr_epi8(err0, err1, 4); // e0 e1 e2 e3 - - err0 = _mm_abs_epi32(err0); - err1 = _mm_abs_epi32(err1); // |e1| |e2| |e3| |e4| - - total_err0 = _mm_add_epi64(total_err0, err0); // 0 te0 - err0 = _mm_unpacklo_epi32(err1, zero); // 0 |e3| 0 |e4| - err1 = _mm_unpackhi_epi32(err1, zero); // 0 |e1| 0 |e2| - total_err3 = _mm_add_epi64(total_err3, err0); // te3 te4 - total_err1 = _mm_add_epi64(total_err1, err1); // te1 te2 - } - } - - m128i_to_i64(total_error_0, total_err0); - m128i_to_i64(total_error_4, total_err3); - m128i_to_i64(total_error_2, total_err1); - total_err3 = _mm_srli_si128(total_err3, 8); // 0 te3 - total_err1 = _mm_srli_si128(total_err1, 8); // 0 te1 - m128i_to_i64(total_error_3, total_err3); - m128i_to_i64(total_error_1, total_err1); - - /* prefer higher order */ - if(total_error_0 < flac_min(flac_min(flac_min(total_error_1, total_error_2), total_error_3), total_error_4)) - order = 0; - else if(total_error_1 < flac_min(flac_min(total_error_2, total_error_3), total_error_4)) - order = 1; - else if(total_error_2 < flac_min(total_error_3, total_error_4)) - order = 2; - else if(total_error_3 < total_error_4) - order = 3; - else - order = 4; - - /* Estimate the expected number of bits per residual signal sample. */ - /* 'total_error*' is linearly related to the variance of the residual */ - /* signal, so we use it directly to compute E(|x|) */ - FLAC__ASSERT(data_len > 0 || total_error_0 == 0); - FLAC__ASSERT(data_len > 0 || total_error_1 == 0); - FLAC__ASSERT(data_len > 0 || total_error_2 == 0); - FLAC__ASSERT(data_len > 0 || total_error_3 == 0); - FLAC__ASSERT(data_len > 0 || total_error_4 == 0); - - residual_bits_per_sample[0] = (FLAC__float)((total_error_0 > 0) ? log(M_LN2 * (FLAC__double)total_error_0 / (FLAC__double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[1] = (FLAC__float)((total_error_1 > 0) ? log(M_LN2 * (FLAC__double)total_error_1 / (FLAC__double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[2] = (FLAC__float)((total_error_2 > 0) ? log(M_LN2 * (FLAC__double)total_error_2 / (FLAC__double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[3] = (FLAC__float)((total_error_3 > 0) ? log(M_LN2 * (FLAC__double)total_error_3 / (FLAC__double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[4] = (FLAC__float)((total_error_4 > 0) ? log(M_LN2 * (FLAC__double)total_error_4 / (FLAC__double)data_len) / M_LN2 : 0.0); - - return order; -} - -#endif /* FLAC__SSSE3_SUPPORTED */ -#endif /* (FLAC__CPU_IA32 || FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN */ -#endif /* FLAC__NO_ASM */ -#endif /* FLAC__INTEGER_ONLY_LIBRARY */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/float.c b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/float.c deleted file mode 100644 index 068069f3..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/float.c +++ /dev/null @@ -1,302 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2004-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 -#endif - -#include "FLAC/assert.h" -#include "share/compat.h" -#include "private/float.h" - -#ifdef FLAC__INTEGER_ONLY_LIBRARY - -const FLAC__fixedpoint FLAC__FP_ZERO = 0; -const FLAC__fixedpoint FLAC__FP_ONE_HALF = 0x00008000; -const FLAC__fixedpoint FLAC__FP_ONE = 0x00010000; -const FLAC__fixedpoint FLAC__FP_LN2 = 45426; -const FLAC__fixedpoint FLAC__FP_E = 178145; - -/* Lookup tables for Knuth's logarithm algorithm */ -#define LOG2_LOOKUP_PRECISION 16 -static const FLAC__uint32 log2_lookup[][LOG2_LOOKUP_PRECISION] = { - { - /* - * 0 fraction bits - */ - /* undefined */ 0x00000000, - /* lg(2/1) = */ 0x00000001, - /* lg(4/3) = */ 0x00000000, - /* lg(8/7) = */ 0x00000000, - /* lg(16/15) = */ 0x00000000, - /* lg(32/31) = */ 0x00000000, - /* lg(64/63) = */ 0x00000000, - /* lg(128/127) = */ 0x00000000, - /* lg(256/255) = */ 0x00000000, - /* lg(512/511) = */ 0x00000000, - /* lg(1024/1023) = */ 0x00000000, - /* lg(2048/2047) = */ 0x00000000, - /* lg(4096/4095) = */ 0x00000000, - /* lg(8192/8191) = */ 0x00000000, - /* lg(16384/16383) = */ 0x00000000, - /* lg(32768/32767) = */ 0x00000000 - }, - { - /* - * 4 fraction bits - */ - /* undefined */ 0x00000000, - /* lg(2/1) = */ 0x00000010, - /* lg(4/3) = */ 0x00000007, - /* lg(8/7) = */ 0x00000003, - /* lg(16/15) = */ 0x00000001, - /* lg(32/31) = */ 0x00000001, - /* lg(64/63) = */ 0x00000000, - /* lg(128/127) = */ 0x00000000, - /* lg(256/255) = */ 0x00000000, - /* lg(512/511) = */ 0x00000000, - /* lg(1024/1023) = */ 0x00000000, - /* lg(2048/2047) = */ 0x00000000, - /* lg(4096/4095) = */ 0x00000000, - /* lg(8192/8191) = */ 0x00000000, - /* lg(16384/16383) = */ 0x00000000, - /* lg(32768/32767) = */ 0x00000000 - }, - { - /* - * 8 fraction bits - */ - /* undefined */ 0x00000000, - /* lg(2/1) = */ 0x00000100, - /* lg(4/3) = */ 0x0000006a, - /* lg(8/7) = */ 0x00000031, - /* lg(16/15) = */ 0x00000018, - /* lg(32/31) = */ 0x0000000c, - /* lg(64/63) = */ 0x00000006, - /* lg(128/127) = */ 0x00000003, - /* lg(256/255) = */ 0x00000001, - /* lg(512/511) = */ 0x00000001, - /* lg(1024/1023) = */ 0x00000000, - /* lg(2048/2047) = */ 0x00000000, - /* lg(4096/4095) = */ 0x00000000, - /* lg(8192/8191) = */ 0x00000000, - /* lg(16384/16383) = */ 0x00000000, - /* lg(32768/32767) = */ 0x00000000 - }, - { - /* - * 12 fraction bits - */ - /* undefined */ 0x00000000, - /* lg(2/1) = */ 0x00001000, - /* lg(4/3) = */ 0x000006a4, - /* lg(8/7) = */ 0x00000315, - /* lg(16/15) = */ 0x0000017d, - /* lg(32/31) = */ 0x000000bc, - /* lg(64/63) = */ 0x0000005d, - /* lg(128/127) = */ 0x0000002e, - /* lg(256/255) = */ 0x00000017, - /* lg(512/511) = */ 0x0000000c, - /* lg(1024/1023) = */ 0x00000006, - /* lg(2048/2047) = */ 0x00000003, - /* lg(4096/4095) = */ 0x00000001, - /* lg(8192/8191) = */ 0x00000001, - /* lg(16384/16383) = */ 0x00000000, - /* lg(32768/32767) = */ 0x00000000 - }, - { - /* - * 16 fraction bits - */ - /* undefined */ 0x00000000, - /* lg(2/1) = */ 0x00010000, - /* lg(4/3) = */ 0x00006a40, - /* lg(8/7) = */ 0x00003151, - /* lg(16/15) = */ 0x000017d6, - /* lg(32/31) = */ 0x00000bba, - /* lg(64/63) = */ 0x000005d1, - /* lg(128/127) = */ 0x000002e6, - /* lg(256/255) = */ 0x00000172, - /* lg(512/511) = */ 0x000000b9, - /* lg(1024/1023) = */ 0x0000005c, - /* lg(2048/2047) = */ 0x0000002e, - /* lg(4096/4095) = */ 0x00000017, - /* lg(8192/8191) = */ 0x0000000c, - /* lg(16384/16383) = */ 0x00000006, - /* lg(32768/32767) = */ 0x00000003 - }, - { - /* - * 20 fraction bits - */ - /* undefined */ 0x00000000, - /* lg(2/1) = */ 0x00100000, - /* lg(4/3) = */ 0x0006a3fe, - /* lg(8/7) = */ 0x00031513, - /* lg(16/15) = */ 0x00017d60, - /* lg(32/31) = */ 0x0000bb9d, - /* lg(64/63) = */ 0x00005d10, - /* lg(128/127) = */ 0x00002e59, - /* lg(256/255) = */ 0x00001721, - /* lg(512/511) = */ 0x00000b8e, - /* lg(1024/1023) = */ 0x000005c6, - /* lg(2048/2047) = */ 0x000002e3, - /* lg(4096/4095) = */ 0x00000171, - /* lg(8192/8191) = */ 0x000000b9, - /* lg(16384/16383) = */ 0x0000005c, - /* lg(32768/32767) = */ 0x0000002e - }, - { - /* - * 24 fraction bits - */ - /* undefined */ 0x00000000, - /* lg(2/1) = */ 0x01000000, - /* lg(4/3) = */ 0x006a3fe6, - /* lg(8/7) = */ 0x00315130, - /* lg(16/15) = */ 0x0017d605, - /* lg(32/31) = */ 0x000bb9ca, - /* lg(64/63) = */ 0x0005d0fc, - /* lg(128/127) = */ 0x0002e58f, - /* lg(256/255) = */ 0x0001720e, - /* lg(512/511) = */ 0x0000b8d8, - /* lg(1024/1023) = */ 0x00005c61, - /* lg(2048/2047) = */ 0x00002e2d, - /* lg(4096/4095) = */ 0x00001716, - /* lg(8192/8191) = */ 0x00000b8b, - /* lg(16384/16383) = */ 0x000005c5, - /* lg(32768/32767) = */ 0x000002e3 - }, - { - /* - * 28 fraction bits - */ - /* undefined */ 0x00000000, - /* lg(2/1) = */ 0x10000000, - /* lg(4/3) = */ 0x06a3fe5c, - /* lg(8/7) = */ 0x03151301, - /* lg(16/15) = */ 0x017d6049, - /* lg(32/31) = */ 0x00bb9ca6, - /* lg(64/63) = */ 0x005d0fba, - /* lg(128/127) = */ 0x002e58f7, - /* lg(256/255) = */ 0x001720da, - /* lg(512/511) = */ 0x000b8d87, - /* lg(1024/1023) = */ 0x0005c60b, - /* lg(2048/2047) = */ 0x0002e2d7, - /* lg(4096/4095) = */ 0x00017160, - /* lg(8192/8191) = */ 0x0000b8ad, - /* lg(16384/16383) = */ 0x00005c56, - /* lg(32768/32767) = */ 0x00002e2b - } -}; - -#if 0 -static const FLAC__uint64 log2_lookup_wide[] = { - { - /* - * 32 fraction bits - */ - /* undefined */ 0x00000000, - /* lg(2/1) = */ FLAC__U64L(0x100000000), - /* lg(4/3) = */ FLAC__U64L(0x6a3fe5c6), - /* lg(8/7) = */ FLAC__U64L(0x31513015), - /* lg(16/15) = */ FLAC__U64L(0x17d60497), - /* lg(32/31) = */ FLAC__U64L(0x0bb9ca65), - /* lg(64/63) = */ FLAC__U64L(0x05d0fba2), - /* lg(128/127) = */ FLAC__U64L(0x02e58f74), - /* lg(256/255) = */ FLAC__U64L(0x01720d9c), - /* lg(512/511) = */ FLAC__U64L(0x00b8d875), - /* lg(1024/1023) = */ FLAC__U64L(0x005c60aa), - /* lg(2048/2047) = */ FLAC__U64L(0x002e2d72), - /* lg(4096/4095) = */ FLAC__U64L(0x00171600), - /* lg(8192/8191) = */ FLAC__U64L(0x000b8ad2), - /* lg(16384/16383) = */ FLAC__U64L(0x0005c55d), - /* lg(32768/32767) = */ FLAC__U64L(0x0002e2ac) - }, - { - /* - * 48 fraction bits - */ - /* undefined */ 0x00000000, - /* lg(2/1) = */ FLAC__U64L(0x1000000000000), - /* lg(4/3) = */ FLAC__U64L(0x6a3fe5c60429), - /* lg(8/7) = */ FLAC__U64L(0x315130157f7a), - /* lg(16/15) = */ FLAC__U64L(0x17d60496cfbb), - /* lg(32/31) = */ FLAC__U64L(0xbb9ca64ecac), - /* lg(64/63) = */ FLAC__U64L(0x5d0fba187cd), - /* lg(128/127) = */ FLAC__U64L(0x2e58f7441ee), - /* lg(256/255) = */ FLAC__U64L(0x1720d9c06a8), - /* lg(512/511) = */ FLAC__U64L(0xb8d8752173), - /* lg(1024/1023) = */ FLAC__U64L(0x5c60aa252e), - /* lg(2048/2047) = */ FLAC__U64L(0x2e2d71b0d8), - /* lg(4096/4095) = */ FLAC__U64L(0x1716001719), - /* lg(8192/8191) = */ FLAC__U64L(0xb8ad1de1b), - /* lg(16384/16383) = */ FLAC__U64L(0x5c55d640d), - /* lg(32768/32767) = */ FLAC__U64L(0x2e2abcf52) - } -}; -#endif - -FLAC__uint32 FLAC__fixedpoint_log2(FLAC__uint32 x, unsigned fracbits, unsigned precision) -{ - const FLAC__uint32 ONE = (1u << fracbits); - const FLAC__uint32 *table = log2_lookup[fracbits >> 2]; - - FLAC__ASSERT(fracbits < 32); - FLAC__ASSERT((fracbits & 0x3) == 0); - - if(x < ONE) - return 0; - - if(precision > LOG2_LOOKUP_PRECISION) - precision = LOG2_LOOKUP_PRECISION; - - /* Knuth's algorithm for computing logarithms, optimized for base-2 with lookup tables */ - { - FLAC__uint32 y = 0; - FLAC__uint32 z = x >> 1, k = 1; - while (x > ONE && k < precision) { - if (x - z >= ONE) { - x -= z; - z = x >> k; - y += table[k]; - } - else { - z >>= 1; - k++; - } - } - return y; - } -} - -#endif /* defined FLAC__INTEGER_ONLY_LIBRARY */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/format.c b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/format.c deleted file mode 100644 index e465a5d0..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/format.c +++ /dev/null @@ -1,585 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 -#endif - -#include -#include /* for qsort() */ -#include /* for memset() */ -#include "FLAC/assert.h" -#include "FLAC/format.h" -#include "share/compat.h" -#include "private/format.h" -#include "private/macros.h" - -/* VERSION should come from configure */ -FLAC_API const char *FLAC__VERSION_STRING = "1.3.1"; - -FLAC_API const char *FLAC__VENDOR_STRING = "reference libFLAC 1.3.1 20141125"; - -FLAC_API const FLAC__byte FLAC__STREAM_SYNC_STRING[4] = { 'f','L','a','C' }; -FLAC_API const unsigned FLAC__STREAM_SYNC = 0x664C6143; -FLAC_API const unsigned FLAC__STREAM_SYNC_LEN = 32; /* bits */ - -FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN = 16; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN = 16; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN = 24; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN = 24; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN = 20; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN = 3; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN = 5; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN = 36; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MD5SUM_LEN = 128; /* bits */ - -FLAC_API const unsigned FLAC__STREAM_METADATA_APPLICATION_ID_LEN = 32; /* bits */ - -FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_SAMPLE_NUMBER_LEN = 64; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_STREAM_OFFSET_LEN = 64; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_FRAME_SAMPLES_LEN = 16; /* bits */ - -FLAC_API const FLAC__uint64 FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER = FLAC__U64L(0xffffffffffffffff); - -FLAC_API const unsigned FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN = 32; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN = 32; /* bits */ - -FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN = 64; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN = 8; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN = 3*8; /* bits */ - -FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN = 64; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN = 8; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN = 12*8; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN = 1; /* bit */ -FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN = 1; /* bit */ -FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN = 6+13*8; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN = 8; /* bits */ - -FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN = 128*8; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN = 64; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN = 1; /* bit */ -FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN = 7+258*8; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN = 8; /* bits */ - -FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_TYPE_LEN = 32; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN = 32; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN = 32; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN = 32; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN = 32; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN = 32; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_COLORS_LEN = 32; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN = 32; /* bits */ - -FLAC_API const unsigned FLAC__STREAM_METADATA_IS_LAST_LEN = 1; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_TYPE_LEN = 7; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_LENGTH_LEN = 24; /* bits */ - -FLAC_API const unsigned FLAC__FRAME_HEADER_SYNC = 0x3ffe; -FLAC_API const unsigned FLAC__FRAME_HEADER_SYNC_LEN = 14; /* bits */ -FLAC_API const unsigned FLAC__FRAME_HEADER_RESERVED_LEN = 1; /* bits */ -FLAC_API const unsigned FLAC__FRAME_HEADER_BLOCKING_STRATEGY_LEN = 1; /* bits */ -FLAC_API const unsigned FLAC__FRAME_HEADER_BLOCK_SIZE_LEN = 4; /* bits */ -FLAC_API const unsigned FLAC__FRAME_HEADER_SAMPLE_RATE_LEN = 4; /* bits */ -FLAC_API const unsigned FLAC__FRAME_HEADER_CHANNEL_ASSIGNMENT_LEN = 4; /* bits */ -FLAC_API const unsigned FLAC__FRAME_HEADER_BITS_PER_SAMPLE_LEN = 3; /* bits */ -FLAC_API const unsigned FLAC__FRAME_HEADER_ZERO_PAD_LEN = 1; /* bits */ -FLAC_API const unsigned FLAC__FRAME_HEADER_CRC_LEN = 8; /* bits */ - -FLAC_API const unsigned FLAC__FRAME_FOOTER_CRC_LEN = 16; /* bits */ - -FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_TYPE_LEN = 2; /* bits */ -FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN = 4; /* bits */ -FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN = 4; /* bits */ -FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN = 5; /* bits */ -FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN = 5; /* bits */ - -FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER = 15; /* == (1< FLAC__MAX_SAMPLE_RATE) { - return false; - } - else - return true; -} - -FLAC_API FLAC__bool FLAC__format_blocksize_is_subset(unsigned blocksize, unsigned sample_rate) -{ - if(blocksize > 16384) - return false; - else if(sample_rate <= 48000 && blocksize > 4608) - return false; - else - return true; -} - -FLAC_API FLAC__bool FLAC__format_sample_rate_is_subset(unsigned sample_rate) -{ - if( - !FLAC__format_sample_rate_is_valid(sample_rate) || - ( - sample_rate >= (1u << 16) && - !(sample_rate % 1000 == 0 || sample_rate % 10 == 0) - ) - ) { - return false; - } - else - return true; -} - -/* @@@@ add to unit tests; it is already indirectly tested by the metadata_object tests */ -FLAC_API FLAC__bool FLAC__format_seektable_is_legal(const FLAC__StreamMetadata_SeekTable *seek_table) -{ - unsigned i; - FLAC__uint64 prev_sample_number = 0; - FLAC__bool got_prev = false; - - FLAC__ASSERT(0 != seek_table); - - for(i = 0; i < seek_table->num_points; i++) { - if(got_prev) { - if( - seek_table->points[i].sample_number != FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER && - seek_table->points[i].sample_number <= prev_sample_number - ) - return false; - } - prev_sample_number = seek_table->points[i].sample_number; - got_prev = true; - } - - return true; -} - -/* used as the sort predicate for qsort() */ -static int seekpoint_compare_(const FLAC__StreamMetadata_SeekPoint *l, const FLAC__StreamMetadata_SeekPoint *r) -{ - /* we don't just 'return l->sample_number - r->sample_number' since the result (FLAC__int64) might overflow an 'int' */ - if(l->sample_number == r->sample_number) - return 0; - else if(l->sample_number < r->sample_number) - return -1; - else - return 1; -} - -/* @@@@ add to unit tests; it is already indirectly tested by the metadata_object tests */ -FLAC_API unsigned FLAC__format_seektable_sort(FLAC__StreamMetadata_SeekTable *seek_table) -{ - unsigned i, j; - FLAC__bool first; - - FLAC__ASSERT(0 != seek_table); - - /* sort the seekpoints */ - qsort(seek_table->points, seek_table->num_points, sizeof(FLAC__StreamMetadata_SeekPoint), (int (*)(const void *, const void *))seekpoint_compare_); - - /* uniquify the seekpoints */ - first = true; - for(i = j = 0; i < seek_table->num_points; i++) { - if(seek_table->points[i].sample_number != FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER) { - if(!first) { - if(seek_table->points[i].sample_number == seek_table->points[j-1].sample_number) - continue; - } - } - first = false; - seek_table->points[j++] = seek_table->points[i]; - } - - for(i = j; i < seek_table->num_points; i++) { - seek_table->points[i].sample_number = FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER; - seek_table->points[i].stream_offset = 0; - seek_table->points[i].frame_samples = 0; - } - - return j; -} - -/* - * also disallows non-shortest-form encodings, c.f. - * http://www.unicode.org/versions/corrigendum1.html - * and a more clear explanation at the end of this section: - * http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - */ -static unsigned utf8len_(const FLAC__byte *utf8) -{ - FLAC__ASSERT(0 != utf8); - if ((utf8[0] & 0x80) == 0) { - return 1; - } - else if ((utf8[0] & 0xE0) == 0xC0 && (utf8[1] & 0xC0) == 0x80) { - if ((utf8[0] & 0xFE) == 0xC0) /* overlong sequence check */ - return 0; - return 2; - } - else if ((utf8[0] & 0xF0) == 0xE0 && (utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80) { - if (utf8[0] == 0xE0 && (utf8[1] & 0xE0) == 0x80) /* overlong sequence check */ - return 0; - /* illegal surrogates check (U+D800...U+DFFF and U+FFFE...U+FFFF) */ - if (utf8[0] == 0xED && (utf8[1] & 0xE0) == 0xA0) /* D800-DFFF */ - return 0; - if (utf8[0] == 0xEF && utf8[1] == 0xBF && (utf8[2] & 0xFE) == 0xBE) /* FFFE-FFFF */ - return 0; - return 3; - } - else if ((utf8[0] & 0xF8) == 0xF0 && (utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80 && (utf8[3] & 0xC0) == 0x80) { - if (utf8[0] == 0xF0 && (utf8[1] & 0xF0) == 0x80) /* overlong sequence check */ - return 0; - return 4; - } - else if ((utf8[0] & 0xFC) == 0xF8 && (utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80 && (utf8[3] & 0xC0) == 0x80 && (utf8[4] & 0xC0) == 0x80) { - if (utf8[0] == 0xF8 && (utf8[1] & 0xF8) == 0x80) /* overlong sequence check */ - return 0; - return 5; - } - else if ((utf8[0] & 0xFE) == 0xFC && (utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80 && (utf8[3] & 0xC0) == 0x80 && (utf8[4] & 0xC0) == 0x80 && (utf8[5] & 0xC0) == 0x80) { - if (utf8[0] == 0xFC && (utf8[1] & 0xFC) == 0x80) /* overlong sequence check */ - return 0; - return 6; - } - else { - return 0; - } -} - -FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_name_is_legal(const char *name) -{ - char c; - for(c = *name; c; c = *(++name)) - if(c < 0x20 || c == 0x3d || c > 0x7d) - return false; - return true; -} - -FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_value_is_legal(const FLAC__byte *value, unsigned length) -{ - if(length == (unsigned)(-1)) { - while(*value) { - unsigned n = utf8len_(value); - if(n == 0) - return false; - value += n; - } - } - else { - const FLAC__byte *end = value + length; - while(value < end) { - unsigned n = utf8len_(value); - if(n == 0) - return false; - value += n; - } - if(value != end) - return false; - } - return true; -} - -FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_is_legal(const FLAC__byte *entry, unsigned length) -{ - const FLAC__byte *s, *end; - - for(s = entry, end = s + length; s < end && *s != '='; s++) { - if(*s < 0x20 || *s > 0x7D) - return false; - } - if(s == end) - return false; - - s++; /* skip '=' */ - - while(s < end) { - unsigned n = utf8len_(s); - if(n == 0) - return false; - s += n; - } - if(s != end) - return false; - - return true; -} - -/* @@@@ add to unit tests; it is already indirectly tested by the metadata_object tests */ -FLAC_API FLAC__bool FLAC__format_cuesheet_is_legal(const FLAC__StreamMetadata_CueSheet *cue_sheet, FLAC__bool check_cd_da_subset, const char **violation) -{ - unsigned i, j; - - if(check_cd_da_subset) { - if(cue_sheet->lead_in < 2 * 44100) { - if(violation) *violation = "CD-DA cue sheet must have a lead-in length of at least 2 seconds"; - return false; - } - if(cue_sheet->lead_in % 588 != 0) { - if(violation) *violation = "CD-DA cue sheet lead-in length must be evenly divisible by 588 samples"; - return false; - } - } - - if(cue_sheet->num_tracks == 0) { - if(violation) *violation = "cue sheet must have at least one track (the lead-out)"; - return false; - } - - if(check_cd_da_subset && cue_sheet->tracks[cue_sheet->num_tracks-1].number != 170) { - if(violation) *violation = "CD-DA cue sheet must have a lead-out track number 170 (0xAA)"; - return false; - } - - for(i = 0; i < cue_sheet->num_tracks; i++) { - if(cue_sheet->tracks[i].number == 0) { - if(violation) *violation = "cue sheet may not have a track number 0"; - return false; - } - - if(check_cd_da_subset) { - if(!((cue_sheet->tracks[i].number >= 1 && cue_sheet->tracks[i].number <= 99) || cue_sheet->tracks[i].number == 170)) { - if(violation) *violation = "CD-DA cue sheet track number must be 1-99 or 170"; - return false; - } - } - - if(check_cd_da_subset && cue_sheet->tracks[i].offset % 588 != 0) { - if(violation) { - if(i == cue_sheet->num_tracks-1) /* the lead-out track... */ - *violation = "CD-DA cue sheet lead-out offset must be evenly divisible by 588 samples"; - else - *violation = "CD-DA cue sheet track offset must be evenly divisible by 588 samples"; - } - return false; - } - - if(i < cue_sheet->num_tracks - 1) { - if(cue_sheet->tracks[i].num_indices == 0) { - if(violation) *violation = "cue sheet track must have at least one index point"; - return false; - } - - if(cue_sheet->tracks[i].indices[0].number > 1) { - if(violation) *violation = "cue sheet track's first index number must be 0 or 1"; - return false; - } - } - - for(j = 0; j < cue_sheet->tracks[i].num_indices; j++) { - if(check_cd_da_subset && cue_sheet->tracks[i].indices[j].offset % 588 != 0) { - if(violation) *violation = "CD-DA cue sheet track index offset must be evenly divisible by 588 samples"; - return false; - } - - if(j > 0) { - if(cue_sheet->tracks[i].indices[j].number != cue_sheet->tracks[i].indices[j-1].number + 1) { - if(violation) *violation = "cue sheet track index numbers must increase by 1"; - return false; - } - } - } - } - - return true; -} - -/* @@@@ add to unit tests; it is already indirectly tested by the metadata_object tests */ -FLAC_API FLAC__bool FLAC__format_picture_is_legal(const FLAC__StreamMetadata_Picture *picture, const char **violation) -{ - char *p; - FLAC__byte *b; - - for(p = picture->mime_type; *p; p++) { - if(*p < 0x20 || *p > 0x7e) { - if(violation) *violation = "MIME type string must contain only printable ASCII characters (0x20-0x7e)"; - return false; - } - } - - for(b = picture->description; *b; ) { - unsigned n = utf8len_(b); - if(n == 0) { - if(violation) *violation = "description string must be valid UTF-8"; - return false; - } - b += n; - } - - return true; -} - -/* - * These routines are private to libFLAC - */ -unsigned FLAC__format_get_max_rice_partition_order(unsigned blocksize, unsigned predictor_order) -{ - return - FLAC__format_get_max_rice_partition_order_from_blocksize_limited_max_and_predictor_order( - FLAC__format_get_max_rice_partition_order_from_blocksize(blocksize), - blocksize, - predictor_order - ); -} - -unsigned FLAC__format_get_max_rice_partition_order_from_blocksize(unsigned blocksize) -{ - unsigned max_rice_partition_order = 0; - while(!(blocksize & 1)) { - max_rice_partition_order++; - blocksize >>= 1; - } - return flac_min(FLAC__MAX_RICE_PARTITION_ORDER, max_rice_partition_order); -} - -unsigned FLAC__format_get_max_rice_partition_order_from_blocksize_limited_max_and_predictor_order(unsigned limit, unsigned blocksize, unsigned predictor_order) -{ - unsigned max_rice_partition_order = limit; - - while(max_rice_partition_order > 0 && (blocksize >> max_rice_partition_order) <= predictor_order) - max_rice_partition_order--; - - FLAC__ASSERT( - (max_rice_partition_order == 0 && blocksize >= predictor_order) || - (max_rice_partition_order > 0 && blocksize >> max_rice_partition_order > predictor_order) - ); - - return max_rice_partition_order; -} - -void FLAC__format_entropy_coding_method_partitioned_rice_contents_init(FLAC__EntropyCodingMethod_PartitionedRiceContents *object) -{ - FLAC__ASSERT(0 != object); - - object->parameters = 0; - object->raw_bits = 0; - object->capacity_by_order = 0; -} - -void FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(FLAC__EntropyCodingMethod_PartitionedRiceContents *object) -{ - FLAC__ASSERT(0 != object); - - if(0 != object->parameters) - free(object->parameters); - if(0 != object->raw_bits) - free(object->raw_bits); - FLAC__format_entropy_coding_method_partitioned_rice_contents_init(object); -} - -FLAC__bool FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(FLAC__EntropyCodingMethod_PartitionedRiceContents *object, unsigned max_partition_order) -{ - FLAC__ASSERT(0 != object); - - FLAC__ASSERT(object->capacity_by_order > 0 || (0 == object->parameters && 0 == object->raw_bits)); - - if(object->capacity_by_order < max_partition_order) { - if(0 == (object->parameters = realloc(object->parameters, sizeof(unsigned)*(1 << max_partition_order)))) - return false; - if(0 == (object->raw_bits = realloc(object->raw_bits, sizeof(unsigned)*(1 << max_partition_order)))) - return false; - memset(object->raw_bits, 0, sizeof(unsigned)*(1 << max_partition_order)); - object->capacity_by_order = max_partition_order; - } - - return true; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/ia32/cpu_asm.nasm b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/ia32/cpu_asm.nasm deleted file mode 100644 index 036e8654..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/ia32/cpu_asm.nasm +++ /dev/null @@ -1,98 +0,0 @@ -; vim:filetype=nasm ts=8 - -; libFLAC - Free Lossless Audio Codec library -; Copyright (C) 2001-2009 Josh Coalson -; Copyright (C) 2011-2014 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. -; -; - Neither the name of the Xiph.org Foundation nor the names of its -; 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 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. - -%include "nasm.h" - - data_section - -cglobal FLAC__cpu_have_cpuid_asm_ia32 -cglobal FLAC__cpu_info_asm_ia32 - - code_section - -; ********************************************************************** -; -; FLAC__uint32 FLAC__cpu_have_cpuid_asm_ia32() -; - -cident FLAC__cpu_have_cpuid_asm_ia32 - pushfd - pop eax - mov edx, eax - xor eax, 0x00200000 - push eax - popfd - pushfd - pop eax - xor eax, edx - and eax, 0x00200000 - shr eax, 0x15 - push edx - popfd - ret - -; ********************************************************************** -; -; void FLAC__cpu_info_asm_ia32(FLAC__uint32 *flags_edx, FLAC__uint32 *flags_ecx) -; - -cident FLAC__cpu_info_asm_ia32 - ;[esp + 8] == flags_edx - ;[esp + 12] == flags_ecx - - push ebx - call FLAC__cpu_have_cpuid_asm_ia32 - test eax, eax - jz .no_cpuid - mov eax, 0 - cpuid - cmp eax, 1 - jb .no_cpuid - mov eax, 1 - cpuid - mov ebx, [esp + 8] - mov [ebx], edx - mov ebx, [esp + 12] - mov [ebx], ecx - jmp .end -.no_cpuid: - xor eax, eax - mov ebx, [esp + 8] - mov [ebx], eax - mov ebx, [esp + 12] - mov [ebx], eax -.end: - pop ebx - ret - -; end diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/ia32/fixed_asm.nasm b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/ia32/fixed_asm.nasm deleted file mode 100644 index 402c02af..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/ia32/fixed_asm.nasm +++ /dev/null @@ -1,309 +0,0 @@ -; vim:filetype=nasm ts=8 - -; libFLAC - Free Lossless Audio Codec library -; Copyright (C) 2001-2009 Josh Coalson -; Copyright (C) 2011-2014 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. -; -; - Neither the name of the Xiph.org Foundation nor the names of its -; 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 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. - -%include "nasm.h" - - data_section - -cglobal FLAC__fixed_compute_best_predictor_asm_ia32_mmx_cmov - - code_section - -; ********************************************************************** -; -; unsigned FLAC__fixed_compute_best_predictor(const FLAC__int32 *data, unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]) -; { -; FLAC__int32 last_error_0 = data[-1]; -; FLAC__int32 last_error_1 = data[-1] - data[-2]; -; FLAC__int32 last_error_2 = last_error_1 - (data[-2] - data[-3]); -; FLAC__int32 last_error_3 = last_error_2 - (data[-2] - 2*data[-3] + data[-4]); -; FLAC__int32 error, save; -; FLAC__uint32 total_error_0 = 0, total_error_1 = 0, total_error_2 = 0, total_error_3 = 0, total_error_4 = 0; -; unsigned i, order; -; -; for(i = 0; i < data_len; i++) { -; error = data[i] ; total_error_0 += local_abs(error); save = error; -; error -= last_error_0; total_error_1 += local_abs(error); last_error_0 = save; save = error; -; error -= last_error_1; total_error_2 += local_abs(error); last_error_1 = save; save = error; -; error -= last_error_2; total_error_3 += local_abs(error); last_error_2 = save; save = error; -; error -= last_error_3; total_error_4 += local_abs(error); last_error_3 = save; -; } -; -; if(total_error_0 < min(min(min(total_error_1, total_error_2), total_error_3), total_error_4)) -; order = 0; -; else if(total_error_1 < min(min(total_error_2, total_error_3), total_error_4)) -; order = 1; -; else if(total_error_2 < min(total_error_3, total_error_4)) -; order = 2; -; else if(total_error_3 < total_error_4) -; order = 3; -; else -; order = 4; -; -; residual_bits_per_sample[0] = (FLAC__float)((data_len > 0 && total_error_0 > 0) ? log(M_LN2 * (FLAC__double)total_error_0 / (FLAC__double)data_len) / M_LN2 : 0.0); -; residual_bits_per_sample[1] = (FLAC__float)((data_len > 0 && total_error_1 > 0) ? log(M_LN2 * (FLAC__double)total_error_1 / (FLAC__double)data_len) / M_LN2 : 0.0); -; residual_bits_per_sample[2] = (FLAC__float)((data_len > 0 && total_error_2 > 0) ? log(M_LN2 * (FLAC__double)total_error_2 / (FLAC__double)data_len) / M_LN2 : 0.0); -; residual_bits_per_sample[3] = (FLAC__float)((data_len > 0 && total_error_3 > 0) ? log(M_LN2 * (FLAC__double)total_error_3 / (FLAC__double)data_len) / M_LN2 : 0.0); -; residual_bits_per_sample[4] = (FLAC__float)((data_len > 0 && total_error_4 > 0) ? log(M_LN2 * (FLAC__double)total_error_4 / (FLAC__double)data_len) / M_LN2 : 0.0); -; -; return order; -; } - ALIGN 16 -cident FLAC__fixed_compute_best_predictor_asm_ia32_mmx_cmov - - ; esp + 36 == data[] - ; esp + 40 == data_len - ; esp + 44 == residual_bits_per_sample[] - - push ebp - push ebx - push esi - push edi - sub esp, byte 16 - ; qword [esp] == temp space for loading FLAC__uint64s to FPU regs - - ; ebx == &data[i] - ; ecx == loop counter (i) - ; ebp == order - ; mm0 == total_error_1:total_error_0 - ; mm1 == total_error_2:total_error_3 - ; mm2 == :total_error_4 - ; mm3 == last_error_1:last_error_0 - ; mm4 == last_error_2:last_error_3 - - mov ecx, [esp + 40] ; ecx = data_len - test ecx, ecx - jz near .data_len_is_0 - - mov ebx, [esp + 36] ; ebx = data[] - movd mm3, [ebx - 4] ; mm3 = 0:last_error_0 - movd mm2, [ebx - 8] ; mm2 = 0:data[-2] - movd mm1, [ebx - 12] ; mm1 = 0:data[-3] - movd mm0, [ebx - 16] ; mm0 = 0:data[-4] - movq mm5, mm3 ; mm5 = 0:last_error_0 - psubd mm5, mm2 ; mm5 = 0:last_error_1 - punpckldq mm3, mm5 ; mm3 = last_error_1:last_error_0 - psubd mm2, mm1 ; mm2 = 0:data[-2] - data[-3] - psubd mm5, mm2 ; mm5 = 0:last_error_2 - movq mm4, mm5 ; mm4 = 0:last_error_2 - psubd mm4, mm2 ; mm4 = 0:last_error_2 - (data[-2] - data[-3]) - paddd mm4, mm1 ; mm4 = 0:last_error_2 - (data[-2] - 2 * data[-3]) - psubd mm4, mm0 ; mm4 = 0:last_error_3 - punpckldq mm4, mm5 ; mm4 = last_error_2:last_error_3 - pxor mm0, mm0 ; mm0 = total_error_1:total_error_0 - pxor mm1, mm1 ; mm1 = total_error_2:total_error_3 - pxor mm2, mm2 ; mm2 = 0:total_error_4 - - ALIGN 16 -.loop: - movd mm7, [ebx] ; mm7 = 0:error_0 - add ebx, byte 4 - movq mm6, mm7 ; mm6 = 0:error_0 - psubd mm7, mm3 ; mm7 = :error_1 - punpckldq mm6, mm7 ; mm6 = error_1:error_0 - movq mm5, mm6 ; mm5 = error_1:error_0 - movq mm7, mm6 ; mm7 = error_1:error_0 - psubd mm5, mm3 ; mm5 = error_2: - movq mm3, mm6 ; mm3 = error_1:error_0 - psrad mm6, 31 - pxor mm7, mm6 - psubd mm7, mm6 ; mm7 = abs(error_1):abs(error_0) - paddd mm0, mm7 ; mm0 = total_error_1:total_error_0 - movq mm6, mm5 ; mm6 = error_2: - psubd mm5, mm4 ; mm5 = error_3: - punpckhdq mm5, mm6 ; mm5 = error_2:error_3 - movq mm7, mm5 ; mm7 = error_2:error_3 - movq mm6, mm5 ; mm6 = error_2:error_3 - psubd mm5, mm4 ; mm5 = :error_4 - movq mm4, mm6 ; mm4 = error_2:error_3 - psrad mm6, 31 - pxor mm7, mm6 - psubd mm7, mm6 ; mm7 = abs(error_2):abs(error_3) - paddd mm1, mm7 ; mm1 = total_error_2:total_error_3 - movq mm6, mm5 ; mm6 = :error_4 - psrad mm5, 31 - pxor mm6, mm5 - psubd mm6, mm5 ; mm6 = :abs(error_4) - paddd mm2, mm6 ; mm2 = :total_error_4 - - dec ecx - jnz short .loop - -; if(total_error_0 < min(min(min(total_error_1, total_error_2), total_error_3), total_error_4)) -; order = 0; -; else if(total_error_1 < min(min(total_error_2, total_error_3), total_error_4)) -; order = 1; -; else if(total_error_2 < min(total_error_3, total_error_4)) -; order = 2; -; else if(total_error_3 < total_error_4) -; order = 3; -; else -; order = 4; - movq mm3, mm0 ; mm3 = total_error_1:total_error_0 - movd edi, mm2 ; edi = total_error_4 - movd esi, mm1 ; esi = total_error_3 - movd eax, mm0 ; eax = total_error_0 - punpckhdq mm1, mm1 ; mm1 = total_error_2:total_error_2 - punpckhdq mm3, mm3 ; mm3 = total_error_1:total_error_1 - movd edx, mm1 ; edx = total_error_2 - movd ecx, mm3 ; ecx = total_error_1 - - xor ebx, ebx - xor ebp, ebp - inc ebx - cmp ecx, eax - cmovb eax, ecx ; eax = min(total_error_0, total_error_1) - cmovbe ebp, ebx - inc ebx - cmp edx, eax - cmovb eax, edx ; eax = min(total_error_0, total_error_1, total_error_2) - cmovbe ebp, ebx - inc ebx - cmp esi, eax - cmovb eax, esi ; eax = min(total_error_0, total_error_1, total_error_2, total_error_3) - cmovbe ebp, ebx - inc ebx - cmp edi, eax - cmovb eax, edi ; eax = min(total_error_0, total_error_1, total_error_2, total_error_3, total_error_4) - cmovbe ebp, ebx - movd ebx, mm0 ; ebx = total_error_0 - emms - - ; residual_bits_per_sample[0] = (FLAC__float)((data_len > 0 && total_error_0 > 0) ? log(M_LN2 * (FLAC__double)total_error_0 / (FLAC__double)data_len) / M_LN2 : 0.0); - ; residual_bits_per_sample[1] = (FLAC__float)((data_len > 0 && total_error_1 > 0) ? log(M_LN2 * (FLAC__double)total_error_1 / (FLAC__double)data_len) / M_LN2 : 0.0); - ; residual_bits_per_sample[2] = (FLAC__float)((data_len > 0 && total_error_2 > 0) ? log(M_LN2 * (FLAC__double)total_error_2 / (FLAC__double)data_len) / M_LN2 : 0.0); - ; residual_bits_per_sample[3] = (FLAC__float)((data_len > 0 && total_error_3 > 0) ? log(M_LN2 * (FLAC__double)total_error_3 / (FLAC__double)data_len) / M_LN2 : 0.0); - ; residual_bits_per_sample[4] = (FLAC__float)((data_len > 0 && total_error_4 > 0) ? log(M_LN2 * (FLAC__double)total_error_4 / (FLAC__double)data_len) / M_LN2 : 0.0); - xor eax, eax - fild dword [esp + 40] ; ST = data_len (NOTE: assumes data_len is <2gigs) -.rbps_0: - test ebx, ebx - jz .total_error_0_is_0 - fld1 ; ST = 1.0 data_len - mov [esp], ebx - mov [esp + 4], eax ; [esp] = (FLAC__uint64)total_error_0 - mov ebx, [esp + 44] - fild qword [esp] ; ST = total_error_0 1.0 data_len - fdiv st2 ; ST = total_error_0/data_len 1.0 data_len - fldln2 ; ST = ln2 total_error_0/data_len 1.0 data_len - fmulp st1 ; ST = ln2*total_error_0/data_len 1.0 data_len - fyl2x ; ST = log2(ln2*total_error_0/data_len) data_len - fstp dword [ebx] ; residual_bits_per_sample[0] = log2(ln2*total_error_0/data_len) ST = data_len - jmp short .rbps_1 -.total_error_0_is_0: - mov ebx, [esp + 44] - mov [ebx], eax ; residual_bits_per_sample[0] = 0.0 -.rbps_1: - test ecx, ecx - jz .total_error_1_is_0 - fld1 ; ST = 1.0 data_len - mov [esp], ecx - mov [esp + 4], eax ; [esp] = (FLAC__uint64)total_error_1 - fild qword [esp] ; ST = total_error_1 1.0 data_len - fdiv st2 ; ST = total_error_1/data_len 1.0 data_len - fldln2 ; ST = ln2 total_error_1/data_len 1.0 data_len - fmulp st1 ; ST = ln2*total_error_1/data_len 1.0 data_len - fyl2x ; ST = log2(ln2*total_error_1/data_len) data_len - fstp dword [ebx + 4] ; residual_bits_per_sample[1] = log2(ln2*total_error_1/data_len) ST = data_len - jmp short .rbps_2 -.total_error_1_is_0: - mov [ebx + 4], eax ; residual_bits_per_sample[1] = 0.0 -.rbps_2: - test edx, edx - jz .total_error_2_is_0 - fld1 ; ST = 1.0 data_len - mov [esp], edx - mov [esp + 4], eax ; [esp] = (FLAC__uint64)total_error_2 - fild qword [esp] ; ST = total_error_2 1.0 data_len - fdiv st2 ; ST = total_error_2/data_len 1.0 data_len - fldln2 ; ST = ln2 total_error_2/data_len 1.0 data_len - fmulp st1 ; ST = ln2*total_error_2/data_len 1.0 data_len - fyl2x ; ST = log2(ln2*total_error_2/data_len) data_len - fstp dword [ebx + 8] ; residual_bits_per_sample[2] = log2(ln2*total_error_2/data_len) ST = data_len - jmp short .rbps_3 -.total_error_2_is_0: - mov [ebx + 8], eax ; residual_bits_per_sample[2] = 0.0 -.rbps_3: - test esi, esi - jz .total_error_3_is_0 - fld1 ; ST = 1.0 data_len - mov [esp], esi - mov [esp + 4], eax ; [esp] = (FLAC__uint64)total_error_3 - fild qword [esp] ; ST = total_error_3 1.0 data_len - fdiv st2 ; ST = total_error_3/data_len 1.0 data_len - fldln2 ; ST = ln2 total_error_3/data_len 1.0 data_len - fmulp st1 ; ST = ln2*total_error_3/data_len 1.0 data_len - fyl2x ; ST = log2(ln2*total_error_3/data_len) data_len - fstp dword [ebx + 12] ; residual_bits_per_sample[3] = log2(ln2*total_error_3/data_len) ST = data_len - jmp short .rbps_4 -.total_error_3_is_0: - mov [ebx + 12], eax ; residual_bits_per_sample[3] = 0.0 -.rbps_4: - test edi, edi - jz .total_error_4_is_0 - fld1 ; ST = 1.0 data_len - mov [esp], edi - mov [esp + 4], eax ; [esp] = (FLAC__uint64)total_error_4 - fild qword [esp] ; ST = total_error_4 1.0 data_len - fdiv st2 ; ST = total_error_4/data_len 1.0 data_len - fldln2 ; ST = ln2 total_error_4/data_len 1.0 data_len - fmulp st1 ; ST = ln2*total_error_4/data_len 1.0 data_len - fyl2x ; ST = log2(ln2*total_error_4/data_len) data_len - fstp dword [ebx + 16] ; residual_bits_per_sample[4] = log2(ln2*total_error_4/data_len) ST = data_len - jmp short .rbps_end -.total_error_4_is_0: - mov [ebx + 16], eax ; residual_bits_per_sample[4] = 0.0 -.rbps_end: - fstp st0 ; ST = [empty] - jmp short .end -.data_len_is_0: - ; data_len == 0, so residual_bits_per_sample[*] = 0.0 - xor ebp, ebp - mov edi, [esp + 44] - mov [edi], ebp - mov [edi + 4], ebp - mov [edi + 8], ebp - mov [edi + 12], ebp - mov [edi + 16], ebp - add ebp, byte 4 ; order = 4 - -.end: - mov eax, ebp ; return order - add esp, byte 16 - pop edi - pop esi - pop ebx - pop ebp - ret - -; end diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/ia32/lpc_asm.nasm b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/ia32/lpc_asm.nasm deleted file mode 100644 index bf650323..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/ia32/lpc_asm.nasm +++ /dev/null @@ -1,2049 +0,0 @@ -; vim:filetype=nasm ts=8 - -; libFLAC - Free Lossless Audio Codec library -; Copyright (C) 2001-2009 Josh Coalson -; Copyright (C) 2011-2014 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. -; -; - Neither the name of the Xiph.org Foundation nor the names of its -; 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 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. - -%include "nasm.h" - - data_section - -cglobal FLAC__lpc_compute_autocorrelation_asm_ia32 -cglobal FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_4 -cglobal FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_8 -cglobal FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_12 -cglobal FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_16 -cglobal FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32 -cglobal FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32_mmx -cglobal FLAC__lpc_compute_residual_from_qlp_coefficients_wide_asm_ia32 -cglobal FLAC__lpc_restore_signal_asm_ia32 -cglobal FLAC__lpc_restore_signal_asm_ia32_mmx -cglobal FLAC__lpc_restore_signal_wide_asm_ia32 - - code_section - -; ********************************************************************** -; -; void FLAC__lpc_compute_autocorrelation_asm(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]) -; { -; FLAC__real d; -; unsigned sample, coeff; -; const unsigned limit = data_len - lag; -; -; FLAC__ASSERT(lag > 0); -; FLAC__ASSERT(lag <= data_len); -; -; for(coeff = 0; coeff < lag; coeff++) -; autoc[coeff] = 0.0; -; for(sample = 0; sample <= limit; sample++) { -; d = data[sample]; -; for(coeff = 0; coeff < lag; coeff++) -; autoc[coeff] += d * data[sample+coeff]; -; } -; for(; sample < data_len; sample++) { -; d = data[sample]; -; for(coeff = 0; coeff < data_len - sample; coeff++) -; autoc[coeff] += d * data[sample+coeff]; -; } -; } -; - ALIGN 16 -cident FLAC__lpc_compute_autocorrelation_asm_ia32 - ;[esp + 28] == autoc[] - ;[esp + 24] == lag - ;[esp + 20] == data_len - ;[esp + 16] == data[] - - ;ASSERT(lag > 0) - ;ASSERT(lag <= 33) - ;ASSERT(lag <= data_len) - -.begin: - push esi - push edi - push ebx - - ; for(coeff = 0; coeff < lag; coeff++) - ; autoc[coeff] = 0.0; - mov edi, [esp + 28] ; edi == autoc - mov ecx, [esp + 24] ; ecx = # of dwords (=lag) of 0 to write - xor eax, eax - rep stosd - - ; const unsigned limit = data_len - lag; - mov eax, [esp + 24] ; eax == lag - mov ecx, [esp + 20] - sub ecx, eax ; ecx == limit - - mov edi, [esp + 28] ; edi == autoc - mov esi, [esp + 16] ; esi == data - inc ecx ; we are looping <= limit so we add one to the counter - - ; for(sample = 0; sample <= limit; sample++) { - ; d = data[sample]; - ; for(coeff = 0; coeff < lag; coeff++) - ; autoc[coeff] += d * data[sample+coeff]; - ; } - fld dword [esi] ; ST = d <- data[sample] - ; each iteration is 11 bytes so we need (-eax)*11, so we do (-12*eax + eax) - lea edx, [eax + eax*2] - neg edx - lea edx, [eax + edx*4 + .jumper1_0 - .get_eip1] - call .mov_eip_to_ebx -.get_eip1: - add edx, ebx - inc edx ; compensate for the shorter opcode on the last iteration - inc edx ; compensate for the shorter opcode on the last iteration - inc edx ; compensate for the shorter opcode on the last iteration - cmp eax, 33 - jne .loop1_start - sub edx, byte 9 ; compensate for the longer opcodes on the first iteration -.loop1_start: - jmp edx - -.mov_eip_to_ebx: - mov ebx, [esp] - ret - - fld st0 ; ST = d d - fmul dword [esi + (32*4)] ; ST = d*data[sample+32] d WATCHOUT: not a byte displacement here! - fadd dword [edi + (32*4)] ; ST = autoc[32]+d*data[sample+32] d WATCHOUT: not a byte displacement here! - fstp dword [edi + (32*4)] ; autoc[32]+=d*data[sample+32] ST = d WATCHOUT: not a byte displacement here! - fld st0 ; ST = d d - fmul dword [esi + (31*4)] ; ST = d*data[sample+31] d - fadd dword [edi + (31*4)] ; ST = autoc[31]+d*data[sample+31] d - fstp dword [edi + (31*4)] ; autoc[31]+=d*data[sample+31] ST = d - fld st0 ; ST = d d - fmul dword [esi + (30*4)] ; ST = d*data[sample+30] d - fadd dword [edi + (30*4)] ; ST = autoc[30]+d*data[sample+30] d - fstp dword [edi + (30*4)] ; autoc[30]+=d*data[sample+30] ST = d - fld st0 ; ST = d d - fmul dword [esi + (29*4)] ; ST = d*data[sample+29] d - fadd dword [edi + (29*4)] ; ST = autoc[29]+d*data[sample+29] d - fstp dword [edi + (29*4)] ; autoc[29]+=d*data[sample+29] ST = d - fld st0 ; ST = d d - fmul dword [esi + (28*4)] ; ST = d*data[sample+28] d - fadd dword [edi + (28*4)] ; ST = autoc[28]+d*data[sample+28] d - fstp dword [edi + (28*4)] ; autoc[28]+=d*data[sample+28] ST = d - fld st0 ; ST = d d - fmul dword [esi + (27*4)] ; ST = d*data[sample+27] d - fadd dword [edi + (27*4)] ; ST = autoc[27]+d*data[sample+27] d - fstp dword [edi + (27*4)] ; autoc[27]+=d*data[sample+27] ST = d - fld st0 ; ST = d d - fmul dword [esi + (26*4)] ; ST = d*data[sample+26] d - fadd dword [edi + (26*4)] ; ST = autoc[26]+d*data[sample+26] d - fstp dword [edi + (26*4)] ; autoc[26]+=d*data[sample+26] ST = d - fld st0 ; ST = d d - fmul dword [esi + (25*4)] ; ST = d*data[sample+25] d - fadd dword [edi + (25*4)] ; ST = autoc[25]+d*data[sample+25] d - fstp dword [edi + (25*4)] ; autoc[25]+=d*data[sample+25] ST = d - fld st0 ; ST = d d - fmul dword [esi + (24*4)] ; ST = d*data[sample+24] d - fadd dword [edi + (24*4)] ; ST = autoc[24]+d*data[sample+24] d - fstp dword [edi + (24*4)] ; autoc[24]+=d*data[sample+24] ST = d - fld st0 ; ST = d d - fmul dword [esi + (23*4)] ; ST = d*data[sample+23] d - fadd dword [edi + (23*4)] ; ST = autoc[23]+d*data[sample+23] d - fstp dword [edi + (23*4)] ; autoc[23]+=d*data[sample+23] ST = d - fld st0 ; ST = d d - fmul dword [esi + (22*4)] ; ST = d*data[sample+22] d - fadd dword [edi + (22*4)] ; ST = autoc[22]+d*data[sample+22] d - fstp dword [edi + (22*4)] ; autoc[22]+=d*data[sample+22] ST = d - fld st0 ; ST = d d - fmul dword [esi + (21*4)] ; ST = d*data[sample+21] d - fadd dword [edi + (21*4)] ; ST = autoc[21]+d*data[sample+21] d - fstp dword [edi + (21*4)] ; autoc[21]+=d*data[sample+21] ST = d - fld st0 ; ST = d d - fmul dword [esi + (20*4)] ; ST = d*data[sample+20] d - fadd dword [edi + (20*4)] ; ST = autoc[20]+d*data[sample+20] d - fstp dword [edi + (20*4)] ; autoc[20]+=d*data[sample+20] ST = d - fld st0 ; ST = d d - fmul dword [esi + (19*4)] ; ST = d*data[sample+19] d - fadd dword [edi + (19*4)] ; ST = autoc[19]+d*data[sample+19] d - fstp dword [edi + (19*4)] ; autoc[19]+=d*data[sample+19] ST = d - fld st0 ; ST = d d - fmul dword [esi + (18*4)] ; ST = d*data[sample+18] d - fadd dword [edi + (18*4)] ; ST = autoc[18]+d*data[sample+18] d - fstp dword [edi + (18*4)] ; autoc[18]+=d*data[sample+18] ST = d - fld st0 ; ST = d d - fmul dword [esi + (17*4)] ; ST = d*data[sample+17] d - fadd dword [edi + (17*4)] ; ST = autoc[17]+d*data[sample+17] d - fstp dword [edi + (17*4)] ; autoc[17]+=d*data[sample+17] ST = d - fld st0 ; ST = d d - fmul dword [esi + (16*4)] ; ST = d*data[sample+16] d - fadd dword [edi + (16*4)] ; ST = autoc[16]+d*data[sample+16] d - fstp dword [edi + (16*4)] ; autoc[16]+=d*data[sample+16] ST = d - fld st0 ; ST = d d - fmul dword [esi + (15*4)] ; ST = d*data[sample+15] d - fadd dword [edi + (15*4)] ; ST = autoc[15]+d*data[sample+15] d - fstp dword [edi + (15*4)] ; autoc[15]+=d*data[sample+15] ST = d - fld st0 ; ST = d d - fmul dword [esi + (14*4)] ; ST = d*data[sample+14] d - fadd dword [edi + (14*4)] ; ST = autoc[14]+d*data[sample+14] d - fstp dword [edi + (14*4)] ; autoc[14]+=d*data[sample+14] ST = d - fld st0 ; ST = d d - fmul dword [esi + (13*4)] ; ST = d*data[sample+13] d - fadd dword [edi + (13*4)] ; ST = autoc[13]+d*data[sample+13] d - fstp dword [edi + (13*4)] ; autoc[13]+=d*data[sample+13] ST = d - fld st0 ; ST = d d - fmul dword [esi + (12*4)] ; ST = d*data[sample+12] d - fadd dword [edi + (12*4)] ; ST = autoc[12]+d*data[sample+12] d - fstp dword [edi + (12*4)] ; autoc[12]+=d*data[sample+12] ST = d - fld st0 ; ST = d d - fmul dword [esi + (11*4)] ; ST = d*data[sample+11] d - fadd dword [edi + (11*4)] ; ST = autoc[11]+d*data[sample+11] d - fstp dword [edi + (11*4)] ; autoc[11]+=d*data[sample+11] ST = d - fld st0 ; ST = d d - fmul dword [esi + (10*4)] ; ST = d*data[sample+10] d - fadd dword [edi + (10*4)] ; ST = autoc[10]+d*data[sample+10] d - fstp dword [edi + (10*4)] ; autoc[10]+=d*data[sample+10] ST = d - fld st0 ; ST = d d - fmul dword [esi + ( 9*4)] ; ST = d*data[sample+9] d - fadd dword [edi + ( 9*4)] ; ST = autoc[9]+d*data[sample+9] d - fstp dword [edi + ( 9*4)] ; autoc[9]+=d*data[sample+9] ST = d - fld st0 ; ST = d d - fmul dword [esi + ( 8*4)] ; ST = d*data[sample+8] d - fadd dword [edi + ( 8*4)] ; ST = autoc[8]+d*data[sample+8] d - fstp dword [edi + ( 8*4)] ; autoc[8]+=d*data[sample+8] ST = d - fld st0 ; ST = d d - fmul dword [esi + ( 7*4)] ; ST = d*data[sample+7] d - fadd dword [edi + ( 7*4)] ; ST = autoc[7]+d*data[sample+7] d - fstp dword [edi + ( 7*4)] ; autoc[7]+=d*data[sample+7] ST = d - fld st0 ; ST = d d - fmul dword [esi + ( 6*4)] ; ST = d*data[sample+6] d - fadd dword [edi + ( 6*4)] ; ST = autoc[6]+d*data[sample+6] d - fstp dword [edi + ( 6*4)] ; autoc[6]+=d*data[sample+6] ST = d - fld st0 ; ST = d d - fmul dword [esi + ( 5*4)] ; ST = d*data[sample+4] d - fadd dword [edi + ( 5*4)] ; ST = autoc[4]+d*data[sample+4] d - fstp dword [edi + ( 5*4)] ; autoc[4]+=d*data[sample+4] ST = d - fld st0 ; ST = d d - fmul dword [esi + ( 4*4)] ; ST = d*data[sample+4] d - fadd dword [edi + ( 4*4)] ; ST = autoc[4]+d*data[sample+4] d - fstp dword [edi + ( 4*4)] ; autoc[4]+=d*data[sample+4] ST = d - fld st0 ; ST = d d - fmul dword [esi + ( 3*4)] ; ST = d*data[sample+3] d - fadd dword [edi + ( 3*4)] ; ST = autoc[3]+d*data[sample+3] d - fstp dword [edi + ( 3*4)] ; autoc[3]+=d*data[sample+3] ST = d - fld st0 ; ST = d d - fmul dword [esi + ( 2*4)] ; ST = d*data[sample+2] d - fadd dword [edi + ( 2*4)] ; ST = autoc[2]+d*data[sample+2] d - fstp dword [edi + ( 2*4)] ; autoc[2]+=d*data[sample+2] ST = d - fld st0 ; ST = d d - fmul dword [esi + ( 1*4)] ; ST = d*data[sample+1] d - fadd dword [edi + ( 1*4)] ; ST = autoc[1]+d*data[sample+1] d - fstp dword [edi + ( 1*4)] ; autoc[1]+=d*data[sample+1] ST = d - fld st0 ; ST = d d - fmul dword [esi] ; ST = d*data[sample] d WATCHOUT: no displacement byte here! - fadd dword [edi] ; ST = autoc[0]+d*data[sample] d WATCHOUT: no displacement byte here! - fstp dword [edi] ; autoc[0]+=d*data[sample] ST = d WATCHOUT: no displacement byte here! -.jumper1_0: - - fstp st0 ; pop d, ST = empty - add esi, byte 4 ; sample++ - dec ecx - jz .loop1_end - fld dword [esi] ; ST = d <- data[sample] - jmp edx -.loop1_end: - - ; for(; sample < data_len; sample++) { - ; d = data[sample]; - ; for(coeff = 0; coeff < data_len - sample; coeff++) - ; autoc[coeff] += d * data[sample+coeff]; - ; } - mov ecx, [esp + 24] ; ecx <- lag - dec ecx ; ecx <- lag - 1 - jz near .end ; skip loop if 0 (i.e. lag == 1) - - fld dword [esi] ; ST = d <- data[sample] - mov eax, ecx ; eax <- lag - 1 == data_len - sample the first time through - ; each iteration is 11 bytes so we need (-eax)*11, so we do (-12*eax + eax) - lea edx, [eax + eax*2] - neg edx - lea edx, [eax + edx*4 + .jumper2_0 - .get_eip2] - call .mov_eip_to_ebx -.get_eip2: - add edx, ebx - inc edx ; compensate for the shorter opcode on the last iteration - inc edx ; compensate for the shorter opcode on the last iteration - inc edx ; compensate for the shorter opcode on the last iteration - jmp edx - - fld st0 ; ST = d d - fmul dword [esi + (31*4)] ; ST = d*data[sample+31] d - fadd dword [edi + (31*4)] ; ST = autoc[31]+d*data[sample+31] d - fstp dword [edi + (31*4)] ; autoc[31]+=d*data[sample+31] ST = d - fld st0 ; ST = d d - fmul dword [esi + (30*4)] ; ST = d*data[sample+30] d - fadd dword [edi + (30*4)] ; ST = autoc[30]+d*data[sample+30] d - fstp dword [edi + (30*4)] ; autoc[30]+=d*data[sample+30] ST = d - fld st0 ; ST = d d - fmul dword [esi + (29*4)] ; ST = d*data[sample+29] d - fadd dword [edi + (29*4)] ; ST = autoc[29]+d*data[sample+29] d - fstp dword [edi + (29*4)] ; autoc[29]+=d*data[sample+29] ST = d - fld st0 ; ST = d d - fmul dword [esi + (28*4)] ; ST = d*data[sample+28] d - fadd dword [edi + (28*4)] ; ST = autoc[28]+d*data[sample+28] d - fstp dword [edi + (28*4)] ; autoc[28]+=d*data[sample+28] ST = d - fld st0 ; ST = d d - fmul dword [esi + (27*4)] ; ST = d*data[sample+27] d - fadd dword [edi + (27*4)] ; ST = autoc[27]+d*data[sample+27] d - fstp dword [edi + (27*4)] ; autoc[27]+=d*data[sample+27] ST = d - fld st0 ; ST = d d - fmul dword [esi + (26*4)] ; ST = d*data[sample+26] d - fadd dword [edi + (26*4)] ; ST = autoc[26]+d*data[sample+26] d - fstp dword [edi + (26*4)] ; autoc[26]+=d*data[sample+26] ST = d - fld st0 ; ST = d d - fmul dword [esi + (25*4)] ; ST = d*data[sample+25] d - fadd dword [edi + (25*4)] ; ST = autoc[25]+d*data[sample+25] d - fstp dword [edi + (25*4)] ; autoc[25]+=d*data[sample+25] ST = d - fld st0 ; ST = d d - fmul dword [esi + (24*4)] ; ST = d*data[sample+24] d - fadd dword [edi + (24*4)] ; ST = autoc[24]+d*data[sample+24] d - fstp dword [edi + (24*4)] ; autoc[24]+=d*data[sample+24] ST = d - fld st0 ; ST = d d - fmul dword [esi + (23*4)] ; ST = d*data[sample+23] d - fadd dword [edi + (23*4)] ; ST = autoc[23]+d*data[sample+23] d - fstp dword [edi + (23*4)] ; autoc[23]+=d*data[sample+23] ST = d - fld st0 ; ST = d d - fmul dword [esi + (22*4)] ; ST = d*data[sample+22] d - fadd dword [edi + (22*4)] ; ST = autoc[22]+d*data[sample+22] d - fstp dword [edi + (22*4)] ; autoc[22]+=d*data[sample+22] ST = d - fld st0 ; ST = d d - fmul dword [esi + (21*4)] ; ST = d*data[sample+21] d - fadd dword [edi + (21*4)] ; ST = autoc[21]+d*data[sample+21] d - fstp dword [edi + (21*4)] ; autoc[21]+=d*data[sample+21] ST = d - fld st0 ; ST = d d - fmul dword [esi + (20*4)] ; ST = d*data[sample+20] d - fadd dword [edi + (20*4)] ; ST = autoc[20]+d*data[sample+20] d - fstp dword [edi + (20*4)] ; autoc[20]+=d*data[sample+20] ST = d - fld st0 ; ST = d d - fmul dword [esi + (19*4)] ; ST = d*data[sample+19] d - fadd dword [edi + (19*4)] ; ST = autoc[19]+d*data[sample+19] d - fstp dword [edi + (19*4)] ; autoc[19]+=d*data[sample+19] ST = d - fld st0 ; ST = d d - fmul dword [esi + (18*4)] ; ST = d*data[sample+18] d - fadd dword [edi + (18*4)] ; ST = autoc[18]+d*data[sample+18] d - fstp dword [edi + (18*4)] ; autoc[18]+=d*data[sample+18] ST = d - fld st0 ; ST = d d - fmul dword [esi + (17*4)] ; ST = d*data[sample+17] d - fadd dword [edi + (17*4)] ; ST = autoc[17]+d*data[sample+17] d - fstp dword [edi + (17*4)] ; autoc[17]+=d*data[sample+17] ST = d - fld st0 ; ST = d d - fmul dword [esi + (16*4)] ; ST = d*data[sample+16] d - fadd dword [edi + (16*4)] ; ST = autoc[16]+d*data[sample+16] d - fstp dword [edi + (16*4)] ; autoc[16]+=d*data[sample+16] ST = d - fld st0 ; ST = d d - fmul dword [esi + (15*4)] ; ST = d*data[sample+15] d - fadd dword [edi + (15*4)] ; ST = autoc[15]+d*data[sample+15] d - fstp dword [edi + (15*4)] ; autoc[15]+=d*data[sample+15] ST = d - fld st0 ; ST = d d - fmul dword [esi + (14*4)] ; ST = d*data[sample+14] d - fadd dword [edi + (14*4)] ; ST = autoc[14]+d*data[sample+14] d - fstp dword [edi + (14*4)] ; autoc[14]+=d*data[sample+14] ST = d - fld st0 ; ST = d d - fmul dword [esi + (13*4)] ; ST = d*data[sample+13] d - fadd dword [edi + (13*4)] ; ST = autoc[13]+d*data[sample+13] d - fstp dword [edi + (13*4)] ; autoc[13]+=d*data[sample+13] ST = d - fld st0 ; ST = d d - fmul dword [esi + (12*4)] ; ST = d*data[sample+12] d - fadd dword [edi + (12*4)] ; ST = autoc[12]+d*data[sample+12] d - fstp dword [edi + (12*4)] ; autoc[12]+=d*data[sample+12] ST = d - fld st0 ; ST = d d - fmul dword [esi + (11*4)] ; ST = d*data[sample+11] d - fadd dword [edi + (11*4)] ; ST = autoc[11]+d*data[sample+11] d - fstp dword [edi + (11*4)] ; autoc[11]+=d*data[sample+11] ST = d - fld st0 ; ST = d d - fmul dword [esi + (10*4)] ; ST = d*data[sample+10] d - fadd dword [edi + (10*4)] ; ST = autoc[10]+d*data[sample+10] d - fstp dword [edi + (10*4)] ; autoc[10]+=d*data[sample+10] ST = d - fld st0 ; ST = d d - fmul dword [esi + ( 9*4)] ; ST = d*data[sample+9] d - fadd dword [edi + ( 9*4)] ; ST = autoc[9]+d*data[sample+9] d - fstp dword [edi + ( 9*4)] ; autoc[9]+=d*data[sample+9] ST = d - fld st0 ; ST = d d - fmul dword [esi + ( 8*4)] ; ST = d*data[sample+8] d - fadd dword [edi + ( 8*4)] ; ST = autoc[8]+d*data[sample+8] d - fstp dword [edi + ( 8*4)] ; autoc[8]+=d*data[sample+8] ST = d - fld st0 ; ST = d d - fmul dword [esi + ( 7*4)] ; ST = d*data[sample+7] d - fadd dword [edi + ( 7*4)] ; ST = autoc[7]+d*data[sample+7] d - fstp dword [edi + ( 7*4)] ; autoc[7]+=d*data[sample+7] ST = d - fld st0 ; ST = d d - fmul dword [esi + ( 6*4)] ; ST = d*data[sample+6] d - fadd dword [edi + ( 6*4)] ; ST = autoc[6]+d*data[sample+6] d - fstp dword [edi + ( 6*4)] ; autoc[6]+=d*data[sample+6] ST = d - fld st0 ; ST = d d - fmul dword [esi + ( 5*4)] ; ST = d*data[sample+4] d - fadd dword [edi + ( 5*4)] ; ST = autoc[4]+d*data[sample+4] d - fstp dword [edi + ( 5*4)] ; autoc[4]+=d*data[sample+4] ST = d - fld st0 ; ST = d d - fmul dword [esi + ( 4*4)] ; ST = d*data[sample+4] d - fadd dword [edi + ( 4*4)] ; ST = autoc[4]+d*data[sample+4] d - fstp dword [edi + ( 4*4)] ; autoc[4]+=d*data[sample+4] ST = d - fld st0 ; ST = d d - fmul dword [esi + ( 3*4)] ; ST = d*data[sample+3] d - fadd dword [edi + ( 3*4)] ; ST = autoc[3]+d*data[sample+3] d - fstp dword [edi + ( 3*4)] ; autoc[3]+=d*data[sample+3] ST = d - fld st0 ; ST = d d - fmul dword [esi + ( 2*4)] ; ST = d*data[sample+2] d - fadd dword [edi + ( 2*4)] ; ST = autoc[2]+d*data[sample+2] d - fstp dword [edi + ( 2*4)] ; autoc[2]+=d*data[sample+2] ST = d - fld st0 ; ST = d d - fmul dword [esi + ( 1*4)] ; ST = d*data[sample+1] d - fadd dword [edi + ( 1*4)] ; ST = autoc[1]+d*data[sample+1] d - fstp dword [edi + ( 1*4)] ; autoc[1]+=d*data[sample+1] ST = d - fld st0 ; ST = d d - fmul dword [esi] ; ST = d*data[sample] d WATCHOUT: no displacement byte here! - fadd dword [edi] ; ST = autoc[0]+d*data[sample] d WATCHOUT: no displacement byte here! - fstp dword [edi] ; autoc[0]+=d*data[sample] ST = d WATCHOUT: no displacement byte here! -.jumper2_0: - - fstp st0 ; pop d, ST = empty - add esi, byte 4 ; sample++ - dec ecx - jz .loop2_end - add edx, byte 11 ; adjust our inner loop counter by adjusting the jump target - fld dword [esi] ; ST = d <- data[sample] - jmp edx -.loop2_end: - -.end: - pop ebx - pop edi - pop esi - ret - - ALIGN 16 -cident FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_4 - ;[esp + 16] == autoc[] - ;[esp + 12] == lag - ;[esp + 8] == data_len - ;[esp + 4] == data[] - - ;ASSERT(lag > 0) - ;ASSERT(lag <= 4) - ;ASSERT(lag <= data_len) - - ; for(coeff = 0; coeff < lag; coeff++) - ; autoc[coeff] = 0.0; - xorps xmm5, xmm5 - - mov edx, [esp + 8] ; edx == data_len - mov eax, [esp + 4] ; eax == &data[sample] <- &data[0] - - movss xmm0, [eax] ; xmm0 = 0,0,0,data[0] - add eax, 4 - movaps xmm2, xmm0 ; xmm2 = 0,0,0,data[0] - shufps xmm0, xmm0, 0 ; xmm0 == data[sample],data[sample],data[sample],data[sample] = data[0],data[0],data[0],data[0] -.warmup: ; xmm2 == data[sample-3],data[sample-2],data[sample-1],data[sample] - mulps xmm0, xmm2 ; xmm0 = xmm0 * xmm2 - addps xmm5, xmm0 ; xmm5 += xmm0 * xmm2 - dec edx - jz .loop_end - ALIGN 16 -.loop_start: - ; start by reading the next sample - movss xmm0, [eax] ; xmm0 = 0,0,0,data[sample] - add eax, 4 - shufps xmm0, xmm0, 0 ; xmm0 = data[sample],data[sample],data[sample],data[sample] - shufps xmm2, xmm2, 93h ; 93h=2-1-0-3 => xmm2 gets rotated left by one float - movss xmm2, xmm0 - mulps xmm0, xmm2 ; xmm0 = xmm0 * xmm2 - addps xmm5, xmm0 ; xmm5 += xmm0 * xmm2 - dec edx - jnz .loop_start -.loop_end: - ; store autoc - mov edx, [esp + 16] ; edx == autoc - movups [edx], xmm5 - -.end: - ret - - ALIGN 16 -cident FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_8 - ;[esp + 16] == autoc[] - ;[esp + 12] == lag - ;[esp + 8] == data_len - ;[esp + 4] == data[] - - ;ASSERT(lag > 0) - ;ASSERT(lag <= 8) - ;ASSERT(lag <= data_len) - - ; for(coeff = 0; coeff < lag; coeff++) - ; autoc[coeff] = 0.0; - xorps xmm5, xmm5 - xorps xmm6, xmm6 - - mov edx, [esp + 8] ; edx == data_len - mov eax, [esp + 4] ; eax == &data[sample] <- &data[0] - - movss xmm0, [eax] ; xmm0 = 0,0,0,data[0] - add eax, 4 - movaps xmm2, xmm0 ; xmm2 = 0,0,0,data[0] - shufps xmm0, xmm0, 0 ; xmm0 == data[sample],data[sample],data[sample],data[sample] = data[0],data[0],data[0],data[0] - movaps xmm1, xmm0 ; xmm1 == data[sample],data[sample],data[sample],data[sample] = data[0],data[0],data[0],data[0] - xorps xmm3, xmm3 ; xmm3 = 0,0,0,0 -.warmup: ; xmm3:xmm2 == data[sample-7],data[sample-6],...,data[sample] - mulps xmm0, xmm2 - mulps xmm1, xmm3 ; xmm1:xmm0 = xmm1:xmm0 * xmm3:xmm2 - addps xmm5, xmm0 - addps xmm6, xmm1 ; xmm6:xmm5 += xmm1:xmm0 * xmm3:xmm2 - dec edx - jz .loop_end - ALIGN 16 -.loop_start: - ; start by reading the next sample - movss xmm0, [eax] ; xmm0 = 0,0,0,data[sample] - ; here we reorder the instructions; see the (#) indexes for a logical order - shufps xmm2, xmm2, 93h ; (3) 93h=2-1-0-3 => xmm2 gets rotated left by one float - add eax, 4 ; (0) - shufps xmm3, xmm3, 93h ; (4) 93h=2-1-0-3 => xmm3 gets rotated left by one float - shufps xmm0, xmm0, 0 ; (1) xmm0 = data[sample],data[sample],data[sample],data[sample] - movss xmm3, xmm2 ; (5) - movaps xmm1, xmm0 ; (2) xmm1 = data[sample],data[sample],data[sample],data[sample] - movss xmm2, xmm0 ; (6) - mulps xmm1, xmm3 ; (8) - mulps xmm0, xmm2 ; (7) xmm1:xmm0 = xmm1:xmm0 * xmm3:xmm2 - addps xmm6, xmm1 ; (10) - addps xmm5, xmm0 ; (9) xmm6:xmm5 += xmm1:xmm0 * xmm3:xmm2 - dec edx - jnz .loop_start -.loop_end: - ; store autoc - mov edx, [esp + 16] ; edx == autoc - movups [edx], xmm5 - movups [edx + 16], xmm6 - -.end: - ret - - ALIGN 16 -cident FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_12 - ;[esp + 16] == autoc[] - ;[esp + 12] == lag - ;[esp + 8] == data_len - ;[esp + 4] == data[] - - ;ASSERT(lag > 0) - ;ASSERT(lag <= 12) - ;ASSERT(lag <= data_len) - - ; for(coeff = 0; coeff < lag; coeff++) - ; autoc[coeff] = 0.0; - xorps xmm5, xmm5 - xorps xmm6, xmm6 - xorps xmm7, xmm7 - - mov edx, [esp + 8] ; edx == data_len - mov eax, [esp + 4] ; eax == &data[sample] <- &data[0] - - movss xmm0, [eax] ; xmm0 = 0,0,0,data[0] - add eax, 4 - movaps xmm2, xmm0 ; xmm2 = 0,0,0,data[0] - shufps xmm0, xmm0, 0 ; xmm0 == data[sample],data[sample],data[sample],data[sample] = data[0],data[0],data[0],data[0] - xorps xmm3, xmm3 ; xmm3 = 0,0,0,0 - xorps xmm4, xmm4 ; xmm4 = 0,0,0,0 -.warmup: ; xmm3:xmm2 == data[sample-7],data[sample-6],...,data[sample] - movaps xmm1, xmm0 - mulps xmm1, xmm2 - addps xmm5, xmm1 - movaps xmm1, xmm0 - mulps xmm1, xmm3 - addps xmm6, xmm1 - mulps xmm0, xmm4 - addps xmm7, xmm0 ; xmm7:xmm6:xmm5 += xmm0:xmm0:xmm0 * xmm4:xmm3:xmm2 - dec edx - jz .loop_end - ALIGN 16 -.loop_start: - ; start by reading the next sample - movss xmm0, [eax] ; xmm0 = 0,0,0,data[sample] - add eax, 4 - shufps xmm0, xmm0, 0 ; xmm0 = data[sample],data[sample],data[sample],data[sample] - - ; shift xmm4:xmm3:xmm2 left by one float - shufps xmm2, xmm2, 93h ; 93h=2-1-0-3 => xmm2 gets rotated left by one float - shufps xmm3, xmm3, 93h ; 93h=2-1-0-3 => xmm3 gets rotated left by one float - shufps xmm4, xmm4, 93h ; 93h=2-1-0-3 => xmm4 gets rotated left by one float - movss xmm4, xmm3 - movss xmm3, xmm2 - movss xmm2, xmm0 - - ; xmm7:xmm6:xmm5 += xmm0:xmm0:xmm0 * xmm4:xmm3:xmm2 - movaps xmm1, xmm0 - mulps xmm1, xmm2 - addps xmm5, xmm1 - movaps xmm1, xmm0 - mulps xmm1, xmm3 - addps xmm6, xmm1 - mulps xmm0, xmm4 - addps xmm7, xmm0 - - dec edx - jnz .loop_start -.loop_end: - ; store autoc - mov edx, [esp + 16] ; edx == autoc - movups [edx], xmm5 - movups [edx + 16], xmm6 - movups [edx + 32], xmm7 - -.end: - ret - - ALIGN 16 -cident FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_16 - ;[ebp + 20] == autoc[] - ;[ebp + 16] == lag - ;[ebp + 12] == data_len - ;[ebp + 8] == data[] - ;[esp] == __m128 - ;[esp + 16] == __m128 - - push ebp - mov ebp, esp - and esp, -16 ; stack realign for SSE instructions 'movaps' and 'addps' - sub esp, 32 - - ;ASSERT(lag > 0) - ;ASSERT(lag <= 12) - ;ASSERT(lag <= data_len) - ;ASSERT(data_len > 0) - - ; for(coeff = 0; coeff < lag; coeff++) - ; autoc[coeff] = 0.0; - xorps xmm5, xmm5 - xorps xmm6, xmm6 - movaps [esp], xmm5 - movaps [esp + 16], xmm6 - - mov edx, [ebp + 12] ; edx == data_len - mov eax, [ebp + 8] ; eax == &data[sample] <- &data[0] - - movss xmm0, [eax] ; xmm0 = 0,0,0,data[0] - add eax, 4 - movaps xmm1, xmm0 ; xmm1 = 0,0,0,data[0] - shufps xmm0, xmm0, 0 ; xmm0 == data[sample],data[sample],data[sample],data[sample] = data[0],data[0],data[0],data[0] - xorps xmm2, xmm2 ; xmm2 = 0,0,0,0 - xorps xmm3, xmm3 ; xmm3 = 0,0,0,0 - xorps xmm4, xmm4 ; xmm4 = 0,0,0,0 - movaps xmm7, xmm0 - mulps xmm7, xmm1 - addps xmm5, xmm7 - dec edx - jz .loop_end - ALIGN 16 -.loop_start: - ; start by reading the next sample - movss xmm0, [eax] ; xmm0 = 0,0,0,data[sample] - add eax, 4 - shufps xmm0, xmm0, 0 ; xmm0 = data[sample],data[sample],data[sample],data[sample] - - ; shift xmm4:xmm3:xmm2:xmm1 left by one float - shufps xmm1, xmm1, 93h - shufps xmm2, xmm2, 93h - shufps xmm3, xmm3, 93h - shufps xmm4, xmm4, 93h - movss xmm4, xmm3 - movss xmm3, xmm2 - movss xmm2, xmm1 - movss xmm1, xmm0 - - ; xmmB:xmmA:xmm6:xmm5 += xmm0:xmm0:xmm0:xmm0 * xmm4:xmm3:xmm2:xmm1 - movaps xmm7, xmm0 - mulps xmm7, xmm1 - addps xmm5, xmm7 - movaps xmm7, xmm0 - mulps xmm7, xmm2 - addps xmm6, xmm7 - movaps xmm7, xmm0 - mulps xmm7, xmm3 - mulps xmm0, xmm4 - addps xmm7, [esp] - addps xmm0, [esp + 16] - movaps [esp], xmm7 - movaps [esp + 16], xmm0 - - dec edx - jnz .loop_start -.loop_end: - ; store autoc - mov edx, [ebp + 20] ; edx == autoc - movups [edx], xmm5 - movups [edx + 16], xmm6 - movaps xmm5, [esp] - movaps xmm6, [esp + 16] - movups [edx + 32], xmm5 - movups [edx + 48], xmm6 -.end: - mov esp, ebp - pop ebp - ret - -;void FLAC__lpc_compute_residual_from_qlp_coefficients(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]) -; -; for(i = 0; i < data_len; i++) { -; sum = 0; -; for(j = 0; j < order; j++) -; sum += qlp_coeff[j] * data[i-j-1]; -; residual[i] = data[i] - (sum >> lp_quantization); -; } -; - ALIGN 16 -cident FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32 - ;[esp + 40] residual[] - ;[esp + 36] lp_quantization - ;[esp + 32] order - ;[esp + 28] qlp_coeff[] - ;[esp + 24] data_len - ;[esp + 20] data[] - - ;ASSERT(order > 0) - - push ebp - push ebx - push esi - push edi - - mov esi, [esp + 20] ; esi = data[] - mov edi, [esp + 40] ; edi = residual[] - mov eax, [esp + 32] ; eax = order - mov ebx, [esp + 24] ; ebx = data_len - - test ebx, ebx - jz near .end ; do nothing if data_len == 0 -.begin: - cmp eax, byte 1 - jg short .i_1more - - mov ecx, [esp + 28] - mov edx, [ecx] ; edx = qlp_coeff[0] - mov eax, [esi - 4] ; eax = data[-1] - mov ecx, [esp + 36] ; cl = lp_quantization - ALIGN 16 -.i_1_loop_i: - imul eax, edx - sar eax, cl - neg eax - add eax, [esi] - mov [edi], eax - mov eax, [esi] - add edi, byte 4 - add esi, byte 4 - dec ebx - jnz .i_1_loop_i - - jmp .end - -.i_1more: - cmp eax, byte 32 ; for order <= 32 there is a faster routine - jbe short .i_32 - - ; This version is here just for completeness, since FLAC__MAX_LPC_ORDER == 32 - ALIGN 16 -.i_32more_loop_i: - xor ebp, ebp - mov ecx, [esp + 32] - mov edx, ecx - shl edx, 2 - add edx, [esp + 28] - neg ecx - ALIGN 16 -.i_32more_loop_j: - sub edx, byte 4 - mov eax, [edx] - imul eax, [esi + 4 * ecx] - add ebp, eax - inc ecx - jnz short .i_32more_loop_j - - mov ecx, [esp + 36] - sar ebp, cl - neg ebp - add ebp, [esi] - mov [edi], ebp - add esi, byte 4 - add edi, byte 4 - - dec ebx - jnz .i_32more_loop_i - - jmp .end - -.mov_eip_to_eax: - mov eax, [esp] - ret - -.i_32: - sub edi, esi - neg eax - lea edx, [eax + eax * 8 + .jumper_0 - .get_eip0] - call .mov_eip_to_eax -.get_eip0: - add edx, eax - inc edx - mov eax, [esp + 28] ; eax = qlp_coeff[] - xor ebp, ebp - jmp edx - - mov ecx, [eax + 124] - imul ecx, [esi - 128] - add ebp, ecx - mov ecx, [eax + 120] - imul ecx, [esi - 124] - add ebp, ecx - mov ecx, [eax + 116] - imul ecx, [esi - 120] - add ebp, ecx - mov ecx, [eax + 112] - imul ecx, [esi - 116] - add ebp, ecx - mov ecx, [eax + 108] - imul ecx, [esi - 112] - add ebp, ecx - mov ecx, [eax + 104] - imul ecx, [esi - 108] - add ebp, ecx - mov ecx, [eax + 100] - imul ecx, [esi - 104] - add ebp, ecx - mov ecx, [eax + 96] - imul ecx, [esi - 100] - add ebp, ecx - mov ecx, [eax + 92] - imul ecx, [esi - 96] - add ebp, ecx - mov ecx, [eax + 88] - imul ecx, [esi - 92] - add ebp, ecx - mov ecx, [eax + 84] - imul ecx, [esi - 88] - add ebp, ecx - mov ecx, [eax + 80] - imul ecx, [esi - 84] - add ebp, ecx - mov ecx, [eax + 76] - imul ecx, [esi - 80] - add ebp, ecx - mov ecx, [eax + 72] - imul ecx, [esi - 76] - add ebp, ecx - mov ecx, [eax + 68] - imul ecx, [esi - 72] - add ebp, ecx - mov ecx, [eax + 64] - imul ecx, [esi - 68] - add ebp, ecx - mov ecx, [eax + 60] - imul ecx, [esi - 64] - add ebp, ecx - mov ecx, [eax + 56] - imul ecx, [esi - 60] - add ebp, ecx - mov ecx, [eax + 52] - imul ecx, [esi - 56] - add ebp, ecx - mov ecx, [eax + 48] - imul ecx, [esi - 52] - add ebp, ecx - mov ecx, [eax + 44] - imul ecx, [esi - 48] - add ebp, ecx - mov ecx, [eax + 40] - imul ecx, [esi - 44] - add ebp, ecx - mov ecx, [eax + 36] - imul ecx, [esi - 40] - add ebp, ecx - mov ecx, [eax + 32] - imul ecx, [esi - 36] - add ebp, ecx - mov ecx, [eax + 28] - imul ecx, [esi - 32] - add ebp, ecx - mov ecx, [eax + 24] - imul ecx, [esi - 28] - add ebp, ecx - mov ecx, [eax + 20] - imul ecx, [esi - 24] - add ebp, ecx - mov ecx, [eax + 16] - imul ecx, [esi - 20] - add ebp, ecx - mov ecx, [eax + 12] - imul ecx, [esi - 16] - add ebp, ecx - mov ecx, [eax + 8] - imul ecx, [esi - 12] - add ebp, ecx - mov ecx, [eax + 4] - imul ecx, [esi - 8] - add ebp, ecx - mov ecx, [eax] ; there is one byte missing - imul ecx, [esi - 4] - add ebp, ecx -.jumper_0: - - mov ecx, [esp + 36] - sar ebp, cl - neg ebp - add ebp, [esi] - mov [edi + esi], ebp - add esi, byte 4 - - dec ebx - jz short .end - xor ebp, ebp - jmp edx - -.end: - pop edi - pop esi - pop ebx - pop ebp - ret - -; WATCHOUT: this routine works on 16 bit data which means bits-per-sample for -; the channel and qlp_coeffs must be <= 16. Especially note that this routine -; cannot be used for side-channel coded 16bps channels since the effective bps -; is 17. - ALIGN 16 -cident FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32_mmx - ;[esp + 40] residual[] - ;[esp + 36] lp_quantization - ;[esp + 32] order - ;[esp + 28] qlp_coeff[] - ;[esp + 24] data_len - ;[esp + 20] data[] - - ;ASSERT(order > 0) - - push ebp - push ebx - push esi - push edi - - mov esi, [esp + 20] ; esi = data[] - mov edi, [esp + 40] ; edi = residual[] - mov eax, [esp + 32] ; eax = order - mov ebx, [esp + 24] ; ebx = data_len - - test ebx, ebx - jz near .end ; do nothing if data_len == 0 - dec ebx - test ebx, ebx - jz near .last_one - - mov edx, [esp + 28] ; edx = qlp_coeff[] - movd mm6, [esp + 36] ; mm6 = 0:lp_quantization - mov ebp, esp - - and esp, 0xfffffff8 - - xor ecx, ecx -.copy_qlp_loop: - push word [edx + 4 * ecx] - inc ecx - cmp ecx, eax - jnz short .copy_qlp_loop - - and ecx, 0x3 - test ecx, ecx - je short .za_end - sub ecx, byte 4 -.za_loop: - push word 0 - inc eax - inc ecx - jnz short .za_loop -.za_end: - - movq mm5, [esp + 2 * eax - 8] - movd mm4, [esi - 16] - punpckldq mm4, [esi - 12] - movd mm0, [esi - 8] - punpckldq mm0, [esi - 4] - packssdw mm4, mm0 - - cmp eax, byte 4 - jnbe short .mmx_4more - - ALIGN 16 -.mmx_4_loop_i: - movd mm1, [esi] - movq mm3, mm4 - punpckldq mm1, [esi + 4] - psrlq mm4, 16 - movq mm0, mm1 - psllq mm0, 48 - por mm4, mm0 - movq mm2, mm4 - psrlq mm4, 16 - pxor mm0, mm0 - punpckhdq mm0, mm1 - pmaddwd mm3, mm5 - pmaddwd mm2, mm5 - psllq mm0, 16 - por mm4, mm0 - movq mm0, mm3 - punpckldq mm3, mm2 - punpckhdq mm0, mm2 - paddd mm3, mm0 - psrad mm3, mm6 - psubd mm1, mm3 - movd [edi], mm1 - punpckhdq mm1, mm1 - movd [edi + 4], mm1 - - add edi, byte 8 - add esi, byte 8 - - sub ebx, 2 - jg .mmx_4_loop_i - jmp .mmx_end - -.mmx_4more: - shl eax, 2 - neg eax - add eax, byte 16 - - ALIGN 16 -.mmx_4more_loop_i: - movd mm1, [esi] - punpckldq mm1, [esi + 4] - movq mm3, mm4 - psrlq mm4, 16 - movq mm0, mm1 - psllq mm0, 48 - por mm4, mm0 - movq mm2, mm4 - psrlq mm4, 16 - pxor mm0, mm0 - punpckhdq mm0, mm1 - pmaddwd mm3, mm5 - pmaddwd mm2, mm5 - psllq mm0, 16 - por mm4, mm0 - - mov ecx, esi - add ecx, eax - mov edx, esp - - ALIGN 16 -.mmx_4more_loop_j: - movd mm0, [ecx - 16] - movd mm7, [ecx - 8] - punpckldq mm0, [ecx - 12] - punpckldq mm7, [ecx - 4] - packssdw mm0, mm7 - pmaddwd mm0, [edx] - punpckhdq mm7, mm7 - paddd mm3, mm0 - movd mm0, [ecx - 12] - punpckldq mm0, [ecx - 8] - punpckldq mm7, [ecx] - packssdw mm0, mm7 - pmaddwd mm0, [edx] - paddd mm2, mm0 - - add edx, byte 8 - add ecx, byte 16 - cmp ecx, esi - jnz .mmx_4more_loop_j - - movq mm0, mm3 - punpckldq mm3, mm2 - punpckhdq mm0, mm2 - paddd mm3, mm0 - psrad mm3, mm6 - psubd mm1, mm3 - movd [edi], mm1 - punpckhdq mm1, mm1 - movd [edi + 4], mm1 - - add edi, byte 8 - add esi, byte 8 - - sub ebx, 2 - jg near .mmx_4more_loop_i - -.mmx_end: - emms - mov esp, ebp -.last_one: - mov eax, [esp + 32] - inc ebx - jnz near FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32.begin - -.end: - pop edi - pop esi - pop ebx - pop ebp - ret - -; ********************************************************************** -; -; void FLAC__lpc_restore_signal(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]) -; { -; unsigned i, j; -; FLAC__int32 sum; -; -; FLAC__ASSERT(order > 0); -; -; for(i = 0; i < data_len; i++) { -; sum = 0; -; for(j = 0; j < order; j++) -; sum += qlp_coeff[j] * data[i-j-1]; -; data[i] = residual[i] + (sum >> lp_quantization); -; } -; } - ALIGN 16 -cident FLAC__lpc_restore_signal_asm_ia32 - ;[esp + 40] data[] - ;[esp + 36] lp_quantization - ;[esp + 32] order - ;[esp + 28] qlp_coeff[] - ;[esp + 24] data_len - ;[esp + 20] residual[] - - ;ASSERT(order > 0) - - push ebp - push ebx - push esi - push edi - - mov esi, [esp + 20] ; esi = residual[] - mov edi, [esp + 40] ; edi = data[] - mov eax, [esp + 32] ; eax = order - mov ebx, [esp + 24] ; ebx = data_len - - test ebx, ebx - jz near .end ; do nothing if data_len == 0 - -.begin: - cmp eax, byte 1 - jg short .x87_1more - - mov ecx, [esp + 28] - mov edx, [ecx] - mov eax, [edi - 4] - mov ecx, [esp + 36] - ALIGN 16 -.x87_1_loop_i: - imul eax, edx - sar eax, cl - add eax, [esi] - mov [edi], eax - add esi, byte 4 - add edi, byte 4 - dec ebx - jnz .x87_1_loop_i - - jmp .end - -.x87_1more: - cmp eax, byte 32 ; for order <= 32 there is a faster routine - jbe short .x87_32 - - ; This version is here just for completeness, since FLAC__MAX_LPC_ORDER == 32 - ALIGN 16 -.x87_32more_loop_i: - xor ebp, ebp - mov ecx, [esp + 32] - mov edx, ecx - shl edx, 2 - add edx, [esp + 28] - neg ecx - ALIGN 16 -.x87_32more_loop_j: - sub edx, byte 4 - mov eax, [edx] - imul eax, [edi + 4 * ecx] - add ebp, eax - inc ecx - jnz short .x87_32more_loop_j - - mov ecx, [esp + 36] - sar ebp, cl - add ebp, [esi] - mov [edi], ebp - add edi, byte 4 - add esi, byte 4 - - dec ebx - jnz .x87_32more_loop_i - - jmp .end - -.mov_eip_to_eax: - mov eax, [esp] - ret - -.x87_32: - sub esi, edi - neg eax - lea edx, [eax + eax * 8 + .jumper_0 - .get_eip0] - call .mov_eip_to_eax -.get_eip0: - add edx, eax - inc edx ; compensate for the shorter opcode on the last iteration - mov eax, [esp + 28] ; eax = qlp_coeff[] - xor ebp, ebp - jmp edx - - mov ecx, [eax + 124] ; ecx = qlp_coeff[31] - imul ecx, [edi - 128] ; ecx = qlp_coeff[31] * data[i-32] - add ebp, ecx ; sum += qlp_coeff[31] * data[i-32] - mov ecx, [eax + 120] ; ecx = qlp_coeff[30] - imul ecx, [edi - 124] ; ecx = qlp_coeff[30] * data[i-31] - add ebp, ecx ; sum += qlp_coeff[30] * data[i-31] - mov ecx, [eax + 116] ; ecx = qlp_coeff[29] - imul ecx, [edi - 120] ; ecx = qlp_coeff[29] * data[i-30] - add ebp, ecx ; sum += qlp_coeff[29] * data[i-30] - mov ecx, [eax + 112] ; ecx = qlp_coeff[28] - imul ecx, [edi - 116] ; ecx = qlp_coeff[28] * data[i-29] - add ebp, ecx ; sum += qlp_coeff[28] * data[i-29] - mov ecx, [eax + 108] ; ecx = qlp_coeff[27] - imul ecx, [edi - 112] ; ecx = qlp_coeff[27] * data[i-28] - add ebp, ecx ; sum += qlp_coeff[27] * data[i-28] - mov ecx, [eax + 104] ; ecx = qlp_coeff[26] - imul ecx, [edi - 108] ; ecx = qlp_coeff[26] * data[i-27] - add ebp, ecx ; sum += qlp_coeff[26] * data[i-27] - mov ecx, [eax + 100] ; ecx = qlp_coeff[25] - imul ecx, [edi - 104] ; ecx = qlp_coeff[25] * data[i-26] - add ebp, ecx ; sum += qlp_coeff[25] * data[i-26] - mov ecx, [eax + 96] ; ecx = qlp_coeff[24] - imul ecx, [edi - 100] ; ecx = qlp_coeff[24] * data[i-25] - add ebp, ecx ; sum += qlp_coeff[24] * data[i-25] - mov ecx, [eax + 92] ; ecx = qlp_coeff[23] - imul ecx, [edi - 96] ; ecx = qlp_coeff[23] * data[i-24] - add ebp, ecx ; sum += qlp_coeff[23] * data[i-24] - mov ecx, [eax + 88] ; ecx = qlp_coeff[22] - imul ecx, [edi - 92] ; ecx = qlp_coeff[22] * data[i-23] - add ebp, ecx ; sum += qlp_coeff[22] * data[i-23] - mov ecx, [eax + 84] ; ecx = qlp_coeff[21] - imul ecx, [edi - 88] ; ecx = qlp_coeff[21] * data[i-22] - add ebp, ecx ; sum += qlp_coeff[21] * data[i-22] - mov ecx, [eax + 80] ; ecx = qlp_coeff[20] - imul ecx, [edi - 84] ; ecx = qlp_coeff[20] * data[i-21] - add ebp, ecx ; sum += qlp_coeff[20] * data[i-21] - mov ecx, [eax + 76] ; ecx = qlp_coeff[19] - imul ecx, [edi - 80] ; ecx = qlp_coeff[19] * data[i-20] - add ebp, ecx ; sum += qlp_coeff[19] * data[i-20] - mov ecx, [eax + 72] ; ecx = qlp_coeff[18] - imul ecx, [edi - 76] ; ecx = qlp_coeff[18] * data[i-19] - add ebp, ecx ; sum += qlp_coeff[18] * data[i-19] - mov ecx, [eax + 68] ; ecx = qlp_coeff[17] - imul ecx, [edi - 72] ; ecx = qlp_coeff[17] * data[i-18] - add ebp, ecx ; sum += qlp_coeff[17] * data[i-18] - mov ecx, [eax + 64] ; ecx = qlp_coeff[16] - imul ecx, [edi - 68] ; ecx = qlp_coeff[16] * data[i-17] - add ebp, ecx ; sum += qlp_coeff[16] * data[i-17] - mov ecx, [eax + 60] ; ecx = qlp_coeff[15] - imul ecx, [edi - 64] ; ecx = qlp_coeff[15] * data[i-16] - add ebp, ecx ; sum += qlp_coeff[15] * data[i-16] - mov ecx, [eax + 56] ; ecx = qlp_coeff[14] - imul ecx, [edi - 60] ; ecx = qlp_coeff[14] * data[i-15] - add ebp, ecx ; sum += qlp_coeff[14] * data[i-15] - mov ecx, [eax + 52] ; ecx = qlp_coeff[13] - imul ecx, [edi - 56] ; ecx = qlp_coeff[13] * data[i-14] - add ebp, ecx ; sum += qlp_coeff[13] * data[i-14] - mov ecx, [eax + 48] ; ecx = qlp_coeff[12] - imul ecx, [edi - 52] ; ecx = qlp_coeff[12] * data[i-13] - add ebp, ecx ; sum += qlp_coeff[12] * data[i-13] - mov ecx, [eax + 44] ; ecx = qlp_coeff[11] - imul ecx, [edi - 48] ; ecx = qlp_coeff[11] * data[i-12] - add ebp, ecx ; sum += qlp_coeff[11] * data[i-12] - mov ecx, [eax + 40] ; ecx = qlp_coeff[10] - imul ecx, [edi - 44] ; ecx = qlp_coeff[10] * data[i-11] - add ebp, ecx ; sum += qlp_coeff[10] * data[i-11] - mov ecx, [eax + 36] ; ecx = qlp_coeff[ 9] - imul ecx, [edi - 40] ; ecx = qlp_coeff[ 9] * data[i-10] - add ebp, ecx ; sum += qlp_coeff[ 9] * data[i-10] - mov ecx, [eax + 32] ; ecx = qlp_coeff[ 8] - imul ecx, [edi - 36] ; ecx = qlp_coeff[ 8] * data[i- 9] - add ebp, ecx ; sum += qlp_coeff[ 8] * data[i- 9] - mov ecx, [eax + 28] ; ecx = qlp_coeff[ 7] - imul ecx, [edi - 32] ; ecx = qlp_coeff[ 7] * data[i- 8] - add ebp, ecx ; sum += qlp_coeff[ 7] * data[i- 8] - mov ecx, [eax + 24] ; ecx = qlp_coeff[ 6] - imul ecx, [edi - 28] ; ecx = qlp_coeff[ 6] * data[i- 7] - add ebp, ecx ; sum += qlp_coeff[ 6] * data[i- 7] - mov ecx, [eax + 20] ; ecx = qlp_coeff[ 5] - imul ecx, [edi - 24] ; ecx = qlp_coeff[ 5] * data[i- 6] - add ebp, ecx ; sum += qlp_coeff[ 5] * data[i- 6] - mov ecx, [eax + 16] ; ecx = qlp_coeff[ 4] - imul ecx, [edi - 20] ; ecx = qlp_coeff[ 4] * data[i- 5] - add ebp, ecx ; sum += qlp_coeff[ 4] * data[i- 5] - mov ecx, [eax + 12] ; ecx = qlp_coeff[ 3] - imul ecx, [edi - 16] ; ecx = qlp_coeff[ 3] * data[i- 4] - add ebp, ecx ; sum += qlp_coeff[ 3] * data[i- 4] - mov ecx, [eax + 8] ; ecx = qlp_coeff[ 2] - imul ecx, [edi - 12] ; ecx = qlp_coeff[ 2] * data[i- 3] - add ebp, ecx ; sum += qlp_coeff[ 2] * data[i- 3] - mov ecx, [eax + 4] ; ecx = qlp_coeff[ 1] - imul ecx, [edi - 8] ; ecx = qlp_coeff[ 1] * data[i- 2] - add ebp, ecx ; sum += qlp_coeff[ 1] * data[i- 2] - mov ecx, [eax] ; ecx = qlp_coeff[ 0] (NOTE: one byte missing from instruction) - imul ecx, [edi - 4] ; ecx = qlp_coeff[ 0] * data[i- 1] - add ebp, ecx ; sum += qlp_coeff[ 0] * data[i- 1] -.jumper_0: - - mov ecx, [esp + 36] - sar ebp, cl ; ebp = (sum >> lp_quantization) - add ebp, [esi + edi] ; ebp = residual[i] + (sum >> lp_quantization) - mov [edi], ebp ; data[i] = residual[i] + (sum >> lp_quantization) - add edi, byte 4 - - dec ebx - jz short .end - xor ebp, ebp - jmp edx - -.end: - pop edi - pop esi - pop ebx - pop ebp - ret - -; WATCHOUT: this routine works on 16 bit data which means bits-per-sample for -; the channel and qlp_coeffs must be <= 16. Especially note that this routine -; cannot be used for side-channel coded 16bps channels since the effective bps -; is 17. -; WATCHOUT: this routine requires that each data array have a buffer of up to -; 3 zeroes in front (at negative indices) for alignment purposes, i.e. for each -; channel n, data[n][-1] through data[n][-3] should be accessible and zero. - ALIGN 16 -cident FLAC__lpc_restore_signal_asm_ia32_mmx - ;[esp + 40] data[] - ;[esp + 36] lp_quantization - ;[esp + 32] order - ;[esp + 28] qlp_coeff[] - ;[esp + 24] data_len - ;[esp + 20] residual[] - - ;ASSERT(order > 0) - - push ebp - push ebx - push esi - push edi - - mov esi, [esp + 20] - mov edi, [esp + 40] - mov eax, [esp + 32] - mov ebx, [esp + 24] - - test ebx, ebx - jz near .end ; do nothing if data_len == 0 - cmp eax, byte 4 - jb near FLAC__lpc_restore_signal_asm_ia32.begin - - mov edx, [esp + 28] - movd mm6, [esp + 36] - mov ebp, esp - - and esp, 0xfffffff8 - - xor ecx, ecx -.copy_qlp_loop: - push word [edx + 4 * ecx] - inc ecx - cmp ecx, eax - jnz short .copy_qlp_loop - - and ecx, 0x3 - test ecx, ecx - je short .za_end - sub ecx, byte 4 -.za_loop: - push word 0 - inc eax - inc ecx - jnz short .za_loop -.za_end: - - movq mm5, [esp + 2 * eax - 8] - movd mm4, [edi - 16] - punpckldq mm4, [edi - 12] - movd mm0, [edi - 8] - punpckldq mm0, [edi - 4] - packssdw mm4, mm0 - - cmp eax, byte 4 - jnbe short .mmx_4more - - ALIGN 16 -.mmx_4_loop_i: - movq mm7, mm4 - pmaddwd mm7, mm5 - movq mm0, mm7 - punpckhdq mm7, mm7 - paddd mm7, mm0 - psrad mm7, mm6 - movd mm1, [esi] - paddd mm7, mm1 - movd [edi], mm7 - psllq mm7, 48 - psrlq mm4, 16 - por mm4, mm7 - - add esi, byte 4 - add edi, byte 4 - - dec ebx - jnz .mmx_4_loop_i - jmp .mmx_end -.mmx_4more: - shl eax, 2 - neg eax - add eax, byte 16 - ALIGN 16 -.mmx_4more_loop_i: - mov ecx, edi - add ecx, eax - mov edx, esp - - movq mm7, mm4 - pmaddwd mm7, mm5 - - ALIGN 16 -.mmx_4more_loop_j: - movd mm0, [ecx - 16] - punpckldq mm0, [ecx - 12] - movd mm1, [ecx - 8] - punpckldq mm1, [ecx - 4] - packssdw mm0, mm1 - pmaddwd mm0, [edx] - paddd mm7, mm0 - - add edx, byte 8 - add ecx, byte 16 - cmp ecx, edi - jnz .mmx_4more_loop_j - - movq mm0, mm7 - punpckhdq mm7, mm7 - paddd mm7, mm0 - psrad mm7, mm6 - movd mm1, [esi] - paddd mm7, mm1 - movd [edi], mm7 - psllq mm7, 48 - psrlq mm4, 16 - por mm4, mm7 - - add esi, byte 4 - add edi, byte 4 - - dec ebx - jnz short .mmx_4more_loop_i -.mmx_end: - emms - mov esp, ebp - -.end: - pop edi - pop esi - pop ebx - pop ebp - ret - - -; ********************************************************************** -; -;void FLAC__lpc_compute_residual_from_qlp_coefficients_wide(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]) -; { -; unsigned i, j; -; FLAC__int64 sum; -; -; FLAC__ASSERT(order > 0); -; -; for(i = 0; i < data_len; i++) { -; sum = 0; -; for(j = 0; j < order; j++) -; sum += qlp_coeff[j] * (FLAC__int64)data[i-j-1]; -; residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); -; } -; } - ALIGN 16 -cident FLAC__lpc_compute_residual_from_qlp_coefficients_wide_asm_ia32 - ;[esp + 40] residual[] - ;[esp + 36] lp_quantization - ;[esp + 32] order - ;[esp + 28] qlp_coeff[] - ;[esp + 24] data_len - ;[esp + 20] data[] - - ;ASSERT(order > 0) - ;ASSERT(order <= 32) - ;ASSERT(lp_quantization <= 31) - - push ebp - push ebx - push esi - push edi - - mov ebx, [esp + 24] ; ebx = data_len - test ebx, ebx - jz near .end ; do nothing if data_len == 0 - -.begin: - mov eax, [esp + 32] ; eax = order - cmp eax, 1 - jg short .i_32 - - mov esi, [esp + 40] ; esi = residual[] - mov edi, [esp + 20] ; edi = data[] - mov ecx, [esp + 28] ; ecx = qlp_coeff[] - mov ebp, [ecx] ; ebp = qlp_coeff[0] - mov eax, [edi - 4] ; eax = data[-1] - mov ecx, [esp + 36] ; cl = lp_quantization - ALIGN 16 -.i_1_loop_i: - imul ebp ; edx:eax = qlp_coeff[0] * (FLAC__int64)data[i-1] - shrd eax, edx, cl ; 0 <= lp_quantization <= 15 - neg eax - add eax, [edi] - mov [esi], eax - mov eax, [edi] - add esi, 4 - add edi, 4 - dec ebx - jnz .i_1_loop_i - jmp .end - -.mov_eip_to_eax: - mov eax, [esp] - ret - -.i_32: ; eax = order - neg eax - add eax, eax - lea ebp, [eax + eax * 4 + .jumper_0 - .get_eip0] - call .mov_eip_to_eax -.get_eip0: - add ebp, eax - inc ebp ; compensate for the shorter opcode on the last iteration - - mov ebx, [esp + 28] ; ebx = qlp_coeff[] - mov edi, [esp + 20] ; edi = data[] - sub [esp + 40], edi ; residual[] -= data[] - - xor ecx, ecx - xor esi, esi - jmp ebp - -;eax = -- -;edx = -- -;ecx = 0 -;esi = 0 -; -;ebx = qlp_coeff[] -;edi = data[] -;ebp = @address - - mov eax, [ebx + 124] ; eax = qlp_coeff[31] - imul dword [edi - 128] ; edx:eax = qlp_coeff[31] * data[i-32] - add ecx, eax - adc esi, edx ; sum += qlp_coeff[31] * data[i-32] - - mov eax, [ebx + 120] ; eax = qlp_coeff[30] - imul dword [edi - 124] ; edx:eax = qlp_coeff[30] * data[i-31] - add ecx, eax - adc esi, edx ; sum += qlp_coeff[30] * data[i-31] - - mov eax, [ebx + 116] - imul dword [edi - 120] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 112] - imul dword [edi - 116] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 108] - imul dword [edi - 112] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 104] - imul dword [edi - 108] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 100] - imul dword [edi - 104] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 96] - imul dword [edi - 100] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 92] - imul dword [edi - 96] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 88] - imul dword [edi - 92] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 84] - imul dword [edi - 88] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 80] - imul dword [edi - 84] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 76] - imul dword [edi - 80] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 72] - imul dword [edi - 76] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 68] - imul dword [edi - 72] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 64] - imul dword [edi - 68] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 60] - imul dword [edi - 64] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 56] - imul dword [edi - 60] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 52] - imul dword [edi - 56] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 48] - imul dword [edi - 52] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 44] - imul dword [edi - 48] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 40] - imul dword [edi - 44] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 36] - imul dword [edi - 40] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 32] - imul dword [edi - 36] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 28] - imul dword [edi - 32] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 24] - imul dword [edi - 28] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 20] - imul dword [edi - 24] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 16] - imul dword [edi - 20] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 12] - imul dword [edi - 16] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 8] - imul dword [edi - 12] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 4] - imul dword [edi - 8] - add ecx, eax - adc esi, edx - - mov eax, [ebx] ; eax = qlp_coeff[ 0] (NOTE: one byte missing from instruction) - imul dword [edi - 4] ; edx:eax = qlp_coeff[ 0] * data[i- 1] - add ecx, eax - adc esi, edx ; sum += qlp_coeff[ 0] * data[i- 1] - -.jumper_0: - mov edx, ecx -;esi:edx = sum - mov ecx, [esp + 36] ; cl = lp_quantization - shrd edx, esi, cl ; edx = (sum >> lp_quantization) -;eax = -- -;ecx = -- -;edx = sum >> lp_q -;esi = -- - neg edx ; edx = -(sum >> lp_quantization) - mov eax, [esp + 40] ; residual[] - data[] - add edx, [edi] ; edx = data[i] - (sum >> lp_quantization) - mov [edi + eax], edx - add edi, 4 - - dec dword [esp + 24] - jz short .end - xor ecx, ecx - xor esi, esi - jmp ebp - -.end: - pop edi - pop esi - pop ebx - pop ebp - ret - -; ********************************************************************** -; -; void FLAC__lpc_restore_signal_wide(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]) -; { -; unsigned i, j; -; FLAC__int64 sum; -; -; FLAC__ASSERT(order > 0); -; -; for(i = 0; i < data_len; i++) { -; sum = 0; -; for(j = 0; j < order; j++) -; sum += qlp_coeff[j] * (FLAC__int64)data[i-j-1]; -; data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); -; } -; } - ALIGN 16 -cident FLAC__lpc_restore_signal_wide_asm_ia32 - ;[esp + 40] data[] - ;[esp + 36] lp_quantization - ;[esp + 32] order - ;[esp + 28] qlp_coeff[] - ;[esp + 24] data_len - ;[esp + 20] residual[] - - ;ASSERT(order > 0) - ;ASSERT(order <= 32) - ;ASSERT(lp_quantization <= 31) - - push ebp - push ebx - push esi - push edi - - mov ebx, [esp + 24] ; ebx = data_len - test ebx, ebx - jz near .end ; do nothing if data_len == 0 - -.begin: - mov eax, [esp + 32] ; eax = order - cmp eax, 1 - jg short .x87_32 - - mov esi, [esp + 20] ; esi = residual[] - mov edi, [esp + 40] ; edi = data[] - mov ecx, [esp + 28] ; ecx = qlp_coeff[] - mov ebp, [ecx] ; ebp = qlp_coeff[0] - mov eax, [edi - 4] ; eax = data[-1] - mov ecx, [esp + 36] ; cl = lp_quantization - ALIGN 16 -.x87_1_loop_i: - imul ebp ; edx:eax = qlp_coeff[0] * (FLAC__int64)data[i-1] - shrd eax, edx, cl ; 0 <= lp_quantization <= 15 -; - add eax, [esi] - mov [edi], eax -; - add esi, 4 - add edi, 4 - dec ebx - jnz .x87_1_loop_i - jmp .end - -.mov_eip_to_eax: - mov eax, [esp] - ret - -.x87_32: ; eax = order - neg eax - add eax, eax - lea ebp, [eax + eax * 4 + .jumper_0 - .get_eip0] - call .mov_eip_to_eax -.get_eip0: - add ebp, eax - inc ebp ; compensate for the shorter opcode on the last iteration - - mov ebx, [esp + 28] ; ebx = qlp_coeff[] - mov edi, [esp + 40] ; esi = data[] - sub [esp + 20], edi ; residual[] -= data[] - - xor ecx, ecx - xor esi, esi - jmp ebp - -;eax = -- -;edx = -- -;ecx = 0 -;esi = 0 -; -;ebx = qlp_coeff[] -;edi = data[] -;ebp = @address - - mov eax, [ebx + 124] ; eax = qlp_coeff[31] - imul dword [edi - 128] ; edx:eax = qlp_coeff[31] * data[i-32] - add ecx, eax - adc esi, edx ; sum += qlp_coeff[31] * data[i-32] - - mov eax, [ebx + 120] ; eax = qlp_coeff[30] - imul dword [edi - 124] ; edx:eax = qlp_coeff[30] * data[i-31] - add ecx, eax - adc esi, edx ; sum += qlp_coeff[30] * data[i-31] - - mov eax, [ebx + 116] - imul dword [edi - 120] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 112] - imul dword [edi - 116] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 108] - imul dword [edi - 112] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 104] - imul dword [edi - 108] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 100] - imul dword [edi - 104] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 96] - imul dword [edi - 100] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 92] - imul dword [edi - 96] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 88] - imul dword [edi - 92] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 84] - imul dword [edi - 88] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 80] - imul dword [edi - 84] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 76] - imul dword [edi - 80] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 72] - imul dword [edi - 76] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 68] - imul dword [edi - 72] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 64] - imul dword [edi - 68] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 60] - imul dword [edi - 64] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 56] - imul dword [edi - 60] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 52] - imul dword [edi - 56] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 48] - imul dword [edi - 52] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 44] - imul dword [edi - 48] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 40] - imul dword [edi - 44] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 36] - imul dword [edi - 40] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 32] - imul dword [edi - 36] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 28] - imul dword [edi - 32] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 24] - imul dword [edi - 28] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 20] - imul dword [edi - 24] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 16] - imul dword [edi - 20] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 12] - imul dword [edi - 16] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 8] - imul dword [edi - 12] - add ecx, eax - adc esi, edx - - mov eax, [ebx + 4] - imul dword [edi - 8] - add ecx, eax - adc esi, edx - - mov eax, [ebx] ; eax = qlp_coeff[ 0] (NOTE: one byte missing from instruction) - imul dword [edi - 4] ; edx:eax = qlp_coeff[ 0] * data[i- 1] - add ecx, eax - adc esi, edx ; sum += qlp_coeff[ 0] * data[i- 1] - -.jumper_0: - mov edx, ecx -;esi:edx = sum - mov ecx, [esp + 36] ; cl = lp_quantization - shrd edx, esi, cl ; edx = (sum >> lp_quantization) -;eax = -- -;ecx = -- -;edx = sum >> lp_q -;esi = -- -; - mov eax, [esp + 20] ; residual[] - data[] - add edx, [edi + eax] ; edx = residual[i] + (sum >> lp_quantization) - mov [edi], edx ; data[i] = residual[i] + (sum >> lp_quantization) - add edi, 4 - - dec dword [esp + 24] - jz short .end - xor ecx, ecx - xor esi, esi - jmp ebp - -.end: - pop edi - pop esi - pop ebx - pop ebp - ret - -; end diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/ia32/nasm.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/ia32/nasm.h deleted file mode 100644 index efa68081..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/ia32/nasm.h +++ /dev/null @@ -1,85 +0,0 @@ -; libFLAC - Free Lossless Audio Codec library -; Copyright (C) 2001-2009 Josh Coalson -; Copyright (C) 2011-2014 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. -; -; - Neither the name of the Xiph.org Foundation nor the names of its -; 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 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. - - bits 32 - -%ifdef OBJ_FORMAT_win32 - %define FLAC__PUBLIC_NEEDS_UNDERSCORE - %idefine code_section section .text align=16 class=CODE use32 - %idefine data_section section .data align=32 class=DATA use32 - %idefine bss_section section .bss align=32 class=DATA use32 -%elifdef OBJ_FORMAT_aout - %define FLAC__PUBLIC_NEEDS_UNDERSCORE - %idefine code_section section .text - %idefine data_section section .data - %idefine bss_section section .bss -%elifdef OBJ_FORMAT_aoutb - %define FLAC__PUBLIC_NEEDS_UNDERSCORE - %idefine code_section section .text - %idefine data_section section .data - %idefine bss_section section .bss -%elifdef OBJ_FORMAT_elf - %idefine code_section section .text align=16 - %idefine data_section section .data align=32 - %idefine bss_section section .bss align=32 -%else - %error unsupported object format! -%endif - -%imacro cglobal 1 - %ifdef FLAC__PUBLIC_NEEDS_UNDERSCORE - global _%1 - %else - %if __NASM_MAJOR__ >= 2 - global %1:function hidden - %else - global %1 - %endif - %endif -%endmacro - -%imacro cextern 1 - %ifdef FLAC__PUBLIC_NEEDS_UNDERSCORE - extern _%1 - %else - extern %1 - %endif -%endmacro - -%imacro cident 1 -_%1: -%1: -%endmacro - -%ifdef OBJ_FORMAT_elf -section .note.GNU-stack progbits noalloc noexec nowrite align=1 -%endif - diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/all.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/all.h deleted file mode 100644 index a4463d26..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/all.h +++ /dev/null @@ -1,50 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 FLAC__PRIVATE__ALL_H -#define FLAC__PRIVATE__ALL_H - -#include "bitmath.h" -#include "bitreader.h" -#include "bitwriter.h" -#include "cpu.h" -#include "crc.h" -#include "fixed.h" -#include "float.h" -#include "format.h" -#include "lpc.h" -#include "md5.h" -#include "memory.h" -#include "metadata.h" -#include "stream_encoder_framing.h" - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/bitmath.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/bitmath.h deleted file mode 100644 index 22d894f8..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/bitmath.h +++ /dev/null @@ -1,186 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 FLAC__PRIVATE__BITMATH_H -#define FLAC__PRIVATE__BITMATH_H - -#include "FLAC/ordinals.h" -#include "FLAC/assert.h" - -/* for CHAR_BIT */ -#include -#include "share/compat.h" - -#if defined(_MSC_VER) && (_MSC_VER >= 1400) -#include /* for _BitScanReverse* */ -#endif - -/* Will never be emitted for MSVC, GCC, Intel compilers */ -static inline unsigned int FLAC__clz_soft_uint32(unsigned int word) -{ - static const unsigned char byte_to_unary_table[] = { - 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 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, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - }; - - return (word) > 0xffffff ? byte_to_unary_table[(word) >> 24] : - (word) > 0xffff ? byte_to_unary_table[(word) >> 16] + 8 : - (word) > 0xff ? byte_to_unary_table[(word) >> 8] + 16 : - byte_to_unary_table[(word)] + 24; -} - -static inline unsigned int FLAC__clz_uint32(FLAC__uint32 v) -{ -/* Never used with input 0 */ - FLAC__ASSERT(v > 0); -#if defined(__INTEL_COMPILER) - return _bit_scan_reverse(v) ^ 31U; -#elif defined(__GNUC__) && (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) -/* This will translate either to (bsr ^ 31U), clz , ctlz, cntlz, lzcnt depending on - * -march= setting or to a software routine in exotic machines. */ - return __builtin_clz(v); -#elif defined(_MSC_VER) && (_MSC_VER >= 1400) - { - unsigned long idx; - _BitScanReverse(&idx, v); - return idx ^ 31U; - } -#else - return FLAC__clz_soft_uint32(v); -#endif -} - -/* This one works with input 0 */ -static inline unsigned int FLAC__clz2_uint32(FLAC__uint32 v) -{ - if (!v) - return 32; - return FLAC__clz_uint32(v); -} - -/* An example of what FLAC__bitmath_ilog2() computes: - * - * ilog2( 0) = assertion failure - * ilog2( 1) = 0 - * ilog2( 2) = 1 - * ilog2( 3) = 1 - * ilog2( 4) = 2 - * ilog2( 5) = 2 - * ilog2( 6) = 2 - * ilog2( 7) = 2 - * ilog2( 8) = 3 - * ilog2( 9) = 3 - * ilog2(10) = 3 - * ilog2(11) = 3 - * ilog2(12) = 3 - * ilog2(13) = 3 - * ilog2(14) = 3 - * ilog2(15) = 3 - * ilog2(16) = 4 - * ilog2(17) = 4 - * ilog2(18) = 4 - */ - -static inline unsigned FLAC__bitmath_ilog2(FLAC__uint32 v) -{ - FLAC__ASSERT(v > 0); -#if defined(__INTEL_COMPILER) - return _bit_scan_reverse(v); -#elif defined(_MSC_VER) && (_MSC_VER >= 1400) - { - unsigned long idx; - _BitScanReverse(&idx, v); - return idx; - } -#else - return sizeof(FLAC__uint32) * CHAR_BIT - 1 - FLAC__clz_uint32(v); -#endif -} - - -#ifdef FLAC__INTEGER_ONLY_LIBRARY /* Unused otherwise */ - -static inline unsigned FLAC__bitmath_ilog2_wide(FLAC__uint64 v) -{ - FLAC__ASSERT(v > 0); -#if defined(__GNUC__) && (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) - return sizeof(FLAC__uint64) * CHAR_BIT - 1 - __builtin_clzll(v); -/* Sorry, only supported in x64/Itanium.. and both have fast FPU which makes integer-only encoder pointless */ -#elif (defined(_MSC_VER) && (_MSC_VER >= 1400)) && (defined(_M_IA64) || defined(_M_X64)) - { - unsigned long idx; - _BitScanReverse64(&idx, v); - return idx; - } -#else -/* Brain-damaged compilers will use the fastest possible way that is, - de Bruijn sequences (http://supertech.csail.mit.edu/papers/debruijn.pdf) - (C) Timothy B. Terriberry (tterribe@xiph.org) 2001-2009 CC0 (Public domain). -*/ - { - static const unsigned char DEBRUIJN_IDX64[64]={ - 0, 1, 2, 7, 3,13, 8,19, 4,25,14,28, 9,34,20,40, - 5,17,26,38,15,46,29,48,10,31,35,54,21,50,41,57, - 63, 6,12,18,24,27,33,39,16,37,45,47,30,53,49,56, - 62,11,23,32,36,44,52,55,61,22,43,51,60,42,59,58 - }; - v|= v>>1; - v|= v>>2; - v|= v>>4; - v|= v>>8; - v|= v>>16; - v|= v>>32; - v= (v>>1)+1; - return DEBRUIJN_IDX64[v*0x218A392CD3D5DBF>>58&0x3F]; - } -#endif -} -#endif - -unsigned FLAC__bitmath_silog2(int v); -unsigned FLAC__bitmath_silog2_wide(FLAC__int64 v); - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/bitreader.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/bitreader.h deleted file mode 100644 index 4dea8d03..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/bitreader.h +++ /dev/null @@ -1,91 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 FLAC__PRIVATE__BITREADER_H -#define FLAC__PRIVATE__BITREADER_H - -#include /* for FILE */ -#include "FLAC/ordinals.h" -#include "cpu.h" - -/* - * opaque structure definition - */ -struct FLAC__BitReader; -typedef struct FLAC__BitReader FLAC__BitReader; - -typedef FLAC__bool (*FLAC__BitReaderReadCallback)(FLAC__byte buffer[], size_t *bytes, void *client_data); - -/* - * construction, deletion, initialization, etc functions - */ -FLAC__BitReader *FLAC__bitreader_new(void); -void FLAC__bitreader_delete(FLAC__BitReader *br); -FLAC__bool FLAC__bitreader_init(FLAC__BitReader *br, FLAC__BitReaderReadCallback rcb, void *cd); -void FLAC__bitreader_free(FLAC__BitReader *br); /* does not 'free(br)' */ -FLAC__bool FLAC__bitreader_clear(FLAC__BitReader *br); -void FLAC__bitreader_dump(const FLAC__BitReader *br, FILE *out); - -/* - * CRC functions - */ -void FLAC__bitreader_reset_read_crc16(FLAC__BitReader *br, FLAC__uint16 seed); -FLAC__uint16 FLAC__bitreader_get_read_crc16(FLAC__BitReader *br); - -/* - * info functions - */ -FLAC__bool FLAC__bitreader_is_consumed_byte_aligned(const FLAC__BitReader *br); -unsigned FLAC__bitreader_bits_left_for_byte_alignment(const FLAC__BitReader *br); -unsigned FLAC__bitreader_get_input_bits_unconsumed(const FLAC__BitReader *br); - -/* - * read functions - */ - -FLAC__bool FLAC__bitreader_read_raw_uint32(FLAC__BitReader *br, FLAC__uint32 *val, unsigned bits); -FLAC__bool FLAC__bitreader_read_raw_int32(FLAC__BitReader *br, FLAC__int32 *val, unsigned bits); -FLAC__bool FLAC__bitreader_read_raw_uint64(FLAC__BitReader *br, FLAC__uint64 *val, unsigned bits); -FLAC__bool FLAC__bitreader_read_uint32_little_endian(FLAC__BitReader *br, FLAC__uint32 *val); /*only for bits=32*/ -FLAC__bool FLAC__bitreader_skip_bits_no_crc(FLAC__BitReader *br, unsigned bits); /* WATCHOUT: does not CRC the skipped data! */ /*@@@@ add to unit tests */ -FLAC__bool FLAC__bitreader_skip_byte_block_aligned_no_crc(FLAC__BitReader *br, unsigned nvals); /* WATCHOUT: does not CRC the read data! */ -FLAC__bool FLAC__bitreader_read_byte_block_aligned_no_crc(FLAC__BitReader *br, FLAC__byte *val, unsigned nvals); /* WATCHOUT: does not CRC the read data! */ -FLAC__bool FLAC__bitreader_read_unary_unsigned(FLAC__BitReader *br, unsigned *val); -FLAC__bool FLAC__bitreader_read_rice_signed(FLAC__BitReader *br, int *val, unsigned parameter); -FLAC__bool FLAC__bitreader_read_rice_signed_block(FLAC__BitReader *br, int vals[], unsigned nvals, unsigned parameter); -#if 0 /* UNUSED */ -FLAC__bool FLAC__bitreader_read_golomb_signed(FLAC__BitReader *br, int *val, unsigned parameter); -FLAC__bool FLAC__bitreader_read_golomb_unsigned(FLAC__BitReader *br, unsigned *val, unsigned parameter); -#endif -FLAC__bool FLAC__bitreader_read_utf8_uint32(FLAC__BitReader *br, FLAC__uint32 *val, FLAC__byte *raw, unsigned *rawlen); -FLAC__bool FLAC__bitreader_read_utf8_uint64(FLAC__BitReader *br, FLAC__uint64 *val, FLAC__byte *raw, unsigned *rawlen); -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/bitwriter.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/bitwriter.h deleted file mode 100644 index 3b1362d8..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/bitwriter.h +++ /dev/null @@ -1,104 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 FLAC__PRIVATE__BITWRITER_H -#define FLAC__PRIVATE__BITWRITER_H - -#include /* for FILE */ -#include "FLAC/ordinals.h" - -/* - * opaque structure definition - */ -struct FLAC__BitWriter; -typedef struct FLAC__BitWriter FLAC__BitWriter; - -/* - * construction, deletion, initialization, etc functions - */ -FLAC__BitWriter *FLAC__bitwriter_new(void); -void FLAC__bitwriter_delete(FLAC__BitWriter *bw); -FLAC__bool FLAC__bitwriter_init(FLAC__BitWriter *bw); -void FLAC__bitwriter_free(FLAC__BitWriter *bw); /* does not 'free(buffer)' */ -void FLAC__bitwriter_clear(FLAC__BitWriter *bw); -void FLAC__bitwriter_dump(const FLAC__BitWriter *bw, FILE *out); - -/* - * CRC functions - * - * non-const *bw because they have to cal FLAC__bitwriter_get_buffer() - */ -FLAC__bool FLAC__bitwriter_get_write_crc16(FLAC__BitWriter *bw, FLAC__uint16 *crc); -FLAC__bool FLAC__bitwriter_get_write_crc8(FLAC__BitWriter *bw, FLAC__byte *crc); - -/* - * info functions - */ -FLAC__bool FLAC__bitwriter_is_byte_aligned(const FLAC__BitWriter *bw); -unsigned FLAC__bitwriter_get_input_bits_unconsumed(const FLAC__BitWriter *bw); /* can be called anytime, returns total # of bits unconsumed */ - -/* - * direct buffer access - * - * there may be no calls on the bitwriter between get and release. - * the bitwriter continues to own the returned buffer. - * before get, bitwriter MUST be byte aligned: check with FLAC__bitwriter_is_byte_aligned() - */ -FLAC__bool FLAC__bitwriter_get_buffer(FLAC__BitWriter *bw, const FLAC__byte **buffer, size_t *bytes); -void FLAC__bitwriter_release_buffer(FLAC__BitWriter *bw); - -/* - * write functions - */ -FLAC__bool FLAC__bitwriter_write_zeroes(FLAC__BitWriter *bw, unsigned bits); -FLAC__bool FLAC__bitwriter_write_raw_uint32(FLAC__BitWriter *bw, FLAC__uint32 val, unsigned bits); -FLAC__bool FLAC__bitwriter_write_raw_int32(FLAC__BitWriter *bw, FLAC__int32 val, unsigned bits); -FLAC__bool FLAC__bitwriter_write_raw_uint64(FLAC__BitWriter *bw, FLAC__uint64 val, unsigned bits); -FLAC__bool FLAC__bitwriter_write_raw_uint32_little_endian(FLAC__BitWriter *bw, FLAC__uint32 val); /*only for bits=32*/ -FLAC__bool FLAC__bitwriter_write_byte_block(FLAC__BitWriter *bw, const FLAC__byte vals[], unsigned nvals); -FLAC__bool FLAC__bitwriter_write_unary_unsigned(FLAC__BitWriter *bw, unsigned val); -unsigned FLAC__bitwriter_rice_bits(FLAC__int32 val, unsigned parameter); -#if 0 /* UNUSED */ -unsigned FLAC__bitwriter_golomb_bits_signed(int val, unsigned parameter); -unsigned FLAC__bitwriter_golomb_bits_unsigned(unsigned val, unsigned parameter); -#endif -FLAC__bool FLAC__bitwriter_write_rice_signed(FLAC__BitWriter *bw, FLAC__int32 val, unsigned parameter); -FLAC__bool FLAC__bitwriter_write_rice_signed_block(FLAC__BitWriter *bw, const FLAC__int32 *vals, unsigned nvals, unsigned parameter); -#if 0 /* UNUSED */ -FLAC__bool FLAC__bitwriter_write_golomb_signed(FLAC__BitWriter *bw, int val, unsigned parameter); -FLAC__bool FLAC__bitwriter_write_golomb_unsigned(FLAC__BitWriter *bw, unsigned val, unsigned parameter); -#endif -FLAC__bool FLAC__bitwriter_write_utf8_uint32(FLAC__BitWriter *bw, FLAC__uint32 val); -FLAC__bool FLAC__bitwriter_write_utf8_uint64(FLAC__BitWriter *bw, FLAC__uint64 val); -FLAC__bool FLAC__bitwriter_zero_pad_to_byte_boundary(FLAC__BitWriter *bw); - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/cpu.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/cpu.h deleted file mode 100644 index 8927897a..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/cpu.h +++ /dev/null @@ -1,168 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 FLAC__PRIVATE__CPU_H -#define FLAC__PRIVATE__CPU_H - -#include "FLAC/ordinals.h" - -#ifdef HAVE_CONFIG_H -#include -#endif - -#if defined FLAC__HAS_X86INTRIN -/* SSE intrinsics support by ICC/MSVC/GCC */ -#if defined __INTEL_COMPILER - #define FLAC__SSE_TARGET(x) - #define FLAC__SSE_SUPPORTED 1 - #define FLAC__SSE2_SUPPORTED 1 - #if (__INTEL_COMPILER >= 1000) /* Intel C++ Compiler 10.0 */ - #define FLAC__SSSE3_SUPPORTED 1 - #define FLAC__SSE4_1_SUPPORTED 1 - #endif - #if (__INTEL_COMPILER >= 1110) /* Intel C++ Compiler 11.1 */ - #define FLAC__AVX_SUPPORTED 1 - #endif - #if (__INTEL_COMPILER >= 1300) /* Intel C++ Compiler 13.0 */ - #define FLAC__AVX2_SUPPORTED 1 - #define FLAC__FMA_SUPPORTED 1 - #endif -#elif defined _MSC_VER - #define FLAC__SSE_TARGET(x) - #define FLAC__SSE_SUPPORTED 1 - #define FLAC__SSE2_SUPPORTED 1 - #if (_MSC_VER >= 1500) /* MS Visual Studio 2008 */ - #define FLAC__SSSE3_SUPPORTED 1 - #define FLAC__SSE4_1_SUPPORTED 1 - #endif - #if (_MSC_FULL_VER >= 160040219) /* MS Visual Studio 2010 SP1 */ - #define FLAC__AVX_SUPPORTED 1 - #endif - #if (_MSC_VER >= 1700) /* MS Visual Studio 2012 */ - #define FLAC__AVX2_SUPPORTED 1 - #define FLAC__FMA_SUPPORTED 1 - #endif -#elif defined __GNUC__ - #if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9)) /* since GCC 4.9 -msse.. compiler options aren't necessary */ - #define FLAC__SSE_TARGET(x) __attribute__ ((__target__ (x))) - #define FLAC__SSE_SUPPORTED 1 - #define FLAC__SSE2_SUPPORTED 1 - #define FLAC__SSSE3_SUPPORTED 1 - #define FLAC__SSE4_1_SUPPORTED 1 - #define FLAC__AVX_SUPPORTED 1 - #define FLAC__AVX2_SUPPORTED 1 - #define FLAC__FMA_SUPPORTED 1 - #else /* for GCC older than 4.9 */ - #define FLAC__SSE_TARGET(x) - #ifdef __SSE__ - #define FLAC__SSE_SUPPORTED 1 - #endif - #ifdef __SSE2__ - #define FLAC__SSE2_SUPPORTED 1 - #endif - #ifdef __SSSE3__ - #define FLAC__SSSE3_SUPPORTED 1 - #endif - #ifdef __SSE4_1__ - #define FLAC__SSE4_1_SUPPORTED 1 - #endif - #ifdef __AVX__ - #define FLAC__AVX_SUPPORTED 1 - #endif - #ifdef __AVX2__ - #define FLAC__AVX2_SUPPORTED 1 - #endif - #ifdef __FMA__ - #define FLAC__FMA_SUPPORTED 1 - #endif - #endif /* GCC version */ -#endif /* compiler version */ -#endif /* intrinsics support */ - -typedef enum { - FLAC__CPUINFO_TYPE_IA32, - FLAC__CPUINFO_TYPE_X86_64, - FLAC__CPUINFO_TYPE_UNKNOWN -} FLAC__CPUInfo_Type; - -#if defined FLAC__CPU_IA32 -typedef struct { - FLAC__bool cmov; - FLAC__bool mmx; - FLAC__bool sse; - FLAC__bool sse2; - - FLAC__bool sse3; - FLAC__bool ssse3; - FLAC__bool sse41; - FLAC__bool sse42; - FLAC__bool avx; - FLAC__bool avx2; - FLAC__bool fma; -} FLAC__CPUInfo_IA32; -#elif defined FLAC__CPU_X86_64 -typedef struct { - FLAC__bool sse3; - FLAC__bool ssse3; - FLAC__bool sse41; - FLAC__bool sse42; - FLAC__bool avx; - FLAC__bool avx2; - FLAC__bool fma; -} FLAC__CPUInfo_x86; -#endif - -typedef struct { - FLAC__bool use_asm; - FLAC__CPUInfo_Type type; -#if defined FLAC__CPU_IA32 - FLAC__CPUInfo_IA32 ia32; -#elif defined FLAC__CPU_X86_64 - FLAC__CPUInfo_x86 x86; -#endif -} FLAC__CPUInfo; - -void FLAC__cpu_info(FLAC__CPUInfo *info); - -#ifndef FLAC__NO_ASM -# if defined FLAC__CPU_IA32 && defined FLAC__HAS_NASM -FLAC__uint32 FLAC__cpu_have_cpuid_asm_ia32(void); -void FLAC__cpu_info_asm_ia32(FLAC__uint32 *flags_edx, FLAC__uint32 *flags_ecx); -# endif -# if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN -FLAC__uint32 FLAC__cpu_have_cpuid_x86(void); -void FLAC__cpu_info_x86(FLAC__uint32 level, FLAC__uint32 *eax, FLAC__uint32 *ebx, FLAC__uint32 *ecx, FLAC__uint32 *edx); -FLAC__uint32 FLAC__cpu_xgetbv_x86(void); -# endif -#endif - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/crc.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/crc.h deleted file mode 100644 index 29c512ce..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/crc.h +++ /dev/null @@ -1,62 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 FLAC__PRIVATE__CRC_H -#define FLAC__PRIVATE__CRC_H - -#include "FLAC/ordinals.h" - -/* 8 bit CRC generator, MSB shifted first -** polynomial = x^8 + x^2 + x^1 + x^0 -** init = 0 -*/ -extern FLAC__byte const FLAC__crc8_table[256]; -#define FLAC__CRC8_UPDATE(data, crc) (crc) = FLAC__crc8_table[(crc) ^ (data)]; -void FLAC__crc8_update(const FLAC__byte data, FLAC__uint8 *crc); -void FLAC__crc8_update_block(const FLAC__byte *data, unsigned len, FLAC__uint8 *crc); -FLAC__uint8 FLAC__crc8(const FLAC__byte *data, unsigned len); - -/* 16 bit CRC generator, MSB shifted first -** polynomial = x^16 + x^15 + x^2 + x^0 -** init = 0 -*/ -extern unsigned const FLAC__crc16_table[256]; - -#define FLAC__CRC16_UPDATE(data, crc) ((((crc)<<8) & 0xffff) ^ FLAC__crc16_table[((crc)>>8) ^ (data)]) -/* this alternate may be faster on some systems/compilers */ -#if 0 -#define FLAC__CRC16_UPDATE(data, crc) ((((crc)<<8) ^ FLAC__crc16_table[((crc)>>8) ^ (data)]) & 0xffff) -#endif - -unsigned FLAC__crc16(const FLAC__byte *data, unsigned len); - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/fixed.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/fixed.h deleted file mode 100644 index dcc47151..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/fixed.h +++ /dev/null @@ -1,107 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 FLAC__PRIVATE__FIXED_H -#define FLAC__PRIVATE__FIXED_H - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "private/cpu.h" -#include "private/float.h" -#include "FLAC/format.h" - -/* - * FLAC__fixed_compute_best_predictor() - * -------------------------------------------------------------------- - * Compute the best fixed predictor and the expected bits-per-sample - * of the residual signal for each order. The _wide() version uses - * 64-bit integers which is statistically necessary when bits-per- - * sample + log2(blocksize) > 30 - * - * IN data[0,data_len-1] - * IN data_len - * OUT residual_bits_per_sample[0,FLAC__MAX_FIXED_ORDER] - */ -#ifndef FLAC__INTEGER_ONLY_LIBRARY -unsigned FLAC__fixed_compute_best_predictor(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); -unsigned FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); -# ifndef FLAC__NO_ASM -# if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN -# ifdef FLAC__SSE2_SUPPORTED -unsigned FLAC__fixed_compute_best_predictor_intrin_sse2(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER + 1]); -unsigned FLAC__fixed_compute_best_predictor_wide_intrin_sse2(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER + 1]); -# endif -# ifdef FLAC__SSSE3_SUPPORTED -unsigned FLAC__fixed_compute_best_predictor_intrin_ssse3(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); -unsigned FLAC__fixed_compute_best_predictor_wide_intrin_ssse3(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER + 1]); -# endif -# endif -# if defined FLAC__CPU_IA32 && defined FLAC__HAS_NASM -unsigned FLAC__fixed_compute_best_predictor_asm_ia32_mmx_cmov(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); -# endif -# endif -#else -unsigned FLAC__fixed_compute_best_predictor(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); -unsigned FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); -#endif - -/* - * FLAC__fixed_compute_residual() - * -------------------------------------------------------------------- - * Compute the residual signal obtained from sutracting the predicted - * signal from the original. - * - * IN data[-order,data_len-1] original signal (NOTE THE INDICES!) - * IN data_len length of original signal - * IN order <= FLAC__MAX_FIXED_ORDER fixed-predictor order - * OUT residual[0,data_len-1] residual signal - */ -void FLAC__fixed_compute_residual(const FLAC__int32 data[], unsigned data_len, unsigned order, FLAC__int32 residual[]); - -/* - * FLAC__fixed_restore_signal() - * -------------------------------------------------------------------- - * Restore the original signal by summing the residual and the - * predictor. - * - * IN residual[0,data_len-1] residual signal - * IN data_len length of original signal - * IN order <= FLAC__MAX_FIXED_ORDER fixed-predictor order - * *** IMPORTANT: the caller must pass in the historical samples: - * IN data[-order,-1] previously-reconstructed historical samples - * OUT data[0,data_len-1] original signal - */ -void FLAC__fixed_restore_signal(const FLAC__int32 residual[], unsigned data_len, unsigned order, FLAC__int32 data[]); - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/float.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/float.h deleted file mode 100644 index ab264324..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/float.h +++ /dev/null @@ -1,98 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2004-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 FLAC__PRIVATE__FLOAT_H -#define FLAC__PRIVATE__FLOAT_H - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "FLAC/ordinals.h" - -/* - * These typedefs make it easier to ensure that integer versions of - * the library really only contain integer operations. All the code - * in libFLAC should use FLAC__float and FLAC__double in place of - * float and double, and be protected by checks of the macro - * FLAC__INTEGER_ONLY_LIBRARY. - * - * FLAC__real is the basic floating point type used in LPC analysis. - */ -#ifndef FLAC__INTEGER_ONLY_LIBRARY -typedef double FLAC__double; -typedef float FLAC__float; -/* - * WATCHOUT: changing FLAC__real will change the signatures of many - * functions that have assembly language equivalents and break them. - */ -typedef float FLAC__real; -#else -/* - * The convention for FLAC__fixedpoint is to use the upper 16 bits - * for the integer part and lower 16 bits for the fractional part. - */ -typedef FLAC__int32 FLAC__fixedpoint; -extern const FLAC__fixedpoint FLAC__FP_ZERO; -extern const FLAC__fixedpoint FLAC__FP_ONE_HALF; -extern const FLAC__fixedpoint FLAC__FP_ONE; -extern const FLAC__fixedpoint FLAC__FP_LN2; -extern const FLAC__fixedpoint FLAC__FP_E; - -#define FLAC__fixedpoint_trunc(x) ((x)>>16) - -#define FLAC__fixedpoint_mul(x, y) ( (FLAC__fixedpoint) ( ((FLAC__int64)(x)*(FLAC__int64)(y)) >> 16 ) ) - -#define FLAC__fixedpoint_div(x, y) ( (FLAC__fixedpoint) ( ( ((FLAC__int64)(x)<<32) / (FLAC__int64)(y) ) >> 16 ) ) - -/* - * FLAC__fixedpoint_log2() - * -------------------------------------------------------------------- - * Returns the base-2 logarithm of the fixed-point number 'x' using an - * algorithm by Knuth for x >= 1.0 - * - * 'fracbits' is the number of fractional bits of 'x'. 'fracbits' must - * be < 32 and evenly divisible by 4 (0 is OK but not very precise). - * - * 'precision' roughly limits the number of iterations that are done; - * use (unsigned)(-1) for maximum precision. - * - * If 'x' is less than one -- that is, x < (1< -#endif - -#include "private/cpu.h" -#include "private/float.h" -#include "FLAC/format.h" - -#ifndef FLAC__INTEGER_ONLY_LIBRARY - -/* - * FLAC__lpc_window_data() - * -------------------------------------------------------------------- - * Applies the given window to the data. - * OPT: asm implementation - * - * IN in[0,data_len-1] - * IN window[0,data_len-1] - * OUT out[0,lag-1] - * IN data_len - */ -void FLAC__lpc_window_data(const FLAC__int32 in[], const FLAC__real window[], FLAC__real out[], unsigned data_len); - -/* - * FLAC__lpc_compute_autocorrelation() - * -------------------------------------------------------------------- - * Compute the autocorrelation for lags between 0 and lag-1. - * Assumes data[] outside of [0,data_len-1] == 0. - * Asserts that lag > 0. - * - * IN data[0,data_len-1] - * IN data_len - * IN 0 < lag <= data_len - * OUT autoc[0,lag-1] - */ -void FLAC__lpc_compute_autocorrelation(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); -#ifndef FLAC__NO_ASM -# ifdef FLAC__CPU_IA32 -# ifdef FLAC__HAS_NASM -void FLAC__lpc_compute_autocorrelation_asm_ia32(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); -void FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_4(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); -void FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_8(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); -void FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_12(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); -void FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_16(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); -# endif -# endif -# if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN -# ifdef FLAC__SSE_SUPPORTED -void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_4(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); -void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_8(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); -void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_12(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); -void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_16(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); -# endif -# endif -#endif - -/* - * FLAC__lpc_compute_lp_coefficients() - * -------------------------------------------------------------------- - * Computes LP coefficients for orders 1..max_order. - * Do not call if autoc[0] == 0.0. This means the signal is zero - * and there is no point in calculating a predictor. - * - * IN autoc[0,max_order] autocorrelation values - * IN 0 < max_order <= FLAC__MAX_LPC_ORDER max LP order to compute - * OUT lp_coeff[0,max_order-1][0,max_order-1] LP coefficients for each order - * *** IMPORTANT: - * *** lp_coeff[0,max_order-1][max_order,FLAC__MAX_LPC_ORDER-1] are untouched - * OUT error[0,max_order-1] error for each order (more - * specifically, the variance of - * the error signal times # of - * samples in the signal) - * - * Example: if max_order is 9, the LP coefficients for order 9 will be - * in lp_coeff[8][0,8], the LP coefficients for order 8 will be - * in lp_coeff[7][0,7], etc. - */ -void FLAC__lpc_compute_lp_coefficients(const FLAC__real autoc[], unsigned *max_order, FLAC__real lp_coeff[][FLAC__MAX_LPC_ORDER], FLAC__double error[]); - -/* - * FLAC__lpc_quantize_coefficients() - * -------------------------------------------------------------------- - * Quantizes the LP coefficients. NOTE: precision + bits_per_sample - * must be less than 32 (sizeof(FLAC__int32)*8). - * - * IN lp_coeff[0,order-1] LP coefficients - * IN order LP order - * IN FLAC__MIN_QLP_COEFF_PRECISION < precision - * desired precision (in bits, including sign - * bit) of largest coefficient - * OUT qlp_coeff[0,order-1] quantized coefficients - * OUT shift # of bits to shift right to get approximated - * LP coefficients. NOTE: could be negative. - * RETURN 0 => quantization OK - * 1 => coefficients require too much shifting for *shift to - * fit in the LPC subframe header. 'shift' is unset. - * 2 => coefficients are all zero, which is bad. 'shift' is - * unset. - */ -int FLAC__lpc_quantize_coefficients(const FLAC__real lp_coeff[], unsigned order, unsigned precision, FLAC__int32 qlp_coeff[], int *shift); - -/* - * FLAC__lpc_compute_residual_from_qlp_coefficients() - * -------------------------------------------------------------------- - * Compute the residual signal obtained from sutracting the predicted - * signal from the original. - * - * IN data[-order,data_len-1] original signal (NOTE THE INDICES!) - * IN data_len length of original signal - * IN qlp_coeff[0,order-1] quantized LP coefficients - * IN order > 0 LP order - * IN lp_quantization quantization of LP coefficients in bits - * OUT residual[0,data_len-1] residual signal - */ -void FLAC__lpc_compute_residual_from_qlp_coefficients(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); -void FLAC__lpc_compute_residual_from_qlp_coefficients_wide(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); -#ifndef FLAC__NO_ASM -# ifdef FLAC__CPU_IA32 -# ifdef FLAC__HAS_NASM -void FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); -void FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32_mmx(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); -void FLAC__lpc_compute_residual_from_qlp_coefficients_wide_asm_ia32(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); -# endif -# endif -# if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN -# ifdef FLAC__SSE2_SUPPORTED -void FLAC__lpc_compute_residual_from_qlp_coefficients_16_intrin_sse2(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); -void FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_sse2(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); -# endif -# ifdef FLAC__SSE4_1_SUPPORTED -void FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_sse41(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); -void FLAC__lpc_compute_residual_from_qlp_coefficients_wide_intrin_sse41(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); -# endif -# ifdef FLAC__AVX2_SUPPORTED -void FLAC__lpc_compute_residual_from_qlp_coefficients_16_intrin_avx2(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); -void FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_avx2(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); -void FLAC__lpc_compute_residual_from_qlp_coefficients_wide_intrin_avx2(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); -# endif -# endif -#endif - -#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ - -/* - * FLAC__lpc_restore_signal() - * -------------------------------------------------------------------- - * Restore the original signal by summing the residual and the - * predictor. - * - * IN residual[0,data_len-1] residual signal - * IN data_len length of original signal - * IN qlp_coeff[0,order-1] quantized LP coefficients - * IN order > 0 LP order - * IN lp_quantization quantization of LP coefficients in bits - * *** IMPORTANT: the caller must pass in the historical samples: - * IN data[-order,-1] previously-reconstructed historical samples - * OUT data[0,data_len-1] original signal - */ -void FLAC__lpc_restore_signal(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); -void FLAC__lpc_restore_signal_wide(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); -#ifndef FLAC__NO_ASM -# ifdef FLAC__CPU_IA32 -# ifdef FLAC__HAS_NASM -void FLAC__lpc_restore_signal_asm_ia32(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); -void FLAC__lpc_restore_signal_asm_ia32_mmx(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); -void FLAC__lpc_restore_signal_wide_asm_ia32(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); -# endif /* FLAC__HAS_NASM */ -# endif /* FLAC__CPU_IA32 */ -# if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN -# ifdef FLAC__SSE2_SUPPORTED -void FLAC__lpc_restore_signal_16_intrin_sse2(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); -# endif -# ifdef FLAC__SSE4_1_SUPPORTED -void FLAC__lpc_restore_signal_wide_intrin_sse41(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); -# endif -# endif -#endif /* FLAC__NO_ASM */ - -#ifndef FLAC__INTEGER_ONLY_LIBRARY - -/* - * FLAC__lpc_compute_expected_bits_per_residual_sample() - * -------------------------------------------------------------------- - * Compute the expected number of bits per residual signal sample - * based on the LP error (which is related to the residual variance). - * - * IN lpc_error >= 0.0 error returned from calculating LP coefficients - * IN total_samples > 0 # of samples in residual signal - * RETURN expected bits per sample - */ -FLAC__double FLAC__lpc_compute_expected_bits_per_residual_sample(FLAC__double lpc_error, unsigned total_samples); -FLAC__double FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(FLAC__double lpc_error, FLAC__double error_scale); - -/* - * FLAC__lpc_compute_best_order() - * -------------------------------------------------------------------- - * Compute the best order from the array of signal errors returned - * during coefficient computation. - * - * IN lpc_error[0,max_order-1] >= 0.0 error returned from calculating LP coefficients - * IN max_order > 0 max LP order - * IN total_samples > 0 # of samples in residual signal - * IN overhead_bits_per_order # of bits overhead for each increased LP order - * (includes warmup sample size and quantized LP coefficient) - * RETURN [1,max_order] best order - */ -unsigned FLAC__lpc_compute_best_order(const FLAC__double lpc_error[], unsigned max_order, unsigned total_samples, unsigned overhead_bits_per_order); - -#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/macros.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/macros.h deleted file mode 100644 index fcdfad1f..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/macros.h +++ /dev/null @@ -1,72 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2012-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 FLAC__PRIVATE__MACROS_H -#define FLAC__PRIVATE__MACROS_H - -#if defined(__GNUC__) && (__GNUC__ > 4 || ( __GNUC__ == 4 && __GNUC_MINOR__ >= 3)) - -#define flac_max(a,b) \ - ({ __typeof__ (a) _a = (a); \ - __typeof__ (b) _b = (b); \ - _a > _b ? _a : _b; }) - -#define MIN_PASTE(A,B) A##B -#define MIN_IMPL(A,B,L) ({ \ - __typeof__(A) MIN_PASTE(__a,L) = (A); \ - __typeof__(B) MIN_PASTE(__b,L) = (B); \ - MIN_PASTE(__a,L) < MIN_PASTE(__b,L) ? MIN_PASTE(__a,L) : MIN_PASTE(__b,L); \ - }) - -#define flac_min(A,B) MIN_IMPL(A,B,__COUNTER__) - -/* Whatever other unix that has sys/param.h */ -#elif defined(HAVE_SYS_PARAM_H) -#include -#define flac_max(a,b) MAX(a,b) -#define flac_min(a,b) MIN(a,b) - -/* Windows VS has them in stdlib.h.. XXX:Untested */ -#elif defined(_MSC_VER) -#include -#define flac_max(a,b) __max(a,b) -#define flac_min(a,b) __min(a,b) -#endif - -#ifndef flac_min -#define flac_min(x,y) ((x) <= (y) ? (x) : (y)) -#endif - -#ifndef flac_max -#define flac_max(x,y) ((x) >= (y) ? (x) : (y)) -#endif - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/md5.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/md5.h deleted file mode 100644 index c665ab31..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/md5.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef FLAC__PRIVATE__MD5_H -#define FLAC__PRIVATE__MD5_H - -/* - * This is the header file for the MD5 message-digest algorithm. - * The algorithm is due to Ron Rivest. This code was - * written by Colin Plumb in 1993, no copyright is claimed. - * This code is in the public domain; do with it what you wish. - * - * Equivalent code is available from RSA Data Security, Inc. - * This code has been tested against that, and is equivalent, - * except that you don't need to include two pages of legalese - * with every copy. - * - * To compute the message digest of a chunk of bytes, declare an - * MD5Context structure, pass it to MD5Init, call MD5Update as - * needed on buffers full of bytes, and then call MD5Final, which - * will fill a supplied 16-byte array with the digest. - * - * Changed so as no longer to depend on Colin Plumb's `usual.h' - * header definitions; now uses stuff from dpkg's config.h - * - Ian Jackson . - * Still in the public domain. - * - * Josh Coalson: made some changes to integrate with libFLAC. - * Still in the public domain, with no warranty. - */ - -#include "FLAC/ordinals.h" - -typedef union { - FLAC__byte *p8; - FLAC__int16 *p16; - FLAC__int32 *p32; -} FLAC__multibyte; - -typedef struct { - FLAC__uint32 in[16]; - FLAC__uint32 buf[4]; - FLAC__uint32 bytes[2]; - FLAC__multibyte internal_buf; - size_t capacity; -} FLAC__MD5Context; - -void FLAC__MD5Init(FLAC__MD5Context *context); -void FLAC__MD5Final(FLAC__byte digest[16], FLAC__MD5Context *context); - -FLAC__bool FLAC__MD5Accumulate(FLAC__MD5Context *ctx, const FLAC__int32 * const signal[], unsigned channels, unsigned samples, unsigned bytes_per_sample); - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/memory.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/memory.h deleted file mode 100644 index c9f27129..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/memory.h +++ /dev/null @@ -1,58 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 FLAC__PRIVATE__MEMORY_H -#define FLAC__PRIVATE__MEMORY_H - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include /* for size_t */ - -#include "private/float.h" -#include "FLAC/ordinals.h" /* for FLAC__bool */ - -/* Returns the unaligned address returned by malloc. - * Use free() on this address to deallocate. - */ -void *FLAC__memory_alloc_aligned(size_t bytes, void **aligned_address); -FLAC__bool FLAC__memory_alloc_aligned_int32_array(size_t elements, FLAC__int32 **unaligned_pointer, FLAC__int32 **aligned_pointer); -FLAC__bool FLAC__memory_alloc_aligned_uint32_array(size_t elements, FLAC__uint32 **unaligned_pointer, FLAC__uint32 **aligned_pointer); -FLAC__bool FLAC__memory_alloc_aligned_uint64_array(size_t elements, FLAC__uint64 **unaligned_pointer, FLAC__uint64 **aligned_pointer); -FLAC__bool FLAC__memory_alloc_aligned_unsigned_array(size_t elements, unsigned **unaligned_pointer, unsigned **aligned_pointer); -#ifndef FLAC__INTEGER_ONLY_LIBRARY -FLAC__bool FLAC__memory_alloc_aligned_real_array(size_t elements, FLAC__real **unaligned_pointer, FLAC__real **aligned_pointer); -#endif -void *safe_malloc_mul_2op_p(size_t size1, size_t size2); - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/metadata.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/metadata.h deleted file mode 100644 index 092764c2..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/metadata.h +++ /dev/null @@ -1,46 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2002-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 FLAC__PRIVATE__METADATA_H -#define FLAC__PRIVATE__METADATA_H - -#include "FLAC/metadata.h" - -/* WATCHOUT: all malloc()ed data in the block is free()ed; this may not - * be a consistent state (e.g. PICTURE) or equivalent to the initial - * state after FLAC__metadata_object_new() - */ -void FLAC__metadata_object_delete_data(FLAC__StreamMetadata *object); - -void FLAC__metadata_object_cuesheet_track_delete_data(FLAC__StreamMetadata_CueSheet_Track *object); - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/ogg_decoder_aspect.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/ogg_decoder_aspect.h deleted file mode 100644 index 439bf8e4..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/ogg_decoder_aspect.h +++ /dev/null @@ -1,80 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec - * Copyright (C) 2002-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 FLAC__PRIVATE__OGG_DECODER_ASPECT_H -#define FLAC__PRIVATE__OGG_DECODER_ASPECT_H - -#include - -#include "FLAC/ordinals.h" -#include "FLAC/stream_decoder.h" /* for FLAC__StreamDecoderReadStatus */ - -typedef struct FLAC__OggDecoderAspect { - /* these are storage for values that can be set through the API */ - FLAC__bool use_first_serial_number; - long serial_number; - - /* these are for internal state related to Ogg decoding */ - ogg_stream_state stream_state; - ogg_sync_state sync_state; - unsigned version_major, version_minor; - FLAC__bool need_serial_number; - FLAC__bool end_of_stream; - FLAC__bool have_working_page; /* only if true will the following vars be valid */ - ogg_page working_page; - FLAC__bool have_working_packet; /* only if true will the following vars be valid */ - ogg_packet working_packet; /* as we work through the packet we will move working_packet.packet forward and working_packet.bytes down */ -} FLAC__OggDecoderAspect; - -void FLAC__ogg_decoder_aspect_set_serial_number(FLAC__OggDecoderAspect *aspect, long value); -void FLAC__ogg_decoder_aspect_set_defaults(FLAC__OggDecoderAspect *aspect); -FLAC__bool FLAC__ogg_decoder_aspect_init(FLAC__OggDecoderAspect *aspect); -void FLAC__ogg_decoder_aspect_finish(FLAC__OggDecoderAspect *aspect); -void FLAC__ogg_decoder_aspect_flush(FLAC__OggDecoderAspect *aspect); -void FLAC__ogg_decoder_aspect_reset(FLAC__OggDecoderAspect *aspect); - -typedef enum { - FLAC__OGG_DECODER_ASPECT_READ_STATUS_OK = 0, - FLAC__OGG_DECODER_ASPECT_READ_STATUS_END_OF_STREAM, - FLAC__OGG_DECODER_ASPECT_READ_STATUS_LOST_SYNC, - FLAC__OGG_DECODER_ASPECT_READ_STATUS_NOT_FLAC, - FLAC__OGG_DECODER_ASPECT_READ_STATUS_UNSUPPORTED_MAPPING_VERSION, - FLAC__OGG_DECODER_ASPECT_READ_STATUS_ABORT, - FLAC__OGG_DECODER_ASPECT_READ_STATUS_ERROR, - FLAC__OGG_DECODER_ASPECT_READ_STATUS_MEMORY_ALLOCATION_ERROR -} FLAC__OggDecoderAspectReadStatus; - -typedef FLAC__OggDecoderAspectReadStatus (*FLAC__OggDecoderAspectReadCallbackProxy)(const void *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); - -FLAC__OggDecoderAspectReadStatus FLAC__ogg_decoder_aspect_read_callback_wrapper(FLAC__OggDecoderAspect *aspect, FLAC__byte buffer[], size_t *bytes, FLAC__OggDecoderAspectReadCallbackProxy read_callback, const FLAC__StreamDecoder *decoder, void *client_data); - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/ogg_encoder_aspect.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/ogg_encoder_aspect.h deleted file mode 100644 index 709597d4..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/ogg_encoder_aspect.h +++ /dev/null @@ -1,63 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec - * Copyright (C) 2002-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 FLAC__PRIVATE__OGG_ENCODER_ASPECT_H -#define FLAC__PRIVATE__OGG_ENCODER_ASPECT_H - -#include - -#include "FLAC/ordinals.h" -#include "FLAC/stream_encoder.h" /* for FLAC__StreamEncoderWriteStatus */ - -typedef struct FLAC__OggEncoderAspect { - /* these are storage for values that can be set through the API */ - long serial_number; - unsigned num_metadata; - - /* these are for internal state related to Ogg encoding */ - ogg_stream_state stream_state; - ogg_page page; - FLAC__bool seen_magic; /* true if we've seen the fLaC magic in the write callback yet */ - FLAC__bool is_first_packet; - FLAC__uint64 samples_written; -} FLAC__OggEncoderAspect; - -void FLAC__ogg_encoder_aspect_set_serial_number(FLAC__OggEncoderAspect *aspect, long value); -FLAC__bool FLAC__ogg_encoder_aspect_set_num_metadata(FLAC__OggEncoderAspect *aspect, unsigned value); -void FLAC__ogg_encoder_aspect_set_defaults(FLAC__OggEncoderAspect *aspect); -FLAC__bool FLAC__ogg_encoder_aspect_init(FLAC__OggEncoderAspect *aspect); -void FLAC__ogg_encoder_aspect_finish(FLAC__OggEncoderAspect *aspect); - -typedef FLAC__StreamEncoderWriteStatus (*FLAC__OggEncoderAspectWriteCallbackProxy)(const void *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, void *client_data); - -FLAC__StreamEncoderWriteStatus FLAC__ogg_encoder_aspect_write_callback_wrapper(FLAC__OggEncoderAspect *aspect, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, FLAC__bool is_last_block, FLAC__OggEncoderAspectWriteCallbackProxy write_callback, void *encoder, void *client_data); -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/ogg_helper.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/ogg_helper.h deleted file mode 100644 index 87b96ef8..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/ogg_helper.h +++ /dev/null @@ -1,44 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec - * Copyright (C) 2004-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 FLAC__PRIVATE__OGG_HELPER_H -#define FLAC__PRIVATE__OGG_HELPER_H - -#include -#include "FLAC/stream_encoder.h" /* for FLAC__StreamEncoder */ - -void simple_ogg_page__init(ogg_page *page); -void simple_ogg_page__clear(ogg_page *page); -FLAC__bool simple_ogg_page__get_at(FLAC__StreamEncoder *encoder, FLAC__uint64 position, ogg_page *page, FLAC__StreamEncoderSeekCallback seek_callback, FLAC__StreamEncoderReadCallback read_callback, void *client_data); -FLAC__bool simple_ogg_page__set_at(FLAC__StreamEncoder *encoder, FLAC__uint64 position, ogg_page *page, FLAC__StreamEncoderSeekCallback seek_callback, FLAC__StreamEncoderWriteCallback write_callback, void *client_data); - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/ogg_mapping.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/ogg_mapping.h deleted file mode 100644 index d35a46cd..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/ogg_mapping.h +++ /dev/null @@ -1,64 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec - * Copyright (C) 2004-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 FLAC__PRIVATE__OGG_MAPPING_H -#define FLAC__PRIVATE__OGG_MAPPING_H - -#include "FLAC/ordinals.h" - -/** The length of the packet type field in bytes. */ -#define FLAC__OGG_MAPPING_PACKET_TYPE_LENGTH (1u) - -extern const unsigned FLAC__OGG_MAPPING_PACKET_TYPE_LEN; /* = 8 bits */ - -extern const FLAC__byte FLAC__OGG_MAPPING_FIRST_HEADER_PACKET_TYPE; /* = 0x7f */ - -/** The length of the 'FLAC' magic in bytes. */ -#define FLAC__OGG_MAPPING_MAGIC_LENGTH (4u) - -extern const FLAC__byte * const FLAC__OGG_MAPPING_MAGIC; /* = "FLAC" */ - -extern const unsigned FLAC__OGG_MAPPING_VERSION_MAJOR_LEN; /* = 8 bits */ -extern const unsigned FLAC__OGG_MAPPING_VERSION_MINOR_LEN; /* = 8 bits */ - -/** The length of the Ogg FLAC mapping major version number in bytes. */ -#define FLAC__OGG_MAPPING_VERSION_MAJOR_LENGTH (1u) - -/** The length of the Ogg FLAC mapping minor version number in bytes. */ -#define FLAC__OGG_MAPPING_VERSION_MINOR_LENGTH (1u) - -extern const unsigned FLAC__OGG_MAPPING_NUM_HEADERS_LEN; /* = 16 bits */ - -/** The length of the #-of-header-packets number bytes. */ -#define FLAC__OGG_MAPPING_NUM_HEADERS_LENGTH (2u) - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/stream_encoder.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/stream_encoder.h deleted file mode 100644 index 96d31358..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/stream_encoder.h +++ /dev/null @@ -1,67 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 FLAC__PRIVATE__STREAM_ENCODER_H -#define FLAC__PRIVATE__STREAM_ENCODER_H - -#ifdef HAVE_CONFIG_H -#include -#endif - -/* - * This is used to avoid overflow with unusual signals in 32-bit - * accumulator in the *precompute_partition_info_sums_* functions. - */ -#define FLAC__MAX_EXTRA_RESIDUAL_BPS 4 - -#if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN -#include "private/cpu.h" -#include "FLAC/format.h" - -#ifdef FLAC__SSE2_SUPPORTED -extern void FLAC__precompute_partition_info_sums_intrin_sse2(const FLAC__int32 residual[], FLAC__uint64 abs_residual_partition_sums[], - unsigned residual_samples, unsigned predictor_order, unsigned min_partition_order, unsigned max_partition_order, unsigned bps); -#endif - -#ifdef FLAC__SSSE3_SUPPORTED -extern void FLAC__precompute_partition_info_sums_intrin_ssse3(const FLAC__int32 residual[], FLAC__uint64 abs_residual_partition_sums[], - unsigned residual_samples, unsigned predictor_order, unsigned min_partition_order, unsigned max_partition_order, unsigned bps); -#endif - -#ifdef FLAC__AVX2_SUPPORTED -extern void FLAC__precompute_partition_info_sums_intrin_avx2(const FLAC__int32 residual[], FLAC__uint64 abs_residual_partition_sums[], - unsigned residual_samples, unsigned predictor_order, unsigned min_partition_order, unsigned max_partition_order, unsigned bps); -#endif - -#endif - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/stream_encoder_framing.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/stream_encoder_framing.h deleted file mode 100644 index 2b7387a7..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/stream_encoder_framing.h +++ /dev/null @@ -1,46 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 FLAC__PRIVATE__STREAM_ENCODER_FRAMING_H -#define FLAC__PRIVATE__STREAM_ENCODER_FRAMING_H - -#include "FLAC/format.h" -#include "bitwriter.h" - -FLAC__bool FLAC__add_metadata_block(const FLAC__StreamMetadata *metadata, FLAC__BitWriter *bw); -FLAC__bool FLAC__frame_add_header(const FLAC__FrameHeader *header, FLAC__BitWriter *bw); -FLAC__bool FLAC__subframe_add_constant(const FLAC__Subframe_Constant *subframe, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw); -FLAC__bool FLAC__subframe_add_fixed(const FLAC__Subframe_Fixed *subframe, unsigned residual_samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw); -FLAC__bool FLAC__subframe_add_lpc(const FLAC__Subframe_LPC *subframe, unsigned residual_samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw); -FLAC__bool FLAC__subframe_add_verbatim(const FLAC__Subframe_Verbatim *subframe, unsigned samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw); - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/window.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/window.h deleted file mode 100644 index 52c92621..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/private/window.h +++ /dev/null @@ -1,74 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2006-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 FLAC__PRIVATE__WINDOW_H -#define FLAC__PRIVATE__WINDOW_H - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "private/float.h" -#include "FLAC/format.h" - -#ifndef FLAC__INTEGER_ONLY_LIBRARY - -/* - * FLAC__window_*() - * -------------------------------------------------------------------- - * Calculates window coefficients according to different apodization - * functions. - * - * OUT window[0,L-1] - * IN L (number of points in window) - */ -void FLAC__window_bartlett(FLAC__real *window, const FLAC__int32 L); -void FLAC__window_bartlett_hann(FLAC__real *window, const FLAC__int32 L); -void FLAC__window_blackman(FLAC__real *window, const FLAC__int32 L); -void FLAC__window_blackman_harris_4term_92db_sidelobe(FLAC__real *window, const FLAC__int32 L); -void FLAC__window_connes(FLAC__real *window, const FLAC__int32 L); -void FLAC__window_flattop(FLAC__real *window, const FLAC__int32 L); -void FLAC__window_gauss(FLAC__real *window, const FLAC__int32 L, const FLAC__real stddev); /* 0.0 < stddev <= 0.5 */ -void FLAC__window_hamming(FLAC__real *window, const FLAC__int32 L); -void FLAC__window_hann(FLAC__real *window, const FLAC__int32 L); -void FLAC__window_kaiser_bessel(FLAC__real *window, const FLAC__int32 L); -void FLAC__window_nuttall(FLAC__real *window, const FLAC__int32 L); -void FLAC__window_rectangle(FLAC__real *window, const FLAC__int32 L); -void FLAC__window_triangle(FLAC__real *window, const FLAC__int32 L); -void FLAC__window_tukey(FLAC__real *window, const FLAC__int32 L, const FLAC__real p); -void FLAC__window_partial_tukey(FLAC__real *window, const FLAC__int32 L, const FLAC__real p, const FLAC__real start, const FLAC__real end); -void FLAC__window_punchout_tukey(FLAC__real *window, const FLAC__int32 L, const FLAC__real p, const FLAC__real start, const FLAC__real end); -void FLAC__window_welch(FLAC__real *window, const FLAC__int32 L); - -#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/protected/all.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/protected/all.h deleted file mode 100644 index 90912af5..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/protected/all.h +++ /dev/null @@ -1,39 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 FLAC__PROTECTED__ALL_H -#define FLAC__PROTECTED__ALL_H - -#include "stream_decoder.h" -#include "stream_encoder.h" - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/protected/stream_decoder.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/protected/stream_decoder.h deleted file mode 100644 index 7be95afd..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/protected/stream_decoder.h +++ /dev/null @@ -1,60 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 FLAC__PROTECTED__STREAM_DECODER_H -#define FLAC__PROTECTED__STREAM_DECODER_H - -#include "FLAC/stream_decoder.h" -#if FLAC__HAS_OGG -#include "private/ogg_decoder_aspect.h" -#endif - -typedef struct FLAC__StreamDecoderProtected { - FLAC__StreamDecoderState state; - FLAC__StreamDecoderInitStatus initstate; - unsigned channels; - FLAC__ChannelAssignment channel_assignment; - unsigned bits_per_sample; - unsigned sample_rate; /* in Hz */ - unsigned blocksize; /* in samples (per channel) */ - FLAC__bool md5_checking; /* if true, generate MD5 signature of decoded data and compare against signature in the STREAMINFO metadata block */ -#if FLAC__HAS_OGG - FLAC__OggDecoderAspect ogg_decoder_aspect; -#endif -} FLAC__StreamDecoderProtected; - -/* - * return the number of input bytes consumed - */ -unsigned FLAC__stream_decoder_get_input_bytes_unconsumed(const FLAC__StreamDecoder *decoder); - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/protected/stream_encoder.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/protected/stream_encoder.h deleted file mode 100644 index 6917f5d4..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/protected/stream_encoder.h +++ /dev/null @@ -1,118 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 FLAC__PROTECTED__STREAM_ENCODER_H -#define FLAC__PROTECTED__STREAM_ENCODER_H - -#include "FLAC/stream_encoder.h" -#if FLAC__HAS_OGG -#include "private/ogg_encoder_aspect.h" -#endif - -#ifndef FLAC__INTEGER_ONLY_LIBRARY - -#include "private/float.h" - -#define FLAC__MAX_APODIZATION_FUNCTIONS 32 - -typedef enum { - FLAC__APODIZATION_BARTLETT, - FLAC__APODIZATION_BARTLETT_HANN, - FLAC__APODIZATION_BLACKMAN, - FLAC__APODIZATION_BLACKMAN_HARRIS_4TERM_92DB_SIDELOBE, - FLAC__APODIZATION_CONNES, - FLAC__APODIZATION_FLATTOP, - FLAC__APODIZATION_GAUSS, - FLAC__APODIZATION_HAMMING, - FLAC__APODIZATION_HANN, - FLAC__APODIZATION_KAISER_BESSEL, - FLAC__APODIZATION_NUTTALL, - FLAC__APODIZATION_RECTANGLE, - FLAC__APODIZATION_TRIANGLE, - FLAC__APODIZATION_TUKEY, - FLAC__APODIZATION_PARTIAL_TUKEY, - FLAC__APODIZATION_PUNCHOUT_TUKEY, - FLAC__APODIZATION_WELCH -} FLAC__ApodizationFunction; - -typedef struct { - FLAC__ApodizationFunction type; - union { - struct { - FLAC__real stddev; - } gauss; - struct { - FLAC__real p; - } tukey; - struct { - FLAC__real p; - FLAC__real start; - FLAC__real end; - } multiple_tukey; - } parameters; -} FLAC__ApodizationSpecification; - -#endif // #ifndef FLAC__INTEGER_ONLY_LIBRARY - -typedef struct FLAC__StreamEncoderProtected { - FLAC__StreamEncoderState state; - FLAC__bool verify; - FLAC__bool streamable_subset; - FLAC__bool do_md5; - FLAC__bool do_mid_side_stereo; - FLAC__bool loose_mid_side_stereo; - unsigned channels; - unsigned bits_per_sample; - unsigned sample_rate; - unsigned blocksize; -#ifndef FLAC__INTEGER_ONLY_LIBRARY - unsigned num_apodizations; - FLAC__ApodizationSpecification apodizations[FLAC__MAX_APODIZATION_FUNCTIONS]; -#endif - unsigned max_lpc_order; - unsigned qlp_coeff_precision; - FLAC__bool do_qlp_coeff_prec_search; - FLAC__bool do_exhaustive_model_search; - FLAC__bool do_escape_coding; - unsigned min_residual_partition_order; - unsigned max_residual_partition_order; - unsigned rice_parameter_search_dist; - FLAC__uint64 total_samples_estimate; - FLAC__StreamMetadata **metadata; - unsigned num_metadata_blocks; - FLAC__uint64 streaminfo_offset, seektable_offset, audio_offset; -#if FLAC__HAS_OGG - FLAC__OggEncoderAspect ogg_encoder_aspect; -#endif -} FLAC__StreamEncoderProtected; - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/alloc.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/alloc.h deleted file mode 100644 index 5e1f1e26..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/alloc.h +++ /dev/null @@ -1,209 +0,0 @@ -/* alloc - Convenience routines for safely allocating memory - * Copyright (C) 2007-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 FLAC__SHARE__ALLOC_H -#define FLAC__SHARE__ALLOC_H - -#ifdef HAVE_CONFIG_H -# include -#endif - -/* WATCHOUT: for c++ you may have to #define __STDC_LIMIT_MACROS 1 real early - * before #including this file, otherwise SIZE_MAX might not be defined - */ - -#include /* for SIZE_MAX */ -#if HAVE_STDINT_H -#include /* for SIZE_MAX in case limits.h didn't get it */ -#endif -#include /* for size_t, malloc(), etc */ -#include "share/compat.h" - -#ifndef SIZE_MAX -# ifndef SIZE_T_MAX -# ifdef _MSC_VER -# ifdef _WIN64 -# define SIZE_T_MAX 0xffffffffffffffffui64 -# else -# define SIZE_T_MAX 0xffffffff -# endif -# else -# error -# endif -# endif -# define SIZE_MAX SIZE_T_MAX -#endif - -/* avoid malloc()ing 0 bytes, see: - * https://www.securecoding.cert.org/confluence/display/seccode/MEM04-A.+Do+not+make+assumptions+about+the+result+of+allocating+0+bytes?focusedCommentId=5407003 -*/ -static inline void *safe_malloc_(size_t size) -{ - /* malloc(0) is undefined; FLAC src convention is to always allocate */ - if(!size) - size++; - return malloc(size); -} - -static inline void *safe_calloc_(size_t nmemb, size_t size) -{ - if(!nmemb || !size) - return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ - return calloc(nmemb, size); -} - -/*@@@@ there's probably a better way to prevent overflows when allocating untrusted sums but this works for now */ - -static inline void *safe_malloc_add_2op_(size_t size1, size_t size2) -{ - size2 += size1; - if(size2 < size1) - return 0; - return safe_malloc_(size2); -} - -static inline void *safe_malloc_add_3op_(size_t size1, size_t size2, size_t size3) -{ - size2 += size1; - if(size2 < size1) - return 0; - size3 += size2; - if(size3 < size2) - return 0; - return safe_malloc_(size3); -} - -static inline void *safe_malloc_add_4op_(size_t size1, size_t size2, size_t size3, size_t size4) -{ - size2 += size1; - if(size2 < size1) - return 0; - size3 += size2; - if(size3 < size2) - return 0; - size4 += size3; - if(size4 < size3) - return 0; - return safe_malloc_(size4); -} - -void *safe_malloc_mul_2op_(size_t size1, size_t size2) ; - -static inline void *safe_malloc_mul_3op_(size_t size1, size_t size2, size_t size3) -{ - if(!size1 || !size2 || !size3) - return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ - if(size1 > SIZE_MAX / size2) - return 0; - size1 *= size2; - if(size1 > SIZE_MAX / size3) - return 0; - return malloc(size1*size3); -} - -/* size1*size2 + size3 */ -static inline void *safe_malloc_mul2add_(size_t size1, size_t size2, size_t size3) -{ - if(!size1 || !size2) - return safe_malloc_(size3); - if(size1 > SIZE_MAX / size2) - return 0; - return safe_malloc_add_2op_(size1*size2, size3); -} - -/* size1 * (size2 + size3) */ -static inline void *safe_malloc_muladd2_(size_t size1, size_t size2, size_t size3) -{ - if(!size1 || (!size2 && !size3)) - return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ - size2 += size3; - if(size2 < size3) - return 0; - if(size1 > SIZE_MAX / size2) - return 0; - return malloc(size1*size2); -} - -static inline void *safe_realloc_add_2op_(void *ptr, size_t size1, size_t size2) -{ - size2 += size1; - if(size2 < size1) - return 0; - return realloc(ptr, size2); -} - -static inline void *safe_realloc_add_3op_(void *ptr, size_t size1, size_t size2, size_t size3) -{ - size2 += size1; - if(size2 < size1) - return 0; - size3 += size2; - if(size3 < size2) - return 0; - return realloc(ptr, size3); -} - -static inline void *safe_realloc_add_4op_(void *ptr, size_t size1, size_t size2, size_t size3, size_t size4) -{ - size2 += size1; - if(size2 < size1) - return 0; - size3 += size2; - if(size3 < size2) - return 0; - size4 += size3; - if(size4 < size3) - return 0; - return realloc(ptr, size4); -} - -static inline void *safe_realloc_mul_2op_(void *ptr, size_t size1, size_t size2) -{ - if(!size1 || !size2) - return realloc(ptr, 0); /* preserve POSIX realloc(ptr, 0) semantics */ - if(size1 > SIZE_MAX / size2) - return 0; - return realloc(ptr, size1*size2); -} - -/* size1 * (size2 + size3) */ -static inline void *safe_realloc_muladd2_(void *ptr, size_t size1, size_t size2, size_t size3) -{ - if(!size1 || (!size2 && !size3)) - return realloc(ptr, 0); /* preserve POSIX realloc(ptr, 0) semantics */ - size2 += size3; - if(size2 < size3) - return 0; - return safe_realloc_mul_2op_(ptr, size1, size2); -} - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/compat.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/compat.h deleted file mode 100644 index 0dc5673d..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/compat.h +++ /dev/null @@ -1,201 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2012-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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. - */ - -/* This is the prefered location of all CPP hackery to make $random_compiler - * work like something approaching a C99 (or maybe more accurately GNU99) - * compiler. - * - * It is assumed that this header will be included after "config.h". - */ - -#ifndef FLAC__SHARE__COMPAT_H -#define FLAC__SHARE__COMPAT_H - -#if defined _WIN32 && !defined __CYGWIN__ -/* where MSVC puts unlink() */ -# include -#else -# include -#endif - -#if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__ -#include /* for off_t */ -#define FLAC__off_t __int64 /* use this instead of off_t to fix the 2 GB limit */ -#if !defined __MINGW32__ -#define fseeko _fseeki64 -#define ftello _ftelli64 -#else /* MinGW */ -#if !defined(HAVE_FSEEKO) -#define fseeko fseeko64 -#define ftello ftello64 -#endif -#endif -#else -#define FLAC__off_t off_t -#endif - -#if HAVE_INTTYPES_H -#define __STDC_FORMAT_MACROS -#include -#endif - -#if defined(_MSC_VER) -#define strtoll _strtoi64 -#define strtoull _strtoui64 -#endif - -#if defined(_MSC_VER) -#define inline __inline -#endif - -#if defined __INTEL_COMPILER || (defined _MSC_VER && defined _WIN64) -/* MSVS generates VERY slow 32-bit code with __restrict */ -#define flac_restrict __restrict -#elif defined __GNUC__ -#define flac_restrict __restrict__ -#else -#define flac_restrict -#endif - -#define FLAC__U64L(x) x##ULL - -#if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__ -#define FLAC__STRCASECMP stricmp -#define FLAC__STRNCASECMP strnicmp -#else -#define FLAC__STRCASECMP strcasecmp -#define FLAC__STRNCASECMP strncasecmp -#endif - -#if defined _MSC_VER || defined __MINGW32__ || defined __CYGWIN__ || defined __EMX__ -#include /* for _setmode(), chmod() */ -#include /* for _O_BINARY */ -#else -#include /* for chown(), unlink() */ -#endif - -#if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__ -#if defined __BORLANDC__ -#include /* for utime() */ -#else -#include /* for utime() */ -#endif -#else -#include /* some flavors of BSD (like OS X) require this to get time_t */ -#include /* for utime() */ -#endif - -#if defined _MSC_VER -# if _MSC_VER >= 1600 -/* Visual Studio 2010 has decent C99 support */ -# include -# define PRIu64 "llu" -# define PRId64 "lld" -# define PRIx64 "llx" -# else -# include -# ifndef UINT32_MAX -# define UINT32_MAX _UI32_MAX -# endif - typedef unsigned __int64 uint64_t; - typedef unsigned __int32 uint32_t; - typedef unsigned __int16 uint16_t; - typedef unsigned __int8 uint8_t; - typedef __int64 int64_t; - typedef __int32 int32_t; - typedef __int16 int16_t; - typedef __int8 int8_t; -# define PRIu64 "I64u" -# define PRId64 "I64d" -# define PRIx64 "I64x" -# endif -#endif /* defined _MSC_VER */ - -#ifdef _WIN32 -/* All char* strings are in UTF-8 format. Added to support Unicode files on Windows */ -#include "share/win_utf8_io.h" - -#define flac_printf printf_utf8 -#define flac_fprintf fprintf_utf8 -#define flac_vfprintf vfprintf_utf8 -#define flac_fopen fopen_utf8 -#define flac_chmod chmod_utf8 -#define flac_utime utime_utf8 -#define flac_unlink unlink_utf8 -#define flac_rename rename_utf8 -#define flac_stat _stat64_utf8 - -#else - -#define flac_printf printf -#define flac_fprintf fprintf -#define flac_vfprintf vfprintf -#define flac_fopen fopen -#define flac_chmod chmod -#define flac_utime utime -#define flac_unlink unlink -#define flac_rename rename -#define flac_stat stat - -#endif - -#ifdef _WIN32 -#define flac_stat_s __stat64 /* stat struct */ -#define flac_fstat _fstat64 -#else -#define flac_stat_s stat /* stat struct */ -#define flac_fstat fstat -#endif - -#ifndef M_LN2 -#define M_LN2 0.69314718055994530942 -#endif -#ifndef M_PI -#define M_PI 3.14159265358979323846 -#endif - -/* FLAC needs to compile and work correctly on systems with a normal ISO C99 - * snprintf as well as Microsoft Visual Studio which has an non-standards - * conformant snprint_s function. - * - * This function wraps the MS version to behave more like the the ISO version. - */ -#include -#ifdef __cplusplus -extern "C" { -#endif -int flac_snprintf(char *str, size_t size, const char *fmt, ...); -int flac_vsnprintf(char *str, size_t size, const char *fmt, va_list va); -#ifdef __cplusplus -}; -#endif - -#endif /* FLAC__SHARE__COMPAT_H */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/endswap.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/endswap.h deleted file mode 100644 index 4fde4c15..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/endswap.h +++ /dev/null @@ -1,78 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2012-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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. - */ - -/* It is assumed that this header will be included after "config.h". */ - -#if HAVE_BSWAP32 /* GCC and Clang */ - -/* GCC prior to 4.8 didn't provide bswap16 on x86_64 */ -#if ! HAVE_BSWAP16 -static inline unsigned short __builtin_bswap16(unsigned short a) -{ - return (a<<8)|(a>>8); -} -#endif - -#define ENDSWAP_16(x) (__builtin_bswap16 (x)) -#define ENDSWAP_32(x) (__builtin_bswap32 (x)) - -#elif defined _MSC_VER /* Windows. Apparently in . */ - -#define ENDSWAP_16(x) (_byteswap_ushort (x)) -#define ENDSWAP_32(x) (_byteswap_ulong (x)) - -#elif defined HAVE_BYTESWAP_H /* Linux */ - -#include - -#define ENDSWAP_16(x) (bswap_16 (x)) -#define ENDSWAP_32(x) (bswap_32 (x)) - -#else - -#define ENDSWAP_16(x) ((((x) >> 8) & 0xFF) | (((x) & 0xFF) << 8)) -#define ENDSWAP_32(x) ((((x) >> 24) & 0xFF) | (((x) >> 8) & 0xFF00) | (((x) & 0xFF00) << 8) | (((x) & 0xFF) << 24)) - -#endif - - -/* Host to little-endian byte swapping. */ -#if CPU_IS_BIG_ENDIAN - -#define H2LE_16(x) ENDSWAP_16 (x) -#define H2LE_32(x) ENDSWAP_32 (x) - -#else - -#define H2LE_16(x) (x) -#define H2LE_32(x) (x) - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/getopt.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/getopt.h deleted file mode 100644 index 66aced0f..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/getopt.h +++ /dev/null @@ -1,184 +0,0 @@ -/* - NOTE: - I cannot get the vanilla getopt code to work (i.e. compile only what - is needed and not duplicate symbols found in the standard library) - on all the platforms that FLAC supports. In particular the gating - of code with the ELIDE_CODE #define is not accurate enough on systems - that are POSIX but not glibc. If someone has a patch that works on - GNU/Linux, Darwin, AND Solaris please submit it on the project page: - https://sourceforge.net/p/flac/patches/ - - In the meantime I have munged the global symbols and removed gates - around code, while at the same time trying to touch the original as - little as possible. -*/ -/* Declarations for getopt. - Copyright (C) 1989,90,91,92,93,94,96,97,98 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. */ - -#ifndef SHARE__GETOPT_H -#define SHARE__GETOPT_H - -/*[JEC] was:#ifndef __need_getopt*/ -/*[JEC] was:# define _GETOPT_H 1*/ -/*[JEC] was:#endif*/ - -#ifdef __cplusplus -extern "C" { -#endif - -/* For communication from `share__getopt' to the caller. - When `share__getopt' finds an option that takes an argument, - the argument value is returned here. - Also, when `ordering' is RETURN_IN_ORDER, - each non-option ARGV-element is returned here. */ - -extern char *share__optarg; - -/* Index in ARGV of the next element to be scanned. - This is used for communication to and from the caller - and for communication between successive calls to `share__getopt'. - - On entry to `share__getopt', zero means this is the first call; initialize. - - When `share__getopt' returns -1, this is the index of the first of the - non-option elements that the caller should itself scan. - - Otherwise, `share__optind' communicates from one call to the next - how much of ARGV has been scanned so far. */ - -extern int share__optind; - -/* Callers store zero here to inhibit the error message `share__getopt' prints - for unrecognized options. */ - -extern int share__opterr; - -/* Set to an option character which was unrecognized. */ - -extern int share__optopt; - -/*[JEC] was:#ifndef __need_getopt */ -/* Describe the long-named options requested by the application. - The LONG_OPTIONS argument to share__getopt_long or share__getopt_long_only is a vector - of `struct share__option' terminated by an element containing a name which is - zero. - - The field `has_arg' is: - share__no_argument (or 0) if the option does not take an argument, - share__required_argument (or 1) if the option requires an argument, - share__optional_argument (or 2) if the option takes an optional argument. - - If the field `flag' is not NULL, it points to a variable that is set - to the value given in the field `val' when the option is found, but - left unchanged if the option is not found. - - To have a long-named option do something other than set an `int' to - a compiled-in constant, such as set a value from `share__optarg', set the - option's `flag' field to zero and its `val' field to a nonzero - value (the equivalent single-letter option character, if there is - one). For long options that have a zero `flag' field, `share__getopt' - returns the contents of the `val' field. */ - -struct share__option -{ -# if defined __STDC__ && __STDC__ - const char *name; -# else - char *name; -# endif - /* has_arg can't be an enum because some compilers complain about - type mismatches in all the code that assumes it is an int. */ - int has_arg; - int *flag; - int val; -}; - -/* Names for the values of the `has_arg' field of `struct share__option'. */ - -# define share__no_argument 0 -# define share__required_argument 1 -# define share__optional_argument 2 -/*[JEC] was:#endif*/ /* need getopt */ - - -/* Get definitions and prototypes for functions to process the - arguments in ARGV (ARGC of them, minus the program name) for - options given in OPTS. - - Return the option character from OPTS just read. Return -1 when - there are no more options. For unrecognized options, or options - missing arguments, `share__optopt' is set to the option letter, and '?' is - returned. - - The OPTS string is a list of characters which are recognized option - letters, optionally followed by colons, specifying that that letter - takes an argument, to be placed in `share__optarg'. - - If a letter in OPTS is followed by two colons, its argument is - optional. This behavior is specific to the GNU `share__getopt'. - - The argument `--' causes premature termination of argument - scanning, explicitly telling `share__getopt' that there are no more - options. - - If OPTS begins with `--', then non-option arguments are treated as - arguments to the option '\0'. This behavior is specific to the GNU - `share__getopt'. */ - -/*[JEC] was:#if defined __STDC__ && __STDC__*/ -/*[JEC] was:# ifdef __GNU_LIBRARY__*/ -/* Many other libraries have conflicting prototypes for getopt, with - differences in the consts, in stdlib.h. To avoid compilation - errors, only prototype getopt for the GNU C library. */ -extern int share__getopt (int argc, char *const *argv, const char *shortopts); -/*[JEC] was:# else*/ /* not __GNU_LIBRARY__ */ -/*[JEC] was:extern int getopt ();*/ -/*[JEC] was:# endif*/ /* __GNU_LIBRARY__ */ - -/*[JEC] was:# ifndef __need_getopt*/ -extern int share__getopt_long (int argc, char *const *argv, const char *shortopts, - const struct share__option *longopts, int *longind); -extern int share__getopt_long_only (int argc, char *const *argv, - const char *shortopts, - const struct share__option *longopts, int *longind); - -/* Internal only. Users should not call this directly. */ -extern int share___getopt_internal (int argc, char *const *argv, - const char *shortopts, - const struct share__option *longopts, int *longind, - int long_only); -/*[JEC] was:# endif*/ -/*[JEC] was:#else*/ /* not __STDC__ */ -/*[JEC] was:extern int getopt ();*/ -/*[JEC] was:# ifndef __need_getopt*/ -/*[JEC] was:extern int getopt_long ();*/ -/*[JEC] was:extern int getopt_long_only ();*/ - -/*[JEC] was:extern int _getopt_internal ();*/ -/*[JEC] was:# endif*/ -/*[JEC] was:#endif*/ /* __STDC__ */ - -#ifdef __cplusplus -} -#endif - -/* Make sure we later can get all the definitions and declarations. */ -/*[JEC] was:#undef __need_getopt*/ - -#endif /* getopt.h */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/macros.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/macros.h deleted file mode 100644 index b4254b9f..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/macros.h +++ /dev/null @@ -1,41 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2013-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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. - */ - -#include - -/* FLAC_CHECK_RETURN : Check the return value of of the provided function and - * print and error message if it fails (ie returns a value < 0). - */ - -#define FLAC_CHECK_RETURN(x) \ - { if ((x) < 0) \ - printf ("%s : %s\n", #x, strerror (errno)) ; \ - } diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/private.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/private.h deleted file mode 100644 index 3a500d3c..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/private.h +++ /dev/null @@ -1,45 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2013-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 FLAC__SHARE__PRIVATE_H -#define FLAC__SHARE__PRIVATE_H - -/* - * Unpublished debug routines from libFLAC> This should not be used from any - * client code other than code shipped with the FLAC sources. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_disable_constant_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value); -FLAC_API FLAC__bool FLAC__stream_encoder_disable_fixed_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value); -FLAC_API FLAC__bool FLAC__stream_encoder_disable_verbatim_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value); -FLAC_API FLAC__bool FLAC__stream_encoder_set_do_md5(FLAC__StreamEncoder *encoder, FLAC__bool value); -FLAC_API FLAC__bool FLAC__stream_encoder_get_do_md5(const FLAC__StreamEncoder *encoder); - -#endif /* FLAC__SHARE__PRIVATE_H */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/safe_str.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/safe_str.h deleted file mode 100644 index dd1e4ed9..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/safe_str.h +++ /dev/null @@ -1,69 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2013-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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. - */ - -/* Safe string handling functions to replace things like strcpy, strncpy, - * strcat, strncat etc. - * All of these functions guarantee a correctly NUL terminated string but - * the string may be truncated if the destination buffer was too short. - */ - -#ifndef FLAC__SHARE_SAFE_STR_H -#define FLAC__SHARE_SAFE_STR_H - -static inline char * -safe_strncat(char *dest, const char *src, size_t dest_size) -{ - char * ret; - - if (dest_size < 1) - return dest; - - ret = strncat(dest, src, dest_size - strlen (dest)); - dest [dest_size - 1] = 0; - - return ret; -} - -static inline char * -safe_strncpy(char *dest, const char *src, size_t dest_size) -{ - char * ret; - - if (dest_size < 1) - return dest; - - ret = strncpy(dest, src, dest_size); - dest [dest_size - 1] = 0; - - return ret; -} - -#endif /* FLAC__SHARE_SAFE_STR_H */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/utf8.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/utf8.h deleted file mode 100644 index 7d6650d6..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/utf8.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef SHARE__UTF8_H -#define SHARE__UTF8_H - -/* - * Convert a string between UTF-8 and the locale's charset. - * Invalid bytes are replaced by '#', and characters that are - * not available in the target encoding are replaced by '?'. - * - * If the locale's charset is not set explicitly then it is - * obtained using nl_langinfo(CODESET), where available, the - * environment variable CHARSET, or assumed to be US-ASCII. - * - * Return value of conversion functions: - * - * -1 : memory allocation failed - * 0 : data was converted exactly - * 1 : valid data was converted approximately (using '?') - * 2 : input was invalid (but still converted, using '#') - * 3 : unknown encoding (but still converted, using '?') - */ - -int utf8_encode(const char *from, char **to); -int utf8_decode(const char *from, char **to); - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/win_utf8_io.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/win_utf8_io.h deleted file mode 100644 index 1d153392..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/include/share/win_utf8_io.h +++ /dev/null @@ -1,69 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2013-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 _WIN32 - -#ifndef flac__win_utf8_io_h -#define flac__win_utf8_io_h - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include -#include -#include - -int get_utf8_argv(int *argc, char ***argv); - -int printf_utf8(const char *format, ...); -int fprintf_utf8(FILE *stream, const char *format, ...); -int vfprintf_utf8(FILE *stream, const char *format, va_list argptr); - -FILE *fopen_utf8(const char *filename, const char *mode); -int stat_utf8(const char *path, struct stat *buffer); -int _stat64_utf8(const char *path, struct __stat64 *buffer); -int chmod_utf8(const char *filename, int pmode); -int utime_utf8(const char *filename, struct utimbuf *times); -int unlink_utf8(const char *filename); -int rename_utf8(const char *oldname, const char *newname); -size_t strlen_utf8(const char *str); -int win_get_console_width(void); -int print_console(FILE *stream, const wchar_t *text, size_t len); -HANDLE WINAPI CreateFile_utf8(const char *lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/lpc.c b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/lpc.c deleted file mode 100644 index ca98c5cf..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/lpc.c +++ /dev/null @@ -1,1357 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 -#endif - -#include - -#include "FLAC/assert.h" -#include "FLAC/format.h" -#include "share/compat.h" -#include "private/bitmath.h" -#include "private/lpc.h" -#include "private/macros.h" -#if defined DEBUG || defined FLAC__OVERFLOW_DETECT || defined FLAC__OVERFLOW_DETECT_VERBOSE -#include -#endif - -/* OPT: #undef'ing this may improve the speed on some architectures */ -#define FLAC__LPC_UNROLLED_FILTER_LOOPS - -#ifndef FLAC__INTEGER_ONLY_LIBRARY - -#if !defined(HAVE_LROUND) -#if defined(_MSC_VER) -#include -#define copysign _copysign -#elif defined(__GNUC__) -#define copysign __builtin_copysign -#endif -static inline long int lround(double x) { - return (long)(x + copysign (0.5, x)); -} -/* If this fails, we are in the presence of a mid 90's compiler, move along... */ -#endif - -void FLAC__lpc_window_data(const FLAC__int32 in[], const FLAC__real window[], FLAC__real out[], unsigned data_len) -{ - unsigned i; - for(i = 0; i < data_len; i++) - out[i] = in[i] * window[i]; -} - -void FLAC__lpc_compute_autocorrelation(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]) -{ - /* a readable, but slower, version */ -#if 0 - FLAC__real d; - unsigned i; - - FLAC__ASSERT(lag > 0); - FLAC__ASSERT(lag <= data_len); - - /* - * Technically we should subtract the mean first like so: - * for(i = 0; i < data_len; i++) - * data[i] -= mean; - * but it appears not to make enough of a difference to matter, and - * most signals are already closely centered around zero - */ - while(lag--) { - for(i = lag, d = 0.0; i < data_len; i++) - d += data[i] * data[i - lag]; - autoc[lag] = d; - } -#endif - - /* - * this version tends to run faster because of better data locality - * ('data_len' is usually much larger than 'lag') - */ - FLAC__real d; - unsigned sample, coeff; - const unsigned limit = data_len - lag; - - FLAC__ASSERT(lag > 0); - FLAC__ASSERT(lag <= data_len); - - for(coeff = 0; coeff < lag; coeff++) - autoc[coeff] = 0.0; - for(sample = 0; sample <= limit; sample++) { - d = data[sample]; - for(coeff = 0; coeff < lag; coeff++) - autoc[coeff] += d * data[sample+coeff]; - } - for(; sample < data_len; sample++) { - d = data[sample]; - for(coeff = 0; coeff < data_len - sample; coeff++) - autoc[coeff] += d * data[sample+coeff]; - } -} - -void FLAC__lpc_compute_lp_coefficients(const FLAC__real autoc[], unsigned *max_order, FLAC__real lp_coeff[][FLAC__MAX_LPC_ORDER], FLAC__double error[]) -{ - unsigned i, j; - FLAC__double r, err, lpc[FLAC__MAX_LPC_ORDER]; - - FLAC__ASSERT(0 != max_order); - FLAC__ASSERT(0 < *max_order); - FLAC__ASSERT(*max_order <= FLAC__MAX_LPC_ORDER); - FLAC__ASSERT(autoc[0] != 0.0); - - err = autoc[0]; - - for(i = 0; i < *max_order; i++) { - /* Sum up this iteration's reflection coefficient. */ - r = -autoc[i+1]; - for(j = 0; j < i; j++) - r -= lpc[j] * autoc[i-j]; - r /= err; - - /* Update LPC coefficients and total error. */ - lpc[i]=r; - for(j = 0; j < (i>>1); j++) { - FLAC__double tmp = lpc[j]; - lpc[j] += r * lpc[i-1-j]; - lpc[i-1-j] += r * tmp; - } - if(i & 1) - lpc[j] += lpc[j] * r; - - err *= (1.0 - r * r); - - /* save this order */ - for(j = 0; j <= i; j++) - lp_coeff[i][j] = (FLAC__real)(-lpc[j]); /* negate FIR filter coeff to get predictor coeff */ - error[i] = err; - - /* see SF bug https://sourceforge.net/p/flac/bugs/234/ */ - if(err == 0.0) { - *max_order = i+1; - return; - } - } -} - -int FLAC__lpc_quantize_coefficients(const FLAC__real lp_coeff[], unsigned order, unsigned precision, FLAC__int32 qlp_coeff[], int *shift) -{ - unsigned i; - FLAC__double cmax; - FLAC__int32 qmax, qmin; - - FLAC__ASSERT(precision > 0); - FLAC__ASSERT(precision >= FLAC__MIN_QLP_COEFF_PRECISION); - - /* drop one bit for the sign; from here on out we consider only |lp_coeff[i]| */ - precision--; - qmax = 1 << precision; - qmin = -qmax; - qmax--; - - /* calc cmax = max( |lp_coeff[i]| ) */ - cmax = 0.0; - for(i = 0; i < order; i++) { - const FLAC__double d = fabs(lp_coeff[i]); - if(d > cmax) - cmax = d; - } - - if(cmax <= 0.0) { - /* => coefficients are all 0, which means our constant-detect didn't work */ - return 2; - } - else { - const int max_shiftlimit = (1 << (FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN-1)) - 1; - const int min_shiftlimit = -max_shiftlimit - 1; - int log2cmax; - - (void)frexp(cmax, &log2cmax); - log2cmax--; - *shift = (int)precision - log2cmax - 1; - - if(*shift > max_shiftlimit) - *shift = max_shiftlimit; - else if(*shift < min_shiftlimit) - return 1; - } - - if(*shift >= 0) { - FLAC__double error = 0.0; - FLAC__int32 q; - for(i = 0; i < order; i++) { - error += lp_coeff[i] * (1 << *shift); - q = lround(error); - -#ifdef FLAC__OVERFLOW_DETECT - if(q > qmax+1) /* we expect q==qmax+1 occasionally due to rounding */ - fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q>qmax %d>%d shift=%d cmax=%f precision=%u lpc[%u]=%f\n",q,qmax,*shift,cmax,precision+1,i,lp_coeff[i]); - else if(q < qmin) - fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q qmax) - q = qmax; - else if(q < qmin) - q = qmin; - error -= q; - qlp_coeff[i] = q; - } - } - /* negative shift is very rare but due to design flaw, negative shift is - * a NOP in the decoder, so it must be handled specially by scaling down - * coeffs - */ - else { - const int nshift = -(*shift); - FLAC__double error = 0.0; - FLAC__int32 q; -#ifdef DEBUG - fprintf(stderr,"FLAC__lpc_quantize_coefficients: negative shift=%d order=%u cmax=%f\n", *shift, order, cmax); -#endif - for(i = 0; i < order; i++) { - error += lp_coeff[i] / (1 << nshift); - q = lround(error); -#ifdef FLAC__OVERFLOW_DETECT - if(q > qmax+1) /* we expect q==qmax+1 occasionally due to rounding */ - fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q>qmax %d>%d shift=%d cmax=%f precision=%u lpc[%u]=%f\n",q,qmax,*shift,cmax,precision+1,i,lp_coeff[i]); - else if(q < qmin) - fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q qmax) - q = qmax; - else if(q < qmin) - q = qmin; - error -= q; - qlp_coeff[i] = q; - } - *shift = 0; - } - - return 0; -} - -#if defined(_MSC_VER) -// silence MSVC warnings about __restrict modifier -#pragma warning ( disable : 4028 ) -#endif - -void FLAC__lpc_compute_residual_from_qlp_coefficients(const FLAC__int32 * flac_restrict data, unsigned data_len, const FLAC__int32 * flac_restrict qlp_coeff, unsigned order, int lp_quantization, FLAC__int32 * flac_restrict residual) -#if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) -{ - FLAC__int64 sumo; - unsigned i, j; - FLAC__int32 sum; - const FLAC__int32 *history; - -#ifdef FLAC__OVERFLOW_DETECT_VERBOSE - fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization); - for(i=0;i 0); - - for(i = 0; i < data_len; i++) { - sumo = 0; - sum = 0; - history = data; - for(j = 0; j < order; j++) { - sum += qlp_coeff[j] * (*(--history)); - sumo += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*history); - fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients: OVERFLOW, i=%u, j=%u, c=%d, d=%d, sumo=%" PRId64 "\n",i,j,qlp_coeff[j],*history,sumo); - } - *(residual++) = *(data++) - (sum >> lp_quantization); - } - - /* Here's a slower but clearer version: - for(i = 0; i < data_len; i++) { - sum = 0; - for(j = 0; j < order; j++) - sum += qlp_coeff[j] * data[i-j-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - */ -} -#else /* fully unrolled version for normal use */ -{ - int i; - FLAC__int32 sum; - - FLAC__ASSERT(order > 0); - FLAC__ASSERT(order <= 32); - - /* - * We do unique versions up to 12th order since that's the subset limit. - * Also they are roughly ordered to match frequency of occurrence to - * minimize branching. - */ - if(order <= 12) { - if(order > 8) { - if(order > 10) { - if(order == 12) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[11] * data[i-12]; - sum += qlp_coeff[10] * data[i-11]; - sum += qlp_coeff[9] * data[i-10]; - sum += qlp_coeff[8] * data[i-9]; - sum += qlp_coeff[7] * data[i-8]; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - } - else { /* order == 11 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[10] * data[i-11]; - sum += qlp_coeff[9] * data[i-10]; - sum += qlp_coeff[8] * data[i-9]; - sum += qlp_coeff[7] * data[i-8]; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - } - } - else { - if(order == 10) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[9] * data[i-10]; - sum += qlp_coeff[8] * data[i-9]; - sum += qlp_coeff[7] * data[i-8]; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - } - else { /* order == 9 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[8] * data[i-9]; - sum += qlp_coeff[7] * data[i-8]; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - } - } - } - else if(order > 4) { - if(order > 6) { - if(order == 8) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[7] * data[i-8]; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - } - else { /* order == 7 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - } - } - else { - if(order == 6) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - } - else { /* order == 5 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - } - } - } - else { - if(order > 2) { - if(order == 4) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - } - else { /* order == 3 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - } - } - else { - if(order == 2) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - } - else { /* order == 1 */ - for(i = 0; i < (int)data_len; i++) - residual[i] = data[i] - ((qlp_coeff[0] * data[i-1]) >> lp_quantization); - } - } - } - } - else { /* order > 12 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - switch(order) { - case 32: sum += qlp_coeff[31] * data[i-32]; - case 31: sum += qlp_coeff[30] * data[i-31]; - case 30: sum += qlp_coeff[29] * data[i-30]; - case 29: sum += qlp_coeff[28] * data[i-29]; - case 28: sum += qlp_coeff[27] * data[i-28]; - case 27: sum += qlp_coeff[26] * data[i-27]; - case 26: sum += qlp_coeff[25] * data[i-26]; - case 25: sum += qlp_coeff[24] * data[i-25]; - case 24: sum += qlp_coeff[23] * data[i-24]; - case 23: sum += qlp_coeff[22] * data[i-23]; - case 22: sum += qlp_coeff[21] * data[i-22]; - case 21: sum += qlp_coeff[20] * data[i-21]; - case 20: sum += qlp_coeff[19] * data[i-20]; - case 19: sum += qlp_coeff[18] * data[i-19]; - case 18: sum += qlp_coeff[17] * data[i-18]; - case 17: sum += qlp_coeff[16] * data[i-17]; - case 16: sum += qlp_coeff[15] * data[i-16]; - case 15: sum += qlp_coeff[14] * data[i-15]; - case 14: sum += qlp_coeff[13] * data[i-14]; - case 13: sum += qlp_coeff[12] * data[i-13]; - sum += qlp_coeff[11] * data[i-12]; - sum += qlp_coeff[10] * data[i-11]; - sum += qlp_coeff[ 9] * data[i-10]; - sum += qlp_coeff[ 8] * data[i- 9]; - sum += qlp_coeff[ 7] * data[i- 8]; - sum += qlp_coeff[ 6] * data[i- 7]; - sum += qlp_coeff[ 5] * data[i- 6]; - sum += qlp_coeff[ 4] * data[i- 5]; - sum += qlp_coeff[ 3] * data[i- 4]; - sum += qlp_coeff[ 2] * data[i- 3]; - sum += qlp_coeff[ 1] * data[i- 2]; - sum += qlp_coeff[ 0] * data[i- 1]; - } - residual[i] = data[i] - (sum >> lp_quantization); - } - } -} -#endif - -void FLAC__lpc_compute_residual_from_qlp_coefficients_wide(const FLAC__int32 * flac_restrict data, unsigned data_len, const FLAC__int32 * flac_restrict qlp_coeff, unsigned order, int lp_quantization, FLAC__int32 * flac_restrict residual) -#if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) -{ - unsigned i, j; - FLAC__int64 sum; - const FLAC__int32 *history; - -#ifdef FLAC__OVERFLOW_DETECT_VERBOSE - fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization); - for(i=0;i 0); - - for(i = 0; i < data_len; i++) { - sum = 0; - history = data; - for(j = 0; j < order; j++) - sum += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*(--history)); - if(FLAC__bitmath_silog2_wide(sum >> lp_quantization) > 32) { - fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: OVERFLOW, i=%u, sum=%" PRId64 "\n", i, (sum >> lp_quantization)); - break; - } - if(FLAC__bitmath_silog2_wide((FLAC__int64)(*data) - (sum >> lp_quantization)) > 32) { - fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: OVERFLOW, i=%u, data=%d, sum=%" PRId64 ", residual=%" PRId64 "\n", i, *data, (int64_t)(sum >> lp_quantization), ((FLAC__int64)(*data) - (sum >> lp_quantization))); - break; - } - *(residual++) = *(data++) - (FLAC__int32)(sum >> lp_quantization); - } -} -#else /* fully unrolled version for normal use */ -{ - int i; - FLAC__int64 sum; - - FLAC__ASSERT(order > 0); - FLAC__ASSERT(order <= 32); - - /* - * We do unique versions up to 12th order since that's the subset limit. - * Also they are roughly ordered to match frequency of occurrence to - * minimize branching. - */ - if(order <= 12) { - if(order > 8) { - if(order > 10) { - if(order == 12) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; - sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; - sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; - sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; - sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - else { /* order == 11 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; - sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; - sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; - sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - } - else { - if(order == 10) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; - sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; - sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - else { /* order == 9 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; - sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - } - } - else if(order > 4) { - if(order > 6) { - if(order == 8) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - else { /* order == 7 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - } - else { - if(order == 6) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - else { /* order == 5 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - } - } - else { - if(order > 2) { - if(order == 4) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - else { /* order == 3 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - } - else { - if(order == 2) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - else { /* order == 1 */ - for(i = 0; i < (int)data_len; i++) - residual[i] = data[i] - (FLAC__int32)((qlp_coeff[0] * (FLAC__int64)data[i-1]) >> lp_quantization); - } - } - } - } - else { /* order > 12 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - switch(order) { - case 32: sum += qlp_coeff[31] * (FLAC__int64)data[i-32]; - case 31: sum += qlp_coeff[30] * (FLAC__int64)data[i-31]; - case 30: sum += qlp_coeff[29] * (FLAC__int64)data[i-30]; - case 29: sum += qlp_coeff[28] * (FLAC__int64)data[i-29]; - case 28: sum += qlp_coeff[27] * (FLAC__int64)data[i-28]; - case 27: sum += qlp_coeff[26] * (FLAC__int64)data[i-27]; - case 26: sum += qlp_coeff[25] * (FLAC__int64)data[i-26]; - case 25: sum += qlp_coeff[24] * (FLAC__int64)data[i-25]; - case 24: sum += qlp_coeff[23] * (FLAC__int64)data[i-24]; - case 23: sum += qlp_coeff[22] * (FLAC__int64)data[i-23]; - case 22: sum += qlp_coeff[21] * (FLAC__int64)data[i-22]; - case 21: sum += qlp_coeff[20] * (FLAC__int64)data[i-21]; - case 20: sum += qlp_coeff[19] * (FLAC__int64)data[i-20]; - case 19: sum += qlp_coeff[18] * (FLAC__int64)data[i-19]; - case 18: sum += qlp_coeff[17] * (FLAC__int64)data[i-18]; - case 17: sum += qlp_coeff[16] * (FLAC__int64)data[i-17]; - case 16: sum += qlp_coeff[15] * (FLAC__int64)data[i-16]; - case 15: sum += qlp_coeff[14] * (FLAC__int64)data[i-15]; - case 14: sum += qlp_coeff[13] * (FLAC__int64)data[i-14]; - case 13: sum += qlp_coeff[12] * (FLAC__int64)data[i-13]; - sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; - sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; - sum += qlp_coeff[ 9] * (FLAC__int64)data[i-10]; - sum += qlp_coeff[ 8] * (FLAC__int64)data[i- 9]; - sum += qlp_coeff[ 7] * (FLAC__int64)data[i- 8]; - sum += qlp_coeff[ 6] * (FLAC__int64)data[i- 7]; - sum += qlp_coeff[ 5] * (FLAC__int64)data[i- 6]; - sum += qlp_coeff[ 4] * (FLAC__int64)data[i- 5]; - sum += qlp_coeff[ 3] * (FLAC__int64)data[i- 4]; - sum += qlp_coeff[ 2] * (FLAC__int64)data[i- 3]; - sum += qlp_coeff[ 1] * (FLAC__int64)data[i- 2]; - sum += qlp_coeff[ 0] * (FLAC__int64)data[i- 1]; - } - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } -} -#endif - -#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ - -void FLAC__lpc_restore_signal(const FLAC__int32 * flac_restrict residual, unsigned data_len, const FLAC__int32 * flac_restrict qlp_coeff, unsigned order, int lp_quantization, FLAC__int32 * flac_restrict data) -#if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) -{ - FLAC__int64 sumo; - unsigned i, j; - FLAC__int32 sum; - const FLAC__int32 *r = residual, *history; - -#ifdef FLAC__OVERFLOW_DETECT_VERBOSE - fprintf(stderr,"FLAC__lpc_restore_signal: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization); - for(i=0;i 0); - - for(i = 0; i < data_len; i++) { - sumo = 0; - sum = 0; - history = data; - for(j = 0; j < order; j++) { - sum += qlp_coeff[j] * (*(--history)); - sumo += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*history); - if(sumo > 2147483647ll || sumo < -2147483648ll) - fprintf(stderr,"FLAC__lpc_restore_signal: OVERFLOW, i=%u, j=%u, c=%d, d=%d, sumo=%" PRId64 "\n",i,j,qlp_coeff[j],*history,sumo); - } - *(data++) = *(r++) + (sum >> lp_quantization); - } - - /* Here's a slower but clearer version: - for(i = 0; i < data_len; i++) { - sum = 0; - for(j = 0; j < order; j++) - sum += qlp_coeff[j] * data[i-j-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - */ -} -#else /* fully unrolled version for normal use */ -{ - int i; - FLAC__int32 sum; - - FLAC__ASSERT(order > 0); - FLAC__ASSERT(order <= 32); - - /* - * We do unique versions up to 12th order since that's the subset limit. - * Also they are roughly ordered to match frequency of occurrence to - * minimize branching. - */ - if(order <= 12) { - if(order > 8) { - if(order > 10) { - if(order == 12) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[11] * data[i-12]; - sum += qlp_coeff[10] * data[i-11]; - sum += qlp_coeff[9] * data[i-10]; - sum += qlp_coeff[8] * data[i-9]; - sum += qlp_coeff[7] * data[i-8]; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - } - else { /* order == 11 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[10] * data[i-11]; - sum += qlp_coeff[9] * data[i-10]; - sum += qlp_coeff[8] * data[i-9]; - sum += qlp_coeff[7] * data[i-8]; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - } - } - else { - if(order == 10) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[9] * data[i-10]; - sum += qlp_coeff[8] * data[i-9]; - sum += qlp_coeff[7] * data[i-8]; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - } - else { /* order == 9 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[8] * data[i-9]; - sum += qlp_coeff[7] * data[i-8]; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - } - } - } - else if(order > 4) { - if(order > 6) { - if(order == 8) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[7] * data[i-8]; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - } - else { /* order == 7 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - } - } - else { - if(order == 6) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - } - else { /* order == 5 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - } - } - } - else { - if(order > 2) { - if(order == 4) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - } - else { /* order == 3 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - } - } - else { - if(order == 2) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - } - else { /* order == 1 */ - for(i = 0; i < (int)data_len; i++) - data[i] = residual[i] + ((qlp_coeff[0] * data[i-1]) >> lp_quantization); - } - } - } - } - else { /* order > 12 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - switch(order) { - case 32: sum += qlp_coeff[31] * data[i-32]; - case 31: sum += qlp_coeff[30] * data[i-31]; - case 30: sum += qlp_coeff[29] * data[i-30]; - case 29: sum += qlp_coeff[28] * data[i-29]; - case 28: sum += qlp_coeff[27] * data[i-28]; - case 27: sum += qlp_coeff[26] * data[i-27]; - case 26: sum += qlp_coeff[25] * data[i-26]; - case 25: sum += qlp_coeff[24] * data[i-25]; - case 24: sum += qlp_coeff[23] * data[i-24]; - case 23: sum += qlp_coeff[22] * data[i-23]; - case 22: sum += qlp_coeff[21] * data[i-22]; - case 21: sum += qlp_coeff[20] * data[i-21]; - case 20: sum += qlp_coeff[19] * data[i-20]; - case 19: sum += qlp_coeff[18] * data[i-19]; - case 18: sum += qlp_coeff[17] * data[i-18]; - case 17: sum += qlp_coeff[16] * data[i-17]; - case 16: sum += qlp_coeff[15] * data[i-16]; - case 15: sum += qlp_coeff[14] * data[i-15]; - case 14: sum += qlp_coeff[13] * data[i-14]; - case 13: sum += qlp_coeff[12] * data[i-13]; - sum += qlp_coeff[11] * data[i-12]; - sum += qlp_coeff[10] * data[i-11]; - sum += qlp_coeff[ 9] * data[i-10]; - sum += qlp_coeff[ 8] * data[i- 9]; - sum += qlp_coeff[ 7] * data[i- 8]; - sum += qlp_coeff[ 6] * data[i- 7]; - sum += qlp_coeff[ 5] * data[i- 6]; - sum += qlp_coeff[ 4] * data[i- 5]; - sum += qlp_coeff[ 3] * data[i- 4]; - sum += qlp_coeff[ 2] * data[i- 3]; - sum += qlp_coeff[ 1] * data[i- 2]; - sum += qlp_coeff[ 0] * data[i- 1]; - } - data[i] = residual[i] + (sum >> lp_quantization); - } - } -} -#endif - -void FLAC__lpc_restore_signal_wide(const FLAC__int32 * flac_restrict residual, unsigned data_len, const FLAC__int32 * flac_restrict qlp_coeff, unsigned order, int lp_quantization, FLAC__int32 * flac_restrict data) -#if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) -{ - unsigned i, j; - FLAC__int64 sum; - const FLAC__int32 *r = residual, *history; - -#ifdef FLAC__OVERFLOW_DETECT_VERBOSE - fprintf(stderr,"FLAC__lpc_restore_signal_wide: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization); - for(i=0;i 0); - - for(i = 0; i < data_len; i++) { - sum = 0; - history = data; - for(j = 0; j < order; j++) - sum += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*(--history)); - if(FLAC__bitmath_silog2_wide(sum >> lp_quantization) > 32) { - fprintf(stderr,"FLAC__lpc_restore_signal_wide: OVERFLOW, i=%u, sum=%" PRId64 "\n", i, (sum >> lp_quantization)); - break; - } - if(FLAC__bitmath_silog2_wide((FLAC__int64)(*r) + (sum >> lp_quantization)) > 32) { - fprintf(stderr,"FLAC__lpc_restore_signal_wide: OVERFLOW, i=%u, residual=%d, sum=%" PRId64 ", data=%" PRId64 "\n", i, *r, (sum >> lp_quantization), ((FLAC__int64)(*r) + (sum >> lp_quantization))); - break; - } - *(data++) = *(r++) + (FLAC__int32)(sum >> lp_quantization); - } -} -#else /* fully unrolled version for normal use */ -{ - int i; - FLAC__int64 sum; - - FLAC__ASSERT(order > 0); - FLAC__ASSERT(order <= 32); - - /* - * We do unique versions up to 12th order since that's the subset limit. - * Also they are roughly ordered to match frequency of occurrence to - * minimize branching. - */ - if(order <= 12) { - if(order > 8) { - if(order > 10) { - if(order == 12) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; - sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; - sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; - sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; - sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); - } - } - else { /* order == 11 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; - sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; - sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; - sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); - } - } - } - else { - if(order == 10) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; - sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; - sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); - } - } - else { /* order == 9 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; - sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); - } - } - } - } - else if(order > 4) { - if(order > 6) { - if(order == 8) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); - } - } - else { /* order == 7 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); - } - } - } - else { - if(order == 6) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); - } - } - else { /* order == 5 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); - } - } - } - } - else { - if(order > 2) { - if(order == 4) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); - } - } - else { /* order == 3 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); - } - } - } - else { - if(order == 2) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); - } - } - else { /* order == 1 */ - for(i = 0; i < (int)data_len; i++) - data[i] = residual[i] + (FLAC__int32)((qlp_coeff[0] * (FLAC__int64)data[i-1]) >> lp_quantization); - } - } - } - } - else { /* order > 12 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - switch(order) { - case 32: sum += qlp_coeff[31] * (FLAC__int64)data[i-32]; - case 31: sum += qlp_coeff[30] * (FLAC__int64)data[i-31]; - case 30: sum += qlp_coeff[29] * (FLAC__int64)data[i-30]; - case 29: sum += qlp_coeff[28] * (FLAC__int64)data[i-29]; - case 28: sum += qlp_coeff[27] * (FLAC__int64)data[i-28]; - case 27: sum += qlp_coeff[26] * (FLAC__int64)data[i-27]; - case 26: sum += qlp_coeff[25] * (FLAC__int64)data[i-26]; - case 25: sum += qlp_coeff[24] * (FLAC__int64)data[i-25]; - case 24: sum += qlp_coeff[23] * (FLAC__int64)data[i-24]; - case 23: sum += qlp_coeff[22] * (FLAC__int64)data[i-23]; - case 22: sum += qlp_coeff[21] * (FLAC__int64)data[i-22]; - case 21: sum += qlp_coeff[20] * (FLAC__int64)data[i-21]; - case 20: sum += qlp_coeff[19] * (FLAC__int64)data[i-20]; - case 19: sum += qlp_coeff[18] * (FLAC__int64)data[i-19]; - case 18: sum += qlp_coeff[17] * (FLAC__int64)data[i-18]; - case 17: sum += qlp_coeff[16] * (FLAC__int64)data[i-17]; - case 16: sum += qlp_coeff[15] * (FLAC__int64)data[i-16]; - case 15: sum += qlp_coeff[14] * (FLAC__int64)data[i-15]; - case 14: sum += qlp_coeff[13] * (FLAC__int64)data[i-14]; - case 13: sum += qlp_coeff[12] * (FLAC__int64)data[i-13]; - sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; - sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; - sum += qlp_coeff[ 9] * (FLAC__int64)data[i-10]; - sum += qlp_coeff[ 8] * (FLAC__int64)data[i- 9]; - sum += qlp_coeff[ 7] * (FLAC__int64)data[i- 8]; - sum += qlp_coeff[ 6] * (FLAC__int64)data[i- 7]; - sum += qlp_coeff[ 5] * (FLAC__int64)data[i- 6]; - sum += qlp_coeff[ 4] * (FLAC__int64)data[i- 5]; - sum += qlp_coeff[ 3] * (FLAC__int64)data[i- 4]; - sum += qlp_coeff[ 2] * (FLAC__int64)data[i- 3]; - sum += qlp_coeff[ 1] * (FLAC__int64)data[i- 2]; - sum += qlp_coeff[ 0] * (FLAC__int64)data[i- 1]; - } - data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); - } - } -} -#endif - -#if defined(_MSC_VER) -#pragma warning ( default : 4028 ) -#endif - -#ifndef FLAC__INTEGER_ONLY_LIBRARY - -FLAC__double FLAC__lpc_compute_expected_bits_per_residual_sample(FLAC__double lpc_error, unsigned total_samples) -{ - FLAC__double error_scale; - - FLAC__ASSERT(total_samples > 0); - - error_scale = 0.5 * M_LN2 * M_LN2 / (FLAC__double)total_samples; - - return FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(lpc_error, error_scale); -} - -FLAC__double FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(FLAC__double lpc_error, FLAC__double error_scale) -{ - if(lpc_error > 0.0) { - FLAC__double bps = (FLAC__double)0.5 * log(error_scale * lpc_error) / M_LN2; - if(bps >= 0.0) - return bps; - else - return 0.0; - } - else if(lpc_error < 0.0) { /* error should not be negative but can happen due to inadequate floating-point resolution */ - return 1e32; - } - else { - return 0.0; - } -} - -unsigned FLAC__lpc_compute_best_order(const FLAC__double lpc_error[], unsigned max_order, unsigned total_samples, unsigned overhead_bits_per_order) -{ - unsigned order, indx, best_index; /* 'index' the index into lpc_error; index==order-1 since lpc_error[0] is for order==1, lpc_error[1] is for order==2, etc */ - FLAC__double bits, best_bits, error_scale; - - FLAC__ASSERT(max_order > 0); - FLAC__ASSERT(total_samples > 0); - - error_scale = 0.5 * M_LN2 * M_LN2 / (FLAC__double)total_samples; - - best_index = 0; - best_bits = (unsigned)(-1); - - for(indx = 0, order = 1; indx < max_order; indx++, order++) { - bits = FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(lpc_error[indx], error_scale) * (FLAC__double)(total_samples - order) + (FLAC__double)(order * overhead_bits_per_order); - if(bits < best_bits) { - best_index = indx; - best_bits = bits; - } - } - - return best_index+1; /* +1 since indx of lpc_error[] is order-1 */ -} - -#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/lpc_intrin_avx2.c b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/lpc_intrin_avx2.c deleted file mode 100644 index 8eec85e1..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/lpc_intrin_avx2.c +++ /dev/null @@ -1,1120 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 -#endif - -#ifndef FLAC__INTEGER_ONLY_LIBRARY -#ifndef FLAC__NO_ASM -#if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN -#include "private/lpc.h" -#ifdef FLAC__AVX2_SUPPORTED - -#include "FLAC/assert.h" -#include "FLAC/format.h" - -#include /* AVX2 */ - -FLAC__SSE_TARGET("avx2") -void FLAC__lpc_compute_residual_from_qlp_coefficients_16_intrin_avx2(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]) -{ - int i; - FLAC__int32 sum; - __m128i cnt = _mm_cvtsi32_si128(lp_quantization); - - FLAC__ASSERT(order > 0); - FLAC__ASSERT(order <= 32); - - if(order <= 12) { - if(order > 8) { - if(order > 10) { - if(order == 12) { - __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10, q11; - q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]); - q1 = _mm256_set1_epi32(0xffff & qlp_coeff[1 ]); - q2 = _mm256_set1_epi32(0xffff & qlp_coeff[2 ]); - q3 = _mm256_set1_epi32(0xffff & qlp_coeff[3 ]); - q4 = _mm256_set1_epi32(0xffff & qlp_coeff[4 ]); - q5 = _mm256_set1_epi32(0xffff & qlp_coeff[5 ]); - q6 = _mm256_set1_epi32(0xffff & qlp_coeff[6 ]); - q7 = _mm256_set1_epi32(0xffff & qlp_coeff[7 ]); - q8 = _mm256_set1_epi32(0xffff & qlp_coeff[8 ]); - q9 = _mm256_set1_epi32(0xffff & qlp_coeff[9 ]); - q10 = _mm256_set1_epi32(0xffff & qlp_coeff[10]); - q11 = _mm256_set1_epi32(0xffff & qlp_coeff[11]); - - for(i = 0; i < (int)data_len-7; i+=8) { - __m256i summ, mull; - summ = _mm256_madd_epi16(q11, _mm256_loadu_si256((const __m256i*)(data+i-12))); - mull = _mm256_madd_epi16(q10, _mm256_loadu_si256((const __m256i*)(data+i-11))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q9, _mm256_loadu_si256((const __m256i*)(data+i-10))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q8, _mm256_loadu_si256((const __m256i*)(data+i-9 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q7, _mm256_loadu_si256((const __m256i*)(data+i-8 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q6, _mm256_loadu_si256((const __m256i*)(data+i-7 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q5, _mm256_loadu_si256((const __m256i*)(data+i-6 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q4, _mm256_loadu_si256((const __m256i*)(data+i-5 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q3, _mm256_loadu_si256((const __m256i*)(data+i-4 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q2, _mm256_loadu_si256((const __m256i*)(data+i-3 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q1, _mm256_loadu_si256((const __m256i*)(data+i-2 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(data+i-1 ))); summ = _mm256_add_epi32(summ, mull); - summ = _mm256_sra_epi32(summ, cnt); - _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); - } - } - else { /* order == 11 */ - __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10; - q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]); - q1 = _mm256_set1_epi32(0xffff & qlp_coeff[1 ]); - q2 = _mm256_set1_epi32(0xffff & qlp_coeff[2 ]); - q3 = _mm256_set1_epi32(0xffff & qlp_coeff[3 ]); - q4 = _mm256_set1_epi32(0xffff & qlp_coeff[4 ]); - q5 = _mm256_set1_epi32(0xffff & qlp_coeff[5 ]); - q6 = _mm256_set1_epi32(0xffff & qlp_coeff[6 ]); - q7 = _mm256_set1_epi32(0xffff & qlp_coeff[7 ]); - q8 = _mm256_set1_epi32(0xffff & qlp_coeff[8 ]); - q9 = _mm256_set1_epi32(0xffff & qlp_coeff[9 ]); - q10 = _mm256_set1_epi32(0xffff & qlp_coeff[10]); - - for(i = 0; i < (int)data_len-7; i+=8) { - __m256i summ, mull; - summ = _mm256_madd_epi16(q10, _mm256_loadu_si256((const __m256i*)(data+i-11))); - mull = _mm256_madd_epi16(q9, _mm256_loadu_si256((const __m256i*)(data+i-10))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q8, _mm256_loadu_si256((const __m256i*)(data+i-9 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q7, _mm256_loadu_si256((const __m256i*)(data+i-8 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q6, _mm256_loadu_si256((const __m256i*)(data+i-7 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q5, _mm256_loadu_si256((const __m256i*)(data+i-6 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q4, _mm256_loadu_si256((const __m256i*)(data+i-5 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q3, _mm256_loadu_si256((const __m256i*)(data+i-4 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q2, _mm256_loadu_si256((const __m256i*)(data+i-3 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q1, _mm256_loadu_si256((const __m256i*)(data+i-2 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(data+i-1 ))); summ = _mm256_add_epi32(summ, mull); - summ = _mm256_sra_epi32(summ, cnt); - _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); - } - } - } - else { - if(order == 10) { - __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9; - q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]); - q1 = _mm256_set1_epi32(0xffff & qlp_coeff[1 ]); - q2 = _mm256_set1_epi32(0xffff & qlp_coeff[2 ]); - q3 = _mm256_set1_epi32(0xffff & qlp_coeff[3 ]); - q4 = _mm256_set1_epi32(0xffff & qlp_coeff[4 ]); - q5 = _mm256_set1_epi32(0xffff & qlp_coeff[5 ]); - q6 = _mm256_set1_epi32(0xffff & qlp_coeff[6 ]); - q7 = _mm256_set1_epi32(0xffff & qlp_coeff[7 ]); - q8 = _mm256_set1_epi32(0xffff & qlp_coeff[8 ]); - q9 = _mm256_set1_epi32(0xffff & qlp_coeff[9 ]); - - for(i = 0; i < (int)data_len-7; i+=8) { - __m256i summ, mull; - summ = _mm256_madd_epi16(q9, _mm256_loadu_si256((const __m256i*)(data+i-10))); - mull = _mm256_madd_epi16(q8, _mm256_loadu_si256((const __m256i*)(data+i-9 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q7, _mm256_loadu_si256((const __m256i*)(data+i-8 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q6, _mm256_loadu_si256((const __m256i*)(data+i-7 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q5, _mm256_loadu_si256((const __m256i*)(data+i-6 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q4, _mm256_loadu_si256((const __m256i*)(data+i-5 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q3, _mm256_loadu_si256((const __m256i*)(data+i-4 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q2, _mm256_loadu_si256((const __m256i*)(data+i-3 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q1, _mm256_loadu_si256((const __m256i*)(data+i-2 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(data+i-1 ))); summ = _mm256_add_epi32(summ, mull); - summ = _mm256_sra_epi32(summ, cnt); - _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); - } - } - else { /* order == 9 */ - __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8; - q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]); - q1 = _mm256_set1_epi32(0xffff & qlp_coeff[1 ]); - q2 = _mm256_set1_epi32(0xffff & qlp_coeff[2 ]); - q3 = _mm256_set1_epi32(0xffff & qlp_coeff[3 ]); - q4 = _mm256_set1_epi32(0xffff & qlp_coeff[4 ]); - q5 = _mm256_set1_epi32(0xffff & qlp_coeff[5 ]); - q6 = _mm256_set1_epi32(0xffff & qlp_coeff[6 ]); - q7 = _mm256_set1_epi32(0xffff & qlp_coeff[7 ]); - q8 = _mm256_set1_epi32(0xffff & qlp_coeff[8 ]); - - for(i = 0; i < (int)data_len-7; i+=8) { - __m256i summ, mull; - summ = _mm256_madd_epi16(q8, _mm256_loadu_si256((const __m256i*)(data+i-9 ))); - mull = _mm256_madd_epi16(q7, _mm256_loadu_si256((const __m256i*)(data+i-8 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q6, _mm256_loadu_si256((const __m256i*)(data+i-7 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q5, _mm256_loadu_si256((const __m256i*)(data+i-6 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q4, _mm256_loadu_si256((const __m256i*)(data+i-5 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q3, _mm256_loadu_si256((const __m256i*)(data+i-4 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q2, _mm256_loadu_si256((const __m256i*)(data+i-3 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q1, _mm256_loadu_si256((const __m256i*)(data+i-2 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(data+i-1 ))); summ = _mm256_add_epi32(summ, mull); - summ = _mm256_sra_epi32(summ, cnt); - _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); - } - } - } - } - else if(order > 4) { - if(order > 6) { - if(order == 8) { - __m256i q0, q1, q2, q3, q4, q5, q6, q7; - q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]); - q1 = _mm256_set1_epi32(0xffff & qlp_coeff[1 ]); - q2 = _mm256_set1_epi32(0xffff & qlp_coeff[2 ]); - q3 = _mm256_set1_epi32(0xffff & qlp_coeff[3 ]); - q4 = _mm256_set1_epi32(0xffff & qlp_coeff[4 ]); - q5 = _mm256_set1_epi32(0xffff & qlp_coeff[5 ]); - q6 = _mm256_set1_epi32(0xffff & qlp_coeff[6 ]); - q7 = _mm256_set1_epi32(0xffff & qlp_coeff[7 ]); - - for(i = 0; i < (int)data_len-7; i+=8) { - __m256i summ, mull; - summ = _mm256_madd_epi16(q7, _mm256_loadu_si256((const __m256i*)(data+i-8 ))); - mull = _mm256_madd_epi16(q6, _mm256_loadu_si256((const __m256i*)(data+i-7 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q5, _mm256_loadu_si256((const __m256i*)(data+i-6 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q4, _mm256_loadu_si256((const __m256i*)(data+i-5 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q3, _mm256_loadu_si256((const __m256i*)(data+i-4 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q2, _mm256_loadu_si256((const __m256i*)(data+i-3 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q1, _mm256_loadu_si256((const __m256i*)(data+i-2 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(data+i-1 ))); summ = _mm256_add_epi32(summ, mull); - summ = _mm256_sra_epi32(summ, cnt); - _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); - } - } - else { /* order == 7 */ - __m256i q0, q1, q2, q3, q4, q5, q6; - q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]); - q1 = _mm256_set1_epi32(0xffff & qlp_coeff[1 ]); - q2 = _mm256_set1_epi32(0xffff & qlp_coeff[2 ]); - q3 = _mm256_set1_epi32(0xffff & qlp_coeff[3 ]); - q4 = _mm256_set1_epi32(0xffff & qlp_coeff[4 ]); - q5 = _mm256_set1_epi32(0xffff & qlp_coeff[5 ]); - q6 = _mm256_set1_epi32(0xffff & qlp_coeff[6 ]); - - for(i = 0; i < (int)data_len-7; i+=8) { - __m256i summ, mull; - summ = _mm256_madd_epi16(q6, _mm256_loadu_si256((const __m256i*)(data+i-7 ))); - mull = _mm256_madd_epi16(q5, _mm256_loadu_si256((const __m256i*)(data+i-6 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q4, _mm256_loadu_si256((const __m256i*)(data+i-5 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q3, _mm256_loadu_si256((const __m256i*)(data+i-4 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q2, _mm256_loadu_si256((const __m256i*)(data+i-3 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q1, _mm256_loadu_si256((const __m256i*)(data+i-2 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(data+i-1 ))); summ = _mm256_add_epi32(summ, mull); - summ = _mm256_sra_epi32(summ, cnt); - _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); - } - } - } - else { - if(order == 6) { - __m256i q0, q1, q2, q3, q4, q5; - q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]); - q1 = _mm256_set1_epi32(0xffff & qlp_coeff[1 ]); - q2 = _mm256_set1_epi32(0xffff & qlp_coeff[2 ]); - q3 = _mm256_set1_epi32(0xffff & qlp_coeff[3 ]); - q4 = _mm256_set1_epi32(0xffff & qlp_coeff[4 ]); - q5 = _mm256_set1_epi32(0xffff & qlp_coeff[5 ]); - - for(i = 0; i < (int)data_len-7; i+=8) { - __m256i summ, mull; - summ = _mm256_madd_epi16(q5, _mm256_loadu_si256((const __m256i*)(data+i-6 ))); - mull = _mm256_madd_epi16(q4, _mm256_loadu_si256((const __m256i*)(data+i-5 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q3, _mm256_loadu_si256((const __m256i*)(data+i-4 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q2, _mm256_loadu_si256((const __m256i*)(data+i-3 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q1, _mm256_loadu_si256((const __m256i*)(data+i-2 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(data+i-1 ))); summ = _mm256_add_epi32(summ, mull); - summ = _mm256_sra_epi32(summ, cnt); - _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); - } - } - else { /* order == 5 */ - __m256i q0, q1, q2, q3, q4; - q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]); - q1 = _mm256_set1_epi32(0xffff & qlp_coeff[1 ]); - q2 = _mm256_set1_epi32(0xffff & qlp_coeff[2 ]); - q3 = _mm256_set1_epi32(0xffff & qlp_coeff[3 ]); - q4 = _mm256_set1_epi32(0xffff & qlp_coeff[4 ]); - - for(i = 0; i < (int)data_len-7; i+=8) { - __m256i summ, mull; - summ = _mm256_madd_epi16(q4, _mm256_loadu_si256((const __m256i*)(data+i-5 ))); - mull = _mm256_madd_epi16(q3, _mm256_loadu_si256((const __m256i*)(data+i-4 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q2, _mm256_loadu_si256((const __m256i*)(data+i-3 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q1, _mm256_loadu_si256((const __m256i*)(data+i-2 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(data+i-1 ))); summ = _mm256_add_epi32(summ, mull); - summ = _mm256_sra_epi32(summ, cnt); - _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); - } - } - } - } - else { - if(order > 2) { - if(order == 4) { - __m256i q0, q1, q2, q3; - q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]); - q1 = _mm256_set1_epi32(0xffff & qlp_coeff[1 ]); - q2 = _mm256_set1_epi32(0xffff & qlp_coeff[2 ]); - q3 = _mm256_set1_epi32(0xffff & qlp_coeff[3 ]); - - for(i = 0; i < (int)data_len-7; i+=8) { - __m256i summ, mull; - summ = _mm256_madd_epi16(q3, _mm256_loadu_si256((const __m256i*)(data+i-4 ))); - mull = _mm256_madd_epi16(q2, _mm256_loadu_si256((const __m256i*)(data+i-3 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q1, _mm256_loadu_si256((const __m256i*)(data+i-2 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(data+i-1 ))); summ = _mm256_add_epi32(summ, mull); - summ = _mm256_sra_epi32(summ, cnt); - _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); - } - } - else { /* order == 3 */ - __m256i q0, q1, q2; - q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]); - q1 = _mm256_set1_epi32(0xffff & qlp_coeff[1 ]); - q2 = _mm256_set1_epi32(0xffff & qlp_coeff[2 ]); - - for(i = 0; i < (int)data_len-7; i+=8) { - __m256i summ, mull; - summ = _mm256_madd_epi16(q2, _mm256_loadu_si256((const __m256i*)(data+i-3 ))); - mull = _mm256_madd_epi16(q1, _mm256_loadu_si256((const __m256i*)(data+i-2 ))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(data+i-1 ))); summ = _mm256_add_epi32(summ, mull); - summ = _mm256_sra_epi32(summ, cnt); - _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); - } - } - } - else { - if(order == 2) { - __m256i q0, q1; - q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]); - q1 = _mm256_set1_epi32(0xffff & qlp_coeff[1 ]); - - for(i = 0; i < (int)data_len-7; i+=8) { - __m256i summ, mull; - summ = _mm256_madd_epi16(q1, _mm256_loadu_si256((const __m256i*)(data+i-2 ))); - mull = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(data+i-1 ))); summ = _mm256_add_epi32(summ, mull); - summ = _mm256_sra_epi32(summ, cnt); - _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); - } - } - else { /* order == 1 */ - __m256i q0; - q0 = _mm256_set1_epi32(0xffff & qlp_coeff[0 ]); - - for(i = 0; i < (int)data_len-7; i+=8) { - __m256i summ; - summ = _mm256_madd_epi16(q0, _mm256_loadu_si256((const __m256i*)(data+i-1 ))); - summ = _mm256_sra_epi32(summ, cnt); - _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); - } - } - } - } - for(; i < (int)data_len; i++) { - sum = 0; - switch(order) { - case 12: sum += qlp_coeff[11] * data[i-12]; - case 11: sum += qlp_coeff[10] * data[i-11]; - case 10: sum += qlp_coeff[ 9] * data[i-10]; - case 9: sum += qlp_coeff[ 8] * data[i- 9]; - case 8: sum += qlp_coeff[ 7] * data[i- 8]; - case 7: sum += qlp_coeff[ 6] * data[i- 7]; - case 6: sum += qlp_coeff[ 5] * data[i- 6]; - case 5: sum += qlp_coeff[ 4] * data[i- 5]; - case 4: sum += qlp_coeff[ 3] * data[i- 4]; - case 3: sum += qlp_coeff[ 2] * data[i- 3]; - case 2: sum += qlp_coeff[ 1] * data[i- 2]; - case 1: sum += qlp_coeff[ 0] * data[i- 1]; - } - residual[i] = data[i] - (sum >> lp_quantization); - } - } - else { /* order > 12 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - switch(order) { - case 32: sum += qlp_coeff[31] * data[i-32]; - case 31: sum += qlp_coeff[30] * data[i-31]; - case 30: sum += qlp_coeff[29] * data[i-30]; - case 29: sum += qlp_coeff[28] * data[i-29]; - case 28: sum += qlp_coeff[27] * data[i-28]; - case 27: sum += qlp_coeff[26] * data[i-27]; - case 26: sum += qlp_coeff[25] * data[i-26]; - case 25: sum += qlp_coeff[24] * data[i-25]; - case 24: sum += qlp_coeff[23] * data[i-24]; - case 23: sum += qlp_coeff[22] * data[i-23]; - case 22: sum += qlp_coeff[21] * data[i-22]; - case 21: sum += qlp_coeff[20] * data[i-21]; - case 20: sum += qlp_coeff[19] * data[i-20]; - case 19: sum += qlp_coeff[18] * data[i-19]; - case 18: sum += qlp_coeff[17] * data[i-18]; - case 17: sum += qlp_coeff[16] * data[i-17]; - case 16: sum += qlp_coeff[15] * data[i-16]; - case 15: sum += qlp_coeff[14] * data[i-15]; - case 14: sum += qlp_coeff[13] * data[i-14]; - case 13: sum += qlp_coeff[12] * data[i-13]; - sum += qlp_coeff[11] * data[i-12]; - sum += qlp_coeff[10] * data[i-11]; - sum += qlp_coeff[ 9] * data[i-10]; - sum += qlp_coeff[ 8] * data[i- 9]; - sum += qlp_coeff[ 7] * data[i- 8]; - sum += qlp_coeff[ 6] * data[i- 7]; - sum += qlp_coeff[ 5] * data[i- 6]; - sum += qlp_coeff[ 4] * data[i- 5]; - sum += qlp_coeff[ 3] * data[i- 4]; - sum += qlp_coeff[ 2] * data[i- 3]; - sum += qlp_coeff[ 1] * data[i- 2]; - sum += qlp_coeff[ 0] * data[i- 1]; - } - residual[i] = data[i] - (sum >> lp_quantization); - } - } - _mm256_zeroupper(); -} - -FLAC__SSE_TARGET("avx2") -void FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_avx2(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]) -{ - int i; - FLAC__int32 sum; - __m128i cnt = _mm_cvtsi32_si128(lp_quantization); - - FLAC__ASSERT(order > 0); - FLAC__ASSERT(order <= 32); - - if(order <= 12) { - if(order > 8) { - if(order > 10) { - if(order == 12) { - __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10, q11; - q0 = _mm256_set1_epi32(qlp_coeff[0 ]); - q1 = _mm256_set1_epi32(qlp_coeff[1 ]); - q2 = _mm256_set1_epi32(qlp_coeff[2 ]); - q3 = _mm256_set1_epi32(qlp_coeff[3 ]); - q4 = _mm256_set1_epi32(qlp_coeff[4 ]); - q5 = _mm256_set1_epi32(qlp_coeff[5 ]); - q6 = _mm256_set1_epi32(qlp_coeff[6 ]); - q7 = _mm256_set1_epi32(qlp_coeff[7 ]); - q8 = _mm256_set1_epi32(qlp_coeff[8 ]); - q9 = _mm256_set1_epi32(qlp_coeff[9 ]); - q10 = _mm256_set1_epi32(qlp_coeff[10]); - q11 = _mm256_set1_epi32(qlp_coeff[11]); - - for(i = 0; i < (int)data_len-7; i+=8) { - __m256i summ, mull; - summ = _mm256_mullo_epi32(q11, _mm256_loadu_si256((const __m256i*)(data+i-12))); - mull = _mm256_mullo_epi32(q10, _mm256_loadu_si256((const __m256i*)(data+i-11))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q9, _mm256_loadu_si256((const __m256i*)(data+i-10))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q8, _mm256_loadu_si256((const __m256i*)(data+i-9))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q7, _mm256_loadu_si256((const __m256i*)(data+i-8))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q6, _mm256_loadu_si256((const __m256i*)(data+i-7))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q5, _mm256_loadu_si256((const __m256i*)(data+i-6))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q4, _mm256_loadu_si256((const __m256i*)(data+i-5))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q3, _mm256_loadu_si256((const __m256i*)(data+i-4))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q2, _mm256_loadu_si256((const __m256i*)(data+i-3))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q1, _mm256_loadu_si256((const __m256i*)(data+i-2))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(data+i-1))); summ = _mm256_add_epi32(summ, mull); - summ = _mm256_sra_epi32(summ, cnt); - _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); - } - } - else { /* order == 11 */ - __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10; - q0 = _mm256_set1_epi32(qlp_coeff[0 ]); - q1 = _mm256_set1_epi32(qlp_coeff[1 ]); - q2 = _mm256_set1_epi32(qlp_coeff[2 ]); - q3 = _mm256_set1_epi32(qlp_coeff[3 ]); - q4 = _mm256_set1_epi32(qlp_coeff[4 ]); - q5 = _mm256_set1_epi32(qlp_coeff[5 ]); - q6 = _mm256_set1_epi32(qlp_coeff[6 ]); - q7 = _mm256_set1_epi32(qlp_coeff[7 ]); - q8 = _mm256_set1_epi32(qlp_coeff[8 ]); - q9 = _mm256_set1_epi32(qlp_coeff[9 ]); - q10 = _mm256_set1_epi32(qlp_coeff[10]); - - for(i = 0; i < (int)data_len-7; i+=8) { - __m256i summ, mull; - summ = _mm256_mullo_epi32(q10, _mm256_loadu_si256((const __m256i*)(data+i-11))); - mull = _mm256_mullo_epi32(q9, _mm256_loadu_si256((const __m256i*)(data+i-10))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q8, _mm256_loadu_si256((const __m256i*)(data+i-9))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q7, _mm256_loadu_si256((const __m256i*)(data+i-8))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q6, _mm256_loadu_si256((const __m256i*)(data+i-7))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q5, _mm256_loadu_si256((const __m256i*)(data+i-6))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q4, _mm256_loadu_si256((const __m256i*)(data+i-5))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q3, _mm256_loadu_si256((const __m256i*)(data+i-4))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q2, _mm256_loadu_si256((const __m256i*)(data+i-3))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q1, _mm256_loadu_si256((const __m256i*)(data+i-2))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(data+i-1))); summ = _mm256_add_epi32(summ, mull); - summ = _mm256_sra_epi32(summ, cnt); - _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); - } - } - } - else { - if(order == 10) { - __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9; - q0 = _mm256_set1_epi32(qlp_coeff[0 ]); - q1 = _mm256_set1_epi32(qlp_coeff[1 ]); - q2 = _mm256_set1_epi32(qlp_coeff[2 ]); - q3 = _mm256_set1_epi32(qlp_coeff[3 ]); - q4 = _mm256_set1_epi32(qlp_coeff[4 ]); - q5 = _mm256_set1_epi32(qlp_coeff[5 ]); - q6 = _mm256_set1_epi32(qlp_coeff[6 ]); - q7 = _mm256_set1_epi32(qlp_coeff[7 ]); - q8 = _mm256_set1_epi32(qlp_coeff[8 ]); - q9 = _mm256_set1_epi32(qlp_coeff[9 ]); - - for(i = 0; i < (int)data_len-7; i+=8) { - __m256i summ, mull; - summ = _mm256_mullo_epi32(q9, _mm256_loadu_si256((const __m256i*)(data+i-10))); - mull = _mm256_mullo_epi32(q8, _mm256_loadu_si256((const __m256i*)(data+i-9))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q7, _mm256_loadu_si256((const __m256i*)(data+i-8))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q6, _mm256_loadu_si256((const __m256i*)(data+i-7))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q5, _mm256_loadu_si256((const __m256i*)(data+i-6))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q4, _mm256_loadu_si256((const __m256i*)(data+i-5))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q3, _mm256_loadu_si256((const __m256i*)(data+i-4))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q2, _mm256_loadu_si256((const __m256i*)(data+i-3))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q1, _mm256_loadu_si256((const __m256i*)(data+i-2))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(data+i-1))); summ = _mm256_add_epi32(summ, mull); - summ = _mm256_sra_epi32(summ, cnt); - _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); - } - } - else { /* order == 9 */ - __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8; - q0 = _mm256_set1_epi32(qlp_coeff[0 ]); - q1 = _mm256_set1_epi32(qlp_coeff[1 ]); - q2 = _mm256_set1_epi32(qlp_coeff[2 ]); - q3 = _mm256_set1_epi32(qlp_coeff[3 ]); - q4 = _mm256_set1_epi32(qlp_coeff[4 ]); - q5 = _mm256_set1_epi32(qlp_coeff[5 ]); - q6 = _mm256_set1_epi32(qlp_coeff[6 ]); - q7 = _mm256_set1_epi32(qlp_coeff[7 ]); - q8 = _mm256_set1_epi32(qlp_coeff[8 ]); - - for(i = 0; i < (int)data_len-7; i+=8) { - __m256i summ, mull; - summ = _mm256_mullo_epi32(q8, _mm256_loadu_si256((const __m256i*)(data+i-9))); - mull = _mm256_mullo_epi32(q7, _mm256_loadu_si256((const __m256i*)(data+i-8))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q6, _mm256_loadu_si256((const __m256i*)(data+i-7))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q5, _mm256_loadu_si256((const __m256i*)(data+i-6))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q4, _mm256_loadu_si256((const __m256i*)(data+i-5))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q3, _mm256_loadu_si256((const __m256i*)(data+i-4))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q2, _mm256_loadu_si256((const __m256i*)(data+i-3))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q1, _mm256_loadu_si256((const __m256i*)(data+i-2))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(data+i-1))); summ = _mm256_add_epi32(summ, mull); - summ = _mm256_sra_epi32(summ, cnt); - _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); - } - } - } - } - else if(order > 4) { - if(order > 6) { - if(order == 8) { - __m256i q0, q1, q2, q3, q4, q5, q6, q7; - q0 = _mm256_set1_epi32(qlp_coeff[0 ]); - q1 = _mm256_set1_epi32(qlp_coeff[1 ]); - q2 = _mm256_set1_epi32(qlp_coeff[2 ]); - q3 = _mm256_set1_epi32(qlp_coeff[3 ]); - q4 = _mm256_set1_epi32(qlp_coeff[4 ]); - q5 = _mm256_set1_epi32(qlp_coeff[5 ]); - q6 = _mm256_set1_epi32(qlp_coeff[6 ]); - q7 = _mm256_set1_epi32(qlp_coeff[7 ]); - - for(i = 0; i < (int)data_len-7; i+=8) { - __m256i summ, mull; - summ = _mm256_mullo_epi32(q7, _mm256_loadu_si256((const __m256i*)(data+i-8))); - mull = _mm256_mullo_epi32(q6, _mm256_loadu_si256((const __m256i*)(data+i-7))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q5, _mm256_loadu_si256((const __m256i*)(data+i-6))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q4, _mm256_loadu_si256((const __m256i*)(data+i-5))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q3, _mm256_loadu_si256((const __m256i*)(data+i-4))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q2, _mm256_loadu_si256((const __m256i*)(data+i-3))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q1, _mm256_loadu_si256((const __m256i*)(data+i-2))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(data+i-1))); summ = _mm256_add_epi32(summ, mull); - summ = _mm256_sra_epi32(summ, cnt); - _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); - } - } - else { /* order == 7 */ - __m256i q0, q1, q2, q3, q4, q5, q6; - q0 = _mm256_set1_epi32(qlp_coeff[0 ]); - q1 = _mm256_set1_epi32(qlp_coeff[1 ]); - q2 = _mm256_set1_epi32(qlp_coeff[2 ]); - q3 = _mm256_set1_epi32(qlp_coeff[3 ]); - q4 = _mm256_set1_epi32(qlp_coeff[4 ]); - q5 = _mm256_set1_epi32(qlp_coeff[5 ]); - q6 = _mm256_set1_epi32(qlp_coeff[6 ]); - - for(i = 0; i < (int)data_len-7; i+=8) { - __m256i summ, mull; - summ = _mm256_mullo_epi32(q6, _mm256_loadu_si256((const __m256i*)(data+i-7))); - mull = _mm256_mullo_epi32(q5, _mm256_loadu_si256((const __m256i*)(data+i-6))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q4, _mm256_loadu_si256((const __m256i*)(data+i-5))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q3, _mm256_loadu_si256((const __m256i*)(data+i-4))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q2, _mm256_loadu_si256((const __m256i*)(data+i-3))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q1, _mm256_loadu_si256((const __m256i*)(data+i-2))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(data+i-1))); summ = _mm256_add_epi32(summ, mull); - summ = _mm256_sra_epi32(summ, cnt); - _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); - } - } - } - else { - if(order == 6) { - __m256i q0, q1, q2, q3, q4, q5; - q0 = _mm256_set1_epi32(qlp_coeff[0 ]); - q1 = _mm256_set1_epi32(qlp_coeff[1 ]); - q2 = _mm256_set1_epi32(qlp_coeff[2 ]); - q3 = _mm256_set1_epi32(qlp_coeff[3 ]); - q4 = _mm256_set1_epi32(qlp_coeff[4 ]); - q5 = _mm256_set1_epi32(qlp_coeff[5 ]); - - for(i = 0; i < (int)data_len-7; i+=8) { - __m256i summ, mull; - summ = _mm256_mullo_epi32(q5, _mm256_loadu_si256((const __m256i*)(data+i-6))); - mull = _mm256_mullo_epi32(q4, _mm256_loadu_si256((const __m256i*)(data+i-5))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q3, _mm256_loadu_si256((const __m256i*)(data+i-4))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q2, _mm256_loadu_si256((const __m256i*)(data+i-3))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q1, _mm256_loadu_si256((const __m256i*)(data+i-2))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(data+i-1))); summ = _mm256_add_epi32(summ, mull); - summ = _mm256_sra_epi32(summ, cnt); - _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); - } - } - else { /* order == 5 */ - __m256i q0, q1, q2, q3, q4; - q0 = _mm256_set1_epi32(qlp_coeff[0 ]); - q1 = _mm256_set1_epi32(qlp_coeff[1 ]); - q2 = _mm256_set1_epi32(qlp_coeff[2 ]); - q3 = _mm256_set1_epi32(qlp_coeff[3 ]); - q4 = _mm256_set1_epi32(qlp_coeff[4 ]); - - for(i = 0; i < (int)data_len-7; i+=8) { - __m256i summ, mull; - summ = _mm256_mullo_epi32(q4, _mm256_loadu_si256((const __m256i*)(data+i-5))); - mull = _mm256_mullo_epi32(q3, _mm256_loadu_si256((const __m256i*)(data+i-4))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q2, _mm256_loadu_si256((const __m256i*)(data+i-3))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q1, _mm256_loadu_si256((const __m256i*)(data+i-2))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(data+i-1))); summ = _mm256_add_epi32(summ, mull); - summ = _mm256_sra_epi32(summ, cnt); - _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); - } - } - } - } - else { - if(order > 2) { - if(order == 4) { - __m256i q0, q1, q2, q3; - q0 = _mm256_set1_epi32(qlp_coeff[0 ]); - q1 = _mm256_set1_epi32(qlp_coeff[1 ]); - q2 = _mm256_set1_epi32(qlp_coeff[2 ]); - q3 = _mm256_set1_epi32(qlp_coeff[3 ]); - - for(i = 0; i < (int)data_len-7; i+=8) { - __m256i summ, mull; - summ = _mm256_mullo_epi32(q3, _mm256_loadu_si256((const __m256i*)(data+i-4))); - mull = _mm256_mullo_epi32(q2, _mm256_loadu_si256((const __m256i*)(data+i-3))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q1, _mm256_loadu_si256((const __m256i*)(data+i-2))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(data+i-1))); summ = _mm256_add_epi32(summ, mull); - summ = _mm256_sra_epi32(summ, cnt); - _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); - } - } - else { /* order == 3 */ - __m256i q0, q1, q2; - q0 = _mm256_set1_epi32(qlp_coeff[0 ]); - q1 = _mm256_set1_epi32(qlp_coeff[1 ]); - q2 = _mm256_set1_epi32(qlp_coeff[2 ]); - - for(i = 0; i < (int)data_len-7; i+=8) { - __m256i summ, mull; - summ = _mm256_mullo_epi32(q2, _mm256_loadu_si256((const __m256i*)(data+i-3))); - mull = _mm256_mullo_epi32(q1, _mm256_loadu_si256((const __m256i*)(data+i-2))); summ = _mm256_add_epi32(summ, mull); - mull = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(data+i-1))); summ = _mm256_add_epi32(summ, mull); - summ = _mm256_sra_epi32(summ, cnt); - _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); - } - } - } - else { - if(order == 2) { - __m256i q0, q1; - q0 = _mm256_set1_epi32(qlp_coeff[0 ]); - q1 = _mm256_set1_epi32(qlp_coeff[1 ]); - - for(i = 0; i < (int)data_len-7; i+=8) { - __m256i summ, mull; - summ = _mm256_mullo_epi32(q1, _mm256_loadu_si256((const __m256i*)(data+i-2))); - mull = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(data+i-1))); summ = _mm256_add_epi32(summ, mull); - summ = _mm256_sra_epi32(summ, cnt); - _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); - } - } - else { /* order == 1 */ - __m256i q0; - q0 = _mm256_set1_epi32(qlp_coeff[0 ]); - - for(i = 0; i < (int)data_len-7; i+=8) { - __m256i summ; - summ = _mm256_mullo_epi32(q0, _mm256_loadu_si256((const __m256i*)(data+i-1))); - summ = _mm256_sra_epi32(summ, cnt); - _mm256_storeu_si256((__m256i*)(residual+i), _mm256_sub_epi32(_mm256_loadu_si256((const __m256i*)(data+i)), summ)); - } - } - } - } - for(; i < (int)data_len; i++) { - sum = 0; - switch(order) { - case 12: sum += qlp_coeff[11] * data[i-12]; - case 11: sum += qlp_coeff[10] * data[i-11]; - case 10: sum += qlp_coeff[ 9] * data[i-10]; - case 9: sum += qlp_coeff[ 8] * data[i- 9]; - case 8: sum += qlp_coeff[ 7] * data[i- 8]; - case 7: sum += qlp_coeff[ 6] * data[i- 7]; - case 6: sum += qlp_coeff[ 5] * data[i- 6]; - case 5: sum += qlp_coeff[ 4] * data[i- 5]; - case 4: sum += qlp_coeff[ 3] * data[i- 4]; - case 3: sum += qlp_coeff[ 2] * data[i- 3]; - case 2: sum += qlp_coeff[ 1] * data[i- 2]; - case 1: sum += qlp_coeff[ 0] * data[i- 1]; - } - residual[i] = data[i] - (sum >> lp_quantization); - } - } - else { /* order > 12 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - switch(order) { - case 32: sum += qlp_coeff[31] * data[i-32]; - case 31: sum += qlp_coeff[30] * data[i-31]; - case 30: sum += qlp_coeff[29] * data[i-30]; - case 29: sum += qlp_coeff[28] * data[i-29]; - case 28: sum += qlp_coeff[27] * data[i-28]; - case 27: sum += qlp_coeff[26] * data[i-27]; - case 26: sum += qlp_coeff[25] * data[i-26]; - case 25: sum += qlp_coeff[24] * data[i-25]; - case 24: sum += qlp_coeff[23] * data[i-24]; - case 23: sum += qlp_coeff[22] * data[i-23]; - case 22: sum += qlp_coeff[21] * data[i-22]; - case 21: sum += qlp_coeff[20] * data[i-21]; - case 20: sum += qlp_coeff[19] * data[i-20]; - case 19: sum += qlp_coeff[18] * data[i-19]; - case 18: sum += qlp_coeff[17] * data[i-18]; - case 17: sum += qlp_coeff[16] * data[i-17]; - case 16: sum += qlp_coeff[15] * data[i-16]; - case 15: sum += qlp_coeff[14] * data[i-15]; - case 14: sum += qlp_coeff[13] * data[i-14]; - case 13: sum += qlp_coeff[12] * data[i-13]; - sum += qlp_coeff[11] * data[i-12]; - sum += qlp_coeff[10] * data[i-11]; - sum += qlp_coeff[ 9] * data[i-10]; - sum += qlp_coeff[ 8] * data[i- 9]; - sum += qlp_coeff[ 7] * data[i- 8]; - sum += qlp_coeff[ 6] * data[i- 7]; - sum += qlp_coeff[ 5] * data[i- 6]; - sum += qlp_coeff[ 4] * data[i- 5]; - sum += qlp_coeff[ 3] * data[i- 4]; - sum += qlp_coeff[ 2] * data[i- 3]; - sum += qlp_coeff[ 1] * data[i- 2]; - sum += qlp_coeff[ 0] * data[i- 1]; - } - residual[i] = data[i] - (sum >> lp_quantization); - } - } - _mm256_zeroupper(); -} - -static FLAC__int32 pack_arr[8] = { 0, 2, 4, 6, 1, 3, 5, 7 }; - -FLAC__SSE_TARGET("avx2") -void FLAC__lpc_compute_residual_from_qlp_coefficients_wide_intrin_avx2(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]) -{ - int i; - FLAC__int64 sum; - __m128i cnt = _mm_cvtsi32_si128(lp_quantization); - __m256i pack = _mm256_loadu_si256((const __m256i *)pack_arr); - - FLAC__ASSERT(order > 0); - FLAC__ASSERT(order <= 32); - FLAC__ASSERT(lp_quantization <= 32); /* there's no _mm256_sra_epi64() so we have to use _mm256_srl_epi64() */ - - if(order <= 12) { - if(order > 8) { - if(order > 10) { - if(order == 12) { - __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10, q11; - q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ])); - q1 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[1 ])); - q2 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[2 ])); - q3 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[3 ])); - q4 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[4 ])); - q5 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[5 ])); - q6 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[6 ])); - q7 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[7 ])); - q8 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[8 ])); - q9 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[9 ])); - q10 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[10])); - q11 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[11])); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m256i summ, mull; - summ = _mm256_mul_epi32(q11, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-12)))); - mull = _mm256_mul_epi32(q10, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-11)))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q9, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-10)))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q8, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-9 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q7, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-8 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q6, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-7 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q5, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-6 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q4, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-5 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q3, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-4 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q2, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-3 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q1, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-2 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-1 )))); summ = _mm256_add_epi64(summ, mull); - summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), _mm256_castsi256_si128(summ))); - } - } - else { /* order == 11 */ - __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10; - q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ])); - q1 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[1 ])); - q2 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[2 ])); - q3 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[3 ])); - q4 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[4 ])); - q5 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[5 ])); - q6 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[6 ])); - q7 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[7 ])); - q8 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[8 ])); - q9 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[9 ])); - q10 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[10])); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m256i summ, mull; - summ = _mm256_mul_epi32(q10, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-11)))); - mull = _mm256_mul_epi32(q9, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-10)))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q8, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-9 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q7, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-8 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q6, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-7 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q5, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-6 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q4, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-5 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q3, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-4 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q2, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-3 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q1, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-2 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-1 )))); summ = _mm256_add_epi64(summ, mull); - summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), _mm256_castsi256_si128(summ))); - } - } - } - else { - if(order == 10) { - __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9; - q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ])); - q1 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[1 ])); - q2 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[2 ])); - q3 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[3 ])); - q4 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[4 ])); - q5 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[5 ])); - q6 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[6 ])); - q7 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[7 ])); - q8 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[8 ])); - q9 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[9 ])); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m256i summ, mull; - summ = _mm256_mul_epi32(q9, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-10)))); - mull = _mm256_mul_epi32(q8, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-9 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q7, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-8 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q6, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-7 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q5, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-6 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q4, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-5 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q3, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-4 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q2, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-3 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q1, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-2 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-1 )))); summ = _mm256_add_epi64(summ, mull); - summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), _mm256_castsi256_si128(summ))); - } - } - else { /* order == 9 */ - __m256i q0, q1, q2, q3, q4, q5, q6, q7, q8; - q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ])); - q1 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[1 ])); - q2 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[2 ])); - q3 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[3 ])); - q4 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[4 ])); - q5 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[5 ])); - q6 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[6 ])); - q7 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[7 ])); - q8 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[8 ])); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m256i summ, mull; - summ = _mm256_mul_epi32(q8, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-9 )))); - mull = _mm256_mul_epi32(q7, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-8 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q6, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-7 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q5, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-6 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q4, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-5 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q3, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-4 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q2, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-3 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q1, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-2 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-1 )))); summ = _mm256_add_epi64(summ, mull); - summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), _mm256_castsi256_si128(summ))); - } - } - } - } - else if(order > 4) { - if(order > 6) { - if(order == 8) { - __m256i q0, q1, q2, q3, q4, q5, q6, q7; - q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ])); - q1 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[1 ])); - q2 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[2 ])); - q3 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[3 ])); - q4 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[4 ])); - q5 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[5 ])); - q6 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[6 ])); - q7 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[7 ])); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m256i summ, mull; - summ = _mm256_mul_epi32(q7, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-8 )))); - mull = _mm256_mul_epi32(q6, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-7 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q5, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-6 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q4, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-5 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q3, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-4 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q2, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-3 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q1, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-2 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-1 )))); summ = _mm256_add_epi64(summ, mull); - summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), _mm256_castsi256_si128(summ))); - } - } - else { /* order == 7 */ - __m256i q0, q1, q2, q3, q4, q5, q6; - q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ])); - q1 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[1 ])); - q2 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[2 ])); - q3 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[3 ])); - q4 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[4 ])); - q5 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[5 ])); - q6 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[6 ])); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m256i summ, mull; - summ = _mm256_mul_epi32(q6, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-7 )))); - mull = _mm256_mul_epi32(q5, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-6 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q4, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-5 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q3, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-4 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q2, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-3 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q1, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-2 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-1 )))); summ = _mm256_add_epi64(summ, mull); - summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), _mm256_castsi256_si128(summ))); - } - } - } - else { - if(order == 6) { - __m256i q0, q1, q2, q3, q4, q5; - q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ])); - q1 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[1 ])); - q2 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[2 ])); - q3 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[3 ])); - q4 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[4 ])); - q5 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[5 ])); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m256i summ, mull; - summ = _mm256_mul_epi32(q5, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-6 )))); - mull = _mm256_mul_epi32(q4, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-5 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q3, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-4 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q2, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-3 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q1, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-2 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-1 )))); summ = _mm256_add_epi64(summ, mull); - summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), _mm256_castsi256_si128(summ))); - } - } - else { /* order == 5 */ - __m256i q0, q1, q2, q3, q4; - q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ])); - q1 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[1 ])); - q2 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[2 ])); - q3 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[3 ])); - q4 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[4 ])); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m256i summ, mull; - summ = _mm256_mul_epi32(q4, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-5 )))); - mull = _mm256_mul_epi32(q3, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-4 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q2, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-3 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q1, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-2 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-1 )))); summ = _mm256_add_epi64(summ, mull); - summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), _mm256_castsi256_si128(summ))); - } - } - } - } - else { - if(order > 2) { - if(order == 4) { - __m256i q0, q1, q2, q3; - q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ])); - q1 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[1 ])); - q2 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[2 ])); - q3 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[3 ])); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m256i summ, mull; - summ = _mm256_mul_epi32(q3, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-4 )))); - mull = _mm256_mul_epi32(q2, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-3 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q1, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-2 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-1 )))); summ = _mm256_add_epi64(summ, mull); - summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), _mm256_castsi256_si128(summ))); - } - } - else { /* order == 3 */ - __m256i q0, q1, q2; - q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ])); - q1 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[1 ])); - q2 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[2 ])); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m256i summ, mull; - summ = _mm256_mul_epi32(q2, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-3 )))); - mull = _mm256_mul_epi32(q1, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-2 )))); summ = _mm256_add_epi64(summ, mull); - mull = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-1 )))); summ = _mm256_add_epi64(summ, mull); - summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), _mm256_castsi256_si128(summ))); - } - } - } - else { - if(order == 2) { - __m256i q0, q1; - q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ])); - q1 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[1 ])); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m256i summ, mull; - summ = _mm256_mul_epi32(q1, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-2 )))); - mull = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-1 )))); summ = _mm256_add_epi64(summ, mull); - summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), _mm256_castsi256_si128(summ))); - } - } - else { /* order == 1 */ - __m256i q0; - q0 = _mm256_cvtepu32_epi64(_mm_set1_epi32(qlp_coeff[0 ])); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m256i summ; - summ = _mm256_mul_epi32(q0, _mm256_cvtepu32_epi64(_mm_loadu_si128((const __m128i*)(data+i-1 )))); - summ = _mm256_permutevar8x32_epi32(_mm256_srl_epi64(summ, cnt), pack); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), _mm256_castsi256_si128(summ))); - } - } - } - } - for(; i < (int)data_len; i++) { - sum = 0; - switch(order) { - case 12: sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; - case 11: sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; - case 10: sum += qlp_coeff[ 9] * (FLAC__int64)data[i-10]; - case 9: sum += qlp_coeff[ 8] * (FLAC__int64)data[i- 9]; - case 8: sum += qlp_coeff[ 7] * (FLAC__int64)data[i- 8]; - case 7: sum += qlp_coeff[ 6] * (FLAC__int64)data[i- 7]; - case 6: sum += qlp_coeff[ 5] * (FLAC__int64)data[i- 6]; - case 5: sum += qlp_coeff[ 4] * (FLAC__int64)data[i- 5]; - case 4: sum += qlp_coeff[ 3] * (FLAC__int64)data[i- 4]; - case 3: sum += qlp_coeff[ 2] * (FLAC__int64)data[i- 3]; - case 2: sum += qlp_coeff[ 1] * (FLAC__int64)data[i- 2]; - case 1: sum += qlp_coeff[ 0] * (FLAC__int64)data[i- 1]; - } - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - else { /* order > 12 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - switch(order) { - case 32: sum += qlp_coeff[31] * (FLAC__int64)data[i-32]; - case 31: sum += qlp_coeff[30] * (FLAC__int64)data[i-31]; - case 30: sum += qlp_coeff[29] * (FLAC__int64)data[i-30]; - case 29: sum += qlp_coeff[28] * (FLAC__int64)data[i-29]; - case 28: sum += qlp_coeff[27] * (FLAC__int64)data[i-28]; - case 27: sum += qlp_coeff[26] * (FLAC__int64)data[i-27]; - case 26: sum += qlp_coeff[25] * (FLAC__int64)data[i-26]; - case 25: sum += qlp_coeff[24] * (FLAC__int64)data[i-25]; - case 24: sum += qlp_coeff[23] * (FLAC__int64)data[i-24]; - case 23: sum += qlp_coeff[22] * (FLAC__int64)data[i-23]; - case 22: sum += qlp_coeff[21] * (FLAC__int64)data[i-22]; - case 21: sum += qlp_coeff[20] * (FLAC__int64)data[i-21]; - case 20: sum += qlp_coeff[19] * (FLAC__int64)data[i-20]; - case 19: sum += qlp_coeff[18] * (FLAC__int64)data[i-19]; - case 18: sum += qlp_coeff[17] * (FLAC__int64)data[i-18]; - case 17: sum += qlp_coeff[16] * (FLAC__int64)data[i-17]; - case 16: sum += qlp_coeff[15] * (FLAC__int64)data[i-16]; - case 15: sum += qlp_coeff[14] * (FLAC__int64)data[i-15]; - case 14: sum += qlp_coeff[13] * (FLAC__int64)data[i-14]; - case 13: sum += qlp_coeff[12] * (FLAC__int64)data[i-13]; - sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; - sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; - sum += qlp_coeff[ 9] * (FLAC__int64)data[i-10]; - sum += qlp_coeff[ 8] * (FLAC__int64)data[i- 9]; - sum += qlp_coeff[ 7] * (FLAC__int64)data[i- 8]; - sum += qlp_coeff[ 6] * (FLAC__int64)data[i- 7]; - sum += qlp_coeff[ 5] * (FLAC__int64)data[i- 6]; - sum += qlp_coeff[ 4] * (FLAC__int64)data[i- 5]; - sum += qlp_coeff[ 3] * (FLAC__int64)data[i- 4]; - sum += qlp_coeff[ 2] * (FLAC__int64)data[i- 3]; - sum += qlp_coeff[ 1] * (FLAC__int64)data[i- 2]; - sum += qlp_coeff[ 0] * (FLAC__int64)data[i- 1]; - } - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - _mm256_zeroupper(); -} - -#endif /* FLAC__AVX2_SUPPORTED */ -#endif /* (FLAC__CPU_IA32 || FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN */ -#endif /* FLAC__NO_ASM */ -#endif /* FLAC__INTEGER_ONLY_LIBRARY */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/lpc_intrin_sse.c b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/lpc_intrin_sse.c deleted file mode 100644 index 81bf586e..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/lpc_intrin_sse.c +++ /dev/null @@ -1,451 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 -#endif - -#ifndef FLAC__INTEGER_ONLY_LIBRARY -#ifndef FLAC__NO_ASM -#if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN -#include "private/lpc.h" -#ifdef FLAC__SSE_SUPPORTED - -#include "FLAC/assert.h" -#include "FLAC/format.h" - -#include /* SSE */ - -#if 1 -/* Faster on current Intel (starting from Core i aka Nehalem) and all AMD CPUs */ - -FLAC__SSE_TARGET("sse") -void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_4(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]) -{ - int i; - int limit = data_len - 4; - __m128 sum0; - - (void) lag; - FLAC__ASSERT(lag <= 4); - FLAC__ASSERT(lag <= data_len); - - sum0 = _mm_setzero_ps(); - - for(i = 0; i <= limit; i++) { - __m128 d, d0; - d0 = _mm_loadu_ps(data+i); - d = d0; d = _mm_shuffle_ps(d, d, 0); - sum0 = _mm_add_ps(sum0, _mm_mul_ps(d0, d)); - } - - { - __m128 d0 = _mm_setzero_ps(); - limit++; if(limit < 0) limit = 0; - - for(i = data_len-1; i >= limit; i--) { - __m128 d; - d = _mm_load_ss(data+i); d = _mm_shuffle_ps(d, d, 0); - d0 = _mm_shuffle_ps(d0, d0, _MM_SHUFFLE(2,1,0,3)); - d0 = _mm_move_ss(d0, d); - sum0 = _mm_add_ps(sum0, _mm_mul_ps(d, d0)); - } - } - - _mm_storeu_ps(autoc, sum0); -} - -FLAC__SSE_TARGET("sse") -void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_8(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]) -{ - int i; - int limit = data_len - 8; - __m128 sum0, sum1; - - (void) lag; - FLAC__ASSERT(lag <= 8); - FLAC__ASSERT(lag <= data_len); - - sum0 = _mm_setzero_ps(); - sum1 = _mm_setzero_ps(); - - for(i = 0; i <= limit; i++) { - __m128 d, d0, d1; - d0 = _mm_loadu_ps(data+i); - d1 = _mm_loadu_ps(data+i+4); - d = d0; d = _mm_shuffle_ps(d, d, 0); - sum0 = _mm_add_ps(sum0, _mm_mul_ps(d0, d)); - sum1 = _mm_add_ps(sum1, _mm_mul_ps(d1, d)); - } - - { - __m128 d0 = _mm_setzero_ps(); - __m128 d1 = _mm_setzero_ps(); - limit++; if(limit < 0) limit = 0; - - for(i = data_len-1; i >= limit; i--) { - __m128 d; - d = _mm_load_ss(data+i); d = _mm_shuffle_ps(d, d, 0); - d1 = _mm_shuffle_ps(d1, d1, _MM_SHUFFLE(2,1,0,3)); - d0 = _mm_shuffle_ps(d0, d0, _MM_SHUFFLE(2,1,0,3)); - d1 = _mm_move_ss(d1, d0); - d0 = _mm_move_ss(d0, d); - sum1 = _mm_add_ps(sum1, _mm_mul_ps(d, d1)); - sum0 = _mm_add_ps(sum0, _mm_mul_ps(d, d0)); - } - } - - _mm_storeu_ps(autoc, sum0); - _mm_storeu_ps(autoc+4, sum1); -} - -FLAC__SSE_TARGET("sse") -void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_12(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]) -{ - int i; - int limit = data_len - 12; - __m128 sum0, sum1, sum2; - - (void) lag; - FLAC__ASSERT(lag <= 12); - FLAC__ASSERT(lag <= data_len); - - sum0 = _mm_setzero_ps(); - sum1 = _mm_setzero_ps(); - sum2 = _mm_setzero_ps(); - - for(i = 0; i <= limit; i++) { - __m128 d, d0, d1, d2; - d0 = _mm_loadu_ps(data+i); - d1 = _mm_loadu_ps(data+i+4); - d2 = _mm_loadu_ps(data+i+8); - d = d0; d = _mm_shuffle_ps(d, d, 0); - sum0 = _mm_add_ps(sum0, _mm_mul_ps(d0, d)); - sum1 = _mm_add_ps(sum1, _mm_mul_ps(d1, d)); - sum2 = _mm_add_ps(sum2, _mm_mul_ps(d2, d)); - } - - { - __m128 d0 = _mm_setzero_ps(); - __m128 d1 = _mm_setzero_ps(); - __m128 d2 = _mm_setzero_ps(); - limit++; if(limit < 0) limit = 0; - - for(i = data_len-1; i >= limit; i--) { - __m128 d; - d = _mm_load_ss(data+i); d = _mm_shuffle_ps(d, d, 0); - d2 = _mm_shuffle_ps(d2, d2, _MM_SHUFFLE(2,1,0,3)); - d1 = _mm_shuffle_ps(d1, d1, _MM_SHUFFLE(2,1,0,3)); - d0 = _mm_shuffle_ps(d0, d0, _MM_SHUFFLE(2,1,0,3)); - d2 = _mm_move_ss(d2, d1); - d1 = _mm_move_ss(d1, d0); - d0 = _mm_move_ss(d0, d); - sum2 = _mm_add_ps(sum2, _mm_mul_ps(d, d2)); - sum1 = _mm_add_ps(sum1, _mm_mul_ps(d, d1)); - sum0 = _mm_add_ps(sum0, _mm_mul_ps(d, d0)); - } - } - - _mm_storeu_ps(autoc, sum0); - _mm_storeu_ps(autoc+4, sum1); - _mm_storeu_ps(autoc+8, sum2); -} - -FLAC__SSE_TARGET("sse") -void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_16(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]) -{ - int i; - int limit = data_len - 16; - __m128 sum0, sum1, sum2, sum3; - - (void) lag; - FLAC__ASSERT(lag <= 16); - FLAC__ASSERT(lag <= data_len); - - sum0 = _mm_setzero_ps(); - sum1 = _mm_setzero_ps(); - sum2 = _mm_setzero_ps(); - sum3 = _mm_setzero_ps(); - - for(i = 0; i <= limit; i++) { - __m128 d, d0, d1, d2, d3; - d0 = _mm_loadu_ps(data+i); - d1 = _mm_loadu_ps(data+i+4); - d2 = _mm_loadu_ps(data+i+8); - d3 = _mm_loadu_ps(data+i+12); - d = d0; d = _mm_shuffle_ps(d, d, 0); - sum0 = _mm_add_ps(sum0, _mm_mul_ps(d0, d)); - sum1 = _mm_add_ps(sum1, _mm_mul_ps(d1, d)); - sum2 = _mm_add_ps(sum2, _mm_mul_ps(d2, d)); - sum3 = _mm_add_ps(sum3, _mm_mul_ps(d3, d)); - } - - { - __m128 d0 = _mm_setzero_ps(); - __m128 d1 = _mm_setzero_ps(); - __m128 d2 = _mm_setzero_ps(); - __m128 d3 = _mm_setzero_ps(); - limit++; if(limit < 0) limit = 0; - - for(i = data_len-1; i >= limit; i--) { - __m128 d; - d = _mm_load_ss(data+i); d = _mm_shuffle_ps(d, d, 0); - d3 = _mm_shuffle_ps(d3, d3, _MM_SHUFFLE(2,1,0,3)); - d2 = _mm_shuffle_ps(d2, d2, _MM_SHUFFLE(2,1,0,3)); - d1 = _mm_shuffle_ps(d1, d1, _MM_SHUFFLE(2,1,0,3)); - d0 = _mm_shuffle_ps(d0, d0, _MM_SHUFFLE(2,1,0,3)); - d3 = _mm_move_ss(d3, d2); - d2 = _mm_move_ss(d2, d1); - d1 = _mm_move_ss(d1, d0); - d0 = _mm_move_ss(d0, d); - sum3 = _mm_add_ps(sum3, _mm_mul_ps(d, d3)); - sum2 = _mm_add_ps(sum2, _mm_mul_ps(d, d2)); - sum1 = _mm_add_ps(sum1, _mm_mul_ps(d, d1)); - sum0 = _mm_add_ps(sum0, _mm_mul_ps(d, d0)); - } - } - - _mm_storeu_ps(autoc, sum0); - _mm_storeu_ps(autoc+4, sum1); - _mm_storeu_ps(autoc+8, sum2); - _mm_storeu_ps(autoc+12,sum3); -} - -#else -/* Faster on older Intel CPUs (up to Core 2) */ - -FLAC__SSE_TARGET("sse") -void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_4(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]) -{ - __m128 xmm0, xmm2, xmm5; - - (void) lag; - FLAC__ASSERT(lag > 0); - FLAC__ASSERT(lag <= 4); - FLAC__ASSERT(lag <= data_len); - FLAC__ASSERT(data_len > 0); - - xmm5 = _mm_setzero_ps(); - - xmm0 = _mm_load_ss(data++); - xmm2 = xmm0; - xmm0 = _mm_shuffle_ps(xmm0, xmm0, 0); - - xmm0 = _mm_mul_ps(xmm0, xmm2); - xmm5 = _mm_add_ps(xmm5, xmm0); - - data_len--; - - while(data_len) - { - xmm0 = _mm_load1_ps(data++); - - xmm2 = _mm_shuffle_ps(xmm2, xmm2, _MM_SHUFFLE(2,1,0,3)); - xmm2 = _mm_move_ss(xmm2, xmm0); - xmm0 = _mm_mul_ps(xmm0, xmm2); - xmm5 = _mm_add_ps(xmm5, xmm0); - - data_len--; - } - - _mm_storeu_ps(autoc, xmm5); -} - -FLAC__SSE_TARGET("sse") -void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_8(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]) -{ - __m128 xmm0, xmm1, xmm2, xmm3, xmm5, xmm6; - - (void) lag; - FLAC__ASSERT(lag > 0); - FLAC__ASSERT(lag <= 8); - FLAC__ASSERT(lag <= data_len); - FLAC__ASSERT(data_len > 0); - - xmm5 = _mm_setzero_ps(); - xmm6 = _mm_setzero_ps(); - - xmm0 = _mm_load_ss(data++); - xmm2 = xmm0; - xmm0 = _mm_shuffle_ps(xmm0, xmm0, 0); - xmm3 = _mm_setzero_ps(); - - xmm0 = _mm_mul_ps(xmm0, xmm2); - xmm5 = _mm_add_ps(xmm5, xmm0); - - data_len--; - - while(data_len) - { - xmm0 = _mm_load1_ps(data++); - - xmm2 = _mm_shuffle_ps(xmm2, xmm2, _MM_SHUFFLE(2,1,0,3)); - xmm3 = _mm_shuffle_ps(xmm3, xmm3, _MM_SHUFFLE(2,1,0,3)); - xmm3 = _mm_move_ss(xmm3, xmm2); - xmm2 = _mm_move_ss(xmm2, xmm0); - - xmm1 = xmm0; - xmm1 = _mm_mul_ps(xmm1, xmm3); - xmm0 = _mm_mul_ps(xmm0, xmm2); - xmm6 = _mm_add_ps(xmm6, xmm1); - xmm5 = _mm_add_ps(xmm5, xmm0); - - data_len--; - } - - _mm_storeu_ps(autoc, xmm5); - _mm_storeu_ps(autoc+4, xmm6); -} - -FLAC__SSE_TARGET("sse") -void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_12(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]) -{ - __m128 xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7; - - (void) lag; - FLAC__ASSERT(lag > 0); - FLAC__ASSERT(lag <= 12); - FLAC__ASSERT(lag <= data_len); - FLAC__ASSERT(data_len > 0); - - xmm5 = _mm_setzero_ps(); - xmm6 = _mm_setzero_ps(); - xmm7 = _mm_setzero_ps(); - - xmm0 = _mm_load_ss(data++); - xmm2 = xmm0; - xmm0 = _mm_shuffle_ps(xmm0, xmm0, 0); - xmm3 = _mm_setzero_ps(); - xmm4 = _mm_setzero_ps(); - - xmm0 = _mm_mul_ps(xmm0, xmm2); - xmm5 = _mm_add_ps(xmm5, xmm0); - - data_len--; - - while(data_len) - { - xmm0 = _mm_load1_ps(data++); - - xmm2 = _mm_shuffle_ps(xmm2, xmm2, _MM_SHUFFLE(2,1,0,3)); - xmm3 = _mm_shuffle_ps(xmm3, xmm3, _MM_SHUFFLE(2,1,0,3)); - xmm4 = _mm_shuffle_ps(xmm4, xmm4, _MM_SHUFFLE(2,1,0,3)); - xmm4 = _mm_move_ss(xmm4, xmm3); - xmm3 = _mm_move_ss(xmm3, xmm2); - xmm2 = _mm_move_ss(xmm2, xmm0); - - xmm1 = xmm0; - xmm1 = _mm_mul_ps(xmm1, xmm2); - xmm5 = _mm_add_ps(xmm5, xmm1); - xmm1 = xmm0; - xmm1 = _mm_mul_ps(xmm1, xmm3); - xmm6 = _mm_add_ps(xmm6, xmm1); - xmm0 = _mm_mul_ps(xmm0, xmm4); - xmm7 = _mm_add_ps(xmm7, xmm0); - - data_len--; - } - - _mm_storeu_ps(autoc, xmm5); - _mm_storeu_ps(autoc+4, xmm6); - _mm_storeu_ps(autoc+8, xmm7); -} - -FLAC__SSE_TARGET("sse") -void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_16(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]) -{ - __m128 xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9; - - (void) lag; - FLAC__ASSERT(lag > 0); - FLAC__ASSERT(lag <= 16); - FLAC__ASSERT(lag <= data_len); - FLAC__ASSERT(data_len > 0); - - xmm6 = _mm_setzero_ps(); - xmm7 = _mm_setzero_ps(); - xmm8 = _mm_setzero_ps(); - xmm9 = _mm_setzero_ps(); - - xmm0 = _mm_load_ss(data++); - xmm2 = xmm0; - xmm0 = _mm_shuffle_ps(xmm0, xmm0, 0); - xmm3 = _mm_setzero_ps(); - xmm4 = _mm_setzero_ps(); - xmm5 = _mm_setzero_ps(); - - xmm0 = _mm_mul_ps(xmm0, xmm2); - xmm6 = _mm_add_ps(xmm6, xmm0); - - data_len--; - - while(data_len) - { - xmm0 = _mm_load1_ps(data++); - - /* shift xmm5:xmm4:xmm3:xmm2 left by one float */ - xmm5 = _mm_shuffle_ps(xmm5, xmm5, _MM_SHUFFLE(2,1,0,3)); - xmm4 = _mm_shuffle_ps(xmm4, xmm4, _MM_SHUFFLE(2,1,0,3)); - xmm3 = _mm_shuffle_ps(xmm3, xmm3, _MM_SHUFFLE(2,1,0,3)); - xmm2 = _mm_shuffle_ps(xmm2, xmm2, _MM_SHUFFLE(2,1,0,3)); - xmm5 = _mm_move_ss(xmm5, xmm4); - xmm4 = _mm_move_ss(xmm4, xmm3); - xmm3 = _mm_move_ss(xmm3, xmm2); - xmm2 = _mm_move_ss(xmm2, xmm0); - - /* xmm9|xmm8|xmm7|xmm6 += xmm0|xmm0|xmm0|xmm0 * xmm5|xmm4|xmm3|xmm2 */ - xmm1 = xmm0; - xmm1 = _mm_mul_ps(xmm1, xmm5); - xmm9 = _mm_add_ps(xmm9, xmm1); - xmm1 = xmm0; - xmm1 = _mm_mul_ps(xmm1, xmm4); - xmm8 = _mm_add_ps(xmm8, xmm1); - xmm1 = xmm0; - xmm1 = _mm_mul_ps(xmm1, xmm3); - xmm7 = _mm_add_ps(xmm7, xmm1); - xmm0 = _mm_mul_ps(xmm0, xmm2); - xmm6 = _mm_add_ps(xmm6, xmm0); - - data_len--; - } - - _mm_storeu_ps(autoc, xmm6); - _mm_storeu_ps(autoc+4, xmm7); - _mm_storeu_ps(autoc+8, xmm8); - _mm_storeu_ps(autoc+12,xmm9); -} -#endif - -#endif /* FLAC__SSE_SUPPORTED */ -#endif /* (FLAC__CPU_IA32 || FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN */ -#endif /* FLAC__NO_ASM */ -#endif /* FLAC__INTEGER_ONLY_LIBRARY */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/lpc_intrin_sse2.c b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/lpc_intrin_sse2.c deleted file mode 100644 index e1908ed6..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/lpc_intrin_sse2.c +++ /dev/null @@ -1,1088 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 -#endif - -#ifndef FLAC__INTEGER_ONLY_LIBRARY -#ifndef FLAC__NO_ASM -#if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN -#include "private/lpc.h" -#ifdef FLAC__SSE2_SUPPORTED - -#include "FLAC/assert.h" -#include "FLAC/format.h" - -#include /* SSE2 */ - -#define RESIDUAL16_RESULT(xmmN) curr = *data++; *residual++ = curr - (_mm_cvtsi128_si32(xmmN) >> lp_quantization); -#define DATA16_RESULT(xmmN) curr = *residual++ + (_mm_cvtsi128_si32(xmmN) >> lp_quantization); *data++ = curr; - -#define RESIDUAL32_RESULT(xmmN) residual[i] = data[i] - (_mm_cvtsi128_si32(xmmN) >> lp_quantization); -#define DATA32_RESULT(xmmN) data[i] = residual[i] + (_mm_cvtsi128_si32(xmmN) >> lp_quantization); - -FLAC__SSE_TARGET("sse2") -void FLAC__lpc_compute_residual_from_qlp_coefficients_16_intrin_sse2(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]) -{ - int i; - FLAC__int32 sum; - __m128i cnt = _mm_cvtsi32_si128(lp_quantization); - - FLAC__ASSERT(order > 0); - FLAC__ASSERT(order <= 32); - - if(order <= 12) { - if(order > 8) { - if(order > 10) { - if(order == 12) { - __m128i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10, q11; - q0 = _mm_cvtsi32_si128(0xffff & qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); - q1 = _mm_cvtsi32_si128(0xffff & qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); - q2 = _mm_cvtsi32_si128(0xffff & qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); - q3 = _mm_cvtsi32_si128(0xffff & qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); - q4 = _mm_cvtsi32_si128(0xffff & qlp_coeff[4]); q4 = _mm_shuffle_epi32(q4, _MM_SHUFFLE(0,0,0,0)); - q5 = _mm_cvtsi32_si128(0xffff & qlp_coeff[5]); q5 = _mm_shuffle_epi32(q5, _MM_SHUFFLE(0,0,0,0)); - q6 = _mm_cvtsi32_si128(0xffff & qlp_coeff[6]); q6 = _mm_shuffle_epi32(q6, _MM_SHUFFLE(0,0,0,0)); - q7 = _mm_cvtsi32_si128(0xffff & qlp_coeff[7]); q7 = _mm_shuffle_epi32(q7, _MM_SHUFFLE(0,0,0,0)); - q8 = _mm_cvtsi32_si128(0xffff & qlp_coeff[8]); q8 = _mm_shuffle_epi32(q8, _MM_SHUFFLE(0,0,0,0)); - q9 = _mm_cvtsi32_si128(0xffff & qlp_coeff[9]); q9 = _mm_shuffle_epi32(q9, _MM_SHUFFLE(0,0,0,0)); - q10 = _mm_cvtsi32_si128(0xffff & qlp_coeff[10]); q10 = _mm_shuffle_epi32(q10, _MM_SHUFFLE(0,0,0,0)); - q11 = _mm_cvtsi32_si128(0xffff & qlp_coeff[11]); q11 = _mm_shuffle_epi32(q11, _MM_SHUFFLE(0,0,0,0)); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m128i summ, mull; - summ = _mm_madd_epi16(q11, _mm_loadu_si128((const __m128i*)(data+i-12))); - mull = _mm_madd_epi16(q10, _mm_loadu_si128((const __m128i*)(data+i-11))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q9, _mm_loadu_si128((const __m128i*)(data+i-10))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q8, _mm_loadu_si128((const __m128i*)(data+i-9))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q7, _mm_loadu_si128((const __m128i*)(data+i-8))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q6, _mm_loadu_si128((const __m128i*)(data+i-7))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q5, _mm_loadu_si128((const __m128i*)(data+i-6))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q4, _mm_loadu_si128((const __m128i*)(data+i-5))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); - summ = _mm_sra_epi32(summ, cnt); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); - } - } - else { /* order == 11 */ - __m128i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10; - q0 = _mm_cvtsi32_si128(0xffff & qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); - q1 = _mm_cvtsi32_si128(0xffff & qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); - q2 = _mm_cvtsi32_si128(0xffff & qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); - q3 = _mm_cvtsi32_si128(0xffff & qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); - q4 = _mm_cvtsi32_si128(0xffff & qlp_coeff[4]); q4 = _mm_shuffle_epi32(q4, _MM_SHUFFLE(0,0,0,0)); - q5 = _mm_cvtsi32_si128(0xffff & qlp_coeff[5]); q5 = _mm_shuffle_epi32(q5, _MM_SHUFFLE(0,0,0,0)); - q6 = _mm_cvtsi32_si128(0xffff & qlp_coeff[6]); q6 = _mm_shuffle_epi32(q6, _MM_SHUFFLE(0,0,0,0)); - q7 = _mm_cvtsi32_si128(0xffff & qlp_coeff[7]); q7 = _mm_shuffle_epi32(q7, _MM_SHUFFLE(0,0,0,0)); - q8 = _mm_cvtsi32_si128(0xffff & qlp_coeff[8]); q8 = _mm_shuffle_epi32(q8, _MM_SHUFFLE(0,0,0,0)); - q9 = _mm_cvtsi32_si128(0xffff & qlp_coeff[9]); q9 = _mm_shuffle_epi32(q9, _MM_SHUFFLE(0,0,0,0)); - q10 = _mm_cvtsi32_si128(0xffff & qlp_coeff[10]); q10 = _mm_shuffle_epi32(q10, _MM_SHUFFLE(0,0,0,0)); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m128i summ, mull; - summ = _mm_madd_epi16(q10, _mm_loadu_si128((const __m128i*)(data+i-11))); - mull = _mm_madd_epi16(q9, _mm_loadu_si128((const __m128i*)(data+i-10))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q8, _mm_loadu_si128((const __m128i*)(data+i-9))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q7, _mm_loadu_si128((const __m128i*)(data+i-8))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q6, _mm_loadu_si128((const __m128i*)(data+i-7))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q5, _mm_loadu_si128((const __m128i*)(data+i-6))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q4, _mm_loadu_si128((const __m128i*)(data+i-5))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); - summ = _mm_sra_epi32(summ, cnt); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); - } - } - } - else { - if(order == 10) { - __m128i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9; - q0 = _mm_cvtsi32_si128(0xffff & qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); - q1 = _mm_cvtsi32_si128(0xffff & qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); - q2 = _mm_cvtsi32_si128(0xffff & qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); - q3 = _mm_cvtsi32_si128(0xffff & qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); - q4 = _mm_cvtsi32_si128(0xffff & qlp_coeff[4]); q4 = _mm_shuffle_epi32(q4, _MM_SHUFFLE(0,0,0,0)); - q5 = _mm_cvtsi32_si128(0xffff & qlp_coeff[5]); q5 = _mm_shuffle_epi32(q5, _MM_SHUFFLE(0,0,0,0)); - q6 = _mm_cvtsi32_si128(0xffff & qlp_coeff[6]); q6 = _mm_shuffle_epi32(q6, _MM_SHUFFLE(0,0,0,0)); - q7 = _mm_cvtsi32_si128(0xffff & qlp_coeff[7]); q7 = _mm_shuffle_epi32(q7, _MM_SHUFFLE(0,0,0,0)); - q8 = _mm_cvtsi32_si128(0xffff & qlp_coeff[8]); q8 = _mm_shuffle_epi32(q8, _MM_SHUFFLE(0,0,0,0)); - q9 = _mm_cvtsi32_si128(0xffff & qlp_coeff[9]); q9 = _mm_shuffle_epi32(q9, _MM_SHUFFLE(0,0,0,0)); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m128i summ, mull; - summ = _mm_madd_epi16(q9, _mm_loadu_si128((const __m128i*)(data+i-10))); - mull = _mm_madd_epi16(q8, _mm_loadu_si128((const __m128i*)(data+i-9))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q7, _mm_loadu_si128((const __m128i*)(data+i-8))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q6, _mm_loadu_si128((const __m128i*)(data+i-7))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q5, _mm_loadu_si128((const __m128i*)(data+i-6))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q4, _mm_loadu_si128((const __m128i*)(data+i-5))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); - summ = _mm_sra_epi32(summ, cnt); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); - } - } - else { /* order == 9 */ - __m128i q0, q1, q2, q3, q4, q5, q6, q7, q8; - q0 = _mm_cvtsi32_si128(0xffff & qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); - q1 = _mm_cvtsi32_si128(0xffff & qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); - q2 = _mm_cvtsi32_si128(0xffff & qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); - q3 = _mm_cvtsi32_si128(0xffff & qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); - q4 = _mm_cvtsi32_si128(0xffff & qlp_coeff[4]); q4 = _mm_shuffle_epi32(q4, _MM_SHUFFLE(0,0,0,0)); - q5 = _mm_cvtsi32_si128(0xffff & qlp_coeff[5]); q5 = _mm_shuffle_epi32(q5, _MM_SHUFFLE(0,0,0,0)); - q6 = _mm_cvtsi32_si128(0xffff & qlp_coeff[6]); q6 = _mm_shuffle_epi32(q6, _MM_SHUFFLE(0,0,0,0)); - q7 = _mm_cvtsi32_si128(0xffff & qlp_coeff[7]); q7 = _mm_shuffle_epi32(q7, _MM_SHUFFLE(0,0,0,0)); - q8 = _mm_cvtsi32_si128(0xffff & qlp_coeff[8]); q8 = _mm_shuffle_epi32(q8, _MM_SHUFFLE(0,0,0,0)); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m128i summ, mull; - summ = _mm_madd_epi16(q8, _mm_loadu_si128((const __m128i*)(data+i-9))); - mull = _mm_madd_epi16(q7, _mm_loadu_si128((const __m128i*)(data+i-8))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q6, _mm_loadu_si128((const __m128i*)(data+i-7))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q5, _mm_loadu_si128((const __m128i*)(data+i-6))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q4, _mm_loadu_si128((const __m128i*)(data+i-5))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); - summ = _mm_sra_epi32(summ, cnt); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); - } - } - } - } - else if(order > 4) { - if(order > 6) { - if(order == 8) { - __m128i q0, q1, q2, q3, q4, q5, q6, q7; - q0 = _mm_cvtsi32_si128(0xffff & qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); - q1 = _mm_cvtsi32_si128(0xffff & qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); - q2 = _mm_cvtsi32_si128(0xffff & qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); - q3 = _mm_cvtsi32_si128(0xffff & qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); - q4 = _mm_cvtsi32_si128(0xffff & qlp_coeff[4]); q4 = _mm_shuffle_epi32(q4, _MM_SHUFFLE(0,0,0,0)); - q5 = _mm_cvtsi32_si128(0xffff & qlp_coeff[5]); q5 = _mm_shuffle_epi32(q5, _MM_SHUFFLE(0,0,0,0)); - q6 = _mm_cvtsi32_si128(0xffff & qlp_coeff[6]); q6 = _mm_shuffle_epi32(q6, _MM_SHUFFLE(0,0,0,0)); - q7 = _mm_cvtsi32_si128(0xffff & qlp_coeff[7]); q7 = _mm_shuffle_epi32(q7, _MM_SHUFFLE(0,0,0,0)); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m128i summ, mull; - summ = _mm_madd_epi16(q7, _mm_loadu_si128((const __m128i*)(data+i-8))); - mull = _mm_madd_epi16(q6, _mm_loadu_si128((const __m128i*)(data+i-7))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q5, _mm_loadu_si128((const __m128i*)(data+i-6))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q4, _mm_loadu_si128((const __m128i*)(data+i-5))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); - summ = _mm_sra_epi32(summ, cnt); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); - } - } - else { /* order == 7 */ - __m128i q0, q1, q2, q3, q4, q5, q6; - q0 = _mm_cvtsi32_si128(0xffff & qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); - q1 = _mm_cvtsi32_si128(0xffff & qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); - q2 = _mm_cvtsi32_si128(0xffff & qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); - q3 = _mm_cvtsi32_si128(0xffff & qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); - q4 = _mm_cvtsi32_si128(0xffff & qlp_coeff[4]); q4 = _mm_shuffle_epi32(q4, _MM_SHUFFLE(0,0,0,0)); - q5 = _mm_cvtsi32_si128(0xffff & qlp_coeff[5]); q5 = _mm_shuffle_epi32(q5, _MM_SHUFFLE(0,0,0,0)); - q6 = _mm_cvtsi32_si128(0xffff & qlp_coeff[6]); q6 = _mm_shuffle_epi32(q6, _MM_SHUFFLE(0,0,0,0)); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m128i summ, mull; - summ = _mm_madd_epi16(q6, _mm_loadu_si128((const __m128i*)(data+i-7))); - mull = _mm_madd_epi16(q5, _mm_loadu_si128((const __m128i*)(data+i-6))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q4, _mm_loadu_si128((const __m128i*)(data+i-5))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); - summ = _mm_sra_epi32(summ, cnt); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); - } - } - } - else { - if(order == 6) { - __m128i q0, q1, q2, q3, q4, q5; - q0 = _mm_cvtsi32_si128(0xffff & qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); - q1 = _mm_cvtsi32_si128(0xffff & qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); - q2 = _mm_cvtsi32_si128(0xffff & qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); - q3 = _mm_cvtsi32_si128(0xffff & qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); - q4 = _mm_cvtsi32_si128(0xffff & qlp_coeff[4]); q4 = _mm_shuffle_epi32(q4, _MM_SHUFFLE(0,0,0,0)); - q5 = _mm_cvtsi32_si128(0xffff & qlp_coeff[5]); q5 = _mm_shuffle_epi32(q5, _MM_SHUFFLE(0,0,0,0)); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m128i summ, mull; - summ = _mm_madd_epi16(q5, _mm_loadu_si128((const __m128i*)(data+i-6))); - mull = _mm_madd_epi16(q4, _mm_loadu_si128((const __m128i*)(data+i-5))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); - summ = _mm_sra_epi32(summ, cnt); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); - } - } - else { /* order == 5 */ - __m128i q0, q1, q2, q3, q4; - q0 = _mm_cvtsi32_si128(0xffff & qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); - q1 = _mm_cvtsi32_si128(0xffff & qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); - q2 = _mm_cvtsi32_si128(0xffff & qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); - q3 = _mm_cvtsi32_si128(0xffff & qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); - q4 = _mm_cvtsi32_si128(0xffff & qlp_coeff[4]); q4 = _mm_shuffle_epi32(q4, _MM_SHUFFLE(0,0,0,0)); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m128i summ, mull; - summ = _mm_madd_epi16(q4, _mm_loadu_si128((const __m128i*)(data+i-5))); - mull = _mm_madd_epi16(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); - summ = _mm_sra_epi32(summ, cnt); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); - } - } - } - } - else { - if(order > 2) { - if(order == 4) { - __m128i q0, q1, q2, q3; - q0 = _mm_cvtsi32_si128(0xffff & qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); - q1 = _mm_cvtsi32_si128(0xffff & qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); - q2 = _mm_cvtsi32_si128(0xffff & qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); - q3 = _mm_cvtsi32_si128(0xffff & qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m128i summ, mull; - summ = _mm_madd_epi16(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); - mull = _mm_madd_epi16(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); - summ = _mm_sra_epi32(summ, cnt); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); - } - } - else { /* order == 3 */ - __m128i q0, q1, q2; - q0 = _mm_cvtsi32_si128(0xffff & qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); - q1 = _mm_cvtsi32_si128(0xffff & qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); - q2 = _mm_cvtsi32_si128(0xffff & qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m128i summ, mull; - summ = _mm_madd_epi16(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); - mull = _mm_madd_epi16(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); - mull = _mm_madd_epi16(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); - summ = _mm_sra_epi32(summ, cnt); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); - } - } - } - else { - if(order == 2) { - __m128i q0, q1; - q0 = _mm_cvtsi32_si128(0xffff & qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); - q1 = _mm_cvtsi32_si128(0xffff & qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m128i summ, mull; - summ = _mm_madd_epi16(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); - mull = _mm_madd_epi16(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); - summ = _mm_sra_epi32(summ, cnt); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); - } - } - else { /* order == 1 */ - __m128i q0; - q0 = _mm_cvtsi32_si128(0xffff & qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m128i summ; - summ = _mm_madd_epi16(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); - summ = _mm_sra_epi32(summ, cnt); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); - } - } - } - } - for(; i < (int)data_len; i++) { - sum = 0; - switch(order) { - case 12: sum += qlp_coeff[11] * data[i-12]; - case 11: sum += qlp_coeff[10] * data[i-11]; - case 10: sum += qlp_coeff[ 9] * data[i-10]; - case 9: sum += qlp_coeff[ 8] * data[i- 9]; - case 8: sum += qlp_coeff[ 7] * data[i- 8]; - case 7: sum += qlp_coeff[ 6] * data[i- 7]; - case 6: sum += qlp_coeff[ 5] * data[i- 6]; - case 5: sum += qlp_coeff[ 4] * data[i- 5]; - case 4: sum += qlp_coeff[ 3] * data[i- 4]; - case 3: sum += qlp_coeff[ 2] * data[i- 3]; - case 2: sum += qlp_coeff[ 1] * data[i- 2]; - case 1: sum += qlp_coeff[ 0] * data[i- 1]; - } - residual[i] = data[i] - (sum >> lp_quantization); - } - } - else { /* order > 12 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - switch(order) { - case 32: sum += qlp_coeff[31] * data[i-32]; - case 31: sum += qlp_coeff[30] * data[i-31]; - case 30: sum += qlp_coeff[29] * data[i-30]; - case 29: sum += qlp_coeff[28] * data[i-29]; - case 28: sum += qlp_coeff[27] * data[i-28]; - case 27: sum += qlp_coeff[26] * data[i-27]; - case 26: sum += qlp_coeff[25] * data[i-26]; - case 25: sum += qlp_coeff[24] * data[i-25]; - case 24: sum += qlp_coeff[23] * data[i-24]; - case 23: sum += qlp_coeff[22] * data[i-23]; - case 22: sum += qlp_coeff[21] * data[i-22]; - case 21: sum += qlp_coeff[20] * data[i-21]; - case 20: sum += qlp_coeff[19] * data[i-20]; - case 19: sum += qlp_coeff[18] * data[i-19]; - case 18: sum += qlp_coeff[17] * data[i-18]; - case 17: sum += qlp_coeff[16] * data[i-17]; - case 16: sum += qlp_coeff[15] * data[i-16]; - case 15: sum += qlp_coeff[14] * data[i-15]; - case 14: sum += qlp_coeff[13] * data[i-14]; - case 13: sum += qlp_coeff[12] * data[i-13]; - sum += qlp_coeff[11] * data[i-12]; - sum += qlp_coeff[10] * data[i-11]; - sum += qlp_coeff[ 9] * data[i-10]; - sum += qlp_coeff[ 8] * data[i- 9]; - sum += qlp_coeff[ 7] * data[i- 8]; - sum += qlp_coeff[ 6] * data[i- 7]; - sum += qlp_coeff[ 5] * data[i- 6]; - sum += qlp_coeff[ 4] * data[i- 5]; - sum += qlp_coeff[ 3] * data[i- 4]; - sum += qlp_coeff[ 2] * data[i- 3]; - sum += qlp_coeff[ 1] * data[i- 2]; - sum += qlp_coeff[ 0] * data[i- 1]; - } - residual[i] = data[i] - (sum >> lp_quantization); - } - } -} - -FLAC__SSE_TARGET("sse2") -void FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_sse2(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]) -{ - int i; - - FLAC__ASSERT(order > 0); - FLAC__ASSERT(order <= 32); - - if(order <= 12) { - if(order > 8) { /* order == 9, 10, 11, 12 */ - if(order > 10) { /* order == 11, 12 */ - if(order == 12) { - __m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7; - xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); // 0 0 q[1] q[0] - xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); // 0 0 q[3] q[2] - xmm2 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); // 0 0 q[5] q[4] - xmm3 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+6)); // 0 0 q[7] q[6] - xmm4 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+8)); // 0 0 q[9] q[8] - xmm5 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+10)); // 0 0 q[11] q[10] - - xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); // 0 q[1] 0 q[0] - xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); // 0 q[3] 0 q[2] - xmm2 = _mm_shuffle_epi32(xmm2, _MM_SHUFFLE(3,1,2,0)); // 0 q[5] 0 q[4] - xmm3 = _mm_shuffle_epi32(xmm3, _MM_SHUFFLE(3,1,2,0)); // 0 q[7] 0 q[6] - xmm4 = _mm_shuffle_epi32(xmm4, _MM_SHUFFLE(3,1,2,0)); // 0 q[9] 0 q[8] - xmm5 = _mm_shuffle_epi32(xmm5, _MM_SHUFFLE(3,1,2,0)); // 0 q[11] 0 q[10] - - for(i = 0; i < (int)data_len; i++) { - //sum = 0; - //sum += qlp_coeff[11] * data[i-12]; - //sum += qlp_coeff[10] * data[i-11]; - xmm7 = _mm_loadl_epi64((const __m128i*)(data+i-12)); // 0 0 d[i-11] d[i-12] - xmm7 = _mm_shuffle_epi32(xmm7, _MM_SHUFFLE(2,0,3,1)); // 0 d[i-12] 0 d[i-11] - xmm7 = _mm_mul_epu32(xmm7, xmm5); /* we use _unsigned_ multiplication and discard high dword of the result values */ - - //sum += qlp_coeff[9] * data[i-10]; - //sum += qlp_coeff[8] * data[i-9]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-10)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epu32(xmm6, xmm4); - xmm7 = _mm_add_epi32(xmm7, xmm6); - - //sum += qlp_coeff[7] * data[i-8]; - //sum += qlp_coeff[6] * data[i-7]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-8)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epu32(xmm6, xmm3); - xmm7 = _mm_add_epi32(xmm7, xmm6); - - //sum += qlp_coeff[5] * data[i-6]; - //sum += qlp_coeff[4] * data[i-5]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-6)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epu32(xmm6, xmm2); - xmm7 = _mm_add_epi32(xmm7, xmm6); - - //sum += qlp_coeff[3] * data[i-4]; - //sum += qlp_coeff[2] * data[i-3]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-4)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epu32(xmm6, xmm1); - xmm7 = _mm_add_epi32(xmm7, xmm6); - - //sum += qlp_coeff[1] * data[i-2]; - //sum += qlp_coeff[0] * data[i-1]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epu32(xmm6, xmm0); - xmm7 = _mm_add_epi32(xmm7, xmm6); - - xmm7 = _mm_add_epi32(xmm7, _mm_srli_si128(xmm7, 8)); - RESIDUAL32_RESULT(xmm7); - } - } - else { /* order == 11 */ - __m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7; - xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); - xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); - xmm2 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); - xmm3 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+6)); - xmm4 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+8)); - xmm5 = _mm_cvtsi32_si128(qlp_coeff[10]); - - xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); - xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); - xmm2 = _mm_shuffle_epi32(xmm2, _MM_SHUFFLE(3,1,2,0)); - xmm3 = _mm_shuffle_epi32(xmm3, _MM_SHUFFLE(3,1,2,0)); - xmm4 = _mm_shuffle_epi32(xmm4, _MM_SHUFFLE(3,1,2,0)); - - for(i = 0; i < (int)data_len; i++) { - //sum = 0; - //sum = qlp_coeff[10] * data[i-11]; - xmm7 = _mm_cvtsi32_si128(data[i-11]); - xmm7 = _mm_mul_epu32(xmm7, xmm5); - - //sum += qlp_coeff[9] * data[i-10]; - //sum += qlp_coeff[8] * data[i-9]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-10)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epu32(xmm6, xmm4); - xmm7 = _mm_add_epi32(xmm7, xmm6); - - //sum += qlp_coeff[7] * data[i-8]; - //sum += qlp_coeff[6] * data[i-7]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-8)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epu32(xmm6, xmm3); - xmm7 = _mm_add_epi32(xmm7, xmm6); - - //sum += qlp_coeff[5] * data[i-6]; - //sum += qlp_coeff[4] * data[i-5]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-6)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epu32(xmm6, xmm2); - xmm7 = _mm_add_epi32(xmm7, xmm6); - - //sum += qlp_coeff[3] * data[i-4]; - //sum += qlp_coeff[2] * data[i-3]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-4)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epu32(xmm6, xmm1); - xmm7 = _mm_add_epi32(xmm7, xmm6); - - //sum += qlp_coeff[1] * data[i-2]; - //sum += qlp_coeff[0] * data[i-1]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epu32(xmm6, xmm0); - xmm7 = _mm_add_epi32(xmm7, xmm6); - - xmm7 = _mm_add_epi32(xmm7, _mm_srli_si128(xmm7, 8)); - RESIDUAL32_RESULT(xmm7); - } - } - } - else { /* order == 9, 10 */ - if(order == 10) { - __m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm6, xmm7; - xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); - xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); - xmm2 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); - xmm3 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+6)); - xmm4 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+8)); - - xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); - xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); - xmm2 = _mm_shuffle_epi32(xmm2, _MM_SHUFFLE(3,1,2,0)); - xmm3 = _mm_shuffle_epi32(xmm3, _MM_SHUFFLE(3,1,2,0)); - xmm4 = _mm_shuffle_epi32(xmm4, _MM_SHUFFLE(3,1,2,0)); - - for(i = 0; i < (int)data_len; i++) { - //sum = 0; - //sum += qlp_coeff[9] * data[i-10]; - //sum += qlp_coeff[8] * data[i-9]; - xmm7 = _mm_loadl_epi64((const __m128i*)(data+i-10)); - xmm7 = _mm_shuffle_epi32(xmm7, _MM_SHUFFLE(2,0,3,1)); - xmm7 = _mm_mul_epu32(xmm7, xmm4); - - //sum += qlp_coeff[7] * data[i-8]; - //sum += qlp_coeff[6] * data[i-7]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-8)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epu32(xmm6, xmm3); - xmm7 = _mm_add_epi32(xmm7, xmm6); - - //sum += qlp_coeff[5] * data[i-6]; - //sum += qlp_coeff[4] * data[i-5]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-6)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epu32(xmm6, xmm2); - xmm7 = _mm_add_epi32(xmm7, xmm6); - - //sum += qlp_coeff[3] * data[i-4]; - //sum += qlp_coeff[2] * data[i-3]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-4)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epu32(xmm6, xmm1); - xmm7 = _mm_add_epi32(xmm7, xmm6); - - //sum += qlp_coeff[1] * data[i-2]; - //sum += qlp_coeff[0] * data[i-1]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epu32(xmm6, xmm0); - xmm7 = _mm_add_epi32(xmm7, xmm6); - - xmm7 = _mm_add_epi32(xmm7, _mm_srli_si128(xmm7, 8)); - RESIDUAL32_RESULT(xmm7); - } - } - else { /* order == 9 */ - __m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm6, xmm7; - xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); - xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); - xmm2 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); - xmm3 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+6)); - xmm4 = _mm_cvtsi32_si128(qlp_coeff[8]); - - xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); - xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); - xmm2 = _mm_shuffle_epi32(xmm2, _MM_SHUFFLE(3,1,2,0)); - xmm3 = _mm_shuffle_epi32(xmm3, _MM_SHUFFLE(3,1,2,0)); - - for(i = 0; i < (int)data_len; i++) { - //sum = 0; - //sum = qlp_coeff[8] * data[i-9]; - xmm7 = _mm_cvtsi32_si128(data[i-9]); - xmm7 = _mm_mul_epu32(xmm7, xmm4); - - //sum += qlp_coeff[7] * data[i-8]; - //sum += qlp_coeff[6] * data[i-7]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-8)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epu32(xmm6, xmm3); - xmm7 = _mm_add_epi32(xmm7, xmm6); - - //sum += qlp_coeff[5] * data[i-6]; - //sum += qlp_coeff[4] * data[i-5]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-6)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epu32(xmm6, xmm2); - xmm7 = _mm_add_epi32(xmm7, xmm6); - - //sum += qlp_coeff[3] * data[i-4]; - //sum += qlp_coeff[2] * data[i-3]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-4)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epu32(xmm6, xmm1); - xmm7 = _mm_add_epi32(xmm7, xmm6); - - //sum += qlp_coeff[1] * data[i-2]; - //sum += qlp_coeff[0] * data[i-1]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epu32(xmm6, xmm0); - xmm7 = _mm_add_epi32(xmm7, xmm6); - - xmm7 = _mm_add_epi32(xmm7, _mm_srli_si128(xmm7, 8)); - RESIDUAL32_RESULT(xmm7); - } - } - } - } - else if(order > 4) { /* order == 5, 6, 7, 8 */ - if(order > 6) { /* order == 7, 8 */ - if(order == 8) { - __m128i xmm0, xmm1, xmm2, xmm3, xmm6, xmm7; - xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); - xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); - xmm2 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); - xmm3 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+6)); - - xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); - xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); - xmm2 = _mm_shuffle_epi32(xmm2, _MM_SHUFFLE(3,1,2,0)); - xmm3 = _mm_shuffle_epi32(xmm3, _MM_SHUFFLE(3,1,2,0)); - - for(i = 0; i < (int)data_len; i++) { - //sum = 0; - //sum += qlp_coeff[7] * data[i-8]; - //sum += qlp_coeff[6] * data[i-7]; - xmm7 = _mm_loadl_epi64((const __m128i*)(data+i-8)); - xmm7 = _mm_shuffle_epi32(xmm7, _MM_SHUFFLE(2,0,3,1)); - xmm7 = _mm_mul_epu32(xmm7, xmm3); - - //sum += qlp_coeff[5] * data[i-6]; - //sum += qlp_coeff[4] * data[i-5]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-6)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epu32(xmm6, xmm2); - xmm7 = _mm_add_epi32(xmm7, xmm6); - - //sum += qlp_coeff[3] * data[i-4]; - //sum += qlp_coeff[2] * data[i-3]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-4)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epu32(xmm6, xmm1); - xmm7 = _mm_add_epi32(xmm7, xmm6); - - //sum += qlp_coeff[1] * data[i-2]; - //sum += qlp_coeff[0] * data[i-1]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epu32(xmm6, xmm0); - xmm7 = _mm_add_epi32(xmm7, xmm6); - - xmm7 = _mm_add_epi32(xmm7, _mm_srli_si128(xmm7, 8)); - RESIDUAL32_RESULT(xmm7); - } - } - else { /* order == 7 */ - __m128i xmm0, xmm1, xmm2, xmm3, xmm6, xmm7; - xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); - xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); - xmm2 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); - xmm3 = _mm_cvtsi32_si128(qlp_coeff[6]); - - xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); - xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); - xmm2 = _mm_shuffle_epi32(xmm2, _MM_SHUFFLE(3,1,2,0)); - - for(i = 0; i < (int)data_len; i++) { - //sum = 0; - //sum = qlp_coeff[6] * data[i-7]; - xmm7 = _mm_cvtsi32_si128(data[i-7]); - xmm7 = _mm_mul_epu32(xmm7, xmm3); - - //sum += qlp_coeff[5] * data[i-6]; - //sum += qlp_coeff[4] * data[i-5]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-6)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epu32(xmm6, xmm2); - xmm7 = _mm_add_epi32(xmm7, xmm6); - - //sum += qlp_coeff[3] * data[i-4]; - //sum += qlp_coeff[2] * data[i-3]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-4)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epu32(xmm6, xmm1); - xmm7 = _mm_add_epi32(xmm7, xmm6); - - //sum += qlp_coeff[1] * data[i-2]; - //sum += qlp_coeff[0] * data[i-1]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epu32(xmm6, xmm0); - xmm7 = _mm_add_epi32(xmm7, xmm6); - - xmm7 = _mm_add_epi32(xmm7, _mm_srli_si128(xmm7, 8)); - RESIDUAL32_RESULT(xmm7); - } - } - } - else { /* order == 5, 6 */ - if(order == 6) { - __m128i xmm0, xmm1, xmm2, xmm6, xmm7; - xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); - xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); - xmm2 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); - - xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); - xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); - xmm2 = _mm_shuffle_epi32(xmm2, _MM_SHUFFLE(3,1,2,0)); - - for(i = 0; i < (int)data_len; i++) { - //sum = 0; - //sum += qlp_coeff[5] * data[i-6]; - //sum += qlp_coeff[4] * data[i-5]; - xmm7 = _mm_loadl_epi64((const __m128i*)(data+i-6)); - xmm7 = _mm_shuffle_epi32(xmm7, _MM_SHUFFLE(2,0,3,1)); - xmm7 = _mm_mul_epu32(xmm7, xmm2); - - //sum += qlp_coeff[3] * data[i-4]; - //sum += qlp_coeff[2] * data[i-3]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-4)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epu32(xmm6, xmm1); - xmm7 = _mm_add_epi32(xmm7, xmm6); - - //sum += qlp_coeff[1] * data[i-2]; - //sum += qlp_coeff[0] * data[i-1]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epu32(xmm6, xmm0); - xmm7 = _mm_add_epi32(xmm7, xmm6); - - xmm7 = _mm_add_epi32(xmm7, _mm_srli_si128(xmm7, 8)); - RESIDUAL32_RESULT(xmm7); - } - } - else { /* order == 5 */ - __m128i xmm0, xmm1, xmm2, xmm6, xmm7; - xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); - xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); - xmm2 = _mm_cvtsi32_si128(qlp_coeff[4]); - - xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); - xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); - - for(i = 0; i < (int)data_len; i++) { - //sum = 0; - //sum = qlp_coeff[4] * data[i-5]; - xmm7 = _mm_cvtsi32_si128(data[i-5]); - xmm7 = _mm_mul_epu32(xmm7, xmm2); - - //sum += qlp_coeff[3] * data[i-4]; - //sum += qlp_coeff[2] * data[i-3]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-4)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epu32(xmm6, xmm1); - xmm7 = _mm_add_epi32(xmm7, xmm6); - - //sum += qlp_coeff[1] * data[i-2]; - //sum += qlp_coeff[0] * data[i-1]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epu32(xmm6, xmm0); - xmm7 = _mm_add_epi32(xmm7, xmm6); - - xmm7 = _mm_add_epi32(xmm7, _mm_srli_si128(xmm7, 8)); - RESIDUAL32_RESULT(xmm7); - } - } - } - } - else { /* order == 1, 2, 3, 4 */ - if(order > 2) { /* order == 3, 4 */ - if(order == 4) { - __m128i xmm0, xmm1, xmm6, xmm7; - xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); - xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); - - xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); - xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); - - for(i = 0; i < (int)data_len; i++) { - //sum = 0; - //sum += qlp_coeff[3] * data[i-4]; - //sum += qlp_coeff[2] * data[i-3]; - xmm7 = _mm_loadl_epi64((const __m128i*)(data+i-4)); - xmm7 = _mm_shuffle_epi32(xmm7, _MM_SHUFFLE(2,0,3,1)); - xmm7 = _mm_mul_epu32(xmm7, xmm1); - - //sum += qlp_coeff[1] * data[i-2]; - //sum += qlp_coeff[0] * data[i-1]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epu32(xmm6, xmm0); - xmm7 = _mm_add_epi32(xmm7, xmm6); - - xmm7 = _mm_add_epi32(xmm7, _mm_srli_si128(xmm7, 8)); - RESIDUAL32_RESULT(xmm7); - } - } - else { /* order == 3 */ - __m128i xmm0, xmm1, xmm6, xmm7; - xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); - xmm1 = _mm_cvtsi32_si128(qlp_coeff[2]); - - xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); - - for(i = 0; i < (int)data_len; i++) { - //sum = 0; - //sum = qlp_coeff[2] * data[i-3]; - xmm7 = _mm_cvtsi32_si128(data[i-3]); - xmm7 = _mm_mul_epu32(xmm7, xmm1); - - //sum += qlp_coeff[1] * data[i-2]; - //sum += qlp_coeff[0] * data[i-1]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epu32(xmm6, xmm0); - xmm7 = _mm_add_epi32(xmm7, xmm6); - - xmm7 = _mm_add_epi32(xmm7, _mm_srli_si128(xmm7, 8)); - RESIDUAL32_RESULT(xmm7); - } - } - } - else { /* order == 1, 2 */ - if(order == 2) { - __m128i xmm0, xmm7; - xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); - xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); - - for(i = 0; i < (int)data_len; i++) { - //sum = 0; - //sum += qlp_coeff[1] * data[i-2]; - //sum += qlp_coeff[0] * data[i-1]; - xmm7 = _mm_loadl_epi64((const __m128i*)(data+i-2)); - xmm7 = _mm_shuffle_epi32(xmm7, _MM_SHUFFLE(2,0,3,1)); - xmm7 = _mm_mul_epu32(xmm7, xmm0); - - xmm7 = _mm_add_epi32(xmm7, _mm_srli_si128(xmm7, 8)); - RESIDUAL32_RESULT(xmm7); - } - } - else { /* order == 1 */ - for(i = 0; i < (int)data_len; i++) - residual[i] = data[i] - ((qlp_coeff[0] * data[i-1]) >> lp_quantization); - } - } - } - } - else { /* order > 12 */ - FLAC__int32 sum; - for(i = 0; i < (int)data_len; i++) { - sum = 0; - switch(order) { - case 32: sum += qlp_coeff[31] * data[i-32]; - case 31: sum += qlp_coeff[30] * data[i-31]; - case 30: sum += qlp_coeff[29] * data[i-30]; - case 29: sum += qlp_coeff[28] * data[i-29]; - case 28: sum += qlp_coeff[27] * data[i-28]; - case 27: sum += qlp_coeff[26] * data[i-27]; - case 26: sum += qlp_coeff[25] * data[i-26]; - case 25: sum += qlp_coeff[24] * data[i-25]; - case 24: sum += qlp_coeff[23] * data[i-24]; - case 23: sum += qlp_coeff[22] * data[i-23]; - case 22: sum += qlp_coeff[21] * data[i-22]; - case 21: sum += qlp_coeff[20] * data[i-21]; - case 20: sum += qlp_coeff[19] * data[i-20]; - case 19: sum += qlp_coeff[18] * data[i-19]; - case 18: sum += qlp_coeff[17] * data[i-18]; - case 17: sum += qlp_coeff[16] * data[i-17]; - case 16: sum += qlp_coeff[15] * data[i-16]; - case 15: sum += qlp_coeff[14] * data[i-15]; - case 14: sum += qlp_coeff[13] * data[i-14]; - case 13: sum += qlp_coeff[12] * data[i-13]; - sum += qlp_coeff[11] * data[i-12]; - sum += qlp_coeff[10] * data[i-11]; - sum += qlp_coeff[ 9] * data[i-10]; - sum += qlp_coeff[ 8] * data[i- 9]; - sum += qlp_coeff[ 7] * data[i- 8]; - sum += qlp_coeff[ 6] * data[i- 7]; - sum += qlp_coeff[ 5] * data[i- 6]; - sum += qlp_coeff[ 4] * data[i- 5]; - sum += qlp_coeff[ 3] * data[i- 4]; - sum += qlp_coeff[ 2] * data[i- 3]; - sum += qlp_coeff[ 1] * data[i- 2]; - sum += qlp_coeff[ 0] * data[i- 1]; - } - residual[i] = data[i] - (sum >> lp_quantization); - } - } -} - -#if defined FLAC__CPU_IA32 && !defined FLAC__HAS_NASM /* unused for x64; not better than MMX asm */ - -FLAC__SSE_TARGET("sse2") -void FLAC__lpc_restore_signal_16_intrin_sse2(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]) -{ - if (order < 8 || order > 12) { - FLAC__lpc_restore_signal(residual, data_len, qlp_coeff, order, lp_quantization, data); - return; - } - if (data_len == 0) - return; - - FLAC__ASSERT(order >= 8); - FLAC__ASSERT(order <= 12); - - if(order > 8) { /* order == 9, 10, 11, 12 */ - FLAC__int32 curr; - __m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7; - xmm0 = _mm_loadu_si128((const __m128i*)(qlp_coeff+0)); - xmm6 = _mm_loadu_si128((const __m128i*)(qlp_coeff+4)); - xmm1 = _mm_loadu_si128((const __m128i*)(qlp_coeff+8)); /* read 0 to 3 uninitialized coeffs... */ - switch(order) /* ...and zero them out */ - { - case 9: - xmm1 = _mm_slli_si128(xmm1, 12); xmm1 = _mm_srli_si128(xmm1, 12); break; - case 10: - xmm1 = _mm_slli_si128(xmm1, 8); xmm1 = _mm_srli_si128(xmm1, 8); break; - case 11: - xmm1 = _mm_slli_si128(xmm1, 4); xmm1 = _mm_srli_si128(xmm1, 4); break; - } - xmm2 = _mm_setzero_si128(); - xmm0 = _mm_packs_epi32(xmm0, xmm6); - xmm1 = _mm_packs_epi32(xmm1, xmm2); - - xmm4 = _mm_loadu_si128((const __m128i*)(data-12)); - xmm5 = _mm_loadu_si128((const __m128i*)(data-8)); - xmm3 = _mm_loadu_si128((const __m128i*)(data-4)); - xmm4 = _mm_shuffle_epi32(xmm4, _MM_SHUFFLE(0,1,2,3)); - xmm5 = _mm_shuffle_epi32(xmm5, _MM_SHUFFLE(0,1,2,3)); - xmm3 = _mm_shuffle_epi32(xmm3, _MM_SHUFFLE(0,1,2,3)); - xmm4 = _mm_packs_epi32(xmm4, xmm2); - xmm3 = _mm_packs_epi32(xmm3, xmm5); - - xmm7 = _mm_slli_si128(xmm1, 2); - xmm7 = _mm_or_si128(xmm7, _mm_srli_si128(xmm0, 14)); - xmm2 = _mm_slli_si128(xmm0, 2); - - /* xmm0, xmm1: qlp_coeff - xmm2, xmm7: qlp_coeff << 16 bit - xmm3, xmm4: data */ - - xmm5 = _mm_madd_epi16(xmm4, xmm1); - xmm6 = _mm_madd_epi16(xmm3, xmm0); - xmm6 = _mm_add_epi32(xmm6, xmm5); - xmm6 = _mm_add_epi32(xmm6, _mm_srli_si128(xmm6, 8)); - xmm6 = _mm_add_epi32(xmm6, _mm_srli_si128(xmm6, 4)); - - DATA16_RESULT(xmm6); - - data_len--; - - if(data_len % 2) { - xmm6 = _mm_srli_si128(xmm3, 14); - xmm4 = _mm_slli_si128(xmm4, 2); - xmm3 = _mm_slli_si128(xmm3, 2); - xmm4 = _mm_or_si128(xmm4, xmm6); - xmm3 = _mm_insert_epi16(xmm3, curr, 0); - - xmm5 = _mm_madd_epi16(xmm4, xmm1); - xmm6 = _mm_madd_epi16(xmm3, xmm0); - xmm6 = _mm_add_epi32(xmm6, xmm5); - xmm6 = _mm_add_epi32(xmm6, _mm_srli_si128(xmm6, 8)); - xmm6 = _mm_add_epi32(xmm6, _mm_srli_si128(xmm6, 4)); - - DATA16_RESULT(xmm6); - - data_len--; - } - - while(data_len) { /* data_len is a multiple of 2 */ - /* 1 _mm_slli_si128 per data element less but we need shifted qlp_coeff in xmm2:xmm7 */ - xmm6 = _mm_srli_si128(xmm3, 12); - xmm4 = _mm_slli_si128(xmm4, 4); - xmm3 = _mm_slli_si128(xmm3, 4); - xmm4 = _mm_or_si128(xmm4, xmm6); - xmm3 = _mm_insert_epi16(xmm3, curr, 1); - - xmm5 = _mm_madd_epi16(xmm4, xmm7); - xmm6 = _mm_madd_epi16(xmm3, xmm2); - xmm6 = _mm_add_epi32(xmm6, xmm5); - xmm6 = _mm_add_epi32(xmm6, _mm_srli_si128(xmm6, 8)); - xmm6 = _mm_add_epi32(xmm6, _mm_srli_si128(xmm6, 4)); - - DATA16_RESULT(xmm6); - - xmm3 = _mm_insert_epi16(xmm3, curr, 0); - - xmm5 = _mm_madd_epi16(xmm4, xmm1); - xmm6 = _mm_madd_epi16(xmm3, xmm0); - xmm6 = _mm_add_epi32(xmm6, xmm5); - xmm6 = _mm_add_epi32(xmm6, _mm_srli_si128(xmm6, 8)); - xmm6 = _mm_add_epi32(xmm6, _mm_srli_si128(xmm6, 4)); - - DATA16_RESULT(xmm6); - - data_len-=2; - } - } /* endif(order > 8) */ - else - { - FLAC__int32 curr; - __m128i xmm0, xmm1, xmm3, xmm6; - xmm0 = _mm_loadu_si128((const __m128i*)(qlp_coeff+0)); - xmm1 = _mm_loadu_si128((const __m128i*)(qlp_coeff+4)); - xmm0 = _mm_packs_epi32(xmm0, xmm1); - - xmm1 = _mm_loadu_si128((const __m128i*)(data-8)); - xmm3 = _mm_loadu_si128((const __m128i*)(data-4)); - xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(0,1,2,3)); - xmm3 = _mm_shuffle_epi32(xmm3, _MM_SHUFFLE(0,1,2,3)); - xmm3 = _mm_packs_epi32(xmm3, xmm1); - - /* xmm0: qlp_coeff - xmm3: data */ - - xmm6 = _mm_madd_epi16(xmm3, xmm0); - xmm6 = _mm_add_epi32(xmm6, _mm_srli_si128(xmm6, 8)); - xmm6 = _mm_add_epi32(xmm6, _mm_srli_si128(xmm6, 4)); - - DATA16_RESULT(xmm6); - - data_len--; - - while(data_len) { - xmm3 = _mm_slli_si128(xmm3, 2); - xmm3 = _mm_insert_epi16(xmm3, curr, 0); - - xmm6 = _mm_madd_epi16(xmm3, xmm0); - xmm6 = _mm_add_epi32(xmm6, _mm_srli_si128(xmm6, 8)); - xmm6 = _mm_add_epi32(xmm6, _mm_srli_si128(xmm6, 4)); - - DATA16_RESULT(xmm6); - - data_len--; - } - } -} - -#endif /* defined FLAC__CPU_IA32 && !defined FLAC__HAS_NASM */ - -#endif /* FLAC__SSE2_SUPPORTED */ -#endif /* (FLAC__CPU_IA32 || FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN */ -#endif /* FLAC__NO_ASM */ -#endif /* FLAC__INTEGER_ONLY_LIBRARY */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/lpc_intrin_sse41.c b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/lpc_intrin_sse41.c deleted file mode 100644 index b6f4e5e0..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/lpc_intrin_sse41.c +++ /dev/null @@ -1,1312 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 -#endif - -#ifndef FLAC__INTEGER_ONLY_LIBRARY -#ifndef FLAC__NO_ASM -#if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN -#include "private/lpc.h" -#ifdef FLAC__SSE4_1_SUPPORTED - -#include "FLAC/assert.h" -#include "FLAC/format.h" - -#include /* SSE4.1 */ - -#if defined FLAC__CPU_IA32 /* unused for x64 */ - -#define RESIDUAL64_RESULT(xmmN) residual[i] = data[i] - _mm_cvtsi128_si32(_mm_srl_epi64(xmmN, cnt)) -#define RESIDUAL64_RESULT1(xmmN) residual[i] = data[i] - _mm_cvtsi128_si32(_mm_srli_epi64(xmmN, lp_quantization)) - -FLAC__SSE_TARGET("sse4.1") -void FLAC__lpc_compute_residual_from_qlp_coefficients_wide_intrin_sse41(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]) -{ - int i; - __m128i cnt = _mm_cvtsi32_si128(lp_quantization); - - FLAC__ASSERT(order > 0); - FLAC__ASSERT(order <= 32); - FLAC__ASSERT(lp_quantization <= 32); /* there's no _mm_sra_epi64() so we have to use _mm_srl_epi64() */ - - if(order <= 12) { - if(order > 8) { /* order == 9, 10, 11, 12 */ - if(order > 10) { /* order == 11, 12 */ - if(order == 12) { - __m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7; - xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); // 0 0 q[1] q[0] - xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); // 0 0 q[3] q[2] - xmm2 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); // 0 0 q[5] q[4] - xmm3 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+6)); // 0 0 q[7] q[6] - xmm4 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+8)); // 0 0 q[9] q[8] - xmm5 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+10)); // 0 0 q[11] q[10] - - xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); // 0 q[1] 0 q[0] - xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); // 0 q[3] 0 q[2] - xmm2 = _mm_shuffle_epi32(xmm2, _MM_SHUFFLE(3,1,2,0)); // 0 q[5] 0 q[4] - xmm3 = _mm_shuffle_epi32(xmm3, _MM_SHUFFLE(3,1,2,0)); // 0 q[7] 0 q[6] - xmm4 = _mm_shuffle_epi32(xmm4, _MM_SHUFFLE(3,1,2,0)); // 0 q[9] 0 q[8] - xmm5 = _mm_shuffle_epi32(xmm5, _MM_SHUFFLE(3,1,2,0)); // 0 q[11] 0 q[10] - - for(i = 0; i < (int)data_len; i++) { - //sum = 0; - //sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; - //sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; - xmm7 = _mm_loadl_epi64((const __m128i*)(data+i-12)); // 0 0 d[i-11] d[i-12] - xmm7 = _mm_shuffle_epi32(xmm7, _MM_SHUFFLE(2,0,3,1)); // 0 d[i-12] 0 d[i-11] - xmm7 = _mm_mul_epi32(xmm7, xmm5); - - //sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; - //sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-10)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epi32(xmm6, xmm4); - xmm7 = _mm_add_epi64(xmm7, xmm6); - - //sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - //sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-8)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epi32(xmm6, xmm3); - xmm7 = _mm_add_epi64(xmm7, xmm6); - - //sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - //sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-6)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epi32(xmm6, xmm2); - xmm7 = _mm_add_epi64(xmm7, xmm6); - - //sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - //sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-4)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epi32(xmm6, xmm1); - xmm7 = _mm_add_epi64(xmm7, xmm6); - - //sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - //sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epi32(xmm6, xmm0); - xmm7 = _mm_add_epi64(xmm7, xmm6); - - xmm7 = _mm_add_epi64(xmm7, _mm_srli_si128(xmm7, 8)); - RESIDUAL64_RESULT1(xmm7); - } - } - else { /* order == 11 */ - __m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7; - xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); - xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); - xmm2 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); - xmm3 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+6)); - xmm4 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+8)); - xmm5 = _mm_cvtsi32_si128(qlp_coeff[10]); - - xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); - xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); - xmm2 = _mm_shuffle_epi32(xmm2, _MM_SHUFFLE(3,1,2,0)); - xmm3 = _mm_shuffle_epi32(xmm3, _MM_SHUFFLE(3,1,2,0)); - xmm4 = _mm_shuffle_epi32(xmm4, _MM_SHUFFLE(3,1,2,0)); - - for(i = 0; i < (int)data_len; i++) { - //sum = 0; - //sum = qlp_coeff[10] * (FLAC__int64)data[i-11]; - xmm7 = _mm_cvtsi32_si128(data[i-11]); - xmm7 = _mm_mul_epi32(xmm7, xmm5); - - //sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; - //sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-10)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epi32(xmm6, xmm4); - xmm7 = _mm_add_epi64(xmm7, xmm6); - - //sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - //sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-8)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epi32(xmm6, xmm3); - xmm7 = _mm_add_epi64(xmm7, xmm6); - - //sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - //sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-6)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epi32(xmm6, xmm2); - xmm7 = _mm_add_epi64(xmm7, xmm6); - - //sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - //sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-4)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epi32(xmm6, xmm1); - xmm7 = _mm_add_epi64(xmm7, xmm6); - - //sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - //sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epi32(xmm6, xmm0); - xmm7 = _mm_add_epi64(xmm7, xmm6); - - xmm7 = _mm_add_epi64(xmm7, _mm_srli_si128(xmm7, 8)); - RESIDUAL64_RESULT1(xmm7); - } - } - } - else { /* order == 9, 10 */ - if(order == 10) { - __m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm6, xmm7; - xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); - xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); - xmm2 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); - xmm3 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+6)); - xmm4 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+8)); - - xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); - xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); - xmm2 = _mm_shuffle_epi32(xmm2, _MM_SHUFFLE(3,1,2,0)); - xmm3 = _mm_shuffle_epi32(xmm3, _MM_SHUFFLE(3,1,2,0)); - xmm4 = _mm_shuffle_epi32(xmm4, _MM_SHUFFLE(3,1,2,0)); - - for(i = 0; i < (int)data_len; i++) { - //sum = 0; - //sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; - //sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; - xmm7 = _mm_loadl_epi64((const __m128i*)(data+i-10)); - xmm7 = _mm_shuffle_epi32(xmm7, _MM_SHUFFLE(2,0,3,1)); - xmm7 = _mm_mul_epi32(xmm7, xmm4); - - //sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - //sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-8)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epi32(xmm6, xmm3); - xmm7 = _mm_add_epi64(xmm7, xmm6); - - //sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - //sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-6)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epi32(xmm6, xmm2); - xmm7 = _mm_add_epi64(xmm7, xmm6); - - //sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - //sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-4)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epi32(xmm6, xmm1); - xmm7 = _mm_add_epi64(xmm7, xmm6); - - //sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - //sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epi32(xmm6, xmm0); - xmm7 = _mm_add_epi64(xmm7, xmm6); - - xmm7 = _mm_add_epi64(xmm7, _mm_srli_si128(xmm7, 8)); - RESIDUAL64_RESULT(xmm7); - } - } - else { /* order == 9 */ - __m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm6, xmm7; - xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); - xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); - xmm2 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); - xmm3 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+6)); - xmm4 = _mm_cvtsi32_si128(qlp_coeff[8]); - - xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); - xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); - xmm2 = _mm_shuffle_epi32(xmm2, _MM_SHUFFLE(3,1,2,0)); - xmm3 = _mm_shuffle_epi32(xmm3, _MM_SHUFFLE(3,1,2,0)); - - for(i = 0; i < (int)data_len; i++) { - //sum = 0; - //sum = qlp_coeff[8] * (FLAC__int64)data[i-9]; - xmm7 = _mm_cvtsi32_si128(data[i-9]); - xmm7 = _mm_mul_epi32(xmm7, xmm4); - - //sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - //sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-8)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epi32(xmm6, xmm3); - xmm7 = _mm_add_epi64(xmm7, xmm6); - - //sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - //sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-6)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epi32(xmm6, xmm2); - xmm7 = _mm_add_epi64(xmm7, xmm6); - - //sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - //sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-4)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epi32(xmm6, xmm1); - xmm7 = _mm_add_epi64(xmm7, xmm6); - - //sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - //sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epi32(xmm6, xmm0); - xmm7 = _mm_add_epi64(xmm7, xmm6); - - xmm7 = _mm_add_epi64(xmm7, _mm_srli_si128(xmm7, 8)); - RESIDUAL64_RESULT(xmm7); - } - } - } - } - else if(order > 4) { /* order == 5, 6, 7, 8 */ - if(order > 6) { /* order == 7, 8 */ - if(order == 8) { - __m128i xmm0, xmm1, xmm2, xmm3, xmm6, xmm7; - xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); - xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); - xmm2 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); - xmm3 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+6)); - - xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); - xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); - xmm2 = _mm_shuffle_epi32(xmm2, _MM_SHUFFLE(3,1,2,0)); - xmm3 = _mm_shuffle_epi32(xmm3, _MM_SHUFFLE(3,1,2,0)); - - for(i = 0; i < (int)data_len; i++) { - //sum = 0; - //sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - //sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - xmm7 = _mm_loadl_epi64((const __m128i*)(data+i-8)); - xmm7 = _mm_shuffle_epi32(xmm7, _MM_SHUFFLE(2,0,3,1)); - xmm7 = _mm_mul_epi32(xmm7, xmm3); - - //sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - //sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-6)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epi32(xmm6, xmm2); - xmm7 = _mm_add_epi64(xmm7, xmm6); - - //sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - //sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-4)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epi32(xmm6, xmm1); - xmm7 = _mm_add_epi64(xmm7, xmm6); - - //sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - //sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epi32(xmm6, xmm0); - xmm7 = _mm_add_epi64(xmm7, xmm6); - - xmm7 = _mm_add_epi64(xmm7, _mm_srli_si128(xmm7, 8)); - RESIDUAL64_RESULT(xmm7); - } - } - else { /* order == 7 */ - __m128i xmm0, xmm1, xmm2, xmm3, xmm6, xmm7; - xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); - xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); - xmm2 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); - xmm3 = _mm_cvtsi32_si128(qlp_coeff[6]); - - xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); - xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); - xmm2 = _mm_shuffle_epi32(xmm2, _MM_SHUFFLE(3,1,2,0)); - - for(i = 0; i < (int)data_len; i++) { - //sum = 0; - //sum = qlp_coeff[6] * (FLAC__int64)data[i-7]; - xmm7 = _mm_cvtsi32_si128(data[i-7]); - xmm7 = _mm_mul_epi32(xmm7, xmm3); - - //sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - //sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-6)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epi32(xmm6, xmm2); - xmm7 = _mm_add_epi64(xmm7, xmm6); - - //sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - //sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-4)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epi32(xmm6, xmm1); - xmm7 = _mm_add_epi64(xmm7, xmm6); - - //sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - //sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epi32(xmm6, xmm0); - xmm7 = _mm_add_epi64(xmm7, xmm6); - - xmm7 = _mm_add_epi64(xmm7, _mm_srli_si128(xmm7, 8)); - RESIDUAL64_RESULT(xmm7); - } - } - } - else { /* order == 5, 6 */ - if(order == 6) { - __m128i xmm0, xmm1, xmm2, xmm6, xmm7; - xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); - xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); - xmm2 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); - - xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); - xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); - xmm2 = _mm_shuffle_epi32(xmm2, _MM_SHUFFLE(3,1,2,0)); - - for(i = 0; i < (int)data_len; i++) { - //sum = 0; - //sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - //sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - xmm7 = _mm_loadl_epi64((const __m128i*)(data+i-6)); - xmm7 = _mm_shuffle_epi32(xmm7, _MM_SHUFFLE(2,0,3,1)); - xmm7 = _mm_mul_epi32(xmm7, xmm2); - - //sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - //sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-4)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epi32(xmm6, xmm1); - xmm7 = _mm_add_epi64(xmm7, xmm6); - - //sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - //sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epi32(xmm6, xmm0); - xmm7 = _mm_add_epi64(xmm7, xmm6); - - xmm7 = _mm_add_epi64(xmm7, _mm_srli_si128(xmm7, 8)); - RESIDUAL64_RESULT(xmm7); - } - } - else { /* order == 5 */ - __m128i xmm0, xmm1, xmm2, xmm6, xmm7; - xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); - xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); - xmm2 = _mm_cvtsi32_si128(qlp_coeff[4]); - - xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); - xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); - - for(i = 0; i < (int)data_len; i++) { - //sum = 0; - //sum = qlp_coeff[4] * (FLAC__int64)data[i-5]; - xmm7 = _mm_cvtsi32_si128(data[i-5]); - xmm7 = _mm_mul_epi32(xmm7, xmm2); - - //sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - //sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-4)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epi32(xmm6, xmm1); - xmm7 = _mm_add_epi64(xmm7, xmm6); - - //sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - //sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epi32(xmm6, xmm0); - xmm7 = _mm_add_epi64(xmm7, xmm6); - - xmm7 = _mm_add_epi64(xmm7, _mm_srli_si128(xmm7, 8)); - RESIDUAL64_RESULT(xmm7); - } - } - } - } - else { /* order == 1, 2, 3, 4 */ - if(order > 2) { /* order == 3, 4 */ - if(order == 4) { - __m128i xmm0, xmm1, xmm6, xmm7; - xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); - xmm1 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); - - xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); - xmm1 = _mm_shuffle_epi32(xmm1, _MM_SHUFFLE(3,1,2,0)); - - for(i = 0; i < (int)data_len; i++) { - //sum = 0; - //sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - //sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - xmm7 = _mm_loadl_epi64((const __m128i*)(data+i-4)); - xmm7 = _mm_shuffle_epi32(xmm7, _MM_SHUFFLE(2,0,3,1)); - xmm7 = _mm_mul_epi32(xmm7, xmm1); - - //sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - //sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epi32(xmm6, xmm0); - xmm7 = _mm_add_epi64(xmm7, xmm6); - - xmm7 = _mm_add_epi64(xmm7, _mm_srli_si128(xmm7, 8)); - RESIDUAL64_RESULT(xmm7); - } - } - else { /* order == 3 */ - __m128i xmm0, xmm1, xmm6, xmm7; - xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); - xmm1 = _mm_cvtsi32_si128(qlp_coeff[2]); - - xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); - - for(i = 0; i < (int)data_len; i++) { - //sum = 0; - //sum = qlp_coeff[2] * (FLAC__int64)data[i-3]; - xmm7 = _mm_cvtsi32_si128(data[i-3]); - xmm7 = _mm_mul_epi32(xmm7, xmm1); - - //sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - //sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - xmm6 = _mm_loadl_epi64((const __m128i*)(data+i-2)); - xmm6 = _mm_shuffle_epi32(xmm6, _MM_SHUFFLE(2,0,3,1)); - xmm6 = _mm_mul_epi32(xmm6, xmm0); - xmm7 = _mm_add_epi64(xmm7, xmm6); - - xmm7 = _mm_add_epi64(xmm7, _mm_srli_si128(xmm7, 8)); - RESIDUAL64_RESULT(xmm7); - } - } - } - else { /* order == 1, 2 */ - if(order == 2) { - __m128i xmm0, xmm7; - xmm0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); - xmm0 = _mm_shuffle_epi32(xmm0, _MM_SHUFFLE(3,1,2,0)); - - for(i = 0; i < (int)data_len; i++) { - //sum = 0; - //sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - //sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - xmm7 = _mm_loadl_epi64((const __m128i*)(data+i-2)); - xmm7 = _mm_shuffle_epi32(xmm7, _MM_SHUFFLE(2,0,3,1)); - xmm7 = _mm_mul_epi32(xmm7, xmm0); - - xmm7 = _mm_add_epi64(xmm7, _mm_srli_si128(xmm7, 8)); - RESIDUAL64_RESULT(xmm7); - } - } - else { /* order == 1 */ - __m128i xmm0, xmm7; - xmm0 = _mm_cvtsi32_si128(qlp_coeff[0]); - - for(i = 0; i < (int)data_len; i++) { - //sum = qlp_coeff[0] * (FLAC__int64)data[i-1]; - xmm7 = _mm_cvtsi32_si128(data[i-1]); - xmm7 = _mm_mul_epi32(xmm7, xmm0); - RESIDUAL64_RESULT(xmm7); - } - } - } - } - } - else { /* order > 12 */ - FLAC__int64 sum; - for(i = 0; i < (int)data_len; i++) { - sum = 0; - switch(order) { - case 32: sum += qlp_coeff[31] * (FLAC__int64)data[i-32]; - case 31: sum += qlp_coeff[30] * (FLAC__int64)data[i-31]; - case 30: sum += qlp_coeff[29] * (FLAC__int64)data[i-30]; - case 29: sum += qlp_coeff[28] * (FLAC__int64)data[i-29]; - case 28: sum += qlp_coeff[27] * (FLAC__int64)data[i-28]; - case 27: sum += qlp_coeff[26] * (FLAC__int64)data[i-27]; - case 26: sum += qlp_coeff[25] * (FLAC__int64)data[i-26]; - case 25: sum += qlp_coeff[24] * (FLAC__int64)data[i-25]; - case 24: sum += qlp_coeff[23] * (FLAC__int64)data[i-24]; - case 23: sum += qlp_coeff[22] * (FLAC__int64)data[i-23]; - case 22: sum += qlp_coeff[21] * (FLAC__int64)data[i-22]; - case 21: sum += qlp_coeff[20] * (FLAC__int64)data[i-21]; - case 20: sum += qlp_coeff[19] * (FLAC__int64)data[i-20]; - case 19: sum += qlp_coeff[18] * (FLAC__int64)data[i-19]; - case 18: sum += qlp_coeff[17] * (FLAC__int64)data[i-18]; - case 17: sum += qlp_coeff[16] * (FLAC__int64)data[i-17]; - case 16: sum += qlp_coeff[15] * (FLAC__int64)data[i-16]; - case 15: sum += qlp_coeff[14] * (FLAC__int64)data[i-15]; - case 14: sum += qlp_coeff[13] * (FLAC__int64)data[i-14]; - case 13: sum += qlp_coeff[12] * (FLAC__int64)data[i-13]; - sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; - sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; - sum += qlp_coeff[ 9] * (FLAC__int64)data[i-10]; - sum += qlp_coeff[ 8] * (FLAC__int64)data[i- 9]; - sum += qlp_coeff[ 7] * (FLAC__int64)data[i- 8]; - sum += qlp_coeff[ 6] * (FLAC__int64)data[i- 7]; - sum += qlp_coeff[ 5] * (FLAC__int64)data[i- 6]; - sum += qlp_coeff[ 4] * (FLAC__int64)data[i- 5]; - sum += qlp_coeff[ 3] * (FLAC__int64)data[i- 4]; - sum += qlp_coeff[ 2] * (FLAC__int64)data[i- 3]; - sum += qlp_coeff[ 1] * (FLAC__int64)data[i- 2]; - sum += qlp_coeff[ 0] * (FLAC__int64)data[i- 1]; - } - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } -} - -FLAC__SSE_TARGET("sse4.1") -void FLAC__lpc_restore_signal_wide_intrin_sse41(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]) -{ - int i; - __m128i cnt = _mm_cvtsi32_si128(lp_quantization); - - if (!data_len) - return; - - FLAC__ASSERT(order > 0); - FLAC__ASSERT(order <= 32); - FLAC__ASSERT(lp_quantization <= 32); /* there's no _mm_sra_epi64() so we have to use _mm_srl_epi64() */ - - if(order <= 12) { - if(order > 8) { /* order == 9, 10, 11, 12 */ - if(order > 10) { /* order == 11, 12 */ - __m128i qlp[6], dat[6]; - __m128i summ, temp; - qlp[0] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); // 0 0 q[1] q[0] - qlp[1] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); // 0 0 q[3] q[2] - qlp[2] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); // 0 0 q[5] q[4] - qlp[3] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+6)); // 0 0 q[7] q[6] - qlp[4] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+8)); // 0 0 q[9] q[8] - if (order == 12) - qlp[5] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+10)); // 0 0 q[11] q[10] - else - qlp[5] = _mm_cvtsi32_si128(qlp_coeff[10]); // 0 0 0 q[10] - - qlp[0] = _mm_shuffle_epi32(qlp[0], _MM_SHUFFLE(2,0,3,1)); // 0 q[0] 0 q[1] - qlp[1] = _mm_shuffle_epi32(qlp[1], _MM_SHUFFLE(2,0,3,1)); // 0 q[2] 0 q[3] - qlp[2] = _mm_shuffle_epi32(qlp[2], _MM_SHUFFLE(2,0,3,1)); // 0 q[4] 0 q[5] - qlp[3] = _mm_shuffle_epi32(qlp[3], _MM_SHUFFLE(2,0,3,1)); // 0 q[5] 0 q[7] - qlp[4] = _mm_shuffle_epi32(qlp[4], _MM_SHUFFLE(2,0,3,1)); // 0 q[8] 0 q[9] - qlp[5] = _mm_shuffle_epi32(qlp[5], _MM_SHUFFLE(2,0,3,1)); // 0 q[10] 0 q[11] - - dat[5] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-12))); // ? d[i-11] ? d[i-12] - dat[4] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-10))); // ? d[i-9] ? d[i-10] - dat[3] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-8 ))); // ? d[i-7] ? d[i-8] - dat[2] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-6 ))); // ? d[i-5] ? d[i-6] - dat[1] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-4 ))); // ? d[i-3] ? d[i-4] - dat[0] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-2 ))); // ? d[i-1] ? d[i-2] - - summ = _mm_mul_epi32(dat[5], qlp[5]) ; - summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[4], qlp[4])); - summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[3], qlp[3])); - summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[2], qlp[2])); - summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[1], qlp[1])); - summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[0], qlp[0])); - - summ = _mm_add_epi64(summ, _mm_srli_si128(summ, 8)); // ?_64 sum_64 - summ = _mm_srl_epi64(summ, cnt); // ?_64 (sum >> lp_quantization)_64 == ?_32 ?_32 ?_32 (sum >> lp_quantization)_32 - temp = _mm_cvtsi32_si128(residual[0]); // 0 0 0 r[i] - temp = _mm_add_epi32(temp, summ); // ? ? ? d[i] - data[0] = _mm_cvtsi128_si32(temp); - - for(i = 1; i < (int)data_len; i++) { - dat[5] = _mm_alignr_epi8(dat[4], dat[5], 8); // ? d[i-10] ? d[i-11] - dat[4] = _mm_alignr_epi8(dat[3], dat[4], 8); // ? d[i-8] ? d[i-9] - dat[3] = _mm_alignr_epi8(dat[2], dat[3], 8); // ? d[i-6] ? d[i-7] - dat[2] = _mm_alignr_epi8(dat[1], dat[2], 8); // ? d[i-4] ? d[i-5] - dat[1] = _mm_alignr_epi8(dat[0], dat[1], 8); // ? d[i-2] ? d[i-3] - dat[0] = _mm_alignr_epi8(temp, dat[0], 8); // ? d[i ] ? d[i-1] - - summ = _mm_mul_epi32(dat[5], qlp[5]) ; - summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[4], qlp[4])); - summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[3], qlp[3])); - summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[2], qlp[2])); - summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[1], qlp[1])); - summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[0], qlp[0])); - - summ = _mm_add_epi64(summ, _mm_srli_si128(summ, 8)); // ?_64 sum_64 - summ = _mm_srl_epi64(summ, cnt); // ?_64 (sum >> lp_quantization)_64 == ?_32 ?_32 ?_32 (sum >> lp_quantization)_32 - temp = _mm_cvtsi32_si128(residual[i]); // 0 0 0 r[i] - temp = _mm_add_epi32(temp, summ); // ? ? ? d[i] - data[i] = _mm_cvtsi128_si32(temp); - } - } - else { /* order == 9, 10 */ - __m128i qlp[5], dat[5]; - __m128i summ, temp; - qlp[0] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); - qlp[1] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); - qlp[2] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); - qlp[3] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+6)); - if (order == 10) - qlp[4] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+8)); - else - qlp[4] = _mm_cvtsi32_si128(qlp_coeff[8]); - - qlp[0] = _mm_shuffle_epi32(qlp[0], _MM_SHUFFLE(2,0,3,1)); - qlp[1] = _mm_shuffle_epi32(qlp[1], _MM_SHUFFLE(2,0,3,1)); - qlp[2] = _mm_shuffle_epi32(qlp[2], _MM_SHUFFLE(2,0,3,1)); - qlp[3] = _mm_shuffle_epi32(qlp[3], _MM_SHUFFLE(2,0,3,1)); - qlp[4] = _mm_shuffle_epi32(qlp[4], _MM_SHUFFLE(2,0,3,1)); - - dat[4] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-10))); - dat[3] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-8 ))); - dat[2] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-6 ))); - dat[1] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-4 ))); - dat[0] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-2 ))); - - summ = _mm_mul_epi32(dat[4], qlp[4]) ; - summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[3], qlp[3])); - summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[2], qlp[2])); - summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[1], qlp[1])); - summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[0], qlp[0])); - - summ = _mm_add_epi64(summ, _mm_srli_si128(summ, 8)); - summ = _mm_srl_epi64(summ, cnt); - temp = _mm_cvtsi32_si128(residual[0]); - temp = _mm_add_epi32(temp, summ); - data[0] = _mm_cvtsi128_si32(temp); - - for(i = 1; i < (int)data_len; i++) { - dat[4] = _mm_alignr_epi8(dat[3], dat[4], 8); - dat[3] = _mm_alignr_epi8(dat[2], dat[3], 8); - dat[2] = _mm_alignr_epi8(dat[1], dat[2], 8); - dat[1] = _mm_alignr_epi8(dat[0], dat[1], 8); - dat[0] = _mm_alignr_epi8(temp, dat[0], 8); - - summ = _mm_mul_epi32(dat[4], qlp[4]) ; - summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[3], qlp[3])); - summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[2], qlp[2])); - summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[1], qlp[1])); - summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[0], qlp[0])); - - summ = _mm_add_epi64(summ, _mm_srli_si128(summ, 8)); - summ = _mm_srl_epi64(summ, cnt); - temp = _mm_cvtsi32_si128(residual[i]); - temp = _mm_add_epi32(temp, summ); - data[i] = _mm_cvtsi128_si32(temp); - } - } - } - else if(order > 4) { /* order == 5, 6, 7, 8 */ - if(order > 6) { /* order == 7, 8 */ - __m128i qlp[4], dat[4]; - __m128i summ, temp; - qlp[0] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); - qlp[1] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); - qlp[2] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); - if (order == 8) - qlp[3] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+6)); - else - qlp[3] = _mm_cvtsi32_si128(qlp_coeff[6]); - - qlp[0] = _mm_shuffle_epi32(qlp[0], _MM_SHUFFLE(2,0,3,1)); - qlp[1] = _mm_shuffle_epi32(qlp[1], _MM_SHUFFLE(2,0,3,1)); - qlp[2] = _mm_shuffle_epi32(qlp[2], _MM_SHUFFLE(2,0,3,1)); - qlp[3] = _mm_shuffle_epi32(qlp[3], _MM_SHUFFLE(2,0,3,1)); - - dat[3] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-8 ))); - dat[2] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-6 ))); - dat[1] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-4 ))); - dat[0] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-2 ))); - - summ = _mm_mul_epi32(dat[3], qlp[3]) ; - summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[2], qlp[2])); - summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[1], qlp[1])); - summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[0], qlp[0])); - - summ = _mm_add_epi64(summ, _mm_srli_si128(summ, 8)); - summ = _mm_srl_epi64(summ, cnt); - temp = _mm_cvtsi32_si128(residual[0]); - temp = _mm_add_epi32(temp, summ); - data[0] = _mm_cvtsi128_si32(temp); - - for(i = 1; i < (int)data_len; i++) { - dat[3] = _mm_alignr_epi8(dat[2], dat[3], 8); - dat[2] = _mm_alignr_epi8(dat[1], dat[2], 8); - dat[1] = _mm_alignr_epi8(dat[0], dat[1], 8); - dat[0] = _mm_alignr_epi8(temp, dat[0], 8); - - summ = _mm_mul_epi32(dat[3], qlp[3]) ; - summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[2], qlp[2])); - summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[1], qlp[1])); - summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[0], qlp[0])); - - summ = _mm_add_epi64(summ, _mm_srli_si128(summ, 8)); - summ = _mm_srl_epi64(summ, cnt); - temp = _mm_cvtsi32_si128(residual[i]); - temp = _mm_add_epi32(temp, summ); - data[i] = _mm_cvtsi128_si32(temp); - } - } - else { /* order == 5, 6 */ - __m128i qlp[3], dat[3]; - __m128i summ, temp; - qlp[0] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); - qlp[1] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); - if (order == 6) - qlp[2] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+4)); - else - qlp[2] = _mm_cvtsi32_si128(qlp_coeff[4]); - - qlp[0] = _mm_shuffle_epi32(qlp[0], _MM_SHUFFLE(2,0,3,1)); - qlp[1] = _mm_shuffle_epi32(qlp[1], _MM_SHUFFLE(2,0,3,1)); - qlp[2] = _mm_shuffle_epi32(qlp[2], _MM_SHUFFLE(2,0,3,1)); - - dat[2] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-6 ))); - dat[1] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-4 ))); - dat[0] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-2 ))); - - summ = _mm_mul_epi32(dat[2], qlp[2]) ; - summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[1], qlp[1])); - summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[0], qlp[0])); - - summ = _mm_add_epi64(summ, _mm_srli_si128(summ, 8)); - summ = _mm_srl_epi64(summ, cnt); - temp = _mm_cvtsi32_si128(residual[0]); - temp = _mm_add_epi32(temp, summ); - data[0] = _mm_cvtsi128_si32(temp); - - for(i = 1; i < (int)data_len; i++) { - dat[2] = _mm_alignr_epi8(dat[1], dat[2], 8); - dat[1] = _mm_alignr_epi8(dat[0], dat[1], 8); - dat[0] = _mm_alignr_epi8(temp, dat[0], 8); - - summ = _mm_mul_epi32(dat[2], qlp[2]) ; - summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[1], qlp[1])); - summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[0], qlp[0])); - - summ = _mm_add_epi64(summ, _mm_srli_si128(summ, 8)); - summ = _mm_srl_epi64(summ, cnt); - temp = _mm_cvtsi32_si128(residual[i]); - temp = _mm_add_epi32(temp, summ); - data[i] = _mm_cvtsi128_si32(temp); - } - } - } - else { /* order == 1, 2, 3, 4 */ - if(order > 2) { /* order == 3, 4 */ - __m128i qlp[2], dat[2]; - __m128i summ, temp; - qlp[0] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+0)); - if (order == 4) - qlp[1] = _mm_loadl_epi64((const __m128i*)(qlp_coeff+2)); - else - qlp[1] = _mm_cvtsi32_si128(qlp_coeff[2]); - - qlp[0] = _mm_shuffle_epi32(qlp[0], _MM_SHUFFLE(2,0,3,1)); - qlp[1] = _mm_shuffle_epi32(qlp[1], _MM_SHUFFLE(2,0,3,1)); - - dat[1] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-4 ))); - dat[0] = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-2 ))); - - summ = _mm_mul_epi32(dat[1], qlp[1]) ; - summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[0], qlp[0])); - - summ = _mm_add_epi64(summ, _mm_srli_si128(summ, 8)); - summ = _mm_srl_epi64(summ, cnt); - temp = _mm_cvtsi32_si128(residual[0]); - temp = _mm_add_epi32(temp, summ); - data[0] = _mm_cvtsi128_si32(temp); - - for(i = 1; i < (int)data_len; i++) { - dat[1] = _mm_alignr_epi8(dat[0], dat[1], 8); - dat[0] = _mm_alignr_epi8(temp, dat[0], 8); - - summ = _mm_mul_epi32(dat[1], qlp[1]) ; - summ = _mm_add_epi64(summ, _mm_mul_epi32(dat[0], qlp[0])); - - summ = _mm_add_epi64(summ, _mm_srli_si128(summ, 8)); - summ = _mm_srl_epi64(summ, cnt); - temp = _mm_cvtsi32_si128(residual[i]); - temp = _mm_add_epi32(temp, summ); - data[i] = _mm_cvtsi128_si32(temp); - } - } - else { /* order == 1, 2 */ - if(order == 2) { - __m128i qlp0, dat0; - __m128i summ, temp; - qlp0 = _mm_loadl_epi64((const __m128i*)(qlp_coeff)); - qlp0 = _mm_shuffle_epi32(qlp0, _MM_SHUFFLE(2,0,3,1)); - - dat0 = _mm_cvtepu32_epi64(_mm_loadl_epi64((const __m128i*)(data-2 ))); - - summ = _mm_mul_epi32(dat0, qlp0) ; - - summ = _mm_add_epi64(summ, _mm_srli_si128(summ, 8)); - summ = _mm_srl_epi64(summ, cnt); - temp = _mm_cvtsi32_si128(residual[0]); - temp = _mm_add_epi32(temp, summ); - data[0] = _mm_cvtsi128_si32(temp); - - for(i = 1; i < (int)data_len; i++) { - dat0 = _mm_alignr_epi8(temp, dat0, 8); - - summ = _mm_mul_epi32(dat0, qlp0) ; - - summ = _mm_add_epi64(summ, _mm_srli_si128(summ, 8)); - summ = _mm_srl_epi64(summ, cnt); - temp = _mm_cvtsi32_si128(residual[i]); - temp = _mm_add_epi32(temp, summ); - data[i] = _mm_cvtsi128_si32(temp); - } - } - else { /* order == 1 */ - __m128i qlp0; - __m128i summ, temp; - qlp0 = _mm_cvtsi32_si128(qlp_coeff[0]); - temp = _mm_cvtsi32_si128(data[-1]); - - summ = _mm_mul_epi32(temp, qlp0); - summ = _mm_srl_epi64(summ, cnt); - temp = _mm_cvtsi32_si128(residual[0]); - temp = _mm_add_epi32(temp, summ); - data[0] = _mm_cvtsi128_si32(temp); - - for(i = 1; i < (int)data_len; i++) { - summ = _mm_mul_epi32(temp, qlp0) ; - summ = _mm_srl_epi64(summ, cnt); - temp = _mm_cvtsi32_si128(residual[i]); - temp = _mm_add_epi32(temp, summ); - data[i] = _mm_cvtsi128_si32(temp); - } - } - } - } - } - else { /* order > 12 */ - FLAC__int64 sum; - for(i = 0; i < (int)data_len; i++) { - sum = 0; - switch(order) { - case 32: sum += qlp_coeff[31] * (FLAC__int64)data[i-32]; - case 31: sum += qlp_coeff[30] * (FLAC__int64)data[i-31]; - case 30: sum += qlp_coeff[29] * (FLAC__int64)data[i-30]; - case 29: sum += qlp_coeff[28] * (FLAC__int64)data[i-29]; - case 28: sum += qlp_coeff[27] * (FLAC__int64)data[i-28]; - case 27: sum += qlp_coeff[26] * (FLAC__int64)data[i-27]; - case 26: sum += qlp_coeff[25] * (FLAC__int64)data[i-26]; - case 25: sum += qlp_coeff[24] * (FLAC__int64)data[i-25]; - case 24: sum += qlp_coeff[23] * (FLAC__int64)data[i-24]; - case 23: sum += qlp_coeff[22] * (FLAC__int64)data[i-23]; - case 22: sum += qlp_coeff[21] * (FLAC__int64)data[i-22]; - case 21: sum += qlp_coeff[20] * (FLAC__int64)data[i-21]; - case 20: sum += qlp_coeff[19] * (FLAC__int64)data[i-20]; - case 19: sum += qlp_coeff[18] * (FLAC__int64)data[i-19]; - case 18: sum += qlp_coeff[17] * (FLAC__int64)data[i-18]; - case 17: sum += qlp_coeff[16] * (FLAC__int64)data[i-17]; - case 16: sum += qlp_coeff[15] * (FLAC__int64)data[i-16]; - case 15: sum += qlp_coeff[14] * (FLAC__int64)data[i-15]; - case 14: sum += qlp_coeff[13] * (FLAC__int64)data[i-14]; - case 13: sum += qlp_coeff[12] * (FLAC__int64)data[i-13]; - sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; - sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; - sum += qlp_coeff[ 9] * (FLAC__int64)data[i-10]; - sum += qlp_coeff[ 8] * (FLAC__int64)data[i- 9]; - sum += qlp_coeff[ 7] * (FLAC__int64)data[i- 8]; - sum += qlp_coeff[ 6] * (FLAC__int64)data[i- 7]; - sum += qlp_coeff[ 5] * (FLAC__int64)data[i- 6]; - sum += qlp_coeff[ 4] * (FLAC__int64)data[i- 5]; - sum += qlp_coeff[ 3] * (FLAC__int64)data[i- 4]; - sum += qlp_coeff[ 2] * (FLAC__int64)data[i- 3]; - sum += qlp_coeff[ 1] * (FLAC__int64)data[i- 2]; - sum += qlp_coeff[ 0] * (FLAC__int64)data[i- 1]; - } - data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); - } - } -} - -#endif /* defined FLAC__CPU_IA32 */ - -FLAC__SSE_TARGET("sse4.1") -void FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_sse41(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]) -{ - int i; - FLAC__int32 sum; - __m128i cnt = _mm_cvtsi32_si128(lp_quantization); - - FLAC__ASSERT(order > 0); - FLAC__ASSERT(order <= 32); - - if(order <= 12) { - if(order > 8) { - if(order > 10) { - if(order == 12) { - __m128i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10, q11; - q0 = _mm_cvtsi32_si128(qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); - q1 = _mm_cvtsi32_si128(qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); - q2 = _mm_cvtsi32_si128(qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); - q3 = _mm_cvtsi32_si128(qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); - q4 = _mm_cvtsi32_si128(qlp_coeff[4]); q4 = _mm_shuffle_epi32(q4, _MM_SHUFFLE(0,0,0,0)); - q5 = _mm_cvtsi32_si128(qlp_coeff[5]); q5 = _mm_shuffle_epi32(q5, _MM_SHUFFLE(0,0,0,0)); - q6 = _mm_cvtsi32_si128(qlp_coeff[6]); q6 = _mm_shuffle_epi32(q6, _MM_SHUFFLE(0,0,0,0)); - q7 = _mm_cvtsi32_si128(qlp_coeff[7]); q7 = _mm_shuffle_epi32(q7, _MM_SHUFFLE(0,0,0,0)); - q8 = _mm_cvtsi32_si128(qlp_coeff[8]); q8 = _mm_shuffle_epi32(q8, _MM_SHUFFLE(0,0,0,0)); - q9 = _mm_cvtsi32_si128(qlp_coeff[9]); q9 = _mm_shuffle_epi32(q9, _MM_SHUFFLE(0,0,0,0)); - q10 = _mm_cvtsi32_si128(qlp_coeff[10]); q10 = _mm_shuffle_epi32(q10, _MM_SHUFFLE(0,0,0,0)); - q11 = _mm_cvtsi32_si128(qlp_coeff[11]); q11 = _mm_shuffle_epi32(q11, _MM_SHUFFLE(0,0,0,0)); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m128i summ, mull; - summ = _mm_mullo_epi32(q11, _mm_loadu_si128((const __m128i*)(data+i-12))); - mull = _mm_mullo_epi32(q10, _mm_loadu_si128((const __m128i*)(data+i-11))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q9, _mm_loadu_si128((const __m128i*)(data+i-10))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q8, _mm_loadu_si128((const __m128i*)(data+i-9))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q7, _mm_loadu_si128((const __m128i*)(data+i-8))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q6, _mm_loadu_si128((const __m128i*)(data+i-7))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q5, _mm_loadu_si128((const __m128i*)(data+i-6))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q4, _mm_loadu_si128((const __m128i*)(data+i-5))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); - summ = _mm_sra_epi32(summ, cnt); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); - } - } - else { /* order == 11 */ - __m128i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10; - q0 = _mm_cvtsi32_si128(qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); - q1 = _mm_cvtsi32_si128(qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); - q2 = _mm_cvtsi32_si128(qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); - q3 = _mm_cvtsi32_si128(qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); - q4 = _mm_cvtsi32_si128(qlp_coeff[4]); q4 = _mm_shuffle_epi32(q4, _MM_SHUFFLE(0,0,0,0)); - q5 = _mm_cvtsi32_si128(qlp_coeff[5]); q5 = _mm_shuffle_epi32(q5, _MM_SHUFFLE(0,0,0,0)); - q6 = _mm_cvtsi32_si128(qlp_coeff[6]); q6 = _mm_shuffle_epi32(q6, _MM_SHUFFLE(0,0,0,0)); - q7 = _mm_cvtsi32_si128(qlp_coeff[7]); q7 = _mm_shuffle_epi32(q7, _MM_SHUFFLE(0,0,0,0)); - q8 = _mm_cvtsi32_si128(qlp_coeff[8]); q8 = _mm_shuffle_epi32(q8, _MM_SHUFFLE(0,0,0,0)); - q9 = _mm_cvtsi32_si128(qlp_coeff[9]); q9 = _mm_shuffle_epi32(q9, _MM_SHUFFLE(0,0,0,0)); - q10 = _mm_cvtsi32_si128(qlp_coeff[10]); q10 = _mm_shuffle_epi32(q10, _MM_SHUFFLE(0,0,0,0)); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m128i summ, mull; - summ = _mm_mullo_epi32(q10, _mm_loadu_si128((const __m128i*)(data+i-11))); - mull = _mm_mullo_epi32(q9, _mm_loadu_si128((const __m128i*)(data+i-10))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q8, _mm_loadu_si128((const __m128i*)(data+i-9))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q7, _mm_loadu_si128((const __m128i*)(data+i-8))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q6, _mm_loadu_si128((const __m128i*)(data+i-7))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q5, _mm_loadu_si128((const __m128i*)(data+i-6))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q4, _mm_loadu_si128((const __m128i*)(data+i-5))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); - summ = _mm_sra_epi32(summ, cnt); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); - } - } - } - else { - if(order == 10) { - __m128i q0, q1, q2, q3, q4, q5, q6, q7, q8, q9; - q0 = _mm_cvtsi32_si128(qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); - q1 = _mm_cvtsi32_si128(qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); - q2 = _mm_cvtsi32_si128(qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); - q3 = _mm_cvtsi32_si128(qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); - q4 = _mm_cvtsi32_si128(qlp_coeff[4]); q4 = _mm_shuffle_epi32(q4, _MM_SHUFFLE(0,0,0,0)); - q5 = _mm_cvtsi32_si128(qlp_coeff[5]); q5 = _mm_shuffle_epi32(q5, _MM_SHUFFLE(0,0,0,0)); - q6 = _mm_cvtsi32_si128(qlp_coeff[6]); q6 = _mm_shuffle_epi32(q6, _MM_SHUFFLE(0,0,0,0)); - q7 = _mm_cvtsi32_si128(qlp_coeff[7]); q7 = _mm_shuffle_epi32(q7, _MM_SHUFFLE(0,0,0,0)); - q8 = _mm_cvtsi32_si128(qlp_coeff[8]); q8 = _mm_shuffle_epi32(q8, _MM_SHUFFLE(0,0,0,0)); - q9 = _mm_cvtsi32_si128(qlp_coeff[9]); q9 = _mm_shuffle_epi32(q9, _MM_SHUFFLE(0,0,0,0)); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m128i summ, mull; - summ = _mm_mullo_epi32(q9, _mm_loadu_si128((const __m128i*)(data+i-10))); - mull = _mm_mullo_epi32(q8, _mm_loadu_si128((const __m128i*)(data+i-9))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q7, _mm_loadu_si128((const __m128i*)(data+i-8))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q6, _mm_loadu_si128((const __m128i*)(data+i-7))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q5, _mm_loadu_si128((const __m128i*)(data+i-6))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q4, _mm_loadu_si128((const __m128i*)(data+i-5))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); - summ = _mm_sra_epi32(summ, cnt); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); - } - } - else { /* order == 9 */ - __m128i q0, q1, q2, q3, q4, q5, q6, q7, q8; - q0 = _mm_cvtsi32_si128(qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); - q1 = _mm_cvtsi32_si128(qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); - q2 = _mm_cvtsi32_si128(qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); - q3 = _mm_cvtsi32_si128(qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); - q4 = _mm_cvtsi32_si128(qlp_coeff[4]); q4 = _mm_shuffle_epi32(q4, _MM_SHUFFLE(0,0,0,0)); - q5 = _mm_cvtsi32_si128(qlp_coeff[5]); q5 = _mm_shuffle_epi32(q5, _MM_SHUFFLE(0,0,0,0)); - q6 = _mm_cvtsi32_si128(qlp_coeff[6]); q6 = _mm_shuffle_epi32(q6, _MM_SHUFFLE(0,0,0,0)); - q7 = _mm_cvtsi32_si128(qlp_coeff[7]); q7 = _mm_shuffle_epi32(q7, _MM_SHUFFLE(0,0,0,0)); - q8 = _mm_cvtsi32_si128(qlp_coeff[8]); q8 = _mm_shuffle_epi32(q8, _MM_SHUFFLE(0,0,0,0)); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m128i summ, mull; - summ = _mm_mullo_epi32(q8, _mm_loadu_si128((const __m128i*)(data+i-9))); - mull = _mm_mullo_epi32(q7, _mm_loadu_si128((const __m128i*)(data+i-8))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q6, _mm_loadu_si128((const __m128i*)(data+i-7))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q5, _mm_loadu_si128((const __m128i*)(data+i-6))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q4, _mm_loadu_si128((const __m128i*)(data+i-5))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); - summ = _mm_sra_epi32(summ, cnt); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); - } - } - } - } - else if(order > 4) { - if(order > 6) { - if(order == 8) { - __m128i q0, q1, q2, q3, q4, q5, q6, q7; - q0 = _mm_cvtsi32_si128(qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); - q1 = _mm_cvtsi32_si128(qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); - q2 = _mm_cvtsi32_si128(qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); - q3 = _mm_cvtsi32_si128(qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); - q4 = _mm_cvtsi32_si128(qlp_coeff[4]); q4 = _mm_shuffle_epi32(q4, _MM_SHUFFLE(0,0,0,0)); - q5 = _mm_cvtsi32_si128(qlp_coeff[5]); q5 = _mm_shuffle_epi32(q5, _MM_SHUFFLE(0,0,0,0)); - q6 = _mm_cvtsi32_si128(qlp_coeff[6]); q6 = _mm_shuffle_epi32(q6, _MM_SHUFFLE(0,0,0,0)); - q7 = _mm_cvtsi32_si128(qlp_coeff[7]); q7 = _mm_shuffle_epi32(q7, _MM_SHUFFLE(0,0,0,0)); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m128i summ, mull; - summ = _mm_mullo_epi32(q7, _mm_loadu_si128((const __m128i*)(data+i-8))); - mull = _mm_mullo_epi32(q6, _mm_loadu_si128((const __m128i*)(data+i-7))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q5, _mm_loadu_si128((const __m128i*)(data+i-6))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q4, _mm_loadu_si128((const __m128i*)(data+i-5))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); - summ = _mm_sra_epi32(summ, cnt); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); - } - } - else { /* order == 7 */ - __m128i q0, q1, q2, q3, q4, q5, q6; - q0 = _mm_cvtsi32_si128(qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); - q1 = _mm_cvtsi32_si128(qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); - q2 = _mm_cvtsi32_si128(qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); - q3 = _mm_cvtsi32_si128(qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); - q4 = _mm_cvtsi32_si128(qlp_coeff[4]); q4 = _mm_shuffle_epi32(q4, _MM_SHUFFLE(0,0,0,0)); - q5 = _mm_cvtsi32_si128(qlp_coeff[5]); q5 = _mm_shuffle_epi32(q5, _MM_SHUFFLE(0,0,0,0)); - q6 = _mm_cvtsi32_si128(qlp_coeff[6]); q6 = _mm_shuffle_epi32(q6, _MM_SHUFFLE(0,0,0,0)); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m128i summ, mull; - summ = _mm_mullo_epi32(q6, _mm_loadu_si128((const __m128i*)(data+i-7))); - mull = _mm_mullo_epi32(q5, _mm_loadu_si128((const __m128i*)(data+i-6))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q4, _mm_loadu_si128((const __m128i*)(data+i-5))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); - summ = _mm_sra_epi32(summ, cnt); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); - } - } - } - else { - if(order == 6) { - __m128i q0, q1, q2, q3, q4, q5; - q0 = _mm_cvtsi32_si128(qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); - q1 = _mm_cvtsi32_si128(qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); - q2 = _mm_cvtsi32_si128(qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); - q3 = _mm_cvtsi32_si128(qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); - q4 = _mm_cvtsi32_si128(qlp_coeff[4]); q4 = _mm_shuffle_epi32(q4, _MM_SHUFFLE(0,0,0,0)); - q5 = _mm_cvtsi32_si128(qlp_coeff[5]); q5 = _mm_shuffle_epi32(q5, _MM_SHUFFLE(0,0,0,0)); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m128i summ, mull; - summ = _mm_mullo_epi32(q5, _mm_loadu_si128((const __m128i*)(data+i-6))); - mull = _mm_mullo_epi32(q4, _mm_loadu_si128((const __m128i*)(data+i-5))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); - summ = _mm_sra_epi32(summ, cnt); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); - } - } - else { /* order == 5 */ - __m128i q0, q1, q2, q3, q4; - q0 = _mm_cvtsi32_si128(qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); - q1 = _mm_cvtsi32_si128(qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); - q2 = _mm_cvtsi32_si128(qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); - q3 = _mm_cvtsi32_si128(qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); - q4 = _mm_cvtsi32_si128(qlp_coeff[4]); q4 = _mm_shuffle_epi32(q4, _MM_SHUFFLE(0,0,0,0)); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m128i summ, mull; - summ = _mm_mullo_epi32(q4, _mm_loadu_si128((const __m128i*)(data+i-5))); - mull = _mm_mullo_epi32(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); - summ = _mm_sra_epi32(summ, cnt); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); - } - } - } - } - else { - if(order > 2) { - if(order == 4) { - __m128i q0, q1, q2, q3; - q0 = _mm_cvtsi32_si128(qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); - q1 = _mm_cvtsi32_si128(qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); - q2 = _mm_cvtsi32_si128(qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); - q3 = _mm_cvtsi32_si128(qlp_coeff[3]); q3 = _mm_shuffle_epi32(q3, _MM_SHUFFLE(0,0,0,0)); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m128i summ, mull; - summ = _mm_mullo_epi32(q3, _mm_loadu_si128((const __m128i*)(data+i-4))); - mull = _mm_mullo_epi32(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); - summ = _mm_sra_epi32(summ, cnt); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); - } - } - else { /* order == 3 */ - __m128i q0, q1, q2; - q0 = _mm_cvtsi32_si128(qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); - q1 = _mm_cvtsi32_si128(qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); - q2 = _mm_cvtsi32_si128(qlp_coeff[2]); q2 = _mm_shuffle_epi32(q2, _MM_SHUFFLE(0,0,0,0)); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m128i summ, mull; - summ = _mm_mullo_epi32(q2, _mm_loadu_si128((const __m128i*)(data+i-3))); - mull = _mm_mullo_epi32(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); summ = _mm_add_epi32(summ, mull); - mull = _mm_mullo_epi32(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); - summ = _mm_sra_epi32(summ, cnt); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); - } - } - } - else { - if(order == 2) { - __m128i q0, q1; - q0 = _mm_cvtsi32_si128(qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); - q1 = _mm_cvtsi32_si128(qlp_coeff[1]); q1 = _mm_shuffle_epi32(q1, _MM_SHUFFLE(0,0,0,0)); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m128i summ, mull; - summ = _mm_mullo_epi32(q1, _mm_loadu_si128((const __m128i*)(data+i-2))); - mull = _mm_mullo_epi32(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); summ = _mm_add_epi32(summ, mull); - summ = _mm_sra_epi32(summ, cnt); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); - } - } - else { /* order == 1 */ - __m128i q0; - q0 = _mm_cvtsi32_si128(qlp_coeff[0]); q0 = _mm_shuffle_epi32(q0, _MM_SHUFFLE(0,0,0,0)); - - for(i = 0; i < (int)data_len-3; i+=4) { - __m128i summ; - summ = _mm_mullo_epi32(q0, _mm_loadu_si128((const __m128i*)(data+i-1))); - summ = _mm_sra_epi32(summ, cnt); - _mm_storeu_si128((__m128i*)(residual+i), _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(data+i)), summ)); - } - } - } - } - for(; i < (int)data_len; i++) { - sum = 0; - switch(order) { - case 12: sum += qlp_coeff[11] * data[i-12]; - case 11: sum += qlp_coeff[10] * data[i-11]; - case 10: sum += qlp_coeff[ 9] * data[i-10]; - case 9: sum += qlp_coeff[ 8] * data[i- 9]; - case 8: sum += qlp_coeff[ 7] * data[i- 8]; - case 7: sum += qlp_coeff[ 6] * data[i- 7]; - case 6: sum += qlp_coeff[ 5] * data[i- 6]; - case 5: sum += qlp_coeff[ 4] * data[i- 5]; - case 4: sum += qlp_coeff[ 3] * data[i- 4]; - case 3: sum += qlp_coeff[ 2] * data[i- 3]; - case 2: sum += qlp_coeff[ 1] * data[i- 2]; - case 1: sum += qlp_coeff[ 0] * data[i- 1]; - } - residual[i] = data[i] - (sum >> lp_quantization); - } - } - else { /* order > 12 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - switch(order) { - case 32: sum += qlp_coeff[31] * data[i-32]; - case 31: sum += qlp_coeff[30] * data[i-31]; - case 30: sum += qlp_coeff[29] * data[i-30]; - case 29: sum += qlp_coeff[28] * data[i-29]; - case 28: sum += qlp_coeff[27] * data[i-28]; - case 27: sum += qlp_coeff[26] * data[i-27]; - case 26: sum += qlp_coeff[25] * data[i-26]; - case 25: sum += qlp_coeff[24] * data[i-25]; - case 24: sum += qlp_coeff[23] * data[i-24]; - case 23: sum += qlp_coeff[22] * data[i-23]; - case 22: sum += qlp_coeff[21] * data[i-22]; - case 21: sum += qlp_coeff[20] * data[i-21]; - case 20: sum += qlp_coeff[19] * data[i-20]; - case 19: sum += qlp_coeff[18] * data[i-19]; - case 18: sum += qlp_coeff[17] * data[i-18]; - case 17: sum += qlp_coeff[16] * data[i-17]; - case 16: sum += qlp_coeff[15] * data[i-16]; - case 15: sum += qlp_coeff[14] * data[i-15]; - case 14: sum += qlp_coeff[13] * data[i-14]; - case 13: sum += qlp_coeff[12] * data[i-13]; - sum += qlp_coeff[11] * data[i-12]; - sum += qlp_coeff[10] * data[i-11]; - sum += qlp_coeff[ 9] * data[i-10]; - sum += qlp_coeff[ 8] * data[i- 9]; - sum += qlp_coeff[ 7] * data[i- 8]; - sum += qlp_coeff[ 6] * data[i- 7]; - sum += qlp_coeff[ 5] * data[i- 6]; - sum += qlp_coeff[ 4] * data[i- 5]; - sum += qlp_coeff[ 3] * data[i- 4]; - sum += qlp_coeff[ 2] * data[i- 3]; - sum += qlp_coeff[ 1] * data[i- 2]; - sum += qlp_coeff[ 0] * data[i- 1]; - } - residual[i] = data[i] - (sum >> lp_quantization); - } - } -} - -#endif /* FLAC__SSE4_1_SUPPORTED */ -#endif /* (FLAC__CPU_IA32 || FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN */ -#endif /* FLAC__NO_ASM */ -#endif /* FLAC__INTEGER_ONLY_LIBRARY */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/md5.c b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/md5.c deleted file mode 100644 index e5adc3e3..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/md5.c +++ /dev/null @@ -1,518 +0,0 @@ -#ifdef HAVE_CONFIG_H -# include -#endif - -#include /* for malloc() */ -#include /* for memcpy() */ - -#include "private/md5.h" -#include "share/alloc.h" -#include "share/endswap.h" - -/* - * This code implements the MD5 message-digest algorithm. - * The algorithm is due to Ron Rivest. This code was - * written by Colin Plumb in 1993, no copyright is claimed. - * This code is in the public domain; do with it what you wish. - * - * Equivalent code is available from RSA Data Security, Inc. - * This code has been tested against that, and is equivalent, - * except that you don't need to include two pages of legalese - * with every copy. - * - * To compute the message digest of a chunk of bytes, declare an - * MD5Context structure, pass it to MD5Init, call MD5Update as - * needed on buffers full of bytes, and then call MD5Final, which - * will fill a supplied 16-byte array with the digest. - * - * Changed so as no longer to depend on Colin Plumb's `usual.h' header - * definitions; now uses stuff from dpkg's config.h. - * - Ian Jackson . - * Still in the public domain. - * - * Josh Coalson: made some changes to integrate with libFLAC. - * Still in the public domain. - */ - -/* The four core functions - F1 is optimized somewhat */ - -/* #define F1(x, y, z) (x & y | ~x & z) */ -#define F1(x, y, z) (z ^ (x & (y ^ z))) -#define F2(x, y, z) F1(z, x, y) -#define F3(x, y, z) (x ^ y ^ z) -#define F4(x, y, z) (y ^ (x | ~z)) - -/* This is the central step in the MD5 algorithm. */ -#define MD5STEP(f,w,x,y,z,in,s) \ - (w += f(x,y,z) + in, w = (w<>(32-s)) + x) - -/* - * The core of the MD5 algorithm, this alters an existing MD5 hash to - * reflect the addition of 16 longwords of new data. MD5Update blocks - * the data and converts bytes into longwords for this routine. - */ -static void FLAC__MD5Transform(FLAC__uint32 buf[4], FLAC__uint32 const in[16]) -{ - register FLAC__uint32 a, b, c, d; - - a = buf[0]; - b = buf[1]; - c = buf[2]; - d = buf[3]; - - MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); - MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); - MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); - MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); - MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); - MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); - MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); - MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); - MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); - MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); - MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); - MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); - MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); - MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); - MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); - MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); - - MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); - MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); - MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); - MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); - MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); - MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); - MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); - MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); - MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); - MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); - MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); - MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); - MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); - MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); - MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); - MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); - - MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); - MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); - MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); - MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); - MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); - MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); - MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); - MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); - MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); - MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); - MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); - MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); - MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); - MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); - MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); - MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); - - MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); - MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); - MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); - MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); - MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); - MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); - MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); - MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); - MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); - MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); - MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); - MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); - MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); - MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); - MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); - MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); - - buf[0] += a; - buf[1] += b; - buf[2] += c; - buf[3] += d; -} - -#if WORDS_BIGENDIAN -//@@@@@@ OPT: use bswap/intrinsics -static void byteSwap(FLAC__uint32 *buf, unsigned words) -{ - register FLAC__uint32 x; - do { - x = *buf; - x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); - *buf++ = (x >> 16) | (x << 16); - } while (--words); -} -static void byteSwapX16(FLAC__uint32 *buf) -{ - register FLAC__uint32 x; - - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf = (x >> 16) | (x << 16); -} -#else -#define byteSwap(buf, words) -#define byteSwapX16(buf) -#endif - -/* - * Update context to reflect the concatenation of another buffer full - * of bytes. - */ -static void FLAC__MD5Update(FLAC__MD5Context *ctx, FLAC__byte const *buf, unsigned len) -{ - FLAC__uint32 t; - - /* Update byte count */ - - t = ctx->bytes[0]; - if ((ctx->bytes[0] = t + len) < t) - ctx->bytes[1]++; /* Carry from low to high */ - - t = 64 - (t & 0x3f); /* Space available in ctx->in (at least 1) */ - if (t > len) { - memcpy((FLAC__byte *)ctx->in + 64 - t, buf, len); - return; - } - /* First chunk is an odd size */ - memcpy((FLAC__byte *)ctx->in + 64 - t, buf, t); - byteSwapX16(ctx->in); - FLAC__MD5Transform(ctx->buf, ctx->in); - buf += t; - len -= t; - - /* Process data in 64-byte chunks */ - while (len >= 64) { - memcpy(ctx->in, buf, 64); - byteSwapX16(ctx->in); - FLAC__MD5Transform(ctx->buf, ctx->in); - buf += 64; - len -= 64; - } - - /* Handle any remaining bytes of data. */ - memcpy(ctx->in, buf, len); -} - -/* - * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious - * initialization constants. - */ -void FLAC__MD5Init(FLAC__MD5Context *ctx) -{ - ctx->buf[0] = 0x67452301; - ctx->buf[1] = 0xefcdab89; - ctx->buf[2] = 0x98badcfe; - ctx->buf[3] = 0x10325476; - - ctx->bytes[0] = 0; - ctx->bytes[1] = 0; - - ctx->internal_buf.p8= 0; - ctx->capacity = 0; -} - -/* - * Final wrapup - pad to 64-byte boundary with the bit pattern - * 1 0* (64-bit count of bits processed, MSB-first) - */ -void FLAC__MD5Final(FLAC__byte digest[16], FLAC__MD5Context *ctx) -{ - int count = ctx->bytes[0] & 0x3f; /* Number of bytes in ctx->in */ - FLAC__byte *p = (FLAC__byte *)ctx->in + count; - - /* Set the first char of padding to 0x80. There is always room. */ - *p++ = 0x80; - - /* Bytes of padding needed to make 56 bytes (-8..55) */ - count = 56 - 1 - count; - - if (count < 0) { /* Padding forces an extra block */ - memset(p, 0, count + 8); - byteSwapX16(ctx->in); - FLAC__MD5Transform(ctx->buf, ctx->in); - p = (FLAC__byte *)ctx->in; - count = 56; - } - memset(p, 0, count); - byteSwap(ctx->in, 14); - - /* Append length in bits and transform */ - ctx->in[14] = ctx->bytes[0] << 3; - ctx->in[15] = ctx->bytes[1] << 3 | ctx->bytes[0] >> 29; - FLAC__MD5Transform(ctx->buf, ctx->in); - - byteSwap(ctx->buf, 4); - memcpy(digest, ctx->buf, 16); - if (0 != ctx->internal_buf.p8) { - free(ctx->internal_buf.p8); - ctx->internal_buf.p8= 0; - ctx->capacity = 0; - } - memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */ -} - -/* - * Convert the incoming audio signal to a byte stream - */ -static void format_input_(FLAC__multibyte *mbuf, const FLAC__int32 * const signal[], unsigned channels, unsigned samples, unsigned bytes_per_sample) -{ - FLAC__byte *buf_ = mbuf->p8; - FLAC__int16 *buf16 = mbuf->p16; - FLAC__int32 *buf32 = mbuf->p32; - FLAC__int32 a_word; - unsigned channel, sample; - - /* Storage in the output buffer, buf, is little endian. */ - -#define BYTES_CHANNEL_SELECTOR(bytes, channels) (bytes * 100 + channels) - - /* First do the most commonly used combinations. */ - switch (BYTES_CHANNEL_SELECTOR (bytes_per_sample, channels)) { - /* One byte per sample. */ - case (BYTES_CHANNEL_SELECTOR (1, 1)): - for (sample = 0; sample < samples; sample++) - *buf_++ = signal[0][sample]; - return; - - case (BYTES_CHANNEL_SELECTOR (1, 2)): - for (sample = 0; sample < samples; sample++) { - *buf_++ = signal[0][sample]; - *buf_++ = signal[1][sample]; - } - return; - - case (BYTES_CHANNEL_SELECTOR (1, 4)): - for (sample = 0; sample < samples; sample++) { - *buf_++ = signal[0][sample]; - *buf_++ = signal[1][sample]; - *buf_++ = signal[2][sample]; - *buf_++ = signal[3][sample]; - } - return; - - case (BYTES_CHANNEL_SELECTOR (1, 6)): - for (sample = 0; sample < samples; sample++) { - *buf_++ = signal[0][sample]; - *buf_++ = signal[1][sample]; - *buf_++ = signal[2][sample]; - *buf_++ = signal[3][sample]; - *buf_++ = signal[4][sample]; - *buf_++ = signal[5][sample]; - } - return; - - case (BYTES_CHANNEL_SELECTOR (1, 8)): - for (sample = 0; sample < samples; sample++) { - *buf_++ = signal[0][sample]; - *buf_++ = signal[1][sample]; - *buf_++ = signal[2][sample]; - *buf_++ = signal[3][sample]; - *buf_++ = signal[4][sample]; - *buf_++ = signal[5][sample]; - *buf_++ = signal[6][sample]; - *buf_++ = signal[7][sample]; - } - return; - - /* Two bytes per sample. */ - case (BYTES_CHANNEL_SELECTOR (2, 1)): - for (sample = 0; sample < samples; sample++) - *buf16++ = H2LE_16(signal[0][sample]); - return; - - case (BYTES_CHANNEL_SELECTOR (2, 2)): - for (sample = 0; sample < samples; sample++) { - *buf16++ = H2LE_16(signal[0][sample]); - *buf16++ = H2LE_16(signal[1][sample]); - } - return; - - case (BYTES_CHANNEL_SELECTOR (2, 4)): - for (sample = 0; sample < samples; sample++) { - *buf16++ = H2LE_16(signal[0][sample]); - *buf16++ = H2LE_16(signal[1][sample]); - *buf16++ = H2LE_16(signal[2][sample]); - *buf16++ = H2LE_16(signal[3][sample]); - } - return; - - case (BYTES_CHANNEL_SELECTOR (2, 6)): - for (sample = 0; sample < samples; sample++) { - *buf16++ = H2LE_16(signal[0][sample]); - *buf16++ = H2LE_16(signal[1][sample]); - *buf16++ = H2LE_16(signal[2][sample]); - *buf16++ = H2LE_16(signal[3][sample]); - *buf16++ = H2LE_16(signal[4][sample]); - *buf16++ = H2LE_16(signal[5][sample]); - } - return; - - case (BYTES_CHANNEL_SELECTOR (2, 8)): - for (sample = 0; sample < samples; sample++) { - *buf16++ = H2LE_16(signal[0][sample]); - *buf16++ = H2LE_16(signal[1][sample]); - *buf16++ = H2LE_16(signal[2][sample]); - *buf16++ = H2LE_16(signal[3][sample]); - *buf16++ = H2LE_16(signal[4][sample]); - *buf16++ = H2LE_16(signal[5][sample]); - *buf16++ = H2LE_16(signal[6][sample]); - *buf16++ = H2LE_16(signal[7][sample]); - } - return; - - /* Three bytes per sample. */ - case (BYTES_CHANNEL_SELECTOR (3, 1)): - for (sample = 0; sample < samples; sample++) { - a_word = signal[0][sample]; - *buf_++ = (FLAC__byte)a_word; a_word >>= 8; - *buf_++ = (FLAC__byte)a_word; a_word >>= 8; - *buf_++ = (FLAC__byte)a_word; - } - return; - - case (BYTES_CHANNEL_SELECTOR (3, 2)): - for (sample = 0; sample < samples; sample++) { - a_word = signal[0][sample]; - *buf_++ = (FLAC__byte)a_word; a_word >>= 8; - *buf_++ = (FLAC__byte)a_word; a_word >>= 8; - *buf_++ = (FLAC__byte)a_word; - a_word = signal[1][sample]; - *buf_++ = (FLAC__byte)a_word; a_word >>= 8; - *buf_++ = (FLAC__byte)a_word; a_word >>= 8; - *buf_++ = (FLAC__byte)a_word; - } - return; - - /* Four bytes per sample. */ - case (BYTES_CHANNEL_SELECTOR (4, 1)): - for (sample = 0; sample < samples; sample++) - *buf32++ = H2LE_32(signal[0][sample]); - return; - - case (BYTES_CHANNEL_SELECTOR (4, 2)): - for (sample = 0; sample < samples; sample++) { - *buf32++ = H2LE_32(signal[0][sample]); - *buf32++ = H2LE_32(signal[1][sample]); - } - return; - - case (BYTES_CHANNEL_SELECTOR (4, 4)): - for (sample = 0; sample < samples; sample++) { - *buf32++ = H2LE_32(signal[0][sample]); - *buf32++ = H2LE_32(signal[1][sample]); - *buf32++ = H2LE_32(signal[2][sample]); - *buf32++ = H2LE_32(signal[3][sample]); - } - return; - - case (BYTES_CHANNEL_SELECTOR (4, 6)): - for (sample = 0; sample < samples; sample++) { - *buf32++ = H2LE_32(signal[0][sample]); - *buf32++ = H2LE_32(signal[1][sample]); - *buf32++ = H2LE_32(signal[2][sample]); - *buf32++ = H2LE_32(signal[3][sample]); - *buf32++ = H2LE_32(signal[4][sample]); - *buf32++ = H2LE_32(signal[5][sample]); - } - return; - - case (BYTES_CHANNEL_SELECTOR (4, 8)): - for (sample = 0; sample < samples; sample++) { - *buf32++ = H2LE_32(signal[0][sample]); - *buf32++ = H2LE_32(signal[1][sample]); - *buf32++ = H2LE_32(signal[2][sample]); - *buf32++ = H2LE_32(signal[3][sample]); - *buf32++ = H2LE_32(signal[4][sample]); - *buf32++ = H2LE_32(signal[5][sample]); - *buf32++ = H2LE_32(signal[6][sample]); - *buf32++ = H2LE_32(signal[7][sample]); - } - return; - - default: - break; - } - - /* General version. */ - switch (bytes_per_sample) { - case 1: - for (sample = 0; sample < samples; sample++) - for (channel = 0; channel < channels; channel++) - *buf_++ = signal[channel][sample]; - return; - - case 2: - for (sample = 0; sample < samples; sample++) - for (channel = 0; channel < channels; channel++) - *buf16++ = H2LE_16(signal[channel][sample]); - return; - - case 3: - for (sample = 0; sample < samples; sample++) - for (channel = 0; channel < channels; channel++) { - a_word = signal[channel][sample]; - *buf_++ = (FLAC__byte)a_word; a_word >>= 8; - *buf_++ = (FLAC__byte)a_word; a_word >>= 8; - *buf_++ = (FLAC__byte)a_word; - } - return; - - case 4: - for (sample = 0; sample < samples; sample++) - for (channel = 0; channel < channels; channel++) - *buf32++ = H2LE_32(signal[channel][sample]); - return; - - default: - break; - } -} - -/* - * Convert the incoming audio signal to a byte stream and FLAC__MD5Update it. - */ -FLAC__bool FLAC__MD5Accumulate(FLAC__MD5Context *ctx, const FLAC__int32 * const signal[], unsigned channels, unsigned samples, unsigned bytes_per_sample) -{ - const size_t bytes_needed = (size_t)channels * (size_t)samples * (size_t)bytes_per_sample; - - /* overflow check */ - if ((size_t)channels > SIZE_MAX / (size_t)bytes_per_sample) - return false; - if ((size_t)channels * (size_t)bytes_per_sample > SIZE_MAX / (size_t)samples) - return false; - - if (ctx->capacity < bytes_needed) { - FLAC__byte *tmp = realloc(ctx->internal_buf.p8, bytes_needed); - if (0 == tmp) { - free(ctx->internal_buf.p8); - if (0 == (ctx->internal_buf.p8= safe_malloc_(bytes_needed))) - return false; - } - else - ctx->internal_buf.p8= tmp; - ctx->capacity = bytes_needed; - } - - format_input_(&ctx->internal_buf, signal, channels, samples, bytes_per_sample); - - FLAC__MD5Update(ctx, ctx->internal_buf.p8, bytes_needed); - - return true; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/memory.c b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/memory.c deleted file mode 100644 index d22df70e..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/memory.c +++ /dev/null @@ -1,218 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 -#endif - -#ifdef HAVE_STDINT_H -#include -#endif - -#include "private/memory.h" -#include "FLAC/assert.h" -#include "share/alloc.h" - -void *FLAC__memory_alloc_aligned(size_t bytes, void **aligned_address) -{ - void *x; - - FLAC__ASSERT(0 != aligned_address); - -#ifdef FLAC__ALIGN_MALLOC_DATA - /* align on 32-byte (256-bit) boundary */ - x = safe_malloc_add_2op_(bytes, /*+*/31L); - *aligned_address = (void*)(((uintptr_t)x + 31L) & -32L); -#else - x = safe_malloc_(bytes); - *aligned_address = x; -#endif - return x; -} - -FLAC__bool FLAC__memory_alloc_aligned_int32_array(size_t elements, FLAC__int32 **unaligned_pointer, FLAC__int32 **aligned_pointer) -{ - FLAC__int32 *pu; /* unaligned pointer */ - union { /* union needed to comply with C99 pointer aliasing rules */ - FLAC__int32 *pa; /* aligned pointer */ - void *pv; /* aligned pointer alias */ - } u; - - FLAC__ASSERT(elements > 0); - FLAC__ASSERT(0 != unaligned_pointer); - FLAC__ASSERT(0 != aligned_pointer); - FLAC__ASSERT(unaligned_pointer != aligned_pointer); - - if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ - return false; - - pu = FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); - if(0 == pu) { - return false; - } - else { - if(*unaligned_pointer != 0) - free(*unaligned_pointer); - *unaligned_pointer = pu; - *aligned_pointer = u.pa; - return true; - } -} - -FLAC__bool FLAC__memory_alloc_aligned_uint32_array(size_t elements, FLAC__uint32 **unaligned_pointer, FLAC__uint32 **aligned_pointer) -{ - FLAC__uint32 *pu; /* unaligned pointer */ - union { /* union needed to comply with C99 pointer aliasing rules */ - FLAC__uint32 *pa; /* aligned pointer */ - void *pv; /* aligned pointer alias */ - } u; - - FLAC__ASSERT(elements > 0); - FLAC__ASSERT(0 != unaligned_pointer); - FLAC__ASSERT(0 != aligned_pointer); - FLAC__ASSERT(unaligned_pointer != aligned_pointer); - - if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ - return false; - - pu = FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); - if(0 == pu) { - return false; - } - else { - if(*unaligned_pointer != 0) - free(*unaligned_pointer); - *unaligned_pointer = pu; - *aligned_pointer = u.pa; - return true; - } -} - -FLAC__bool FLAC__memory_alloc_aligned_uint64_array(size_t elements, FLAC__uint64 **unaligned_pointer, FLAC__uint64 **aligned_pointer) -{ - FLAC__uint64 *pu; /* unaligned pointer */ - union { /* union needed to comply with C99 pointer aliasing rules */ - FLAC__uint64 *pa; /* aligned pointer */ - void *pv; /* aligned pointer alias */ - } u; - - FLAC__ASSERT(elements > 0); - FLAC__ASSERT(0 != unaligned_pointer); - FLAC__ASSERT(0 != aligned_pointer); - FLAC__ASSERT(unaligned_pointer != aligned_pointer); - - if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ - return false; - - pu = FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); - if(0 == pu) { - return false; - } - else { - if(*unaligned_pointer != 0) - free(*unaligned_pointer); - *unaligned_pointer = pu; - *aligned_pointer = u.pa; - return true; - } -} - -FLAC__bool FLAC__memory_alloc_aligned_unsigned_array(size_t elements, unsigned **unaligned_pointer, unsigned **aligned_pointer) -{ - unsigned *pu; /* unaligned pointer */ - union { /* union needed to comply with C99 pointer aliasing rules */ - unsigned *pa; /* aligned pointer */ - void *pv; /* aligned pointer alias */ - } u; - - FLAC__ASSERT(elements > 0); - FLAC__ASSERT(0 != unaligned_pointer); - FLAC__ASSERT(0 != aligned_pointer); - FLAC__ASSERT(unaligned_pointer != aligned_pointer); - - if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ - return false; - - pu = FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); - if(0 == pu) { - return false; - } - else { - if(*unaligned_pointer != 0) - free(*unaligned_pointer); - *unaligned_pointer = pu; - *aligned_pointer = u.pa; - return true; - } -} - -#ifndef FLAC__INTEGER_ONLY_LIBRARY - -FLAC__bool FLAC__memory_alloc_aligned_real_array(size_t elements, FLAC__real **unaligned_pointer, FLAC__real **aligned_pointer) -{ - FLAC__real *pu; /* unaligned pointer */ - union { /* union needed to comply with C99 pointer aliasing rules */ - FLAC__real *pa; /* aligned pointer */ - void *pv; /* aligned pointer alias */ - } u; - - FLAC__ASSERT(elements > 0); - FLAC__ASSERT(0 != unaligned_pointer); - FLAC__ASSERT(0 != aligned_pointer); - FLAC__ASSERT(unaligned_pointer != aligned_pointer); - - if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ - return false; - - pu = FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); - if(0 == pu) { - return false; - } - else { - if(*unaligned_pointer != 0) - free(*unaligned_pointer); - *unaligned_pointer = pu; - *aligned_pointer = u.pa; - return true; - } -} - -#endif - -void *safe_malloc_mul_2op_p(size_t size1, size_t size2) -{ - if(!size1 || !size2) - return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ - if(size1 > SIZE_MAX / size2) - return 0; - return malloc(size1*size2); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/metadata_iterators.c b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/metadata_iterators.c deleted file mode 100644 index 1e289256..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/metadata_iterators.c +++ /dev/null @@ -1,3402 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 -#endif - -#include -#include -#include -#include -#include - -#include /* for stat(), maybe chmod() */ - -#include "private/metadata.h" - -#include "FLAC/assert.h" -#include "FLAC/stream_decoder.h" -#include "share/alloc.h" -#include "share/compat.h" -#include "share/macros.h" -#include "share/safe_str.h" -#include "private/macros.h" -#include "private/memory.h" - -/* Alias the first (in share/alloc.h) to the second (in src/libFLAC/memory.c). */ -#define safe_malloc_mul_2op_ safe_malloc_mul_2op_p - -/**************************************************************************** - * - * Local function declarations - * - ***************************************************************************/ - -static void pack_uint32_(FLAC__uint32 val, FLAC__byte *b, unsigned bytes); -static void pack_uint32_little_endian_(FLAC__uint32 val, FLAC__byte *b, unsigned bytes); -static void pack_uint64_(FLAC__uint64 val, FLAC__byte *b, unsigned bytes); -static FLAC__uint32 unpack_uint32_(FLAC__byte *b, unsigned bytes); -static FLAC__uint32 unpack_uint32_little_endian_(FLAC__byte *b, unsigned bytes); -static FLAC__uint64 unpack_uint64_(FLAC__byte *b, unsigned bytes); - -static FLAC__bool read_metadata_block_header_(FLAC__Metadata_SimpleIterator *iterator); -static FLAC__bool read_metadata_block_data_(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block); -static FLAC__bool read_metadata_block_header_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__bool *is_last, FLAC__MetadataType *type, unsigned *length); -static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Seek seek_cb, FLAC__StreamMetadata *block); -static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_streaminfo_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_StreamInfo *block); -static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_padding_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Seek seek_cb, FLAC__StreamMetadata_Padding *block, unsigned block_length); -static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_application_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_Application *block, unsigned block_length); -static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_seektable_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_SeekTable *block, unsigned block_length); -static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_vorbis_comment_entry_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_VorbisComment_Entry *entry, unsigned max_length); -static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_vorbis_comment_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Seek seek_cb, FLAC__StreamMetadata_VorbisComment *block, unsigned block_length); -static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_cuesheet_track_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_CueSheet_Track *track); -static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_cuesheet_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_CueSheet *block); -static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_picture_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_Picture *block); -static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_unknown_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_Unknown *block, unsigned block_length); - -static FLAC__bool write_metadata_block_header_(FILE *file, FLAC__Metadata_SimpleIteratorStatus *status, const FLAC__StreamMetadata *block); -static FLAC__bool write_metadata_block_data_(FILE *file, FLAC__Metadata_SimpleIteratorStatus *status, const FLAC__StreamMetadata *block); -static FLAC__bool write_metadata_block_header_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata *block); -static FLAC__bool write_metadata_block_data_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata *block); -static FLAC__bool write_metadata_block_data_streaminfo_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_StreamInfo *block); -static FLAC__bool write_metadata_block_data_padding_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_Padding *block, unsigned block_length); -static FLAC__bool write_metadata_block_data_application_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_Application *block, unsigned block_length); -static FLAC__bool write_metadata_block_data_seektable_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_SeekTable *block); -static FLAC__bool write_metadata_block_data_vorbis_comment_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_VorbisComment *block); -static FLAC__bool write_metadata_block_data_cuesheet_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_CueSheet *block); -static FLAC__bool write_metadata_block_data_picture_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_Picture *block); -static FLAC__bool write_metadata_block_data_unknown_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_Unknown *block, unsigned block_length); - -static FLAC__bool write_metadata_block_stationary_(FLAC__Metadata_SimpleIterator *iterator, const FLAC__StreamMetadata *block); -static FLAC__bool write_metadata_block_stationary_with_padding_(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, unsigned padding_length, FLAC__bool padding_is_last); -static FLAC__bool rewrite_whole_file_(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool append); - -static void simple_iterator_push_(FLAC__Metadata_SimpleIterator *iterator); -static FLAC__bool simple_iterator_pop_(FLAC__Metadata_SimpleIterator *iterator); - -static unsigned seek_to_first_metadata_block_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Seek seek_cb); -static unsigned seek_to_first_metadata_block_(FILE *f); - -static FLAC__bool simple_iterator_copy_file_prefix_(FLAC__Metadata_SimpleIterator *iterator, FILE **tempfile, char **tempfilename, FLAC__bool append); -static FLAC__bool simple_iterator_copy_file_postfix_(FLAC__Metadata_SimpleIterator *iterator, FILE **tempfile, char **tempfilename, int fixup_is_last_code, FLAC__off_t fixup_is_last_flag_offset, FLAC__bool backup); - -static FLAC__bool copy_n_bytes_from_file_(FILE *file, FILE *tempfile, FLAC__off_t bytes, FLAC__Metadata_SimpleIteratorStatus *status); -static FLAC__bool copy_n_bytes_from_file_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOHandle temp_handle, FLAC__IOCallback_Write temp_write_cb, FLAC__off_t bytes, FLAC__Metadata_SimpleIteratorStatus *status); -static FLAC__bool copy_remaining_bytes_from_file_(FILE *file, FILE *tempfile, FLAC__Metadata_SimpleIteratorStatus *status); -static FLAC__bool copy_remaining_bytes_from_file_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Eof eof_cb, FLAC__IOHandle temp_handle, FLAC__IOCallback_Write temp_write_cb, FLAC__Metadata_SimpleIteratorStatus *status); - -static FLAC__bool open_tempfile_(const char *filename, const char *tempfile_path_prefix, FILE **tempfile, char **tempfilename, FLAC__Metadata_SimpleIteratorStatus *status); -static FLAC__bool transport_tempfile_(const char *filename, FILE **tempfile, char **tempfilename, FLAC__Metadata_SimpleIteratorStatus *status); -static void cleanup_tempfile_(FILE **tempfile, char **tempfilename); - -static FLAC__bool get_file_stats_(const char *filename, struct flac_stat_s *stats); -static void set_file_stats_(const char *filename, struct flac_stat_s *stats); - -static int fseek_wrapper_(FLAC__IOHandle handle, FLAC__int64 offset, int whence); -static FLAC__int64 ftell_wrapper_(FLAC__IOHandle handle); - -static FLAC__Metadata_ChainStatus get_equivalent_status_(FLAC__Metadata_SimpleIteratorStatus status); - - -#ifdef FLAC__VALGRIND_TESTING -static size_t local__fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) -{ - size_t ret = fwrite(ptr, size, nmemb, stream); - if(!ferror(stream)) - fflush(stream); - return ret; -} -#else -#define local__fwrite fwrite -#endif - -/**************************************************************************** - * - * Level 0 implementation - * - ***************************************************************************/ - -static FLAC__StreamDecoderWriteStatus write_callback_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data); -static void metadata_callback_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data); -static void error_callback_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data); - -typedef struct { - FLAC__bool got_error; - FLAC__StreamMetadata *object; -} level0_client_data; - -static FLAC__StreamMetadata *get_one_metadata_block_(const char *filename, FLAC__MetadataType type) -{ - level0_client_data cd; - FLAC__StreamDecoder *decoder; - - FLAC__ASSERT(0 != filename); - - cd.got_error = false; - cd.object = 0; - - decoder = FLAC__stream_decoder_new(); - - if(0 == decoder) - return 0; - - FLAC__stream_decoder_set_md5_checking(decoder, false); - FLAC__stream_decoder_set_metadata_ignore_all(decoder); - FLAC__stream_decoder_set_metadata_respond(decoder, type); - - if(FLAC__stream_decoder_init_file(decoder, filename, write_callback_, metadata_callback_, error_callback_, &cd) != FLAC__STREAM_DECODER_INIT_STATUS_OK || cd.got_error) { - (void)FLAC__stream_decoder_finish(decoder); - FLAC__stream_decoder_delete(decoder); - return 0; - } - - if(!FLAC__stream_decoder_process_until_end_of_metadata(decoder) || cd.got_error) { - (void)FLAC__stream_decoder_finish(decoder); - FLAC__stream_decoder_delete(decoder); - if(0 != cd.object) - FLAC__metadata_object_delete(cd.object); - return 0; - } - - (void)FLAC__stream_decoder_finish(decoder); - FLAC__stream_decoder_delete(decoder); - - return cd.object; -} - -FLAC_API FLAC__bool FLAC__metadata_get_streaminfo(const char *filename, FLAC__StreamMetadata *streaminfo) -{ - FLAC__StreamMetadata *object; - - FLAC__ASSERT(0 != filename); - FLAC__ASSERT(0 != streaminfo); - - object = get_one_metadata_block_(filename, FLAC__METADATA_TYPE_STREAMINFO); - - if (object) { - /* can just copy the contents since STREAMINFO has no internal structure */ - *streaminfo = *object; - FLAC__metadata_object_delete(object); - return true; - } - else { - return false; - } -} - -FLAC_API FLAC__bool FLAC__metadata_get_tags(const char *filename, FLAC__StreamMetadata **tags) -{ - FLAC__ASSERT(0 != filename); - FLAC__ASSERT(0 != tags); - - *tags = get_one_metadata_block_(filename, FLAC__METADATA_TYPE_VORBIS_COMMENT); - - return 0 != *tags; -} - -FLAC_API FLAC__bool FLAC__metadata_get_cuesheet(const char *filename, FLAC__StreamMetadata **cuesheet) -{ - FLAC__ASSERT(0 != filename); - FLAC__ASSERT(0 != cuesheet); - - *cuesheet = get_one_metadata_block_(filename, FLAC__METADATA_TYPE_CUESHEET); - - return 0 != *cuesheet; -} - -FLAC__StreamDecoderWriteStatus write_callback_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) -{ - (void)decoder, (void)frame, (void)buffer, (void)client_data; - - return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; -} - -void metadata_callback_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) -{ - level0_client_data *cd = (level0_client_data *)client_data; - (void)decoder; - - /* - * we assume we only get here when the one metadata block we were - * looking for was passed to us - */ - if(!cd->got_error && 0 == cd->object) { - if(0 == (cd->object = FLAC__metadata_object_clone(metadata))) - cd->got_error = true; - } -} - -void error_callback_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) -{ - level0_client_data *cd = (level0_client_data *)client_data; - (void)decoder; - - if(status != FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC) - cd->got_error = true; -} - -FLAC_API FLAC__bool FLAC__metadata_get_picture(const char *filename, FLAC__StreamMetadata **picture, FLAC__StreamMetadata_Picture_Type type, const char *mime_type, const FLAC__byte *description, unsigned max_width, unsigned max_height, unsigned max_depth, unsigned max_colors) -{ - FLAC__Metadata_SimpleIterator *it; - FLAC__uint64 max_area_seen = 0; - FLAC__uint64 max_depth_seen = 0; - - FLAC__ASSERT(0 != filename); - FLAC__ASSERT(0 != picture); - - *picture = 0; - - it = FLAC__metadata_simple_iterator_new(); - if(0 == it) - return false; - if(!FLAC__metadata_simple_iterator_init(it, filename, /*read_only=*/true, /*preserve_file_stats=*/true)) { - FLAC__metadata_simple_iterator_delete(it); - return false; - } - do { - if(FLAC__metadata_simple_iterator_get_block_type(it) == FLAC__METADATA_TYPE_PICTURE) { - FLAC__StreamMetadata *obj = FLAC__metadata_simple_iterator_get_block(it); - FLAC__uint64 area = (FLAC__uint64)obj->data.picture.width * (FLAC__uint64)obj->data.picture.height; - /* check constraints */ - if( - (type == (FLAC__StreamMetadata_Picture_Type)(-1) || type == obj->data.picture.type) && - (mime_type == 0 || !strcmp(mime_type, obj->data.picture.mime_type)) && - (description == 0 || !strcmp((const char *)description, (const char *)obj->data.picture.description)) && - obj->data.picture.width <= max_width && - obj->data.picture.height <= max_height && - obj->data.picture.depth <= max_depth && - obj->data.picture.colors <= max_colors && - (area > max_area_seen || (area == max_area_seen && obj->data.picture.depth > max_depth_seen)) - ) { - if(*picture) - FLAC__metadata_object_delete(*picture); - *picture = obj; - max_area_seen = area; - max_depth_seen = obj->data.picture.depth; - } - else { - FLAC__metadata_object_delete(obj); - } - } - } while(FLAC__metadata_simple_iterator_next(it)); - - FLAC__metadata_simple_iterator_delete(it); - - return (0 != *picture); -} - - -/**************************************************************************** - * - * Level 1 implementation - * - ***************************************************************************/ - -#define SIMPLE_ITERATOR_MAX_PUSH_DEPTH (1+4) -/* 1 for initial offset, +4 for our own personal use */ - -struct FLAC__Metadata_SimpleIterator { - FILE *file; - char *filename, *tempfile_path_prefix; - struct flac_stat_s stats; - FLAC__bool has_stats; - FLAC__bool is_writable; - FLAC__Metadata_SimpleIteratorStatus status; - FLAC__off_t offset[SIMPLE_ITERATOR_MAX_PUSH_DEPTH]; - FLAC__off_t first_offset; /* this is the offset to the STREAMINFO block */ - unsigned depth; - /* this is the metadata block header of the current block we are pointing to: */ - FLAC__bool is_last; - FLAC__MetadataType type; - unsigned length; -}; - -FLAC_API const char * const FLAC__Metadata_SimpleIteratorStatusString[] = { - "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK", - "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT", - "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE", - "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_A_FLAC_FILE", - "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_WRITABLE", - "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_BAD_METADATA", - "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR", - "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR", - "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR", - "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_RENAME_ERROR", - "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_UNLINK_ERROR", - "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR", - "FLAC__METADATA_SIMPLE_ITERATOR_STATUS_INTERNAL_ERROR" -}; - - -FLAC_API FLAC__Metadata_SimpleIterator *FLAC__metadata_simple_iterator_new(void) -{ - FLAC__Metadata_SimpleIterator *iterator = calloc(1, sizeof(FLAC__Metadata_SimpleIterator)); - - if(0 != iterator) { - iterator->file = 0; - iterator->filename = 0; - iterator->tempfile_path_prefix = 0; - iterator->has_stats = false; - iterator->is_writable = false; - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; - iterator->first_offset = iterator->offset[0] = -1; - iterator->depth = 0; - } - - return iterator; -} - -static void simple_iterator_free_guts_(FLAC__Metadata_SimpleIterator *iterator) -{ - FLAC__ASSERT(0 != iterator); - - if(0 != iterator->file) { - fclose(iterator->file); - iterator->file = 0; - if(iterator->has_stats) - set_file_stats_(iterator->filename, &iterator->stats); - } - if(0 != iterator->filename) { - free(iterator->filename); - iterator->filename = 0; - } - if(0 != iterator->tempfile_path_prefix) { - free(iterator->tempfile_path_prefix); - iterator->tempfile_path_prefix = 0; - } -} - -FLAC_API void FLAC__metadata_simple_iterator_delete(FLAC__Metadata_SimpleIterator *iterator) -{ - FLAC__ASSERT(0 != iterator); - - simple_iterator_free_guts_(iterator); - free(iterator); -} - -FLAC_API FLAC__Metadata_SimpleIteratorStatus FLAC__metadata_simple_iterator_status(FLAC__Metadata_SimpleIterator *iterator) -{ - FLAC__Metadata_SimpleIteratorStatus status; - - FLAC__ASSERT(0 != iterator); - - status = iterator->status; - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; - return status; -} - -static FLAC__bool simple_iterator_prime_input_(FLAC__Metadata_SimpleIterator *iterator, FLAC__bool read_only) -{ - unsigned ret; - - FLAC__ASSERT(0 != iterator); - - if(read_only || 0 == (iterator->file = flac_fopen(iterator->filename, "r+b"))) { - iterator->is_writable = false; - if(read_only || errno == EACCES) { - if(0 == (iterator->file = flac_fopen(iterator->filename, "rb"))) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE; - return false; - } - } - else { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE; - return false; - } - } - else { - iterator->is_writable = true; - } - - ret = seek_to_first_metadata_block_(iterator->file); - switch(ret) { - case 0: - iterator->depth = 0; - iterator->first_offset = iterator->offset[iterator->depth] = ftello(iterator->file); - return read_metadata_block_header_(iterator); - case 1: - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - return false; - case 2: - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; - return false; - case 3: - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_A_FLAC_FILE; - return false; - default: - FLAC__ASSERT(0); - return false; - } -} - -#if 0 -@@@ If we decide to finish implementing this, put this comment back in metadata.h -/* - * The 'tempfile_path_prefix' allows you to specify a directory where - * tempfiles should go. Remember that if your metadata edits cause the - * FLAC file to grow, the entire file will have to be rewritten. If - * 'tempfile_path_prefix' is NULL, the temp file will be written in the - * same directory as the original FLAC file. This makes replacing the - * original with the tempfile fast but requires extra space in the same - * partition for the tempfile. If space is a problem, you can pass a - * directory name belonging to a different partition in - * 'tempfile_path_prefix'. Note that you should use the forward slash - * '/' as the directory separator. A trailing slash is not needed; it - * will be added automatically. - */ -FLAC__bool FLAC__metadata_simple_iterator_init(FLAC__Metadata_SimpleIterator *iterator, const char *filename, FLAC__bool preserve_file_stats, const char *tempfile_path_prefix); -#endif - -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_init(FLAC__Metadata_SimpleIterator *iterator, const char *filename, FLAC__bool read_only, FLAC__bool preserve_file_stats) -{ - const char *tempfile_path_prefix = 0; /*@@@ search for comments near 'flac_rename(...)' for what it will take to finish implementing this */ - - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != filename); - - simple_iterator_free_guts_(iterator); - - if(!read_only && preserve_file_stats) - iterator->has_stats = get_file_stats_(filename, &iterator->stats); - - if(0 == (iterator->filename = strdup(filename))) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; - return false; - } - if(0 != tempfile_path_prefix && 0 == (iterator->tempfile_path_prefix = strdup(tempfile_path_prefix))) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; - return false; - } - - return simple_iterator_prime_input_(iterator, read_only); -} - -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_is_writable(const FLAC__Metadata_SimpleIterator *iterator) -{ - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->file); - - return iterator->is_writable; -} - -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_next(FLAC__Metadata_SimpleIterator *iterator) -{ - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->file); - - if(iterator->is_last) - return false; - - if(0 != fseeko(iterator->file, iterator->length, SEEK_CUR)) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; - return false; - } - - iterator->offset[iterator->depth] = ftello(iterator->file); - - return read_metadata_block_header_(iterator); -} - -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_prev(FLAC__Metadata_SimpleIterator *iterator) -{ - FLAC__off_t this_offset; - - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->file); - - if(iterator->offset[iterator->depth] == iterator->first_offset) - return false; - - if(0 != fseeko(iterator->file, iterator->first_offset, SEEK_SET)) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; - return false; - } - this_offset = iterator->first_offset; - if(!read_metadata_block_header_(iterator)) - return false; - - /* we ignore any error from ftello() and catch it in fseeko() */ - while(ftello(iterator->file) + (FLAC__off_t)iterator->length < iterator->offset[iterator->depth]) { - if(0 != fseeko(iterator->file, iterator->length, SEEK_CUR)) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; - return false; - } - this_offset = ftello(iterator->file); - if(!read_metadata_block_header_(iterator)) - return false; - } - - iterator->offset[iterator->depth] = this_offset; - - return true; -} - -/*@@@@add to tests*/ -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_is_last(const FLAC__Metadata_SimpleIterator *iterator) -{ - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->file); - - return iterator->is_last; -} - -/*@@@@add to tests*/ -FLAC_API off_t FLAC__metadata_simple_iterator_get_block_offset(const FLAC__Metadata_SimpleIterator *iterator) -{ - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->file); - - return iterator->offset[iterator->depth]; -} - -FLAC_API FLAC__MetadataType FLAC__metadata_simple_iterator_get_block_type(const FLAC__Metadata_SimpleIterator *iterator) -{ - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->file); - - return iterator->type; -} - -/*@@@@add to tests*/ -FLAC_API unsigned FLAC__metadata_simple_iterator_get_block_length(const FLAC__Metadata_SimpleIterator *iterator) -{ - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->file); - - return iterator->length; -} - -/*@@@@add to tests*/ -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_get_application_id(FLAC__Metadata_SimpleIterator *iterator, FLAC__byte *id) -{ - const unsigned id_bytes = FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8; - - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->file); - FLAC__ASSERT(0 != id); - - if(iterator->type != FLAC__METADATA_TYPE_APPLICATION) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT; - return false; - } - - if(fread(id, 1, id_bytes, iterator->file) != id_bytes) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - return false; - } - - /* back up */ - if(0 != fseeko(iterator->file, -((int)id_bytes), SEEK_CUR)) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; - return false; - } - - return true; -} - -FLAC_API FLAC__StreamMetadata *FLAC__metadata_simple_iterator_get_block(FLAC__Metadata_SimpleIterator *iterator) -{ - FLAC__StreamMetadata *block = FLAC__metadata_object_new(iterator->type); - - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->file); - - if(0 != block) { - block->is_last = iterator->is_last; - block->length = iterator->length; - - if(!read_metadata_block_data_(iterator, block)) { - FLAC__metadata_object_delete(block); - return 0; - } - - /* back up to the beginning of the block data to stay consistent */ - if(0 != fseeko(iterator->file, iterator->offset[iterator->depth] + FLAC__STREAM_METADATA_HEADER_LENGTH, SEEK_SET)) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; - FLAC__metadata_object_delete(block); - return 0; - } - } - else - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; - - return block; -} - -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_set_block(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool use_padding) -{ - FLAC__ASSERT_DECLARATION(FLAC__off_t debug_target_offset = iterator->offset[iterator->depth];) - FLAC__bool ret; - - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->file); - FLAC__ASSERT(0 != block); - - if(!iterator->is_writable) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_WRITABLE; - return false; - } - - if(iterator->type == FLAC__METADATA_TYPE_STREAMINFO || block->type == FLAC__METADATA_TYPE_STREAMINFO) { - if(iterator->type != block->type) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT; - return false; - } - } - - block->is_last = iterator->is_last; - - if(iterator->length == block->length) - return write_metadata_block_stationary_(iterator, block); - else if(iterator->length > block->length) { - if(use_padding && iterator->length >= FLAC__STREAM_METADATA_HEADER_LENGTH + block->length) { - ret = write_metadata_block_stationary_with_padding_(iterator, block, iterator->length - FLAC__STREAM_METADATA_HEADER_LENGTH - block->length, block->is_last); - FLAC__ASSERT(!ret || iterator->offset[iterator->depth] == debug_target_offset); - FLAC__ASSERT(!ret || ftello(iterator->file) == debug_target_offset + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH); - return ret; - } - else { - ret = rewrite_whole_file_(iterator, block, /*append=*/false); - FLAC__ASSERT(!ret || iterator->offset[iterator->depth] == debug_target_offset); - FLAC__ASSERT(!ret || ftello(iterator->file) == debug_target_offset + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH); - return ret; - } - } - else /* iterator->length < block->length */ { - unsigned padding_leftover = 0; - FLAC__bool padding_is_last = false; - if(use_padding) { - /* first see if we can even use padding */ - if(iterator->is_last) { - use_padding = false; - } - else { - const unsigned extra_padding_bytes_required = block->length - iterator->length; - simple_iterator_push_(iterator); - if(!FLAC__metadata_simple_iterator_next(iterator)) { - (void)simple_iterator_pop_(iterator); - return false; - } - if(iterator->type != FLAC__METADATA_TYPE_PADDING) { - use_padding = false; - } - else { - if(FLAC__STREAM_METADATA_HEADER_LENGTH + iterator->length == extra_padding_bytes_required) { - padding_leftover = 0; - block->is_last = iterator->is_last; - } - else if(iterator->length < extra_padding_bytes_required) - use_padding = false; - else { - padding_leftover = FLAC__STREAM_METADATA_HEADER_LENGTH + iterator->length - extra_padding_bytes_required; - padding_is_last = iterator->is_last; - block->is_last = false; - } - } - if(!simple_iterator_pop_(iterator)) - return false; - } - } - if(use_padding) { - if(padding_leftover == 0) { - ret = write_metadata_block_stationary_(iterator, block); - FLAC__ASSERT(!ret || iterator->offset[iterator->depth] == debug_target_offset); - FLAC__ASSERT(!ret || ftello(iterator->file) == debug_target_offset + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH); - return ret; - } - else { - FLAC__ASSERT(padding_leftover >= FLAC__STREAM_METADATA_HEADER_LENGTH); - ret = write_metadata_block_stationary_with_padding_(iterator, block, padding_leftover - FLAC__STREAM_METADATA_HEADER_LENGTH, padding_is_last); - FLAC__ASSERT(!ret || iterator->offset[iterator->depth] == debug_target_offset); - FLAC__ASSERT(!ret || ftello(iterator->file) == debug_target_offset + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH); - return ret; - } - } - else { - ret = rewrite_whole_file_(iterator, block, /*append=*/false); - FLAC__ASSERT(!ret || iterator->offset[iterator->depth] == debug_target_offset); - FLAC__ASSERT(!ret || ftello(iterator->file) == debug_target_offset + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH); - return ret; - } - } -} - -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_insert_block_after(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool use_padding) -{ - unsigned padding_leftover = 0; - FLAC__bool padding_is_last = false; - - FLAC__ASSERT_DECLARATION(FLAC__off_t debug_target_offset = iterator->offset[iterator->depth] + FLAC__STREAM_METADATA_HEADER_LENGTH + iterator->length;) - FLAC__bool ret; - - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->file); - FLAC__ASSERT(0 != block); - - if(!iterator->is_writable) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_WRITABLE; - return false; - } - - if(block->type == FLAC__METADATA_TYPE_STREAMINFO) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT; - return false; - } - - block->is_last = iterator->is_last; - - if(use_padding) { - /* first see if we can even use padding */ - if(iterator->is_last) { - use_padding = false; - } - else { - simple_iterator_push_(iterator); - if(!FLAC__metadata_simple_iterator_next(iterator)) { - (void)simple_iterator_pop_(iterator); - return false; - } - if(iterator->type != FLAC__METADATA_TYPE_PADDING) { - use_padding = false; - } - else { - if(iterator->length == block->length) { - padding_leftover = 0; - block->is_last = iterator->is_last; - } - else if(iterator->length < FLAC__STREAM_METADATA_HEADER_LENGTH + block->length) - use_padding = false; - else { - padding_leftover = iterator->length - block->length; - padding_is_last = iterator->is_last; - block->is_last = false; - } - } - if(!simple_iterator_pop_(iterator)) - return false; - } - } - if(use_padding) { - /* move to the next block, which is suitable padding */ - if(!FLAC__metadata_simple_iterator_next(iterator)) - return false; - if(padding_leftover == 0) { - ret = write_metadata_block_stationary_(iterator, block); - FLAC__ASSERT(iterator->offset[iterator->depth] == debug_target_offset); - FLAC__ASSERT(ftello(iterator->file) == debug_target_offset + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH); - return ret; - } - else { - FLAC__ASSERT(padding_leftover >= FLAC__STREAM_METADATA_HEADER_LENGTH); - ret = write_metadata_block_stationary_with_padding_(iterator, block, padding_leftover - FLAC__STREAM_METADATA_HEADER_LENGTH, padding_is_last); - FLAC__ASSERT(iterator->offset[iterator->depth] == debug_target_offset); - FLAC__ASSERT(ftello(iterator->file) == debug_target_offset + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH); - return ret; - } - } - else { - ret = rewrite_whole_file_(iterator, block, /*append=*/true); - FLAC__ASSERT(iterator->offset[iterator->depth] == debug_target_offset); - FLAC__ASSERT(ftello(iterator->file) == debug_target_offset + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH); - return ret; - } -} - -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_delete_block(FLAC__Metadata_SimpleIterator *iterator, FLAC__bool use_padding) -{ - FLAC__ASSERT_DECLARATION(FLAC__off_t debug_target_offset = iterator->offset[iterator->depth];) - FLAC__bool ret; - - if(iterator->type == FLAC__METADATA_TYPE_STREAMINFO) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT; - return false; - } - - if(use_padding) { - FLAC__StreamMetadata *padding = FLAC__metadata_object_new(FLAC__METADATA_TYPE_PADDING); - if(0 == padding) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; - return false; - } - padding->length = iterator->length; - if(!FLAC__metadata_simple_iterator_set_block(iterator, padding, false)) { - FLAC__metadata_object_delete(padding); - return false; - } - FLAC__metadata_object_delete(padding); - if(!FLAC__metadata_simple_iterator_prev(iterator)) - return false; - FLAC__ASSERT(iterator->offset[iterator->depth] + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH + (FLAC__off_t)iterator->length == debug_target_offset); - FLAC__ASSERT(ftello(iterator->file) + (FLAC__off_t)iterator->length == debug_target_offset); - return true; - } - else { - ret = rewrite_whole_file_(iterator, 0, /*append=*/false); - FLAC__ASSERT(iterator->offset[iterator->depth] + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH + (FLAC__off_t)iterator->length == debug_target_offset); - FLAC__ASSERT(ftello(iterator->file) + (FLAC__off_t)iterator->length == debug_target_offset); - return ret; - } -} - - - -/**************************************************************************** - * - * Level 2 implementation - * - ***************************************************************************/ - - -typedef struct FLAC__Metadata_Node { - FLAC__StreamMetadata *data; - struct FLAC__Metadata_Node *prev, *next; -} FLAC__Metadata_Node; - -struct FLAC__Metadata_Chain { - char *filename; /* will be NULL if using callbacks */ - FLAC__bool is_ogg; - FLAC__Metadata_Node *head; - FLAC__Metadata_Node *tail; - unsigned nodes; - FLAC__Metadata_ChainStatus status; - FLAC__off_t first_offset, last_offset; - /* - * This is the length of the chain initially read from the FLAC file. - * it is used to compare against the current length to decide whether - * or not the whole file has to be rewritten. - */ - FLAC__off_t initial_length; - /* @@@ hacky, these are currently only needed by ogg reader */ - FLAC__IOHandle handle; - FLAC__IOCallback_Read read_cb; -}; - -struct FLAC__Metadata_Iterator { - FLAC__Metadata_Chain *chain; - FLAC__Metadata_Node *current; -}; - -FLAC_API const char * const FLAC__Metadata_ChainStatusString[] = { - "FLAC__METADATA_CHAIN_STATUS_OK", - "FLAC__METADATA_CHAIN_STATUS_ILLEGAL_INPUT", - "FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE", - "FLAC__METADATA_CHAIN_STATUS_NOT_A_FLAC_FILE", - "FLAC__METADATA_CHAIN_STATUS_NOT_WRITABLE", - "FLAC__METADATA_CHAIN_STATUS_BAD_METADATA", - "FLAC__METADATA_CHAIN_STATUS_READ_ERROR", - "FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR", - "FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR", - "FLAC__METADATA_CHAIN_STATUS_RENAME_ERROR", - "FLAC__METADATA_CHAIN_STATUS_UNLINK_ERROR", - "FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR", - "FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR", - "FLAC__METADATA_CHAIN_STATUS_INVALID_CALLBACKS", - "FLAC__METADATA_CHAIN_STATUS_READ_WRITE_MISMATCH", - "FLAC__METADATA_CHAIN_STATUS_WRONG_WRITE_CALL" -}; - - -static FLAC__Metadata_Node *node_new_(void) -{ - return calloc(1, sizeof(FLAC__Metadata_Node)); -} - -static void node_delete_(FLAC__Metadata_Node *node) -{ - FLAC__ASSERT(0 != node); - if(0 != node->data) - FLAC__metadata_object_delete(node->data); - free(node); -} - -static void chain_init_(FLAC__Metadata_Chain *chain) -{ - FLAC__ASSERT(0 != chain); - - chain->filename = 0; - chain->is_ogg = false; - chain->head = chain->tail = 0; - chain->nodes = 0; - chain->status = FLAC__METADATA_CHAIN_STATUS_OK; - chain->initial_length = 0; - chain->read_cb = 0; -} - -static void chain_clear_(FLAC__Metadata_Chain *chain) -{ - FLAC__Metadata_Node *node, *next; - - FLAC__ASSERT(0 != chain); - - for(node = chain->head; node; ) { - next = node->next; - node_delete_(node); - node = next; - } - - if(0 != chain->filename) - free(chain->filename); - - chain_init_(chain); -} - -static void chain_append_node_(FLAC__Metadata_Chain *chain, FLAC__Metadata_Node *node) -{ - FLAC__ASSERT(0 != chain); - FLAC__ASSERT(0 != node); - FLAC__ASSERT(0 != node->data); - - node->next = node->prev = 0; - node->data->is_last = true; - if(0 != chain->tail) - chain->tail->data->is_last = false; - - if(0 == chain->head) - chain->head = node; - else { - FLAC__ASSERT(0 != chain->tail); - chain->tail->next = node; - node->prev = chain->tail; - } - chain->tail = node; - chain->nodes++; -} - -static void chain_remove_node_(FLAC__Metadata_Chain *chain, FLAC__Metadata_Node *node) -{ - FLAC__ASSERT(0 != chain); - FLAC__ASSERT(0 != node); - - if(node == chain->head) - chain->head = node->next; - else - node->prev->next = node->next; - - if(node == chain->tail) - chain->tail = node->prev; - else - node->next->prev = node->prev; - - if(0 != chain->tail) - chain->tail->data->is_last = true; - - chain->nodes--; -} - -static void chain_delete_node_(FLAC__Metadata_Chain *chain, FLAC__Metadata_Node *node) -{ - chain_remove_node_(chain, node); - node_delete_(node); -} - -static FLAC__off_t chain_calculate_length_(FLAC__Metadata_Chain *chain) -{ - const FLAC__Metadata_Node *node; - FLAC__off_t length = 0; - for(node = chain->head; node; node = node->next) - length += (FLAC__STREAM_METADATA_HEADER_LENGTH + node->data->length); - return length; -} - -static void iterator_insert_node_(FLAC__Metadata_Iterator *iterator, FLAC__Metadata_Node *node) -{ - FLAC__ASSERT(0 != node); - FLAC__ASSERT(0 != node->data); - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->current); - FLAC__ASSERT(0 != iterator->chain); - FLAC__ASSERT(0 != iterator->chain->head); - FLAC__ASSERT(0 != iterator->chain->tail); - - node->data->is_last = false; - - node->prev = iterator->current->prev; - node->next = iterator->current; - - if(0 == node->prev) - iterator->chain->head = node; - else - node->prev->next = node; - - iterator->current->prev = node; - - iterator->chain->nodes++; -} - -static void iterator_insert_node_after_(FLAC__Metadata_Iterator *iterator, FLAC__Metadata_Node *node) -{ - FLAC__ASSERT(0 != node); - FLAC__ASSERT(0 != node->data); - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->current); - FLAC__ASSERT(0 != iterator->chain); - FLAC__ASSERT(0 != iterator->chain->head); - FLAC__ASSERT(0 != iterator->chain->tail); - - iterator->current->data->is_last = false; - - node->prev = iterator->current; - node->next = iterator->current->next; - - if(0 == node->next) - iterator->chain->tail = node; - else - node->next->prev = node; - - node->prev->next = node; - - iterator->chain->tail->data->is_last = true; - - iterator->chain->nodes++; -} - -/* return true iff node and node->next are both padding */ -static FLAC__bool chain_merge_adjacent_padding_(FLAC__Metadata_Chain *chain, FLAC__Metadata_Node *node) -{ - if(node->data->type == FLAC__METADATA_TYPE_PADDING && 0 != node->next && node->next->data->type == FLAC__METADATA_TYPE_PADDING) { - const unsigned growth = FLAC__STREAM_METADATA_HEADER_LENGTH + node->next->data->length; - node->data->length += growth; - - chain_delete_node_(chain, node->next); - return true; - } - else - return false; -} - -/* Returns the new length of the chain, or 0 if there was an error. */ -/* WATCHOUT: This can get called multiple times before a write, so - * it should still work when this happens. - */ -/* WATCHOUT: Make sure to also update the logic in - * FLAC__metadata_chain_check_if_tempfile_needed() if the logic here changes. - */ -static FLAC__off_t chain_prepare_for_write_(FLAC__Metadata_Chain *chain, FLAC__bool use_padding) -{ - FLAC__off_t current_length = chain_calculate_length_(chain); - - if(use_padding) { - /* if the metadata shrank and the last block is padding, we just extend the last padding block */ - if(current_length < chain->initial_length && chain->tail->data->type == FLAC__METADATA_TYPE_PADDING) { - const FLAC__off_t delta = chain->initial_length - current_length; - chain->tail->data->length += delta; - current_length += delta; - FLAC__ASSERT(current_length == chain->initial_length); - } - /* if the metadata shrank more than 4 bytes then there's room to add another padding block */ - else if(current_length + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH <= chain->initial_length) { - FLAC__StreamMetadata *padding; - FLAC__Metadata_Node *node; - if(0 == (padding = FLAC__metadata_object_new(FLAC__METADATA_TYPE_PADDING))) { - chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR; - return 0; - } - padding->length = chain->initial_length - (FLAC__STREAM_METADATA_HEADER_LENGTH + current_length); - if(0 == (node = node_new_())) { - FLAC__metadata_object_delete(padding); - chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR; - return 0; - } - node->data = padding; - chain_append_node_(chain, node); - current_length = chain_calculate_length_(chain); - FLAC__ASSERT(current_length == chain->initial_length); - } - /* if the metadata grew but the last block is padding, try cutting the padding to restore the original length so we don't have to rewrite the whole file */ - else if(current_length > chain->initial_length) { - const FLAC__off_t delta = current_length - chain->initial_length; - if(chain->tail->data->type == FLAC__METADATA_TYPE_PADDING) { - /* if the delta is exactly the size of the last padding block, remove the padding block */ - if((FLAC__off_t)chain->tail->data->length + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH == delta) { - chain_delete_node_(chain, chain->tail); - current_length = chain_calculate_length_(chain); - FLAC__ASSERT(current_length == chain->initial_length); - } - /* if there is at least 'delta' bytes of padding, trim the padding down */ - else if((FLAC__off_t)chain->tail->data->length >= delta) { - chain->tail->data->length -= delta; - current_length -= delta; - FLAC__ASSERT(current_length == chain->initial_length); - } - } - } - } - - return current_length; -} - -static FLAC__bool chain_read_cb_(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Seek seek_cb, FLAC__IOCallback_Tell tell_cb) -{ - FLAC__Metadata_Node *node; - - FLAC__ASSERT(0 != chain); - - /* we assume we're already at the beginning of the file */ - - switch(seek_to_first_metadata_block_cb_(handle, read_cb, seek_cb)) { - case 0: - break; - case 1: - chain->status = FLAC__METADATA_CHAIN_STATUS_READ_ERROR; - return false; - case 2: - chain->status = FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR; - return false; - case 3: - chain->status = FLAC__METADATA_CHAIN_STATUS_NOT_A_FLAC_FILE; - return false; - default: - FLAC__ASSERT(0); - return false; - } - - { - FLAC__int64 pos = tell_cb(handle); - if(pos < 0) { - chain->status = FLAC__METADATA_CHAIN_STATUS_READ_ERROR; - return false; - } - chain->first_offset = (FLAC__off_t)pos; - } - - { - FLAC__bool is_last; - FLAC__MetadataType type; - unsigned length; - - do { - node = node_new_(); - if(0 == node) { - chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR; - return false; - } - - if(!read_metadata_block_header_cb_(handle, read_cb, &is_last, &type, &length)) { - node_delete_(node); - chain->status = FLAC__METADATA_CHAIN_STATUS_READ_ERROR; - return false; - } - - node->data = FLAC__metadata_object_new(type); - if(0 == node->data) { - node_delete_(node); - chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR; - return false; - } - - node->data->is_last = is_last; - node->data->length = length; - - chain->status = get_equivalent_status_(read_metadata_block_data_cb_(handle, read_cb, seek_cb, node->data)); - if(chain->status != FLAC__METADATA_CHAIN_STATUS_OK) { - node_delete_(node); - return false; - } - chain_append_node_(chain, node); - } while(!is_last); - } - - { - FLAC__int64 pos = tell_cb(handle); - if(pos < 0) { - chain->status = FLAC__METADATA_CHAIN_STATUS_READ_ERROR; - return false; - } - chain->last_offset = (FLAC__off_t)pos; - } - - chain->initial_length = chain_calculate_length_(chain); - - return true; -} - -static FLAC__StreamDecoderReadStatus chain_read_ogg_read_cb_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) -{ - FLAC__Metadata_Chain *chain = (FLAC__Metadata_Chain*)client_data; - (void)decoder; - if(*bytes > 0 && chain->status == FLAC__METADATA_CHAIN_STATUS_OK) { - *bytes = chain->read_cb(buffer, sizeof(FLAC__byte), *bytes, chain->handle); - if(*bytes == 0) - return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; - else - return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; - } - else - return FLAC__STREAM_DECODER_READ_STATUS_ABORT; -} - -static FLAC__StreamDecoderWriteStatus chain_read_ogg_write_cb_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) -{ - (void)decoder, (void)frame, (void)buffer, (void)client_data; - return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; -} - -static void chain_read_ogg_metadata_cb_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) -{ - FLAC__Metadata_Chain *chain = (FLAC__Metadata_Chain*)client_data; - FLAC__Metadata_Node *node; - - (void)decoder; - - node = node_new_(); - if(0 == node) { - chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR; - return; - } - - node->data = FLAC__metadata_object_clone(metadata); - if(0 == node->data) { - node_delete_(node); - chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR; - return; - } - - chain_append_node_(chain, node); -} - -static void chain_read_ogg_error_cb_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) -{ - FLAC__Metadata_Chain *chain = (FLAC__Metadata_Chain*)client_data; - (void)decoder, (void)status; - chain->status = FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR; /*@@@ maybe needs better error code */ -} - -static FLAC__bool chain_read_ogg_cb_(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb) -{ - FLAC__StreamDecoder *decoder; - - FLAC__ASSERT(0 != chain); - - /* we assume we're already at the beginning of the file */ - - chain->handle = handle; - chain->read_cb = read_cb; - if(0 == (decoder = FLAC__stream_decoder_new())) { - chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR; - return false; - } - FLAC__stream_decoder_set_metadata_respond_all(decoder); - if(FLAC__stream_decoder_init_ogg_stream(decoder, chain_read_ogg_read_cb_, /*seek_callback=*/0, /*tell_callback=*/0, /*length_callback=*/0, /*eof_callback=*/0, chain_read_ogg_write_cb_, chain_read_ogg_metadata_cb_, chain_read_ogg_error_cb_, chain) != FLAC__STREAM_DECODER_INIT_STATUS_OK) { - FLAC__stream_decoder_delete(decoder); - chain->status = FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR; /*@@@ maybe needs better error code */ - return false; - } - - chain->first_offset = 0; /*@@@ wrong; will need to be set correctly to implement metadata writing for Ogg FLAC */ - - if(!FLAC__stream_decoder_process_until_end_of_metadata(decoder)) - chain->status = FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR; /*@@@ maybe needs better error code */ - if(chain->status != FLAC__METADATA_CHAIN_STATUS_OK) { - FLAC__stream_decoder_delete(decoder); - return false; - } - - FLAC__stream_decoder_delete(decoder); - - chain->last_offset = 0; /*@@@ wrong; will need to be set correctly to implement metadata writing for Ogg FLAC */ - - chain->initial_length = chain_calculate_length_(chain); - - return true; -} - -static FLAC__bool chain_rewrite_metadata_in_place_cb_(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, FLAC__IOCallback_Seek seek_cb) -{ - FLAC__Metadata_Node *node; - - FLAC__ASSERT(0 != chain); - FLAC__ASSERT(0 != chain->head); - - if(0 != seek_cb(handle, chain->first_offset, SEEK_SET)) { - chain->status = FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR; - return false; - } - - for(node = chain->head; node; node = node->next) { - if(!write_metadata_block_header_cb_(handle, write_cb, node->data)) { - chain->status = FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR; - return false; - } - if(!write_metadata_block_data_cb_(handle, write_cb, node->data)) { - chain->status = FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR; - return false; - } - } - - /*FLAC__ASSERT(fflush(), ftello() == chain->last_offset);*/ - - chain->status = FLAC__METADATA_CHAIN_STATUS_OK; - return true; -} - -static FLAC__bool chain_rewrite_metadata_in_place_(FLAC__Metadata_Chain *chain) -{ - FILE *file; - FLAC__bool ret; - - FLAC__ASSERT(0 != chain->filename); - - if(0 == (file = flac_fopen(chain->filename, "r+b"))) { - chain->status = FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE; - return false; - } - - /* chain_rewrite_metadata_in_place_cb_() sets chain->status for us */ - ret = chain_rewrite_metadata_in_place_cb_(chain, (FLAC__IOHandle)file, (FLAC__IOCallback_Write)fwrite, fseek_wrapper_); - - fclose(file); - - return ret; -} - -static FLAC__bool chain_rewrite_file_(FLAC__Metadata_Chain *chain, const char *tempfile_path_prefix) -{ - FILE *f, *tempfile = NULL; - char *tempfilename; - FLAC__Metadata_SimpleIteratorStatus status; - const FLAC__Metadata_Node *node; - - FLAC__ASSERT(0 != chain); - FLAC__ASSERT(0 != chain->filename); - FLAC__ASSERT(0 != chain->head); - - /* copy the file prefix (data up to first metadata block */ - if(0 == (f = flac_fopen(chain->filename, "rb"))) { - chain->status = FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE; - return false; - } - if(!open_tempfile_(chain->filename, tempfile_path_prefix, &tempfile, &tempfilename, &status)) { - chain->status = get_equivalent_status_(status); - goto err; - } - if(!copy_n_bytes_from_file_(f, tempfile, chain->first_offset, &status)) { - chain->status = get_equivalent_status_(status); - goto err; - } - - /* write the metadata */ - for(node = chain->head; node; node = node->next) { - if(!write_metadata_block_header_(tempfile, &status, node->data)) { - chain->status = get_equivalent_status_(status); - goto err; - } - if(!write_metadata_block_data_(tempfile, &status, node->data)) { - chain->status = get_equivalent_status_(status); - goto err; - } - } - /*FLAC__ASSERT(fflush(), ftello() == chain->last_offset);*/ - - /* copy the file postfix (everything after the metadata) */ - if(0 != fseeko(f, chain->last_offset, SEEK_SET)) { - chain->status = FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR; - goto err; - } - if(!copy_remaining_bytes_from_file_(f, tempfile, &status)) { - chain->status = get_equivalent_status_(status); - goto err; - } - - /* move the tempfile on top of the original */ - (void)fclose(f); - if(!transport_tempfile_(chain->filename, &tempfile, &tempfilename, &status)) - return false; - - return true; - -err: - (void)fclose(f); - cleanup_tempfile_(&tempfile, &tempfilename); - return false; -} - -/* assumes 'handle' is already at beginning of file */ -static FLAC__bool chain_rewrite_file_cb_(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Seek seek_cb, FLAC__IOCallback_Eof eof_cb, FLAC__IOHandle temp_handle, FLAC__IOCallback_Write temp_write_cb) -{ - FLAC__Metadata_SimpleIteratorStatus status; - const FLAC__Metadata_Node *node; - - FLAC__ASSERT(0 != chain); - FLAC__ASSERT(0 == chain->filename); - FLAC__ASSERT(0 != chain->head); - - /* copy the file prefix (data up to first metadata block */ - if(!copy_n_bytes_from_file_cb_(handle, read_cb, temp_handle, temp_write_cb, chain->first_offset, &status)) { - chain->status = get_equivalent_status_(status); - return false; - } - - /* write the metadata */ - for(node = chain->head; node; node = node->next) { - if(!write_metadata_block_header_cb_(temp_handle, temp_write_cb, node->data)) { - chain->status = FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR; - return false; - } - if(!write_metadata_block_data_cb_(temp_handle, temp_write_cb, node->data)) { - chain->status = FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR; - return false; - } - } - /*FLAC__ASSERT(fflush(), ftello() == chain->last_offset);*/ - - /* copy the file postfix (everything after the metadata) */ - if(0 != seek_cb(handle, chain->last_offset, SEEK_SET)) { - chain->status = FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR; - return false; - } - if(!copy_remaining_bytes_from_file_cb_(handle, read_cb, eof_cb, temp_handle, temp_write_cb, &status)) { - chain->status = get_equivalent_status_(status); - return false; - } - - return true; -} - -FLAC_API FLAC__Metadata_Chain *FLAC__metadata_chain_new(void) -{ - FLAC__Metadata_Chain *chain = calloc(1, sizeof(FLAC__Metadata_Chain)); - - if(0 != chain) - chain_init_(chain); - - return chain; -} - -FLAC_API void FLAC__metadata_chain_delete(FLAC__Metadata_Chain *chain) -{ - FLAC__ASSERT(0 != chain); - - chain_clear_(chain); - - free(chain); -} - -FLAC_API FLAC__Metadata_ChainStatus FLAC__metadata_chain_status(FLAC__Metadata_Chain *chain) -{ - FLAC__Metadata_ChainStatus status; - - FLAC__ASSERT(0 != chain); - - status = chain->status; - chain->status = FLAC__METADATA_CHAIN_STATUS_OK; - return status; -} - -static FLAC__bool chain_read_(FLAC__Metadata_Chain *chain, const char *filename, FLAC__bool is_ogg) -{ - FILE *file; - FLAC__bool ret; - - FLAC__ASSERT(0 != chain); - FLAC__ASSERT(0 != filename); - - chain_clear_(chain); - - if(0 == (chain->filename = strdup(filename))) { - chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR; - return false; - } - - chain->is_ogg = is_ogg; - - if(0 == (file = flac_fopen(filename, "rb"))) { - chain->status = FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE; - return false; - } - - /* the function also sets chain->status for us */ - ret = is_ogg? - chain_read_ogg_cb_(chain, file, (FLAC__IOCallback_Read)fread) : - chain_read_cb_(chain, file, (FLAC__IOCallback_Read)fread, fseek_wrapper_, ftell_wrapper_) - ; - - fclose(file); - - return ret; -} - -FLAC_API FLAC__bool FLAC__metadata_chain_read(FLAC__Metadata_Chain *chain, const char *filename) -{ - return chain_read_(chain, filename, /*is_ogg=*/false); -} - -/*@@@@add to tests*/ -FLAC_API FLAC__bool FLAC__metadata_chain_read_ogg(FLAC__Metadata_Chain *chain, const char *filename) -{ - return chain_read_(chain, filename, /*is_ogg=*/true); -} - -static FLAC__bool chain_read_with_callbacks_(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks, FLAC__bool is_ogg) -{ - FLAC__bool ret; - - FLAC__ASSERT(0 != chain); - - chain_clear_(chain); - - if (0 == callbacks.read || 0 == callbacks.seek || 0 == callbacks.tell) { - chain->status = FLAC__METADATA_CHAIN_STATUS_INVALID_CALLBACKS; - return false; - } - - chain->is_ogg = is_ogg; - - /* rewind */ - if(0 != callbacks.seek(handle, 0, SEEK_SET)) { - chain->status = FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR; - return false; - } - - /* the function also sets chain->status for us */ - ret = is_ogg? - chain_read_ogg_cb_(chain, handle, callbacks.read) : - chain_read_cb_(chain, handle, callbacks.read, callbacks.seek, callbacks.tell) - ; - - return ret; -} - -FLAC_API FLAC__bool FLAC__metadata_chain_read_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks) -{ - return chain_read_with_callbacks_(chain, handle, callbacks, /*is_ogg=*/false); -} - -/*@@@@add to tests*/ -FLAC_API FLAC__bool FLAC__metadata_chain_read_ogg_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks) -{ - return chain_read_with_callbacks_(chain, handle, callbacks, /*is_ogg=*/true); -} - -FLAC_API FLAC__bool FLAC__metadata_chain_check_if_tempfile_needed(FLAC__Metadata_Chain *chain, FLAC__bool use_padding) -{ - /* This does all the same checks that are in chain_prepare_for_write_() - * but doesn't actually alter the chain. Make sure to update the logic - * here if chain_prepare_for_write_() changes. - */ - const FLAC__off_t current_length = chain_calculate_length_(chain); - - FLAC__ASSERT(0 != chain); - - if(use_padding) { - /* if the metadata shrank and the last block is padding, we just extend the last padding block */ - if(current_length < chain->initial_length && chain->tail->data->type == FLAC__METADATA_TYPE_PADDING) - return false; - /* if the metadata shrank more than 4 bytes then there's room to add another padding block */ - else if(current_length + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH <= chain->initial_length) - return false; - /* if the metadata grew but the last block is padding, try cutting the padding to restore the original length so we don't have to rewrite the whole file */ - else if(current_length > chain->initial_length) { - const FLAC__off_t delta = current_length - chain->initial_length; - if(chain->tail->data->type == FLAC__METADATA_TYPE_PADDING) { - /* if the delta is exactly the size of the last padding block, remove the padding block */ - if((FLAC__off_t)chain->tail->data->length + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH == delta) - return false; - /* if there is at least 'delta' bytes of padding, trim the padding down */ - else if((FLAC__off_t)chain->tail->data->length >= delta) - return false; - } - } - } - - return (current_length != chain->initial_length); -} - -FLAC_API FLAC__bool FLAC__metadata_chain_write(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__bool preserve_file_stats) -{ - struct flac_stat_s stats; - const char *tempfile_path_prefix = 0; - FLAC__off_t current_length; - - FLAC__ASSERT(0 != chain); - - if (chain->is_ogg) { /* cannot write back to Ogg FLAC yet */ - chain->status = FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR; - return false; - } - - if (0 == chain->filename) { - chain->status = FLAC__METADATA_CHAIN_STATUS_READ_WRITE_MISMATCH; - return false; - } - - current_length = chain_prepare_for_write_(chain, use_padding); - - /* a return value of 0 means there was an error; chain->status is already set */ - if (0 == current_length) - return false; - - if(preserve_file_stats) - get_file_stats_(chain->filename, &stats); - - if(current_length == chain->initial_length) { - if(!chain_rewrite_metadata_in_place_(chain)) - return false; - } - else { - if(!chain_rewrite_file_(chain, tempfile_path_prefix)) - return false; - - /* recompute lengths and offsets */ - { - const FLAC__Metadata_Node *node; - chain->initial_length = current_length; - chain->last_offset = chain->first_offset; - for(node = chain->head; node; node = node->next) - chain->last_offset += (FLAC__STREAM_METADATA_HEADER_LENGTH + node->data->length); - } - } - - if(preserve_file_stats) - set_file_stats_(chain->filename, &stats); - - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_chain_write_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks) -{ - FLAC__off_t current_length; - - FLAC__ASSERT(0 != chain); - - if (chain->is_ogg) { /* cannot write back to Ogg FLAC yet */ - chain->status = FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR; - return false; - } - - if (0 != chain->filename) { - chain->status = FLAC__METADATA_CHAIN_STATUS_READ_WRITE_MISMATCH; - return false; - } - - if (0 == callbacks.write || 0 == callbacks.seek) { - chain->status = FLAC__METADATA_CHAIN_STATUS_INVALID_CALLBACKS; - return false; - } - - if (FLAC__metadata_chain_check_if_tempfile_needed(chain, use_padding)) { - chain->status = FLAC__METADATA_CHAIN_STATUS_WRONG_WRITE_CALL; - return false; - } - - current_length = chain_prepare_for_write_(chain, use_padding); - - /* a return value of 0 means there was an error; chain->status is already set */ - if (0 == current_length) - return false; - - FLAC__ASSERT(current_length == chain->initial_length); - - return chain_rewrite_metadata_in_place_cb_(chain, handle, callbacks.write, callbacks.seek); -} - -FLAC_API FLAC__bool FLAC__metadata_chain_write_with_callbacks_and_tempfile(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks, FLAC__IOHandle temp_handle, FLAC__IOCallbacks temp_callbacks) -{ - FLAC__off_t current_length; - - FLAC__ASSERT(0 != chain); - - if (chain->is_ogg) { /* cannot write back to Ogg FLAC yet */ - chain->status = FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR; - return false; - } - - if (0 != chain->filename) { - chain->status = FLAC__METADATA_CHAIN_STATUS_READ_WRITE_MISMATCH; - return false; - } - - if (0 == callbacks.read || 0 == callbacks.seek || 0 == callbacks.eof) { - chain->status = FLAC__METADATA_CHAIN_STATUS_INVALID_CALLBACKS; - return false; - } - if (0 == temp_callbacks.write) { - chain->status = FLAC__METADATA_CHAIN_STATUS_INVALID_CALLBACKS; - return false; - } - - if (!FLAC__metadata_chain_check_if_tempfile_needed(chain, use_padding)) { - chain->status = FLAC__METADATA_CHAIN_STATUS_WRONG_WRITE_CALL; - return false; - } - - current_length = chain_prepare_for_write_(chain, use_padding); - - /* a return value of 0 means there was an error; chain->status is already set */ - if (0 == current_length) - return false; - - FLAC__ASSERT(current_length != chain->initial_length); - - /* rewind */ - if(0 != callbacks.seek(handle, 0, SEEK_SET)) { - chain->status = FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR; - return false; - } - - if(!chain_rewrite_file_cb_(chain, handle, callbacks.read, callbacks.seek, callbacks.eof, temp_handle, temp_callbacks.write)) - return false; - - /* recompute lengths and offsets */ - { - const FLAC__Metadata_Node *node; - chain->initial_length = current_length; - chain->last_offset = chain->first_offset; - for(node = chain->head; node; node = node->next) - chain->last_offset += (FLAC__STREAM_METADATA_HEADER_LENGTH + node->data->length); - } - - return true; -} - -FLAC_API void FLAC__metadata_chain_merge_padding(FLAC__Metadata_Chain *chain) -{ - FLAC__Metadata_Node *node; - - FLAC__ASSERT(0 != chain); - - for(node = chain->head; node; ) { - if(!chain_merge_adjacent_padding_(chain, node)) - node = node->next; - } -} - -FLAC_API void FLAC__metadata_chain_sort_padding(FLAC__Metadata_Chain *chain) -{ - FLAC__Metadata_Node *node, *save; - unsigned i; - - FLAC__ASSERT(0 != chain); - - /* - * Don't try and be too smart... this simple algo is good enough for - * the small number of nodes that we deal with. - */ - for(i = 0, node = chain->head; i < chain->nodes; i++) { - if(node->data->type == FLAC__METADATA_TYPE_PADDING) { - save = node->next; - chain_remove_node_(chain, node); - chain_append_node_(chain, node); - node = save; - } - else { - node = node->next; - } - } - - FLAC__metadata_chain_merge_padding(chain); -} - - -FLAC_API FLAC__Metadata_Iterator *FLAC__metadata_iterator_new(void) -{ - FLAC__Metadata_Iterator *iterator = calloc(1, sizeof(FLAC__Metadata_Iterator)); - - /* calloc() implies: - iterator->current = 0; - iterator->chain = 0; - */ - - return iterator; -} - -FLAC_API void FLAC__metadata_iterator_delete(FLAC__Metadata_Iterator *iterator) -{ - FLAC__ASSERT(0 != iterator); - - free(iterator); -} - -FLAC_API void FLAC__metadata_iterator_init(FLAC__Metadata_Iterator *iterator, FLAC__Metadata_Chain *chain) -{ - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != chain); - FLAC__ASSERT(0 != chain->head); - - iterator->chain = chain; - iterator->current = chain->head; -} - -FLAC_API FLAC__bool FLAC__metadata_iterator_next(FLAC__Metadata_Iterator *iterator) -{ - FLAC__ASSERT(0 != iterator); - - if(0 == iterator->current || 0 == iterator->current->next) - return false; - - iterator->current = iterator->current->next; - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_iterator_prev(FLAC__Metadata_Iterator *iterator) -{ - FLAC__ASSERT(0 != iterator); - - if(0 == iterator->current || 0 == iterator->current->prev) - return false; - - iterator->current = iterator->current->prev; - return true; -} - -FLAC_API FLAC__MetadataType FLAC__metadata_iterator_get_block_type(const FLAC__Metadata_Iterator *iterator) -{ - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->current); - FLAC__ASSERT(0 != iterator->current->data); - - return iterator->current->data->type; -} - -FLAC_API FLAC__StreamMetadata *FLAC__metadata_iterator_get_block(FLAC__Metadata_Iterator *iterator) -{ - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->current); - - return iterator->current->data; -} - -FLAC_API FLAC__bool FLAC__metadata_iterator_set_block(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block) -{ - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != block); - return FLAC__metadata_iterator_delete_block(iterator, false) && FLAC__metadata_iterator_insert_block_after(iterator, block); -} - -FLAC_API FLAC__bool FLAC__metadata_iterator_delete_block(FLAC__Metadata_Iterator *iterator, FLAC__bool replace_with_padding) -{ - FLAC__Metadata_Node *save; - - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->current); - - if(0 == iterator->current->prev) { - FLAC__ASSERT(iterator->current->data->type == FLAC__METADATA_TYPE_STREAMINFO); - return false; - } - - save = iterator->current->prev; - - if(replace_with_padding) { - FLAC__metadata_object_delete_data(iterator->current->data); - iterator->current->data->type = FLAC__METADATA_TYPE_PADDING; - } - else { - chain_delete_node_(iterator->chain, iterator->current); - } - - iterator->current = save; - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_iterator_insert_block_before(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block) -{ - FLAC__Metadata_Node *node; - - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->current); - FLAC__ASSERT(0 != block); - - if(block->type == FLAC__METADATA_TYPE_STREAMINFO) - return false; - - if(0 == iterator->current->prev) { - FLAC__ASSERT(iterator->current->data->type == FLAC__METADATA_TYPE_STREAMINFO); - return false; - } - - if(0 == (node = node_new_())) - return false; - - node->data = block; - iterator_insert_node_(iterator, node); - iterator->current = node; - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_iterator_insert_block_after(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block) -{ - FLAC__Metadata_Node *node; - - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->current); - FLAC__ASSERT(0 != block); - - if(block->type == FLAC__METADATA_TYPE_STREAMINFO) - return false; - - if(0 == (node = node_new_())) - return false; - - node->data = block; - iterator_insert_node_after_(iterator, node); - iterator->current = node; - return true; -} - - -/**************************************************************************** - * - * Local function definitions - * - ***************************************************************************/ - -void pack_uint32_(FLAC__uint32 val, FLAC__byte *b, unsigned bytes) -{ - unsigned i; - - b += bytes; - - for(i = 0; i < bytes; i++) { - *(--b) = (FLAC__byte)(val & 0xff); - val >>= 8; - } -} - -void pack_uint32_little_endian_(FLAC__uint32 val, FLAC__byte *b, unsigned bytes) -{ - unsigned i; - - for(i = 0; i < bytes; i++) { - *(b++) = (FLAC__byte)(val & 0xff); - val >>= 8; - } -} - -void pack_uint64_(FLAC__uint64 val, FLAC__byte *b, unsigned bytes) -{ - unsigned i; - - b += bytes; - - for(i = 0; i < bytes; i++) { - *(--b) = (FLAC__byte)(val & 0xff); - val >>= 8; - } -} - -FLAC__uint32 unpack_uint32_(FLAC__byte *b, unsigned bytes) -{ - FLAC__uint32 ret = 0; - unsigned i; - - for(i = 0; i < bytes; i++) - ret = (ret << 8) | (FLAC__uint32)(*b++); - - return ret; -} - -FLAC__uint32 unpack_uint32_little_endian_(FLAC__byte *b, unsigned bytes) -{ - FLAC__uint32 ret = 0; - unsigned i; - - b += bytes; - - for(i = 0; i < bytes; i++) - ret = (ret << 8) | (FLAC__uint32)(*--b); - - return ret; -} - -FLAC__uint64 unpack_uint64_(FLAC__byte *b, unsigned bytes) -{ - FLAC__uint64 ret = 0; - unsigned i; - - for(i = 0; i < bytes; i++) - ret = (ret << 8) | (FLAC__uint64)(*b++); - - return ret; -} - -FLAC__bool read_metadata_block_header_(FLAC__Metadata_SimpleIterator *iterator) -{ - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->file); - - if(!read_metadata_block_header_cb_((FLAC__IOHandle)iterator->file, (FLAC__IOCallback_Read)fread, &iterator->is_last, &iterator->type, &iterator->length)) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - return false; - } - - return true; -} - -FLAC__bool read_metadata_block_data_(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block) -{ - FLAC__ASSERT(0 != iterator); - FLAC__ASSERT(0 != iterator->file); - - iterator->status = read_metadata_block_data_cb_((FLAC__IOHandle)iterator->file, (FLAC__IOCallback_Read)fread, fseek_wrapper_, block); - - return (iterator->status == FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK); -} - -FLAC__bool read_metadata_block_header_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__bool *is_last, FLAC__MetadataType *type, unsigned *length) -{ - FLAC__byte raw_header[FLAC__STREAM_METADATA_HEADER_LENGTH]; - - if(read_cb(raw_header, 1, FLAC__STREAM_METADATA_HEADER_LENGTH, handle) != FLAC__STREAM_METADATA_HEADER_LENGTH) - return false; - - *is_last = raw_header[0] & 0x80? true : false; - *type = (FLAC__MetadataType)(raw_header[0] & 0x7f); - *length = unpack_uint32_(raw_header + 1, 3); - - /* Note that we don't check: - * if(iterator->type >= FLAC__METADATA_TYPE_UNDEFINED) - * we just will read in an opaque block - */ - - return true; -} - -FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Seek seek_cb, FLAC__StreamMetadata *block) -{ - switch(block->type) { - case FLAC__METADATA_TYPE_STREAMINFO: - return read_metadata_block_data_streaminfo_cb_(handle, read_cb, &block->data.stream_info); - case FLAC__METADATA_TYPE_PADDING: - return read_metadata_block_data_padding_cb_(handle, seek_cb, &block->data.padding, block->length); - case FLAC__METADATA_TYPE_APPLICATION: - return read_metadata_block_data_application_cb_(handle, read_cb, &block->data.application, block->length); - case FLAC__METADATA_TYPE_SEEKTABLE: - return read_metadata_block_data_seektable_cb_(handle, read_cb, &block->data.seek_table, block->length); - case FLAC__METADATA_TYPE_VORBIS_COMMENT: - return read_metadata_block_data_vorbis_comment_cb_(handle, read_cb, seek_cb, &block->data.vorbis_comment, block->length); - case FLAC__METADATA_TYPE_CUESHEET: - return read_metadata_block_data_cuesheet_cb_(handle, read_cb, &block->data.cue_sheet); - case FLAC__METADATA_TYPE_PICTURE: - return read_metadata_block_data_picture_cb_(handle, read_cb, &block->data.picture); - default: - return read_metadata_block_data_unknown_cb_(handle, read_cb, &block->data.unknown, block->length); - } -} - -FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_streaminfo_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_StreamInfo *block) -{ - FLAC__byte buffer[FLAC__STREAM_METADATA_STREAMINFO_LENGTH], *b; - - if(read_cb(buffer, 1, FLAC__STREAM_METADATA_STREAMINFO_LENGTH, handle) != FLAC__STREAM_METADATA_STREAMINFO_LENGTH) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - - b = buffer; - - /* we are using hardcoded numbers for simplicity but we should - * probably eventually write a bit-level unpacker and use the - * _STREAMINFO_ constants. - */ - block->min_blocksize = unpack_uint32_(b, 2); b += 2; - block->max_blocksize = unpack_uint32_(b, 2); b += 2; - block->min_framesize = unpack_uint32_(b, 3); b += 3; - block->max_framesize = unpack_uint32_(b, 3); b += 3; - block->sample_rate = (unpack_uint32_(b, 2) << 4) | ((unsigned)(b[2] & 0xf0) >> 4); - block->channels = (unsigned)((b[2] & 0x0e) >> 1) + 1; - block->bits_per_sample = ((((unsigned)(b[2] & 0x01)) << 4) | (((unsigned)(b[3] & 0xf0)) >> 4)) + 1; - block->total_samples = (((FLAC__uint64)(b[3] & 0x0f)) << 32) | unpack_uint64_(b+4, 4); - memcpy(block->md5sum, b+8, 16); - - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; -} - -FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_padding_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Seek seek_cb, FLAC__StreamMetadata_Padding *block, unsigned block_length) -{ - (void)block; /* nothing to do; we don't care about reading the padding bytes */ - - if(0 != seek_cb(handle, block_length, SEEK_CUR)) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; - - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; -} - -FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_application_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_Application *block, unsigned block_length) -{ - const unsigned id_bytes = FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8; - - if(read_cb(block->id, 1, id_bytes, handle) != id_bytes) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - - if(block_length < id_bytes) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - - block_length -= id_bytes; - - if(block_length == 0) { - block->data = 0; - } - else { - if(0 == (block->data = malloc(block_length))) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; - - if(read_cb(block->data, 1, block_length, handle) != block_length) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - } - - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; -} - -FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_seektable_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_SeekTable *block, unsigned block_length) -{ - unsigned i; - FLAC__byte buffer[FLAC__STREAM_METADATA_SEEKPOINT_LENGTH]; - - FLAC__ASSERT(block_length % FLAC__STREAM_METADATA_SEEKPOINT_LENGTH == 0); - - block->num_points = block_length / FLAC__STREAM_METADATA_SEEKPOINT_LENGTH; - - if(block->num_points == 0) - block->points = 0; - else if(0 == (block->points = safe_malloc_mul_2op_p(block->num_points, /*times*/sizeof(FLAC__StreamMetadata_SeekPoint)))) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; - - for(i = 0; i < block->num_points; i++) { - if(read_cb(buffer, 1, FLAC__STREAM_METADATA_SEEKPOINT_LENGTH, handle) != FLAC__STREAM_METADATA_SEEKPOINT_LENGTH) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - /* some MAGIC NUMBERs here */ - block->points[i].sample_number = unpack_uint64_(buffer, 8); - block->points[i].stream_offset = unpack_uint64_(buffer+8, 8); - block->points[i].frame_samples = unpack_uint32_(buffer+16, 2); - } - - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; -} - -FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_vorbis_comment_entry_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_VorbisComment_Entry *entry, unsigned max_length) -{ - const unsigned entry_length_len = FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN / 8; - FLAC__byte buffer[4]; /* magic number is asserted below */ - - FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN / 8 == sizeof(buffer)); - - if(max_length < entry_length_len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_BAD_METADATA; - - max_length -= entry_length_len; - if(read_cb(buffer, 1, entry_length_len, handle) != entry_length_len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - entry->length = unpack_uint32_little_endian_(buffer, entry_length_len); - if(max_length < entry->length) { - entry->length = 0; - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_BAD_METADATA; - } else max_length -= entry->length; - - if(0 != entry->entry) - free(entry->entry); - - if(entry->length == 0) { - entry->entry = 0; - } - else { - if(0 == (entry->entry = safe_malloc_add_2op_(entry->length, /*+*/1))) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; - - if(read_cb(entry->entry, 1, entry->length, handle) != entry->length) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - - entry->entry[entry->length] = '\0'; - } - - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; -} - -FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_vorbis_comment_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Seek seek_cb, FLAC__StreamMetadata_VorbisComment *block, unsigned block_length) -{ - unsigned i; - FLAC__Metadata_SimpleIteratorStatus status; - const unsigned num_comments_len = FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN / 8; - FLAC__byte buffer[4]; /* magic number is asserted below */ - - FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN / 8 == sizeof(buffer)); - - status = read_metadata_block_data_vorbis_comment_entry_cb_(handle, read_cb, &(block->vendor_string), block_length); - if(block_length >= 4) - block_length -= 4; - if(status == FLAC__METADATA_SIMPLE_ITERATOR_STATUS_BAD_METADATA) - goto skip; - else if(status != FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK) - return status; - block_length -= block->vendor_string.length; - - if(block_length < num_comments_len) goto skip; else block_length -= num_comments_len; - if(read_cb(buffer, 1, num_comments_len, handle) != num_comments_len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - block->num_comments = unpack_uint32_little_endian_(buffer, num_comments_len); - - if(block->num_comments == 0) { - block->comments = 0; - } - else if(0 == (block->comments = calloc(block->num_comments, sizeof(FLAC__StreamMetadata_VorbisComment_Entry)))) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; - - for(i = 0; i < block->num_comments; i++) { - status = read_metadata_block_data_vorbis_comment_entry_cb_(handle, read_cb, block->comments + i, block_length); - if(block_length >= 4) block_length -= 4; - if(status == FLAC__METADATA_SIMPLE_ITERATOR_STATUS_BAD_METADATA) { - block->num_comments = i; - goto skip; - } - else if(status != FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK) return status; - block_length -= block->comments[i].length; - } - - skip: - if(block_length > 0) { - /* bad metadata */ - if(0 != seek_cb(handle, block_length, SEEK_CUR)) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; - } - - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; -} - -FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_cuesheet_track_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_CueSheet_Track *track) -{ - unsigned i, len; - FLAC__byte buffer[32]; /* asserted below that this is big enough */ - - FLAC__ASSERT(sizeof(buffer) >= sizeof(FLAC__uint64)); - FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN/8); - FLAC__ASSERT(sizeof(buffer) >= (FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN) / 8); - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN / 8; - if(read_cb(buffer, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - track->offset = unpack_uint64_(buffer, len); - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN / 8; - if(read_cb(buffer, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - track->number = (FLAC__byte)unpack_uint32_(buffer, len); - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN / 8; - if(read_cb(track->isrc, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - - FLAC__ASSERT((FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN) % 8 == 0); - len = (FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN) / 8; - if(read_cb(buffer, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN == 1); - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN == 1); - track->type = buffer[0] >> 7; - track->pre_emphasis = (buffer[0] >> 6) & 1; - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN / 8; - if(read_cb(buffer, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - track->num_indices = (FLAC__byte)unpack_uint32_(buffer, len); - - if(track->num_indices == 0) { - track->indices = 0; - } - else if(0 == (track->indices = calloc(track->num_indices, sizeof(FLAC__StreamMetadata_CueSheet_Index)))) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; - - for(i = 0; i < track->num_indices; i++) { - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN / 8; - if(read_cb(buffer, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - track->indices[i].offset = unpack_uint64_(buffer, len); - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN / 8; - if(read_cb(buffer, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - track->indices[i].number = (FLAC__byte)unpack_uint32_(buffer, len); - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN / 8; - if(read_cb(buffer, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - } - - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; -} - -FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_cuesheet_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_CueSheet *block) -{ - unsigned i, len; - FLAC__Metadata_SimpleIteratorStatus status; - FLAC__byte buffer[1024]; /* MSVC needs a constant expression so we put a magic number and assert */ - - FLAC__ASSERT((FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN + FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN)/8 <= sizeof(buffer)); - FLAC__ASSERT(sizeof(FLAC__uint64) <= sizeof(buffer)); - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN / 8; - if(read_cb(block->media_catalog_number, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN / 8; - if(read_cb(buffer, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - block->lead_in = unpack_uint64_(buffer, len); - - FLAC__ASSERT((FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN + FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN) % 8 == 0); - len = (FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN + FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN) / 8; - if(read_cb(buffer, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - block->is_cd = buffer[0]&0x80? true : false; - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN / 8; - if(read_cb(buffer, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - block->num_tracks = unpack_uint32_(buffer, len); - - if(block->num_tracks == 0) { - block->tracks = 0; - } - else if(0 == (block->tracks = calloc(block->num_tracks, sizeof(FLAC__StreamMetadata_CueSheet_Track)))) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; - - for(i = 0; i < block->num_tracks; i++) { - if(FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK != (status = read_metadata_block_data_cuesheet_track_cb_(handle, read_cb, block->tracks + i))) - return status; - } - - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; -} - -static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_picture_cstring_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__byte **data, FLAC__uint32 *length, FLAC__uint32 length_len) -{ - FLAC__byte buffer[sizeof(FLAC__uint32)]; - - FLAC__ASSERT(0 != data); - FLAC__ASSERT(length_len%8 == 0); - - length_len /= 8; /* convert to bytes */ - - FLAC__ASSERT(sizeof(buffer) >= length_len); - - if(read_cb(buffer, 1, length_len, handle) != length_len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - *length = unpack_uint32_(buffer, length_len); - - if(0 != *data) - free(*data); - - if(0 == (*data = safe_malloc_add_2op_(*length, /*+*/1))) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; - - if(*length > 0) { - if(read_cb(*data, 1, *length, handle) != *length) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - } - - (*data)[*length] = '\0'; - - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; -} - -FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_picture_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_Picture *block) -{ - FLAC__Metadata_SimpleIteratorStatus status; - FLAC__byte buffer[4]; /* asserted below that this is big enough */ - FLAC__uint32 len; - - FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_TYPE_LEN/8); - FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN/8); - FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN/8); - FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN/8); - FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_COLORS_LEN/8); - - FLAC__ASSERT(FLAC__STREAM_METADATA_PICTURE_TYPE_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_PICTURE_TYPE_LEN / 8; - if(read_cb(buffer, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - block->type = (FLAC__StreamMetadata_Picture_Type)unpack_uint32_(buffer, len); - - if((status = read_metadata_block_data_picture_cstring_cb_(handle, read_cb, (FLAC__byte**)(&(block->mime_type)), &len, FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN)) != FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK) - return status; - - if((status = read_metadata_block_data_picture_cstring_cb_(handle, read_cb, &(block->description), &len, FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN)) != FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK) - return status; - - FLAC__ASSERT(FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN / 8; - if(read_cb(buffer, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - block->width = unpack_uint32_(buffer, len); - - FLAC__ASSERT(FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN / 8; - if(read_cb(buffer, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - block->height = unpack_uint32_(buffer, len); - - FLAC__ASSERT(FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN / 8; - if(read_cb(buffer, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - block->depth = unpack_uint32_(buffer, len); - - FLAC__ASSERT(FLAC__STREAM_METADATA_PICTURE_COLORS_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_PICTURE_COLORS_LEN / 8; - if(read_cb(buffer, 1, len, handle) != len) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - block->colors = unpack_uint32_(buffer, len); - - /* for convenience we use read_metadata_block_data_picture_cstring_cb_() even though it adds an extra terminating NUL we don't use */ - if((status = read_metadata_block_data_picture_cstring_cb_(handle, read_cb, &(block->data), &(block->data_length), FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN)) != FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK) - return status; - - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; -} - -FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_unknown_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_Unknown *block, unsigned block_length) -{ - if(block_length == 0) { - block->data = 0; - } - else { - if(0 == (block->data = malloc(block_length))) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; - - if(read_cb(block->data, 1, block_length, handle) != block_length) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - } - - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; -} - -FLAC__bool write_metadata_block_header_(FILE *file, FLAC__Metadata_SimpleIteratorStatus *status, const FLAC__StreamMetadata *block) -{ - FLAC__ASSERT(0 != file); - FLAC__ASSERT(0 != status); - - if(!write_metadata_block_header_cb_((FLAC__IOHandle)file, (FLAC__IOCallback_Write)fwrite, block)) { - *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR; - return false; - } - - return true; -} - -FLAC__bool write_metadata_block_data_(FILE *file, FLAC__Metadata_SimpleIteratorStatus *status, const FLAC__StreamMetadata *block) -{ - FLAC__ASSERT(0 != file); - FLAC__ASSERT(0 != status); - - if (write_metadata_block_data_cb_((FLAC__IOHandle)file, (FLAC__IOCallback_Write)fwrite, block)) { - *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK; - return true; - } - else { - *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR; - return false; - } -} - -FLAC__bool write_metadata_block_header_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata *block) -{ - FLAC__byte buffer[FLAC__STREAM_METADATA_HEADER_LENGTH]; - - FLAC__ASSERT(block->length < (1u << FLAC__STREAM_METADATA_LENGTH_LEN)); - - buffer[0] = (block->is_last? 0x80 : 0) | (FLAC__byte)block->type; - pack_uint32_(block->length, buffer + 1, 3); - - if(write_cb(buffer, 1, FLAC__STREAM_METADATA_HEADER_LENGTH, handle) != FLAC__STREAM_METADATA_HEADER_LENGTH) - return false; - - return true; -} - -FLAC__bool write_metadata_block_data_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata *block) -{ - FLAC__ASSERT(0 != block); - - switch(block->type) { - case FLAC__METADATA_TYPE_STREAMINFO: - return write_metadata_block_data_streaminfo_cb_(handle, write_cb, &block->data.stream_info); - case FLAC__METADATA_TYPE_PADDING: - return write_metadata_block_data_padding_cb_(handle, write_cb, &block->data.padding, block->length); - case FLAC__METADATA_TYPE_APPLICATION: - return write_metadata_block_data_application_cb_(handle, write_cb, &block->data.application, block->length); - case FLAC__METADATA_TYPE_SEEKTABLE: - return write_metadata_block_data_seektable_cb_(handle, write_cb, &block->data.seek_table); - case FLAC__METADATA_TYPE_VORBIS_COMMENT: - return write_metadata_block_data_vorbis_comment_cb_(handle, write_cb, &block->data.vorbis_comment); - case FLAC__METADATA_TYPE_CUESHEET: - return write_metadata_block_data_cuesheet_cb_(handle, write_cb, &block->data.cue_sheet); - case FLAC__METADATA_TYPE_PICTURE: - return write_metadata_block_data_picture_cb_(handle, write_cb, &block->data.picture); - default: - return write_metadata_block_data_unknown_cb_(handle, write_cb, &block->data.unknown, block->length); - } -} - -FLAC__bool write_metadata_block_data_streaminfo_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_StreamInfo *block) -{ - FLAC__byte buffer[FLAC__STREAM_METADATA_STREAMINFO_LENGTH]; - const unsigned channels1 = block->channels - 1; - const unsigned bps1 = block->bits_per_sample - 1; - - /* we are using hardcoded numbers for simplicity but we should - * probably eventually write a bit-level packer and use the - * _STREAMINFO_ constants. - */ - pack_uint32_(block->min_blocksize, buffer, 2); - pack_uint32_(block->max_blocksize, buffer+2, 2); - pack_uint32_(block->min_framesize, buffer+4, 3); - pack_uint32_(block->max_framesize, buffer+7, 3); - buffer[10] = (block->sample_rate >> 12) & 0xff; - buffer[11] = (block->sample_rate >> 4) & 0xff; - buffer[12] = ((block->sample_rate & 0x0f) << 4) | (channels1 << 1) | (bps1 >> 4); - buffer[13] = (FLAC__byte)(((bps1 & 0x0f) << 4) | ((block->total_samples >> 32) & 0x0f)); - pack_uint32_((FLAC__uint32)block->total_samples, buffer+14, 4); - memcpy(buffer+18, block->md5sum, 16); - - if(write_cb(buffer, 1, FLAC__STREAM_METADATA_STREAMINFO_LENGTH, handle) != FLAC__STREAM_METADATA_STREAMINFO_LENGTH) - return false; - - return true; -} - -FLAC__bool write_metadata_block_data_padding_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_Padding *block, unsigned block_length) -{ - unsigned i, n = block_length; - FLAC__byte buffer[1024]; - - (void)block; - - memset(buffer, 0, 1024); - - for(i = 0; i < n/1024; i++) - if(write_cb(buffer, 1, 1024, handle) != 1024) - return false; - - n %= 1024; - - if(write_cb(buffer, 1, n, handle) != n) - return false; - - return true; -} - -FLAC__bool write_metadata_block_data_application_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_Application *block, unsigned block_length) -{ - const unsigned id_bytes = FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8; - - if(write_cb(block->id, 1, id_bytes, handle) != id_bytes) - return false; - - block_length -= id_bytes; - - if(write_cb(block->data, 1, block_length, handle) != block_length) - return false; - - return true; -} - -FLAC__bool write_metadata_block_data_seektable_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_SeekTable *block) -{ - unsigned i; - FLAC__byte buffer[FLAC__STREAM_METADATA_SEEKPOINT_LENGTH]; - - for(i = 0; i < block->num_points; i++) { - /* some MAGIC NUMBERs here */ - pack_uint64_(block->points[i].sample_number, buffer, 8); - pack_uint64_(block->points[i].stream_offset, buffer+8, 8); - pack_uint32_(block->points[i].frame_samples, buffer+16, 2); - if(write_cb(buffer, 1, FLAC__STREAM_METADATA_SEEKPOINT_LENGTH, handle) != FLAC__STREAM_METADATA_SEEKPOINT_LENGTH) - return false; - } - - return true; -} - -FLAC__bool write_metadata_block_data_vorbis_comment_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_VorbisComment *block) -{ - unsigned i; - const unsigned entry_length_len = FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN / 8; - const unsigned num_comments_len = FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN / 8; - FLAC__byte buffer[4]; /* magic number is asserted below */ - - FLAC__ASSERT(flac_max(FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN, FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN) / 8 == sizeof(buffer)); - - pack_uint32_little_endian_(block->vendor_string.length, buffer, entry_length_len); - if(write_cb(buffer, 1, entry_length_len, handle) != entry_length_len) - return false; - if(write_cb(block->vendor_string.entry, 1, block->vendor_string.length, handle) != block->vendor_string.length) - return false; - - pack_uint32_little_endian_(block->num_comments, buffer, num_comments_len); - if(write_cb(buffer, 1, num_comments_len, handle) != num_comments_len) - return false; - - for(i = 0; i < block->num_comments; i++) { - pack_uint32_little_endian_(block->comments[i].length, buffer, entry_length_len); - if(write_cb(buffer, 1, entry_length_len, handle) != entry_length_len) - return false; - if(write_cb(block->comments[i].entry, 1, block->comments[i].length, handle) != block->comments[i].length) - return false; - } - - return true; -} - -FLAC__bool write_metadata_block_data_cuesheet_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_CueSheet *block) -{ - unsigned i, j, len; - FLAC__byte buffer[1024]; /* asserted below that this is big enough */ - - FLAC__ASSERT(sizeof(buffer) >= sizeof(FLAC__uint64)); - FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN/8); - FLAC__ASSERT(sizeof(buffer) >= (FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN + FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN)/8); - FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN/8); - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN / 8; - if(write_cb(block->media_catalog_number, 1, len, handle) != len) - return false; - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN / 8; - pack_uint64_(block->lead_in, buffer, len); - if(write_cb(buffer, 1, len, handle) != len) - return false; - - FLAC__ASSERT((FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN + FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN) % 8 == 0); - len = (FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN + FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN) / 8; - memset(buffer, 0, len); - if(block->is_cd) - buffer[0] |= 0x80; - if(write_cb(buffer, 1, len, handle) != len) - return false; - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN / 8; - pack_uint32_(block->num_tracks, buffer, len); - if(write_cb(buffer, 1, len, handle) != len) - return false; - - for(i = 0; i < block->num_tracks; i++) { - FLAC__StreamMetadata_CueSheet_Track *track = block->tracks + i; - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN / 8; - pack_uint64_(track->offset, buffer, len); - if(write_cb(buffer, 1, len, handle) != len) - return false; - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN / 8; - pack_uint32_(track->number, buffer, len); - if(write_cb(buffer, 1, len, handle) != len) - return false; - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN / 8; - if(write_cb(track->isrc, 1, len, handle) != len) - return false; - - FLAC__ASSERT((FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN) % 8 == 0); - len = (FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN) / 8; - memset(buffer, 0, len); - buffer[0] = (track->type << 7) | (track->pre_emphasis << 6); - if(write_cb(buffer, 1, len, handle) != len) - return false; - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN / 8; - pack_uint32_(track->num_indices, buffer, len); - if(write_cb(buffer, 1, len, handle) != len) - return false; - - for(j = 0; j < track->num_indices; j++) { - FLAC__StreamMetadata_CueSheet_Index *indx = track->indices + j; - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN / 8; - pack_uint64_(indx->offset, buffer, len); - if(write_cb(buffer, 1, len, handle) != len) - return false; - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN / 8; - pack_uint32_(indx->number, buffer, len); - if(write_cb(buffer, 1, len, handle) != len) - return false; - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN % 8 == 0); - len = FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN / 8; - memset(buffer, 0, len); - if(write_cb(buffer, 1, len, handle) != len) - return false; - } - } - - return true; -} - -FLAC__bool write_metadata_block_data_picture_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_Picture *block) -{ - unsigned len; - size_t slen; - FLAC__byte buffer[4]; /* magic number is asserted below */ - - FLAC__ASSERT(0 == FLAC__STREAM_METADATA_PICTURE_TYPE_LEN%8); - FLAC__ASSERT(0 == FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN%8); - FLAC__ASSERT(0 == FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN%8); - FLAC__ASSERT(0 == FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN%8); - FLAC__ASSERT(0 == FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN%8); - FLAC__ASSERT(0 == FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN%8); - FLAC__ASSERT(0 == FLAC__STREAM_METADATA_PICTURE_COLORS_LEN%8); - FLAC__ASSERT(0 == FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN%8); - FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_TYPE_LEN/8); - FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN/8); - FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN/8); - FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN/8); - FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN/8); - FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN/8); - FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_COLORS_LEN/8); - FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN/8); - - len = FLAC__STREAM_METADATA_PICTURE_TYPE_LEN/8; - pack_uint32_(block->type, buffer, len); - if(write_cb(buffer, 1, len, handle) != len) - return false; - - len = FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN/8; - slen = strlen(block->mime_type); - pack_uint32_(slen, buffer, len); - if(write_cb(buffer, 1, len, handle) != len) - return false; - if(write_cb(block->mime_type, 1, slen, handle) != slen) - return false; - - len = FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN/8; - slen = strlen((const char *)block->description); - pack_uint32_(slen, buffer, len); - if(write_cb(buffer, 1, len, handle) != len) - return false; - if(write_cb(block->description, 1, slen, handle) != slen) - return false; - - len = FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN/8; - pack_uint32_(block->width, buffer, len); - if(write_cb(buffer, 1, len, handle) != len) - return false; - - len = FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN/8; - pack_uint32_(block->height, buffer, len); - if(write_cb(buffer, 1, len, handle) != len) - return false; - - len = FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN/8; - pack_uint32_(block->depth, buffer, len); - if(write_cb(buffer, 1, len, handle) != len) - return false; - - len = FLAC__STREAM_METADATA_PICTURE_COLORS_LEN/8; - pack_uint32_(block->colors, buffer, len); - if(write_cb(buffer, 1, len, handle) != len) - return false; - - len = FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN/8; - pack_uint32_(block->data_length, buffer, len); - if(write_cb(buffer, 1, len, handle) != len) - return false; - if(write_cb(block->data, 1, block->data_length, handle) != block->data_length) - return false; - - return true; -} - -FLAC__bool write_metadata_block_data_unknown_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_Unknown *block, unsigned block_length) -{ - if(write_cb(block->data, 1, block_length, handle) != block_length) - return false; - - return true; -} - -FLAC__bool write_metadata_block_stationary_(FLAC__Metadata_SimpleIterator *iterator, const FLAC__StreamMetadata *block) -{ - if(0 != fseeko(iterator->file, iterator->offset[iterator->depth], SEEK_SET)) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; - return false; - } - - if(!write_metadata_block_header_(iterator->file, &iterator->status, block)) - return false; - - if(!write_metadata_block_data_(iterator->file, &iterator->status, block)) - return false; - - if(0 != fseeko(iterator->file, iterator->offset[iterator->depth], SEEK_SET)) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; - return false; - } - - return read_metadata_block_header_(iterator); -} - -FLAC__bool write_metadata_block_stationary_with_padding_(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, unsigned padding_length, FLAC__bool padding_is_last) -{ - FLAC__StreamMetadata *padding; - - if(0 != fseeko(iterator->file, iterator->offset[iterator->depth], SEEK_SET)) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; - return false; - } - - block->is_last = false; - - if(!write_metadata_block_header_(iterator->file, &iterator->status, block)) - return false; - - if(!write_metadata_block_data_(iterator->file, &iterator->status, block)) - return false; - - if(0 == (padding = FLAC__metadata_object_new(FLAC__METADATA_TYPE_PADDING))) - return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; - - padding->is_last = padding_is_last; - padding->length = padding_length; - - if(!write_metadata_block_header_(iterator->file, &iterator->status, padding)) { - FLAC__metadata_object_delete(padding); - return false; - } - - if(!write_metadata_block_data_(iterator->file, &iterator->status, padding)) { - FLAC__metadata_object_delete(padding); - return false; - } - - FLAC__metadata_object_delete(padding); - - if(0 != fseeko(iterator->file, iterator->offset[iterator->depth], SEEK_SET)) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; - return false; - } - - return read_metadata_block_header_(iterator); -} - -FLAC__bool rewrite_whole_file_(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool append) -{ - FILE *tempfile = NULL; - char *tempfilename = NULL; - int fixup_is_last_code = 0; /* 0 => no need to change any is_last flags */ - FLAC__off_t fixup_is_last_flag_offset = -1; - - FLAC__ASSERT(0 != block || append == false); - - if(iterator->is_last) { - if(append) { - fixup_is_last_code = 1; /* 1 => clear the is_last flag at the following offset */ - fixup_is_last_flag_offset = iterator->offset[iterator->depth]; - } - else if(0 == block) { - simple_iterator_push_(iterator); - if(!FLAC__metadata_simple_iterator_prev(iterator)) { - (void)simple_iterator_pop_(iterator); - return false; - } - fixup_is_last_code = -1; /* -1 => set the is_last the flag at the following offset */ - fixup_is_last_flag_offset = iterator->offset[iterator->depth]; - if(!simple_iterator_pop_(iterator)) - return false; - } - } - - if(!simple_iterator_copy_file_prefix_(iterator, &tempfile, &tempfilename, append)) - return false; - - if(0 != block) { - if(!write_metadata_block_header_(tempfile, &iterator->status, block)) { - cleanup_tempfile_(&tempfile, &tempfilename); - return false; - } - - if(!write_metadata_block_data_(tempfile, &iterator->status, block)) { - cleanup_tempfile_(&tempfile, &tempfilename); - return false; - } - } - - if(!simple_iterator_copy_file_postfix_(iterator, &tempfile, &tempfilename, fixup_is_last_code, fixup_is_last_flag_offset, block==0)) - return false; - - if(append) - return FLAC__metadata_simple_iterator_next(iterator); - - return true; -} - -void simple_iterator_push_(FLAC__Metadata_SimpleIterator *iterator) -{ - FLAC__ASSERT(iterator->depth+1 < SIMPLE_ITERATOR_MAX_PUSH_DEPTH); - iterator->offset[iterator->depth+1] = iterator->offset[iterator->depth]; - iterator->depth++; -} - -FLAC__bool simple_iterator_pop_(FLAC__Metadata_SimpleIterator *iterator) -{ - FLAC__ASSERT(iterator->depth > 0); - iterator->depth--; - if(0 != fseeko(iterator->file, iterator->offset[iterator->depth], SEEK_SET)) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; - return false; - } - - return read_metadata_block_header_(iterator); -} - -/* return meanings: - * 0: ok - * 1: read error - * 2: seek error - * 3: not a FLAC file - */ -unsigned seek_to_first_metadata_block_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Seek seek_cb) -{ - FLAC__byte buffer[4]; - size_t n; - unsigned i; - - FLAC__ASSERT(FLAC__STREAM_SYNC_LENGTH == sizeof(buffer)); - - /* skip any id3v2 tag */ - errno = 0; - n = read_cb(buffer, 1, 4, handle); - if(errno) - return 1; - else if(n != 4) - return 3; - else if(0 == memcmp(buffer, "ID3", 3)) { - unsigned tag_length = 0; - - /* skip to the tag length */ - if(seek_cb(handle, 2, SEEK_CUR) < 0) - return 2; - - /* read the length */ - for(i = 0; i < 4; i++) { - if(read_cb(buffer, 1, 1, handle) < 1 || buffer[0] & 0x80) - return 1; - tag_length <<= 7; - tag_length |= (buffer[0] & 0x7f); - } - - /* skip the rest of the tag */ - if(seek_cb(handle, tag_length, SEEK_CUR) < 0) - return 2; - - /* read the stream sync code */ - errno = 0; - n = read_cb(buffer, 1, 4, handle); - if(errno) - return 1; - else if(n != 4) - return 3; - } - - /* check for the fLaC signature */ - if(0 == memcmp(FLAC__STREAM_SYNC_STRING, buffer, FLAC__STREAM_SYNC_LENGTH)) - return 0; - else - return 3; -} - -unsigned seek_to_first_metadata_block_(FILE *f) -{ - return seek_to_first_metadata_block_cb_((FLAC__IOHandle)f, (FLAC__IOCallback_Read)fread, fseek_wrapper_); -} - -FLAC__bool simple_iterator_copy_file_prefix_(FLAC__Metadata_SimpleIterator *iterator, FILE **tempfile, char **tempfilename, FLAC__bool append) -{ - const FLAC__off_t offset_end = append? iterator->offset[iterator->depth] + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH + (FLAC__off_t)iterator->length : iterator->offset[iterator->depth]; - - if(0 != fseeko(iterator->file, 0, SEEK_SET)) { - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; - return false; - } - if(!open_tempfile_(iterator->filename, iterator->tempfile_path_prefix, tempfile, tempfilename, &iterator->status)) { - cleanup_tempfile_(tempfile, tempfilename); - return false; - } - if(!copy_n_bytes_from_file_(iterator->file, *tempfile, offset_end, &iterator->status)) { - cleanup_tempfile_(tempfile, tempfilename); - return false; - } - - return true; -} - -FLAC__bool simple_iterator_copy_file_postfix_(FLAC__Metadata_SimpleIterator *iterator, FILE **tempfile, char **tempfilename, int fixup_is_last_code, FLAC__off_t fixup_is_last_flag_offset, FLAC__bool backup) -{ - FLAC__off_t save_offset = iterator->offset[iterator->depth]; - FLAC__ASSERT(0 != *tempfile); - - if(0 != fseeko(iterator->file, save_offset + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH + (FLAC__off_t)iterator->length, SEEK_SET)) { - cleanup_tempfile_(tempfile, tempfilename); - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; - return false; - } - if(!copy_remaining_bytes_from_file_(iterator->file, *tempfile, &iterator->status)) { - cleanup_tempfile_(tempfile, tempfilename); - return false; - } - - if(fixup_is_last_code != 0) { - /* - * if code == 1, it means a block was appended to the end so - * we have to clear the is_last flag of the previous block - * if code == -1, it means the last block was deleted so - * we have to set the is_last flag of the previous block - */ - /* MAGIC NUMBERs here; we know the is_last flag is the high bit of the byte at this location */ - FLAC__byte x; - if(0 != fseeko(*tempfile, fixup_is_last_flag_offset, SEEK_SET)) { - cleanup_tempfile_(tempfile, tempfilename); - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; - return false; - } - if(fread(&x, 1, 1, *tempfile) != 1) { - cleanup_tempfile_(tempfile, tempfilename); - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - return false; - } - if(fixup_is_last_code > 0) { - FLAC__ASSERT(x & 0x80); - x &= 0x7f; - } - else { - FLAC__ASSERT(!(x & 0x80)); - x |= 0x80; - } - if(0 != fseeko(*tempfile, fixup_is_last_flag_offset, SEEK_SET)) { - cleanup_tempfile_(tempfile, tempfilename); - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; - return false; - } - if(local__fwrite(&x, 1, 1, *tempfile) != 1) { - cleanup_tempfile_(tempfile, tempfilename); - iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR; - return false; - } - } - - (void)fclose(iterator->file); - - if(!transport_tempfile_(iterator->filename, tempfile, tempfilename, &iterator->status)) - return false; - - if(iterator->has_stats) - set_file_stats_(iterator->filename, &iterator->stats); - - if(!simple_iterator_prime_input_(iterator, !iterator->is_writable)) - return false; - if(backup) { - while(iterator->offset[iterator->depth] + (FLAC__off_t)FLAC__STREAM_METADATA_HEADER_LENGTH + (FLAC__off_t)iterator->length < save_offset) - if(!FLAC__metadata_simple_iterator_next(iterator)) - return false; - return true; - } - else { - /* move the iterator to it's original block faster by faking a push, then doing a pop_ */ - FLAC__ASSERT(iterator->depth == 0); - iterator->offset[0] = save_offset; - iterator->depth++; - return simple_iterator_pop_(iterator); - } -} - -FLAC__bool copy_n_bytes_from_file_(FILE *file, FILE *tempfile, FLAC__off_t bytes, FLAC__Metadata_SimpleIteratorStatus *status) -{ - FLAC__byte buffer[8192]; - size_t n; - - FLAC__ASSERT(bytes >= 0); - while(bytes > 0) { - n = flac_min(sizeof(buffer), (size_t)bytes); - if(fread(buffer, 1, n, file) != n) { - *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - return false; - } - if(local__fwrite(buffer, 1, n, tempfile) != n) { - *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR; - return false; - } - bytes -= n; - } - - return true; -} - -FLAC__bool copy_n_bytes_from_file_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOHandle temp_handle, FLAC__IOCallback_Write temp_write_cb, FLAC__off_t bytes, FLAC__Metadata_SimpleIteratorStatus *status) -{ - FLAC__byte buffer[8192]; - size_t n; - - FLAC__ASSERT(bytes >= 0); - while(bytes > 0) { - n = flac_min(sizeof(buffer), (size_t)bytes); - if(read_cb(buffer, 1, n, handle) != n) { - *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - return false; - } - if(temp_write_cb(buffer, 1, n, temp_handle) != n) { - *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR; - return false; - } - bytes -= n; - } - - return true; -} - -FLAC__bool copy_remaining_bytes_from_file_(FILE *file, FILE *tempfile, FLAC__Metadata_SimpleIteratorStatus *status) -{ - FLAC__byte buffer[8192]; - size_t n; - - while(!feof(file)) { - n = fread(buffer, 1, sizeof(buffer), file); - if(n == 0 && !feof(file)) { - *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - return false; - } - if(n > 0 && local__fwrite(buffer, 1, n, tempfile) != n) { - *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR; - return false; - } - } - - return true; -} - -FLAC__bool copy_remaining_bytes_from_file_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Eof eof_cb, FLAC__IOHandle temp_handle, FLAC__IOCallback_Write temp_write_cb, FLAC__Metadata_SimpleIteratorStatus *status) -{ - FLAC__byte buffer[8192]; - size_t n; - - while(!eof_cb(handle)) { - n = read_cb(buffer, 1, sizeof(buffer), handle); - if(n == 0 && !eof_cb(handle)) { - *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; - return false; - } - if(n > 0 && temp_write_cb(buffer, 1, n, temp_handle) != n) { - *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR; - return false; - } - } - - return true; -} - -static int -local_snprintf(char *str, size_t size, const char *fmt, ...) -{ - va_list va; - int rc; - - va_start (va, fmt); - -#if defined _MSC_VER - if (size == 0) - return 1024; - rc = vsnprintf_s (str, size, _TRUNCATE, fmt, va); - if (rc < 0) - rc = size - 1; -#elif defined __MINGW32__ - rc = __mingw_vsnprintf (str, size, fmt, va); -#else - rc = vsnprintf (str, size, fmt, va); -#endif - va_end (va); - - return rc; -} - -FLAC__bool open_tempfile_(const char *filename, const char *tempfile_path_prefix, FILE **tempfile, char **tempfilename, FLAC__Metadata_SimpleIteratorStatus *status) -{ - static const char *tempfile_suffix = ".metadata_edit"; - if(0 == tempfile_path_prefix) { - size_t dest_len = strlen(filename) + strlen(tempfile_suffix) + 1; - if(0 == (*tempfilename = safe_malloc_(dest_len))) { - *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; - return false; - } - local_snprintf(*tempfilename, dest_len, "%s%s", filename, tempfile_suffix); - } - else { - const char *p = strrchr(filename, '/'); - size_t dest_len; - if(0 == p) - p = filename; - else - p++; - - dest_len = strlen(tempfile_path_prefix) + strlen(p) + strlen(tempfile_suffix) + 2; - - if(0 == (*tempfilename = safe_malloc_(dest_len))) { - *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; - return false; - } - local_snprintf(*tempfilename, dest_len, "%s/%s%s", tempfile_path_prefix, p, tempfile_suffix); - } - - if(0 == (*tempfile = flac_fopen(*tempfilename, "w+b"))) { - *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE; - return false; - } - - return true; -} - -FLAC__bool transport_tempfile_(const char *filename, FILE **tempfile, char **tempfilename, FLAC__Metadata_SimpleIteratorStatus *status) -{ - FLAC__ASSERT(0 != filename); - FLAC__ASSERT(0 != tempfile); - FLAC__ASSERT(0 != *tempfile); - FLAC__ASSERT(0 != tempfilename); - FLAC__ASSERT(0 != *tempfilename); - FLAC__ASSERT(0 != status); - - (void)fclose(*tempfile); - *tempfile = 0; - -#if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__ || defined __EMX__ - /* on some flavors of windows, flac_rename() will fail if the destination already exists */ - if(flac_unlink(filename) < 0) { - cleanup_tempfile_(tempfile, tempfilename); - *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_UNLINK_ERROR; - return false; - } -#endif - - /*@@@ to fully support the tempfile_path_prefix we need to update this piece to actually copy across filesystems instead of just flac_rename(): */ - if(0 != flac_rename(*tempfilename, filename)) { - cleanup_tempfile_(tempfile, tempfilename); - *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_RENAME_ERROR; - return false; - } - - cleanup_tempfile_(tempfile, tempfilename); - - return true; -} - -void cleanup_tempfile_(FILE **tempfile, char **tempfilename) -{ - if(0 != *tempfile) { - (void)fclose(*tempfile); - *tempfile = 0; - } - - if(0 != *tempfilename) { - (void)flac_unlink(*tempfilename); - free(*tempfilename); - *tempfilename = 0; - } -} - -FLAC__bool get_file_stats_(const char *filename, struct flac_stat_s *stats) -{ - FLAC__ASSERT(0 != filename); - FLAC__ASSERT(0 != stats); - return (0 == flac_stat(filename, stats)); -} - -void set_file_stats_(const char *filename, struct flac_stat_s *stats) -{ - struct utimbuf srctime; - - FLAC__ASSERT(0 != filename); - FLAC__ASSERT(0 != stats); - - srctime.actime = stats->st_atime; - srctime.modtime = stats->st_mtime; - (void)flac_chmod(filename, stats->st_mode); - (void)flac_utime(filename, &srctime); -#if !defined _MSC_VER && !defined __BORLANDC__ && !defined __MINGW32__ - FLAC_CHECK_RETURN(chown(filename, stats->st_uid, -1)); - FLAC_CHECK_RETURN(chown(filename, -1, stats->st_gid)); -#endif -} - -int fseek_wrapper_(FLAC__IOHandle handle, FLAC__int64 offset, int whence) -{ - return fseeko((FILE*)handle, (FLAC__off_t)offset, whence); -} - -FLAC__int64 ftell_wrapper_(FLAC__IOHandle handle) -{ - return ftello((FILE*)handle); -} - -FLAC__Metadata_ChainStatus get_equivalent_status_(FLAC__Metadata_SimpleIteratorStatus status) -{ - switch(status) { - case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK: - return FLAC__METADATA_CHAIN_STATUS_OK; - case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT: - return FLAC__METADATA_CHAIN_STATUS_ILLEGAL_INPUT; - case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE: - return FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE; - case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_A_FLAC_FILE: - return FLAC__METADATA_CHAIN_STATUS_NOT_A_FLAC_FILE; - case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_WRITABLE: - return FLAC__METADATA_CHAIN_STATUS_NOT_WRITABLE; - case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_BAD_METADATA: - return FLAC__METADATA_CHAIN_STATUS_BAD_METADATA; - case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR: - return FLAC__METADATA_CHAIN_STATUS_READ_ERROR; - case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR: - return FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR; - case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR: - return FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR; - case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_RENAME_ERROR: - return FLAC__METADATA_CHAIN_STATUS_RENAME_ERROR; - case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_UNLINK_ERROR: - return FLAC__METADATA_CHAIN_STATUS_UNLINK_ERROR; - case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR: - return FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR; - case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_INTERNAL_ERROR: - default: - return FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR; - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/metadata_object.c b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/metadata_object.c deleted file mode 100644 index 0456297a..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/metadata_object.c +++ /dev/null @@ -1,1824 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 -#endif - -#include -#include - -#include "private/metadata.h" -#include "private/memory.h" - -#include "FLAC/assert.h" -#include "share/alloc.h" -#include "share/compat.h" - -/* Alias the first (in share/alloc.h) to the second (in src/libFLAC/memory.c). */ -#define safe_malloc_mul_2op_ safe_malloc_mul_2op_p - - -/**************************************************************************** - * - * Local routines - * - ***************************************************************************/ - -/* copy bytes: - * from = NULL && bytes = 0 - * to <- NULL - * from != NULL && bytes > 0 - * to <- copy of from - * else ASSERT - * malloc error leaves 'to' unchanged - */ -static FLAC__bool copy_bytes_(FLAC__byte **to, const FLAC__byte *from, unsigned bytes) -{ - FLAC__ASSERT(0 != to); - if(bytes > 0 && 0 != from) { - FLAC__byte *x; - if(0 == (x = safe_malloc_(bytes))) - return false; - memcpy(x, from, bytes); - *to = x; - } - else { - FLAC__ASSERT(0 == from); - FLAC__ASSERT(bytes == 0); - *to = 0; - } - return true; -} - -#if 0 /* UNUSED */ -/* like copy_bytes_(), but free()s the original '*to' if the copy succeeds and the original '*to' is non-NULL */ -static FLAC__bool free_copy_bytes_(FLAC__byte **to, const FLAC__byte *from, unsigned bytes) -{ - FLAC__byte *copy; - FLAC__ASSERT(0 != to); - if(copy_bytes_(©, from, bytes)) { - if(*to) - free(*to); - *to = copy; - return true; - } - else - return false; -} -#endif - -/* reallocate entry to 1 byte larger and add a terminating NUL */ -/* realloc() failure leaves entry unchanged */ -static FLAC__bool ensure_null_terminated_(FLAC__byte **entry, unsigned length) -{ - FLAC__byte *x = safe_realloc_add_2op_(*entry, length, /*+*/1); - if(0 != x) { - x[length] = '\0'; - *entry = x; - return true; - } - else - return false; -} - -/* copies the NUL-terminated C-string 'from' to '*to', leaving '*to' - * unchanged if malloc fails, free()ing the original '*to' if it - * succeeds and the original '*to' was not NULL - */ -static FLAC__bool copy_cstring_(char **to, const char *from) -{ - char *copy = strdup(from); - FLAC__ASSERT(to); - if(copy) { - if(*to) - free(*to); - *to = copy; - return true; - } - else - return false; -} - -static FLAC__bool copy_vcentry_(FLAC__StreamMetadata_VorbisComment_Entry *to, const FLAC__StreamMetadata_VorbisComment_Entry *from) -{ - to->length = from->length; - if(0 == from->entry) { - FLAC__ASSERT(from->length == 0); - to->entry = 0; - } - else { - FLAC__byte *x; - FLAC__ASSERT(from->length > 0); - if(0 == (x = safe_malloc_add_2op_(from->length, /*+*/1))) - return false; - memcpy(x, from->entry, from->length); - x[from->length] = '\0'; - to->entry = x; - } - return true; -} - -static FLAC__bool copy_track_(FLAC__StreamMetadata_CueSheet_Track *to, const FLAC__StreamMetadata_CueSheet_Track *from) -{ - memcpy(to, from, sizeof(FLAC__StreamMetadata_CueSheet_Track)); - if(0 == from->indices) { - FLAC__ASSERT(from->num_indices == 0); - } - else { - FLAC__StreamMetadata_CueSheet_Index *x; - FLAC__ASSERT(from->num_indices > 0); - if(0 == (x = safe_malloc_mul_2op_p(from->num_indices, /*times*/sizeof(FLAC__StreamMetadata_CueSheet_Index)))) - return false; - memcpy(x, from->indices, from->num_indices * sizeof(FLAC__StreamMetadata_CueSheet_Index)); - to->indices = x; - } - return true; -} - -static void seektable_calculate_length_(FLAC__StreamMetadata *object) -{ - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); - - object->length = object->data.seek_table.num_points * FLAC__STREAM_METADATA_SEEKPOINT_LENGTH; -} - -static FLAC__StreamMetadata_SeekPoint *seekpoint_array_new_(unsigned num_points) -{ - FLAC__StreamMetadata_SeekPoint *object_array; - - FLAC__ASSERT(num_points > 0); - - object_array = safe_malloc_mul_2op_p(num_points, /*times*/sizeof(FLAC__StreamMetadata_SeekPoint)); - - if(0 != object_array) { - unsigned i; - for(i = 0; i < num_points; i++) { - object_array[i].sample_number = FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER; - object_array[i].stream_offset = 0; - object_array[i].frame_samples = 0; - } - } - - return object_array; -} - -static void vorbiscomment_calculate_length_(FLAC__StreamMetadata *object) -{ - unsigned i; - - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT); - - object->length = (FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN) / 8; - object->length += object->data.vorbis_comment.vendor_string.length; - object->length += (FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN) / 8; - for(i = 0; i < object->data.vorbis_comment.num_comments; i++) { - object->length += (FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN / 8); - object->length += object->data.vorbis_comment.comments[i].length; - } -} - -static FLAC__StreamMetadata_VorbisComment_Entry *vorbiscomment_entry_array_new_(unsigned num_comments) -{ - FLAC__ASSERT(num_comments > 0); - - return safe_calloc_(num_comments, sizeof(FLAC__StreamMetadata_VorbisComment_Entry)); -} - -static void vorbiscomment_entry_array_delete_(FLAC__StreamMetadata_VorbisComment_Entry *object_array, unsigned num_comments) -{ - unsigned i; - - FLAC__ASSERT(0 != object_array && num_comments > 0); - - for(i = 0; i < num_comments; i++) - if(0 != object_array[i].entry) - free(object_array[i].entry); - - if(0 != object_array) - free(object_array); -} - -static FLAC__StreamMetadata_VorbisComment_Entry *vorbiscomment_entry_array_copy_(const FLAC__StreamMetadata_VorbisComment_Entry *object_array, unsigned num_comments) -{ - FLAC__StreamMetadata_VorbisComment_Entry *return_array; - - FLAC__ASSERT(0 != object_array); - FLAC__ASSERT(num_comments > 0); - - return_array = vorbiscomment_entry_array_new_(num_comments); - - if(0 != return_array) { - unsigned i; - - for(i = 0; i < num_comments; i++) { - if(!copy_vcentry_(return_array+i, object_array+i)) { - vorbiscomment_entry_array_delete_(return_array, num_comments); - return 0; - } - } - } - - return return_array; -} - -static FLAC__bool vorbiscomment_set_entry_(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry *dest, const FLAC__StreamMetadata_VorbisComment_Entry *src, FLAC__bool copy) -{ - FLAC__byte *save; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(0 != dest); - FLAC__ASSERT(0 != src); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT); - FLAC__ASSERT((0 != src->entry && src->length > 0) || (0 == src->entry && src->length == 0)); - - save = dest->entry; - - if(0 != src->entry) { - if(copy) { - /* do the copy first so that if we fail we leave the dest object untouched */ - if(!copy_vcentry_(dest, src)) - return false; - } - else { - /* we have to make sure that the string we're taking over is null-terminated */ - - /* - * Stripping the const from src->entry is OK since we're taking - * ownership of the pointer. This is a hack around a deficiency - * in the API where the same function is used for 'copy' and - * 'own', but the source entry is a const pointer. If we were - * precise, the 'own' flavor would be a separate function with a - * non-const source pointer. But it's not, so we hack away. - */ - if(!ensure_null_terminated_((FLAC__byte**)(&src->entry), src->length)) - return false; - *dest = *src; - } - } - else { - /* the src is null */ - *dest = *src; - } - - if(0 != save) - free(save); - - vorbiscomment_calculate_length_(object); - return true; -} - -static int vorbiscomment_find_entry_from_(const FLAC__StreamMetadata *object, unsigned offset, const char *field_name, unsigned field_name_length) -{ - unsigned i; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT); - FLAC__ASSERT(0 != field_name); - - for(i = offset; i < object->data.vorbis_comment.num_comments; i++) { - if(FLAC__metadata_object_vorbiscomment_entry_matches(object->data.vorbis_comment.comments[i], field_name, field_name_length)) - return (int)i; - } - - return -1; -} - -static void cuesheet_calculate_length_(FLAC__StreamMetadata *object) -{ - unsigned i; - - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); - - object->length = ( - FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN + - FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN + - FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN + - FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN + - FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN - ) / 8; - - object->length += object->data.cue_sheet.num_tracks * ( - FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN + - FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN + - FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN + - FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN + - FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN + - FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN + - FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN - ) / 8; - - for(i = 0; i < object->data.cue_sheet.num_tracks; i++) { - object->length += object->data.cue_sheet.tracks[i].num_indices * ( - FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN + - FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN + - FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN - ) / 8; - } -} - -static FLAC__StreamMetadata_CueSheet_Index *cuesheet_track_index_array_new_(unsigned num_indices) -{ - FLAC__ASSERT(num_indices > 0); - - return safe_calloc_(num_indices, sizeof(FLAC__StreamMetadata_CueSheet_Index)); -} - -static FLAC__StreamMetadata_CueSheet_Track *cuesheet_track_array_new_(unsigned num_tracks) -{ - FLAC__ASSERT(num_tracks > 0); - - return safe_calloc_(num_tracks, sizeof(FLAC__StreamMetadata_CueSheet_Track)); -} - -static void cuesheet_track_array_delete_(FLAC__StreamMetadata_CueSheet_Track *object_array, unsigned num_tracks) -{ - unsigned i; - - FLAC__ASSERT(0 != object_array && num_tracks > 0); - - for(i = 0; i < num_tracks; i++) { - if(0 != object_array[i].indices) { - FLAC__ASSERT(object_array[i].num_indices > 0); - free(object_array[i].indices); - } - } - - if(0 != object_array) - free(object_array); -} - -static FLAC__StreamMetadata_CueSheet_Track *cuesheet_track_array_copy_(const FLAC__StreamMetadata_CueSheet_Track *object_array, unsigned num_tracks) -{ - FLAC__StreamMetadata_CueSheet_Track *return_array; - - FLAC__ASSERT(0 != object_array); - FLAC__ASSERT(num_tracks > 0); - - return_array = cuesheet_track_array_new_(num_tracks); - - if(0 != return_array) { - unsigned i; - - for(i = 0; i < num_tracks; i++) { - if(!copy_track_(return_array+i, object_array+i)) { - cuesheet_track_array_delete_(return_array, num_tracks); - return 0; - } - } - } - - return return_array; -} - -static FLAC__bool cuesheet_set_track_(FLAC__StreamMetadata *object, FLAC__StreamMetadata_CueSheet_Track *dest, const FLAC__StreamMetadata_CueSheet_Track *src, FLAC__bool copy) -{ - FLAC__StreamMetadata_CueSheet_Index *save; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(0 != dest); - FLAC__ASSERT(0 != src); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); - FLAC__ASSERT((0 != src->indices && src->num_indices > 0) || (0 == src->indices && src->num_indices == 0)); - - save = dest->indices; - - /* do the copy first so that if we fail we leave the object untouched */ - if(copy) { - if(!copy_track_(dest, src)) - return false; - } - else { - *dest = *src; - } - - if(0 != save) - free(save); - - cuesheet_calculate_length_(object); - return true; -} - - -/**************************************************************************** - * - * Metadata object routines - * - ***************************************************************************/ - -FLAC_API FLAC__StreamMetadata *FLAC__metadata_object_new(FLAC__MetadataType type) -{ - FLAC__StreamMetadata *object; - - if(type > FLAC__MAX_METADATA_TYPE) - return 0; - - object = calloc(1, sizeof(FLAC__StreamMetadata)); - if(0 != object) { - object->is_last = false; - object->type = type; - switch(type) { - case FLAC__METADATA_TYPE_STREAMINFO: - object->length = FLAC__STREAM_METADATA_STREAMINFO_LENGTH; - break; - case FLAC__METADATA_TYPE_PADDING: - /* calloc() took care of this for us: - object->length = 0; - */ - break; - case FLAC__METADATA_TYPE_APPLICATION: - object->length = FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8; - /* calloc() took care of this for us: - object->data.application.data = 0; - */ - break; - case FLAC__METADATA_TYPE_SEEKTABLE: - /* calloc() took care of this for us: - object->length = 0; - object->data.seek_table.num_points = 0; - object->data.seek_table.points = 0; - */ - break; - case FLAC__METADATA_TYPE_VORBIS_COMMENT: - object->data.vorbis_comment.vendor_string.length = (unsigned)strlen(FLAC__VENDOR_STRING); - if(!copy_bytes_(&object->data.vorbis_comment.vendor_string.entry, (const FLAC__byte*)FLAC__VENDOR_STRING, object->data.vorbis_comment.vendor_string.length+1)) { - free(object); - return 0; - } - vorbiscomment_calculate_length_(object); - break; - case FLAC__METADATA_TYPE_CUESHEET: - cuesheet_calculate_length_(object); - break; - case FLAC__METADATA_TYPE_PICTURE: - object->length = ( - FLAC__STREAM_METADATA_PICTURE_TYPE_LEN + - FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN + /* empty mime_type string */ - FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN + /* empty description string */ - FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN + - FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN + - FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN + - FLAC__STREAM_METADATA_PICTURE_COLORS_LEN + - FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN + - 0 /* no data */ - ) / 8; - object->data.picture.type = FLAC__STREAM_METADATA_PICTURE_TYPE_OTHER; - object->data.picture.mime_type = 0; - object->data.picture.description = 0; - /* calloc() took care of this for us: - object->data.picture.width = 0; - object->data.picture.height = 0; - object->data.picture.depth = 0; - object->data.picture.colors = 0; - object->data.picture.data_length = 0; - object->data.picture.data = 0; - */ - /* now initialize mime_type and description with empty strings to make things easier on the client */ - if(!copy_cstring_(&object->data.picture.mime_type, "")) { - free(object); - return 0; - } - if(!copy_cstring_((char**)(&object->data.picture.description), "")) { - if(object->data.picture.mime_type) - free(object->data.picture.mime_type); - free(object); - return 0; - } - break; - default: - /* calloc() took care of this for us: - object->length = 0; - object->data.unknown.data = 0; - */ - break; - } - } - - return object; -} - -FLAC_API FLAC__StreamMetadata *FLAC__metadata_object_clone(const FLAC__StreamMetadata *object) -{ - FLAC__StreamMetadata *to; - - FLAC__ASSERT(0 != object); - - if(0 != (to = FLAC__metadata_object_new(object->type))) { - to->is_last = object->is_last; - to->type = object->type; - to->length = object->length; - switch(to->type) { - case FLAC__METADATA_TYPE_STREAMINFO: - memcpy(&to->data.stream_info, &object->data.stream_info, sizeof(FLAC__StreamMetadata_StreamInfo)); - break; - case FLAC__METADATA_TYPE_PADDING: - break; - case FLAC__METADATA_TYPE_APPLICATION: - if(to->length < FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8) { /* underflow check */ - FLAC__metadata_object_delete(to); - return 0; - } - memcpy(&to->data.application.id, &object->data.application.id, FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8); - if(!copy_bytes_(&to->data.application.data, object->data.application.data, object->length - FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8)) { - FLAC__metadata_object_delete(to); - return 0; - } - break; - case FLAC__METADATA_TYPE_SEEKTABLE: - to->data.seek_table.num_points = object->data.seek_table.num_points; - if(to->data.seek_table.num_points > UINT32_MAX / sizeof(FLAC__StreamMetadata_SeekPoint)) { /* overflow check */ - FLAC__metadata_object_delete(to); - return 0; - } - if(!copy_bytes_((FLAC__byte**)&to->data.seek_table.points, (FLAC__byte*)object->data.seek_table.points, object->data.seek_table.num_points * sizeof(FLAC__StreamMetadata_SeekPoint))) { - FLAC__metadata_object_delete(to); - return 0; - } - break; - case FLAC__METADATA_TYPE_VORBIS_COMMENT: - if(0 != to->data.vorbis_comment.vendor_string.entry) { - free(to->data.vorbis_comment.vendor_string.entry); - to->data.vorbis_comment.vendor_string.entry = 0; - } - if(!copy_vcentry_(&to->data.vorbis_comment.vendor_string, &object->data.vorbis_comment.vendor_string)) { - FLAC__metadata_object_delete(to); - return 0; - } - if(object->data.vorbis_comment.num_comments == 0) { - FLAC__ASSERT(0 == object->data.vorbis_comment.comments); - to->data.vorbis_comment.comments = 0; - } - else { - FLAC__ASSERT(0 != object->data.vorbis_comment.comments); - to->data.vorbis_comment.comments = vorbiscomment_entry_array_copy_(object->data.vorbis_comment.comments, object->data.vorbis_comment.num_comments); - if(0 == to->data.vorbis_comment.comments) { - FLAC__metadata_object_delete(to); - return 0; - } - } - to->data.vorbis_comment.num_comments = object->data.vorbis_comment.num_comments; - break; - case FLAC__METADATA_TYPE_CUESHEET: - memcpy(&to->data.cue_sheet, &object->data.cue_sheet, sizeof(FLAC__StreamMetadata_CueSheet)); - if(object->data.cue_sheet.num_tracks == 0) { - FLAC__ASSERT(0 == object->data.cue_sheet.tracks); - } - else { - FLAC__ASSERT(0 != object->data.cue_sheet.tracks); - to->data.cue_sheet.tracks = cuesheet_track_array_copy_(object->data.cue_sheet.tracks, object->data.cue_sheet.num_tracks); - if(0 == to->data.cue_sheet.tracks) { - FLAC__metadata_object_delete(to); - return 0; - } - } - break; - case FLAC__METADATA_TYPE_PICTURE: - to->data.picture.type = object->data.picture.type; - if(!copy_cstring_(&to->data.picture.mime_type, object->data.picture.mime_type)) { - FLAC__metadata_object_delete(to); - return 0; - } - if(!copy_cstring_((char**)(&to->data.picture.description), (const char*)object->data.picture.description)) { - FLAC__metadata_object_delete(to); - return 0; - } - to->data.picture.width = object->data.picture.width; - to->data.picture.height = object->data.picture.height; - to->data.picture.depth = object->data.picture.depth; - to->data.picture.colors = object->data.picture.colors; - to->data.picture.data_length = object->data.picture.data_length; - if(!copy_bytes_((&to->data.picture.data), object->data.picture.data, object->data.picture.data_length)) { - FLAC__metadata_object_delete(to); - return 0; - } - break; - default: - if(!copy_bytes_(&to->data.unknown.data, object->data.unknown.data, object->length)) { - FLAC__metadata_object_delete(to); - return 0; - } - break; - } - } - - return to; -} - -void FLAC__metadata_object_delete_data(FLAC__StreamMetadata *object) -{ - FLAC__ASSERT(0 != object); - - switch(object->type) { - case FLAC__METADATA_TYPE_STREAMINFO: - case FLAC__METADATA_TYPE_PADDING: - break; - case FLAC__METADATA_TYPE_APPLICATION: - if(0 != object->data.application.data) { - free(object->data.application.data); - object->data.application.data = 0; - } - break; - case FLAC__METADATA_TYPE_SEEKTABLE: - if(0 != object->data.seek_table.points) { - free(object->data.seek_table.points); - object->data.seek_table.points = 0; - } - break; - case FLAC__METADATA_TYPE_VORBIS_COMMENT: - if(0 != object->data.vorbis_comment.vendor_string.entry) { - free(object->data.vorbis_comment.vendor_string.entry); - object->data.vorbis_comment.vendor_string.entry = 0; - } - if(0 != object->data.vorbis_comment.comments) { - FLAC__ASSERT(object->data.vorbis_comment.num_comments > 0); - vorbiscomment_entry_array_delete_(object->data.vorbis_comment.comments, object->data.vorbis_comment.num_comments); - } - break; - case FLAC__METADATA_TYPE_CUESHEET: - if(0 != object->data.cue_sheet.tracks) { - FLAC__ASSERT(object->data.cue_sheet.num_tracks > 0); - cuesheet_track_array_delete_(object->data.cue_sheet.tracks, object->data.cue_sheet.num_tracks); - } - break; - case FLAC__METADATA_TYPE_PICTURE: - if(0 != object->data.picture.mime_type) { - free(object->data.picture.mime_type); - object->data.picture.mime_type = 0; - } - if(0 != object->data.picture.description) { - free(object->data.picture.description); - object->data.picture.description = 0; - } - if(0 != object->data.picture.data) { - free(object->data.picture.data); - object->data.picture.data = 0; - } - break; - default: - if(0 != object->data.unknown.data) { - free(object->data.unknown.data); - object->data.unknown.data = 0; - } - break; - } -} - -FLAC_API void FLAC__metadata_object_delete(FLAC__StreamMetadata *object) -{ - FLAC__metadata_object_delete_data(object); - free(object); -} - -static FLAC__bool compare_block_data_streaminfo_(const FLAC__StreamMetadata_StreamInfo *block1, const FLAC__StreamMetadata_StreamInfo *block2) -{ - if(block1->min_blocksize != block2->min_blocksize) - return false; - if(block1->max_blocksize != block2->max_blocksize) - return false; - if(block1->min_framesize != block2->min_framesize) - return false; - if(block1->max_framesize != block2->max_framesize) - return false; - if(block1->sample_rate != block2->sample_rate) - return false; - if(block1->channels != block2->channels) - return false; - if(block1->bits_per_sample != block2->bits_per_sample) - return false; - if(block1->total_samples != block2->total_samples) - return false; - if(0 != memcmp(block1->md5sum, block2->md5sum, 16)) - return false; - return true; -} - -static FLAC__bool compare_block_data_application_(const FLAC__StreamMetadata_Application *block1, const FLAC__StreamMetadata_Application *block2, unsigned block_length) -{ - FLAC__ASSERT(0 != block1); - FLAC__ASSERT(0 != block2); - FLAC__ASSERT(block_length >= sizeof(block1->id)); - - if(0 != memcmp(block1->id, block2->id, sizeof(block1->id))) - return false; - if(0 != block1->data && 0 != block2->data) - return 0 == memcmp(block1->data, block2->data, block_length - sizeof(block1->id)); - else - return block1->data == block2->data; -} - -static FLAC__bool compare_block_data_seektable_(const FLAC__StreamMetadata_SeekTable *block1, const FLAC__StreamMetadata_SeekTable *block2) -{ - unsigned i; - - FLAC__ASSERT(0 != block1); - FLAC__ASSERT(0 != block2); - - if(block1->num_points != block2->num_points) - return false; - - if(0 != block1->points && 0 != block2->points) { - for(i = 0; i < block1->num_points; i++) { - if(block1->points[i].sample_number != block2->points[i].sample_number) - return false; - if(block1->points[i].stream_offset != block2->points[i].stream_offset) - return false; - if(block1->points[i].frame_samples != block2->points[i].frame_samples) - return false; - } - return true; - } - else - return block1->points == block2->points; -} - -static FLAC__bool compare_block_data_vorbiscomment_(const FLAC__StreamMetadata_VorbisComment *block1, const FLAC__StreamMetadata_VorbisComment *block2) -{ - unsigned i; - - if(block1->vendor_string.length != block2->vendor_string.length) - return false; - - if(0 != block1->vendor_string.entry && 0 != block2->vendor_string.entry) { - if(0 != memcmp(block1->vendor_string.entry, block2->vendor_string.entry, block1->vendor_string.length)) - return false; - } - else if(block1->vendor_string.entry != block2->vendor_string.entry) - return false; - - if(block1->num_comments != block2->num_comments) - return false; - - for(i = 0; i < block1->num_comments; i++) { - if(0 != block1->comments[i].entry && 0 != block2->comments[i].entry) { - if(0 != memcmp(block1->comments[i].entry, block2->comments[i].entry, block1->comments[i].length)) - return false; - } - else if(block1->comments[i].entry != block2->comments[i].entry) - return false; - } - return true; -} - -static FLAC__bool compare_block_data_cuesheet_(const FLAC__StreamMetadata_CueSheet *block1, const FLAC__StreamMetadata_CueSheet *block2) -{ - unsigned i, j; - - if(0 != strcmp(block1->media_catalog_number, block2->media_catalog_number)) - return false; - - if(block1->lead_in != block2->lead_in) - return false; - - if(block1->is_cd != block2->is_cd) - return false; - - if(block1->num_tracks != block2->num_tracks) - return false; - - if(0 != block1->tracks && 0 != block2->tracks) { - FLAC__ASSERT(block1->num_tracks > 0); - for(i = 0; i < block1->num_tracks; i++) { - if(block1->tracks[i].offset != block2->tracks[i].offset) - return false; - if(block1->tracks[i].number != block2->tracks[i].number) - return false; - if(0 != memcmp(block1->tracks[i].isrc, block2->tracks[i].isrc, sizeof(block1->tracks[i].isrc))) - return false; - if(block1->tracks[i].type != block2->tracks[i].type) - return false; - if(block1->tracks[i].pre_emphasis != block2->tracks[i].pre_emphasis) - return false; - if(block1->tracks[i].num_indices != block2->tracks[i].num_indices) - return false; - if(0 != block1->tracks[i].indices && 0 != block2->tracks[i].indices) { - FLAC__ASSERT(block1->tracks[i].num_indices > 0); - for(j = 0; j < block1->tracks[i].num_indices; j++) { - if(block1->tracks[i].indices[j].offset != block2->tracks[i].indices[j].offset) - return false; - if(block1->tracks[i].indices[j].number != block2->tracks[i].indices[j].number) - return false; - } - } - else if(block1->tracks[i].indices != block2->tracks[i].indices) - return false; - } - } - else if(block1->tracks != block2->tracks) - return false; - return true; -} - -static FLAC__bool compare_block_data_picture_(const FLAC__StreamMetadata_Picture *block1, const FLAC__StreamMetadata_Picture *block2) -{ - if(block1->type != block2->type) - return false; - if(block1->mime_type != block2->mime_type && (0 == block1->mime_type || 0 == block2->mime_type || strcmp(block1->mime_type, block2->mime_type))) - return false; - if(block1->description != block2->description && (0 == block1->description || 0 == block2->description || strcmp((const char *)block1->description, (const char *)block2->description))) - return false; - if(block1->width != block2->width) - return false; - if(block1->height != block2->height) - return false; - if(block1->depth != block2->depth) - return false; - if(block1->colors != block2->colors) - return false; - if(block1->data_length != block2->data_length) - return false; - if(block1->data != block2->data && (0 == block1->data || 0 == block2->data || memcmp(block1->data, block2->data, block1->data_length))) - return false; - return true; -} - -static FLAC__bool compare_block_data_unknown_(const FLAC__StreamMetadata_Unknown *block1, const FLAC__StreamMetadata_Unknown *block2, unsigned block_length) -{ - FLAC__ASSERT(0 != block1); - FLAC__ASSERT(0 != block2); - - if(0 != block1->data && 0 != block2->data) - return 0 == memcmp(block1->data, block2->data, block_length); - else - return block1->data == block2->data; -} - -FLAC_API FLAC__bool FLAC__metadata_object_is_equal(const FLAC__StreamMetadata *block1, const FLAC__StreamMetadata *block2) -{ - FLAC__ASSERT(0 != block1); - FLAC__ASSERT(0 != block2); - - if(block1->type != block2->type) { - return false; - } - if(block1->is_last != block2->is_last) { - return false; - } - if(block1->length != block2->length) { - return false; - } - switch(block1->type) { - case FLAC__METADATA_TYPE_STREAMINFO: - return compare_block_data_streaminfo_(&block1->data.stream_info, &block2->data.stream_info); - case FLAC__METADATA_TYPE_PADDING: - return true; /* we don't compare the padding guts */ - case FLAC__METADATA_TYPE_APPLICATION: - return compare_block_data_application_(&block1->data.application, &block2->data.application, block1->length); - case FLAC__METADATA_TYPE_SEEKTABLE: - return compare_block_data_seektable_(&block1->data.seek_table, &block2->data.seek_table); - case FLAC__METADATA_TYPE_VORBIS_COMMENT: - return compare_block_data_vorbiscomment_(&block1->data.vorbis_comment, &block2->data.vorbis_comment); - case FLAC__METADATA_TYPE_CUESHEET: - return compare_block_data_cuesheet_(&block1->data.cue_sheet, &block2->data.cue_sheet); - case FLAC__METADATA_TYPE_PICTURE: - return compare_block_data_picture_(&block1->data.picture, &block2->data.picture); - default: - return compare_block_data_unknown_(&block1->data.unknown, &block2->data.unknown, block1->length); - } -} - -FLAC_API FLAC__bool FLAC__metadata_object_application_set_data(FLAC__StreamMetadata *object, FLAC__byte *data, unsigned length, FLAC__bool copy) -{ - FLAC__byte *save; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_APPLICATION); - FLAC__ASSERT((0 != data && length > 0) || (0 == data && length == 0 && copy == false)); - - save = object->data.application.data; - - /* do the copy first so that if we fail we leave the object untouched */ - if(copy) { - if(!copy_bytes_(&object->data.application.data, data, length)) - return false; - } - else { - object->data.application.data = data; - } - - if(0 != save) - free(save); - - object->length = FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8 + length; - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_seektable_resize_points(FLAC__StreamMetadata *object, unsigned new_num_points) -{ - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); - - if(0 == object->data.seek_table.points) { - FLAC__ASSERT(object->data.seek_table.num_points == 0); - if(0 == new_num_points) - return true; - else if(0 == (object->data.seek_table.points = seekpoint_array_new_(new_num_points))) - return false; - } - else { - const size_t old_size = object->data.seek_table.num_points * sizeof(FLAC__StreamMetadata_SeekPoint); - const size_t new_size = new_num_points * sizeof(FLAC__StreamMetadata_SeekPoint); - - /* overflow check */ - if(new_num_points > UINT32_MAX / sizeof(FLAC__StreamMetadata_SeekPoint)) - return false; - - FLAC__ASSERT(object->data.seek_table.num_points > 0); - - if(new_size == 0) { - free(object->data.seek_table.points); - object->data.seek_table.points = 0; - } - else if(0 == (object->data.seek_table.points = realloc(object->data.seek_table.points, new_size))) - return false; - - /* if growing, set new elements to placeholders */ - if(new_size > old_size) { - unsigned i; - for(i = object->data.seek_table.num_points; i < new_num_points; i++) { - object->data.seek_table.points[i].sample_number = FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER; - object->data.seek_table.points[i].stream_offset = 0; - object->data.seek_table.points[i].frame_samples = 0; - } - } - } - - object->data.seek_table.num_points = new_num_points; - - seektable_calculate_length_(object); - return true; -} - -FLAC_API void FLAC__metadata_object_seektable_set_point(FLAC__StreamMetadata *object, unsigned point_num, FLAC__StreamMetadata_SeekPoint point) -{ - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); - FLAC__ASSERT(point_num < object->data.seek_table.num_points); - - object->data.seek_table.points[point_num] = point; -} - -FLAC_API FLAC__bool FLAC__metadata_object_seektable_insert_point(FLAC__StreamMetadata *object, unsigned point_num, FLAC__StreamMetadata_SeekPoint point) -{ - int i; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); - FLAC__ASSERT(point_num <= object->data.seek_table.num_points); - - if(!FLAC__metadata_object_seektable_resize_points(object, object->data.seek_table.num_points+1)) - return false; - - /* move all points >= point_num forward one space */ - for(i = (int)object->data.seek_table.num_points-1; i > (int)point_num; i--) - object->data.seek_table.points[i] = object->data.seek_table.points[i-1]; - - FLAC__metadata_object_seektable_set_point(object, point_num, point); - seektable_calculate_length_(object); - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_seektable_delete_point(FLAC__StreamMetadata *object, unsigned point_num) -{ - unsigned i; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); - FLAC__ASSERT(point_num < object->data.seek_table.num_points); - - /* move all points > point_num backward one space */ - for(i = point_num; i < object->data.seek_table.num_points-1; i++) - object->data.seek_table.points[i] = object->data.seek_table.points[i+1]; - - return FLAC__metadata_object_seektable_resize_points(object, object->data.seek_table.num_points-1); -} - -FLAC_API FLAC__bool FLAC__metadata_object_seektable_is_legal(const FLAC__StreamMetadata *object) -{ - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); - - return FLAC__format_seektable_is_legal(&object->data.seek_table); -} - -FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_placeholders(FLAC__StreamMetadata *object, unsigned num) -{ - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); - - if(num > 0) - /* WATCHOUT: we rely on the fact that growing the array adds PLACEHOLDERS at the end */ - return FLAC__metadata_object_seektable_resize_points(object, object->data.seek_table.num_points + num); - else - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_point(FLAC__StreamMetadata *object, FLAC__uint64 sample_number) -{ - FLAC__StreamMetadata_SeekTable *seek_table; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); - - seek_table = &object->data.seek_table; - - if(!FLAC__metadata_object_seektable_resize_points(object, seek_table->num_points + 1)) - return false; - - seek_table->points[seek_table->num_points - 1].sample_number = sample_number; - seek_table->points[seek_table->num_points - 1].stream_offset = 0; - seek_table->points[seek_table->num_points - 1].frame_samples = 0; - - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_points(FLAC__StreamMetadata *object, FLAC__uint64 sample_numbers[], unsigned num) -{ - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); - FLAC__ASSERT(0 != sample_numbers || num == 0); - - if(num > 0) { - FLAC__StreamMetadata_SeekTable *seek_table = &object->data.seek_table; - unsigned i, j; - - i = seek_table->num_points; - - if(!FLAC__metadata_object_seektable_resize_points(object, seek_table->num_points + num)) - return false; - - for(j = 0; j < num; i++, j++) { - seek_table->points[i].sample_number = sample_numbers[j]; - seek_table->points[i].stream_offset = 0; - seek_table->points[i].frame_samples = 0; - } - } - - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_spaced_points(FLAC__StreamMetadata *object, unsigned num, FLAC__uint64 total_samples) -{ - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); - FLAC__ASSERT(total_samples > 0); - - if(num > 0 && total_samples > 0) { - FLAC__StreamMetadata_SeekTable *seek_table = &object->data.seek_table; - unsigned i, j; - - i = seek_table->num_points; - - if(!FLAC__metadata_object_seektable_resize_points(object, seek_table->num_points + num)) - return false; - - for(j = 0; j < num; i++, j++) { - seek_table->points[i].sample_number = total_samples * (FLAC__uint64)j / (FLAC__uint64)num; - seek_table->points[i].stream_offset = 0; - seek_table->points[i].frame_samples = 0; - } - } - - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_spaced_points_by_samples(FLAC__StreamMetadata *object, unsigned samples, FLAC__uint64 total_samples) -{ - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); - FLAC__ASSERT(samples > 0); - FLAC__ASSERT(total_samples > 0); - - if(samples > 0 && total_samples > 0) { - FLAC__StreamMetadata_SeekTable *seek_table = &object->data.seek_table; - unsigned i, j; - FLAC__uint64 num, sample; - - num = 1 + total_samples / samples; /* 1+ for the first sample at 0 */ - /* now account for the fact that we don't place a seekpoint at "total_samples" since samples are number from 0: */ - if(total_samples % samples == 0) - num--; - - i = seek_table->num_points; - - if(!FLAC__metadata_object_seektable_resize_points(object, seek_table->num_points + (unsigned)num)) - return false; - - sample = 0; - for(j = 0; j < num; i++, j++, sample += samples) { - seek_table->points[i].sample_number = sample; - seek_table->points[i].stream_offset = 0; - seek_table->points[i].frame_samples = 0; - } - } - - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_sort(FLAC__StreamMetadata *object, FLAC__bool compact) -{ - unsigned unique; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE); - - unique = FLAC__format_seektable_sort(&object->data.seek_table); - - return !compact || FLAC__metadata_object_seektable_resize_points(object, unique); -} - -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_set_vendor_string(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy) -{ - if(!FLAC__format_vorbiscomment_entry_value_is_legal(entry.entry, entry.length)) - return false; - return vorbiscomment_set_entry_(object, &object->data.vorbis_comment.vendor_string, &entry, copy); -} - -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_resize_comments(FLAC__StreamMetadata *object, unsigned new_num_comments) -{ - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT); - - if(0 == object->data.vorbis_comment.comments) { - FLAC__ASSERT(object->data.vorbis_comment.num_comments == 0); - if(0 == new_num_comments) - return true; - else if(0 == (object->data.vorbis_comment.comments = vorbiscomment_entry_array_new_(new_num_comments))) - return false; - } - else { - const size_t old_size = object->data.vorbis_comment.num_comments * sizeof(FLAC__StreamMetadata_VorbisComment_Entry); - const size_t new_size = new_num_comments * sizeof(FLAC__StreamMetadata_VorbisComment_Entry); - - /* overflow check */ - if(new_num_comments > UINT32_MAX / sizeof(FLAC__StreamMetadata_VorbisComment_Entry)) - return false; - - FLAC__ASSERT(object->data.vorbis_comment.num_comments > 0); - - /* if shrinking, free the truncated entries */ - if(new_num_comments < object->data.vorbis_comment.num_comments) { - unsigned i; - for(i = new_num_comments; i < object->data.vorbis_comment.num_comments; i++) - if(0 != object->data.vorbis_comment.comments[i].entry) - free(object->data.vorbis_comment.comments[i].entry); - } - - if(new_size == 0) { - free(object->data.vorbis_comment.comments); - object->data.vorbis_comment.comments = 0; - } - else if(0 == (object->data.vorbis_comment.comments = realloc(object->data.vorbis_comment.comments, new_size))) - return false; - - /* if growing, zero all the length/pointers of new elements */ - if(new_size > old_size) - memset(object->data.vorbis_comment.comments + object->data.vorbis_comment.num_comments, 0, new_size - old_size); - } - - object->data.vorbis_comment.num_comments = new_num_comments; - - vorbiscomment_calculate_length_(object); - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_set_comment(FLAC__StreamMetadata *object, unsigned comment_num, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy) -{ - FLAC__ASSERT(0 != object); - FLAC__ASSERT(comment_num < object->data.vorbis_comment.num_comments); - - if(!FLAC__format_vorbiscomment_entry_is_legal(entry.entry, entry.length)) - return false; - return vorbiscomment_set_entry_(object, &object->data.vorbis_comment.comments[comment_num], &entry, copy); -} - -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_insert_comment(FLAC__StreamMetadata *object, unsigned comment_num, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy) -{ - FLAC__StreamMetadata_VorbisComment *vc; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT); - FLAC__ASSERT(comment_num <= object->data.vorbis_comment.num_comments); - - if(!FLAC__format_vorbiscomment_entry_is_legal(entry.entry, entry.length)) - return false; - - vc = &object->data.vorbis_comment; - - if(!FLAC__metadata_object_vorbiscomment_resize_comments(object, vc->num_comments+1)) - return false; - - /* move all comments >= comment_num forward one space */ - memmove(&vc->comments[comment_num+1], &vc->comments[comment_num], sizeof(FLAC__StreamMetadata_VorbisComment_Entry)*(vc->num_comments-1-comment_num)); - vc->comments[comment_num].length = 0; - vc->comments[comment_num].entry = 0; - - return FLAC__metadata_object_vorbiscomment_set_comment(object, comment_num, entry, copy); -} - -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_append_comment(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy) -{ - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT); - return FLAC__metadata_object_vorbiscomment_insert_comment(object, object->data.vorbis_comment.num_comments, entry, copy); -} - -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_replace_comment(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool all, FLAC__bool copy) -{ - FLAC__ASSERT(0 != entry.entry && entry.length > 0); - - if(!FLAC__format_vorbiscomment_entry_is_legal(entry.entry, entry.length)) - return false; - - { - int i; - size_t field_name_length; - const FLAC__byte *eq = (FLAC__byte*)memchr(entry.entry, '=', entry.length); - - FLAC__ASSERT(0 != eq); - - if(0 == eq) - return false; /* double protection */ - - field_name_length = eq-entry.entry; - - i = vorbiscomment_find_entry_from_(object, 0, (const char *)entry.entry, field_name_length); - if(i >= 0) { - unsigned indx = (unsigned)i; - if(!FLAC__metadata_object_vorbiscomment_set_comment(object, indx, entry, copy)) - return false; - entry = object->data.vorbis_comment.comments[indx]; - indx++; /* skip over replaced comment */ - if(all && indx < object->data.vorbis_comment.num_comments) { - i = vorbiscomment_find_entry_from_(object, indx, (const char *)entry.entry, field_name_length); - while(i >= 0) { - indx = (unsigned)i; - if(!FLAC__metadata_object_vorbiscomment_delete_comment(object, indx)) - return false; - if(indx < object->data.vorbis_comment.num_comments) - i = vorbiscomment_find_entry_from_(object, indx, (const char *)entry.entry, field_name_length); - else - i = -1; - } - } - return true; - } - else - return FLAC__metadata_object_vorbiscomment_append_comment(object, entry, copy); - } -} - -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_delete_comment(FLAC__StreamMetadata *object, unsigned comment_num) -{ - FLAC__StreamMetadata_VorbisComment *vc; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT); - FLAC__ASSERT(comment_num < object->data.vorbis_comment.num_comments); - - vc = &object->data.vorbis_comment; - - /* free the comment at comment_num */ - if(0 != vc->comments[comment_num].entry) - free(vc->comments[comment_num].entry); - - /* move all comments > comment_num backward one space */ - memmove(&vc->comments[comment_num], &vc->comments[comment_num+1], sizeof(FLAC__StreamMetadata_VorbisComment_Entry)*(vc->num_comments-comment_num-1)); - vc->comments[vc->num_comments-1].length = 0; - vc->comments[vc->num_comments-1].entry = 0; - - return FLAC__metadata_object_vorbiscomment_resize_comments(object, vc->num_comments-1); -} - -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_from_name_value_pair(FLAC__StreamMetadata_VorbisComment_Entry *entry, const char *field_name, const char *field_value) -{ - FLAC__ASSERT(0 != entry); - FLAC__ASSERT(0 != field_name); - FLAC__ASSERT(0 != field_value); - - if(!FLAC__format_vorbiscomment_entry_name_is_legal(field_name)) - return false; - if(!FLAC__format_vorbiscomment_entry_value_is_legal((const FLAC__byte *)field_value, (unsigned)(-1))) - return false; - - { - const size_t nn = strlen(field_name); - const size_t nv = strlen(field_value); - entry->length = nn + 1 /*=*/ + nv; - if(0 == (entry->entry = safe_malloc_add_4op_(nn, /*+*/1, /*+*/nv, /*+*/1))) - return false; - memcpy(entry->entry, field_name, nn); - entry->entry[nn] = '='; - memcpy(entry->entry+nn+1, field_value, nv); - entry->entry[entry->length] = '\0'; - } - - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_to_name_value_pair(const FLAC__StreamMetadata_VorbisComment_Entry entry, char **field_name, char **field_value) -{ - FLAC__ASSERT(0 != entry.entry && entry.length > 0); - FLAC__ASSERT(0 != field_name); - FLAC__ASSERT(0 != field_value); - - if(!FLAC__format_vorbiscomment_entry_is_legal(entry.entry, entry.length)) - return false; - - { - const FLAC__byte *eq = (FLAC__byte*)memchr(entry.entry, '=', entry.length); - const size_t nn = eq-entry.entry; - const size_t nv = entry.length-nn-1; /* -1 for the '=' */ - FLAC__ASSERT(0 != eq); - if(0 == eq) - return false; /* double protection */ - if(0 == (*field_name = safe_malloc_add_2op_(nn, /*+*/1))) - return false; - if(0 == (*field_value = safe_malloc_add_2op_(nv, /*+*/1))) { - free(*field_name); - return false; - } - memcpy(*field_name, entry.entry, nn); - memcpy(*field_value, entry.entry+nn+1, nv); - (*field_name)[nn] = '\0'; - (*field_value)[nv] = '\0'; - } - - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_matches(const FLAC__StreamMetadata_VorbisComment_Entry entry, const char *field_name, unsigned field_name_length) -{ - FLAC__ASSERT(0 != entry.entry && entry.length > 0); - { - const FLAC__byte *eq = (FLAC__byte*)memchr(entry.entry, '=', entry.length); - return (0 != eq && (unsigned)(eq-entry.entry) == field_name_length && 0 == FLAC__STRNCASECMP(field_name, (const char *)entry.entry, field_name_length)); - } -} - -FLAC_API int FLAC__metadata_object_vorbiscomment_find_entry_from(const FLAC__StreamMetadata *object, unsigned offset, const char *field_name) -{ - FLAC__ASSERT(0 != field_name); - - return vorbiscomment_find_entry_from_(object, offset, field_name, strlen(field_name)); -} - -FLAC_API int FLAC__metadata_object_vorbiscomment_remove_entry_matching(FLAC__StreamMetadata *object, const char *field_name) -{ - const unsigned field_name_length = strlen(field_name); - unsigned i; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT); - - for(i = 0; i < object->data.vorbis_comment.num_comments; i++) { - if(FLAC__metadata_object_vorbiscomment_entry_matches(object->data.vorbis_comment.comments[i], field_name, field_name_length)) { - if(!FLAC__metadata_object_vorbiscomment_delete_comment(object, i)) - return -1; - else - return 1; - } - } - - return 0; -} - -FLAC_API int FLAC__metadata_object_vorbiscomment_remove_entries_matching(FLAC__StreamMetadata *object, const char *field_name) -{ - FLAC__bool ok = true; - unsigned matching = 0; - const unsigned field_name_length = strlen(field_name); - int i; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT); - - /* must delete from end to start otherwise it will interfere with our iteration */ - for(i = (int)object->data.vorbis_comment.num_comments - 1; ok && i >= 0; i--) { - if(FLAC__metadata_object_vorbiscomment_entry_matches(object->data.vorbis_comment.comments[i], field_name, field_name_length)) { - matching++; - ok &= FLAC__metadata_object_vorbiscomment_delete_comment(object, (unsigned)i); - } - } - - return ok? (int)matching : -1; -} - -FLAC_API FLAC__StreamMetadata_CueSheet_Track *FLAC__metadata_object_cuesheet_track_new(void) -{ - return calloc(1, sizeof(FLAC__StreamMetadata_CueSheet_Track)); -} - -FLAC_API FLAC__StreamMetadata_CueSheet_Track *FLAC__metadata_object_cuesheet_track_clone(const FLAC__StreamMetadata_CueSheet_Track *object) -{ - FLAC__StreamMetadata_CueSheet_Track *to; - - FLAC__ASSERT(0 != object); - - if(0 != (to = FLAC__metadata_object_cuesheet_track_new())) { - if(!copy_track_(to, object)) { - FLAC__metadata_object_cuesheet_track_delete(to); - return 0; - } - } - - return to; -} - -void FLAC__metadata_object_cuesheet_track_delete_data(FLAC__StreamMetadata_CueSheet_Track *object) -{ - FLAC__ASSERT(0 != object); - - if(0 != object->indices) { - FLAC__ASSERT(object->num_indices > 0); - free(object->indices); - } -} - -FLAC_API void FLAC__metadata_object_cuesheet_track_delete(FLAC__StreamMetadata_CueSheet_Track *object) -{ - FLAC__metadata_object_cuesheet_track_delete_data(object); - free(object); -} - -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_resize_indices(FLAC__StreamMetadata *object, unsigned track_num, unsigned new_num_indices) -{ - FLAC__StreamMetadata_CueSheet_Track *track; - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); - FLAC__ASSERT(track_num < object->data.cue_sheet.num_tracks); - - track = &object->data.cue_sheet.tracks[track_num]; - - if(0 == track->indices) { - FLAC__ASSERT(track->num_indices == 0); - if(0 == new_num_indices) - return true; - else if(0 == (track->indices = cuesheet_track_index_array_new_(new_num_indices))) - return false; - } - else { - const size_t old_size = track->num_indices * sizeof(FLAC__StreamMetadata_CueSheet_Index); - const size_t new_size = new_num_indices * sizeof(FLAC__StreamMetadata_CueSheet_Index); - - /* overflow check */ - if(new_num_indices > UINT32_MAX / sizeof(FLAC__StreamMetadata_CueSheet_Index)) - return false; - - FLAC__ASSERT(track->num_indices > 0); - - if(new_size == 0) { - free(track->indices); - track->indices = 0; - } - else if(0 == (track->indices = realloc(track->indices, new_size))) - return false; - - /* if growing, zero all the lengths/pointers of new elements */ - if(new_size > old_size) - memset(track->indices + track->num_indices, 0, new_size - old_size); - } - - track->num_indices = new_num_indices; - - cuesheet_calculate_length_(object); - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_insert_index(FLAC__StreamMetadata *object, unsigned track_num, unsigned index_num, FLAC__StreamMetadata_CueSheet_Index indx) -{ - FLAC__StreamMetadata_CueSheet_Track *track; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); - FLAC__ASSERT(track_num < object->data.cue_sheet.num_tracks); - FLAC__ASSERT(index_num <= object->data.cue_sheet.tracks[track_num].num_indices); - - track = &object->data.cue_sheet.tracks[track_num]; - - if(!FLAC__metadata_object_cuesheet_track_resize_indices(object, track_num, track->num_indices+1)) - return false; - - /* move all indices >= index_num forward one space */ - memmove(&track->indices[index_num+1], &track->indices[index_num], sizeof(FLAC__StreamMetadata_CueSheet_Index)*(track->num_indices-1-index_num)); - - track->indices[index_num] = indx; - cuesheet_calculate_length_(object); - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_insert_blank_index(FLAC__StreamMetadata *object, unsigned track_num, unsigned index_num) -{ - FLAC__StreamMetadata_CueSheet_Index indx; - memset(&indx, 0, sizeof(indx)); - return FLAC__metadata_object_cuesheet_track_insert_index(object, track_num, index_num, indx); -} - -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_delete_index(FLAC__StreamMetadata *object, unsigned track_num, unsigned index_num) -{ - FLAC__StreamMetadata_CueSheet_Track *track; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); - FLAC__ASSERT(track_num < object->data.cue_sheet.num_tracks); - FLAC__ASSERT(index_num < object->data.cue_sheet.tracks[track_num].num_indices); - - track = &object->data.cue_sheet.tracks[track_num]; - - /* move all indices > index_num backward one space */ - memmove(&track->indices[index_num], &track->indices[index_num+1], sizeof(FLAC__StreamMetadata_CueSheet_Index)*(track->num_indices-index_num-1)); - - FLAC__metadata_object_cuesheet_track_resize_indices(object, track_num, track->num_indices-1); - cuesheet_calculate_length_(object); - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_resize_tracks(FLAC__StreamMetadata *object, unsigned new_num_tracks) -{ - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); - - if(0 == object->data.cue_sheet.tracks) { - FLAC__ASSERT(object->data.cue_sheet.num_tracks == 0); - if(0 == new_num_tracks) - return true; - else if(0 == (object->data.cue_sheet.tracks = cuesheet_track_array_new_(new_num_tracks))) - return false; - } - else { - const size_t old_size = object->data.cue_sheet.num_tracks * sizeof(FLAC__StreamMetadata_CueSheet_Track); - const size_t new_size = new_num_tracks * sizeof(FLAC__StreamMetadata_CueSheet_Track); - - /* overflow check */ - if(new_num_tracks > UINT32_MAX / sizeof(FLAC__StreamMetadata_CueSheet_Track)) - return false; - - FLAC__ASSERT(object->data.cue_sheet.num_tracks > 0); - - /* if shrinking, free the truncated entries */ - if(new_num_tracks < object->data.cue_sheet.num_tracks) { - unsigned i; - for(i = new_num_tracks; i < object->data.cue_sheet.num_tracks; i++) - if(0 != object->data.cue_sheet.tracks[i].indices) - free(object->data.cue_sheet.tracks[i].indices); - } - - if(new_size == 0) { - free(object->data.cue_sheet.tracks); - object->data.cue_sheet.tracks = 0; - } - else if(0 == (object->data.cue_sheet.tracks = realloc(object->data.cue_sheet.tracks, new_size))) - return false; - - /* if growing, zero all the lengths/pointers of new elements */ - if(new_size > old_size) - memset(object->data.cue_sheet.tracks + object->data.cue_sheet.num_tracks, 0, new_size - old_size); - } - - object->data.cue_sheet.num_tracks = new_num_tracks; - - cuesheet_calculate_length_(object); - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_set_track(FLAC__StreamMetadata *object, unsigned track_num, FLAC__StreamMetadata_CueSheet_Track *track, FLAC__bool copy) -{ - FLAC__ASSERT(0 != object); - FLAC__ASSERT(track_num < object->data.cue_sheet.num_tracks); - - return cuesheet_set_track_(object, object->data.cue_sheet.tracks + track_num, track, copy); -} - -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_insert_track(FLAC__StreamMetadata *object, unsigned track_num, FLAC__StreamMetadata_CueSheet_Track *track, FLAC__bool copy) -{ - FLAC__StreamMetadata_CueSheet *cs; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); - FLAC__ASSERT(track_num <= object->data.cue_sheet.num_tracks); - - cs = &object->data.cue_sheet; - - if(!FLAC__metadata_object_cuesheet_resize_tracks(object, cs->num_tracks+1)) - return false; - - /* move all tracks >= track_num forward one space */ - memmove(&cs->tracks[track_num+1], &cs->tracks[track_num], sizeof(FLAC__StreamMetadata_CueSheet_Track)*(cs->num_tracks-1-track_num)); - cs->tracks[track_num].num_indices = 0; - cs->tracks[track_num].indices = 0; - - return FLAC__metadata_object_cuesheet_set_track(object, track_num, track, copy); -} - -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_insert_blank_track(FLAC__StreamMetadata *object, unsigned track_num) -{ - FLAC__StreamMetadata_CueSheet_Track track; - memset(&track, 0, sizeof(track)); - return FLAC__metadata_object_cuesheet_insert_track(object, track_num, &track, /*copy=*/false); -} - -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_delete_track(FLAC__StreamMetadata *object, unsigned track_num) -{ - FLAC__StreamMetadata_CueSheet *cs; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); - FLAC__ASSERT(track_num < object->data.cue_sheet.num_tracks); - - cs = &object->data.cue_sheet; - - /* free the track at track_num */ - if(0 != cs->tracks[track_num].indices) - free(cs->tracks[track_num].indices); - - /* move all tracks > track_num backward one space */ - memmove(&cs->tracks[track_num], &cs->tracks[track_num+1], sizeof(FLAC__StreamMetadata_CueSheet_Track)*(cs->num_tracks-track_num-1)); - cs->tracks[cs->num_tracks-1].num_indices = 0; - cs->tracks[cs->num_tracks-1].indices = 0; - - return FLAC__metadata_object_cuesheet_resize_tracks(object, cs->num_tracks-1); -} - -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_is_legal(const FLAC__StreamMetadata *object, FLAC__bool check_cd_da_subset, const char **violation) -{ - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); - - return FLAC__format_cuesheet_is_legal(&object->data.cue_sheet, check_cd_da_subset, violation); -} - -static FLAC__uint64 get_index_01_offset_(const FLAC__StreamMetadata_CueSheet *cs, unsigned track) -{ - if (track >= (cs->num_tracks-1) || cs->tracks[track].num_indices < 1) - return 0; - else if (cs->tracks[track].indices[0].number == 1) - return cs->tracks[track].indices[0].offset + cs->tracks[track].offset + cs->lead_in; - else if (cs->tracks[track].num_indices < 2) - return 0; - else if (cs->tracks[track].indices[1].number == 1) - return cs->tracks[track].indices[1].offset + cs->tracks[track].offset + cs->lead_in; - else - return 0; -} - -static FLAC__uint32 cddb_add_digits_(FLAC__uint32 x) -{ - FLAC__uint32 n = 0; - while (x) { - n += (x%10); - x /= 10; - } - return n; -} - -/*@@@@add to tests*/ -FLAC_API FLAC__uint32 FLAC__metadata_object_cuesheet_calculate_cddb_id(const FLAC__StreamMetadata *object) -{ - const FLAC__StreamMetadata_CueSheet *cs; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET); - - cs = &object->data.cue_sheet; - - if (cs->num_tracks < 2) /* need at least one real track and the lead-out track */ - return 0; - - { - FLAC__uint32 i, length, sum = 0; - for (i = 0; i < (cs->num_tracks-1); i++) /* -1 to avoid counting the lead-out */ - sum += cddb_add_digits_((FLAC__uint32)(get_index_01_offset_(cs, i) / 44100)); - length = (FLAC__uint32)((cs->tracks[cs->num_tracks-1].offset+cs->lead_in) / 44100) - (FLAC__uint32)(get_index_01_offset_(cs, 0) / 44100); - - return (sum % 0xFF) << 24 | length << 8 | (FLAC__uint32)(cs->num_tracks-1); - } -} - -FLAC_API FLAC__bool FLAC__metadata_object_picture_set_mime_type(FLAC__StreamMetadata *object, char *mime_type, FLAC__bool copy) -{ - char *old; - size_t old_length, new_length; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_PICTURE); - FLAC__ASSERT(0 != mime_type); - - old = object->data.picture.mime_type; - old_length = old? strlen(old) : 0; - new_length = strlen(mime_type); - - /* do the copy first so that if we fail we leave the object untouched */ - if(copy) { - if(new_length >= SIZE_MAX) /* overflow check */ - return false; - if(!copy_bytes_((FLAC__byte**)(&object->data.picture.mime_type), (FLAC__byte*)mime_type, new_length+1)) - return false; - } - else { - object->data.picture.mime_type = mime_type; - } - - if(0 != old) - free(old); - - object->length -= old_length; - object->length += new_length; - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_picture_set_description(FLAC__StreamMetadata *object, FLAC__byte *description, FLAC__bool copy) -{ - FLAC__byte *old; - size_t old_length, new_length; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_PICTURE); - FLAC__ASSERT(0 != description); - - old = object->data.picture.description; - old_length = old? strlen((const char *)old) : 0; - new_length = strlen((const char *)description); - - /* do the copy first so that if we fail we leave the object untouched */ - if(copy) { - if(new_length >= SIZE_MAX) /* overflow check */ - return false; - if(!copy_bytes_(&object->data.picture.description, description, new_length+1)) - return false; - } - else { - object->data.picture.description = description; - } - - if(0 != old) - free(old); - - object->length -= old_length; - object->length += new_length; - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_picture_set_data(FLAC__StreamMetadata *object, FLAC__byte *data, FLAC__uint32 length, FLAC__bool copy) -{ - FLAC__byte *old; - - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_PICTURE); - FLAC__ASSERT((0 != data && length > 0) || (0 == data && length == 0 && copy == false)); - - old = object->data.picture.data; - - /* do the copy first so that if we fail we leave the object untouched */ - if(copy) { - if(!copy_bytes_(&object->data.picture.data, data, length)) - return false; - } - else { - object->data.picture.data = data; - } - - if(0 != old) - free(old); - - object->length -= object->data.picture.data_length; - object->data.picture.data_length = length; - object->length += length; - return true; -} - -FLAC_API FLAC__bool FLAC__metadata_object_picture_is_legal(const FLAC__StreamMetadata *object, const char **violation) -{ - FLAC__ASSERT(0 != object); - FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_PICTURE); - - return FLAC__format_picture_is_legal(&object->data.picture, violation); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/ogg_decoder_aspect.c b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/ogg_decoder_aspect.c deleted file mode 100644 index 219c4795..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/ogg_decoder_aspect.c +++ /dev/null @@ -1,251 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec - * Copyright (C) 2002-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 -#endif - -#include /* for memcpy() */ -#include "FLAC/assert.h" -#include "private/ogg_decoder_aspect.h" -#include "private/ogg_mapping.h" -#include "private/macros.h" - - -/*********************************************************************** - * - * Public class methods - * - ***********************************************************************/ - -FLAC__bool FLAC__ogg_decoder_aspect_init(FLAC__OggDecoderAspect *aspect) -{ - /* we will determine the serial number later if necessary */ - if(ogg_stream_init(&aspect->stream_state, aspect->serial_number) != 0) - return false; - - if(ogg_sync_init(&aspect->sync_state) != 0) - return false; - - aspect->version_major = ~(0u); - aspect->version_minor = ~(0u); - - aspect->need_serial_number = aspect->use_first_serial_number; - - aspect->end_of_stream = false; - aspect->have_working_page = false; - - return true; -} - -void FLAC__ogg_decoder_aspect_finish(FLAC__OggDecoderAspect *aspect) -{ - (void)ogg_sync_clear(&aspect->sync_state); - (void)ogg_stream_clear(&aspect->stream_state); -} - -void FLAC__ogg_decoder_aspect_set_serial_number(FLAC__OggDecoderAspect *aspect, long value) -{ - aspect->use_first_serial_number = false; - aspect->serial_number = value; -} - -void FLAC__ogg_decoder_aspect_set_defaults(FLAC__OggDecoderAspect *aspect) -{ - aspect->use_first_serial_number = true; -} - -void FLAC__ogg_decoder_aspect_flush(FLAC__OggDecoderAspect *aspect) -{ - (void)ogg_stream_reset(&aspect->stream_state); - (void)ogg_sync_reset(&aspect->sync_state); - aspect->end_of_stream = false; - aspect->have_working_page = false; -} - -void FLAC__ogg_decoder_aspect_reset(FLAC__OggDecoderAspect *aspect) -{ - FLAC__ogg_decoder_aspect_flush(aspect); - - if(aspect->use_first_serial_number) - aspect->need_serial_number = true; -} - -FLAC__OggDecoderAspectReadStatus FLAC__ogg_decoder_aspect_read_callback_wrapper(FLAC__OggDecoderAspect *aspect, FLAC__byte buffer[], size_t *bytes, FLAC__OggDecoderAspectReadCallbackProxy read_callback, const FLAC__StreamDecoder *decoder, void *client_data) -{ - static const size_t OGG_BYTES_CHUNK = 8192; - const size_t bytes_requested = *bytes; - - /* - * The FLAC decoding API uses pull-based reads, whereas Ogg decoding - * is push-based. In libFLAC, when you ask to decode a frame, the - * decoder will eventually call the read callback to supply some data, - * but how much it asks for depends on how much free space it has in - * its internal buffer. It does not try to grow its internal buffer - * to accomodate a whole frame because then the internal buffer size - * could not be limited, which is necessary in embedded applications. - * - * Ogg however grows its internal buffer until a whole page is present; - * only then can you get decoded data out. So we can't just ask for - * the same number of bytes from Ogg, then pass what's decoded down to - * libFLAC. If what libFLAC is asking for will not contain a whole - * page, then we will get no data from ogg_sync_pageout(), and at the - * same time cannot just read more data from the client for the purpose - * of getting a whole decoded page because the decoded size might be - * larger than libFLAC's internal buffer. - * - * Instead, whenever this read callback wrapper is called, we will - * continually request data from the client until we have at least one - * page, and manage pages internally so that we can send pieces of - * pages down to libFLAC in such a way that we obey its size - * requirement. To limit the amount of callbacks, we will always try - * to read in enough pages to return the full number of bytes - * requested. - */ - *bytes = 0; - while (*bytes < bytes_requested && !aspect->end_of_stream) { - if (aspect->have_working_page) { - if (aspect->have_working_packet) { - size_t n = bytes_requested - *bytes; - if ((size_t)aspect->working_packet.bytes <= n) { - /* the rest of the packet will fit in the buffer */ - n = aspect->working_packet.bytes; - memcpy(buffer, aspect->working_packet.packet, n); - *bytes += n; - buffer += n; - aspect->have_working_packet = false; - } - else { - /* only n bytes of the packet will fit in the buffer */ - memcpy(buffer, aspect->working_packet.packet, n); - *bytes += n; - buffer += n; - aspect->working_packet.packet += n; - aspect->working_packet.bytes -= n; - } - } - else { - /* try and get another packet */ - const int ret = ogg_stream_packetout(&aspect->stream_state, &aspect->working_packet); - if (ret > 0) { - aspect->have_working_packet = true; - /* if it is the first header packet, check for magic and a supported Ogg FLAC mapping version */ - if (aspect->working_packet.bytes > 0 && aspect->working_packet.packet[0] == FLAC__OGG_MAPPING_FIRST_HEADER_PACKET_TYPE) { - const FLAC__byte *b = aspect->working_packet.packet; - const unsigned header_length = - FLAC__OGG_MAPPING_PACKET_TYPE_LENGTH + - FLAC__OGG_MAPPING_MAGIC_LENGTH + - FLAC__OGG_MAPPING_VERSION_MAJOR_LENGTH + - FLAC__OGG_MAPPING_VERSION_MINOR_LENGTH + - FLAC__OGG_MAPPING_NUM_HEADERS_LENGTH; - if (aspect->working_packet.bytes < (long)header_length) - return FLAC__OGG_DECODER_ASPECT_READ_STATUS_NOT_FLAC; - b += FLAC__OGG_MAPPING_PACKET_TYPE_LENGTH; - if (memcmp(b, FLAC__OGG_MAPPING_MAGIC, FLAC__OGG_MAPPING_MAGIC_LENGTH)) - return FLAC__OGG_DECODER_ASPECT_READ_STATUS_NOT_FLAC; - b += FLAC__OGG_MAPPING_MAGIC_LENGTH; - aspect->version_major = (unsigned)(*b); - b += FLAC__OGG_MAPPING_VERSION_MAJOR_LENGTH; - aspect->version_minor = (unsigned)(*b); - if (aspect->version_major != 1) - return FLAC__OGG_DECODER_ASPECT_READ_STATUS_UNSUPPORTED_MAPPING_VERSION; - aspect->working_packet.packet += header_length; - aspect->working_packet.bytes -= header_length; - } - } - else if (ret == 0) { - aspect->have_working_page = false; - } - else { /* ret < 0 */ - /* lost sync, we'll leave the working page for the next call */ - return FLAC__OGG_DECODER_ASPECT_READ_STATUS_LOST_SYNC; - } - } - } - else { - /* try and get another page */ - const int ret = ogg_sync_pageout(&aspect->sync_state, &aspect->working_page); - if (ret > 0) { - /* got a page, grab the serial number if necessary */ - if(aspect->need_serial_number) { - aspect->stream_state.serialno = aspect->serial_number = ogg_page_serialno(&aspect->working_page); - aspect->need_serial_number = false; - } - if(ogg_stream_pagein(&aspect->stream_state, &aspect->working_page) == 0) { - aspect->have_working_page = true; - aspect->have_working_packet = false; - } - /* else do nothing, could be a page from another stream */ - } - else if (ret == 0) { - /* need more data */ - const size_t ogg_bytes_to_read = flac_max(bytes_requested - *bytes, OGG_BYTES_CHUNK); - char *oggbuf = ogg_sync_buffer(&aspect->sync_state, ogg_bytes_to_read); - - if(0 == oggbuf) { - return FLAC__OGG_DECODER_ASPECT_READ_STATUS_MEMORY_ALLOCATION_ERROR; - } - else { - size_t ogg_bytes_read = ogg_bytes_to_read; - - switch(read_callback(decoder, (FLAC__byte*)oggbuf, &ogg_bytes_read, client_data)) { - case FLAC__OGG_DECODER_ASPECT_READ_STATUS_OK: - break; - case FLAC__OGG_DECODER_ASPECT_READ_STATUS_END_OF_STREAM: - aspect->end_of_stream = true; - break; - case FLAC__OGG_DECODER_ASPECT_READ_STATUS_ABORT: - return FLAC__OGG_DECODER_ASPECT_READ_STATUS_ABORT; - default: - FLAC__ASSERT(0); - } - - if(ogg_sync_wrote(&aspect->sync_state, ogg_bytes_read) < 0) { - /* double protection; this will happen if the read callback returns more bytes than the max requested, which would overflow Ogg's internal buffer */ - FLAC__ASSERT(0); - return FLAC__OGG_DECODER_ASPECT_READ_STATUS_ERROR; - } - } - } - else { /* ret < 0 */ - /* lost sync, bail out */ - return FLAC__OGG_DECODER_ASPECT_READ_STATUS_LOST_SYNC; - } - } - } - - if (aspect->end_of_stream && *bytes == 0) { - return FLAC__OGG_DECODER_ASPECT_READ_STATUS_END_OF_STREAM; - } - - return FLAC__OGG_DECODER_ASPECT_READ_STATUS_OK; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/ogg_encoder_aspect.c b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/ogg_encoder_aspect.c deleted file mode 100644 index 39bb9e96..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/ogg_encoder_aspect.c +++ /dev/null @@ -1,228 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec - * Copyright (C) 2002-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 -#endif - -#include /* for memset() */ -#include "FLAC/assert.h" -#include "private/ogg_encoder_aspect.h" -#include "private/ogg_mapping.h" - -static const FLAC__byte FLAC__OGG_MAPPING_VERSION_MAJOR = 1; -static const FLAC__byte FLAC__OGG_MAPPING_VERSION_MINOR = 0; - -/*********************************************************************** - * - * Public class methods - * - ***********************************************************************/ - -FLAC__bool FLAC__ogg_encoder_aspect_init(FLAC__OggEncoderAspect *aspect) -{ - /* we will determine the serial number later if necessary */ - if(ogg_stream_init(&aspect->stream_state, aspect->serial_number) != 0) - return false; - - aspect->seen_magic = false; - aspect->is_first_packet = true; - aspect->samples_written = 0; - - return true; -} - -void FLAC__ogg_encoder_aspect_finish(FLAC__OggEncoderAspect *aspect) -{ - (void)ogg_stream_clear(&aspect->stream_state); - /*@@@ what about the page? */ -} - -void FLAC__ogg_encoder_aspect_set_serial_number(FLAC__OggEncoderAspect *aspect, long value) -{ - aspect->serial_number = value; -} - -FLAC__bool FLAC__ogg_encoder_aspect_set_num_metadata(FLAC__OggEncoderAspect *aspect, unsigned value) -{ - if(value < (1u << FLAC__OGG_MAPPING_NUM_HEADERS_LEN)) { - aspect->num_metadata = value; - return true; - } - else - return false; -} - -void FLAC__ogg_encoder_aspect_set_defaults(FLAC__OggEncoderAspect *aspect) -{ - aspect->serial_number = 0; - aspect->num_metadata = 0; -} - -/* - * The basic FLAC -> Ogg mapping goes like this: - * - * - 'fLaC' magic and STREAMINFO block get combined into the first - * packet. The packet is prefixed with - * + the one-byte packet type 0x7F - * + 'FLAC' magic - * + the 2 byte Ogg FLAC mapping version number - * + tne 2 byte big-endian # of header packets - * - The first packet is flushed to the first page. - * - Each subsequent metadata block goes into its own packet. - * - Each metadata packet is flushed to page (this is not required, - * the mapping only requires that a flush must occur after all - * metadata is written). - * - Each subsequent FLAC audio frame goes into its own packet. - * - * WATCHOUT: - * This depends on the behavior of FLAC__StreamEncoder that we get a - * separate write callback for the fLaC magic, and then separate write - * callbacks for each metadata block and audio frame. - */ -FLAC__StreamEncoderWriteStatus FLAC__ogg_encoder_aspect_write_callback_wrapper(FLAC__OggEncoderAspect *aspect, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, FLAC__bool is_last_block, FLAC__OggEncoderAspectWriteCallbackProxy write_callback, void *encoder, void *client_data) -{ - /* WATCHOUT: - * This depends on the behavior of FLAC__StreamEncoder that 'samples' - * will be 0 for metadata writes. - */ - const FLAC__bool is_metadata = (samples == 0); - - /* - * Treat fLaC magic packet specially. We will note when we see it, then - * wait until we get the STREAMINFO and prepend it in that packet - */ - if(aspect->seen_magic) { - ogg_packet packet; - FLAC__byte synthetic_first_packet_body[ - FLAC__OGG_MAPPING_PACKET_TYPE_LENGTH + - FLAC__OGG_MAPPING_MAGIC_LENGTH + - FLAC__OGG_MAPPING_VERSION_MAJOR_LENGTH + - FLAC__OGG_MAPPING_VERSION_MINOR_LENGTH + - FLAC__OGG_MAPPING_NUM_HEADERS_LENGTH + - FLAC__STREAM_SYNC_LENGTH + - FLAC__STREAM_METADATA_HEADER_LENGTH + - FLAC__STREAM_METADATA_STREAMINFO_LENGTH - ]; - - memset(&packet, 0, sizeof(packet)); - packet.granulepos = aspect->samples_written + samples; - - if(aspect->is_first_packet) { - FLAC__byte *b = synthetic_first_packet_body; - if(bytes != FLAC__STREAM_METADATA_HEADER_LENGTH + FLAC__STREAM_METADATA_STREAMINFO_LENGTH) { - /* - * If we get here, our assumption about the way write callbacks happen - * (explained above) is wrong - */ - FLAC__ASSERT(0); - return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR; - } - /* add first header packet type */ - *b = FLAC__OGG_MAPPING_FIRST_HEADER_PACKET_TYPE; - b += FLAC__OGG_MAPPING_PACKET_TYPE_LENGTH; - /* add 'FLAC' mapping magic */ - memcpy(b, FLAC__OGG_MAPPING_MAGIC, FLAC__OGG_MAPPING_MAGIC_LENGTH); - b += FLAC__OGG_MAPPING_MAGIC_LENGTH; - /* add Ogg FLAC mapping major version number */ - memcpy(b, &FLAC__OGG_MAPPING_VERSION_MAJOR, FLAC__OGG_MAPPING_VERSION_MAJOR_LENGTH); - b += FLAC__OGG_MAPPING_VERSION_MAJOR_LENGTH; - /* add Ogg FLAC mapping minor version number */ - memcpy(b, &FLAC__OGG_MAPPING_VERSION_MINOR, FLAC__OGG_MAPPING_VERSION_MINOR_LENGTH); - b += FLAC__OGG_MAPPING_VERSION_MINOR_LENGTH; - /* add number of header packets */ - *b = (FLAC__byte)(aspect->num_metadata >> 8); - b++; - *b = (FLAC__byte)(aspect->num_metadata); - b++; - /* add native FLAC 'fLaC' magic */ - memcpy(b, FLAC__STREAM_SYNC_STRING, FLAC__STREAM_SYNC_LENGTH); - b += FLAC__STREAM_SYNC_LENGTH; - /* add STREAMINFO */ - memcpy(b, buffer, bytes); - FLAC__ASSERT(b + bytes - synthetic_first_packet_body == sizeof(synthetic_first_packet_body)); - packet.packet = (unsigned char *)synthetic_first_packet_body; - packet.bytes = sizeof(synthetic_first_packet_body); - - packet.b_o_s = 1; - aspect->is_first_packet = false; - } - else { - packet.packet = (unsigned char *)buffer; - packet.bytes = bytes; - } - - if(is_last_block) { - /* we used to check: - * FLAC__ASSERT(total_samples_estimate == 0 || total_samples_estimate == aspect->samples_written + samples); - * but it's really not useful since total_samples_estimate is an estimate and can be inexact - */ - packet.e_o_s = 1; - } - - if(ogg_stream_packetin(&aspect->stream_state, &packet) != 0) - return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR; - - /*@@@ can't figure out a way to pass a useful number for 'samples' to the write_callback, so we'll just pass 0 */ - if(is_metadata) { - while(ogg_stream_flush(&aspect->stream_state, &aspect->page) != 0) { - if(write_callback(encoder, aspect->page.header, aspect->page.header_len, 0, current_frame, client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) - return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR; - if(write_callback(encoder, aspect->page.body, aspect->page.body_len, 0, current_frame, client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) - return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR; - } - } - else { - while(ogg_stream_pageout(&aspect->stream_state, &aspect->page) != 0) { - if(write_callback(encoder, aspect->page.header, aspect->page.header_len, 0, current_frame, client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) - return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR; - if(write_callback(encoder, aspect->page.body, aspect->page.body_len, 0, current_frame, client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) - return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR; - } - } - } - else if(is_metadata && current_frame == 0 && samples == 0 && bytes == 4 && 0 == memcmp(buffer, FLAC__STREAM_SYNC_STRING, sizeof(FLAC__STREAM_SYNC_STRING))) { - aspect->seen_magic = true; - } - else { - /* - * If we get here, our assumption about the way write callbacks happen - * explained above is wrong - */ - FLAC__ASSERT(0); - return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR; - } - - aspect->samples_written += samples; - - return FLAC__STREAM_ENCODER_WRITE_STATUS_OK; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/ogg_helper.c b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/ogg_helper.c deleted file mode 100644 index 8b3a655a..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/ogg_helper.c +++ /dev/null @@ -1,210 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec - * Copyright (C) 2004-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 -#endif - -#include /* for malloc() */ -#include /* for memcmp(), memcpy() */ -#include "FLAC/assert.h" -#include "share/alloc.h" -#include "private/ogg_helper.h" -#include "protected/stream_encoder.h" - - -static FLAC__bool full_read_(FLAC__StreamEncoder *encoder, FLAC__byte *buffer, size_t bytes, FLAC__StreamEncoderReadCallback read_callback, void *client_data) -{ - while(bytes > 0) { - size_t bytes_read = bytes; - switch(read_callback(encoder, buffer, &bytes_read, client_data)) { - case FLAC__STREAM_ENCODER_READ_STATUS_CONTINUE: - bytes -= bytes_read; - buffer += bytes_read; - break; - case FLAC__STREAM_ENCODER_READ_STATUS_END_OF_STREAM: - if(bytes_read == 0) { - encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR; - return false; - } - bytes -= bytes_read; - buffer += bytes_read; - break; - case FLAC__STREAM_ENCODER_READ_STATUS_ABORT: - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return false; - case FLAC__STREAM_ENCODER_READ_STATUS_UNSUPPORTED: - return false; - default: - /* double protection: */ - FLAC__ASSERT(0); - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return false; - } - } - - return true; -} - -void simple_ogg_page__init(ogg_page *page) -{ - page->header = 0; - page->header_len = 0; - page->body = 0; - page->body_len = 0; -} - -void simple_ogg_page__clear(ogg_page *page) -{ - if(page->header) - free(page->header); - if(page->body) - free(page->body); - simple_ogg_page__init(page); -} - -FLAC__bool simple_ogg_page__get_at(FLAC__StreamEncoder *encoder, FLAC__uint64 position, ogg_page *page, FLAC__StreamEncoderSeekCallback seek_callback, FLAC__StreamEncoderReadCallback read_callback, void *client_data) -{ - static const unsigned OGG_HEADER_FIXED_PORTION_LEN = 27; - static const unsigned OGG_MAX_HEADER_LEN = 27/*OGG_HEADER_FIXED_PORTION_LEN*/ + 255; - FLAC__byte crc[4]; - FLAC__StreamEncoderSeekStatus seek_status; - - FLAC__ASSERT(page->header == 0); - FLAC__ASSERT(page->header_len == 0); - FLAC__ASSERT(page->body == 0); - FLAC__ASSERT(page->body_len == 0); - - /* move the stream pointer to the supposed beginning of the page */ - if(0 == seek_callback) - return false; - if((seek_status = seek_callback((FLAC__StreamEncoder*)encoder, position, client_data)) != FLAC__STREAM_ENCODER_SEEK_STATUS_OK) { - if(seek_status == FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR) - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return false; - } - - /* allocate space for the page header */ - if(0 == (page->header = safe_malloc_(OGG_MAX_HEADER_LEN))) { - encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; - return false; - } - - /* read in the fixed part of the page header (up to but not including - * the segment table */ - if(!full_read_(encoder, page->header, OGG_HEADER_FIXED_PORTION_LEN, read_callback, client_data)) - return false; - - page->header_len = OGG_HEADER_FIXED_PORTION_LEN + page->header[26]; - - /* check to see if it's a correct, "simple" page (one packet only) */ - if( - memcmp(page->header, "OggS", 4) || /* doesn't start with OggS */ - (page->header[5] & 0x01) || /* continued packet */ - memcmp(page->header+6, "\0\0\0\0\0\0\0\0", 8) || /* granulepos is non-zero */ - page->header[26] == 0 /* packet is 0-size */ - ) { - encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR; - return false; - } - - /* read in the segment table */ - if(!full_read_(encoder, page->header + OGG_HEADER_FIXED_PORTION_LEN, page->header[26], read_callback, client_data)) - return false; - - { - unsigned i; - - /* check to see that it specifies a single packet */ - for(i = 0; i < (unsigned)page->header[26] - 1; i++) { - if(page->header[i + OGG_HEADER_FIXED_PORTION_LEN] != 255) { - encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR; - return false; - } - } - - page->body_len = 255 * i + page->header[i + OGG_HEADER_FIXED_PORTION_LEN]; - } - - /* allocate space for the page body */ - if(0 == (page->body = safe_malloc_(page->body_len))) { - encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; - return false; - } - - /* read in the page body */ - if(!full_read_(encoder, page->body, page->body_len, read_callback, client_data)) - return false; - - /* check the CRC */ - memcpy(crc, page->header+22, 4); - ogg_page_checksum_set(page); - if(memcmp(crc, page->header+22, 4)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR; - return false; - } - - return true; -} - -FLAC__bool simple_ogg_page__set_at(FLAC__StreamEncoder *encoder, FLAC__uint64 position, ogg_page *page, FLAC__StreamEncoderSeekCallback seek_callback, FLAC__StreamEncoderWriteCallback write_callback, void *client_data) -{ - FLAC__StreamEncoderSeekStatus seek_status; - - FLAC__ASSERT(page->header != 0); - FLAC__ASSERT(page->header_len != 0); - FLAC__ASSERT(page->body != 0); - FLAC__ASSERT(page->body_len != 0); - - /* move the stream pointer to the supposed beginning of the page */ - if(0 == seek_callback) - return false; - if((seek_status = seek_callback((FLAC__StreamEncoder*)encoder, position, client_data)) != FLAC__STREAM_ENCODER_SEEK_STATUS_OK) { - if(seek_status == FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR) - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return false; - } - - ogg_page_checksum_set(page); - - /* re-write the page */ - if(write_callback((FLAC__StreamEncoder*)encoder, page->header, page->header_len, 0, 0, client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return false; - } - if(write_callback((FLAC__StreamEncoder*)encoder, page->body, page->body_len, 0, 0, client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return false; - } - - return true; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/ogg_mapping.c b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/ogg_mapping.c deleted file mode 100644 index 125b4587..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/ogg_mapping.c +++ /dev/null @@ -1,48 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec - * Copyright (C) 2004-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 -#endif - -#include "private/ogg_mapping.h" - -const unsigned FLAC__OGG_MAPPING_PACKET_TYPE_LEN = 8; /* bits */ - -const FLAC__byte FLAC__OGG_MAPPING_FIRST_HEADER_PACKET_TYPE = 0x7f; - -const FLAC__byte * const FLAC__OGG_MAPPING_MAGIC = (const FLAC__byte * const)"FLAC"; - -const unsigned FLAC__OGG_MAPPING_VERSION_MAJOR_LEN = 8; /* bits */ -const unsigned FLAC__OGG_MAPPING_VERSION_MINOR_LEN = 8; /* bits */ - -const unsigned FLAC__OGG_MAPPING_NUM_HEADERS_LEN = 16; /* bits */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/stream_decoder.c b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/stream_decoder.c deleted file mode 100644 index 6632d312..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/stream_decoder.c +++ /dev/null @@ -1,3389 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 -#endif - -#include -#include /* for malloc() */ -#include /* for memset/memcpy() */ -#include /* for stat() */ -#include /* for off_t */ -#include "share/compat.h" -#include "FLAC/assert.h" -#include "share/alloc.h" -#include "protected/stream_decoder.h" -#include "private/bitreader.h" -#include "private/bitmath.h" -#include "private/cpu.h" -#include "private/crc.h" -#include "private/fixed.h" -#include "private/format.h" -#include "private/lpc.h" -#include "private/md5.h" -#include "private/memory.h" -#include "private/macros.h" - - -/* technically this should be in an "export.c" but this is convenient enough */ -FLAC_API int FLAC_API_SUPPORTS_OGG_FLAC = -#if FLAC__HAS_OGG - 1 -#else - 0 -#endif -; - - -/*********************************************************************** - * - * Private static data - * - ***********************************************************************/ - -static const FLAC__byte ID3V2_TAG_[3] = { 'I', 'D', '3' }; - -/*********************************************************************** - * - * Private class method prototypes - * - ***********************************************************************/ - -static void set_defaults_(FLAC__StreamDecoder *decoder); -static FILE *get_binary_stdin_(void); -static FLAC__bool allocate_output_(FLAC__StreamDecoder *decoder, unsigned size, unsigned channels); -static FLAC__bool has_id_filtered_(FLAC__StreamDecoder *decoder, FLAC__byte *id); -static FLAC__bool find_metadata_(FLAC__StreamDecoder *decoder); -static FLAC__bool read_metadata_(FLAC__StreamDecoder *decoder); -static FLAC__bool read_metadata_streaminfo_(FLAC__StreamDecoder *decoder, FLAC__bool is_last, unsigned length); -static FLAC__bool read_metadata_seektable_(FLAC__StreamDecoder *decoder, FLAC__bool is_last, unsigned length); -static FLAC__bool read_metadata_vorbiscomment_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_VorbisComment *obj, unsigned length); -static FLAC__bool read_metadata_cuesheet_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_CueSheet *obj); -static FLAC__bool read_metadata_picture_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_Picture *obj); -static FLAC__bool skip_id3v2_tag_(FLAC__StreamDecoder *decoder); -static FLAC__bool frame_sync_(FLAC__StreamDecoder *decoder); -static FLAC__bool read_frame_(FLAC__StreamDecoder *decoder, FLAC__bool *got_a_frame, FLAC__bool do_full_decode); -static FLAC__bool read_frame_header_(FLAC__StreamDecoder *decoder); -static FLAC__bool read_subframe_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, FLAC__bool do_full_decode); -static FLAC__bool read_subframe_constant_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, FLAC__bool do_full_decode); -static FLAC__bool read_subframe_fixed_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, const unsigned order, FLAC__bool do_full_decode); -static FLAC__bool read_subframe_lpc_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, const unsigned order, FLAC__bool do_full_decode); -static FLAC__bool read_subframe_verbatim_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, FLAC__bool do_full_decode); -static FLAC__bool read_residual_partitioned_rice_(FLAC__StreamDecoder *decoder, unsigned predictor_order, unsigned partition_order, FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents, FLAC__int32 *residual, FLAC__bool is_extended); -static FLAC__bool read_zero_padding_(FLAC__StreamDecoder *decoder); -static FLAC__bool read_callback_(FLAC__byte buffer[], size_t *bytes, void *client_data); -#if FLAC__HAS_OGG -static FLAC__StreamDecoderReadStatus read_callback_ogg_aspect_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes); -static FLAC__OggDecoderAspectReadStatus read_callback_proxy_(const void *void_decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); -#endif -static FLAC__StreamDecoderWriteStatus write_audio_frame_to_client_(FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[]); -static void send_error_to_client_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status); -static FLAC__bool seek_to_absolute_sample_(FLAC__StreamDecoder *decoder, FLAC__uint64 stream_length, FLAC__uint64 target_sample); -#if FLAC__HAS_OGG -static FLAC__bool seek_to_absolute_sample_ogg_(FLAC__StreamDecoder *decoder, FLAC__uint64 stream_length, FLAC__uint64 target_sample); -#endif -static FLAC__StreamDecoderReadStatus file_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); -static FLAC__StreamDecoderSeekStatus file_seek_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data); -static FLAC__StreamDecoderTellStatus file_tell_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data); -static FLAC__StreamDecoderLengthStatus file_length_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data); -static FLAC__bool file_eof_callback_(const FLAC__StreamDecoder *decoder, void *client_data); - -/*********************************************************************** - * - * Private class data - * - ***********************************************************************/ - -typedef struct FLAC__StreamDecoderPrivate { -#if FLAC__HAS_OGG - FLAC__bool is_ogg; -#endif - FLAC__StreamDecoderReadCallback read_callback; - FLAC__StreamDecoderSeekCallback seek_callback; - FLAC__StreamDecoderTellCallback tell_callback; - FLAC__StreamDecoderLengthCallback length_callback; - FLAC__StreamDecoderEofCallback eof_callback; - FLAC__StreamDecoderWriteCallback write_callback; - FLAC__StreamDecoderMetadataCallback metadata_callback; - FLAC__StreamDecoderErrorCallback error_callback; - /* generic 32-bit datapath: */ - void (*local_lpc_restore_signal)(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); - /* generic 64-bit datapath: */ - void (*local_lpc_restore_signal_64bit)(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); - /* for use when the signal is <= 16 bits-per-sample, or <= 15 bits-per-sample on a side channel (which requires 1 extra bit): */ - void (*local_lpc_restore_signal_16bit)(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); - void *client_data; - FILE *file; /* only used if FLAC__stream_decoder_init_file()/FLAC__stream_decoder_init_file() called, else NULL */ - FLAC__BitReader *input; - FLAC__int32 *output[FLAC__MAX_CHANNELS]; - FLAC__int32 *residual[FLAC__MAX_CHANNELS]; /* WATCHOUT: these are the aligned pointers; the real pointers that should be free()'d are residual_unaligned[] below */ - FLAC__EntropyCodingMethod_PartitionedRiceContents partitioned_rice_contents[FLAC__MAX_CHANNELS]; - unsigned output_capacity, output_channels; - FLAC__uint32 fixed_block_size, next_fixed_block_size; - FLAC__uint64 samples_decoded; - FLAC__bool has_stream_info, has_seek_table; - FLAC__StreamMetadata stream_info; - FLAC__StreamMetadata seek_table; - FLAC__bool metadata_filter[128]; /* MAGIC number 128 == total number of metadata block types == 1 << 7 */ - FLAC__byte *metadata_filter_ids; - size_t metadata_filter_ids_count, metadata_filter_ids_capacity; /* units for both are IDs, not bytes */ - FLAC__Frame frame; - FLAC__bool cached; /* true if there is a byte in lookahead */ - FLAC__CPUInfo cpuinfo; - FLAC__byte header_warmup[2]; /* contains the sync code and reserved bits */ - FLAC__byte lookahead; /* temp storage when we need to look ahead one byte in the stream */ - /* unaligned (original) pointers to allocated data */ - FLAC__int32 *residual_unaligned[FLAC__MAX_CHANNELS]; - FLAC__bool do_md5_checking; /* initially gets protected_->md5_checking but is turned off after a seek or if the metadata has a zero MD5 */ - FLAC__bool internal_reset_hack; /* used only during init() so we can call reset to set up the decoder without rewinding the input */ - FLAC__bool is_seeking; - FLAC__MD5Context md5context; - FLAC__byte computed_md5sum[16]; /* this is the sum we computed from the decoded data */ - /* (the rest of these are only used for seeking) */ - FLAC__Frame last_frame; /* holds the info of the last frame we seeked to */ - FLAC__uint64 first_frame_offset; /* hint to the seek routine of where in the stream the first audio frame starts */ - FLAC__uint64 target_sample; - unsigned unparseable_frame_count; /* used to tell whether we're decoding a future version of FLAC or just got a bad sync */ -#if FLAC__HAS_OGG - FLAC__bool got_a_frame; /* hack needed in Ogg FLAC seek routine to check when process_single() actually writes a frame */ -#endif -} FLAC__StreamDecoderPrivate; - -/*********************************************************************** - * - * Public static class data - * - ***********************************************************************/ - -FLAC_API const char * const FLAC__StreamDecoderStateString[] = { - "FLAC__STREAM_DECODER_SEARCH_FOR_METADATA", - "FLAC__STREAM_DECODER_READ_METADATA", - "FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC", - "FLAC__STREAM_DECODER_READ_FRAME", - "FLAC__STREAM_DECODER_END_OF_STREAM", - "FLAC__STREAM_DECODER_OGG_ERROR", - "FLAC__STREAM_DECODER_SEEK_ERROR", - "FLAC__STREAM_DECODER_ABORTED", - "FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR", - "FLAC__STREAM_DECODER_UNINITIALIZED" -}; - -FLAC_API const char * const FLAC__StreamDecoderInitStatusString[] = { - "FLAC__STREAM_DECODER_INIT_STATUS_OK", - "FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER", - "FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS", - "FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR", - "FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE", - "FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED" -}; - -FLAC_API const char * const FLAC__StreamDecoderReadStatusString[] = { - "FLAC__STREAM_DECODER_READ_STATUS_CONTINUE", - "FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM", - "FLAC__STREAM_DECODER_READ_STATUS_ABORT" -}; - -FLAC_API const char * const FLAC__StreamDecoderSeekStatusString[] = { - "FLAC__STREAM_DECODER_SEEK_STATUS_OK", - "FLAC__STREAM_DECODER_SEEK_STATUS_ERROR", - "FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED" -}; - -FLAC_API const char * const FLAC__StreamDecoderTellStatusString[] = { - "FLAC__STREAM_DECODER_TELL_STATUS_OK", - "FLAC__STREAM_DECODER_TELL_STATUS_ERROR", - "FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED" -}; - -FLAC_API const char * const FLAC__StreamDecoderLengthStatusString[] = { - "FLAC__STREAM_DECODER_LENGTH_STATUS_OK", - "FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR", - "FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED" -}; - -FLAC_API const char * const FLAC__StreamDecoderWriteStatusString[] = { - "FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE", - "FLAC__STREAM_DECODER_WRITE_STATUS_ABORT" -}; - -FLAC_API const char * const FLAC__StreamDecoderErrorStatusString[] = { - "FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC", - "FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER", - "FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH", - "FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM" -}; - -/*********************************************************************** - * - * Class constructor/destructor - * - ***********************************************************************/ -FLAC_API FLAC__StreamDecoder *FLAC__stream_decoder_new(void) -{ - FLAC__StreamDecoder *decoder; - unsigned i; - - FLAC__ASSERT(sizeof(int) >= 4); /* we want to die right away if this is not true */ - - decoder = calloc(1, sizeof(FLAC__StreamDecoder)); - if(decoder == 0) { - return 0; - } - - decoder->protected_ = calloc(1, sizeof(FLAC__StreamDecoderProtected)); - if(decoder->protected_ == 0) { - free(decoder); - return 0; - } - - decoder->private_ = calloc(1, sizeof(FLAC__StreamDecoderPrivate)); - if(decoder->private_ == 0) { - free(decoder->protected_); - free(decoder); - return 0; - } - - decoder->private_->input = FLAC__bitreader_new(); - if(decoder->private_->input == 0) { - free(decoder->private_); - free(decoder->protected_); - free(decoder); - return 0; - } - - decoder->private_->metadata_filter_ids_capacity = 16; - if(0 == (decoder->private_->metadata_filter_ids = malloc((FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8) * decoder->private_->metadata_filter_ids_capacity))) { - FLAC__bitreader_delete(decoder->private_->input); - free(decoder->private_); - free(decoder->protected_); - free(decoder); - return 0; - } - - for(i = 0; i < FLAC__MAX_CHANNELS; i++) { - decoder->private_->output[i] = 0; - decoder->private_->residual_unaligned[i] = decoder->private_->residual[i] = 0; - } - - decoder->private_->output_capacity = 0; - decoder->private_->output_channels = 0; - decoder->private_->has_seek_table = false; - - for(i = 0; i < FLAC__MAX_CHANNELS; i++) - FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&decoder->private_->partitioned_rice_contents[i]); - - decoder->private_->file = 0; - - set_defaults_(decoder); - - decoder->protected_->state = FLAC__STREAM_DECODER_UNINITIALIZED; - - return decoder; -} - -FLAC_API void FLAC__stream_decoder_delete(FLAC__StreamDecoder *decoder) -{ - unsigned i; - - if (decoder == NULL) - return ; - - FLAC__ASSERT(0 != decoder->protected_); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != decoder->private_->input); - - (void)FLAC__stream_decoder_finish(decoder); - - if(0 != decoder->private_->metadata_filter_ids) - free(decoder->private_->metadata_filter_ids); - - FLAC__bitreader_delete(decoder->private_->input); - - for(i = 0; i < FLAC__MAX_CHANNELS; i++) - FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&decoder->private_->partitioned_rice_contents[i]); - - free(decoder->private_); - free(decoder->protected_); - free(decoder); -} - -/*********************************************************************** - * - * Public class methods - * - ***********************************************************************/ - -static FLAC__StreamDecoderInitStatus init_stream_internal_( - FLAC__StreamDecoder *decoder, - FLAC__StreamDecoderReadCallback read_callback, - FLAC__StreamDecoderSeekCallback seek_callback, - FLAC__StreamDecoderTellCallback tell_callback, - FLAC__StreamDecoderLengthCallback length_callback, - FLAC__StreamDecoderEofCallback eof_callback, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data, - FLAC__bool is_ogg -) -{ - FLAC__ASSERT(0 != decoder); - - if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) - return FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED; - -#if !FLAC__HAS_OGG - if(is_ogg) - return FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER; -#endif - - if( - 0 == read_callback || - 0 == write_callback || - 0 == error_callback || - (seek_callback && (0 == tell_callback || 0 == length_callback || 0 == eof_callback)) - ) - return FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS; - -#if FLAC__HAS_OGG - decoder->private_->is_ogg = is_ogg; - if(is_ogg && !FLAC__ogg_decoder_aspect_init(&decoder->protected_->ogg_decoder_aspect)) - return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE; -#endif - - /* - * get the CPU info and set the function pointers - */ - FLAC__cpu_info(&decoder->private_->cpuinfo); - /* first default to the non-asm routines */ - decoder->private_->local_lpc_restore_signal = FLAC__lpc_restore_signal; - decoder->private_->local_lpc_restore_signal_64bit = FLAC__lpc_restore_signal_wide; - decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal; - /* now override with asm where appropriate */ -#ifndef FLAC__NO_ASM - if(decoder->private_->cpuinfo.use_asm) { -#ifdef FLAC__CPU_IA32 - FLAC__ASSERT(decoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_IA32); -#ifdef FLAC__HAS_NASM - decoder->private_->local_lpc_restore_signal_64bit = FLAC__lpc_restore_signal_wide_asm_ia32; /* OPT_IA32: was really necessary for GCC < 4.9 */ - if(decoder->private_->cpuinfo.ia32.mmx) { - decoder->private_->local_lpc_restore_signal = FLAC__lpc_restore_signal_asm_ia32; - decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal_asm_ia32_mmx; - } - else { - decoder->private_->local_lpc_restore_signal = FLAC__lpc_restore_signal_asm_ia32; - decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal_asm_ia32; - } -#endif -#ifdef FLAC__HAS_X86INTRIN -# if defined FLAC__SSE2_SUPPORTED && !defined FLAC__HAS_NASM /* OPT_SSE: not better than MMX asm */ - if(decoder->private_->cpuinfo.ia32.sse2) { - decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal_16_intrin_sse2; - } -# endif -# if defined FLAC__SSE4_1_SUPPORTED - if(decoder->private_->cpuinfo.ia32.sse41) { - decoder->private_->local_lpc_restore_signal_64bit = FLAC__lpc_restore_signal_wide_intrin_sse41; - } -# endif -#endif -#elif defined FLAC__CPU_X86_64 - FLAC__ASSERT(decoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_X86_64); - /* No useful SSE optimizations yet */ -#endif - } -#endif - - /* from here on, errors are fatal */ - - if(!FLAC__bitreader_init(decoder->private_->input, read_callback_, decoder)) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR; - } - - decoder->private_->read_callback = read_callback; - decoder->private_->seek_callback = seek_callback; - decoder->private_->tell_callback = tell_callback; - decoder->private_->length_callback = length_callback; - decoder->private_->eof_callback = eof_callback; - decoder->private_->write_callback = write_callback; - decoder->private_->metadata_callback = metadata_callback; - decoder->private_->error_callback = error_callback; - decoder->private_->client_data = client_data; - decoder->private_->fixed_block_size = decoder->private_->next_fixed_block_size = 0; - decoder->private_->samples_decoded = 0; - decoder->private_->has_stream_info = false; - decoder->private_->cached = false; - - decoder->private_->do_md5_checking = decoder->protected_->md5_checking; - decoder->private_->is_seeking = false; - - decoder->private_->internal_reset_hack = true; /* so the following reset does not try to rewind the input */ - if(!FLAC__stream_decoder_reset(decoder)) { - /* above call sets the state for us */ - return FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR; - } - - return FLAC__STREAM_DECODER_INIT_STATUS_OK; -} - -FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_stream( - FLAC__StreamDecoder *decoder, - FLAC__StreamDecoderReadCallback read_callback, - FLAC__StreamDecoderSeekCallback seek_callback, - FLAC__StreamDecoderTellCallback tell_callback, - FLAC__StreamDecoderLengthCallback length_callback, - FLAC__StreamDecoderEofCallback eof_callback, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -) -{ - return init_stream_internal_( - decoder, - read_callback, - seek_callback, - tell_callback, - length_callback, - eof_callback, - write_callback, - metadata_callback, - error_callback, - client_data, - /*is_ogg=*/false - ); -} - -FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_stream( - FLAC__StreamDecoder *decoder, - FLAC__StreamDecoderReadCallback read_callback, - FLAC__StreamDecoderSeekCallback seek_callback, - FLAC__StreamDecoderTellCallback tell_callback, - FLAC__StreamDecoderLengthCallback length_callback, - FLAC__StreamDecoderEofCallback eof_callback, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -) -{ - return init_stream_internal_( - decoder, - read_callback, - seek_callback, - tell_callback, - length_callback, - eof_callback, - write_callback, - metadata_callback, - error_callback, - client_data, - /*is_ogg=*/true - ); -} - -static FLAC__StreamDecoderInitStatus init_FILE_internal_( - FLAC__StreamDecoder *decoder, - FILE *file, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data, - FLAC__bool is_ogg -) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != file); - - if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) - return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED; - - if(0 == write_callback || 0 == error_callback) - return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS; - - /* - * To make sure that our file does not go unclosed after an error, we - * must assign the FILE pointer before any further error can occur in - * this routine. - */ - if(file == stdin) - file = get_binary_stdin_(); /* just to be safe */ - - decoder->private_->file = file; - - return init_stream_internal_( - decoder, - file_read_callback_, - decoder->private_->file == stdin? 0: file_seek_callback_, - decoder->private_->file == stdin? 0: file_tell_callback_, - decoder->private_->file == stdin? 0: file_length_callback_, - file_eof_callback_, - write_callback, - metadata_callback, - error_callback, - client_data, - is_ogg - ); -} - -FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_FILE( - FLAC__StreamDecoder *decoder, - FILE *file, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -) -{ - return init_FILE_internal_(decoder, file, write_callback, metadata_callback, error_callback, client_data, /*is_ogg=*/false); -} - -FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_FILE( - FLAC__StreamDecoder *decoder, - FILE *file, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -) -{ - return init_FILE_internal_(decoder, file, write_callback, metadata_callback, error_callback, client_data, /*is_ogg=*/true); -} - -static FLAC__StreamDecoderInitStatus init_file_internal_( - FLAC__StreamDecoder *decoder, - const char *filename, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data, - FLAC__bool is_ogg -) -{ - FILE *file; - - FLAC__ASSERT(0 != decoder); - - /* - * To make sure that our file does not go unclosed after an error, we - * have to do the same entrance checks here that are later performed - * in FLAC__stream_decoder_init_FILE() before the FILE* is assigned. - */ - if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) - return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED; - - if(0 == write_callback || 0 == error_callback) - return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS; - - file = filename? flac_fopen(filename, "rb") : stdin; - - if(0 == file) - return FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE; - - return init_FILE_internal_(decoder, file, write_callback, metadata_callback, error_callback, client_data, is_ogg); -} - -FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_file( - FLAC__StreamDecoder *decoder, - const char *filename, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -) -{ - return init_file_internal_(decoder, filename, write_callback, metadata_callback, error_callback, client_data, /*is_ogg=*/false); -} - -FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_file( - FLAC__StreamDecoder *decoder, - const char *filename, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -) -{ - return init_file_internal_(decoder, filename, write_callback, metadata_callback, error_callback, client_data, /*is_ogg=*/true); -} - -FLAC_API FLAC__bool FLAC__stream_decoder_finish(FLAC__StreamDecoder *decoder) -{ - FLAC__bool md5_failed = false; - unsigned i; - - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != decoder->protected_); - - if(decoder->protected_->state == FLAC__STREAM_DECODER_UNINITIALIZED) - return true; - - /* see the comment in FLAC__stream_decoder_reset() as to why we - * always call FLAC__MD5Final() - */ - FLAC__MD5Final(decoder->private_->computed_md5sum, &decoder->private_->md5context); - - if(decoder->private_->has_seek_table && 0 != decoder->private_->seek_table.data.seek_table.points) { - free(decoder->private_->seek_table.data.seek_table.points); - decoder->private_->seek_table.data.seek_table.points = 0; - decoder->private_->has_seek_table = false; - } - FLAC__bitreader_free(decoder->private_->input); - for(i = 0; i < FLAC__MAX_CHANNELS; i++) { - /* WATCHOUT: - * FLAC__lpc_restore_signal_asm_ia32_mmx() requires that the - * output arrays have a buffer of up to 3 zeroes in front - * (at negative indices) for alignment purposes; we use 4 - * to keep the data well-aligned. - */ - if(0 != decoder->private_->output[i]) { - free(decoder->private_->output[i]-4); - decoder->private_->output[i] = 0; - } - if(0 != decoder->private_->residual_unaligned[i]) { - free(decoder->private_->residual_unaligned[i]); - decoder->private_->residual_unaligned[i] = decoder->private_->residual[i] = 0; - } - } - decoder->private_->output_capacity = 0; - decoder->private_->output_channels = 0; - -#if FLAC__HAS_OGG - if(decoder->private_->is_ogg) - FLAC__ogg_decoder_aspect_finish(&decoder->protected_->ogg_decoder_aspect); -#endif - - if(0 != decoder->private_->file) { - if(decoder->private_->file != stdin) - fclose(decoder->private_->file); - decoder->private_->file = 0; - } - - if(decoder->private_->do_md5_checking) { - if(memcmp(decoder->private_->stream_info.data.stream_info.md5sum, decoder->private_->computed_md5sum, 16)) - md5_failed = true; - } - decoder->private_->is_seeking = false; - - set_defaults_(decoder); - - decoder->protected_->state = FLAC__STREAM_DECODER_UNINITIALIZED; - - return !md5_failed; -} - -FLAC_API FLAC__bool FLAC__stream_decoder_set_ogg_serial_number(FLAC__StreamDecoder *decoder, long value) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != decoder->protected_); - if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) - return false; -#if FLAC__HAS_OGG - /* can't check decoder->private_->is_ogg since that's not set until init time */ - FLAC__ogg_decoder_aspect_set_serial_number(&decoder->protected_->ogg_decoder_aspect, value); - return true; -#else - (void)value; - return false; -#endif -} - -FLAC_API FLAC__bool FLAC__stream_decoder_set_md5_checking(FLAC__StreamDecoder *decoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) - return false; - decoder->protected_->md5_checking = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond(FLAC__StreamDecoder *decoder, FLAC__MetadataType type) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != decoder->protected_); - FLAC__ASSERT((unsigned)type <= FLAC__MAX_METADATA_TYPE_CODE); - /* double protection */ - if((unsigned)type > FLAC__MAX_METADATA_TYPE_CODE) - return false; - if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) - return false; - decoder->private_->metadata_filter[type] = true; - if(type == FLAC__METADATA_TYPE_APPLICATION) - decoder->private_->metadata_filter_ids_count = 0; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4]) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != decoder->protected_); - FLAC__ASSERT(0 != id); - if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) - return false; - - if(decoder->private_->metadata_filter[FLAC__METADATA_TYPE_APPLICATION]) - return true; - - FLAC__ASSERT(0 != decoder->private_->metadata_filter_ids); - - if(decoder->private_->metadata_filter_ids_count == decoder->private_->metadata_filter_ids_capacity) { - if(0 == (decoder->private_->metadata_filter_ids = safe_realloc_mul_2op_(decoder->private_->metadata_filter_ids, decoder->private_->metadata_filter_ids_capacity, /*times*/2))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - decoder->private_->metadata_filter_ids_capacity *= 2; - } - - memcpy(decoder->private_->metadata_filter_ids + decoder->private_->metadata_filter_ids_count * (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8), id, (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8)); - decoder->private_->metadata_filter_ids_count++; - - return true; -} - -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_all(FLAC__StreamDecoder *decoder) -{ - unsigned i; - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != decoder->protected_); - if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) - return false; - for(i = 0; i < sizeof(decoder->private_->metadata_filter) / sizeof(decoder->private_->metadata_filter[0]); i++) - decoder->private_->metadata_filter[i] = true; - decoder->private_->metadata_filter_ids_count = 0; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore(FLAC__StreamDecoder *decoder, FLAC__MetadataType type) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != decoder->protected_); - FLAC__ASSERT((unsigned)type <= FLAC__MAX_METADATA_TYPE_CODE); - /* double protection */ - if((unsigned)type > FLAC__MAX_METADATA_TYPE_CODE) - return false; - if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) - return false; - decoder->private_->metadata_filter[type] = false; - if(type == FLAC__METADATA_TYPE_APPLICATION) - decoder->private_->metadata_filter_ids_count = 0; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4]) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != decoder->protected_); - FLAC__ASSERT(0 != id); - if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) - return false; - - if(!decoder->private_->metadata_filter[FLAC__METADATA_TYPE_APPLICATION]) - return true; - - FLAC__ASSERT(0 != decoder->private_->metadata_filter_ids); - - if(decoder->private_->metadata_filter_ids_count == decoder->private_->metadata_filter_ids_capacity) { - if(0 == (decoder->private_->metadata_filter_ids = safe_realloc_mul_2op_(decoder->private_->metadata_filter_ids, decoder->private_->metadata_filter_ids_capacity, /*times*/2))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - decoder->private_->metadata_filter_ids_capacity *= 2; - } - - memcpy(decoder->private_->metadata_filter_ids + decoder->private_->metadata_filter_ids_count * (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8), id, (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8)); - decoder->private_->metadata_filter_ids_count++; - - return true; -} - -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_all(FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != decoder->protected_); - if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) - return false; - memset(decoder->private_->metadata_filter, 0, sizeof(decoder->private_->metadata_filter)); - decoder->private_->metadata_filter_ids_count = 0; - return true; -} - -FLAC_API FLAC__StreamDecoderState FLAC__stream_decoder_get_state(const FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - return decoder->protected_->state; -} - -FLAC_API const char *FLAC__stream_decoder_get_resolved_state_string(const FLAC__StreamDecoder *decoder) -{ - return FLAC__StreamDecoderStateString[decoder->protected_->state]; -} - -FLAC_API FLAC__bool FLAC__stream_decoder_get_md5_checking(const FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - return decoder->protected_->md5_checking; -} - -FLAC_API FLAC__uint64 FLAC__stream_decoder_get_total_samples(const FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - return decoder->private_->has_stream_info? decoder->private_->stream_info.data.stream_info.total_samples : 0; -} - -FLAC_API unsigned FLAC__stream_decoder_get_channels(const FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - return decoder->protected_->channels; -} - -FLAC_API FLAC__ChannelAssignment FLAC__stream_decoder_get_channel_assignment(const FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - return decoder->protected_->channel_assignment; -} - -FLAC_API unsigned FLAC__stream_decoder_get_bits_per_sample(const FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - return decoder->protected_->bits_per_sample; -} - -FLAC_API unsigned FLAC__stream_decoder_get_sample_rate(const FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - return decoder->protected_->sample_rate; -} - -FLAC_API unsigned FLAC__stream_decoder_get_blocksize(const FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - return decoder->protected_->blocksize; -} - -FLAC_API FLAC__bool FLAC__stream_decoder_get_decode_position(const FLAC__StreamDecoder *decoder, FLAC__uint64 *position) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != position); - -#if FLAC__HAS_OGG - if(decoder->private_->is_ogg) - return false; -#endif - if(0 == decoder->private_->tell_callback) - return false; - if(decoder->private_->tell_callback(decoder, position, decoder->private_->client_data) != FLAC__STREAM_DECODER_TELL_STATUS_OK) - return false; - /* should never happen since all FLAC frames and metadata blocks are byte aligned, but check just in case */ - if(!FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)) - return false; - FLAC__ASSERT(*position >= FLAC__stream_decoder_get_input_bytes_unconsumed(decoder)); - *position -= FLAC__stream_decoder_get_input_bytes_unconsumed(decoder); - return true; -} - -FLAC_API FLAC__bool FLAC__stream_decoder_flush(FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != decoder->protected_); - - decoder->private_->samples_decoded = 0; - decoder->private_->do_md5_checking = false; - -#if FLAC__HAS_OGG - if(decoder->private_->is_ogg) - FLAC__ogg_decoder_aspect_flush(&decoder->protected_->ogg_decoder_aspect); -#endif - - if(!FLAC__bitreader_clear(decoder->private_->input)) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - - return true; -} - -FLAC_API FLAC__bool FLAC__stream_decoder_reset(FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != decoder->protected_); - - if(!FLAC__stream_decoder_flush(decoder)) { - /* above call sets the state for us */ - return false; - } - -#if FLAC__HAS_OGG - /*@@@ could go in !internal_reset_hack block below */ - if(decoder->private_->is_ogg) - FLAC__ogg_decoder_aspect_reset(&decoder->protected_->ogg_decoder_aspect); -#endif - - /* Rewind if necessary. If FLAC__stream_decoder_init() is calling us, - * (internal_reset_hack) don't try to rewind since we are already at - * the beginning of the stream and don't want to fail if the input is - * not seekable. - */ - if(!decoder->private_->internal_reset_hack) { - if(decoder->private_->file == stdin) - return false; /* can't rewind stdin, reset fails */ - if(decoder->private_->seek_callback && decoder->private_->seek_callback(decoder, 0, decoder->private_->client_data) == FLAC__STREAM_DECODER_SEEK_STATUS_ERROR) - return false; /* seekable and seek fails, reset fails */ - } - else - decoder->private_->internal_reset_hack = false; - - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_METADATA; - - decoder->private_->has_stream_info = false; - if(decoder->private_->has_seek_table && 0 != decoder->private_->seek_table.data.seek_table.points) { - free(decoder->private_->seek_table.data.seek_table.points); - decoder->private_->seek_table.data.seek_table.points = 0; - decoder->private_->has_seek_table = false; - } - decoder->private_->do_md5_checking = decoder->protected_->md5_checking; - /* - * This goes in reset() and not flush() because according to the spec, a - * fixed-blocksize stream must stay that way through the whole stream. - */ - decoder->private_->fixed_block_size = decoder->private_->next_fixed_block_size = 0; - - /* We initialize the FLAC__MD5Context even though we may never use it. This - * is because md5 checking may be turned on to start and then turned off if - * a seek occurs. So we init the context here and finalize it in - * FLAC__stream_decoder_finish() to make sure things are always cleaned up - * properly. - */ - FLAC__MD5Init(&decoder->private_->md5context); - - decoder->private_->first_frame_offset = 0; - decoder->private_->unparseable_frame_count = 0; - - return true; -} - -FLAC_API FLAC__bool FLAC__stream_decoder_process_single(FLAC__StreamDecoder *decoder) -{ - FLAC__bool got_a_frame; - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - - while(1) { - switch(decoder->protected_->state) { - case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA: - if(!find_metadata_(decoder)) - return false; /* above function sets the status for us */ - break; - case FLAC__STREAM_DECODER_READ_METADATA: - if(!read_metadata_(decoder)) - return false; /* above function sets the status for us */ - else - return true; - case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC: - if(!frame_sync_(decoder)) - return true; /* above function sets the status for us */ - break; - case FLAC__STREAM_DECODER_READ_FRAME: - if(!read_frame_(decoder, &got_a_frame, /*do_full_decode=*/true)) - return false; /* above function sets the status for us */ - if(got_a_frame) - return true; /* above function sets the status for us */ - break; - case FLAC__STREAM_DECODER_END_OF_STREAM: - case FLAC__STREAM_DECODER_ABORTED: - return true; - default: - FLAC__ASSERT(0); - return false; - } - } -} - -FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_metadata(FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - - while(1) { - switch(decoder->protected_->state) { - case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA: - if(!find_metadata_(decoder)) - return false; /* above function sets the status for us */ - break; - case FLAC__STREAM_DECODER_READ_METADATA: - if(!read_metadata_(decoder)) - return false; /* above function sets the status for us */ - break; - case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC: - case FLAC__STREAM_DECODER_READ_FRAME: - case FLAC__STREAM_DECODER_END_OF_STREAM: - case FLAC__STREAM_DECODER_ABORTED: - return true; - default: - FLAC__ASSERT(0); - return false; - } - } -} - -FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_stream(FLAC__StreamDecoder *decoder) -{ - FLAC__bool dummy; - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - - while(1) { - switch(decoder->protected_->state) { - case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA: - if(!find_metadata_(decoder)) - return false; /* above function sets the status for us */ - break; - case FLAC__STREAM_DECODER_READ_METADATA: - if(!read_metadata_(decoder)) - return false; /* above function sets the status for us */ - break; - case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC: - if(!frame_sync_(decoder)) - return true; /* above function sets the status for us */ - break; - case FLAC__STREAM_DECODER_READ_FRAME: - if(!read_frame_(decoder, &dummy, /*do_full_decode=*/true)) - return false; /* above function sets the status for us */ - break; - case FLAC__STREAM_DECODER_END_OF_STREAM: - case FLAC__STREAM_DECODER_ABORTED: - return true; - default: - FLAC__ASSERT(0); - return false; - } - } -} - -FLAC_API FLAC__bool FLAC__stream_decoder_skip_single_frame(FLAC__StreamDecoder *decoder) -{ - FLAC__bool got_a_frame; - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - - while(1) { - switch(decoder->protected_->state) { - case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA: - case FLAC__STREAM_DECODER_READ_METADATA: - return false; /* above function sets the status for us */ - case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC: - if(!frame_sync_(decoder)) - return true; /* above function sets the status for us */ - break; - case FLAC__STREAM_DECODER_READ_FRAME: - if(!read_frame_(decoder, &got_a_frame, /*do_full_decode=*/false)) - return false; /* above function sets the status for us */ - if(got_a_frame) - return true; /* above function sets the status for us */ - break; - case FLAC__STREAM_DECODER_END_OF_STREAM: - case FLAC__STREAM_DECODER_ABORTED: - return true; - default: - FLAC__ASSERT(0); - return false; - } - } -} - -FLAC_API FLAC__bool FLAC__stream_decoder_seek_absolute(FLAC__StreamDecoder *decoder, FLAC__uint64 sample) -{ - FLAC__uint64 length; - - FLAC__ASSERT(0 != decoder); - - if( - decoder->protected_->state != FLAC__STREAM_DECODER_SEARCH_FOR_METADATA && - decoder->protected_->state != FLAC__STREAM_DECODER_READ_METADATA && - decoder->protected_->state != FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC && - decoder->protected_->state != FLAC__STREAM_DECODER_READ_FRAME && - decoder->protected_->state != FLAC__STREAM_DECODER_END_OF_STREAM - ) - return false; - - if(0 == decoder->private_->seek_callback) - return false; - - FLAC__ASSERT(decoder->private_->seek_callback); - FLAC__ASSERT(decoder->private_->tell_callback); - FLAC__ASSERT(decoder->private_->length_callback); - FLAC__ASSERT(decoder->private_->eof_callback); - - if(FLAC__stream_decoder_get_total_samples(decoder) > 0 && sample >= FLAC__stream_decoder_get_total_samples(decoder)) - return false; - - decoder->private_->is_seeking = true; - - /* turn off md5 checking if a seek is attempted */ - decoder->private_->do_md5_checking = false; - - /* get the file length (currently our algorithm needs to know the length so it's also an error to get FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED) */ - if(decoder->private_->length_callback(decoder, &length, decoder->private_->client_data) != FLAC__STREAM_DECODER_LENGTH_STATUS_OK) { - decoder->private_->is_seeking = false; - return false; - } - - /* if we haven't finished processing the metadata yet, do that so we have the STREAMINFO, SEEK_TABLE, and first_frame_offset */ - if( - decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_METADATA || - decoder->protected_->state == FLAC__STREAM_DECODER_READ_METADATA - ) { - if(!FLAC__stream_decoder_process_until_end_of_metadata(decoder)) { - /* above call sets the state for us */ - decoder->private_->is_seeking = false; - return false; - } - /* check this again in case we didn't know total_samples the first time */ - if(FLAC__stream_decoder_get_total_samples(decoder) > 0 && sample >= FLAC__stream_decoder_get_total_samples(decoder)) { - decoder->private_->is_seeking = false; - return false; - } - } - - { - const FLAC__bool ok = -#if FLAC__HAS_OGG - decoder->private_->is_ogg? - seek_to_absolute_sample_ogg_(decoder, length, sample) : -#endif - seek_to_absolute_sample_(decoder, length, sample) - ; - decoder->private_->is_seeking = false; - return ok; - } -} - -/*********************************************************************** - * - * Protected class methods - * - ***********************************************************************/ - -unsigned FLAC__stream_decoder_get_input_bytes_unconsumed(const FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); - FLAC__ASSERT(!(FLAC__bitreader_get_input_bits_unconsumed(decoder->private_->input) & 7)); - return FLAC__bitreader_get_input_bits_unconsumed(decoder->private_->input) / 8; -} - -/*********************************************************************** - * - * Private class methods - * - ***********************************************************************/ - -void set_defaults_(FLAC__StreamDecoder *decoder) -{ -#if FLAC__HAS_OGG - decoder->private_->is_ogg = false; -#endif - decoder->private_->read_callback = 0; - decoder->private_->seek_callback = 0; - decoder->private_->tell_callback = 0; - decoder->private_->length_callback = 0; - decoder->private_->eof_callback = 0; - decoder->private_->write_callback = 0; - decoder->private_->metadata_callback = 0; - decoder->private_->error_callback = 0; - decoder->private_->client_data = 0; - - memset(decoder->private_->metadata_filter, 0, sizeof(decoder->private_->metadata_filter)); - decoder->private_->metadata_filter[FLAC__METADATA_TYPE_STREAMINFO] = true; - decoder->private_->metadata_filter_ids_count = 0; - - decoder->protected_->md5_checking = false; - -#if FLAC__HAS_OGG - FLAC__ogg_decoder_aspect_set_defaults(&decoder->protected_->ogg_decoder_aspect); -#endif -} - -/* - * This will forcibly set stdin to binary mode (for OSes that require it) - */ -FILE *get_binary_stdin_(void) -{ - /* if something breaks here it is probably due to the presence or - * absence of an underscore before the identifiers 'setmode', - * 'fileno', and/or 'O_BINARY'; check your system header files. - */ -#if defined _MSC_VER || defined __MINGW32__ - _setmode(_fileno(stdin), _O_BINARY); -#elif defined __CYGWIN__ - /* almost certainly not needed for any modern Cygwin, but let's be safe... */ - setmode(_fileno(stdin), _O_BINARY); -#elif defined __EMX__ - setmode(fileno(stdin), O_BINARY); -#endif - - return stdin; -} - -FLAC__bool allocate_output_(FLAC__StreamDecoder *decoder, unsigned size, unsigned channels) -{ - unsigned i; - FLAC__int32 *tmp; - - if(size <= decoder->private_->output_capacity && channels <= decoder->private_->output_channels) - return true; - - /* simply using realloc() is not practical because the number of channels may change mid-stream */ - - for(i = 0; i < FLAC__MAX_CHANNELS; i++) { - if(0 != decoder->private_->output[i]) { - free(decoder->private_->output[i]-4); - decoder->private_->output[i] = 0; - } - if(0 != decoder->private_->residual_unaligned[i]) { - free(decoder->private_->residual_unaligned[i]); - decoder->private_->residual_unaligned[i] = decoder->private_->residual[i] = 0; - } - } - - for(i = 0; i < channels; i++) { - /* WATCHOUT: - * FLAC__lpc_restore_signal_asm_ia32_mmx() requires that the - * output arrays have a buffer of up to 3 zeroes in front - * (at negative indices) for alignment purposes; we use 4 - * to keep the data well-aligned. - */ - tmp = safe_malloc_muladd2_(sizeof(FLAC__int32), /*times (*/size, /*+*/4/*)*/); - if(tmp == 0) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - memset(tmp, 0, sizeof(FLAC__int32)*4); - decoder->private_->output[i] = tmp + 4; - - if(!FLAC__memory_alloc_aligned_int32_array(size, &decoder->private_->residual_unaligned[i], &decoder->private_->residual[i])) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - } - - decoder->private_->output_capacity = size; - decoder->private_->output_channels = channels; - - return true; -} - -FLAC__bool has_id_filtered_(FLAC__StreamDecoder *decoder, FLAC__byte *id) -{ - size_t i; - - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - - for(i = 0; i < decoder->private_->metadata_filter_ids_count; i++) - if(0 == memcmp(decoder->private_->metadata_filter_ids + i * (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8), id, (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8))) - return true; - - return false; -} - -FLAC__bool find_metadata_(FLAC__StreamDecoder *decoder) -{ - FLAC__uint32 x; - unsigned i, id; - FLAC__bool first = true; - - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); - - for(i = id = 0; i < 4; ) { - if(decoder->private_->cached) { - x = (FLAC__uint32)decoder->private_->lookahead; - decoder->private_->cached = false; - } - else { - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) - return false; /* read_callback_ sets the state for us */ - } - if(x == FLAC__STREAM_SYNC_STRING[i]) { - first = true; - i++; - id = 0; - continue; - } - - if(id >= 3) - return false; - - if(x == ID3V2_TAG_[id]) { - id++; - i = 0; - if(id == 3) { - if(!skip_id3v2_tag_(decoder)) - return false; /* skip_id3v2_tag_ sets the state for us */ - } - continue; - } - id = 0; - if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ - decoder->private_->header_warmup[0] = (FLAC__byte)x; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) - return false; /* read_callback_ sets the state for us */ - - /* we have to check if we just read two 0xff's in a row; the second may actually be the beginning of the sync code */ - /* else we have to check if the second byte is the end of a sync code */ - if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ - decoder->private_->lookahead = (FLAC__byte)x; - decoder->private_->cached = true; - } - else if(x >> 1 == 0x7c) { /* MAGIC NUMBER for the last 6 sync bits and reserved 7th bit */ - decoder->private_->header_warmup[1] = (FLAC__byte)x; - decoder->protected_->state = FLAC__STREAM_DECODER_READ_FRAME; - return true; - } - } - i = 0; - if(first) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); - first = false; - } - } - - decoder->protected_->state = FLAC__STREAM_DECODER_READ_METADATA; - return true; -} - -FLAC__bool read_metadata_(FLAC__StreamDecoder *decoder) -{ - FLAC__bool is_last; - FLAC__uint32 i, x, type, length; - - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_IS_LAST_LEN)) - return false; /* read_callback_ sets the state for us */ - is_last = x? true : false; - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &type, FLAC__STREAM_METADATA_TYPE_LEN)) - return false; /* read_callback_ sets the state for us */ - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &length, FLAC__STREAM_METADATA_LENGTH_LEN)) - return false; /* read_callback_ sets the state for us */ - - if(type == FLAC__METADATA_TYPE_STREAMINFO) { - if(!read_metadata_streaminfo_(decoder, is_last, length)) - return false; - - decoder->private_->has_stream_info = true; - if(0 == memcmp(decoder->private_->stream_info.data.stream_info.md5sum, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 16)) - decoder->private_->do_md5_checking = false; - if(!decoder->private_->is_seeking && decoder->private_->metadata_filter[FLAC__METADATA_TYPE_STREAMINFO] && decoder->private_->metadata_callback) - decoder->private_->metadata_callback(decoder, &decoder->private_->stream_info, decoder->private_->client_data); - } - else if(type == FLAC__METADATA_TYPE_SEEKTABLE) { - if(!read_metadata_seektable_(decoder, is_last, length)) - return false; - - decoder->private_->has_seek_table = true; - if(!decoder->private_->is_seeking && decoder->private_->metadata_filter[FLAC__METADATA_TYPE_SEEKTABLE] && decoder->private_->metadata_callback) - decoder->private_->metadata_callback(decoder, &decoder->private_->seek_table, decoder->private_->client_data); - } - else { - FLAC__bool skip_it = !decoder->private_->metadata_filter[type]; - unsigned real_length = length; - FLAC__StreamMetadata block; - - memset(&block, 0, sizeof(block)); - block.is_last = is_last; - block.type = (FLAC__MetadataType)type; - block.length = length; - - if(type == FLAC__METADATA_TYPE_APPLICATION) { - if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, block.data.application.id, FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8)) - return false; /* read_callback_ sets the state for us */ - - if(real_length < FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8) { /* underflow check */ - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;/*@@@@@@ maybe wrong error? need to resync?*/ - return false; - } - - real_length -= FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8; - - if(decoder->private_->metadata_filter_ids_count > 0 && has_id_filtered_(decoder, block.data.application.id)) - skip_it = !skip_it; - } - - if(skip_it) { - if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, real_length)) - return false; /* read_callback_ sets the state for us */ - } - else { - FLAC__bool ok = true; - switch(type) { - case FLAC__METADATA_TYPE_PADDING: - /* skip the padding bytes */ - if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, real_length)) - ok = false; /* read_callback_ sets the state for us */ - break; - case FLAC__METADATA_TYPE_APPLICATION: - /* remember, we read the ID already */ - if(real_length > 0) { - if(0 == (block.data.application.data = malloc(real_length))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - ok = false; - } - else if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, block.data.application.data, real_length)) - ok = false; /* read_callback_ sets the state for us */ - } - else - block.data.application.data = 0; - break; - case FLAC__METADATA_TYPE_VORBIS_COMMENT: - if(!read_metadata_vorbiscomment_(decoder, &block.data.vorbis_comment, real_length)) - ok = false; - break; - case FLAC__METADATA_TYPE_CUESHEET: - if(!read_metadata_cuesheet_(decoder, &block.data.cue_sheet)) - ok = false; - break; - case FLAC__METADATA_TYPE_PICTURE: - if(!read_metadata_picture_(decoder, &block.data.picture)) - ok = false; - break; - case FLAC__METADATA_TYPE_STREAMINFO: - case FLAC__METADATA_TYPE_SEEKTABLE: - FLAC__ASSERT(0); - break; - default: - if(real_length > 0) { - if(0 == (block.data.unknown.data = malloc(real_length))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - ok = false; - } - else if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, block.data.unknown.data, real_length)) - ok = false; /* read_callback_ sets the state for us */ - } - else - block.data.unknown.data = 0; - break; - } - if(ok && !decoder->private_->is_seeking && decoder->private_->metadata_callback) - decoder->private_->metadata_callback(decoder, &block, decoder->private_->client_data); - - /* now we have to free any malloc()ed data in the block */ - switch(type) { - case FLAC__METADATA_TYPE_PADDING: - break; - case FLAC__METADATA_TYPE_APPLICATION: - if(0 != block.data.application.data) - free(block.data.application.data); - break; - case FLAC__METADATA_TYPE_VORBIS_COMMENT: - if(0 != block.data.vorbis_comment.vendor_string.entry) - free(block.data.vorbis_comment.vendor_string.entry); - if(block.data.vorbis_comment.num_comments > 0) - for(i = 0; i < block.data.vorbis_comment.num_comments; i++) - if(0 != block.data.vorbis_comment.comments[i].entry) - free(block.data.vorbis_comment.comments[i].entry); - if(0 != block.data.vorbis_comment.comments) - free(block.data.vorbis_comment.comments); - break; - case FLAC__METADATA_TYPE_CUESHEET: - if(block.data.cue_sheet.num_tracks > 0) - for(i = 0; i < block.data.cue_sheet.num_tracks; i++) - if(0 != block.data.cue_sheet.tracks[i].indices) - free(block.data.cue_sheet.tracks[i].indices); - if(0 != block.data.cue_sheet.tracks) - free(block.data.cue_sheet.tracks); - break; - case FLAC__METADATA_TYPE_PICTURE: - if(0 != block.data.picture.mime_type) - free(block.data.picture.mime_type); - if(0 != block.data.picture.description) - free(block.data.picture.description); - if(0 != block.data.picture.data) - free(block.data.picture.data); - break; - case FLAC__METADATA_TYPE_STREAMINFO: - case FLAC__METADATA_TYPE_SEEKTABLE: - FLAC__ASSERT(0); - default: - if(0 != block.data.unknown.data) - free(block.data.unknown.data); - break; - } - - if(!ok) /* anything that unsets "ok" should also make sure decoder->protected_->state is updated */ - return false; - } - } - - if(is_last) { - /* if this fails, it's OK, it's just a hint for the seek routine */ - if(!FLAC__stream_decoder_get_decode_position(decoder, &decoder->private_->first_frame_offset)) - decoder->private_->first_frame_offset = 0; - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - } - - return true; -} - -FLAC__bool read_metadata_streaminfo_(FLAC__StreamDecoder *decoder, FLAC__bool is_last, unsigned length) -{ - FLAC__uint32 x; - unsigned bits, used_bits = 0; - - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); - - decoder->private_->stream_info.type = FLAC__METADATA_TYPE_STREAMINFO; - decoder->private_->stream_info.is_last = is_last; - decoder->private_->stream_info.length = length; - - bits = FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, bits)) - return false; /* read_callback_ sets the state for us */ - decoder->private_->stream_info.data.stream_info.min_blocksize = x; - used_bits += bits; - - bits = FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN)) - return false; /* read_callback_ sets the state for us */ - decoder->private_->stream_info.data.stream_info.max_blocksize = x; - used_bits += bits; - - bits = FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN)) - return false; /* read_callback_ sets the state for us */ - decoder->private_->stream_info.data.stream_info.min_framesize = x; - used_bits += bits; - - bits = FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN)) - return false; /* read_callback_ sets the state for us */ - decoder->private_->stream_info.data.stream_info.max_framesize = x; - used_bits += bits; - - bits = FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN)) - return false; /* read_callback_ sets the state for us */ - decoder->private_->stream_info.data.stream_info.sample_rate = x; - used_bits += bits; - - bits = FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN)) - return false; /* read_callback_ sets the state for us */ - decoder->private_->stream_info.data.stream_info.channels = x+1; - used_bits += bits; - - bits = FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN)) - return false; /* read_callback_ sets the state for us */ - decoder->private_->stream_info.data.stream_info.bits_per_sample = x+1; - used_bits += bits; - - bits = FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN; - if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &decoder->private_->stream_info.data.stream_info.total_samples, FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN)) - return false; /* read_callback_ sets the state for us */ - used_bits += bits; - - if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, decoder->private_->stream_info.data.stream_info.md5sum, 16)) - return false; /* read_callback_ sets the state for us */ - used_bits += 16*8; - - /* skip the rest of the block */ - FLAC__ASSERT(used_bits % 8 == 0); - length -= (used_bits / 8); - if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, length)) - return false; /* read_callback_ sets the state for us */ - - return true; -} - -FLAC__bool read_metadata_seektable_(FLAC__StreamDecoder *decoder, FLAC__bool is_last, unsigned length) -{ - FLAC__uint32 i, x; - FLAC__uint64 xx; - - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); - - decoder->private_->seek_table.type = FLAC__METADATA_TYPE_SEEKTABLE; - decoder->private_->seek_table.is_last = is_last; - decoder->private_->seek_table.length = length; - - decoder->private_->seek_table.data.seek_table.num_points = length / FLAC__STREAM_METADATA_SEEKPOINT_LENGTH; - - /* use realloc since we may pass through here several times (e.g. after seeking) */ - if(0 == (decoder->private_->seek_table.data.seek_table.points = safe_realloc_mul_2op_(decoder->private_->seek_table.data.seek_table.points, decoder->private_->seek_table.data.seek_table.num_points, /*times*/sizeof(FLAC__StreamMetadata_SeekPoint)))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - for(i = 0; i < decoder->private_->seek_table.data.seek_table.num_points; i++) { - if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &xx, FLAC__STREAM_METADATA_SEEKPOINT_SAMPLE_NUMBER_LEN)) - return false; /* read_callback_ sets the state for us */ - decoder->private_->seek_table.data.seek_table.points[i].sample_number = xx; - - if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &xx, FLAC__STREAM_METADATA_SEEKPOINT_STREAM_OFFSET_LEN)) - return false; /* read_callback_ sets the state for us */ - decoder->private_->seek_table.data.seek_table.points[i].stream_offset = xx; - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_SEEKPOINT_FRAME_SAMPLES_LEN)) - return false; /* read_callback_ sets the state for us */ - decoder->private_->seek_table.data.seek_table.points[i].frame_samples = x; - } - length -= (decoder->private_->seek_table.data.seek_table.num_points * FLAC__STREAM_METADATA_SEEKPOINT_LENGTH); - /* if there is a partial point left, skip over it */ - if(length > 0) { - /*@@@ do a send_error_to_client_() here? there's an argument for either way */ - if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, length)) - return false; /* read_callback_ sets the state for us */ - } - - return true; -} - -FLAC__bool read_metadata_vorbiscomment_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_VorbisComment *obj, unsigned length) -{ - FLAC__uint32 i; - - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); - - /* read vendor string */ - if (length >= 8) { - length -= 8; /* vendor string length + num comments entries alone take 8 bytes */ - FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN == 32); - if (!FLAC__bitreader_read_uint32_little_endian(decoder->private_->input, &obj->vendor_string.length)) - return false; /* read_callback_ sets the state for us */ - if (obj->vendor_string.length > 0) { - if (length < obj->vendor_string.length) { - obj->vendor_string.length = 0; - obj->vendor_string.entry = 0; - goto skip; - } - else - length -= obj->vendor_string.length; - if (0 == (obj->vendor_string.entry = safe_malloc_add_2op_(obj->vendor_string.length, /*+*/1))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - if (!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->vendor_string.entry, obj->vendor_string.length)) - return false; /* read_callback_ sets the state for us */ - obj->vendor_string.entry[obj->vendor_string.length] = '\0'; - } - else - obj->vendor_string.entry = 0; - - /* read num comments */ - FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN == 32); - if (!FLAC__bitreader_read_uint32_little_endian(decoder->private_->input, &obj->num_comments)) - return false; /* read_callback_ sets the state for us */ - - /* read comments */ - if (obj->num_comments > 0) { - if (0 == (obj->comments = safe_malloc_mul_2op_p(obj->num_comments, /*times*/sizeof(FLAC__StreamMetadata_VorbisComment_Entry)))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - for (i = 0; i < obj->num_comments; i++) { - FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN == 32); - if (length < 4) { - obj->num_comments = i; - goto skip; - } - else - length -= 4; - if (!FLAC__bitreader_read_uint32_little_endian(decoder->private_->input, &obj->comments[i].length)) - return false; /* read_callback_ sets the state for us */ - if (obj->comments[i].length > 0) { - if (length < obj->comments[i].length) { - obj->comments[i].length = 0; - obj->comments[i].entry = 0; - obj->num_comments = i; - goto skip; - } - else - length -= obj->comments[i].length; - if (0 == (obj->comments[i].entry = safe_malloc_add_2op_(obj->comments[i].length, /*+*/1))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - if (!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->comments[i].entry, obj->comments[i].length)) - return false; /* read_callback_ sets the state for us */ - obj->comments[i].entry[obj->comments[i].length] = '\0'; - } - else - obj->comments[i].entry = 0; - } - } - else - obj->comments = 0; - } - - skip: - if (length > 0) { - /* This will only happen on files with invalid data in comments */ - if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, length)) - return false; /* read_callback_ sets the state for us */ - } - - return true; -} - -FLAC__bool read_metadata_cuesheet_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_CueSheet *obj) -{ - FLAC__uint32 i, j, x; - - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); - - memset(obj, 0, sizeof(FLAC__StreamMetadata_CueSheet)); - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN % 8 == 0); - if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, (FLAC__byte*)obj->media_catalog_number, FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN/8)) - return false; /* read_callback_ sets the state for us */ - - if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &obj->lead_in, FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN)) - return false; /* read_callback_ sets the state for us */ - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN)) - return false; /* read_callback_ sets the state for us */ - obj->is_cd = x? true : false; - - if(!FLAC__bitreader_skip_bits_no_crc(decoder->private_->input, FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN)) - return false; /* read_callback_ sets the state for us */ - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN)) - return false; /* read_callback_ sets the state for us */ - obj->num_tracks = x; - - if(obj->num_tracks > 0) { - if(0 == (obj->tracks = safe_calloc_(obj->num_tracks, sizeof(FLAC__StreamMetadata_CueSheet_Track)))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - for(i = 0; i < obj->num_tracks; i++) { - FLAC__StreamMetadata_CueSheet_Track *track = &obj->tracks[i]; - if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &track->offset, FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN)) - return false; /* read_callback_ sets the state for us */ - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN)) - return false; /* read_callback_ sets the state for us */ - track->number = (FLAC__byte)x; - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN % 8 == 0); - if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, (FLAC__byte*)track->isrc, FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN/8)) - return false; /* read_callback_ sets the state for us */ - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN)) - return false; /* read_callback_ sets the state for us */ - track->type = x; - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN)) - return false; /* read_callback_ sets the state for us */ - track->pre_emphasis = x; - - if(!FLAC__bitreader_skip_bits_no_crc(decoder->private_->input, FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN)) - return false; /* read_callback_ sets the state for us */ - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN)) - return false; /* read_callback_ sets the state for us */ - track->num_indices = (FLAC__byte)x; - - if(track->num_indices > 0) { - if(0 == (track->indices = safe_calloc_(track->num_indices, sizeof(FLAC__StreamMetadata_CueSheet_Index)))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - for(j = 0; j < track->num_indices; j++) { - FLAC__StreamMetadata_CueSheet_Index *indx = &track->indices[j]; - if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &indx->offset, FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN)) - return false; /* read_callback_ sets the state for us */ - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN)) - return false; /* read_callback_ sets the state for us */ - indx->number = (FLAC__byte)x; - - if(!FLAC__bitreader_skip_bits_no_crc(decoder->private_->input, FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN)) - return false; /* read_callback_ sets the state for us */ - } - } - } - } - - return true; -} - -FLAC__bool read_metadata_picture_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_Picture *obj) -{ - FLAC__uint32 x; - - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); - - /* read type */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_PICTURE_TYPE_LEN)) - return false; /* read_callback_ sets the state for us */ - obj->type = x; - - /* read MIME type */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN)) - return false; /* read_callback_ sets the state for us */ - if(0 == (obj->mime_type = safe_malloc_add_2op_(x, /*+*/1))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - if(x > 0) { - if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, (FLAC__byte*)obj->mime_type, x)) - return false; /* read_callback_ sets the state for us */ - } - obj->mime_type[x] = '\0'; - - /* read description */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN)) - return false; /* read_callback_ sets the state for us */ - if(0 == (obj->description = safe_malloc_add_2op_(x, /*+*/1))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - if(x > 0) { - if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->description, x)) - return false; /* read_callback_ sets the state for us */ - } - obj->description[x] = '\0'; - - /* read width */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &obj->width, FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN)) - return false; /* read_callback_ sets the state for us */ - - /* read height */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &obj->height, FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN)) - return false; /* read_callback_ sets the state for us */ - - /* read depth */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &obj->depth, FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN)) - return false; /* read_callback_ sets the state for us */ - - /* read colors */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &obj->colors, FLAC__STREAM_METADATA_PICTURE_COLORS_LEN)) - return false; /* read_callback_ sets the state for us */ - - /* read data */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &(obj->data_length), FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN)) - return false; /* read_callback_ sets the state for us */ - if(0 == (obj->data = safe_malloc_(obj->data_length))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - if(obj->data_length > 0) { - if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->data, obj->data_length)) - return false; /* read_callback_ sets the state for us */ - } - - return true; -} - -FLAC__bool skip_id3v2_tag_(FLAC__StreamDecoder *decoder) -{ - FLAC__uint32 x; - unsigned i, skip; - - /* skip the version and flags bytes */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 24)) - return false; /* read_callback_ sets the state for us */ - /* get the size (in bytes) to skip */ - skip = 0; - for(i = 0; i < 4; i++) { - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) - return false; /* read_callback_ sets the state for us */ - skip <<= 7; - skip |= (x & 0x7f); - } - /* skip the rest of the tag */ - if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, skip)) - return false; /* read_callback_ sets the state for us */ - return true; -} - -FLAC__bool frame_sync_(FLAC__StreamDecoder *decoder) -{ - FLAC__uint32 x; - FLAC__bool first = true; - - /* If we know the total number of samples in the stream, stop if we've read that many. */ - /* This will stop us, for example, from wasting time trying to sync on an ID3V1 tag. */ - if(FLAC__stream_decoder_get_total_samples(decoder) > 0) { - if(decoder->private_->samples_decoded >= FLAC__stream_decoder_get_total_samples(decoder)) { - decoder->protected_->state = FLAC__STREAM_DECODER_END_OF_STREAM; - return true; - } - } - - /* make sure we're byte aligned */ - if(!FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)) { - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__bitreader_bits_left_for_byte_alignment(decoder->private_->input))) - return false; /* read_callback_ sets the state for us */ - } - - while(1) { - if(decoder->private_->cached) { - x = (FLAC__uint32)decoder->private_->lookahead; - decoder->private_->cached = false; - } - else { - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) - return false; /* read_callback_ sets the state for us */ - } - if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ - decoder->private_->header_warmup[0] = (FLAC__byte)x; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) - return false; /* read_callback_ sets the state for us */ - - /* we have to check if we just read two 0xff's in a row; the second may actually be the beginning of the sync code */ - /* else we have to check if the second byte is the end of a sync code */ - if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ - decoder->private_->lookahead = (FLAC__byte)x; - decoder->private_->cached = true; - } - else if(x >> 1 == 0x7c) { /* MAGIC NUMBER for the last 6 sync bits and reserved 7th bit */ - decoder->private_->header_warmup[1] = (FLAC__byte)x; - decoder->protected_->state = FLAC__STREAM_DECODER_READ_FRAME; - return true; - } - } - if(first) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); - first = false; - } - } - - return true; -} - -FLAC__bool read_frame_(FLAC__StreamDecoder *decoder, FLAC__bool *got_a_frame, FLAC__bool do_full_decode) -{ - unsigned channel; - unsigned i; - FLAC__int32 mid, side; - unsigned frame_crc; /* the one we calculate from the input stream */ - FLAC__uint32 x; - - *got_a_frame = false; - - /* init the CRC */ - frame_crc = 0; - frame_crc = FLAC__CRC16_UPDATE(decoder->private_->header_warmup[0], frame_crc); - frame_crc = FLAC__CRC16_UPDATE(decoder->private_->header_warmup[1], frame_crc); - FLAC__bitreader_reset_read_crc16(decoder->private_->input, (FLAC__uint16)frame_crc); - - if(!read_frame_header_(decoder)) - return false; - if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) /* means we didn't sync on a valid header */ - return true; - if(!allocate_output_(decoder, decoder->private_->frame.header.blocksize, decoder->private_->frame.header.channels)) - return false; - for(channel = 0; channel < decoder->private_->frame.header.channels; channel++) { - /* - * first figure the correct bits-per-sample of the subframe - */ - unsigned bps = decoder->private_->frame.header.bits_per_sample; - switch(decoder->private_->frame.header.channel_assignment) { - case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT: - /* no adjustment needed */ - break; - case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE: - FLAC__ASSERT(decoder->private_->frame.header.channels == 2); - if(channel == 1) - bps++; - break; - case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE: - FLAC__ASSERT(decoder->private_->frame.header.channels == 2); - if(channel == 0) - bps++; - break; - case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE: - FLAC__ASSERT(decoder->private_->frame.header.channels == 2); - if(channel == 1) - bps++; - break; - default: - FLAC__ASSERT(0); - } - /* - * now read it - */ - if(!read_subframe_(decoder, channel, bps, do_full_decode)) - return false; - if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) /* means bad sync or got corruption */ - return true; - } - if(!read_zero_padding_(decoder)) - return false; - if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) /* means bad sync or got corruption (i.e. "zero bits" were not all zeroes) */ - return true; - - /* - * Read the frame CRC-16 from the footer and check - */ - frame_crc = FLAC__bitreader_get_read_crc16(decoder->private_->input); - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__FRAME_FOOTER_CRC_LEN)) - return false; /* read_callback_ sets the state for us */ - if(frame_crc == x) { - if(do_full_decode) { - /* Undo any special channel coding */ - switch(decoder->private_->frame.header.channel_assignment) { - case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT: - /* do nothing */ - break; - case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE: - FLAC__ASSERT(decoder->private_->frame.header.channels == 2); - for(i = 0; i < decoder->private_->frame.header.blocksize; i++) - decoder->private_->output[1][i] = decoder->private_->output[0][i] - decoder->private_->output[1][i]; - break; - case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE: - FLAC__ASSERT(decoder->private_->frame.header.channels == 2); - for(i = 0; i < decoder->private_->frame.header.blocksize; i++) - decoder->private_->output[0][i] += decoder->private_->output[1][i]; - break; - case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE: - FLAC__ASSERT(decoder->private_->frame.header.channels == 2); - for(i = 0; i < decoder->private_->frame.header.blocksize; i++) { -#if 1 - mid = decoder->private_->output[0][i]; - side = decoder->private_->output[1][i]; - mid <<= 1; - mid |= (side & 1); /* i.e. if 'side' is odd... */ - decoder->private_->output[0][i] = (mid + side) >> 1; - decoder->private_->output[1][i] = (mid - side) >> 1; -#else - /* OPT: without 'side' temp variable */ - mid = (decoder->private_->output[0][i] << 1) | (decoder->private_->output[1][i] & 1); /* i.e. if 'side' is odd... */ - decoder->private_->output[0][i] = (mid + decoder->private_->output[1][i]) >> 1; - decoder->private_->output[1][i] = (mid - decoder->private_->output[1][i]) >> 1; -#endif - } - break; - default: - FLAC__ASSERT(0); - break; - } - } - } - else { - /* Bad frame, emit error and zero the output signal */ - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH); - if(do_full_decode) { - for(channel = 0; channel < decoder->private_->frame.header.channels; channel++) { - memset(decoder->private_->output[channel], 0, sizeof(FLAC__int32) * decoder->private_->frame.header.blocksize); - } - } - } - - *got_a_frame = true; - - /* we wait to update fixed_block_size until here, when we're sure we've got a proper frame and hence a correct blocksize */ - if(decoder->private_->next_fixed_block_size) - decoder->private_->fixed_block_size = decoder->private_->next_fixed_block_size; - - /* put the latest values into the public section of the decoder instance */ - decoder->protected_->channels = decoder->private_->frame.header.channels; - decoder->protected_->channel_assignment = decoder->private_->frame.header.channel_assignment; - decoder->protected_->bits_per_sample = decoder->private_->frame.header.bits_per_sample; - decoder->protected_->sample_rate = decoder->private_->frame.header.sample_rate; - decoder->protected_->blocksize = decoder->private_->frame.header.blocksize; - - FLAC__ASSERT(decoder->private_->frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); - decoder->private_->samples_decoded = decoder->private_->frame.header.number.sample_number + decoder->private_->frame.header.blocksize; - - /* write it */ - if(do_full_decode) { - if(write_audio_frame_to_client_(decoder, &decoder->private_->frame, (const FLAC__int32 * const *)decoder->private_->output) != FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE) - return false; - } - - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; -} - -FLAC__bool read_frame_header_(FLAC__StreamDecoder *decoder) -{ - FLAC__uint32 x; - FLAC__uint64 xx; - unsigned i, blocksize_hint = 0, sample_rate_hint = 0; - FLAC__byte crc8, raw_header[16]; /* MAGIC NUMBER based on the maximum frame header size, including CRC */ - unsigned raw_header_len; - FLAC__bool is_unparseable = false; - - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); - - /* init the raw header with the saved bits from synchronization */ - raw_header[0] = decoder->private_->header_warmup[0]; - raw_header[1] = decoder->private_->header_warmup[1]; - raw_header_len = 2; - - /* check to make sure that reserved bit is 0 */ - if(raw_header[1] & 0x02) /* MAGIC NUMBER */ - is_unparseable = true; - - /* - * Note that along the way as we read the header, we look for a sync - * code inside. If we find one it would indicate that our original - * sync was bad since there cannot be a sync code in a valid header. - * - * Three kinds of things can go wrong when reading the frame header: - * 1) We may have sync'ed incorrectly and not landed on a frame header. - * If we don't find a sync code, it can end up looking like we read - * a valid but unparseable header, until getting to the frame header - * CRC. Even then we could get a false positive on the CRC. - * 2) We may have sync'ed correctly but on an unparseable frame (from a - * future encoder). - * 3) We may be on a damaged frame which appears valid but unparseable. - * - * For all these reasons, we try and read a complete frame header as - * long as it seems valid, even if unparseable, up until the frame - * header CRC. - */ - - /* - * read in the raw header as bytes so we can CRC it, and parse it on the way - */ - for(i = 0; i < 2; i++) { - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) - return false; /* read_callback_ sets the state for us */ - if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ - /* if we get here it means our original sync was erroneous since the sync code cannot appear in the header */ - decoder->private_->lookahead = (FLAC__byte)x; - decoder->private_->cached = true; - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - raw_header[raw_header_len++] = (FLAC__byte)x; - } - - switch(x = raw_header[2] >> 4) { - case 0: - is_unparseable = true; - break; - case 1: - decoder->private_->frame.header.blocksize = 192; - break; - case 2: - case 3: - case 4: - case 5: - decoder->private_->frame.header.blocksize = 576 << (x-2); - break; - case 6: - case 7: - blocksize_hint = x; - break; - case 8: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - decoder->private_->frame.header.blocksize = 256 << (x-8); - break; - default: - FLAC__ASSERT(0); - break; - } - - switch(x = raw_header[2] & 0x0f) { - case 0: - if(decoder->private_->has_stream_info) - decoder->private_->frame.header.sample_rate = decoder->private_->stream_info.data.stream_info.sample_rate; - else - is_unparseable = true; - break; - case 1: - decoder->private_->frame.header.sample_rate = 88200; - break; - case 2: - decoder->private_->frame.header.sample_rate = 176400; - break; - case 3: - decoder->private_->frame.header.sample_rate = 192000; - break; - case 4: - decoder->private_->frame.header.sample_rate = 8000; - break; - case 5: - decoder->private_->frame.header.sample_rate = 16000; - break; - case 6: - decoder->private_->frame.header.sample_rate = 22050; - break; - case 7: - decoder->private_->frame.header.sample_rate = 24000; - break; - case 8: - decoder->private_->frame.header.sample_rate = 32000; - break; - case 9: - decoder->private_->frame.header.sample_rate = 44100; - break; - case 10: - decoder->private_->frame.header.sample_rate = 48000; - break; - case 11: - decoder->private_->frame.header.sample_rate = 96000; - break; - case 12: - case 13: - case 14: - sample_rate_hint = x; - break; - case 15: - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - default: - FLAC__ASSERT(0); - } - - x = (unsigned)(raw_header[3] >> 4); - if(x & 8) { - decoder->private_->frame.header.channels = 2; - switch(x & 7) { - case 0: - decoder->private_->frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE; - break; - case 1: - decoder->private_->frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE; - break; - case 2: - decoder->private_->frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_MID_SIDE; - break; - default: - is_unparseable = true; - break; - } - } - else { - decoder->private_->frame.header.channels = (unsigned)x + 1; - decoder->private_->frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT; - } - - switch(x = (unsigned)(raw_header[3] & 0x0e) >> 1) { - case 0: - if(decoder->private_->has_stream_info) - decoder->private_->frame.header.bits_per_sample = decoder->private_->stream_info.data.stream_info.bits_per_sample; - else - is_unparseable = true; - break; - case 1: - decoder->private_->frame.header.bits_per_sample = 8; - break; - case 2: - decoder->private_->frame.header.bits_per_sample = 12; - break; - case 4: - decoder->private_->frame.header.bits_per_sample = 16; - break; - case 5: - decoder->private_->frame.header.bits_per_sample = 20; - break; - case 6: - decoder->private_->frame.header.bits_per_sample = 24; - break; - case 3: - case 7: - is_unparseable = true; - break; - default: - FLAC__ASSERT(0); - break; - } - - /* check to make sure that reserved bit is 0 */ - if(raw_header[3] & 0x01) /* MAGIC NUMBER */ - is_unparseable = true; - - /* read the frame's starting sample number (or frame number as the case may be) */ - if( - raw_header[1] & 0x01 || - /*@@@ this clause is a concession to the old way of doing variable blocksize; the only known implementation is flake and can probably be removed without inconveniencing anyone */ - (decoder->private_->has_stream_info && decoder->private_->stream_info.data.stream_info.min_blocksize != decoder->private_->stream_info.data.stream_info.max_blocksize) - ) { /* variable blocksize */ - if(!FLAC__bitreader_read_utf8_uint64(decoder->private_->input, &xx, raw_header, &raw_header_len)) - return false; /* read_callback_ sets the state for us */ - if(xx == FLAC__U64L(0xffffffffffffffff)) { /* i.e. non-UTF8 code... */ - decoder->private_->lookahead = raw_header[raw_header_len-1]; /* back up as much as we can */ - decoder->private_->cached = true; - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - decoder->private_->frame.header.number_type = FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER; - decoder->private_->frame.header.number.sample_number = xx; - } - else { /* fixed blocksize */ - if(!FLAC__bitreader_read_utf8_uint32(decoder->private_->input, &x, raw_header, &raw_header_len)) - return false; /* read_callback_ sets the state for us */ - if(x == 0xffffffff) { /* i.e. non-UTF8 code... */ - decoder->private_->lookahead = raw_header[raw_header_len-1]; /* back up as much as we can */ - decoder->private_->cached = true; - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - decoder->private_->frame.header.number_type = FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER; - decoder->private_->frame.header.number.frame_number = x; - } - - if(blocksize_hint) { - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) - return false; /* read_callback_ sets the state for us */ - raw_header[raw_header_len++] = (FLAC__byte)x; - if(blocksize_hint == 7) { - FLAC__uint32 _x; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &_x, 8)) - return false; /* read_callback_ sets the state for us */ - raw_header[raw_header_len++] = (FLAC__byte)_x; - x = (x << 8) | _x; - } - decoder->private_->frame.header.blocksize = x+1; - } - - if(sample_rate_hint) { - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) - return false; /* read_callback_ sets the state for us */ - raw_header[raw_header_len++] = (FLAC__byte)x; - if(sample_rate_hint != 12) { - FLAC__uint32 _x; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &_x, 8)) - return false; /* read_callback_ sets the state for us */ - raw_header[raw_header_len++] = (FLAC__byte)_x; - x = (x << 8) | _x; - } - if(sample_rate_hint == 12) - decoder->private_->frame.header.sample_rate = x*1000; - else if(sample_rate_hint == 13) - decoder->private_->frame.header.sample_rate = x; - else - decoder->private_->frame.header.sample_rate = x*10; - } - - /* read the CRC-8 byte */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) - return false; /* read_callback_ sets the state for us */ - crc8 = (FLAC__byte)x; - - if(FLAC__crc8(raw_header, raw_header_len) != crc8) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - - /* calculate the sample number from the frame number if needed */ - decoder->private_->next_fixed_block_size = 0; - if(decoder->private_->frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER) { - x = decoder->private_->frame.header.number.frame_number; - decoder->private_->frame.header.number_type = FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER; - if(decoder->private_->fixed_block_size) - decoder->private_->frame.header.number.sample_number = (FLAC__uint64)decoder->private_->fixed_block_size * (FLAC__uint64)x; - else if(decoder->private_->has_stream_info) { - if(decoder->private_->stream_info.data.stream_info.min_blocksize == decoder->private_->stream_info.data.stream_info.max_blocksize) { - decoder->private_->frame.header.number.sample_number = (FLAC__uint64)decoder->private_->stream_info.data.stream_info.min_blocksize * (FLAC__uint64)x; - decoder->private_->next_fixed_block_size = decoder->private_->stream_info.data.stream_info.max_blocksize; - } - else - is_unparseable = true; - } - else if(x == 0) { - decoder->private_->frame.header.number.sample_number = 0; - decoder->private_->next_fixed_block_size = decoder->private_->frame.header.blocksize; - } - else { - /* can only get here if the stream has invalid frame numbering and no STREAMINFO, so assume it's not the last (possibly short) frame */ - decoder->private_->frame.header.number.sample_number = (FLAC__uint64)decoder->private_->frame.header.blocksize * (FLAC__uint64)x; - } - } - - if(is_unparseable) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - - return true; -} - -FLAC__bool read_subframe_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, FLAC__bool do_full_decode) -{ - FLAC__uint32 x; - FLAC__bool wasted_bits; - unsigned i; - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) /* MAGIC NUMBER */ - return false; /* read_callback_ sets the state for us */ - - wasted_bits = (x & 1); - x &= 0xfe; - - if(wasted_bits) { - unsigned u; - if(!FLAC__bitreader_read_unary_unsigned(decoder->private_->input, &u)) - return false; /* read_callback_ sets the state for us */ - decoder->private_->frame.subframes[channel].wasted_bits = u+1; - bps -= decoder->private_->frame.subframes[channel].wasted_bits; - } - else - decoder->private_->frame.subframes[channel].wasted_bits = 0; - - /* - * Lots of magic numbers here - */ - if(x & 0x80) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - else if(x == 0) { - if(!read_subframe_constant_(decoder, channel, bps, do_full_decode)) - return false; - } - else if(x == 2) { - if(!read_subframe_verbatim_(decoder, channel, bps, do_full_decode)) - return false; - } - else if(x < 16) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - else if(x <= 24) { - if(!read_subframe_fixed_(decoder, channel, bps, (x>>1)&7, do_full_decode)) - return false; - if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) /* means bad sync or got corruption */ - return true; - } - else if(x < 64) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - else { - if(!read_subframe_lpc_(decoder, channel, bps, ((x>>1)&31)+1, do_full_decode)) - return false; - if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) /* means bad sync or got corruption */ - return true; - } - - if(wasted_bits && do_full_decode) { - x = decoder->private_->frame.subframes[channel].wasted_bits; - for(i = 0; i < decoder->private_->frame.header.blocksize; i++) - decoder->private_->output[channel][i] <<= x; - } - - return true; -} - -FLAC__bool read_subframe_constant_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, FLAC__bool do_full_decode) -{ - FLAC__Subframe_Constant *subframe = &decoder->private_->frame.subframes[channel].data.constant; - FLAC__int32 x; - unsigned i; - FLAC__int32 *output = decoder->private_->output[channel]; - - decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_CONSTANT; - - if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &x, bps)) - return false; /* read_callback_ sets the state for us */ - - subframe->value = x; - - /* decode the subframe */ - if(do_full_decode) { - for(i = 0; i < decoder->private_->frame.header.blocksize; i++) - output[i] = x; - } - - return true; -} - -FLAC__bool read_subframe_fixed_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, const unsigned order, FLAC__bool do_full_decode) -{ - FLAC__Subframe_Fixed *subframe = &decoder->private_->frame.subframes[channel].data.fixed; - FLAC__int32 i32; - FLAC__uint32 u32; - unsigned u; - - decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_FIXED; - - subframe->residual = decoder->private_->residual[channel]; - subframe->order = order; - - /* read warm-up samples */ - for(u = 0; u < order; u++) { - if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i32, bps)) - return false; /* read_callback_ sets the state for us */ - subframe->warmup[u] = i32; - } - - /* read entropy coding method info */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_TYPE_LEN)) - return false; /* read_callback_ sets the state for us */ - subframe->entropy_coding_method.type = (FLAC__EntropyCodingMethodType)u32; - switch(subframe->entropy_coding_method.type) { - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN)) - return false; /* read_callback_ sets the state for us */ - subframe->entropy_coding_method.data.partitioned_rice.order = u32; - subframe->entropy_coding_method.data.partitioned_rice.contents = &decoder->private_->partitioned_rice_contents[channel]; - break; - default: - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - - /* read residual */ - switch(subframe->entropy_coding_method.type) { - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: - if(!read_residual_partitioned_rice_(decoder, order, subframe->entropy_coding_method.data.partitioned_rice.order, &decoder->private_->partitioned_rice_contents[channel], decoder->private_->residual[channel], /*is_extended=*/subframe->entropy_coding_method.type == FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2)) - return false; - break; - default: - FLAC__ASSERT(0); - } - - /* decode the subframe */ - if(do_full_decode) { - memcpy(decoder->private_->output[channel], subframe->warmup, sizeof(FLAC__int32) * order); - FLAC__fixed_restore_signal(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, order, decoder->private_->output[channel]+order); - } - - return true; -} - -FLAC__bool read_subframe_lpc_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, const unsigned order, FLAC__bool do_full_decode) -{ - FLAC__Subframe_LPC *subframe = &decoder->private_->frame.subframes[channel].data.lpc; - FLAC__int32 i32; - FLAC__uint32 u32; - unsigned u; - - decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_LPC; - - subframe->residual = decoder->private_->residual[channel]; - subframe->order = order; - - /* read warm-up samples */ - for(u = 0; u < order; u++) { - if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i32, bps)) - return false; /* read_callback_ sets the state for us */ - subframe->warmup[u] = i32; - } - - /* read qlp coeff precision */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN)) - return false; /* read_callback_ sets the state for us */ - if(u32 == (1u << FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN) - 1) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - subframe->qlp_coeff_precision = u32+1; - - /* read qlp shift */ - if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i32, FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN)) - return false; /* read_callback_ sets the state for us */ - subframe->quantization_level = i32; - - /* read quantized lp coefficiencts */ - for(u = 0; u < order; u++) { - if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i32, subframe->qlp_coeff_precision)) - return false; /* read_callback_ sets the state for us */ - subframe->qlp_coeff[u] = i32; - } - - /* read entropy coding method info */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_TYPE_LEN)) - return false; /* read_callback_ sets the state for us */ - subframe->entropy_coding_method.type = (FLAC__EntropyCodingMethodType)u32; - switch(subframe->entropy_coding_method.type) { - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN)) - return false; /* read_callback_ sets the state for us */ - subframe->entropy_coding_method.data.partitioned_rice.order = u32; - subframe->entropy_coding_method.data.partitioned_rice.contents = &decoder->private_->partitioned_rice_contents[channel]; - break; - default: - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - - /* read residual */ - switch(subframe->entropy_coding_method.type) { - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: - if(!read_residual_partitioned_rice_(decoder, order, subframe->entropy_coding_method.data.partitioned_rice.order, &decoder->private_->partitioned_rice_contents[channel], decoder->private_->residual[channel], /*is_extended=*/subframe->entropy_coding_method.type == FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2)) - return false; - break; - default: - FLAC__ASSERT(0); - } - - /* decode the subframe */ - if(do_full_decode) { - memcpy(decoder->private_->output[channel], subframe->warmup, sizeof(FLAC__int32) * order); - /*@@@@@@ technically not pessimistic enough, should be more like - if( (FLAC__uint64)order * ((((FLAC__uint64)1)<qlp_coeff_precision)-1) < (((FLAC__uint64)-1) << 32) ) - */ - if(bps + subframe->qlp_coeff_precision + FLAC__bitmath_ilog2(order) <= 32) - if(bps <= 16 && subframe->qlp_coeff_precision <= 16) - decoder->private_->local_lpc_restore_signal_16bit(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel]+order); - else - decoder->private_->local_lpc_restore_signal(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel]+order); - else - decoder->private_->local_lpc_restore_signal_64bit(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel]+order); - } - - return true; -} - -FLAC__bool read_subframe_verbatim_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, FLAC__bool do_full_decode) -{ - FLAC__Subframe_Verbatim *subframe = &decoder->private_->frame.subframes[channel].data.verbatim; - FLAC__int32 x, *residual = decoder->private_->residual[channel]; - unsigned i; - - decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_VERBATIM; - - subframe->data = residual; - - for(i = 0; i < decoder->private_->frame.header.blocksize; i++) { - if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &x, bps)) - return false; /* read_callback_ sets the state for us */ - residual[i] = x; - } - - /* decode the subframe */ - if(do_full_decode) - memcpy(decoder->private_->output[channel], subframe->data, sizeof(FLAC__int32) * decoder->private_->frame.header.blocksize); - - return true; -} - -FLAC__bool read_residual_partitioned_rice_(FLAC__StreamDecoder *decoder, unsigned predictor_order, unsigned partition_order, FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents, FLAC__int32 *residual, FLAC__bool is_extended) -{ - FLAC__uint32 rice_parameter; - int i; - unsigned partition, sample, u; - const unsigned partitions = 1u << partition_order; - const unsigned partition_samples = partition_order > 0? decoder->private_->frame.header.blocksize >> partition_order : decoder->private_->frame.header.blocksize - predictor_order; - const unsigned plen = is_extended? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN; - const unsigned pesc = is_extended? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER; - - /* sanity checks */ - if(partition_order == 0) { - if(decoder->private_->frame.header.blocksize < predictor_order) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - /* We have received a potentially malicious bit stream. All we can do is error out to avoid a heap overflow. */ - return false; - } - } - else { - if(partition_samples < predictor_order) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - /* We have received a potentially malicious bit stream. All we can do is error out to avoid a heap overflow. */ - return false; - } - } - - if(!FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(partitioned_rice_contents, flac_max(6u, partition_order))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - - sample = 0; - for(partition = 0; partition < partitions; partition++) { - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &rice_parameter, plen)) - return false; /* read_callback_ sets the state for us */ - partitioned_rice_contents->parameters[partition] = rice_parameter; - if(rice_parameter < pesc) { - partitioned_rice_contents->raw_bits[partition] = 0; - u = (partition_order == 0 || partition > 0)? partition_samples : partition_samples - predictor_order; - if(!FLAC__bitreader_read_rice_signed_block(decoder->private_->input, residual + sample, u, rice_parameter)) - return false; /* read_callback_ sets the state for us */ - sample += u; - } - else { - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &rice_parameter, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN)) - return false; /* read_callback_ sets the state for us */ - partitioned_rice_contents->raw_bits[partition] = rice_parameter; - for(u = (partition_order == 0 || partition > 0)? 0 : predictor_order; u < partition_samples; u++, sample++) { - if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i, rice_parameter)) - return false; /* read_callback_ sets the state for us */ - residual[sample] = i; - } - } - } - - return true; -} - -FLAC__bool read_zero_padding_(FLAC__StreamDecoder *decoder) -{ - if(!FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)) { - FLAC__uint32 zero = 0; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &zero, FLAC__bitreader_bits_left_for_byte_alignment(decoder->private_->input))) - return false; /* read_callback_ sets the state for us */ - if(zero != 0) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - } - } - return true; -} - -FLAC__bool read_callback_(FLAC__byte buffer[], size_t *bytes, void *client_data) -{ - FLAC__StreamDecoder *decoder = (FLAC__StreamDecoder *)client_data; - - if( -#if FLAC__HAS_OGG - /* see [1] HACK NOTE below for why we don't call the eof_callback when decoding Ogg FLAC */ - !decoder->private_->is_ogg && -#endif - decoder->private_->eof_callback && decoder->private_->eof_callback(decoder, decoder->private_->client_data) - ) { - *bytes = 0; - decoder->protected_->state = FLAC__STREAM_DECODER_END_OF_STREAM; - return false; - } - else if(*bytes > 0) { - /* While seeking, it is possible for our seek to land in the - * middle of audio data that looks exactly like a frame header - * from a future version of an encoder. When that happens, our - * error callback will get an - * FLAC__STREAM_DECODER_UNPARSEABLE_STREAM and increment its - * unparseable_frame_count. But there is a remote possibility - * that it is properly synced at such a "future-codec frame", - * so to make sure, we wait to see many "unparseable" errors in - * a row before bailing out. - */ - if(decoder->private_->is_seeking && decoder->private_->unparseable_frame_count > 20) { - decoder->protected_->state = FLAC__STREAM_DECODER_ABORTED; - return false; - } - else { - const FLAC__StreamDecoderReadStatus status = -#if FLAC__HAS_OGG - decoder->private_->is_ogg? - read_callback_ogg_aspect_(decoder, buffer, bytes) : -#endif - decoder->private_->read_callback(decoder, buffer, bytes, decoder->private_->client_data) - ; - if(status == FLAC__STREAM_DECODER_READ_STATUS_ABORT) { - decoder->protected_->state = FLAC__STREAM_DECODER_ABORTED; - return false; - } - else if(*bytes == 0) { - if( - status == FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM || - ( -#if FLAC__HAS_OGG - /* see [1] HACK NOTE below for why we don't call the eof_callback when decoding Ogg FLAC */ - !decoder->private_->is_ogg && -#endif - decoder->private_->eof_callback && decoder->private_->eof_callback(decoder, decoder->private_->client_data) - ) - ) { - decoder->protected_->state = FLAC__STREAM_DECODER_END_OF_STREAM; - return false; - } - else - return true; - } - else - return true; - } - } - else { - /* abort to avoid a deadlock */ - decoder->protected_->state = FLAC__STREAM_DECODER_ABORTED; - return false; - } - /* [1] @@@ HACK NOTE: The end-of-stream checking has to be hacked around - * for Ogg FLAC. This is because the ogg decoder aspect can lose sync - * and at the same time hit the end of the stream (for example, seeking - * to a point that is after the beginning of the last Ogg page). There - * is no way to report an Ogg sync loss through the callbacks (see note - * in read_callback_ogg_aspect_()) so it returns CONTINUE with *bytes==0. - * So to keep the decoder from stopping at this point we gate the call - * to the eof_callback and let the Ogg decoder aspect set the - * end-of-stream state when it is needed. - */ -} - -#if FLAC__HAS_OGG -FLAC__StreamDecoderReadStatus read_callback_ogg_aspect_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes) -{ - switch(FLAC__ogg_decoder_aspect_read_callback_wrapper(&decoder->protected_->ogg_decoder_aspect, buffer, bytes, read_callback_proxy_, decoder, decoder->private_->client_data)) { - case FLAC__OGG_DECODER_ASPECT_READ_STATUS_OK: - return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; - /* we don't really have a way to handle lost sync via read - * callback so we'll let it pass and let the underlying - * FLAC decoder catch the error - */ - case FLAC__OGG_DECODER_ASPECT_READ_STATUS_LOST_SYNC: - return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; - case FLAC__OGG_DECODER_ASPECT_READ_STATUS_END_OF_STREAM: - return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; - case FLAC__OGG_DECODER_ASPECT_READ_STATUS_NOT_FLAC: - case FLAC__OGG_DECODER_ASPECT_READ_STATUS_UNSUPPORTED_MAPPING_VERSION: - case FLAC__OGG_DECODER_ASPECT_READ_STATUS_ABORT: - case FLAC__OGG_DECODER_ASPECT_READ_STATUS_ERROR: - case FLAC__OGG_DECODER_ASPECT_READ_STATUS_MEMORY_ALLOCATION_ERROR: - return FLAC__STREAM_DECODER_READ_STATUS_ABORT; - default: - FLAC__ASSERT(0); - /* double protection */ - return FLAC__STREAM_DECODER_READ_STATUS_ABORT; - } -} - -FLAC__OggDecoderAspectReadStatus read_callback_proxy_(const void *void_decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) -{ - FLAC__StreamDecoder *decoder = (FLAC__StreamDecoder*)void_decoder; - - switch(decoder->private_->read_callback(decoder, buffer, bytes, client_data)) { - case FLAC__STREAM_DECODER_READ_STATUS_CONTINUE: - return FLAC__OGG_DECODER_ASPECT_READ_STATUS_OK; - case FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM: - return FLAC__OGG_DECODER_ASPECT_READ_STATUS_END_OF_STREAM; - case FLAC__STREAM_DECODER_READ_STATUS_ABORT: - return FLAC__OGG_DECODER_ASPECT_READ_STATUS_ABORT; - default: - /* double protection: */ - FLAC__ASSERT(0); - return FLAC__OGG_DECODER_ASPECT_READ_STATUS_ABORT; - } -} -#endif - -FLAC__StreamDecoderWriteStatus write_audio_frame_to_client_(FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[]) -{ - if(decoder->private_->is_seeking) { - FLAC__uint64 this_frame_sample = frame->header.number.sample_number; - FLAC__uint64 next_frame_sample = this_frame_sample + (FLAC__uint64)frame->header.blocksize; - FLAC__uint64 target_sample = decoder->private_->target_sample; - - FLAC__ASSERT(frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); - -#if FLAC__HAS_OGG - decoder->private_->got_a_frame = true; -#endif - decoder->private_->last_frame = *frame; /* save the frame */ - if(this_frame_sample <= target_sample && target_sample < next_frame_sample) { /* we hit our target frame */ - unsigned delta = (unsigned)(target_sample - this_frame_sample); - /* kick out of seek mode */ - decoder->private_->is_seeking = false; - /* shift out the samples before target_sample */ - if(delta > 0) { - unsigned channel; - const FLAC__int32 *newbuffer[FLAC__MAX_CHANNELS]; - for(channel = 0; channel < frame->header.channels; channel++) - newbuffer[channel] = buffer[channel] + delta; - decoder->private_->last_frame.header.blocksize -= delta; - decoder->private_->last_frame.header.number.sample_number += (FLAC__uint64)delta; - /* write the relevant samples */ - return decoder->private_->write_callback(decoder, &decoder->private_->last_frame, newbuffer, decoder->private_->client_data); - } - else { - /* write the relevant samples */ - return decoder->private_->write_callback(decoder, frame, buffer, decoder->private_->client_data); - } - } - else { - return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; - } - } - else { - /* - * If we never got STREAMINFO, turn off MD5 checking to save - * cycles since we don't have a sum to compare to anyway - */ - if(!decoder->private_->has_stream_info) - decoder->private_->do_md5_checking = false; - if(decoder->private_->do_md5_checking) { - if(!FLAC__MD5Accumulate(&decoder->private_->md5context, buffer, frame->header.channels, frame->header.blocksize, (frame->header.bits_per_sample+7) / 8)) - return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; - } - return decoder->private_->write_callback(decoder, frame, buffer, decoder->private_->client_data); - } -} - -void send_error_to_client_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status) -{ - if(!decoder->private_->is_seeking) - decoder->private_->error_callback(decoder, status, decoder->private_->client_data); - else if(status == FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM) - decoder->private_->unparseable_frame_count++; -} - -FLAC__bool seek_to_absolute_sample_(FLAC__StreamDecoder *decoder, FLAC__uint64 stream_length, FLAC__uint64 target_sample) -{ - FLAC__uint64 first_frame_offset = decoder->private_->first_frame_offset, lower_bound, upper_bound, lower_bound_sample, upper_bound_sample, this_frame_sample; - FLAC__int64 pos = -1; - int i; - unsigned approx_bytes_per_frame; - FLAC__bool first_seek = true; - const FLAC__uint64 total_samples = FLAC__stream_decoder_get_total_samples(decoder); - const unsigned min_blocksize = decoder->private_->stream_info.data.stream_info.min_blocksize; - const unsigned max_blocksize = decoder->private_->stream_info.data.stream_info.max_blocksize; - const unsigned max_framesize = decoder->private_->stream_info.data.stream_info.max_framesize; - const unsigned min_framesize = decoder->private_->stream_info.data.stream_info.min_framesize; - /* take these from the current frame in case they've changed mid-stream */ - unsigned channels = FLAC__stream_decoder_get_channels(decoder); - unsigned bps = FLAC__stream_decoder_get_bits_per_sample(decoder); - const FLAC__StreamMetadata_SeekTable *seek_table = decoder->private_->has_seek_table? &decoder->private_->seek_table.data.seek_table : 0; - - /* use values from stream info if we didn't decode a frame */ - if(channels == 0) - channels = decoder->private_->stream_info.data.stream_info.channels; - if(bps == 0) - bps = decoder->private_->stream_info.data.stream_info.bits_per_sample; - - /* we are just guessing here */ - if(max_framesize > 0) - approx_bytes_per_frame = (max_framesize + min_framesize) / 2 + 1; - /* - * Check if it's a known fixed-blocksize stream. Note that though - * the spec doesn't allow zeroes in the STREAMINFO block, we may - * never get a STREAMINFO block when decoding so the value of - * min_blocksize might be zero. - */ - else if(min_blocksize == max_blocksize && min_blocksize > 0) { - /* note there are no () around 'bps/8' to keep precision up since it's an integer calulation */ - approx_bytes_per_frame = min_blocksize * channels * bps/8 + 64; - } - else - approx_bytes_per_frame = 4096 * channels * bps/8 + 64; - - /* - * First, we set an upper and lower bound on where in the - * stream we will search. For now we assume the worst case - * scenario, which is our best guess at the beginning of - * the first frame and end of the stream. - */ - lower_bound = first_frame_offset; - lower_bound_sample = 0; - upper_bound = stream_length; - upper_bound_sample = total_samples > 0 ? total_samples : target_sample /*estimate it*/; - - /* - * Now we refine the bounds if we have a seektable with - * suitable points. Note that according to the spec they - * must be ordered by ascending sample number. - * - * Note: to protect against invalid seek tables we will ignore points - * that have frame_samples==0 or sample_number>=total_samples - */ - if(seek_table) { - FLAC__uint64 new_lower_bound = lower_bound; - FLAC__uint64 new_upper_bound = upper_bound; - FLAC__uint64 new_lower_bound_sample = lower_bound_sample; - FLAC__uint64 new_upper_bound_sample = upper_bound_sample; - - /* find the closest seek point <= target_sample, if it exists */ - for(i = (int)seek_table->num_points - 1; i >= 0; i--) { - if( - seek_table->points[i].sample_number != FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER && - seek_table->points[i].frame_samples > 0 && /* defense against bad seekpoints */ - (total_samples <= 0 || seek_table->points[i].sample_number < total_samples) && /* defense against bad seekpoints */ - seek_table->points[i].sample_number <= target_sample - ) - break; - } - if(i >= 0) { /* i.e. we found a suitable seek point... */ - new_lower_bound = first_frame_offset + seek_table->points[i].stream_offset; - new_lower_bound_sample = seek_table->points[i].sample_number; - } - - /* find the closest seek point > target_sample, if it exists */ - for(i = 0; i < (int)seek_table->num_points; i++) { - if( - seek_table->points[i].sample_number != FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER && - seek_table->points[i].frame_samples > 0 && /* defense against bad seekpoints */ - (total_samples <= 0 || seek_table->points[i].sample_number < total_samples) && /* defense against bad seekpoints */ - seek_table->points[i].sample_number > target_sample - ) - break; - } - if(i < (int)seek_table->num_points) { /* i.e. we found a suitable seek point... */ - new_upper_bound = first_frame_offset + seek_table->points[i].stream_offset; - new_upper_bound_sample = seek_table->points[i].sample_number; - } - /* final protection against unsorted seek tables; keep original values if bogus */ - if(new_upper_bound >= new_lower_bound) { - lower_bound = new_lower_bound; - upper_bound = new_upper_bound; - lower_bound_sample = new_lower_bound_sample; - upper_bound_sample = new_upper_bound_sample; - } - } - - FLAC__ASSERT(upper_bound_sample >= lower_bound_sample); - /* there are 2 insidious ways that the following equality occurs, which - * we need to fix: - * 1) total_samples is 0 (unknown) and target_sample is 0 - * 2) total_samples is 0 (unknown) and target_sample happens to be - * exactly equal to the last seek point in the seek table; this - * means there is no seek point above it, and upper_bound_samples - * remains equal to the estimate (of target_samples) we made above - * in either case it does not hurt to move upper_bound_sample up by 1 - */ - if(upper_bound_sample == lower_bound_sample) - upper_bound_sample++; - - decoder->private_->target_sample = target_sample; - while(1) { - /* check if the bounds are still ok */ - if (lower_bound_sample >= upper_bound_sample || lower_bound > upper_bound) { - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } -#ifndef FLAC__INTEGER_ONLY_LIBRARY - pos = (FLAC__int64)lower_bound + (FLAC__int64)((FLAC__double)(target_sample - lower_bound_sample) / (FLAC__double)(upper_bound_sample - lower_bound_sample) * (FLAC__double)(upper_bound - lower_bound)) - approx_bytes_per_frame; -#else - /* a little less accurate: */ - if(upper_bound - lower_bound < 0xffffffff) - pos = (FLAC__int64)lower_bound + (FLAC__int64)(((target_sample - lower_bound_sample) * (upper_bound - lower_bound)) / (upper_bound_sample - lower_bound_sample)) - approx_bytes_per_frame; - else /* @@@ WATCHOUT, ~2TB limit */ - pos = (FLAC__int64)lower_bound + (FLAC__int64)((((target_sample - lower_bound_sample)>>8) * ((upper_bound - lower_bound)>>8)) / ((upper_bound_sample - lower_bound_sample)>>16)) - approx_bytes_per_frame; -#endif - if(pos >= (FLAC__int64)upper_bound) - pos = (FLAC__int64)upper_bound - 1; - if(pos < (FLAC__int64)lower_bound) - pos = (FLAC__int64)lower_bound; - if(decoder->private_->seek_callback(decoder, (FLAC__uint64)pos, decoder->private_->client_data) != FLAC__STREAM_DECODER_SEEK_STATUS_OK) { - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } - if(!FLAC__stream_decoder_flush(decoder)) { - /* above call sets the state for us */ - return false; - } - /* Now we need to get a frame. First we need to reset our - * unparseable_frame_count; if we get too many unparseable - * frames in a row, the read callback will return - * FLAC__STREAM_DECODER_READ_STATUS_ABORT, causing - * FLAC__stream_decoder_process_single() to return false. - */ - decoder->private_->unparseable_frame_count = 0; - if(!FLAC__stream_decoder_process_single(decoder)) { - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } - /* our write callback will change the state when it gets to the target frame */ - /* actually, we could have got_a_frame if our decoder is at FLAC__STREAM_DECODER_END_OF_STREAM so we need to check for that also */ -#if 0 - /*@@@@@@ used to be the following; not clear if the check for end of stream is needed anymore */ - if(decoder->protected_->state != FLAC__SEEKABLE_STREAM_DECODER_SEEKING && decoder->protected_->state != FLAC__STREAM_DECODER_END_OF_STREAM) - break; -#endif - if(!decoder->private_->is_seeking) - break; - - FLAC__ASSERT(decoder->private_->last_frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); - this_frame_sample = decoder->private_->last_frame.header.number.sample_number; - - if (0 == decoder->private_->samples_decoded || (this_frame_sample + decoder->private_->last_frame.header.blocksize >= upper_bound_sample && !first_seek)) { - if (pos == (FLAC__int64)lower_bound) { - /* can't move back any more than the first frame, something is fatally wrong */ - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } - /* our last move backwards wasn't big enough, try again */ - approx_bytes_per_frame = approx_bytes_per_frame? approx_bytes_per_frame * 2 : 16; - continue; - } - /* allow one seek over upper bound, so we can get a correct upper_bound_sample for streams with unknown total_samples */ - first_seek = false; - - /* make sure we are not seeking in corrupted stream */ - if (this_frame_sample < lower_bound_sample) { - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } - - /* we need to narrow the search */ - if(target_sample < this_frame_sample) { - upper_bound_sample = this_frame_sample + decoder->private_->last_frame.header.blocksize; -/*@@@@@@ what will decode position be if at end of stream? */ - if(!FLAC__stream_decoder_get_decode_position(decoder, &upper_bound)) { - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } - approx_bytes_per_frame = (unsigned)(2 * (upper_bound - pos) / 3 + 16); - } - else { /* target_sample >= this_frame_sample + this frame's blocksize */ - lower_bound_sample = this_frame_sample + decoder->private_->last_frame.header.blocksize; - if(!FLAC__stream_decoder_get_decode_position(decoder, &lower_bound)) { - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } - approx_bytes_per_frame = (unsigned)(2 * (lower_bound - pos) / 3 + 16); - } - } - - return true; -} - -#if FLAC__HAS_OGG -FLAC__bool seek_to_absolute_sample_ogg_(FLAC__StreamDecoder *decoder, FLAC__uint64 stream_length, FLAC__uint64 target_sample) -{ - FLAC__uint64 left_pos = 0, right_pos = stream_length; - FLAC__uint64 left_sample = 0, right_sample = FLAC__stream_decoder_get_total_samples(decoder); - FLAC__uint64 this_frame_sample = (FLAC__uint64)0 - 1; - FLAC__uint64 pos = 0; /* only initialized to avoid compiler warning */ - FLAC__bool did_a_seek; - unsigned iteration = 0; - - /* In the first iterations, we will calculate the target byte position - * by the distance from the target sample to left_sample and - * right_sample (let's call it "proportional search"). After that, we - * will switch to binary search. - */ - unsigned BINARY_SEARCH_AFTER_ITERATION = 2; - - /* We will switch to a linear search once our current sample is less - * than this number of samples ahead of the target sample - */ - static const FLAC__uint64 LINEAR_SEARCH_WITHIN_SAMPLES = FLAC__MAX_BLOCK_SIZE * 2; - - /* If the total number of samples is unknown, use a large value, and - * force binary search immediately. - */ - if(right_sample == 0) { - right_sample = (FLAC__uint64)(-1); - BINARY_SEARCH_AFTER_ITERATION = 0; - } - - decoder->private_->target_sample = target_sample; - for( ; ; iteration++) { - if (iteration == 0 || this_frame_sample > target_sample || target_sample - this_frame_sample > LINEAR_SEARCH_WITHIN_SAMPLES) { - if (iteration >= BINARY_SEARCH_AFTER_ITERATION) { - pos = (right_pos + left_pos) / 2; - } - else { -#ifndef FLAC__INTEGER_ONLY_LIBRARY - pos = (FLAC__uint64)((FLAC__double)(target_sample - left_sample) / (FLAC__double)(right_sample - left_sample) * (FLAC__double)(right_pos - left_pos)); -#else - /* a little less accurate: */ - if ((target_sample-left_sample <= 0xffffffff) && (right_pos-left_pos <= 0xffffffff)) - pos = (FLAC__int64)(((target_sample-left_sample) * (right_pos-left_pos)) / (right_sample-left_sample)); - else /* @@@ WATCHOUT, ~2TB limit */ - pos = (FLAC__int64)((((target_sample-left_sample)>>8) * ((right_pos-left_pos)>>8)) / ((right_sample-left_sample)>>16)); -#endif - /* @@@ TODO: might want to limit pos to some distance - * before EOF, to make sure we land before the last frame, - * thereby getting a this_frame_sample and so having a better - * estimate. - */ - } - - /* physical seek */ - if(decoder->private_->seek_callback((FLAC__StreamDecoder*)decoder, (FLAC__uint64)pos, decoder->private_->client_data) != FLAC__STREAM_DECODER_SEEK_STATUS_OK) { - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } - if(!FLAC__stream_decoder_flush(decoder)) { - /* above call sets the state for us */ - return false; - } - did_a_seek = true; - } - else - did_a_seek = false; - - decoder->private_->got_a_frame = false; - if(!FLAC__stream_decoder_process_single(decoder)) { - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } - if(!decoder->private_->got_a_frame) { - if(did_a_seek) { - /* this can happen if we seek to a point after the last frame; we drop - * to binary search right away in this case to avoid any wasted - * iterations of proportional search. - */ - right_pos = pos; - BINARY_SEARCH_AFTER_ITERATION = 0; - } - else { - /* this can probably only happen if total_samples is unknown and the - * target_sample is past the end of the stream - */ - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } - } - /* our write callback will change the state when it gets to the target frame */ - else if(!decoder->private_->is_seeking) { - break; - } - else { - this_frame_sample = decoder->private_->last_frame.header.number.sample_number; - FLAC__ASSERT(decoder->private_->last_frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); - - if (did_a_seek) { - if (this_frame_sample <= target_sample) { - /* The 'equal' case should not happen, since - * FLAC__stream_decoder_process_single() - * should recognize that it has hit the - * target sample and we would exit through - * the 'break' above. - */ - FLAC__ASSERT(this_frame_sample != target_sample); - - left_sample = this_frame_sample; - /* sanity check to avoid infinite loop */ - if (left_pos == pos) { - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } - left_pos = pos; - } - else if(this_frame_sample > target_sample) { - right_sample = this_frame_sample; - /* sanity check to avoid infinite loop */ - if (right_pos == pos) { - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } - right_pos = pos; - } - } - } - } - - return true; -} -#endif - -FLAC__StreamDecoderReadStatus file_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) -{ - (void)client_data; - - if(*bytes > 0) { - *bytes = fread(buffer, sizeof(FLAC__byte), *bytes, decoder->private_->file); - if(ferror(decoder->private_->file)) - return FLAC__STREAM_DECODER_READ_STATUS_ABORT; - else if(*bytes == 0) - return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; - else - return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; - } - else - return FLAC__STREAM_DECODER_READ_STATUS_ABORT; /* abort to avoid a deadlock */ -} - -FLAC__StreamDecoderSeekStatus file_seek_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data) -{ - (void)client_data; - - if(decoder->private_->file == stdin) - return FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED; - else if(fseeko(decoder->private_->file, (FLAC__off_t)absolute_byte_offset, SEEK_SET) < 0) - return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR; - else - return FLAC__STREAM_DECODER_SEEK_STATUS_OK; -} - -FLAC__StreamDecoderTellStatus file_tell_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data) -{ - FLAC__off_t pos; - (void)client_data; - - if(decoder->private_->file == stdin) - return FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED; - else if((pos = ftello(decoder->private_->file)) < 0) - return FLAC__STREAM_DECODER_TELL_STATUS_ERROR; - else { - *absolute_byte_offset = (FLAC__uint64)pos; - return FLAC__STREAM_DECODER_TELL_STATUS_OK; - } -} - -FLAC__StreamDecoderLengthStatus file_length_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data) -{ - struct flac_stat_s filestats; - (void)client_data; - - if(decoder->private_->file == stdin) - return FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED; - else if(flac_fstat(fileno(decoder->private_->file), &filestats) != 0) - return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR; - else { - *stream_length = (FLAC__uint64)filestats.st_size; - return FLAC__STREAM_DECODER_LENGTH_STATUS_OK; - } -} - -FLAC__bool file_eof_callback_(const FLAC__StreamDecoder *decoder, void *client_data) -{ - (void)client_data; - - return feof(decoder->private_->file)? true : false; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/stream_encoder.c b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/stream_encoder.c deleted file mode 100644 index 45bdb252..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/stream_encoder.c +++ /dev/null @@ -1,4525 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 -#endif - -#include -#include -#include /* for malloc() */ -#include /* for memcpy() */ -#include /* for off_t */ -#include "share/compat.h" -#include "FLAC/assert.h" -#include "FLAC/stream_decoder.h" -#include "protected/stream_encoder.h" -#include "private/bitwriter.h" -#include "private/bitmath.h" -#include "private/crc.h" -#include "private/cpu.h" -#include "private/fixed.h" -#include "private/format.h" -#include "private/lpc.h" -#include "private/md5.h" -#include "private/memory.h" -#include "private/macros.h" -#if FLAC__HAS_OGG -#include "private/ogg_helper.h" -#include "private/ogg_mapping.h" -#endif -#include "private/stream_encoder.h" -#include "private/stream_encoder_framing.h" -#include "private/window.h" -#include "share/alloc.h" -#include "share/private.h" - - -/* Exact Rice codeword length calculation is off by default. The simple - * (and fast) estimation (of how many bits a residual value will be - * encoded with) in this encoder is very good, almost always yielding - * compression within 0.1% of exact calculation. - */ -#undef EXACT_RICE_BITS_CALCULATION -/* Rice parameter searching is off by default. The simple (and fast) - * parameter estimation in this encoder is very good, almost always - * yielding compression within 0.1% of the optimal parameters. - */ -#undef ENABLE_RICE_PARAMETER_SEARCH - - -typedef struct { - FLAC__int32 *data[FLAC__MAX_CHANNELS]; - unsigned size; /* of each data[] in samples */ - unsigned tail; -} verify_input_fifo; - -typedef struct { - const FLAC__byte *data; - unsigned capacity; - unsigned bytes; -} verify_output; - -typedef enum { - ENCODER_IN_MAGIC = 0, - ENCODER_IN_METADATA = 1, - ENCODER_IN_AUDIO = 2 -} EncoderStateHint; - -static struct CompressionLevels { - FLAC__bool do_mid_side_stereo; - FLAC__bool loose_mid_side_stereo; - unsigned max_lpc_order; - unsigned qlp_coeff_precision; - FLAC__bool do_qlp_coeff_prec_search; - FLAC__bool do_escape_coding; - FLAC__bool do_exhaustive_model_search; - unsigned min_residual_partition_order; - unsigned max_residual_partition_order; - unsigned rice_parameter_search_dist; - const char *apodization; -} compression_levels_[] = { - { false, false, 0, 0, false, false, false, 0, 3, 0, "tukey(5e-1)" }, - { true , true , 0, 0, false, false, false, 0, 3, 0, "tukey(5e-1)" }, - { true , false, 0, 0, false, false, false, 0, 3, 0, "tukey(5e-1)" }, - { false, false, 6, 0, false, false, false, 0, 4, 0, "tukey(5e-1)" }, - { true , true , 8, 0, false, false, false, 0, 4, 0, "tukey(5e-1)" }, - { true , false, 8, 0, false, false, false, 0, 5, 0, "tukey(5e-1)" }, - { true , false, 8, 0, false, false, false, 0, 6, 0, "tukey(5e-1);partial_tukey(2)" }, - { true , false, 12, 0, false, false, false, 0, 6, 0, "tukey(5e-1);partial_tukey(2)" }, - { true , false, 12, 0, false, false, false, 0, 6, 0, "tukey(5e-1);partial_tukey(2);punchout_tukey(3)" } - /* here we use locale-independent 5e-1 instead of 0.5 or 0,5 */ -}; - - -/*********************************************************************** - * - * Private class method prototypes - * - ***********************************************************************/ - -static void set_defaults_(FLAC__StreamEncoder *encoder); -static void free_(FLAC__StreamEncoder *encoder); -static FLAC__bool resize_buffers_(FLAC__StreamEncoder *encoder, unsigned new_blocksize); -static FLAC__bool write_bitbuffer_(FLAC__StreamEncoder *encoder, unsigned samples, FLAC__bool is_last_block); -static FLAC__StreamEncoderWriteStatus write_frame_(FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, FLAC__bool is_last_block); -static void update_metadata_(const FLAC__StreamEncoder *encoder); -#if FLAC__HAS_OGG -static void update_ogg_metadata_(FLAC__StreamEncoder *encoder); -#endif -static FLAC__bool process_frame_(FLAC__StreamEncoder *encoder, FLAC__bool is_fractional_block, FLAC__bool is_last_block); -static FLAC__bool process_subframes_(FLAC__StreamEncoder *encoder, FLAC__bool is_fractional_block); - -static FLAC__bool process_subframe_( - FLAC__StreamEncoder *encoder, - unsigned min_partition_order, - unsigned max_partition_order, - const FLAC__FrameHeader *frame_header, - unsigned subframe_bps, - const FLAC__int32 integer_signal[], - FLAC__Subframe *subframe[2], - FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents[2], - FLAC__int32 *residual[2], - unsigned *best_subframe, - unsigned *best_bits -); - -static FLAC__bool add_subframe_( - FLAC__StreamEncoder *encoder, - unsigned blocksize, - unsigned subframe_bps, - const FLAC__Subframe *subframe, - FLAC__BitWriter *frame -); - -static unsigned evaluate_constant_subframe_( - FLAC__StreamEncoder *encoder, - const FLAC__int32 signal, - unsigned blocksize, - unsigned subframe_bps, - FLAC__Subframe *subframe -); - -static unsigned evaluate_fixed_subframe_( - FLAC__StreamEncoder *encoder, - const FLAC__int32 signal[], - FLAC__int32 residual[], - FLAC__uint64 abs_residual_partition_sums[], - unsigned raw_bits_per_partition[], - unsigned blocksize, - unsigned subframe_bps, - unsigned order, - unsigned rice_parameter, - unsigned rice_parameter_limit, - unsigned min_partition_order, - unsigned max_partition_order, - FLAC__bool do_escape_coding, - unsigned rice_parameter_search_dist, - FLAC__Subframe *subframe, - FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents -); - -#ifndef FLAC__INTEGER_ONLY_LIBRARY -static unsigned evaluate_lpc_subframe_( - FLAC__StreamEncoder *encoder, - const FLAC__int32 signal[], - FLAC__int32 residual[], - FLAC__uint64 abs_residual_partition_sums[], - unsigned raw_bits_per_partition[], - const FLAC__real lp_coeff[], - unsigned blocksize, - unsigned subframe_bps, - unsigned order, - unsigned qlp_coeff_precision, - unsigned rice_parameter, - unsigned rice_parameter_limit, - unsigned min_partition_order, - unsigned max_partition_order, - FLAC__bool do_escape_coding, - unsigned rice_parameter_search_dist, - FLAC__Subframe *subframe, - FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents -); -#endif - -static unsigned evaluate_verbatim_subframe_( - FLAC__StreamEncoder *encoder, - const FLAC__int32 signal[], - unsigned blocksize, - unsigned subframe_bps, - FLAC__Subframe *subframe -); - -static unsigned find_best_partition_order_( - struct FLAC__StreamEncoderPrivate *private_, - const FLAC__int32 residual[], - FLAC__uint64 abs_residual_partition_sums[], - unsigned raw_bits_per_partition[], - unsigned residual_samples, - unsigned predictor_order, - unsigned rice_parameter, - unsigned rice_parameter_limit, - unsigned min_partition_order, - unsigned max_partition_order, - unsigned bps, - FLAC__bool do_escape_coding, - unsigned rice_parameter_search_dist, - FLAC__EntropyCodingMethod *best_ecm -); - -static void precompute_partition_info_sums_( - const FLAC__int32 residual[], - FLAC__uint64 abs_residual_partition_sums[], - unsigned residual_samples, - unsigned predictor_order, - unsigned min_partition_order, - unsigned max_partition_order, - unsigned bps -); - -static void precompute_partition_info_escapes_( - const FLAC__int32 residual[], - unsigned raw_bits_per_partition[], - unsigned residual_samples, - unsigned predictor_order, - unsigned min_partition_order, - unsigned max_partition_order -); - -static FLAC__bool set_partitioned_rice_( -#ifdef EXACT_RICE_BITS_CALCULATION - const FLAC__int32 residual[], -#endif - const FLAC__uint64 abs_residual_partition_sums[], - const unsigned raw_bits_per_partition[], - const unsigned residual_samples, - const unsigned predictor_order, - const unsigned suggested_rice_parameter, - const unsigned rice_parameter_limit, - const unsigned rice_parameter_search_dist, - const unsigned partition_order, - const FLAC__bool search_for_escapes, - FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents, - unsigned *bits -); - -static unsigned get_wasted_bits_(FLAC__int32 signal[], unsigned samples); - -/* verify-related routines: */ -static void append_to_verify_fifo_( - verify_input_fifo *fifo, - const FLAC__int32 * const input[], - unsigned input_offset, - unsigned channels, - unsigned wide_samples -); - -static void append_to_verify_fifo_interleaved_( - verify_input_fifo *fifo, - const FLAC__int32 input[], - unsigned input_offset, - unsigned channels, - unsigned wide_samples -); - -static FLAC__StreamDecoderReadStatus verify_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); -static FLAC__StreamDecoderWriteStatus verify_write_callback_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data); -static void verify_metadata_callback_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data); -static void verify_error_callback_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data); - -static FLAC__StreamEncoderReadStatus file_read_callback_(const FLAC__StreamEncoder *encoder, FLAC__byte buffer[], size_t *bytes, void *client_data); -static FLAC__StreamEncoderSeekStatus file_seek_callback_(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data); -static FLAC__StreamEncoderTellStatus file_tell_callback_(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data); -static FLAC__StreamEncoderWriteStatus file_write_callback_(const FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, void *client_data); -static FILE *get_binary_stdout_(void); - - -/*********************************************************************** - * - * Private class data - * - ***********************************************************************/ - -typedef struct FLAC__StreamEncoderPrivate { - unsigned input_capacity; /* current size (in samples) of the signal and residual buffers */ - FLAC__int32 *integer_signal[FLAC__MAX_CHANNELS]; /* the integer version of the input signal */ - FLAC__int32 *integer_signal_mid_side[2]; /* the integer version of the mid-side input signal (stereo only) */ -#ifndef FLAC__INTEGER_ONLY_LIBRARY - FLAC__real *real_signal[FLAC__MAX_CHANNELS]; /* (@@@ currently unused) the floating-point version of the input signal */ - FLAC__real *real_signal_mid_side[2]; /* (@@@ currently unused) the floating-point version of the mid-side input signal (stereo only) */ - FLAC__real *window[FLAC__MAX_APODIZATION_FUNCTIONS]; /* the pre-computed floating-point window for each apodization function */ - FLAC__real *windowed_signal; /* the integer_signal[] * current window[] */ -#endif - unsigned subframe_bps[FLAC__MAX_CHANNELS]; /* the effective bits per sample of the input signal (stream bps - wasted bits) */ - unsigned subframe_bps_mid_side[2]; /* the effective bits per sample of the mid-side input signal (stream bps - wasted bits + 0/1) */ - FLAC__int32 *residual_workspace[FLAC__MAX_CHANNELS][2]; /* each channel has a candidate and best workspace where the subframe residual signals will be stored */ - FLAC__int32 *residual_workspace_mid_side[2][2]; - FLAC__Subframe subframe_workspace[FLAC__MAX_CHANNELS][2]; - FLAC__Subframe subframe_workspace_mid_side[2][2]; - FLAC__Subframe *subframe_workspace_ptr[FLAC__MAX_CHANNELS][2]; - FLAC__Subframe *subframe_workspace_ptr_mid_side[2][2]; - FLAC__EntropyCodingMethod_PartitionedRiceContents partitioned_rice_contents_workspace[FLAC__MAX_CHANNELS][2]; - FLAC__EntropyCodingMethod_PartitionedRiceContents partitioned_rice_contents_workspace_mid_side[FLAC__MAX_CHANNELS][2]; - FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents_workspace_ptr[FLAC__MAX_CHANNELS][2]; - FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents_workspace_ptr_mid_side[FLAC__MAX_CHANNELS][2]; - unsigned best_subframe[FLAC__MAX_CHANNELS]; /* index (0 or 1) into 2nd dimension of the above workspaces */ - unsigned best_subframe_mid_side[2]; - unsigned best_subframe_bits[FLAC__MAX_CHANNELS]; /* size in bits of the best subframe for each channel */ - unsigned best_subframe_bits_mid_side[2]; - FLAC__uint64 *abs_residual_partition_sums; /* workspace where the sum of abs(candidate residual) for each partition is stored */ - unsigned *raw_bits_per_partition; /* workspace where the sum of silog2(candidate residual) for each partition is stored */ - FLAC__BitWriter *frame; /* the current frame being worked on */ - unsigned loose_mid_side_stereo_frames; /* rounded number of frames the encoder will use before trying both independent and mid/side frames again */ - unsigned loose_mid_side_stereo_frame_count; /* number of frames using the current channel assignment */ - FLAC__ChannelAssignment last_channel_assignment; - FLAC__StreamMetadata streaminfo; /* scratchpad for STREAMINFO as it is built */ - FLAC__StreamMetadata_SeekTable *seek_table; /* pointer into encoder->protected_->metadata_ where the seek table is */ - unsigned current_sample_number; - unsigned current_frame_number; - FLAC__MD5Context md5context; - FLAC__CPUInfo cpuinfo; - void (*local_precompute_partition_info_sums)(const FLAC__int32 residual[], FLAC__uint64 abs_residual_partition_sums[], unsigned residual_samples, unsigned predictor_order, unsigned min_partition_order, unsigned max_partition_order, unsigned bps); -#ifndef FLAC__INTEGER_ONLY_LIBRARY - unsigned (*local_fixed_compute_best_predictor)(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); - unsigned (*local_fixed_compute_best_predictor_wide)(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); -#else - unsigned (*local_fixed_compute_best_predictor)(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); - unsigned (*local_fixed_compute_best_predictor_wide)(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); -#endif -#ifndef FLAC__INTEGER_ONLY_LIBRARY - void (*local_lpc_compute_autocorrelation)(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); - void (*local_lpc_compute_residual_from_qlp_coefficients)(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); - void (*local_lpc_compute_residual_from_qlp_coefficients_64bit)(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); - void (*local_lpc_compute_residual_from_qlp_coefficients_16bit)(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); -#endif - FLAC__bool use_wide_by_block; /* use slow 64-bit versions of some functions because of the block size */ - FLAC__bool use_wide_by_partition; /* use slow 64-bit versions of some functions because of the min partition order and blocksize */ - FLAC__bool use_wide_by_order; /* use slow 64-bit versions of some functions because of the lpc order */ - FLAC__bool disable_constant_subframes; - FLAC__bool disable_fixed_subframes; - FLAC__bool disable_verbatim_subframes; -#if FLAC__HAS_OGG - FLAC__bool is_ogg; -#endif - FLAC__StreamEncoderReadCallback read_callback; /* currently only needed for Ogg FLAC */ - FLAC__StreamEncoderSeekCallback seek_callback; - FLAC__StreamEncoderTellCallback tell_callback; - FLAC__StreamEncoderWriteCallback write_callback; - FLAC__StreamEncoderMetadataCallback metadata_callback; - FLAC__StreamEncoderProgressCallback progress_callback; - void *client_data; - unsigned first_seekpoint_to_check; - FILE *file; /* only used when encoding to a file */ - FLAC__uint64 bytes_written; - FLAC__uint64 samples_written; - unsigned frames_written; - unsigned total_frames_estimate; - /* unaligned (original) pointers to allocated data */ - FLAC__int32 *integer_signal_unaligned[FLAC__MAX_CHANNELS]; - FLAC__int32 *integer_signal_mid_side_unaligned[2]; -#ifndef FLAC__INTEGER_ONLY_LIBRARY - FLAC__real *real_signal_unaligned[FLAC__MAX_CHANNELS]; /* (@@@ currently unused) */ - FLAC__real *real_signal_mid_side_unaligned[2]; /* (@@@ currently unused) */ - FLAC__real *window_unaligned[FLAC__MAX_APODIZATION_FUNCTIONS]; - FLAC__real *windowed_signal_unaligned; -#endif - FLAC__int32 *residual_workspace_unaligned[FLAC__MAX_CHANNELS][2]; - FLAC__int32 *residual_workspace_mid_side_unaligned[2][2]; - FLAC__uint64 *abs_residual_partition_sums_unaligned; - unsigned *raw_bits_per_partition_unaligned; - /* - * These fields have been moved here from private function local - * declarations merely to save stack space during encoding. - */ -#ifndef FLAC__INTEGER_ONLY_LIBRARY - FLAC__real lp_coeff[FLAC__MAX_LPC_ORDER][FLAC__MAX_LPC_ORDER]; /* from process_subframe_() */ -#endif - FLAC__EntropyCodingMethod_PartitionedRiceContents partitioned_rice_contents_extra[2]; /* from find_best_partition_order_() */ - /* - * The data for the verify section - */ - struct { - FLAC__StreamDecoder *decoder; - EncoderStateHint state_hint; - FLAC__bool needs_magic_hack; - verify_input_fifo input_fifo; - verify_output output; - struct { - FLAC__uint64 absolute_sample; - unsigned frame_number; - unsigned channel; - unsigned sample; - FLAC__int32 expected; - FLAC__int32 got; - } error_stats; - } verify; - FLAC__bool is_being_deleted; /* if true, call to ..._finish() from ..._delete() will not call the callbacks */ -} FLAC__StreamEncoderPrivate; - -/*********************************************************************** - * - * Public static class data - * - ***********************************************************************/ - -FLAC_API const char * const FLAC__StreamEncoderStateString[] = { - "FLAC__STREAM_ENCODER_OK", - "FLAC__STREAM_ENCODER_UNINITIALIZED", - "FLAC__STREAM_ENCODER_OGG_ERROR", - "FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR", - "FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA", - "FLAC__STREAM_ENCODER_CLIENT_ERROR", - "FLAC__STREAM_ENCODER_IO_ERROR", - "FLAC__STREAM_ENCODER_FRAMING_ERROR", - "FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR" -}; - -FLAC_API const char * const FLAC__StreamEncoderInitStatusString[] = { - "FLAC__STREAM_ENCODER_INIT_STATUS_OK", - "FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR", - "FLAC__STREAM_ENCODER_INIT_STATUS_UNSUPPORTED_CONTAINER", - "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_CALLBACKS", - "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_NUMBER_OF_CHANNELS", - "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BITS_PER_SAMPLE", - "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_SAMPLE_RATE", - "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BLOCK_SIZE", - "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_MAX_LPC_ORDER", - "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_QLP_COEFF_PRECISION", - "FLAC__STREAM_ENCODER_INIT_STATUS_BLOCK_SIZE_TOO_SMALL_FOR_LPC_ORDER", - "FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE", - "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA", - "FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED" -}; - -FLAC_API const char * const FLAC__StreamEncoderReadStatusString[] = { - "FLAC__STREAM_ENCODER_READ_STATUS_CONTINUE", - "FLAC__STREAM_ENCODER_READ_STATUS_END_OF_STREAM", - "FLAC__STREAM_ENCODER_READ_STATUS_ABORT", - "FLAC__STREAM_ENCODER_READ_STATUS_UNSUPPORTED" -}; - -FLAC_API const char * const FLAC__StreamEncoderWriteStatusString[] = { - "FLAC__STREAM_ENCODER_WRITE_STATUS_OK", - "FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR" -}; - -FLAC_API const char * const FLAC__StreamEncoderSeekStatusString[] = { - "FLAC__STREAM_ENCODER_SEEK_STATUS_OK", - "FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR", - "FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED" -}; - -FLAC_API const char * const FLAC__StreamEncoderTellStatusString[] = { - "FLAC__STREAM_ENCODER_TELL_STATUS_OK", - "FLAC__STREAM_ENCODER_TELL_STATUS_ERROR", - "FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED" -}; - -/* Number of samples that will be overread to watch for end of stream. By - * 'overread', we mean that the FLAC__stream_encoder_process*() calls will - * always try to read blocksize+1 samples before encoding a block, so that - * even if the stream has a total sample count that is an integral multiple - * of the blocksize, we will still notice when we are encoding the last - * block. This is needed, for example, to correctly set the end-of-stream - * marker in Ogg FLAC. - * - * WATCHOUT: some parts of the code assert that OVERREAD_ == 1 and there's - * not really any reason to change it. - */ -static const unsigned OVERREAD_ = 1; - -/*********************************************************************** - * - * Class constructor/destructor - * - */ -FLAC_API FLAC__StreamEncoder *FLAC__stream_encoder_new(void) -{ - FLAC__StreamEncoder *encoder; - unsigned i; - - FLAC__ASSERT(sizeof(int) >= 4); /* we want to die right away if this is not true */ - - encoder = calloc(1, sizeof(FLAC__StreamEncoder)); - if(encoder == 0) { - return 0; - } - - encoder->protected_ = calloc(1, sizeof(FLAC__StreamEncoderProtected)); - if(encoder->protected_ == 0) { - free(encoder); - return 0; - } - - encoder->private_ = calloc(1, sizeof(FLAC__StreamEncoderPrivate)); - if(encoder->private_ == 0) { - free(encoder->protected_); - free(encoder); - return 0; - } - - encoder->private_->frame = FLAC__bitwriter_new(); - if(encoder->private_->frame == 0) { - free(encoder->private_); - free(encoder->protected_); - free(encoder); - return 0; - } - - encoder->private_->file = 0; - - set_defaults_(encoder); - - encoder->private_->is_being_deleted = false; - - for(i = 0; i < FLAC__MAX_CHANNELS; i++) { - encoder->private_->subframe_workspace_ptr[i][0] = &encoder->private_->subframe_workspace[i][0]; - encoder->private_->subframe_workspace_ptr[i][1] = &encoder->private_->subframe_workspace[i][1]; - } - for(i = 0; i < 2; i++) { - encoder->private_->subframe_workspace_ptr_mid_side[i][0] = &encoder->private_->subframe_workspace_mid_side[i][0]; - encoder->private_->subframe_workspace_ptr_mid_side[i][1] = &encoder->private_->subframe_workspace_mid_side[i][1]; - } - for(i = 0; i < FLAC__MAX_CHANNELS; i++) { - encoder->private_->partitioned_rice_contents_workspace_ptr[i][0] = &encoder->private_->partitioned_rice_contents_workspace[i][0]; - encoder->private_->partitioned_rice_contents_workspace_ptr[i][1] = &encoder->private_->partitioned_rice_contents_workspace[i][1]; - } - for(i = 0; i < 2; i++) { - encoder->private_->partitioned_rice_contents_workspace_ptr_mid_side[i][0] = &encoder->private_->partitioned_rice_contents_workspace_mid_side[i][0]; - encoder->private_->partitioned_rice_contents_workspace_ptr_mid_side[i][1] = &encoder->private_->partitioned_rice_contents_workspace_mid_side[i][1]; - } - - for(i = 0; i < FLAC__MAX_CHANNELS; i++) { - FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_workspace[i][0]); - FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_workspace[i][1]); - } - for(i = 0; i < 2; i++) { - FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_workspace_mid_side[i][0]); - FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_workspace_mid_side[i][1]); - } - for(i = 0; i < 2; i++) - FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_extra[i]); - - encoder->protected_->state = FLAC__STREAM_ENCODER_UNINITIALIZED; - - return encoder; -} - -FLAC_API void FLAC__stream_encoder_delete(FLAC__StreamEncoder *encoder) -{ - unsigned i; - - if (encoder == NULL) - return ; - - FLAC__ASSERT(0 != encoder->protected_); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->private_->frame); - - encoder->private_->is_being_deleted = true; - - (void)FLAC__stream_encoder_finish(encoder); - - if(0 != encoder->private_->verify.decoder) - FLAC__stream_decoder_delete(encoder->private_->verify.decoder); - - for(i = 0; i < FLAC__MAX_CHANNELS; i++) { - FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_workspace[i][0]); - FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_workspace[i][1]); - } - for(i = 0; i < 2; i++) { - FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_workspace_mid_side[i][0]); - FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_workspace_mid_side[i][1]); - } - for(i = 0; i < 2; i++) - FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_extra[i]); - - FLAC__bitwriter_delete(encoder->private_->frame); - free(encoder->private_); - free(encoder->protected_); - free(encoder); -} - -/*********************************************************************** - * - * Public class methods - * - ***********************************************************************/ - -static FLAC__StreamEncoderInitStatus init_stream_internal_( - FLAC__StreamEncoder *encoder, - FLAC__StreamEncoderReadCallback read_callback, - FLAC__StreamEncoderWriteCallback write_callback, - FLAC__StreamEncoderSeekCallback seek_callback, - FLAC__StreamEncoderTellCallback tell_callback, - FLAC__StreamEncoderMetadataCallback metadata_callback, - void *client_data, - FLAC__bool is_ogg -) -{ - unsigned i; - FLAC__bool metadata_has_seektable, metadata_has_vorbis_comment, metadata_picture_has_type1, metadata_picture_has_type2; - - FLAC__ASSERT(0 != encoder); - - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED; - -#if !FLAC__HAS_OGG - if(is_ogg) - return FLAC__STREAM_ENCODER_INIT_STATUS_UNSUPPORTED_CONTAINER; -#endif - - if(0 == write_callback || (seek_callback && 0 == tell_callback)) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_CALLBACKS; - - if(encoder->protected_->channels == 0 || encoder->protected_->channels > FLAC__MAX_CHANNELS) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_NUMBER_OF_CHANNELS; - - if(encoder->protected_->channels != 2) { - encoder->protected_->do_mid_side_stereo = false; - encoder->protected_->loose_mid_side_stereo = false; - } - else if(!encoder->protected_->do_mid_side_stereo) - encoder->protected_->loose_mid_side_stereo = false; - - if(encoder->protected_->bits_per_sample >= 32) - encoder->protected_->do_mid_side_stereo = false; /* since we currenty do 32-bit math, the side channel would have 33 bps and overflow */ - - if(encoder->protected_->bits_per_sample < FLAC__MIN_BITS_PER_SAMPLE || encoder->protected_->bits_per_sample > FLAC__REFERENCE_CODEC_MAX_BITS_PER_SAMPLE) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BITS_PER_SAMPLE; - - if(!FLAC__format_sample_rate_is_valid(encoder->protected_->sample_rate)) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_SAMPLE_RATE; - - if(encoder->protected_->blocksize == 0) { - if(encoder->protected_->max_lpc_order == 0) - encoder->protected_->blocksize = 1152; - else - encoder->protected_->blocksize = 4096; - } - - if(encoder->protected_->blocksize < FLAC__MIN_BLOCK_SIZE || encoder->protected_->blocksize > FLAC__MAX_BLOCK_SIZE) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BLOCK_SIZE; - - if(encoder->protected_->max_lpc_order > FLAC__MAX_LPC_ORDER) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_MAX_LPC_ORDER; - - if(encoder->protected_->blocksize < encoder->protected_->max_lpc_order) - return FLAC__STREAM_ENCODER_INIT_STATUS_BLOCK_SIZE_TOO_SMALL_FOR_LPC_ORDER; - - if(encoder->protected_->qlp_coeff_precision == 0) { - if(encoder->protected_->bits_per_sample < 16) { - /* @@@ need some data about how to set this here w.r.t. blocksize and sample rate */ - /* @@@ until then we'll make a guess */ - encoder->protected_->qlp_coeff_precision = flac_max(FLAC__MIN_QLP_COEFF_PRECISION, 2 + encoder->protected_->bits_per_sample / 2); - } - else if(encoder->protected_->bits_per_sample == 16) { - if(encoder->protected_->blocksize <= 192) - encoder->protected_->qlp_coeff_precision = 7; - else if(encoder->protected_->blocksize <= 384) - encoder->protected_->qlp_coeff_precision = 8; - else if(encoder->protected_->blocksize <= 576) - encoder->protected_->qlp_coeff_precision = 9; - else if(encoder->protected_->blocksize <= 1152) - encoder->protected_->qlp_coeff_precision = 10; - else if(encoder->protected_->blocksize <= 2304) - encoder->protected_->qlp_coeff_precision = 11; - else if(encoder->protected_->blocksize <= 4608) - encoder->protected_->qlp_coeff_precision = 12; - else - encoder->protected_->qlp_coeff_precision = 13; - } - else { - if(encoder->protected_->blocksize <= 384) - encoder->protected_->qlp_coeff_precision = FLAC__MAX_QLP_COEFF_PRECISION-2; - else if(encoder->protected_->blocksize <= 1152) - encoder->protected_->qlp_coeff_precision = FLAC__MAX_QLP_COEFF_PRECISION-1; - else - encoder->protected_->qlp_coeff_precision = FLAC__MAX_QLP_COEFF_PRECISION; - } - FLAC__ASSERT(encoder->protected_->qlp_coeff_precision <= FLAC__MAX_QLP_COEFF_PRECISION); - } - else if(encoder->protected_->qlp_coeff_precision < FLAC__MIN_QLP_COEFF_PRECISION || encoder->protected_->qlp_coeff_precision > FLAC__MAX_QLP_COEFF_PRECISION) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_QLP_COEFF_PRECISION; - - if(encoder->protected_->streamable_subset) { - if(!FLAC__format_blocksize_is_subset(encoder->protected_->blocksize, encoder->protected_->sample_rate)) - return FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE; - if(!FLAC__format_sample_rate_is_subset(encoder->protected_->sample_rate)) - return FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE; - if( - encoder->protected_->bits_per_sample != 8 && - encoder->protected_->bits_per_sample != 12 && - encoder->protected_->bits_per_sample != 16 && - encoder->protected_->bits_per_sample != 20 && - encoder->protected_->bits_per_sample != 24 - ) - return FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE; - if(encoder->protected_->max_residual_partition_order > FLAC__SUBSET_MAX_RICE_PARTITION_ORDER) - return FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE; - if( - encoder->protected_->sample_rate <= 48000 && - ( - encoder->protected_->blocksize > FLAC__SUBSET_MAX_BLOCK_SIZE_48000HZ || - encoder->protected_->max_lpc_order > FLAC__SUBSET_MAX_LPC_ORDER_48000HZ - ) - ) { - return FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE; - } - } - - if(encoder->protected_->max_residual_partition_order >= (1u << FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN)) - encoder->protected_->max_residual_partition_order = (1u << FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN) - 1; - if(encoder->protected_->min_residual_partition_order >= encoder->protected_->max_residual_partition_order) - encoder->protected_->min_residual_partition_order = encoder->protected_->max_residual_partition_order; - -#if FLAC__HAS_OGG - /* reorder metadata if necessary to ensure that any VORBIS_COMMENT is the first, according to the mapping spec */ - if(is_ogg && 0 != encoder->protected_->metadata && encoder->protected_->num_metadata_blocks > 1) { - unsigned i1; - for(i1 = 1; i1 < encoder->protected_->num_metadata_blocks; i1++) { - if(0 != encoder->protected_->metadata[i1] && encoder->protected_->metadata[i1]->type == FLAC__METADATA_TYPE_VORBIS_COMMENT) { - FLAC__StreamMetadata *vc = encoder->protected_->metadata[i1]; - for( ; i1 > 0; i1--) - encoder->protected_->metadata[i1] = encoder->protected_->metadata[i1-1]; - encoder->protected_->metadata[0] = vc; - break; - } - } - } -#endif - /* keep track of any SEEKTABLE block */ - if(0 != encoder->protected_->metadata && encoder->protected_->num_metadata_blocks > 0) { - unsigned i2; - for(i2 = 0; i2 < encoder->protected_->num_metadata_blocks; i2++) { - if(0 != encoder->protected_->metadata[i2] && encoder->protected_->metadata[i2]->type == FLAC__METADATA_TYPE_SEEKTABLE) { - encoder->private_->seek_table = &encoder->protected_->metadata[i2]->data.seek_table; - break; /* take only the first one */ - } - } - } - - /* validate metadata */ - if(0 == encoder->protected_->metadata && encoder->protected_->num_metadata_blocks > 0) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; - metadata_has_seektable = false; - metadata_has_vorbis_comment = false; - metadata_picture_has_type1 = false; - metadata_picture_has_type2 = false; - for(i = 0; i < encoder->protected_->num_metadata_blocks; i++) { - const FLAC__StreamMetadata *m = encoder->protected_->metadata[i]; - if(m->type == FLAC__METADATA_TYPE_STREAMINFO) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; - else if(m->type == FLAC__METADATA_TYPE_SEEKTABLE) { - if(metadata_has_seektable) /* only one is allowed */ - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; - metadata_has_seektable = true; - if(!FLAC__format_seektable_is_legal(&m->data.seek_table)) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; - } - else if(m->type == FLAC__METADATA_TYPE_VORBIS_COMMENT) { - if(metadata_has_vorbis_comment) /* only one is allowed */ - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; - metadata_has_vorbis_comment = true; - } - else if(m->type == FLAC__METADATA_TYPE_CUESHEET) { - if(!FLAC__format_cuesheet_is_legal(&m->data.cue_sheet, m->data.cue_sheet.is_cd, /*violation=*/0)) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; - } - else if(m->type == FLAC__METADATA_TYPE_PICTURE) { - if(!FLAC__format_picture_is_legal(&m->data.picture, /*violation=*/0)) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; - if(m->data.picture.type == FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON_STANDARD) { - if(metadata_picture_has_type1) /* there should only be 1 per stream */ - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; - metadata_picture_has_type1 = true; - /* standard icon must be 32x32 pixel PNG */ - if( - m->data.picture.type == FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON_STANDARD && - ( - (strcmp(m->data.picture.mime_type, "image/png") && strcmp(m->data.picture.mime_type, "-->")) || - m->data.picture.width != 32 || - m->data.picture.height != 32 - ) - ) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; - } - else if(m->data.picture.type == FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON) { - if(metadata_picture_has_type2) /* there should only be 1 per stream */ - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; - metadata_picture_has_type2 = true; - } - } - } - - encoder->private_->input_capacity = 0; - for(i = 0; i < encoder->protected_->channels; i++) { - encoder->private_->integer_signal_unaligned[i] = encoder->private_->integer_signal[i] = 0; -#ifndef FLAC__INTEGER_ONLY_LIBRARY - encoder->private_->real_signal_unaligned[i] = encoder->private_->real_signal[i] = 0; -#endif - } - for(i = 0; i < 2; i++) { - encoder->private_->integer_signal_mid_side_unaligned[i] = encoder->private_->integer_signal_mid_side[i] = 0; -#ifndef FLAC__INTEGER_ONLY_LIBRARY - encoder->private_->real_signal_mid_side_unaligned[i] = encoder->private_->real_signal_mid_side[i] = 0; -#endif - } -#ifndef FLAC__INTEGER_ONLY_LIBRARY - for(i = 0; i < encoder->protected_->num_apodizations; i++) - encoder->private_->window_unaligned[i] = encoder->private_->window[i] = 0; - encoder->private_->windowed_signal_unaligned = encoder->private_->windowed_signal = 0; -#endif - for(i = 0; i < encoder->protected_->channels; i++) { - encoder->private_->residual_workspace_unaligned[i][0] = encoder->private_->residual_workspace[i][0] = 0; - encoder->private_->residual_workspace_unaligned[i][1] = encoder->private_->residual_workspace[i][1] = 0; - encoder->private_->best_subframe[i] = 0; - } - for(i = 0; i < 2; i++) { - encoder->private_->residual_workspace_mid_side_unaligned[i][0] = encoder->private_->residual_workspace_mid_side[i][0] = 0; - encoder->private_->residual_workspace_mid_side_unaligned[i][1] = encoder->private_->residual_workspace_mid_side[i][1] = 0; - encoder->private_->best_subframe_mid_side[i] = 0; - } - encoder->private_->abs_residual_partition_sums_unaligned = encoder->private_->abs_residual_partition_sums = 0; - encoder->private_->raw_bits_per_partition_unaligned = encoder->private_->raw_bits_per_partition = 0; -#ifndef FLAC__INTEGER_ONLY_LIBRARY - encoder->private_->loose_mid_side_stereo_frames = (unsigned)((FLAC__double)encoder->protected_->sample_rate * 0.4 / (FLAC__double)encoder->protected_->blocksize + 0.5); -#else - /* 26214 is the approximate fixed-point equivalent to 0.4 (0.4 * 2^16) */ - /* sample rate can be up to 655350 Hz, and thus use 20 bits, so we do the multiply÷ by hand */ - FLAC__ASSERT(FLAC__MAX_SAMPLE_RATE <= 655350); - FLAC__ASSERT(FLAC__MAX_BLOCK_SIZE <= 65535); - FLAC__ASSERT(encoder->protected_->sample_rate <= 655350); - FLAC__ASSERT(encoder->protected_->blocksize <= 65535); - encoder->private_->loose_mid_side_stereo_frames = (unsigned)FLAC__fixedpoint_trunc((((FLAC__uint64)(encoder->protected_->sample_rate) * (FLAC__uint64)(26214)) << 16) / (encoder->protected_->blocksize<<16) + FLAC__FP_ONE_HALF); -#endif - if(encoder->private_->loose_mid_side_stereo_frames == 0) - encoder->private_->loose_mid_side_stereo_frames = 1; - encoder->private_->loose_mid_side_stereo_frame_count = 0; - encoder->private_->current_sample_number = 0; - encoder->private_->current_frame_number = 0; - - encoder->private_->use_wide_by_block = (encoder->protected_->bits_per_sample + FLAC__bitmath_ilog2(encoder->protected_->blocksize)+1 > 30); - encoder->private_->use_wide_by_order = (encoder->protected_->bits_per_sample + FLAC__bitmath_ilog2(flac_max(encoder->protected_->max_lpc_order, FLAC__MAX_FIXED_ORDER))+1 > 30); /*@@@ need to use this? */ - encoder->private_->use_wide_by_partition = (false); /*@@@ need to set this */ - - /* - * get the CPU info and set the function pointers - */ - FLAC__cpu_info(&encoder->private_->cpuinfo); - /* first default to the non-asm routines */ -#ifndef FLAC__INTEGER_ONLY_LIBRARY - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation; -#endif - encoder->private_->local_precompute_partition_info_sums = precompute_partition_info_sums_; - encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor; - encoder->private_->local_fixed_compute_best_predictor_wide = FLAC__fixed_compute_best_predictor_wide; -#ifndef FLAC__INTEGER_ONLY_LIBRARY - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients; - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_64bit = FLAC__lpc_compute_residual_from_qlp_coefficients_wide; - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients; -#endif - /* now override with asm where appropriate */ -#ifndef FLAC__INTEGER_ONLY_LIBRARY -# ifndef FLAC__NO_ASM - if(encoder->private_->cpuinfo.use_asm) { -# ifdef FLAC__CPU_IA32 - FLAC__ASSERT(encoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_IA32); -# ifdef FLAC__HAS_NASM - if(encoder->private_->cpuinfo.ia32.sse) { - if(encoder->protected_->max_lpc_order < 4) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_4; - else if(encoder->protected_->max_lpc_order < 8) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_8; - else if(encoder->protected_->max_lpc_order < 12) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_12; - else if(encoder->protected_->max_lpc_order < 16) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_16; - else - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32; - } - else - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32; - - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_64bit = FLAC__lpc_compute_residual_from_qlp_coefficients_wide_asm_ia32; /* OPT_IA32: was really necessary for GCC < 4.9 */ - if(encoder->private_->cpuinfo.ia32.mmx) { - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32; - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32_mmx; - } - else { - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32; - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32; - } - - if(encoder->private_->cpuinfo.ia32.mmx && encoder->private_->cpuinfo.ia32.cmov) - encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_asm_ia32_mmx_cmov; -# endif /* FLAC__HAS_NASM */ -# ifdef FLAC__HAS_X86INTRIN -# if defined FLAC__SSE_SUPPORTED - if(encoder->private_->cpuinfo.ia32.sse) { - if(encoder->protected_->max_lpc_order < 4) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_4; - else if(encoder->protected_->max_lpc_order < 8) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_8; - else if(encoder->protected_->max_lpc_order < 12) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_12; - else if(encoder->protected_->max_lpc_order < 16) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_16; - else - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation; - } -# endif - -# ifdef FLAC__SSE2_SUPPORTED - if(encoder->private_->cpuinfo.ia32.sse2) { - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_sse2; - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_16_intrin_sse2; - } -# endif -# ifdef FLAC__SSE4_1_SUPPORTED - if(encoder->private_->cpuinfo.ia32.sse41) { - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_sse41; - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_64bit = FLAC__lpc_compute_residual_from_qlp_coefficients_wide_intrin_sse41; - } -# endif -# ifdef FLAC__AVX2_SUPPORTED - if(encoder->private_->cpuinfo.ia32.avx2) { - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_16_intrin_avx2; - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_avx2; - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_64bit = FLAC__lpc_compute_residual_from_qlp_coefficients_wide_intrin_avx2; - } -# endif - -# ifdef FLAC__SSE2_SUPPORTED - if (encoder->private_->cpuinfo.ia32.sse2) { - encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_intrin_sse2; - encoder->private_->local_fixed_compute_best_predictor_wide = FLAC__fixed_compute_best_predictor_wide_intrin_sse2; - } -# endif -# ifdef FLAC__SSSE3_SUPPORTED - if (encoder->private_->cpuinfo.ia32.ssse3) { - encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_intrin_ssse3; - encoder->private_->local_fixed_compute_best_predictor_wide = FLAC__fixed_compute_best_predictor_wide_intrin_ssse3; - } -# endif -# endif /* FLAC__HAS_X86INTRIN */ -# elif defined FLAC__CPU_X86_64 - FLAC__ASSERT(encoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_X86_64); -# ifdef FLAC__HAS_X86INTRIN -# ifdef FLAC__SSE_SUPPORTED - if(encoder->protected_->max_lpc_order < 4) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_4; - else if(encoder->protected_->max_lpc_order < 8) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_8; - else if(encoder->protected_->max_lpc_order < 12) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_12; - else if(encoder->protected_->max_lpc_order < 16) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_16; -# endif - -# ifdef FLAC__SSE2_SUPPORTED - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_16_intrin_sse2; -# endif -# ifdef FLAC__SSE4_1_SUPPORTED - if(encoder->private_->cpuinfo.x86.sse41) { - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_sse41; - } -# endif -# ifdef FLAC__AVX2_SUPPORTED - if(encoder->private_->cpuinfo.x86.avx2) { - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_16_intrin_avx2; - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_avx2; - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_64bit = FLAC__lpc_compute_residual_from_qlp_coefficients_wide_intrin_avx2; - } -# endif - -# ifdef FLAC__SSE2_SUPPORTED - encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_intrin_sse2; - encoder->private_->local_fixed_compute_best_predictor_wide = FLAC__fixed_compute_best_predictor_wide_intrin_sse2; -# endif -# ifdef FLAC__SSSE3_SUPPORTED - if (encoder->private_->cpuinfo.x86.ssse3) { - encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_intrin_ssse3; - encoder->private_->local_fixed_compute_best_predictor_wide = FLAC__fixed_compute_best_predictor_wide_intrin_ssse3; - } -# endif -# endif /* FLAC__HAS_X86INTRIN */ -# endif /* FLAC__CPU_... */ - } -# endif /* !FLAC__NO_ASM */ -#endif /* !FLAC__INTEGER_ONLY_LIBRARY */ -#if !defined FLAC__NO_ASM && defined FLAC__HAS_X86INTRIN - if(encoder->private_->cpuinfo.use_asm) { -# if defined FLAC__CPU_IA32 -# ifdef FLAC__SSE2_SUPPORTED - if(encoder->private_->cpuinfo.ia32.sse2) - encoder->private_->local_precompute_partition_info_sums = FLAC__precompute_partition_info_sums_intrin_sse2; -# endif -# ifdef FLAC__SSSE3_SUPPORTED - if(encoder->private_->cpuinfo.ia32.ssse3) - encoder->private_->local_precompute_partition_info_sums = FLAC__precompute_partition_info_sums_intrin_ssse3; -# endif -# ifdef FLAC__AVX2_SUPPORTED - if(encoder->private_->cpuinfo.ia32.avx2) - encoder->private_->local_precompute_partition_info_sums = FLAC__precompute_partition_info_sums_intrin_avx2; -# endif -# elif defined FLAC__CPU_X86_64 -# ifdef FLAC__SSE2_SUPPORTED - encoder->private_->local_precompute_partition_info_sums = FLAC__precompute_partition_info_sums_intrin_sse2; -# endif -# ifdef FLAC__SSSE3_SUPPORTED - if(encoder->private_->cpuinfo.x86.ssse3) - encoder->private_->local_precompute_partition_info_sums = FLAC__precompute_partition_info_sums_intrin_ssse3; -# endif -# ifdef FLAC__AVX2_SUPPORTED - if(encoder->private_->cpuinfo.x86.avx2) - encoder->private_->local_precompute_partition_info_sums = FLAC__precompute_partition_info_sums_intrin_avx2; -# endif -# endif /* FLAC__CPU_... */ - } -#endif /* !FLAC__NO_ASM && FLAC__HAS_X86INTRIN */ - /* finally override based on wide-ness if necessary */ - if(encoder->private_->use_wide_by_block) { - encoder->private_->local_fixed_compute_best_predictor = encoder->private_->local_fixed_compute_best_predictor_wide; - } - - /* set state to OK; from here on, errors are fatal and we'll override the state then */ - encoder->protected_->state = FLAC__STREAM_ENCODER_OK; - -#if FLAC__HAS_OGG - encoder->private_->is_ogg = is_ogg; - if(is_ogg && !FLAC__ogg_encoder_aspect_init(&encoder->protected_->ogg_encoder_aspect)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } -#endif - - encoder->private_->read_callback = read_callback; - encoder->private_->write_callback = write_callback; - encoder->private_->seek_callback = seek_callback; - encoder->private_->tell_callback = tell_callback; - encoder->private_->metadata_callback = metadata_callback; - encoder->private_->client_data = client_data; - - if(!resize_buffers_(encoder, encoder->protected_->blocksize)) { - /* the above function sets the state for us in case of an error */ - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - - if(!FLAC__bitwriter_init(encoder->private_->frame)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - - /* - * Set up the verify stuff if necessary - */ - if(encoder->protected_->verify) { - /* - * First, set up the fifo which will hold the - * original signal to compare against - */ - encoder->private_->verify.input_fifo.size = encoder->protected_->blocksize+OVERREAD_; - for(i = 0; i < encoder->protected_->channels; i++) { - if(0 == (encoder->private_->verify.input_fifo.data[i] = safe_malloc_mul_2op_p(sizeof(FLAC__int32), /*times*/encoder->private_->verify.input_fifo.size))) { - encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - } - encoder->private_->verify.input_fifo.tail = 0; - - /* - * Now set up a stream decoder for verification - */ - if(0 == encoder->private_->verify.decoder) { - encoder->private_->verify.decoder = FLAC__stream_decoder_new(); - if(0 == encoder->private_->verify.decoder) { - encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - } - - if(FLAC__stream_decoder_init_stream(encoder->private_->verify.decoder, verify_read_callback_, /*seek_callback=*/0, /*tell_callback=*/0, /*length_callback=*/0, /*eof_callback=*/0, verify_write_callback_, verify_metadata_callback_, verify_error_callback_, /*client_data=*/encoder) != FLAC__STREAM_DECODER_INIT_STATUS_OK) { - encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - } - encoder->private_->verify.error_stats.absolute_sample = 0; - encoder->private_->verify.error_stats.frame_number = 0; - encoder->private_->verify.error_stats.channel = 0; - encoder->private_->verify.error_stats.sample = 0; - encoder->private_->verify.error_stats.expected = 0; - encoder->private_->verify.error_stats.got = 0; - - /* - * These must be done before we write any metadata, because that - * calls the write_callback, which uses these values. - */ - encoder->private_->first_seekpoint_to_check = 0; - encoder->private_->samples_written = 0; - encoder->protected_->streaminfo_offset = 0; - encoder->protected_->seektable_offset = 0; - encoder->protected_->audio_offset = 0; - - /* - * write the stream header - */ - if(encoder->protected_->verify) - encoder->private_->verify.state_hint = ENCODER_IN_MAGIC; - if(!FLAC__bitwriter_write_raw_uint32(encoder->private_->frame, FLAC__STREAM_SYNC, FLAC__STREAM_SYNC_LEN)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - if(!write_bitbuffer_(encoder, 0, /*is_last_block=*/false)) { - /* the above function sets the state for us in case of an error */ - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - - /* - * write the STREAMINFO metadata block - */ - if(encoder->protected_->verify) - encoder->private_->verify.state_hint = ENCODER_IN_METADATA; - encoder->private_->streaminfo.type = FLAC__METADATA_TYPE_STREAMINFO; - encoder->private_->streaminfo.is_last = false; /* we will have at a minimum a VORBIS_COMMENT afterwards */ - encoder->private_->streaminfo.length = FLAC__STREAM_METADATA_STREAMINFO_LENGTH; - encoder->private_->streaminfo.data.stream_info.min_blocksize = encoder->protected_->blocksize; /* this encoder uses the same blocksize for the whole stream */ - encoder->private_->streaminfo.data.stream_info.max_blocksize = encoder->protected_->blocksize; - encoder->private_->streaminfo.data.stream_info.min_framesize = 0; /* we don't know this yet; have to fill it in later */ - encoder->private_->streaminfo.data.stream_info.max_framesize = 0; /* we don't know this yet; have to fill it in later */ - encoder->private_->streaminfo.data.stream_info.sample_rate = encoder->protected_->sample_rate; - encoder->private_->streaminfo.data.stream_info.channels = encoder->protected_->channels; - encoder->private_->streaminfo.data.stream_info.bits_per_sample = encoder->protected_->bits_per_sample; - encoder->private_->streaminfo.data.stream_info.total_samples = encoder->protected_->total_samples_estimate; /* we will replace this later with the real total */ - memset(encoder->private_->streaminfo.data.stream_info.md5sum, 0, 16); /* we don't know this yet; have to fill it in later */ - if(encoder->protected_->do_md5) - FLAC__MD5Init(&encoder->private_->md5context); - if(!FLAC__add_metadata_block(&encoder->private_->streaminfo, encoder->private_->frame)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - if(!write_bitbuffer_(encoder, 0, /*is_last_block=*/false)) { - /* the above function sets the state for us in case of an error */ - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - - /* - * Now that the STREAMINFO block is written, we can init this to an - * absurdly-high value... - */ - encoder->private_->streaminfo.data.stream_info.min_framesize = (1u << FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN) - 1; - /* ... and clear this to 0 */ - encoder->private_->streaminfo.data.stream_info.total_samples = 0; - - /* - * Check to see if the supplied metadata contains a VORBIS_COMMENT; - * if not, we will write an empty one (FLAC__add_metadata_block() - * automatically supplies the vendor string). - * - * WATCHOUT: the Ogg FLAC mapping requires us to write this block after - * the STREAMINFO. (In the case that metadata_has_vorbis_comment is - * true it will have already insured that the metadata list is properly - * ordered.) - */ - if(!metadata_has_vorbis_comment) { - FLAC__StreamMetadata vorbis_comment; - vorbis_comment.type = FLAC__METADATA_TYPE_VORBIS_COMMENT; - vorbis_comment.is_last = (encoder->protected_->num_metadata_blocks == 0); - vorbis_comment.length = 4 + 4; /* MAGIC NUMBER */ - vorbis_comment.data.vorbis_comment.vendor_string.length = 0; - vorbis_comment.data.vorbis_comment.vendor_string.entry = 0; - vorbis_comment.data.vorbis_comment.num_comments = 0; - vorbis_comment.data.vorbis_comment.comments = 0; - if(!FLAC__add_metadata_block(&vorbis_comment, encoder->private_->frame)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - if(!write_bitbuffer_(encoder, 0, /*is_last_block=*/false)) { - /* the above function sets the state for us in case of an error */ - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - } - - /* - * write the user's metadata blocks - */ - for(i = 0; i < encoder->protected_->num_metadata_blocks; i++) { - encoder->protected_->metadata[i]->is_last = (i == encoder->protected_->num_metadata_blocks - 1); - if(!FLAC__add_metadata_block(encoder->protected_->metadata[i], encoder->private_->frame)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - if(!write_bitbuffer_(encoder, 0, /*is_last_block=*/false)) { - /* the above function sets the state for us in case of an error */ - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - } - - /* now that all the metadata is written, we save the stream offset */ - if(encoder->private_->tell_callback && encoder->private_->tell_callback(encoder, &encoder->protected_->audio_offset, encoder->private_->client_data) == FLAC__STREAM_ENCODER_TELL_STATUS_ERROR) { /* FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED just means we didn't get the offset; no error */ - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - - if(encoder->protected_->verify) - encoder->private_->verify.state_hint = ENCODER_IN_AUDIO; - - return FLAC__STREAM_ENCODER_INIT_STATUS_OK; -} - -FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_stream( - FLAC__StreamEncoder *encoder, - FLAC__StreamEncoderWriteCallback write_callback, - FLAC__StreamEncoderSeekCallback seek_callback, - FLAC__StreamEncoderTellCallback tell_callback, - FLAC__StreamEncoderMetadataCallback metadata_callback, - void *client_data -) -{ - return init_stream_internal_( - encoder, - /*read_callback=*/0, - write_callback, - seek_callback, - tell_callback, - metadata_callback, - client_data, - /*is_ogg=*/false - ); -} - -FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_ogg_stream( - FLAC__StreamEncoder *encoder, - FLAC__StreamEncoderReadCallback read_callback, - FLAC__StreamEncoderWriteCallback write_callback, - FLAC__StreamEncoderSeekCallback seek_callback, - FLAC__StreamEncoderTellCallback tell_callback, - FLAC__StreamEncoderMetadataCallback metadata_callback, - void *client_data -) -{ - return init_stream_internal_( - encoder, - read_callback, - write_callback, - seek_callback, - tell_callback, - metadata_callback, - client_data, - /*is_ogg=*/true - ); -} - -static FLAC__StreamEncoderInitStatus init_FILE_internal_( - FLAC__StreamEncoder *encoder, - FILE *file, - FLAC__StreamEncoderProgressCallback progress_callback, - void *client_data, - FLAC__bool is_ogg -) -{ - FLAC__StreamEncoderInitStatus init_status; - - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != file); - - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED; - - /* double protection */ - if(file == 0) { - encoder->protected_->state = FLAC__STREAM_ENCODER_IO_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - - /* - * To make sure that our file does not go unclosed after an error, we - * must assign the FILE pointer before any further error can occur in - * this routine. - */ - if(file == stdout) - file = get_binary_stdout_(); /* just to be safe */ - -#ifdef _WIN32 - /* - * Windows can suffer quite badly from disk fragmentation. This can be - * reduced significantly by setting the output buffer size to be 10MB. - */ - setvbuf(file, NULL, _IOFBF, 10*1024*1024); -#endif - encoder->private_->file = file; - - encoder->private_->progress_callback = progress_callback; - encoder->private_->bytes_written = 0; - encoder->private_->samples_written = 0; - encoder->private_->frames_written = 0; - - init_status = init_stream_internal_( - encoder, - encoder->private_->file == stdout? 0 : is_ogg? file_read_callback_ : 0, - file_write_callback_, - encoder->private_->file == stdout? 0 : file_seek_callback_, - encoder->private_->file == stdout? 0 : file_tell_callback_, - /*metadata_callback=*/0, - client_data, - is_ogg - ); - if(init_status != FLAC__STREAM_ENCODER_INIT_STATUS_OK) { - /* the above function sets the state for us in case of an error */ - return init_status; - } - - { - unsigned blocksize = FLAC__stream_encoder_get_blocksize(encoder); - - FLAC__ASSERT(blocksize != 0); - encoder->private_->total_frames_estimate = (unsigned)((FLAC__stream_encoder_get_total_samples_estimate(encoder) + blocksize - 1) / blocksize); - } - - return init_status; -} - -FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_FILE( - FLAC__StreamEncoder *encoder, - FILE *file, - FLAC__StreamEncoderProgressCallback progress_callback, - void *client_data -) -{ - return init_FILE_internal_(encoder, file, progress_callback, client_data, /*is_ogg=*/false); -} - -FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_ogg_FILE( - FLAC__StreamEncoder *encoder, - FILE *file, - FLAC__StreamEncoderProgressCallback progress_callback, - void *client_data -) -{ - return init_FILE_internal_(encoder, file, progress_callback, client_data, /*is_ogg=*/true); -} - -static FLAC__StreamEncoderInitStatus init_file_internal_( - FLAC__StreamEncoder *encoder, - const char *filename, - FLAC__StreamEncoderProgressCallback progress_callback, - void *client_data, - FLAC__bool is_ogg -) -{ - FILE *file; - - FLAC__ASSERT(0 != encoder); - - /* - * To make sure that our file does not go unclosed after an error, we - * have to do the same entrance checks here that are later performed - * in FLAC__stream_encoder_init_FILE() before the FILE* is assigned. - */ - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED; - - file = filename? flac_fopen(filename, "w+b") : stdout; - - if(file == 0) { - encoder->protected_->state = FLAC__STREAM_ENCODER_IO_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - - return init_FILE_internal_(encoder, file, progress_callback, client_data, is_ogg); -} - -FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_file( - FLAC__StreamEncoder *encoder, - const char *filename, - FLAC__StreamEncoderProgressCallback progress_callback, - void *client_data -) -{ - return init_file_internal_(encoder, filename, progress_callback, client_data, /*is_ogg=*/false); -} - -FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_ogg_file( - FLAC__StreamEncoder *encoder, - const char *filename, - FLAC__StreamEncoderProgressCallback progress_callback, - void *client_data -) -{ - return init_file_internal_(encoder, filename, progress_callback, client_data, /*is_ogg=*/true); -} - -FLAC_API FLAC__bool FLAC__stream_encoder_finish(FLAC__StreamEncoder *encoder) -{ - FLAC__bool error = false; - - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - - if(encoder->protected_->state == FLAC__STREAM_ENCODER_UNINITIALIZED) - return true; - - if(encoder->protected_->state == FLAC__STREAM_ENCODER_OK && !encoder->private_->is_being_deleted) { - if(encoder->private_->current_sample_number != 0) { - const FLAC__bool is_fractional_block = encoder->protected_->blocksize != encoder->private_->current_sample_number; - encoder->protected_->blocksize = encoder->private_->current_sample_number; - if(!process_frame_(encoder, is_fractional_block, /*is_last_block=*/true)) - error = true; - } - } - - if(encoder->protected_->do_md5) - FLAC__MD5Final(encoder->private_->streaminfo.data.stream_info.md5sum, &encoder->private_->md5context); - - if(!encoder->private_->is_being_deleted) { - if(encoder->protected_->state == FLAC__STREAM_ENCODER_OK) { - if(encoder->private_->seek_callback) { -#if FLAC__HAS_OGG - if(encoder->private_->is_ogg) - update_ogg_metadata_(encoder); - else -#endif - update_metadata_(encoder); - - /* check if an error occurred while updating metadata */ - if(encoder->protected_->state != FLAC__STREAM_ENCODER_OK) - error = true; - } - if(encoder->private_->metadata_callback) - encoder->private_->metadata_callback(encoder, &encoder->private_->streaminfo, encoder->private_->client_data); - } - - if(encoder->protected_->verify && 0 != encoder->private_->verify.decoder && !FLAC__stream_decoder_finish(encoder->private_->verify.decoder)) { - if(!error) - encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA; - error = true; - } - } - - if(0 != encoder->private_->file) { - if(encoder->private_->file != stdout) - fclose(encoder->private_->file); - encoder->private_->file = 0; - } - -#if FLAC__HAS_OGG - if(encoder->private_->is_ogg) - FLAC__ogg_encoder_aspect_finish(&encoder->protected_->ogg_encoder_aspect); -#endif - - free_(encoder); - set_defaults_(encoder); - - if(!error) - encoder->protected_->state = FLAC__STREAM_ENCODER_UNINITIALIZED; - - return !error; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_ogg_serial_number(FLAC__StreamEncoder *encoder, long value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; -#if FLAC__HAS_OGG - /* can't check encoder->private_->is_ogg since that's not set until init time */ - FLAC__ogg_encoder_aspect_set_serial_number(&encoder->protected_->ogg_encoder_aspect, value); - return true; -#else - (void)value; - return false; -#endif -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_verify(FLAC__StreamEncoder *encoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; -#ifndef FLAC__MANDATORY_VERIFY_WHILE_ENCODING - encoder->protected_->verify = value; -#endif - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_streamable_subset(FLAC__StreamEncoder *encoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->streamable_subset = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_do_md5(FLAC__StreamEncoder *encoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->do_md5 = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_channels(FLAC__StreamEncoder *encoder, unsigned value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->channels = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_bits_per_sample(FLAC__StreamEncoder *encoder, unsigned value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->bits_per_sample = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_sample_rate(FLAC__StreamEncoder *encoder, unsigned value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->sample_rate = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_compression_level(FLAC__StreamEncoder *encoder, unsigned value) -{ - FLAC__bool ok = true; - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - if(value >= sizeof(compression_levels_)/sizeof(compression_levels_[0])) - value = sizeof(compression_levels_)/sizeof(compression_levels_[0]) - 1; - ok &= FLAC__stream_encoder_set_do_mid_side_stereo (encoder, compression_levels_[value].do_mid_side_stereo); - ok &= FLAC__stream_encoder_set_loose_mid_side_stereo (encoder, compression_levels_[value].loose_mid_side_stereo); -#ifndef FLAC__INTEGER_ONLY_LIBRARY -#if 1 - ok &= FLAC__stream_encoder_set_apodization (encoder, compression_levels_[value].apodization); -#else - /* equivalent to -A tukey(0.5) */ - encoder->protected_->num_apodizations = 1; - encoder->protected_->apodizations[0].type = FLAC__APODIZATION_TUKEY; - encoder->protected_->apodizations[0].parameters.tukey.p = 0.5; -#endif -#endif - ok &= FLAC__stream_encoder_set_max_lpc_order (encoder, compression_levels_[value].max_lpc_order); - ok &= FLAC__stream_encoder_set_qlp_coeff_precision (encoder, compression_levels_[value].qlp_coeff_precision); - ok &= FLAC__stream_encoder_set_do_qlp_coeff_prec_search (encoder, compression_levels_[value].do_qlp_coeff_prec_search); - ok &= FLAC__stream_encoder_set_do_escape_coding (encoder, compression_levels_[value].do_escape_coding); - ok &= FLAC__stream_encoder_set_do_exhaustive_model_search (encoder, compression_levels_[value].do_exhaustive_model_search); - ok &= FLAC__stream_encoder_set_min_residual_partition_order(encoder, compression_levels_[value].min_residual_partition_order); - ok &= FLAC__stream_encoder_set_max_residual_partition_order(encoder, compression_levels_[value].max_residual_partition_order); - ok &= FLAC__stream_encoder_set_rice_parameter_search_dist (encoder, compression_levels_[value].rice_parameter_search_dist); - return ok; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_blocksize(FLAC__StreamEncoder *encoder, unsigned value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->blocksize = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_do_mid_side_stereo(FLAC__StreamEncoder *encoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->do_mid_side_stereo = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_loose_mid_side_stereo(FLAC__StreamEncoder *encoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->loose_mid_side_stereo = value; - return true; -} - -/*@@@@add to tests*/ -FLAC_API FLAC__bool FLAC__stream_encoder_set_apodization(FLAC__StreamEncoder *encoder, const char *specification) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - FLAC__ASSERT(0 != specification); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; -#ifdef FLAC__INTEGER_ONLY_LIBRARY - (void)specification; /* silently ignore since we haven't integerized; will always use a rectangular window */ -#else - encoder->protected_->num_apodizations = 0; - while(1) { - const char *s = strchr(specification, ';'); - const size_t n = s? (size_t)(s - specification) : strlen(specification); - if (n==8 && 0 == strncmp("bartlett" , specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_BARTLETT; - else if(n==13 && 0 == strncmp("bartlett_hann", specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_BARTLETT_HANN; - else if(n==8 && 0 == strncmp("blackman" , specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_BLACKMAN; - else if(n==26 && 0 == strncmp("blackman_harris_4term_92db", specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_BLACKMAN_HARRIS_4TERM_92DB_SIDELOBE; - else if(n==6 && 0 == strncmp("connes" , specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_CONNES; - else if(n==7 && 0 == strncmp("flattop" , specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_FLATTOP; - else if(n>7 && 0 == strncmp("gauss(" , specification, 6)) { - FLAC__real stddev = (FLAC__real)strtod(specification+6, 0); - if (stddev > 0.0 && stddev <= 0.5) { - encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.gauss.stddev = stddev; - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_GAUSS; - } - } - else if(n==7 && 0 == strncmp("hamming" , specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_HAMMING; - else if(n==4 && 0 == strncmp("hann" , specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_HANN; - else if(n==13 && 0 == strncmp("kaiser_bessel", specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_KAISER_BESSEL; - else if(n==7 && 0 == strncmp("nuttall" , specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_NUTTALL; - else if(n==9 && 0 == strncmp("rectangle" , specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_RECTANGLE; - else if(n==8 && 0 == strncmp("triangle" , specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_TRIANGLE; - else if(n>7 && 0 == strncmp("tukey(" , specification, 6)) { - FLAC__real p = (FLAC__real)strtod(specification+6, 0); - if (p >= 0.0 && p <= 1.0) { - encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.tukey.p = p; - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_TUKEY; - } - } - else if(n>15 && 0 == strncmp("partial_tukey(" , specification, 14)) { - FLAC__int32 tukey_parts = (FLAC__int32)strtod(specification+14, 0); - const char *si_1 = strchr(specification, '/'); - FLAC__real overlap = si_1?flac_min((FLAC__real)strtod(si_1+1, 0),0.99f):0.1f; - FLAC__real overlap_units = 1.0f/(1.0f - overlap) - 1.0f; - const char *si_2 = strchr((si_1?(si_1+1):specification), '/'); - FLAC__real tukey_p = si_2?(FLAC__real)strtod(si_2+1, 0):0.2f; - - if (tukey_parts <= 1) { - encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.tukey.p = tukey_p; - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_TUKEY; - }else if (encoder->protected_->num_apodizations + tukey_parts < 32){ - FLAC__int32 m; - for(m = 0; m < tukey_parts; m++){ - encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.multiple_tukey.p = tukey_p; - encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.multiple_tukey.start = m/(tukey_parts+overlap_units); - encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.multiple_tukey.end = (m+1+overlap_units)/(tukey_parts+overlap_units); - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_PARTIAL_TUKEY; - } - } - } - else if(n>16 && 0 == strncmp("punchout_tukey(" , specification, 15)) { - FLAC__int32 tukey_parts = (FLAC__int32)strtod(specification+15, 0); - const char *si_1 = strchr(specification, '/'); - FLAC__real overlap = si_1?flac_min((FLAC__real)strtod(si_1+1, 0),0.99f):0.2f; - FLAC__real overlap_units = 1.0f/(1.0f - overlap) - 1.0f; - const char *si_2 = strchr((si_1?(si_1+1):specification), '/'); - FLAC__real tukey_p = si_2?(FLAC__real)strtod(si_2+1, 0):0.2f; - - if (tukey_parts <= 1) { - encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.tukey.p = tukey_p; - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_TUKEY; - }else if (encoder->protected_->num_apodizations + tukey_parts < 32){ - FLAC__int32 m; - for(m = 0; m < tukey_parts; m++){ - encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.multiple_tukey.p = tukey_p; - encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.multiple_tukey.start = m/(tukey_parts+overlap_units); - encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.multiple_tukey.end = (m+1+overlap_units)/(tukey_parts+overlap_units); - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_PUNCHOUT_TUKEY; - } - } - } - else if(n==5 && 0 == strncmp("welch" , specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_WELCH; - if (encoder->protected_->num_apodizations == 32) - break; - if (s) - specification = s+1; - else - break; - } - if(encoder->protected_->num_apodizations == 0) { - encoder->protected_->num_apodizations = 1; - encoder->protected_->apodizations[0].type = FLAC__APODIZATION_TUKEY; - encoder->protected_->apodizations[0].parameters.tukey.p = 0.5; - } -#endif - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_max_lpc_order(FLAC__StreamEncoder *encoder, unsigned value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->max_lpc_order = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_qlp_coeff_precision(FLAC__StreamEncoder *encoder, unsigned value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->qlp_coeff_precision = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_do_qlp_coeff_prec_search(FLAC__StreamEncoder *encoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->do_qlp_coeff_prec_search = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_do_escape_coding(FLAC__StreamEncoder *encoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; -#if 0 - /*@@@ deprecated: */ - encoder->protected_->do_escape_coding = value; -#else - (void)value; -#endif - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_do_exhaustive_model_search(FLAC__StreamEncoder *encoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->do_exhaustive_model_search = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_min_residual_partition_order(FLAC__StreamEncoder *encoder, unsigned value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->min_residual_partition_order = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_max_residual_partition_order(FLAC__StreamEncoder *encoder, unsigned value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->max_residual_partition_order = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_rice_parameter_search_dist(FLAC__StreamEncoder *encoder, unsigned value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; -#if 0 - /*@@@ deprecated: */ - encoder->protected_->rice_parameter_search_dist = value; -#else - (void)value; -#endif - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_total_samples_estimate(FLAC__StreamEncoder *encoder, FLAC__uint64 value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->total_samples_estimate = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_metadata(FLAC__StreamEncoder *encoder, FLAC__StreamMetadata **metadata, unsigned num_blocks) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - if(0 == metadata) - num_blocks = 0; - if(0 == num_blocks) - metadata = 0; - /* realloc() does not do exactly what we want so... */ - if(encoder->protected_->metadata) { - free(encoder->protected_->metadata); - encoder->protected_->metadata = 0; - encoder->protected_->num_metadata_blocks = 0; - } - if(num_blocks) { - FLAC__StreamMetadata **m; - if(0 == (m = safe_malloc_mul_2op_p(sizeof(m[0]), /*times*/num_blocks))) - return false; - memcpy(m, metadata, sizeof(m[0]) * num_blocks); - encoder->protected_->metadata = m; - encoder->protected_->num_metadata_blocks = num_blocks; - } -#if FLAC__HAS_OGG - if(!FLAC__ogg_encoder_aspect_set_num_metadata(&encoder->protected_->ogg_encoder_aspect, num_blocks)) - return false; -#endif - return true; -} - -/* - * These three functions are not static, but not publically exposed in - * include/FLAC/ either. They are used by the test suite. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_disable_constant_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->private_->disable_constant_subframes = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_disable_fixed_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->private_->disable_fixed_subframes = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_disable_verbatim_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->private_->disable_verbatim_subframes = value; - return true; -} - -FLAC_API FLAC__StreamEncoderState FLAC__stream_encoder_get_state(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->state; -} - -FLAC_API FLAC__StreamDecoderState FLAC__stream_encoder_get_verify_decoder_state(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->verify) - return FLAC__stream_decoder_get_state(encoder->private_->verify.decoder); - else - return FLAC__STREAM_DECODER_UNINITIALIZED; -} - -FLAC_API const char *FLAC__stream_encoder_get_resolved_state_string(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR) - return FLAC__StreamEncoderStateString[encoder->protected_->state]; - else - return FLAC__stream_decoder_get_resolved_state_string(encoder->private_->verify.decoder); -} - -FLAC_API void FLAC__stream_encoder_get_verify_decoder_error_stats(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_sample, unsigned *frame_number, unsigned *channel, unsigned *sample, FLAC__int32 *expected, FLAC__int32 *got) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(0 != absolute_sample) - *absolute_sample = encoder->private_->verify.error_stats.absolute_sample; - if(0 != frame_number) - *frame_number = encoder->private_->verify.error_stats.frame_number; - if(0 != channel) - *channel = encoder->private_->verify.error_stats.channel; - if(0 != sample) - *sample = encoder->private_->verify.error_stats.sample; - if(0 != expected) - *expected = encoder->private_->verify.error_stats.expected; - if(0 != got) - *got = encoder->private_->verify.error_stats.got; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_get_verify(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->verify; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_get_streamable_subset(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->streamable_subset; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_get_do_md5(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->do_md5; -} - -FLAC_API unsigned FLAC__stream_encoder_get_channels(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->channels; -} - -FLAC_API unsigned FLAC__stream_encoder_get_bits_per_sample(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->bits_per_sample; -} - -FLAC_API unsigned FLAC__stream_encoder_get_sample_rate(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->sample_rate; -} - -FLAC_API unsigned FLAC__stream_encoder_get_blocksize(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->blocksize; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_get_do_mid_side_stereo(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->do_mid_side_stereo; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_get_loose_mid_side_stereo(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->loose_mid_side_stereo; -} - -FLAC_API unsigned FLAC__stream_encoder_get_max_lpc_order(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->max_lpc_order; -} - -FLAC_API unsigned FLAC__stream_encoder_get_qlp_coeff_precision(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->qlp_coeff_precision; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_get_do_qlp_coeff_prec_search(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->do_qlp_coeff_prec_search; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_get_do_escape_coding(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->do_escape_coding; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_get_do_exhaustive_model_search(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->do_exhaustive_model_search; -} - -FLAC_API unsigned FLAC__stream_encoder_get_min_residual_partition_order(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->min_residual_partition_order; -} - -FLAC_API unsigned FLAC__stream_encoder_get_max_residual_partition_order(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->max_residual_partition_order; -} - -FLAC_API unsigned FLAC__stream_encoder_get_rice_parameter_search_dist(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->rice_parameter_search_dist; -} - -FLAC_API FLAC__uint64 FLAC__stream_encoder_get_total_samples_estimate(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->total_samples_estimate; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_process(FLAC__StreamEncoder *encoder, const FLAC__int32 * const buffer[], unsigned samples) -{ - unsigned i, j = 0, channel; - const unsigned channels = encoder->protected_->channels, blocksize = encoder->protected_->blocksize; - - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK); - - do { - const unsigned n = flac_min(blocksize+OVERREAD_-encoder->private_->current_sample_number, samples-j); - - if(encoder->protected_->verify) - append_to_verify_fifo_(&encoder->private_->verify.input_fifo, buffer, j, channels, n); - - for(channel = 0; channel < channels; channel++) - memcpy(&encoder->private_->integer_signal[channel][encoder->private_->current_sample_number], &buffer[channel][j], sizeof(buffer[channel][0]) * n); - - if(encoder->protected_->do_mid_side_stereo) { - FLAC__ASSERT(channels == 2); - /* "i <= blocksize" to overread 1 sample; see comment in OVERREAD_ decl */ - for(i = encoder->private_->current_sample_number; i <= blocksize && j < samples; i++, j++) { - encoder->private_->integer_signal_mid_side[1][i] = buffer[0][j] - buffer[1][j]; - encoder->private_->integer_signal_mid_side[0][i] = (buffer[0][j] + buffer[1][j]) >> 1; /* NOTE: not the same as 'mid = (buffer[0][j] + buffer[1][j]) / 2' ! */ - } - } - else - j += n; - - encoder->private_->current_sample_number += n; - - /* we only process if we have a full block + 1 extra sample; final block is always handled by FLAC__stream_encoder_finish() */ - if(encoder->private_->current_sample_number > blocksize) { - FLAC__ASSERT(encoder->private_->current_sample_number == blocksize+OVERREAD_); - FLAC__ASSERT(OVERREAD_ == 1); /* assert we only overread 1 sample which simplifies the rest of the code below */ - if(!process_frame_(encoder, /*is_fractional_block=*/false, /*is_last_block=*/false)) - return false; - /* move unprocessed overread samples to beginnings of arrays */ - for(channel = 0; channel < channels; channel++) - encoder->private_->integer_signal[channel][0] = encoder->private_->integer_signal[channel][blocksize]; - if(encoder->protected_->do_mid_side_stereo) { - encoder->private_->integer_signal_mid_side[0][0] = encoder->private_->integer_signal_mid_side[0][blocksize]; - encoder->private_->integer_signal_mid_side[1][0] = encoder->private_->integer_signal_mid_side[1][blocksize]; - } - encoder->private_->current_sample_number = 1; - } - } while(j < samples); - - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_process_interleaved(FLAC__StreamEncoder *encoder, const FLAC__int32 buffer[], unsigned samples) -{ - unsigned i, j, k, channel; - FLAC__int32 x, mid, side; - const unsigned channels = encoder->protected_->channels, blocksize = encoder->protected_->blocksize; - - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK); - - j = k = 0; - /* - * we have several flavors of the same basic loop, optimized for - * different conditions: - */ - if(encoder->protected_->do_mid_side_stereo && channels == 2) { - /* - * stereo coding: unroll channel loop - */ - do { - if(encoder->protected_->verify) - append_to_verify_fifo_interleaved_(&encoder->private_->verify.input_fifo, buffer, j, channels, flac_min(blocksize+OVERREAD_-encoder->private_->current_sample_number, samples-j)); - - /* "i <= blocksize" to overread 1 sample; see comment in OVERREAD_ decl */ - for(i = encoder->private_->current_sample_number; i <= blocksize && j < samples; i++, j++) { - encoder->private_->integer_signal[0][i] = mid = side = buffer[k++]; - x = buffer[k++]; - encoder->private_->integer_signal[1][i] = x; - mid += x; - side -= x; - mid >>= 1; /* NOTE: not the same as 'mid = (left + right) / 2' ! */ - encoder->private_->integer_signal_mid_side[1][i] = side; - encoder->private_->integer_signal_mid_side[0][i] = mid; - } - encoder->private_->current_sample_number = i; - /* we only process if we have a full block + 1 extra sample; final block is always handled by FLAC__stream_encoder_finish() */ - if(i > blocksize) { - if(!process_frame_(encoder, /*is_fractional_block=*/false, /*is_last_block=*/false)) - return false; - /* move unprocessed overread samples to beginnings of arrays */ - FLAC__ASSERT(i == blocksize+OVERREAD_); - FLAC__ASSERT(OVERREAD_ == 1); /* assert we only overread 1 sample which simplifies the rest of the code below */ - encoder->private_->integer_signal[0][0] = encoder->private_->integer_signal[0][blocksize]; - encoder->private_->integer_signal[1][0] = encoder->private_->integer_signal[1][blocksize]; - encoder->private_->integer_signal_mid_side[0][0] = encoder->private_->integer_signal_mid_side[0][blocksize]; - encoder->private_->integer_signal_mid_side[1][0] = encoder->private_->integer_signal_mid_side[1][blocksize]; - encoder->private_->current_sample_number = 1; - } - } while(j < samples); - } - else { - /* - * independent channel coding: buffer each channel in inner loop - */ - do { - if(encoder->protected_->verify) - append_to_verify_fifo_interleaved_(&encoder->private_->verify.input_fifo, buffer, j, channels, flac_min(blocksize+OVERREAD_-encoder->private_->current_sample_number, samples-j)); - - /* "i <= blocksize" to overread 1 sample; see comment in OVERREAD_ decl */ - for(i = encoder->private_->current_sample_number; i <= blocksize && j < samples; i++, j++) { - for(channel = 0; channel < channels; channel++) - encoder->private_->integer_signal[channel][i] = buffer[k++]; - } - encoder->private_->current_sample_number = i; - /* we only process if we have a full block + 1 extra sample; final block is always handled by FLAC__stream_encoder_finish() */ - if(i > blocksize) { - if(!process_frame_(encoder, /*is_fractional_block=*/false, /*is_last_block=*/false)) - return false; - /* move unprocessed overread samples to beginnings of arrays */ - FLAC__ASSERT(i == blocksize+OVERREAD_); - FLAC__ASSERT(OVERREAD_ == 1); /* assert we only overread 1 sample which simplifies the rest of the code below */ - for(channel = 0; channel < channels; channel++) - encoder->private_->integer_signal[channel][0] = encoder->private_->integer_signal[channel][blocksize]; - encoder->private_->current_sample_number = 1; - } - } while(j < samples); - } - - return true; -} - -/*********************************************************************** - * - * Private class methods - * - ***********************************************************************/ - -void set_defaults_(FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - -#ifdef FLAC__MANDATORY_VERIFY_WHILE_ENCODING - encoder->protected_->verify = true; -#else - encoder->protected_->verify = false; -#endif - encoder->protected_->streamable_subset = true; - encoder->protected_->do_md5 = true; - encoder->protected_->do_mid_side_stereo = false; - encoder->protected_->loose_mid_side_stereo = false; - encoder->protected_->channels = 2; - encoder->protected_->bits_per_sample = 16; - encoder->protected_->sample_rate = 44100; - encoder->protected_->blocksize = 0; -#ifndef FLAC__INTEGER_ONLY_LIBRARY - encoder->protected_->num_apodizations = 1; - encoder->protected_->apodizations[0].type = FLAC__APODIZATION_TUKEY; - encoder->protected_->apodizations[0].parameters.tukey.p = 0.5; -#endif - encoder->protected_->max_lpc_order = 0; - encoder->protected_->qlp_coeff_precision = 0; - encoder->protected_->do_qlp_coeff_prec_search = false; - encoder->protected_->do_exhaustive_model_search = false; - encoder->protected_->do_escape_coding = false; - encoder->protected_->min_residual_partition_order = 0; - encoder->protected_->max_residual_partition_order = 0; - encoder->protected_->rice_parameter_search_dist = 0; - encoder->protected_->total_samples_estimate = 0; - encoder->protected_->metadata = 0; - encoder->protected_->num_metadata_blocks = 0; - - encoder->private_->seek_table = 0; - encoder->private_->disable_constant_subframes = false; - encoder->private_->disable_fixed_subframes = false; - encoder->private_->disable_verbatim_subframes = false; -#if FLAC__HAS_OGG - encoder->private_->is_ogg = false; -#endif - encoder->private_->read_callback = 0; - encoder->private_->write_callback = 0; - encoder->private_->seek_callback = 0; - encoder->private_->tell_callback = 0; - encoder->private_->metadata_callback = 0; - encoder->private_->progress_callback = 0; - encoder->private_->client_data = 0; - -#if FLAC__HAS_OGG - FLAC__ogg_encoder_aspect_set_defaults(&encoder->protected_->ogg_encoder_aspect); -#endif - - FLAC__stream_encoder_set_compression_level(encoder, 5); -} - -void free_(FLAC__StreamEncoder *encoder) -{ - unsigned i, channel; - - FLAC__ASSERT(0 != encoder); - if(encoder->protected_->metadata) { - free(encoder->protected_->metadata); - encoder->protected_->metadata = 0; - encoder->protected_->num_metadata_blocks = 0; - } - for(i = 0; i < encoder->protected_->channels; i++) { - if(0 != encoder->private_->integer_signal_unaligned[i]) { - free(encoder->private_->integer_signal_unaligned[i]); - encoder->private_->integer_signal_unaligned[i] = 0; - } -#ifndef FLAC__INTEGER_ONLY_LIBRARY - if(0 != encoder->private_->real_signal_unaligned[i]) { - free(encoder->private_->real_signal_unaligned[i]); - encoder->private_->real_signal_unaligned[i] = 0; - } -#endif - } - for(i = 0; i < 2; i++) { - if(0 != encoder->private_->integer_signal_mid_side_unaligned[i]) { - free(encoder->private_->integer_signal_mid_side_unaligned[i]); - encoder->private_->integer_signal_mid_side_unaligned[i] = 0; - } -#ifndef FLAC__INTEGER_ONLY_LIBRARY - if(0 != encoder->private_->real_signal_mid_side_unaligned[i]) { - free(encoder->private_->real_signal_mid_side_unaligned[i]); - encoder->private_->real_signal_mid_side_unaligned[i] = 0; - } -#endif - } -#ifndef FLAC__INTEGER_ONLY_LIBRARY - for(i = 0; i < encoder->protected_->num_apodizations; i++) { - if(0 != encoder->private_->window_unaligned[i]) { - free(encoder->private_->window_unaligned[i]); - encoder->private_->window_unaligned[i] = 0; - } - } - if(0 != encoder->private_->windowed_signal_unaligned) { - free(encoder->private_->windowed_signal_unaligned); - encoder->private_->windowed_signal_unaligned = 0; - } -#endif - for(channel = 0; channel < encoder->protected_->channels; channel++) { - for(i = 0; i < 2; i++) { - if(0 != encoder->private_->residual_workspace_unaligned[channel][i]) { - free(encoder->private_->residual_workspace_unaligned[channel][i]); - encoder->private_->residual_workspace_unaligned[channel][i] = 0; - } - } - } - for(channel = 0; channel < 2; channel++) { - for(i = 0; i < 2; i++) { - if(0 != encoder->private_->residual_workspace_mid_side_unaligned[channel][i]) { - free(encoder->private_->residual_workspace_mid_side_unaligned[channel][i]); - encoder->private_->residual_workspace_mid_side_unaligned[channel][i] = 0; - } - } - } - if(0 != encoder->private_->abs_residual_partition_sums_unaligned) { - free(encoder->private_->abs_residual_partition_sums_unaligned); - encoder->private_->abs_residual_partition_sums_unaligned = 0; - } - if(0 != encoder->private_->raw_bits_per_partition_unaligned) { - free(encoder->private_->raw_bits_per_partition_unaligned); - encoder->private_->raw_bits_per_partition_unaligned = 0; - } - if(encoder->protected_->verify) { - for(i = 0; i < encoder->protected_->channels; i++) { - if(0 != encoder->private_->verify.input_fifo.data[i]) { - free(encoder->private_->verify.input_fifo.data[i]); - encoder->private_->verify.input_fifo.data[i] = 0; - } - } - } - FLAC__bitwriter_free(encoder->private_->frame); -} - -FLAC__bool resize_buffers_(FLAC__StreamEncoder *encoder, unsigned new_blocksize) -{ - FLAC__bool ok; - unsigned i, channel; - - FLAC__ASSERT(new_blocksize > 0); - FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK); - FLAC__ASSERT(encoder->private_->current_sample_number == 0); - - /* To avoid excessive malloc'ing, we only grow the buffer; no shrinking. */ - if(new_blocksize <= encoder->private_->input_capacity) - return true; - - ok = true; - - /* WATCHOUT: FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32_mmx() and ..._intrin_sse2() - * require that the input arrays (in our case the integer signals) - * have a buffer of up to 3 zeroes in front (at negative indices) for - * alignment purposes; we use 4 in front to keep the data well-aligned. - */ - - for(i = 0; ok && i < encoder->protected_->channels; i++) { - ok = ok && FLAC__memory_alloc_aligned_int32_array(new_blocksize+4+OVERREAD_, &encoder->private_->integer_signal_unaligned[i], &encoder->private_->integer_signal[i]); - memset(encoder->private_->integer_signal[i], 0, sizeof(FLAC__int32)*4); - encoder->private_->integer_signal[i] += 4; -#ifndef FLAC__INTEGER_ONLY_LIBRARY -#if 0 /* @@@ currently unused */ - if(encoder->protected_->max_lpc_order > 0) - ok = ok && FLAC__memory_alloc_aligned_real_array(new_blocksize+OVERREAD_, &encoder->private_->real_signal_unaligned[i], &encoder->private_->real_signal[i]); -#endif -#endif - } - for(i = 0; ok && i < 2; i++) { - ok = ok && FLAC__memory_alloc_aligned_int32_array(new_blocksize+4+OVERREAD_, &encoder->private_->integer_signal_mid_side_unaligned[i], &encoder->private_->integer_signal_mid_side[i]); - memset(encoder->private_->integer_signal_mid_side[i], 0, sizeof(FLAC__int32)*4); - encoder->private_->integer_signal_mid_side[i] += 4; -#ifndef FLAC__INTEGER_ONLY_LIBRARY -#if 0 /* @@@ currently unused */ - if(encoder->protected_->max_lpc_order > 0) - ok = ok && FLAC__memory_alloc_aligned_real_array(new_blocksize+OVERREAD_, &encoder->private_->real_signal_mid_side_unaligned[i], &encoder->private_->real_signal_mid_side[i]); -#endif -#endif - } -#ifndef FLAC__INTEGER_ONLY_LIBRARY - if(ok && encoder->protected_->max_lpc_order > 0) { - for(i = 0; ok && i < encoder->protected_->num_apodizations; i++) - ok = ok && FLAC__memory_alloc_aligned_real_array(new_blocksize, &encoder->private_->window_unaligned[i], &encoder->private_->window[i]); - ok = ok && FLAC__memory_alloc_aligned_real_array(new_blocksize, &encoder->private_->windowed_signal_unaligned, &encoder->private_->windowed_signal); - } -#endif - for(channel = 0; ok && channel < encoder->protected_->channels; channel++) { - for(i = 0; ok && i < 2; i++) { - ok = ok && FLAC__memory_alloc_aligned_int32_array(new_blocksize, &encoder->private_->residual_workspace_unaligned[channel][i], &encoder->private_->residual_workspace[channel][i]); - } - } - for(channel = 0; ok && channel < 2; channel++) { - for(i = 0; ok && i < 2; i++) { - ok = ok && FLAC__memory_alloc_aligned_int32_array(new_blocksize, &encoder->private_->residual_workspace_mid_side_unaligned[channel][i], &encoder->private_->residual_workspace_mid_side[channel][i]); - } - } - /* the *2 is an approximation to the series 1 + 1/2 + 1/4 + ... that sums tree occupies in a flat array */ - /*@@@ new_blocksize*2 is too pessimistic, but to fix, we need smarter logic because a smaller new_blocksize can actually increase the # of partitions; would require moving this out into a separate function, then checking its capacity against the need of the current blocksize&min/max_partition_order (and maybe predictor order) */ - ok = ok && FLAC__memory_alloc_aligned_uint64_array(new_blocksize * 2, &encoder->private_->abs_residual_partition_sums_unaligned, &encoder->private_->abs_residual_partition_sums); - if(encoder->protected_->do_escape_coding) - ok = ok && FLAC__memory_alloc_aligned_unsigned_array(new_blocksize * 2, &encoder->private_->raw_bits_per_partition_unaligned, &encoder->private_->raw_bits_per_partition); - - /* now adjust the windows if the blocksize has changed */ -#ifndef FLAC__INTEGER_ONLY_LIBRARY - if(ok && new_blocksize != encoder->private_->input_capacity && encoder->protected_->max_lpc_order > 0) { - for(i = 0; ok && i < encoder->protected_->num_apodizations; i++) { - switch(encoder->protected_->apodizations[i].type) { - case FLAC__APODIZATION_BARTLETT: - FLAC__window_bartlett(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_BARTLETT_HANN: - FLAC__window_bartlett_hann(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_BLACKMAN: - FLAC__window_blackman(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_BLACKMAN_HARRIS_4TERM_92DB_SIDELOBE: - FLAC__window_blackman_harris_4term_92db_sidelobe(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_CONNES: - FLAC__window_connes(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_FLATTOP: - FLAC__window_flattop(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_GAUSS: - FLAC__window_gauss(encoder->private_->window[i], new_blocksize, encoder->protected_->apodizations[i].parameters.gauss.stddev); - break; - case FLAC__APODIZATION_HAMMING: - FLAC__window_hamming(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_HANN: - FLAC__window_hann(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_KAISER_BESSEL: - FLAC__window_kaiser_bessel(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_NUTTALL: - FLAC__window_nuttall(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_RECTANGLE: - FLAC__window_rectangle(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_TRIANGLE: - FLAC__window_triangle(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_TUKEY: - FLAC__window_tukey(encoder->private_->window[i], new_blocksize, encoder->protected_->apodizations[i].parameters.tukey.p); - break; - case FLAC__APODIZATION_PARTIAL_TUKEY: - FLAC__window_partial_tukey(encoder->private_->window[i], new_blocksize, encoder->protected_->apodizations[i].parameters.multiple_tukey.p, encoder->protected_->apodizations[i].parameters.multiple_tukey.start, encoder->protected_->apodizations[i].parameters.multiple_tukey.end); - break; - case FLAC__APODIZATION_PUNCHOUT_TUKEY: - FLAC__window_punchout_tukey(encoder->private_->window[i], new_blocksize, encoder->protected_->apodizations[i].parameters.multiple_tukey.p, encoder->protected_->apodizations[i].parameters.multiple_tukey.start, encoder->protected_->apodizations[i].parameters.multiple_tukey.end); - break; - case FLAC__APODIZATION_WELCH: - FLAC__window_welch(encoder->private_->window[i], new_blocksize); - break; - default: - FLAC__ASSERT(0); - /* double protection */ - FLAC__window_hann(encoder->private_->window[i], new_blocksize); - break; - } - } - } -#endif - - if(ok) - encoder->private_->input_capacity = new_blocksize; - else - encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; - - return ok; -} - -FLAC__bool write_bitbuffer_(FLAC__StreamEncoder *encoder, unsigned samples, FLAC__bool is_last_block) -{ - const FLAC__byte *buffer; - size_t bytes; - - FLAC__ASSERT(FLAC__bitwriter_is_byte_aligned(encoder->private_->frame)); - - if(!FLAC__bitwriter_get_buffer(encoder->private_->frame, &buffer, &bytes)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; - return false; - } - - if(encoder->protected_->verify) { - encoder->private_->verify.output.data = buffer; - encoder->private_->verify.output.bytes = bytes; - if(encoder->private_->verify.state_hint == ENCODER_IN_MAGIC) { - encoder->private_->verify.needs_magic_hack = true; - } - else { - if(!FLAC__stream_decoder_process_single(encoder->private_->verify.decoder)) { - FLAC__bitwriter_release_buffer(encoder->private_->frame); - FLAC__bitwriter_clear(encoder->private_->frame); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA) - encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR; - return false; - } - } - } - - if(write_frame_(encoder, buffer, bytes, samples, is_last_block) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { - FLAC__bitwriter_release_buffer(encoder->private_->frame); - FLAC__bitwriter_clear(encoder->private_->frame); - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return false; - } - - FLAC__bitwriter_release_buffer(encoder->private_->frame); - FLAC__bitwriter_clear(encoder->private_->frame); - - if(samples > 0) { - encoder->private_->streaminfo.data.stream_info.min_framesize = flac_min(bytes, encoder->private_->streaminfo.data.stream_info.min_framesize); - encoder->private_->streaminfo.data.stream_info.max_framesize = flac_max(bytes, encoder->private_->streaminfo.data.stream_info.max_framesize); - } - - return true; -} - -FLAC__StreamEncoderWriteStatus write_frame_(FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, FLAC__bool is_last_block) -{ - FLAC__StreamEncoderWriteStatus status; - FLAC__uint64 output_position = 0; - -#if FLAC__HAS_OGG == 0 - (void)is_last_block; -#endif - - /* FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED just means we didn't get the offset; no error */ - if(encoder->private_->tell_callback && encoder->private_->tell_callback(encoder, &output_position, encoder->private_->client_data) == FLAC__STREAM_ENCODER_TELL_STATUS_ERROR) { - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR; - } - - /* - * Watch for the STREAMINFO block and first SEEKTABLE block to go by and store their offsets. - */ - if(samples == 0) { - FLAC__MetadataType type = (buffer[0] & 0x7f); - if(type == FLAC__METADATA_TYPE_STREAMINFO) - encoder->protected_->streaminfo_offset = output_position; - else if(type == FLAC__METADATA_TYPE_SEEKTABLE && encoder->protected_->seektable_offset == 0) - encoder->protected_->seektable_offset = output_position; - } - - /* - * Mark the current seek point if hit (if audio_offset == 0 that - * means we're still writing metadata and haven't hit the first - * frame yet) - */ - if(0 != encoder->private_->seek_table && encoder->protected_->audio_offset > 0 && encoder->private_->seek_table->num_points > 0) { - const unsigned blocksize = FLAC__stream_encoder_get_blocksize(encoder); - const FLAC__uint64 frame_first_sample = encoder->private_->samples_written; - const FLAC__uint64 frame_last_sample = frame_first_sample + (FLAC__uint64)blocksize - 1; - FLAC__uint64 test_sample; - unsigned i; - for(i = encoder->private_->first_seekpoint_to_check; i < encoder->private_->seek_table->num_points; i++) { - test_sample = encoder->private_->seek_table->points[i].sample_number; - if(test_sample > frame_last_sample) { - break; - } - else if(test_sample >= frame_first_sample) { - encoder->private_->seek_table->points[i].sample_number = frame_first_sample; - encoder->private_->seek_table->points[i].stream_offset = output_position - encoder->protected_->audio_offset; - encoder->private_->seek_table->points[i].frame_samples = blocksize; - encoder->private_->first_seekpoint_to_check++; - /* DO NOT: "break;" and here's why: - * The seektable template may contain more than one target - * sample for any given frame; we will keep looping, generating - * duplicate seekpoints for them, and we'll clean it up later, - * just before writing the seektable back to the metadata. - */ - } - else { - encoder->private_->first_seekpoint_to_check++; - } - } - } - -#if FLAC__HAS_OGG - if(encoder->private_->is_ogg) { - status = FLAC__ogg_encoder_aspect_write_callback_wrapper( - &encoder->protected_->ogg_encoder_aspect, - buffer, - bytes, - samples, - encoder->private_->current_frame_number, - is_last_block, - (FLAC__OggEncoderAspectWriteCallbackProxy)encoder->private_->write_callback, - encoder, - encoder->private_->client_data - ); - } - else -#endif - status = encoder->private_->write_callback(encoder, buffer, bytes, samples, encoder->private_->current_frame_number, encoder->private_->client_data); - - if(status == FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { - encoder->private_->bytes_written += bytes; - encoder->private_->samples_written += samples; - /* we keep a high watermark on the number of frames written because - * when the encoder goes back to write metadata, 'current_frame' - * will drop back to 0. - */ - encoder->private_->frames_written = flac_max(encoder->private_->frames_written, encoder->private_->current_frame_number+1); - } - else - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - - return status; -} - -/* Gets called when the encoding process has finished so that we can update the STREAMINFO and SEEKTABLE blocks. */ -void update_metadata_(const FLAC__StreamEncoder *encoder) -{ - FLAC__byte b[flac_max(6u, FLAC__STREAM_METADATA_SEEKPOINT_LENGTH)]; - const FLAC__StreamMetadata *metadata = &encoder->private_->streaminfo; - const FLAC__uint64 samples = metadata->data.stream_info.total_samples; - const unsigned min_framesize = metadata->data.stream_info.min_framesize; - const unsigned max_framesize = metadata->data.stream_info.max_framesize; - const unsigned bps = metadata->data.stream_info.bits_per_sample; - FLAC__StreamEncoderSeekStatus seek_status; - - FLAC__ASSERT(metadata->type == FLAC__METADATA_TYPE_STREAMINFO); - - /* All this is based on intimate knowledge of the stream header - * layout, but a change to the header format that would break this - * would also break all streams encoded in the previous format. - */ - - /* - * Write MD5 signature - */ - { - const unsigned md5_offset = - FLAC__STREAM_METADATA_HEADER_LENGTH + - ( - FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN + - FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN - ) / 8; - - if((seek_status = encoder->private_->seek_callback(encoder, encoder->protected_->streaminfo_offset + md5_offset, encoder->private_->client_data)) != FLAC__STREAM_ENCODER_SEEK_STATUS_OK) { - if(seek_status == FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR) - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return; - } - if(encoder->private_->write_callback(encoder, metadata->data.stream_info.md5sum, 16, 0, 0, encoder->private_->client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return; - } - } - - /* - * Write total samples - */ - { - const unsigned total_samples_byte_offset = - FLAC__STREAM_METADATA_HEADER_LENGTH + - ( - FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN + - FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN - - 4 - ) / 8; - - b[0] = ((FLAC__byte)(bps-1) << 4) | (FLAC__byte)((samples >> 32) & 0x0F); - b[1] = (FLAC__byte)((samples >> 24) & 0xFF); - b[2] = (FLAC__byte)((samples >> 16) & 0xFF); - b[3] = (FLAC__byte)((samples >> 8) & 0xFF); - b[4] = (FLAC__byte)(samples & 0xFF); - if((seek_status = encoder->private_->seek_callback(encoder, encoder->protected_->streaminfo_offset + total_samples_byte_offset, encoder->private_->client_data)) != FLAC__STREAM_ENCODER_SEEK_STATUS_OK) { - if(seek_status == FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR) - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return; - } - if(encoder->private_->write_callback(encoder, b, 5, 0, 0, encoder->private_->client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return; - } - } - - /* - * Write min/max framesize - */ - { - const unsigned min_framesize_offset = - FLAC__STREAM_METADATA_HEADER_LENGTH + - ( - FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN - ) / 8; - - b[0] = (FLAC__byte)((min_framesize >> 16) & 0xFF); - b[1] = (FLAC__byte)((min_framesize >> 8) & 0xFF); - b[2] = (FLAC__byte)(min_framesize & 0xFF); - b[3] = (FLAC__byte)((max_framesize >> 16) & 0xFF); - b[4] = (FLAC__byte)((max_framesize >> 8) & 0xFF); - b[5] = (FLAC__byte)(max_framesize & 0xFF); - if((seek_status = encoder->private_->seek_callback(encoder, encoder->protected_->streaminfo_offset + min_framesize_offset, encoder->private_->client_data)) != FLAC__STREAM_ENCODER_SEEK_STATUS_OK) { - if(seek_status == FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR) - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return; - } - if(encoder->private_->write_callback(encoder, b, 6, 0, 0, encoder->private_->client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return; - } - } - - /* - * Write seektable - */ - if(0 != encoder->private_->seek_table && encoder->private_->seek_table->num_points > 0 && encoder->protected_->seektable_offset > 0) { - unsigned i; - - FLAC__format_seektable_sort(encoder->private_->seek_table); - - FLAC__ASSERT(FLAC__format_seektable_is_legal(encoder->private_->seek_table)); - - if((seek_status = encoder->private_->seek_callback(encoder, encoder->protected_->seektable_offset + FLAC__STREAM_METADATA_HEADER_LENGTH, encoder->private_->client_data)) != FLAC__STREAM_ENCODER_SEEK_STATUS_OK) { - if(seek_status == FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR) - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return; - } - - for(i = 0; i < encoder->private_->seek_table->num_points; i++) { - FLAC__uint64 xx; - unsigned x; - xx = encoder->private_->seek_table->points[i].sample_number; - b[7] = (FLAC__byte)xx; xx >>= 8; - b[6] = (FLAC__byte)xx; xx >>= 8; - b[5] = (FLAC__byte)xx; xx >>= 8; - b[4] = (FLAC__byte)xx; xx >>= 8; - b[3] = (FLAC__byte)xx; xx >>= 8; - b[2] = (FLAC__byte)xx; xx >>= 8; - b[1] = (FLAC__byte)xx; xx >>= 8; - b[0] = (FLAC__byte)xx; xx >>= 8; - xx = encoder->private_->seek_table->points[i].stream_offset; - b[15] = (FLAC__byte)xx; xx >>= 8; - b[14] = (FLAC__byte)xx; xx >>= 8; - b[13] = (FLAC__byte)xx; xx >>= 8; - b[12] = (FLAC__byte)xx; xx >>= 8; - b[11] = (FLAC__byte)xx; xx >>= 8; - b[10] = (FLAC__byte)xx; xx >>= 8; - b[9] = (FLAC__byte)xx; xx >>= 8; - b[8] = (FLAC__byte)xx; xx >>= 8; - x = encoder->private_->seek_table->points[i].frame_samples; - b[17] = (FLAC__byte)x; x >>= 8; - b[16] = (FLAC__byte)x; x >>= 8; - if(encoder->private_->write_callback(encoder, b, 18, 0, 0, encoder->private_->client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return; - } - } - } -} - -#if FLAC__HAS_OGG -/* Gets called when the encoding process has finished so that we can update the STREAMINFO and SEEKTABLE blocks. */ -void update_ogg_metadata_(FLAC__StreamEncoder *encoder) -{ - /* the # of bytes in the 1st packet that precede the STREAMINFO */ - static const unsigned FIRST_OGG_PACKET_STREAMINFO_PREFIX_LENGTH = - FLAC__OGG_MAPPING_PACKET_TYPE_LENGTH + - FLAC__OGG_MAPPING_MAGIC_LENGTH + - FLAC__OGG_MAPPING_VERSION_MAJOR_LENGTH + - FLAC__OGG_MAPPING_VERSION_MINOR_LENGTH + - FLAC__OGG_MAPPING_NUM_HEADERS_LENGTH + - FLAC__STREAM_SYNC_LENGTH - ; - FLAC__byte b[flac_max(6u, FLAC__STREAM_METADATA_SEEKPOINT_LENGTH)]; - const FLAC__StreamMetadata *metadata = &encoder->private_->streaminfo; - const FLAC__uint64 samples = metadata->data.stream_info.total_samples; - const unsigned min_framesize = metadata->data.stream_info.min_framesize; - const unsigned max_framesize = metadata->data.stream_info.max_framesize; - ogg_page page; - - FLAC__ASSERT(metadata->type == FLAC__METADATA_TYPE_STREAMINFO); - FLAC__ASSERT(0 != encoder->private_->seek_callback); - - /* Pre-check that client supports seeking, since we don't want the - * ogg_helper code to ever have to deal with this condition. - */ - if(encoder->private_->seek_callback(encoder, 0, encoder->private_->client_data) == FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED) - return; - - /* All this is based on intimate knowledge of the stream header - * layout, but a change to the header format that would break this - * would also break all streams encoded in the previous format. - */ - - /** - ** Write STREAMINFO stats - **/ - simple_ogg_page__init(&page); - if(!simple_ogg_page__get_at(encoder, encoder->protected_->streaminfo_offset, &page, encoder->private_->seek_callback, encoder->private_->read_callback, encoder->private_->client_data)) { - simple_ogg_page__clear(&page); - return; /* state already set */ - } - - /* - * Write MD5 signature - */ - { - const unsigned md5_offset = - FIRST_OGG_PACKET_STREAMINFO_PREFIX_LENGTH + - FLAC__STREAM_METADATA_HEADER_LENGTH + - ( - FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN + - FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN - ) / 8; - - if(md5_offset + 16 > (unsigned)page.body_len) { - encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR; - simple_ogg_page__clear(&page); - return; - } - memcpy(page.body + md5_offset, metadata->data.stream_info.md5sum, 16); - } - - /* - * Write total samples - */ - { - const unsigned total_samples_byte_offset = - FIRST_OGG_PACKET_STREAMINFO_PREFIX_LENGTH + - FLAC__STREAM_METADATA_HEADER_LENGTH + - ( - FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN + - FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN - - 4 - ) / 8; - - if(total_samples_byte_offset + 5 > (unsigned)page.body_len) { - encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR; - simple_ogg_page__clear(&page); - return; - } - b[0] = (FLAC__byte)page.body[total_samples_byte_offset] & 0xF0; - b[0] |= (FLAC__byte)((samples >> 32) & 0x0F); - b[1] = (FLAC__byte)((samples >> 24) & 0xFF); - b[2] = (FLAC__byte)((samples >> 16) & 0xFF); - b[3] = (FLAC__byte)((samples >> 8) & 0xFF); - b[4] = (FLAC__byte)(samples & 0xFF); - memcpy(page.body + total_samples_byte_offset, b, 5); - } - - /* - * Write min/max framesize - */ - { - const unsigned min_framesize_offset = - FIRST_OGG_PACKET_STREAMINFO_PREFIX_LENGTH + - FLAC__STREAM_METADATA_HEADER_LENGTH + - ( - FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN - ) / 8; - - if(min_framesize_offset + 6 > (unsigned)page.body_len) { - encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR; - simple_ogg_page__clear(&page); - return; - } - b[0] = (FLAC__byte)((min_framesize >> 16) & 0xFF); - b[1] = (FLAC__byte)((min_framesize >> 8) & 0xFF); - b[2] = (FLAC__byte)(min_framesize & 0xFF); - b[3] = (FLAC__byte)((max_framesize >> 16) & 0xFF); - b[4] = (FLAC__byte)((max_framesize >> 8) & 0xFF); - b[5] = (FLAC__byte)(max_framesize & 0xFF); - memcpy(page.body + min_framesize_offset, b, 6); - } - if(!simple_ogg_page__set_at(encoder, encoder->protected_->streaminfo_offset, &page, encoder->private_->seek_callback, encoder->private_->write_callback, encoder->private_->client_data)) { - simple_ogg_page__clear(&page); - return; /* state already set */ - } - simple_ogg_page__clear(&page); - - /* - * Write seektable - */ - if(0 != encoder->private_->seek_table && encoder->private_->seek_table->num_points > 0 && encoder->protected_->seektable_offset > 0) { - unsigned i; - FLAC__byte *p; - - FLAC__format_seektable_sort(encoder->private_->seek_table); - - FLAC__ASSERT(FLAC__format_seektable_is_legal(encoder->private_->seek_table)); - - simple_ogg_page__init(&page); - if(!simple_ogg_page__get_at(encoder, encoder->protected_->seektable_offset, &page, encoder->private_->seek_callback, encoder->private_->read_callback, encoder->private_->client_data)) { - simple_ogg_page__clear(&page); - return; /* state already set */ - } - - if((FLAC__STREAM_METADATA_HEADER_LENGTH + 18*encoder->private_->seek_table->num_points) != (unsigned)page.body_len) { - encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR; - simple_ogg_page__clear(&page); - return; - } - - for(i = 0, p = page.body + FLAC__STREAM_METADATA_HEADER_LENGTH; i < encoder->private_->seek_table->num_points; i++, p += 18) { - FLAC__uint64 xx; - unsigned x; - xx = encoder->private_->seek_table->points[i].sample_number; - b[7] = (FLAC__byte)xx; xx >>= 8; - b[6] = (FLAC__byte)xx; xx >>= 8; - b[5] = (FLAC__byte)xx; xx >>= 8; - b[4] = (FLAC__byte)xx; xx >>= 8; - b[3] = (FLAC__byte)xx; xx >>= 8; - b[2] = (FLAC__byte)xx; xx >>= 8; - b[1] = (FLAC__byte)xx; xx >>= 8; - b[0] = (FLAC__byte)xx; xx >>= 8; - xx = encoder->private_->seek_table->points[i].stream_offset; - b[15] = (FLAC__byte)xx; xx >>= 8; - b[14] = (FLAC__byte)xx; xx >>= 8; - b[13] = (FLAC__byte)xx; xx >>= 8; - b[12] = (FLAC__byte)xx; xx >>= 8; - b[11] = (FLAC__byte)xx; xx >>= 8; - b[10] = (FLAC__byte)xx; xx >>= 8; - b[9] = (FLAC__byte)xx; xx >>= 8; - b[8] = (FLAC__byte)xx; xx >>= 8; - x = encoder->private_->seek_table->points[i].frame_samples; - b[17] = (FLAC__byte)x; x >>= 8; - b[16] = (FLAC__byte)x; x >>= 8; - memcpy(p, b, 18); - } - - if(!simple_ogg_page__set_at(encoder, encoder->protected_->seektable_offset, &page, encoder->private_->seek_callback, encoder->private_->write_callback, encoder->private_->client_data)) { - simple_ogg_page__clear(&page); - return; /* state already set */ - } - simple_ogg_page__clear(&page); - } -} -#endif - -FLAC__bool process_frame_(FLAC__StreamEncoder *encoder, FLAC__bool is_fractional_block, FLAC__bool is_last_block) -{ - FLAC__uint16 crc; - FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK); - - /* - * Accumulate raw signal to the MD5 signature - */ - if(encoder->protected_->do_md5 && !FLAC__MD5Accumulate(&encoder->private_->md5context, (const FLAC__int32 * const *)encoder->private_->integer_signal, encoder->protected_->channels, encoder->protected_->blocksize, (encoder->protected_->bits_per_sample+7) / 8)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; - return false; - } - - /* - * Process the frame header and subframes into the frame bitbuffer - */ - if(!process_subframes_(encoder, is_fractional_block)) { - /* the above function sets the state for us in case of an error */ - return false; - } - - /* - * Zero-pad the frame to a byte_boundary - */ - if(!FLAC__bitwriter_zero_pad_to_byte_boundary(encoder->private_->frame)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; - return false; - } - - /* - * CRC-16 the whole thing - */ - FLAC__ASSERT(FLAC__bitwriter_is_byte_aligned(encoder->private_->frame)); - if( - !FLAC__bitwriter_get_write_crc16(encoder->private_->frame, &crc) || - !FLAC__bitwriter_write_raw_uint32(encoder->private_->frame, crc, FLAC__FRAME_FOOTER_CRC_LEN) - ) { - encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; - return false; - } - - /* - * Write it - */ - if(!write_bitbuffer_(encoder, encoder->protected_->blocksize, is_last_block)) { - /* the above function sets the state for us in case of an error */ - return false; - } - - /* - * Get ready for the next frame - */ - encoder->private_->current_sample_number = 0; - encoder->private_->current_frame_number++; - encoder->private_->streaminfo.data.stream_info.total_samples += (FLAC__uint64)encoder->protected_->blocksize; - - return true; -} - -FLAC__bool process_subframes_(FLAC__StreamEncoder *encoder, FLAC__bool is_fractional_block) -{ - FLAC__FrameHeader frame_header; - unsigned channel, min_partition_order = encoder->protected_->min_residual_partition_order, max_partition_order; - FLAC__bool do_independent, do_mid_side; - - /* - * Calculate the min,max Rice partition orders - */ - if(is_fractional_block) { - max_partition_order = 0; - } - else { - max_partition_order = FLAC__format_get_max_rice_partition_order_from_blocksize(encoder->protected_->blocksize); - max_partition_order = flac_min(max_partition_order, encoder->protected_->max_residual_partition_order); - } - min_partition_order = flac_min(min_partition_order, max_partition_order); - - /* - * Setup the frame - */ - frame_header.blocksize = encoder->protected_->blocksize; - frame_header.sample_rate = encoder->protected_->sample_rate; - frame_header.channels = encoder->protected_->channels; - frame_header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT; /* the default unless the encoder determines otherwise */ - frame_header.bits_per_sample = encoder->protected_->bits_per_sample; - frame_header.number_type = FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER; - frame_header.number.frame_number = encoder->private_->current_frame_number; - - /* - * Figure out what channel assignments to try - */ - if(encoder->protected_->do_mid_side_stereo) { - if(encoder->protected_->loose_mid_side_stereo) { - if(encoder->private_->loose_mid_side_stereo_frame_count == 0) { - do_independent = true; - do_mid_side = true; - } - else { - do_independent = (encoder->private_->last_channel_assignment == FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT); - do_mid_side = !do_independent; - } - } - else { - do_independent = true; - do_mid_side = true; - } - } - else { - do_independent = true; - do_mid_side = false; - } - - FLAC__ASSERT(do_independent || do_mid_side); - - /* - * Check for wasted bits; set effective bps for each subframe - */ - if(do_independent) { - for(channel = 0; channel < encoder->protected_->channels; channel++) { - const unsigned w = get_wasted_bits_(encoder->private_->integer_signal[channel], encoder->protected_->blocksize); - encoder->private_->subframe_workspace[channel][0].wasted_bits = encoder->private_->subframe_workspace[channel][1].wasted_bits = w; - encoder->private_->subframe_bps[channel] = encoder->protected_->bits_per_sample - w; - } - } - if(do_mid_side) { - FLAC__ASSERT(encoder->protected_->channels == 2); - for(channel = 0; channel < 2; channel++) { - const unsigned w = get_wasted_bits_(encoder->private_->integer_signal_mid_side[channel], encoder->protected_->blocksize); - encoder->private_->subframe_workspace_mid_side[channel][0].wasted_bits = encoder->private_->subframe_workspace_mid_side[channel][1].wasted_bits = w; - encoder->private_->subframe_bps_mid_side[channel] = encoder->protected_->bits_per_sample - w + (channel==0? 0:1); - } - } - - /* - * First do a normal encoding pass of each independent channel - */ - if(do_independent) { - for(channel = 0; channel < encoder->protected_->channels; channel++) { - if(! - process_subframe_( - encoder, - min_partition_order, - max_partition_order, - &frame_header, - encoder->private_->subframe_bps[channel], - encoder->private_->integer_signal[channel], - encoder->private_->subframe_workspace_ptr[channel], - encoder->private_->partitioned_rice_contents_workspace_ptr[channel], - encoder->private_->residual_workspace[channel], - encoder->private_->best_subframe+channel, - encoder->private_->best_subframe_bits+channel - ) - ) - return false; - } - } - - /* - * Now do mid and side channels if requested - */ - if(do_mid_side) { - FLAC__ASSERT(encoder->protected_->channels == 2); - - for(channel = 0; channel < 2; channel++) { - if(! - process_subframe_( - encoder, - min_partition_order, - max_partition_order, - &frame_header, - encoder->private_->subframe_bps_mid_side[channel], - encoder->private_->integer_signal_mid_side[channel], - encoder->private_->subframe_workspace_ptr_mid_side[channel], - encoder->private_->partitioned_rice_contents_workspace_ptr_mid_side[channel], - encoder->private_->residual_workspace_mid_side[channel], - encoder->private_->best_subframe_mid_side+channel, - encoder->private_->best_subframe_bits_mid_side+channel - ) - ) - return false; - } - } - - /* - * Compose the frame bitbuffer - */ - if(do_mid_side) { - unsigned left_bps = 0, right_bps = 0; /* initialized only to prevent superfluous compiler warning */ - FLAC__Subframe *left_subframe = 0, *right_subframe = 0; /* initialized only to prevent superfluous compiler warning */ - FLAC__ChannelAssignment channel_assignment; - - FLAC__ASSERT(encoder->protected_->channels == 2); - - if(encoder->protected_->loose_mid_side_stereo && encoder->private_->loose_mid_side_stereo_frame_count > 0) { - channel_assignment = (encoder->private_->last_channel_assignment == FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT? FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT : FLAC__CHANNEL_ASSIGNMENT_MID_SIDE); - } - else { - unsigned bits[4]; /* WATCHOUT - indexed by FLAC__ChannelAssignment */ - unsigned min_bits; - int ca; - - FLAC__ASSERT(FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT == 0); - FLAC__ASSERT(FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE == 1); - FLAC__ASSERT(FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE == 2); - FLAC__ASSERT(FLAC__CHANNEL_ASSIGNMENT_MID_SIDE == 3); - FLAC__ASSERT(do_independent && do_mid_side); - - /* We have to figure out which channel assignent results in the smallest frame */ - bits[FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT] = encoder->private_->best_subframe_bits [0] + encoder->private_->best_subframe_bits [1]; - bits[FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE ] = encoder->private_->best_subframe_bits [0] + encoder->private_->best_subframe_bits_mid_side[1]; - bits[FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE ] = encoder->private_->best_subframe_bits [1] + encoder->private_->best_subframe_bits_mid_side[1]; - bits[FLAC__CHANNEL_ASSIGNMENT_MID_SIDE ] = encoder->private_->best_subframe_bits_mid_side[0] + encoder->private_->best_subframe_bits_mid_side[1]; - - channel_assignment = FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT; - min_bits = bits[channel_assignment]; - for(ca = 1; ca <= 3; ca++) { - if(bits[ca] < min_bits) { - min_bits = bits[ca]; - channel_assignment = (FLAC__ChannelAssignment)ca; - } - } - } - - frame_header.channel_assignment = channel_assignment; - - if(!FLAC__frame_add_header(&frame_header, encoder->private_->frame)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; - return false; - } - - switch(channel_assignment) { - case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT: - left_subframe = &encoder->private_->subframe_workspace [0][encoder->private_->best_subframe [0]]; - right_subframe = &encoder->private_->subframe_workspace [1][encoder->private_->best_subframe [1]]; - break; - case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE: - left_subframe = &encoder->private_->subframe_workspace [0][encoder->private_->best_subframe [0]]; - right_subframe = &encoder->private_->subframe_workspace_mid_side[1][encoder->private_->best_subframe_mid_side[1]]; - break; - case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE: - left_subframe = &encoder->private_->subframe_workspace_mid_side[1][encoder->private_->best_subframe_mid_side[1]]; - right_subframe = &encoder->private_->subframe_workspace [1][encoder->private_->best_subframe [1]]; - break; - case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE: - left_subframe = &encoder->private_->subframe_workspace_mid_side[0][encoder->private_->best_subframe_mid_side[0]]; - right_subframe = &encoder->private_->subframe_workspace_mid_side[1][encoder->private_->best_subframe_mid_side[1]]; - break; - default: - FLAC__ASSERT(0); - } - - switch(channel_assignment) { - case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT: - left_bps = encoder->private_->subframe_bps [0]; - right_bps = encoder->private_->subframe_bps [1]; - break; - case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE: - left_bps = encoder->private_->subframe_bps [0]; - right_bps = encoder->private_->subframe_bps_mid_side[1]; - break; - case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE: - left_bps = encoder->private_->subframe_bps_mid_side[1]; - right_bps = encoder->private_->subframe_bps [1]; - break; - case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE: - left_bps = encoder->private_->subframe_bps_mid_side[0]; - right_bps = encoder->private_->subframe_bps_mid_side[1]; - break; - default: - FLAC__ASSERT(0); - } - - /* note that encoder_add_subframe_ sets the state for us in case of an error */ - if(!add_subframe_(encoder, frame_header.blocksize, left_bps , left_subframe , encoder->private_->frame)) - return false; - if(!add_subframe_(encoder, frame_header.blocksize, right_bps, right_subframe, encoder->private_->frame)) - return false; - } - else { - if(!FLAC__frame_add_header(&frame_header, encoder->private_->frame)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; - return false; - } - - for(channel = 0; channel < encoder->protected_->channels; channel++) { - if(!add_subframe_(encoder, frame_header.blocksize, encoder->private_->subframe_bps[channel], &encoder->private_->subframe_workspace[channel][encoder->private_->best_subframe[channel]], encoder->private_->frame)) { - /* the above function sets the state for us in case of an error */ - return false; - } - } - } - - if(encoder->protected_->loose_mid_side_stereo) { - encoder->private_->loose_mid_side_stereo_frame_count++; - if(encoder->private_->loose_mid_side_stereo_frame_count >= encoder->private_->loose_mid_side_stereo_frames) - encoder->private_->loose_mid_side_stereo_frame_count = 0; - } - - encoder->private_->last_channel_assignment = frame_header.channel_assignment; - - return true; -} - -FLAC__bool process_subframe_( - FLAC__StreamEncoder *encoder, - unsigned min_partition_order, - unsigned max_partition_order, - const FLAC__FrameHeader *frame_header, - unsigned subframe_bps, - const FLAC__int32 integer_signal[], - FLAC__Subframe *subframe[2], - FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents[2], - FLAC__int32 *residual[2], - unsigned *best_subframe, - unsigned *best_bits -) -{ -#ifndef FLAC__INTEGER_ONLY_LIBRARY - FLAC__float fixed_residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]; -#else - FLAC__fixedpoint fixed_residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]; -#endif -#ifndef FLAC__INTEGER_ONLY_LIBRARY - FLAC__double lpc_residual_bits_per_sample; - FLAC__real autoc[FLAC__MAX_LPC_ORDER+1]; /* WATCHOUT: the size is important even though encoder->protected_->max_lpc_order might be less; some asm and x86 intrinsic routines need all the space */ - FLAC__double lpc_error[FLAC__MAX_LPC_ORDER]; - unsigned min_lpc_order, max_lpc_order, lpc_order; - unsigned min_qlp_coeff_precision, max_qlp_coeff_precision, qlp_coeff_precision; -#endif - unsigned min_fixed_order, max_fixed_order, guess_fixed_order, fixed_order; - unsigned rice_parameter; - unsigned _candidate_bits, _best_bits; - unsigned _best_subframe; - /* only use RICE2 partitions if stream bps > 16 */ - const unsigned rice_parameter_limit = FLAC__stream_encoder_get_bits_per_sample(encoder) > 16? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER; - - FLAC__ASSERT(frame_header->blocksize > 0); - - /* verbatim subframe is the baseline against which we measure other compressed subframes */ - _best_subframe = 0; - if(encoder->private_->disable_verbatim_subframes && frame_header->blocksize >= FLAC__MAX_FIXED_ORDER) - _best_bits = UINT_MAX; - else - _best_bits = evaluate_verbatim_subframe_(encoder, integer_signal, frame_header->blocksize, subframe_bps, subframe[_best_subframe]); - - if(frame_header->blocksize >= FLAC__MAX_FIXED_ORDER) { - unsigned signal_is_constant = false; - guess_fixed_order = encoder->private_->local_fixed_compute_best_predictor(integer_signal+FLAC__MAX_FIXED_ORDER, frame_header->blocksize-FLAC__MAX_FIXED_ORDER, fixed_residual_bits_per_sample); - /* check for constant subframe */ - if( - !encoder->private_->disable_constant_subframes && -#ifndef FLAC__INTEGER_ONLY_LIBRARY - fixed_residual_bits_per_sample[1] == 0.0 -#else - fixed_residual_bits_per_sample[1] == FLAC__FP_ZERO -#endif - ) { - /* the above means it's possible all samples are the same value; now double-check it: */ - unsigned i; - signal_is_constant = true; - for(i = 1; i < frame_header->blocksize; i++) { - if(integer_signal[0] != integer_signal[i]) { - signal_is_constant = false; - break; - } - } - } - if(signal_is_constant) { - _candidate_bits = evaluate_constant_subframe_(encoder, integer_signal[0], frame_header->blocksize, subframe_bps, subframe[!_best_subframe]); - if(_candidate_bits < _best_bits) { - _best_subframe = !_best_subframe; - _best_bits = _candidate_bits; - } - } - else { - if(!encoder->private_->disable_fixed_subframes || (encoder->protected_->max_lpc_order == 0 && _best_bits == UINT_MAX)) { - /* encode fixed */ - if(encoder->protected_->do_exhaustive_model_search) { - min_fixed_order = 0; - max_fixed_order = FLAC__MAX_FIXED_ORDER; - } - else { - min_fixed_order = max_fixed_order = guess_fixed_order; - } - if(max_fixed_order >= frame_header->blocksize) - max_fixed_order = frame_header->blocksize - 1; - for(fixed_order = min_fixed_order; fixed_order <= max_fixed_order; fixed_order++) { -#ifndef FLAC__INTEGER_ONLY_LIBRARY - if(fixed_residual_bits_per_sample[fixed_order] >= (FLAC__float)subframe_bps) - continue; /* don't even try */ - rice_parameter = (fixed_residual_bits_per_sample[fixed_order] > 0.0)? (unsigned)(fixed_residual_bits_per_sample[fixed_order]+0.5) : 0; /* 0.5 is for rounding */ -#else - if(FLAC__fixedpoint_trunc(fixed_residual_bits_per_sample[fixed_order]) >= (int)subframe_bps) - continue; /* don't even try */ - rice_parameter = (fixed_residual_bits_per_sample[fixed_order] > FLAC__FP_ZERO)? (unsigned)FLAC__fixedpoint_trunc(fixed_residual_bits_per_sample[fixed_order]+FLAC__FP_ONE_HALF) : 0; /* 0.5 is for rounding */ -#endif - rice_parameter++; /* to account for the signed->unsigned conversion during rice coding */ - if(rice_parameter >= rice_parameter_limit) { -#ifdef DEBUG_VERBOSE - fprintf(stderr, "clipping rice_parameter (%u -> %u) @0\n", rice_parameter, rice_parameter_limit - 1); -#endif - rice_parameter = rice_parameter_limit - 1; - } - _candidate_bits = - evaluate_fixed_subframe_( - encoder, - integer_signal, - residual[!_best_subframe], - encoder->private_->abs_residual_partition_sums, - encoder->private_->raw_bits_per_partition, - frame_header->blocksize, - subframe_bps, - fixed_order, - rice_parameter, - rice_parameter_limit, - min_partition_order, - max_partition_order, - encoder->protected_->do_escape_coding, - encoder->protected_->rice_parameter_search_dist, - subframe[!_best_subframe], - partitioned_rice_contents[!_best_subframe] - ); - if(_candidate_bits < _best_bits) { - _best_subframe = !_best_subframe; - _best_bits = _candidate_bits; - } - } - } - -#ifndef FLAC__INTEGER_ONLY_LIBRARY - /* encode lpc */ - if(encoder->protected_->max_lpc_order > 0) { - if(encoder->protected_->max_lpc_order >= frame_header->blocksize) - max_lpc_order = frame_header->blocksize-1; - else - max_lpc_order = encoder->protected_->max_lpc_order; - if(max_lpc_order > 0) { - unsigned a; - for (a = 0; a < encoder->protected_->num_apodizations; a++) { - FLAC__lpc_window_data(integer_signal, encoder->private_->window[a], encoder->private_->windowed_signal, frame_header->blocksize); - encoder->private_->local_lpc_compute_autocorrelation(encoder->private_->windowed_signal, frame_header->blocksize, max_lpc_order+1, autoc); - /* if autoc[0] == 0.0, the signal is constant and we usually won't get here, but it can happen */ - if(autoc[0] != 0.0) { - FLAC__lpc_compute_lp_coefficients(autoc, &max_lpc_order, encoder->private_->lp_coeff, lpc_error); - if(encoder->protected_->do_exhaustive_model_search) { - min_lpc_order = 1; - } - else { - const unsigned guess_lpc_order = - FLAC__lpc_compute_best_order( - lpc_error, - max_lpc_order, - frame_header->blocksize, - subframe_bps + ( - encoder->protected_->do_qlp_coeff_prec_search? - FLAC__MIN_QLP_COEFF_PRECISION : /* have to guess; use the min possible size to avoid accidentally favoring lower orders */ - encoder->protected_->qlp_coeff_precision - ) - ); - min_lpc_order = max_lpc_order = guess_lpc_order; - } - if(max_lpc_order >= frame_header->blocksize) - max_lpc_order = frame_header->blocksize - 1; - for(lpc_order = min_lpc_order; lpc_order <= max_lpc_order; lpc_order++) { - lpc_residual_bits_per_sample = FLAC__lpc_compute_expected_bits_per_residual_sample(lpc_error[lpc_order-1], frame_header->blocksize-lpc_order); - if(lpc_residual_bits_per_sample >= (FLAC__double)subframe_bps) - continue; /* don't even try */ - rice_parameter = (lpc_residual_bits_per_sample > 0.0)? (unsigned)(lpc_residual_bits_per_sample+0.5) : 0; /* 0.5 is for rounding */ - rice_parameter++; /* to account for the signed->unsigned conversion during rice coding */ - if(rice_parameter >= rice_parameter_limit) { -#ifdef DEBUG_VERBOSE - fprintf(stderr, "clipping rice_parameter (%u -> %u) @1\n", rice_parameter, rice_parameter_limit - 1); -#endif - rice_parameter = rice_parameter_limit - 1; - } - if(encoder->protected_->do_qlp_coeff_prec_search) { - min_qlp_coeff_precision = FLAC__MIN_QLP_COEFF_PRECISION; - /* try to keep qlp coeff precision such that only 32-bit math is required for decode of <=16bps streams */ - if(subframe_bps <= 16) { - max_qlp_coeff_precision = flac_min(32 - subframe_bps - FLAC__bitmath_ilog2(lpc_order), FLAC__MAX_QLP_COEFF_PRECISION); - max_qlp_coeff_precision = flac_max(max_qlp_coeff_precision, min_qlp_coeff_precision); - } - else - max_qlp_coeff_precision = FLAC__MAX_QLP_COEFF_PRECISION; - } - else { - min_qlp_coeff_precision = max_qlp_coeff_precision = encoder->protected_->qlp_coeff_precision; - } - for(qlp_coeff_precision = min_qlp_coeff_precision; qlp_coeff_precision <= max_qlp_coeff_precision; qlp_coeff_precision++) { - _candidate_bits = - evaluate_lpc_subframe_( - encoder, - integer_signal, - residual[!_best_subframe], - encoder->private_->abs_residual_partition_sums, - encoder->private_->raw_bits_per_partition, - encoder->private_->lp_coeff[lpc_order-1], - frame_header->blocksize, - subframe_bps, - lpc_order, - qlp_coeff_precision, - rice_parameter, - rice_parameter_limit, - min_partition_order, - max_partition_order, - encoder->protected_->do_escape_coding, - encoder->protected_->rice_parameter_search_dist, - subframe[!_best_subframe], - partitioned_rice_contents[!_best_subframe] - ); - if(_candidate_bits > 0) { /* if == 0, there was a problem quantizing the lpcoeffs */ - if(_candidate_bits < _best_bits) { - _best_subframe = !_best_subframe; - _best_bits = _candidate_bits; - } - } - } - } - } - } - } - } -#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ - } - } - - /* under rare circumstances this can happen when all but lpc subframe types are disabled: */ - if(_best_bits == UINT_MAX) { - FLAC__ASSERT(_best_subframe == 0); - _best_bits = evaluate_verbatim_subframe_(encoder, integer_signal, frame_header->blocksize, subframe_bps, subframe[_best_subframe]); - } - - *best_subframe = _best_subframe; - *best_bits = _best_bits; - - return true; -} - -FLAC__bool add_subframe_( - FLAC__StreamEncoder *encoder, - unsigned blocksize, - unsigned subframe_bps, - const FLAC__Subframe *subframe, - FLAC__BitWriter *frame -) -{ - switch(subframe->type) { - case FLAC__SUBFRAME_TYPE_CONSTANT: - if(!FLAC__subframe_add_constant(&(subframe->data.constant), subframe_bps, subframe->wasted_bits, frame)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; - return false; - } - break; - case FLAC__SUBFRAME_TYPE_FIXED: - if(!FLAC__subframe_add_fixed(&(subframe->data.fixed), blocksize - subframe->data.fixed.order, subframe_bps, subframe->wasted_bits, frame)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; - return false; - } - break; - case FLAC__SUBFRAME_TYPE_LPC: - if(!FLAC__subframe_add_lpc(&(subframe->data.lpc), blocksize - subframe->data.lpc.order, subframe_bps, subframe->wasted_bits, frame)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; - return false; - } - break; - case FLAC__SUBFRAME_TYPE_VERBATIM: - if(!FLAC__subframe_add_verbatim(&(subframe->data.verbatim), blocksize, subframe_bps, subframe->wasted_bits, frame)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; - return false; - } - break; - default: - FLAC__ASSERT(0); - } - - return true; -} - -#define SPOTCHECK_ESTIMATE 0 -#if SPOTCHECK_ESTIMATE -static void spotcheck_subframe_estimate_( - FLAC__StreamEncoder *encoder, - unsigned blocksize, - unsigned subframe_bps, - const FLAC__Subframe *subframe, - unsigned estimate -) -{ - FLAC__bool ret; - FLAC__BitWriter *frame = FLAC__bitwriter_new(); - if(frame == 0) { - fprintf(stderr, "EST: can't allocate frame\n"); - return; - } - if(!FLAC__bitwriter_init(frame)) { - fprintf(stderr, "EST: can't init frame\n"); - return; - } - ret = add_subframe_(encoder, blocksize, subframe_bps, subframe, frame); - FLAC__ASSERT(ret); - { - const unsigned actual = FLAC__bitwriter_get_input_bits_unconsumed(frame); - if(estimate != actual) - fprintf(stderr, "EST: bad, frame#%u sub#%%d type=%8s est=%u, actual=%u, delta=%d\n", encoder->private_->current_frame_number, FLAC__SubframeTypeString[subframe->type], estimate, actual, (int)actual-(int)estimate); - } - FLAC__bitwriter_delete(frame); -} -#endif - -unsigned evaluate_constant_subframe_( - FLAC__StreamEncoder *encoder, - const FLAC__int32 signal, - unsigned blocksize, - unsigned subframe_bps, - FLAC__Subframe *subframe -) -{ - unsigned estimate; - subframe->type = FLAC__SUBFRAME_TYPE_CONSTANT; - subframe->data.constant.value = signal; - - estimate = FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN + subframe->wasted_bits + subframe_bps; - -#if SPOTCHECK_ESTIMATE - spotcheck_subframe_estimate_(encoder, blocksize, subframe_bps, subframe, estimate); -#else - (void)encoder, (void)blocksize; -#endif - - return estimate; -} - -unsigned evaluate_fixed_subframe_( - FLAC__StreamEncoder *encoder, - const FLAC__int32 signal[], - FLAC__int32 residual[], - FLAC__uint64 abs_residual_partition_sums[], - unsigned raw_bits_per_partition[], - unsigned blocksize, - unsigned subframe_bps, - unsigned order, - unsigned rice_parameter, - unsigned rice_parameter_limit, - unsigned min_partition_order, - unsigned max_partition_order, - FLAC__bool do_escape_coding, - unsigned rice_parameter_search_dist, - FLAC__Subframe *subframe, - FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents -) -{ - unsigned i, residual_bits, estimate; - const unsigned residual_samples = blocksize - order; - - FLAC__fixed_compute_residual(signal+order, residual_samples, order, residual); - - subframe->type = FLAC__SUBFRAME_TYPE_FIXED; - - subframe->data.fixed.entropy_coding_method.type = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE; - subframe->data.fixed.entropy_coding_method.data.partitioned_rice.contents = partitioned_rice_contents; - subframe->data.fixed.residual = residual; - - residual_bits = - find_best_partition_order_( - encoder->private_, - residual, - abs_residual_partition_sums, - raw_bits_per_partition, - residual_samples, - order, - rice_parameter, - rice_parameter_limit, - min_partition_order, - max_partition_order, - subframe_bps, - do_escape_coding, - rice_parameter_search_dist, - &subframe->data.fixed.entropy_coding_method - ); - - subframe->data.fixed.order = order; - for(i = 0; i < order; i++) - subframe->data.fixed.warmup[i] = signal[i]; - - estimate = FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN + subframe->wasted_bits + (order * subframe_bps) + residual_bits; - -#if SPOTCHECK_ESTIMATE - spotcheck_subframe_estimate_(encoder, blocksize, subframe_bps, subframe, estimate); -#endif - - return estimate; -} - -#ifndef FLAC__INTEGER_ONLY_LIBRARY -unsigned evaluate_lpc_subframe_( - FLAC__StreamEncoder *encoder, - const FLAC__int32 signal[], - FLAC__int32 residual[], - FLAC__uint64 abs_residual_partition_sums[], - unsigned raw_bits_per_partition[], - const FLAC__real lp_coeff[], - unsigned blocksize, - unsigned subframe_bps, - unsigned order, - unsigned qlp_coeff_precision, - unsigned rice_parameter, - unsigned rice_parameter_limit, - unsigned min_partition_order, - unsigned max_partition_order, - FLAC__bool do_escape_coding, - unsigned rice_parameter_search_dist, - FLAC__Subframe *subframe, - FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents -) -{ - FLAC__int32 qlp_coeff[FLAC__MAX_LPC_ORDER]; /* WATCHOUT: the size is important; some x86 intrinsic routines need more than lpc order elements */ - unsigned i, residual_bits, estimate; - int quantization, ret; - const unsigned residual_samples = blocksize - order; - - /* try to keep qlp coeff precision such that only 32-bit math is required for decode of <=16bps streams */ - if(subframe_bps <= 16) { - FLAC__ASSERT(order > 0); - FLAC__ASSERT(order <= FLAC__MAX_LPC_ORDER); - qlp_coeff_precision = flac_min(qlp_coeff_precision, 32 - subframe_bps - FLAC__bitmath_ilog2(order)); - } - - ret = FLAC__lpc_quantize_coefficients(lp_coeff, order, qlp_coeff_precision, qlp_coeff, &quantization); - if(ret != 0) - return 0; /* this is a hack to indicate to the caller that we can't do lp at this order on this subframe */ - - if(subframe_bps + qlp_coeff_precision + FLAC__bitmath_ilog2(order) <= 32) - if(subframe_bps <= 16 && qlp_coeff_precision <= 16) - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit(signal+order, residual_samples, qlp_coeff, order, quantization, residual); - else - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients(signal+order, residual_samples, qlp_coeff, order, quantization, residual); - else - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_64bit(signal+order, residual_samples, qlp_coeff, order, quantization, residual); - - subframe->type = FLAC__SUBFRAME_TYPE_LPC; - - subframe->data.lpc.entropy_coding_method.type = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE; - subframe->data.lpc.entropy_coding_method.data.partitioned_rice.contents = partitioned_rice_contents; - subframe->data.lpc.residual = residual; - - residual_bits = - find_best_partition_order_( - encoder->private_, - residual, - abs_residual_partition_sums, - raw_bits_per_partition, - residual_samples, - order, - rice_parameter, - rice_parameter_limit, - min_partition_order, - max_partition_order, - subframe_bps, - do_escape_coding, - rice_parameter_search_dist, - &subframe->data.lpc.entropy_coding_method - ); - - subframe->data.lpc.order = order; - subframe->data.lpc.qlp_coeff_precision = qlp_coeff_precision; - subframe->data.lpc.quantization_level = quantization; - memcpy(subframe->data.lpc.qlp_coeff, qlp_coeff, sizeof(FLAC__int32)*FLAC__MAX_LPC_ORDER); - for(i = 0; i < order; i++) - subframe->data.lpc.warmup[i] = signal[i]; - - estimate = FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN + subframe->wasted_bits + FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN + FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN + (order * (qlp_coeff_precision + subframe_bps)) + residual_bits; - -#if SPOTCHECK_ESTIMATE - spotcheck_subframe_estimate_(encoder, blocksize, subframe_bps, subframe, estimate); -#endif - - return estimate; -} -#endif - -unsigned evaluate_verbatim_subframe_( - FLAC__StreamEncoder *encoder, - const FLAC__int32 signal[], - unsigned blocksize, - unsigned subframe_bps, - FLAC__Subframe *subframe -) -{ - unsigned estimate; - - subframe->type = FLAC__SUBFRAME_TYPE_VERBATIM; - - subframe->data.verbatim.data = signal; - - estimate = FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN + subframe->wasted_bits + (blocksize * subframe_bps); - -#if SPOTCHECK_ESTIMATE - spotcheck_subframe_estimate_(encoder, blocksize, subframe_bps, subframe, estimate); -#else - (void)encoder; -#endif - - return estimate; -} - -unsigned find_best_partition_order_( - FLAC__StreamEncoderPrivate *private_, - const FLAC__int32 residual[], - FLAC__uint64 abs_residual_partition_sums[], - unsigned raw_bits_per_partition[], - unsigned residual_samples, - unsigned predictor_order, - unsigned rice_parameter, - unsigned rice_parameter_limit, - unsigned min_partition_order, - unsigned max_partition_order, - unsigned bps, - FLAC__bool do_escape_coding, - unsigned rice_parameter_search_dist, - FLAC__EntropyCodingMethod *best_ecm -) -{ - unsigned residual_bits, best_residual_bits = 0; - unsigned best_parameters_index = 0; - unsigned best_partition_order = 0; - const unsigned blocksize = residual_samples + predictor_order; - - max_partition_order = FLAC__format_get_max_rice_partition_order_from_blocksize_limited_max_and_predictor_order(max_partition_order, blocksize, predictor_order); - min_partition_order = flac_min(min_partition_order, max_partition_order); - - private_->local_precompute_partition_info_sums(residual, abs_residual_partition_sums, residual_samples, predictor_order, min_partition_order, max_partition_order, bps); - - if(do_escape_coding) - precompute_partition_info_escapes_(residual, raw_bits_per_partition, residual_samples, predictor_order, min_partition_order, max_partition_order); - - { - int partition_order; - unsigned sum; - - for(partition_order = (int)max_partition_order, sum = 0; partition_order >= (int)min_partition_order; partition_order--) { - if(! - set_partitioned_rice_( -#ifdef EXACT_RICE_BITS_CALCULATION - residual, -#endif - abs_residual_partition_sums+sum, - raw_bits_per_partition+sum, - residual_samples, - predictor_order, - rice_parameter, - rice_parameter_limit, - rice_parameter_search_dist, - (unsigned)partition_order, - do_escape_coding, - &private_->partitioned_rice_contents_extra[!best_parameters_index], - &residual_bits - ) - ) - { - FLAC__ASSERT(best_residual_bits != 0); - break; - } - sum += 1u << partition_order; - if(best_residual_bits == 0 || residual_bits < best_residual_bits) { - best_residual_bits = residual_bits; - best_parameters_index = !best_parameters_index; - best_partition_order = partition_order; - } - } - } - - best_ecm->data.partitioned_rice.order = best_partition_order; - - { - /* - * We are allowed to de-const the pointer based on our special - * knowledge; it is const to the outside world. - */ - FLAC__EntropyCodingMethod_PartitionedRiceContents* prc = (FLAC__EntropyCodingMethod_PartitionedRiceContents*)best_ecm->data.partitioned_rice.contents; - unsigned partition; - - /* save best parameters and raw_bits */ - FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(prc, flac_max(6u, best_partition_order)); - memcpy(prc->parameters, private_->partitioned_rice_contents_extra[best_parameters_index].parameters, sizeof(unsigned)*(1<<(best_partition_order))); - if(do_escape_coding) - memcpy(prc->raw_bits, private_->partitioned_rice_contents_extra[best_parameters_index].raw_bits, sizeof(unsigned)*(1<<(best_partition_order))); - /* - * Now need to check if the type should be changed to - * FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2 based on the - * size of the rice parameters. - */ - for(partition = 0; partition < (1u<parameters[partition] >= FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER) { - best_ecm->type = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2; - break; - } - } - } - - return best_residual_bits; -} - -void precompute_partition_info_sums_( - const FLAC__int32 residual[], - FLAC__uint64 abs_residual_partition_sums[], - unsigned residual_samples, - unsigned predictor_order, - unsigned min_partition_order, - unsigned max_partition_order, - unsigned bps -) -{ - const unsigned default_partition_samples = (residual_samples + predictor_order) >> max_partition_order; - unsigned partitions = 1u << max_partition_order; - - FLAC__ASSERT(default_partition_samples > predictor_order); - - /* first do max_partition_order */ - { - unsigned partition, residual_sample, end = (unsigned)(-(int)predictor_order); - /* WATCHOUT: "+ bps + FLAC__MAX_EXTRA_RESIDUAL_BPS" is the maximum - * assumed size of the average residual magnitude */ - if(FLAC__bitmath_ilog2(default_partition_samples) + bps + FLAC__MAX_EXTRA_RESIDUAL_BPS < 32) { - FLAC__uint32 abs_residual_partition_sum; - - for(partition = residual_sample = 0; partition < partitions; partition++) { - end += default_partition_samples; - abs_residual_partition_sum = 0; - for( ; residual_sample < end; residual_sample++) - abs_residual_partition_sum += abs(residual[residual_sample]); /* abs(INT_MIN) is undefined, but if the residual is INT_MIN we have bigger problems */ - abs_residual_partition_sums[partition] = abs_residual_partition_sum; - } - } - else { /* have to pessimistically use 64 bits for accumulator */ - FLAC__uint64 abs_residual_partition_sum; - - for(partition = residual_sample = 0; partition < partitions; partition++) { - end += default_partition_samples; - abs_residual_partition_sum = 0; - for( ; residual_sample < end; residual_sample++) - abs_residual_partition_sum += abs(residual[residual_sample]); /* abs(INT_MIN) is undefined, but if the residual is INT_MIN we have bigger problems */ - abs_residual_partition_sums[partition] = abs_residual_partition_sum; - } - } - } - - /* now merge partitions for lower orders */ - { - unsigned from_partition = 0, to_partition = partitions; - int partition_order; - for(partition_order = (int)max_partition_order - 1; partition_order >= (int)min_partition_order; partition_order--) { - unsigned i; - partitions >>= 1; - for(i = 0; i < partitions; i++) { - abs_residual_partition_sums[to_partition++] = - abs_residual_partition_sums[from_partition ] + - abs_residual_partition_sums[from_partition+1]; - from_partition += 2; - } - } - } -} - -void precompute_partition_info_escapes_( - const FLAC__int32 residual[], - unsigned raw_bits_per_partition[], - unsigned residual_samples, - unsigned predictor_order, - unsigned min_partition_order, - unsigned max_partition_order -) -{ - int partition_order; - unsigned from_partition, to_partition = 0; - const unsigned blocksize = residual_samples + predictor_order; - - /* first do max_partition_order */ - for(partition_order = (int)max_partition_order; partition_order >= 0; partition_order--) { - FLAC__int32 r; - FLAC__uint32 rmax; - unsigned partition, partition_sample, partition_samples, residual_sample; - const unsigned partitions = 1u << partition_order; - const unsigned default_partition_samples = blocksize >> partition_order; - - FLAC__ASSERT(default_partition_samples > predictor_order); - - for(partition = residual_sample = 0; partition < partitions; partition++) { - partition_samples = default_partition_samples; - if(partition == 0) - partition_samples -= predictor_order; - rmax = 0; - for(partition_sample = 0; partition_sample < partition_samples; partition_sample++) { - r = residual[residual_sample++]; - /* OPT: maybe faster: rmax |= r ^ (r>>31) */ - if(r < 0) - rmax |= ~r; - else - rmax |= r; - } - /* now we know all residual values are in the range [-rmax-1,rmax] */ - raw_bits_per_partition[partition] = rmax? FLAC__bitmath_ilog2(rmax) + 2 : 1; - } - to_partition = partitions; - break; /*@@@ yuck, should remove the 'for' loop instead */ - } - - /* now merge partitions for lower orders */ - for(from_partition = 0, --partition_order; partition_order >= (int)min_partition_order; partition_order--) { - unsigned m; - unsigned i; - const unsigned partitions = 1u << partition_order; - for(i = 0; i < partitions; i++) { - m = raw_bits_per_partition[from_partition]; - from_partition++; - raw_bits_per_partition[to_partition] = flac_max(m, raw_bits_per_partition[from_partition]); - from_partition++; - to_partition++; - } - } -} - -#ifdef EXACT_RICE_BITS_CALCULATION -static inline unsigned count_rice_bits_in_partition_( - const unsigned rice_parameter, - const unsigned partition_samples, - const FLAC__int32 *residual -) -{ - unsigned i, partition_bits = - FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN + /* actually could end up being FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN but err on side of 16bps */ - (1+rice_parameter) * partition_samples /* 1 for unary stop bit + rice_parameter for the binary portion */ - ; - for(i = 0; i < partition_samples; i++) - partition_bits += ( (FLAC__uint32)((residual[i]<<1)^(residual[i]>>31)) >> rice_parameter ); - return partition_bits; -} -#else -static inline unsigned count_rice_bits_in_partition_( - const unsigned rice_parameter, - const unsigned partition_samples, - const FLAC__uint64 abs_residual_partition_sum -) -{ - return - FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN + /* actually could end up being FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN but err on side of 16bps */ - (1+rice_parameter) * partition_samples + /* 1 for unary stop bit + rice_parameter for the binary portion */ - ( - rice_parameter? - (unsigned)(abs_residual_partition_sum >> (rice_parameter-1)) /* rice_parameter-1 because the real coder sign-folds instead of using a sign bit */ - : (unsigned)(abs_residual_partition_sum << 1) /* can't shift by negative number, so reverse */ - ) - - (partition_samples >> 1) - /* -(partition_samples>>1) to subtract out extra contributions to the abs_residual_partition_sum. - * The actual number of bits used is closer to the sum(for all i in the partition) of abs(residual[i])>>(rice_parameter-1) - * By using the abs_residual_partition sum, we also add in bits in the LSBs that would normally be shifted out. - * So the subtraction term tries to guess how many extra bits were contributed. - * If the LSBs are randomly distributed, this should average to 0.5 extra bits per sample. - */ - ; -} -#endif - -FLAC__bool set_partitioned_rice_( -#ifdef EXACT_RICE_BITS_CALCULATION - const FLAC__int32 residual[], -#endif - const FLAC__uint64 abs_residual_partition_sums[], - const unsigned raw_bits_per_partition[], - const unsigned residual_samples, - const unsigned predictor_order, - const unsigned suggested_rice_parameter, - const unsigned rice_parameter_limit, - const unsigned rice_parameter_search_dist, - const unsigned partition_order, - const FLAC__bool search_for_escapes, - FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents, - unsigned *bits -) -{ - unsigned rice_parameter, partition_bits; - unsigned best_partition_bits, best_rice_parameter = 0; - unsigned bits_ = FLAC__ENTROPY_CODING_METHOD_TYPE_LEN + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN; - unsigned *parameters, *raw_bits; -#ifdef ENABLE_RICE_PARAMETER_SEARCH - unsigned min_rice_parameter, max_rice_parameter; -#else - (void)rice_parameter_search_dist; -#endif - - FLAC__ASSERT(suggested_rice_parameter < FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER); - FLAC__ASSERT(rice_parameter_limit <= FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER); - - FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(partitioned_rice_contents, flac_max(6u, partition_order)); - parameters = partitioned_rice_contents->parameters; - raw_bits = partitioned_rice_contents->raw_bits; - - if(partition_order == 0) { - best_partition_bits = (unsigned)(-1); -#ifdef ENABLE_RICE_PARAMETER_SEARCH - if(rice_parameter_search_dist) { - if(suggested_rice_parameter < rice_parameter_search_dist) - min_rice_parameter = 0; - else - min_rice_parameter = suggested_rice_parameter - rice_parameter_search_dist; - max_rice_parameter = suggested_rice_parameter + rice_parameter_search_dist; - if(max_rice_parameter >= rice_parameter_limit) { -#ifdef DEBUG_VERBOSE - fprintf(stderr, "clipping rice_parameter (%u -> %u) @5\n", max_rice_parameter, rice_parameter_limit - 1); -#endif - max_rice_parameter = rice_parameter_limit - 1; - } - } - else - min_rice_parameter = max_rice_parameter = suggested_rice_parameter; - - for(rice_parameter = min_rice_parameter; rice_parameter <= max_rice_parameter; rice_parameter++) { -#else - rice_parameter = suggested_rice_parameter; -#endif -#ifdef EXACT_RICE_BITS_CALCULATION - partition_bits = count_rice_bits_in_partition_(rice_parameter, residual_samples, residual); -#else - partition_bits = count_rice_bits_in_partition_(rice_parameter, residual_samples, abs_residual_partition_sums[0]); -#endif - if(partition_bits < best_partition_bits) { - best_rice_parameter = rice_parameter; - best_partition_bits = partition_bits; - } -#ifdef ENABLE_RICE_PARAMETER_SEARCH - } -#endif - if(search_for_escapes) { - partition_bits = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN + raw_bits_per_partition[0] * residual_samples; - if(partition_bits <= best_partition_bits) { - raw_bits[0] = raw_bits_per_partition[0]; - best_rice_parameter = 0; /* will be converted to appropriate escape parameter later */ - best_partition_bits = partition_bits; - } - else - raw_bits[0] = 0; - } - parameters[0] = best_rice_parameter; - bits_ += best_partition_bits; - } - else { - unsigned partition, residual_sample; - unsigned partition_samples; - FLAC__uint64 mean, k; - const unsigned partitions = 1u << partition_order; - for(partition = residual_sample = 0; partition < partitions; partition++) { - partition_samples = (residual_samples+predictor_order) >> partition_order; - if(partition == 0) { - if(partition_samples <= predictor_order) - return false; - else - partition_samples -= predictor_order; - } - mean = abs_residual_partition_sums[partition]; - /* we are basically calculating the size in bits of the - * average residual magnitude in the partition: - * rice_parameter = floor(log2(mean/partition_samples)) - * 'mean' is not a good name for the variable, it is - * actually the sum of magnitudes of all residual values - * in the partition, so the actual mean is - * mean/partition_samples - */ -#if 0 /* old simple code */ - for(rice_parameter = 0, k = partition_samples; k < mean; rice_parameter++, k <<= 1) - ; -#else -#if defined FLAC__CPU_X86_64 /* and other 64-bit arch, too */ - if(mean <= 0x80000000/512) { /* 512: more or less optimal for both 16- and 24-bit input */ -#else - if(mean <= 0x80000000/8) { /* 32-bit arch: use 32-bit math if possible */ -#endif - FLAC__uint32 k2, mean2 = (FLAC__uint32) mean; - rice_parameter = 0; k2 = partition_samples; - while(k2*8 < mean2) { /* requires: mean <= (2^31)/8 */ - rice_parameter += 4; k2 <<= 4; /* tuned for 16-bit input */ - } - while(k2 < mean2) { /* requires: mean <= 2^31 */ - rice_parameter++; k2 <<= 1; - } - } - else { - rice_parameter = 0; k = partition_samples; - if(mean <= FLAC__U64L(0x8000000000000000)/128) /* usually mean is _much_ smaller than this value */ - while(k*128 < mean) { /* requires: mean <= (2^63)/128 */ - rice_parameter += 8; k <<= 8; /* tuned for 24-bit input */ - } - while(k < mean) { /* requires: mean <= 2^63 */ - rice_parameter++; k <<= 1; - } - } -#endif - if(rice_parameter >= rice_parameter_limit) { -#ifdef DEBUG_VERBOSE - fprintf(stderr, "clipping rice_parameter (%u -> %u) @6\n", rice_parameter, rice_parameter_limit - 1); -#endif - rice_parameter = rice_parameter_limit - 1; - } - - best_partition_bits = (unsigned)(-1); -#ifdef ENABLE_RICE_PARAMETER_SEARCH - if(rice_parameter_search_dist) { - if(rice_parameter < rice_parameter_search_dist) - min_rice_parameter = 0; - else - min_rice_parameter = rice_parameter - rice_parameter_search_dist; - max_rice_parameter = rice_parameter + rice_parameter_search_dist; - if(max_rice_parameter >= rice_parameter_limit) { -#ifdef DEBUG_VERBOSE - fprintf(stderr, "clipping rice_parameter (%u -> %u) @7\n", max_rice_parameter, rice_parameter_limit - 1); -#endif - max_rice_parameter = rice_parameter_limit - 1; - } - } - else - min_rice_parameter = max_rice_parameter = rice_parameter; - - for(rice_parameter = min_rice_parameter; rice_parameter <= max_rice_parameter; rice_parameter++) { -#endif -#ifdef EXACT_RICE_BITS_CALCULATION - partition_bits = count_rice_bits_in_partition_(rice_parameter, partition_samples, residual+residual_sample); -#else - partition_bits = count_rice_bits_in_partition_(rice_parameter, partition_samples, abs_residual_partition_sums[partition]); -#endif - if(partition_bits < best_partition_bits) { - best_rice_parameter = rice_parameter; - best_partition_bits = partition_bits; - } -#ifdef ENABLE_RICE_PARAMETER_SEARCH - } -#endif - if(search_for_escapes) { - partition_bits = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN + raw_bits_per_partition[partition] * partition_samples; - if(partition_bits <= best_partition_bits) { - raw_bits[partition] = raw_bits_per_partition[partition]; - best_rice_parameter = 0; /* will be converted to appropriate escape parameter later */ - best_partition_bits = partition_bits; - } - else - raw_bits[partition] = 0; - } - parameters[partition] = best_rice_parameter; - bits_ += best_partition_bits; - residual_sample += partition_samples; - } - } - - *bits = bits_; - return true; -} - -unsigned get_wasted_bits_(FLAC__int32 signal[], unsigned samples) -{ - unsigned i, shift; - FLAC__int32 x = 0; - - for(i = 0; i < samples && !(x&1); i++) - x |= signal[i]; - - if(x == 0) { - shift = 0; - } - else { - for(shift = 0; !(x&1); shift++) - x >>= 1; - } - - if(shift > 0) { - for(i = 0; i < samples; i++) - signal[i] >>= shift; - } - - return shift; -} - -void append_to_verify_fifo_(verify_input_fifo *fifo, const FLAC__int32 * const input[], unsigned input_offset, unsigned channels, unsigned wide_samples) -{ - unsigned channel; - - for(channel = 0; channel < channels; channel++) - memcpy(&fifo->data[channel][fifo->tail], &input[channel][input_offset], sizeof(FLAC__int32) * wide_samples); - - fifo->tail += wide_samples; - - FLAC__ASSERT(fifo->tail <= fifo->size); -} - -void append_to_verify_fifo_interleaved_(verify_input_fifo *fifo, const FLAC__int32 input[], unsigned input_offset, unsigned channels, unsigned wide_samples) -{ - unsigned channel; - unsigned sample, wide_sample; - unsigned tail = fifo->tail; - - sample = input_offset * channels; - for(wide_sample = 0; wide_sample < wide_samples; wide_sample++) { - for(channel = 0; channel < channels; channel++) - fifo->data[channel][tail] = input[sample++]; - tail++; - } - fifo->tail = tail; - - FLAC__ASSERT(fifo->tail <= fifo->size); -} - -FLAC__StreamDecoderReadStatus verify_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) -{ - FLAC__StreamEncoder *encoder = (FLAC__StreamEncoder*)client_data; - const size_t encoded_bytes = encoder->private_->verify.output.bytes; - (void)decoder; - - if(encoder->private_->verify.needs_magic_hack) { - FLAC__ASSERT(*bytes >= FLAC__STREAM_SYNC_LENGTH); - *bytes = FLAC__STREAM_SYNC_LENGTH; - memcpy(buffer, FLAC__STREAM_SYNC_STRING, *bytes); - encoder->private_->verify.needs_magic_hack = false; - } - else { - if(encoded_bytes == 0) { - /* - * If we get here, a FIFO underflow has occurred, - * which means there is a bug somewhere. - */ - FLAC__ASSERT(0); - return FLAC__STREAM_DECODER_READ_STATUS_ABORT; - } - else if(encoded_bytes < *bytes) - *bytes = encoded_bytes; - memcpy(buffer, encoder->private_->verify.output.data, *bytes); - encoder->private_->verify.output.data += *bytes; - encoder->private_->verify.output.bytes -= *bytes; - } - - return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; -} - -FLAC__StreamDecoderWriteStatus verify_write_callback_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) -{ - FLAC__StreamEncoder *encoder = (FLAC__StreamEncoder *)client_data; - unsigned channel; - const unsigned channels = frame->header.channels; - const unsigned blocksize = frame->header.blocksize; - const unsigned bytes_per_block = sizeof(FLAC__int32) * blocksize; - - (void)decoder; - - for(channel = 0; channel < channels; channel++) { - if(0 != memcmp(buffer[channel], encoder->private_->verify.input_fifo.data[channel], bytes_per_block)) { - unsigned i, sample = 0; - FLAC__int32 expect = 0, got = 0; - - for(i = 0; i < blocksize; i++) { - if(buffer[channel][i] != encoder->private_->verify.input_fifo.data[channel][i]) { - sample = i; - expect = (FLAC__int32)encoder->private_->verify.input_fifo.data[channel][i]; - got = (FLAC__int32)buffer[channel][i]; - break; - } - } - FLAC__ASSERT(i < blocksize); - FLAC__ASSERT(frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); - encoder->private_->verify.error_stats.absolute_sample = frame->header.number.sample_number + sample; - encoder->private_->verify.error_stats.frame_number = (unsigned)(frame->header.number.sample_number / blocksize); - encoder->private_->verify.error_stats.channel = channel; - encoder->private_->verify.error_stats.sample = sample; - encoder->private_->verify.error_stats.expected = expect; - encoder->private_->verify.error_stats.got = got; - encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA; - return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; - } - } - /* dequeue the frame from the fifo */ - encoder->private_->verify.input_fifo.tail -= blocksize; - FLAC__ASSERT(encoder->private_->verify.input_fifo.tail <= OVERREAD_); - for(channel = 0; channel < channels; channel++) - memmove(&encoder->private_->verify.input_fifo.data[channel][0], &encoder->private_->verify.input_fifo.data[channel][blocksize], encoder->private_->verify.input_fifo.tail * sizeof(encoder->private_->verify.input_fifo.data[0][0])); - return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; -} - -void verify_metadata_callback_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) -{ - (void)decoder, (void)metadata, (void)client_data; -} - -void verify_error_callback_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) -{ - FLAC__StreamEncoder *encoder = (FLAC__StreamEncoder*)client_data; - (void)decoder, (void)status; - encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR; -} - -FLAC__StreamEncoderReadStatus file_read_callback_(const FLAC__StreamEncoder *encoder, FLAC__byte buffer[], size_t *bytes, void *client_data) -{ - (void)client_data; - - *bytes = fread(buffer, 1, *bytes, encoder->private_->file); - if (*bytes == 0) { - if (feof(encoder->private_->file)) - return FLAC__STREAM_ENCODER_READ_STATUS_END_OF_STREAM; - else if (ferror(encoder->private_->file)) - return FLAC__STREAM_ENCODER_READ_STATUS_ABORT; - } - return FLAC__STREAM_ENCODER_READ_STATUS_CONTINUE; -} - -FLAC__StreamEncoderSeekStatus file_seek_callback_(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data) -{ - (void)client_data; - - if(fseeko(encoder->private_->file, (FLAC__off_t)absolute_byte_offset, SEEK_SET) < 0) - return FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR; - else - return FLAC__STREAM_ENCODER_SEEK_STATUS_OK; -} - -FLAC__StreamEncoderTellStatus file_tell_callback_(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data) -{ - FLAC__off_t offset; - - (void)client_data; - - offset = ftello(encoder->private_->file); - - if(offset < 0) { - return FLAC__STREAM_ENCODER_TELL_STATUS_ERROR; - } - else { - *absolute_byte_offset = (FLAC__uint64)offset; - return FLAC__STREAM_ENCODER_TELL_STATUS_OK; - } -} - -#ifdef FLAC__VALGRIND_TESTING -static size_t local__fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) -{ - size_t ret = fwrite(ptr, size, nmemb, stream); - if(!ferror(stream)) - fflush(stream); - return ret; -} -#else -#define local__fwrite fwrite -#endif - -FLAC__StreamEncoderWriteStatus file_write_callback_(const FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, void *client_data) -{ - (void)client_data, (void)current_frame; - - if(local__fwrite(buffer, sizeof(FLAC__byte), bytes, encoder->private_->file) == bytes) { - FLAC__bool call_it = 0 != encoder->private_->progress_callback && ( -#if FLAC__HAS_OGG - /* We would like to be able to use 'samples > 0' in the - * clause here but currently because of the nature of our - * Ogg writing implementation, 'samples' is always 0 (see - * ogg_encoder_aspect.c). The downside is extra progress - * callbacks. - */ - encoder->private_->is_ogg? true : -#endif - samples > 0 - ); - if(call_it) { - /* NOTE: We have to add +bytes, +samples, and +1 to the stats - * because at this point in the callback chain, the stats - * have not been updated. Only after we return and control - * gets back to write_frame_() are the stats updated - */ - encoder->private_->progress_callback(encoder, encoder->private_->bytes_written+bytes, encoder->private_->samples_written+samples, encoder->private_->frames_written+(samples?1:0), encoder->private_->total_frames_estimate, encoder->private_->client_data); - } - return FLAC__STREAM_ENCODER_WRITE_STATUS_OK; - } - else - return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR; -} - -/* - * This will forcibly set stdout to binary mode (for OSes that require it) - */ -FILE *get_binary_stdout_(void) -{ - /* if something breaks here it is probably due to the presence or - * absence of an underscore before the identifiers 'setmode', - * 'fileno', and/or 'O_BINARY'; check your system header files. - */ -#if defined _MSC_VER || defined __MINGW32__ - _setmode(_fileno(stdout), _O_BINARY); -#elif defined __CYGWIN__ - /* almost certainly not needed for any modern Cygwin, but let's be safe... */ - setmode(_fileno(stdout), _O_BINARY); -#elif defined __EMX__ - setmode(fileno(stdout), O_BINARY); -#endif - - return stdout; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/stream_encoder_framing.c b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/stream_encoder_framing.c deleted file mode 100644 index 959eca0a..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/stream_encoder_framing.c +++ /dev/null @@ -1,549 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 -#endif - -#include -#include /* for strlen() */ -#include "private/stream_encoder_framing.h" -#include "private/crc.h" -#include "FLAC/assert.h" - -static FLAC__bool add_entropy_coding_method_(FLAC__BitWriter *bw, const FLAC__EntropyCodingMethod *method); -static FLAC__bool add_residual_partitioned_rice_(FLAC__BitWriter *bw, const FLAC__int32 residual[], const unsigned residual_samples, const unsigned predictor_order, const unsigned rice_parameters[], const unsigned raw_bits[], const unsigned partition_order, const FLAC__bool is_extended); - -FLAC__bool FLAC__add_metadata_block(const FLAC__StreamMetadata *metadata, FLAC__BitWriter *bw) -{ - unsigned i, j; - const unsigned vendor_string_length = (unsigned)strlen(FLAC__VENDOR_STRING); - - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->is_last, FLAC__STREAM_METADATA_IS_LAST_LEN)) - return false; - - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->type, FLAC__STREAM_METADATA_TYPE_LEN)) - return false; - - /* - * First, for VORBIS_COMMENTs, adjust the length to reflect our vendor string - */ - i = metadata->length; - if(metadata->type == FLAC__METADATA_TYPE_VORBIS_COMMENT) { - FLAC__ASSERT(metadata->data.vorbis_comment.vendor_string.length == 0 || 0 != metadata->data.vorbis_comment.vendor_string.entry); - i -= metadata->data.vorbis_comment.vendor_string.length; - i += vendor_string_length; - } - FLAC__ASSERT(i < (1u << FLAC__STREAM_METADATA_LENGTH_LEN)); - if(!FLAC__bitwriter_write_raw_uint32(bw, i, FLAC__STREAM_METADATA_LENGTH_LEN)) - return false; - - switch(metadata->type) { - case FLAC__METADATA_TYPE_STREAMINFO: - FLAC__ASSERT(metadata->data.stream_info.min_blocksize < (1u << FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN)); - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.min_blocksize, FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN)) - return false; - FLAC__ASSERT(metadata->data.stream_info.max_blocksize < (1u << FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN)); - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.max_blocksize, FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN)) - return false; - FLAC__ASSERT(metadata->data.stream_info.min_framesize < (1u << FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN)); - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.min_framesize, FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN)) - return false; - FLAC__ASSERT(metadata->data.stream_info.max_framesize < (1u << FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN)); - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.max_framesize, FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN)) - return false; - FLAC__ASSERT(FLAC__format_sample_rate_is_valid(metadata->data.stream_info.sample_rate)); - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.sample_rate, FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN)) - return false; - FLAC__ASSERT(metadata->data.stream_info.channels > 0); - FLAC__ASSERT(metadata->data.stream_info.channels <= (1u << FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN)); - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.channels-1, FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN)) - return false; - FLAC__ASSERT(metadata->data.stream_info.bits_per_sample > 0); - FLAC__ASSERT(metadata->data.stream_info.bits_per_sample <= (1u << FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN)); - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.bits_per_sample-1, FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint64(bw, metadata->data.stream_info.total_samples, FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN)) - return false; - if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.stream_info.md5sum, 16)) - return false; - break; - case FLAC__METADATA_TYPE_PADDING: - if(!FLAC__bitwriter_write_zeroes(bw, metadata->length * 8)) - return false; - break; - case FLAC__METADATA_TYPE_APPLICATION: - if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.application.id, FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8)) - return false; - if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.application.data, metadata->length - (FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8))) - return false; - break; - case FLAC__METADATA_TYPE_SEEKTABLE: - for(i = 0; i < metadata->data.seek_table.num_points; i++) { - if(!FLAC__bitwriter_write_raw_uint64(bw, metadata->data.seek_table.points[i].sample_number, FLAC__STREAM_METADATA_SEEKPOINT_SAMPLE_NUMBER_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint64(bw, metadata->data.seek_table.points[i].stream_offset, FLAC__STREAM_METADATA_SEEKPOINT_STREAM_OFFSET_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.seek_table.points[i].frame_samples, FLAC__STREAM_METADATA_SEEKPOINT_FRAME_SAMPLES_LEN)) - return false; - } - break; - case FLAC__METADATA_TYPE_VORBIS_COMMENT: - if(!FLAC__bitwriter_write_raw_uint32_little_endian(bw, vendor_string_length)) - return false; - if(!FLAC__bitwriter_write_byte_block(bw, (const FLAC__byte*)FLAC__VENDOR_STRING, vendor_string_length)) - return false; - if(!FLAC__bitwriter_write_raw_uint32_little_endian(bw, metadata->data.vorbis_comment.num_comments)) - return false; - for(i = 0; i < metadata->data.vorbis_comment.num_comments; i++) { - if(!FLAC__bitwriter_write_raw_uint32_little_endian(bw, metadata->data.vorbis_comment.comments[i].length)) - return false; - if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.vorbis_comment.comments[i].entry, metadata->data.vorbis_comment.comments[i].length)) - return false; - } - break; - case FLAC__METADATA_TYPE_CUESHEET: - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN % 8 == 0); - if(!FLAC__bitwriter_write_byte_block(bw, (const FLAC__byte*)metadata->data.cue_sheet.media_catalog_number, FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN/8)) - return false; - if(!FLAC__bitwriter_write_raw_uint64(bw, metadata->data.cue_sheet.lead_in, FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.cue_sheet.is_cd? 1 : 0, FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN)) - return false; - if(!FLAC__bitwriter_write_zeroes(bw, FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.cue_sheet.num_tracks, FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN)) - return false; - for(i = 0; i < metadata->data.cue_sheet.num_tracks; i++) { - const FLAC__StreamMetadata_CueSheet_Track *track = metadata->data.cue_sheet.tracks + i; - - if(!FLAC__bitwriter_write_raw_uint64(bw, track->offset, FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, track->number, FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN)) - return false; - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN % 8 == 0); - if(!FLAC__bitwriter_write_byte_block(bw, (const FLAC__byte*)track->isrc, FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN/8)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, track->type, FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, track->pre_emphasis, FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN)) - return false; - if(!FLAC__bitwriter_write_zeroes(bw, FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, track->num_indices, FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN)) - return false; - for(j = 0; j < track->num_indices; j++) { - const FLAC__StreamMetadata_CueSheet_Index *indx = track->indices + j; - - if(!FLAC__bitwriter_write_raw_uint64(bw, indx->offset, FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, indx->number, FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN)) - return false; - if(!FLAC__bitwriter_write_zeroes(bw, FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN)) - return false; - } - } - break; - case FLAC__METADATA_TYPE_PICTURE: - { - size_t len; - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.type, FLAC__STREAM_METADATA_PICTURE_TYPE_LEN)) - return false; - len = strlen(metadata->data.picture.mime_type); - if(!FLAC__bitwriter_write_raw_uint32(bw, len, FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN)) - return false; - if(!FLAC__bitwriter_write_byte_block(bw, (const FLAC__byte*)metadata->data.picture.mime_type, len)) - return false; - len = strlen((const char *)metadata->data.picture.description); - if(!FLAC__bitwriter_write_raw_uint32(bw, len, FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN)) - return false; - if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.picture.description, len)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.width, FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.height, FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.depth, FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.colors, FLAC__STREAM_METADATA_PICTURE_COLORS_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.data_length, FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN)) - return false; - if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.picture.data, metadata->data.picture.data_length)) - return false; - } - break; - default: - if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.unknown.data, metadata->length)) - return false; - break; - } - - FLAC__ASSERT(FLAC__bitwriter_is_byte_aligned(bw)); - return true; -} - -FLAC__bool FLAC__frame_add_header(const FLAC__FrameHeader *header, FLAC__BitWriter *bw) -{ - unsigned u, blocksize_hint, sample_rate_hint; - FLAC__byte crc; - - FLAC__ASSERT(FLAC__bitwriter_is_byte_aligned(bw)); - - if(!FLAC__bitwriter_write_raw_uint32(bw, FLAC__FRAME_HEADER_SYNC, FLAC__FRAME_HEADER_SYNC_LEN)) - return false; - - if(!FLAC__bitwriter_write_raw_uint32(bw, 0, FLAC__FRAME_HEADER_RESERVED_LEN)) - return false; - - if(!FLAC__bitwriter_write_raw_uint32(bw, (header->number_type == FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER)? 0 : 1, FLAC__FRAME_HEADER_BLOCKING_STRATEGY_LEN)) - return false; - - FLAC__ASSERT(header->blocksize > 0 && header->blocksize <= FLAC__MAX_BLOCK_SIZE); - /* when this assertion holds true, any legal blocksize can be expressed in the frame header */ - FLAC__ASSERT(FLAC__MAX_BLOCK_SIZE <= 65535u); - blocksize_hint = 0; - switch(header->blocksize) { - case 192: u = 1; break; - case 576: u = 2; break; - case 1152: u = 3; break; - case 2304: u = 4; break; - case 4608: u = 5; break; - case 256: u = 8; break; - case 512: u = 9; break; - case 1024: u = 10; break; - case 2048: u = 11; break; - case 4096: u = 12; break; - case 8192: u = 13; break; - case 16384: u = 14; break; - case 32768: u = 15; break; - default: - if(header->blocksize <= 0x100) - blocksize_hint = u = 6; - else - blocksize_hint = u = 7; - break; - } - if(!FLAC__bitwriter_write_raw_uint32(bw, u, FLAC__FRAME_HEADER_BLOCK_SIZE_LEN)) - return false; - - FLAC__ASSERT(FLAC__format_sample_rate_is_valid(header->sample_rate)); - sample_rate_hint = 0; - switch(header->sample_rate) { - case 88200: u = 1; break; - case 176400: u = 2; break; - case 192000: u = 3; break; - case 8000: u = 4; break; - case 16000: u = 5; break; - case 22050: u = 6; break; - case 24000: u = 7; break; - case 32000: u = 8; break; - case 44100: u = 9; break; - case 48000: u = 10; break; - case 96000: u = 11; break; - default: - if(header->sample_rate <= 255000 && header->sample_rate % 1000 == 0) - sample_rate_hint = u = 12; - else if(header->sample_rate % 10 == 0) - sample_rate_hint = u = 14; - else if(header->sample_rate <= 0xffff) - sample_rate_hint = u = 13; - else - u = 0; - break; - } - if(!FLAC__bitwriter_write_raw_uint32(bw, u, FLAC__FRAME_HEADER_SAMPLE_RATE_LEN)) - return false; - - FLAC__ASSERT(header->channels > 0 && header->channels <= (1u << FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN) && header->channels <= FLAC__MAX_CHANNELS); - switch(header->channel_assignment) { - case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT: - u = header->channels - 1; - break; - case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE: - FLAC__ASSERT(header->channels == 2); - u = 8; - break; - case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE: - FLAC__ASSERT(header->channels == 2); - u = 9; - break; - case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE: - FLAC__ASSERT(header->channels == 2); - u = 10; - break; - default: - FLAC__ASSERT(0); - } - if(!FLAC__bitwriter_write_raw_uint32(bw, u, FLAC__FRAME_HEADER_CHANNEL_ASSIGNMENT_LEN)) - return false; - - FLAC__ASSERT(header->bits_per_sample > 0 && header->bits_per_sample <= (1u << FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN)); - switch(header->bits_per_sample) { - case 8 : u = 1; break; - case 12: u = 2; break; - case 16: u = 4; break; - case 20: u = 5; break; - case 24: u = 6; break; - default: u = 0; break; - } - if(!FLAC__bitwriter_write_raw_uint32(bw, u, FLAC__FRAME_HEADER_BITS_PER_SAMPLE_LEN)) - return false; - - if(!FLAC__bitwriter_write_raw_uint32(bw, 0, FLAC__FRAME_HEADER_ZERO_PAD_LEN)) - return false; - - if(header->number_type == FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER) { - if(!FLAC__bitwriter_write_utf8_uint32(bw, header->number.frame_number)) - return false; - } - else { - if(!FLAC__bitwriter_write_utf8_uint64(bw, header->number.sample_number)) - return false; - } - - if(blocksize_hint) - if(!FLAC__bitwriter_write_raw_uint32(bw, header->blocksize-1, (blocksize_hint==6)? 8:16)) - return false; - - switch(sample_rate_hint) { - case 12: - if(!FLAC__bitwriter_write_raw_uint32(bw, header->sample_rate / 1000, 8)) - return false; - break; - case 13: - if(!FLAC__bitwriter_write_raw_uint32(bw, header->sample_rate, 16)) - return false; - break; - case 14: - if(!FLAC__bitwriter_write_raw_uint32(bw, header->sample_rate / 10, 16)) - return false; - break; - } - - /* write the CRC */ - if(!FLAC__bitwriter_get_write_crc8(bw, &crc)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, crc, FLAC__FRAME_HEADER_CRC_LEN)) - return false; - - return true; -} - -FLAC__bool FLAC__subframe_add_constant(const FLAC__Subframe_Constant *subframe, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw) -{ - FLAC__bool ok; - - ok = - FLAC__bitwriter_write_raw_uint32(bw, FLAC__SUBFRAME_TYPE_CONSTANT_BYTE_ALIGNED_MASK | (wasted_bits? 1:0), FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN) && - (wasted_bits? FLAC__bitwriter_write_unary_unsigned(bw, wasted_bits-1) : true) && - FLAC__bitwriter_write_raw_int32(bw, subframe->value, subframe_bps) - ; - - return ok; -} - -FLAC__bool FLAC__subframe_add_fixed(const FLAC__Subframe_Fixed *subframe, unsigned residual_samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw) -{ - unsigned i; - - if(!FLAC__bitwriter_write_raw_uint32(bw, FLAC__SUBFRAME_TYPE_FIXED_BYTE_ALIGNED_MASK | (subframe->order<<1) | (wasted_bits? 1:0), FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN)) - return false; - if(wasted_bits) - if(!FLAC__bitwriter_write_unary_unsigned(bw, wasted_bits-1)) - return false; - - for(i = 0; i < subframe->order; i++) - if(!FLAC__bitwriter_write_raw_int32(bw, subframe->warmup[i], subframe_bps)) - return false; - - if(!add_entropy_coding_method_(bw, &subframe->entropy_coding_method)) - return false; - switch(subframe->entropy_coding_method.type) { - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: - if(!add_residual_partitioned_rice_( - bw, - subframe->residual, - residual_samples, - subframe->order, - subframe->entropy_coding_method.data.partitioned_rice.contents->parameters, - subframe->entropy_coding_method.data.partitioned_rice.contents->raw_bits, - subframe->entropy_coding_method.data.partitioned_rice.order, - /*is_extended=*/subframe->entropy_coding_method.type == FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2 - )) - return false; - break; - default: - FLAC__ASSERT(0); - } - - return true; -} - -FLAC__bool FLAC__subframe_add_lpc(const FLAC__Subframe_LPC *subframe, unsigned residual_samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw) -{ - unsigned i; - - if(!FLAC__bitwriter_write_raw_uint32(bw, FLAC__SUBFRAME_TYPE_LPC_BYTE_ALIGNED_MASK | ((subframe->order-1)<<1) | (wasted_bits? 1:0), FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN)) - return false; - if(wasted_bits) - if(!FLAC__bitwriter_write_unary_unsigned(bw, wasted_bits-1)) - return false; - - for(i = 0; i < subframe->order; i++) - if(!FLAC__bitwriter_write_raw_int32(bw, subframe->warmup[i], subframe_bps)) - return false; - - if(!FLAC__bitwriter_write_raw_uint32(bw, subframe->qlp_coeff_precision-1, FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_int32(bw, subframe->quantization_level, FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN)) - return false; - for(i = 0; i < subframe->order; i++) - if(!FLAC__bitwriter_write_raw_int32(bw, subframe->qlp_coeff[i], subframe->qlp_coeff_precision)) - return false; - - if(!add_entropy_coding_method_(bw, &subframe->entropy_coding_method)) - return false; - switch(subframe->entropy_coding_method.type) { - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: - if(!add_residual_partitioned_rice_( - bw, - subframe->residual, - residual_samples, - subframe->order, - subframe->entropy_coding_method.data.partitioned_rice.contents->parameters, - subframe->entropy_coding_method.data.partitioned_rice.contents->raw_bits, - subframe->entropy_coding_method.data.partitioned_rice.order, - /*is_extended=*/subframe->entropy_coding_method.type == FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2 - )) - return false; - break; - default: - FLAC__ASSERT(0); - } - - return true; -} - -FLAC__bool FLAC__subframe_add_verbatim(const FLAC__Subframe_Verbatim *subframe, unsigned samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw) -{ - unsigned i; - const FLAC__int32 *signal = subframe->data; - - if(!FLAC__bitwriter_write_raw_uint32(bw, FLAC__SUBFRAME_TYPE_VERBATIM_BYTE_ALIGNED_MASK | (wasted_bits? 1:0), FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN)) - return false; - if(wasted_bits) - if(!FLAC__bitwriter_write_unary_unsigned(bw, wasted_bits-1)) - return false; - - for(i = 0; i < samples; i++) - if(!FLAC__bitwriter_write_raw_int32(bw, signal[i], subframe_bps)) - return false; - - return true; -} - -FLAC__bool add_entropy_coding_method_(FLAC__BitWriter *bw, const FLAC__EntropyCodingMethod *method) -{ - if(!FLAC__bitwriter_write_raw_uint32(bw, method->type, FLAC__ENTROPY_CODING_METHOD_TYPE_LEN)) - return false; - switch(method->type) { - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: - if(!FLAC__bitwriter_write_raw_uint32(bw, method->data.partitioned_rice.order, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN)) - return false; - break; - default: - FLAC__ASSERT(0); - } - return true; -} - -FLAC__bool add_residual_partitioned_rice_(FLAC__BitWriter *bw, const FLAC__int32 residual[], const unsigned residual_samples, const unsigned predictor_order, const unsigned rice_parameters[], const unsigned raw_bits[], const unsigned partition_order, const FLAC__bool is_extended) -{ - const unsigned plen = is_extended? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN; - const unsigned pesc = is_extended? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER; - - if(partition_order == 0) { - unsigned i; - - if(raw_bits[0] == 0) { - if(!FLAC__bitwriter_write_raw_uint32(bw, rice_parameters[0], plen)) - return false; - if(!FLAC__bitwriter_write_rice_signed_block(bw, residual, residual_samples, rice_parameters[0])) - return false; - } - else { - FLAC__ASSERT(rice_parameters[0] == 0); - if(!FLAC__bitwriter_write_raw_uint32(bw, pesc, plen)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, raw_bits[0], FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN)) - return false; - for(i = 0; i < residual_samples; i++) { - if(!FLAC__bitwriter_write_raw_int32(bw, residual[i], raw_bits[0])) - return false; - } - } - return true; - } - else { - unsigned i, j, k = 0, k_last = 0; - unsigned partition_samples; - const unsigned default_partition_samples = (residual_samples+predictor_order) >> partition_order; - for(i = 0; i < (1u< -#endif - -#ifndef FLAC__NO_ASM -#if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN -#include "private/stream_encoder.h" -#include "private/bitmath.h" -#ifdef FLAC__AVX2_SUPPORTED - -#include /* for abs() */ -#include /* AVX2 */ -#include "FLAC/assert.h" - -FLAC__SSE_TARGET("avx2") -void FLAC__precompute_partition_info_sums_intrin_avx2(const FLAC__int32 residual[], FLAC__uint64 abs_residual_partition_sums[], - unsigned residual_samples, unsigned predictor_order, unsigned min_partition_order, unsigned max_partition_order, unsigned bps) -{ - const unsigned default_partition_samples = (residual_samples + predictor_order) >> max_partition_order; - unsigned partitions = 1u << max_partition_order; - - FLAC__ASSERT(default_partition_samples > predictor_order); - - /* first do max_partition_order */ - { - unsigned partition, residual_sample, end = (unsigned)(-(int)predictor_order); - __m256i res256, sum256; - __m128i res128, sum128; - - if(FLAC__bitmath_ilog2(default_partition_samples) + bps + FLAC__MAX_EXTRA_RESIDUAL_BPS < 32) { - for(partition = residual_sample = 0; partition < partitions; partition++) { - end += default_partition_samples; - sum256 = _mm256_setzero_si256(); - - for( ; (int)residual_sample < (int)end-7; residual_sample+=8) { - res256 = _mm256_abs_epi32(_mm256_loadu_si256((const __m256i*)(residual+residual_sample))); - sum256 = _mm256_add_epi32(sum256, res256); - } - - sum128 = _mm_add_epi32(_mm256_extracti128_si256(sum256, 1), _mm256_castsi256_si128(sum256)); - - for( ; (int)residual_sample < (int)end-3; residual_sample+=4) { - res128 = _mm_abs_epi32(_mm_loadu_si128((const __m128i*)(residual+residual_sample))); - sum128 = _mm_add_epi32(sum128, res128); - } - - for( ; residual_sample < end; residual_sample++) { - res128 = _mm_cvtsi32_si128(residual[residual_sample]); - res128 = _mm_abs_epi32(res128); - sum128 = _mm_add_epi32(sum128, res128); - } - - sum128 = _mm_hadd_epi32(sum128, sum128); - sum128 = _mm_hadd_epi32(sum128, sum128); - abs_residual_partition_sums[partition] = (FLAC__uint32)_mm_cvtsi128_si32(sum128); - } - } - else { /* have to pessimistically use 64 bits for accumulator */ - for(partition = residual_sample = 0; partition < partitions; partition++) { - end += default_partition_samples; - sum256 = _mm256_setzero_si256(); - - for( ; (int)residual_sample < (int)end-3; residual_sample+=4) { - res128 = _mm_abs_epi32(_mm_loadu_si128((const __m128i*)(residual+residual_sample))); - res256 = _mm256_cvtepu32_epi64(res128); - sum256 = _mm256_add_epi64(sum256, res256); - } - - sum128 = _mm_add_epi64(_mm256_extracti128_si256(sum256, 1), _mm256_castsi256_si128(sum256)); - - for( ; (int)residual_sample < (int)end-1; residual_sample+=2) { - res128 = _mm_loadl_epi64((const __m128i*)(residual+residual_sample)); - res128 = _mm_abs_epi32(res128); - res128 = _mm_cvtepu32_epi64(res128); - sum128 = _mm_add_epi64(sum128, res128); - } - - for( ; residual_sample < end; residual_sample++) { - res128 = _mm_cvtsi32_si128(residual[residual_sample]); - res128 = _mm_abs_epi32(res128); - sum128 = _mm_add_epi64(sum128, res128); - } - - sum128 = _mm_add_epi64(sum128, _mm_srli_si128(sum128, 8)); - _mm_storel_epi64((__m128i*)(abs_residual_partition_sums+partition), sum128); - } - } - } - - /* now merge partitions for lower orders */ - { - unsigned from_partition = 0, to_partition = partitions; - int partition_order; - for(partition_order = (int)max_partition_order - 1; partition_order >= (int)min_partition_order; partition_order--) { - unsigned i; - partitions >>= 1; - for(i = 0; i < partitions; i++) { - abs_residual_partition_sums[to_partition++] = - abs_residual_partition_sums[from_partition ] + - abs_residual_partition_sums[from_partition+1]; - from_partition += 2; - } - } - } - _mm256_zeroupper(); -} - -#endif /* FLAC__AVX2_SUPPORTED */ -#endif /* (FLAC__CPU_IA32 || FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN */ -#endif /* FLAC__NO_ASM */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/stream_encoder_intrin_sse2.c b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/stream_encoder_intrin_sse2.c deleted file mode 100644 index ec5541c0..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/stream_encoder_intrin_sse2.c +++ /dev/null @@ -1,159 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 -#endif - -#ifndef FLAC__NO_ASM -#if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN -#include "private/stream_encoder.h" -#include "private/bitmath.h" -#ifdef FLAC__SSE2_SUPPORTED - -#include /* for abs() */ -#include /* SSE2 */ -#include "FLAC/assert.h" - -FLAC__SSE_TARGET("sse2") -void FLAC__precompute_partition_info_sums_intrin_sse2(const FLAC__int32 residual[], FLAC__uint64 abs_residual_partition_sums[], - unsigned residual_samples, unsigned predictor_order, unsigned min_partition_order, unsigned max_partition_order, unsigned bps) -{ - const unsigned default_partition_samples = (residual_samples + predictor_order) >> max_partition_order; - unsigned partitions = 1u << max_partition_order; - - FLAC__ASSERT(default_partition_samples > predictor_order); - - /* first do max_partition_order */ - { - unsigned partition, residual_sample, end = (unsigned)(-(int)predictor_order); - unsigned e1, e3; - __m128i mm_res, mm_sum, mm_mask; - - if(FLAC__bitmath_ilog2(default_partition_samples) + bps + FLAC__MAX_EXTRA_RESIDUAL_BPS < 32) { - for(partition = residual_sample = 0; partition < partitions; partition++) { - end += default_partition_samples; - mm_sum = _mm_setzero_si128(); - - e1 = (residual_sample + 3) & ~3; e3 = end & ~3; - if(e1 > end) - e1 = end; /* try flac -l 1 -b 16 and you'll be here */ - - /* assumption: residual[] is properly aligned so (residual + e1) is properly aligned too and _mm_loadu_si128() is fast */ - for( ; residual_sample < e1; residual_sample++) { - mm_res = _mm_cvtsi32_si128(residual[residual_sample]); - mm_mask = _mm_srai_epi32(mm_res, 31); - mm_res = _mm_xor_si128(mm_res, mm_mask); - mm_res = _mm_sub_epi32(mm_res, mm_mask); /* abs(INT_MIN) is undefined, but if the residual is INT_MIN we have bigger problems */ - mm_sum = _mm_add_epi32(mm_sum, mm_res); - } - - for( ; residual_sample < e3; residual_sample+=4) { - mm_res = _mm_loadu_si128((const __m128i*)(residual+residual_sample)); - mm_mask = _mm_srai_epi32(mm_res, 31); - mm_res = _mm_xor_si128(mm_res, mm_mask); - mm_res = _mm_sub_epi32(mm_res, mm_mask); - mm_sum = _mm_add_epi32(mm_sum, mm_res); - } - - for( ; residual_sample < end; residual_sample++) { - mm_res = _mm_cvtsi32_si128(residual[residual_sample]); - mm_mask = _mm_srai_epi32(mm_res, 31); - mm_res = _mm_xor_si128(mm_res, mm_mask); - mm_res = _mm_sub_epi32(mm_res, mm_mask); - mm_sum = _mm_add_epi32(mm_sum, mm_res); - } - - mm_sum = _mm_add_epi32(mm_sum, _mm_srli_si128(mm_sum, 8)); - mm_sum = _mm_add_epi32(mm_sum, _mm_srli_si128(mm_sum, 4)); - abs_residual_partition_sums[partition] = (FLAC__uint32)_mm_cvtsi128_si32(mm_sum); - } - } - else { /* have to pessimistically use 64 bits for accumulator */ - for(partition = residual_sample = 0; partition < partitions; partition++) { - end += default_partition_samples; - mm_sum = _mm_setzero_si128(); - - e1 = (residual_sample + 1) & ~1; e3 = end & ~1; - FLAC__ASSERT(e1 <= end); - - for( ; residual_sample < e1; residual_sample++) { - mm_res = _mm_cvtsi32_si128(residual[residual_sample]); /* 0 0 0 r0 */ - mm_mask = _mm_srai_epi32(mm_res, 31); - mm_res = _mm_xor_si128(mm_res, mm_mask); - mm_res = _mm_sub_epi32(mm_res, mm_mask); /* 0 0 0 |r0| == 00 |r0_64| */ - mm_sum = _mm_add_epi64(mm_sum, mm_res); - } - - for( ; residual_sample < e3; residual_sample+=2) { - mm_res = _mm_loadl_epi64((const __m128i*)(residual+residual_sample)); /* 0 0 r1 r0 */ - mm_mask = _mm_srai_epi32(mm_res, 31); - mm_res = _mm_xor_si128(mm_res, mm_mask); - mm_res = _mm_sub_epi32(mm_res, mm_mask); /* 0 0 |r1| |r0| */ - mm_res = _mm_shuffle_epi32(mm_res, _MM_SHUFFLE(3,1,2,0)); /* 0 |r1| 0 |r0| == |r1_64| |r0_64| */ - mm_sum = _mm_add_epi64(mm_sum, mm_res); - } - - for( ; residual_sample < end; residual_sample++) { - mm_res = _mm_cvtsi32_si128(residual[residual_sample]); - mm_mask = _mm_srai_epi32(mm_res, 31); - mm_res = _mm_xor_si128(mm_res, mm_mask); - mm_res = _mm_sub_epi32(mm_res, mm_mask); - mm_sum = _mm_add_epi64(mm_sum, mm_res); - } - - mm_sum = _mm_add_epi64(mm_sum, _mm_srli_si128(mm_sum, 8)); - _mm_storel_epi64((__m128i*)(abs_residual_partition_sums+partition), mm_sum); - } - } - } - - /* now merge partitions for lower orders */ - { - unsigned from_partition = 0, to_partition = partitions; - int partition_order; - for(partition_order = (int)max_partition_order - 1; partition_order >= (int)min_partition_order; partition_order--) { - unsigned i; - partitions >>= 1; - for(i = 0; i < partitions; i++) { - abs_residual_partition_sums[to_partition++] = - abs_residual_partition_sums[from_partition ] + - abs_residual_partition_sums[from_partition+1]; - from_partition += 2; - } - } - } -} - -#endif /* FLAC__SSE2_SUPPORTED */ -#endif /* (FLAC__CPU_IA32 || FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN */ -#endif /* FLAC__NO_ASM */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/stream_encoder_intrin_ssse3.c b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/stream_encoder_intrin_ssse3.c deleted file mode 100644 index 2dbd18c5..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/stream_encoder_intrin_ssse3.c +++ /dev/null @@ -1,147 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 -#endif - -#ifndef FLAC__NO_ASM -#if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN -#include "private/stream_encoder.h" -#include "private/bitmath.h" -#ifdef FLAC__SSSE3_SUPPORTED - -#include /* for abs() */ -#include /* SSSE3 */ -#include "FLAC/assert.h" - -FLAC__SSE_TARGET("ssse3") -void FLAC__precompute_partition_info_sums_intrin_ssse3(const FLAC__int32 residual[], FLAC__uint64 abs_residual_partition_sums[], - unsigned residual_samples, unsigned predictor_order, unsigned min_partition_order, unsigned max_partition_order, unsigned bps) -{ - const unsigned default_partition_samples = (residual_samples + predictor_order) >> max_partition_order; - unsigned partitions = 1u << max_partition_order; - - FLAC__ASSERT(default_partition_samples > predictor_order); - - /* first do max_partition_order */ - { - unsigned partition, residual_sample, end = (unsigned)(-(int)predictor_order); - unsigned e1, e3; - __m128i mm_res, mm_sum; - - if(FLAC__bitmath_ilog2(default_partition_samples) + bps + FLAC__MAX_EXTRA_RESIDUAL_BPS < 32) { - for(partition = residual_sample = 0; partition < partitions; partition++) { - end += default_partition_samples; - mm_sum = _mm_setzero_si128(); - - e1 = (residual_sample + 3) & ~3; e3 = end & ~3; - if(e1 > end) - e1 = end; /* try flac -l 1 -b 16 and you'll be here */ - - /* assumption: residual[] is properly aligned so (residual + e1) is properly aligned too and _mm_loadu_si128() is fast */ - for( ; residual_sample < e1; residual_sample++) { - mm_res = _mm_cvtsi32_si128(residual[residual_sample]); - mm_res = _mm_abs_epi32(mm_res); /* abs(INT_MIN) is undefined, but if the residual is INT_MIN we have bigger problems */ - mm_sum = _mm_add_epi32(mm_sum, mm_res); - } - - for( ; residual_sample < e3; residual_sample+=4) { - mm_res = _mm_loadu_si128((const __m128i*)(residual+residual_sample)); - mm_res = _mm_abs_epi32(mm_res); - mm_sum = _mm_add_epi32(mm_sum, mm_res); - } - - for( ; residual_sample < end; residual_sample++) { - mm_res = _mm_cvtsi32_si128(residual[residual_sample]); - mm_res = _mm_abs_epi32(mm_res); - mm_sum = _mm_add_epi32(mm_sum, mm_res); - } - - mm_sum = _mm_hadd_epi32(mm_sum, mm_sum); - mm_sum = _mm_hadd_epi32(mm_sum, mm_sum); - abs_residual_partition_sums[partition] = (FLAC__uint32)_mm_cvtsi128_si32(mm_sum); - } - } - else { /* have to pessimistically use 64 bits for accumulator */ - for(partition = residual_sample = 0; partition < partitions; partition++) { - end += default_partition_samples; - mm_sum = _mm_setzero_si128(); - - e1 = (residual_sample + 1) & ~1; e3 = end & ~1; - FLAC__ASSERT(e1 <= end); - - for( ; residual_sample < e1; residual_sample++) { - mm_res = _mm_cvtsi32_si128(residual[residual_sample]); /* 0 0 0 r0 */ - mm_res = _mm_abs_epi32(mm_res); /* 0 0 0 |r0| == 00 |r0_64| */ - mm_sum = _mm_add_epi64(mm_sum, mm_res); - } - - for( ; residual_sample < e3; residual_sample+=2) { - mm_res = _mm_loadl_epi64((const __m128i*)(residual+residual_sample)); /* 0 0 r1 r0 */ - mm_res = _mm_abs_epi32(mm_res); /* 0 0 |r1| |r0| */ - mm_res = _mm_shuffle_epi32(mm_res, _MM_SHUFFLE(3,1,2,0)); /* 0 |r1| 0 |r0| == |r1_64| |r0_64| */ - mm_sum = _mm_add_epi64(mm_sum, mm_res); - } - - for( ; residual_sample < end; residual_sample++) { - mm_res = _mm_cvtsi32_si128(residual[residual_sample]); - mm_res = _mm_abs_epi32(mm_res); - mm_sum = _mm_add_epi64(mm_sum, mm_res); - } - - mm_sum = _mm_add_epi64(mm_sum, _mm_srli_si128(mm_sum, 8)); - _mm_storel_epi64((__m128i*)(abs_residual_partition_sums+partition), mm_sum); - } - } - } - - /* now merge partitions for lower orders */ - { - unsigned from_partition = 0, to_partition = partitions; - int partition_order; - for(partition_order = (int)max_partition_order - 1; partition_order >= (int)min_partition_order; partition_order--) { - unsigned i; - partitions >>= 1; - for(i = 0; i < partitions; i++) { - abs_residual_partition_sums[to_partition++] = - abs_residual_partition_sums[from_partition ] + - abs_residual_partition_sums[from_partition+1]; - from_partition += 2; - } - } - } -} - -#endif /* FLAC__SSSE3_SUPPORTED */ -#endif /* (FLAC__CPU_IA32 || FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN */ -#endif /* FLAC__NO_ASM */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/win_utf8_io.c b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/win_utf8_io.c deleted file mode 100644 index ceb53533..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/win_utf8_io.c +++ /dev/null @@ -1,373 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2013-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 -#endif - -#include -#include -#include -#include -#include -#include -#include -#define WIN32_LEAN_AND_MEAN -#include /* for WideCharToMultiByte and MultiByteToWideChar */ - -#include "share/win_utf8_io.h" - -#define UTF8_BUFFER_SIZE 32768 - -static -int local_vsnprintf(char *str, size_t size, const char *fmt, va_list va) -{ - int rc; - -#if defined _MSC_VER - if (size == 0) - return 1024; - rc = vsnprintf_s (str, size, _TRUNCATE, fmt, va); - if (rc < 0) - rc = size - 1; -#elif defined __MINGW32__ - rc = __mingw_vsnprintf (str, size, fmt, va); -#else - rc = vsnprintf (str, size, fmt, va); -#endif - - return rc; -} - -static UINT win_utf8_io_codepage = CP_ACP; - -/* convert WCHAR stored Unicode string to UTF-8. Caller is responsible for freeing memory */ -static -char *utf8_from_wchar(const wchar_t *wstr) -{ - char *utf8str; - int len; - - if (!wstr) return NULL; - if ((len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL)) == 0) return NULL; - if ((utf8str = (char *)malloc(++len)) == NULL) return NULL; - if (WideCharToMultiByte(CP_UTF8, 0, wstr, -1, utf8str, len, NULL, NULL) == 0) { - free(utf8str); - utf8str = NULL; - } - - return utf8str; -} - -/* convert UTF-8 back to WCHAR. Caller is responsible for freeing memory */ -static -wchar_t *wchar_from_utf8(const char *str) -{ - wchar_t *widestr; - int len; - - if (!str) return NULL; - len=(int)strlen(str)+1; - if ((widestr = (wchar_t *)malloc(len*sizeof(wchar_t))) != NULL) { - if (MultiByteToWideChar(win_utf8_io_codepage, 0, str, len, widestr, len) == 0) { - if (MultiByteToWideChar(CP_ACP, 0, str, len, widestr, len) == 0) { /* try conversion from Ansi in case the initial UTF-8 conversion had failed */ - free(widestr); - widestr = NULL; - } - } - } - - return widestr; -} - -/* retrieve WCHAR commandline, expand wildcards and convert everything to UTF-8 */ -int get_utf8_argv(int *argc, char ***argv) -{ - typedef int (__cdecl *wgetmainargs_t)(int*, wchar_t***, wchar_t***, int, int*); - wgetmainargs_t wgetmainargs; - HMODULE handle; - int wargc; - wchar_t **wargv; - wchar_t **wenv; - char **utf8argv; - int ret, i; - - if ((handle = LoadLibrary("msvcrt.dll")) == NULL) return 1; - if ((wgetmainargs = (wgetmainargs_t)GetProcAddress(handle, "__wgetmainargs")) == NULL) return 1; - i = 0; - /* if __wgetmainargs expands wildcards then it also erroneously converts \\?\c:\path\to\file.flac to \\file.flac */ - if (wgetmainargs(&wargc, &wargv, &wenv, 1, &i) != 0) return 1; - if ((utf8argv = (char **)calloc(wargc, sizeof(char*))) == NULL) return 1; - ret = 0; - - for (i=0; iactime; - ut.modtime = times->modtime; - } - - if (!(wname = wchar_from_utf8(filename))) return -1; - ret = _wutime64(wname, &ut); - free(wname); - - return ret; -} - -int unlink_utf8(const char *filename) -{ - wchar_t *wname; - int ret; - - if (!(wname = wchar_from_utf8(filename))) return -1; - ret = _wunlink(wname); - free(wname); - - return ret; -} - -int rename_utf8(const char *oldname, const char *newname) -{ - wchar_t *wold = NULL; - wchar_t *wnew = NULL; - int ret = -1; - - while (1) { - if (!(wold = wchar_from_utf8(oldname))) break; - if (!(wnew = wchar_from_utf8(newname))) break; - ret = _wrename(wold, wnew); - break; - } - if (wold) free(wold); - if (wnew) free(wnew); - - return ret; -} - -HANDLE WINAPI CreateFile_utf8(const char *lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) -{ - wchar_t *wname; - HANDLE handle = INVALID_HANDLE_VALUE; - - if ((wname = wchar_from_utf8(lpFileName)) != NULL) { - handle = CreateFileW(wname, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); - free(wname); - } - - return handle; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/window.c b/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/window.c deleted file mode 100644 index 4387ef72..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/src/window.c +++ /dev/null @@ -1,282 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2006-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 -#endif - -#include -#include "share/compat.h" -#include "FLAC/assert.h" -#include "FLAC/format.h" -#include "private/window.h" - -#ifndef FLAC__INTEGER_ONLY_LIBRARY - - -void FLAC__window_bartlett(FLAC__real *window, const FLAC__int32 L) -{ - const FLAC__int32 N = L - 1; - FLAC__int32 n; - - if (L & 1) { - for (n = 0; n <= N/2; n++) - window[n] = 2.0f * n / (float)N; - for (; n <= N; n++) - window[n] = 2.0f - 2.0f * n / (float)N; - } - else { - for (n = 0; n <= L/2-1; n++) - window[n] = 2.0f * n / (float)N; - for (; n <= N; n++) - window[n] = 2.0f - 2.0f * n / (float)N; - } -} - -void FLAC__window_bartlett_hann(FLAC__real *window, const FLAC__int32 L) -{ - const FLAC__int32 N = L - 1; - FLAC__int32 n; - - for (n = 0; n < L; n++) - window[n] = (FLAC__real)(0.62f - 0.48f * fabs((float)n/(float)N-0.5f) - 0.38f * cos(2.0f * M_PI * ((float)n/(float)N))); -} - -void FLAC__window_blackman(FLAC__real *window, const FLAC__int32 L) -{ - const FLAC__int32 N = L - 1; - FLAC__int32 n; - - for (n = 0; n < L; n++) - window[n] = (FLAC__real)(0.42f - 0.5f * cos(2.0f * M_PI * n / N) + 0.08f * cos(4.0f * M_PI * n / N)); -} - -/* 4-term -92dB side-lobe */ -void FLAC__window_blackman_harris_4term_92db_sidelobe(FLAC__real *window, const FLAC__int32 L) -{ - const FLAC__int32 N = L - 1; - FLAC__int32 n; - - for (n = 0; n <= N; n++) - window[n] = (FLAC__real)(0.35875f - 0.48829f * cos(2.0f * M_PI * n / N) + 0.14128f * cos(4.0f * M_PI * n / N) - 0.01168f * cos(6.0f * M_PI * n / N)); -} - -void FLAC__window_connes(FLAC__real *window, const FLAC__int32 L) -{ - const FLAC__int32 N = L - 1; - const double N2 = (double)N / 2.; - FLAC__int32 n; - - for (n = 0; n <= N; n++) { - double k = ((double)n - N2) / N2; - k = 1.0f - k * k; - window[n] = (FLAC__real)(k * k); - } -} - -void FLAC__window_flattop(FLAC__real *window, const FLAC__int32 L) -{ - const FLAC__int32 N = L - 1; - FLAC__int32 n; - - for (n = 0; n < L; n++) - window[n] = (FLAC__real)(1.0f - 1.93f * cos(2.0f * M_PI * n / N) + 1.29f * cos(4.0f * M_PI * n / N) - 0.388f * cos(6.0f * M_PI * n / N) + 0.0322f * cos(8.0f * M_PI * n / N)); -} - -void FLAC__window_gauss(FLAC__real *window, const FLAC__int32 L, const FLAC__real stddev) -{ - const FLAC__int32 N = L - 1; - const double N2 = (double)N / 2.; - FLAC__int32 n; - - for (n = 0; n <= N; n++) { - const double k = ((double)n - N2) / (stddev * N2); - window[n] = (FLAC__real)exp(-0.5f * k * k); - } -} - -void FLAC__window_hamming(FLAC__real *window, const FLAC__int32 L) -{ - const FLAC__int32 N = L - 1; - FLAC__int32 n; - - for (n = 0; n < L; n++) - window[n] = (FLAC__real)(0.54f - 0.46f * cos(2.0f * M_PI * n / N)); -} - -void FLAC__window_hann(FLAC__real *window, const FLAC__int32 L) -{ - const FLAC__int32 N = L - 1; - FLAC__int32 n; - - for (n = 0; n < L; n++) - window[n] = (FLAC__real)(0.5f - 0.5f * cos(2.0f * M_PI * n / N)); -} - -void FLAC__window_kaiser_bessel(FLAC__real *window, const FLAC__int32 L) -{ - const FLAC__int32 N = L - 1; - FLAC__int32 n; - - for (n = 0; n < L; n++) - window[n] = (FLAC__real)(0.402f - 0.498f * cos(2.0f * M_PI * n / N) + 0.098f * cos(4.0f * M_PI * n / N) - 0.001f * cos(6.0f * M_PI * n / N)); -} - -void FLAC__window_nuttall(FLAC__real *window, const FLAC__int32 L) -{ - const FLAC__int32 N = L - 1; - FLAC__int32 n; - - for (n = 0; n < L; n++) - window[n] = (FLAC__real)(0.3635819f - 0.4891775f*cos(2.0f*M_PI*n/N) + 0.1365995f*cos(4.0f*M_PI*n/N) - 0.0106411f*cos(6.0f*M_PI*n/N)); -} - -void FLAC__window_rectangle(FLAC__real *window, const FLAC__int32 L) -{ - FLAC__int32 n; - - for (n = 0; n < L; n++) - window[n] = 1.0f; -} - -void FLAC__window_triangle(FLAC__real *window, const FLAC__int32 L) -{ - FLAC__int32 n; - - if (L & 1) { - for (n = 1; n <= (L+1)/2; n++) - window[n-1] = 2.0f * n / ((float)L + 1.0f); - for (; n <= L; n++) - window[n-1] = (float)(2 * (L - n + 1)) / ((float)L + 1.0f); - } - else { - for (n = 1; n <= L/2; n++) - window[n-1] = 2.0f * n / ((float)L + 1.0f); - for (; n <= L; n++) - window[n-1] = (float)(2 * (L - n + 1)) / ((float)L + 1.0f); - } -} - -void FLAC__window_tukey(FLAC__real *window, const FLAC__int32 L, const FLAC__real p) -{ - if (p <= 0.0) - FLAC__window_rectangle(window, L); - else if (p >= 1.0) - FLAC__window_hann(window, L); - else { - const FLAC__int32 Np = (FLAC__int32)(p / 2.0f * L) - 1; - FLAC__int32 n; - /* start with rectangle... */ - FLAC__window_rectangle(window, L); - /* ...replace ends with hann */ - if (Np > 0) { - for (n = 0; n <= Np; n++) { - window[n] = (FLAC__real)(0.5f - 0.5f * cos(M_PI * n / Np)); - window[L-Np-1+n] = (FLAC__real)(0.5f - 0.5f * cos(M_PI * (n+Np) / Np)); - } - } - } -} - -void FLAC__window_partial_tukey(FLAC__real *window, const FLAC__int32 L, const FLAC__real p, const FLAC__real start, const FLAC__real end) -{ - const FLAC__int32 start_n = (FLAC__int32)(start * L); - const FLAC__int32 end_n = (FLAC__int32)(end * L); - const FLAC__int32 N = end_n - start_n; - FLAC__int32 Np, n, i; - - if (p <= 0.0f) - FLAC__window_partial_tukey(window, L, 0.05f, start, end); - else if (p >= 1.0f) - FLAC__window_partial_tukey(window, L, 0.95f, start, end); - else { - - Np = (FLAC__int32)(p / 2.0f * N); - - for (n = 0; n < start_n && n < L; n++) - window[n] = 0.0f; - for (i = 1; n < (start_n+Np) && n < L; n++, i++) - window[n] = (FLAC__real)(0.5f - 0.5f * cos(M_PI * i / Np)); - for (; n < (end_n-Np) && n < L; n++) - window[n] = 1.0f; - for (i = Np; n < end_n && n < L; n++, i--) - window[n] = (FLAC__real)(0.5f - 0.5f * cos(M_PI * i / Np)); - for (; n < L; n++) - window[n] = 0.0f; - } -} - -void FLAC__window_punchout_tukey(FLAC__real *window, const FLAC__int32 L, const FLAC__real p, const FLAC__real start, const FLAC__real end) -{ - const FLAC__int32 start_n = (FLAC__int32)(start * L); - const FLAC__int32 end_n = (FLAC__int32)(end * L); - FLAC__int32 Ns, Ne, n, i; - - if (p <= 0.0f) - FLAC__window_punchout_tukey(window, L, 0.05f, start, end); - else if (p >= 1.0f) - FLAC__window_punchout_tukey(window, L, 0.95f, start, end); - else { - - Ns = (FLAC__int32)(p / 2.0f * start_n); - Ne = (FLAC__int32)(p / 2.0f * (L - end_n)); - - for (n = 0, i = 1; n < Ns && n < L; n++, i++) - window[n] = (FLAC__real)(0.5f - 0.5f * cos(M_PI * i / Ns)); - for (; n < start_n-Ns && n < L; n++) - window[n] = 1.0f; - for (i = Ns; n < start_n && n < L; n++, i--) - window[n] = (FLAC__real)(0.5f - 0.5f * cos(M_PI * i / Ns)); - for (; n < end_n && n < L; n++) - window[n] = 0.0f; - for (i = 1; n < end_n+Ne && n < L; n++, i++) - window[n] = (FLAC__real)(0.5f - 0.5f * cos(M_PI * i / Ne)); - for (; n < L - (Ne) && n < L; n++) - window[n] = 1.0f; - for (i = Ne; n < L; n++, i--) - window[n] = (FLAC__real)(0.5f - 0.5f * cos(M_PI * i / Ne)); - } -} - -void FLAC__window_welch(FLAC__real *window, const FLAC__int32 L) -{ - const FLAC__int32 N = L - 1; - const double N2 = (double)N / 2.; - FLAC__int32 n; - - for (n = 0; n <= N; n++) { - const double k = ((double)n - N2) / N2; - window[n] = (FLAC__real)(1.0f - k * k); - } -} - -#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/stream_decoder.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/stream_decoder.h deleted file mode 100644 index 9bfdd1f5..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/stream_decoder.h +++ /dev/null @@ -1,1560 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 FLAC__STREAM_DECODER_H -#define FLAC__STREAM_DECODER_H - -#include /* for FILE */ -#include "export.h" -#include "format.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -/** \file include/FLAC/stream_decoder.h - * - * \brief - * This module contains the functions which implement the stream - * decoder. - * - * See the detailed documentation in the - * \link flac_stream_decoder stream decoder \endlink module. - */ - -/** \defgroup flac_decoder FLAC/ \*_decoder.h: decoder interfaces - * \ingroup flac - * - * \brief - * This module describes the decoder layers provided by libFLAC. - * - * The stream decoder can be used to decode complete streams either from - * the client via callbacks, or directly from a file, depending on how - * it is initialized. When decoding via callbacks, the client provides - * callbacks for reading FLAC data and writing decoded samples, and - * handling metadata and errors. If the client also supplies seek-related - * callback, the decoder function for sample-accurate seeking within the - * FLAC input is also available. When decoding from a file, the client - * needs only supply a filename or open \c FILE* and write/metadata/error - * callbacks; the rest of the callbacks are supplied internally. For more - * info see the \link flac_stream_decoder stream decoder \endlink module. - */ - -/** \defgroup flac_stream_decoder FLAC/stream_decoder.h: stream decoder interface - * \ingroup flac_decoder - * - * \brief - * This module contains the functions which implement the stream - * decoder. - * - * The stream decoder can decode native FLAC, and optionally Ogg FLAC - * (check FLAC_API_SUPPORTS_OGG_FLAC) streams and files. - * - * The basic usage of this decoder is as follows: - * - The program creates an instance of a decoder using - * FLAC__stream_decoder_new(). - * - The program overrides the default settings using - * FLAC__stream_decoder_set_*() functions. - * - The program initializes the instance to validate the settings and - * prepare for decoding using - * - FLAC__stream_decoder_init_stream() or FLAC__stream_decoder_init_FILE() - * or FLAC__stream_decoder_init_file() for native FLAC, - * - FLAC__stream_decoder_init_ogg_stream() or FLAC__stream_decoder_init_ogg_FILE() - * or FLAC__stream_decoder_init_ogg_file() for Ogg FLAC - * - The program calls the FLAC__stream_decoder_process_*() functions - * to decode data, which subsequently calls the callbacks. - * - The program finishes the decoding with FLAC__stream_decoder_finish(), - * which flushes the input and output and resets the decoder to the - * uninitialized state. - * - The instance may be used again or deleted with - * FLAC__stream_decoder_delete(). - * - * In more detail, the program will create a new instance by calling - * FLAC__stream_decoder_new(), then call FLAC__stream_decoder_set_*() - * functions to override the default decoder options, and call - * one of the FLAC__stream_decoder_init_*() functions. - * - * There are three initialization functions for native FLAC, one for - * setting up the decoder to decode FLAC data from the client via - * callbacks, and two for decoding directly from a FLAC file. - * - * For decoding via callbacks, use FLAC__stream_decoder_init_stream(). - * You must also supply several callbacks for handling I/O. Some (like - * seeking) are optional, depending on the capabilities of the input. - * - * For decoding directly from a file, use FLAC__stream_decoder_init_FILE() - * or FLAC__stream_decoder_init_file(). Then you must only supply an open - * \c FILE* or filename and fewer callbacks; the decoder will handle - * the other callbacks internally. - * - * There are three similarly-named init functions for decoding from Ogg - * FLAC streams. Check \c FLAC_API_SUPPORTS_OGG_FLAC to find out if the - * library has been built with Ogg support. - * - * Once the decoder is initialized, your program will call one of several - * functions to start the decoding process: - * - * - FLAC__stream_decoder_process_single() - Tells the decoder to process at - * most one metadata block or audio frame and return, calling either the - * metadata callback or write callback, respectively, once. If the decoder - * loses sync it will return with only the error callback being called. - * - FLAC__stream_decoder_process_until_end_of_metadata() - Tells the decoder - * to process the stream from the current location and stop upon reaching - * the first audio frame. The client will get one metadata, write, or error - * callback per metadata block, audio frame, or sync error, respectively. - * - FLAC__stream_decoder_process_until_end_of_stream() - Tells the decoder - * to process the stream from the current location until the read callback - * returns FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM or - * FLAC__STREAM_DECODER_READ_STATUS_ABORT. The client will get one metadata, - * write, or error callback per metadata block, audio frame, or sync error, - * respectively. - * - * When the decoder has finished decoding (normally or through an abort), - * the instance is finished by calling FLAC__stream_decoder_finish(), which - * ensures the decoder is in the correct state and frees memory. Then the - * instance may be deleted with FLAC__stream_decoder_delete() or initialized - * again to decode another stream. - * - * Seeking is exposed through the FLAC__stream_decoder_seek_absolute() method. - * At any point after the stream decoder has been initialized, the client can - * call this function to seek to an exact sample within the stream. - * Subsequently, the first time the write callback is called it will be - * passed a (possibly partial) block starting at that sample. - * - * If the client cannot seek via the callback interface provided, but still - * has another way of seeking, it can flush the decoder using - * FLAC__stream_decoder_flush() and start feeding data from the new position - * through the read callback. - * - * The stream decoder also provides MD5 signature checking. If this is - * turned on before initialization, FLAC__stream_decoder_finish() will - * report when the decoded MD5 signature does not match the one stored - * in the STREAMINFO block. MD5 checking is automatically turned off - * (until the next FLAC__stream_decoder_reset()) if there is no signature - * in the STREAMINFO block or when a seek is attempted. - * - * The FLAC__stream_decoder_set_metadata_*() functions deserve special - * attention. By default, the decoder only calls the metadata_callback for - * the STREAMINFO block. These functions allow you to tell the decoder - * explicitly which blocks to parse and return via the metadata_callback - * and/or which to skip. Use a FLAC__stream_decoder_set_metadata_respond_all(), - * FLAC__stream_decoder_set_metadata_ignore() ... or FLAC__stream_decoder_set_metadata_ignore_all(), - * FLAC__stream_decoder_set_metadata_respond() ... sequence to exactly specify - * which blocks to return. Remember that metadata blocks can potentially - * be big (for example, cover art) so filtering out the ones you don't - * use can reduce the memory requirements of the decoder. Also note the - * special forms FLAC__stream_decoder_set_metadata_respond_application(id) - * and FLAC__stream_decoder_set_metadata_ignore_application(id) for - * filtering APPLICATION blocks based on the application ID. - * - * STREAMINFO and SEEKTABLE blocks are always parsed and used internally, but - * they still can legally be filtered from the metadata_callback. - * - * \note - * The "set" functions may only be called when the decoder is in the - * state FLAC__STREAM_DECODER_UNINITIALIZED, i.e. after - * FLAC__stream_decoder_new() or FLAC__stream_decoder_finish(), but - * before FLAC__stream_decoder_init_*(). If this is the case they will - * return \c true, otherwise \c false. - * - * \note - * FLAC__stream_decoder_finish() resets all settings to the constructor - * defaults, including the callbacks. - * - * \{ - */ - - -/** State values for a FLAC__StreamDecoder - * - * The decoder's state can be obtained by calling FLAC__stream_decoder_get_state(). - */ -typedef enum { - - FLAC__STREAM_DECODER_SEARCH_FOR_METADATA = 0, - /**< The decoder is ready to search for metadata. */ - - FLAC__STREAM_DECODER_READ_METADATA, - /**< The decoder is ready to or is in the process of reading metadata. */ - - FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC, - /**< The decoder is ready to or is in the process of searching for the - * frame sync code. - */ - - FLAC__STREAM_DECODER_READ_FRAME, - /**< The decoder is ready to or is in the process of reading a frame. */ - - FLAC__STREAM_DECODER_END_OF_STREAM, - /**< The decoder has reached the end of the stream. */ - - FLAC__STREAM_DECODER_OGG_ERROR, - /**< An error occurred in the underlying Ogg layer. */ - - FLAC__STREAM_DECODER_SEEK_ERROR, - /**< An error occurred while seeking. The decoder must be flushed - * with FLAC__stream_decoder_flush() or reset with - * FLAC__stream_decoder_reset() before decoding can continue. - */ - - FLAC__STREAM_DECODER_ABORTED, - /**< The decoder was aborted by the read callback. */ - - FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR, - /**< An error occurred allocating memory. The decoder is in an invalid - * state and can no longer be used. - */ - - FLAC__STREAM_DECODER_UNINITIALIZED - /**< The decoder is in the uninitialized state; one of the - * FLAC__stream_decoder_init_*() functions must be called before samples - * can be processed. - */ - -} FLAC__StreamDecoderState; - -/** Maps a FLAC__StreamDecoderState to a C string. - * - * Using a FLAC__StreamDecoderState as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamDecoderStateString[]; - - -/** Possible return values for the FLAC__stream_decoder_init_*() functions. - */ -typedef enum { - - FLAC__STREAM_DECODER_INIT_STATUS_OK = 0, - /**< Initialization was successful. */ - - FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER, - /**< The library was not compiled with support for the given container - * format. - */ - - FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS, - /**< A required callback was not supplied. */ - - FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR, - /**< An error occurred allocating memory. */ - - FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE, - /**< fopen() failed in FLAC__stream_decoder_init_file() or - * FLAC__stream_decoder_init_ogg_file(). */ - - FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED - /**< FLAC__stream_decoder_init_*() was called when the decoder was - * already initialized, usually because - * FLAC__stream_decoder_finish() was not called. - */ - -} FLAC__StreamDecoderInitStatus; - -/** Maps a FLAC__StreamDecoderInitStatus to a C string. - * - * Using a FLAC__StreamDecoderInitStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamDecoderInitStatusString[]; - - -/** Return values for the FLAC__StreamDecoder read callback. - */ -typedef enum { - - FLAC__STREAM_DECODER_READ_STATUS_CONTINUE, - /**< The read was OK and decoding can continue. */ - - FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM, - /**< The read was attempted while at the end of the stream. Note that - * the client must only return this value when the read callback was - * called when already at the end of the stream. Otherwise, if the read - * itself moves to the end of the stream, the client should still return - * the data and \c FLAC__STREAM_DECODER_READ_STATUS_CONTINUE, and then on - * the next read callback it should return - * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM with a byte count - * of \c 0. - */ - - FLAC__STREAM_DECODER_READ_STATUS_ABORT - /**< An unrecoverable error occurred. The decoder will return from the process call. */ - -} FLAC__StreamDecoderReadStatus; - -/** Maps a FLAC__StreamDecoderReadStatus to a C string. - * - * Using a FLAC__StreamDecoderReadStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamDecoderReadStatusString[]; - - -/** Return values for the FLAC__StreamDecoder seek callback. - */ -typedef enum { - - FLAC__STREAM_DECODER_SEEK_STATUS_OK, - /**< The seek was OK and decoding can continue. */ - - FLAC__STREAM_DECODER_SEEK_STATUS_ERROR, - /**< An unrecoverable error occurred. The decoder will return from the process call. */ - - FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED - /**< Client does not support seeking. */ - -} FLAC__StreamDecoderSeekStatus; - -/** Maps a FLAC__StreamDecoderSeekStatus to a C string. - * - * Using a FLAC__StreamDecoderSeekStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamDecoderSeekStatusString[]; - - -/** Return values for the FLAC__StreamDecoder tell callback. - */ -typedef enum { - - FLAC__STREAM_DECODER_TELL_STATUS_OK, - /**< The tell was OK and decoding can continue. */ - - FLAC__STREAM_DECODER_TELL_STATUS_ERROR, - /**< An unrecoverable error occurred. The decoder will return from the process call. */ - - FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED - /**< Client does not support telling the position. */ - -} FLAC__StreamDecoderTellStatus; - -/** Maps a FLAC__StreamDecoderTellStatus to a C string. - * - * Using a FLAC__StreamDecoderTellStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamDecoderTellStatusString[]; - - -/** Return values for the FLAC__StreamDecoder length callback. - */ -typedef enum { - - FLAC__STREAM_DECODER_LENGTH_STATUS_OK, - /**< The length call was OK and decoding can continue. */ - - FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR, - /**< An unrecoverable error occurred. The decoder will return from the process call. */ - - FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED - /**< Client does not support reporting the length. */ - -} FLAC__StreamDecoderLengthStatus; - -/** Maps a FLAC__StreamDecoderLengthStatus to a C string. - * - * Using a FLAC__StreamDecoderLengthStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamDecoderLengthStatusString[]; - - -/** Return values for the FLAC__StreamDecoder write callback. - */ -typedef enum { - - FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE, - /**< The write was OK and decoding can continue. */ - - FLAC__STREAM_DECODER_WRITE_STATUS_ABORT - /**< An unrecoverable error occurred. The decoder will return from the process call. */ - -} FLAC__StreamDecoderWriteStatus; - -/** Maps a FLAC__StreamDecoderWriteStatus to a C string. - * - * Using a FLAC__StreamDecoderWriteStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamDecoderWriteStatusString[]; - - -/** Possible values passed back to the FLAC__StreamDecoder error callback. - * \c FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC is the generic catch- - * all. The rest could be caused by bad sync (false synchronization on - * data that is not the start of a frame) or corrupted data. The error - * itself is the decoder's best guess at what happened assuming a correct - * sync. For example \c FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER - * could be caused by a correct sync on the start of a frame, but some - * data in the frame header was corrupted. Or it could be the result of - * syncing on a point the stream that looked like the starting of a frame - * but was not. \c FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM - * could be because the decoder encountered a valid frame made by a future - * version of the encoder which it cannot parse, or because of a false - * sync making it appear as though an encountered frame was generated by - * a future encoder. - */ -typedef enum { - - FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC, - /**< An error in the stream caused the decoder to lose synchronization. */ - - FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER, - /**< The decoder encountered a corrupted frame header. */ - - FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH, - /**< The frame's data did not match the CRC in the footer. */ - - FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM - /**< The decoder encountered reserved fields in use in the stream. */ - -} FLAC__StreamDecoderErrorStatus; - -/** Maps a FLAC__StreamDecoderErrorStatus to a C string. - * - * Using a FLAC__StreamDecoderErrorStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamDecoderErrorStatusString[]; - - -/*********************************************************************** - * - * class FLAC__StreamDecoder - * - ***********************************************************************/ - -struct FLAC__StreamDecoderProtected; -struct FLAC__StreamDecoderPrivate; -/** The opaque structure definition for the stream decoder type. - * See the \link flac_stream_decoder stream decoder module \endlink - * for a detailed description. - */ -typedef struct { - struct FLAC__StreamDecoderProtected *protected_; /* avoid the C++ keyword 'protected' */ - struct FLAC__StreamDecoderPrivate *private_; /* avoid the C++ keyword 'private' */ -} FLAC__StreamDecoder; - -/** Signature for the read callback. - * - * A function pointer matching this signature must be passed to - * FLAC__stream_decoder_init*_stream(). The supplied function will be - * called when the decoder needs more input data. The address of the - * buffer to be filled is supplied, along with the number of bytes the - * buffer can hold. The callback may choose to supply less data and - * modify the byte count but must be careful not to overflow the buffer. - * The callback then returns a status code chosen from - * FLAC__StreamDecoderReadStatus. - * - * Here is an example of a read callback for stdio streams: - * \code - * FLAC__StreamDecoderReadStatus read_cb(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) - * { - * FILE *file = ((MyClientData*)client_data)->file; - * if(*bytes > 0) { - * *bytes = fread(buffer, sizeof(FLAC__byte), *bytes, file); - * if(ferror(file)) - * return FLAC__STREAM_DECODER_READ_STATUS_ABORT; - * else if(*bytes == 0) - * return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; - * else - * return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; - * } - * else - * return FLAC__STREAM_DECODER_READ_STATUS_ABORT; - * } - * \endcode - * - * \note In general, FLAC__StreamDecoder functions which change the - * state should not be called on the \a decoder while in the callback. - * - * \param decoder The decoder instance calling the callback. - * \param buffer A pointer to a location for the callee to store - * data to be decoded. - * \param bytes A pointer to the size of the buffer. On entry - * to the callback, it contains the maximum number - * of bytes that may be stored in \a buffer. The - * callee must set it to the actual number of bytes - * stored (0 in case of error or end-of-stream) before - * returning. - * \param client_data The callee's client data set through - * FLAC__stream_decoder_init_*(). - * \retval FLAC__StreamDecoderReadStatus - * The callee's return status. Note that the callback should return - * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM if and only if - * zero bytes were read and there is no more data to be read. - */ -typedef FLAC__StreamDecoderReadStatus (*FLAC__StreamDecoderReadCallback)(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); - -/** Signature for the seek callback. - * - * A function pointer matching this signature may be passed to - * FLAC__stream_decoder_init*_stream(). The supplied function will be - * called when the decoder needs to seek the input stream. The decoder - * will pass the absolute byte offset to seek to, 0 meaning the - * beginning of the stream. - * - * Here is an example of a seek callback for stdio streams: - * \code - * FLAC__StreamDecoderSeekStatus seek_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data) - * { - * FILE *file = ((MyClientData*)client_data)->file; - * if(file == stdin) - * return FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED; - * else if(fseeko(file, (off_t)absolute_byte_offset, SEEK_SET) < 0) - * return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR; - * else - * return FLAC__STREAM_DECODER_SEEK_STATUS_OK; - * } - * \endcode - * - * \note In general, FLAC__StreamDecoder functions which change the - * state should not be called on the \a decoder while in the callback. - * - * \param decoder The decoder instance calling the callback. - * \param absolute_byte_offset The offset from the beginning of the stream - * to seek to. - * \param client_data The callee's client data set through - * FLAC__stream_decoder_init_*(). - * \retval FLAC__StreamDecoderSeekStatus - * The callee's return status. - */ -typedef FLAC__StreamDecoderSeekStatus (*FLAC__StreamDecoderSeekCallback)(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data); - -/** Signature for the tell callback. - * - * A function pointer matching this signature may be passed to - * FLAC__stream_decoder_init*_stream(). The supplied function will be - * called when the decoder wants to know the current position of the - * stream. The callback should return the byte offset from the - * beginning of the stream. - * - * Here is an example of a tell callback for stdio streams: - * \code - * FLAC__StreamDecoderTellStatus tell_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data) - * { - * FILE *file = ((MyClientData*)client_data)->file; - * off_t pos; - * if(file == stdin) - * return FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED; - * else if((pos = ftello(file)) < 0) - * return FLAC__STREAM_DECODER_TELL_STATUS_ERROR; - * else { - * *absolute_byte_offset = (FLAC__uint64)pos; - * return FLAC__STREAM_DECODER_TELL_STATUS_OK; - * } - * } - * \endcode - * - * \note In general, FLAC__StreamDecoder functions which change the - * state should not be called on the \a decoder while in the callback. - * - * \param decoder The decoder instance calling the callback. - * \param absolute_byte_offset A pointer to storage for the current offset - * from the beginning of the stream. - * \param client_data The callee's client data set through - * FLAC__stream_decoder_init_*(). - * \retval FLAC__StreamDecoderTellStatus - * The callee's return status. - */ -typedef FLAC__StreamDecoderTellStatus (*FLAC__StreamDecoderTellCallback)(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data); - -/** Signature for the length callback. - * - * A function pointer matching this signature may be passed to - * FLAC__stream_decoder_init*_stream(). The supplied function will be - * called when the decoder wants to know the total length of the stream - * in bytes. - * - * Here is an example of a length callback for stdio streams: - * \code - * FLAC__StreamDecoderLengthStatus length_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data) - * { - * FILE *file = ((MyClientData*)client_data)->file; - * struct stat filestats; - * - * if(file == stdin) - * return FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED; - * else if(fstat(fileno(file), &filestats) != 0) - * return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR; - * else { - * *stream_length = (FLAC__uint64)filestats.st_size; - * return FLAC__STREAM_DECODER_LENGTH_STATUS_OK; - * } - * } - * \endcode - * - * \note In general, FLAC__StreamDecoder functions which change the - * state should not be called on the \a decoder while in the callback. - * - * \param decoder The decoder instance calling the callback. - * \param stream_length A pointer to storage for the length of the stream - * in bytes. - * \param client_data The callee's client data set through - * FLAC__stream_decoder_init_*(). - * \retval FLAC__StreamDecoderLengthStatus - * The callee's return status. - */ -typedef FLAC__StreamDecoderLengthStatus (*FLAC__StreamDecoderLengthCallback)(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data); - -/** Signature for the EOF callback. - * - * A function pointer matching this signature may be passed to - * FLAC__stream_decoder_init*_stream(). The supplied function will be - * called when the decoder needs to know if the end of the stream has - * been reached. - * - * Here is an example of a EOF callback for stdio streams: - * FLAC__bool eof_cb(const FLAC__StreamDecoder *decoder, void *client_data) - * \code - * { - * FILE *file = ((MyClientData*)client_data)->file; - * return feof(file)? true : false; - * } - * \endcode - * - * \note In general, FLAC__StreamDecoder functions which change the - * state should not be called on the \a decoder while in the callback. - * - * \param decoder The decoder instance calling the callback. - * \param client_data The callee's client data set through - * FLAC__stream_decoder_init_*(). - * \retval FLAC__bool - * \c true if the currently at the end of the stream, else \c false. - */ -typedef FLAC__bool (*FLAC__StreamDecoderEofCallback)(const FLAC__StreamDecoder *decoder, void *client_data); - -/** Signature for the write callback. - * - * A function pointer matching this signature must be passed to one of - * the FLAC__stream_decoder_init_*() functions. - * The supplied function will be called when the decoder has decoded a - * single audio frame. The decoder will pass the frame metadata as well - * as an array of pointers (one for each channel) pointing to the - * decoded audio. - * - * \note In general, FLAC__StreamDecoder functions which change the - * state should not be called on the \a decoder while in the callback. - * - * \param decoder The decoder instance calling the callback. - * \param frame The description of the decoded frame. See - * FLAC__Frame. - * \param buffer An array of pointers to decoded channels of data. - * Each pointer will point to an array of signed - * samples of length \a frame->header.blocksize. - * Channels will be ordered according to the FLAC - * specification; see the documentation for the - * frame header. - * \param client_data The callee's client data set through - * FLAC__stream_decoder_init_*(). - * \retval FLAC__StreamDecoderWriteStatus - * The callee's return status. - */ -typedef FLAC__StreamDecoderWriteStatus (*FLAC__StreamDecoderWriteCallback)(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data); - -/** Signature for the metadata callback. - * - * A function pointer matching this signature must be passed to one of - * the FLAC__stream_decoder_init_*() functions. - * The supplied function will be called when the decoder has decoded a - * metadata block. In a valid FLAC file there will always be one - * \c STREAMINFO block, followed by zero or more other metadata blocks. - * These will be supplied by the decoder in the same order as they - * appear in the stream and always before the first audio frame (i.e. - * write callback). The metadata block that is passed in must not be - * modified, and it doesn't live beyond the callback, so you should make - * a copy of it with FLAC__metadata_object_clone() if you will need it - * elsewhere. Since metadata blocks can potentially be large, by - * default the decoder only calls the metadata callback for the - * \c STREAMINFO block; you can instruct the decoder to pass or filter - * other blocks with FLAC__stream_decoder_set_metadata_*() calls. - * - * \note In general, FLAC__StreamDecoder functions which change the - * state should not be called on the \a decoder while in the callback. - * - * \param decoder The decoder instance calling the callback. - * \param metadata The decoded metadata block. - * \param client_data The callee's client data set through - * FLAC__stream_decoder_init_*(). - */ -typedef void (*FLAC__StreamDecoderMetadataCallback)(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data); - -/** Signature for the error callback. - * - * A function pointer matching this signature must be passed to one of - * the FLAC__stream_decoder_init_*() functions. - * The supplied function will be called whenever an error occurs during - * decoding. - * - * \note In general, FLAC__StreamDecoder functions which change the - * state should not be called on the \a decoder while in the callback. - * - * \param decoder The decoder instance calling the callback. - * \param status The error encountered by the decoder. - * \param client_data The callee's client data set through - * FLAC__stream_decoder_init_*(). - */ -typedef void (*FLAC__StreamDecoderErrorCallback)(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data); - - -/*********************************************************************** - * - * Class constructor/destructor - * - ***********************************************************************/ - -/** Create a new stream decoder instance. The instance is created with - * default settings; see the individual FLAC__stream_decoder_set_*() - * functions for each setting's default. - * - * \retval FLAC__StreamDecoder* - * \c NULL if there was an error allocating memory, else the new instance. - */ -FLAC_API FLAC__StreamDecoder *FLAC__stream_decoder_new(void); - -/** Free a decoder instance. Deletes the object pointed to by \a decoder. - * - * \param decoder A pointer to an existing decoder. - * \assert - * \code decoder != NULL \endcode - */ -FLAC_API void FLAC__stream_decoder_delete(FLAC__StreamDecoder *decoder); - - -/*********************************************************************** - * - * Public class method prototypes - * - ***********************************************************************/ - -/** Set the serial number for the FLAC stream within the Ogg container. - * The default behavior is to use the serial number of the first Ogg - * page. Setting a serial number here will explicitly specify which - * stream is to be decoded. - * - * \note - * This does not need to be set for native FLAC decoding. - * - * \default \c use serial number of first page - * \param decoder A decoder instance to set. - * \param serial_number See above. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if the decoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_set_ogg_serial_number(FLAC__StreamDecoder *decoder, long serial_number); - -/** Set the "MD5 signature checking" flag. If \c true, the decoder will - * compute the MD5 signature of the unencoded audio data while decoding - * and compare it to the signature from the STREAMINFO block, if it - * exists, during FLAC__stream_decoder_finish(). - * - * MD5 signature checking will be turned off (until the next - * FLAC__stream_decoder_reset()) if there is no signature in the - * STREAMINFO block or when a seek is attempted. - * - * Clients that do not use the MD5 check should leave this off to speed - * up decoding. - * - * \default \c false - * \param decoder A decoder instance to set. - * \param value Flag value (see above). - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if the decoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_set_md5_checking(FLAC__StreamDecoder *decoder, FLAC__bool value); - -/** Direct the decoder to pass on all metadata blocks of type \a type. - * - * \default By default, only the \c STREAMINFO block is returned via the - * metadata callback. - * \param decoder A decoder instance to set. - * \param type See above. - * \assert - * \code decoder != NULL \endcode - * \a type is valid - * \retval FLAC__bool - * \c false if the decoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond(FLAC__StreamDecoder *decoder, FLAC__MetadataType type); - -/** Direct the decoder to pass on all APPLICATION metadata blocks of the - * given \a id. - * - * \default By default, only the \c STREAMINFO block is returned via the - * metadata callback. - * \param decoder A decoder instance to set. - * \param id See above. - * \assert - * \code decoder != NULL \endcode - * \code id != NULL \endcode - * \retval FLAC__bool - * \c false if the decoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4]); - -/** Direct the decoder to pass on all metadata blocks of any type. - * - * \default By default, only the \c STREAMINFO block is returned via the - * metadata callback. - * \param decoder A decoder instance to set. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if the decoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_all(FLAC__StreamDecoder *decoder); - -/** Direct the decoder to filter out all metadata blocks of type \a type. - * - * \default By default, only the \c STREAMINFO block is returned via the - * metadata callback. - * \param decoder A decoder instance to set. - * \param type See above. - * \assert - * \code decoder != NULL \endcode - * \a type is valid - * \retval FLAC__bool - * \c false if the decoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore(FLAC__StreamDecoder *decoder, FLAC__MetadataType type); - -/** Direct the decoder to filter out all APPLICATION metadata blocks of - * the given \a id. - * - * \default By default, only the \c STREAMINFO block is returned via the - * metadata callback. - * \param decoder A decoder instance to set. - * \param id See above. - * \assert - * \code decoder != NULL \endcode - * \code id != NULL \endcode - * \retval FLAC__bool - * \c false if the decoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4]); - -/** Direct the decoder to filter out all metadata blocks of any type. - * - * \default By default, only the \c STREAMINFO block is returned via the - * metadata callback. - * \param decoder A decoder instance to set. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if the decoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_all(FLAC__StreamDecoder *decoder); - -/** Get the current decoder state. - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__StreamDecoderState - * The current decoder state. - */ -FLAC_API FLAC__StreamDecoderState FLAC__stream_decoder_get_state(const FLAC__StreamDecoder *decoder); - -/** Get the current decoder state as a C string. - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval const char * - * The decoder state as a C string. Do not modify the contents. - */ -FLAC_API const char *FLAC__stream_decoder_get_resolved_state_string(const FLAC__StreamDecoder *decoder); - -/** Get the "MD5 signature checking" flag. - * This is the value of the setting, not whether or not the decoder is - * currently checking the MD5 (remember, it can be turned off automatically - * by a seek). When the decoder is reset the flag will be restored to the - * value returned by this function. - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * See above. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_get_md5_checking(const FLAC__StreamDecoder *decoder); - -/** Get the total number of samples in the stream being decoded. - * Will only be valid after decoding has started and will contain the - * value from the \c STREAMINFO block. A value of \c 0 means "unknown". - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval unsigned - * See above. - */ -FLAC_API FLAC__uint64 FLAC__stream_decoder_get_total_samples(const FLAC__StreamDecoder *decoder); - -/** Get the current number of channels in the stream being decoded. - * Will only be valid after decoding has started and will contain the - * value from the most recently decoded frame header. - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval unsigned - * See above. - */ -FLAC_API unsigned FLAC__stream_decoder_get_channels(const FLAC__StreamDecoder *decoder); - -/** Get the current channel assignment in the stream being decoded. - * Will only be valid after decoding has started and will contain the - * value from the most recently decoded frame header. - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__ChannelAssignment - * See above. - */ -FLAC_API FLAC__ChannelAssignment FLAC__stream_decoder_get_channel_assignment(const FLAC__StreamDecoder *decoder); - -/** Get the current sample resolution in the stream being decoded. - * Will only be valid after decoding has started and will contain the - * value from the most recently decoded frame header. - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval unsigned - * See above. - */ -FLAC_API unsigned FLAC__stream_decoder_get_bits_per_sample(const FLAC__StreamDecoder *decoder); - -/** Get the current sample rate in Hz of the stream being decoded. - * Will only be valid after decoding has started and will contain the - * value from the most recently decoded frame header. - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval unsigned - * See above. - */ -FLAC_API unsigned FLAC__stream_decoder_get_sample_rate(const FLAC__StreamDecoder *decoder); - -/** Get the current blocksize of the stream being decoded. - * Will only be valid after decoding has started and will contain the - * value from the most recently decoded frame header. - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval unsigned - * See above. - */ -FLAC_API unsigned FLAC__stream_decoder_get_blocksize(const FLAC__StreamDecoder *decoder); - -/** Returns the decoder's current read position within the stream. - * The position is the byte offset from the start of the stream. - * Bytes before this position have been fully decoded. Note that - * there may still be undecoded bytes in the decoder's read FIFO. - * The returned position is correct even after a seek. - * - * \warning This function currently only works for native FLAC, - * not Ogg FLAC streams. - * - * \param decoder A decoder instance to query. - * \param position Address at which to return the desired position. - * \assert - * \code decoder != NULL \endcode - * \code position != NULL \endcode - * \retval FLAC__bool - * \c true if successful, \c false if the stream is not native FLAC, - * or there was an error from the 'tell' callback or it returned - * \c FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_get_decode_position(const FLAC__StreamDecoder *decoder, FLAC__uint64 *position); - -/** Initialize the decoder instance to decode native FLAC streams. - * - * This flavor of initialization sets up the decoder to decode from a - * native FLAC stream. I/O is performed via callbacks to the client. - * For decoding from a plain file via filename or open FILE*, - * FLAC__stream_decoder_init_file() and FLAC__stream_decoder_init_FILE() - * provide a simpler interface. - * - * This function should be called after FLAC__stream_decoder_new() and - * FLAC__stream_decoder_set_*() but before any of the - * FLAC__stream_decoder_process_*() functions. Will set and return the - * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA - * if initialization succeeded. - * - * \param decoder An uninitialized decoder instance. - * \param read_callback See FLAC__StreamDecoderReadCallback. This - * pointer must not be \c NULL. - * \param seek_callback See FLAC__StreamDecoderSeekCallback. This - * pointer may be \c NULL if seeking is not - * supported. If \a seek_callback is not \c NULL then a - * \a tell_callback, \a length_callback, and \a eof_callback must also be supplied. - * Alternatively, a dummy seek callback that just - * returns \c FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED - * may also be supplied, all though this is slightly - * less efficient for the decoder. - * \param tell_callback See FLAC__StreamDecoderTellCallback. This - * pointer may be \c NULL if not supported by the client. If - * \a seek_callback is not \c NULL then a - * \a tell_callback must also be supplied. - * Alternatively, a dummy tell callback that just - * returns \c FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED - * may also be supplied, all though this is slightly - * less efficient for the decoder. - * \param length_callback See FLAC__StreamDecoderLengthCallback. This - * pointer may be \c NULL if not supported by the client. If - * \a seek_callback is not \c NULL then a - * \a length_callback must also be supplied. - * Alternatively, a dummy length callback that just - * returns \c FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED - * may also be supplied, all though this is slightly - * less efficient for the decoder. - * \param eof_callback See FLAC__StreamDecoderEofCallback. This - * pointer may be \c NULL if not supported by the client. If - * \a seek_callback is not \c NULL then a - * \a eof_callback must also be supplied. - * Alternatively, a dummy length callback that just - * returns \c false - * may also be supplied, all though this is slightly - * less efficient for the decoder. - * \param write_callback See FLAC__StreamDecoderWriteCallback. This - * pointer must not be \c NULL. - * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This - * pointer may be \c NULL if the callback is not - * desired. - * \param error_callback See FLAC__StreamDecoderErrorCallback. This - * pointer must not be \c NULL. - * \param client_data This value will be supplied to callbacks in their - * \a client_data argument. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__StreamDecoderInitStatus - * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; - * see FLAC__StreamDecoderInitStatus for the meanings of other return values. - */ -FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_stream( - FLAC__StreamDecoder *decoder, - FLAC__StreamDecoderReadCallback read_callback, - FLAC__StreamDecoderSeekCallback seek_callback, - FLAC__StreamDecoderTellCallback tell_callback, - FLAC__StreamDecoderLengthCallback length_callback, - FLAC__StreamDecoderEofCallback eof_callback, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -); - -/** Initialize the decoder instance to decode Ogg FLAC streams. - * - * This flavor of initialization sets up the decoder to decode from a - * FLAC stream in an Ogg container. I/O is performed via callbacks to the - * client. For decoding from a plain file via filename or open FILE*, - * FLAC__stream_decoder_init_ogg_file() and FLAC__stream_decoder_init_ogg_FILE() - * provide a simpler interface. - * - * This function should be called after FLAC__stream_decoder_new() and - * FLAC__stream_decoder_set_*() but before any of the - * FLAC__stream_decoder_process_*() functions. Will set and return the - * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA - * if initialization succeeded. - * - * \note Support for Ogg FLAC in the library is optional. If this - * library has been built without support for Ogg FLAC, this function - * will return \c FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER. - * - * \param decoder An uninitialized decoder instance. - * \param read_callback See FLAC__StreamDecoderReadCallback. This - * pointer must not be \c NULL. - * \param seek_callback See FLAC__StreamDecoderSeekCallback. This - * pointer may be \c NULL if seeking is not - * supported. If \a seek_callback is not \c NULL then a - * \a tell_callback, \a length_callback, and \a eof_callback must also be supplied. - * Alternatively, a dummy seek callback that just - * returns \c FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED - * may also be supplied, all though this is slightly - * less efficient for the decoder. - * \param tell_callback See FLAC__StreamDecoderTellCallback. This - * pointer may be \c NULL if not supported by the client. If - * \a seek_callback is not \c NULL then a - * \a tell_callback must also be supplied. - * Alternatively, a dummy tell callback that just - * returns \c FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED - * may also be supplied, all though this is slightly - * less efficient for the decoder. - * \param length_callback See FLAC__StreamDecoderLengthCallback. This - * pointer may be \c NULL if not supported by the client. If - * \a seek_callback is not \c NULL then a - * \a length_callback must also be supplied. - * Alternatively, a dummy length callback that just - * returns \c FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED - * may also be supplied, all though this is slightly - * less efficient for the decoder. - * \param eof_callback See FLAC__StreamDecoderEofCallback. This - * pointer may be \c NULL if not supported by the client. If - * \a seek_callback is not \c NULL then a - * \a eof_callback must also be supplied. - * Alternatively, a dummy length callback that just - * returns \c false - * may also be supplied, all though this is slightly - * less efficient for the decoder. - * \param write_callback See FLAC__StreamDecoderWriteCallback. This - * pointer must not be \c NULL. - * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This - * pointer may be \c NULL if the callback is not - * desired. - * \param error_callback See FLAC__StreamDecoderErrorCallback. This - * pointer must not be \c NULL. - * \param client_data This value will be supplied to callbacks in their - * \a client_data argument. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__StreamDecoderInitStatus - * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; - * see FLAC__StreamDecoderInitStatus for the meanings of other return values. - */ -FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_stream( - FLAC__StreamDecoder *decoder, - FLAC__StreamDecoderReadCallback read_callback, - FLAC__StreamDecoderSeekCallback seek_callback, - FLAC__StreamDecoderTellCallback tell_callback, - FLAC__StreamDecoderLengthCallback length_callback, - FLAC__StreamDecoderEofCallback eof_callback, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -); - -/** Initialize the decoder instance to decode native FLAC files. - * - * This flavor of initialization sets up the decoder to decode from a - * plain native FLAC file. For non-stdio streams, you must use - * FLAC__stream_decoder_init_stream() and provide callbacks for the I/O. - * - * This function should be called after FLAC__stream_decoder_new() and - * FLAC__stream_decoder_set_*() but before any of the - * FLAC__stream_decoder_process_*() functions. Will set and return the - * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA - * if initialization succeeded. - * - * \param decoder An uninitialized decoder instance. - * \param file An open FLAC file. The file should have been - * opened with mode \c "rb" and rewound. The file - * becomes owned by the decoder and should not be - * manipulated by the client while decoding. - * Unless \a file is \c stdin, it will be closed - * when FLAC__stream_decoder_finish() is called. - * Note however that seeking will not work when - * decoding from \c stdout since it is not seekable. - * \param write_callback See FLAC__StreamDecoderWriteCallback. This - * pointer must not be \c NULL. - * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This - * pointer may be \c NULL if the callback is not - * desired. - * \param error_callback See FLAC__StreamDecoderErrorCallback. This - * pointer must not be \c NULL. - * \param client_data This value will be supplied to callbacks in their - * \a client_data argument. - * \assert - * \code decoder != NULL \endcode - * \code file != NULL \endcode - * \retval FLAC__StreamDecoderInitStatus - * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; - * see FLAC__StreamDecoderInitStatus for the meanings of other return values. - */ -FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_FILE( - FLAC__StreamDecoder *decoder, - FILE *file, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -); - -/** Initialize the decoder instance to decode Ogg FLAC files. - * - * This flavor of initialization sets up the decoder to decode from a - * plain Ogg FLAC file. For non-stdio streams, you must use - * FLAC__stream_decoder_init_ogg_stream() and provide callbacks for the I/O. - * - * This function should be called after FLAC__stream_decoder_new() and - * FLAC__stream_decoder_set_*() but before any of the - * FLAC__stream_decoder_process_*() functions. Will set and return the - * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA - * if initialization succeeded. - * - * \note Support for Ogg FLAC in the library is optional. If this - * library has been built without support for Ogg FLAC, this function - * will return \c FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER. - * - * \param decoder An uninitialized decoder instance. - * \param file An open FLAC file. The file should have been - * opened with mode \c "rb" and rewound. The file - * becomes owned by the decoder and should not be - * manipulated by the client while decoding. - * Unless \a file is \c stdin, it will be closed - * when FLAC__stream_decoder_finish() is called. - * Note however that seeking will not work when - * decoding from \c stdout since it is not seekable. - * \param write_callback See FLAC__StreamDecoderWriteCallback. This - * pointer must not be \c NULL. - * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This - * pointer may be \c NULL if the callback is not - * desired. - * \param error_callback See FLAC__StreamDecoderErrorCallback. This - * pointer must not be \c NULL. - * \param client_data This value will be supplied to callbacks in their - * \a client_data argument. - * \assert - * \code decoder != NULL \endcode - * \code file != NULL \endcode - * \retval FLAC__StreamDecoderInitStatus - * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; - * see FLAC__StreamDecoderInitStatus for the meanings of other return values. - */ -FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_FILE( - FLAC__StreamDecoder *decoder, - FILE *file, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -); - -/** Initialize the decoder instance to decode native FLAC files. - * - * This flavor of initialization sets up the decoder to decode from a plain - * native FLAC file. If POSIX fopen() semantics are not sufficient, (for - * example, with Unicode filenames on Windows), you must use - * FLAC__stream_decoder_init_FILE(), or FLAC__stream_decoder_init_stream() - * and provide callbacks for the I/O. - * - * This function should be called after FLAC__stream_decoder_new() and - * FLAC__stream_decoder_set_*() but before any of the - * FLAC__stream_decoder_process_*() functions. Will set and return the - * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA - * if initialization succeeded. - * - * \param decoder An uninitialized decoder instance. - * \param filename The name of the file to decode from. The file will - * be opened with fopen(). Use \c NULL to decode from - * \c stdin. Note that \c stdin is not seekable. - * \param write_callback See FLAC__StreamDecoderWriteCallback. This - * pointer must not be \c NULL. - * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This - * pointer may be \c NULL if the callback is not - * desired. - * \param error_callback See FLAC__StreamDecoderErrorCallback. This - * pointer must not be \c NULL. - * \param client_data This value will be supplied to callbacks in their - * \a client_data argument. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__StreamDecoderInitStatus - * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; - * see FLAC__StreamDecoderInitStatus for the meanings of other return values. - */ -FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_file( - FLAC__StreamDecoder *decoder, - const char *filename, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -); - -/** Initialize the decoder instance to decode Ogg FLAC files. - * - * This flavor of initialization sets up the decoder to decode from a plain - * Ogg FLAC file. If POSIX fopen() semantics are not sufficient, (for - * example, with Unicode filenames on Windows), you must use - * FLAC__stream_decoder_init_ogg_FILE(), or FLAC__stream_decoder_init_ogg_stream() - * and provide callbacks for the I/O. - * - * This function should be called after FLAC__stream_decoder_new() and - * FLAC__stream_decoder_set_*() but before any of the - * FLAC__stream_decoder_process_*() functions. Will set and return the - * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA - * if initialization succeeded. - * - * \note Support for Ogg FLAC in the library is optional. If this - * library has been built without support for Ogg FLAC, this function - * will return \c FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER. - * - * \param decoder An uninitialized decoder instance. - * \param filename The name of the file to decode from. The file will - * be opened with fopen(). Use \c NULL to decode from - * \c stdin. Note that \c stdin is not seekable. - * \param write_callback See FLAC__StreamDecoderWriteCallback. This - * pointer must not be \c NULL. - * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This - * pointer may be \c NULL if the callback is not - * desired. - * \param error_callback See FLAC__StreamDecoderErrorCallback. This - * pointer must not be \c NULL. - * \param client_data This value will be supplied to callbacks in their - * \a client_data argument. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__StreamDecoderInitStatus - * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; - * see FLAC__StreamDecoderInitStatus for the meanings of other return values. - */ -FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_file( - FLAC__StreamDecoder *decoder, - const char *filename, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -); - -/** Finish the decoding process. - * Flushes the decoding buffer, releases resources, resets the decoder - * settings to their defaults, and returns the decoder state to - * FLAC__STREAM_DECODER_UNINITIALIZED. - * - * In the event of a prematurely-terminated decode, it is not strictly - * necessary to call this immediately before FLAC__stream_decoder_delete() - * but it is good practice to match every FLAC__stream_decoder_init_*() - * with a FLAC__stream_decoder_finish(). - * - * \param decoder An uninitialized decoder instance. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if MD5 checking is on AND a STREAMINFO block was available - * AND the MD5 signature in the STREAMINFO block was non-zero AND the - * signature does not match the one computed by the decoder; else - * \c true. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_finish(FLAC__StreamDecoder *decoder); - -/** Flush the stream input. - * The decoder's input buffer will be cleared and the state set to - * \c FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC. This will also turn - * off MD5 checking. - * - * \param decoder A decoder instance. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c true if successful, else \c false if a memory allocation - * error occurs (in which case the state will be set to - * \c FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR). - */ -FLAC_API FLAC__bool FLAC__stream_decoder_flush(FLAC__StreamDecoder *decoder); - -/** Reset the decoding process. - * The decoder's input buffer will be cleared and the state set to - * \c FLAC__STREAM_DECODER_SEARCH_FOR_METADATA. This is similar to - * FLAC__stream_decoder_finish() except that the settings are - * preserved; there is no need to call FLAC__stream_decoder_init_*() - * before decoding again. MD5 checking will be restored to its original - * setting. - * - * If the decoder is seekable, or was initialized with - * FLAC__stream_decoder_init*_FILE() or FLAC__stream_decoder_init*_file(), - * the decoder will also attempt to seek to the beginning of the file. - * If this rewind fails, this function will return \c false. It follows - * that FLAC__stream_decoder_reset() cannot be used when decoding from - * \c stdin. - * - * If the decoder was initialized with FLAC__stream_encoder_init*_stream() - * and is not seekable (i.e. no seek callback was provided or the seek - * callback returns \c FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED), it - * is the duty of the client to start feeding data from the beginning of - * the stream on the next FLAC__stream_decoder_process() or - * FLAC__stream_decoder_process_interleaved() call. - * - * \param decoder A decoder instance. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c true if successful, else \c false if a memory allocation occurs - * (in which case the state will be set to - * \c FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR) or a seek error - * occurs (the state will be unchanged). - */ -FLAC_API FLAC__bool FLAC__stream_decoder_reset(FLAC__StreamDecoder *decoder); - -/** Decode one metadata block or audio frame. - * This version instructs the decoder to decode a either a single metadata - * block or a single frame and stop, unless the callbacks return a fatal - * error or the read callback returns - * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM. - * - * As the decoder needs more input it will call the read callback. - * Depending on what was decoded, the metadata or write callback will be - * called with the decoded metadata block or audio frame. - * - * Unless there is a fatal read error or end of stream, this function - * will return once one whole frame is decoded. In other words, if the - * stream is not synchronized or points to a corrupt frame header, the - * decoder will continue to try and resync until it gets to a valid - * frame, then decode one frame, then return. If the decoder points to - * a frame whose frame CRC in the frame footer does not match the - * computed frame CRC, this function will issue a - * FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH error to the - * error callback, and return, having decoded one complete, although - * corrupt, frame. (Such corrupted frames are sent as silence of the - * correct length to the write callback.) - * - * \param decoder An initialized decoder instance. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if any fatal read, write, or memory allocation error - * occurred (meaning decoding must stop), else \c true; for more - * information about the decoder, check the decoder state with - * FLAC__stream_decoder_get_state(). - */ -FLAC_API FLAC__bool FLAC__stream_decoder_process_single(FLAC__StreamDecoder *decoder); - -/** Decode until the end of the metadata. - * This version instructs the decoder to decode from the current position - * and continue until all the metadata has been read, or until the - * callbacks return a fatal error or the read callback returns - * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM. - * - * As the decoder needs more input it will call the read callback. - * As each metadata block is decoded, the metadata callback will be called - * with the decoded metadata. - * - * \param decoder An initialized decoder instance. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if any fatal read, write, or memory allocation error - * occurred (meaning decoding must stop), else \c true; for more - * information about the decoder, check the decoder state with - * FLAC__stream_decoder_get_state(). - */ -FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_metadata(FLAC__StreamDecoder *decoder); - -/** Decode until the end of the stream. - * This version instructs the decoder to decode from the current position - * and continue until the end of stream (the read callback returns - * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM), or until the - * callbacks return a fatal error. - * - * As the decoder needs more input it will call the read callback. - * As each metadata block and frame is decoded, the metadata or write - * callback will be called with the decoded metadata or frame. - * - * \param decoder An initialized decoder instance. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if any fatal read, write, or memory allocation error - * occurred (meaning decoding must stop), else \c true; for more - * information about the decoder, check the decoder state with - * FLAC__stream_decoder_get_state(). - */ -FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_stream(FLAC__StreamDecoder *decoder); - -/** Skip one audio frame. - * This version instructs the decoder to 'skip' a single frame and stop, - * unless the callbacks return a fatal error or the read callback returns - * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM. - * - * The decoding flow is the same as what occurs when - * FLAC__stream_decoder_process_single() is called to process an audio - * frame, except that this function does not decode the parsed data into - * PCM or call the write callback. The integrity of the frame is still - * checked the same way as in the other process functions. - * - * This function will return once one whole frame is skipped, in the - * same way that FLAC__stream_decoder_process_single() will return once - * one whole frame is decoded. - * - * This function can be used in more quickly determining FLAC frame - * boundaries when decoding of the actual data is not needed, for - * example when an application is separating a FLAC stream into frames - * for editing or storing in a container. To do this, the application - * can use FLAC__stream_decoder_skip_single_frame() to quickly advance - * to the next frame, then use - * FLAC__stream_decoder_get_decode_position() to find the new frame - * boundary. - * - * This function should only be called when the stream has advanced - * past all the metadata, otherwise it will return \c false. - * - * \param decoder An initialized decoder instance not in a metadata - * state. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if any fatal read, write, or memory allocation error - * occurred (meaning decoding must stop), or if the decoder - * is in the FLAC__STREAM_DECODER_SEARCH_FOR_METADATA or - * FLAC__STREAM_DECODER_READ_METADATA state, else \c true; for more - * information about the decoder, check the decoder state with - * FLAC__stream_decoder_get_state(). - */ -FLAC_API FLAC__bool FLAC__stream_decoder_skip_single_frame(FLAC__StreamDecoder *decoder); - -/** Flush the input and seek to an absolute sample. - * Decoding will resume at the given sample. Note that because of - * this, the next write callback may contain a partial block. The - * client must support seeking the input or this function will fail - * and return \c false. Furthermore, if the decoder state is - * \c FLAC__STREAM_DECODER_SEEK_ERROR, then the decoder must be flushed - * with FLAC__stream_decoder_flush() or reset with - * FLAC__stream_decoder_reset() before decoding can continue. - * - * \param decoder A decoder instance. - * \param sample The target sample number to seek to. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c true if successful, else \c false. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_seek_absolute(FLAC__StreamDecoder *decoder, FLAC__uint64 sample); - -/* \} */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/FLAC/stream_encoder.h b/sources/LabSound/third_party/libnyquist/third_party/FLAC/stream_encoder.h deleted file mode 100644 index efc213ae..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/FLAC/stream_encoder.h +++ /dev/null @@ -1,1790 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 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. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * 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 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 FLAC__STREAM_ENCODER_H -#define FLAC__STREAM_ENCODER_H - -#include /* for FILE */ -#include "export.h" -#include "format.h" -#include "stream_decoder.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -/** \file include/FLAC/stream_encoder.h - * - * \brief - * This module contains the functions which implement the stream - * encoder. - * - * See the detailed documentation in the - * \link flac_stream_encoder stream encoder \endlink module. - */ - -/** \defgroup flac_encoder FLAC/ \*_encoder.h: encoder interfaces - * \ingroup flac - * - * \brief - * This module describes the encoder layers provided by libFLAC. - * - * The stream encoder can be used to encode complete streams either to the - * client via callbacks, or directly to a file, depending on how it is - * initialized. When encoding via callbacks, the client provides a write - * callback which will be called whenever FLAC data is ready to be written. - * If the client also supplies a seek callback, the encoder will also - * automatically handle the writing back of metadata discovered while - * encoding, like stream info, seek points offsets, etc. When encoding to - * a file, the client needs only supply a filename or open \c FILE* and an - * optional progress callback for periodic notification of progress; the - * write and seek callbacks are supplied internally. For more info see the - * \link flac_stream_encoder stream encoder \endlink module. - */ - -/** \defgroup flac_stream_encoder FLAC/stream_encoder.h: stream encoder interface - * \ingroup flac_encoder - * - * \brief - * This module contains the functions which implement the stream - * encoder. - * - * The stream encoder can encode to native FLAC, and optionally Ogg FLAC - * (check FLAC_API_SUPPORTS_OGG_FLAC) streams and files. - * - * The basic usage of this encoder is as follows: - * - The program creates an instance of an encoder using - * FLAC__stream_encoder_new(). - * - The program overrides the default settings using - * FLAC__stream_encoder_set_*() functions. At a minimum, the following - * functions should be called: - * - FLAC__stream_encoder_set_channels() - * - FLAC__stream_encoder_set_bits_per_sample() - * - FLAC__stream_encoder_set_sample_rate() - * - FLAC__stream_encoder_set_ogg_serial_number() (if encoding to Ogg FLAC) - * - FLAC__stream_encoder_set_total_samples_estimate() (if known) - * - If the application wants to control the compression level or set its own - * metadata, then the following should also be called: - * - FLAC__stream_encoder_set_compression_level() - * - FLAC__stream_encoder_set_verify() - * - FLAC__stream_encoder_set_metadata() - * - The rest of the set functions should only be called if the client needs - * exact control over how the audio is compressed; thorough understanding - * of the FLAC format is necessary to achieve good results. - * - The program initializes the instance to validate the settings and - * prepare for encoding using - * - FLAC__stream_encoder_init_stream() or FLAC__stream_encoder_init_FILE() - * or FLAC__stream_encoder_init_file() for native FLAC - * - FLAC__stream_encoder_init_ogg_stream() or FLAC__stream_encoder_init_ogg_FILE() - * or FLAC__stream_encoder_init_ogg_file() for Ogg FLAC - * - The program calls FLAC__stream_encoder_process() or - * FLAC__stream_encoder_process_interleaved() to encode data, which - * subsequently calls the callbacks when there is encoder data ready - * to be written. - * - The program finishes the encoding with FLAC__stream_encoder_finish(), - * which causes the encoder to encode any data still in its input pipe, - * update the metadata with the final encoding statistics if output - * seeking is possible, and finally reset the encoder to the - * uninitialized state. - * - The instance may be used again or deleted with - * FLAC__stream_encoder_delete(). - * - * In more detail, the stream encoder functions similarly to the - * \link flac_stream_decoder stream decoder \endlink, but has fewer - * callbacks and more options. Typically the client will create a new - * instance by calling FLAC__stream_encoder_new(), then set the necessary - * parameters with FLAC__stream_encoder_set_*(), and initialize it by - * calling one of the FLAC__stream_encoder_init_*() functions. - * - * Unlike the decoders, the stream encoder has many options that can - * affect the speed and compression ratio. When setting these parameters - * you should have some basic knowledge of the format (see the - * user-level documentation - * or the formal description). The - * FLAC__stream_encoder_set_*() functions themselves do not validate the - * values as many are interdependent. The FLAC__stream_encoder_init_*() - * functions will do this, so make sure to pay attention to the state - * returned by FLAC__stream_encoder_init_*() to make sure that it is - * FLAC__STREAM_ENCODER_INIT_STATUS_OK. Any parameters that are not set - * before FLAC__stream_encoder_init_*() will take on the defaults from - * the constructor. - * - * There are three initialization functions for native FLAC, one for - * setting up the encoder to encode FLAC data to the client via - * callbacks, and two for encoding directly to a file. - * - * For encoding via callbacks, use FLAC__stream_encoder_init_stream(). - * You must also supply a write callback which will be called anytime - * there is raw encoded data to write. If the client can seek the output - * it is best to also supply seek and tell callbacks, as this allows the - * encoder to go back after encoding is finished to write back - * information that was collected while encoding, like seek point offsets, - * frame sizes, etc. - * - * For encoding directly to a file, use FLAC__stream_encoder_init_FILE() - * or FLAC__stream_encoder_init_file(). Then you must only supply a - * filename or open \c FILE*; the encoder will handle all the callbacks - * internally. You may also supply a progress callback for periodic - * notification of the encoding progress. - * - * There are three similarly-named init functions for encoding to Ogg - * FLAC streams. Check \c FLAC_API_SUPPORTS_OGG_FLAC to find out if the - * library has been built with Ogg support. - * - * The call to FLAC__stream_encoder_init_*() currently will also immediately - * call the write callback several times, once with the \c fLaC signature, - * and once for each encoded metadata block. Note that for Ogg FLAC - * encoding you will usually get at least twice the number of callbacks than - * with native FLAC, one for the Ogg page header and one for the page body. - * - * After initializing the instance, the client may feed audio data to the - * encoder in one of two ways: - * - * - Channel separate, through FLAC__stream_encoder_process() - The client - * will pass an array of pointers to buffers, one for each channel, to - * the encoder, each of the same length. The samples need not be - * block-aligned, but each channel should have the same number of samples. - * - Channel interleaved, through - * FLAC__stream_encoder_process_interleaved() - The client will pass a single - * pointer to data that is channel-interleaved (i.e. channel0_sample0, - * channel1_sample0, ... , channelN_sample0, channel0_sample1, ...). - * Again, the samples need not be block-aligned but they must be - * sample-aligned, i.e. the first value should be channel0_sample0 and - * the last value channelN_sampleM. - * - * Note that for either process call, each sample in the buffers should be a - * signed integer, right-justified to the resolution set by - * FLAC__stream_encoder_set_bits_per_sample(). For example, if the resolution - * is 16 bits per sample, the samples should all be in the range [-32768,32767]. - * - * When the client is finished encoding data, it calls - * FLAC__stream_encoder_finish(), which causes the encoder to encode any - * data still in its input pipe, and call the metadata callback with the - * final encoding statistics. Then the instance may be deleted with - * FLAC__stream_encoder_delete() or initialized again to encode another - * stream. - * - * For programs that write their own metadata, but that do not know the - * actual metadata until after encoding, it is advantageous to instruct - * the encoder to write a PADDING block of the correct size, so that - * instead of rewriting the whole stream after encoding, the program can - * just overwrite the PADDING block. If only the maximum size of the - * metadata is known, the program can write a slightly larger padding - * block, then split it after encoding. - * - * Make sure you understand how lengths are calculated. All FLAC metadata - * blocks have a 4 byte header which contains the type and length. This - * length does not include the 4 bytes of the header. See the format page - * for the specification of metadata blocks and their lengths. - * - * \note - * If you are writing the FLAC data to a file via callbacks, make sure it - * is open for update (e.g. mode "w+" for stdio streams). This is because - * after the first encoding pass, the encoder will try to seek back to the - * beginning of the stream, to the STREAMINFO block, to write some data - * there. (If using FLAC__stream_encoder_init*_file() or - * FLAC__stream_encoder_init*_FILE(), the file is managed internally.) - * - * \note - * The "set" functions may only be called when the encoder is in the - * state FLAC__STREAM_ENCODER_UNINITIALIZED, i.e. after - * FLAC__stream_encoder_new() or FLAC__stream_encoder_finish(), but - * before FLAC__stream_encoder_init_*(). If this is the case they will - * return \c true, otherwise \c false. - * - * \note - * FLAC__stream_encoder_finish() resets all settings to the constructor - * defaults. - * - * \{ - */ - - -/** State values for a FLAC__StreamEncoder. - * - * The encoder's state can be obtained by calling FLAC__stream_encoder_get_state(). - * - * If the encoder gets into any other state besides \c FLAC__STREAM_ENCODER_OK - * or \c FLAC__STREAM_ENCODER_UNINITIALIZED, it becomes invalid for encoding and - * must be deleted with FLAC__stream_encoder_delete(). - */ -typedef enum { - - FLAC__STREAM_ENCODER_OK = 0, - /**< The encoder is in the normal OK state and samples can be processed. */ - - FLAC__STREAM_ENCODER_UNINITIALIZED, - /**< The encoder is in the uninitialized state; one of the - * FLAC__stream_encoder_init_*() functions must be called before samples - * can be processed. - */ - - FLAC__STREAM_ENCODER_OGG_ERROR, - /**< An error occurred in the underlying Ogg layer. */ - - FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR, - /**< An error occurred in the underlying verify stream decoder; - * check FLAC__stream_encoder_get_verify_decoder_state(). - */ - - FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA, - /**< The verify decoder detected a mismatch between the original - * audio signal and the decoded audio signal. - */ - - FLAC__STREAM_ENCODER_CLIENT_ERROR, - /**< One of the callbacks returned a fatal error. */ - - FLAC__STREAM_ENCODER_IO_ERROR, - /**< An I/O error occurred while opening/reading/writing a file. - * Check \c errno. - */ - - FLAC__STREAM_ENCODER_FRAMING_ERROR, - /**< An error occurred while writing the stream; usually, the - * write_callback returned an error. - */ - - FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR - /**< Memory allocation failed. */ - -} FLAC__StreamEncoderState; - -/** Maps a FLAC__StreamEncoderState to a C string. - * - * Using a FLAC__StreamEncoderState as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamEncoderStateString[]; - - -/** Possible return values for the FLAC__stream_encoder_init_*() functions. - */ -typedef enum { - - FLAC__STREAM_ENCODER_INIT_STATUS_OK = 0, - /**< Initialization was successful. */ - - FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR, - /**< General failure to set up encoder; call FLAC__stream_encoder_get_state() for cause. */ - - FLAC__STREAM_ENCODER_INIT_STATUS_UNSUPPORTED_CONTAINER, - /**< The library was not compiled with support for the given container - * format. - */ - - FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_CALLBACKS, - /**< A required callback was not supplied. */ - - FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_NUMBER_OF_CHANNELS, - /**< The encoder has an invalid setting for number of channels. */ - - FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BITS_PER_SAMPLE, - /**< The encoder has an invalid setting for bits-per-sample. - * FLAC supports 4-32 bps but the reference encoder currently supports - * only up to 24 bps. - */ - - FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_SAMPLE_RATE, - /**< The encoder has an invalid setting for the input sample rate. */ - - FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BLOCK_SIZE, - /**< The encoder has an invalid setting for the block size. */ - - FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_MAX_LPC_ORDER, - /**< The encoder has an invalid setting for the maximum LPC order. */ - - FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_QLP_COEFF_PRECISION, - /**< The encoder has an invalid setting for the precision of the quantized linear predictor coefficients. */ - - FLAC__STREAM_ENCODER_INIT_STATUS_BLOCK_SIZE_TOO_SMALL_FOR_LPC_ORDER, - /**< The specified block size is less than the maximum LPC order. */ - - FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE, - /**< The encoder is bound to the Subset but other settings violate it. */ - - FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA, - /**< The metadata input to the encoder is invalid, in one of the following ways: - * - FLAC__stream_encoder_set_metadata() was called with a null pointer but a block count > 0 - * - One of the metadata blocks contains an undefined type - * - It contains an illegal CUESHEET as checked by FLAC__format_cuesheet_is_legal() - * - It contains an illegal SEEKTABLE as checked by FLAC__format_seektable_is_legal() - * - It contains more than one SEEKTABLE block or more than one VORBIS_COMMENT block - */ - - FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED - /**< FLAC__stream_encoder_init_*() was called when the encoder was - * already initialized, usually because - * FLAC__stream_encoder_finish() was not called. - */ - -} FLAC__StreamEncoderInitStatus; - -/** Maps a FLAC__StreamEncoderInitStatus to a C string. - * - * Using a FLAC__StreamEncoderInitStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamEncoderInitStatusString[]; - - -/** Return values for the FLAC__StreamEncoder read callback. - */ -typedef enum { - - FLAC__STREAM_ENCODER_READ_STATUS_CONTINUE, - /**< The read was OK and decoding can continue. */ - - FLAC__STREAM_ENCODER_READ_STATUS_END_OF_STREAM, - /**< The read was attempted at the end of the stream. */ - - FLAC__STREAM_ENCODER_READ_STATUS_ABORT, - /**< An unrecoverable error occurred. */ - - FLAC__STREAM_ENCODER_READ_STATUS_UNSUPPORTED - /**< Client does not support reading back from the output. */ - -} FLAC__StreamEncoderReadStatus; - -/** Maps a FLAC__StreamEncoderReadStatus to a C string. - * - * Using a FLAC__StreamEncoderReadStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamEncoderReadStatusString[]; - - -/** Return values for the FLAC__StreamEncoder write callback. - */ -typedef enum { - - FLAC__STREAM_ENCODER_WRITE_STATUS_OK = 0, - /**< The write was OK and encoding can continue. */ - - FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR - /**< An unrecoverable error occurred. The encoder will return from the process call. */ - -} FLAC__StreamEncoderWriteStatus; - -/** Maps a FLAC__StreamEncoderWriteStatus to a C string. - * - * Using a FLAC__StreamEncoderWriteStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamEncoderWriteStatusString[]; - - -/** Return values for the FLAC__StreamEncoder seek callback. - */ -typedef enum { - - FLAC__STREAM_ENCODER_SEEK_STATUS_OK, - /**< The seek was OK and encoding can continue. */ - - FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR, - /**< An unrecoverable error occurred. */ - - FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED - /**< Client does not support seeking. */ - -} FLAC__StreamEncoderSeekStatus; - -/** Maps a FLAC__StreamEncoderSeekStatus to a C string. - * - * Using a FLAC__StreamEncoderSeekStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamEncoderSeekStatusString[]; - - -/** Return values for the FLAC__StreamEncoder tell callback. - */ -typedef enum { - - FLAC__STREAM_ENCODER_TELL_STATUS_OK, - /**< The tell was OK and encoding can continue. */ - - FLAC__STREAM_ENCODER_TELL_STATUS_ERROR, - /**< An unrecoverable error occurred. */ - - FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED - /**< Client does not support seeking. */ - -} FLAC__StreamEncoderTellStatus; - -/** Maps a FLAC__StreamEncoderTellStatus to a C string. - * - * Using a FLAC__StreamEncoderTellStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamEncoderTellStatusString[]; - - -/*********************************************************************** - * - * class FLAC__StreamEncoder - * - ***********************************************************************/ - -struct FLAC__StreamEncoderProtected; -struct FLAC__StreamEncoderPrivate; -/** The opaque structure definition for the stream encoder type. - * See the \link flac_stream_encoder stream encoder module \endlink - * for a detailed description. - */ -typedef struct { - struct FLAC__StreamEncoderProtected *protected_; /* avoid the C++ keyword 'protected' */ - struct FLAC__StreamEncoderPrivate *private_; /* avoid the C++ keyword 'private' */ -} FLAC__StreamEncoder; - -/** Signature for the read callback. - * - * A function pointer matching this signature must be passed to - * FLAC__stream_encoder_init_ogg_stream() if seeking is supported. - * The supplied function will be called when the encoder needs to read back - * encoded data. This happens during the metadata callback, when the encoder - * has to read, modify, and rewrite the metadata (e.g. seekpoints) gathered - * while encoding. The address of the buffer to be filled is supplied, along - * with the number of bytes the buffer can hold. The callback may choose to - * supply less data and modify the byte count but must be careful not to - * overflow the buffer. The callback then returns a status code chosen from - * FLAC__StreamEncoderReadStatus. - * - * Here is an example of a read callback for stdio streams: - * \code - * FLAC__StreamEncoderReadStatus read_cb(const FLAC__StreamEncoder *encoder, FLAC__byte buffer[], size_t *bytes, void *client_data) - * { - * FILE *file = ((MyClientData*)client_data)->file; - * if(*bytes > 0) { - * *bytes = fread(buffer, sizeof(FLAC__byte), *bytes, file); - * if(ferror(file)) - * return FLAC__STREAM_ENCODER_READ_STATUS_ABORT; - * else if(*bytes == 0) - * return FLAC__STREAM_ENCODER_READ_STATUS_END_OF_STREAM; - * else - * return FLAC__STREAM_ENCODER_READ_STATUS_CONTINUE; - * } - * else - * return FLAC__STREAM_ENCODER_READ_STATUS_ABORT; - * } - * \endcode - * - * \note In general, FLAC__StreamEncoder functions which change the - * state should not be called on the \a encoder while in the callback. - * - * \param encoder The encoder instance calling the callback. - * \param buffer A pointer to a location for the callee to store - * data to be encoded. - * \param bytes A pointer to the size of the buffer. On entry - * to the callback, it contains the maximum number - * of bytes that may be stored in \a buffer. The - * callee must set it to the actual number of bytes - * stored (0 in case of error or end-of-stream) before - * returning. - * \param client_data The callee's client data set through - * FLAC__stream_encoder_set_client_data(). - * \retval FLAC__StreamEncoderReadStatus - * The callee's return status. - */ -typedef FLAC__StreamEncoderReadStatus (*FLAC__StreamEncoderReadCallback)(const FLAC__StreamEncoder *encoder, FLAC__byte buffer[], size_t *bytes, void *client_data); - -/** Signature for the write callback. - * - * A function pointer matching this signature must be passed to - * FLAC__stream_encoder_init*_stream(). The supplied function will be called - * by the encoder anytime there is raw encoded data ready to write. It may - * include metadata mixed with encoded audio frames and the data is not - * guaranteed to be aligned on frame or metadata block boundaries. - * - * The only duty of the callback is to write out the \a bytes worth of data - * in \a buffer to the current position in the output stream. The arguments - * \a samples and \a current_frame are purely informational. If \a samples - * is greater than \c 0, then \a current_frame will hold the current frame - * number that is being written; otherwise it indicates that the write - * callback is being called to write metadata. - * - * \note - * Unlike when writing to native FLAC, when writing to Ogg FLAC the - * write callback will be called twice when writing each audio - * frame; once for the page header, and once for the page body. - * When writing the page header, the \a samples argument to the - * write callback will be \c 0. - * - * \note In general, FLAC__StreamEncoder functions which change the - * state should not be called on the \a encoder while in the callback. - * - * \param encoder The encoder instance calling the callback. - * \param buffer An array of encoded data of length \a bytes. - * \param bytes The byte length of \a buffer. - * \param samples The number of samples encoded by \a buffer. - * \c 0 has a special meaning; see above. - * \param current_frame The number of the current frame being encoded. - * \param client_data The callee's client data set through - * FLAC__stream_encoder_init_*(). - * \retval FLAC__StreamEncoderWriteStatus - * The callee's return status. - */ -typedef FLAC__StreamEncoderWriteStatus (*FLAC__StreamEncoderWriteCallback)(const FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, void *client_data); - -/** Signature for the seek callback. - * - * A function pointer matching this signature may be passed to - * FLAC__stream_encoder_init*_stream(). The supplied function will be called - * when the encoder needs to seek the output stream. The encoder will pass - * the absolute byte offset to seek to, 0 meaning the beginning of the stream. - * - * Here is an example of a seek callback for stdio streams: - * \code - * FLAC__StreamEncoderSeekStatus seek_cb(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data) - * { - * FILE *file = ((MyClientData*)client_data)->file; - * if(file == stdin) - * return FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED; - * else if(fseeko(file, (off_t)absolute_byte_offset, SEEK_SET) < 0) - * return FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR; - * else - * return FLAC__STREAM_ENCODER_SEEK_STATUS_OK; - * } - * \endcode - * - * \note In general, FLAC__StreamEncoder functions which change the - * state should not be called on the \a encoder while in the callback. - * - * \param encoder The encoder instance calling the callback. - * \param absolute_byte_offset The offset from the beginning of the stream - * to seek to. - * \param client_data The callee's client data set through - * FLAC__stream_encoder_init_*(). - * \retval FLAC__StreamEncoderSeekStatus - * The callee's return status. - */ -typedef FLAC__StreamEncoderSeekStatus (*FLAC__StreamEncoderSeekCallback)(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data); - -/** Signature for the tell callback. - * - * A function pointer matching this signature may be passed to - * FLAC__stream_encoder_init*_stream(). The supplied function will be called - * when the encoder needs to know the current position of the output stream. - * - * \warning - * The callback must return the true current byte offset of the output to - * which the encoder is writing. If you are buffering the output, make - * sure and take this into account. If you are writing directly to a - * FILE* from your write callback, ftell() is sufficient. If you are - * writing directly to a file descriptor from your write callback, you - * can use lseek(fd, SEEK_CUR, 0). The encoder may later seek back to - * these points to rewrite metadata after encoding. - * - * Here is an example of a tell callback for stdio streams: - * \code - * FLAC__StreamEncoderTellStatus tell_cb(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data) - * { - * FILE *file = ((MyClientData*)client_data)->file; - * off_t pos; - * if(file == stdin) - * return FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED; - * else if((pos = ftello(file)) < 0) - * return FLAC__STREAM_ENCODER_TELL_STATUS_ERROR; - * else { - * *absolute_byte_offset = (FLAC__uint64)pos; - * return FLAC__STREAM_ENCODER_TELL_STATUS_OK; - * } - * } - * \endcode - * - * \note In general, FLAC__StreamEncoder functions which change the - * state should not be called on the \a encoder while in the callback. - * - * \param encoder The encoder instance calling the callback. - * \param absolute_byte_offset The address at which to store the current - * position of the output. - * \param client_data The callee's client data set through - * FLAC__stream_encoder_init_*(). - * \retval FLAC__StreamEncoderTellStatus - * The callee's return status. - */ -typedef FLAC__StreamEncoderTellStatus (*FLAC__StreamEncoderTellCallback)(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data); - -/** Signature for the metadata callback. - * - * A function pointer matching this signature may be passed to - * FLAC__stream_encoder_init*_stream(). The supplied function will be called - * once at the end of encoding with the populated STREAMINFO structure. This - * is so the client can seek back to the beginning of the file and write the - * STREAMINFO block with the correct statistics after encoding (like - * minimum/maximum frame size and total samples). - * - * \note In general, FLAC__StreamEncoder functions which change the - * state should not be called on the \a encoder while in the callback. - * - * \param encoder The encoder instance calling the callback. - * \param metadata The final populated STREAMINFO block. - * \param client_data The callee's client data set through - * FLAC__stream_encoder_init_*(). - */ -typedef void (*FLAC__StreamEncoderMetadataCallback)(const FLAC__StreamEncoder *encoder, const FLAC__StreamMetadata *metadata, void *client_data); - -/** Signature for the progress callback. - * - * A function pointer matching this signature may be passed to - * FLAC__stream_encoder_init*_file() or FLAC__stream_encoder_init*_FILE(). - * The supplied function will be called when the encoder has finished - * writing a frame. The \c total_frames_estimate argument to the - * callback will be based on the value from - * FLAC__stream_encoder_set_total_samples_estimate(). - * - * \note In general, FLAC__StreamEncoder functions which change the - * state should not be called on the \a encoder while in the callback. - * - * \param encoder The encoder instance calling the callback. - * \param bytes_written Bytes written so far. - * \param samples_written Samples written so far. - * \param frames_written Frames written so far. - * \param total_frames_estimate The estimate of the total number of - * frames to be written. - * \param client_data The callee's client data set through - * FLAC__stream_encoder_init_*(). - */ -typedef void (*FLAC__StreamEncoderProgressCallback)(const FLAC__StreamEncoder *encoder, FLAC__uint64 bytes_written, FLAC__uint64 samples_written, unsigned frames_written, unsigned total_frames_estimate, void *client_data); - - -/*********************************************************************** - * - * Class constructor/destructor - * - ***********************************************************************/ - -/** Create a new stream encoder instance. The instance is created with - * default settings; see the individual FLAC__stream_encoder_set_*() - * functions for each setting's default. - * - * \retval FLAC__StreamEncoder* - * \c NULL if there was an error allocating memory, else the new instance. - */ -FLAC_API FLAC__StreamEncoder *FLAC__stream_encoder_new(void); - -/** Free an encoder instance. Deletes the object pointed to by \a encoder. - * - * \param encoder A pointer to an existing encoder. - * \assert - * \code encoder != NULL \endcode - */ -FLAC_API void FLAC__stream_encoder_delete(FLAC__StreamEncoder *encoder); - - -/*********************************************************************** - * - * Public class method prototypes - * - ***********************************************************************/ - -/** Set the serial number for the FLAC stream to use in the Ogg container. - * - * \note - * This does not need to be set for native FLAC encoding. - * - * \note - * It is recommended to set a serial number explicitly as the default of '0' - * may collide with other streams. - * - * \default \c 0 - * \param encoder An encoder instance to set. - * \param serial_number See above. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_ogg_serial_number(FLAC__StreamEncoder *encoder, long serial_number); - -/** Set the "verify" flag. If \c true, the encoder will verify it's own - * encoded output by feeding it through an internal decoder and comparing - * the original signal against the decoded signal. If a mismatch occurs, - * the process call will return \c false. Note that this will slow the - * encoding process by the extra time required for decoding and comparison. - * - * \default \c false - * \param encoder An encoder instance to set. - * \param value Flag value (see above). - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_verify(FLAC__StreamEncoder *encoder, FLAC__bool value); - -/** Set the Subset flag. If \c true, - * the encoder will comply with the Subset and will check the - * settings during FLAC__stream_encoder_init_*() to see if all settings - * comply. If \c false, the settings may take advantage of the full - * range that the format allows. - * - * Make sure you know what it entails before setting this to \c false. - * - * \default \c true - * \param encoder An encoder instance to set. - * \param value Flag value (see above). - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_streamable_subset(FLAC__StreamEncoder *encoder, FLAC__bool value); - -/** Set the number of channels to be encoded. - * - * \default \c 2 - * \param encoder An encoder instance to set. - * \param value See above. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_channels(FLAC__StreamEncoder *encoder, unsigned value); - -/** Set the sample resolution of the input to be encoded. - * - * \warning - * Do not feed the encoder data that is wider than the value you - * set here or you will generate an invalid stream. - * - * \default \c 16 - * \param encoder An encoder instance to set. - * \param value See above. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_bits_per_sample(FLAC__StreamEncoder *encoder, unsigned value); - -/** Set the sample rate (in Hz) of the input to be encoded. - * - * \default \c 44100 - * \param encoder An encoder instance to set. - * \param value See above. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_sample_rate(FLAC__StreamEncoder *encoder, unsigned value); - -/** Set the compression level - * - * The compression level is roughly proportional to the amount of effort - * the encoder expends to compress the file. A higher level usually - * means more computation but higher compression. The default level is - * suitable for most applications. - * - * Currently the levels range from \c 0 (fastest, least compression) to - * \c 8 (slowest, most compression). A value larger than \c 8 will be - * treated as \c 8. - * - * This function automatically calls the following other \c _set_ - * functions with appropriate values, so the client does not need to - * unless it specifically wants to override them: - * - FLAC__stream_encoder_set_do_mid_side_stereo() - * - FLAC__stream_encoder_set_loose_mid_side_stereo() - * - FLAC__stream_encoder_set_apodization() - * - FLAC__stream_encoder_set_max_lpc_order() - * - FLAC__stream_encoder_set_qlp_coeff_precision() - * - FLAC__stream_encoder_set_do_qlp_coeff_prec_search() - * - FLAC__stream_encoder_set_do_escape_coding() - * - FLAC__stream_encoder_set_do_exhaustive_model_search() - * - FLAC__stream_encoder_set_min_residual_partition_order() - * - FLAC__stream_encoder_set_max_residual_partition_order() - * - FLAC__stream_encoder_set_rice_parameter_search_dist() - * - * The actual values set for each level are: - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
    leveldo mid-side stereoloose mid-side stereoapodizationmax lpc orderqlp coeff precisionqlp coeff prec searchescape codingexhaustive model searchmin residual partition ordermax residual partition orderrice parameter search dist
    0 false false tukey(0.5) 0 0 false false false 0 3 0
    1 true true tukey(0.5) 0 0 false false false 0 3 0
    2 true false tukey(0.5) 0 0 false false false 0 3 0
    3 false false tukey(0.5) 6 0 false false false 0 4 0
    4 true true tukey(0.5) 8 0 false false false 0 4 0
    5 true false tukey(0.5) 8 0 false false false 0 5 0
    6 true false tukey(0.5);partial_tukey(2) 8 0 false false false 0 6 0
    7 true false tukey(0.5);partial_tukey(2) 12 0 false false false 0 6 0
    8 true false tukey(0.5);partial_tukey(2);punchout_tukey(3) 12 0 false false false 0 6 0
    - * - * \default \c 5 - * \param encoder An encoder instance to set. - * \param value See above. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_compression_level(FLAC__StreamEncoder *encoder, unsigned value); - -/** Set the blocksize to use while encoding. - * - * The number of samples to use per frame. Use \c 0 to let the encoder - * estimate a blocksize; this is usually best. - * - * \default \c 0 - * \param encoder An encoder instance to set. - * \param value See above. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_blocksize(FLAC__StreamEncoder *encoder, unsigned value); - -/** Set to \c true to enable mid-side encoding on stereo input. The - * number of channels must be 2 for this to have any effect. Set to - * \c false to use only independent channel coding. - * - * \default \c false - * \param encoder An encoder instance to set. - * \param value Flag value (see above). - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_do_mid_side_stereo(FLAC__StreamEncoder *encoder, FLAC__bool value); - -/** Set to \c true to enable adaptive switching between mid-side and - * left-right encoding on stereo input. Set to \c false to use - * exhaustive searching. Setting this to \c true requires - * FLAC__stream_encoder_set_do_mid_side_stereo() to also be set to - * \c true in order to have any effect. - * - * \default \c false - * \param encoder An encoder instance to set. - * \param value Flag value (see above). - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_loose_mid_side_stereo(FLAC__StreamEncoder *encoder, FLAC__bool value); - -/** Sets the apodization function(s) the encoder will use when windowing - * audio data for LPC analysis. - * - * The \a specification is a plain ASCII string which specifies exactly - * which functions to use. There may be more than one (up to 32), - * separated by \c ';' characters. Some functions take one or more - * comma-separated arguments in parentheses. - * - * The available functions are \c bartlett, \c bartlett_hann, - * \c blackman, \c blackman_harris_4term_92db, \c connes, \c flattop, - * \c gauss(STDDEV), \c hamming, \c hann, \c kaiser_bessel, \c nuttall, - * \c rectangle, \c triangle, \c tukey(P), \c partial_tukey(n[/ov[/P]]), - * \c punchout_tukey(n[/ov[/P]]), \c welch. - * - * For \c gauss(STDDEV), STDDEV specifies the standard deviation - * (0blocksize / (2 ^ order). - * - * Set both min and max values to \c 0 to force a single context, - * whose Rice parameter is based on the residual signal variance. - * Otherwise, set a min and max order, and the encoder will search - * all orders, using the mean of each context for its Rice parameter, - * and use the best. - * - * \default \c 0 - * \param encoder An encoder instance to set. - * \param value See above. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_min_residual_partition_order(FLAC__StreamEncoder *encoder, unsigned value); - -/** Set the maximum partition order to search when coding the residual. - * This is used in tandem with - * FLAC__stream_encoder_set_min_residual_partition_order(). - * - * The partition order determines the context size in the residual. - * The context size will be approximately blocksize / (2 ^ order). - * - * Set both min and max values to \c 0 to force a single context, - * whose Rice parameter is based on the residual signal variance. - * Otherwise, set a min and max order, and the encoder will search - * all orders, using the mean of each context for its Rice parameter, - * and use the best. - * - * \default \c 0 - * \param encoder An encoder instance to set. - * \param value See above. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_max_residual_partition_order(FLAC__StreamEncoder *encoder, unsigned value); - -/** Deprecated. Setting this value has no effect. - * - * \default \c 0 - * \param encoder An encoder instance to set. - * \param value See above. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_rice_parameter_search_dist(FLAC__StreamEncoder *encoder, unsigned value); - -/** Set an estimate of the total samples that will be encoded. - * This is merely an estimate and may be set to \c 0 if unknown. - * This value will be written to the STREAMINFO block before encoding, - * and can remove the need for the caller to rewrite the value later - * if the value is known before encoding. - * - * \default \c 0 - * \param encoder An encoder instance to set. - * \param value See above. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_total_samples_estimate(FLAC__StreamEncoder *encoder, FLAC__uint64 value); - -/** Set the metadata blocks to be emitted to the stream before encoding. - * A value of \c NULL, \c 0 implies no metadata; otherwise, supply an - * array of pointers to metadata blocks. The array is non-const since - * the encoder may need to change the \a is_last flag inside them, and - * in some cases update seek point offsets. Otherwise, the encoder will - * not modify or free the blocks. It is up to the caller to free the - * metadata blocks after encoding finishes. - * - * \note - * The encoder stores only copies of the pointers in the \a metadata array; - * the metadata blocks themselves must survive at least until after - * FLAC__stream_encoder_finish() returns. Do not free the blocks until then. - * - * \note - * The STREAMINFO block is always written and no STREAMINFO block may - * occur in the supplied array. - * - * \note - * By default the encoder does not create a SEEKTABLE. If one is supplied - * in the \a metadata array, but the client has specified that it does not - * support seeking, then the SEEKTABLE will be written verbatim. However - * by itself this is not very useful as the client will not know the stream - * offsets for the seekpoints ahead of time. In order to get a proper - * seektable the client must support seeking. See next note. - * - * \note - * SEEKTABLE blocks are handled specially. Since you will not know - * the values for the seek point stream offsets, you should pass in - * a SEEKTABLE 'template', that is, a SEEKTABLE object with the - * required sample numbers (or placeholder points), with \c 0 for the - * \a frame_samples and \a stream_offset fields for each point. If the - * client has specified that it supports seeking by providing a seek - * callback to FLAC__stream_encoder_init_stream() or both seek AND read - * callback to FLAC__stream_encoder_init_ogg_stream() (or by using - * FLAC__stream_encoder_init*_file() or FLAC__stream_encoder_init*_FILE()), - * then while it is encoding the encoder will fill the stream offsets in - * for you and when encoding is finished, it will seek back and write the - * real values into the SEEKTABLE block in the stream. There are helper - * routines for manipulating seektable template blocks; see metadata.h: - * FLAC__metadata_object_seektable_template_*(). If the client does - * not support seeking, the SEEKTABLE will have inaccurate offsets which - * will slow down or remove the ability to seek in the FLAC stream. - * - * \note - * The encoder instance \b will modify the first \c SEEKTABLE block - * as it transforms the template to a valid seektable while encoding, - * but it is still up to the caller to free all metadata blocks after - * encoding. - * - * \note - * A VORBIS_COMMENT block may be supplied. The vendor string in it - * will be ignored. libFLAC will use it's own vendor string. libFLAC - * will not modify the passed-in VORBIS_COMMENT's vendor string, it - * will simply write it's own into the stream. If no VORBIS_COMMENT - * block is present in the \a metadata array, libFLAC will write an - * empty one, containing only the vendor string. - * - * \note The Ogg FLAC mapping requires that the VORBIS_COMMENT block be - * the second metadata block of the stream. The encoder already supplies - * the STREAMINFO block automatically. If \a metadata does not contain a - * VORBIS_COMMENT block, the encoder will supply that too. Otherwise, if - * \a metadata does contain a VORBIS_COMMENT block and it is not the - * first, the init function will reorder \a metadata by moving the - * VORBIS_COMMENT block to the front; the relative ordering of the other - * blocks will remain as they were. - * - * \note The Ogg FLAC mapping limits the number of metadata blocks per - * stream to \c 65535. If \a num_blocks exceeds this the function will - * return \c false. - * - * \default \c NULL, 0 - * \param encoder An encoder instance to set. - * \param metadata See above. - * \param num_blocks See above. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - * \c false if the encoder is already initialized, or if - * \a num_blocks > 65535 if encoding to Ogg FLAC, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_metadata(FLAC__StreamEncoder *encoder, FLAC__StreamMetadata **metadata, unsigned num_blocks); - -/** Get the current encoder state. - * - * \param encoder An encoder instance to query. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__StreamEncoderState - * The current encoder state. - */ -FLAC_API FLAC__StreamEncoderState FLAC__stream_encoder_get_state(const FLAC__StreamEncoder *encoder); - -/** Get the state of the verify stream decoder. - * Useful when the stream encoder state is - * \c FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR. - * - * \param encoder An encoder instance to query. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__StreamDecoderState - * The verify stream decoder state. - */ -FLAC_API FLAC__StreamDecoderState FLAC__stream_encoder_get_verify_decoder_state(const FLAC__StreamEncoder *encoder); - -/** Get the current encoder state as a C string. - * This version automatically resolves - * \c FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR by getting the - * verify decoder's state. - * - * \param encoder A encoder instance to query. - * \assert - * \code encoder != NULL \endcode - * \retval const char * - * The encoder state as a C string. Do not modify the contents. - */ -FLAC_API const char *FLAC__stream_encoder_get_resolved_state_string(const FLAC__StreamEncoder *encoder); - -/** Get relevant values about the nature of a verify decoder error. - * Useful when the stream encoder state is - * \c FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR. The arguments should - * be addresses in which the stats will be returned, or NULL if value - * is not desired. - * - * \param encoder An encoder instance to query. - * \param absolute_sample The absolute sample number of the mismatch. - * \param frame_number The number of the frame in which the mismatch occurred. - * \param channel The channel in which the mismatch occurred. - * \param sample The number of the sample (relative to the frame) in - * which the mismatch occurred. - * \param expected The expected value for the sample in question. - * \param got The actual value returned by the decoder. - * \assert - * \code encoder != NULL \endcode - */ -FLAC_API void FLAC__stream_encoder_get_verify_decoder_error_stats(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_sample, unsigned *frame_number, unsigned *channel, unsigned *sample, FLAC__int32 *expected, FLAC__int32 *got); - -/** Get the "verify" flag. - * - * \param encoder An encoder instance to query. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * See FLAC__stream_encoder_set_verify(). - */ -FLAC_API FLAC__bool FLAC__stream_encoder_get_verify(const FLAC__StreamEncoder *encoder); - -/** Get the frame header. - * - * \param encoder An initialized encoder instance in the OK state. - * \param buffer An array of pointers to each channel's signal. - * \param samples The number of samples in one channel. - * \assert - * \code encoder != NULL \endcode - * \code FLAC__stream_encoder_get_state(encoder) == FLAC__STREAM_ENCODER_OK \endcode - * \retval FLAC__bool - * \c true if successful, else \c false; in this case, check the - * encoder state with FLAC__stream_encoder_get_state() to see what - * went wrong. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_process(FLAC__StreamEncoder *encoder, const FLAC__int32 * const buffer[], unsigned samples); - -/** Submit data for encoding. - * This version allows you to supply the input data where the channels - * are interleaved into a single array (i.e. channel0_sample0, - * channel1_sample0, ... , channelN_sample0, channel0_sample1, ...). - * The samples need not be block-aligned but they must be - * sample-aligned, i.e. the first value should be channel0_sample0 - * and the last value channelN_sampleM. Each sample should be a signed - * integer, right-justified to the resolution set by - * FLAC__stream_encoder_set_bits_per_sample(). For example, if the - * resolution is 16 bits per sample, the samples should all be in the - * range [-32768,32767]. - * - * For applications where channel order is important, channels must - * follow the order as described in the - * frame header. - * - * \param encoder An initialized encoder instance in the OK state. - * \param buffer An array of channel-interleaved data (see above). - * \param samples The number of samples in one channel, the same as for - * FLAC__stream_encoder_process(). For example, if - * encoding two channels, \c 1000 \a samples corresponds - * to a \a buffer of 2000 values. - * \assert - * \code encoder != NULL \endcode - * \code FLAC__stream_encoder_get_state(encoder) == FLAC__STREAM_ENCODER_OK \endcode - * \retval FLAC__bool - * \c true if successful, else \c false; in this case, check the - * encoder state with FLAC__stream_encoder_get_state() to see what - * went wrong. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_process_interleaved(FLAC__StreamEncoder *encoder, const FLAC__int32 buffer[], unsigned samples); - -/* \} */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/libogg/include/ogg/ogg.h b/sources/LabSound/third_party/libnyquist/third_party/libogg/include/ogg/ogg.h deleted file mode 100644 index cea4ebed..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libogg/include/ogg/ogg.h +++ /dev/null @@ -1,210 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: toplevel libogg include - last mod: $Id: ogg.h 18044 2011-08-01 17:55:20Z gmaxwell $ - - ********************************************************************/ -#ifndef _OGG_H -#define _OGG_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include - -typedef struct { - void *iov_base; - size_t iov_len; -} ogg_iovec_t; - -typedef struct { - long endbyte; - int endbit; - - unsigned char *buffer; - unsigned char *ptr; - long storage; -} oggpack_buffer; - -/* ogg_page is used to encapsulate the data in one Ogg bitstream page *****/ - -typedef struct { - unsigned char *header; - long header_len; - unsigned char *body; - long body_len; -} ogg_page; - -/* ogg_stream_state contains the current encode/decode state of a logical - Ogg bitstream **********************************************************/ - -typedef struct { - unsigned char *body_data; /* bytes from packet bodies */ - long body_storage; /* storage elements allocated */ - long body_fill; /* elements stored; fill mark */ - long body_returned; /* elements of fill returned */ - - - int *lacing_vals; /* The values that will go to the segment table */ - ogg_int64_t *granule_vals; /* granulepos values for headers. Not compact - this way, but it is simple coupled to the - lacing fifo */ - long lacing_storage; - long lacing_fill; - long lacing_packet; - long lacing_returned; - - unsigned char header[282]; /* working space for header encode */ - int header_fill; - - int e_o_s; /* set when we have buffered the last packet in the - logical bitstream */ - int b_o_s; /* set after we've written the initial page - of a logical bitstream */ - long serialno; - long pageno; - ogg_int64_t packetno; /* sequence number for decode; the framing - knows where there's a hole in the data, - but we need coupling so that the codec - (which is in a separate abstraction - layer) also knows about the gap */ - ogg_int64_t granulepos; - -} ogg_stream_state; - -/* ogg_packet is used to encapsulate the data and metadata belonging - to a single raw Ogg/Vorbis packet *************************************/ - -typedef struct { - unsigned char *packet; - long bytes; - long b_o_s; - long e_o_s; - - ogg_int64_t granulepos; - - ogg_int64_t packetno; /* sequence number for decode; the framing - knows where there's a hole in the data, - but we need coupling so that the codec - (which is in a separate abstraction - layer) also knows about the gap */ -} ogg_packet; - -typedef struct { - unsigned char *data; - int storage; - int fill; - int returned; - - int unsynced; - int headerbytes; - int bodybytes; -} ogg_sync_state; - -/* Ogg BITSTREAM PRIMITIVES: bitstream ************************/ - -extern void oggpack_writeinit(oggpack_buffer *b); -extern int oggpack_writecheck(oggpack_buffer *b); -extern void oggpack_writetrunc(oggpack_buffer *b,long bits); -extern void oggpack_writealign(oggpack_buffer *b); -extern void oggpack_writecopy(oggpack_buffer *b,void *source,long bits); -extern void oggpack_reset(oggpack_buffer *b); -extern void oggpack_writeclear(oggpack_buffer *b); -extern void oggpack_readinit(oggpack_buffer *b,unsigned char *buf,int bytes); -extern void oggpack_write(oggpack_buffer *b,unsigned long value,int bits); -extern long oggpack_look(oggpack_buffer *b,int bits); -extern long oggpack_look1(oggpack_buffer *b); -extern void oggpack_adv(oggpack_buffer *b,int bits); -extern void oggpack_adv1(oggpack_buffer *b); -extern long oggpack_read(oggpack_buffer *b,int bits); -extern long oggpack_read1(oggpack_buffer *b); -extern long oggpack_bytes(oggpack_buffer *b); -extern long oggpack_bits(oggpack_buffer *b); -extern unsigned char *oggpack_get_buffer(oggpack_buffer *b); - -extern void oggpackB_writeinit(oggpack_buffer *b); -extern int oggpackB_writecheck(oggpack_buffer *b); -extern void oggpackB_writetrunc(oggpack_buffer *b,long bits); -extern void oggpackB_writealign(oggpack_buffer *b); -extern void oggpackB_writecopy(oggpack_buffer *b,void *source,long bits); -extern void oggpackB_reset(oggpack_buffer *b); -extern void oggpackB_writeclear(oggpack_buffer *b); -extern void oggpackB_readinit(oggpack_buffer *b,unsigned char *buf,int bytes); -extern void oggpackB_write(oggpack_buffer *b,unsigned long value,int bits); -extern long oggpackB_look(oggpack_buffer *b,int bits); -extern long oggpackB_look1(oggpack_buffer *b); -extern void oggpackB_adv(oggpack_buffer *b,int bits); -extern void oggpackB_adv1(oggpack_buffer *b); -extern long oggpackB_read(oggpack_buffer *b,int bits); -extern long oggpackB_read1(oggpack_buffer *b); -extern long oggpackB_bytes(oggpack_buffer *b); -extern long oggpackB_bits(oggpack_buffer *b); -extern unsigned char *oggpackB_get_buffer(oggpack_buffer *b); - -/* Ogg BITSTREAM PRIMITIVES: encoding **************************/ - -extern int ogg_stream_packetin(ogg_stream_state *os, ogg_packet *op); -extern int ogg_stream_iovecin(ogg_stream_state *os, ogg_iovec_t *iov, - int count, long e_o_s, ogg_int64_t granulepos); -extern int ogg_stream_pageout(ogg_stream_state *os, ogg_page *og); -extern int ogg_stream_pageout_fill(ogg_stream_state *os, ogg_page *og, int nfill); -extern int ogg_stream_flush(ogg_stream_state *os, ogg_page *og); -extern int ogg_stream_flush_fill(ogg_stream_state *os, ogg_page *og, int nfill); - -/* Ogg BITSTREAM PRIMITIVES: decoding **************************/ - -extern int ogg_sync_init(ogg_sync_state *oy); -extern int ogg_sync_clear(ogg_sync_state *oy); -extern int ogg_sync_reset(ogg_sync_state *oy); -extern int ogg_sync_destroy(ogg_sync_state *oy); -extern int ogg_sync_check(ogg_sync_state *oy); - -extern char *ogg_sync_buffer(ogg_sync_state *oy, long size); -extern int ogg_sync_wrote(ogg_sync_state *oy, long bytes); -extern long ogg_sync_pageseek(ogg_sync_state *oy,ogg_page *og); -extern int ogg_sync_pageout(ogg_sync_state *oy, ogg_page *og); -extern int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og); -extern int ogg_stream_packetout(ogg_stream_state *os,ogg_packet *op); -extern int ogg_stream_packetpeek(ogg_stream_state *os,ogg_packet *op); - -/* Ogg BITSTREAM PRIMITIVES: general ***************************/ - -extern int ogg_stream_init(ogg_stream_state *os,int serialno); -extern int ogg_stream_clear(ogg_stream_state *os); -extern int ogg_stream_reset(ogg_stream_state *os); -extern int ogg_stream_reset_serialno(ogg_stream_state *os,int serialno); -extern int ogg_stream_destroy(ogg_stream_state *os); -extern int ogg_stream_check(ogg_stream_state *os); -extern int ogg_stream_eos(ogg_stream_state *os); - -extern void ogg_page_checksum_set(ogg_page *og); - -extern int ogg_page_version(const ogg_page *og); -extern int ogg_page_continued(const ogg_page *og); -extern int ogg_page_bos(const ogg_page *og); -extern int ogg_page_eos(const ogg_page *og); -extern ogg_int64_t ogg_page_granulepos(const ogg_page *og); -extern int ogg_page_serialno(const ogg_page *og); -extern long ogg_page_pageno(const ogg_page *og); -extern int ogg_page_packets(const ogg_page *og); - -extern void ogg_packet_clear(ogg_packet *op); - - -#ifdef __cplusplus -} -#endif - -#endif /* _OGG_H */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/libogg/include/ogg/os_types.h b/sources/LabSound/third_party/libnyquist/third_party/libogg/include/ogg/os_types.h deleted file mode 100644 index ac72e33a..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libogg/include/ogg/os_types.h +++ /dev/null @@ -1,152 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: #ifdef jail to whip a few platforms into the UNIX ideal. - last mod: $Id: os_types.h 19098 2014-02-26 19:06:45Z giles $ - - ********************************************************************/ -#ifndef _OS_TYPES_H -#define _OS_TYPES_H - -/* make it easy on the folks that want to compile the libs with a - different malloc than stdlib */ -#define _ogg_malloc malloc -#define _ogg_calloc calloc -#define _ogg_realloc realloc -#define _ogg_free free - -#if defined(_WIN32) - -# if defined(__CYGWIN__) -# include - typedef int16_t ogg_int16_t; - typedef uint16_t ogg_uint16_t; - typedef int32_t ogg_int32_t; - typedef uint32_t ogg_uint32_t; - typedef int64_t ogg_int64_t; - typedef uint64_t ogg_uint64_t; -# elif defined(__MINGW32__) -# include - typedef short ogg_int16_t; - typedef unsigned short ogg_uint16_t; - typedef int ogg_int32_t; - typedef unsigned int ogg_uint32_t; - typedef long long ogg_int64_t; - typedef unsigned long long ogg_uint64_t; -# elif defined(__MWERKS__) - typedef long long ogg_int64_t; - typedef int ogg_int32_t; - typedef unsigned int ogg_uint32_t; - typedef short ogg_int16_t; - typedef unsigned short ogg_uint16_t; -# else - /* MSVC/Borland */ - typedef __int64 ogg_int64_t; - typedef __int32 ogg_int32_t; - typedef unsigned __int32 ogg_uint32_t; - typedef __int16 ogg_int16_t; - typedef unsigned __int16 ogg_uint16_t; -# endif - -#elif defined(__MACOS__) - -# include - typedef SInt16 ogg_int16_t; - typedef UInt16 ogg_uint16_t; - typedef SInt32 ogg_int32_t; - typedef UInt32 ogg_uint32_t; - typedef SInt64 ogg_int64_t; - -#elif (defined(__APPLE__) && defined(__MACH__)) /* MacOS X Framework build */ - -# include - typedef int16_t ogg_int16_t; - typedef uint16_t ogg_uint16_t; - typedef int32_t ogg_int32_t; - typedef uint32_t ogg_uint32_t; - typedef int64_t ogg_int64_t; - -#elif defined(__HAIKU__) - - /* Haiku */ -# include - typedef short ogg_int16_t; - typedef unsigned short ogg_uint16_t; - typedef int ogg_int32_t; - typedef unsigned int ogg_uint32_t; - typedef long long ogg_int64_t; - -#elif defined(__BEOS__) - - /* Be */ -# include - typedef int16_t ogg_int16_t; - typedef uint16_t ogg_uint16_t; - typedef int32_t ogg_int32_t; - typedef uint32_t ogg_uint32_t; - typedef int64_t ogg_int64_t; - -#elif defined (__EMX__) - - /* OS/2 GCC */ - typedef short ogg_int16_t; - typedef unsigned short ogg_uint16_t; - typedef int ogg_int32_t; - typedef unsigned int ogg_uint32_t; - typedef long long ogg_int64_t; - -#elif defined (DJGPP) - - /* DJGPP */ - typedef short ogg_int16_t; - typedef int ogg_int32_t; - typedef unsigned int ogg_uint32_t; - typedef long long ogg_int64_t; - -#elif defined(R5900) - - /* PS2 EE */ - typedef long ogg_int64_t; - typedef int ogg_int32_t; - typedef unsigned ogg_uint32_t; - typedef short ogg_int16_t; - -#elif defined(__SYMBIAN32__) - - /* Symbian GCC */ - typedef signed short ogg_int16_t; - typedef unsigned short ogg_uint16_t; - typedef signed int ogg_int32_t; - typedef unsigned int ogg_uint32_t; - typedef long long int ogg_int64_t; - -#elif defined(__TMS320C6X__) - - /* TI C64x compiler */ - typedef signed short ogg_int16_t; - typedef unsigned short ogg_uint16_t; - typedef signed int ogg_int32_t; - typedef unsigned int ogg_uint32_t; - typedef long long int ogg_int64_t; - -#else - -#include -typedef int16_t ogg_int16_t; -typedef uint16_t ogg_uint16_t; -typedef int32_t ogg_int32_t; -typedef uint32_t ogg_uint32_t; -typedef int64_t ogg_int64_t; - -#endif - -#endif /* _OS_TYPES_H */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/libogg/src/bitwise.c b/sources/LabSound/third_party/libnyquist/third_party/libogg/src/bitwise.c deleted file mode 100644 index 145901d1..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libogg/src/bitwise.c +++ /dev/null @@ -1,1088 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE Ogg CONTAINER SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2014 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: packing variable sized words into an octet stream - last mod: $Id: bitwise.c 19149 2014-05-27 16:26:23Z giles $ - - ********************************************************************/ - -/* We're 'LSb' endian; if we write a word but read individual bits, - then we'll read the lsb first */ - -#include -#include -#include -#include - -#define BUFFER_INCREMENT 256 - -static const unsigned long mask[]= -{0x00000000,0x00000001,0x00000003,0x00000007,0x0000000f, - 0x0000001f,0x0000003f,0x0000007f,0x000000ff,0x000001ff, - 0x000003ff,0x000007ff,0x00000fff,0x00001fff,0x00003fff, - 0x00007fff,0x0000ffff,0x0001ffff,0x0003ffff,0x0007ffff, - 0x000fffff,0x001fffff,0x003fffff,0x007fffff,0x00ffffff, - 0x01ffffff,0x03ffffff,0x07ffffff,0x0fffffff,0x1fffffff, - 0x3fffffff,0x7fffffff,0xffffffff }; - -static const unsigned int mask8B[]= -{0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff}; - -void oggpack_writeinit(oggpack_buffer *b){ - memset(b,0,sizeof(*b)); - b->ptr=b->buffer=_ogg_malloc(BUFFER_INCREMENT); - b->buffer[0]='\0'; - b->storage=BUFFER_INCREMENT; -} - -void oggpackB_writeinit(oggpack_buffer *b){ - oggpack_writeinit(b); -} - -int oggpack_writecheck(oggpack_buffer *b){ - if(!b->ptr || !b->storage)return -1; - return 0; -} - -int oggpackB_writecheck(oggpack_buffer *b){ - return oggpack_writecheck(b); -} - -void oggpack_writetrunc(oggpack_buffer *b,long bits){ - long bytes=bits>>3; - if(b->ptr){ - bits-=bytes*8; - b->ptr=b->buffer+bytes; - b->endbit=bits; - b->endbyte=bytes; - *b->ptr&=mask[bits]; - } -} - -void oggpackB_writetrunc(oggpack_buffer *b,long bits){ - long bytes=bits>>3; - if(b->ptr){ - bits-=bytes*8; - b->ptr=b->buffer+bytes; - b->endbit=bits; - b->endbyte=bytes; - *b->ptr&=mask8B[bits]; - } -} - -/* Takes only up to 32 bits. */ -void oggpack_write(oggpack_buffer *b,unsigned long value,int bits){ - if(bits<0 || bits>32) goto err; - if(b->endbyte>=b->storage-4){ - void *ret; - if(!b->ptr)return; - if(b->storage>LONG_MAX-BUFFER_INCREMENT) goto err; - ret=_ogg_realloc(b->buffer,b->storage+BUFFER_INCREMENT); - if(!ret) goto err; - b->buffer=ret; - b->storage+=BUFFER_INCREMENT; - b->ptr=b->buffer+b->endbyte; - } - - value&=mask[bits]; - bits+=b->endbit; - - b->ptr[0]|=value<endbit; - - if(bits>=8){ - b->ptr[1]=(unsigned char)(value>>(8-b->endbit)); - if(bits>=16){ - b->ptr[2]=(unsigned char)(value>>(16-b->endbit)); - if(bits>=24){ - b->ptr[3]=(unsigned char)(value>>(24-b->endbit)); - if(bits>=32){ - if(b->endbit) - b->ptr[4]=(unsigned char)(value>>(32-b->endbit)); - else - b->ptr[4]=0; - } - } - } - } - - b->endbyte+=bits/8; - b->ptr+=bits/8; - b->endbit=bits&7; - return; - err: - oggpack_writeclear(b); -} - -/* Takes only up to 32 bits. */ -void oggpackB_write(oggpack_buffer *b,unsigned long value,int bits){ - if(bits<0 || bits>32) goto err; - if(b->endbyte>=b->storage-4){ - void *ret; - if(!b->ptr)return; - if(b->storage>LONG_MAX-BUFFER_INCREMENT) goto err; - ret=_ogg_realloc(b->buffer,b->storage+BUFFER_INCREMENT); - if(!ret) goto err; - b->buffer=ret; - b->storage+=BUFFER_INCREMENT; - b->ptr=b->buffer+b->endbyte; - } - - value=(value&mask[bits])<<(32-bits); - bits+=b->endbit; - - b->ptr[0]|=value>>(24+b->endbit); - - if(bits>=8){ - b->ptr[1]=(unsigned char)(value>>(16+b->endbit)); - if(bits>=16){ - b->ptr[2]=(unsigned char)(value>>(8+b->endbit)); - if(bits>=24){ - b->ptr[3]=(unsigned char)(value>>(b->endbit)); - if(bits>=32){ - if(b->endbit) - b->ptr[4]=(unsigned char)(value<<(8-b->endbit)); - else - b->ptr[4]=0; - } - } - } - } - - b->endbyte+=bits/8; - b->ptr+=bits/8; - b->endbit=bits&7; - return; - err: - oggpack_writeclear(b); -} - -void oggpack_writealign(oggpack_buffer *b){ - int bits=8-b->endbit; - if(bits<8) - oggpack_write(b,0,bits); -} - -void oggpackB_writealign(oggpack_buffer *b){ - int bits=8-b->endbit; - if(bits<8) - oggpackB_write(b,0,bits); -} - -static void oggpack_writecopy_helper(oggpack_buffer *b, - void *source, - long bits, - void (*w)(oggpack_buffer *, - unsigned long, - int), - int msb){ - unsigned char *ptr=(unsigned char *)source; - - long bytes=bits/8; - long pbytes=(b->endbit+bits)/8; - bits-=bytes*8; - - /* expand storage up-front */ - if(b->endbyte+pbytes>=b->storage){ - void *ret; - if(!b->ptr) goto err; - if(b->storage>b->endbyte+pbytes+BUFFER_INCREMENT) goto err; - b->storage=b->endbyte+pbytes+BUFFER_INCREMENT; - ret=_ogg_realloc(b->buffer,b->storage); - if(!ret) goto err; - b->buffer=ret; - b->ptr=b->buffer+b->endbyte; - } - - /* copy whole octets */ - if(b->endbit){ - int i; - /* unaligned copy. Do it the hard way. */ - for(i=0;iptr,source,bytes); - b->ptr+=bytes; - b->endbyte+=bytes; - *b->ptr=0; - } - - /* copy trailing bits */ - if(bits){ - if(msb) - w(b,(unsigned long)(ptr[bytes]>>(8-bits)),bits); - else - w(b,(unsigned long)(ptr[bytes]),bits); - } - return; - err: - oggpack_writeclear(b); -} - -void oggpack_writecopy(oggpack_buffer *b,void *source,long bits){ - oggpack_writecopy_helper(b,source,bits,oggpack_write,0); -} - -void oggpackB_writecopy(oggpack_buffer *b,void *source,long bits){ - oggpack_writecopy_helper(b,source,bits,oggpackB_write,1); -} - -void oggpack_reset(oggpack_buffer *b){ - if(!b->ptr)return; - b->ptr=b->buffer; - b->buffer[0]=0; - b->endbit=b->endbyte=0; -} - -void oggpackB_reset(oggpack_buffer *b){ - oggpack_reset(b); -} - -void oggpack_writeclear(oggpack_buffer *b){ - if(b->buffer)_ogg_free(b->buffer); - memset(b,0,sizeof(*b)); -} - -void oggpackB_writeclear(oggpack_buffer *b){ - oggpack_writeclear(b); -} - -void oggpack_readinit(oggpack_buffer *b,unsigned char *buf,int bytes){ - memset(b,0,sizeof(*b)); - b->buffer=b->ptr=buf; - b->storage=bytes; -} - -void oggpackB_readinit(oggpack_buffer *b,unsigned char *buf,int bytes){ - oggpack_readinit(b,buf,bytes); -} - -/* Read in bits without advancing the bitptr; bits <= 32 */ -long oggpack_look(oggpack_buffer *b,int bits){ - unsigned long ret; - unsigned long m; - - if(bits<0 || bits>32) return -1; - m=mask[bits]; - bits+=b->endbit; - - if(b->endbyte >= b->storage-4){ - /* not the main path */ - if(b->endbyte > b->storage-((bits+7)>>3)) return -1; - /* special case to avoid reading b->ptr[0], which might be past the end of - the buffer; also skips some useless accounting */ - else if(!bits)return(0L); - } - - ret=b->ptr[0]>>b->endbit; - if(bits>8){ - ret|=b->ptr[1]<<(8-b->endbit); - if(bits>16){ - ret|=b->ptr[2]<<(16-b->endbit); - if(bits>24){ - ret|=b->ptr[3]<<(24-b->endbit); - if(bits>32 && b->endbit) - ret|=b->ptr[4]<<(32-b->endbit); - } - } - } - return(m&ret); -} - -/* Read in bits without advancing the bitptr; bits <= 32 */ -long oggpackB_look(oggpack_buffer *b,int bits){ - unsigned long ret; - int m=32-bits; - - if(m<0 || m>32) return -1; - bits+=b->endbit; - - if(b->endbyte >= b->storage-4){ - /* not the main path */ - if(b->endbyte > b->storage-((bits+7)>>3)) return -1; - /* special case to avoid reading b->ptr[0], which might be past the end of - the buffer; also skips some useless accounting */ - else if(!bits)return(0L); - } - - ret=b->ptr[0]<<(24+b->endbit); - if(bits>8){ - ret|=b->ptr[1]<<(16+b->endbit); - if(bits>16){ - ret|=b->ptr[2]<<(8+b->endbit); - if(bits>24){ - ret|=b->ptr[3]<<(b->endbit); - if(bits>32 && b->endbit) - ret|=b->ptr[4]>>(8-b->endbit); - } - } - } - return ((ret&0xffffffff)>>(m>>1))>>((m+1)>>1); -} - -long oggpack_look1(oggpack_buffer *b){ - if(b->endbyte>=b->storage)return(-1); - return((b->ptr[0]>>b->endbit)&1); -} - -long oggpackB_look1(oggpack_buffer *b){ - if(b->endbyte>=b->storage)return(-1); - return((b->ptr[0]>>(7-b->endbit))&1); -} - -void oggpack_adv(oggpack_buffer *b,int bits){ - bits+=b->endbit; - - if(b->endbyte > b->storage-((bits+7)>>3)) goto overflow; - - b->ptr+=bits/8; - b->endbyte+=bits/8; - b->endbit=bits&7; - return; - - overflow: - b->ptr=NULL; - b->endbyte=b->storage; - b->endbit=1; -} - -void oggpackB_adv(oggpack_buffer *b,int bits){ - oggpack_adv(b,bits); -} - -void oggpack_adv1(oggpack_buffer *b){ - if(++(b->endbit)>7){ - b->endbit=0; - b->ptr++; - b->endbyte++; - } -} - -void oggpackB_adv1(oggpack_buffer *b){ - oggpack_adv1(b); -} - -/* bits <= 32 */ -long oggpack_read(oggpack_buffer *b,int bits){ - long ret; - unsigned long m; - - if(bits<0 || bits>32) goto err; - m=mask[bits]; - bits+=b->endbit; - - if(b->endbyte >= b->storage-4){ - /* not the main path */ - if(b->endbyte > b->storage-((bits+7)>>3)) goto overflow; - /* special case to avoid reading b->ptr[0], which might be past the end of - the buffer; also skips some useless accounting */ - else if(!bits)return(0L); - } - - ret=b->ptr[0]>>b->endbit; - if(bits>8){ - ret|=b->ptr[1]<<(8-b->endbit); - if(bits>16){ - ret|=b->ptr[2]<<(16-b->endbit); - if(bits>24){ - ret|=b->ptr[3]<<(24-b->endbit); - if(bits>32 && b->endbit){ - ret|=b->ptr[4]<<(32-b->endbit); - } - } - } - } - ret&=m; - b->ptr+=bits/8; - b->endbyte+=bits/8; - b->endbit=bits&7; - return ret; - - overflow: - err: - b->ptr=NULL; - b->endbyte=b->storage; - b->endbit=1; - return -1L; -} - -/* bits <= 32 */ -long oggpackB_read(oggpack_buffer *b,int bits){ - long ret; - long m=32-bits; - - if(m<0 || m>32) goto err; - bits+=b->endbit; - - if(b->endbyte+4>=b->storage){ - /* not the main path */ - if(b->endbyte > b->storage-((bits+7)>>3)) goto overflow; - /* special case to avoid reading b->ptr[0], which might be past the end of - the buffer; also skips some useless accounting */ - else if(!bits)return(0L); - } - - ret=b->ptr[0]<<(24+b->endbit); - if(bits>8){ - ret|=b->ptr[1]<<(16+b->endbit); - if(bits>16){ - ret|=b->ptr[2]<<(8+b->endbit); - if(bits>24){ - ret|=b->ptr[3]<<(b->endbit); - if(bits>32 && b->endbit) - ret|=b->ptr[4]>>(8-b->endbit); - } - } - } - ret=((ret&0xffffffffUL)>>(m>>1))>>((m+1)>>1); - - b->ptr+=bits/8; - b->endbyte+=bits/8; - b->endbit=bits&7; - return ret; - - overflow: - err: - b->ptr=NULL; - b->endbyte=b->storage; - b->endbit=1; - return -1L; -} - -long oggpack_read1(oggpack_buffer *b){ - long ret; - - if(b->endbyte >= b->storage) goto overflow; - ret=(b->ptr[0]>>b->endbit)&1; - - b->endbit++; - if(b->endbit>7){ - b->endbit=0; - b->ptr++; - b->endbyte++; - } - return ret; - - overflow: - b->ptr=NULL; - b->endbyte=b->storage; - b->endbit=1; - return -1L; -} - -long oggpackB_read1(oggpack_buffer *b){ - long ret; - - if(b->endbyte >= b->storage) goto overflow; - ret=(b->ptr[0]>>(7-b->endbit))&1; - - b->endbit++; - if(b->endbit>7){ - b->endbit=0; - b->ptr++; - b->endbyte++; - } - return ret; - - overflow: - b->ptr=NULL; - b->endbyte=b->storage; - b->endbit=1; - return -1L; -} - -long oggpack_bytes(oggpack_buffer *b){ - return(b->endbyte+(b->endbit+7)/8); -} - -long oggpack_bits(oggpack_buffer *b){ - return(b->endbyte*8+b->endbit); -} - -long oggpackB_bytes(oggpack_buffer *b){ - return oggpack_bytes(b); -} - -long oggpackB_bits(oggpack_buffer *b){ - return oggpack_bits(b); -} - -unsigned char *oggpack_get_buffer(oggpack_buffer *b){ - return(b->buffer); -} - -unsigned char *oggpackB_get_buffer(oggpack_buffer *b){ - return oggpack_get_buffer(b); -} - -/* Self test of the bitwise routines; everything else is based on - them, so they damned well better be solid. */ - -#ifdef _V_SELFTEST -#include - -static int ilog(unsigned int v){ - int ret=0; - while(v){ - ret++; - v>>=1; - } - return(ret); -} - -oggpack_buffer o; -oggpack_buffer r; - -void report(char *in){ - fprintf(stderr,"%s",in); - exit(1); -} - -void cliptest(unsigned long *b,int vals,int bits,int *comp,int compsize){ - long bytes,i; - unsigned char *buffer; - - oggpack_reset(&o); - for(i=0;i -#include -#include -#include - -/* A complete description of Ogg framing exists in docs/framing.html */ - -int ogg_page_version(const ogg_page *og){ - return((int)(og->header[4])); -} - -int ogg_page_continued(const ogg_page *og){ - return((int)(og->header[5]&0x01)); -} - -int ogg_page_bos(const ogg_page *og){ - return((int)(og->header[5]&0x02)); -} - -int ogg_page_eos(const ogg_page *og){ - return((int)(og->header[5]&0x04)); -} - -ogg_int64_t ogg_page_granulepos(const ogg_page *og){ - unsigned char *page=og->header; - ogg_int64_t granulepos=page[13]&(0xff); - granulepos= (granulepos<<8)|(page[12]&0xff); - granulepos= (granulepos<<8)|(page[11]&0xff); - granulepos= (granulepos<<8)|(page[10]&0xff); - granulepos= (granulepos<<8)|(page[9]&0xff); - granulepos= (granulepos<<8)|(page[8]&0xff); - granulepos= (granulepos<<8)|(page[7]&0xff); - granulepos= (granulepos<<8)|(page[6]&0xff); - return(granulepos); -} - -int ogg_page_serialno(const ogg_page *og){ - return(og->header[14] | - (og->header[15]<<8) | - (og->header[16]<<16) | - (og->header[17]<<24)); -} - -long ogg_page_pageno(const ogg_page *og){ - return(og->header[18] | - (og->header[19]<<8) | - (og->header[20]<<16) | - (og->header[21]<<24)); -} - - - -/* returns the number of packets that are completed on this page (if - the leading packet is begun on a previous page, but ends on this - page, it's counted */ - -/* NOTE: - If a page consists of a packet begun on a previous page, and a new - packet begun (but not completed) on this page, the return will be: - ogg_page_packets(page) ==1, - ogg_page_continued(page) !=0 - - If a page happens to be a single packet that was begun on a - previous page, and spans to the next page (in the case of a three or - more page packet), the return will be: - ogg_page_packets(page) ==0, - ogg_page_continued(page) !=0 -*/ - -int ogg_page_packets(const ogg_page *og){ - int i,n=og->header[26],count=0; - for(i=0;iheader[27+i]<255)count++; - return(count); -} - - -#if 0 -/* helper to initialize lookup for direct-table CRC (illustrative; we - use the static init below) */ - -static ogg_uint32_t _ogg_crc_entry(unsigned long index){ - int i; - unsigned long r; - - r = index << 24; - for (i=0; i<8; i++) - if (r & 0x80000000UL) - r = (r << 1) ^ 0x04c11db7; /* The same as the ethernet generator - polynomial, although we use an - unreflected alg and an init/final - of 0, not 0xffffffff */ - else - r<<=1; - return (r & 0xffffffffUL); -} -#endif - -static const ogg_uint32_t crc_lookup[256]={ - 0x00000000,0x04c11db7,0x09823b6e,0x0d4326d9, - 0x130476dc,0x17c56b6b,0x1a864db2,0x1e475005, - 0x2608edb8,0x22c9f00f,0x2f8ad6d6,0x2b4bcb61, - 0x350c9b64,0x31cd86d3,0x3c8ea00a,0x384fbdbd, - 0x4c11db70,0x48d0c6c7,0x4593e01e,0x4152fda9, - 0x5f15adac,0x5bd4b01b,0x569796c2,0x52568b75, - 0x6a1936c8,0x6ed82b7f,0x639b0da6,0x675a1011, - 0x791d4014,0x7ddc5da3,0x709f7b7a,0x745e66cd, - 0x9823b6e0,0x9ce2ab57,0x91a18d8e,0x95609039, - 0x8b27c03c,0x8fe6dd8b,0x82a5fb52,0x8664e6e5, - 0xbe2b5b58,0xbaea46ef,0xb7a96036,0xb3687d81, - 0xad2f2d84,0xa9ee3033,0xa4ad16ea,0xa06c0b5d, - 0xd4326d90,0xd0f37027,0xddb056fe,0xd9714b49, - 0xc7361b4c,0xc3f706fb,0xceb42022,0xca753d95, - 0xf23a8028,0xf6fb9d9f,0xfbb8bb46,0xff79a6f1, - 0xe13ef6f4,0xe5ffeb43,0xe8bccd9a,0xec7dd02d, - 0x34867077,0x30476dc0,0x3d044b19,0x39c556ae, - 0x278206ab,0x23431b1c,0x2e003dc5,0x2ac12072, - 0x128e9dcf,0x164f8078,0x1b0ca6a1,0x1fcdbb16, - 0x018aeb13,0x054bf6a4,0x0808d07d,0x0cc9cdca, - 0x7897ab07,0x7c56b6b0,0x71159069,0x75d48dde, - 0x6b93dddb,0x6f52c06c,0x6211e6b5,0x66d0fb02, - 0x5e9f46bf,0x5a5e5b08,0x571d7dd1,0x53dc6066, - 0x4d9b3063,0x495a2dd4,0x44190b0d,0x40d816ba, - 0xaca5c697,0xa864db20,0xa527fdf9,0xa1e6e04e, - 0xbfa1b04b,0xbb60adfc,0xb6238b25,0xb2e29692, - 0x8aad2b2f,0x8e6c3698,0x832f1041,0x87ee0df6, - 0x99a95df3,0x9d684044,0x902b669d,0x94ea7b2a, - 0xe0b41de7,0xe4750050,0xe9362689,0xedf73b3e, - 0xf3b06b3b,0xf771768c,0xfa325055,0xfef34de2, - 0xc6bcf05f,0xc27dede8,0xcf3ecb31,0xcbffd686, - 0xd5b88683,0xd1799b34,0xdc3abded,0xd8fba05a, - 0x690ce0ee,0x6dcdfd59,0x608edb80,0x644fc637, - 0x7a089632,0x7ec98b85,0x738aad5c,0x774bb0eb, - 0x4f040d56,0x4bc510e1,0x46863638,0x42472b8f, - 0x5c007b8a,0x58c1663d,0x558240e4,0x51435d53, - 0x251d3b9e,0x21dc2629,0x2c9f00f0,0x285e1d47, - 0x36194d42,0x32d850f5,0x3f9b762c,0x3b5a6b9b, - 0x0315d626,0x07d4cb91,0x0a97ed48,0x0e56f0ff, - 0x1011a0fa,0x14d0bd4d,0x19939b94,0x1d528623, - 0xf12f560e,0xf5ee4bb9,0xf8ad6d60,0xfc6c70d7, - 0xe22b20d2,0xe6ea3d65,0xeba91bbc,0xef68060b, - 0xd727bbb6,0xd3e6a601,0xdea580d8,0xda649d6f, - 0xc423cd6a,0xc0e2d0dd,0xcda1f604,0xc960ebb3, - 0xbd3e8d7e,0xb9ff90c9,0xb4bcb610,0xb07daba7, - 0xae3afba2,0xaafbe615,0xa7b8c0cc,0xa379dd7b, - 0x9b3660c6,0x9ff77d71,0x92b45ba8,0x9675461f, - 0x8832161a,0x8cf30bad,0x81b02d74,0x857130c3, - 0x5d8a9099,0x594b8d2e,0x5408abf7,0x50c9b640, - 0x4e8ee645,0x4a4ffbf2,0x470cdd2b,0x43cdc09c, - 0x7b827d21,0x7f436096,0x7200464f,0x76c15bf8, - 0x68860bfd,0x6c47164a,0x61043093,0x65c52d24, - 0x119b4be9,0x155a565e,0x18197087,0x1cd86d30, - 0x029f3d35,0x065e2082,0x0b1d065b,0x0fdc1bec, - 0x3793a651,0x3352bbe6,0x3e119d3f,0x3ad08088, - 0x2497d08d,0x2056cd3a,0x2d15ebe3,0x29d4f654, - 0xc5a92679,0xc1683bce,0xcc2b1d17,0xc8ea00a0, - 0xd6ad50a5,0xd26c4d12,0xdf2f6bcb,0xdbee767c, - 0xe3a1cbc1,0xe760d676,0xea23f0af,0xeee2ed18, - 0xf0a5bd1d,0xf464a0aa,0xf9278673,0xfde69bc4, - 0x89b8fd09,0x8d79e0be,0x803ac667,0x84fbdbd0, - 0x9abc8bd5,0x9e7d9662,0x933eb0bb,0x97ffad0c, - 0xafb010b1,0xab710d06,0xa6322bdf,0xa2f33668, - 0xbcb4666d,0xb8757bda,0xb5365d03,0xb1f740b4}; - -/* init the encode/decode logical stream state */ - -int ogg_stream_init(ogg_stream_state *os,int serialno){ - if(os){ - memset(os,0,sizeof(*os)); - os->body_storage=16*1024; - os->lacing_storage=1024; - - os->body_data=_ogg_malloc(os->body_storage*sizeof(*os->body_data)); - os->lacing_vals=_ogg_malloc(os->lacing_storage*sizeof(*os->lacing_vals)); - os->granule_vals=_ogg_malloc(os->lacing_storage*sizeof(*os->granule_vals)); - - if(!os->body_data || !os->lacing_vals || !os->granule_vals){ - ogg_stream_clear(os); - return -1; - } - - os->serialno=serialno; - - return(0); - } - return(-1); -} - -/* async/delayed error detection for the ogg_stream_state */ -int ogg_stream_check(ogg_stream_state *os){ - if(!os || !os->body_data) return -1; - return 0; -} - -/* _clear does not free os, only the non-flat storage within */ -int ogg_stream_clear(ogg_stream_state *os){ - if(os){ - if(os->body_data)_ogg_free(os->body_data); - if(os->lacing_vals)_ogg_free(os->lacing_vals); - if(os->granule_vals)_ogg_free(os->granule_vals); - - memset(os,0,sizeof(*os)); - } - return(0); -} - -int ogg_stream_destroy(ogg_stream_state *os){ - if(os){ - ogg_stream_clear(os); - _ogg_free(os); - } - return(0); -} - -/* Helpers for ogg_stream_encode; this keeps the structure and - what's happening fairly clear */ - -static int _os_body_expand(ogg_stream_state *os,long needed){ - if(os->body_storage-needed<=os->body_fill){ - long body_storage; - void *ret; - if(os->body_storage>LONG_MAX-needed){ - ogg_stream_clear(os); - return -1; - } - body_storage=os->body_storage+needed; - if(body_storagebody_data,body_storage*sizeof(*os->body_data)); - if(!ret){ - ogg_stream_clear(os); - return -1; - } - os->body_storage=body_storage; - os->body_data=ret; - } - return 0; -} - -static int _os_lacing_expand(ogg_stream_state *os,long needed){ - if(os->lacing_storage-needed<=os->lacing_fill){ - long lacing_storage; - void *ret; - if(os->lacing_storage>LONG_MAX-needed){ - ogg_stream_clear(os); - return -1; - } - lacing_storage=os->lacing_storage+needed; - if(lacing_storagelacing_vals,lacing_storage*sizeof(*os->lacing_vals)); - if(!ret){ - ogg_stream_clear(os); - return -1; - } - os->lacing_vals=ret; - ret=_ogg_realloc(os->granule_vals,lacing_storage* - sizeof(*os->granule_vals)); - if(!ret){ - ogg_stream_clear(os); - return -1; - } - os->granule_vals=ret; - os->lacing_storage=lacing_storage; - } - return 0; -} - -/* checksum the page */ -/* Direct table CRC; note that this will be faster in the future if we - perform the checksum simultaneously with other copies */ - -void ogg_page_checksum_set(ogg_page *og){ - if(og){ - ogg_uint32_t crc_reg=0; - int i; - - /* safety; needed for API behavior, but not framing code */ - og->header[22]=0; - og->header[23]=0; - og->header[24]=0; - og->header[25]=0; - - for(i=0;iheader_len;i++) - crc_reg=(crc_reg<<8)^crc_lookup[((crc_reg >> 24)&0xff)^og->header[i]]; - for(i=0;ibody_len;i++) - crc_reg=(crc_reg<<8)^crc_lookup[((crc_reg >> 24)&0xff)^og->body[i]]; - - og->header[22]=(unsigned char)(crc_reg&0xff); - og->header[23]=(unsigned char)((crc_reg>>8)&0xff); - og->header[24]=(unsigned char)((crc_reg>>16)&0xff); - og->header[25]=(unsigned char)((crc_reg>>24)&0xff); - } -} - -/* submit data to the internal buffer of the framing engine */ -int ogg_stream_iovecin(ogg_stream_state *os, ogg_iovec_t *iov, int count, - long e_o_s, ogg_int64_t granulepos){ - - long bytes = 0, lacing_vals; - int i; - - if(ogg_stream_check(os)) return -1; - if(!iov) return 0; - - for (i = 0; i < count; ++i){ - if(iov[i].iov_len>LONG_MAX) return -1; - if(bytes>LONG_MAX-(long)iov[i].iov_len) return -1; - bytes += (long)iov[i].iov_len; - } - lacing_vals=bytes/255+1; - - if(os->body_returned){ - /* advance packet data according to the body_returned pointer. We - had to keep it around to return a pointer into the buffer last - call */ - - os->body_fill-=os->body_returned; - if(os->body_fill) - memmove(os->body_data,os->body_data+os->body_returned, - os->body_fill); - os->body_returned=0; - } - - /* make sure we have the buffer storage */ - if(_os_body_expand(os,bytes) || _os_lacing_expand(os,lacing_vals)) - return -1; - - /* Copy in the submitted packet. Yes, the copy is a waste; this is - the liability of overly clean abstraction for the time being. It - will actually be fairly easy to eliminate the extra copy in the - future */ - - for (i = 0; i < count; ++i) { - memcpy(os->body_data+os->body_fill, iov[i].iov_base, iov[i].iov_len); - os->body_fill += (int)iov[i].iov_len; - } - - /* Store lacing vals for this packet */ - for(i=0;ilacing_vals[os->lacing_fill+i]=255; - os->granule_vals[os->lacing_fill+i]=os->granulepos; - } - os->lacing_vals[os->lacing_fill+i]=bytes%255; - os->granulepos=os->granule_vals[os->lacing_fill+i]=granulepos; - - /* flag the first segment as the beginning of the packet */ - os->lacing_vals[os->lacing_fill]|= 0x100; - - os->lacing_fill+=lacing_vals; - - /* for the sake of completeness */ - os->packetno++; - - if(e_o_s)os->e_o_s=1; - - return(0); -} - -int ogg_stream_packetin(ogg_stream_state *os,ogg_packet *op){ - ogg_iovec_t iov; - iov.iov_base = op->packet; - iov.iov_len = op->bytes; - return ogg_stream_iovecin(os, &iov, 1, op->e_o_s, op->granulepos); -} - -/* Conditionally flush a page; force==0 will only flush nominal-size - pages, force==1 forces us to flush a page regardless of page size - so long as there's any data available at all. */ -static int ogg_stream_flush_i(ogg_stream_state *os,ogg_page *og, int force, int nfill){ - int i; - int vals=0; - int maxvals=(os->lacing_fill>255?255:os->lacing_fill); - int bytes=0; - long acc=0; - ogg_int64_t granule_pos=-1; - - if(ogg_stream_check(os)) return(0); - if(maxvals==0) return(0); - - /* construct a page */ - /* decide how many segments to include */ - - /* If this is the initial header case, the first page must only include - the initial header packet */ - if(os->b_o_s==0){ /* 'initial header page' case */ - granule_pos=0; - for(vals=0;valslacing_vals[vals]&0x0ff)<255){ - vals++; - break; - } - } - }else{ - - /* The extra packets_done, packet_just_done logic here attempts to do two things: - 1) Don't unneccessarily span pages. - 2) Unless necessary, don't flush pages if there are less than four packets on - them; this expands page size to reduce unneccessary overhead if incoming packets - are large. - These are not necessary behaviors, just 'always better than naive flushing' - without requiring an application to explicitly request a specific optimized - behavior. We'll want an explicit behavior setup pathway eventually as well. */ - - int packets_done=0; - int packet_just_done=0; - for(vals=0;valsnfill && packet_just_done>=4){ - force=1; - break; - } - acc+=os->lacing_vals[vals]&0x0ff; - if((os->lacing_vals[vals]&0xff)<255){ - granule_pos=os->granule_vals[vals]; - packet_just_done=++packets_done; - }else - packet_just_done=0; - } - if(vals==255)force=1; - } - - if(!force) return(0); - - /* construct the header in temp storage */ - memcpy(os->header,"OggS",4); - - /* stream structure version */ - os->header[4]=0x00; - - /* continued packet flag? */ - os->header[5]=0x00; - if((os->lacing_vals[0]&0x100)==0)os->header[5]|=0x01; - /* first page flag? */ - if(os->b_o_s==0)os->header[5]|=0x02; - /* last page flag? */ - if(os->e_o_s && os->lacing_fill==vals)os->header[5]|=0x04; - os->b_o_s=1; - - /* 64 bits of PCM position */ - for(i=6;i<14;i++){ - os->header[i]=(unsigned char)(granule_pos&0xff); - granule_pos>>=8; - } - - /* 32 bits of stream serial number */ - { - long serialno=os->serialno; - for(i=14;i<18;i++){ - os->header[i]=(unsigned char)(serialno&0xff); - serialno>>=8; - } - } - - /* 32 bits of page counter (we have both counter and page header - because this val can roll over) */ - if(os->pageno==-1)os->pageno=0; /* because someone called - stream_reset; this would be a - strange thing to do in an - encode stream, but it has - plausible uses */ - { - long pageno=os->pageno++; - for(i=18;i<22;i++){ - os->header[i]=(unsigned char)(pageno&0xff); - pageno>>=8; - } - } - - /* zero for computation; filled in later */ - os->header[22]=0; - os->header[23]=0; - os->header[24]=0; - os->header[25]=0; - - /* segment table */ - os->header[26]=(unsigned char)(vals&0xff); - for(i=0;iheader[i+27]=(unsigned char)(os->lacing_vals[i]&0xff); - - /* set pointers in the ogg_page struct */ - og->header=os->header; - og->header_len=os->header_fill=vals+27; - og->body=os->body_data+os->body_returned; - og->body_len=bytes; - - /* advance the lacing data and set the body_returned pointer */ - - os->lacing_fill-=vals; - memmove(os->lacing_vals,os->lacing_vals+vals,os->lacing_fill*sizeof(*os->lacing_vals)); - memmove(os->granule_vals,os->granule_vals+vals,os->lacing_fill*sizeof(*os->granule_vals)); - os->body_returned+=bytes; - - /* calculate the checksum */ - - ogg_page_checksum_set(og); - - /* done */ - return(1); -} - -/* This will flush remaining packets into a page (returning nonzero), - even if there is not enough data to trigger a flush normally - (undersized page). If there are no packets or partial packets to - flush, ogg_stream_flush returns 0. Note that ogg_stream_flush will - try to flush a normal sized page like ogg_stream_pageout; a call to - ogg_stream_flush does not guarantee that all packets have flushed. - Only a return value of 0 from ogg_stream_flush indicates all packet - data is flushed into pages. - - since ogg_stream_flush will flush the last page in a stream even if - it's undersized, you almost certainly want to use ogg_stream_pageout - (and *not* ogg_stream_flush) unless you specifically need to flush - a page regardless of size in the middle of a stream. */ - -int ogg_stream_flush(ogg_stream_state *os,ogg_page *og){ - return ogg_stream_flush_i(os,og,1,4096); -} - -/* Like the above, but an argument is provided to adjust the nominal - page size for applications which are smart enough to provide their - own delay based flushing */ - -int ogg_stream_flush_fill(ogg_stream_state *os,ogg_page *og, int nfill){ - return ogg_stream_flush_i(os,og,1,nfill); -} - -/* This constructs pages from buffered packet segments. The pointers -returned are to static buffers; do not free. The returned buffers are -good only until the next call (using the same ogg_stream_state) */ - -int ogg_stream_pageout(ogg_stream_state *os, ogg_page *og){ - int force=0; - if(ogg_stream_check(os)) return 0; - - if((os->e_o_s&&os->lacing_fill) || /* 'were done, now flush' case */ - (os->lacing_fill&&!os->b_o_s)) /* 'initial header page' case */ - force=1; - - return(ogg_stream_flush_i(os,og,force,4096)); -} - -/* Like the above, but an argument is provided to adjust the nominal -page size for applications which are smart enough to provide their -own delay based flushing */ - -int ogg_stream_pageout_fill(ogg_stream_state *os, ogg_page *og, int nfill){ - int force=0; - if(ogg_stream_check(os)) return 0; - - if((os->e_o_s&&os->lacing_fill) || /* 'were done, now flush' case */ - (os->lacing_fill&&!os->b_o_s)) /* 'initial header page' case */ - force=1; - - return(ogg_stream_flush_i(os,og,force,nfill)); -} - -int ogg_stream_eos(ogg_stream_state *os){ - if(ogg_stream_check(os)) return 1; - return os->e_o_s; -} - -/* DECODING PRIMITIVES: packet streaming layer **********************/ - -/* This has two layers to place more of the multi-serialno and paging - control in the application's hands. First, we expose a data buffer - using ogg_sync_buffer(). The app either copies into the - buffer, or passes it directly to read(), etc. We then call - ogg_sync_wrote() to tell how many bytes we just added. - - Pages are returned (pointers into the buffer in ogg_sync_state) - by ogg_sync_pageout(). The page is then submitted to - ogg_stream_pagein() along with the appropriate - ogg_stream_state* (ie, matching serialno). We then get raw - packets out calling ogg_stream_packetout() with a - ogg_stream_state. */ - -/* initialize the struct to a known state */ -int ogg_sync_init(ogg_sync_state *oy){ - if(oy){ - oy->storage = -1; /* used as a readiness flag */ - memset(oy,0,sizeof(*oy)); - } - return(0); -} - -/* clear non-flat storage within */ -int ogg_sync_clear(ogg_sync_state *oy){ - if(oy){ - if(oy->data)_ogg_free(oy->data); - memset(oy,0,sizeof(*oy)); - } - return(0); -} - -int ogg_sync_destroy(ogg_sync_state *oy){ - if(oy){ - ogg_sync_clear(oy); - _ogg_free(oy); - } - return(0); -} - -int ogg_sync_check(ogg_sync_state *oy){ - if(oy->storage<0) return -1; - return 0; -} - -char *ogg_sync_buffer(ogg_sync_state *oy, long size){ - if(ogg_sync_check(oy)) return NULL; - - /* first, clear out any space that has been previously returned */ - if(oy->returned){ - oy->fill-=oy->returned; - if(oy->fill>0) - memmove(oy->data,oy->data+oy->returned,oy->fill); - oy->returned=0; - } - - if(size>oy->storage-oy->fill){ - /* We need to extend the internal buffer */ - long newsize=size+oy->fill+4096; /* an extra page to be nice */ - void *ret; - - if(oy->data) - ret=_ogg_realloc(oy->data,newsize); - else - ret=_ogg_malloc(newsize); - if(!ret){ - ogg_sync_clear(oy); - return NULL; - } - oy->data=ret; - oy->storage=newsize; - } - - /* expose a segment at least as large as requested at the fill mark */ - return((char *)oy->data+oy->fill); -} - -int ogg_sync_wrote(ogg_sync_state *oy, long bytes){ - if(ogg_sync_check(oy))return -1; - if(oy->fill+bytes>oy->storage)return -1; - oy->fill+=bytes; - return(0); -} - -/* sync the stream. This is meant to be useful for finding page - boundaries. - - return values for this: - -n) skipped n bytes - 0) page not ready; more data (no bytes skipped) - n) page synced at current location; page length n bytes - -*/ - -long ogg_sync_pageseek(ogg_sync_state *oy,ogg_page *og){ - unsigned char *page=oy->data+oy->returned; - unsigned char *next; - long bytes=oy->fill-oy->returned; - - if(ogg_sync_check(oy))return 0; - - if(oy->headerbytes==0){ - int headerbytes,i; - if(bytes<27)return(0); /* not enough for a header */ - - /* verify capture pattern */ - if(memcmp(page,"OggS",4))goto sync_fail; - - headerbytes=page[26]+27; - if(bytesbodybytes+=page[27+i]; - oy->headerbytes=headerbytes; - } - - if(oy->bodybytes+oy->headerbytes>bytes)return(0); - - /* The whole test page is buffered. Verify the checksum */ - { - /* Grab the checksum bytes, set the header field to zero */ - char chksum[4]; - ogg_page log; - - memcpy(chksum,page+22,4); - memset(page+22,0,4); - - /* set up a temp page struct and recompute the checksum */ - log.header=page; - log.header_len=oy->headerbytes; - log.body=page+oy->headerbytes; - log.body_len=oy->bodybytes; - ogg_page_checksum_set(&log); - - /* Compare */ - if(memcmp(chksum,page+22,4)){ - /* D'oh. Mismatch! Corrupt page (or miscapture and not a page - at all) */ - /* replace the computed checksum with the one actually read in */ - memcpy(page+22,chksum,4); - - /* Bad checksum. Lose sync */ - goto sync_fail; - } - } - - /* yes, have a whole page all ready to go */ - { - unsigned char *page=oy->data+oy->returned; - long bytes; - - if(og){ - og->header=page; - og->header_len=oy->headerbytes; - og->body=page+oy->headerbytes; - og->body_len=oy->bodybytes; - } - - oy->unsynced=0; - oy->returned+=(bytes=oy->headerbytes+oy->bodybytes); - oy->headerbytes=0; - oy->bodybytes=0; - return(bytes); - } - - sync_fail: - - oy->headerbytes=0; - oy->bodybytes=0; - - /* search for possible capture */ - next=memchr(page+1,'O',bytes-1); - if(!next) - next=oy->data+oy->fill; - - oy->returned=(int)(next-oy->data); - return((long)-(next-page)); -} - -/* sync the stream and get a page. Keep trying until we find a page. - Suppress 'sync errors' after reporting the first. - - return values: - -1) recapture (hole in data) - 0) need more data - 1) page returned - - Returns pointers into buffered data; invalidated by next call to - _stream, _clear, _init, or _buffer */ - -int ogg_sync_pageout(ogg_sync_state *oy, ogg_page *og){ - - if(ogg_sync_check(oy))return 0; - - /* all we need to do is verify a page at the head of the stream - buffer. If it doesn't verify, we look for the next potential - frame */ - - for(;;){ - long ret=ogg_sync_pageseek(oy,og); - if(ret>0){ - /* have a page */ - return(1); - } - if(ret==0){ - /* need more data */ - return(0); - } - - /* head did not start a synced page... skipped some bytes */ - if(!oy->unsynced){ - oy->unsynced=1; - return(-1); - } - - /* loop. keep looking */ - - } -} - -/* add the incoming page to the stream state; we decompose the page - into packet segments here as well. */ - -int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og){ - unsigned char *header=og->header; - unsigned char *body=og->body; - long bodysize=og->body_len; - int segptr=0; - - int version=ogg_page_version(og); - int continued=ogg_page_continued(og); - int bos=ogg_page_bos(og); - int eos=ogg_page_eos(og); - ogg_int64_t granulepos=ogg_page_granulepos(og); - int serialno=ogg_page_serialno(og); - long pageno=ogg_page_pageno(og); - int segments=header[26]; - - if(ogg_stream_check(os)) return -1; - - /* clean up 'returned data' */ - { - long lr=os->lacing_returned; - long br=os->body_returned; - - /* body data */ - if(br){ - os->body_fill-=br; - if(os->body_fill) - memmove(os->body_data,os->body_data+br,os->body_fill); - os->body_returned=0; - } - - if(lr){ - /* segment table */ - if(os->lacing_fill-lr){ - memmove(os->lacing_vals,os->lacing_vals+lr, - (os->lacing_fill-lr)*sizeof(*os->lacing_vals)); - memmove(os->granule_vals,os->granule_vals+lr, - (os->lacing_fill-lr)*sizeof(*os->granule_vals)); - } - os->lacing_fill-=lr; - os->lacing_packet-=lr; - os->lacing_returned=0; - } - } - - /* check the serial number */ - if(serialno!=os->serialno)return(-1); - if(version>0)return(-1); - - if(_os_lacing_expand(os,segments+1)) return -1; - - /* are we in sequence? */ - if(pageno!=os->pageno){ - int i; - - /* unroll previous partial packet (if any) */ - for(i=os->lacing_packet;ilacing_fill;i++) - os->body_fill-=os->lacing_vals[i]&0xff; - os->lacing_fill=os->lacing_packet; - - /* make a note of dropped data in segment table */ - if(os->pageno!=-1){ - os->lacing_vals[os->lacing_fill++]=0x400; - os->lacing_packet++; - } - } - - /* are we a 'continued packet' page? If so, we may need to skip - some segments */ - if(continued){ - if(os->lacing_fill<1 || - os->lacing_vals[os->lacing_fill-1]==0x400){ - bos=0; - for(;segptrbody_data+os->body_fill,body,bodysize); - os->body_fill+=bodysize; - } - - { - int saved=-1; - while(segptrlacing_vals[os->lacing_fill]=val; - os->granule_vals[os->lacing_fill]=-1; - - if(bos){ - os->lacing_vals[os->lacing_fill]|=0x100; - bos=0; - } - - if(val<255)saved=os->lacing_fill; - - os->lacing_fill++; - segptr++; - - if(val<255)os->lacing_packet=os->lacing_fill; - } - - /* set the granulepos on the last granuleval of the last full packet */ - if(saved!=-1){ - os->granule_vals[saved]=granulepos; - } - - } - - if(eos){ - os->e_o_s=1; - if(os->lacing_fill>0) - os->lacing_vals[os->lacing_fill-1]|=0x200; - } - - os->pageno=pageno+1; - - return(0); -} - -/* clear things to an initial state. Good to call, eg, before seeking */ -int ogg_sync_reset(ogg_sync_state *oy){ - if(ogg_sync_check(oy))return -1; - - oy->fill=0; - oy->returned=0; - oy->unsynced=0; - oy->headerbytes=0; - oy->bodybytes=0; - return(0); -} - -int ogg_stream_reset(ogg_stream_state *os){ - if(ogg_stream_check(os)) return -1; - - os->body_fill=0; - os->body_returned=0; - - os->lacing_fill=0; - os->lacing_packet=0; - os->lacing_returned=0; - - os->header_fill=0; - - os->e_o_s=0; - os->b_o_s=0; - os->pageno=-1; - os->packetno=0; - os->granulepos=0; - - return(0); -} - -int ogg_stream_reset_serialno(ogg_stream_state *os,int serialno){ - if(ogg_stream_check(os)) return -1; - ogg_stream_reset(os); - os->serialno=serialno; - return(0); -} - -static int _packetout(ogg_stream_state *os,ogg_packet *op,int adv){ - - /* The last part of decode. We have the stream broken into packet - segments. Now we need to group them into packets (or return the - out of sync markers) */ - - int ptr=os->lacing_returned; - - if(os->lacing_packet<=ptr)return(0); - - if(os->lacing_vals[ptr]&0x400){ - /* we need to tell the codec there's a gap; it might need to - handle previous packet dependencies. */ - os->lacing_returned++; - os->packetno++; - return(-1); - } - - if(!op && !adv)return(1); /* just using peek as an inexpensive way - to ask if there's a whole packet - waiting */ - - /* Gather the whole packet. We'll have no holes or a partial packet */ - { - int size=os->lacing_vals[ptr]&0xff; - long bytes=size; - int eos=os->lacing_vals[ptr]&0x200; /* last packet of the stream? */ - int bos=os->lacing_vals[ptr]&0x100; /* first packet of the stream? */ - - while(size==255){ - int val=os->lacing_vals[++ptr]; - size=val&0xff; - if(val&0x200)eos=0x200; - bytes+=size; - } - - if(op){ - op->e_o_s=eos; - op->b_o_s=bos; - op->packet=os->body_data+os->body_returned; - op->packetno=os->packetno; - op->granulepos=os->granule_vals[ptr]; - op->bytes=bytes; - } - - if(adv){ - os->body_returned+=bytes; - os->lacing_returned=ptr+1; - os->packetno++; - } - } - return(1); -} - -int ogg_stream_packetout(ogg_stream_state *os,ogg_packet *op){ - if(ogg_stream_check(os)) return 0; - return _packetout(os,op,1); -} - -int ogg_stream_packetpeek(ogg_stream_state *os,ogg_packet *op){ - if(ogg_stream_check(os)) return 0; - return _packetout(os,op,0); -} - -void ogg_packet_clear(ogg_packet *op) { - _ogg_free(op->packet); - memset(op, 0, sizeof(*op)); -} - -#ifdef _V_SELFTEST -#include - -ogg_stream_state os_en, os_de; -ogg_sync_state oy; - -void checkpacket(ogg_packet *op,long len, int no, long pos){ - long j; - static int sequence=0; - static int lastno=0; - - if(op->bytes!=len){ - fprintf(stderr,"incorrect packet length (%ld != %ld)!\n",op->bytes,len); - exit(1); - } - if(op->granulepos!=pos){ - fprintf(stderr,"incorrect packet granpos (%ld != %ld)!\n",(long)op->granulepos,pos); - exit(1); - } - - /* packet number just follows sequence/gap; adjust the input number - for that */ - if(no==0){ - sequence=0; - }else{ - sequence++; - if(no>lastno+1) - sequence++; - } - lastno=no; - if(op->packetno!=sequence){ - fprintf(stderr,"incorrect packet sequence %ld != %d\n", - (long)(op->packetno),sequence); - exit(1); - } - - /* Test data */ - for(j=0;jbytes;j++) - if(op->packet[j]!=((j+no)&0xff)){ - fprintf(stderr,"body data mismatch (1) at pos %ld: %x!=%lx!\n\n", - j,op->packet[j],(j+no)&0xff); - exit(1); - } -} - -void check_page(unsigned char *data,const int *header,ogg_page *og){ - long j; - /* Test data */ - for(j=0;jbody_len;j++) - if(og->body[j]!=data[j]){ - fprintf(stderr,"body data mismatch (2) at pos %ld: %x!=%x!\n\n", - j,data[j],og->body[j]); - exit(1); - } - - /* Test header */ - for(j=0;jheader_len;j++){ - if(og->header[j]!=header[j]){ - fprintf(stderr,"header content mismatch at pos %ld:\n",j); - for(j=0;jheader[j]); - fprintf(stderr,"\n"); - exit(1); - } - } - if(og->header_len!=header[26]+27){ - fprintf(stderr,"header length incorrect! (%ld!=%d)\n", - og->header_len,header[26]+27); - exit(1); - } -} - -void print_header(ogg_page *og){ - int j; - fprintf(stderr,"\nHEADER:\n"); - fprintf(stderr," capture: %c %c %c %c version: %d flags: %x\n", - og->header[0],og->header[1],og->header[2],og->header[3], - (int)og->header[4],(int)og->header[5]); - - fprintf(stderr," granulepos: %d serialno: %d pageno: %ld\n", - (og->header[9]<<24)|(og->header[8]<<16)| - (og->header[7]<<8)|og->header[6], - (og->header[17]<<24)|(og->header[16]<<16)| - (og->header[15]<<8)|og->header[14], - ((long)(og->header[21])<<24)|(og->header[20]<<16)| - (og->header[19]<<8)|og->header[18]); - - fprintf(stderr," checksum: %02x:%02x:%02x:%02x\n segments: %d (", - (int)og->header[22],(int)og->header[23], - (int)og->header[24],(int)og->header[25], - (int)og->header[26]); - - for(j=27;jheader_len;j++) - fprintf(stderr,"%d ",(int)og->header[j]); - fprintf(stderr,")\n\n"); -} - -void copy_page(ogg_page *og){ - unsigned char *temp=_ogg_malloc(og->header_len); - memcpy(temp,og->header,og->header_len); - og->header=temp; - - temp=_ogg_malloc(og->body_len); - memcpy(temp,og->body,og->body_len); - og->body=temp; -} - -void free_page(ogg_page *og){ - _ogg_free (og->header); - _ogg_free (og->body); -} - -void error(void){ - fprintf(stderr,"error!\n"); - exit(1); -} - -/* 17 only */ -const int head1_0[] = {0x4f,0x67,0x67,0x53,0,0x06, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,0,0,0,0, - 0x15,0xed,0xec,0x91, - 1, - 17}; - -/* 17, 254, 255, 256, 500, 510, 600 byte, pad */ -const int head1_1[] = {0x4f,0x67,0x67,0x53,0,0x02, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,0,0,0,0, - 0x59,0x10,0x6c,0x2c, - 1, - 17}; -const int head2_1[] = {0x4f,0x67,0x67,0x53,0,0x04, - 0x07,0x18,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,1,0,0,0, - 0x89,0x33,0x85,0xce, - 13, - 254,255,0,255,1,255,245,255,255,0, - 255,255,90}; - -/* nil packets; beginning,middle,end */ -const int head1_2[] = {0x4f,0x67,0x67,0x53,0,0x02, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,0,0,0,0, - 0xff,0x7b,0x23,0x17, - 1, - 0}; -const int head2_2[] = {0x4f,0x67,0x67,0x53,0,0x04, - 0x07,0x28,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,1,0,0,0, - 0x5c,0x3f,0x66,0xcb, - 17, - 17,254,255,0,0,255,1,0,255,245,255,255,0, - 255,255,90,0}; - -/* large initial packet */ -const int head1_3[] = {0x4f,0x67,0x67,0x53,0,0x02, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,0,0,0,0, - 0x01,0x27,0x31,0xaa, - 18, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,10}; - -const int head2_3[] = {0x4f,0x67,0x67,0x53,0,0x04, - 0x07,0x08,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,1,0,0,0, - 0x7f,0x4e,0x8a,0xd2, - 4, - 255,4,255,0}; - - -/* continuing packet test */ -const int head1_4[] = {0x4f,0x67,0x67,0x53,0,0x02, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,0,0,0,0, - 0xff,0x7b,0x23,0x17, - 1, - 0}; - -const int head2_4[] = {0x4f,0x67,0x67,0x53,0,0x00, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0x01,0x02,0x03,0x04,1,0,0,0, - 0xf8,0x3c,0x19,0x79, - 255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255}; - -const int head3_4[] = {0x4f,0x67,0x67,0x53,0,0x05, - 0x07,0x0c,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,2,0,0,0, - 0x38,0xe6,0xb6,0x28, - 6, - 255,220,255,4,255,0}; - - -/* spill expansion test */ -const int head1_4b[] = {0x4f,0x67,0x67,0x53,0,0x02, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,0,0,0,0, - 0xff,0x7b,0x23,0x17, - 1, - 0}; - -const int head2_4b[] = {0x4f,0x67,0x67,0x53,0,0x00, - 0x07,0x10,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,1,0,0,0, - 0xce,0x8f,0x17,0x1a, - 23, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,10,255,4,255,0,0}; - - -const int head3_4b[] = {0x4f,0x67,0x67,0x53,0,0x04, - 0x07,0x14,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,2,0,0,0, - 0x9b,0xb2,0x50,0xa1, - 1, - 0}; - -/* page with the 255 segment limit */ -const int head1_5[] = {0x4f,0x67,0x67,0x53,0,0x02, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,0,0,0,0, - 0xff,0x7b,0x23,0x17, - 1, - 0}; - -const int head2_5[] = {0x4f,0x67,0x67,0x53,0,0x00, - 0x07,0xfc,0x03,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,1,0,0,0, - 0xed,0x2a,0x2e,0xa7, - 255, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10}; - -const int head3_5[] = {0x4f,0x67,0x67,0x53,0,0x04, - 0x07,0x00,0x04,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,2,0,0,0, - 0x6c,0x3b,0x82,0x3d, - 1, - 50}; - - -/* packet that overspans over an entire page */ -const int head1_6[] = {0x4f,0x67,0x67,0x53,0,0x02, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,0,0,0,0, - 0xff,0x7b,0x23,0x17, - 1, - 0}; - -const int head2_6[] = {0x4f,0x67,0x67,0x53,0,0x00, - 0x07,0x04,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,1,0,0,0, - 0x68,0x22,0x7c,0x3d, - 255, - 100, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255}; - -const int head3_6[] = {0x4f,0x67,0x67,0x53,0,0x01, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0x01,0x02,0x03,0x04,2,0,0,0, - 0xf4,0x87,0xba,0xf3, - 255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255}; - -const int head4_6[] = {0x4f,0x67,0x67,0x53,0,0x05, - 0x07,0x10,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,3,0,0,0, - 0xf7,0x2f,0x6c,0x60, - 5, - 254,255,4,255,0}; - -/* packet that overspans over an entire page */ -const int head1_7[] = {0x4f,0x67,0x67,0x53,0,0x02, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,0,0,0,0, - 0xff,0x7b,0x23,0x17, - 1, - 0}; - -const int head2_7[] = {0x4f,0x67,0x67,0x53,0,0x00, - 0x07,0x04,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,1,0,0,0, - 0x68,0x22,0x7c,0x3d, - 255, - 100, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255}; - -const int head3_7[] = {0x4f,0x67,0x67,0x53,0,0x05, - 0x07,0x08,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,2,0,0,0, - 0xd4,0xe0,0x60,0xe5, - 1, - 0}; - -void test_pack(const int *pl, const int **headers, int byteskip, - int pageskip, int packetskip){ - unsigned char *data=_ogg_malloc(1024*1024); /* for scripted test cases only */ - long inptr=0; - long outptr=0; - long deptr=0; - long depacket=0; - long granule_pos=7,pageno=0; - int i,j,packets,pageout=pageskip; - int eosflag=0; - int bosflag=0; - - int byteskipcount=0; - - ogg_stream_reset(&os_en); - ogg_stream_reset(&os_de); - ogg_sync_reset(&oy); - - for(packets=0;packetsbyteskip){ - memcpy(next,og.header,byteskipcount-byteskip); - next+=byteskipcount-byteskip; - byteskipcount=byteskip; - } - - byteskipcount+=og.body_len; - if(byteskipcount>byteskip){ - memcpy(next,og.body,byteskipcount-byteskip); - next+=byteskipcount-byteskip; - byteskipcount=byteskip; - } - - ogg_sync_wrote(&oy,next-buf); - - while(1){ - int ret=ogg_sync_pageout(&oy,&og_de); - if(ret==0)break; - if(ret<0)continue; - /* got a page. Happy happy. Verify that it's good. */ - - fprintf(stderr,"(%d), ",pageout); - - check_page(data+deptr,headers[pageout],&og_de); - deptr+=og_de.body_len; - pageout++; - - /* submit it to deconstitution */ - ogg_stream_pagein(&os_de,&og_de); - - /* packets out? */ - while(ogg_stream_packetpeek(&os_de,&op_de2)>0){ - ogg_stream_packetpeek(&os_de,NULL); - ogg_stream_packetout(&os_de,&op_de); /* just catching them all */ - - /* verify peek and out match */ - if(memcmp(&op_de,&op_de2,sizeof(op_de))){ - fprintf(stderr,"packetout != packetpeek! pos=%ld\n", - depacket); - exit(1); - } - - /* verify the packet! */ - /* check data */ - if(memcmp(data+depacket,op_de.packet,op_de.bytes)){ - fprintf(stderr,"packet data mismatch in decode! pos=%ld\n", - depacket); - exit(1); - } - /* check bos flag */ - if(bosflag==0 && op_de.b_o_s==0){ - fprintf(stderr,"b_o_s flag not set on packet!\n"); - exit(1); - } - if(bosflag && op_de.b_o_s){ - fprintf(stderr,"b_o_s flag incorrectly set on packet!\n"); - exit(1); - } - bosflag=1; - depacket+=op_de.bytes; - - /* check eos flag */ - if(eosflag){ - fprintf(stderr,"Multiple decoded packets with eos flag!\n"); - exit(1); - } - - if(op_de.e_o_s)eosflag=1; - - /* check granulepos flag */ - if(op_de.granulepos!=-1){ - fprintf(stderr," granule:%ld ",(long)op_de.granulepos); - } - } - } - } - } - } - } - _ogg_free(data); - if(headers[pageno]!=NULL){ - fprintf(stderr,"did not write last page!\n"); - exit(1); - } - if(headers[pageout]!=NULL){ - fprintf(stderr,"did not decode last page!\n"); - exit(1); - } - if(inptr!=outptr){ - fprintf(stderr,"encoded page data incomplete!\n"); - exit(1); - } - if(inptr!=deptr){ - fprintf(stderr,"decoded page data incomplete!\n"); - exit(1); - } - if(inptr!=depacket){ - fprintf(stderr,"decoded packet data incomplete!\n"); - exit(1); - } - if(!eosflag){ - fprintf(stderr,"Never got a packet with EOS set!\n"); - exit(1); - } - fprintf(stderr,"ok.\n"); -} - -int main(void){ - - ogg_stream_init(&os_en,0x04030201); - ogg_stream_init(&os_de,0x04030201); - ogg_sync_init(&oy); - - /* Exercise each code path in the framing code. Also verify that - the checksums are working. */ - - { - /* 17 only */ - const int packets[]={17, -1}; - const int *headret[]={head1_0,NULL}; - - fprintf(stderr,"testing single page encoding... "); - test_pack(packets,headret,0,0,0); - } - - { - /* 17, 254, 255, 256, 500, 510, 600 byte, pad */ - const int packets[]={17, 254, 255, 256, 500, 510, 600, -1}; - const int *headret[]={head1_1,head2_1,NULL}; - - fprintf(stderr,"testing basic page encoding... "); - test_pack(packets,headret,0,0,0); - } - - { - /* nil packets; beginning,middle,end */ - const int packets[]={0,17, 254, 255, 0, 256, 0, 500, 510, 600, 0, -1}; - const int *headret[]={head1_2,head2_2,NULL}; - - fprintf(stderr,"testing basic nil packets... "); - test_pack(packets,headret,0,0,0); - } - - { - /* large initial packet */ - const int packets[]={4345,259,255,-1}; - const int *headret[]={head1_3,head2_3,NULL}; - - fprintf(stderr,"testing initial-packet lacing > 4k... "); - test_pack(packets,headret,0,0,0); - } - - { - /* continuing packet test; with page spill expansion, we have to - overflow the lacing table. */ - const int packets[]={0,65500,259,255,-1}; - const int *headret[]={head1_4,head2_4,head3_4,NULL}; - - fprintf(stderr,"testing single packet page span... "); - test_pack(packets,headret,0,0,0); - } - - { - /* spill expand packet test */ - const int packets[]={0,4345,259,255,0,0,-1}; - const int *headret[]={head1_4b,head2_4b,head3_4b,NULL}; - - fprintf(stderr,"testing page spill expansion... "); - test_pack(packets,headret,0,0,0); - } - - /* page with the 255 segment limit */ - { - - const int packets[]={0,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,50,-1}; - const int *headret[]={head1_5,head2_5,head3_5,NULL}; - - fprintf(stderr,"testing max packet segments... "); - test_pack(packets,headret,0,0,0); - } - - { - /* packet that overspans over an entire page */ - const int packets[]={0,100,130049,259,255,-1}; - const int *headret[]={head1_6,head2_6,head3_6,head4_6,NULL}; - - fprintf(stderr,"testing very large packets... "); - test_pack(packets,headret,0,0,0); - } - - { - /* test for the libogg 1.1.1 resync in large continuation bug - found by Josh Coalson) */ - const int packets[]={0,100,130049,259,255,-1}; - const int *headret[]={head1_6,head2_6,head3_6,head4_6,NULL}; - - fprintf(stderr,"testing continuation resync in very large packets... "); - test_pack(packets,headret,100,2,3); - } - - { - /* term only page. why not? */ - const int packets[]={0,100,64770,-1}; - const int *headret[]={head1_7,head2_7,head3_7,NULL}; - - fprintf(stderr,"testing zero data page (1 nil packet)... "); - test_pack(packets,headret,0,0,0); - } - - - - { - /* build a bunch of pages for testing */ - unsigned char *data=_ogg_malloc(1024*1024); - int pl[]={0, 1,1,98,4079, 1,1,2954,2057, 76,34,912,0,234,1000,1000, 1000,300,-1}; - int inptr=0,i,j; - ogg_page og[5]; - - ogg_stream_reset(&os_en); - - for(i=0;pl[i]!=-1;i++){ - ogg_packet op; - int len=pl[i]; - - op.packet=data+inptr; - op.bytes=len; - op.e_o_s=(pl[i+1]<0?1:0); - op.granulepos=(i+1)*1000; - - for(j=0;j0)error(); - - /* Test fractional page inputs: incomplete fixed header */ - memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header+3, - 20); - ogg_sync_wrote(&oy,20); - if(ogg_sync_pageout(&oy,&og_de)>0)error(); - - /* Test fractional page inputs: incomplete header */ - memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header+23, - 5); - ogg_sync_wrote(&oy,5); - if(ogg_sync_pageout(&oy,&og_de)>0)error(); - - /* Test fractional page inputs: incomplete body */ - - memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header+28, - og[1].header_len-28); - ogg_sync_wrote(&oy,og[1].header_len-28); - if(ogg_sync_pageout(&oy,&og_de)>0)error(); - - memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body,1000); - ogg_sync_wrote(&oy,1000); - if(ogg_sync_pageout(&oy,&og_de)>0)error(); - - memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body+1000, - og[1].body_len-1000); - ogg_sync_wrote(&oy,og[1].body_len-1000); - if(ogg_sync_pageout(&oy,&og_de)<=0)error(); - - fprintf(stderr,"ok.\n"); - } - - /* Test fractional page inputs: page + incomplete capture */ - { - ogg_page og_de; - fprintf(stderr,"Testing sync on 1+partial inputs... "); - ogg_sync_reset(&oy); - - memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header, - og[1].header_len); - ogg_sync_wrote(&oy,og[1].header_len); - - memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, - og[1].body_len); - ogg_sync_wrote(&oy,og[1].body_len); - - memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header, - 20); - ogg_sync_wrote(&oy,20); - if(ogg_sync_pageout(&oy,&og_de)<=0)error(); - if(ogg_sync_pageout(&oy,&og_de)>0)error(); - - memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header+20, - og[1].header_len-20); - ogg_sync_wrote(&oy,og[1].header_len-20); - memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, - og[1].body_len); - ogg_sync_wrote(&oy,og[1].body_len); - if(ogg_sync_pageout(&oy,&og_de)<=0)error(); - - fprintf(stderr,"ok.\n"); - } - - /* Test recapture: garbage + page */ - { - ogg_page og_de; - fprintf(stderr,"Testing search for capture... "); - ogg_sync_reset(&oy); - - /* 'garbage' */ - memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, - og[1].body_len); - ogg_sync_wrote(&oy,og[1].body_len); - - memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header, - og[1].header_len); - ogg_sync_wrote(&oy,og[1].header_len); - - memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, - og[1].body_len); - ogg_sync_wrote(&oy,og[1].body_len); - - memcpy(ogg_sync_buffer(&oy,og[2].header_len),og[2].header, - 20); - ogg_sync_wrote(&oy,20); - if(ogg_sync_pageout(&oy,&og_de)>0)error(); - if(ogg_sync_pageout(&oy,&og_de)<=0)error(); - if(ogg_sync_pageout(&oy,&og_de)>0)error(); - - memcpy(ogg_sync_buffer(&oy,og[2].header_len),og[2].header+20, - og[2].header_len-20); - ogg_sync_wrote(&oy,og[2].header_len-20); - memcpy(ogg_sync_buffer(&oy,og[2].body_len),og[2].body, - og[2].body_len); - ogg_sync_wrote(&oy,og[2].body_len); - if(ogg_sync_pageout(&oy,&og_de)<=0)error(); - - fprintf(stderr,"ok.\n"); - } - - /* Test recapture: page + garbage + page */ - { - ogg_page og_de; - fprintf(stderr,"Testing recapture... "); - ogg_sync_reset(&oy); - - memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header, - og[1].header_len); - ogg_sync_wrote(&oy,og[1].header_len); - - memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, - og[1].body_len); - ogg_sync_wrote(&oy,og[1].body_len); - - memcpy(ogg_sync_buffer(&oy,og[2].header_len),og[2].header, - og[2].header_len); - ogg_sync_wrote(&oy,og[2].header_len); - - memcpy(ogg_sync_buffer(&oy,og[2].header_len),og[2].header, - og[2].header_len); - ogg_sync_wrote(&oy,og[2].header_len); - - if(ogg_sync_pageout(&oy,&og_de)<=0)error(); - - memcpy(ogg_sync_buffer(&oy,og[2].body_len),og[2].body, - og[2].body_len-5); - ogg_sync_wrote(&oy,og[2].body_len-5); - - memcpy(ogg_sync_buffer(&oy,og[3].header_len),og[3].header, - og[3].header_len); - ogg_sync_wrote(&oy,og[3].header_len); - - memcpy(ogg_sync_buffer(&oy,og[3].body_len),og[3].body, - og[3].body_len); - ogg_sync_wrote(&oy,og[3].body_len); - - if(ogg_sync_pageout(&oy,&og_de)>0)error(); - if(ogg_sync_pageout(&oy,&og_de)<=0)error(); - - fprintf(stderr,"ok.\n"); - } - - /* Free page data that was previously copied */ - { - for(i=0;i<5;i++){ - free_page(&og[i]); - } - } - } - - return(0); -} - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/include/vorbis/codec.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/include/vorbis/codec.h deleted file mode 100644 index 999aa335..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/include/vorbis/codec.h +++ /dev/null @@ -1,243 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - - ******************************************************************** - - function: libvorbis codec headers - last mod: $Id: codec.h 17021 2010-03-24 09:29:41Z xiphmont $ - - ********************************************************************/ - -#ifndef _vorbis_codec_h_ -#define _vorbis_codec_h_ - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -#include - -typedef struct vorbis_info{ - int version; - int channels; - long rate; - - /* The below bitrate declarations are *hints*. - Combinations of the three values carry the following implications: - - all three set to the same value: - implies a fixed rate bitstream - only nominal set: - implies a VBR stream that averages the nominal bitrate. No hard - upper/lower limit - upper and or lower set: - implies a VBR bitstream that obeys the bitrate limits. nominal - may also be set to give a nominal rate. - none set: - the coder does not care to speculate. - */ - - long bitrate_upper; - long bitrate_nominal; - long bitrate_lower; - long bitrate_window; - - void *codec_setup; -} vorbis_info; - -/* vorbis_dsp_state buffers the current vorbis audio - analysis/synthesis state. The DSP state belongs to a specific - logical bitstream ****************************************************/ -typedef struct vorbis_dsp_state{ - int analysisp; - vorbis_info *vi; - - float **pcm; - float **pcmret; - int pcm_storage; - int pcm_current; - int pcm_returned; - - int preextrapolate; - int eofflag; - - long lW; - long W; - long nW; - long centerW; - - ogg_int64_t granulepos; - ogg_int64_t sequence; - - ogg_int64_t glue_bits; - ogg_int64_t time_bits; - ogg_int64_t floor_bits; - ogg_int64_t res_bits; - - void *backend_state; -} vorbis_dsp_state; - -typedef struct vorbis_block{ - /* necessary stream state for linking to the framing abstraction */ - float **pcm; /* this is a pointer into local storage */ - oggpack_buffer opb; - - long lW; - long W; - long nW; - int pcmend; - int mode; - - int eofflag; - ogg_int64_t granulepos; - ogg_int64_t sequence; - vorbis_dsp_state *vd; /* For read-only access of configuration */ - - /* local storage to avoid remallocing; it's up to the mapping to - structure it */ - void *localstore; - long localtop; - long localalloc; - long totaluse; - struct alloc_chain *reap; - - /* bitmetrics for the frame */ - long glue_bits; - long time_bits; - long floor_bits; - long res_bits; - - void *internal; - -} vorbis_block; - -/* vorbis_block is a single block of data to be processed as part of -the analysis/synthesis stream; it belongs to a specific logical -bitstream, but is independent from other vorbis_blocks belonging to -that logical bitstream. *************************************************/ - -struct alloc_chain{ - void *ptr; - struct alloc_chain *next; -}; - -/* vorbis_info contains all the setup information specific to the - specific compression/decompression mode in progress (eg, - psychoacoustic settings, channel setup, options, codebook - etc). vorbis_info and substructures are in backends.h. -*********************************************************************/ - -/* the comments are not part of vorbis_info so that vorbis_info can be - static storage */ -typedef struct vorbis_comment{ - /* unlimited user comment fields. libvorbis writes 'libvorbis' - whatever vendor is set to in encode */ - char **user_comments; - int *comment_lengths; - int comments; - char *vendor; - -} vorbis_comment; - - -/* libvorbis encodes in two abstraction layers; first we perform DSP - and produce a packet (see docs/analysis.txt). The packet is then - coded into a framed OggSquish bitstream by the second layer (see - docs/framing.txt). Decode is the reverse process; we sync/frame - the bitstream and extract individual packets, then decode the - packet back into PCM audio. - - The extra framing/packetizing is used in streaming formats, such as - files. Over the net (such as with UDP), the framing and - packetization aren't necessary as they're provided by the transport - and the streaming layer is not used */ - -/* Vorbis PRIMITIVES: general ***************************************/ - -extern void vorbis_info_init(vorbis_info *vi); -extern void vorbis_info_clear(vorbis_info *vi); -extern int vorbis_info_blocksize(vorbis_info *vi,int zo); -extern void vorbis_comment_init(vorbis_comment *vc); -extern void vorbis_comment_add(vorbis_comment *vc, const char *comment); -extern void vorbis_comment_add_tag(vorbis_comment *vc, - const char *tag, const char *contents); -extern char *vorbis_comment_query(vorbis_comment *vc, const char *tag, int count); -extern int vorbis_comment_query_count(vorbis_comment *vc, const char *tag); -extern void vorbis_comment_clear(vorbis_comment *vc); - -extern int vorbis_block_init(vorbis_dsp_state *v, vorbis_block *vb); -extern int vorbis_block_clear(vorbis_block *vb); -extern void vorbis_dsp_clear(vorbis_dsp_state *v); -extern double vorbis_granule_time(vorbis_dsp_state *v, - ogg_int64_t granulepos); - -extern const char *vorbis_version_string(void); - -/* Vorbis PRIMITIVES: analysis/DSP layer ****************************/ - -extern int vorbis_analysis_init(vorbis_dsp_state *v,vorbis_info *vi); -extern int vorbis_commentheader_out(vorbis_comment *vc, ogg_packet *op); -extern int vorbis_analysis_headerout(vorbis_dsp_state *v, - vorbis_comment *vc, - ogg_packet *op, - ogg_packet *op_comm, - ogg_packet *op_code); -extern float **vorbis_analysis_buffer(vorbis_dsp_state *v,int vals); -extern int vorbis_analysis_wrote(vorbis_dsp_state *v,int vals); -extern int vorbis_analysis_blockout(vorbis_dsp_state *v,vorbis_block *vb); -extern int vorbis_analysis(vorbis_block *vb,ogg_packet *op); - -extern int vorbis_bitrate_addblock(vorbis_block *vb); -extern int vorbis_bitrate_flushpacket(vorbis_dsp_state *vd, - ogg_packet *op); - -/* Vorbis PRIMITIVES: synthesis layer *******************************/ -extern int vorbis_synthesis_idheader(ogg_packet *op); -extern int vorbis_synthesis_headerin(vorbis_info *vi,vorbis_comment *vc, - ogg_packet *op); - -extern int vorbis_synthesis_init(vorbis_dsp_state *v,vorbis_info *vi); -extern int vorbis_synthesis_restart(vorbis_dsp_state *v); -extern int vorbis_synthesis(vorbis_block *vb,ogg_packet *op); -extern int vorbis_synthesis_trackonly(vorbis_block *vb,ogg_packet *op); -extern int vorbis_synthesis_blockin(vorbis_dsp_state *v,vorbis_block *vb); -extern int vorbis_synthesis_pcmout(vorbis_dsp_state *v,float ***pcm); -extern int vorbis_synthesis_lapout(vorbis_dsp_state *v,float ***pcm); -extern int vorbis_synthesis_read(vorbis_dsp_state *v,int samples); -extern long vorbis_packet_blocksize(vorbis_info *vi,ogg_packet *op); - -extern int vorbis_synthesis_halfrate(vorbis_info *v,int flag); -extern int vorbis_synthesis_halfrate_p(vorbis_info *v); - -/* Vorbis ERRORS and return codes ***********************************/ - -#define OV_FALSE -1 -#define OV_EOF -2 -#define OV_HOLE -3 - -#define OV_EREAD -128 -#define OV_EFAULT -129 -#define OV_EIMPL -130 -#define OV_EINVAL -131 -#define OV_ENOTVORBIS -132 -#define OV_EBADHEADER -133 -#define OV_EVERSION -134 -#define OV_ENOTAUDIO -135 -#define OV_EBADPACKET -136 -#define OV_EBADLINK -137 -#define OV_ENOSEEK -138 - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif - diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/include/vorbis/vorbisenc.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/include/vorbis/vorbisenc.h deleted file mode 100644 index 02332b50..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/include/vorbis/vorbisenc.h +++ /dev/null @@ -1,436 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: vorbis encode-engine setup - last mod: $Id: vorbisenc.h 17021 2010-03-24 09:29:41Z xiphmont $ - - ********************************************************************/ - -/** \file - * Libvorbisenc is a convenient API for setting up an encoding - * environment using libvorbis. Libvorbisenc encapsulates the - * actions needed to set up the encoder properly. - */ - -#ifndef _OV_ENC_H_ -#define _OV_ENC_H_ - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -#include "codec.h" - -/** - * This is the primary function within libvorbisenc for setting up managed - * bitrate modes. - * - * Before this function is called, the \ref vorbis_info - * struct should be initialized by using vorbis_info_init() from the libvorbis - * API. After encoding, vorbis_info_clear() should be called. - * - * The max_bitrate, nominal_bitrate, and min_bitrate settings are used to set - * constraints for the encoded file. This function uses these settings to - * select the appropriate encoding mode and set it up. - * - * \param vi Pointer to an initialized \ref vorbis_info struct. - * \param channels The number of channels to be encoded. - * \param rate The sampling rate of the source audio. - * \param max_bitrate Desired maximum bitrate (limit). -1 indicates unset. - * \param nominal_bitrate Desired average, or central, bitrate. -1 indicates unset. - * \param min_bitrate Desired minimum bitrate. -1 indicates unset. - * - * \return Zero for success, and negative values for failure. - * - * \retval 0 Success. - * \retval OV_EFAULT Internal logic fault; indicates a bug or heap/stack corruption. - * \retval OV_EINVAL Invalid setup request, eg, out of range argument. - * \retval OV_EIMPL Unimplemented mode; unable to comply with bitrate request. - */ -extern int vorbis_encode_init(vorbis_info *vi, - long channels, - long rate, - - long max_bitrate, - long nominal_bitrate, - long min_bitrate); - -/** - * This function performs step-one of a three-step bitrate-managed encode - * setup. It functions similarly to the one-step setup performed by \ref - * vorbis_encode_init but allows an application to make further encode setup - * tweaks using \ref vorbis_encode_ctl before finally calling \ref - * vorbis_encode_setup_init to complete the setup process. - * - * Before this function is called, the \ref vorbis_info struct should be - * initialized by using vorbis_info_init() from the libvorbis API. After - * encoding, vorbis_info_clear() should be called. - * - * The max_bitrate, nominal_bitrate, and min_bitrate settings are used to set - * constraints for the encoded file. This function uses these settings to - * select the appropriate encoding mode and set it up. - * - * \param vi Pointer to an initialized vorbis_info struct. - * \param channels The number of channels to be encoded. - * \param rate The sampling rate of the source audio. - * \param max_bitrate Desired maximum bitrate (limit). -1 indicates unset. - * \param nominal_bitrate Desired average, or central, bitrate. -1 indicates unset. - * \param min_bitrate Desired minimum bitrate. -1 indicates unset. - * - * \return Zero for success, and negative for failure. - * - * \retval 0 Success - * \retval OV_EFAULT Internal logic fault; indicates a bug or heap/stack corruption. - * \retval OV_EINVAL Invalid setup request, eg, out of range argument. - * \retval OV_EIMPL Unimplemented mode; unable to comply with bitrate request. - */ -extern int vorbis_encode_setup_managed(vorbis_info *vi, - long channels, - long rate, - - long max_bitrate, - long nominal_bitrate, - long min_bitrate); - -/** - * This function performs step-one of a three-step variable bitrate - * (quality-based) encode setup. It functions similarly to the one-step setup - * performed by \ref vorbis_encode_init_vbr() but allows an application to - * make further encode setup tweaks using \ref vorbis_encode_ctl() before - * finally calling \ref vorbis_encode_setup_init to complete the setup - * process. - * - * Before this function is called, the \ref vorbis_info struct should be - * initialized by using \ref vorbis_info_init() from the libvorbis API. After - * encoding, vorbis_info_clear() should be called. - * - * \param vi Pointer to an initialized vorbis_info struct. - * \param channels The number of channels to be encoded. - * \param rate The sampling rate of the source audio. - * \param quality Desired quality level, currently from -0.1 to 1.0 (lo to hi). - * - * \return Zero for success, and negative values for failure. - * - * \retval 0 Success - * \retval OV_EFAULT Internal logic fault; indicates a bug or heap/stack corruption. - * \retval OV_EINVAL Invalid setup request, eg, out of range argument. - * \retval OV_EIMPL Unimplemented mode; unable to comply with quality level request. - */ -extern int vorbis_encode_setup_vbr(vorbis_info *vi, - long channels, - long rate, - - float quality - ); - -/** - * This is the primary function within libvorbisenc for setting up variable - * bitrate ("quality" based) modes. - * - * - * Before this function is called, the vorbis_info struct should be - * initialized by using vorbis_info_init() from the libvorbis API. After - * encoding, vorbis_info_clear() should be called. - * - * \param vi Pointer to an initialized vorbis_info struct. - * \param channels The number of channels to be encoded. - * \param rate The sampling rate of the source audio. - * \param base_quality Desired quality level, currently from -0.1 to 1.0 (lo to hi). - * - * - * \return Zero for success, or a negative number for failure. - * - * \retval 0 Success - * \retval OV_EFAULT Internal logic fault; indicates a bug or heap/stack corruption. - * \retval OV_EINVAL Invalid setup request, eg, out of range argument. - * \retval OV_EIMPL Unimplemented mode; unable to comply with quality level request. - */ -extern int vorbis_encode_init_vbr(vorbis_info *vi, - long channels, - long rate, - - float base_quality - ); - -/** - * This function performs the last stage of three-step encoding setup, as - * described in the API overview under managed bitrate modes. - * - * Before this function is called, the \ref vorbis_info struct should be - * initialized by using vorbis_info_init() from the libvorbis API, one of - * \ref vorbis_encode_setup_managed() or \ref vorbis_encode_setup_vbr() called to - * initialize the high-level encoding setup, and \ref vorbis_encode_ctl() - * called if necessary to make encoding setup changes. - * vorbis_encode_setup_init() finalizes the highlevel encoding structure into - * a complete encoding setup after which the application may make no further - * setup changes. - * - * After encoding, vorbis_info_clear() should be called. - * - * \param vi Pointer to an initialized \ref vorbis_info struct. - * - * \return Zero for success, and negative values for failure. - * - * \retval 0 Success. - * \retval OV_EFAULT Internal logic fault; indicates a bug or heap/stack corruption. - * - * \retval OV_EINVAL Attempt to use vorbis_encode_setup_init() without first - * calling one of vorbis_encode_setup_managed() or vorbis_encode_setup_vbr() to - * initialize the high-level encoding setup - * - */ -extern int vorbis_encode_setup_init(vorbis_info *vi); - -/** - * This function implements a generic interface to miscellaneous encoder - * settings similar to the classic UNIX 'ioctl()' system call. Applications - * may use vorbis_encode_ctl() to query or set bitrate management or quality - * mode details by using one of several \e request arguments detailed below. - * vorbis_encode_ctl() must be called after one of - * vorbis_encode_setup_managed() or vorbis_encode_setup_vbr(). When used - * to modify settings, \ref vorbis_encode_ctl() must be called before \ref - * vorbis_encode_setup_init(). - * - * \param vi Pointer to an initialized vorbis_info struct. - * - * \param number Specifies the desired action; See \ref encctlcodes "the list - * of available requests". - * - * \param arg void * pointing to a data structure matching the request - * argument. - * - * \retval 0 Success. Any further return information (such as the result of a - * query) is placed into the storage pointed to by *arg. - * - * \retval OV_EINVAL Invalid argument, or an attempt to modify a setting after - * calling vorbis_encode_setup_init(). - * - * \retval OV_EIMPL Unimplemented or unknown request - */ -extern int vorbis_encode_ctl(vorbis_info *vi,int number,void *arg); - -/** - * \deprecated This is a deprecated interface. Please use vorbis_encode_ctl() - * with the \ref ovectl_ratemanage2_arg struct and \ref - * OV_ECTL_RATEMANAGE2_GET and \ref OV_ECTL_RATEMANAGE2_SET calls in new code. - * - * The \ref ovectl_ratemanage_arg structure is used with vorbis_encode_ctl() - * and the \ref OV_ECTL_RATEMANAGE_GET, \ref OV_ECTL_RATEMANAGE_SET, \ref - * OV_ECTL_RATEMANAGE_AVG, \ref OV_ECTL_RATEMANAGE_HARD calls in order to - * query and modify specifics of the encoder's bitrate management - * configuration. -*/ -struct ovectl_ratemanage_arg { - int management_active; /**< nonzero if bitrate management is active*/ -/** hard lower limit (in kilobits per second) below which the stream bitrate - will never be allowed for any given bitrate_hard_window seconds of time.*/ - long bitrate_hard_min; -/** hard upper limit (in kilobits per second) above which the stream bitrate - will never be allowed for any given bitrate_hard_window seconds of time.*/ - long bitrate_hard_max; -/** the window period (in seconds) used to regulate the hard bitrate minimum - and maximum*/ - double bitrate_hard_window; -/** soft lower limit (in kilobits per second) below which the average bitrate - tracker will start nudging the bitrate higher.*/ - long bitrate_av_lo; -/** soft upper limit (in kilobits per second) above which the average bitrate - tracker will start nudging the bitrate lower.*/ - long bitrate_av_hi; -/** the window period (in seconds) used to regulate the average bitrate - minimum and maximum.*/ - double bitrate_av_window; -/** Regulates the relative centering of the average and hard windows; in - libvorbis 1.0 and 1.0.1, the hard window regulation overlapped but - followed the average window regulation. In libvorbis 1.1 a bit-reservoir - interface replaces the old windowing interface; the older windowing - interface is simulated and this field has no effect.*/ - double bitrate_av_window_center; -}; - -/** - * \name struct ovectl_ratemanage2_arg - * - * The ovectl_ratemanage2_arg structure is used with vorbis_encode_ctl() and - * the OV_ECTL_RATEMANAGE2_GET and OV_ECTL_RATEMANAGE2_SET calls in order to - * query and modify specifics of the encoder's bitrate management - * configuration. - * -*/ -struct ovectl_ratemanage2_arg { - int management_active; /**< nonzero if bitrate management is active */ -/** Lower allowed bitrate limit in kilobits per second */ - long bitrate_limit_min_kbps; -/** Upper allowed bitrate limit in kilobits per second */ - long bitrate_limit_max_kbps; - long bitrate_limit_reservoir_bits; /**struct ovectl_ratemanage2_arg * - * - * Used to query the current encoder bitrate management setting. Also used to - * initialize fields of an ovectl_ratemanage2_arg structure for use with - * \ref OV_ECTL_RATEMANAGE2_SET. - */ -#define OV_ECTL_RATEMANAGE2_GET 0x14 - -/** - * Set the current encoder bitrate management settings. - * - * Argument: struct ovectl_ratemanage2_arg * - * - * Used to set the current encoder bitrate management settings to the values - * listed in the ovectl_ratemanage2_arg. Passing a NULL pointer will disable - * bitrate management. -*/ -#define OV_ECTL_RATEMANAGE2_SET 0x15 - -/** - * Returns the current encoder hard-lowpass setting (kHz) in the double - * pointed to by arg. - * - * Argument: double * -*/ -#define OV_ECTL_LOWPASS_GET 0x20 - -/** - * Sets the encoder hard-lowpass to the value (kHz) pointed to by arg. Valid - * lowpass settings range from 2 to 99. - * - * Argument: double * -*/ -#define OV_ECTL_LOWPASS_SET 0x21 - -/** - * Returns the current encoder impulse block setting in the double pointed - * to by arg. - * - * Argument: double * -*/ -#define OV_ECTL_IBLOCK_GET 0x30 - -/** - * Sets the impulse block bias to the the value pointed to by arg. - * - * Argument: double * - * - * Valid range is -15.0 to 0.0 [default]. A negative impulse block bias will - * direct to encoder to use more bits when incoding short blocks that contain - * strong impulses, thus improving the accuracy of impulse encoding. - */ -#define OV_ECTL_IBLOCK_SET 0x31 - -/** - * Returns the current encoder coupling setting in the int pointed - * to by arg. - * - * Argument: int * -*/ -#define OV_ECTL_COUPLING_GET 0x40 - -/** - * Enables/disables channel coupling in multichannel encoding according to arg. - * - * Argument: int * - * - * Zero disables channel coupling for multichannel inputs, nonzer enables - * channel coupling. Setting has no effect on monophonic encoding or - * multichannel counts that do not offer coupling. At present, coupling is - * available for stereo and 5.1 encoding. - */ -#define OV_ECTL_COUPLING_SET 0x41 - - /* deprecated rate management supported only for compatibility */ - -/** - * Old interface to querying bitrate management settings. - * - * Deprecated after move to bit-reservoir style management in 1.1 rendered - * this interface partially obsolete. - - * \deprecated Please use \ref OV_ECTL_RATEMANAGE2_GET instead. - * - * Argument: struct ovectl_ratemanage_arg * - */ -#define OV_ECTL_RATEMANAGE_GET 0x10 -/** - * Old interface to modifying bitrate management settings. - * - * deprecated after move to bit-reservoir style management in 1.1 rendered - * this interface partially obsolete. - * - * \deprecated Please use \ref OV_ECTL_RATEMANAGE2_SET instead. - * - * Argument: struct ovectl_ratemanage_arg * - */ -#define OV_ECTL_RATEMANAGE_SET 0x11 -/** - * Old interface to setting average-bitrate encoding mode. - * - * Deprecated after move to bit-reservoir style management in 1.1 rendered - * this interface partially obsolete. - * - * \deprecated Please use \ref OV_ECTL_RATEMANAGE2_SET instead. - * - * Argument: struct ovectl_ratemanage_arg * - */ -#define OV_ECTL_RATEMANAGE_AVG 0x12 -/** - * Old interface to setting bounded-bitrate encoding modes. - * - * deprecated after move to bit-reservoir style management in 1.1 rendered - * this interface partially obsolete. - * - * \deprecated Please use \ref OV_ECTL_RATEMANAGE2_SET instead. - * - * Argument: struct ovectl_ratemanage_arg * - */ -#define OV_ECTL_RATEMANAGE_HARD 0x13 - -/*@}*/ - - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/include/vorbis/vorbisfile.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/include/vorbis/vorbisfile.h deleted file mode 100644 index 9271331e..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/include/vorbis/vorbisfile.h +++ /dev/null @@ -1,206 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: stdio-based convenience library for opening/seeking/decoding - last mod: $Id: vorbisfile.h 17182 2010-04-29 03:48:32Z xiphmont $ - - ********************************************************************/ - -#ifndef _OV_FILE_H_ -#define _OV_FILE_H_ - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -#include -#include "codec.h" - -/* The function prototypes for the callbacks are basically the same as for - * the stdio functions fread, fseek, fclose, ftell. - * The one difference is that the FILE * arguments have been replaced with - * a void * - this is to be used as a pointer to whatever internal data these - * functions might need. In the stdio case, it's just a FILE * cast to a void * - * - * If you use other functions, check the docs for these functions and return - * the right values. For seek_func(), you *MUST* return -1 if the stream is - * unseekable - */ -typedef struct { - size_t (*read_func) (void *ptr, size_t size, size_t nmemb, void *datasource); - int (*seek_func) (void *datasource, ogg_int64_t offset, int whence); - int (*close_func) (void *datasource); - long (*tell_func) (void *datasource); -} ov_callbacks; - -#ifndef OV_EXCLUDE_STATIC_CALLBACKS - -/* a few sets of convenient callbacks, especially for use under - * Windows where ov_open_callbacks() should always be used instead of - * ov_open() to avoid problems with incompatible crt.o version linking - * issues. */ - -static int _ov_header_fseek_wrap(FILE *f,ogg_int64_t off,int whence){ - if(f==NULL)return(-1); - -#ifdef __MINGW32__ - return fseeko64(f,off,whence); -#elif defined (_WIN32) - return _fseeki64(f,off,whence); -#else - return fseek(f,off,whence); -#endif -} - -/* These structs below (OV_CALLBACKS_DEFAULT etc) are defined here as - * static data. That means that every file which includes this header - * will get its own copy of these structs whether it uses them or - * not unless it #defines OV_EXCLUDE_STATIC_CALLBACKS. - * These static symbols are essential on platforms such as Windows on - * which several different versions of stdio support may be linked to - * by different DLLs, and we need to be certain we know which one - * we're using (the same one as the main application). - */ - -static ov_callbacks OV_CALLBACKS_DEFAULT = { - (size_t (*)(void *, size_t, size_t, void *)) fread, - (int (*)(void *, ogg_int64_t, int)) _ov_header_fseek_wrap, - (int (*)(void *)) fclose, - (long (*)(void *)) ftell -}; - -static ov_callbacks OV_CALLBACKS_NOCLOSE = { - (size_t (*)(void *, size_t, size_t, void *)) fread, - (int (*)(void *, ogg_int64_t, int)) _ov_header_fseek_wrap, - (int (*)(void *)) NULL, - (long (*)(void *)) ftell -}; - -static ov_callbacks OV_CALLBACKS_STREAMONLY = { - (size_t (*)(void *, size_t, size_t, void *)) fread, - (int (*)(void *, ogg_int64_t, int)) NULL, - (int (*)(void *)) fclose, - (long (*)(void *)) NULL -}; - -static ov_callbacks OV_CALLBACKS_STREAMONLY_NOCLOSE = { - (size_t (*)(void *, size_t, size_t, void *)) fread, - (int (*)(void *, ogg_int64_t, int)) NULL, - (int (*)(void *)) NULL, - (long (*)(void *)) NULL -}; - -#endif - -#define NOTOPEN 0 -#define PARTOPEN 1 -#define OPENED 2 -#define STREAMSET 3 -#define INITSET 4 - -typedef struct OggVorbis_File { - void *datasource; /* Pointer to a FILE *, etc. */ - int seekable; - ogg_int64_t offset; - ogg_int64_t end; - ogg_sync_state oy; - - /* If the FILE handle isn't seekable (eg, a pipe), only the current - stream appears */ - int links; - ogg_int64_t *offsets; - ogg_int64_t *dataoffsets; - long *serialnos; - ogg_int64_t *pcmlengths; /* overloaded to maintain binary - compatibility; x2 size, stores both - beginning and end values */ - vorbis_info *vi; - vorbis_comment *vc; - - /* Decoding working state local storage */ - ogg_int64_t pcm_offset; - int ready_state; - long current_serialno; - int current_link; - - double bittrack; - double samptrack; - - ogg_stream_state os; /* take physical pages, weld into a logical - stream of packets */ - vorbis_dsp_state vd; /* central working state for the packet->PCM decoder */ - vorbis_block vb; /* local working space for packet->PCM decode */ - - ov_callbacks callbacks; - -} OggVorbis_File; - - -extern int ov_clear(OggVorbis_File *vf); -extern int ov_fopen(const char *path,OggVorbis_File *vf); -extern int ov_open(FILE *f,OggVorbis_File *vf,const char *initial,long ibytes); -extern int ov_open_callbacks(void *datasource, OggVorbis_File *vf, - const char *initial, long ibytes, ov_callbacks callbacks); - -extern int ov_test(FILE *f,OggVorbis_File *vf,const char *initial,long ibytes); -extern int ov_test_callbacks(void *datasource, OggVorbis_File *vf, - const char *initial, long ibytes, ov_callbacks callbacks); -extern int ov_test_open(OggVorbis_File *vf); - -extern long ov_bitrate(OggVorbis_File *vf,int i); -extern long ov_bitrate_instant(OggVorbis_File *vf); -extern long ov_streams(OggVorbis_File *vf); -extern long ov_seekable(OggVorbis_File *vf); -extern long ov_serialnumber(OggVorbis_File *vf,int i); - -extern ogg_int64_t ov_raw_total(OggVorbis_File *vf,int i); -extern ogg_int64_t ov_pcm_total(OggVorbis_File *vf,int i); -extern double ov_time_total(OggVorbis_File *vf,int i); - -extern int ov_raw_seek(OggVorbis_File *vf,ogg_int64_t pos); -extern int ov_pcm_seek(OggVorbis_File *vf,ogg_int64_t pos); -extern int ov_pcm_seek_page(OggVorbis_File *vf,ogg_int64_t pos); -extern int ov_time_seek(OggVorbis_File *vf,double pos); -extern int ov_time_seek_page(OggVorbis_File *vf,double pos); - -extern int ov_raw_seek_lap(OggVorbis_File *vf,ogg_int64_t pos); -extern int ov_pcm_seek_lap(OggVorbis_File *vf,ogg_int64_t pos); -extern int ov_pcm_seek_page_lap(OggVorbis_File *vf,ogg_int64_t pos); -extern int ov_time_seek_lap(OggVorbis_File *vf,double pos); -extern int ov_time_seek_page_lap(OggVorbis_File *vf,double pos); - -extern ogg_int64_t ov_raw_tell(OggVorbis_File *vf); -extern ogg_int64_t ov_pcm_tell(OggVorbis_File *vf); -extern double ov_time_tell(OggVorbis_File *vf); - -extern vorbis_info *ov_info(OggVorbis_File *vf,int link); -extern vorbis_comment *ov_comment(OggVorbis_File *vf,int link); - -extern long ov_read_float(OggVorbis_File *vf,float ***pcm_channels,int samples, - int *bitstream); -extern long ov_read_filter(OggVorbis_File *vf,char *buffer,int length, - int bigendianp,int word,int sgned,int *bitstream, - void (*filter)(float **pcm,long channels,long samples,void *filter_param),void *filter_param); -extern long ov_read(OggVorbis_File *vf,char *buffer,int length, - int bigendianp,int word,int sgned,int *bitstream); -extern int ov_crosslap(OggVorbis_File *vf1,OggVorbis_File *vf2); - -extern int ov_halfrate(OggVorbis_File *vf,int flag); -extern int ov_halfrate_p(OggVorbis_File *vf); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif - diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/analysis.c b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/analysis.c deleted file mode 100644 index 01aa6f30..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/analysis.c +++ /dev/null @@ -1,120 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: single-block PCM analysis mode dispatch - last mod: $Id: analysis.c 16226 2009-07-08 06:43:49Z xiphmont $ - - ********************************************************************/ - -#include -#include -#include -#include -#include "vorbis/codec.h" -#include "codec_internal.h" -#include "registry.h" -#include "scales.h" -#include "os.h" -#include "misc.h" - -/* decides between modes, dispatches to the appropriate mapping. */ -int vorbis_analysis(vorbis_block *vb, ogg_packet *op){ - int ret,i; - vorbis_block_internal *vbi=vb->internal; - - vb->glue_bits=0; - vb->time_bits=0; - vb->floor_bits=0; - vb->res_bits=0; - - /* first things first. Make sure encode is ready */ - for(i=0;ipacketblob[i]); - - /* we only have one mapping type (0), and we let the mapping code - itself figure out what soft mode to use. This allows easier - bitrate management */ - - if((ret=_mapping_P[0]->forward(vb))) - return(ret); - - if(op){ - if(vorbis_bitrate_managed(vb)) - /* The app is using a bitmanaged mode... but not using the - bitrate management interface. */ - return(OV_EINVAL); - - op->packet=oggpack_get_buffer(&vb->opb); - op->bytes=oggpack_bytes(&vb->opb); - op->b_o_s=0; - op->e_o_s=vb->eofflag; - op->granulepos=vb->granulepos; - op->packetno=vb->sequence; /* for sake of completeness */ - } - return(0); -} - -#ifdef ANALYSIS -int analysis_noisy=1; - -/* there was no great place to put this.... */ -void _analysis_output_always(char *base,int i,float *v,int n,int bark,int dB,ogg_int64_t off){ - int j; - FILE *of; - char buffer[80]; - - sprintf(buffer,"%s_%d.m",base,i); - of=fopen(buffer,"w"); - - if(!of)perror("failed to open data dump file"); - - for(j=0;j -#include "scales.h" -int main(){ - int i; - double rate; - for(i=64;i<32000;i*=2){ - rate=48000.f; - fprintf(stderr,"rate=%gHz, block=%d, f(1)=%.2gHz bark(1)=%.2g (of %.2g)\n", - rate,i,rate/2 / (i/2),toBARK(rate/2 /(i/2)),toBARK(rate/2)); - - rate=44100.f; - fprintf(stderr,"rate=%gHz, block=%d, f(1)=%.2gHz bark(1)=%.2g (of %.2g)\n", - rate,i,rate/2 / (i/2),toBARK(rate/2 /(i/2)),toBARK(rate/2)); - - rate=32000.f; - fprintf(stderr,"rate=%gHz, block=%d, f(1)=%.2gHz bark(1)=%.2g (of %.2g)\n", - rate,i,rate/2 / (i/2),toBARK(rate/2 /(i/2)),toBARK(rate/2)); - - rate=22050.f; - fprintf(stderr,"rate=%gHz, block=%d, f(1)=%.2gHz bark(1)=%.2g (of %.2g)\n", - rate,i,rate/2 / (i/2),toBARK(rate/2 /(i/2)),toBARK(rate/2)); - - rate=16000.f; - fprintf(stderr,"rate=%gHz, block=%d, f(1)=%.2gHz bark(1)=%.2g (of %.2g)\n", - rate,i,rate/2 / (i/2),toBARK(rate/2 /(i/2)),toBARK(rate/2)); - - rate=11025.f; - fprintf(stderr,"rate=%gHz, block=%d, f(1)=%.2gHz bark(1)=%.2g (of %.2g)\n", - rate,i,rate/2 / (i/2),toBARK(rate/2 /(i/2)),toBARK(rate/2)); - - rate=8000.f; - fprintf(stderr,"rate=%gHz, block=%d, f(1)=%.2gHz bark(1)=%.2g (of %.2g)\n\n", - rate,i,rate/2 / (i/2),toBARK(rate/2 /(i/2)),toBARK(rate/2)); - - - } - { - float i; - int j; - for(i=0.,j=0;i<28;i+=1,j++){ - fprintf(stderr,"(%d) bark=%f %gHz (%d of 128)\n", - j,i,fromBARK(i),(int)(fromBARK(i)/22050.*128.)); - } - } - return(0); -} - diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/bitrate.c b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/bitrate.c deleted file mode 100644 index 3a71b1dc..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/bitrate.c +++ /dev/null @@ -1,253 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: bitrate tracking and management - last mod: $Id: bitrate.c 16227 2009-07-08 06:58:46Z xiphmont $ - - ********************************************************************/ - -#include -#include -#include -#include -#include "vorbis/codec.h" -#include "codec_internal.h" -#include "os.h" -#include "misc.h" -#include "bitrate.h" - -/* compute bitrate tracking setup */ -void vorbis_bitrate_init(vorbis_info *vi,bitrate_manager_state *bm){ - codec_setup_info *ci=vi->codec_setup; - bitrate_manager_info *bi=&ci->bi; - - memset(bm,0,sizeof(*bm)); - - if(bi && (bi->reservoir_bits>0)){ - long ratesamples=vi->rate; - int halfsamples=ci->blocksizes[0]>>1; - - bm->short_per_long=ci->blocksizes[1]/ci->blocksizes[0]; - bm->managed=1; - - bm->avg_bitsper= rint(1.*bi->avg_rate*halfsamples/ratesamples); - bm->min_bitsper= rint(1.*bi->min_rate*halfsamples/ratesamples); - bm->max_bitsper= rint(1.*bi->max_rate*halfsamples/ratesamples); - - bm->avgfloat=PACKETBLOBS/2; - - /* not a necessary fix, but one that leads to a more balanced - typical initialization */ - { - long desired_fill=bi->reservoir_bits*bi->reservoir_bias; - bm->minmax_reservoir=desired_fill; - bm->avg_reservoir=desired_fill; - } - - } -} - -void vorbis_bitrate_clear(bitrate_manager_state *bm){ - memset(bm,0,sizeof(*bm)); - return; -} - -int vorbis_bitrate_managed(vorbis_block *vb){ - vorbis_dsp_state *vd=vb->vd; - private_state *b=vd->backend_state; - bitrate_manager_state *bm=&b->bms; - - if(bm && bm->managed)return(1); - return(0); -} - -/* finish taking in the block we just processed */ -int vorbis_bitrate_addblock(vorbis_block *vb){ - vorbis_block_internal *vbi=vb->internal; - vorbis_dsp_state *vd=vb->vd; - private_state *b=vd->backend_state; - bitrate_manager_state *bm=&b->bms; - vorbis_info *vi=vd->vi; - codec_setup_info *ci=vi->codec_setup; - bitrate_manager_info *bi=&ci->bi; - - int choice=rint(bm->avgfloat); - long this_bits=oggpack_bytes(vbi->packetblob[choice])*8; - long min_target_bits=(vb->W?bm->min_bitsper*bm->short_per_long:bm->min_bitsper); - long max_target_bits=(vb->W?bm->max_bitsper*bm->short_per_long:bm->max_bitsper); - int samples=ci->blocksizes[vb->W]>>1; - long desired_fill=bi->reservoir_bits*bi->reservoir_bias; - if(!bm->managed){ - /* not a bitrate managed stream, but for API simplicity, we'll - buffer the packet to keep the code path clean */ - - if(bm->vb)return(-1); /* one has been submitted without - being claimed */ - bm->vb=vb; - return(0); - } - - bm->vb=vb; - - /* look ahead for avg floater */ - if(bm->avg_bitsper>0){ - double slew=0.; - long avg_target_bits=(vb->W?bm->avg_bitsper*bm->short_per_long:bm->avg_bitsper); - double slewlimit= 15./bi->slew_damp; - - /* choosing a new floater: - if we're over target, we slew down - if we're under target, we slew up - - choose slew as follows: look through packetblobs of this frame - and set slew as the first in the appropriate direction that - gives us the slew we want. This may mean no slew if delta is - already favorable. - - Then limit slew to slew max */ - - if(bm->avg_reservoir+(this_bits-avg_target_bits)>desired_fill){ - while(choice>0 && this_bits>avg_target_bits && - bm->avg_reservoir+(this_bits-avg_target_bits)>desired_fill){ - choice--; - this_bits=oggpack_bytes(vbi->packetblob[choice])*8; - } - }else if(bm->avg_reservoir+(this_bits-avg_target_bits)avg_reservoir+(this_bits-avg_target_bits)packetblob[choice])*8; - } - } - - slew=rint(choice-bm->avgfloat)/samples*vi->rate; - if(slew<-slewlimit)slew=-slewlimit; - if(slew>slewlimit)slew=slewlimit; - choice=rint(bm->avgfloat+= slew/vi->rate*samples); - this_bits=oggpack_bytes(vbi->packetblob[choice])*8; - } - - - - /* enforce min(if used) on the current floater (if used) */ - if(bm->min_bitsper>0){ - /* do we need to force the bitrate up? */ - if(this_bitsminmax_reservoir-(min_target_bits-this_bits)<0){ - choice++; - if(choice>=PACKETBLOBS)break; - this_bits=oggpack_bytes(vbi->packetblob[choice])*8; - } - } - } - - /* enforce max (if used) on the current floater (if used) */ - if(bm->max_bitsper>0){ - /* do we need to force the bitrate down? */ - if(this_bits>max_target_bits){ - while(bm->minmax_reservoir+(this_bits-max_target_bits)>bi->reservoir_bits){ - choice--; - if(choice<0)break; - this_bits=oggpack_bytes(vbi->packetblob[choice])*8; - } - } - } - - /* Choice of packetblobs now made based on floater, and min/max - requirements. Now boundary check extreme choices */ - - if(choice<0){ - /* choosing a smaller packetblob is insufficient to trim bitrate. - frame will need to be truncated */ - long maxsize=(max_target_bits+(bi->reservoir_bits-bm->minmax_reservoir))/8; - bm->choice=choice=0; - - if(oggpack_bytes(vbi->packetblob[choice])>maxsize){ - - oggpack_writetrunc(vbi->packetblob[choice],maxsize*8); - this_bits=oggpack_bytes(vbi->packetblob[choice])*8; - } - }else{ - long minsize=(min_target_bits-bm->minmax_reservoir+7)/8; - if(choice>=PACKETBLOBS) - choice=PACKETBLOBS-1; - - bm->choice=choice; - - /* prop up bitrate according to demand. pad this frame out with zeroes */ - minsize-=oggpack_bytes(vbi->packetblob[choice]); - while(minsize-->0)oggpack_write(vbi->packetblob[choice],0,8); - this_bits=oggpack_bytes(vbi->packetblob[choice])*8; - - } - - /* now we have the final packet and the final packet size. Update statistics */ - /* min and max reservoir */ - if(bm->min_bitsper>0 || bm->max_bitsper>0){ - - if(max_target_bits>0 && this_bits>max_target_bits){ - bm->minmax_reservoir+=(this_bits-max_target_bits); - }else if(min_target_bits>0 && this_bitsminmax_reservoir+=(this_bits-min_target_bits); - }else{ - /* inbetween; we want to take reservoir toward but not past desired_fill */ - if(bm->minmax_reservoir>desired_fill){ - if(max_target_bits>0){ /* logical bulletproofing against initialization state */ - bm->minmax_reservoir+=(this_bits-max_target_bits); - if(bm->minmax_reservoirminmax_reservoir=desired_fill; - }else{ - bm->minmax_reservoir=desired_fill; - } - }else{ - if(min_target_bits>0){ /* logical bulletproofing against initialization state */ - bm->minmax_reservoir+=(this_bits-min_target_bits); - if(bm->minmax_reservoir>desired_fill)bm->minmax_reservoir=desired_fill; - }else{ - bm->minmax_reservoir=desired_fill; - } - } - } - } - - /* avg reservoir */ - if(bm->avg_bitsper>0){ - long avg_target_bits=(vb->W?bm->avg_bitsper*bm->short_per_long:bm->avg_bitsper); - bm->avg_reservoir+=this_bits-avg_target_bits; - } - - return(0); -} - -int vorbis_bitrate_flushpacket(vorbis_dsp_state *vd,ogg_packet *op){ - private_state *b=vd->backend_state; - bitrate_manager_state *bm=&b->bms; - vorbis_block *vb=bm->vb; - int choice=PACKETBLOBS/2; - if(!vb)return 0; - - if(op){ - vorbis_block_internal *vbi=vb->internal; - - if(vorbis_bitrate_managed(vb)) - choice=bm->choice; - - op->packet=oggpack_get_buffer(vbi->packetblob[choice]); - op->bytes=oggpack_bytes(vbi->packetblob[choice]); - op->b_o_s=0; - op->e_o_s=vb->eofflag; - op->granulepos=vb->granulepos; - op->packetno=vb->sequence; /* for sake of completeness */ - } - - bm->vb=0; - return(1); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/bitrate.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/bitrate.h deleted file mode 100644 index db48fcb6..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/bitrate.h +++ /dev/null @@ -1,59 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: bitrate tracking and management - last mod: $Id: bitrate.h 13293 2007-07-24 00:09:47Z xiphmont $ - - ********************************************************************/ - -#ifndef _V_BITRATE_H_ -#define _V_BITRATE_H_ - -#include "vorbis/codec.h" -#include "codec_internal.h" -#include "os.h" - -/* encode side bitrate tracking */ -typedef struct bitrate_manager_state { - int managed; - - long avg_reservoir; - long minmax_reservoir; - long avg_bitsper; - long min_bitsper; - long max_bitsper; - - long short_per_long; - double avgfloat; - - vorbis_block *vb; - int choice; -} bitrate_manager_state; - -typedef struct bitrate_manager_info{ - long avg_rate; - long min_rate; - long max_rate; - long reservoir_bits; - double reservoir_bias; - - double slew_damp; - -} bitrate_manager_info; - -extern void vorbis_bitrate_init(vorbis_info *vi,bitrate_manager_state *bs); -extern void vorbis_bitrate_clear(bitrate_manager_state *bs); -extern int vorbis_bitrate_managed(vorbis_block *vb); -extern int vorbis_bitrate_addblock(vorbis_block *vb); -extern int vorbis_bitrate_flushpacket(vorbis_dsp_state *vd, ogg_packet *op); - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/block.c b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/block.c deleted file mode 100644 index b5a60ede..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/block.c +++ /dev/null @@ -1,1047 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2015 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: PCM data vector blocking, windowing and dis/reassembly - last mod: $Id: block.c 19457 2015-03-03 00:15:29Z giles $ - - Handle windowing, overlap-add, etc of the PCM vectors. This is made - more amusing by Vorbis' current two allowed block sizes. - - ********************************************************************/ - -#include -#include -#include -#include -#include "vorbis/codec.h" -#include "codec_internal.h" - -#include "window.h" -#include "mdct.h" -#include "lpc.h" -#include "registry.h" -#include "misc.h" - -/* pcm accumulator examples (not exhaustive): - - <-------------- lW ----------------> - <--------------- W ----------------> -: .....|..... _______________ | -: .''' | '''_--- | |\ | -:.....''' |_____--- '''......| | \_______| -:.................|__________________|_______|__|______| - |<------ Sl ------>| > Sr < |endW - |beginSl |endSl | |endSr - |beginW |endlW |beginSr - - - |< lW >| - <--------------- W ----------------> - | | .. ______________ | - | | ' `/ | ---_ | - |___.'___/`. | ---_____| - |_______|__|_______|_________________| - | >|Sl|< |<------ Sr ----->|endW - | | |endSl |beginSr |endSr - |beginW | |endlW - mult[0] |beginSl mult[n] - - <-------------- lW -----------------> - |<--W-->| -: .............. ___ | | -: .''' |`/ \ | | -:.....''' |/`....\|...| -:.........................|___|___|___| - |Sl |Sr |endW - | | |endSr - | |beginSr - | |endSl - |beginSl - |beginW -*/ - -/* block abstraction setup *********************************************/ - -#ifndef WORD_ALIGN -#define WORD_ALIGN 8 -#endif - -int vorbis_block_init(vorbis_dsp_state *v, vorbis_block *vb){ - int i; - memset(vb,0,sizeof(*vb)); - vb->vd=v; - vb->localalloc=0; - vb->localstore=NULL; - if(v->analysisp){ - vorbis_block_internal *vbi= - vb->internal=_ogg_calloc(1,sizeof(vorbis_block_internal)); - vbi->ampmax=-9999; - - for(i=0;ipacketblob[i]=&vb->opb; - }else{ - vbi->packetblob[i]= - _ogg_calloc(1,sizeof(oggpack_buffer)); - } - oggpack_writeinit(vbi->packetblob[i]); - } - } - - return(0); -} - -void *_vorbis_block_alloc(vorbis_block *vb,long bytes){ - bytes=(bytes+(WORD_ALIGN-1)) & ~(WORD_ALIGN-1); - if(bytes+vb->localtop>vb->localalloc){ - /* can't just _ogg_realloc... there are outstanding pointers */ - if(vb->localstore){ - struct alloc_chain *link=_ogg_malloc(sizeof(*link)); - vb->totaluse+=vb->localtop; - link->next=vb->reap; - link->ptr=vb->localstore; - vb->reap=link; - } - /* highly conservative */ - vb->localalloc=bytes; - vb->localstore=_ogg_malloc(vb->localalloc); - vb->localtop=0; - } - { - void *ret=(void *)(((char *)vb->localstore)+vb->localtop); - vb->localtop+=bytes; - return ret; - } -} - -/* reap the chain, pull the ripcord */ -void _vorbis_block_ripcord(vorbis_block *vb){ - /* reap the chain */ - struct alloc_chain *reap=vb->reap; - while(reap){ - struct alloc_chain *next=reap->next; - _ogg_free(reap->ptr); - memset(reap,0,sizeof(*reap)); - _ogg_free(reap); - reap=next; - } - /* consolidate storage */ - if(vb->totaluse){ - vb->localstore=_ogg_realloc(vb->localstore,vb->totaluse+vb->localalloc); - vb->localalloc+=vb->totaluse; - vb->totaluse=0; - } - - /* pull the ripcord */ - vb->localtop=0; - vb->reap=NULL; -} - -int vorbis_block_clear(vorbis_block *vb){ - int i; - vorbis_block_internal *vbi=vb->internal; - - _vorbis_block_ripcord(vb); - if(vb->localstore)_ogg_free(vb->localstore); - - if(vbi){ - for(i=0;ipacketblob[i]); - if(i!=PACKETBLOBS/2)_ogg_free(vbi->packetblob[i]); - } - _ogg_free(vbi); - } - memset(vb,0,sizeof(*vb)); - return(0); -} - -/* Analysis side code, but directly related to blocking. Thus it's - here and not in analysis.c (which is for analysis transforms only). - The init is here because some of it is shared */ - -static int _vds_shared_init(vorbis_dsp_state *v,vorbis_info *vi,int encp){ - int i; - codec_setup_info *ci=vi->codec_setup; - private_state *b=NULL; - int hs; - - if(ci==NULL|| - ci->modes<=0|| - ci->blocksizes[0]<64|| - ci->blocksizes[1]blocksizes[0]){ - return 1; - } - hs=ci->halfrate_flag; - - memset(v,0,sizeof(*v)); - b=v->backend_state=_ogg_calloc(1,sizeof(*b)); - - v->vi=vi; - b->modebits=ov_ilog(ci->modes-1); - - b->transform[0]=_ogg_calloc(VI_TRANSFORMB,sizeof(*b->transform[0])); - b->transform[1]=_ogg_calloc(VI_TRANSFORMB,sizeof(*b->transform[1])); - - /* MDCT is tranform 0 */ - - b->transform[0][0]=_ogg_calloc(1,sizeof(vbs_mdct_lookup)); - b->transform[1][0]=_ogg_calloc(1,sizeof(vbs_mdct_lookup)); - mdct_init(b->transform[0][0],ci->blocksizes[0]>>hs); - mdct_init(b->transform[1][0],ci->blocksizes[1]>>hs); - - /* Vorbis I uses only window type 0 */ - /* note that the correct computation below is technically: - b->window[0]=ov_ilog(ci->blocksizes[0]-1)-6; - b->window[1]=ov_ilog(ci->blocksizes[1]-1)-6; - but since blocksizes are always powers of two, - the below is equivalent. - */ - b->window[0]=ov_ilog(ci->blocksizes[0])-7; - b->window[1]=ov_ilog(ci->blocksizes[1])-7; - - if(encp){ /* encode/decode differ here */ - - /* analysis always needs an fft */ - drft_init(&b->fft_look[0],ci->blocksizes[0]); - drft_init(&b->fft_look[1],ci->blocksizes[1]); - - /* finish the codebooks */ - if(!ci->fullbooks){ - ci->fullbooks=_ogg_calloc(ci->books,sizeof(*ci->fullbooks)); - for(i=0;ibooks;i++) - vorbis_book_init_encode(ci->fullbooks+i,ci->book_param[i]); - } - - b->psy=_ogg_calloc(ci->psys,sizeof(*b->psy)); - for(i=0;ipsys;i++){ - _vp_psy_init(b->psy+i, - ci->psy_param[i], - &ci->psy_g_param, - ci->blocksizes[ci->psy_param[i]->blockflag]/2, - vi->rate); - } - - v->analysisp=1; - }else{ - /* finish the codebooks */ - if(!ci->fullbooks){ - ci->fullbooks=_ogg_calloc(ci->books,sizeof(*ci->fullbooks)); - for(i=0;ibooks;i++){ - if(ci->book_param[i]==NULL) - goto abort_books; - if(vorbis_book_init_decode(ci->fullbooks+i,ci->book_param[i])) - goto abort_books; - /* decode codebooks are now standalone after init */ - vorbis_staticbook_destroy(ci->book_param[i]); - ci->book_param[i]=NULL; - } - } - } - - /* initialize the storage vectors. blocksize[1] is small for encode, - but the correct size for decode */ - v->pcm_storage=ci->blocksizes[1]; - v->pcm=_ogg_malloc(vi->channels*sizeof(*v->pcm)); - v->pcmret=_ogg_malloc(vi->channels*sizeof(*v->pcmret)); - { - int i; - for(i=0;ichannels;i++) - v->pcm[i]=_ogg_calloc(v->pcm_storage,sizeof(*v->pcm[i])); - } - - /* all 1 (large block) or 0 (small block) */ - /* explicitly set for the sake of clarity */ - v->lW=0; /* previous window size */ - v->W=0; /* current window size */ - - /* all vector indexes */ - v->centerW=ci->blocksizes[1]/2; - - v->pcm_current=v->centerW; - - /* initialize all the backend lookups */ - b->flr=_ogg_calloc(ci->floors,sizeof(*b->flr)); - b->residue=_ogg_calloc(ci->residues,sizeof(*b->residue)); - - for(i=0;ifloors;i++) - b->flr[i]=_floor_P[ci->floor_type[i]]-> - look(v,ci->floor_param[i]); - - for(i=0;iresidues;i++) - b->residue[i]=_residue_P[ci->residue_type[i]]-> - look(v,ci->residue_param[i]); - - return 0; - abort_books: - for(i=0;ibooks;i++){ - if(ci->book_param[i]!=NULL){ - vorbis_staticbook_destroy(ci->book_param[i]); - ci->book_param[i]=NULL; - } - } - vorbis_dsp_clear(v); - return -1; -} - -/* arbitrary settings and spec-mandated numbers get filled in here */ -int vorbis_analysis_init(vorbis_dsp_state *v,vorbis_info *vi){ - private_state *b=NULL; - - if(_vds_shared_init(v,vi,1))return 1; - b=v->backend_state; - b->psy_g_look=_vp_global_look(vi); - - /* Initialize the envelope state storage */ - b->ve=_ogg_calloc(1,sizeof(*b->ve)); - _ve_envelope_init(b->ve,vi); - - vorbis_bitrate_init(vi,&b->bms); - - /* compressed audio packets start after the headers - with sequence number 3 */ - v->sequence=3; - - return(0); -} - -void vorbis_dsp_clear(vorbis_dsp_state *v){ - int i; - if(v){ - vorbis_info *vi=v->vi; - codec_setup_info *ci=(vi?vi->codec_setup:NULL); - private_state *b=v->backend_state; - - if(b){ - - if(b->ve){ - _ve_envelope_clear(b->ve); - _ogg_free(b->ve); - } - - if(b->transform[0]){ - mdct_clear(b->transform[0][0]); - _ogg_free(b->transform[0][0]); - _ogg_free(b->transform[0]); - } - if(b->transform[1]){ - mdct_clear(b->transform[1][0]); - _ogg_free(b->transform[1][0]); - _ogg_free(b->transform[1]); - } - - if(b->flr){ - if(ci) - for(i=0;ifloors;i++) - _floor_P[ci->floor_type[i]]-> - free_look(b->flr[i]); - _ogg_free(b->flr); - } - if(b->residue){ - if(ci) - for(i=0;iresidues;i++) - _residue_P[ci->residue_type[i]]-> - free_look(b->residue[i]); - _ogg_free(b->residue); - } - if(b->psy){ - if(ci) - for(i=0;ipsys;i++) - _vp_psy_clear(b->psy+i); - _ogg_free(b->psy); - } - - if(b->psy_g_look)_vp_global_free(b->psy_g_look); - vorbis_bitrate_clear(&b->bms); - - drft_clear(&b->fft_look[0]); - drft_clear(&b->fft_look[1]); - - } - - if(v->pcm){ - if(vi) - for(i=0;ichannels;i++) - if(v->pcm[i])_ogg_free(v->pcm[i]); - _ogg_free(v->pcm); - if(v->pcmret)_ogg_free(v->pcmret); - } - - if(b){ - /* free header, header1, header2 */ - if(b->header)_ogg_free(b->header); - if(b->header1)_ogg_free(b->header1); - if(b->header2)_ogg_free(b->header2); - _ogg_free(b); - } - - memset(v,0,sizeof(*v)); - } -} - -float **vorbis_analysis_buffer(vorbis_dsp_state *v, int vals){ - int i; - vorbis_info *vi=v->vi; - private_state *b=v->backend_state; - - /* free header, header1, header2 */ - if(b->header)_ogg_free(b->header);b->header=NULL; - if(b->header1)_ogg_free(b->header1);b->header1=NULL; - if(b->header2)_ogg_free(b->header2);b->header2=NULL; - - /* Do we have enough storage space for the requested buffer? If not, - expand the PCM (and envelope) storage */ - - if(v->pcm_current+vals>=v->pcm_storage){ - v->pcm_storage=v->pcm_current+vals*2; - - for(i=0;ichannels;i++){ - v->pcm[i]=_ogg_realloc(v->pcm[i],v->pcm_storage*sizeof(*v->pcm[i])); - } - } - - for(i=0;ichannels;i++) - v->pcmret[i]=v->pcm[i]+v->pcm_current; - - return(v->pcmret); -} - -static void _preextrapolate_helper(vorbis_dsp_state *v){ - int i; - int order=16; - float *lpc=alloca(order*sizeof(*lpc)); - float *work=alloca(v->pcm_current*sizeof(*work)); - long j; - v->preextrapolate=1; - - if(v->pcm_current-v->centerW>order*2){ /* safety */ - for(i=0;ivi->channels;i++){ - /* need to run the extrapolation in reverse! */ - for(j=0;jpcm_current;j++) - work[j]=v->pcm[i][v->pcm_current-j-1]; - - /* prime as above */ - vorbis_lpc_from_data(work,lpc,v->pcm_current-v->centerW,order); - -#if 0 - if(v->vi->channels==2){ - if(i==0) - _analysis_output("predataL",0,work,v->pcm_current-v->centerW,0,0,0); - else - _analysis_output("predataR",0,work,v->pcm_current-v->centerW,0,0,0); - }else{ - _analysis_output("predata",0,work,v->pcm_current-v->centerW,0,0,0); - } -#endif - - /* run the predictor filter */ - vorbis_lpc_predict(lpc,work+v->pcm_current-v->centerW-order, - order, - work+v->pcm_current-v->centerW, - v->centerW); - - for(j=0;jpcm_current;j++) - v->pcm[i][v->pcm_current-j-1]=work[j]; - - } - } -} - - -/* call with val<=0 to set eof */ - -int vorbis_analysis_wrote(vorbis_dsp_state *v, int vals){ - vorbis_info *vi=v->vi; - codec_setup_info *ci=vi->codec_setup; - - if(vals<=0){ - int order=32; - int i; - float *lpc=alloca(order*sizeof(*lpc)); - - /* if it wasn't done earlier (very short sample) */ - if(!v->preextrapolate) - _preextrapolate_helper(v); - - /* We're encoding the end of the stream. Just make sure we have - [at least] a few full blocks of zeroes at the end. */ - /* actually, we don't want zeroes; that could drop a large - amplitude off a cliff, creating spread spectrum noise that will - suck to encode. Extrapolate for the sake of cleanliness. */ - - vorbis_analysis_buffer(v,ci->blocksizes[1]*3); - v->eofflag=v->pcm_current; - v->pcm_current+=ci->blocksizes[1]*3; - - for(i=0;ichannels;i++){ - if(v->eofflag>order*2){ - /* extrapolate with LPC to fill in */ - long n; - - /* make a predictor filter */ - n=v->eofflag; - if(n>ci->blocksizes[1])n=ci->blocksizes[1]; - vorbis_lpc_from_data(v->pcm[i]+v->eofflag-n,lpc,n,order); - - /* run the predictor filter */ - vorbis_lpc_predict(lpc,v->pcm[i]+v->eofflag-order,order, - v->pcm[i]+v->eofflag,v->pcm_current-v->eofflag); - }else{ - /* not enough data to extrapolate (unlikely to happen due to - guarding the overlap, but bulletproof in case that - assumtion goes away). zeroes will do. */ - memset(v->pcm[i]+v->eofflag,0, - (v->pcm_current-v->eofflag)*sizeof(*v->pcm[i])); - - } - } - }else{ - - if(v->pcm_current+vals>v->pcm_storage) - return(OV_EINVAL); - - v->pcm_current+=vals; - - /* we may want to reverse extrapolate the beginning of a stream - too... in case we're beginning on a cliff! */ - /* clumsy, but simple. It only runs once, so simple is good. */ - if(!v->preextrapolate && v->pcm_current-v->centerW>ci->blocksizes[1]) - _preextrapolate_helper(v); - - } - return(0); -} - -/* do the deltas, envelope shaping, pre-echo and determine the size of - the next block on which to continue analysis */ -int vorbis_analysis_blockout(vorbis_dsp_state *v,vorbis_block *vb){ - int i; - vorbis_info *vi=v->vi; - codec_setup_info *ci=vi->codec_setup; - private_state *b=v->backend_state; - vorbis_look_psy_global *g=b->psy_g_look; - long beginW=v->centerW-ci->blocksizes[v->W]/2,centerNext; - vorbis_block_internal *vbi=(vorbis_block_internal *)vb->internal; - - /* check to see if we're started... */ - if(!v->preextrapolate)return(0); - - /* check to see if we're done... */ - if(v->eofflag==-1)return(0); - - /* By our invariant, we have lW, W and centerW set. Search for - the next boundary so we can determine nW (the next window size) - which lets us compute the shape of the current block's window */ - - /* we do an envelope search even on a single blocksize; we may still - be throwing more bits at impulses, and envelope search handles - marking impulses too. */ - { - long bp=_ve_envelope_search(v); - if(bp==-1){ - - if(v->eofflag==0)return(0); /* not enough data currently to search for a - full long block */ - v->nW=0; - }else{ - - if(ci->blocksizes[0]==ci->blocksizes[1]) - v->nW=0; - else - v->nW=bp; - } - } - - centerNext=v->centerW+ci->blocksizes[v->W]/4+ci->blocksizes[v->nW]/4; - - { - /* center of next block + next block maximum right side. */ - - long blockbound=centerNext+ci->blocksizes[v->nW]/2; - if(v->pcm_currentlW=v->lW; - vb->W=v->W; - vb->nW=v->nW; - - if(v->W){ - if(!v->lW || !v->nW){ - vbi->blocktype=BLOCKTYPE_TRANSITION; - /*fprintf(stderr,"-");*/ - }else{ - vbi->blocktype=BLOCKTYPE_LONG; - /*fprintf(stderr,"_");*/ - } - }else{ - if(_ve_envelope_mark(v)){ - vbi->blocktype=BLOCKTYPE_IMPULSE; - /*fprintf(stderr,"|");*/ - - }else{ - vbi->blocktype=BLOCKTYPE_PADDING; - /*fprintf(stderr,".");*/ - - } - } - - vb->vd=v; - vb->sequence=v->sequence++; - vb->granulepos=v->granulepos; - vb->pcmend=ci->blocksizes[v->W]; - - /* copy the vectors; this uses the local storage in vb */ - - /* this tracks 'strongest peak' for later psychoacoustics */ - /* moved to the global psy state; clean this mess up */ - if(vbi->ampmax>g->ampmax)g->ampmax=vbi->ampmax; - g->ampmax=_vp_ampmax_decay(g->ampmax,v); - vbi->ampmax=g->ampmax; - - vb->pcm=_vorbis_block_alloc(vb,sizeof(*vb->pcm)*vi->channels); - vbi->pcmdelay=_vorbis_block_alloc(vb,sizeof(*vbi->pcmdelay)*vi->channels); - for(i=0;ichannels;i++){ - vbi->pcmdelay[i]= - _vorbis_block_alloc(vb,(vb->pcmend+beginW)*sizeof(*vbi->pcmdelay[i])); - memcpy(vbi->pcmdelay[i],v->pcm[i],(vb->pcmend+beginW)*sizeof(*vbi->pcmdelay[i])); - vb->pcm[i]=vbi->pcmdelay[i]+beginW; - - /* before we added the delay - vb->pcm[i]=_vorbis_block_alloc(vb,vb->pcmend*sizeof(*vb->pcm[i])); - memcpy(vb->pcm[i],v->pcm[i]+beginW,ci->blocksizes[v->W]*sizeof(*vb->pcm[i])); - */ - - } - - /* handle eof detection: eof==0 means that we've not yet received EOF - eof>0 marks the last 'real' sample in pcm[] - eof<0 'no more to do'; doesn't get here */ - - if(v->eofflag){ - if(v->centerW>=v->eofflag){ - v->eofflag=-1; - vb->eofflag=1; - return(1); - } - } - - /* advance storage vectors and clean up */ - { - int new_centerNext=ci->blocksizes[1]/2; - int movementW=centerNext-new_centerNext; - - if(movementW>0){ - - _ve_envelope_shift(b->ve,movementW); - v->pcm_current-=movementW; - - for(i=0;ichannels;i++) - memmove(v->pcm[i],v->pcm[i]+movementW, - v->pcm_current*sizeof(*v->pcm[i])); - - - v->lW=v->W; - v->W=v->nW; - v->centerW=new_centerNext; - - if(v->eofflag){ - v->eofflag-=movementW; - if(v->eofflag<=0)v->eofflag=-1; - /* do not add padding to end of stream! */ - if(v->centerW>=v->eofflag){ - v->granulepos+=movementW-(v->centerW-v->eofflag); - }else{ - v->granulepos+=movementW; - } - }else{ - v->granulepos+=movementW; - } - } - } - - /* done */ - return(1); -} - -int vorbis_synthesis_restart(vorbis_dsp_state *v){ - vorbis_info *vi=v->vi; - codec_setup_info *ci; - int hs; - - if(!v->backend_state)return -1; - if(!vi)return -1; - ci=vi->codec_setup; - if(!ci)return -1; - hs=ci->halfrate_flag; - - v->centerW=ci->blocksizes[1]>>(hs+1); - v->pcm_current=v->centerW>>hs; - - v->pcm_returned=-1; - v->granulepos=-1; - v->sequence=-1; - v->eofflag=0; - ((private_state *)(v->backend_state))->sample_count=-1; - - return(0); -} - -int vorbis_synthesis_init(vorbis_dsp_state *v,vorbis_info *vi){ - if(_vds_shared_init(v,vi,0)){ - vorbis_dsp_clear(v); - return 1; - } - vorbis_synthesis_restart(v); - return 0; -} - -/* Unlike in analysis, the window is only partially applied for each - block. The time domain envelope is not yet handled at the point of - calling (as it relies on the previous block). */ - -int vorbis_synthesis_blockin(vorbis_dsp_state *v,vorbis_block *vb){ - vorbis_info *vi=v->vi; - codec_setup_info *ci=vi->codec_setup; - private_state *b=v->backend_state; - int hs=ci->halfrate_flag; - int i,j; - - if(!vb)return(OV_EINVAL); - if(v->pcm_current>v->pcm_returned && v->pcm_returned!=-1)return(OV_EINVAL); - - v->lW=v->W; - v->W=vb->W; - v->nW=-1; - - if((v->sequence==-1)|| - (v->sequence+1 != vb->sequence)){ - v->granulepos=-1; /* out of sequence; lose count */ - b->sample_count=-1; - } - - v->sequence=vb->sequence; - - if(vb->pcm){ /* no pcm to process if vorbis_synthesis_trackonly - was called on block */ - int n=ci->blocksizes[v->W]>>(hs+1); - int n0=ci->blocksizes[0]>>(hs+1); - int n1=ci->blocksizes[1]>>(hs+1); - - int thisCenter; - int prevCenter; - - v->glue_bits+=vb->glue_bits; - v->time_bits+=vb->time_bits; - v->floor_bits+=vb->floor_bits; - v->res_bits+=vb->res_bits; - - if(v->centerW){ - thisCenter=n1; - prevCenter=0; - }else{ - thisCenter=0; - prevCenter=n1; - } - - /* v->pcm is now used like a two-stage double buffer. We don't want - to have to constantly shift *or* adjust memory usage. Don't - accept a new block until the old is shifted out */ - - for(j=0;jchannels;j++){ - /* the overlap/add section */ - if(v->lW){ - if(v->W){ - /* large/large */ - const float *w=_vorbis_window_get(b->window[1]-hs); - float *pcm=v->pcm[j]+prevCenter; - float *p=vb->pcm[j]; - for(i=0;iwindow[0]-hs); - float *pcm=v->pcm[j]+prevCenter+n1/2-n0/2; - float *p=vb->pcm[j]; - for(i=0;iW){ - /* small/large */ - const float *w=_vorbis_window_get(b->window[0]-hs); - float *pcm=v->pcm[j]+prevCenter; - float *p=vb->pcm[j]+n1/2-n0/2; - for(i=0;iwindow[0]-hs); - float *pcm=v->pcm[j]+prevCenter; - float *p=vb->pcm[j]; - for(i=0;ipcm[j]+thisCenter; - float *p=vb->pcm[j]+n; - for(i=0;icenterW) - v->centerW=0; - else - v->centerW=n1; - - /* deal with initial packet state; we do this using the explicit - pcm_returned==-1 flag otherwise we're sensitive to first block - being short or long */ - - if(v->pcm_returned==-1){ - v->pcm_returned=thisCenter; - v->pcm_current=thisCenter; - }else{ - v->pcm_returned=prevCenter; - v->pcm_current=prevCenter+ - ((ci->blocksizes[v->lW]/4+ - ci->blocksizes[v->W]/4)>>hs); - } - - } - - /* track the frame number... This is for convenience, but also - making sure our last packet doesn't end with added padding. If - the last packet is partial, the number of samples we'll have to - return will be past the vb->granulepos. - - This is not foolproof! It will be confused if we begin - decoding at the last page after a seek or hole. In that case, - we don't have a starting point to judge where the last frame - is. For this reason, vorbisfile will always try to make sure - it reads the last two marked pages in proper sequence */ - - if(b->sample_count==-1){ - b->sample_count=0; - }else{ - b->sample_count+=ci->blocksizes[v->lW]/4+ci->blocksizes[v->W]/4; - } - - if(v->granulepos==-1){ - if(vb->granulepos!=-1){ /* only set if we have a position to set to */ - - v->granulepos=vb->granulepos; - - /* is this a short page? */ - if(b->sample_count>v->granulepos){ - /* corner case; if this is both the first and last audio page, - then spec says the end is cut, not beginning */ - long extra=b->sample_count-vb->granulepos; - - /* we use ogg_int64_t for granule positions because a - uint64 isn't universally available. Unfortunately, - that means granposes can be 'negative' and result in - extra being negative */ - if(extra<0) - extra=0; - - if(vb->eofflag){ - /* trim the end */ - /* no preceding granulepos; assume we started at zero (we'd - have to in a short single-page stream) */ - /* granulepos could be -1 due to a seek, but that would result - in a long count, not short count */ - - /* Guard against corrupt/malicious frames that set EOP and - a backdated granpos; don't rewind more samples than we - actually have */ - if(extra > (v->pcm_current - v->pcm_returned)<pcm_current - v->pcm_returned)<pcm_current-=extra>>hs; - }else{ - /* trim the beginning */ - v->pcm_returned+=extra>>hs; - if(v->pcm_returned>v->pcm_current) - v->pcm_returned=v->pcm_current; - } - - } - - } - }else{ - v->granulepos+=ci->blocksizes[v->lW]/4+ci->blocksizes[v->W]/4; - if(vb->granulepos!=-1 && v->granulepos!=vb->granulepos){ - - if(v->granulepos>vb->granulepos){ - long extra=v->granulepos-vb->granulepos; - - if(extra) - if(vb->eofflag){ - /* partial last frame. Strip the extra samples off */ - - /* Guard against corrupt/malicious frames that set EOP and - a backdated granpos; don't rewind more samples than we - actually have */ - if(extra > (v->pcm_current - v->pcm_returned)<pcm_current - v->pcm_returned)<pcm_current-=extra>>hs; - } /* else {Shouldn't happen *unless* the bitstream is out of - spec. Either way, believe the bitstream } */ - } /* else {Shouldn't happen *unless* the bitstream is out of - spec. Either way, believe the bitstream } */ - v->granulepos=vb->granulepos; - } - } - - /* Update, cleanup */ - - if(vb->eofflag)v->eofflag=1; - return(0); - -} - -/* pcm==NULL indicates we just want the pending samples, no more */ -int vorbis_synthesis_pcmout(vorbis_dsp_state *v,float ***pcm){ - vorbis_info *vi=v->vi; - - if(v->pcm_returned>-1 && v->pcm_returnedpcm_current){ - if(pcm){ - int i; - for(i=0;ichannels;i++) - v->pcmret[i]=v->pcm[i]+v->pcm_returned; - *pcm=v->pcmret; - } - return(v->pcm_current-v->pcm_returned); - } - return(0); -} - -int vorbis_synthesis_read(vorbis_dsp_state *v,int n){ - if(n && v->pcm_returned+n>v->pcm_current)return(OV_EINVAL); - v->pcm_returned+=n; - return(0); -} - -/* intended for use with a specific vorbisfile feature; we want access - to the [usually synthetic/postextrapolated] buffer and lapping at - the end of a decode cycle, specifically, a half-short-block worth. - This funtion works like pcmout above, except it will also expose - this implicit buffer data not normally decoded. */ -int vorbis_synthesis_lapout(vorbis_dsp_state *v,float ***pcm){ - vorbis_info *vi=v->vi; - codec_setup_info *ci=vi->codec_setup; - int hs=ci->halfrate_flag; - - int n=ci->blocksizes[v->W]>>(hs+1); - int n0=ci->blocksizes[0]>>(hs+1); - int n1=ci->blocksizes[1]>>(hs+1); - int i,j; - - if(v->pcm_returned<0)return 0; - - /* our returned data ends at pcm_returned; because the synthesis pcm - buffer is a two-fragment ring, that means our data block may be - fragmented by buffering, wrapping or a short block not filling - out a buffer. To simplify things, we unfragment if it's at all - possibly needed. Otherwise, we'd need to call lapout more than - once as well as hold additional dsp state. Opt for - simplicity. */ - - /* centerW was advanced by blockin; it would be the center of the - *next* block */ - if(v->centerW==n1){ - /* the data buffer wraps; swap the halves */ - /* slow, sure, small */ - for(j=0;jchannels;j++){ - float *p=v->pcm[j]; - for(i=0;ipcm_current-=n1; - v->pcm_returned-=n1; - v->centerW=0; - } - - /* solidify buffer into contiguous space */ - if((v->lW^v->W)==1){ - /* long/short or short/long */ - for(j=0;jchannels;j++){ - float *s=v->pcm[j]; - float *d=v->pcm[j]+(n1-n0)/2; - for(i=(n1+n0)/2-1;i>=0;--i) - d[i]=s[i]; - } - v->pcm_returned+=(n1-n0)/2; - v->pcm_current+=(n1-n0)/2; - }else{ - if(v->lW==0){ - /* short/short */ - for(j=0;jchannels;j++){ - float *s=v->pcm[j]; - float *d=v->pcm[j]+n1-n0; - for(i=n0-1;i>=0;--i) - d[i]=s[i]; - } - v->pcm_returned+=n1-n0; - v->pcm_current+=n1-n0; - } - } - - if(pcm){ - int i; - for(i=0;ichannels;i++) - v->pcmret[i]=v->pcm[i]+v->pcm_returned; - *pcm=v->pcmret; - } - - return(n1+n-v->pcm_returned); - -} - -const float *vorbis_window(vorbis_dsp_state *v,int W){ - vorbis_info *vi=v->vi; - codec_setup_info *ci=vi->codec_setup; - int hs=ci->halfrate_flag; - private_state *b=v->backend_state; - - if(b->window[W]-1<0)return NULL; - return _vorbis_window_get(b->window[W]-hs); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/books/coupled/res_books_51.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/books/coupled/res_books_51.h deleted file mode 100644 index 93910ff4..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/books/coupled/res_books_51.h +++ /dev/null @@ -1,12274 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2010 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - * - * function: static codebooks for 5.1 surround - * last modified: $Id: res_books_51.h 19057 2014-01-22 12:32:31Z xiphmont $ - * - ********************************************************************/ - -static const long _vq_quantlist__44p0_l0_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44p0_l0_0[] = { - 1, 3, 4, 7, 7, 8, 8, 9, 9, 9,10,10,10, 5, 6, 5, - 8, 7, 9, 8, 9, 9,10, 9,11,10, 5, 5, 7, 7, 8, 8, - 9, 9, 9, 9,10,10,11, 8, 9, 8,10, 9,10, 9,10, 9, - 11,10,11,10, 8, 8, 9, 9,10, 9,10, 9,11,10,11,10, - 11,10,11,11,11,11,11,11,11,11,11,11,11,11,10,11, - 11,11,12,11,11,11,11,11,11,10,12,12,12,12,12,12, - 12,11,12,12,12,11,11,11,12,12,12,12,12,12,12,11, - 12,11,12,11,11,13,12,12,12,13,12,12,12,12,11,12, - 11,11,13,13,13,12,12,12,12,12,12,11,11,11,10,13, - 13,13,12,13,12,13,11,13,10,12,11,11,13,13,12,13, - 12,12,12,12,11,12,11,11,11, -}; - -static const static_codebook _44p0_l0_0 = { - 2, 169, - (char *)_vq_lengthlist__44p0_l0_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44p0_l0_0, - 0 -}; - -static const long _vq_quantlist__44p0_l0_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p0_l0_1[] = { - 1, 4, 4, 6, 6, 5, 5, 5, 7, 5, 5, 5, 5, 6, 7, 7, - 6, 7, 7, 7, 6, 7, 7, 7, 7, -}; - -static const static_codebook _44p0_l0_1 = { - 2, 25, - (char *)_vq_lengthlist__44p0_l0_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p0_l0_1, - 0 -}; - -static const long _vq_quantlist__44p0_l1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p0_l1_0[] = { - 1, 4, 4, 4, 4, 4, 4, 4, 4, -}; - -static const static_codebook _44p0_l1_0 = { - 2, 9, - (char *)_vq_lengthlist__44p0_l1_0, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44p0_l1_0, - 0 -}; - -static const char _huff_lengthlist__44p0_lfe[] = { - 1, 3, 2, 3, -}; - -static const static_codebook _huff_book__44p0_lfe = { - 2, 4, - (char *)_huff_lengthlist__44p0_lfe, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44p0_long[] = { - 2, 3, 6, 7,10,14,16, 3, 2, 5, 7,11,14,17, 6, 5, - 5, 7,10,12,14, 7, 7, 6, 6, 7, 9,13,10,11, 9, 6, - 6, 9,11,15,15,13,10, 9,10,12,18,18,16,14,12,13, - 16, -}; - -static const static_codebook _huff_book__44p0_long = { - 2, 49, - (char *)_huff_lengthlist__44p0_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p0_p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p0_p1_0[] = { - 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44p0_p1_0 = { - 5, 243, - (char *)_vq_lengthlist__44p0_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p0_p1_0, - 0 -}; - -static const long _vq_quantlist__44p0_p2_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p0_p2_0[] = { - 1, 5, 5, 0, 7, 7, 0, 8, 8, 0, 9, 9, 0,12,12, 0, - 8, 8, 0, 9, 9, 0,12,12, 0, 8, 8, 0, 6, 6, 0,11, - 11, 0,12,12, 0,12,12, 0,15,15, 0,11,11, 0,12,12, - 0,15,15, 0,12,12, 0, 5, 5, 0, 5, 5, 0, 6, 6, 0, - 7, 7, 0,11,11, 0, 6, 6, 0, 7, 7, 0,10,11, 0, 6, - 6, 0, 7, 7, 0,11,11, 0,12,12, 0,11,11, 0,15,15, - 0,10,10, 0,12,12, 0,15,15, 0,12,12, 0, 6, 6, 0, - 12,12, 0,12,12, 0,12,12, 0,15,15, 0,11,11, 0,12, - 12, 0,15,15, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 8, 8, 0,12,12, 0,12,12, 0,12,12, 0,15, - 15, 0,12,12, 0,11,12, 0,15,16, 0,11,11, 0, 6, 6, - 0,11,12, 0,12,12, 0,12,12, 0,16,15, 0,12,12, 0, - 13,12, 0,15,14, 0,12,12, 0, 0, 0, 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 static_codebook _44p0_p2_0 = { - 5, 243, - (char *)_vq_lengthlist__44p0_p2_0, - 1, -533200896, 1614282752, 2, 0, - (long *)_vq_quantlist__44p0_p2_0, - 0 -}; - -static const long _vq_quantlist__44p0_p2_1[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p0_p2_1[] = { - 1, 3, 3, 0, 9, 9, 0, 9, 9, 0,10,10, 0, 9, 9, 0, - 10,10, 0,10,10, 0, 9, 9, 0,10,10, 0, 7, 7, 0, 7, - 7, 0, 6, 6, 0, 8, 8, 0, 7, 7, 0, 8, 8, 0, 8, 9, - 0, 8, 8, 0, 8, 8, 0, 7, 7, 0, 9, 9, 0, 8, 8, 0, - 10,10, 0, 9, 9, 0,10,10, 0,10,10, 0, 9, 9, 0,10, - 10, 0, 9, 9, 0,11,11, 0,11,11, 0,12,12, 0,11,11, - 0,12,12, 0,13,13, 0,12,12, 0,13,12, 0, 8, 8, 0, - 12,12, 0,12,12, 0,13,13, 0,12,12, 0,13,13, 0,13, - 13, 0,13,13, 0,13,13, 0, 7, 7, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 9, 0,11,11, 0,12,12, 0,13,13, 0,12, - 12, 0,13,13, 0,13,13, 0,12,12, 0,12,12, 0, 8, 8, - 0,12,12, 0,12,12, 0,13,13, 0,13,13, 0,13,14, 0, - 14,13, 0,13,13, 0,13,13, 0, 7, 7, 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 static_codebook _44p0_p2_1 = { - 5, 243, - (char *)_vq_lengthlist__44p0_p2_1, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p0_p2_1, - 0 -}; - -static const long _vq_quantlist__44p0_p3_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p0_p3_0[] = { - 1, 6, 6, 7, 8, 8, 7, 8, 8, 7, 9, 9,10,12,11, 9, - 8, 8, 7, 9, 9,11,12,12, 9, 9, 9, 6, 7, 7,10,11, - 11,10,11,11,10,11,11,13,13,14,12,12,12,11,11,11, - 14,14,14,12,12,12, 6, 5, 5, 9, 6, 5, 9, 6, 6, 9, - 7, 7,12,10,10,11, 6, 6,10, 7, 7,13,10,10,12, 7, - 7, 7, 8, 8,12,10,10,12,10,10,11,10,10,15,13,13, - 13, 9, 9,12,11,11,16,13,13,15,11,11, 8, 7, 7,12, - 12,12,12,11,11,12,11,11,14,14,14,14,12,12,12,12, - 12,16,15,15,14,12,12, 0,10,10, 0,12,12, 0,12,12, - 0,11,11, 0,14,14, 0,11,11, 0,12,12, 0,15,15, 0, - 11,11, 8, 8, 8,13,11,11,13,10,10,13,11,11,15,13, - 13,14,11,11,12,10,10,16,14,14,14,10,10, 9, 7, 7, - 13,11,11,13,11,11,12,11,11,16,14,14,14,12,12,13, - 12,12,15,14,14,15,13,12, 0,11,11, 0,12,12, 0,12, - 12, 0,12,12, 0,15,15, 0,12,12, 0,13,12, 0,14,15, - 0,12,12, -}; - -static const static_codebook _44p0_p3_0 = { - 5, 243, - (char *)_vq_lengthlist__44p0_p3_0, - 1, -531365888, 1616117760, 2, 0, - (long *)_vq_quantlist__44p0_p3_0, - 0 -}; - -static const long _vq_quantlist__44p0_p3_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p0_p3_1[] = { - 2, 4, 4, 8, 8,10,12,12,11,11, 9,11,11,12,13,11, - 12,12,11,11,11,12,12,12,12,10,13,12,13,13,11,12, - 12,13,13,11,12,12,13,13,11,12,13,13,13,11,13,13, - 13,13,10,13,13,12,13,11,12,12,14,14,11,13,12,12, - 12,11,12,12,13,13,11,13,13,12,12,11,13,13,13,13, - 11,12,12,13,13,11,13,13,12,12,11,12,12,13,13,11, - 13,13,12,12,11,13,13,13,13,11,12,12,14,14,11,13, - 13,12,12,11,12,12,13,13,11,13,13,12,12,11,10,10, - 10,10,12,10,10,11,11,11, 8, 8,11,11,13,10,10,10, - 10,12,10,10,10,10,13,11,11,11,11,13,10,10,11,11, - 13,11,11,12,12,13,11,11,11,11,13,11,11,12,12,13, - 11,11,12,12,13,10,10,11,11,13,11,11,11,11,13,11, - 10,11,11,13,11,11,11,11,13,11,11,11,11,13,10,10, - 11,11,13,11,11,11,11,12,10,11,11,11,13,11,11,11, - 11,13,11,11,11,11,13,10,10,11,11,13,11,11,11,11, - 13,11,11,11,11,13,11,11,11,11,11,10,10,10,10,12, - 10,10, 9, 9,12,12,12,11,11,13,12,12, 9, 9,13,12, - 12,10,10,12,12,12,12,12,13,13,13,14,14,13,12,12, - 11,11,13,13,13,12,12,13,12,12,11,11,13,12,13,11, - 11,13,13,13,14,14,13,12,12,10,10,13,13,13,11,11, - 13,12,12,10,10,13,13,13,11,11,13,13,13,14,14,13, - 12,12,10,10,13,13,13,11,11,13,12,13,10,10,13,13, - 13,11,11,13,13,13,14,14,13,12,12,10,10,13,13,13, - 11,11,13,13,12,10,10,14,12,12, 8, 8,14,12,12, 9, - 9,14,11,11, 9, 9,14,12,12, 8, 8,14,11,11, 7, 7, - 14,13,13,10,10,15,12,12,10,10,15,13,13,10,10,15, - 12,12, 9, 9,15,13,13,10,10,15,13,13,10,10,15,12, - 12,10,10,15,13,13,10,10,14,12,12, 9, 9,14,13,13, - 9, 9,14,13,13, 9, 9,15,12,12, 9, 9,15,13,13, 9, - 9,14,12,12, 9, 9,14,13,13, 9, 9,14,13,13, 9, 9, - 15,12,12, 9, 9,14,13,13, 9, 9,14,12,12, 9, 9,14, - 13,13, 9, 9,13,12,12, 8, 8,13,13,13, 8, 8,14,13, - 13, 9, 9,13,13,13, 7, 7,14,13,13, 8, 8,14,14,14, - 10,10,14,14,14,11,11,14,14,14, 9, 9,14,14,14,10, - 10,14,14,14, 9, 9,14,14,14,10, 9,15,14,14,11,11, - 14,14,14, 9, 9,14,14,14,10,10,14,14,14, 9, 9,14, - 14,14, 9, 9,15,14,14,11,11,14,14,14, 8, 8,14,14, - 14, 9, 9,14,14,14, 8, 8,14,14,14, 9, 9,15,14,14, - 11,11,14,14,14, 8, 8,14,14,14, 9, 9,14,14,14, 8, - 8,12,12,12,13,13,16,15,15,11,11,16,15,16,12,12, - 17,16,16,11,11,17,15,15,12,11,16,16,16,12,13,16, - 15,15,13,13,16,16,16,12,12,16,16,15,13,13,16,16, - 16,12,12,16,16,16,13,13,17,16,16,14,14,17,17,16, - 12,12,17,16,16,13,13,17,17,16,12,13,16,16,17,13, - 12,17,16,16,14,13,17,16,16,12,12,17,16,16,12,12, - 17,16,17,12,12,17,17,17,13,13,16,16,16,13,14,17, - 17,16,12,12,16,16,16,13,13,17,17,17,12,12,13,14, - 14,10,10,16,14,14,12,12,16,15,15,14,14,16,14,14, - 12,12,15,14,14,13,13,17,15,15,14,13,16,16,15,15, - 15,16,15,15,14,14,16,15,15,14,14,17,15,15,14,14, - 16,15,15,14,14,16,16,15,15,15,17,15,15,13,13,16, - 15,15,14,14,17,15,15,13,13,17,15,15,14,14,16,15, - 15,15,15,16,14,14,13,13,16,15,15,14,14,16,14,14, - 13,13,17,15,15,14,14,16,16,15,15,15,17,14,14,13, - 13,16,15,15,14,14,17,14,14,13,13,13,11,11,10,10, - 16,14,14,13,13,15,14,14,13,13,16,14,14,12,12,16, - 14,14,12,12,15,15,15,14,14,16,14,14,14,14,16,15, - 14,14,14,16,14,14,14,14,16,15,15,14,13,16,15,15, - 14,14,16,14,14,14,14,17,15,15,14,14,16,14,14,14, - 14,16,15,15,13,14,16,15,15,14,14,16,14,14,14,14, - 16,15,15,13,13,16,14,14,13,13,16,15,15,13,13,16, - 15,15,14,14,16,14,14,14,14,17,15,15,13,13,16,15, - 14,13,13,17,15,15,13,13,14,14,14, 9, 9,14,14,14, - 17,17,14,15,15,18,18,14,14,14,18,19,14,14,14,18, - 18,15,15,15,19,18,15,16,15,18,20,15,15,15,18,19, - 15,15,15,19,19,15,15,15,18,20,15,15,15,18,19,15, - 15,16,20,18,15,15,15,18,18,15,15,15,19,19,15,15, - 15,18,19,15,15,15,18,19,15,15,15,19,19,14,15,14, - 19,19,15,15,15,20,19,15,14,14,19,18,14,15,15,18, - 19,15,15,16,20,20,14,14,14,18,19,15,15,15,19,18, - 14,14,14,18,18,14,12,12, 9, 9,13,14,14,18,18,14, - 13,13,18,19,14,14,14,18,18,14,14,14,18,18,15,15, - 15,19,19,15,14,14,19,18,14,15,15,19,18,15,14,14, - 18,18,15,15,15,19,18,14,15,15,19,19,15,14,14,19, - 18,14,15,15,19,18,15,14,14,19,18,14,15,15,19,18, - 15,15,15,21,18,15,14,14,19,18,14,15,15,18,19,14, - 15,14,20,19,14,15,15,18,19,14,15,15,19,19,15,14, - 14,19,20,14,15,15,18,18,14,14,14,19,19,14,15,15, - 19,18,12,12,12,13,13,16,15,15,11,11,16,15,15,12, - 12,16,16,16,11,11,16,15,15,11,11,16,16,16,13,13, - 17,16,16,13,13,17,17,17,12,12,16,16,16,13,13,17, - 16,17,13,12,15,16,16,12,12,16,15,15,13,13,17,16, - 16,12,12,16,16,15,12,12,16,16,16,12,12,17,17,16, - 13,12,16,16,16,13,13,17,16,16,12,12,17,16,16,12, - 12,17,17,16,12,12,16,17,16,12,12,17,15,15,13,13, - 17,16,16,12,12,16,16,16,12,12,16,16,16,12,12,13, - 13,13, 9, 9,15,14,14,13,13,16,15,14,14,14,16,14, - 14,13,13,15,14,14,13,13,17,15,15,14,14,16,15,15, - 15,15,16,15,15,14,14,16,15,15,15,15,17,15,15,14, - 14,16,15,15,14,14,16,15,15,15,15,17,14,15,14,14, - 16,15,15,14,14,17,15,15,13,14,17,15,15,14,14,16, - 15,15,15,15,17,14,14,13,13,16,15,15,14,14,17,14, - 14,13,13,17,15,15,14,14,16,15,16,15,15,17,14,14, - 13,13,16,15,15,14,14,18,14,14,13,13,13,11,11,11, - 11,15,14,14,12,12,15,14,14,13,13,16,14,14,12,12, - 16,13,14,12,12,16,15,15,13,13,16,14,14,14,14,16, - 15,15,13,13,16,14,14,13,13,16,14,15,13,13,15,15, - 15,13,13,16,14,14,14,13,16,14,14,13,13,16,14,14, - 13,13,16,15,15,13,13,16,15,15,13,13,16,14,14,14, - 14,16,15,15,12,12,16,14,14,13,13,16,15,15,12,12, - 16,15,15,13,13,16,14,14,14,14,17,15,14,12,12,16, - 14,14,13,13,16,15,15,12,12,14,14,14, 8, 8,14,14, - 14,17,18,14,15,15,17,18,14,14,14,17,18,14,14,14, - 18,18,14,15,15,18,18,14,16,15,19,19,15,15,15,18, - 19,15,16,15,20,19,15,15,15,18,18,14,15,15,18,19, - 15,16,16,20,19,15,15,15,19,17,14,15,15,20,18,14, - 15,15,18,18,14,15,15,18,19,14,15,15,19,20,14,14, - 14,18,18,14,15,15,18,19,14,14,14,18,19,14,15,15, - 19,18,15,16,16,20,21,14,14,15,19,19,14,15,15,19, - 19,14,14,14,19,18,13,12,12, 9, 9,13,14,14,18,19, - 14,14,14,18,19,14,14,14,18,18,14,14,14,18,18,14, - 15,15,19,19,15,14,14,19,18,15,15,15,19,19,15,14, - 14,19,20,14,15,15,18,19,14,15,15,20,18,15,14,14, - 18,18,14,15,15,18,18,14,14,14,19,19,14,15,15,18, - 18,14,15,15,19,18,15,14,14,19,19,14,15,15,19,18, - 15,14,14,19,18,14,14,15,18,19,14,15,15,19,18,15, - 14,14,18,19,14,15,14,19,20,14,14,14,19,19,14,15, - 15,19,19,12,12,12,13,13,16,16,16,11,11,16,16,16, - 12,12,17,16,16,11,11,17,15,15,11,11,16,16,16,13, - 13,17,15,16,13,13,16,16,16,12,12,17,16,16,13,13, - 17,17,16,12,12,17,17,16,13,13,17,16,16,13,13,17, - 17,17,12,12,17,16,16,13,13,17,17,17,12,12,16,16, - 16,12,12,17,15,15,13,13,17,16,16,11,11,17,16,16, - 12,12,16,16,16,11,11,16,17,16,12,12,17,16,16,13, - 13,17,17,16,12,12,17,17,16,12,12,17,16,16,11,11, - 13,14,14, 9, 9,16,14,14,13,13,16,14,15,14,14,16, - 14,14,12,12,16,14,14,13,13,17,15,15,14,14,16,15, - 15,15,15,17,15,15,14,14,16,15,15,14,14,17,15,15, - 14,14,16,15,15,14,14,16,15,15,15,16,17,14,15,14, - 14,16,15,15,14,14,17,15,15,14,14,16,15,15,14,14, - 16,15,15,15,15,17,14,14,13,13,16,15,15,14,14,16, - 14,14,13,13,17,15,15,14,14,16,16,15,15,15,17,14, - 14,13,13,16,15,15,14,14,17,14,14,13,13,13,11,11, - 10,10,16,14,14,12,12,15,13,13,13,12,16,14,14,11, - 11,16,14,14,11,11,16,14,15,13,14,16,14,14,13,13, - 16,15,15,13,13,16,14,14,13,13,16,15,15,13,13,16, - 15,15,13,13,17,14,14,14,14,17,15,15,13,13,16,14, - 15,13,13,16,15,15,13,13,16,15,15,13,13,16,14,14, - 13,13,17,15,15,12,12,16,14,14,12,12,16,15,15,12, - 12,16,15,15,13,13,16,14,14,13,13,17,15,15,12,12, - 17,14,14,12,12,16,15,15,12,12,13,14,14, 8, 8,13, - 14,14,18,18,13,15,15,17,18,14,14,14,18,19,14,14, - 14,19,18,14,15,15,19,18,15,15,16,21,18,15,15,15, - 19,19,14,16,16,19,19,14,15,15,18,19,14,15,15,19, - 20,14,16,16,19,18,15,15,15,18,19,14,15,15,19,18, - 15,15,15,18,18,15,15,15,20,18,15,16,16,20,19,14, - 15,14,18,19,14,15,16,19,20,14,15,15,19,18,15,15, - 15,19,18,15,16,16,20,19,15,14,14,18,18,14,15,15, - 19,19,14,15,15,18,18,13,12,12, 8, 8,13,14,14,19, - 18,14,13,13,20,18,14,14,14,19,18,14,13,13,18,19, - 14,15,15,20,19,15,14,14,19,19,14,15,15,19,18,15, - 14,14,20,20,15,15,15,19,18,14,15,15,19,18,15,14, - 14,19,18,14,15,15,20,19,14,14,14,20,19,14,15,15, - 19,18,15,15,15,18,18,15,14,14,18,18,14,15,15,19, - 19,14,14,14,19,19,14,15,15,19,19,15,15,15,19,18, - 15,14,14,20,19,15,15,15,19,19,14,14,14,20,19,14, - 15,15,20,20,12,12,12,13,13,17,16,16,11,11,16,16, - 15,12,12,17,16,16,11,11,17,15,15,11,11,17,17,17, - 13,13,17,16,16,13,13,17,17,17,12,12,17,16,16,13, - 13,17,17,16,12,13,16,17,16,13,13,17,16,15,13,13, - 17,16,16,12,12,17,16,16,12,13,17,16,17,12,12,17, - 17,17,12,12,17,16,15,13,13,17,16,16,12,12,17,16, - 16,12,12,17,16,16,11,11,16,16,16,12,12,17,15,15, - 13,13,17,16,15,11,11,16,16,16,12,12,17,16,16,11, - 11,13,14,14, 9, 9,16,14,14,13,13,16,14,15,14,14, - 16,14,14,12,12,16,14,14,13,13,17,15,15,14,15,16, - 15,15,15,15,17,15,15,14,14,16,15,15,15,14,16,15, - 15,14,14,16,15,15,14,14,16,15,16,15,15,17,15,14, - 14,14,16,15,15,14,14,17,15,15,13,13,16,15,15,14, - 14,16,16,16,15,15,17,14,14,13,13,16,15,15,14,14, - 18,14,15,13,13,16,15,15,14,14,16,16,15,15,15,16, - 14,14,13,13,16,15,15,14,14,17,14,15,13,13,13,11, - 11,10,10,15,14,14,12,12,15,14,14,13,13,16,14,14, - 12,12,16,13,14,12,12,16,14,15,14,13,16,14,14,14, - 14,16,15,15,13,13,16,14,14,13,13,16,15,15,13,13, - 15,15,15,13,13,16,14,14,14,14,17,15,15,13,13,16, - 14,14,13,13,16,15,15,13,13,16,15,15,13,13,16,14, - 14,13,13,17,15,15,12,12,16,14,14,12,12,16,14,15, - 12,12,16,15,15,13,13,16,14,14,13,13,17,15,15,12, - 12,16,14,14,12,12,16,15,15,12,12,14,14,14, 8, 8, - 14,14,14,17,17,14,15,15,18,18,14,14,14,18,17,14, - 14,14,18,18,14,15,15,18,20,15,16,15,19,18,15,15, - 15,19,18,15,15,16,19,18,15,15,15,18,18,14,15,15, - 18,18,15,16,16,18,19,15,15,15,18,18,15,15,15,19, - 20,15,15,15,18,18,15,15,15,18,18,15,16,16,19,19, - 15,14,15,19,19,15,15,15,19,20,14,14,15,18,18,15, - 15,15,19,19,15,16,16,19,19,15,15,14,18,19,15,15, - 15,20,20,15,15,14,18,18,13,12,12, 8, 8,13,14,14, - 18,18,14,14,14,18,18,14,14,14,18,20,14,14,14,18, - 18,14,15,15,19,18,15,14,14,18,19,15,15,15,18,19, - 15,14,14,18,19,15,15,15,18,18,14,15,14,18,19,15, - 14,14,21,19,15,15,15,19,18,14,14,14,19,18,14,15, - 15,19,18,15,15,15,20,19,15,14,14,20,18,14,15,15, - 18,19,14,14,14,19,18,14,15,15,18,19,15,15,15,18, - 19,15,14,14,19,19,15,15,15,19,19,14,14,14,19,20, - 14,15,15,18,19, -}; - -static const static_codebook _44p0_p3_1 = { - 5, 3125, - (char *)_vq_lengthlist__44p0_p3_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p0_p3_1, - 0 -}; - -static const long _vq_quantlist__44p0_p4_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p0_p4_0[] = { - 2, 6, 6,14,14, 6, 8, 8,14,14, 7, 7, 7,14,14, 0, - 13,13,15,16, 0,13,13,15,15, 7, 8, 8,15,15, 9,10, - 10,16,16, 9, 8, 8,14,15, 0,13,13,17,17, 0,13,13, - 16,16, 8, 8, 8,15,15,12,11,11,16,16, 9, 8, 8,14, - 14, 0,13,13,17,17, 0,13,13,15,15, 0,14,14,16,16, - 0, 0, 0,18,19, 0,12,12,16,15, 0,16,16, 0,20, 0, - 14,14,16,16, 0,14,14,17,17, 0, 0, 0,19,19, 0,12, - 12,15,15, 0,18,17,21,21, 0,14,14,16,16, 5, 7, 7, - 12,13, 9,10, 9,14,14,11,10,10,14,14, 0, 0, 0,18, - 17, 0,20,21,18,18, 9,10,10,14,14,12,12,12,17,16, - 12,10,10,14,14, 0,20,20,18,17, 0,21,21,17,17,11, - 10,10,14,14,15,13,13,18,18,13,11,11,14,14, 0,20, - 0,18,18, 0,20,21,18,17, 0,21, 0,18,19, 0, 0, 0, - 0,21, 0,21,20,16,17, 0, 0, 0,21,21, 0, 0, 0,20, - 18, 0,20, 0,17,18, 0, 0, 0, 0, 0, 0, 0,20,16,17, - 0, 0, 0,20, 0, 0, 0, 0,18,18, 6, 6, 6,13,13, 8, - 5, 5,11,11, 9, 6, 6,13,13, 0, 9, 9,12,12, 0,10, - 10,14,14, 9, 7, 7,13,13,12, 9, 9,13,13,10, 6, 6, - 13,13, 0,10,10,14,14, 0,10,10,13,13, 9, 7, 7,13, - 13,13,10,10,13,13,11, 6, 6,13,13, 0,10,10,15,15, - 0,10,10,13,13, 0,12,11,15,15, 0,20,19,17,16, 0, - 9, 9,13,13, 0,13,13,20,19, 0,11,11,13,13, 0,11, - 11,15,15, 0,20,19,17,17, 0,10,10,13,13, 0,14,15, - 0,21, 0,12,12,13,13, 0,10,10,12,12, 0,11,11,15, - 15, 0,11,11,15,15, 0,15,15,20,20, 0,16,16, 0, 0, - 0,11,11,15,15, 0,14,14,17,17, 0,11,11,15,15, 0, - 15,15,20,21, 0,16,16,21,21, 0,12,12,15,15, 0,15, - 15,18,20, 0,11,11,16,15, 0,15,15,21,21, 0,16,16, - 0,21, 0,16,16, 0, 0, 0, 0, 0, 0, 0, 0,14,14,21, - 21, 0,17,18, 0, 0, 0,16,17,20, 0, 0,16,16, 0, 0, - 0, 0, 0, 0, 0, 0,15,15,20,20, 0,19,18, 0,21, 0, - 18,17, 0, 0, 0,10,10,11,11, 0,10,10,10,10, 0,11, - 11,12,12, 0,11,11, 9, 9, 0,13,13,12,12, 0,11,11, - 12,12, 0,13,13,12,12, 0,10,10,12,12, 0,12,12,13, - 13, 0,12,12,12,12, 0,11,11,12,12, 0,13,13,12,12, - 0,10,10,12,12, 0,13,13,13,13, 0,12,12,12,12, 0, - 14,13,13,13, 0,19,21,15,15, 0,12,11,12,12, 0,16, - 15,19,19, 0,13,13,11,11, 0,13,13,13,13, 0, 0,21, - 15,16, 0,12,12,12,12, 0,16,16,19,21, 0,13,13,12, - 12, 7, 7, 7,16,16,11, 9, 9,16,16,12, 9, 9,16,16, - 0,13,13,16,16, 0,14,14,17,16,11, 9, 9,16,16,14, - 12,11,17,17,13, 8, 9,15,15, 0,13,13,19,19, 0,13, - 13,16,15,12,10,10,17,17,15,12,12,19,18,14, 9, 9, - 17,16, 0,14,14,18, 0, 0,14,13,16,16, 0,14,15,18, - 17, 0,21, 0,19,21, 0,12,12,16,16, 0,16,16, 0, 0, - 0,14,14,16,16, 0,14,14,18,18, 0, 0,21,20, 0, 0, - 13,13,16,17, 0,18,18, 0, 0, 0,15,14,17,16, 8, 7, - 7,14,14,11,10,10,15,15,13,10,10,15,15, 0,21,20, - 19,19, 0,21, 0,17,18,11,10,10,15,16,14,12,12,18, - 18,14,11,11,15,14, 0,21,20,18,19, 0, 0,21,18,18, - 12,11,11,16,16,16,14,14,18,20,14,11,11,16,15, 0, - 20,20,19,19, 0, 0,20,18,18, 0,21, 0,18,19, 0, 0, - 0, 0, 0, 0,20,20,17,18, 0, 0, 0,20,20, 0, 0, 0, - 19,19, 0, 0, 0,20,18, 0, 0, 0, 0, 0, 0, 0,21,18, - 18, 0,21,21, 0,21, 0, 0, 0,19,20,11, 9, 9,14,14, - 13,10,10,14,14,13,11,11,15,15, 0,13,13,13,13, 0, - 14,14,16,16,13,11,11,15,15,16,12,12,15,15,14,10, - 10,14,14, 0,14,14,16,16, 0,14,14,15,15,13,10,10, - 15,15,17,13,14,15,16,15,10,10,15,15, 0,14,14,17, - 16, 0,14,14,15,15, 0,15,15,17,17, 0, 0,21,18,18, - 0,13,13,15,15, 0,16,16,21,20, 0,14,14,15,14, 0, - 15,14,16,17, 0, 0,20,20,19, 0,13,13,15,15, 0,19, - 18, 0, 0, 0,15,15,15,15, 0,11,11,14,14, 0,12,12, - 16,16, 0,12,12,16,16, 0,15,16,21,21, 0,16,17,21, - 0, 0,12,12,17,16, 0,14,14,18,19, 0,11,11,16,16, - 0,15,15,20,21, 0,16,16,21, 0, 0,12,12,17,16, 0, - 15,15,19,19, 0,12,12,16,17, 0,16,15, 0, 0, 0,16, - 16, 0, 0, 0,17,17, 0,21, 0, 0, 0, 0, 0, 0,14,15, - 20, 0, 0,17,17, 0, 0, 0,17,17, 0, 0, 0,17,16, 0, - 0, 0, 0, 0, 0, 0, 0,15,15, 0, 0, 0,18,18, 0, 0, - 0,18,17, 0, 0, 0,11,11,14,14, 0,12,12,15,15, 0, - 12,12,15,15, 0,13,13,14,14, 0,14,14,17,17, 0,12, - 12,16,16, 0,14,14,16,16, 0,11,11,15,15, 0,13,13, - 16,17, 0,13,13,16,16, 0,12,12,15,15, 0,14,14,17, - 16, 0,11,11,15,15, 0,14,14,17,17, 0,13,13,16,16, - 0,15,15,17,18, 0,21,20,20,21, 0,12,12,15,15, 0, - 16,16,20,21, 0,14,14,15,15, 0,14,14,17,17, 0, 0, - 0,18,19, 0,12,13,15,15, 0,18,17,21, 0, 0,14,15, - 15,15, 8, 8, 8,16,16,12,10,10,16,16,13, 9, 9,16, - 16, 0,14,14,18,17, 0,14,14,16,17,12,10,10,18,17, - 14,12,11,18,18,14, 9, 9,16,16, 0,13,13,18,18, 0, - 13,13,17,16,12, 9, 9,16,17,17,13,13,17,17,14, 9, - 9,15,15, 0,14,14,20,19, 0,13,13,16,16, 0,15,15, - 19,18, 0, 0, 0,20,19, 0,12,13,17,17, 0,16,16,20, - 0, 0,14,14,16,17, 0,14,14,19,18, 0, 0, 0,20,20, - 0,13,13,16,16, 0,18,17, 0, 0, 0,15,15,16,16, 9, - 7, 7,14,14,12,10,10,15,15,13,10,10,15,15, 0,21, - 0,18,19, 0,20,21,19,18,12,10,10,16,15,15,13,13, - 18,18,14,11,11,15,15, 0, 0, 0,19,18, 0, 0,21,18, - 18,13,11,11,15,15,16,14,14,17,19,15,11,11,15,15, - 0,21,21,20,18, 0, 0,21,18,18, 0, 0,21,21,19, 0, - 0, 0, 0, 0, 0,19,20,18,17, 0, 0, 0,21,21, 0,21, - 0,20,18, 0, 0,21,19,19, 0, 0, 0, 0, 0, 0,20,21, - 17,17, 0, 0, 0, 0, 0, 0,21, 0,18,20, 0,10,10,14, - 14, 0,11,11,15,15, 0,11,11,15,15, 0,14,14,15,15, - 0,15,15,16,16, 0,11,12,16,16, 0,13,13,16,16, 0, - 11,11,15,15, 0,14,14,17,17, 0,14,14,15,15, 0,11, - 11,16,15, 0,14,14,15,15, 0,11,11,15,15, 0,15,15, - 17,17, 0,14,14,15,15, 0,16,16,18,18, 0, 0, 0,20, - 19, 0,14,13,16,15, 0,17,17,21, 0, 0,15,15,15,15, - 0,16,15,17,16, 0,20, 0,20,18, 0,13,14,15,15, 0, - 19,18, 0,21, 0,15,15,15,15, 0,11,11,14,14, 0,12, - 12,16,16, 0,12,12,16,16, 0,16,15,20,21, 0,17,16, - 0, 0, 0,12,12,16,16, 0,14,14,18,18, 0,11,11,16, - 16, 0,15,15,21,20, 0,16,16, 0, 0, 0,12,12,16,17, - 0,15,14,19,19, 0,11,12,16,16, 0,15,15,21, 0, 0, - 16,16, 0, 0, 0,16,17, 0, 0, 0, 0, 0, 0, 0, 0,15, - 15,21, 0, 0,17,17, 0, 0, 0,17,17, 0, 0, 0,17,16, - 0, 0, 0, 0, 0, 0, 0, 0,15,15, 0,20, 0,19,20, 0, - 0, 0,17,17, 0, 0, 0,12,12,15,15, 0,12,12,15,15, - 0,12,12,16,16, 0,13,13,15,15, 0,15,15,17,17, 0, - 13,13,17,16, 0,14,14,17,17, 0,11,11,16,16, 0,14, - 14,17,17, 0,13,13,16,16, 0,12,12,16,16, 0,15,15, - 16,17, 0,11,11,15,16, 0,14,14,17,17, 0,13,14,16, - 16, 0,15,15,18,18, 0,21,20,20,19, 0,13,13,16,17, - 0,16,16, 0, 0, 0,14,14,16,16, 0,15,15,18,18, 0, - 0, 0,20,19, 0,13,13,16,16, 0,17,17, 0, 0, 0,14, - 14,16,16, 0,11,11,16,16, 0,13,13,18,17, 0,13,13, - 17,17, 0,16,16,17,17, 0,16,16,17,18, 0,12,12,17, - 17, 0,15,15,18,18, 0,12,12,16,16, 0,16,16,19,19, - 0,15,15,16,17, 0,12,12,17,17, 0,17,17,18,18, 0, - 12,12,17,17, 0,16,16,19,19, 0,15,16,17,17, 0,16, - 16,18,17, 0, 0, 0,21,21, 0,13,13,16,16, 0,17,17, - 0,20, 0,15,15,16,17, 0,16,16,19,18, 0, 0,21,20, - 21, 0,14,14,17,16, 0,20, 0, 0, 0, 0,15,16,16,17, - 0, 9, 9,14,14, 0,13,13,16,16, 0,14,14,15,15, 0, - 0,20,19,19, 0, 0, 0,19,19, 0,12,12,15,15, 0,15, - 16,19,18, 0,14,14,15,15, 0,21, 0,18,18, 0,20, 0, - 17,18, 0,13,13,16,16, 0,17,17,17,19, 0,14,14,16, - 15, 0,21,20,20,19, 0, 0, 0,19,19, 0, 0, 0,19,18, - 0, 0, 0, 0, 0, 0,20,20,17,18, 0, 0, 0,21,21, 0, - 0, 0,18,18, 0,21, 0,18,19, 0, 0, 0, 0, 0, 0,20, - 21,18,18, 0, 0, 0,20,21, 0, 0, 0,19,19, 0,18,18, - 15,15, 0,20,21,17,17, 0,19,21,17,17, 0, 0, 0,17, - 18, 0, 0, 0,20,19, 0,19,19,17,17, 0, 0, 0,18,18, - 0,19,20,16,17, 0, 0,21,20,20, 0,19,20,19,18, 0, - 19,20,16,16, 0, 0, 0,18,19, 0,19,20,17,17, 0, 0, - 21, 0,20, 0,21,21,17,19, 0,20, 0,19,20, 0, 0, 0, - 20, 0, 0,19,18,17,16, 0, 0, 0, 0, 0, 0, 0,20,17, - 17, 0,20,21,18,20, 0, 0, 0, 0,21, 0,19,20,17,17, - 0, 0, 0, 0, 0, 0,20,21,17,17, 0,11,11,14,14, 0, - 13,13,16,17, 0,13,13,16,16, 0,17,17, 0,21, 0,18, - 17,21, 0, 0,13,13,16,16, 0,15,15,18,18, 0,12,12, - 16,16, 0,17,16,21, 0, 0,17,17, 0, 0, 0,12,12,17, - 17, 0,17,17,19,21, 0,13,12,16,16, 0,17,17, 0, 0, - 0,17,17, 0, 0, 0,18,17, 0,21, 0, 0, 0, 0, 0, 0, - 15,15,20, 0, 0,20,18, 0, 0, 0,17,18, 0, 0, 0,16, - 17, 0, 0, 0, 0, 0, 0, 0, 0,15,15, 0, 0, 0,19,19, - 0, 0, 0,18,18, 0, 0, 0,14,14,18,18, 0,16,16, 0, - 21, 0,16,16,21,21, 0,17,17, 0,20, 0,17,17,20, 0, - 0,16,15, 0, 0, 0,20,20, 0, 0, 0,15,15,20,20, 0, - 17,17,21, 0, 0,17,18,20,20, 0,15,15,20,20, 0,18, - 18, 0, 0, 0,15,15,19,20, 0,17,18, 0, 0, 0,17,17, - 20,20, 0,18,17,21, 0, 0, 0, 0, 0,21, 0,15,15,20, - 20, 0,19,19, 0, 0, 0,17,17,21, 0, 0,17,17, 0, 0, - 0, 0, 0,21, 0, 0,15,15,19,19, 0,20,21, 0, 0, 0, - 18,17,21,21, 0,12,12,16,16, 0,14,14,17,17, 0,13, - 13,17,18, 0,16,16,18,17, 0,16,16,18,18, 0,13,13, - 18,18, 0,15,16,19,18, 0,13,13,16,16, 0,16,16,20, - 18, 0,16,16,17,17, 0,12,13,17,17, 0,17,16,18,18, - 0,12,12,16,16, 0,17,16,20,19, 0,16,16,16,16, 0, - 16,17,18,20, 0, 0, 0,21,20, 0,14,14,17,16, 0,19, - 18, 0,20, 0,16,16,17,16, 0,16,16,17,18, 0, 0,21, - 21,21, 0,14,14,16,16, 0,20,20,21, 0, 0,16,16,16, - 16, 0,10,10,14,14, 0,14,14,15,16, 0,14,14,15,15, - 0, 0,21,18,18, 0, 0,21,18,19, 0,13,13,16,16, 0, - 16,16,18,18, 0,14,14,15,15, 0,21, 0,18,18, 0,21, - 0,18,18, 0,13,13,16,16, 0,17,17,19,20, 0,14,14, - 15,15, 0, 0, 0,18,20, 0, 0,21,18,18, 0, 0,21,19, - 18, 0, 0, 0, 0, 0, 0,20,21,18,17, 0, 0, 0,21,21, - 0, 0, 0,19,19, 0,21, 0,18,19, 0, 0, 0, 0, 0, 0, - 21,20,17,17, 0, 0,21,20, 0, 0, 0, 0,19,19, 0,19, - 20,15,16, 0, 0,20,18,17, 0,20,21,17,18, 0,21, 0, - 18,18, 0, 0, 0,19,19, 0,20,20,17,18, 0, 0, 0,18, - 19, 0,20,20,18,17, 0, 0, 0, 0,20, 0, 0,21,17,18, - 0,20,21,17,17, 0, 0, 0,18,18, 0,19,19,17,17, 0, - 0, 0,21,21, 0,20,20,17,17, 0, 0, 0,21,19, 0, 0, - 0,20,19, 0,21,20,17,18, 0, 0, 0, 0, 0, 0, 0,20, - 18,17, 0,21,20,18,18, 0, 0, 0,20,21, 0,20,20,17, - 17, 0, 0, 0, 0, 0, 0,20, 0,17,17, 0,11,11,13,14, - 0,13,13,16,16, 0,13,13,16,16, 0,17,17, 0, 0, 0, - 17,18, 0, 0, 0,13,13,16,16, 0,15,16,18,18, 0,13, - 13,16,17, 0,16,17,20, 0, 0,17,18,20, 0, 0,13,13, - 17,17, 0,16,16,20,21, 0,13,13,16,16, 0,17,17,21, - 0, 0,17,18, 0, 0, 0,17,18, 0,21, 0, 0, 0, 0, 0, - 0,15,15,20, 0, 0,19,19, 0, 0, 0,17,17, 0, 0, 0, - 18,17,21,20, 0, 0, 0, 0, 0, 0,16,16,20,21, 0,21, - 20, 0,21, 0,19,21, 0, 0, 0,15,15, 0, 0, 0,16,17, - 0,19, 0,16,16, 0, 0, 0,17,17, 0, 0, 0,19,18, 0, - 0, 0,16,16,20,20, 0,20,18,21, 0, 0,15,15,21,21, - 0,18,18, 0, 0, 0,18,19, 0, 0, 0,16,15, 0,21, 0, - 20,19, 0, 0, 0,16,16, 0, 0, 0,20,18, 0,21, 0,17, - 18,21, 0, 0,18,19, 0, 0, 0, 0, 0, 0, 0, 0,16,16, - 20,20, 0,19,20, 0, 0, 0,17,17, 0, 0, 0,18,17,20, - 21, 0, 0, 0, 0, 0, 0,16,16, 0,20, 0,20,22, 0, 0, - 0,18,18, 0,22, -}; - -static const static_codebook _44p0_p4_0 = { - 5, 3125, - (char *)_vq_lengthlist__44p0_p4_0, - 1, -528744448, 1616642048, 3, 0, - (long *)_vq_quantlist__44p0_p4_0, - 0 -}; - -static const long _vq_quantlist__44p0_p4_1[] = { - 3, - 2, - 4, - 1, - 5, - 0, - 6, -}; - -static const char _vq_lengthlist__44p0_p4_1[] = { - 2, 3, 3, 3, 3, 3, 3, -}; - -static const static_codebook _44p0_p4_1 = { - 1, 7, - (char *)_vq_lengthlist__44p0_p4_1, - 1, -533200896, 1611661312, 3, 0, - (long *)_vq_quantlist__44p0_p4_1, - 0 -}; - -static const long _vq_quantlist__44p0_p5_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p0_p5_0[] = { - 1, 6, 6, 6, 8, 8, 7, 8, 8, 7, 9, 8,10,11,11, 9, - 8, 8, 7, 8, 8,11,11,11, 9, 8, 8, 6, 7, 7,10,10, - 10,10,10,10,10,10,10,14,13,13,12,11,11,10,10,10, - 14,14,13,13,11,11, 6, 6, 6, 8, 5, 5, 8, 7, 7, 8, - 7, 7,11, 9, 9, 9, 7, 7, 8, 7, 7,12,10,10,10, 7, - 7, 7, 8, 8,12,11,11,12,10,10,11,10,10,14,13,13, - 13,10,10,11,10,11,16,14,14,13,10,10, 7, 8, 7,12, - 12,12,12,11,11,12,11,11,16,14,15,13,12,12,11,11, - 11,17,15,14,14,13,13,10, 9, 9,13,11,11,13,11,11, - 12,11,11,16,14,13,14,11,11,12,11,11,16,15,14,14, - 11,11, 7, 8, 8,12,11,11,12,10,10,12,10,10,16,14, - 13,13,11,11,12,10,10,16,14,14,13,10,10, 8, 8, 8, - 12,12,12,12,11,11,12,11,11,16,14,15,14,12,12,12, - 11,11,16,15,15,14,12,12,10,10,10,13,11,11,13,11, - 11,12,12,12,16,14,14,14,11,11,12,11,11,17,14,15, - 14,11,11, -}; - -static const static_codebook _44p0_p5_0 = { - 5, 243, - (char *)_vq_lengthlist__44p0_p5_0, - 1, -527106048, 1620377600, 2, 0, - (long *)_vq_quantlist__44p0_p5_0, - 0 -}; - -static const long _vq_quantlist__44p0_p5_1[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p0_p5_1[] = { - 2, 7, 7, 7, 8, 8, 7, 7, 7, 7, 8, 8, 8, 8, 9, 8, - 7, 7, 8, 8, 8, 9, 9, 9, 9, 7, 7, 6, 6, 6, 9, 7, - 7, 9, 7, 7, 9, 8, 8,10, 8, 8,10, 8, 8,10, 8, 8, - 10, 8, 8,10, 8, 8, 7, 6, 6, 9, 6, 6, 9, 6, 6, 9, - 7, 7,10, 8, 8, 9, 6, 6, 9, 7, 7,10, 8, 8, 9, 7, - 7, 7, 8, 8,11, 9, 9,11, 9, 9,11, 9, 9,12, 9, 9, - 12, 8, 8,12, 9, 9,12,10, 9,12, 8, 8, 8, 7, 7,10, - 9, 9,11, 9, 9,11, 9, 9,11,11,10,11, 9, 9,11,10, - 9,11,10,11,11, 9, 9,10, 8, 8,11, 9, 9,11, 9, 9, - 11, 9, 9,11,10,10,11, 9, 9,11, 9, 9,11,10,10,11, - 9, 9, 9, 8, 8,12, 9, 9,12, 9, 9,11, 9, 9,12, 9, - 9,12, 8, 8,12, 9, 9,12, 9, 9,12, 8, 8, 9, 7, 7, - 11, 9,10,11,10, 9,11, 9, 9,11,11,11,11, 9, 9,11, - 10,10,11,11,11,11, 9, 9,10, 9, 9,11, 9, 9,11,10, - 10,11,10, 9,11,10,10,11, 9, 9,11,10,10,11,10,11, - 11, 9, 9, -}; - -static const static_codebook _44p0_p5_1 = { - 5, 243, - (char *)_vq_lengthlist__44p0_p5_1, - 1, -530841600, 1616642048, 2, 0, - (long *)_vq_quantlist__44p0_p5_1, - 0 -}; - -static const long _vq_quantlist__44p0_p6_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p0_p6_0[] = { - 1, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, -}; - -static const static_codebook _44p0_p6_0 = { - 5, 243, - (char *)_vq_lengthlist__44p0_p6_0, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44p0_p6_0, - 0 -}; - -static const long _vq_quantlist__44p0_p6_1[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const char _vq_lengthlist__44p0_p6_1[] = { - 1, 3, 2, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,10,10,11, - 11,12,12,12,14,14,14,15,15, -}; - -static const static_codebook _44p0_p6_1 = { - 1, 25, - (char *)_vq_lengthlist__44p0_p6_1, - 1, -518864896, 1620639744, 5, 0, - (long *)_vq_quantlist__44p0_p6_1, - 0 -}; - -static const long _vq_quantlist__44p0_p6_2[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const char _vq_lengthlist__44p0_p6_2[] = { - 3, 4, 4, 5, 4, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44p0_p6_2 = { - 1, 25, - (char *)_vq_lengthlist__44p0_p6_2, - 1, -529006592, 1611661312, 5, 0, - (long *)_vq_quantlist__44p0_p6_2, - 0 -}; - -static const char _huff_lengthlist__44p0_short[] = { - 3, 3, 7, 8,10,13,16, 3, 2, 5, 7, 9,13,16, 6, 4, - 4, 6,10,14,15, 7, 5, 5, 7,10,13,14, 9, 8, 9, 9, - 9,11,13,12,11,12, 9, 7, 8,11,14,12,10, 6, 5, 7, - 10, -}; - -static const static_codebook _huff_book__44p0_short = { - 2, 49, - (char *)_huff_lengthlist__44p0_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p1_l0_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44p1_l0_0[] = { - 1, 4, 4, 7, 7, 8, 8, 9, 9,10,10,11,11, 4, 6, 5, - 8, 6, 9, 8,10, 9,10,10,11,10, 5, 5, 6, 6, 8, 8, - 9, 9,10,10,10,10,11, 7, 8, 8, 9, 8,10, 9,10, 9, - 11,10,11,10, 7, 8, 8, 8,10, 9,10,10,10,10,11,10, - 11, 9,10,10,11,11,11,11,12,11,12,11,12,11, 9,10, - 10,11,11,11,11,11,11,11,12,11,12,11,11,11,12,12, - 12,12,12,12,12,12,12,11,11,12,11,12,12,12,12,12, - 12,12,12,11,12,12,12,12,12,13,12,13,12,12,12,12, - 12,12,12,12,12,13,13,13,13,12,13,12,12,12,12,12, - 13,13,12,13,12,13,12,13,12,12,12,12,13,13,13,13, - 13,13,12,12,12,12,12,11,12, -}; - -static const static_codebook _44p1_l0_0 = { - 2, 169, - (char *)_vq_lengthlist__44p1_l0_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44p1_l0_0, - 0 -}; - -static const long _vq_quantlist__44p1_l0_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p1_l0_1[] = { - 1, 4, 4, 6, 6, 5, 5, 5, 6, 6, 5, 6, 5, 6, 6, 6, - 6, 7, 7, 7, 6, 7, 6, 7, 7, -}; - -static const static_codebook _44p1_l0_1 = { - 2, 25, - (char *)_vq_lengthlist__44p1_l0_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p1_l0_1, - 0 -}; - -static const long _vq_quantlist__44p1_l1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p1_l1_0[] = { - 1, 4, 4, 4, 4, 4, 4, 4, 4, -}; - -static const static_codebook _44p1_l1_0 = { - 2, 9, - (char *)_vq_lengthlist__44p1_l1_0, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44p1_l1_0, - 0 -}; - -static const char _huff_lengthlist__44p1_lfe[] = { - 1, 3, 2, 3, -}; - -static const static_codebook _huff_book__44p1_lfe = { - 2, 4, - (char *)_huff_lengthlist__44p1_lfe, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44p1_long[] = { - 3, 3, 7, 7, 9,13,16, 3, 2, 4, 6,10,13,17, 7, 4, - 4, 6, 9,12,14, 7, 6, 6, 5, 7, 9,12,10,10, 9, 6, - 6, 9,12,14,14,13, 9, 8,10,11,18,18,15,13,11,10, - 11, -}; - -static const static_codebook _huff_book__44p1_long = { - 2, 49, - (char *)_huff_lengthlist__44p1_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p1_p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p1_p1_0[] = { - 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44p1_p1_0 = { - 5, 243, - (char *)_vq_lengthlist__44p1_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p1_p1_0, - 0 -}; - -static const long _vq_quantlist__44p1_p2_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p1_p2_0[] = { - 1, 4, 4, 0, 7, 7, 0, 8, 8, 0, 9, 9, 0,12,12, 0, - 8, 8, 0, 9, 9, 0,12,12, 0, 8, 8, 0, 6, 6, 0,11, - 11, 0,11,11, 0,12,12, 0,14,14, 0,11,11, 0,12,12, - 0,14,14, 0,11,11, 0, 6, 6, 0, 6, 5, 0, 7, 6, 0, - 7, 7, 0,10,10, 0, 6, 6, 0, 7, 7, 0,10,10, 0, 7, - 7, 0, 7, 7, 0,10,10, 0,11,11, 0,11,11, 0,14,14, - 0,10,10, 0,12,12, 0,14,14, 0,12,12, 0, 6, 6, 0, - 11,11, 0,11,11, 0,12,12, 0,14,14, 0,11,11, 0,12, - 12, 0,15,15, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 8, 8, 0,11,11, 0,11,11, 0,12,12, 0,15, - 15, 0,12,12, 0,11,11, 0,15,15, 0,11,11, 0, 6, 6, - 0,11,11, 0,12,12, 0,12,12, 0,15,15, 0,11,11, 0, - 12,12, 0,14,14, 0,12,12, 0, 0, 0, 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 static_codebook _44p1_p2_0 = { - 5, 243, - (char *)_vq_lengthlist__44p1_p2_0, - 1, -533200896, 1614282752, 2, 0, - (long *)_vq_quantlist__44p1_p2_0, - 0 -}; - -static const long _vq_quantlist__44p1_p2_1[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p1_p2_1[] = { - 1, 3, 3, 0, 8, 8, 0, 8, 8, 0,10,10, 0, 9, 9, 0, - 10,10, 0,10,10, 0, 9, 9, 0,10,10, 0, 7, 7, 0, 7, - 7, 0, 7, 7, 0, 8, 8, 0, 8, 8, 0, 8, 8, 0, 9, 9, - 0, 8, 8, 0, 8, 8, 0, 7, 7, 0, 8, 8, 0, 8, 8, 0, - 10,10, 0, 9, 9, 0, 9, 9, 0,10,10, 0, 9, 9, 0,10, - 10, 0, 8, 8, 0,11,11, 0,11,11, 0,12,12, 0,11,11, - 0,12,12, 0,12,12, 0,12,12, 0,12,12, 0, 8, 8, 0, - 11,11, 0,11,11, 0,13,12, 0,12,12, 0,13,12, 0,13, - 13, 0,12,12, 0,13,13, 0, 7, 7, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 8, 8, 0,11,11, 0,11,11, 0,13,12, 0,12, - 12, 0,12,12, 0,12,12, 0,11,11, 0,12,12, 0, 8, 8, - 0,12,12, 0,12,12, 0,13,13, 0,12,12, 0,13,13, 0, - 13,13, 0,12,13, 0,13,13, 0, 7, 7, 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 static_codebook _44p1_p2_1 = { - 5, 243, - (char *)_vq_lengthlist__44p1_p2_1, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p1_p2_1, - 0 -}; - -static const long _vq_quantlist__44p1_p3_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p1_p3_0[] = { - 1, 6, 6, 6, 7, 7, 7, 8, 8, 7, 8, 8,10,11,11, 9, - 8, 8, 7, 9, 9,11,12,12, 9, 8, 8, 6, 7, 7, 9,11, - 11,10,11,11,10,11,11,13,13,13,11,12,12,10,11,11, - 13,14,14,12,12,12, 6, 6, 6, 8, 6, 6, 8, 6, 6, 9, - 7, 7,12,10,10,10, 6, 6, 9, 7, 7,12,10,10,11, 7, - 6, 7, 8, 8,12,10,10,12,10,10,11,10,10,15,13,13, - 13,10,10,12,11,11,15,13,13,14,11,11, 8, 7, 7,12, - 11,11,12,11,11,11,11,11,14,14,14,13,12,12,12,11, - 11,16,15,15,14,12,12, 0,10,10, 0,11,11, 0,12,12, - 0,11,11, 0,14,14, 0,11,11, 0,11,11, 0,15,15, 0, - 11,11, 7, 8, 8,13,10,10,12,10,10,12,11,11,15,13, - 13,14,11,11,12,10,10,16,14,14,14,10,10, 8, 7, 7, - 12,11,11,13,11,11,12,11,11,15,14,14,14,12,12,13, - 12,12,15,14,14,15,12,12, 0,11,11, 0,12,12, 0,12, - 12, 0,12,12, 0,15,15, 0,12,12, 0,12,12, 0,15,14, - 0,12,12, -}; - -static const static_codebook _44p1_p3_0 = { - 5, 243, - (char *)_vq_lengthlist__44p1_p3_0, - 1, -531365888, 1616117760, 2, 0, - (long *)_vq_quantlist__44p1_p3_0, - 0 -}; - -static const long _vq_quantlist__44p1_p3_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p1_p3_1[] = { - 2, 3, 4, 7, 7,10,12,12,12,12,10,11,11,13,13,11, - 12,12,11,11,12,12,12,12,12,11,13,13,13,13,12,12, - 12,13,14,12,13,13,13,13,12,13,13,13,13,12,13,13, - 13,13,11,13,13,13,13,12,12,12,14,14,12,13,13,12, - 12,12,12,13,13,13,12,13,13,13,13,12,13,13,13,13, - 12,12,12,14,14,12,13,13,12,12,12,13,13,13,13,12, - 13,13,12,12,12,13,13,13,13,12,12,12,14,14,12,13, - 13,12,12,12,13,13,13,13,12,13,13,12,12,10,10,11, - 10,10,11,11,11,11,11,11, 9, 9,10,10,12,11,11,10, - 10,12,10,10,10,10,13,12,12,12,12,13,11,11,11,11, - 13,12,12,12,12,13,11,11,11,11,13,12,12,12,12,13, - 12,12,12,12,13,11,11,11,11,13,12,12,12,12,13,11, - 11,11,11,13,12,12,11,11,13,12,12,11,11,13,11,11, - 11,11,13,12,12,11,11,13,11,11,11,11,13,12,12,11, - 11,13,12,12,11,11,13,11,11,11,11,13,12,12,11,11, - 13,11,11,11,11,13,12,12,11,11,11,11,11,10,10,11, - 11,11, 9, 9,11,12,12,11,11,12,12,12, 9, 9,13,13, - 13,10,10,13,13,13,11,11,13,13,13,14,14,13,13,13, - 11,10,13,13,14,12,12,13,13,13,11,11,13,13,13,11, - 11,13,13,13,14,14,13,13,13,10,10,13,13,13,11,11, - 13,13,13,10,10,13,14,13,11,11,13,14,14,14,14,13, - 13,13,10,10,13,14,14,11,11,13,13,13,10,10,13,14, - 14,11,11,13,13,13,14,14,14,13,13,10,10,13,14,14, - 11,11,13,13,13,10,10,14,12,12, 9, 9,14,12,12, 9, - 9,14,11,11, 9, 9,14,12,12, 8, 8,14,11,11, 7, 7, - 15,13,13,10,10,15,12,12,10,10,15,13,13,10,10,15, - 12,12,10,10,15,13,13,10,10,15,13,13,10,10,15,12, - 12,10,10,15,13,13,10,10,15,12,12,10,10,15,13,13, - 10,10,15,13,13,10,10,15,12,12,10,10,15,13,13, 9, - 9,15,12,12, 9, 9,14,13,13, 9, 9,15,13,13,10,10, - 15,12,12,10,10,15,13,13, 9, 9,15,12,12, 9, 9,15, - 13,13, 9, 9,13,12,12, 9, 9,13,13,13, 8, 8,13,13, - 13, 9, 9,13,13,13, 7, 7,14,13,13, 8, 8,14,14,14, - 10,10,15,14,14,11,11,14,14,14, 9, 9,15,14,14,10, - 10,15,14,14, 9, 9,14,14,14,10,10,15,14,14,11,11, - 15,14,14, 9, 9,14,14,14,10,10,14,14,14, 9, 9,15, - 14,15,10,10,15,14,14,11,11,14,14,14, 9, 9,14,14, - 14, 9, 9,14,14,14, 8, 8,15,14,14,10,10,15,14,14, - 11,11,14,14,14, 9, 9,15,14,14, 9, 9,14,14,14, 8, - 8,12,12,12,13,13,16,16,16,11,11,17,16,16,12,12, - 17,16,16,11,11,17,16,16,11,11,17,17,16,13,13,17, - 16,16,13,13,18,17,16,12,12,17,16,16,13,13,17,16, - 17,12,12,18,17,17,13,13,17,16,16,14,14,18,17,17, - 12,12,18,16,16,13,13,17,17,17,13,12,17,17,17,13, - 13,17,16,16,13,13,18,17,17,12,12,17,16,16,13,12, - 17,17,17,12,12,18,17,17,13,13,18,16,16,14,14,18, - 17,17,12,12,17,17,17,13,13,18,17,18,12,12,13,14, - 14,10,10,16,14,14,13,13,17,15,15,14,14,17,14,14, - 12,13,16,14,14,13,13,17,15,15,14,14,16,16,16,15, - 15,17,15,15,14,14,17,16,16,14,15,17,15,15,14,14, - 17,15,16,14,14,17,16,16,15,15,17,15,15,13,13,17, - 15,15,14,14,18,15,15,13,14,17,15,15,14,14,16,16, - 16,15,15,17,15,15,13,13,17,15,15,14,14,17,15,15, - 13,13,17,15,15,14,14,16,16,16,15,15,17,15,15,13, - 13,17,15,15,14,14,18,15,15,13,13,13,11,11,10,10, - 16,14,14,13,12,16,14,14,13,13,16,15,14,12,12,16, - 14,14,12,12,16,15,15,14,14,16,14,14,14,14,17,15, - 15,13,13,16,15,15,14,14,17,15,15,13,14,17,15,15, - 14,14,17,15,14,14,14,17,15,15,13,13,17,15,15,14, - 14,17,15,15,13,13,17,15,15,14,14,17,14,14,14,14, - 17,15,15,13,13,17,15,15,13,13,17,15,15,13,13,17, - 15,15,14,14,17,15,15,14,14,17,15,15,13,13,17,15, - 15,13,13,17,15,15,13,13,14,14,15, 8, 8,14,14,14, - 19,19,14,15,15,18,19,14,14,14,19,18,14,14,14,19, - 19,15,15,15,19,18,15,16,16,19,19,15,15,15,19,19, - 15,16,16,20,19,15,15,15,19,19,15,15,15,19,19,16, - 16,16,20,19,15,15,15,19,18,15,16,16,20,19,15,15, - 15,18,18,15,15,15,19,20,15,16,16,19,19,15,15,15, - 20,19,15,15,15,20,19,15,15,15,19,18,15,15,15,19, - 19,15,16,16,19,20,15,15,15,19,19,15,15,15,19,20, - 15,15,15,19,19,14,12,12, 9, 9,14,14,14,19,19,14, - 14,14,19,19,14,14,15,20,19,15,14,14,18,19,15,15, - 15,19,19,15,15,14,20,19,15,15,15,20,19,15,15,14, - 20,19,15,15,15,20,19,15,15,15,19,20,15,14,14,19, - 20,15,15,15,20,20,15,14,14,20,19,15,15,15,19,19, - 15,15,15,19,19,15,14,14,19,19,15,15,15,19,20,15, - 15,15,20,20,15,15,15,19,19,15,15,15,20,19,16,14, - 14,19,19,15,15,15,20,19,15,14,15,20,19,14,15,15, - 20,19,12,12,12,13,13,16,16,16,11,11,16,16,16,12, - 12,17,16,16,11,11,17,15,16,11,11,17,17,17,13,13, - 18,16,17,13,13,18,17,17,13,12,17,16,17,13,13,17, - 17,17,13,13,16,16,16,12,12,17,16,16,13,13,17,16, - 16,12,12,17,16,16,12,13,17,17,17,12,12,17,17,17, - 13,13,18,16,16,13,13,18,17,17,12,12,18,17,17,12, - 12,17,17,17,12,12,17,17,17,12,12,17,16,16,13,13, - 17,17,17,12,12,17,16,16,12,12,17,17,17,12,12,13, - 14,14, 9, 9,16,14,14,13,13,16,15,15,14,14,17,14, - 14,13,13,16,14,14,13,13,17,15,15,15,15,16,16,16, - 15,15,17,15,15,14,14,17,15,15,15,15,17,15,15,14, - 14,17,15,15,14,14,16,16,16,15,15,17,15,15,14,14, - 17,15,15,14,14,17,15,15,14,14,17,15,15,14,14,16, - 16,16,15,15,18,15,15,14,13,17,15,15,14,14,17,15, - 15,13,13,17,15,15,14,14,16,16,16,15,15,17,15,15, - 14,13,17,15,15,14,14,17,15,15,13,13,13,11,11,11, - 11,16,14,14,12,12,16,14,14,13,13,16,15,14,12,12, - 17,14,14,12,12,17,15,15,13,13,17,14,14,14,14,17, - 15,15,13,13,17,14,15,14,13,17,15,15,13,13,16,15, - 15,13,13,16,14,14,14,14,17,15,15,13,13,16,14,14, - 13,13,16,15,15,13,13,17,15,15,13,13,17,14,14,14, - 14,17,15,15,12,12,17,15,15,13,13,17,15,15,12,12, - 16,15,15,13,13,17,14,14,13,14,17,15,15,12,12,17, - 14,14,13,13,17,15,15,12,12,14,14,14, 8, 8,14,14, - 14,18,18,14,15,15,19,19,14,14,14,19,19,14,15,14, - 18,19,15,15,15,18,19,15,16,16,20,20,15,15,15,19, - 20,15,16,16,19,20,15,15,15,19,20,15,15,16,19,19, - 15,16,16,20,20,15,15,15,20,19,15,16,16,20,19,15, - 15,15,19,20,15,15,15,19,19,15,16,16,20,19,15,15, - 15,19,19,15,16,15,20,19,15,15,15,19,19,15,15,15, - 19,20,15,16,16,20,20,15,15,15,19,19,15,15,15,20, - 20,15,15,15,19,19,14,12,12, 9, 9,14,14,14,18,18, - 14,14,14,19,20,14,14,14,18,18,14,14,14,18,19,15, - 15,15,19,20,15,14,14,19,19,15,15,15,19,19,15,14, - 15,19,19,15,15,15,18,20,15,15,15,19,19,15,14,14, - 19,19,15,15,15,20,19,15,15,14,20,20,15,15,15,19, - 19,15,15,15,19,19,15,14,14,19,19,15,15,15,19,19, - 15,14,14,19,20,14,15,15,19,19,15,15,15,19,19,15, - 14,14,20,19,15,15,15,19,19,15,14,14,20,19,15,15, - 15,19,19,13,12,12,13,13,17,17,16,11,11,16,16,16, - 12,12,17,17,16,11,11,17,16,16,11,11,17,17,17,13, - 13,17,16,16,13,13,18,17,17,12,12,17,16,16,13,13, - 18,17,17,12,12,18,17,17,13,13,18,16,17,13,13,17, - 17,17,12,12,18,17,17,13,13,18,17,17,12,12,17,16, - 17,12,12,17,16,16,13,13,17,16,16,11,11,17,16,16, - 12,12,17,17,17,11,11,17,17,17,12,12,18,16,16,13, - 13,18,17,17,12,11,17,16,16,12,12,18,17,17,11,11, - 13,14,14, 9, 9,16,14,14,13,13,16,15,15,14,14,17, - 14,14,12,12,16,14,14,13,13,17,15,15,14,14,17,16, - 16,15,16,18,15,15,14,14,17,15,15,14,14,17,15,15, - 14,14,18,15,15,14,14,16,16,16,15,16,18,15,15,14, - 14,17,16,15,14,14,18,15,15,14,14,17,15,15,14,14, - 17,16,16,15,15,18,14,15,13,13,17,15,15,14,14,18, - 15,15,13,13,17,15,15,14,14,17,16,15,15,15,17,15, - 15,13,13,17,15,15,14,14,18,15,15,13,13,13,11,11, - 10,10,16,14,14,12,12,16,14,14,12,12,17,14,15,11, - 11,17,14,14,11,11,17,15,15,13,13,17,14,14,14,13, - 17,15,15,13,13,16,15,15,13,13,17,15,15,13,13,17, - 15,15,13,13,17,14,14,14,14,17,15,15,13,13,17,14, - 15,13,13,16,15,15,13,13,17,15,15,13,13,17,14,14, - 13,13,17,15,15,12,12,16,14,14,12,12,17,15,15,12, - 12,17,15,15,13,13,17,14,14,13,13,17,15,15,12,12, - 17,14,14,12,12,17,15,15,12,12,13,15,14, 8, 8,14, - 14,14,19,19,14,15,15,18,19,14,14,14,18,19,14,15, - 14,19,19,15,16,15,19,19,15,16,16,19,20,15,15,15, - 19,19,15,16,16,19,19,15,16,16,19,19,15,15,15,19, - 19,15,16,16,20,20,15,15,15,19,19,15,15,15,19,19, - 15,15,15,19,19,15,15,15,19,19,15,16,16,20,19,15, - 15,15,19,19,15,15,15,19,19,15,15,15,19,19,15,16, - 15,19,19,15,16,16,21,19,15,15,15,20,20,15,15,15, - 20,21,15,15,15,19,20,14,12,12, 8, 8,14,14,14,19, - 19,14,13,13,19,19,14,14,14,19,19,14,13,14,19,19, - 15,15,15,20,20,15,14,14,20,19,15,15,15,19,20,15, - 14,14,19,20,15,15,15,20,19,15,15,15,19,20,15,14, - 14,20,20,15,15,15,20,19,15,14,14,19,19,15,15,15, - 19,19,15,15,15,20,19,15,14,14,21,19,15,15,15,20, - 21,15,14,14,21,19,15,15,15,19,19,15,15,15,20,20, - 15,14,14,19,21,15,15,15,19,19,15,14,14,19,20,15, - 15,15,19,19,13,12,12,13,13,17,16,16,11,11,17,16, - 15,12,12,18,16,16,11,11,17,16,16,11,11,18,17,17, - 13,13,18,16,16,13,13,17,17,17,12,13,18,17,16,13, - 13,18,17,17,13,13,17,17,17,13,13,17,16,16,13,13, - 18,16,17,12,12,17,16,16,13,12,17,17,17,12,12,18, - 17,17,13,12,18,16,16,13,13,18,17,17,12,12,17,16, - 16,12,12,17,17,17,11,11,17,16,16,12,12,17,16,16, - 13,13,17,16,16,11,11,17,16,16,12,12,17,17,17,11, - 11,13,14,14, 9, 9,16,14,14,13,13,16,15,15,14,14, - 17,14,14,12,12,16,14,14,13,13,17,15,15,14,14,17, - 15,16,15,15,17,15,15,14,14,17,15,16,14,15,18,15, - 15,14,14,17,15,15,14,14,16,16,16,15,15,18,15,15, - 13,14,17,15,15,14,14,18,15,15,14,14,17,15,15,14, - 14,17,16,16,15,15,17,15,15,13,13,17,15,15,14,14, - 18,15,15,13,13,17,15,15,14,14,17,16,16,15,15,17, - 15,15,13,13,17,15,15,14,14,18,15,15,13,13,13,11, - 11,10,10,16,14,14,12,12,16,14,14,13,13,17,14,14, - 11,11,17,14,14,12,12,17,15,15,14,14,17,14,14,14, - 14,17,15,15,13,13,17,15,14,13,13,16,15,15,13,13, - 16,15,15,13,13,17,14,14,14,14,17,15,15,13,13,17, - 14,14,13,13,16,15,15,13,13,16,15,15,13,13,17,14, - 14,13,13,17,15,15,12,12,17,14,14,12,12,16,15,15, - 12,12,17,15,15,13,13,17,14,14,13,13,17,15,15,12, - 12,17,14,14,12,12,16,15,15,12,12,14,14,14, 8, 8, - 14,14,14,18,18,14,15,15,19,18,14,14,14,18,18,14, - 14,14,18,19,15,16,15,19,19,15,17,16,20,20,15,15, - 15,19,19,15,16,16,19,19,15,15,15,19,19,15,16,15, - 18,19,15,16,16,20,20,15,15,15,19,19,15,16,16,19, - 20,15,15,15,19,19,15,15,16,19,19,15,16,16,20,20, - 15,15,15,19,19,15,15,15,19,20,15,15,15,19,19,15, - 15,15,19,19,15,16,16,20,20,15,15,15,19,20,15,16, - 16,20,20,15,15,15,19,19,13,12,12, 8, 8,14,14,14, - 19,20,14,14,14,19,19,14,14,14,18,19,14,14,14,19, - 20,15,15,15,19,20,15,14,14,21,20,15,15,15,20,20, - 15,15,14,19,19,15,15,15,19,19,15,15,15,19,19,15, - 14,14,19,20,15,15,15,19,20,15,14,14,19,19,15,15, - 15,19,19,15,15,15,19,19,16,14,14,19,19,15,15,15, - 20,20,15,14,14,21,19,15,15,15,19,19,15,15,15,19, - 20,16,14,14,19,20,15,15,15,19,19,15,14,14,19,19, - 15,15,15,20,19, -}; - -static const static_codebook _44p1_p3_1 = { - 5, 3125, - (char *)_vq_lengthlist__44p1_p3_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p1_p3_1, - 0 -}; - -static const long _vq_quantlist__44p1_p4_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p1_p4_0[] = { - 2, 6, 6,14,14, 6, 7, 7,14,14, 7, 7, 7,14,14, 0, - 13,13,16,16, 0,13,13,15,14, 7, 8, 8,15,15, 9,10, - 10,16,16, 9, 8, 8,15,15, 0,13,13,17,16, 0,13,13, - 15,16, 8, 8, 8,15,15,12,11,11,16,16, 9, 8, 8,14, - 14, 0,13,13,17,18, 0,13,13,15,15, 0,14,14,16,16, - 0, 0, 0,19,18, 0,12,12,16,15, 0,15,16, 0,20, 0, - 14,14,16,16, 0,14,14,17,17, 0, 0, 0,19,18, 0,12, - 12,15,15, 0,17,17, 0,20, 0,14,14,16,16, 5, 6, 7, - 12,12, 9, 9, 9,14,14,10,10,10,14,14, 0,21,21,18, - 17, 0,20,20,18,17, 9,10,10,14,14,12,12,12,16,16, - 12,10,10,14,14, 0,20,19,18,17, 0, 0,20,17,18,11, - 10,10,14,14,14,13,13,18,18,13,11,11,14,14, 0,20, - 20,17,18, 0,21,21,17,17, 0,21, 0,18,18, 0, 0, 0, - 0, 0, 0,20,19,16,17, 0, 0, 0,19,19, 0, 0, 0,18, - 18, 0,21,21,18,18, 0, 0, 0, 0, 0, 0,20,20,16,17, - 0, 0, 0,21,21, 0, 0, 0,18,19, 6, 6, 6,13,12, 8, - 6, 6,11,11, 8, 6, 6,13,13, 0, 9, 9,11,11, 0,11, - 10,14,14, 9, 7, 7,13,13,11, 9, 9,13,13,10, 6, 6, - 13,13, 0,10,10,14,15, 0,10,10,13,13, 9, 7, 7,13, - 13,13,10, 9,13,13,10, 6, 6,13,13, 0,10,10,15,14, - 0,10,10,13,13, 0,11,11,15,15, 0,19,20,17,17, 0, - 9, 9,13,13, 0,13,13,20,20, 0,11,11,13,13, 0,11, - 11,15,15, 0,19,19,17,17, 0,10,10,13,13, 0,15,15, - 20,20, 0,12,12,13,13, 0,10,10,12,12, 0,11,11,15, - 15, 0,11,11,15,15, 0,15,15,20, 0, 0,16,16, 0,21, - 0,11,11,15,15, 0,14,14,18,17, 0,11,11,15,15, 0, - 15,16,19,20, 0,16,16,21,21, 0,12,12,15,15, 0,15, - 14,18,18, 0,11,11,16,16, 0,15,15,21,21, 0,16,15, - 0, 0, 0,16,16,21, 0, 0, 0, 0, 0, 0, 0,14,14,20, - 20, 0,18,18, 0, 0, 0,16,17,21, 0, 0,16,16,21,21, - 0, 0, 0, 0, 0, 0,15,15,21,21, 0,20,19, 0,21, 0, - 17,17, 0, 0, 0,10,10,12,11, 0,10,10,10,11, 0,11, - 11,12,12, 0,11,11, 9, 9, 0,13,13,11,12, 0,11,11, - 12,12, 0,13,13,12,12, 0,10,10,12,12, 0,12,12,13, - 13, 0,12,12,12,12, 0,11,11,12,12, 0,13,13,12,12, - 0,10,10,12,12, 0,13,13,14,14, 0,12,12,12,12, 0, - 14,14,14,13, 0,19,20,15,15, 0,12,11,12,12, 0,15, - 15,21,20, 0,13,13,11,11, 0,13,13,13,13, 0,19, 0, - 15,15, 0,12,12,12,12, 0,17,16,19, 0, 0,13,13,12, - 12, 7, 7, 7,16,16,11, 9, 9,15,15,12, 9, 9,16,16, - 0,13,13,15,14, 0,14,14,17,16,10, 9, 9,16,16,14, - 11,11,17,16,12, 9, 8,15,15, 0,13,13,18,18, 0,13, - 13,15,15,12,10,10,18,17,15,12,12,17,17,14, 9, 9, - 16,16, 0,13,13,18,19, 0,14,13,17,16, 0,14,14,18, - 18, 0, 0, 0,20,21, 0,12,12,16,16, 0,16,16,20,21, - 0,14,14,17,16, 0,14,14,18,19, 0, 0, 0,19,21, 0, - 13,13,17,17, 0,17,17, 0,21, 0,15,15,16,16, 8, 7, - 7,14,14,11,10,10,15,15,12,10,10,15,15, 0,20,20, - 18,18, 0, 0, 0,17,17,11,10,10,16,16,14,12,12,18, - 17,14,11,11,15,15, 0,20,21,18,18, 0, 0,19,18,17, - 12,10,10,16,16,17,14,14,19,19,14,11,11,15,15, 0, - 21,21,19,19, 0,21,20,19,18, 0,21, 0,18,19, 0, 0, - 0, 0, 0, 0,20,20,18,17, 0,21, 0, 0, 0, 0, 0, 0, - 19,18, 0, 0, 0,18,19, 0, 0, 0, 0, 0, 0, 0,21,17, - 18, 0, 0, 0, 0,21, 0, 0,21,18,19,11, 9, 9,14,14, - 13,10,10,13,13,13,11,11,15,15, 0,13,13,12,12, 0, - 15,15,16,16,13,10,10,15,15,16,12,12,15,15,15,10, - 10,15,15, 0,14,13,16,15, 0,14,13,15,15,13,10,10, - 15,15,18,14,14,15,15,15,10,10,14,15, 0,14,14,16, - 16, 0,14,14,16,15, 0,15,15,17,16, 0,21, 0,18,18, - 0,12,13,15,15, 0,16,16, 0, 0, 0,14,14,15,15, 0, - 15,15,16,16, 0,21,20,18,18, 0,13,13,15,15, 0,19, - 18, 0, 0, 0,15,15,15,15, 0,11,11,13,13, 0,12,12, - 16,16, 0,12,12,16,16, 0,15,16,20, 0, 0,16,17, 0, - 0, 0,12,12,16,16, 0,14,14,18,18, 0,11,11,16,17, - 0,15,15,20, 0, 0,16,16, 0, 0, 0,12,12,16,16, 0, - 15,15,19,19, 0,11,11,17,17, 0,16,16,21, 0, 0,16, - 16, 0, 0, 0,17,17,20,20, 0, 0, 0, 0, 0, 0,15,15, - 20, 0, 0,17,18, 0, 0, 0,17,17, 0, 0, 0,16,16, 0, - 21, 0, 0, 0, 0, 0, 0,15,15,21, 0, 0,19,18, 0, 0, - 0,18,17, 0, 0, 0,11,11,14,14, 0,11,11,15,15, 0, - 12,12,16,16, 0,13,13,14,14, 0,14,14,17,17, 0,12, - 12,16,16, 0,14,14,16,16, 0,11,11,16,15, 0,13,13, - 16,17, 0,13,13,16,16, 0,12,12,15,16, 0,15,14,16, - 16, 0,11,11,15,15, 0,14,14,17,17, 0,13,13,16,16, - 0,15,14,18,18, 0,21, 0,19,19, 0,13,13,15,15, 0, - 16,16,20,20, 0,14,14,16,15, 0,14,14,17,17, 0,21, - 0,20,18, 0,13,13,15,15, 0,17,17, 0, 0, 0,14,14, - 16,15, 8, 8, 8,16,16,12, 9, 9,16,16,13, 9, 9,16, - 16, 0,14,14,18,17, 0,14,14,16,17,12,10,10,18,17, - 14,11,11,18,18,14, 9, 9,16,16, 0,13,13,18,18, 0, - 13,13,17,16,12, 9, 9,16,17,17,13,13,16,16,14, 9, - 9,15,15, 0,14,14,20,20, 0,13,13,15,15, 0,15,14, - 18,18, 0, 0, 0,20,21, 0,12,13,16,17, 0,16,16,20, - 21, 0,14,14,16,17, 0,14,14,18,17, 0, 0, 0,20,21, - 0,13,13,16,16, 0,19,17, 0,21, 0,14,15,16,16, 8, - 7, 7,14,13,12,10,10,15,15,13,10,10,15,15, 0,21, - 21,18,19, 0,20,21,18,18,12,10,10,16,15,15,12,12, - 17,17,14,11,11,15,15, 0,21,21,19,18, 0, 0,21,17, - 18,13,11,11,15,15,16,13,13,18,19,15,11,11,15,14, - 0,21, 0,19,19, 0, 0,21,18,18, 0, 0,21,19,19, 0, - 0, 0, 0, 0, 0,20,19,17,17, 0, 0, 0,21, 0, 0,21, - 0,18,19, 0, 0,20,20,19, 0, 0, 0, 0, 0, 0,21,20, - 18,17, 0, 0, 0, 0,20, 0, 0, 0,18,19, 0,10,10,15, - 14, 0,11,11,14,14, 0,11,11,15,16, 0,14,14,15,15, - 0,15,15,16,16, 0,11,11,16,16, 0,14,13,16,16, 0, - 11,11,15,15, 0,14,14,16,16, 0,14,14,15,15, 0,11, - 11,15,15, 0,13,13,15,15, 0,11,11,15,15, 0,15,15, - 18,17, 0,14,14,15,15, 0,15,16,18,18, 0, 0, 0,20, - 20, 0,14,13,16,15, 0,17,17,21, 0, 0,15,15,15,15, - 0,16,15,17,17, 0, 0, 0,19,19, 0,13,13,15,15, 0, - 20,19, 0, 0, 0,15,15,15,15, 0,11,11,13,13, 0,12, - 12,16,16, 0,12,12,16,16, 0,15,15,21,21, 0,17,16, - 0, 0, 0,12,12,16,16, 0,14,14,17,17, 0,11,11,16, - 16, 0,15,15, 0, 0, 0,16,16,21, 0, 0,12,12,17,16, - 0,14,15,20,20, 0,11,11,16,16, 0,15,15, 0,20, 0, - 16,16, 0,21, 0,16,17,21, 0, 0, 0, 0, 0, 0, 0,15, - 15, 0,21, 0,18,18, 0, 0, 0,17,16, 0, 0, 0,17,17, - 21, 0, 0, 0, 0, 0, 0, 0,15,15, 0,20, 0,19,20,21, - 0, 0,17,18, 0, 0, 0,12,12,15,15, 0,12,12,15,15, - 0,12,12,16,16, 0,13,13,15,15, 0,15,15,17,17, 0, - 13,12,17,16, 0,14,14,17,16, 0,11,11,16,16, 0,14, - 14,17,17, 0,14,14,17,17, 0,12,12,16,16, 0,15,15, - 17,17, 0,11,11,16,16, 0,14,14,17,17, 0,14,14,16, - 16, 0,15,15,18,17, 0, 0, 0,19, 0, 0,13,13,16,16, - 0,16,16, 0,21, 0,14,14,16,16, 0,15,15,18,17, 0, - 0, 0,19,19, 0,13,13,16,16, 0,18,17, 0,21, 0,14, - 15,16,16, 0,11,11,16,16, 0,13,13,17,17, 0,13,13, - 17,17, 0,16,16,16,17, 0,16,16,18,18, 0,12,12,17, - 17, 0,16,15,18,17, 0,12,12,16,16, 0,16,15,19,19, - 0,16,15,17,17, 0,12,12,17,18, 0,16,16,18,18, 0, - 12,12,16,16, 0,16,16,19,19, 0,15,16,17,17, 0,15, - 16,18,18, 0, 0, 0,20,20, 0,13,13,16,16, 0,18,18, - 21,20, 0,15,15,16,16, 0,16,16,19,18, 0, 0, 0,19, - 20, 0,14,14,17,17, 0,19,19, 0,21, 0,15,16,16,16, - 0, 9, 9,14,14, 0,13,13,15,15, 0,14,14,15,15, 0, - 0,21,19,19, 0, 0,21,18,18, 0,12,12,15,15, 0,15, - 15,18,18, 0,14,13,15,15, 0,21,21,18,19, 0,21,20, - 18,18, 0,13,13,16,16, 0,17,17,18,19, 0,14,14,15, - 15, 0, 0,21,19,19, 0,21,20,18,19, 0,20,20,19,19, - 0, 0, 0, 0, 0, 0,19,20,17,17, 0, 0, 0,21,21, 0, - 21, 0,18,20, 0,21, 0,18,21, 0, 0, 0, 0, 0, 0,21, - 21,19,18, 0, 0, 0, 0, 0, 0, 0, 0,19,19, 0,18,18, - 15,15, 0,18,20,17,16, 0,20, 0,17,17, 0,21, 0,17, - 17, 0,21,20,19,20, 0,19,19,16,16, 0,21,21,17,18, - 0,19,19,17,17, 0,20,21,21,21, 0,20,20,18,18, 0, - 19,19,16,16, 0, 0,21,18,19, 0,18,19,16,17, 0,21, - 21,19,20, 0,21,19,18,18, 0,21,20,19,21, 0, 0, 0, - 20,21, 0,19,19,17,16, 0, 0, 0, 0, 0, 0,21,20,17, - 17, 0,20,21,19,18, 0, 0, 0, 0,21, 0,19,18,16,17, - 0, 0, 0, 0, 0, 0,20,20,17,17, 0,11,11,14,14, 0, - 13,13,16,16, 0,13,13,16,16, 0,17,17,21, 0, 0,17, - 18, 0, 0, 0,12,12,16,16, 0,15,15,17,18, 0,12,12, - 16,16, 0,16,16, 0,20, 0,17,17, 0,21, 0,12,12,17, - 17, 0,16,16,19,20, 0,12,12,17,17, 0,17,17, 0,20, - 0,17,17, 0, 0, 0,17,17,21, 0, 0, 0, 0, 0, 0, 0, - 15,15, 0,20, 0,19,19, 0, 0, 0,18,18, 0, 0, 0,17, - 17, 0, 0, 0, 0, 0, 0, 0, 0,15,15, 0, 0, 0,20,19, - 0, 0, 0,19,18, 0, 0, 0,14,14,21,19, 0,16,16,20, - 21, 0,16,16,20,20, 0,17,17,20, 0, 0,17,17,20,20, - 0,15,15,20,20, 0,19,18,20, 0, 0,15,15,20,20, 0, - 17,18,21,20, 0,17,17,20,21, 0,15,15,19,19, 0,19, - 18,21,21, 0,15,15,19,20, 0,17,18, 0, 0, 0,17,17, - 20,20, 0,17,18,20,21, 0, 0, 0, 0, 0, 0,15,15,20, - 20, 0,19,19, 0, 0, 0,17,17,19,21, 0,17,17, 0,21, - 0, 0, 0, 0,21, 0,15,15,20,19, 0, 0,20, 0, 0, 0, - 17,17,21,20, 0,12,12,16,16, 0,14,14,17,17, 0,13, - 13,17,17, 0,16,16,17,18, 0,17,16,18,18, 0,13,13, - 18,17, 0,15,16,19,18, 0,13,13,16,16, 0,16,16,19, - 19, 0,16,16,17,17, 0,13,12,17,17, 0,16,16,18,17, - 0,12,12,16,16, 0,17,17,19,18, 0,16,15,16,16, 0, - 16,17,18,19, 0, 0, 0,20,20, 0,14,14,17,16, 0,18, - 18,21, 0, 0,16,16,16,16, 0,16,16,18,17, 0, 0,21, - 21,21, 0,14,14,16,16, 0,21,20,21, 0, 0,16,16,16, - 16, 0,10,10,14,14, 0,14,14,15,16, 0,14,14,15,15, - 0, 0,21,18,18, 0, 0,21,18,19, 0,13,13,16,16, 0, - 16,16,18,17, 0,14,14,15,15, 0,20, 0,18,18, 0,21, - 0,18,17, 0,13,13,16,15, 0,17,17,19,19, 0,14,14, - 15,15, 0,20,20,18,19, 0, 0, 0,18,17, 0, 0,21,18, - 18, 0, 0, 0, 0, 0, 0,20,21,18,17, 0, 0, 0, 0, 0, - 0, 0, 0,19,19, 0, 0,21,18,18, 0, 0, 0, 0, 0, 0, - 21, 0,18,17, 0, 0, 0, 0,21, 0, 0, 0,19,20, 0,19, - 19,16,16, 0, 0,21,18,17, 0,21, 0,18,18, 0,20, 0, - 19,18, 0,21,20,19,19, 0,21,19,17,18, 0, 0,21,19, - 19, 0,21,19,18,18, 0,21, 0,20,18, 0, 0,21,18,18, - 0,20,21,17,17, 0,21, 0,18,18, 0,21,19,17,17, 0, - 21, 0, 0,20, 0, 0,20,17,18, 0, 0, 0,19,20, 0, 0, - 0,20,19, 0,19,21,17,18, 0,21, 0, 0, 0, 0,21,21, - 18,17, 0, 0,21,18,18, 0, 0, 0, 0,21, 0,20,19,16, - 17, 0, 0, 0, 0, 0, 0,21,20,17,17, 0,11,11,13,13, - 0,13,13,16,16, 0,13,13,16,16, 0,17,17, 0,21, 0, - 18,19,21, 0, 0,12,12,16,16, 0,15,15,19,18, 0,13, - 13,16,16, 0,16,17,21,19, 0,17,17,21,21, 0,13,13, - 16,16, 0,16,16,20,18, 0,13,13,16,16, 0,17,17, 0, - 0, 0,18,18, 0, 0, 0,18,17, 0,20, 0, 0, 0, 0, 0, - 0,15,15,21,21, 0,19,18, 0, 0, 0,17,17,21,21, 0, - 17,17, 0, 0, 0, 0, 0, 0, 0, 0,15,15,20,21, 0,20, - 20, 0, 0, 0,19,19, 0, 0, 0,14,15,21,19, 0,16,16, - 0,21, 0,17,16,21,21, 0,17,18,21,20, 0,18,18, 0, - 21, 0,16,16, 0,20, 0,19,19, 0, 0, 0,16,15, 0,20, - 0,18,18, 0, 0, 0,17,17, 0,21, 0,16,16,20,20, 0, - 20,19, 0, 0, 0,15,16,21,22, 0,18,18, 0, 0, 0,18, - 17, 0, 0, 0,18,18, 0, 0, 0, 0, 0, 0, 0, 0,16,16, - 21,20, 0,19,20, 0, 0, 0,18,17,21, 0, 0,17,18, 0, - 0, 0, 0, 0, 0, 0, 0,16,16, 0,20, 0, 0,20, 0, 0, - 0,18,18,22, 0, -}; - -static const static_codebook _44p1_p4_0 = { - 5, 3125, - (char *)_vq_lengthlist__44p1_p4_0, - 1, -528744448, 1616642048, 3, 0, - (long *)_vq_quantlist__44p1_p4_0, - 0 -}; - -static const long _vq_quantlist__44p1_p4_1[] = { - 3, - 2, - 4, - 1, - 5, - 0, - 6, -}; - -static const char _vq_lengthlist__44p1_p4_1[] = { - 2, 3, 3, 3, 3, 3, 3, -}; - -static const static_codebook _44p1_p4_1 = { - 1, 7, - (char *)_vq_lengthlist__44p1_p4_1, - 1, -533200896, 1611661312, 3, 0, - (long *)_vq_quantlist__44p1_p4_1, - 0 -}; - -static const long _vq_quantlist__44p1_p5_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p1_p5_0[] = { - 1, 6, 6, 7, 8, 8, 7, 8, 8, 7, 9, 8,10,11,11, 9, - 8, 8, 7, 8, 8,11,11,11, 9, 8, 8, 6, 7, 7,10,10, - 10,10,10,10,10,10,10,14,13,13,12,11,11,10,10,10, - 14,14,13,12,11,11, 6, 6, 6, 8, 5, 5, 8, 7, 7, 9, - 7, 7,11,10,10, 9, 7, 7, 9, 7, 7,12,10,10,10, 7, - 7, 7, 8, 8,12,11,10,12,10,10,11,10,10,15,13,13, - 13,10,10,11,10,10,17,14,13,13,10,10, 7, 7, 7,12, - 11,12,12,11,11,12,11,11,16,14,14,13,12,12,12,11, - 11,17,15,14,14,12,12,10, 9, 9,13,11,11,13,11,11, - 13,11,11,17,14,13,14,11,11,12,11,11,16,15,14,14, - 11,11, 7, 8, 8,12,11,11,12,10,10,12,10,10,15,13, - 13,14,11,10,12,10,10,16,14,14,14,10,10, 8, 7, 7, - 12,11,11,12,11,11,12,11,11,17,14,14,14,12,12,12, - 11,11,16,15,15,14,12,12,10,10,10,13,11,11,13,11, - 11,13,11,12,16,14,14,14,11,11,13,12,11,16,15,15, - 14,11,11, -}; - -static const static_codebook _44p1_p5_0 = { - 5, 243, - (char *)_vq_lengthlist__44p1_p5_0, - 1, -527106048, 1620377600, 2, 0, - (long *)_vq_quantlist__44p1_p5_0, - 0 -}; - -static const long _vq_quantlist__44p1_p5_1[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p1_p5_1[] = { - 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9, 8, 8, 8, - 7, 7, 8, 8, 8, 9, 8, 8, 9, 7, 7, 6, 6, 6, 9, 8, - 7, 9, 7, 7, 9, 8, 8,10, 8, 8,10, 8, 8,10, 8, 8, - 10, 8, 8,10, 8, 8, 7, 6, 6, 9, 6, 6, 9, 7, 7, 9, - 7, 7,10, 8, 8, 9, 6, 6, 9, 7, 7,10, 8, 8, 9, 7, - 7, 7, 8, 8,11, 9, 9,11, 9, 9,11, 8, 9,12, 9, 9, - 12, 8, 8,11, 9, 9,12, 9, 9,12, 8, 8, 8, 7, 7,10, - 9, 9,10,10, 9,10, 9, 9,11,10,10,11, 9, 9,11, 9, - 9,11,10,11,11, 9, 9,10, 8, 8,11, 9, 9,10, 9, 9, - 11, 9, 9,11,10,10,11, 9, 9,11, 9, 9,11,10,10,11, - 9, 9, 9, 8, 8,11, 9, 9,12, 9, 9,11, 9, 9,12, 9, - 9,12, 8, 8,12, 9, 9,12, 9, 9,12, 8, 8, 9, 7, 7, - 11, 9, 9,11,10,10,11, 9, 9,11,11,11,11, 9, 9,11, - 10,10,11,11,11,11, 9, 9,10, 9, 9,11, 9, 9,11,10, - 10,11, 9, 9,11,10,10,11, 9, 9,11, 9,10,11,10,10, - 11, 9, 9, -}; - -static const static_codebook _44p1_p5_1 = { - 5, 243, - (char *)_vq_lengthlist__44p1_p5_1, - 1, -530841600, 1616642048, 2, 0, - (long *)_vq_quantlist__44p1_p5_1, - 0 -}; - -static const long _vq_quantlist__44p1_p6_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p1_p6_0[] = { - 1, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, -}; - -static const static_codebook _44p1_p6_0 = { - 5, 243, - (char *)_vq_lengthlist__44p1_p6_0, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44p1_p6_0, - 0 -}; - -static const long _vq_quantlist__44p1_p6_1[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const char _vq_lengthlist__44p1_p6_1[] = { - 1, 3, 2, 5, 4, 7, 7, 8, 8, 9, 9,10,10,11,11,12, - 12,13,13,13,14,16,16,16,16, -}; - -static const static_codebook _44p1_p6_1 = { - 1, 25, - (char *)_vq_lengthlist__44p1_p6_1, - 1, -518864896, 1620639744, 5, 0, - (long *)_vq_quantlist__44p1_p6_1, - 0 -}; - -static const long _vq_quantlist__44p1_p6_2[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const char _vq_lengthlist__44p1_p6_2[] = { - 3, 4, 4, 5, 4, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44p1_p6_2 = { - 1, 25, - (char *)_vq_lengthlist__44p1_p6_2, - 1, -529006592, 1611661312, 5, 0, - (long *)_vq_quantlist__44p1_p6_2, - 0 -}; - -static const char _huff_lengthlist__44p1_short[] = { - 4, 5, 7, 8,10,13,14, 4, 2, 4, 6, 8,11,12, 7, 4, - 3, 5, 8,12,14, 8, 5, 4, 4, 8,12,12, 9, 7, 7, 7, - 9,10,11,13,11,11, 9, 7, 8,10,13,11,10, 6, 5, 7, - 9, -}; - -static const static_codebook _huff_book__44p1_short = { - 2, 49, - (char *)_huff_lengthlist__44p1_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p2_l0_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44p2_l0_0[] = { - 1, 4, 4, 7, 7, 8, 8, 9, 9,10,10,11,11, 4, 6, 5, - 8, 7, 9, 8,10, 9,11,10,11,11, 4, 5, 6, 7, 8, 8, - 9, 9,10,10,10,10,11, 8, 9, 8,10, 8,10, 9,11,10, - 11,11,11,11, 8, 8, 9, 8,10, 9,10,10,11,11,11,11, - 11, 9,10,10,11,11,11,11,11,11,12,11,12,11, 9,10, - 10,10,11,11,11,11,11,11,12,11,12,10,11,11,12,11, - 12,12,12,12,12,12,12,12,10,11,11,11,11,12,12,12, - 13,12,12,12,12,11,12,12,12,12,13,13,12,12,12,12, - 12,12,11,12,12,12,12,13,13,12,13,12,12,12,12,12, - 13,13,13,13,13,13,12,13,12,13,12,12,12,13,13,13, - 13,13,13,13,12,13,12,12,12, -}; - -static const static_codebook _44p2_l0_0 = { - 2, 169, - (char *)_vq_lengthlist__44p2_l0_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44p2_l0_0, - 0 -}; - -static const long _vq_quantlist__44p2_l0_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p2_l0_1[] = { - 2, 4, 4, 5, 5, 4, 5, 5, 6, 5, 4, 5, 5, 5, 6, 5, - 5, 6, 6, 6, 5, 6, 5, 6, 6, -}; - -static const static_codebook _44p2_l0_1 = { - 2, 25, - (char *)_vq_lengthlist__44p2_l0_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p2_l0_1, - 0 -}; - -static const long _vq_quantlist__44p2_l1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p2_l1_0[] = { - 1, 4, 4, 4, 4, 4, 4, 4, 4, -}; - -static const static_codebook _44p2_l1_0 = { - 2, 9, - (char *)_vq_lengthlist__44p2_l1_0, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44p2_l1_0, - 0 -}; - -static const char _huff_lengthlist__44p2_lfe[] = { - 1, 3, 2, 3, -}; - -static const static_codebook _huff_book__44p2_lfe = { - 2, 4, - (char *)_huff_lengthlist__44p2_lfe, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44p2_long[] = { - 3, 4, 9, 8, 8,10,13,16, 4, 2, 9, 5, 7,10,14,18, - 9, 7, 6, 5, 7, 9,12,16, 7, 5, 5, 3, 5, 8,11,13, - 8, 7, 7, 5, 5, 7, 9,11,10,10, 9, 8, 6, 6, 8,10, - 13,14,13,11, 9, 8, 9,10,17,18,16,14,11,10,10,10, -}; - -static const static_codebook _huff_book__44p2_long = { - 2, 64, - (char *)_huff_lengthlist__44p2_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p2_p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p2_p1_0[] = { - 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44p2_p1_0 = { - 5, 243, - (char *)_vq_lengthlist__44p2_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p2_p1_0, - 0 -}; - -static const long _vq_quantlist__44p2_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p2_p2_0[] = { - 1, 4, 4, 0, 0, 0, 8, 8, 0, 0, 0, 9, 9, 0, 0, 0, - 10,10, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 0, 0, 0,11,11, 0, 0, 0, 0, 0, - 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, - 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0,11,11, 0, 0, - 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0,11,11, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, - 6, 6, 0, 0, 0, 7, 7, 0, 0, 0, 8, 8, 0, 0, 0, 0, - 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, - 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, - 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 8, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 8, 8, 0, - 0, 0,10,10, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, - 11,11, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 0, 0, 0,11,10, 0, 0, 0, 0, 0, - 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, - 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 8, 8, 0, 0, 0,10,10, 0, 0, 0,11,11, 0, 0, - 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0,11,11, 0, 0, 0, - 0, 0, 0, 0, 0,10,10, 0, 0, 0,13,13, 0, 0, 0, 0, - 0, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0,12,12, - 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0,13,13, 0, - 0, 0, 0, 0, 0, 0, 0,12,12, 0, 0, 0,13,13, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, - 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0,11,11, - 0, 0, 0,12,12, 0, 0, 0,12,12, 0, 0, 0, 0, 0, 0, - 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0,12,11, 0, 0, - 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0,13,13, 0, 0, 0, - 0, 0, 0, 0, 0,12,12, 0, 0, 0,13,13, 0, 0, 0, 0, - 0, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0,12,12, - 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 8, 8, 0, 0, 0,10,10, 0, 0, 0,11,11, 0, - 0, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0,13,13, 0, 0, - 0, 0, 0, 0, 0, 0,12,12, 0, 0, 0,13,13, 0, 0, 0, - 0, 0, 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0,10, - 10, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0,14,13, - 0, 0, 0, 0, 0, 0, 0, 0,13,12, 0, 0, 0,13,13, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0,11, - 11, 0, 0, 0,12,12, 0, 0, 0,12,12, 0, 0, 0, 0, 0, - 0, 0, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0,12,12, 0, - 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0,13,13, 0, 0, - 0, 0, 0, 0, 0, 0,12,12, 0, 0, 0,12,12, 0, 0, 0, - 0, 0, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0,12, - 12, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 0, 0, 0,11,11, 0, 0, 0,12,12, - 0, 0, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0,12,12, 0, - 0, 0, 0, 0, 0, 0, 0,11,11, 0, 0, 0,14,14, 0, 0, - 0, 0, 0, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, - 12,12, 0, 0, 0,12,13, 0, 0, 0, 0, 0, 0, 0, 0,12, - 12, 0, 0, 0, 0, 0, 0, 0, 0,11,11, 0, 0, 0,14,13, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, - 11,11, 0, 0, 0,12,12, 0, 0, 0,13,13, 0, 0, 0, 0, - 0, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0,12,12, - 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0,12,12, 0, - 0, 0, 0, 0, 0, 0, 0,12,12, 0, 0, 0,14,14, 0, 0, - 0, 0, 0, 0, 0, 0,14,14, 0, 0, 0, 0, 0, 0, 0, 0, - 12,12, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44p2_p2_0 = { - 5, 3125, - (char *)_vq_lengthlist__44p2_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p2_p2_0, - 0 -}; - -static const long _vq_quantlist__44p2_p3_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p2_p3_0[] = { - 1, 5, 5, 6, 7, 7, 0, 8, 8, 6, 9, 9, 8,11,11, 0, - 8, 8, 0, 9, 9, 0,12,12, 0, 8, 8, 5, 7, 7, 7,10, - 10, 0,12,12, 8,11,11, 9,12,12, 0,11,12, 0,12,12, - 0,15,15, 0,12,12, 0, 6, 6, 0, 6, 6, 0, 7, 7, 0, - 7, 7, 0,10,10, 0, 7, 7, 0, 8, 8, 0,11,11, 0, 7, - 7, 6, 7, 7,10, 9, 9, 0,11,10,10, 9, 9,12,12,12, - 0,10,10, 0,11,11, 0,13,13, 0,11,11, 7, 6, 6,10, - 10,10, 0,11,11,11,11,11,12,12,12, 0,11,11, 0,12, - 12, 0,15,15, 0,11,11, 0,11,11, 0,11,11, 0,12,12, - 0,12,12, 0,14,14, 0,12,12, 0,12,12, 0,15,15, 0, - 11,11, 0, 8, 8, 0,10,10, 0,11,11, 0,11,11, 0,12, - 12, 0,12,12, 0,11,11, 0,15,15, 0,11,11, 0, 6, 6, - 0,10,10, 0,12,12, 0,10,10, 0,13,13, 0,12,12, 0, - 13,13, 0,14,14, 0,12,12, 0, 0, 0, 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 static_codebook _44p2_p3_0 = { - 5, 243, - (char *)_vq_lengthlist__44p2_p3_0, - 1, -533200896, 1614282752, 2, 0, - (long *)_vq_quantlist__44p2_p3_0, - 0 -}; - -static const long _vq_quantlist__44p2_p3_1[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p2_p3_1[] = { - 2, 3, 3, 0, 8, 8, 0, 8, 8, 0, 9, 9, 0, 9, 9, 0, - 9, 9, 0, 9, 9, 0, 9, 9, 0, 8, 8, 0, 6, 6, 0, 7, - 7, 0, 7, 7, 0, 8, 8, 0, 8, 8, 0, 8, 8, 0, 8, 8, - 0, 8, 8, 0, 8, 8, 0, 6, 6, 0, 6, 6, 0, 6, 6, 0, - 8, 8, 0, 9, 9, 0, 7, 7, 0, 8, 8, 0, 9, 9, 0, 6, - 6, 0, 8, 8, 0, 9, 9, 0, 9, 9, 0,10,10, 0,10,10, - 0,10,10, 0,10,10, 0,11,11, 0, 9, 9, 0, 7, 7, 0, - 10,10, 0,10,10, 0,12,11, 0,12,12, 0,11,11, 0,11, - 11, 0,12,12, 0,10,10, 0, 7, 7, 0,10,10, 0,10,10, - 0,12,12, 0,11,12, 0,11,11, 0,11,11, 0,11,11, 0, - 10,10, 0, 8, 8, 0, 9, 9, 0, 9, 9, 0,10,10, 0,10, - 10, 0,10, 9, 0,10,10, 0,10,10, 0, 9, 9, 0, 6, 6, - 0,10,10, 0,10,10, 0,11,11, 0,12,12, 0,11,11, 0, - 11,11, 0,12,12, 0,11,11, 0, 7, 7, 0, 9, 9, 0, 9, - 9, 0,11,11, 0,11,11, 0,10,10, 0,10,10, 0,11,11, - 0, 9, 9, -}; - -static const static_codebook _44p2_p3_1 = { - 5, 243, - (char *)_vq_lengthlist__44p2_p3_1, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p2_p3_1, - 0 -}; - -static const long _vq_quantlist__44p2_p4_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p2_p4_0[] = { - 1, 6, 6, 6, 7, 7, 7, 8, 8, 7, 8, 8,10,11,11, 9, - 8, 8, 7, 8, 8,11,11,11, 9, 8, 8, 6, 7, 7, 9,11, - 11, 9,11,11,10,11,11,12,13,13,11,12,12,10,11,11, - 13,14,14,12,12,12, 6, 6, 6, 8, 6, 6, 8, 7, 7, 9, - 7, 7,11,10,10,10, 6, 6, 9, 7, 7,12,10,10,11, 6, - 7, 7, 7, 7,11,10,10,12,10,10,11,10,10,14,13,13, - 13,10,10,12,11,11,15,13,13,14,10,10, 8, 7, 7,12, - 11,11,12,11,11,11,11,11,14,14,14,13,12,12,12,11, - 11,15,15,15,13,12,12, 0,10,10, 0,11,11, 0,11,11, - 0,11,11, 0,14,14, 0,11,11, 0,11,11, 0,15,15, 0, - 11,11, 7, 8, 8,12,10,10,12,10,10,12,11,11,15,13, - 13,14,11,11,12,10,10,16,14,14,14,10,10, 8, 7, 7, - 12,11,11,12,11,11,12,11,11,16,14,14,14,12,12,13, - 12,12,15,14,14,15,12,12, 0,11,11, 0,12,12, 0,12, - 12, 0,12,12, 0,15,15, 0,12,12, 0,12,12, 0,14,14, - 0,12,12, -}; - -static const static_codebook _44p2_p4_0 = { - 5, 243, - (char *)_vq_lengthlist__44p2_p4_0, - 1, -531365888, 1616117760, 2, 0, - (long *)_vq_quantlist__44p2_p4_0, - 0 -}; - -static const long _vq_quantlist__44p2_p4_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p2_p4_1[] = { - 3, 4, 4, 8, 8,11, 9, 9,12,12,11,10,10,12,12,12, - 10,10,11,11,12,12,12,12,12,12,11,11,13,13,12,12, - 12,13,13,12,10,10,12,12,12,11,11,13,13,12,13,13, - 13,13,12,11,11,13,13,12,12,12,13,13,12,10,10,12, - 12,12,11,11,13,13,12,13,13,12,12,12,11,11,13,13, - 12,13,13,13,13,12,11,11,12,12,12,11,11,12,12,12, - 13,13,12,12,12,13,13,13,13,12,13,13,13,13,13,13, - 13,12,12,12,13,13,13,13,12,13,13,12,12,11, 8, 8, - 10,10,12,11,11,11,11,12,10,10,10,10,13,11,11,10, - 10,13,11,11,10,10,13,12,12,12,12,13,11,11,11,11, - 13,12,12,11,11,13,12,12,11,11,13,12,12,12,11,13, - 12,12,12,12,13,11,11,11,11,13,12,12,11,11,13,11, - 12,11,11,13,12,12,11,11,14,12,12,11,11,13,11,11, - 11,11,14,12,12,11,11,13,11,12,10,10,14,12,12,11, - 11,14,12,12,11,11,14,11,11,11,11,14,12,12,11,11, - 13,12,12,11,11,14,12,12,11,11,11, 8, 8,10,10,12, - 7, 7,10,10,12, 9, 9,11,11,13, 9, 9, 9, 9,13,13, - 13,10,10,13, 9, 9,12,12,13,13,13,12,12,13, 9, 8, - 11,11,13,10,10,12,12,14,13,13,11,11,13, 9, 9,11, - 11,13,13,13,12,12,13, 9, 9,10,10,13,10,10,11,11, - 13,13,13,10,10,14,10,10,11,11,14,14,14,12,12,13, - 9, 9,10,10,13,10,10,11,11,14,13,14,10,10,14,14, - 14,11,12,14,14,14,14,14,14,13,13,10,10,13,14,14, - 11,11,14,14,14,10,10,14, 9, 9, 9, 9,14, 9, 9, 9, - 9,14,10,10, 9, 9,14,10,10, 8, 8,14,11,11, 8, 8, - 15,11,11,10,10,15,12,12,10,10,15,10,10,10,10,15, - 11,11,10,10,15,13,13,10,10,15,11,11,10,10,15,12, - 12,10,10,15,10,10,10,10,15,11,11,10,10,15,13,13, - 10,10,15,11,11,10,10,15,12,12,10,10,15,11,11, 9, - 9,15,11,11, 9, 9,15,13,13, 9, 9,15,13,13,10,10, - 15,12,12,10,10,15,13,13,10,10,15,13,12, 9, 9,15, - 13,13, 9, 9,14,12,12, 9, 9,14,13,13, 9, 9,14,13, - 13, 9, 9,14,13,13, 7, 7,14,13,13, 8, 8,15,14,14, - 10,10,15,14,14,10,10,15,14,14,10,10,15,14,14,10, - 10,15,14,14, 9, 9,15,14,14,10,10,15,14,14,10,10, - 14,14,14, 9, 9,15,14,14,10,10,14,14,14, 9, 9,15, - 14,14,10,10,15,14,14,10,10,14,14,14, 9, 9,14,14, - 14, 9, 9,14,14,14, 8, 8,15,14,14,10,10,15,14,14, - 11,11,15,14,14, 9, 9,15,14,14, 9, 9,14,14,14, 8, - 8,13, 9, 9,12,12,17,11,11,12,12,17,12,12,12,12, - 17,12,12,11,11,18,15,15,12,12,17,12,12,12,12,17, - 14,15,13,13,17,12,12,12,12,17,13,13,12,13,17,15, - 15,12,12,18,13,13,13,13,18,15,15,13,13,18,12,12, - 12,12,18,13,13,13,13,18,15,15,12,12,18,13,13,12, - 12,18,15,15,13,13,18,13,13,12,12,17,13,13,12,12, - 17,15,15,12,12,18,15,15,13,13,18,15,15,13,14,18, - 15,16,12,12,18,15,15,12,12,18,16,16,12,12,13, 8, - 8,10,10,14,15,14,11,11,14,15,15,12,12,15,14,14, - 12,11,15,15,15,12,12,15,15,15,12,12,15,15,15,13, - 13,15,15,15,12,12,15,15,15,13,13,15,15,15,13,13, - 15,15,15,13,13,15,15,16,13,13,15,15,15,12,12,15, - 15,15,13,13,15,15,15,13,13,15,15,15,13,13,15,15, - 15,13,13,15,15,14,12,12,15,15,15,12,12,16,15,14, - 12,12,16,15,15,13,13,16,16,16,13,13,16,15,15,12, - 12,15,15,15,13,13,15,15,15,12,12,13,12,12,10,10, - 14,14,14,11,11,15,14,14,12,12,15,14,14,11,11,15, - 14,14,11,11,15,15,15,13,13,15,14,14,13,13,15,15, - 15,12,12,15,14,15,13,13,16,15,15,12,12,15,15,15, - 13,13,16,14,14,13,13,15,15,15,12,12,15,15,15,13, - 13,16,15,15,12,12,16,15,15,12,12,16,14,14,13,13, - 15,15,15,11,11,15,15,15,12,12,16,15,15,11,11,16, - 15,15,13,13,16,14,15,14,14,16,15,15,12,12,16,15, - 14,12,12,16,15,15,12,12,14,10,10, 9, 9,14,11,11, - 12,12,14,12,12,13,13,14,12,12,12,12,15,14,14,13, - 13,15,13,13,14,14,15,14,14,15,15,15,12,12,13,13, - 15,13,13,14,14,15,14,14,13,13,15,13,13,13,14,15, - 14,14,15,15,15,12,12,13,13,15,13,13,14,14,15,14, - 14,13,13,15,13,13,14,14,15,14,14,15,15,15,13,13, - 12,12,15,13,13,13,13,15,14,14,13,12,15,15,15,14, - 15,15,15,14,20,20,15,14,14,13,13,15,14,14,13,13, - 15,14,14,13,13,14,12,12, 9, 9,14,14,14,12,12,14, - 13,13,12,13,14,14,14,12,12,15,14,14,12,12,15,14, - 14,14,13,15,14,14,14,14,15,14,14,13,13,15,14,14, - 13,13,15,15,15,14,14,15,14,14,13,13,15,14,14,14, - 14,15,14,14,13,13,15,14,14,13,13,15,15,15,15,14, - 15,15,15,13,13,15,14,14,14,14,15,14,14,13,13,15, - 14,14,13,13,14,15,15,14,14,15,15,15,14,14,15,14, - 14,14,14,15,15,15,14,14,15,14,14,13,14,15,15,15, - 14,14,13,10,10,12,12,17,11,11,12,12,17,12,12,12, - 12,17,12,12,11,11,17,15,15,12,11,18,13,13,13,13, - 18,15,15,13,13,17,12,12,12,12,18,13,13,13,13,17, - 15,15,12,12,17,12,12,12,12,17,15,15,13,13,17,12, - 12,12,12,17,13,13,12,12,17,15,15,12,12,18,14,13, - 12,12,18,15,15,13,13,18,13,13,12,12,18,13,13,12, - 12,18,16,16,12,12,18,16,16,12,12,18,15,15,13,13, - 18,16,16,12,12,17,15,15,12,12,17,16,16,12,12,13, - 8, 8,10,10,14,14,15,12,12,14,15,15,12,12,15,14, - 14,12,12,15,15,14,12,12,15,15,15,13,13,15,15,15, - 13,13,15,15,15,12,12,16,15,15,13,13,16,15,15,13, - 13,15,15,15,12,12,15,15,15,14,14,15,15,15,12,12, - 15,15,15,13,13,16,15,15,13,13,15,15,15,13,13,16, - 15,15,13,13,15,15,14,12,12,15,15,15,12,12,16,14, - 15,13,13,16,15,15,13,13,15,16,15,13,13,16,15,14, - 13,13,16,15,15,13,13,16,15,15,13,13,13,12,12,11, - 11,14,14,14,11,11,14,14,14,12,12,15,14,14,11,11, - 16,14,14,11,11,15,15,15,12,13,16,14,14,13,13,15, - 15,15,12,12,15,14,14,13,13,16,15,15,12,12,15,15, - 15,12,12,15,14,14,13,13,15,15,15,12,12,15,14,14, - 12,12,16,15,15,12,12,16,15,15,12,12,16,14,14,13, - 13,15,15,15,11,11,15,15,14,12,12,16,15,15,11,11, - 16,15,15,12,12,16,14,14,13,13,16,15,15,11,11,16, - 14,14,12,12,16,15,15,11,11,14,10,10, 9, 9,14,11, - 11,12,12,14,12,12,13,14,14,12,12,12,12,14,14,14, - 13,13,15,13,13,14,14,15,14,14,15,15,15,12,12,13, - 13,15,13,13,14,14,15,15,15,14,14,15,13,13,14,14, - 15,15,15,15,15,15,12,12,13,13,15,13,13,14,14,15, - 14,14,13,13,15,13,13,14,14,15,14,14,15,15,15,12, - 12,13,13,15,13,13,13,13,14,14,14,13,13,15,15,15, - 14,15,15,15,15,21,19,15,14,14,13,13,15,14,14,14, - 14,14,14,14,13,13,14,12,12, 9, 9,14,14,14,12,12, - 14,14,13,13,13,14,14,14,12,12,14,14,14,12,12,15, - 14,14,13,13,15,14,14,14,14,15,14,14,13,13,15,14, - 14,13,13,15,15,15,15,15,15,14,14,13,13,15,14,14, - 14,14,15,14,14,13,13,15,14,14,13,13,14,15,15,15, - 15,15,14,15,13,13,15,14,14,14,14,15,14,14,13,13, - 15,14,14,13,13,14,15,15,14,14,15,15,15,14,14,15, - 14,14,14,14,15,15,15,15,15,15,14,14,14,13,14,15, - 15,14,14,13,10,10,12,12,18,12,12,12,12,17,12,12, - 12,12,18,13,13,11,11,18,15,14,11,11,17,13,13,13, - 13,18,15,15,12,12,18,12,12,12,12,17,13,13,12,12, - 18,15,15,12,12,18,13,13,13,12,18,15,15,13,13,18, - 13,13,12,12,18,13,13,12,12,18,15,15,12,12,17,13, - 13,12,12,17,15,15,12,12,17,12,12,11,11,17,13,13, - 11,11,17,15,15,11,11,18,16,16,12,12,18,15,15,13, - 13,18,15,15,11,11,17,15,15,12,12,18,15,15,11,11, - 13, 8, 8,10,10,14,14,14,11,11,15,15,15,12,12,15, - 14,14,11,11,16,14,14,12,12,15,15,15,12,12,15,15, - 15,13,13,15,15,15,12,12,15,15,15,12,12,16,15,15, - 13,13,15,15,15,12,12,15,15,15,13,13,16,15,15,12, - 12,15,15,15,12,12,16,15,15,13,13,16,15,15,12,12, - 15,15,15,13,13,15,14,14,12,12,15,15,15,12,12,16, - 15,14,12,12,16,15,15,13,13,16,16,16,13,13,16,14, - 15,13,13,15,15,15,13,13,16,15,15,12,12,13,12,12, - 10,10,14,14,14,11,11,15,14,14,12,12,15,14,14,11, - 11,16,14,14,11,11,15,14,15,12,12,15,14,14,13,13, - 15,15,15,12,12,15,14,14,12,12,15,14,15,12,12,15, - 15,15,12,12,16,14,14,13,13,15,15,15,11,12,16,14, - 14,12,12,16,15,15,12,12,15,15,15,12,12,16,14,14, - 12,12,15,15,15,11,11,15,14,14,11,12,15,15,14,11, - 11,16,15,15,12,12,16,14,14,13,13,16,15,15,11,11, - 16,14,14,12,12,16,15,15,11,11,13,10,10, 8, 8,14, - 12,12,12,12,14,12,12,13,13,14,12,12,12,12,14,14, - 14,13,13,15,13,13,14,14,15,15,14,15,15,15,13,13, - 13,13,15,13,13,14,14,15,14,15,14,14,15,13,13,13, - 13,15,15,15,15,15,15,12,12,13,12,15,13,13,14,14, - 15,14,14,13,13,15,13,13,14,13,15,15,15,16,16,15, - 13,13,12,12,15,13,13,13,13,14,14,14,12,12,15,15, - 15,14,14,15,15,15,20,20,15,14,14,13,13,15,15,14, - 14,14,15,14,14,13,13,13,12,12, 9, 9,14,13,13,12, - 12,14,13,13,12,12,14,14,14,12,12,14,14,14,13,13, - 15,14,14,13,13,15,14,14,14,14,15,15,14,12,12,15, - 14,14,13,13,15,14,15,14,15,15,14,14,13,13,15,14, - 14,14,14,15,14,14,12,12,15,14,14,13,13,14,15,14, - 15,14,15,14,14,13,13,15,14,14,14,14,15,14,14,12, - 12,15,14,14,13,13,15,15,15,14,14,15,15,15,14,14, - 16,14,14,14,14,15,15,15,14,14,15,14,14,14,14,14, - 15,15,14,14,13,13,13,12,13,17,15,15,12,12,17,15, - 15,12,12,18,15,15,11,11,17,16,16,11,11,18,16,16, - 13,13,18,17,16,13,13,18,16,16,12,12,18,16,16,12, - 12,18,17,17,12,12,17,16,16,12,13,17,16,16,12,13, - 17,16,16,12,12,17,16,16,12,12,18,17,16,12,12,18, - 16,16,12,12,17,16,17,12,12,18,15,15,11,11,18,15, - 15,12,12,17,17,17,11,11,17,17,17,12,12,17,16,16, - 13,13,18,16,16,11,11,18,16,16,12,12,18,17,16,11, - 11,14,14,14,10,10,16,15,14,11,11,16,15,15,12,12, - 16,14,14,12,12,17,14,14,13,13,17,15,15,13,13,17, - 15,15,14,14,16,15,15,12,12,16,15,15,13,13,18,15, - 15,14,14,16,15,15,12,12,16,15,15,14,14,16,15,15, - 12,12,16,15,15,13,13,17,15,15,13,13,17,15,15,13, - 13,17,15,15,14,14,16,14,14,12,12,17,15,15,12,12, - 18,15,15,13,13,17,15,15,14,14,17,16,16,15,15,17, - 15,14,13,13,17,15,15,14,14,17,15,15,13,13,14,12, - 12,11,11,15,14,14,12,12,16,14,14,12,12,16,14,14, - 11,11,17,14,14,12,12,16,15,14,13,13,16,14,14,13, - 13,16,15,15,12,12,16,14,14,13,13,17,15,15,13,13, - 16,15,15,13,13,17,14,14,13,13,16,15,15,12,12,16, - 14,14,12,12,16,15,15,12,12,17,15,15,12,12,17,14, - 14,13,13,16,15,15,12,12,16,14,14,12,12,16,15,15, - 12,12,17,15,15,13,13,17,14,14,13,13,17,15,15,12, - 12,17,14,14,12,12,17,15,15,12,12,14,14,14, 8, 8, - 14,14,14,13,13,14,15,15,14,14,14,14,14,14,14,15, - 15,15,19,19,15,15,15,14,14,15,15,16,20,19,15,15, - 15,14,14,15,16,16,15,15,15,15,15,19,19,15,15,15, - 14,14,15,16,16,19,20,15,15,15,14,14,15,15,15,15, - 15,15,15,15,19,19,15,15,15,15,15,15,15,16,19,20, - 15,14,15,14,14,15,15,15,15,15,15,15,15,20,19,15, - 15,15,21,19,15,16,16,20,20,15,15,14,19,19,15,15, - 16,20,21,15,15,15,20,19,13,12,12, 9, 9,14,14,14, - 12,12,14,13,13,13,13,14,14,14,13,13,15,14,14,20, - 19,15,14,14,14,13,15,14,14,19,19,15,15,14,13,13, - 15,14,14,14,14,15,15,15,19,20,15,14,14,13,13,15, - 14,14,20,19,14,15,14,13,13,15,14,14,14,13,15,15, - 15,19,20,15,15,14,14,14,15,14,14,21,19,15,15,15, - 13,13,15,14,14,14,14,14,15,15,20,20,15,15,15,21, - 20,15,14,14,19,20,15,15,15,20,20,15,14,14,19,20, - 15,15,15,21,19, -}; - -static const static_codebook _44p2_p4_1 = { - 5, 3125, - (char *)_vq_lengthlist__44p2_p4_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p2_p4_1, - 0 -}; - -static const long _vq_quantlist__44p2_p5_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p2_p5_0[] = { - 2, 6, 6,14,14, 6, 7, 7,14,14, 7, 7, 7,15,15, 0, - 13,13,16,16, 0,13,13,15,15, 7, 8, 8,15,15, 9,10, - 10,17,16, 9, 8, 8,15,15, 0,13,13,18,17, 0,13,13, - 16,16, 8, 8, 8,15,15,12,11,11,16,17, 9, 8, 8,14, - 14, 0,13,13,18,17, 0,13,13,16,15, 0,14,14,18,17, - 0,20,22,18,20, 0,12,12,16,16, 0,16,16,22,20, 0, - 14,14,16,16, 0,14,14,17,17, 0,22,22,22,19, 0,12, - 13,16,16, 0,17,17, 0, 0, 0,15,15,16,16, 5, 7, 7, - 13,13, 9, 9, 9,15,14,10,10,10,14,14, 0,21,21,18, - 17, 0,21,22,18,17, 9,10,10,14,14,12,12,12,17,17, - 12,10,10,14,14, 0,19,21,18,17, 0,20,22,18,18,11, - 10,10,14,14,14,13,13,18,17,12,11,11,14,14, 0,22, - 19,17,18, 0,20, 0,18,17, 0,22,21,17,17, 0, 0, 0, - 0, 0, 0,20,22,17,17, 0,22, 0,21,19, 0,22, 0,18, - 18, 0, 0,22,18,19, 0, 0, 0, 0, 0, 0,19,21,17,17, - 0, 0, 0,20,20, 0, 0, 0,18,18, 6, 6, 6,13,12, 8, - 6, 6,11,11, 8, 6, 6,13,13, 0, 9, 9,11,11, 0,11, - 11,14,14, 9, 7, 7,13,13,11, 9, 9,13,13,10, 6, 6, - 13,13, 0,10,10,14,14, 0,10,10,13,13, 9, 7, 7,13, - 14,13, 9, 9,13,13,10, 6, 6,13,12, 0,11,11,15,15, - 0,10,10,13,13, 0,12,12,15,15, 0,19, 0,17,17, 0, - 9, 9,13,13, 0,13,14,19,20, 0,11,11,13,13, 0,11, - 11,14,14, 0,19,20,17,18, 0,10,10,13,13, 0,15,15, - 21,19, 0,12,12,13,13, 0,10,10,12,13, 0,11,11,15, - 15, 0,11,11,15,15, 0,15,15,22, 0, 0,16,17,22, 0, - 0,11,11,15,15, 0,14,14,18,17, 0,11,11,15,16, 0, - 15,15,22,21, 0,16,16, 0,20, 0,12,12,16,15, 0,15, - 14,19,19, 0,11,11,16,16, 0,15,15,21, 0, 0,16,15, - 0, 0, 0,16,16,22,21, 0, 0, 0, 0, 0, 0,15,15,20, - 20, 0,18,18, 0, 0, 0,16,17, 0, 0, 0,17,17, 0,22, - 0, 0, 0, 0, 0, 0,15,15,21,22, 0,20,18, 0, 0, 0, - 18,17,22, 0, 0,10,10,12,11, 0,10,10,10,10, 0,11, - 11,12,12, 0,11,11, 9, 9, 0,13,13,12,12, 0,11,11, - 12,12, 0,13,13,12,12, 0,10,10,12,12, 0,13,12,13, - 13, 0,12,12,12,12, 0,11,11,12,12, 0,13,13,12,12, - 0,10,10,12,12, 0,13,13,13,14, 0,12,12,12,12, 0, - 13,14,14,14, 0,20,21,15,15, 0,12,11,12,12, 0,15, - 16,20,22, 0,13,12,11,11, 0,13,13,14,13, 0,20, 0, - 16,15, 0,12,12,12,12, 0,16,16,22,21, 0,13,13,12, - 12, 6, 7, 7,16,16,11, 9, 9,15,15,12, 9, 9,16,16, - 0,13,13,14,14, 0,14,14,16,17,10, 9, 9,16,16,14, - 12,12,16,16,12, 9, 9,15,15, 0,13,13,18,18, 0,13, - 13,15,16,12,10,10,17,18,15,12,12,17,17,13, 9, 9, - 16,16, 0,13,13,17,18, 0,14,14,16,16, 0,15,15,18, - 18, 0,22, 0,20,20, 0,12,12,16,16, 0,16,16,20,22, - 0,14,14,16,16, 0,15,14,18,18, 0, 0,22,19,21, 0, - 13,13,16,17, 0,17,17,22,22, 0,15,15,16,16, 7, 7, - 7,14,14,11,10,10,15,15,12,10,10,15,14, 0,22, 0, - 18,18, 0, 0,21,17,18,11,10,10,15,15,14,12,12,17, - 17,14,11,11,15,15, 0,22,20,18,18, 0, 0,20,18,17, - 12,10,10,16,16,17,14,14,19,18,14,11,11,15,15, 0, - 21,22,19,19, 0,21,22,18,18, 0,22, 0,19,21, 0, 0, - 0, 0, 0, 0,22,22,18,17, 0, 0, 0,21,20, 0,22,22, - 20,19, 0, 0,22,20,20, 0, 0, 0, 0, 0, 0,20,21,17, - 17, 0, 0,22,21,21, 0, 0, 0,18,18,10, 9, 9,14,14, - 13,10,10,13,13,13,10,11,14,14, 0,13,13,12,12, 0, - 15,15,16,16,13,10,10,15,15,15,12,12,14,14,15,10, - 10,14,15, 0,14,14,16,15, 0,14,14,15,15,13,10,10, - 15,15,18,13,13,15,15,15,10,10,14,15, 0,14,14,16, - 16, 0,14,14,15,15, 0,15,15,16,16, 0,22, 0,18,18, - 0,12,13,14,14, 0,17,17,22, 0, 0,14,14,14,14, 0, - 15,15,16,16, 0,22, 0,18,17, 0,13,13,14,14, 0,19, - 18,21,22, 0,15,15,14,14, 0,11,11,13,13, 0,12,12, - 16,16, 0,12,12,16,16, 0,15,16,21, 0, 0,16,17, 0, - 22, 0,12,12,16,16, 0,14,14,17,18, 0,11,11,16,16, - 0,15,15,21,22, 0,16,16, 0, 0, 0,12,12,16,16, 0, - 15,15, 0,19, 0,12,12,16,17, 0,16,16,22, 0, 0,16, - 16, 0,22, 0,17,17, 0,22, 0, 0, 0, 0, 0, 0,15,15, - 20,19, 0,18,18, 0, 0, 0,17,18, 0, 0, 0,17,17, 0, - 0, 0, 0, 0, 0, 0, 0,15,15, 0,22, 0,20,18, 0, 0, - 0,18,18,22,22, 0,11,11,14,14, 0,12,12,14,14, 0, - 12,12,15,15, 0,13,13,14,14, 0,14,14,17,16, 0,12, - 12,16,16, 0,14,14,16,16, 0,11,11,15,15, 0,13,13, - 16,16, 0,13,13,15,15, 0,12,12,15,15, 0,15,14,16, - 16, 0,11,11,15,15, 0,14,14,17,17, 0,13,13,15,15, - 0,15,15,17,17, 0, 0, 0,19,18, 0,13,12,15,15, 0, - 16,16, 0, 0, 0,14,14,15,15, 0,14,14,16,17, 0,22, - 0,18,18, 0,13,13,15,15, 0,17,17, 0, 0, 0,14,14, - 15,15, 8, 8, 8,16,16,12,10,10,16,16,13, 9, 9,16, - 16, 0,14,14,17,17, 0,14,14,17,16,12,10,10,18,17, - 14,11,11,18,18,14, 9,10,16,16, 0,13,13,18,19, 0, - 14,13,16,16,12, 9, 9,16,16,17,13,13,17,17,14, 9, - 9,15,15, 0,14,14,19,20, 0,13,13,15,15, 0,15,15, - 18,19, 0, 0,22,22,22, 0,13,13,17,17, 0,16,16,19, - 21, 0,14,14,16,16, 0,14,14,18,18, 0, 0, 0, 0, 0, - 0,13,13,16,16, 0,18,18, 0, 0, 0,15,15,16,16, 8, - 7, 7,14,14,12,10,10,15,15,13,10,10,15,14, 0,22, - 0,18,18, 0,22, 0,18,18,12,10,10,16,15,15,12,12, - 17,17,14,11,11,15,15, 0,20,21,19,18, 0, 0, 0,17, - 18,13,11,11,15,15,16,13,13,18,18,15,11,11,14,14, - 0,22,21,19,19, 0,21,22,18,18, 0,22,22,20,18, 0, - 0, 0, 0, 0, 0,22,19,17,17, 0, 0, 0,22,21, 0, 0, - 22,19,17, 0, 0,22,19,19, 0, 0, 0, 0, 0, 0,22,21, - 18,17, 0, 0, 0,22, 0, 0, 0, 0,19,19, 0,10,10,14, - 14, 0,11,11,15,14, 0,11,11,15,15, 0,14,14,15,14, - 0,15,15,16,16, 0,11,11,16,16, 0,13,13,16,16, 0, - 11,11,15,15, 0,14,14,17,16, 0,14,14,15,15, 0,11, - 11,16,16, 0,14,13,15,15, 0,11,11,15,15, 0,15,15, - 17,17, 0,14,14,15,14, 0,16,16,17,17, 0, 0,22,18, - 18, 0,13,13,15,15, 0,17,17,22, 0, 0,15,15,15,14, - 0,15,16,16,17, 0, 0,22,18,19, 0,13,13,15,15, 0, - 20,18,21, 0, 0,15,15,14,14, 0,11,11,13,13, 0,12, - 12,16,16, 0,12,12,16,15, 0,15,16,22,22, 0,17,17, - 0, 0, 0,12,12,16,16, 0,14,14,18,18, 0,11,11,16, - 16, 0,15,16,22,20, 0,16,16, 0,22, 0,12,12,16,16, - 0,15,15,18,20, 0,11,11,16,16, 0,15,15, 0, 0, 0, - 16,16, 0, 0, 0,17,17,22, 0, 0, 0, 0, 0, 0, 0,15, - 15, 0,21, 0,18,18, 0, 0, 0,17,16, 0, 0, 0,17,17, - 22,22, 0, 0, 0, 0, 0, 0,15,15,21, 0, 0,20,22, 0, - 0, 0,18,18, 0, 0, 0,12,12,15,15, 0,12,12,15,15, - 0,12,12,16,16, 0,13,13,15,15, 0,15,15,17,17, 0, - 13,12,16,16, 0,14,14,16,16, 0,12,11,16,16, 0,14, - 14,17,17, 0,14,14,16,16, 0,12,12,16,16, 0,15,15, - 17,16, 0,11,11,15,16, 0,14,14,17,17, 0,14,14,16, - 16, 0,15,15,18,18, 0, 0, 0,22,19, 0,13,13,15,16, - 0,16,17, 0, 0, 0,14,14,16,16, 0,15,15,18,17, 0, - 0, 0,20,20, 0,13,13,16,15, 0,17,17,22,22, 0,14, - 14,15,15, 0,11,11,16,16, 0,13,13,16,17, 0,13,13, - 17,18, 0,16,16,17,17, 0,17,17,18,18, 0,12,12,17, - 17, 0,16,15,18,18, 0,12,12,16,16, 0,16,16,18,18, - 0,15,15,17,17, 0,12,12,17,17, 0,16,16,19,18, 0, - 12,12,16,17, 0,16,16,19,19, 0,15,16,16,17, 0,16, - 16,19,17, 0, 0, 0,20,22, 0,13,13,16,16, 0,19,18, - 21, 0, 0,15,15,16,16, 0,16,16,18,18, 0, 0, 0,22, - 21, 0,14,14,16,16, 0,21,19,21,22, 0,16,16,16,16, - 0, 9, 9,14,14, 0,13,13,15,15, 0,14,14,15,15, 0, - 0,20,18,19, 0, 0,22,18,18, 0,12,12,15,15, 0,15, - 15,17,18, 0,14,13,14,14, 0,20, 0,18,18, 0,21, 0, - 18,17, 0,13,13,15,16, 0,17,17,18,18, 0,14,14,15, - 15, 0,22,22,20,19, 0,20,21,18,18, 0,20,22,19,19, - 0, 0, 0, 0, 0, 0,20,20,17,17, 0, 0,22,22,21, 0, - 22, 0,18,18, 0,20,22,19,19, 0, 0, 0, 0, 0, 0,21, - 21,17,18, 0, 0, 0,21,20, 0, 0,22,19,18, 0,18,18, - 15,15, 0,22,21,17,16, 0, 0,22,17,17, 0,20,22,18, - 18, 0, 0,22,20,20, 0,21,19,16,16, 0,21,21,18,18, - 0,19,19,17,17, 0, 0,22,19,19, 0,22,20,17,17, 0, - 21,19,16,16, 0,22,22,19,18, 0,19,20,16,16, 0,22, - 21,19,21, 0,21,22,17,18, 0,21,20,18,18, 0, 0, 0, - 19,20, 0,20,19,16,16, 0,22,22, 0, 0, 0,21,21,17, - 16, 0,22,20,19,18, 0, 0, 0,20,20, 0,20,19,16,16, - 0, 0, 0, 0, 0, 0,21,22,17,17, 0,11,11,13,13, 0, - 13,13,15,16, 0,13,13,16,16, 0,17,18,21, 0, 0,17, - 18, 0, 0, 0,12,12,15,16, 0,15,15,19,18, 0,12,12, - 16,16, 0,17,17,22, 0, 0,17,17, 0,22, 0,12,12,17, - 16, 0,16,16,19,20, 0,12,12,16,16, 0,17,17, 0, 0, - 0,17,17, 0,21, 0,17,16,22, 0, 0, 0, 0, 0, 0, 0, - 15,15,20,22, 0,20,18, 0, 0, 0,18,18, 0, 0, 0,17, - 17,21, 0, 0, 0, 0, 0, 0, 0,15,15,21,22, 0,19,20, - 22, 0, 0,19,18, 0, 0, 0,14,14,18,18, 0,16,16,22, - 20, 0,16,16,22,19, 0,17,17,20,22, 0,19,19, 0, 0, - 0,15,15,20, 0, 0,18,21, 0,20, 0,15,15,21,20, 0, - 18,17, 0, 0, 0,17,17, 0,22, 0,15,15,19,19, 0,19, - 18, 0, 0, 0,15,15,20, 0, 0,18,18,22,22, 0,17,17, - 0,20, 0,18,18, 0, 0, 0, 0,22, 0, 0, 0,15,15,19, - 20, 0,20,19, 0, 0, 0,17,17,20,21, 0,17,18,20,22, - 0, 0, 0, 0,22, 0,15,15,20,20, 0,22,20, 0, 0, 0, - 17,18,20, 0, 0,12,12,17,16, 0,14,14,17,17, 0,13, - 13,17,17, 0,16,16,18,18, 0,17,16,17,17, 0,13,13, - 17,17, 0,15,16,18,18, 0,13,13,16,16, 0,16,16,18, - 18, 0,16,16,17,16, 0,13,13,16,16, 0,17,17,18,17, - 0,12,12,15,16, 0,17,17,19,19, 0,16,16,16,16, 0, - 16,17,19,18, 0, 0, 0,21,22, 0,14,14,16,16, 0,18, - 18, 0,22, 0,16,16,16,16, 0,16,16,18,17, 0, 0, 0, - 21,20, 0,14,14,16,16, 0,21,22,22, 0, 0,16,16,16, - 16, 0, 9, 9,14,13, 0,13,14,15,16, 0,14,13,15,14, - 0,22, 0,18,18, 0,21, 0,17,18, 0,13,13,15,15, 0, - 15,16,18,17, 0,14,14,15,14, 0,20,22,18,18, 0,22, - 21,17,17, 0,13,13,15,15, 0,17,17,19,19, 0,14,14, - 14,14, 0, 0,22,18,18, 0, 0,22,17,17, 0, 0,22,19, - 20, 0, 0, 0, 0, 0, 0,21,20,17,16, 0, 0, 0,21,22, - 0, 0, 0,18,19, 0, 0, 0,18,18, 0, 0, 0, 0, 0, 0, - 22, 0,17,17, 0, 0, 0,20,22, 0, 0, 0,18,19, 0,18, - 19,16,16, 0,22,20,17,17, 0,22,22,17,18, 0,22,22, - 18,17, 0, 0,22,18,19, 0,20,20,17,18, 0, 0,22,19, - 18, 0,22,22,17,17, 0,22, 0,19,19, 0, 0,22,18,18, - 0,20,22,17,17, 0, 0,22,18,18, 0,19,20,17,17, 0, - 22, 0,20,19, 0,22,21,17,17, 0, 0, 0,18,18, 0, 0, - 0,22,19, 0,20, 0,17,17, 0,22, 0, 0,22, 0, 0,20, - 17,18, 0,22, 0,19,19, 0, 0, 0, 0,19, 0,19,21,17, - 17, 0, 0, 0, 0, 0, 0,20,21,17,16, 0,11,11,13,13, - 0,13,13,16,16, 0,13,13,15,16, 0,17,17,21,22, 0, - 17,18, 0, 0, 0,12,12,16,16, 0,15,15,18,18, 0,13, - 13,16,16, 0,17,16,21,21, 0,17,17, 0, 0, 0,13,13, - 16,16, 0,16,16,19,18, 0,13,13,16,16, 0,17,17, 0, - 22, 0,17,18,20,22, 0,17,18, 0, 0, 0, 0, 0, 0, 0, - 0,15,15,20, 0, 0,18,19, 0, 0, 0,17,17, 0, 0, 0, - 18,17,22, 0, 0, 0, 0, 0, 0, 0,15,16,21,20, 0,20, - 20, 0, 0, 0,18,19, 0, 0, 0,15,15,22,22, 0,17,16, - 20,22, 0,17,17,20,22, 0,18,18, 0,21, 0,19,18, 0, - 0, 0,16,16,20,20, 0,19,19,22, 0, 0,15,16,21,22, - 0,18,19,22, 0, 0,17,18, 0, 0, 0,16,16,22, 0, 0, - 19,19, 0,21, 0,15,16,20, 0, 0,18,18, 0,22, 0,18, - 17, 0, 0, 0,18,18, 0, 0, 0, 0, 0, 0, 0, 0,16,16, - 22,21, 0,20,21, 0, 0, 0,17,18,22, 0, 0,18,18, 0, - 0, 0, 0, 0, 0, 0, 0,16,16,20,19, 0,22,21, 0, 0, - 0,18,18,22,22, -}; - -static const static_codebook _44p2_p5_0 = { - 5, 3125, - (char *)_vq_lengthlist__44p2_p5_0, - 1, -528744448, 1616642048, 3, 0, - (long *)_vq_quantlist__44p2_p5_0, - 0 -}; - -static const long _vq_quantlist__44p2_p5_1[] = { - 3, - 2, - 4, - 1, - 5, - 0, - 6, -}; - -static const char _vq_lengthlist__44p2_p5_1[] = { - 2, 3, 3, 3, 3, 3, 3, -}; - -static const static_codebook _44p2_p5_1 = { - 1, 7, - (char *)_vq_lengthlist__44p2_p5_1, - 1, -533200896, 1611661312, 3, 0, - (long *)_vq_quantlist__44p2_p5_1, - 0 -}; - -static const long _vq_quantlist__44p2_p6_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p2_p6_0[] = { - 1, 7, 7, 7, 8, 8, 7, 8, 8, 7, 9, 9,10,11,11, 9, - 8, 8, 7, 8, 9,11,11,11, 9, 8, 8, 6, 7, 7,10,10, - 10,10,10,10,10,10,10,14,14,14,12,11,11,10,11,11, - 15,14,14,13,11,11, 6, 6, 6, 8, 5, 5, 8, 7, 7, 8, - 7, 7,11,10,10, 9, 7, 7, 9, 7, 7,12,10,10,10, 7, - 7, 6, 8, 7,12,10,10,12,10,10,11,10,10,15,14,13, - 13,10,10,11,10,10,16,14,14,14,10,10, 7, 7, 7,12, - 11,11,12,11,11,11,11,11,16,14,14,13,12,12,11,11, - 11,17,15,15,14,12,12,10, 9, 9,13,11,11,13,11,11, - 12,11,11,16,14,13,14,11,11,12,11,11,17,15,14,14, - 11,11, 7, 8, 8,12,11,11,12,10,10,12,10,10,16,13, - 14,13,10,10,11,10,10,17,14,14,14,10,10, 7, 7, 7, - 12,11,11,12,11,11,12,11,11,15,14,15,14,12,12,12, - 11,11,17,15,15,14,12,12,10,10, 9,13,11,11,13,11, - 11,13,11,11,16,14,14,14,11,11,13,11,11,16,15,15, - 15,11,11, -}; - -static const static_codebook _44p2_p6_0 = { - 5, 243, - (char *)_vq_lengthlist__44p2_p6_0, - 1, -527106048, 1620377600, 2, 0, - (long *)_vq_quantlist__44p2_p6_0, - 0 -}; - -static const long _vq_quantlist__44p2_p6_1[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p2_p6_1[] = { - 2, 6, 6, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9, 9, 9, 8, - 7, 7, 8, 8, 8, 9, 9, 9, 9, 8, 8, 6, 7, 7, 9, 8, - 8, 9, 7, 7, 9, 8, 8,10, 8, 8,10, 8, 8,10, 8, 8, - 10, 8, 9,10, 8, 8, 7, 6, 6, 8, 6, 6, 9, 6, 6, 9, - 7, 7,10, 8, 8, 9, 6, 6, 9, 7, 7,10, 9, 8, 9, 7, - 7, 7, 7, 7,11, 8, 8,11, 9, 9,10, 9, 9,12, 9, 9, - 12, 8, 8,11, 9, 9,12, 9, 9,12, 8, 8, 8, 7, 7,10, - 9, 9,10, 9, 9,10, 9, 9,11,10,11,11, 9, 9,11, 9, - 9,11,11,11,11, 9, 9,10, 8, 8,11, 9, 9,10, 9, 9, - 11, 9, 9,11,10,10,11, 9, 9,11, 9, 9,12,10,10,11, - 9, 9, 8, 8, 8,11, 9, 9,12, 9, 9,11, 9, 9,12, 9, - 9,12, 8, 8,12, 9, 9,12, 9,10,12, 8, 8, 9, 7, 7, - 11, 9, 9,11,10,10,11, 9, 9,11,11,11,11, 9, 9,11, - 10,10,12,11,11,11, 9,10,10, 9, 9,11, 9, 9,11,10, - 10,11,10,10,11,11,11,11, 9, 9,11, 9,10,11,11,11, - 11, 9, 9, -}; - -static const static_codebook _44p2_p6_1 = { - 5, 243, - (char *)_vq_lengthlist__44p2_p6_1, - 1, -530841600, 1616642048, 2, 0, - (long *)_vq_quantlist__44p2_p6_1, - 0 -}; - -static const long _vq_quantlist__44p2_p7_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p2_p7_0[] = { - 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, -}; - -static const static_codebook _44p2_p7_0 = { - 5, 243, - (char *)_vq_lengthlist__44p2_p7_0, - 1, -513979392, 1633504256, 2, 0, - (long *)_vq_quantlist__44p2_p7_0, - 0 -}; - -static const long _vq_quantlist__44p2_p7_1[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p2_p7_1[] = { - 1, 9, 9, 6, 9, 9, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10, -}; - -static const static_codebook _44p2_p7_1 = { - 5, 243, - (char *)_vq_lengthlist__44p2_p7_1, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44p2_p7_1, - 0 -}; - -static const long _vq_quantlist__44p2_p7_2[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const char _vq_lengthlist__44p2_p7_2[] = { - 1, 3, 2, 5, 4, 7, 7, 8, 8, 9, 9,10,10,11,11,12, - 12,13,13,14,14,15,15,15,15, -}; - -static const static_codebook _44p2_p7_2 = { - 1, 25, - (char *)_vq_lengthlist__44p2_p7_2, - 1, -518864896, 1620639744, 5, 0, - (long *)_vq_quantlist__44p2_p7_2, - 0 -}; - -static const long _vq_quantlist__44p2_p7_3[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const char _vq_lengthlist__44p2_p7_3[] = { - 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44p2_p7_3 = { - 1, 25, - (char *)_vq_lengthlist__44p2_p7_3, - 1, -529006592, 1611661312, 5, 0, - (long *)_vq_quantlist__44p2_p7_3, - 0 -}; - -static const char _huff_lengthlist__44p2_short[] = { - 4, 4,12, 9, 8,12,15,17, 4, 2,11, 6, 5, 9,13,15, - 11, 7, 8, 7, 7,10,14,13, 8, 5, 7, 5, 5, 8,12,12, - 8, 4, 7, 4, 3, 6,11,12,11, 8, 9, 7, 6, 8,11,12, - 15,13,14,12, 9, 7,10,13,16,12,17,12, 7, 5, 8,11, -}; - -static const static_codebook _huff_book__44p2_short = { - 2, 64, - (char *)_huff_lengthlist__44p2_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p3_l0_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44p3_l0_0[] = { - 1, 4, 4, 8, 8, 8, 8, 9, 9,10,10,10,10, 4, 6, 5, - 8, 7, 9, 9, 9, 9,10, 9,11, 9, 4, 5, 6, 7, 8, 9, - 9, 9, 9, 9,10, 9,10, 8, 9, 8, 9, 8,10, 9,11, 9, - 12,10,12,10, 8, 8, 9, 8, 9, 9,10, 9,11,10,12,10, - 12, 9,10,10,11,10,12,11,12,11,12,12,12,12, 9,10, - 10,11,11,11,11,11,12,12,12,12,12,10,11,11,12,12, - 12,12,12,12,12,12,12,12,10,11,11,12,12,12,12,12, - 12,12,12,12,12,11,12,12,12,12,12,13,12,13,12,13, - 12,12,11,12,12,12,12,12,12,13,12,12,12,12,12,12, - 12,12,13,13,12,13,12,13,12,13,12,12,12,13,12,13, - 12,13,12,13,12,13,12,12,12, -}; - -static const static_codebook _44p3_l0_0 = { - 2, 169, - (char *)_vq_lengthlist__44p3_l0_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44p3_l0_0, - 0 -}; - -static const long _vq_quantlist__44p3_l0_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p3_l0_1[] = { - 3, 4, 4, 5, 5, 4, 4, 5, 5, 5, 4, 5, 4, 5, 5, 5, - 5, 6, 5, 6, 5, 6, 5, 6, 5, -}; - -static const static_codebook _44p3_l0_1 = { - 2, 25, - (char *)_vq_lengthlist__44p3_l0_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p3_l0_1, - 0 -}; - -static const long _vq_quantlist__44p3_l1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p3_l1_0[] = { - 1, 4, 4, 4, 4, 4, 4, 4, 4, -}; - -static const static_codebook _44p3_l1_0 = { - 2, 9, - (char *)_vq_lengthlist__44p3_l1_0, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44p3_l1_0, - 0 -}; - -static const char _huff_lengthlist__44p3_lfe[] = { - 1, 3, 2, 3, -}; - -static const static_codebook _huff_book__44p3_lfe = { - 2, 4, - (char *)_huff_lengthlist__44p3_lfe, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44p3_long[] = { - 3, 4,13, 9, 9,12,15,17, 4, 2,18, 5, 7,10,14,18, - 11, 8, 6, 5, 6, 8,11,14, 8, 5, 5, 3, 5, 8,11,13, - 9, 6, 7, 5, 5, 7, 9,10,11,10, 9, 8, 6, 6, 8,10, - 14,14,11,11, 9, 8, 9,10,17,17,14,13,10, 9,10,10, -}; - -static const static_codebook _huff_book__44p3_long = { - 2, 64, - (char *)_huff_lengthlist__44p3_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p3_p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p3_p1_0[] = { - 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44p3_p1_0 = { - 5, 243, - (char *)_vq_lengthlist__44p3_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p3_p1_0, - 0 -}; - -static const long _vq_quantlist__44p3_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p3_p2_0[] = { - 3, 7, 7, 0, 0, 0, 8, 8, 0, 0, 0, 8, 8, 0, 0, 0, - 11,11, 0, 0, 0, 0, 0, 0, 0, 0,10, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 0, 0, 0,10,11, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, - 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0,12,12, 0, 0, - 0, 0, 0, 0, 0, 0,11,11, 0, 0, 0,12,12, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, - 5, 5, 0, 0, 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, - 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, - 0, 0, 0, 0, 0, 0, 0, 5, 6, 0, 0, 0, 7, 7, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 8, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,11,11, 0, 0, 0, 9, 9, 0, - 0, 0,10,10, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, - 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, - 10,10, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, - 0, 0, 0,11,12, 0, 0, 0, 0, 0, 0, 0, 0,11,11, 0, - 0, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 0, 0, 0, 7, 7, 0, 0, 0, 8, 8, 0, 0, - 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, - 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, - 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0,11,11, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, - 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 7, 7, - 0, 0, 0, 9, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, - 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, 0, 0, - 0, 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 9, 0, 0, 0, 7, 7, 0, 0, 0, 8, 8, 0, - 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 8, 7, 0, 0, 0, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 7, - 7, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0,11,11, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0,10,10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 7, - 7, 0, 0, 0, 9, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, - 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 9, 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,10,10, 0, 0, 0, 9, 9, 0, 0, 0,10,10, - 0, 0, 0,11,12, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, - 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0,11,11, 0, 0, - 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0,11, - 11, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0,12,12, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, - 9, 9, 0, 0, 0,10,10, 0, 0, 0,12,12, 0, 0, 0, 0, - 0, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0,11,11, 0, 0, - 0, 0, 0, 0, 0, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0, - 10,10, 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44p3_p2_0 = { - 5, 3125, - (char *)_vq_lengthlist__44p3_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p3_p2_0, - 0 -}; - -static const long _vq_quantlist__44p3_p3_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p3_p3_0[] = { - 1, 5, 5, 5, 8, 8, 0, 8, 8, 6, 9, 9, 8,10,10, 0, - 8, 8, 0, 9, 9, 0,12,12, 0, 8, 8, 4, 7, 7, 6,10, - 10, 0,12,12, 7,11,11, 9,12,12, 0,12,12, 0,13,13, - 0,15,15, 0,12,12, 0, 7, 7, 0, 7, 7, 0, 8, 8, 0, - 8, 8, 0,10,10, 0, 7, 7, 0, 8, 8, 0,11,11, 0, 7, - 7, 5, 7, 7, 9, 9, 9, 0,11,10, 9, 9, 9,11,12,12, - 0,10,10, 0,11,11, 0,13,13, 0,11,11, 6, 7, 7, 9, - 10,10, 0,12,12,10,11,11,11,12,12, 0,12,12, 0,13, - 13, 0,15,15, 0,12,12, 0,10,10, 0,11,11, 0,11,11, - 0,12,12, 0,13,13, 0,11,11, 0,12,12, 0,15,15, 0, - 11,11, 0, 8, 8, 0,10,10, 0,12,12, 0,11,11, 0,12, - 12, 0,12,12, 0,12,12, 0,15,15, 0,11,11, 0, 7, 7, - 0,10,10, 0,12,12, 0,10,10, 0,12,13, 0,12,12, 0, - 13,13, 0,14,14, 0,12,12, 0, 0, 0, 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 static_codebook _44p3_p3_0 = { - 5, 243, - (char *)_vq_lengthlist__44p3_p3_0, - 1, -533200896, 1614282752, 2, 0, - (long *)_vq_quantlist__44p3_p3_0, - 0 -}; - -static const long _vq_quantlist__44p3_p3_1[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p3_p3_1[] = { - 3, 4, 4, 0, 8, 8, 0, 8, 8, 0, 9, 9, 0,10,10, 0, - 8, 8, 0, 9, 9, 0,10,10, 0, 8, 8, 0, 7, 7, 0, 8, - 8, 0, 8, 8, 0, 8, 8, 0, 8, 8, 0, 8, 8, 0, 8, 8, - 0, 8, 8, 0, 8, 8, 0, 7, 7, 0, 6, 6, 0, 7, 7, 0, - 7, 7, 0,10,10, 0, 6, 6, 0, 7, 7, 0,10,10, 0, 6, - 5, 0, 8, 8, 0, 7, 7, 0, 8, 8, 0, 8, 8, 0, 9, 9, - 0, 7, 7, 0, 8, 8, 0, 9, 9, 0, 7, 7, 0, 6, 6, 0, - 9,10, 0,10,10, 0,10,10, 0,11,11, 0, 9, 9, 0,10, - 10, 0,11,11, 0, 9, 9, 0, 8, 8, 0, 8, 8, 0, 8, 8, - 0, 9, 9, 0, 9, 9, 0, 8, 8, 0, 8, 8, 0, 9, 9, 0, - 7, 7, 0, 8, 8, 0, 7, 7, 0, 7, 7, 0, 8, 8, 0, 9, - 9, 0, 7, 7, 0, 7, 7, 0, 9, 9, 0, 6, 6, 0, 6, 6, - 0,10,10, 0,10,10, 0,10,10, 0,12,12, 0, 9, 9, 0, - 10,10, 0,12,12, 0, 9, 9, 0, 8, 8, 0, 7, 7, 0, 8, - 8, 0, 8, 8, 0, 9, 9, 0, 7, 7, 0, 8, 8, 0, 9, 9, - 0, 7, 7, -}; - -static const static_codebook _44p3_p3_1 = { - 5, 243, - (char *)_vq_lengthlist__44p3_p3_1, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p3_p3_1, - 0 -}; - -static const long _vq_quantlist__44p3_p4_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p3_p4_0[] = { - 1, 6, 6, 7, 7, 7, 7, 7, 7, 7, 8, 8,10,11,11, 9, - 8, 8, 8, 8, 8,11,11,11,10, 8, 8, 5, 7, 7, 9,11, - 11,10,11,11,10,11,11,12,13,14,11,12,12,10,11,11, - 13,14,14,12,12,12, 5, 6, 6, 8, 6, 6, 8, 7, 7, 8, - 7, 7,11,10,10,10, 7, 7, 9, 7, 7,12,11,11,11, 7, - 7, 7, 7, 7,11,10,10,12,10,10,11,10,10,15,13,13, - 13,10,10,12,11,11,15,13,13,14,11,11, 7, 7, 7,11, - 11,11,12,11,11,12,11,11,14,14,14,14,12,12,12,12, - 12,16,15,15,14,12,12, 0,10,10, 0,11,11, 0,11,12, - 0,11,11, 0,14,14, 0,11,11, 0,12,12, 0,15,15, 0, - 11,11, 8, 8, 8,12,10,10,12,10,10,13,11,11,15,13, - 13,14,11,11,12,10,10,16,14,14,14,10,10, 8, 7, 7, - 12,11,11,13,11,11,12,11,11,15,14,14,14,12,12,13, - 12,12,15,14,14,15,12,12, 0,11,11, 0,12,12, 0,12, - 12, 0,12,12, 0,15,15, 0,12,12, 0,13,13, 0,14,15, - 0,12,12, -}; - -static const static_codebook _44p3_p4_0 = { - 5, 243, - (char *)_vq_lengthlist__44p3_p4_0, - 1, -531365888, 1616117760, 2, 0, - (long *)_vq_quantlist__44p3_p4_0, - 0 -}; - -static const long _vq_quantlist__44p3_p4_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p3_p4_1[] = { - 3, 4, 5, 8, 8,12,10,10,12,12,12,10,10,12,12,13, - 11,11,12,12,13,12,12,12,12,13,10,10,13,13,13,13, - 13,13,13,13,10,10,13,13,13,11,11,13,13,14,13,13, - 12,12,13,10,10,13,13,13,13,13,13,13,13,10,10,12, - 12,13,11,11,13,13,13,13,13,12,12,13,12,12,13,13, - 13,13,13,13,13,14,11,11,12,12,14,12,12,13,12,14, - 14,14,12,12,13,14,14,13,13,14,13,13,13,13,14,14, - 14,12,12,14,13,13,13,13,14,14,14,12,12,12, 8, 8, - 11,11,12,12,12,11,11,12,11,11,10,10,13,12,12,10, - 10,13,12,12,10,10,13,12,12,12,12,14,12,12,12,12, - 13,13,13,11,11,14,12,12,11,11,14,12,12,12,12,14, - 12,12,12,12,13,12,12,12,12,13,13,13,11,11,14,12, - 12,11,11,14,12,12,12,12,14,13,13,12,12,14,12,12, - 12,11,14,13,13,11,11,14,13,12,11,11,14,13,13,11, - 11,14,13,13,12,12,14,12,12,12,12,15,13,13,12,12, - 14,12,12,11,11,14,13,13,11,11,12, 9, 9,10,10,12, - 7, 7,11,11,12, 9, 9,12,12,13,10,10,10,10,14,14, - 14,11,11,13, 9, 9,12,12,14,14,14,12,12,13, 8, 8, - 11,11,14, 9, 9,12,12,14,14,14,11,11,13, 9, 9,12, - 12,14,14,14,12,12,14, 8, 8,11,11,14, 9, 9,12,12, - 14,14,14,11,11,14,10,10,12,12,14,14,14,13,13,14, - 9, 9,11,11,14,10,10,12,12,14,14,14,11,11,14,14, - 15,12,12,15,14,14,14,14,15,14,14,11,11,14,14,14, - 12,12,14,14,14,11,11,14,11,11,10,10,14,10,10,10, - 10,14,10,10,10,10,15,11,11, 9, 9,14,12,12, 9, 9, - 15,11,11,11,11,15,13,13,11,11,15,10,10,10,10,15, - 11,11,10,10,15,13,13,11,11,15,11,11,11,11,15,13, - 13,11,11,15,10,10,10,10,15,11,11,10,10,15,13,13, - 11,11,15,12,12,11,11,15,13,13,11,11,15,11,11,10, - 10,15,12,12,10,10,15,13,13,10,10,15,14,14,11,11, - 15,13,13,11,11,15,14,14,10,11,15,13,13,10,10,15, - 13,14,10,10,14,13,13,10,10,14,13,13,10,10,14,13, - 13,10,10,14,13,13, 9, 9,14,14,14, 9, 9,15,14,14, - 11,11,15,14,14,10,10,15,14,14,10,10,15,14,14,11, - 11,15,14,14,10,10,15,14,14,11,11,15,14,14,10,10, - 14,14,14,10,10,15,14,14,10,10,14,14,14,10,10,15, - 14,14,11,11,15,14,14,11,11,14,14,14,10,10,15,14, - 14,10,10,14,14,14, 9, 9,15,15,15,11,11,15,14,14, - 12,12,15,15,14,10,10,15,14,14,10,10,14,15,15, 9, - 9,14,10,10,12,12,17, 9, 9,12,12,17,10,10,13,13, - 17,11,11,12,12,18,14,14,12,12,17,10,10,13,13,17, - 14,14,12,12,17, 9, 9,12,12,17,11,11,12,12,17,14, - 14,12,12,18,10,10,13,13,18,14,14,13,13,18, 9, 9, - 12,12,18,10,10,13,13,18,14,14,12,12,18,11,11,13, - 13,18,14,14,13,13,18,10,10,12,12,17,11,11,12,12, - 17,14,14,12,12,18,15,15,13,13,18,14,14,14,14,18, - 15,15,12,12,18,14,14,12,12,18,15,15,12,12,13, 7, - 7,11,11,14,15,15,11,11,14,15,15,12,12,14,15,15, - 11,11,15,15,15,11,11,14,15,15,12,12,14,15,15,12, - 12,14,15,15,11,11,14,15,15,11,11,15,15,15,12,12, - 14,15,15,12,12,14,15,15,12,12,14,15,15,11,11,14, - 15,15,11,11,15,15,15,12,12,15,15,15,12,12,14,15, - 15,12,12,14,15,14,12,12,14,15,15,11,11,15,14,14, - 12,12,15,15,15,12,12,15,16,16,12,12,15,15,15,12, - 12,15,15,15,12,12,15,15,15,12,12,13,13,13,11,10, - 14,14,15,11,11,14,14,14,12,12,15,14,14,10,10,15, - 15,15,11,11,14,15,15,12,12,14,14,14,11,11,14,15, - 15,11,11,14,15,15,12,12,15,15,15,11,11,14,15,15, - 12,12,14,14,14,12,12,14,15,15,11,11,14,15,15,12, - 12,15,15,15,11,11,15,15,15,12,12,15,14,14,12,12, - 14,15,15,11,11,14,15,15,11,11,15,15,15,10,10,15, - 15,16,12,12,15,15,15,14,14,15,15,15,11,11,15,15, - 15,12,12,15,15,15,11,11,14,11,11,10,10,15, 9, 9, - 12,12,15,10,10,12,12,15,11,11,11,11,15,14,14,12, - 12,15,10,10,13,13,15,14,14,12,12,15, 9, 9,12,12, - 15,10,10,13,13,15,13,13,12,11,15,10,10,12,12,15, - 14,14,12,12,15, 9, 9,11,11,15,11,11,12,12,15,13, - 13,11,11,15,11,11,13,13,15,13,14,13,14,15,11,11, - 11,11,15,11,11,12,12,15,14,14,11,11,15,14,14,13, - 13,15,14,14,20,20,15,14,14,12,12,15,14,14,12,12, - 15,14,14,11,11,14,13,13,10,10,14,13,13,12,12,14, - 14,13,12,12,15,14,14,12,12,15,14,14,11,11,15,14, - 14,12,12,15,14,14,13,13,15,14,14,12,11,15,14,14, - 11,11,15,14,14,13,13,15,14,14,12,12,15,14,14,13, - 13,15,14,14,12,11,15,14,14,12,12,15,14,14,13,13, - 15,14,14,13,13,15,14,14,12,12,15,14,14,12,12,15, - 14,14,12,12,15,15,15,13,13,15,15,15,13,13,15,14, - 14,13,13,15,15,15,13,13,15,14,15,12,12,15,15,15, - 13,13,14,10,10,12,13,17, 9, 9,12,12,17,10,10,13, - 13,17,11,11,12,12,18,14,14,12,12,18,10,10,13,13, - 18,14,14,12,12,17, 9, 9,12,12,18,10,11,13,13,18, - 14,14,12,12,17,10,10,12,12,17,14,14,12,12,17, 9, - 9,12,12,17,11,11,12,12,17,14,14,12,12,18,11,11, - 12,12,18,14,14,13,13,18,11,11,12,12,18,11,11,12, - 12,18,14,14,12,12,18,15,15,12,12,18,14,14,13,13, - 18,15,15,12,12,17,14,14,12,12,17,15,15,12,12,13, - 7, 7,11,11,14,15,15,11,11,14,15,15,11,11,14,15, - 14,12,12,15,15,15,12,11,14,15,15,12,12,14,15,15, - 12,12,14,15,15,11,11,14,15,15,11,11,15,15,15,13, - 13,14,15,15,11,11,14,15,15,13,12,14,15,15,11,11, - 14,15,15,11,11,15,15,15,13,13,14,15,15,12,12,15, - 15,15,12,12,15,15,15,11,11,15,15,15,11,11,15,15, - 15,12,12,15,15,15,13,13,15,16,16,12,12,15,15,15, - 12,13,15,15,15,12,12,15,15,15,12,12,13,13,13,11, - 11,14,14,14,11,11,14,14,14,12,12,14,14,14,10,10, - 15,14,14,11,11,14,15,15,12,12,14,14,14,12,12,14, - 15,15,11,11,14,15,14,12,12,15,14,14,11,11,14,15, - 15,12,12,14,14,14,11,11,14,15,15,11,11,14,14,14, - 12,12,15,15,14,11,11,15,15,15,12,12,15,14,14,12, - 12,14,15,15,11,11,14,15,14,11,11,15,15,15,10,10, - 15,15,15,12,12,15,14,14,14,13,15,15,15,11,11,15, - 15,15,11,11,15,15,15,10,10,14,11,11,10,10,15, 9, - 9,12,12,15,10,10,12,12,15,11,11,11,11,15,14,14, - 12,12,15,10,10,13,13,15,13,13,12,12,15, 9, 9,12, - 12,15,11,11,13,13,15,14,14,12,12,15,10,10,13,13, - 15,13,14,12,12,15, 9, 9,12,12,15,10,10,13,13,15, - 13,13,11,11,15,11,11,13,13,15,14,14,13,13,15,10, - 10,11,11,15,11,11,12,12,15,14,14,11,11,15,14,14, - 13,13,15,14,14,21,20,15,14,14,11,11,15,14,14,12, - 12,15,14,14,11,11,14,13,13,10,10,14,13,13,11,11, - 15,14,14,12,12,15,14,14,12,12,14,14,14,12,12,15, - 14,14,12,12,15,14,14,13,13,14,14,14,11,11,15,14, - 14,11,11,15,14,14,13,13,15,14,14,12,12,15,14,14, - 13,13,14,14,14,11,11,15,14,14,11,11,14,14,14,13, - 13,15,14,14,12,12,15,14,14,12,12,15,14,14,12,12, - 15,14,14,12,12,14,14,14,13,13,15,15,15,13,13,16, - 14,14,12,13,15,15,15,13,13,15,14,14,12,12,15,15, - 15,13,13,15,11,11,13,12,18,10,10,12,12,17,11,11, - 12,12,18,12,12,11,11,18,14,14,12,12,18,11,11,13, - 13,17,14,14,12,12,18,10,10,12,12,18,12,12,12,12, - 18,14,15,12,12,18,11,11,13,13,18,14,14,12,12,17, - 10,10,12,12,18,11,11,12,12,18,15,14,12,12,17,12, - 12,12,12,17,14,14,12,12,17,11,11,11,11,17,12,12, - 12,11,17,15,15,11,11,18,15,15,12,12,18,14,15,13, - 13,18,15,15,11,11,17,15,15,12,12,18,15,15,11,11, - 14, 9, 9,11,11,14,15,15,11,11,15,15,15,11,11,15, - 15,15,12,11,15,15,15,12,12,15,15,15,11,11,15,15, - 15,13,13,14,15,15,11,11,15,15,15,11,11,15,15,15, - 13,13,15,15,15,11,11,15,15,15,13,13,15,15,15,11, - 11,15,15,15,11,11,15,15,15,13,13,15,15,15,12,12, - 15,15,15,13,13,15,15,14,11,11,15,15,15,12,12,15, - 15,15,12,12,16,15,15,13,13,15,16,16,13,13,16,15, - 15,12,12,15,15,15,13,12,15,15,15,12,12,13,12,12, - 11,11,14,14,14,11,11,14,14,14,12,12,15,14,14,11, - 11,15,14,14,12,12,15,14,14,12,12,15,14,14,12,12, - 14,15,15,11,11,15,14,14,12,12,15,14,14,11,11,15, - 14,14,12,12,15,14,14,12,12,14,15,15,11,11,15,14, - 14,12,12,15,14,14,11,11,15,15,15,12,12,15,14,14, - 12,12,15,15,15,11,11,15,14,14,11,11,15,14,15,11, - 11,15,15,15,12,12,15,14,14,13,13,16,15,15,11,11, - 15,14,14,12,12,15,15,15,11,11,14,11,11, 9, 9,15, - 10,10,12,12,14,11,11,12,12,15,12,12,12,12,15,14, - 14,13,13,15,11,11,13,13,15,14,14,13,13,15,10,10, - 12,12,15,12,12,13,13,15,14,14,13,13,15,11,11,12, - 12,15,14,14,13,13,14,10,10,12,12,15,12,12,13,13, - 15,14,14,12,12,15,12,12,13,13,15,14,14,15,15,15, - 11,11,12,12,15,12,12,12,13,15,14,14,12,12,15,15, - 15,14,14,15,14,14,20,20,15,14,14,12,12,15,14,14, - 13,13,15,14,14,12,12,14,13,13,10,10,14,13,13,11, - 11,14,13,13,12,12,14,14,14,12,12,15,14,14,13,13, - 15,14,14,12,12,14,14,14,14,14,14,14,14,11,11,15, - 14,14,12,12,15,14,14,14,14,15,14,14,12,12,14,14, - 14,14,14,14,14,14,11,11,15,14,14,12,12,14,14,14, - 14,14,15,14,14,12,12,15,14,14,13,13,15,14,14,12, - 12,15,14,14,12,12,14,14,14,14,13,15,15,15,14,14, - 15,14,14,13,13,15,15,15,14,14,15,14,14,13,13,15, - 15,15,13,13,14,13,13,13,13,18,15,15,12,12,18,15, - 15,13,12,18,15,16,11,11,18,16,17,12,12,18,15,15, - 13,13,18,17,17,12,12,18,15,15,12,12,17,15,15,12, - 12,18,17,17,12,12,18,15,15,13,13,18,16,17,12,12, - 17,15,15,12,12,18,15,15,12,12,18,16,17,11,12,18, - 16,16,12,12,17,16,17,12,12,18,15,15,11,11,18,15, - 15,12,12,18,17,17,11,11,17,17,17,12,12,18,16,16, - 13,13,18,17,17,11,11,18,16,16,12,12,18,17,17,11, - 11,15,14,14,11,11,16,15,15,11,11,16,15,15,12,12, - 16,15,15,12,12,17,15,15,14,13,16,15,15,12,12,17, - 15,15,14,14,16,15,15,11,11,16,15,15,12,12,18,15, - 15,13,13,16,15,15,11,11,17,15,15,14,14,16,15,15, - 11,11,16,15,15,12,12,17,15,15,13,13,16,15,15,12, - 12,17,16,15,14,14,16,14,15,12,12,16,15,15,12,12, - 18,15,15,13,13,17,15,15,14,14,17,16,16,15,15,17, - 15,15,13,13,17,15,15,14,14,18,15,15,13,13,15,12, - 13,11,11,15,14,14,12,12,16,14,14,12,12,16,14,14, - 12,12,16,14,14,12,12,16,14,14,13,12,17,14,14,13, - 13,16,15,15,12,12,16,14,14,12,12,17,14,14,12,12, - 16,14,14,12,12,17,14,14,13,13,15,15,15,12,12,16, - 14,14,12,12,17,14,14,12,12,17,15,15,12,12,17,14, - 14,13,13,16,15,15,12,12,16,14,14,12,12,17,15,15, - 12,12,18,15,15,13,13,17,14,14,13,13,17,15,15,12, - 12,17,14,14,12,12,17,15,15,12,12,14,15,15, 9, 9, - 15,15,15,12,12,15,15,15,13,13,15,15,15,14,14,15, - 15,15,19,19,15,15,16,13,13,15,15,16,19,20,15,15, - 15,13,12,15,16,16,14,14,15,15,15,19,19,15,15,15, - 13,13,15,16,15,20,19,14,15,15,13,13,15,15,15,14, - 14,15,15,15,19,19,15,15,15,14,14,15,16,16,19,20, - 15,15,15,14,14,15,15,15,14,14,15,15,15,19,19,15, - 15,15,20,19,15,16,16,20,19,15,15,15,19,19,15,16, - 16,20,20,15,15,15,19,20,14,13,13,10,10,14,14,14, - 11,11,14,14,14,12,12,15,14,14,13,13,15,14,14,19, - 20,15,14,14,12,12,14,14,14,20,19,14,14,14,11,11, - 15,14,14,12,12,15,14,14,20,20,15,14,14,12,12,14, - 14,14,20,19,14,14,14,11,11,15,14,14,12,12,15,14, - 14,19,20,15,14,14,13,13,15,14,14,22,19,15,15,14, - 12,12,15,14,14,13,13,14,15,15,22,20,15,15,15,20, - 20,15,14,14,21,20,15,15,15,20,21,15,14,14,20,20, - 14,15,15,20,20, -}; - -static const static_codebook _44p3_p4_1 = { - 5, 3125, - (char *)_vq_lengthlist__44p3_p4_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p3_p4_1, - 0 -}; - -static const long _vq_quantlist__44p3_p5_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p3_p5_0[] = { - 2, 6, 6,14,14, 6, 7, 7,14,14, 7, 7, 7,15,15, 0, - 12,12,15,15, 0,13,13,15,15, 7, 8, 8,15,15,10,10, - 10,16,16, 9, 8, 8,15,15, 0,13,13,18,17, 0,13,13, - 16,16, 8, 8, 8,15,15,12,11,11,16,16, 9, 8, 8,15, - 15, 0,13,13,18,18, 0,13,13,16,16, 0,14,14,17,17, - 0,20, 0,19,20, 0,12,12,16,16, 0,16,16,20,22, 0, - 14,14,16,16, 0,14,14,17,17, 0,20,22,20,19, 0,13, - 13,15,16, 0,17,18, 0,21, 0,15,15,16,16, 5, 7, 7, - 13,13, 8, 9, 9,14,14,10,10,10,14,14, 0,20,22,18, - 18, 0,22,21,18,17, 9,10,10,14,14,12,12,12,17,17, - 12,10,10,14,14, 0, 0,20,17,17, 0,22,21,17,18,11, - 10,10,14,14,14,13,13,18,18,12,11,11,14,14, 0,22, - 21,18,19, 0,20, 0,17,17, 0,22, 0,18,18, 0, 0, 0, - 0, 0, 0,20,20,17,17, 0,22, 0,22,21, 0,21, 0,19, - 18, 0,22,22,18,18, 0, 0, 0, 0, 0, 0,21, 0,17,17, - 0,22, 0,20,20, 0, 0, 0,19,18, 6, 6, 6,12,12, 8, - 6, 6,10,10, 8, 6, 6,13,12, 0,10,10,11,11, 0,11, - 11,13,13, 8, 7, 7,13,13,11, 9, 9,13,13,10, 6, 6, - 12,12, 0,10,10,14,14, 0,10,10,13,13, 9, 7, 7,13, - 13,12,10,10,13,13,10, 6, 6,12,12, 0,11,11,15,15, - 0,10,10,13,13, 0,12,12,15,14, 0,19,20,16,17, 0, - 9, 9,13,13, 0,14,14,20,21, 0,12,11,13,12, 0,12, - 12,15,14, 0,20,19,17,17, 0,10,10,12,13, 0,15,15, - 22,21, 0,12,12,12,13, 0,10,10,12,12, 0,11,11,15, - 15, 0,11,11,15,15, 0,15,15,22,22, 0,16,17, 0, 0, - 0,11,11,15,15, 0,14,14,18,18, 0,11,11,16,16, 0, - 16,15, 0,21, 0,16,16, 0, 0, 0,12,12,15,15, 0,14, - 14,19,19, 0,11,11,15,15, 0,15,15,22, 0, 0,16,16, - 22, 0, 0,16,16, 0,21, 0, 0, 0, 0, 0, 0,15,15,19, - 20, 0,18,18, 0, 0, 0,17,17, 0, 0, 0,17,17, 0, 0, - 0, 0, 0, 0, 0, 0,16,15,22,21, 0,20,20, 0, 0, 0, - 18,18, 0, 0, 0,10,10,12,12, 0,10,10,11,11, 0,11, - 11,12,12, 0,11,11, 9, 9, 0,13,12,12,12, 0,11,11, - 13,13, 0,13,13,12,12, 0,10,10,12,12, 0,13,12,13, - 13, 0,12,12,12,12, 0,11,11,13,13, 0,13,13,12,12, - 0,10,10,12,12, 0,13,13,14,13, 0,12,12,12,12, 0, - 14,13,13,14, 0,20,21,15,15, 0,11,11,12,12, 0,15, - 16,20,20, 0,12,13,10,10, 0,13,13,14,13, 0,20,20, - 15,15, 0,11,11,12,12, 0,16,17,21,21, 0,13,13,11, - 11, 6, 7, 7,16,15,11, 9, 9,14,15,12, 9, 9,16,16, - 0,13,13,15,15, 0,14,14,17,17,10, 9, 9,16,16,14, - 12,12,16,16,12, 9, 9,15,15, 0,13,13,17,18, 0,13, - 13,15,15,12,10,10,17,17,15,12,12,17,17,13, 9, 9, - 16,16, 0,13,13,18,19, 0,14,14,16,16, 0,15,15,18, - 18, 0, 0, 0,20,19, 0,12,12,17,16, 0,16,17, 0,21, - 0,14,15,16,16, 0,15,15,18,18, 0, 0,22,19,21, 0, - 13,13,16,16, 0,18,17,22,22, 0,15,15,16,16, 7, 7, - 7,13,13,11,10,10,15,15,12,10,10,14,14, 0,21, 0, - 18,17, 0,21,22,18,18,11,10,10,15,15,14,12,12,17, - 17,14,11,11,14,14, 0,21,20,18,18, 0,22,21,18,17, - 12,11,10,16,16,16,14,14,17,19,14,11,11,15,15, 0, - 0,22,19,19, 0,21,22,18,18, 0,21, 0,18,19, 0, 0, - 0,22, 0, 0,22,21,17,17, 0, 0, 0,20,22, 0, 0,21, - 18,18, 0, 0, 0,19,20, 0, 0, 0, 0, 0, 0, 0,21,17, - 17, 0, 0, 0,22,21, 0, 0, 0,19,19,10, 9, 9,14,13, - 13,10,10,12,12,13,10,10,14,14, 0,13,13,12,12, 0, - 15,14,16,15,13,10,10,14,14,15,12,12,14,14,15,10, - 10,14,14, 0,14,14,15,15, 0,14,13,14,14,13,10,10, - 15,15,17,13,13,15,15,14,10,10,14,14, 0,14,14,15, - 16, 0,14,14,15,15, 0,15,15,16,16, 0,21,22,17,18, - 0,12,12,14,14, 0,17,17,20,21, 0,14,14,14,14, 0, - 15,15,16,16, 0,21,22,18,18, 0,13,13,14,14, 0,18, - 18,22, 0, 0,15,15,14,14, 0,11,11,13,13, 0,12,12, - 16,15, 0,12,12,16,16, 0,16,16, 0, 0, 0,16,17, 0, - 22, 0,12,12,16,16, 0,14,14,17,18, 0,11,11,16,16, - 0,15,15, 0,21, 0,16,16,21,22, 0,12,12,16,16, 0, - 15,15,19,19, 0,12,12,17,16, 0,16,16,21,22, 0,16, - 16, 0, 0, 0,17,17, 0,22, 0, 0, 0, 0, 0, 0,15,15, - 19,20, 0,17,19, 0, 0, 0,17,17,22, 0, 0,17,17, 0, - 22, 0, 0, 0, 0, 0, 0,15,15,21, 0, 0,19,20, 0, 0, - 0,19,18,22, 0, 0,11,12,14,14, 0,11,11,14,14, 0, - 12,12,15,15, 0,13,13,13,13, 0,14,14,16,16, 0,12, - 12,15,15, 0,14,14,16,15, 0,11,11,15,15, 0,13,13, - 16,16, 0,13,13,15,15, 0,12,12,15,15, 0,15,14,16, - 16, 0,11,11,15,15, 0,14,14,17,17, 0,13,13,15,15, - 0,15,15,16,16, 0, 0, 0,18,18, 0,12,12,14,14, 0, - 16,16,22, 0, 0,14,14,15,15, 0,15,15,16,17, 0,21, - 22,18,18, 0,13,13,15,14, 0,18,17,22, 0, 0,14,14, - 15,15, 8, 8, 8,16,15,12,10,10,16,15,12,10,10,16, - 16, 0,14,14,16,17, 0,14,14,17,16,12,10,10,17,18, - 14,12,12,18,18,14,10,10,16,16, 0,14,14,18,18, 0, - 14,14,16,16,12, 9, 9,16,16,17,13,13,16,17,14, 9, - 9,15,15, 0,14,14,18,19, 0,13,13,15,15, 0,15,15, - 18,19, 0, 0, 0,22,21, 0,13,13,16,16, 0,16,16,22, - 0, 0,15,15,16,16, 0,14,14,18,17, 0, 0, 0,20, 0, - 0,13,13,16,16, 0,18,18, 0, 0, 0,15,15,16,16, 8, - 7, 7,13,13,12,10,10,15,15,12,10,10,14,14, 0,22, - 22,19,18, 0, 0, 0,18,18,12,10,10,15,15,14,13,13, - 17,17,14,11,11,15,15, 0,19,20,18,18, 0,22,21,17, - 18,13,11,11,15,15,16,13,13,18,18,14,11,11,14,15, - 0,22,21,20,19, 0,22,21,17,17, 0, 0,22,19,18, 0, - 0, 0, 0, 0, 0,22,20,17,17, 0, 0, 0,21,20, 0, 0, - 0,19,17, 0, 0,22,19,19, 0, 0, 0, 0, 0, 0,22,20, - 18,17, 0, 0, 0, 0, 0, 0, 0, 0,18,18, 0,10,10,14, - 14, 0,11,11,14,14, 0,11,11,15,15, 0,14,14,14,14, - 0,15,15,16,16, 0,11,11,16,16, 0,13,13,16,16, 0, - 11,11,15,15, 0,14,14,16,16, 0,14,14,15,15, 0,11, - 11,15,15, 0,13,13,15,15, 0,10,10,15,15, 0,15,15, - 17,17, 0,14,14,14,14, 0,16,16,16,16, 0, 0,22,19, - 19, 0,13,13,14,14, 0,17,17, 0, 0, 0,15,15,14,14, - 0,16,16,17,17, 0, 0,22,18,18, 0,13,13,14,14, 0, - 21,18, 0, 0, 0,15,15,14,14, 0,11,11,13,13, 0,12, - 12,15,15, 0,12,12,16,15, 0,16,16, 0, 0, 0,17,17, - 22,22, 0,12,12,16,16, 0,14,14,18,18, 0,11,12,16, - 16, 0,15,16, 0,21, 0,16,16,22,21, 0,12,12,16,16, - 0,15,15,19,20, 0,11,12,16,16, 0,15,15,20,22, 0, - 16,16, 0,22, 0,17,17,22, 0, 0, 0, 0, 0, 0, 0,15, - 15,21,22, 0,19,18, 0, 0, 0,17,17, 0, 0, 0,17,17, - 0,22, 0, 0, 0, 0, 0, 0,16,15,22, 0, 0,19,19, 0, - 0, 0,17,18, 0, 0, 0,12,12,15,15, 0,12,12,15,15, - 0,12,12,15,15, 0,13,13,14,14, 0,15,15,16,17, 0, - 12,12,16,16, 0,14,14,16,16, 0,12,11,15,16, 0,14, - 14,16,17, 0,14,14,16,16, 0,13,12,16,16, 0,15,15, - 16,16, 0,11,11,15,15, 0,14,14,16,16, 0,14,14,15, - 15, 0,15,15,18,17, 0, 0,22, 0,20, 0,13,13,15,15, - 0,16,17,22,22, 0,14,14,15,15, 0,15,15,17,18, 0, - 20, 0,19,19, 0,13,13,15,15, 0,18,18,22, 0, 0,14, - 14,15,15, 0,11,11,16,16, 0,14,14,17,16, 0,13,13, - 17,17, 0,16,16,17,17, 0,17,17,18,19, 0,12,12,16, - 17, 0,15,15,18,18, 0,12,12,16,16, 0,16,16,19,18, - 0,16,16,17,16, 0,12,13,17,17, 0,17,16,18,17, 0, - 13,12,16,16, 0,16,16,18,19, 0,16,16,16,17, 0,16, - 16,18,18, 0,22, 0,22,22, 0,13,13,16,16, 0,19,18, - 22,20, 0,16,15,16,16, 0,16,17,18,18, 0, 0, 0,22, - 20, 0,14,14,16,16, 0,19,19, 0, 0, 0,16,16,16,16, - 0, 9, 9,13,13, 0,13,13,15,15, 0,14,14,15,15, 0, - 0,22,17,18, 0,22, 0,18,19, 0,12,12,15,15, 0,15, - 16,17,17, 0,14,14,14,14, 0,22, 0,18,18, 0,21,22, - 17,17, 0,13,13,15,15, 0,17,17,17,18, 0,14,14,15, - 15, 0,22,21,21,19, 0,20,21,17,17, 0,21,21,19,18, - 0, 0, 0, 0, 0, 0,21,21,17,17, 0, 0, 0,22,22, 0, - 0,22,19,18, 0, 0,21,19,18, 0, 0, 0, 0,22, 0,19, - 20,17,17, 0, 0, 0, 0,22, 0, 0, 0,19,18, 0,19,19, - 15,16, 0,21,19,16,17, 0, 0,21,17,17, 0, 0,22,17, - 17, 0,22,22,18,19, 0,20,20,16,16, 0, 0,22,18,18, - 0,20,19,16,17, 0,22,21,20,19, 0, 0,21,17,17, 0, - 21,20,17,17, 0, 0, 0,18,18, 0,19,19,17,16, 0,22, - 0,19,19, 0,21,22,17,18, 0, 0,22,19,18, 0, 0, 0, - 19,20, 0,19,19,16,16, 0,22,22,22, 0, 0,20,22,16, - 16, 0,22,20,18,19, 0, 0, 0,20,19, 0,20,20,16,16, - 0, 0, 0, 0, 0, 0,22,20,17,16, 0,11,11,13,13, 0, - 14,13,15,15, 0,13,13,16,15, 0,18,17,21, 0, 0,18, - 18,21, 0, 0,12,12,15,15, 0,15,16,17,18, 0,12,12, - 15,15, 0,17,17,22,20, 0,17,18,22, 0, 0,12,12,17, - 16, 0,16,17,19,19, 0,13,13,16,16, 0,17,17, 0,22, - 0,17,17, 0,21, 0,18,18,20,22, 0, 0, 0, 0, 0, 0, - 15,15,21,20, 0,20,19, 0, 0, 0,18,18,22, 0, 0,17, - 17,22, 0, 0, 0, 0, 0, 0, 0,15,16,20,22, 0,20,21, - 0, 0, 0,19,18, 0, 0, 0,15,15,19,19, 0,17,16,20, - 20, 0,16,17,20,21, 0,18,17, 0, 0, 0,19,19, 0, 0, - 0,15,15,21,19, 0,19,19, 0, 0, 0,15,15,22,22, 0, - 18,18, 0,22, 0,17,18,22,21, 0,15,15,20,19, 0,19, - 19, 0, 0, 0,15,15,20,22, 0,18,19,20, 0, 0,18,17, - 21,21, 0,18,18,19,22, 0, 0, 0, 0, 0, 0,15,15,20, - 19, 0,19,19, 0, 0, 0,18,18,21,22, 0,18,18,22, 0, - 0, 0, 0, 0, 0, 0,15,15,19,20, 0,21,21, 0, 0, 0, - 17,17,20,20, 0,12,12,17,17, 0,14,14,16,17, 0,13, - 14,17,17, 0,16,16,17,17, 0,17,17,17,19, 0,13,13, - 17,17, 0,16,16,18,18, 0,13,13,16,16, 0,16,16,18, - 18, 0,16,16,17,17, 0,13,13,17,17, 0,17,17,18,17, - 0,12,12,15,16, 0,17,18,19,20, 0,16,16,16,16, 0, - 17,16,18,19, 0, 0,22,21,22, 0,14,14,16,16, 0,19, - 19, 0, 0, 0,16,16,16,16, 0,16,16,18,17, 0, 0,22, - 21,21, 0,14,14,16,16, 0,22,20,22, 0, 0,16,16,15, - 15, 0, 9, 9,13,13, 0,14,14,15,15, 0,14,14,14,14, - 0,22,22,18,18, 0, 0,22,18,18, 0,12,12,15,15, 0, - 16,16,18,17, 0,14,14,14,14, 0,20,21,18,18, 0,22, - 21,17,17, 0,13,13,15,15, 0,17,17,18,18, 0,14,14, - 14,14, 0, 0,21,18,19, 0, 0,22,17,17, 0,22,22,19, - 18, 0, 0, 0, 0, 0, 0,19,21,17,17, 0, 0, 0,22,20, - 0, 0,21,18,19, 0, 0,22,18,18, 0, 0, 0, 0,22, 0, - 20,22,17,17, 0, 0, 0,20,22, 0, 0, 0,18,18, 0,19, - 21,16,16, 0,20,22,16,17, 0,20, 0,17,17, 0,22, 0, - 18,17, 0,21, 0,18,19, 0,20,20,17,17, 0,22, 0,18, - 18, 0,21,20,17,17, 0, 0,20,20,19, 0, 0,21,18,17, - 0,21,21,17,17, 0,22, 0,18,17, 0,19,19,17,17, 0, - 0,22,20,21, 0, 0,21,17,17, 0,22, 0,18,18, 0, 0, - 0,20,22, 0,20,19,16,16, 0, 0, 0, 0, 0, 0,22,22, - 17,17, 0,22, 0,18,19, 0, 0, 0,21,20, 0,19,21,16, - 17, 0, 0, 0, 0, 0, 0,22,22,17,16, 0,11,11,13,13, - 0,13,13,15,15, 0,13,13,15,15, 0,17,17,22,21, 0, - 18,18,22, 0, 0,12,13,16,15, 0,15,16,18,18, 0,13, - 13,16,16, 0,17,17, 0,22, 0,17,17,22,22, 0,13,13, - 16,16, 0,16,16,19,18, 0,13,13,16,16, 0,18,17, 0, - 20, 0,18,17,20, 0, 0,17,17,21, 0, 0, 0, 0, 0, 0, - 0,15,15,21,22, 0,19,20, 0, 0, 0,18,18, 0, 0, 0, - 18,17, 0, 0, 0, 0, 0, 0, 0, 0,16,16,22,22, 0,20, - 20, 0, 0, 0,21,19, 0, 0, 0,15,15,20,19, 0,16,16, - 22,20, 0,17,17, 0,22, 0,18,18, 0,22, 0,19,17, 0, - 0, 0,15,16,22,20, 0,18,19, 0, 0, 0,16,16,22,20, - 0,18,18, 0,22, 0,18,18,22, 0, 0,16,16,21,20, 0, - 19,20, 0,22, 0,16,16, 0,22, 0,18,18, 0,22, 0,18, - 18, 0,21, 0,19,18, 0,22, 0, 0, 0, 0, 0, 0,16,16, - 21,20, 0,20, 0, 0, 0, 0,18,18,21, 0, 0,18,18, 0, - 0, 0, 0, 0, 0, 0, 0,16,16,21,19, 0, 0, 0, 0, 0, - 0,18,18, 0,21, -}; - -static const static_codebook _44p3_p5_0 = { - 5, 3125, - (char *)_vq_lengthlist__44p3_p5_0, - 1, -528744448, 1616642048, 3, 0, - (long *)_vq_quantlist__44p3_p5_0, - 0 -}; - -static const long _vq_quantlist__44p3_p5_1[] = { - 3, - 2, - 4, - 1, - 5, - 0, - 6, -}; - -static const char _vq_lengthlist__44p3_p5_1[] = { - 2, 3, 3, 3, 3, 3, 3, -}; - -static const static_codebook _44p3_p5_1 = { - 1, 7, - (char *)_vq_lengthlist__44p3_p5_1, - 1, -533200896, 1611661312, 3, 0, - (long *)_vq_quantlist__44p3_p5_1, - 0 -}; - -static const long _vq_quantlist__44p3_p6_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p3_p6_0[] = { - 1, 6, 6, 7, 7, 7, 7, 8, 8, 7, 9, 9,11,11,11, 9, - 8, 8, 8, 9, 9,12,11,11, 9, 8, 8, 6, 7, 7,10,11, - 10,10,10,10,11,11,10,14,13,14,12,11,11,11,11,11, - 15,14,14,13,12,12, 5, 6, 6, 8, 5, 5, 8, 7, 7, 8, - 8, 8,12,10,10, 9, 7, 7, 9, 7, 8,12,10,10,10, 7, - 7, 7, 8, 8,12,10,10,12,10,10,11,10,10,15,13,13, - 13,10,10,11,10,10,16,13,14,14,10,10, 7, 7, 7,12, - 11,11,12,11,11,11,11,11,16,15,15,14,12,12,12,11, - 11,16,15,16,14,12,12,10, 9, 9,14,11,11,13,11,11, - 12,11,11,16,14,14,14,11,11,12,11,11,17,15,15,14, - 11,11, 7, 8, 8,12,11,11,12,10,10,12,10,10,16,14, - 13,14,10,10,12,10,10,17,14,14,14,10,10, 8, 7, 7, - 13,11,11,12,11,11,12,11,11,16,15,14,14,12,12,12, - 11,11,16,15,14,15,12,12,11,10,10,13,11,11,13,12, - 11,13,11,11,17,14,14,14,11,11,13,11,11,17,14,15, - 14,11,11, -}; - -static const static_codebook _44p3_p6_0 = { - 5, 243, - (char *)_vq_lengthlist__44p3_p6_0, - 1, -527106048, 1620377600, 2, 0, - (long *)_vq_quantlist__44p3_p6_0, - 0 -}; - -static const long _vq_quantlist__44p3_p6_1[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p3_p6_1[] = { - 2, 6, 6, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, - 7, 7, 8, 8, 8, 9, 9, 9, 9, 7, 8, 6, 7, 7, 8, 8, - 8, 8, 8, 8, 9, 8, 8,10, 9, 9,10, 8, 8,10, 8, 8, - 10, 9, 9,10, 8, 8, 6, 6, 6, 8, 6, 6, 8, 7, 7, 8, - 7, 7,10, 8, 8, 9, 7, 7, 9, 7, 7,10, 8, 9, 9, 7, - 7, 7, 7, 7,10, 8, 8,11, 8, 8,10, 8, 8,12, 9, 9, - 12, 8, 8,11, 9, 9,12, 9, 9,11, 8, 8, 7, 7, 7,10, - 9, 9,10, 9, 9,10, 9, 9,11,10,10,10, 9, 9,11, 9, - 9,11,10,10,11, 9, 9, 9, 8, 8,10, 9, 9,10, 9, 9, - 11, 9, 9,11,10,10,11, 9, 9,11, 9, 9,11,10,10,11, - 9, 9, 8, 8, 8,11, 9, 9,11, 9, 9,11, 9, 9,12, 9, - 9,12, 8, 8,12, 9, 9,12, 9, 9,12, 8, 8, 8, 7, 7, - 10, 9, 9,10, 9, 9,11, 9, 9,11,11,11,11, 9, 9,11, - 10,10,11,11,11,11, 9, 9,10, 9, 9,11, 9, 9,11, 9, - 10,11,10, 9,11,10,10,11, 9, 9,11, 9,10,11,10,10, - 11, 9, 9, -}; - -static const static_codebook _44p3_p6_1 = { - 5, 243, - (char *)_vq_lengthlist__44p3_p6_1, - 1, -530841600, 1616642048, 2, 0, - (long *)_vq_quantlist__44p3_p6_1, - 0 -}; - -static const long _vq_quantlist__44p3_p7_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p3_p7_0[] = { - 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, -}; - -static const static_codebook _44p3_p7_0 = { - 5, 243, - (char *)_vq_lengthlist__44p3_p7_0, - 1, -513979392, 1633504256, 2, 0, - (long *)_vq_quantlist__44p3_p7_0, - 0 -}; - -static const long _vq_quantlist__44p3_p7_1[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p3_p7_1[] = { - 1, 9, 9, 6, 9, 9, 5, 9, 9, 8, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10, -}; - -static const static_codebook _44p3_p7_1 = { - 5, 243, - (char *)_vq_lengthlist__44p3_p7_1, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44p3_p7_1, - 0 -}; - -static const long _vq_quantlist__44p3_p7_2[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const char _vq_lengthlist__44p3_p7_2[] = { - 1, 3, 2, 5, 4, 7, 7, 8, 8, 9, 9,10,10,11,11,12, - 12,13,13,14,14,15,15,15,15, -}; - -static const static_codebook _44p3_p7_2 = { - 1, 25, - (char *)_vq_lengthlist__44p3_p7_2, - 1, -518864896, 1620639744, 5, 0, - (long *)_vq_quantlist__44p3_p7_2, - 0 -}; - -static const long _vq_quantlist__44p3_p7_3[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const char _vq_lengthlist__44p3_p7_3[] = { - 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44p3_p7_3 = { - 1, 25, - (char *)_vq_lengthlist__44p3_p7_3, - 1, -529006592, 1611661312, 5, 0, - (long *)_vq_quantlist__44p3_p7_3, - 0 -}; - -static const char _huff_lengthlist__44p3_short[] = { - 4, 5,16, 9, 9,12,17,18, 4, 2,18, 6, 5, 9,13,15, - 10, 7, 7, 6, 7, 9,13,13, 8, 5, 6, 5, 5, 7,11,12, - 8, 4, 7, 4, 3, 6,10,12,11, 8, 9, 7, 6, 8,11,12, - 15,13,13,11, 9, 7,10,12,16,12,16,12, 6, 5, 8,11, -}; - -static const static_codebook _huff_book__44p3_short = { - 2, 64, - (char *)_huff_lengthlist__44p3_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p4_l0_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44p4_l0_0[] = { - 1, 4, 4, 8, 8, 9, 8, 9, 9,10,10,10,10, 4, 6, 5, - 8, 7, 9, 9, 9, 9,10, 9,10,10, 4, 5, 6, 7, 8, 9, - 9, 9, 9, 9,10, 9,10, 8, 9, 8, 9, 8,10, 9,11, 9, - 12,10,11,10, 8, 8, 9, 8, 9, 9,10, 9,11,10,11,10, - 12, 9,10,10,11,10,11,11,12,11,12,12,12,12, 9,10, - 10,11,11,11,11,11,12,12,12,12,12,10,11,11,12,12, - 12,12,12,12,12,12,12,12,10,11,11,12,12,12,12,12, - 12,12,12,12,12,11,12,12,12,12,12,12,12,12,12,13, - 12,12,11,12,11,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,13,12,12,12,12,12,12,11,13,12,12, - 12,13,12,12,12,12,12,12,12, -}; - -static const static_codebook _44p4_l0_0 = { - 2, 169, - (char *)_vq_lengthlist__44p4_l0_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44p4_l0_0, - 0 -}; - -static const long _vq_quantlist__44p4_l0_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p4_l0_1[] = { - 3, 4, 4, 5, 5, 4, 4, 5, 5, 5, 4, 5, 4, 5, 5, 5, - 5, 6, 5, 6, 5, 6, 5, 6, 5, -}; - -static const static_codebook _44p4_l0_1 = { - 2, 25, - (char *)_vq_lengthlist__44p4_l0_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p4_l0_1, - 0 -}; - -static const long _vq_quantlist__44p4_l1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p4_l1_0[] = { - 1, 4, 4, 4, 4, 4, 4, 4, 4, -}; - -static const static_codebook _44p4_l1_0 = { - 2, 9, - (char *)_vq_lengthlist__44p4_l1_0, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44p4_l1_0, - 0 -}; - -static const char _huff_lengthlist__44p4_lfe[] = { - 1, 3, 2, 3, -}; - -static const static_codebook _huff_book__44p4_lfe = { - 2, 4, - (char *)_huff_lengthlist__44p4_lfe, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44p4_long[] = { - 3, 5,13, 9, 9,12,16,18, 4, 2,20, 6, 7,10,15,20, - 10, 7, 5, 5, 6, 8,10,13, 8, 5, 5, 3, 5, 7,10,11, - 9, 7, 6, 5, 5, 7, 9, 9,11,10, 8, 7, 6, 6, 8, 8, - 15,15,10,10, 9, 7, 8, 9,17,19,13,12,10, 8, 9, 9, -}; - -static const static_codebook _huff_book__44p4_long = { - 2, 64, - (char *)_huff_lengthlist__44p4_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p4_p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p4_p1_0[] = { - 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44p4_p1_0 = { - 5, 243, - (char *)_vq_lengthlist__44p4_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p4_p1_0, - 0 -}; - -static const long _vq_quantlist__44p4_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p4_p2_0[] = { - 3, 9, 9, 0, 0, 0, 8, 8, 0, 0, 0, 9, 9, 0, 0, 0, - 12,12, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 0, 0, 0,11,11, 0, 0, 0, 0, 0, - 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, - 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0,12,12, 0, 0, - 0, 0, 0, 0, 0, 0,11,11, 0, 0, 0,12,12, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, - 5, 5, 0, 0, 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, - 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, - 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 7, 7, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,11,11, 0, 0, 0, 9, 9, 0, - 0, 0,10,10, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, - 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, - 10,10, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, - 0, 0, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0,11,11, 0, - 0, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 0, 0, 0, 7, 7, 0, 0, 0, 8, 8, 0, 0, - 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, - 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, - 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0,11,11, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, - 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, 7, 7, - 0, 0, 0, 9, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, - 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 9, 9, 0, 0, 0, 0, - 0, 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 9, 0, 0, 0, 7, 7, 0, 0, 0, 8, 8, 0, - 0, 0,10,11, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 7, - 7, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0,11,11, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0,10,10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, 7, - 7, 0, 0, 0, 9, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 0, - 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 9, 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,10,10, 0, 0, 0, 9, 9, 0, 0, 0,10,10, - 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0,10,10, 0, 0, - 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0,11, - 11, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0,12,12, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, - 9, 9, 0, 0, 0,10,10, 0, 0, 0,12,12, 0, 0, 0, 0, - 0, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, - 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0,10,10, 0, 0, - 0, 0, 0, 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, - 10,10, 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44p4_p2_0 = { - 5, 3125, - (char *)_vq_lengthlist__44p4_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p4_p2_0, - 0 -}; - -static const long _vq_quantlist__44p4_p3_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p4_p3_0[] = { - 1, 6, 6, 5, 7, 8, 0, 8, 8, 6, 9, 9, 7,10,10, 0, - 8, 8, 0, 9, 9, 0,12,12, 0, 8, 8, 4, 7, 7, 6,10, - 10, 0,12,12, 7,11,11, 8,12,12, 0,12,12, 0,13,12, - 0,15,15, 0,12,12, 0, 7, 7, 0, 7, 7, 0, 7, 7, 0, - 8, 8, 0,10,10, 0, 7, 7, 0, 8, 8, 0,11,11, 0, 7, - 7, 5, 7, 7, 8, 9, 9, 0,10,10, 8, 9, 9,11,11,11, - 0,10, 9, 0,11,11, 0,13,13, 0,10,10, 6, 7, 7, 8, - 10,10, 0,12,12, 9,10,10,10,12,12, 0,12,12, 0,12, - 12, 0,15,15, 0,12,12, 0,10,10, 0,11,11, 0,11,11, - 0,11,11, 0,13,13, 0,11,11, 0,11,11, 0,15,15, 0, - 10,10, 0, 8, 8, 0,10,10, 0,12,12, 0,11,11, 0,12, - 12, 0,12,12, 0,12,12, 0,15,15, 0,11,11, 0, 7, 7, - 0,10,10, 0,12,12, 0,10,10, 0,12,12, 0,12,12, 0, - 13,13, 0,14,14, 0,12,12, 0, 0, 0, 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 static_codebook _44p4_p3_0 = { - 5, 243, - (char *)_vq_lengthlist__44p4_p3_0, - 1, -533200896, 1614282752, 2, 0, - (long *)_vq_quantlist__44p4_p3_0, - 0 -}; - -static const long _vq_quantlist__44p4_p3_1[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p4_p3_1[] = { - 3, 5, 5, 0, 8, 8, 0, 8, 8, 0, 9, 9, 0,10,10, 0, - 8, 8, 0, 8, 8, 0,10,10, 0, 8, 8, 0, 7, 7, 0, 8, - 8, 0, 7, 7, 0, 8, 8, 0, 8, 8, 0, 8, 8, 0, 8, 8, - 0, 8, 8, 0, 8, 8, 0, 7, 7, 0, 6, 6, 0, 7, 7, 0, - 7, 7, 0,10,10, 0, 6, 6, 0, 7, 7, 0,10,10, 0, 5, - 5, 0, 8, 8, 0, 7, 7, 0, 8, 8, 0, 8, 8, 0, 9, 9, - 0, 7, 7, 0, 8, 8, 0, 9, 9, 0, 7, 7, 0, 6, 6, 0, - 9,10, 0,10,10, 0,10,10, 0,11,11, 0, 9, 9, 0,10, - 10, 0,11,11, 0, 9, 9, 0, 8, 8, 0, 8, 8, 0, 8, 8, - 0, 9, 9, 0, 9, 9, 0, 7, 7, 0, 8, 8, 0, 9, 9, 0, - 7, 7, 0, 8, 8, 0, 7, 7, 0, 7, 7, 0, 8, 8, 0, 9, - 9, 0, 7, 7, 0, 7, 7, 0, 8, 8, 0, 6, 6, 0, 6, 6, - 0,10,10, 0,10,10, 0,10,10, 0,12,12, 0, 9, 9, 0, - 10,10, 0,12,12, 0, 9, 9, 0, 8, 8, 0, 7, 7, 0, 7, - 7, 0, 8, 8, 0, 9, 9, 0, 7, 7, 0, 8, 8, 0, 9, 9, - 0, 6, 6, -}; - -static const static_codebook _44p4_p3_1 = { - 5, 243, - (char *)_vq_lengthlist__44p4_p3_1, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p4_p3_1, - 0 -}; - -static const long _vq_quantlist__44p4_p4_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p4_p4_0[] = { - 1, 6, 6, 6, 7, 7, 7, 8, 8, 7, 8, 8,10,11,11, 9, - 8, 8, 8, 8, 8,11,11,12, 9, 8, 8, 5, 7, 7, 9,11, - 11,10,11,11,10,11,11,12,14,14,11,12,12,10,12,12, - 13,14,14,12,12,12, 5, 6, 6, 7, 6, 6, 8, 7, 7, 8, - 7, 7,11,10,10,10, 7, 7, 9, 8, 8,12,11,11,10, 7, - 7, 7, 7, 7,11,10,10,12,10,10,11,10,10,15,13,13, - 13,10,10,12,11,11,15,13,13,14,11,11, 7, 7, 7,11, - 11,11,12,11,11,12,11,11,14,14,14,13,12,12,12,12, - 12,16,15,15,14,12,12, 0,10,10, 0,11,11, 0,12,12, - 0,11,11, 0,14,14, 0,11,11, 0,12,12, 0,15,15, 0, - 11,11, 7, 8, 8,12,11,10,12,10,10,12,11,11,15,13, - 13,14,11,11,12,10,10,16,14,14,14,10,10, 8, 7, 7, - 12,11,11,12,11,11,12,11,11,15,14,14,14,12,12,13, - 12,12,15,14,14,15,13,13, 0,11,11, 0,12,12, 0,12, - 12, 0,12,12, 0,15,15, 0,12,12, 0,13,13, 0,15,14, - 0,12,12, -}; - -static const static_codebook _44p4_p4_0 = { - 5, 243, - (char *)_vq_lengthlist__44p4_p4_0, - 1, -531365888, 1616117760, 2, 0, - (long *)_vq_quantlist__44p4_p4_0, - 0 -}; - -static const long _vq_quantlist__44p4_p4_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p4_p4_1[] = { - 4, 5, 5, 9, 9,12, 9, 9,12,12,12,10,10,13,13,13, - 11,11,12,12,13,13,13,12,12,13,10,10,13,13,13,13, - 13,13,13,13,10,10,13,12,13,11,11,13,13,13,14,14, - 13,12,13,10,10,13,13,12,13,13,13,13,13,10,10,12, - 12,13,11,11,13,13,13,14,14,12,12,13,12,12,13,13, - 13,13,13,13,13,13,11,11,12,12,13,11,11,13,13,13, - 14,14,12,12,13,14,14,13,13,14,13,13,14,14,14,14, - 14,12,12,13,14,14,13,13,14,14,14,12,12,12, 8, 8, - 12,12,13,12,12,11,11,13,11,11,11,11,14,12,12,11, - 11,14,12,12,10,11,14,12,12,12,12,14,12,12,12,12, - 13,13,13,11,11,14,12,12,11,11,14,12,12,12,12,14, - 12,12,12,12,14,12,12,12,12,14,13,13,11,11,14,12, - 12,11,11,14,12,12,12,12,14,13,13,12,12,14,12,12, - 12,12,14,13,13,11,11,14,12,12,11,11,14,13,13,11, - 11,15,13,13,12,12,14,12,12,12,12,15,13,13,12,12, - 14,12,12,11,11,15,13,13,11,11,12, 9, 9,11,11,13, - 7, 7,11,11,13, 8, 8,12,12,14,10,10,10,10,14,14, - 14,11,11,14, 8, 8,12,12,14,14,14,12,12,14, 7, 7, - 11,11,14, 9, 9,12,12,14,14,14,11,11,14, 8, 8,12, - 12,14,14,14,12,12,14, 7, 7,11,11,14, 9, 9,12,12, - 14,14,14,11,11,14,10,10,12,12,14,14,14,13,13,14, - 9, 9,11,11,14,10,10,12,11,15,14,14,11,11,14,15, - 15,12,12,15,14,14,14,14,15,14,14,11,11,15,14,14, - 12,12,15,14,14,11,11,14,11,11,10,10,15,10,10,10, - 10,15,10,10,10,10,15,11,11, 9, 9,15,12,13, 9, 9, - 15,11,11,11,11,15,13,13,11,11,15,10,10,10,10,15, - 11,11,10,10,15,13,13,11,11,15,11,11,11,11,15,13, - 13,11,11,15,10,10,10,10,15,11,11,10,10,15,13,13, - 10,11,15,12,12,11,11,15,13,13,11,10,15,11,11,10, - 10,15,11,12,10, 9,15,13,13,10,10,15,14,14,11,11, - 15,13,13,11,11,15,14,14,10,10,15,13,13,10,10,15, - 14,14,10,10,14,13,13,10,10,15,13,13,10,10,15,13, - 13,10,10,14,14,14, 8, 9,15,14,14, 9, 9,15,14,14, - 11,11,15,14,14,10,10,15,14,14,10,10,15,14,14,11, - 11,15,14,14,10,10,15,14,14,11,11,15,14,14,10,10, - 15,14,14,10,10,15,14,14,10,10,15,14,14, 9, 9,15, - 14,14,11,11,15,14,14,11,11,15,14,14,10,10,15,14, - 14,10,10,14,14,14, 9, 9,15,15,15,11,11,15,14,14, - 12,12,15,15,15,10,10,15,14,15,10,10,15,15,15, 9, - 9,15,10,10,13,13,17, 8, 8,12,12,17,10, 9,13,13, - 18,11,11,12,12,18,14,14,12,12,17, 9, 9,13,13,17, - 13,13,12,12,18, 8, 8,12,12,18,10,10,12,12,18,14, - 14,12,12,18,10,10,13,13,18,13,13,13,13,18, 9, 9, - 12,12,18,10,10,13,13,18,14,14,12,12,18,11,11,13, - 13,18,14,14,13,13,18,10,10,12,12,17,11,11,12,12, - 18,14,14,12,12,18,14,14,13,13,18,14,14,13,13,19, - 14,15,12,12,18,14,14,12,12,18,15,15,12,12,13, 7, - 7,11,11,14,15,15,11,11,14,16,15,11,11,14,15,15, - 11,11,14,15,15,11,11,14,15,15,11,12,14,15,15,12, - 12,13,15,15,11,11,14,15,15,11,11,15,15,15,12,12, - 14,15,15,12,12,14,16,16,12,12,14,15,15,11,11,14, - 15,15,11,11,15,15,15,12,12,15,15,15,12,12,14,15, - 15,12,12,14,15,15,11,11,14,15,15,11,11,15,14,15, - 12,12,15,15,15,12,12,15,16,16,12,12,15,15,15,12, - 12,14,15,15,12,12,15,15,15,12,12,13,13,13,11,11, - 14,14,15,11,11,14,14,14,12,12,14,15,15,10,10,15, - 15,15,11,11,14,15,15,12,12,14,14,14,11,11,14,15, - 15,11,11,14,15,15,12,12,15,15,15,11,11,14,15,15, - 12,12,14,14,15,11,11,14,15,15,11,11,14,15,15,12, - 12,15,15,15,11,11,15,15,15,12,12,14,15,15,12,12, - 14,15,15,10,10,14,15,15,11,11,15,15,15,10,10,15, - 15,15,12,12,15,15,15,14,14,15,15,15,11,11,15,15, - 15,11,11,15,15,15,11,11,14,10,10,10,10,15, 9, 9, - 12,11,15,10,10,12,12,15,11,11,11,11,15,13,13,12, - 12,16,10,10,12,12,15,13,13,12,12,15, 9, 9,11,11, - 15,10,10,13,12,15,13,13,11,11,15,10,10,12,12,15, - 13,13,12,12,15, 9, 9,11,11,15,10,10,12,12,15,13, - 13,11,11,15,11,11,12,12,15,13,13,13,13,15,10,10, - 11,11,15,11,11,12,12,15,13,14,11,11,15,14,14,13, - 13,16,14,14,20,19,15,14,14,11,11,15,13,14,12,12, - 15,14,14,11,11,14,13,13,10,10,14,14,13,11,11,15, - 13,14,12,12,15,14,14,12,12,15,14,14,11,11,15,14, - 14,12,12,15,15,14,13,13,15,14,14,11,11,15,14,14, - 11,11,15,14,14,13,13,15,14,14,12,12,15,14,14,13, - 13,15,14,14,11,11,15,14,14,11,11,15,14,14,13,13, - 15,14,14,12,12,15,14,14,12,12,15,14,14,12,12,15, - 14,14,11,11,15,15,15,12,12,15,15,15,13,13,16,14, - 14,12,12,15,15,15,13,13,15,15,15,12,12,15,15,15, - 12,12,14,10,10,13,13,17, 9, 9,12,12,17, 9, 9,13, - 13,17,11,11,12,12,18,14,14,12,12,18,10,10,13,13, - 18,14,13,12,12,18, 9, 9,12,12,18,10,10,12,13,18, - 14,14,12,12,17, 9, 9,12,12,17,13,14,12,12,17, 9, - 9,12,12,17,10,10,12,12,17,14,14,11,11,18,11,11, - 12,12,18,14,14,12,13,18,10,10,12,12,18,11,11,12, - 12,18,14,14,11,11,18,15,15,12,12,18,14,14,13,13, - 18,14,15,12,12,17,14,14,12,12,17,15,15,12,12,13, - 7, 7,11,11,14,15,15,11,11,14,15,15,11,11,14,15, - 15,11,11,14,15,15,11,11,14,15,15,11,11,14,15,15, - 12,12,14,15,15,11,11,14,15,15,11,11,15,15,15,12, - 12,14,15,15,11,11,14,15,15,12,12,14,15,15,11,11, - 15,15,15,11,11,15,15,15,12,12,14,15,15,12,12,14, - 15,16,12,12,14,15,15,11,11,14,15,15,11,11,15,15, - 15,12,12,15,15,15,12,12,15,16,16,12,12,15,15,15, - 12,12,15,15,15,12,12,15,15,15,12,12,13,13,13,12, - 12,14,14,14,11,11,14,14,14,12,12,14,14,14,10,10, - 15,15,15,11,11,14,15,15,12,12,14,14,14,11,11,14, - 15,15,11,11,14,14,14,12,12,15,15,14,11,11,14,15, - 15,12,12,14,14,14,11,11,14,15,15,11,11,14,14,14, - 11,11,15,14,14,10,10,14,15,15,12,12,14,14,14,12, - 12,14,15,15,10,10,14,15,15,11,11,15,15,15,10,10, - 15,15,15,12,12,15,14,14,13,13,15,15,15,10,10,15, - 14,14,11,11,15,15,15,10,10,14,10,10,10,10,14, 9, - 9,12,12,15,10,10,12,12,14,11,11,11,11,15,13,14, - 12,12,15,10,10,13,13,15,13,13,12,12,15, 9, 9,12, - 12,15,10,10,13,13,15,13,14,11,11,15,10,10,12,12, - 15,13,13,12,12,15, 9, 9,11,11,15,10,10,12,12,15, - 13,13,11,11,15,11,11,12,12,15,13,13,13,13,15,10, - 10,11,11,15,11,11,12,12,15,14,14,11,11,15,14,14, - 13,13,15,14,14,20,19,15,14,14,11,11,15,14,14,12, - 12,15,14,14,11,11,14,13,13,11,11,15,13,13,11,11, - 15,14,13,12,12,15,14,14,11,12,15,14,14,11,11,15, - 14,14,12,12,14,14,14,13,13,15,14,14,11,11,15,14, - 14,11,11,15,14,14,13,13,15,14,14,12,12,15,14,14, - 13,13,14,14,14,11,11,15,14,14,11,11,15,14,14,13, - 13,15,14,14,12,12,15,14,14,12,12,15,14,14,12,12, - 15,14,14,11,11,14,14,14,12,12,15,15,15,13,13,16, - 14,14,12,12,15,15,15,13,13,15,14,14,12,12,15,15, - 15,12,12,15,11,11,13,13,18,10,10,12,12,17,11,11, - 12,12,18,12,12,11,11,18,14,14,12,12,18,10,10,13, - 13,18,14,14,12,12,18,10,10,12,12,18,11,11,12,12, - 18,14,14,12,12,18,11,11,12,13,18,14,14,12,12,18, - 10,10,12,12,18,11,11,12,12,18,14,14,11,11,18,11, - 11,12,12,18,14,14,12,12,17,10,10,11,11,17,12,12, - 11,11,17,14,14,11,11,18,15,15,12,12,18,14,14,13, - 13,18,15,15,11,11,18,15,14,12,12,18,15,15,11,11, - 14, 8, 8,11,11,14,15,15,10,10,14,15,15,11,11,14, - 15,15,11,11,15,15,15,12,12,15,15,15,11,11,15,15, - 15,12,12,14,15,15,10,10,15,15,15,11,11,15,15,15, - 12,12,15,15,15,11,11,15,15,15,13,13,14,15,15,10, - 10,15,15,15,11,11,15,15,15,12,12,15,15,15,12,12, - 15,16,16,12,12,15,14,14,11,11,15,15,15,11,11,15, - 15,15,12,12,16,15,15,13,13,15,16,16,13,13,16,15, - 15,12,12,15,15,15,12,12,15,15,15,12,12,14,13,13, - 11,11,14,14,14,11,11,14,14,14,12,12,15,14,14,11, - 11,15,15,14,11,11,15,14,14,12,12,15,14,14,12,12, - 14,15,15,11,11,15,14,14,12,12,15,14,14,11,11,15, - 14,15,12,12,15,14,14,12,12,14,15,15,11,11,15,14, - 14,11,11,15,14,14,11,11,15,15,14,12,12,15,14,14, - 12,12,15,15,15,10,11,15,14,14,11,11,15,15,15,10, - 10,15,15,15,12,12,16,14,14,13,13,15,15,15,11,11, - 15,14,14,11,11,15,15,15,11,11,14,11,11, 9, 9,14, - 10,10,12,12,15,11,11,12,12,15,12,12,12,12,15,14, - 14,13,13,15,11,11,12,12,15,14,14,13,13,14,10,10, - 12,12,15,11,11,13,13,15,14,14,12,12,15,10,10,12, - 12,14,14,14,13,13,14,10,10,11,11,15,11,11,12,12, - 15,14,14,12,12,15,12,12,13,13,15,14,14,14,14,15, - 11,11,11,11,15,12,11,12,12,15,14,14,11,11,15,15, - 15,13,14,15,14,14,20,19,15,14,14,12,12,15,14,14, - 13,13,15,14,14,12,12,14,13,13,10,10,14,13,13,11, - 11,14,13,13,11,11,15,14,14,12,12,15,14,14,12,12, - 15,14,14,12,11,14,14,14,13,13,15,14,14,11,11,15, - 14,14,11,11,15,14,14,14,14,15,14,14,11,12,15,14, - 14,13,13,14,14,14,11,11,15,14,14,11,11,15,14,14, - 14,14,15,14,14,12,12,15,14,14,13,13,15,14,14,11, - 11,14,14,14,12,12,15,14,14,13,13,15,15,15,13,13, - 15,14,14,13,13,15,15,15,13,13,15,14,14,13,13,15, - 15,15,13,13,15,14,14,13,13,18,15,15,12,12,18,15, - 15,12,12,18,16,16,11,11,18,17,17,12,12,18,15,15, - 13,13,18,17,17,12,12,18,15,15,12,12,18,15,16,12, - 12,18,17,17,12,12,18,15,15,13,12,17,16,17,12,12, - 17,15,15,11,12,18,15,15,12,12,18,17,17,11,11,18, - 16,16,12,12,18,17,16,12,12,18,15,15,11,11,18,15, - 15,12,12,18,17,17,11,11,18,17,17,12,12,18,16,16, - 13,13,18,17,17,11,11,17,16,16,11,11,18,17,17,11, - 11,15,15,15,11,11,16,15,15,11,11,16,15,15,11,11, - 16,15,15,12,12,17,15,15,14,14,16,15,15,11,11,17, - 15,15,14,14,16,15,15,11,11,16,15,15,12,12,18,15, - 15,13,13,16,15,15,11,11,17,15,15,14,14,16,15,15, - 11,11,16,15,15,12,12,17,15,15,13,13,16,15,15,12, - 12,17,16,15,14,14,16,15,15,11,11,16,15,15,12,12, - 18,15,15,13,13,17,15,15,14,14,17,16,16,15,15,18, - 14,15,13,13,18,15,15,14,14,18,15,15,13,13,15,13, - 13,12,12,15,14,14,12,12,16,14,14,12,12,16,14,14, - 12,12,17,14,15,12,12,16,14,14,12,12,17,14,14,13, - 13,16,15,15,12,12,16,14,14,12,12,17,14,14,12,12, - 16,14,14,12,12,17,14,14,13,13,15,15,15,11,11,16, - 14,14,12,12,17,14,14,12,12,16,15,15,12,12,17,14, - 14,13,12,16,15,15,11,11,16,14,14,12,12,17,15,15, - 11,11,17,15,15,13,13,17,14,14,13,13,18,15,15,12, - 12,17,14,14,12,12,17,15,15,12,12,14,15,15, 9, 9, - 14,15,15,12,12,15,16,15,13,13,15,15,15,14,14,15, - 15,15,21,19,15,15,15,13,13,15,15,15,19,19,15,15, - 15,12,12,15,16,16,14,14,15,15,15,19,19,15,16,15, - 13,13,15,16,16,19,20,15,15,15,12,13,15,16,16,14, - 14,15,15,15,20,19,15,15,15,14,14,15,16,16,19,19, - 15,15,15,14,13,15,15,15,14,14,15,15,15,19,19,15, - 16,16,20,19,15,17,16,21,20,15,15,15,20,19,15,16, - 16,20,20,15,15,15,19,20,14,13,13,10,10,14,14,14, - 11,11,14,14,14,12,12,15,14,14,13,13,15,15,14,20, - 20,15,14,14,12,12,14,14,14,19,19,15,14,14,11,11, - 15,14,14,12,12,15,14,14,20,19,15,14,14,12,12,14, - 14,14,20,20,14,14,14,11,11,15,14,14,12,12,15,14, - 14,20,21,15,14,14,13,13,15,14,14,20,20,15,14,14, - 12,12,15,14,14,13,13,14,15,15,20,20,15,15,15,20, - 19,15,14,14,20,19,15,15,15,20,20,15,14,14,21,20, - 15,15,15,20,20, -}; - -static const static_codebook _44p4_p4_1 = { - 5, 3125, - (char *)_vq_lengthlist__44p4_p4_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p4_p4_1, - 0 -}; - -static const long _vq_quantlist__44p4_p5_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p4_p5_0[] = { - 1, 7, 6,15,15, 7, 8, 8,15,15, 8, 8, 8,15,15, 0, - 13,13,16,16, 0,14,14,16,16, 7, 9, 9,16,16,10,11, - 11,17,17,10, 8, 8,15,16, 0,14,14,18,18, 0,14,14, - 16,16, 9, 9, 9,16,16,12,11,11,17,17,10, 9, 9,15, - 15, 0,14,14,19,19, 0,14,14,16,16, 0,15,15,18,17, - 0, 0, 0,20,20, 0,13,13,16,16, 0,17,17,22,20, 0, - 15,15,17,17, 0,15,15,18,18, 0,22,21,20,21, 0,13, - 13,16,16, 0,18,18, 0,22, 0,15,15,17,17, 6, 7, 7, - 13,13, 9,10,10,15,15,11,10,10,15,15, 0,21,22,18, - 18, 0, 0, 0,18,18,10,10,10,15,15,12,13,13,17,17, - 12,11,11,15,15, 0,22,22,18,18, 0, 0,21,18,18,12, - 11,11,15,15,15,14,14,18,18,13,11,11,15,15, 0, 0, - 21,18,19, 0,21,22,18,19, 0,22, 0,18,19, 0, 0, 0, - 0, 0, 0,21,21,18,18, 0,22, 0, 0,21, 0, 0, 0,19, - 18, 0, 0, 0,18,19, 0, 0, 0, 0, 0, 0,20,20,18,17, - 0, 0,22, 0,21, 0, 0, 0,19,19, 6, 6, 6,13,13, 8, - 6, 6,11,11, 9, 7, 7,13,13, 0,10,10,11,11, 0,12, - 12,14,14, 9, 8, 8,14,14,12,10,10,13,13,10, 7, 7, - 13,13, 0,11,11,15,15, 0,11,11,13,13, 9, 8, 8,14, - 14,13,10,10,13,14,11, 7, 7,13,13, 0,11,11,15,15, - 0,11,11,13,13, 0,12,12,15,15, 0,21,21,17,17, 0, - 10,10,13,13, 0,14,14,20,20, 0,12,12,13,13, 0,12, - 12,15,15, 0,21,22,17,18, 0,10,10,13,13, 0,16,16, - 20,21, 0,12,12,13,13, 0,11,11,13,13, 0,12,12,16, - 16, 0,12,12,16,16, 0,16,16, 0,21, 0,17,18, 0, 0, - 0,12,12,15,15, 0,15,15,18,18, 0,12,12,16,16, 0, - 16,16,21,22, 0,17,17,22,21, 0,12,12,16,16, 0,15, - 15,19,19, 0,12,12,16,16, 0,16,16,22,22, 0,17,16, - 22, 0, 0,17,18, 0, 0, 0, 0, 0, 0, 0, 0,15,15,21, - 20, 0,19,20, 0,22, 0,18,18, 0, 0, 0,18,17, 0, 0, - 0, 0, 0, 0, 0, 0,16,16,22,21, 0,20,20, 0,22, 0, - 20,19, 0, 0, 0,11,11,12,12, 0,10,10,11,11, 0,11, - 11,12,12, 0,12,12,10,10, 0,13,13,12,12, 0,11,11, - 13,13, 0,13,13,12,12, 0,10,10,12,12, 0,13,13,14, - 13, 0,12,12,12,12, 0,12,12,13,13, 0,14,14,13,13, - 0,10,10,12,12, 0,13,13,14,14, 0,13,12,12,12, 0, - 14,14,14,14, 0,21,21,16,16, 0,12,12,12,12, 0,16, - 16,20,21, 0,13,13,11,11, 0,14,14,14,14, 0,20,20, - 16,15, 0,12,12,12,12, 0,17,17,20,20, 0,13,13,11, - 11, 7, 8, 8,16,16,11,10,10,15,15,12,10,10,17,17, - 0,14,14,16,15, 0,15,15,17,17,11, 9, 9,16,16,14, - 12,12,17,17,13, 9, 9,16,15, 0,14,14,19,18, 0,14, - 14,16,16,12,10,10,17,18,16,13,13,17,18,14,10,10, - 16,16, 0,14,14,19,19, 0,14,15,17,17, 0,15,15,18, - 19, 0, 0, 0,20,20, 0,13,13,17,17, 0,17,18, 0,22, - 0,15,15,16,17, 0,15,15,18,18, 0, 0, 0,20,21, 0, - 14,14,17,17, 0,19,18, 0, 0, 0,16,16,17,17, 8, 7, - 7,14,14,12,11,11,15,15,13,11,11,15,15, 0, 0, 0, - 18,19, 0,21,20,18,18,12,10,11,15,16,14,13,13,18, - 18,14,11,11,15,15, 0,20,20,19,18, 0,20, 0,18,18, - 13,11,11,16,16,17,15,15,19,19,14,12,12,15,15, 0, - 21, 0,18,20, 0,22,22,18,19, 0,22,22,19,19, 0, 0, - 0, 0, 0, 0,21,22,19,18, 0, 0, 0, 0,21, 0, 0, 0, - 19,19, 0, 0,22,20,20, 0, 0, 0, 0, 0, 0,22, 0,18, - 18, 0, 0, 0, 0,22, 0, 0, 0,19,20,11,10,10,14,14, - 14,11,11,13,13,14,11,11,15,15, 0,14,13,12,12, 0, - 15,15,16,16,13,11,11,15,15,16,13,13,15,15,15,10, - 10,14,15, 0,14,14,16,16, 0,14,14,15,15,13,11,11, - 15,15,18,14,14,15,15,15,10,10,15,14, 0,14,14,16, - 16, 0,14,14,15,15, 0,15,15,17,16, 0,21,22,18,18, - 0,13,13,14,14, 0,18,17,20,21, 0,15,15,14,14, 0, - 15,16,16,17, 0, 0, 0,19,18, 0,13,13,15,14, 0,19, - 19, 0, 0, 0,15,15,14,14, 0,12,12,14,13, 0,13,13, - 16,16, 0,12,12,16,16, 0,16,16,22, 0, 0,17,18, 0, - 22, 0,13,13,16,16, 0,15,15,18,18, 0,12,12,16,16, - 0,16,16,22,22, 0,17,17, 0, 0, 0,13,13,17,17, 0, - 16,16,19,20, 0,12,12,17,17, 0,17,17,22, 0, 0,17, - 17,22,21, 0,18,18, 0, 0, 0, 0, 0, 0, 0, 0,16,16, - 21,21, 0,19,19, 0, 0, 0,18,18, 0,22, 0,18,18, 0, - 22, 0, 0, 0, 0, 0, 0,16,16,22, 0, 0,20,20, 0, 0, - 0,19,18, 0, 0, 0,12,12,15,15, 0,12,12,15,14, 0, - 13,13,15,15, 0,14,14,14,14, 0,15,15,16,16, 0,13, - 13,15,16, 0,15,15,16,16, 0,12,12,15,15, 0,14,14, - 16,16, 0,14,14,15,15, 0,13,13,15,16, 0,15,15,16, - 16, 0,12,12,15,15, 0,15,15,17,17, 0,14,14,15,15, - 0,15,15,17,17, 0,21,21,19,19, 0,13,13,14,14, 0, - 17,17,22, 0, 0,14,14,15,15, 0,15,15,17,17, 0,22, - 0,18,20, 0,13,13,15,15, 0,18,18, 0,22, 0,15,15, - 14,15, 8, 8, 8,17,16,12,10,10,16,16,13,10,10,17, - 16, 0,15,15,17,17, 0,15,15,17,17,12,11,11,18,18, - 15,12,12,18,18,15,10,10,16,17, 0,14,14,18,18, 0, - 14,14,17,17,13,10,10,16,16,17,14,14,17,17,15,10, - 10,16,15, 0,15,15,19,20, 0,14,14,15,16, 0,16,16, - 19,19, 0, 0, 0,21,22, 0,13,13,17,17, 0,18,17, 0, - 21, 0,15,15,17,17, 0,15,15,18,19, 0, 0,22, 0,21, - 0,13,13,16,17, 0,19,19, 0,22, 0,16,15,16,16, 9, - 8, 8,14,14,12,11,11,15,15,13,11,11,15,15, 0,21, - 20,19,18, 0, 0, 0,19,18,12,11,11,16,15,15,13,13, - 17,18,14,11,11,15,15, 0,22,22,19,18, 0,22,21,18, - 18,14,11,11,15,15,17,14,14,18,18,15,12,12,15,15, - 0,22,22,20,19, 0, 0,21,18,18, 0, 0,22,20,20, 0, - 0, 0, 0, 0, 0,20,21,18,18, 0, 0, 0,21,21, 0, 0, - 0,20,19, 0,22,21,19,19, 0, 0, 0, 0, 0, 0, 0,22, - 17,18, 0, 0,22, 0,22, 0,22, 0,19,19, 0,11,11,15, - 15, 0,11,11,14,14, 0,12,12,15,15, 0,15,15,14,14, - 0,16,16,16,16, 0,12,12,16,16, 0,14,14,16,16, 0, - 11,11,15,15, 0,15,15,17,17, 0,15,15,15,15, 0,12, - 12,16,16, 0,14,14,15,15, 0,11,11,15,15, 0,15,15, - 17,17, 0,15,15,14,15, 0,16,16,17,17, 0, 0, 0,19, - 19, 0,14,14,15,15, 0,18,18,21, 0, 0,15,15,14,15, - 0,16,16,17,17, 0,21, 0,19,19, 0,14,14,15,15, 0, - 20,20,22, 0, 0,16,15,14,14, 0,12,12,13,13, 0,12, - 12,16,16, 0,12,12,16,16, 0,16,16,22,21, 0,18,17, - 21, 0, 0,13,13,16,16, 0,15,15,18,19, 0,12,12,16, - 16, 0,16,17,22, 0, 0,17,17, 0,22, 0,13,13,17,16, - 0,15,15,19,19, 0,12,12,16,16, 0,16,16,21,20, 0, - 17,16,22, 0, 0,18,18,22,21, 0, 0, 0, 0, 0, 0,15, - 16,21,21, 0,19,19, 0, 0, 0,18,17, 0, 0, 0,18,18, - 21, 0, 0, 0, 0, 0, 0, 0,16,16,22,22, 0,20,21, 0, - 0, 0,18,19, 0,22, 0,13,13,16,16, 0,12,12,15,15, - 0,13,13,16,16, 0,14,14,15,15, 0,15,15,17,17, 0, - 13,13,17,16, 0,15,15,17,17, 0,12,12,16,16, 0,15, - 15,17,17, 0,14,14,16,16, 0,13,13,16,17, 0,15,15, - 17,17, 0,12,12,16,16, 0,14,14,17,17, 0,14,14,16, - 16, 0,16,16,17,17, 0,21, 0,21,19, 0,13,13,16,16, - 0,17,17, 0, 0, 0,15,15,16,16, 0,16,15,18,18, 0, - 22, 0,20,20, 0,13,13,15,15, 0,18,18, 0, 0, 0,15, - 15,15,15, 0,12,12,17,17, 0,14,14,17,17, 0,14,14, - 17,17, 0,17,17,18,17, 0,17,17,19,18, 0,13,13,17, - 17, 0,16,16,18,18, 0,13,13,16,16, 0,17,17,19,19, - 0,16,16,17,17, 0,13,13,18,18, 0,17,17,18,18, 0, - 13,13,17,17, 0,17,17,19,19, 0,16,17,17,17, 0,17, - 17,19,19, 0,21, 0,21,19, 0,14,14,16,16, 0,20,19, - 0,21, 0,16,16,16,16, 0,17,18,19,19, 0, 0, 0, 0, - 21, 0,15,15,16,17, 0,21,20, 0, 0, 0,17,18,16,17, - 0, 9, 9,14,14, 0,14,14,15,16, 0,14,14,15,15, 0, - 0, 0,18,18, 0,21, 0,18,19, 0,12,12,15,15, 0,16, - 16,17,17, 0,14,14,14,14, 0,22, 0,19,18, 0,22, 0, - 17,18, 0,14,14,16,15, 0,18,18,19,18, 0,14,15,15, - 15, 0, 0,21,20,20, 0, 0, 0,18,18, 0,21,21,19,19, - 0, 0, 0, 0, 0, 0,21,21,18,18, 0,22, 0,20,20, 0, - 22, 0,19,19, 0,22, 0,19,20, 0, 0, 0, 0, 0, 0, 0, - 21,17,18, 0, 0, 0,22,22, 0, 0, 0,19,18, 0,18,20, - 16,16, 0,21,20,17,17, 0, 0,21,18,18, 0,22,21,18, - 18, 0, 0,22,19,19, 0,20,20,17,17, 0, 0, 0,18,18, - 0,19,20,17,17, 0,22, 0,19,21, 0,22,21,18,18, 0, - 20,19,17,18, 0, 0, 0,19,19, 0,20,20,17,17, 0,22, - 22,21,21, 0,20, 0,18,18, 0,22,22,18,18, 0, 0, 0, - 20,22, 0,20,20,16,16, 0, 0, 0,21, 0, 0,21,20,16, - 17, 0,22, 0,19,20, 0, 0, 0,21,20, 0,19,21,17,17, - 0, 0, 0, 0, 0, 0,21,21,17,17, 0,12,12,13,13, 0, - 14,14,16,16, 0,14,14,16,16, 0,18,18, 0, 0, 0,19, - 18,22, 0, 0,13,13,16,16, 0,16,16,18,18, 0,13,13, - 16,16, 0,17,18,21, 0, 0,18,18,21, 0, 0,13,13,16, - 16, 0,17,17,19,20, 0,13,13,16,17, 0,18,18,21, 0, - 0,18,18,21, 0, 0,18,19, 0,21, 0, 0, 0, 0, 0, 0, - 16,16,21,20, 0,20,20, 0, 0, 0,18,19, 0, 0, 0,18, - 18, 0, 0, 0, 0, 0, 0, 0, 0,16,16, 0,21, 0,22,22, - 0, 0, 0,19,19, 0, 0, 0,16,16,19,20, 0,17,16,22, - 21, 0,17,17,21,20, 0,19,18, 0,22, 0,19,19,22,22, - 0,16,15,22,22, 0,19,19, 0,21, 0,15,15,20,20, 0, - 18,19, 0,21, 0,18,18,22,22, 0,16,16,21,20, 0,20, - 19,21,22, 0,16,15,20,20, 0,19,19, 0,22, 0,18,18, - 21, 0, 0,19,18,21,22, 0, 0, 0, 0, 0, 0,16,16,19, - 21, 0,20,22, 0,22, 0,18,18,20,21, 0,19,18, 0,22, - 0, 0, 0,22, 0, 0,16,16,20,20, 0,21,21, 0, 0, 0, - 18,18,21, 0, 0,12,12,17,17, 0,15,14,17,17, 0,14, - 14,18,18, 0,17,17,17,18, 0,18,18,18,18, 0,13,13, - 18,18, 0,16,17,19,18, 0,13,13,16,17, 0,17,17,18, - 19, 0,17,17,17,17, 0,13,13,17,17, 0,17,18,18,18, - 0,13,13,16,16, 0,18,18,19,20, 0,16,17,17,16, 0, - 17,18,19,18, 0, 0, 0,22,21, 0,15,15,16,16, 0,20, - 20,21,22, 0,17,17,16,16, 0,16,17,18,18, 0, 0, 0, - 21,21, 0,15,15,16,16, 0,21,20, 0, 0, 0,17,17,16, - 16, 0,10,10,14,14, 0,14,14,15,15, 0,14,14,15,15, - 0,22, 0,18,18, 0, 0, 0,19,19, 0,13,13,15,16, 0, - 17,16,18,18, 0,14,14,15,15, 0,21,21,19,18, 0,22, - 21,18,17, 0,14,14,15,15, 0,18,18,19,18, 0,15,15, - 14,14, 0,22,21,19,19, 0,22,21,17,18, 0, 0, 0,19, - 19, 0, 0, 0, 0, 0, 0,20,22,17,17, 0, 0,22,22,20, - 0, 0, 0,19,18, 0,21,22,19,18, 0, 0, 0, 0, 0, 0, - 22,22,17,18, 0, 0, 0,21,22, 0, 0, 0,19,18, 0,20, - 20,17,17, 0,21,21,17,18, 0,21,22,18,18, 0,21, 0, - 18,18, 0,22, 0,19,19, 0,19,21,18,18, 0, 0,22,18, - 18, 0,22,21,17,17, 0,22, 0,20,20, 0, 0, 0,18,18, - 0,22,21,18,18, 0,21, 0,19,19, 0,20,21,17,17, 0, - 0,22,22,20, 0,21,22,17,17, 0, 0,21,19,18, 0, 0, - 0,21,21, 0,21,20,16,17, 0, 0, 0, 0, 0, 0,21, 0, - 17,17, 0,21, 0,19,20, 0, 0, 0,20,22, 0,20,20,17, - 17, 0, 0, 0, 0, 0, 0,21,21,17,17, 0,12,12,13,13, - 0,14,14,16,16, 0,14,14,16,16, 0,18,18,21, 0, 0, - 19,19,22, 0, 0,13,13,16,16, 0,16,16,18,18, 0,13, - 13,16,16, 0,18,18,21,22, 0,18,18, 0,22, 0,13,13, - 16,16, 0,17,17,20,18, 0,13,13,16,16, 0,19,18, 0, - 22, 0,18,18,22,21, 0,18,19, 0, 0, 0, 0, 0, 0, 0, - 0,16,16,21,21, 0,21,21, 0, 0, 0,18,19, 0, 0, 0, - 19,19,21, 0, 0, 0, 0, 0, 0, 0,16,16, 0,21, 0,20, - 20, 0, 0, 0,20,20, 0, 0, 0,16,16,21,20, 0,18,17, - 21,22, 0,17,18, 0,21, 0,18,19,22,22, 0,19,19, 0, - 22, 0,16,17,21,22, 0,20,19, 0, 0, 0,16,16,20,21, - 0,19,19, 0, 0, 0,19,19, 0,22, 0,17,17,21,21, 0, - 19,20, 0, 0, 0,16,16, 0,20, 0,19,20, 0,21, 0,18, - 18, 0,22, 0,19,20,22,22, 0, 0, 0, 0,22, 0,17,17, - 0,21, 0,21,21, 0, 0, 0,18,19,23,21, 0,20,19, 0, - 0, 0, 0, 0, 0, 0, 0,17,17, 0,20, 0, 0, 0, 0, 0, - 0,19,19,23,22, -}; - -static const static_codebook _44p4_p5_0 = { - 5, 3125, - (char *)_vq_lengthlist__44p4_p5_0, - 1, -528744448, 1616642048, 3, 0, - (long *)_vq_quantlist__44p4_p5_0, - 0 -}; - -static const long _vq_quantlist__44p4_p5_1[] = { - 3, - 2, - 4, - 1, - 5, - 0, - 6, -}; - -static const char _vq_lengthlist__44p4_p5_1[] = { - 2, 3, 3, 3, 3, 3, 3, -}; - -static const static_codebook _44p4_p5_1 = { - 1, 7, - (char *)_vq_lengthlist__44p4_p5_1, - 1, -533200896, 1611661312, 3, 0, - (long *)_vq_quantlist__44p4_p5_1, - 0 -}; - -static const long _vq_quantlist__44p4_p6_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p4_p6_0[] = { - 1, 7, 7, 7, 8, 8, 7, 8, 8, 7, 9, 9,11,11,11, 9, - 8, 8, 8, 9, 9,12,11,12, 9, 8, 8, 6, 7, 7,10,11, - 11,10,10,10,11,11,11,14,14,14,12,11,12,11,11,11, - 15,15,14,13,12,12, 5, 6, 6, 8, 5, 5, 8, 7, 7, 8, - 7, 7,12,10,10,10, 7, 6, 9, 8, 8,12,10,10,10, 6, - 6, 7, 8, 8,12,10,10,12,10,10,11,10,10,16,14,14, - 13,10,10,12,10,10,15,14,14,14,10,10, 7, 7, 7,13, - 11,11,13,11,11,12,11,11,16,14,14,14,12,12,12,11, - 11,18,15,15,14,12,12,10, 9,10,14,11,11,13,11,11, - 12,11,11,17,14,14,14,11,11,13,11,11,16,15,15,14, - 11,11, 7, 8, 8,13,11,11,12,10,10,12,10,10,16,14, - 13,13,10,10,12,10,10,17,14,14,14,10,10, 8, 7, 7, - 12,11,11,13,11,11,12,11,11,16,15,14,14,12,12,12, - 11,11,16,15,15,14,12,12,11,10,10,14,11,11,13,11, - 11,13,11,11,17,14,14,14,11,11,13,11,11,18,14,15, - 15,11,10, -}; - -static const static_codebook _44p4_p6_0 = { - 5, 243, - (char *)_vq_lengthlist__44p4_p6_0, - 1, -527106048, 1620377600, 2, 0, - (long *)_vq_quantlist__44p4_p6_0, - 0 -}; - -static const long _vq_quantlist__44p4_p6_1[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p4_p6_1[] = { - 2, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, - 7, 7, 8, 8, 8, 9, 9, 9, 9, 8, 8, 6, 7, 7, 8, 8, - 8, 8, 8, 8, 9, 8, 8, 9, 8, 9, 9, 8, 8,10, 8, 8, - 10, 9, 9,10, 8, 8, 6, 6, 6, 8, 6, 6, 8, 7, 7, 8, - 7, 7,10, 8, 8, 9, 7, 7, 9, 7, 7,10, 8, 8, 9, 7, - 7, 7, 7, 7,10, 8, 8,11, 9, 9,10, 9, 9,11, 9, 9, - 11, 8, 8,11, 9, 9,12, 9, 9,12, 8, 8, 7, 7, 7,10, - 9, 9,10, 9, 9,10, 9, 9,11,10,10,10, 9, 9,11, 9, - 10,11,10,11,10, 9, 9, 9, 8, 8,10, 9, 9,10, 9, 9, - 11, 9, 9,11,10,10,11, 9, 9,11, 9, 9,11,10,10,11, - 9, 9, 8, 8, 8,11, 9, 9,11, 9, 9,11, 9, 9,12, 9, - 9,12, 8, 8,11, 9, 9,12, 9, 9,12, 8, 8, 8, 7, 7, - 10, 9, 9,10, 9, 9,10, 9, 9,11,11,11,11, 9, 9,11, - 10,10,11,11,11,11, 9, 9,10, 9, 9,11, 9, 9,11, 9, - 10,11,10,10,11,10,10,11, 9, 9,11,10,10,11,10,10, - 11, 9, 9, -}; - -static const static_codebook _44p4_p6_1 = { - 5, 243, - (char *)_vq_lengthlist__44p4_p6_1, - 1, -530841600, 1616642048, 2, 0, - (long *)_vq_quantlist__44p4_p6_1, - 0 -}; - -static const long _vq_quantlist__44p4_p7_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p4_p7_0[] = { - 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, -}; - -static const static_codebook _44p4_p7_0 = { - 5, 243, - (char *)_vq_lengthlist__44p4_p7_0, - 1, -513979392, 1633504256, 2, 0, - (long *)_vq_quantlist__44p4_p7_0, - 0 -}; - -static const long _vq_quantlist__44p4_p7_1[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p4_p7_1[] = { - 1, 9, 9, 7, 9, 9, 8, 8, 9, 9, 9, 9, 9, 9, 9, 8, - 9, 9, 7, 9, 9, 9, 9, 9, 9, 9, 9, 7, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 6, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 5, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 5,10, 9,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10, 8,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10, -}; - -static const static_codebook _44p4_p7_1 = { - 5, 243, - (char *)_vq_lengthlist__44p4_p7_1, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44p4_p7_1, - 0 -}; - -static const long _vq_quantlist__44p4_p7_2[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const char _vq_lengthlist__44p4_p7_2[] = { - 1, 3, 2, 5, 4, 7, 7, 8, 8, 9, 9,10,10,11,11,12, - 12,13,13,14,14,15,15,15,15, -}; - -static const static_codebook _44p4_p7_2 = { - 1, 25, - (char *)_vq_lengthlist__44p4_p7_2, - 1, -518864896, 1620639744, 5, 0, - (long *)_vq_quantlist__44p4_p7_2, - 0 -}; - -static const long _vq_quantlist__44p4_p7_3[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const char _vq_lengthlist__44p4_p7_3[] = { - 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44p4_p7_3 = { - 1, 25, - (char *)_vq_lengthlist__44p4_p7_3, - 1, -529006592, 1611661312, 5, 0, - (long *)_vq_quantlist__44p4_p7_3, - 0 -}; - -static const char _huff_lengthlist__44p4_short[] = { - 3, 5,16, 9, 9,13,18,21, 4, 2,21, 6, 6,10,15,21, - 16,19, 6, 5, 7,10,13,16, 8, 6, 5, 4, 4, 8,13,16, - 8, 5, 6, 4, 4, 7,12,15,13,10, 9, 7, 7, 9,13,16, - 18,15,13,12, 9, 7,10,14,21,18,13,13, 7, 5, 8,12, -}; - -static const static_codebook _huff_book__44p4_short = { - 2, 64, - (char *)_huff_lengthlist__44p4_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p5_l0_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44p5_l0_0[] = { - 1, 4, 4, 8, 8,10,10,10,10, 9, 8,11,11, 4, 6, 5, - 8, 6,10,10,10,10,10, 9,10, 9, 4, 5, 6, 6, 9,10, - 10,10,10, 9,10, 9,10, 8, 9, 8, 9, 8, 9, 9,10, 9, - 11,10,12,10, 8, 8, 9, 8, 9, 9, 9, 9,10,10,11,10, - 12, 9,10,10,11,10,11,10,12,11,12,11,13,11, 9,10, - 10,10,11,10,11,11,12,11,12,11,12,11,12,12,12,12, - 13,12,13,12,13,12,13,13,11,12,12,12,12,12,12,12, - 13,13,13,13,13,12,12,12,13,13,13,13,13,13,13,13, - 13,13,12,13,12,13,13,13,13,13,13,13,13,13,13,12, - 13,13,13,14,14,13,13,13,13,13,13,13,12,13,12,13, - 13,13,13,13,13,13,13,13,13, -}; - -static const static_codebook _44p5_l0_0 = { - 2, 169, - (char *)_vq_lengthlist__44p5_l0_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44p5_l0_0, - 0 -}; - -static const long _vq_quantlist__44p5_l0_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p5_l0_1[] = { - 4, 4, 4, 5, 5, 4, 5, 5, 5, 5, 4, 5, 4, 4, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44p5_l0_1 = { - 2, 25, - (char *)_vq_lengthlist__44p5_l0_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p5_l0_1, - 0 -}; - -static const long _vq_quantlist__44p5_l1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p5_l1_0[] = { - 1, 4, 4, 4, 4, 4, 4, 4, 4, -}; - -static const static_codebook _44p5_l1_0 = { - 2, 9, - (char *)_vq_lengthlist__44p5_l1_0, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44p5_l1_0, - 0 -}; - -static const char _huff_lengthlist__44p5_lfe[] = { - 1, 3, 2, 3, -}; - -static const static_codebook _huff_book__44p5_lfe = { - 2, 4, - (char *)_huff_lengthlist__44p5_lfe, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44p5_long[] = { - 3, 7,12,14,14,16,18,19, 6, 2, 4, 6, 8, 9,12,14, - 12, 3, 3, 5, 7, 8,11,13,13, 6, 4, 5, 7, 8,10,11, - 14, 8, 7, 7, 7, 7, 9,10,15, 9, 8, 7, 7, 6, 8, 9, - 17,11,11,10, 9, 8, 9, 9,19,14,13,11,10, 9, 9, 9, -}; - -static const static_codebook _huff_book__44p5_long = { - 2, 64, - (char *)_huff_lengthlist__44p5_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p5_p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p5_p1_0[] = { - 2, 5, 5, 5, 7, 7, 5, 7, 7, 5, 7, 7, 7, 8, 9, 7, - 9, 9, 5, 7, 7, 7, 9, 9, 7, 9, 8, 5, 7, 8, 8, 9, - 10, 8, 9,10, 8, 9,10, 9,10,12,10,11,11, 8,10,10, - 10,11,11, 9,11,11, 5, 8, 7, 8, 9, 9, 8,10, 9, 8, - 10,10, 9,11,11,10,11,11, 8,10, 9,10,11,11, 9,12, - 10, 5, 8, 8, 7, 9,10, 8,10, 9, 7, 9, 9, 9,10,11, - 9,11,11, 8,10, 9,10,11,11,10,11,11, 7, 9, 9, 9, - 10,11, 9,11,11, 9, 9,11,10,10,13,11,11,12, 9,11, - 11,11,12,13,11,13,12, 7, 9, 9, 9,11,11, 9,11,10, - 9,11,10,10,11,12,11,13,12, 9,11,11,11,12,13,11, - 13,11, 5, 8, 8, 8, 9,10, 7,10, 9, 8, 9,10,10,11, - 11,10,11,11, 7, 9, 9, 9,11,11, 9,11,10, 7, 9, 9, - 9,10,11, 9,11,11, 9,11,11,11,11,13,11,13,12, 9, - 10,11,11,12,13,10,12,11, 7, 9, 9, 9,11,11, 9,11, - 10, 9,11,11,11,12,13,11,13,12, 9,11, 9,11,12,11, - 10,13,10, -}; - -static const static_codebook _44p5_p1_0 = { - 5, 243, - (char *)_vq_lengthlist__44p5_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p5_p1_0, - 0 -}; - -static const long _vq_quantlist__44p5_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p5_p2_0[] = { - 4, 6, 6, 9, 9, 6, 7, 8,10,10, 6, 8, 7,10,10, 8, - 10,10,12,13, 8,10,10,13,12, 6, 7, 8,10,10, 7, 8, - 9,10,11, 8, 9, 9,11,11,10,10,11,12,14,10,11,11, - 14,13, 6, 8, 7,10,10, 8, 9, 9,11,11, 7, 9, 8,11, - 10,10,11,11,13,14,10,11,10,14,12, 9,10,10,12,12, - 10,10,11,12,13,10,11,11,13,13,12,12,13,12,15,13, - 14,13,15,14, 9,10,10,12,12,10,11,11,13,13,10,11, - 10,13,12,13,13,14,14,15,12,13,12,15,12, 6, 7, 8, - 10,11, 8, 9,10,11,12, 8, 9, 9,11,12,10,11,12,13, - 14,10,11,11,14,13, 8, 9,10,11,12, 9,10,11,12,13, - 9,10,11,12,13,11,12,13,13,15,12,12,13,15,14, 8, - 9, 9,12,12, 9,10,11,12,13, 9,10,10,13,12,12,12, - 13,14,15,11,12,12,14,14,11,11,12,13,14,11,12,13, - 13,15,12,13,13,14,15,14,13,15,14,16,14,15,15,16, - 16,11,12,11,14,13,12,13,13,15,14,11,13,12,14,13, - 14,15,15,15,16,13,14,14,16,14, 6, 8, 7,11,10, 8, - 9, 9,11,12, 8,10, 9,12,11,10,11,11,13,14,10,12, - 11,14,13, 8, 9, 9,12,12, 9,10,10,12,13, 9,11,10, - 13,12,11,12,12,13,14,12,13,12,15,14, 8,10, 9,12, - 11, 9,11,10,13,12, 9,11,10,13,12,12,13,12,14,15, - 11,13,12,15,13,11,11,12,13,14,11,12,13,13,15,12, - 13,13,14,15,13,14,14,14,16,14,15,15,16,16,11,12, - 11,14,13,12,13,13,15,14,11,13,12,15,13,14,15,15, - 16,16,13,15,13,16,14, 9,10,11,12,14,11,11,12,13, - 15,11,12,12,13,14,13,14,15,15,17,13,14,14,15,16, - 11,11,12,13,15,12,12,13,14,16,12,13,13,14,15,14, - 14,16,15,17,15,15,15,16,17,11,12,12,14,14,12,13, - 13,15,16,12,13,13,15,15,15,15,15,16,17,14,15,15, - 16,16,14,14,15,15,17,14,15,15,15,17,15,15,16,16, - 17,16,16,17,16,18,17,17,17,18,18,14,15,14,16,16, - 15,15,16,17,17,14,15,15,17,16,17,17,17,18,18,16, - 16,16,17,17, 9,11,10,14,12,11,12,12,14,13,11,12, - 11,15,13,13,14,14,16,15,13,15,14,17,15,11,12,12, - 15,14,12,13,13,15,15,12,13,13,15,15,14,15,15,16, - 16,15,15,15,17,16,11,12,11,15,13,12,13,13,15,14, - 12,13,12,16,14,15,15,15,17,16,14,15,14,17,15,14, - 14,15,16,16,14,15,15,16,16,15,16,15,17,17,16,16, - 16,17,17,17,17,17,18,17,14,15,14,16,15,15,15,15, - 17,16,15,15,15,17,15,17,17,17,18,18,16,17,16,18, - 16, 6, 8, 8,11,11, 8, 9, 9,11,12, 8, 9, 9,12,11, - 10,11,11,13,14,10,12,11,14,13, 7, 9, 9,11,12, 9, - 10,10,12,13, 9,10,10,13,13,11,11,12,13,15,11,12, - 12,15,14, 8, 9, 9,12,11, 9,11,10,13,13, 9,11,10, - 13,12,12,13,12,14,15,11,13,12,15,13,10,11,12,13, - 14,11,12,12,13,15,12,12,13,14,15,13,13,14,14,16, - 14,15,15,16,16,11,12,11,14,13,12,13,13,15,14,11, - 13,12,15,13,14,15,15,15,16,13,14,14,16,14, 7, 9, - 9,11,12, 9,10,11,12,13, 9,10,10,13,12,11,12,12, - 14,15,11,12,12,15,14, 9, 9,11,11,13,10,10,12,12, - 14,10,11,12,13,14,12,12,13,14,16,12,13,13,15,15, - 9,11,10,13,13,10,12,12,13,14,10,12,11,14,13,12, - 13,13,15,16,12,13,13,15,14,11,11,13,13,15,12,12, - 14,13,16,13,13,13,14,15,14,14,15,14,17,15,15,15, - 16,16,12,13,12,15,14,13,14,14,15,15,12,14,13,16, - 14,15,15,16,16,17,14,15,14,17,15, 7, 9, 9,12,11, - 9,10,10,12,13, 9,11,10,13,12,11,12,12,14,14,11, - 13,12,15,14, 9,10,10,13,12,10,10,11,12,13,10,12, - 11,14,13,12,12,13,13,15,12,14,13,16,15, 9,10,10, - 13,12,11,11,12,13,13,10,12,10,14,12,13,13,13,15, - 15,12,13,12,15,13,11,12,12,14,14,12,12,13,14,15, - 13,14,13,15,15,14,13,15,13,16,15,16,15,17,16,12, - 13,12,14,14,13,14,14,15,15,12,13,12,15,14,15,15, - 16,16,17,14,15,13,16,13,10,11,12,13,14,11,12,13, - 14,15,12,13,13,15,15,14,14,15,15,17,14,15,15,16, - 16,12,12,13,12,15,12,12,14,13,16,13,13,14,14,16, - 14,14,16,15,17,15,15,16,16,17,12,13,13,15,15,13, - 14,14,16,16,13,14,13,16,15,15,16,16,17,17,14,15, - 15,17,16,14,14,15,14,17,15,15,16,15,17,15,15,16, - 15,17,16,16,17,16,18,17,17,17,17,18,14,15,15,17, - 16,15,16,16,17,17,15,16,15,17,16,17,17,17,18,18, - 16,17,16,18,17,10,12,11,14,14,12,13,13,15,15,12, - 13,12,15,14,14,15,15,16,16,14,15,15,17,16,11,13, - 12,15,14,12,13,13,15,15,13,14,13,16,14,15,15,15, - 16,16,15,16,15,17,16,12,13,13,15,15,13,14,14,16, - 16,12,14,13,16,15,15,16,16,17,17,15,16,15,17,16, - 14,15,15,16,16,14,15,15,16,16,15,16,16,17,16,16, - 16,16,16,17,17,18,17,18,17,14,15,15,17,16,15,16, - 16,17,17,15,16,15,17,16,17,17,18,18,18,16,17,16, - 18,16, 6, 8, 8,11,11, 8, 9, 9,11,12, 8, 9, 9,12, - 11,10,11,12,13,14,10,11,11,14,13, 8, 9, 9,11,12, - 9,10,11,12,13, 9,10,11,13,13,11,12,13,13,15,12, - 12,12,15,14, 7, 9, 9,12,11, 9,10,10,13,13, 9,10, - 10,13,12,11,12,12,14,15,11,12,11,15,13,11,11,12, - 13,14,11,12,13,13,15,12,13,13,14,15,13,14,14,14, - 16,14,15,15,16,16,10,12,11,14,13,12,13,12,14,14, - 11,12,12,15,13,14,15,15,16,16,13,14,13,16,14, 7, - 9, 9,11,12, 9,10,11,12,13, 9,10,10,13,12,11,12, - 13,14,15,11,12,12,14,14, 9,10,10,12,13,10,10,12, - 12,14,11,12,11,13,13,12,12,14,13,15,13,13,13,15, - 15, 9,10,10,12,13,10,11,12,13,14,10,11,10,13,12, - 13,13,14,15,16,12,13,12,15,13,12,13,13,14,14,12, - 12,13,14,15,13,14,14,15,15,14,13,15,13,16,15,16, - 15,17,16,11,12,12,14,14,13,13,14,15,15,12,13,12, - 15,14,15,15,16,16,17,14,14,13,16,13, 7, 9, 9,12, - 11, 9,10,10,12,13, 9,11,10,13,12,11,12,12,14,15, - 11,12,12,15,14, 9,10,11,13,13,10,11,12,13,14,10, - 12,12,14,13,12,13,13,14,16,12,13,13,16,15, 9,11, - 9,13,11,10,12,11,13,13,10,12,10,14,12,12,13,13, - 15,15,12,13,12,16,14,12,12,13,14,15,12,13,14,14, - 15,13,14,14,15,15,14,14,15,15,17,15,16,15,17,16, - 11,13,11,15,13,13,14,13,15,14,12,14,12,16,13,15, - 15,15,16,16,14,15,14,17,14,10,11,12,14,14,12,12, - 13,14,15,12,13,13,15,15,14,15,15,16,17,14,15,15, - 16,16,12,12,13,15,15,13,13,14,15,16,13,14,14,16, - 16,15,15,16,16,17,15,16,16,17,17,11,12,13,14,15, - 13,13,14,15,16,12,13,13,15,15,15,15,16,16,17,15, - 15,15,16,16,14,15,15,16,17,15,15,16,16,17,15,16, - 16,17,17,16,16,17,16,18,17,17,17,18,18,14,15,15, - 16,16,15,16,16,16,17,15,15,15,16,16,17,17,17,18, - 18,16,16,16,17,16,10,12,11,14,13,12,13,13,15,15, - 11,13,12,15,14,14,15,15,16,16,14,15,14,17,15,12, - 13,13,15,15,13,13,14,16,16,13,14,14,16,16,15,15, - 15,16,17,15,16,16,17,17,12,13,12,15,12,13,14,13, - 16,14,12,14,12,16,13,15,16,15,17,16,14,16,14,17, - 15,14,15,15,16,17,15,15,16,17,17,15,16,16,17,17, - 16,16,17,17,18,17,18,17,18,18,14,15,14,17,14,15, - 16,15,17,15,15,16,15,17,15,17,17,17,18,17,16,17, - 16,18,16, 9,11,11,14,14,11,12,12,14,14,11,12,12, - 15,14,13,14,14,16,16,13,15,14,16,16,10,11,12,14, - 14,11,12,13,15,15,12,13,13,15,15,13,14,15,16,17, - 14,15,15,17,16,11,12,12,15,14,12,13,13,15,15,12, - 13,13,15,15,14,15,15,16,16,14,15,15,17,16,12,13, - 14,15,16,13,14,14,15,16,13,14,15,16,16,15,15,16, - 16,18,16,16,16,18,17,14,14,14,16,15,15,15,15,17, - 16,14,15,15,17,16,16,17,17,18,17,16,16,16,18,16, - 10,12,12,14,14,11,12,13,15,15,12,13,13,15,15,13, - 14,15,16,17,14,15,15,17,16,11,12,13,14,15,12,12, - 14,15,16,13,13,14,15,16,14,14,15,16,17,15,15,16, - 17,17,12,13,13,15,15,13,14,14,16,16,13,14,13,16, - 15,15,16,15,17,17,15,16,15,17,16,13,13,15,14,17, - 14,13,16,15,17,15,14,16,15,17,15,15,17,16,18,16, - 16,17,17,18,14,15,15,17,16,15,16,16,17,17,15,16, - 15,17,16,17,17,17,18,18,16,17,16,18,17,10,12,11, - 14,14,11,12,13,15,15,12,13,12,15,15,14,15,15,16, - 16,14,15,15,17,16,11,12,12,15,15,12,13,13,15,15, - 13,14,13,16,15,14,15,15,16,16,15,16,15,17,16,11, - 13,13,15,15,13,14,14,15,15,12,14,13,16,15,15,16, - 15,17,17,15,16,15,17,16,13,15,14,16,16,14,15,14, - 16,16,15,16,15,17,16,15,16,16,16,17,16,17,16,18, - 17,14,15,15,16,16,15,16,16,17,17,15,15,15,17,16, - 17,17,17,18,18,16,16,16,18,16,12,13,13,15,16,13, - 14,14,15,16,13,14,14,16,16,15,15,16,16,18,15,16, - 16,17,17,13,13,14,15,16,14,14,15,15,17,14,15,15, - 16,17,15,15,17,16,18,16,16,17,17,17,13,14,14,16, - 16,14,15,15,17,17,14,15,14,17,16,16,17,16,17,18, - 16,17,16,18,17,15,15,16,14,17,16,15,17,14,18,16, - 16,16,15,18,16,16,18,15,19,18,18,18,17,19,15,16, - 16,18,17,16,17,17,18,17,16,17,16,18,17,18,18,18, - 19,19,17,18,16,18,17,11,12,12,15,15,13,13,14,15, - 16,13,14,13,16,15,15,16,16,16,17,15,16,16,17,16, - 12,14,13,16,15,13,13,14,15,16,14,15,14,17,15,15, - 15,16,16,17,16,17,16,18,17,12,13,14,15,16,14,15, - 15,16,16,13,14,13,16,15,16,16,16,17,17,15,16,15, - 17,15,15,16,15,17,16,15,15,15,16,16,16,17,16,18, - 16,16,15,16,15,17,17,18,17,18,17,15,15,16,17,17, - 16,16,17,17,17,15,16,15,17,16,18,18,18,18,18,16, - 17,16,18,15, 9,11,11,14,14,11,12,12,14,15,10,12, - 12,15,14,13,14,15,16,16,13,14,14,16,16,11,12,12, - 14,15,12,12,13,15,15,12,13,13,15,15,14,15,15,16, - 17,14,15,15,16,16,10,12,12,14,14,12,13,13,15,15, - 11,13,12,15,15,14,15,15,16,17,13,15,14,16,16,14, - 14,14,15,16,14,15,15,16,17,14,15,15,16,17,16,16, - 17,16,18,16,17,17,17,17,12,14,13,16,15,13,15,14, - 16,16,13,14,14,16,15,16,16,16,17,17,15,16,15,17, - 16,10,11,11,14,14,12,12,13,14,15,11,13,12,15,14, - 14,15,15,16,17,14,15,15,16,16,12,13,13,15,15,12, - 13,14,15,16,13,14,14,15,15,15,15,16,16,17,15,15, - 16,17,17,11,12,12,15,15,13,13,14,15,16,12,13,13, - 15,15,15,15,16,16,17,14,15,15,16,16,14,15,15,16, - 16,15,15,15,16,17,15,16,16,17,17,16,16,17,16,18, - 17,17,17,17,18,13,14,15,16,16,15,15,16,16,17,14, - 14,14,16,16,16,16,17,17,18,16,16,16,17,16,10,12, - 12,14,14,12,13,13,15,15,11,13,12,15,15,14,15,15, - 16,17,13,15,14,17,16,12,13,13,15,15,13,13,14,15, - 16,13,14,14,16,16,15,15,16,16,17,15,15,16,17,17, - 11,13,12,15,14,13,14,13,16,15,12,14,12,16,15,15, - 16,15,17,17,14,15,14,17,16,14,15,15,16,17,15,15, - 16,16,17,15,16,16,17,17,16,16,17,17,18,17,17,17, - 18,18,13,15,13,17,14,14,16,14,17,16,14,15,13,17, - 15,16,17,16,18,17,15,17,15,18,16,11,12,12,15,15, - 13,13,14,15,16,13,14,13,16,15,15,16,16,16,17,15, - 16,16,17,16,12,14,13,16,15,13,13,14,15,16,14,15, - 15,16,16,16,15,16,16,17,16,16,16,17,17,12,13,14, - 15,16,14,14,15,15,17,13,14,13,16,15,16,16,17,17, - 18,15,16,15,17,15,15,16,15,17,17,15,15,16,16,17, - 16,17,16,17,17,16,15,17,15,18,17,18,17,18,18,15, - 15,16,16,17,16,16,17,16,18,15,15,15,16,16,17,17, - 18,17,18,16,16,15,17,15,12,13,13,15,15,13,14,14, - 16,16,13,14,14,16,16,15,16,16,17,18,15,16,15,18, - 16,13,14,14,16,16,14,14,15,16,17,14,15,15,17,17, - 16,16,17,17,18,16,16,17,18,17,13,14,13,16,14,14, - 15,15,17,16,14,15,14,17,15,16,17,17,18,17,15,17, - 15,18,16,15,16,16,17,17,16,16,17,17,18,16,17,17, - 18,18,17,16,18,17,19,18,18,18,18,18,15,16,15,17, - 14,16,16,16,18,15,16,17,15,18,14,18,18,18,18,17, - 17,18,16,19,15, -}; - -static const static_codebook _44p5_p2_0 = { - 5, 3125, - (char *)_vq_lengthlist__44p5_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p5_p2_0, - 0 -}; - -static const long _vq_quantlist__44p5_p3_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p5_p3_0[] = { - 1, 5, 6, 5, 7, 8, 5, 8, 7, 5, 7, 8, 7, 8,10, 8, - 10,10, 5, 8, 7, 8,10,10, 7,10, 8, 6, 8, 9, 8,10, - 11, 9,10,10, 9,10,11,10,11,12,11,12,12, 9,11,10, - 11,12,12,10,12,11, 6, 9, 8, 9,10,10, 8,11,10, 9, - 10,11,10,11,12,11,12,12, 9,11,10,11,12,12,10,12, - 11, 6, 9, 9, 8,10,11, 9,11,10, 8,10,10,10,10,12, - 11,12,12, 9,11,10,11,12,12,10,12,11, 8,10,10,10, - 11,12,10,12,11,10,10,12,11,11,13,12,13,13,10,12, - 11,12,13,13,11,13,11, 7,10,10,10,11,12,10,12,11, - 10,12,11,11,11,12,12,14,13,10,12,12,12,14,14,11, - 13,11, 6, 9, 9, 9,10,11, 8,11,10, 9,10,11,10,11, - 12,11,12,12, 8,11,10,11,12,12,10,12,10, 7,10,10, - 10,11,12,10,12,11,10,12,12,11,11,13,12,13,13,10, - 11,12,12,13,14,11,12,11, 8,10,10,10,11,12,10,12, - 11,10,11,12,11,11,13,12,13,13,10,12,10,12,13,13, - 11,13,11, -}; - -static const static_codebook _44p5_p3_0 = { - 5, 243, - (char *)_vq_lengthlist__44p5_p3_0, - 1, -533200896, 1614282752, 2, 0, - (long *)_vq_quantlist__44p5_p3_0, - 0 -}; - -static const long _vq_quantlist__44p5_p3_1[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p5_p3_1[] = { - 5, 6, 6, 6, 7, 7, 6, 7, 7, 6, 7, 7, 7, 7, 8, 7, - 8, 8, 6, 7, 7, 7, 8, 8, 7, 8, 7, 7, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, 8, 8, - 8, 9, 9, 8, 9, 9, 7, 8, 7, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 9, 9, 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, 9, - 8, 6, 8, 8, 7, 8, 8, 7, 8, 8, 7, 8, 8, 8, 8, 9, - 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, 9, 8, 7, 8, 8, 8, - 9, 9, 8, 9, 9, 8, 8, 9, 9, 9, 9, 9, 9, 9, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 7, 8, 8, 8, 8, 9, 8, 9, 8, - 8, 8, 8, 8, 9, 9, 9, 9, 9, 8, 9, 8, 9, 9, 9, 8, - 9, 9, 6, 8, 8, 7, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, - 9, 8, 9, 9, 7, 8, 8, 8, 9, 9, 8, 9, 8, 7, 8, 8, - 8, 8, 9, 8, 9, 8, 8, 8, 9, 8, 9, 9, 9, 9, 9, 8, - 8, 8, 9, 9, 9, 8, 9, 9, 7, 8, 8, 8, 9, 9, 8, 9, - 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 8, 9, 9, 9, - 9, 9, 9, -}; - -static const static_codebook _44p5_p3_1 = { - 5, 243, - (char *)_vq_lengthlist__44p5_p3_1, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p5_p3_1, - 0 -}; - -static const long _vq_quantlist__44p5_p4_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p5_p4_0[] = { - 1, 5, 5, 5, 7, 9, 5, 9, 7, 5, 7, 8, 7, 7,10, 9, - 10,10, 5, 8, 7, 9,10,10, 7,10, 7, 6, 8, 9, 9,10, - 12, 9,11,11, 9,10,11,11,11,13,12,13,13, 9,11,11, - 11,12,13,11,13,11, 6, 9, 8, 9,11,11, 9,12,10, 9, - 11,11,11,11,13,11,13,12, 9,11,10,12,13,13,11,13, - 11, 6, 9, 9, 8,10,11, 9,12,11, 9,10,11,10,10,12, - 11,13,13, 9,11,11,11,13,12,11,13,11, 8,10,10, 9, - 10,12,10,12,11,10,10,12,10,10,13,12,13,13,10,12, - 11,12,13,13,10,13,10, 7,10,10,11,11,13,11,14,11, - 10,12,11,11,11,13,13,14,13,10,12,12,14,14,14,11, - 14,11, 6, 9, 9, 9,11,12, 8,11,10, 9,11,11,11,11, - 13,11,12,13, 8,11,10,11,13,13,10,12,10, 7,10,10, - 11,11,14,11,13,11,10,12,12,11,11,14,14,14,14,10, - 11,12,13,13,14,11,13,11, 8,10,10,10,11,12, 9,12, - 10,10,11,12,11,10,13,12,13,13,10,12,10,12,13,13, - 11,13,10, -}; - -static const static_codebook _44p5_p4_0 = { - 5, 243, - (char *)_vq_lengthlist__44p5_p4_0, - 1, -531365888, 1616117760, 2, 0, - (long *)_vq_quantlist__44p5_p4_0, - 0 -}; - -static const long _vq_quantlist__44p5_p4_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p5_p4_1[] = { - 5, 7, 7,10,10, 7, 8, 9,10,11, 7, 9, 8,11,10, 9, - 10,10,11,11, 9,10,10,11,11, 7, 9, 9,10,10, 8, 9, - 10,10,11, 9,10,10,11,11,10,10,11,11,11,10,11,11, - 12,12, 7, 9, 9,10,10, 9,10,10,11,11, 8,10, 9,11, - 10,10,11,11,11,11,10,11,10,11,11,10,10,10,11,11, - 10,10,11,11,11,11,11,11,11,11,11,11,12,11,12,11, - 12,11,12,12,10,10,10,11,11,10,11,11,11,11,10,11, - 10,11,11,11,12,11,12,12,11,12,11,12,11, 8, 9, 9, - 11,11, 9,10,10,11,12, 9,10,10,11,11,10,11,11,12, - 12,10,11,11,12,12, 9,10,10,11,11,10,10,11,11,12, - 10,11,11,12,12,11,11,12,12,12,11,12,12,12,12, 9, - 10,10,11,11,10,11,11,12,12,10,11,10,12,12,11,12, - 12,12,12,11,12,12,12,12,11,11,11,12,12,11,11,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,11,11,11,12,12,11,12,12,12,12,11,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12, 8, 9, 9,11,11, 9, - 10,10,11,11, 9,10,10,11,11,10,11,11,12,12,10,11, - 11,12,12, 9,10,10,11,11,10,10,11,12,12,10,11,11, - 12,12,11,12,12,12,12,11,12,12,12,12, 9,10,10,11, - 11,10,11,11,12,12,10,11,10,12,11,11,12,12,12,12, - 11,12,11,12,12,11,11,11,12,12,11,12,12,12,12,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,11,11, - 11,12,12,11,12,12,12,12,11,12,11,12,12,12,12,12, - 12,12,12,12,12,12,12,10,11,11,12,12,11,12,12,12, - 12,11,12,12,12,12,12,12,13,13,13,12,12,12,13,13, - 11,12,12,12,12,12,12,12,12,13,12,12,12,13,13,12, - 12,13,13,13,12,13,13,13,13,11,12,12,12,12,12,12, - 12,13,13,12,12,12,13,13,12,13,13,13,13,12,13,13, - 13,13,12,12,12,12,13,12,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,12,12,12,13,12, - 13,13,13,13,13,12,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,10,11,11,12,12,11,12,12,12,12,11,12, - 11,12,12,12,12,12,13,12,12,12,12,13,13,11,12,12, - 12,12,12,12,12,13,13,12,12,12,13,13,12,13,13,13, - 13,12,13,13,13,13,11,12,12,12,12,12,12,12,13,13, - 12,12,12,13,12,12,13,13,13,13,12,13,12,13,13,12, - 12,12,12,13,12,13,13,13,13,12,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,12,12,12,13,12,13,13,13, - 13,13,12,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13, 8, 9, 9,11,11, 9,10,10,11,11, 9,10,10,12,11, - 10,11,11,12,12,10,11,11,12,12, 9,10,10,11,11,10, - 10,11,11,12,10,11,11,12,12,11,11,12,12,12,11,12, - 12,12,12, 9,10,10,11,11,10,11,11,12,12,10,11,10, - 12,12,11,12,12,12,12,11,12,12,12,12,11,11,11,12, - 12,11,11,12,12,12,11,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,11,11,11,12,12,11,12,12,12,12,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12, 9,10, - 10,11,11,10,10,11,12,12,10,11,11,12,12,11,11,12, - 12,12,11,12,12,12,12,10,10,11,11,12,11,11,12,12, - 12,11,11,12,12,12,11,11,12,12,13,12,12,12,12,12, - 10,11,11,12,12,11,12,11,12,12,11,12,11,12,12,12, - 12,12,12,12,12,12,12,12,12,11,11,12,12,12,12,12, - 12,12,12,12,12,12,12,13,12,12,13,12,13,12,12,13, - 13,13,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,13,12,12,12,12,13,12, 8,10,10,11,11, - 10,11,11,12,12,10,11,10,12,12,11,12,12,12,12,11, - 12,12,12,12,10,11,10,12,12,10,10,11,12,12,11,12, - 12,12,12,12,12,12,12,13,12,12,12,13,13,10,11,11, - 12,12,11,12,12,12,12,10,12,11,12,12,12,12,12,13, - 13,12,13,12,13,12,11,12,12,12,12,11,12,12,12,13, - 12,12,12,13,13,12,12,13,12,13,12,13,13,13,13,11, - 12,12,12,12,12,12,12,13,13,12,12,12,13,12,12,13, - 13,13,13,12,13,12,13,12,11,11,11,12,12,11,12,12, - 12,13,11,12,12,12,12,12,12,12,13,13,12,12,13,13, - 13,11,12,12,12,12,12,12,12,12,13,12,12,13,13,13, - 12,12,13,13,13,13,13,13,13,13,11,12,12,12,12,12, - 13,12,13,13,12,12,12,13,13,12,13,13,13,13,12,13, - 13,13,13,12,12,12,12,13,12,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,12,12,12,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,10,11,11,12,12,11,12,12,12,13,11, - 12,12,13,12,12,13,13,13,13,12,13,13,13,13,11,12, - 12,12,12,12,12,12,13,13,12,13,12,13,13,13,13,13, - 13,13,13,13,13,13,13,11,12,12,13,12,12,13,12,13, - 13,12,13,12,13,13,13,13,13,13,13,13,13,13,13,13, - 12,13,13,13,13,12,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,12,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13, 8, 9, 9,11,11, 9,10,10,11,12, 9,10,10,11, - 11,10,11,11,12,12,10,11,11,12,12, 9,10,10,11,11, - 10,10,11,12,12,10,11,11,12,12,11,11,12,12,12,11, - 12,12,12,12, 9,10,10,11,11,10,11,11,12,12,10,11, - 10,12,12,11,12,12,12,12,11,12,11,12,12,11,11,11, - 12,12,11,11,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,11,11,11,12,12,11,12,12,12,12, - 11,12,11,12,12,12,12,12,12,12,12,12,12,12,12, 8, - 10,10,11,11,10,10,11,12,12,10,11,11,12,12,11,12, - 12,12,12,11,12,12,12,12,10,11,11,12,12,10,11,12, - 12,12,11,12,12,12,12,12,12,12,12,13,12,12,12,13, - 13,10,10,11,12,12,11,12,12,12,12,10,11,10,12,12, - 12,12,12,13,13,12,12,12,13,12,11,12,12,12,12,11, - 12,12,12,13,12,12,12,13,13,12,12,13,12,13,12,13, - 13,13,13,11,12,12,12,12,12,12,12,13,13,11,12,12, - 13,12,12,13,13,13,13,12,13,12,13,12, 9,10,10,11, - 11,10,11,11,12,12,10,11,11,12,12,11,12,12,12,12, - 11,12,11,12,12,10,11,11,12,12,11,11,12,12,12,11, - 11,12,12,12,12,12,12,12,13,12,12,12,13,12,10,11, - 10,12,11,11,12,11,12,12,11,12,11,12,12,12,12,12, - 12,12,12,12,11,12,12,11,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,13,12,13,12,13,13,13,13, - 11,12,11,12,12,12,12,12,13,12,12,12,12,12,12,12, - 13,12,13,13,12,12,12,13,12,10,11,11,12,12,11,12, - 12,12,13,11,12,12,13,12,12,12,13,13,13,12,13,13, - 13,13,11,12,12,12,13,12,12,13,13,13,12,12,13,13, - 13,13,13,13,13,13,13,13,13,13,13,11,12,12,12,12, - 12,12,13,13,13,12,13,12,13,13,13,13,13,13,13,13, - 13,13,13,13,12,13,13,13,13,12,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,12,12,13, - 13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,11,11,11,12,12,11,12,12,12,12, - 11,12,12,12,12,12,12,13,13,13,12,13,12,13,13,11, - 12,12,12,12,12,12,13,13,13,12,12,13,13,13,12,13, - 13,13,13,12,13,13,13,13,11,12,12,12,12,12,13,12, - 13,13,12,12,12,13,12,13,13,13,13,13,12,13,12,13, - 13,12,12,12,13,13,12,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,12,12,12,13,12,13, - 13,13,13,13,12,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,10,11,11,12,12,11,12,12,12,12,11,12,12, - 12,12,12,12,12,13,13,12,12,12,13,13,11,12,12,12, - 12,11,12,12,13,13,12,12,12,13,13,12,12,13,13,13, - 12,13,13,13,13,11,12,12,12,12,12,12,12,13,13,12, - 12,12,13,12,12,13,13,13,13,12,13,12,13,13,12,12, - 12,12,12,12,12,13,13,13,12,13,13,13,13,12,13,13, - 13,13,13,13,13,13,13,12,12,12,13,12,12,13,13,13, - 13,12,13,12,13,13,13,13,13,13,13,13,13,13,13,13, - 10,11,11,12,12,11,12,12,12,13,11,12,12,13,12,12, - 12,12,13,13,12,12,12,13,13,11,12,12,12,12,12,12, - 13,13,13,12,12,12,13,13,12,12,13,13,13,12,13,13, - 13,13,11,12,12,12,12,12,12,12,13,13,12,12,12,13, - 13,12,13,13,13,13,12,13,13,13,13,12,12,12,12,13, - 12,12,13,13,13,12,13,13,13,13,12,13,13,13,13,13, - 13,13,13,13,12,12,12,13,13,13,13,13,13,13,12,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,10,11,11, - 12,12,11,12,12,12,13,11,12,12,13,12,12,13,13,13, - 13,12,13,12,13,13,11,12,12,13,13,12,12,12,13,13, - 12,12,13,13,13,12,13,13,13,13,13,13,13,13,13,11, - 12,12,13,12,12,13,12,13,13,12,13,12,13,13,13,13, - 13,13,13,12,13,13,13,13,12,12,12,13,13,12,13,13, - 13,13,12,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,12,12,12,13,13,12,13,13,13,13,12,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,11,11,11,12,12,11, - 12,12,12,12,11,12,12,12,12,12,12,12,13,13,12,12, - 12,13,13,11,12,12,12,12,12,12,12,12,13,12,12,12, - 13,13,12,12,13,13,13,12,13,13,13,13,11,12,12,12, - 12,12,12,12,13,13,12,12,12,13,12,12,13,13,13,13, - 12,13,12,13,13,12,12,12,12,12,12,12,13,12,13,12, - 13,13,13,13,12,13,13,12,13,13,13,13,13,13,12,12, - 12,12,12,12,13,13,13,13,12,13,12,13,13,13,13,13, - 13,13,12,13,13,13,12,10,11,11,12,12,11,12,12,12, - 12,11,12,12,12,12,12,12,12,13,13,12,13,12,13,13, - 11,12,12,12,12,12,12,12,13,13,12,12,12,13,13,12, - 12,13,13,13,13,13,13,13,13,11,12,12,12,12,12,13, - 12,13,13,12,13,12,13,13,12,13,13,13,13,12,13,12, - 13,13,12,12,12,12,12,12,13,13,13,13,12,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,12,12,12,13,12, - 12,13,13,13,13,12,13,12,13,13,13,13,13,13,13,13, - 13,13,13,13,10,11,11,12,12,11,12,12,12,12,11,12, - 12,12,12,12,12,12,13,13,12,12,12,13,13,11,12,12, - 12,12,12,12,12,13,13,12,12,12,13,13,12,12,13,13, - 13,12,12,13,13,13,11,12,11,12,12,12,12,12,13,13, - 11,12,12,13,13,12,13,13,13,13,12,13,12,13,13,12, - 12,12,12,12,12,13,13,13,13,12,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,12,12,12,13,12,12,13,13, - 13,13,12,13,12,13,13,13,13,13,13,13,12,13,13,13, - 13,10,11,11,12,12,11,12,12,12,13,11,12,12,13,12, - 12,12,13,13,13,12,13,13,13,13,11,12,12,13,13,12, - 12,13,13,13,12,12,13,13,13,12,13,13,13,13,13,13, - 13,13,13,11,12,12,13,12,12,13,12,13,13,12,12,12, - 13,13,12,13,13,13,13,13,13,13,13,13,12,12,13,13, - 13,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,12,12,12,13,13,13,13,13,13,13,12, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,10,12, - 11,12,12,11,12,12,12,13,11,12,12,12,12,12,12,12, - 13,13,12,12,12,13,13,11,12,12,12,13,12,12,12,13, - 13,12,12,12,13,13,12,13,13,13,13,12,13,13,13,13, - 11,12,12,13,12,12,12,12,13,13,12,12,12,13,13,12, - 13,13,13,13,12,13,12,13,13,12,13,12,13,13,12,13, - 13,13,13,12,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,12,12,12,13,12,13,13,13,13,13,12,13,12,13, - 13,13,13,13,13,13,12,13,13,13,13,10,11,11,12,12, - 11,12,12,12,13,11,12,12,12,12,12,12,12,13,13,12, - 12,12,13,13,11,12,12,12,12,12,12,13,13,13,12,13, - 13,13,13,12,12,13,13,13,13,13,13,13,13,11,12,12, - 12,12,12,13,12,13,13,12,12,12,13,13,12,13,13,13, - 13,12,13,12,13,13,12,12,12,12,13,12,13,13,13,13, - 12,13,13,13,13,12,13,13,13,13,13,13,13,13,13,12, - 12,12,12,12,12,13,13,13,13,12,13,13,13,13,13,13, - 13,13,13,12,13,13,13,13,11,12,11,12,12,11,12,12, - 12,12,11,12,12,12,12,12,12,12,12,13,12,12,12,13, - 12,11,12,12,12,12,12,12,12,12,13,12,12,12,13,13, - 12,12,13,13,13,12,13,13,13,13,11,12,12,12,12,12, - 12,12,13,13,12,12,12,13,12,12,13,13,13,13,12,13, - 12,13,13,12,12,12,12,12,12,12,13,13,13,12,13,13, - 13,13,13,13,13,12,13,13,13,13,13,13,12,12,12,12, - 12,12,13,13,13,13,12,13,12,13,12,13,13,13,13,13, - 13,13,13,13,12, -}; - -static const static_codebook _44p5_p4_1 = { - 5, 3125, - (char *)_vq_lengthlist__44p5_p4_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p5_p4_1, - 0 -}; - -static const long _vq_quantlist__44p5_p5_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p5_p5_0[] = { - 1, 6, 6,10,10, 6, 7, 9,11,13, 5, 9, 7,13,11, 8, - 11,12,13,15, 8,12,11,15,13, 6, 7, 8,11,11, 7, 8, - 10,11,13, 9,10,10,13,13,11,11,13,12,16,12,13,13, - 16,15, 6, 8, 7,11,11, 9,10,10,13,13, 7,10, 7,13, - 11,12,13,13,15,16,11,13,11,16,12,10,11,11,11,13, - 11,11,13,12,15,13,13,13,14,15,13,12,15,12,17,15, - 16,16,16,16,10,11,11,14,11,13,13,13,15,14,11,13, - 11,15,12,15,15,16,16,16,13,15,12,17,12, 6, 8, 9, - 12,12, 9,10,12,13,15, 9,11,11,15,14,12,13,15,16, - 18,13,14,14,17,16, 9,10,11,13,14,11,10,13,14,16, - 11,12,12,15,15,14,13,16,15,18,14,15,15,17,17, 9, - 11,11,14,14,11,12,13,15,16,11,13,11,15,14,15,15, - 15,17,18,14,15,14,17,15,13,14,14,15,16,14,14,15, - 15,17,15,16,15,17,17,16,16,17,15,19,17,18,18,19, - 18,13,14,14,16,15,15,15,16,17,17,14,15,14,18,15, - 17,17,17,19,19,16,17,15,19,16, 6, 9, 8,13,12, 9, - 11,11,14,15, 9,12,10,15,13,13,14,14,16,17,12,15, - 13,18,16, 9,11,11,14,14,11,11,13,14,15,11,13,12, - 16,15,14,14,15,15,18,14,15,15,18,17, 9,11,10,14, - 13,11,12,12,15,15,11,13,10,16,14,14,15,15,16,18, - 14,16,13,18,15,13,14,14,16,16,14,14,15,15,17,15, - 16,15,17,17,16,16,17,16,19,17,18,17,18,19,13,14, - 14,16,15,15,15,15,17,17,14,15,14,17,15,17,17,17, - 18,19,16,17,15,19,15,11,13,13,15,16,13,14,15,16, - 18,14,15,15,17,17,16,16,18,18,20,17,18,17,19,20, - 13,14,14,16,17,15,15,16,17,18,15,16,16,17,17,18, - 17,19,18,19,18,18,18,19,21,14,14,15,16,17,15,15, - 16,18,18,15,16,16,17,18,18,18,19,19,21,18,19,19, - 22,20,16,16,17,17,19,17,17,17,18,20,17,18,18,20, - 19,19,19,20,19, 0,19,19,20,20,21,17,17,17,19,18, - 18,18,20,19,19,18,18,18,20,20,19,19,20,20,20,20, - 21,20,21,19,11,13,13,16,15,14,15,15,17,17,14,15, - 14,18,16,16,18,18,20,19,16,19,17,21,18,13,14,15, - 16,17,15,15,16,18,18,15,16,15,19,18,18,18,18,19, - 19,18,18,18,22,20,13,14,14,16,16,15,16,16,18,17, - 15,16,15,18,17,18,18,18,19,19,17,18,17,21,18,16, - 17,17,18,18,17,18,19,19,19,18,20,18,19,19,19,20, - 21,19,21,20,20,20, 0,21,16,17,17,19,19,18,18,18, - 19,21,17,18,18,19,18,20,19,21,20,21,19,20,20,22, - 19, 7, 9, 9,13,13, 8,10,11,14,15, 9,12,11,15,14, - 11,13,14,16,17,13,15,14,17,16, 8,10,11,14,14,10, - 10,12,14,16,11,12,12,16,15,13,12,15,15,18,14,15, - 15,19,17, 9,11,11,14,14,11,12,12,15,15,11,13,11, - 16,14,14,15,14,17,17,14,16,14,18,15,12,13,14,15, - 16,13,13,15,14,17,15,15,15,17,17,15,14,17,14,19, - 17,18,18,19,18,13,14,14,16,16,15,15,15,17,17,14, - 15,14,18,15,17,18,17,18,17,16,18,16,19,15, 7,10, - 10,13,13, 9,10,12,14,15,10,12,11,15,14,12,13,14, - 16,17,13,15,14,18,16,10,10,12,13,14,10,10,13,13, - 16,12,12,13,15,15,13,12,15,15,18,15,15,16,18,17, - 10,11,11,14,14,12,13,13,15,16,10,13,10,16,14,14, - 15,15,17,17,14,15,13,17,15,13,13,14,15,16,14,13, - 15,14,18,15,15,16,16,17,16,15,18,15,18,17,18,18, - 18,18,13,15,14,17,16,15,16,16,17,17,14,15,13,17, - 15,17,17,18,18,18,16,17,14,20,14, 8,10,10,14,14, - 11,11,13,14,16,11,13,11,16,14,14,15,16,16,18,14, - 16,15,18,16,10,12,11,15,14,11,11,13,14,16,13,14, - 13,16,15,15,14,16,15,19,16,17,16,20,18,10,11,12, - 14,15,13,13,14,16,16,11,14,11,16,14,16,16,17,18, - 19,15,17,14,20,15,14,15,14,17,16,13,14,15,15,18, - 16,17,16,19,18,16,15,18,15,19,18,19,18,21,21,14, - 14,15,16,17,16,16,17,18,18,13,15,14,17,15,18,18, - 19,18,22,16,18,15,21,15,12,13,14,16,16,14,14,16, - 16,18,14,15,15,17,18,16,16,18,18,20,18,18,17,20, - 20,13,14,15,15,17,15,14,16,16,18,16,16,16,17,19, - 17,15,18,17,21,18,18,18,19,19,14,15,15,18,17,15, - 16,16,18,19,15,16,15,18,18,17,18,18,20,21,17,19, - 17,20,19,16,16,17,16,19,17,17,18,17,20,18,18,18, - 18,19,19,18,20,17,22,20,20,19,20,20,17,17,18,18, - 19,18,18,20,21,20,17,18,17,20,20,21,21,21,21,21, - 19,21,18,22,20,11,13,13,17,16,14,14,16,16,18,14, - 16,14,18,16,17,18,19,19,20,18,19,18,21,19,14,15, - 14,17,16,14,14,16,18,18,16,17,16,18,17,18,17,19, - 18,20,19,19,18,20,20,13,14,15,16,17,16,16,17,18, - 19,14,16,14,19,17,18,19,18,20,20,18,20,17,21,18, - 17,17,17,19,18,16,17,18,18,19,18,19,18,21,21,18, - 18,20,17,21,19,20,20,22,21,16,17,18,18,19,18,18, - 19,21,20,16,17,17,20,18,21,21,22,21,22,18,21,18, - 0,18, 7, 9, 9,13,13, 9,11,12,14,15, 8,11,10,15, - 14,13,14,15,16,18,11,14,13,17,15, 9,11,11,14,14, - 11,11,13,14,16,11,12,12,15,15,14,14,16,15,18,14, - 14,15,17,17, 8,11,10,14,14,11,12,12,15,15,10,12, - 10,16,14,14,15,15,17,18,13,15,12,18,15,13,14,14, - 16,16,14,14,15,15,17,15,15,15,16,17,16,15,17,15, - 19,17,17,17,18,18,12,14,13,16,15,15,15,15,17,17, - 13,15,13,17,14,17,18,18,18,19,15,17,14,19,14, 8, - 10,10,14,14,11,11,13,14,16,11,13,11,16,14,14,15, - 16,17,19,14,16,15,18,17,10,12,11,15,14,11,11,14, - 14,17,13,14,13,17,15,15,14,17,15,19,16,17,16,19, - 17,10,11,12,14,15,13,13,14,15,17,11,13,11,17,14, - 16,16,17,18,19,15,16,14,18,15,14,15,14,16,16,13, - 14,15,15,18,16,16,16,18,18,16,15,18,15,20,18,19, - 18,21,18,14,14,15,16,17,16,16,17,17,18,13,15,14, - 17,16,19,19,19,19,19,15,18,15,20,15, 7,10,10,13, - 13,10,11,12,14,15, 9,12,10,15,14,13,14,15,16,17, - 12,15,13,17,16,10,11,11,14,14,10,10,13,14,16,12, - 13,13,16,15,14,13,16,15,18,15,15,16,17,17,10,12, - 10,14,13,12,13,12,15,15,10,13,10,16,13,15,16,15, - 17,18,13,16,12,18,15,13,14,14,16,17,14,13,15,15, - 18,15,16,15,17,17,16,14,17,15,19,17,18,18,19,19, - 13,15,13,17,14,15,15,15,18,17,14,15,13,17,14,18, - 17,18,18,19,15,17,15,19,15,11,13,13,16,17,14,14, - 16,16,18,14,16,15,18,17,17,18,19,18,21,18,18,17, - 20,18,13,15,14,17,16,14,14,16,17,18,16,17,16,19, - 17,18,17,19,18,22,18,19,19,21,21,13,14,15,16,18, - 16,16,17,17,20,14,16,14,18,17,18,18,19,19,21,17, - 18,17,21,18,17,18,17,19,18,16,17,17,18,19,18,18, - 18,22,22,18,17,19,17, 0,20,21,19,21,20,17,17,18, - 18,21,18,18,18,19,21,17,17,17,19,19,20,20,22,21, - 21,19,20,18,20,17,12,14,13,17,16,14,15,15,17,18, - 14,16,14,18,16,17,18,18,21,20,16,18,16,21,18,14, - 15,15,17,17,15,15,16,18,18,15,17,16,18,18,17,17, - 19,19,20,18,19,18,20,19,14,15,14,17,15,15,16,16, - 18,17,15,16,14,19,15,18,18,18,19,20,17,20,15,21, - 17,16,17,18,18,19,17,17,18,18,20,18,19,18,19,21, - 19,18,19,19,21,20, 0,19,21,20,16,17,16,19,16,18, - 18,18,19,19,17,18,17,20,17,19,20,20,22, 0,19,20, - 17,21,17,11,13,14,16,17,14,15,15,17,18,14,15,15, - 18,18,16,17,17,19,20,16,18,17,19,21,13,14,15,17, - 17,14,15,16,17,19,15,16,16,18,19,16,17,18,19,21, - 17,18,20,21,21,13,15,15,17,17,15,16,16,18,19,15, - 16,16,18,19,17,17,18,19,22,17,19,18,22,19,15,16, - 17,19,19,16,17,18,18,20,17,18,18,19,20,19,18,20, - 18,22,20,19,19,22,21,16,17,17,18,19,18,18,18,19, - 20,17,18,18,20,19,20,19,20,22,20,19,20,21,21,20, - 12,14,14,16,16,13,14,16,17,18,14,16,15,18,18,15, - 17,17,19,19,17,18,18,19,19,13,14,15,16,17,14,14, - 16,16,20,15,16,16,17,19,16,15,18,17,20,18,17,19, - 19,19,14,15,15,17,17,16,16,16,18,18,15,16,15,19, - 18,17,18,18,20,21,17,18,17,21,18,16,15,17,17,19, - 17,15,18,17,20,19,17,18,19,20,18,16,19,17,22,20, - 19,20,19,20,17,17,18,19,19,18,18,19,20,20,17,18, - 17,18,18,21,21,20,20,21,18,20,17,21,19,11,14,14, - 16,17,15,14,16,17,19,14,16,14,18,17,18,18,19,19, - 21,17,19,18,20,20,13,15,14,17,17,14,14,16,17,18, - 16,17,16,19,18,18,17,19,18,20,18,21,18,20,20,13, - 15,15,16,17,16,16,17,18,19,14,16,15,19,18,19,19, - 19,21,20,18,19,17,20,18,16,17,16,19,18,16,17,17, - 19,20,17,19,18,20,19,18,17,21,18, 0,21,20,20, 0, - 20,17,17,18,18,19,18,19,19,20,22,16,17,17,20,18, - 21,22,20,20,22,18,22,18,22,18,12,14,14,17,17,14, - 15,16,17,19,14,16,15,17,17,17,17,18,18,21,17,19, - 17,20,19,14,15,15,16,18,15,14,16,16,19,16,17,16, - 19,18,17,16,20,17,20,18,20,19,19,20,14,15,15,18, - 17,16,16,17,18,19,14,16,15,19,17,18,21,18,19,21, - 17,18,17,19,18,17,17,18,17,20,17,16,18,17,21,18, - 19,19,19,19,18,17,19,17,20,20,21,20,21,20,17,17, - 17,19,19,19,18,18,20,21,16,18,16,19,18,20,20,21, - 21,20,18,19,16, 0,17,12,14,14,17,17,15,15,18,17, - 19,15,18,15,20,16,20,19,21,18,22,20,20,20,22,19, - 14,16,14,20,17,14,15,17,17,20,18,18,17,20,18,18, - 17,19,17,21,20,21,20, 0,21,14,15,16,17,19,18,17, - 19,18,21,14,18,15,21,17,21,20,21,20, 0,18,21,17, - 21,17,18,19,17,20,18,16,17,17,19,19,19,21,20, 0, - 20,18,17,21,17, 0,22, 0,21, 0,22,17,17,19,18,20, - 20,20,21,19,22,16,17,18,20,18,22,22, 0,22, 0,17, - 21,17,22,17,11,14,13,16,16,14,15,15,17,18,14,15, - 14,18,17,17,18,18,19,20,16,17,17,21,19,13,14,15, - 17,17,15,16,16,18,18,15,16,16,19,18,18,18,18,19, - 20,17,18,18,20,19,13,15,14,17,17,15,16,16,17,18, - 14,16,15,19,17,17,18,19,21,21,17,18,17,20,18,16, - 17,17,19,19,17,18,19,19,20,18,19,18,21,21,21,20, - 19,21,22,20,20,19,21,20,15,17,16,19,19,17,18,18, - 20,21,16,18,17,20,18,19,19,21,21,21,19,19,19,20, - 18,11,14,13,17,16,14,14,16,16,19,14,16,15,19,16, - 18,18,18,19,22,17,18,17,20,19,13,15,14,17,17,15, - 15,16,17,19,16,17,16,20,18,18,17,19,18,21,19,19, - 18,22, 0,13,14,15,17,18,16,16,17,17,19,14,16,15, - 19,18,18,19,19,20,21,18,18,17,20,18,17,18,17,20, - 18,16,17,17,18,20,18,19,18,20,20,18,18,21,17,21, - 20,21,21, 0,19,16,16,18,18,19,19,18,20,19,20,16, - 17,17,20,18,21,20,21,22,22,18,20,17,21,17,12,14, - 14,17,16,14,15,16,18,18,13,15,14,18,17,17,18,18, - 19,19,15,17,16,19,19,14,15,15,17,17,15,15,16,18, - 19,15,16,16,19,18,17,17,18,18,20,18,18,18,21,20, - 13,15,14,17,16,15,16,15,18,18,14,16,14,18,17,18, - 18,18,19,21,16,18,16,20,17,17,18,17,18,19,17,17, - 18,18,19,18,19,19,21,19,19,18,20,18,21,21,20,20, - 21,20,16,17,15,20,17,17,19,17,19,19,17,18,15,20, - 17,19,20,19,21,22,17,20,16, 0,17,12,14,14,17,18, - 16,15,18,16,20,16,18,15,21,17,20,18,21,19,22,19, - 21,19, 0,19,14,16,15,19,17,14,15,17,16,21,18,19, - 18,21,17,19,17,21,17,22,20,21,21, 0,21,14,15,16, - 17,19,18,17,19,18,21,14,17,15,20,17,21,22,21,20, - 22,18,21,17,21,17,17,19,17,21,18,16,17,17,19,20, - 19,21,20,21,20,17,18,20,17,21, 0,22,20,21,22,17, - 17,20,18,21,21,20,22,20,21,16,17,17,21,19, 0,22, - 0,21,21,18,22,17,21,17,12,14,14,17,16,14,15,16, - 17,18,14,16,15,18,17,17,17,20,19,20,16,18,17,21, - 18,14,15,15,17,17,14,15,16,17,19,16,17,16,18,18, - 17,16,19,18,19,18,19,18,21,20,14,15,15,18,17,16, - 16,16,19,18,15,16,14,20,16,18,18,19,19,20,16,19, - 16,21,17,17,17,18,19,19,16,16,18,18,19,19,19,18, - 20,20,18,16,19,18,20,22,21,20,19,20,16,18,17,20, - 16,18,19,18,19,18,16,18,16,20,17,21,20,21,20,20, - 18,19,17,21,16, -}; - -static const static_codebook _44p5_p5_0 = { - 5, 3125, - (char *)_vq_lengthlist__44p5_p5_0, - 1, -528744448, 1616642048, 3, 0, - (long *)_vq_quantlist__44p5_p5_0, - 0 -}; - -static const long _vq_quantlist__44p5_p5_1[] = { - 3, - 2, - 4, - 1, - 5, - 0, - 6, -}; - -static const char _vq_lengthlist__44p5_p5_1[] = { - 2, 3, 3, 3, 3, 3, 3, -}; - -static const static_codebook _44p5_p5_1 = { - 1, 7, - (char *)_vq_lengthlist__44p5_p5_1, - 1, -533200896, 1611661312, 3, 0, - (long *)_vq_quantlist__44p5_p5_1, - 0 -}; - -static const long _vq_quantlist__44p5_p6_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p5_p6_0[] = { - 1, 5, 5, 5, 7, 9, 5, 9, 7, 5, 7, 8, 7, 7,10, 9, - 9,10, 5, 8, 7, 9,10, 9, 7,10, 7, 6, 9, 9, 9,10, - 12,10,12,11, 9,10,11,11,10,13,12,12,13,10,11,11, - 12,13,13,11,13,11, 6, 9, 9,10,11,12, 9,12,11,10, - 11,11,11,11,13,12,13,13, 9,11,10,12,13,13,11,13, - 10, 6, 9,10, 9,11,12,10,12,11, 9,10,11,10,10,13, - 11,13,13,10,11,11,12,13,12,11,13,11, 7, 9,10, 9, - 10,12,10,11,11,10,10,11,10,10,12,12,11,12,10,11, - 10,12,12,12,10,12,10, 7,10,10,11,11,13,11,13,11, - 10,12,11,11,10,13,13,14,13,10,11,12,13,13,14,11, - 13,10, 6,10, 9,10,11,12, 9,12,11, 9,11,11,11,11, - 13,12,12,13, 9,11,10,12,13,13,10,13,10, 7,10,10, - 11,11,14,11,13,11,10,12,11,11,10,14,13,14,13,10, - 11,12,13,13,14,11,13,10, 7,10, 9,10,10,12, 9,12, - 10,10,11,11,10,10,12,12,12,12, 9,11,10,11,12,12, - 10,12, 9, -}; - -static const static_codebook _44p5_p6_0 = { - 5, 243, - (char *)_vq_lengthlist__44p5_p6_0, - 1, -527106048, 1620377600, 2, 0, - (long *)_vq_quantlist__44p5_p6_0, - 0 -}; - -static const long _vq_quantlist__44p5_p6_1[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p5_p6_1[] = { - 2, 6, 6, 5, 7, 8, 5, 8, 7, 6, 7, 7, 7, 7, 8, 8, - 8, 8, 6, 7, 7, 7, 8, 8, 7, 8, 7, 6, 8, 8, 8, 9, - 10, 8, 9, 9, 8, 9, 9, 9, 9,10,10,10,10, 8, 9, 9, - 10,10,10, 9,10,10, 6, 8, 8, 8, 9, 9, 8,10, 9, 9, - 9, 9, 9, 9,10,10,10,10, 8, 9, 9,10,10,10, 9,10, - 9, 6, 8, 9, 8, 9, 9, 8, 9, 9, 8, 9, 9, 9, 9,10, - 9,10,10, 8, 9, 9, 9,10,10, 9,10, 9, 7, 8, 9, 8, - 9, 9, 9, 9, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 7, 9, 9, 9,10,10, 9,10,10, - 9,10, 9, 9, 9,10,10,10,10, 9,10, 9,10,10,10, 9, - 10, 9, 6, 8, 8, 8, 9, 9, 8, 9, 9, 8, 9, 9, 9, 9, - 10, 9,10,10, 8, 9, 9, 9,10,10, 9,10, 9, 7, 9, 9, - 9,10,10, 9,10, 9, 9, 9,10,10, 9,10,10,10,10, 9, - 9, 9,10,10,10, 9,10, 9, 7, 9, 8, 8, 9, 9, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 8, 9, 9, 9, - 9, 9, 9, -}; - -static const static_codebook _44p5_p6_1 = { - 5, 243, - (char *)_vq_lengthlist__44p5_p6_1, - 1, -530841600, 1616642048, 2, 0, - (long *)_vq_quantlist__44p5_p6_1, - 0 -}; - -static const long _vq_quantlist__44p5_p7_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p5_p7_0[] = { - 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, -}; - -static const static_codebook _44p5_p7_0 = { - 5, 243, - (char *)_vq_lengthlist__44p5_p7_0, - 1, -513979392, 1633504256, 2, 0, - (long *)_vq_quantlist__44p5_p7_0, - 0 -}; - -static const long _vq_quantlist__44p5_p7_1[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p5_p7_1[] = { - 1, 7, 7, 6, 9, 9, 7, 9, 9, 6, 9, 9, 9, 9, 9, 9, - 9, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10, -}; - -static const static_codebook _44p5_p7_1 = { - 5, 243, - (char *)_vq_lengthlist__44p5_p7_1, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44p5_p7_1, - 0 -}; - -static const long _vq_quantlist__44p5_p7_2[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const char _vq_lengthlist__44p5_p7_2[] = { - 1, 2, 3, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,10,10,11, - 11,12,12,13,13,14,14,14,14, -}; - -static const static_codebook _44p5_p7_2 = { - 1, 25, - (char *)_vq_lengthlist__44p5_p7_2, - 1, -518864896, 1620639744, 5, 0, - (long *)_vq_quantlist__44p5_p7_2, - 0 -}; - -static const long _vq_quantlist__44p5_p7_3[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const char _vq_lengthlist__44p5_p7_3[] = { - 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44p5_p7_3 = { - 1, 25, - (char *)_vq_lengthlist__44p5_p7_3, - 1, -529006592, 1611661312, 5, 0, - (long *)_vq_quantlist__44p5_p7_3, - 0 -}; - -static const char _huff_lengthlist__44p5_short[] = { - 4, 7,12,14,15,18,20,20, 5, 3, 4, 6, 9,11,15,19, - 9, 4, 3, 4, 7, 9,13,18,11, 6, 3, 3, 5, 8,13,19, - 14, 9, 6, 5, 7,10,16,20,16,11, 9, 8,10,10,14,16, - 21,14,13,11, 8, 7,11,14,21,14,13, 9, 6, 5,10,12, -}; - -static const static_codebook _huff_book__44p5_short = { - 2, 64, - (char *)_huff_lengthlist__44p5_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p6_l0_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44p6_l0_0[] = { - 1, 4, 4, 7, 7,10,10,12,12,12,12,13,12, 5, 5, 5, - 8, 6,11, 9,12,12,13,12,12,12, 4, 5, 5, 6, 8, 9, - 11,12,12,13,12,12,12, 7, 7, 8, 9, 9,11, 8,12, 9, - 12,12,12,12, 7, 8, 8, 9, 9, 8,11, 9,12,12,12,11, - 12,10,10,10,11,11,11,11,11,10,11,11,12,11,10,10, - 10,11,11,11,11,10,11,11,11,11,12,11,11,11,12,11, - 12,11,12,11,13,11,13,11,11,11,11,11,12,11,12,10, - 13,11,12,11,13,12,12,12,13,12,13,13,13,12,14,12, - 14,13,12,12,12,12,13,13,13,12,14,12,14,13,14,13, - 14,14,14,14,14,14,14,14,15,14,15,14,13,14,13,14, - 14,14,14,14,15,14,14,14,15, -}; - -static const static_codebook _44p6_l0_0 = { - 2, 169, - (char *)_vq_lengthlist__44p6_l0_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44p6_l0_0, - 0 -}; - -static const long _vq_quantlist__44p6_l0_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p6_l0_1[] = { - 4, 4, 4, 5, 5, 4, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, - 5, 5, 4, 5, 5, 5, 5, 5, 4, -}; - -static const static_codebook _44p6_l0_1 = { - 2, 25, - (char *)_vq_lengthlist__44p6_l0_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p6_l0_1, - 0 -}; - -static const long _vq_quantlist__44p6_l1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p6_l1_0[] = { - 1, 3, 2, 5, 5, 6, 6, 6, 6, -}; - -static const static_codebook _44p6_l1_0 = { - 2, 9, - (char *)_vq_lengthlist__44p6_l1_0, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44p6_l1_0, - 0 -}; - -static const char _huff_lengthlist__44p6_lfe[] = { - 2, 3, 1, 3, -}; - -static const static_codebook _huff_book__44p6_lfe = { - 2, 4, - (char *)_huff_lengthlist__44p6_lfe, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44p6_long[] = { - 2, 7,13,15,16,17,19,20, 6, 3, 4, 7, 9,10,12,15, - 13, 4, 3, 4, 7, 8,11,13,14, 7, 4, 4, 6, 7,10,11, - 16, 9, 7, 6, 7, 8, 9,10,16, 9, 8, 7, 7, 6, 8, 8, - 18,12,10,10, 9, 8, 8, 9,20,14,13,12,11, 8, 9, 9, -}; - -static const static_codebook _huff_book__44p6_long = { - 2, 64, - (char *)_huff_lengthlist__44p6_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p6_p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p6_p1_0[] = { - 2, 5, 5, 5, 7, 7, 5, 7, 7, 5, 7, 7, 7, 8, 9, 7, - 9, 9, 5, 7, 7, 7, 9, 9, 7, 9, 8, 5, 7, 8, 8, 9, - 10, 8, 9, 9, 8, 9,10, 9,10,12,10,11,11, 8, 9,10, - 10,11,11, 9,11,11, 5, 8, 7, 8, 9, 9, 8,10, 9, 8, - 10, 9, 9,11,11,10,11,11, 8,10, 9,10,11,11, 9,12, - 10, 5, 8, 8, 7, 9,10, 8,10, 9, 7, 9, 9, 9,10,11, - 9,11,11, 8,10,10,10,11,11,10,12,11, 7, 9, 9, 9, - 10,11, 9,11,11, 9, 9,11,10,10,13,11,11,12, 9,11, - 11,11,12,13,11,13,12, 7, 9, 9, 9,11,11, 9,12,10, - 9,11,10,10,11,12,11,13,12, 9,11,11,11,13,13,11, - 13,11, 5, 8, 8, 8, 9,10, 7,10, 9, 8,10,10,10,11, - 11,10,11,11, 7, 9, 9, 9,11,11, 9,11,10, 7, 9, 9, - 9,10,12, 9,11,11, 9,11,11,11,11,13,11,13,13, 9, - 10,11,11,12,13,10,12,11, 7, 9, 9, 9,11,11, 9,11, - 10, 9,11,11,11,12,13,11,13,12, 9,11, 9,11,12,11, - 10,13,10, -}; - -static const static_codebook _44p6_p1_0 = { - 5, 243, - (char *)_vq_lengthlist__44p6_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p6_p1_0, - 0 -}; - -static const long _vq_quantlist__44p6_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p6_p2_0[] = { - 4, 6, 6, 9, 9, 6, 7, 8,10,10, 6, 8, 7,10,10, 8, - 10,10,12,13, 8,10,10,13,12, 6, 8, 8,10,10, 7, 8, - 9,10,11, 8, 9, 9,11,11,10,10,11,12,13,10,11,11, - 14,13, 6, 8, 8,10,10, 8, 9, 9,11,11, 7, 9, 8,11, - 10,10,11,11,13,14,10,11,10,13,12, 9,10,10,12,12, - 10,10,11,12,13,10,11,11,13,13,12,12,13,12,15,13, - 14,13,15,14, 9,10,10,13,12,10,11,11,13,13,10,11, - 10,13,12,13,13,14,14,15,12,13,12,15,12, 6, 8, 8, - 10,11, 8, 9,10,11,12, 8, 9, 9,11,11,10,11,12,13, - 14,10,11,11,14,13, 8, 9, 9,11,12, 9,10,11,12,13, - 9,10,11,12,13,11,11,13,13,15,11,12,12,14,14, 8, - 9, 9,12,12, 9,10,11,12,13, 9,10,10,13,12,11,12, - 13,14,15,11,12,12,14,14,11,11,12,13,14,11,12,13, - 13,15,12,13,13,14,15,13,13,14,14,16,14,15,15,16, - 16,11,12,11,14,13,12,13,13,14,14,11,13,12,14,13, - 14,15,15,16,16,13,14,14,16,14, 6, 8, 8,11,10, 8, - 9, 9,12,11, 8,10, 9,12,11,10,11,11,13,13,10,12, - 11,14,13, 8, 9, 9,12,12, 9,10,10,12,13, 9,11,10, - 13,12,11,12,12,14,14,11,13,12,15,14, 8, 9, 9,12, - 11, 9,10,10,13,12, 9,11,10,13,12,12,12,12,14,14, - 11,13,12,15,13,11,11,12,13,14,11,12,13,13,14,12, - 13,13,14,15,13,13,14,14,16,14,15,15,16,16,11,12, - 11,14,13,12,13,13,15,14,11,13,12,15,13,14,15,15, - 16,16,13,15,13,16,14, 9,10,11,12,13,11,11,12,13, - 14,11,12,12,13,14,13,13,14,14,16,13,14,14,15,16, - 11,11,12,13,14,12,12,13,14,15,12,13,13,14,15,14, - 14,15,15,17,14,15,15,16,17,11,12,12,14,14,12,13, - 13,14,15,12,13,12,15,15,14,15,15,16,17,14,15,15, - 16,16,13,14,14,15,16,14,14,15,15,17,15,15,15,16, - 17,16,16,17,16,18,16,17,17,18,18,13,14,14,16,15, - 14,15,15,17,16,14,15,15,16,16,16,17,17,18,18,16, - 16,16,17,16, 9,11,10,13,12,11,12,12,14,13,11,12, - 11,15,13,13,14,14,16,15,13,14,13,17,14,11,12,12, - 14,14,12,12,13,15,15,12,13,13,15,14,14,14,15,16, - 16,14,15,15,17,16,11,12,11,14,13,12,13,13,15,14, - 12,13,12,15,13,14,15,15,16,16,14,15,14,17,15,13, - 14,14,15,16,14,15,15,16,17,14,15,15,16,17,16,16, - 16,17,17,16,17,17,18,18,13,15,14,16,15,15,15,15, - 17,16,14,15,14,17,15,16,17,17,18,18,16,17,16,18, - 16, 6, 8, 8,11,11, 8, 9, 9,11,12, 8, 9, 9,12,11, - 10,11,11,13,14,10,12,11,14,13, 7, 9, 9,11,12, 9, - 10,10,12,13, 9,10,10,13,12,11,11,12,13,15,11,12, - 12,15,14, 8, 9, 9,12,11, 9,10,10,13,13, 9,11,10, - 13,12,12,12,12,14,15,11,13,12,15,13,10,11,11,13, - 14,11,12,12,13,15,11,12,12,14,14,13,13,14,14,16, - 14,15,14,16,16,11,12,11,14,13,12,13,13,15,14,11, - 13,12,15,13,14,15,15,16,16,13,14,14,16,14, 8, 9, - 9,11,12, 9,10,11,12,13, 9,10,10,13,12,11,12,13, - 14,15,11,12,12,15,14, 9, 9,11,11,13,10,10,12,12, - 14,10,10,11,13,14,12,12,13,14,16,12,13,13,15,15, - 9,11,10,13,12,10,11,11,13,14,10,12,11,14,13,12, - 13,13,15,16,12,13,13,15,15,11,11,13,13,15,12,12, - 14,13,15,13,13,14,14,15,14,14,15,14,17,15,15,15, - 16,16,12,13,12,15,14,13,14,14,15,15,12,14,13,15, - 14,15,15,15,17,17,14,15,14,17,15, 7, 9, 9,12,11, - 9,10,10,12,12, 9,11,10,13,12,11,12,12,14,14,11, - 13,12,15,14, 9,10,10,12,12,10,10,11,12,13,10,11, - 11,14,13,12,12,13,14,15,12,13,13,16,15, 9,10,10, - 13,12,10,11,11,13,13,10,11,10,14,12,13,13,13,15, - 15,12,13,12,15,14,11,12,12,14,14,12,12,13,14,15, - 13,14,13,15,15,14,13,15,14,16,15,16,15,17,16,12, - 12,12,14,14,13,13,14,15,15,12,13,12,15,14,15,15, - 16,16,17,14,15,14,17,14,10,11,12,13,14,11,12,13, - 14,15,11,12,13,14,15,13,14,15,15,17,14,15,15,16, - 16,11,12,13,12,15,12,12,14,13,16,13,13,14,13,16, - 14,14,16,14,18,15,15,16,16,17,12,13,12,15,15,13, - 14,14,15,16,13,14,13,16,15,15,15,16,17,18,15,15, - 15,17,16,14,14,15,14,17,15,14,16,14,17,15,15,16, - 15,18,16,16,17,16,19,17,17,17,17,18,14,15,15,17, - 16,15,16,16,17,17,15,16,15,18,16,17,17,18,18,18, - 16,17,16,18,17,10,11,11,14,13,11,12,12,15,14,11, - 13,12,15,14,14,15,15,16,16,14,15,15,17,16,11,12, - 12,15,14,12,13,13,15,14,13,14,13,16,14,14,15,15, - 16,16,15,16,15,18,16,11,13,12,15,15,13,14,14,15, - 15,12,14,13,16,15,15,16,16,17,17,15,16,15,17,16, - 14,15,14,16,16,14,15,15,16,16,15,16,15,17,16,16, - 16,17,16,17,17,18,17,19,18,14,15,15,17,16,15,16, - 16,17,17,15,15,15,18,16,17,18,18,18,18,16,17,16, - 19,16, 6, 8, 8,11,11, 8, 9, 9,11,12, 8, 9, 9,12, - 11,10,11,12,13,14,10,11,11,14,13, 8, 9, 9,11,12, - 9,10,11,12,13, 9,10,10,13,13,11,12,13,13,15,11, - 12,12,15,14, 7, 9, 9,12,11, 9,10,10,12,13, 9,10, - 10,13,12,11,12,12,14,15,11,12,11,14,13,11,11,12, - 13,14,11,12,13,13,15,12,13,13,14,15,13,14,14,14, - 16,14,15,15,16,16,10,11,11,14,13,11,12,12,14,14, - 11,12,12,15,13,14,14,14,16,16,13,14,13,16,14, 7, - 9, 9,11,12, 9,10,10,12,13, 9,10,10,12,12,11,12, - 13,14,15,11,12,12,14,14, 9,10,10,12,13,10,10,11, - 12,14,10,11,11,13,13,12,12,13,14,15,13,13,13,15, - 15, 9,10,10,12,12,10,11,11,13,14,10,11,10,13,12, - 12,13,13,15,16,12,13,12,15,14,11,12,13,14,14,12, - 12,13,14,15,13,14,13,15,15,14,14,15,14,17,15,16, - 15,17,16,11,12,12,14,14,13,13,13,15,15,12,13,12, - 15,14,15,15,15,16,17,14,15,14,16,14, 8, 9, 9,12, - 11, 9,10,10,12,13, 9,11,10,13,12,11,12,12,14,15, - 11,12,12,15,14, 9,10,11,13,13,10,11,12,13,14,10, - 11,11,14,13,12,13,13,15,15,12,13,13,16,15, 9,11, - 9,13,11,10,11,10,14,13,10,12,10,14,12,12,13,13, - 15,15,12,13,12,16,14,12,12,13,14,15,12,13,14,14, - 16,13,14,14,15,15,14,14,15,15,17,15,16,15,17,16, - 11,13,11,15,13,13,14,13,15,14,12,14,12,16,13,15, - 15,15,16,16,14,15,14,17,14,10,11,11,13,14,11,12, - 13,14,15,11,12,12,14,15,14,14,15,16,17,14,15,15, - 16,16,11,12,13,14,15,12,13,14,15,16,13,14,14,15, - 16,15,15,16,16,18,15,16,16,17,17,11,12,12,14,15, - 13,13,14,14,16,12,13,13,15,15,15,15,16,16,18,14, - 15,15,16,16,14,15,15,16,17,15,15,16,16,17,15,16, - 16,17,17,16,16,17,16,19,17,18,17,18,18,14,14,15, - 16,16,15,15,16,16,17,14,15,15,16,16,17,17,18,18, - 19,16,17,16,17,16,10,12,11,14,13,11,13,12,15,14, - 11,13,12,15,14,14,15,15,16,16,13,15,14,17,15,12, - 13,13,15,15,13,13,14,15,16,13,14,14,16,16,14,15, - 15,17,17,15,16,16,17,17,11,13,12,15,12,13,14,13, - 16,13,12,14,12,16,13,15,16,15,17,16,14,16,14,18, - 14,14,15,15,16,17,15,15,16,16,17,15,16,16,17,17, - 16,16,17,17,18,17,18,17,18,18,14,15,14,17,14,15, - 16,15,18,15,15,16,15,18,14,17,17,17,18,17,16,17, - 16,19,16, 9,11,11,13,13,10,12,12,14,14,11,12,12, - 15,14,13,14,14,16,16,13,14,14,16,16,10,11,12,14, - 14,11,12,13,14,15,12,13,13,15,15,13,14,15,16,16, - 14,15,15,17,16,11,12,12,15,14,12,13,13,15,15,12, - 13,12,15,15,14,15,15,16,17,14,15,14,17,16,12,13, - 14,15,16,13,13,14,15,16,13,14,15,16,16,14,15,16, - 16,18,15,16,16,18,18,13,14,14,16,15,14,15,15,17, - 16,14,15,15,17,16,16,17,17,18,18,16,17,16,18,17, - 10,12,12,14,14,11,12,13,15,15,12,13,13,15,15,13, - 14,15,16,17,14,15,15,17,16,11,11,13,14,15,12,12, - 14,15,16,13,13,14,15,16,14,14,15,16,17,15,15,16, - 17,17,12,13,12,15,15,13,14,14,16,16,13,14,13,16, - 15,15,16,15,17,17,15,16,15,18,16,13,12,15,14,17, - 14,13,16,14,17,14,14,16,15,18,15,14,17,16,18,16, - 16,17,17,18,14,15,15,17,16,15,16,16,17,17,15,16, - 15,18,16,17,17,17,18,18,16,17,16,19,17,10,11,11, - 14,14,11,12,12,15,15,11,13,12,15,15,14,15,14,16, - 16,14,15,15,17,16,11,12,12,15,14,12,12,13,15,15, - 13,14,13,16,15,14,15,15,16,16,15,16,15,18,17,11, - 13,12,15,15,13,14,13,15,15,12,14,13,16,15,15,16, - 15,17,17,15,16,15,18,16,13,14,13,16,16,14,15,14, - 16,16,14,15,15,17,16,16,16,16,16,18,16,18,17,19, - 18,14,15,15,17,16,15,16,16,17,17,15,15,15,17,16, - 17,17,18,18,19,16,17,16,18,16,12,13,13,15,16,13, - 14,14,16,17,13,14,14,16,16,15,15,16,17,18,15,16, - 16,18,17,13,13,14,14,17,14,14,15,15,17,14,14,15, - 16,17,15,15,17,16,18,16,17,17,18,18,13,14,14,17, - 16,14,15,15,17,17,14,15,14,17,16,16,17,17,18,18, - 16,17,16,18,17,15,14,16,13,18,16,15,17,14,19,16, - 16,17,15,18,17,16,18,15,19,18,18,18,17,19,15,16, - 16,18,17,16,17,17,18,18,16,17,16,19,17,18,19,18, - 19,19,17,18,17,20,18,11,12,12,15,15,13,13,14,15, - 16,13,14,13,16,15,15,16,16,17,17,15,16,16,18,17, - 12,14,13,16,15,13,13,14,15,16,14,15,14,17,16,16, - 16,16,16,17,16,17,17,19,17,12,13,14,16,16,14,15, - 15,16,17,13,15,13,17,15,16,17,17,18,18,16,17,16, - 18,16,15,16,15,17,16,15,15,15,17,17,16,17,16,18, - 17,17,16,17,16,18,18,19,18,20,18,15,16,16,17,17, - 16,17,17,18,18,15,16,15,18,17,18,18,19,19,19,17, - 18,16,19,16, 9,11,11,13,13,11,12,12,14,15,10,12, - 12,14,14,13,14,14,16,16,13,14,14,16,16,11,12,12, - 14,14,12,12,13,15,15,12,13,13,15,15,14,15,15,16, - 17,14,15,15,16,16,10,12,11,14,14,12,13,13,15,15, - 11,13,12,15,14,14,15,15,16,17,13,15,14,17,16,13, - 14,14,15,16,14,15,15,16,17,14,15,15,16,17,16,16, - 17,17,18,16,17,17,18,18,12,14,13,16,15,13,15,14, - 17,16,13,14,13,17,15,15,16,16,18,18,15,16,15,18, - 16,10,11,11,14,14,11,12,13,14,15,11,12,12,15,15, - 14,15,15,16,17,14,15,15,16,16,11,12,13,15,15,12, - 13,14,15,16,13,14,14,15,16,15,15,16,16,18,15,15, - 16,17,17,11,12,12,14,15,13,13,14,15,16,12,13,13, - 15,15,15,15,16,17,18,14,15,15,17,16,14,15,15,16, - 17,15,15,16,16,17,15,16,16,17,17,16,16,17,16,19, - 17,17,18,19,18,13,13,14,16,16,14,15,16,17,17,14, - 14,15,16,16,16,16,17,18,18,16,16,16,18,16,10,12, - 12,14,14,12,13,13,15,15,11,13,12,15,15,14,15,15, - 16,17,13,15,14,17,16,12,13,13,15,15,13,13,14,15, - 16,13,14,14,16,16,15,15,16,17,18,15,15,16,17,17, - 11,13,12,15,14,13,14,13,16,15,12,14,12,16,14,15, - 16,15,17,17,14,16,14,17,16,14,15,15,16,17,15,15, - 16,16,18,15,16,16,17,17,16,17,17,17,19,17,17,17, - 18,18,13,15,12,17,14,14,16,14,17,15,14,15,13,17, - 14,16,17,16,18,17,15,17,14,19,15,11,12,12,15,15, - 13,13,14,15,16,13,14,13,16,15,15,16,16,17,18,15, - 16,16,17,17,12,14,13,16,16,13,13,15,15,17,14,15, - 15,17,16,16,16,17,16,19,16,17,17,18,18,12,13,14, - 15,16,14,14,15,16,17,13,14,13,16,15,16,17,17,18, - 19,15,16,16,17,16,15,16,16,18,17,15,15,16,17,18, - 16,17,17,18,18,16,16,18,16,19,18,19,19,20,19,15, - 15,16,16,17,16,16,17,17,18,15,15,15,17,16,18,18, - 19,18,20,17,17,16,18,16,12,13,13,16,15,13,14,14, - 16,16,13,14,14,16,16,15,16,16,17,18,15,16,15,18, - 17,13,14,14,16,16,14,15,15,16,17,14,15,15,17,17, - 16,17,17,18,18,16,17,17,18,18,13,14,13,17,14,14, - 15,14,17,16,14,15,14,17,15,16,17,17,18,18,15,17, - 15,19,15,16,16,16,17,18,16,16,17,17,19,16,17,17, - 18,19,17,17,18,18,20,18,18,18,19,19,15,16,14,18, - 13,16,17,16,19,15,16,17,15,19,14,18,18,18,19,17, - 17,18,16,20,15, -}; - -static const static_codebook _44p6_p2_0 = { - 5, 3125, - (char *)_vq_lengthlist__44p6_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p6_p2_0, - 0 -}; - -static const long _vq_quantlist__44p6_p3_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p6_p3_0[] = { - 1, 5, 5, 5, 7, 8, 5, 8, 7, 5, 7, 8, 8, 8,10, 8, - 10,10, 5, 8, 7, 8,10,10, 8,10, 8, 6, 8, 9, 8,10, - 12, 9,11,11, 9,10,11,11,11,13,12,13,13, 9,11,11, - 11,13,13,11,13,12, 6, 9, 8, 9,11,11, 8,12,10, 9, - 11,11,11,12,13,11,13,13, 9,11,10,11,13,13,11,13, - 11, 5, 9, 9, 8,11,11, 9,12,11, 8,10,11,10,11,13, - 11,13,13, 9,11,11,11,13,13,11,13,12, 8,10,11,10, - 12,13,10,13,12,10,10,13,11,11,14,12,13,14,11,13, - 12,13,14,14,12,14,12, 8,11,10,11,12,13,11,14,12, - 10,13,12,12,12,13,13,15,14,11,12,13,13,14,15,12, - 14,12, 5, 9, 9, 9,11,12, 8,11,11, 9,11,11,11,12, - 13,11,13,13, 8,11,10,11,13,13,10,13,11, 8,10,11, - 11,12,14,11,13,12,11,13,12,12,12,14,13,15,14,10, - 12,13,13,14,15,12,13,12, 8,11,10,10,12,13,10,13, - 12,11,12,13,12,12,14,13,14,14,10,13,10,12,14,13, - 11,14,11, -}; - -static const static_codebook _44p6_p3_0 = { - 5, 243, - (char *)_vq_lengthlist__44p6_p3_0, - 1, -533200896, 1614282752, 2, 0, - (long *)_vq_quantlist__44p6_p3_0, - 0 -}; - -static const long _vq_quantlist__44p6_p3_1[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p6_p3_1[] = { - 5, 7, 7, 6, 7, 7, 6, 7, 7, 6, 7, 7, 7, 8, 8, 7, - 8, 8, 6, 7, 7, 7, 8, 8, 7, 8, 8, 7, 7, 8, 7, 8, - 8, 7, 8, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, 8, 8, - 8, 9, 9, 8, 9, 8, 7, 8, 7, 7, 8, 8, 7, 8, 8, 8, - 8, 8, 8, 8, 9, 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, 9, - 8, 6, 8, 8, 7, 8, 8, 7, 8, 8, 7, 8, 8, 8, 8, 9, - 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, 9, 8, 7, 8, 8, 8, - 8, 9, 8, 9, 9, 8, 8, 9, 8, 9, 9, 9, 9, 9, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 7, 8, 8, 8, 9, 9, 8, 9, 8, - 8, 8, 8, 8, 9, 9, 9, 9, 9, 8, 9, 8, 9, 9, 9, 9, - 9, 9, 6, 8, 8, 7, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, - 9, 8, 9, 9, 7, 8, 8, 8, 9, 9, 8, 9, 8, 7, 8, 8, - 8, 8, 9, 8, 9, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 8, - 8, 8, 9, 9, 9, 8, 9, 9, 7, 8, 8, 8, 9, 9, 8, 9, - 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 8, 9, 9, 9, - 9, 9, 9, -}; - -static const static_codebook _44p6_p3_1 = { - 5, 243, - (char *)_vq_lengthlist__44p6_p3_1, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p6_p3_1, - 0 -}; - -static const long _vq_quantlist__44p6_p4_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p6_p4_0[] = { - 2, 5, 5, 5, 7, 8, 5, 8, 7, 5, 7, 7, 7, 7, 9, 7, - 9, 9, 5, 7, 7, 8, 9, 9, 7, 9, 7, 6, 8, 8, 8, 9, - 10, 8, 9, 9, 8, 9,10, 9, 9,11,10,11,11, 8, 9, 9, - 10,11,11, 9,11,10, 6, 8, 8, 8, 9, 9, 8,10, 9, 8, - 9, 9, 9,10,11,10,11,10, 8,10, 9,10,11,11, 9,11, - 9, 6, 8, 8, 7, 9, 9, 8,10, 9, 7, 9, 9, 9, 9,10, - 9,10,10, 8, 9, 9, 9,10,10, 9,11,10, 7, 9, 9, 8, - 10,10, 9,10,10, 9, 9,10,10,10,11,10,11,11, 9,10, - 10,10,11,11,10,11,10, 7, 9, 9, 9, 9,10, 9,10, 9, - 8,10, 9, 9, 9,11,10,11,11, 9,10,10,10,11,11, 9, - 11, 9, 6, 8, 8, 8, 9,10, 7, 9, 9, 8, 9, 9, 9,10, - 10, 9,10,10, 7, 9, 9, 9,10,10, 9,10, 9, 7, 9, 9, - 9, 9,10, 9,10, 9, 9,10,10, 9, 9,11,10,11,11, 8, - 9,10,10,11,11, 9,11, 9, 7, 9, 9, 9,10,10, 8,10, - 10, 9,10,10,10,10,11,10,11,11, 9,10, 9,10,11,11, - 10,11,10, -}; - -static const static_codebook _44p6_p4_0 = { - 5, 243, - (char *)_vq_lengthlist__44p6_p4_0, - 1, -531365888, 1616117760, 2, 0, - (long *)_vq_quantlist__44p6_p4_0, - 0 -}; - -static const long _vq_quantlist__44p6_p4_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p6_p4_1[] = { - 6, 8, 8,10,10, 8, 9, 9,10,11, 8,10, 9,11,10, 9, - 10,10,11,11, 9,10,10,11,11, 8, 9, 9,10,10, 9, 9, - 10,11,11,10,10,10,11,11,10,11,11,11,11,10,11,11, - 11,11, 8, 9, 9,11,10,10,10,10,11,11, 9,10, 9,11, - 11,10,11,11,11,11,10,11,10,11,11,10,10,11,11,11, - 10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,10,11,10,11,11,11,11,11,11,11,10,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11, 8, 9,10, - 11,11,10,10,11,11,11,10,10,10,11,11,10,11,11,12, - 12,10,11,11,12,12,10,10,11,11,11,10,10,11,11,12, - 11,11,11,12,12,11,11,12,12,12,11,11,12,12,12,10, - 10,10,11,11,11,11,11,12,12,10,11,11,12,12,11,12, - 12,12,12,11,12,11,12,12,11,11,11,11,12,11,11,12, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,11,11,11,12,11,11,12,12,12,12,11,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12, 8,10, 9,11,11,10, - 10,10,11,11,10,11,10,11,11,10,11,11,12,12,10,11, - 11,12,12,10,10,10,11,11,10,11,11,12,12,11,11,11, - 12,12,11,11,12,12,12,11,12,12,12,12,10,11,10,11, - 11,11,11,11,12,12,10,11,10,12,11,11,12,11,12,12, - 11,12,11,12,12,11,11,11,12,12,11,11,12,12,12,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,11,11, - 11,12,11,11,12,12,12,12,11,12,11,12,12,12,12,12, - 12,12,12,12,12,12,12,10,11,11,11,12,11,11,12,12, - 12,11,11,11,12,12,11,12,12,12,12,11,12,12,12,12, - 11,11,12,12,12,11,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,13,11,12,11,12,12,12,12, - 12,12,12,11,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,13,12,13,12,12,12,12,13,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,12, - 12,12,13,12,10,11,11,12,11,11,11,12,12,12,11,12, - 11,12,12,11,12,12,12,12,11,12,12,12,12,11,11,12, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,11,12,11,12,12,12,12,12,12,12, - 11,12,12,12,12,12,12,12,12,12,12,12,12,13,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,13,12,12,12,12,13,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,13,13,12,13,12,13, - 12, 8,10,10,11,11,10,10,11,11,11,10,11,10,11,11, - 10,11,11,12,12,10,11,11,12,12, 9,10,11,11,11,10, - 10,11,12,12,10,11,11,12,12,11,11,12,12,12,11,12, - 12,12,12,10,11,10,11,11,11,11,11,12,12,10,11,11, - 12,12,11,12,12,12,12,11,12,11,12,12,11,11,11,12, - 12,11,11,12,12,12,11,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,11,11,11,12,12,11,12,12,12,12,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12, 9,10, - 10,11,11,10,11,11,12,12,10,11,11,12,12,11,11,12, - 12,12,11,12,12,12,12,10,11,11,12,12,11,11,12,12, - 12,11,11,12,12,12,11,11,12,12,12,12,12,12,12,12, - 10,11,11,12,12,11,12,12,12,12,11,12,11,12,12,12, - 12,12,12,12,12,12,12,12,12,11,11,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12, 9,10,10,11,11, - 10,11,11,12,12,10,11,11,12,11,11,12,12,12,12,11, - 12,12,12,12,10,11,11,12,12,11,11,11,12,12,11,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,10,11,11, - 12,12,11,12,12,12,12,11,12,11,12,12,12,12,12,12, - 12,12,12,12,12,12,11,12,12,12,12,11,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,11, - 12,12,12,12,12,12,12,12,12,11,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,11,11,11,12,12,11,12,12, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 13,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,13,12,13,12,12,13,13,13,11,12,12,12,12,12, - 12,12,13,13,12,12,12,13,12,12,12,12,13,13,12,13, - 12,13,13,12,12,12,12,12,12,12,12,12,13,12,13,13, - 13,13,12,13,13,13,13,13,13,13,13,13,12,12,12,12, - 12,12,12,13,13,13,12,13,12,13,13,12,13,13,13,13, - 12,13,13,13,13,11,11,11,12,12,11,12,12,12,12,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,11,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13, - 12,13,12,12,12,13,13,11,12,12,12,12,12,12,12,12, - 13,12,12,12,13,12,12,13,12,13,13,12,13,12,13,13, - 12,12,12,12,12,12,12,13,13,13,12,12,13,13,13,12, - 13,13,12,13,13,13,13,13,13,12,12,12,12,12,12,13, - 12,13,13,12,13,12,13,12,12,13,13,13,13,12,13,13, - 13,13, 8,10,10,11,11,10,10,11,11,11, 9,11,10,11, - 11,10,11,11,12,12,10,11,11,12,12,10,10,11,11,11, - 10,11,11,12,12,11,11,11,12,12,11,11,12,12,12,11, - 12,12,12,12, 9,11,10,11,11,10,11,11,12,12,10,11, - 10,12,12,11,12,12,12,12,11,12,11,12,12,11,11,11, - 12,12,11,12,12,12,12,11,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,11,11,11,12,12,11,12,12,12,12, - 11,12,11,12,12,12,12,12,12,12,12,12,12,12,12, 9, - 10,10,11,11,10,11,11,12,12,10,11,11,12,12,11,12, - 12,12,12,11,12,12,12,12,10,11,11,12,12,11,11,12, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,10,11,11,12,12,11,11,12,12,12,11,11,11,12,12, - 12,12,12,12,12,11,12,12,12,12,11,12,12,12,12,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,11,12,12,12,12,12,12,12,12,12,11,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12, 9,10,10,11, - 11,10,11,11,12,12,10,11,11,12,12,11,12,12,12,12, - 11,12,11,12,12,10,11,11,12,12,11,11,12,12,12,11, - 11,12,12,12,12,12,12,12,12,12,12,12,12,12,10,11, - 11,12,12,11,12,11,12,12,11,12,11,12,12,12,12,12, - 12,12,11,12,11,12,12,11,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 11,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,11,11,11,12,12,11,12, - 12,12,12,11,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,13, - 13,12,12,12,13,13,12,12,13,13,13,11,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,13,12,13,13,12, - 12,12,13,12,12,12,12,12,12,12,12,13,13,13,12,12, - 13,13,13,12,13,13,12,13,12,13,13,13,13,12,12,12, - 12,12,12,12,13,13,13,12,12,12,13,12,12,13,13,13, - 13,12,13,13,13,13,11,11,11,12,12,11,12,12,12,12, - 11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,11, - 12,12,12,12,12,12,12,12,12,12,12,12,13,12,12,12, - 13,13,13,12,12,12,13,13,11,12,12,12,12,12,12,12, - 13,12,12,12,12,13,12,12,13,12,13,13,12,13,12,13, - 12,12,12,12,12,12,12,12,13,13,13,12,13,13,13,13, - 12,13,13,13,13,13,13,13,13,13,12,12,12,12,12,12, - 13,12,13,12,12,13,12,13,12,13,13,13,13,13,12,13, - 13,13,13,10,11,11,12,12,11,12,12,12,12,11,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,11,11,12,12, - 12,11,12,12,12,12,12,12,12,12,12,12,12,12,13,13, - 12,12,12,13,13,11,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,13,13,12,12,12,13,12,12,12, - 12,12,12,12,12,12,12,13,12,12,12,12,13,12,12,13, - 12,13,12,13,13,13,13,12,12,12,12,12,12,12,12,13, - 12,12,12,12,13,12,12,13,13,13,13,12,13,12,13,13, - 11,11,11,12,12,11,12,12,12,12,11,12,12,12,12,12, - 12,12,12,13,12,12,12,13,12,11,12,12,12,12,12,12, - 12,12,13,12,12,12,12,13,12,12,13,13,13,12,12,13, - 13,13,11,12,12,12,12,12,12,12,12,13,12,12,12,13, - 12,12,13,12,13,13,12,13,12,13,13,12,12,12,12,12, - 12,12,13,12,13,12,12,13,13,13,12,12,13,13,13,13, - 13,13,13,13,12,12,12,12,12,12,13,13,13,13,12,13, - 12,13,12,12,13,13,13,13,12,13,13,13,13,11,11,11, - 12,12,11,12,12,12,12,11,12,12,12,12,12,12,12,12, - 12,12,12,12,12,13,11,12,12,12,12,12,12,12,12,13, - 12,12,12,13,13,12,12,13,13,13,12,12,13,13,13,11, - 12,12,12,12,12,12,12,13,13,12,12,12,13,12,12,13, - 12,13,13,12,13,12,13,13,12,12,12,12,12,12,12,12, - 12,13,12,13,12,13,13,12,13,13,13,13,12,13,13,13, - 13,12,12,12,12,12,12,13,12,13,13,12,12,12,13,13, - 12,13,13,13,13,12,13,12,13,13,11,12,12,12,12,11, - 12,12,12,12,11,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,11,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,13,12,13,12,12,12,13,13,11,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13, - 12,13,12,13,13,12,12,12,12,12,12,12,13,12,13,12, - 12,13,12,13,12,12,13,12,13,12,13,13,13,13,12,12, - 12,12,12,12,12,12,12,12,12,12,12,13,12,12,13,13, - 13,13,12,13,12,13,12,11,11,11,12,12,11,12,12,12, - 12,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,13,13,11,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,13,13,12,12,12, - 13,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,13,12,12,12,13,12,12,12,12,12,12,12,12, - 12,12,12,13,12,12,12,12,13,12,12,13,12,13,12,12, - 13,12,13,12,10,11,11,12,12,11,12,12,12,12,11,12, - 11,12,12,11,12,12,12,12,11,12,12,12,12,11,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 13,12,12,12,13,13,11,12,11,12,12,12,12,12,12,12, - 11,12,12,12,12,12,12,12,13,13,12,12,12,13,12,12, - 12,12,12,12,12,12,12,12,13,12,12,12,12,13,12,13, - 13,12,13,12,13,13,13,13,12,12,12,12,12,12,12,12, - 13,13,12,12,12,13,12,12,13,13,13,13,12,13,12,13, - 12,11,11,11,12,12,11,12,12,12,12,11,12,12,12,12, - 12,12,12,13,13,12,12,12,13,12,11,12,12,12,12,12, - 12,12,12,13,12,12,12,13,13,12,12,13,13,13,12,12, - 13,13,13,11,12,12,12,12,12,12,12,13,13,12,12,12, - 13,12,12,13,12,13,13,12,12,12,13,13,12,12,12,12, - 12,12,12,13,13,13,12,12,13,13,13,12,12,13,13,13, - 12,13,13,13,13,12,12,12,12,12,12,12,13,13,13,12, - 12,12,13,12,12,13,13,13,13,12,13,13,13,13,11,11, - 11,12,12,11,12,12,12,12,11,12,12,12,12,12,12,12, - 12,13,12,12,12,13,13,11,12,12,12,12,12,12,12,12, - 13,12,12,12,13,13,12,12,13,13,13,12,12,13,13,13, - 11,12,12,12,12,12,12,12,13,12,12,12,12,13,12,12, - 13,12,13,13,12,13,12,13,13,12,12,12,12,12,12,12, - 12,13,13,12,13,12,13,13,12,13,13,13,13,13,13,13, - 13,13,12,12,12,12,12,12,13,12,13,13,12,13,12,13, - 12,12,13,13,13,13,12,13,12,13,13,11,11,11,12,12, - 11,12,12,12,12,11,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,11,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,13,12,12,12,13,13,11,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13, - 13,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13, - 12,12,12,12,13,12,12,12,12,13,12,12,13,12,13,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 13,12,12,12,13,12,12,12,11,12,11,12,12,11,12,12, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,11,12,12,12,12,12,12,12,12,13,12,12,12,12,12, - 12,12,12,13,13,12,12,12,13,13,11,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,13,12,13,13,12,12, - 12,13,12,12,12,12,12,12,12,12,12,12,13,12,12,12, - 13,13,12,12,13,12,13,12,13,13,13,13,12,12,12,12, - 12,12,12,12,13,12,12,12,12,13,12,12,13,12,13,13, - 12,13,12,13,12, -}; - -static const static_codebook _44p6_p4_1 = { - 5, 3125, - (char *)_vq_lengthlist__44p6_p4_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p6_p4_1, - 0 -}; - -static const long _vq_quantlist__44p6_p5_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p6_p5_0[] = { - 2, 6, 6,10,10, 5, 7, 8,11,12, 5, 8, 7,12,11, 9, - 11,11,13,15, 9,11,11,15,13, 6, 7, 8,11,11, 7, 7, - 9,11,13, 8, 9, 9,13,12,11,11,12,12,15,11,12,12, - 15,14, 6, 8, 7,11,11, 8, 9, 9,12,13, 7, 9, 7,13, - 11,11,12,12,14,15,11,12,11,15,12,10,11,11,12,14, - 10,11,12,12,15,12,13,13,14,15,13,12,14,12,16,15, - 15,15,16,16,10,11,11,14,12,12,13,13,15,14,10,12, - 11,15,12,15,15,15,16,17,13,14,12,17,12, 6, 8, 8, - 12,12, 8, 9,10,13,13, 8, 9, 9,13,13,12,12,13,15, - 16,12,13,13,16,15, 8, 9,10,12,13, 9, 9,11,13,14, - 10,11,11,14,14,13,13,14,15,16,13,14,14,16,16, 8, - 10, 9,13,13,10,11,11,14,14, 9,10,10,14,13,13,14, - 14,16,17,13,13,13,16,15,12,13,13,14,16,13,13,14, - 14,16,14,14,14,16,16,15,15,16,15,18,16,17,17,18, - 18,12,13,13,15,15,14,14,14,16,16,13,14,13,16,15, - 16,16,17,18,18,15,16,15,18,15, 6, 8, 8,12,12, 8, - 9, 9,13,13, 8,10, 9,13,13,12,13,13,15,16,12,13, - 12,16,15, 8, 9,10,13,13, 9,10,10,13,14,10,11,11, - 14,14,13,13,13,15,16,13,14,14,17,16, 8,10, 9,13, - 13,10,11,11,14,14, 9,11, 9,14,13,13,14,14,16,16, - 13,14,13,16,14,12,13,13,15,16,13,13,14,15,16,14, - 14,14,16,16,15,15,16,15,18,17,17,17,18,18,12,13, - 13,16,14,14,14,14,16,16,13,14,13,16,14,16,17,17, - 18,18,15,16,15,18,15,11,12,13,14,16,13,13,14,15, - 17,13,14,14,16,17,16,16,17,17,19,16,17,17,18,19, - 13,13,14,16,16,14,14,15,16,17,14,15,15,17,17,17, - 16,17,17,19,17,17,18,19,19,13,14,14,16,16,14,14, - 15,17,18,14,15,14,17,17,17,17,18,18,19,17,17,17, - 18,19,16,16,16,17,18,17,17,17,18,19,17,17,17,18, - 19,18,18,19,18,20,19,20,19,21,20,16,17,17,18,18, - 17,17,18,19,19,17,17,17,19,18,19,19,19,19,20,19, - 19,19,20,19,11,13,12,16,14,13,14,14,17,16,13,14, - 13,17,15,16,17,17,18,18,16,17,16,19,17,13,14,14, - 16,16,14,14,14,17,17,14,15,15,17,16,17,17,17,19, - 19,17,18,17,19,18,13,14,13,17,16,14,15,15,17,17, - 14,15,14,18,16,17,17,17,19,19,17,17,16,19,17,16, - 17,17,18,19,17,17,17,18,18,17,18,17,19,18,18,19, - 18,19,19,19,20,19,20,20,16,17,16,18,17,17,17,17, - 18,18,17,18,17,19,17,19,19,19,19,20,18,19,19,20, - 18, 6, 8, 8,12,12, 8, 9, 9,13,13, 8,10, 9,13,13, - 11,13,13,15,16,12,13,13,16,15, 8, 9, 9,13,13, 9, - 9,10,13,14,10,11,11,14,14,12,12,13,14,16,13,14, - 14,17,16, 8,10, 9,13,13,10,11,11,14,14, 9,11,10, - 14,13,13,14,14,16,16,13,14,13,16,15,12,13,13,14, - 16,12,13,14,14,16,13,14,14,16,16,15,14,16,15,18, - 16,17,17,18,17,12,13,13,16,15,14,14,14,16,16,13, - 14,13,16,15,16,16,17,17,17,15,16,15,18,15, 7, 9, - 9,13,13, 9, 9,11,13,14, 9,10,10,14,13,12,13,14, - 15,16,12,14,13,17,15, 9, 9,10,13,14,10, 9,11,13, - 15,11,11,11,14,14,13,12,14,14,17,14,14,14,17,16, - 9,10,10,14,13,11,11,11,14,14,10,11,10,15,13,14, - 14,14,16,17,13,14,13,17,14,13,13,14,14,16,13,13, - 14,14,17,14,14,14,16,16,15,14,16,15,18,17,17,17, - 18,18,13,14,13,16,15,14,14,15,17,16,13,14,13,17, - 15,17,16,17,17,17,15,16,14,18,14, 7, 9, 9,13,13, - 9,10,10,13,14, 9,11,10,14,13,13,14,14,16,16,13, - 14,14,17,15, 9,10,10,14,13, 9,10,11,13,14,11,12, - 11,15,14,13,13,14,14,16,14,15,15,17,17, 9,10,10, - 14,14,11,12,12,14,15,10,11,10,15,13,14,15,15,17, - 17,14,15,13,17,14,13,14,13,16,16,13,13,14,15,16, - 14,15,15,17,17,15,14,16,15,18,17,18,17,20,18,13, - 14,14,16,16,15,15,15,17,17,13,14,13,17,15,17,17, - 18,18,18,15,16,14,19,14,12,13,13,15,16,13,13,15, - 16,17,13,14,14,16,16,15,15,17,17,19,16,17,17,19, - 18,13,13,14,15,17,14,13,15,15,17,14,15,15,16,17, - 16,15,18,16,19,17,17,17,18,19,13,14,14,17,16,14, - 15,15,17,17,14,15,14,17,16,17,17,17,18,19,16,17, - 16,19,17,16,16,17,16,18,16,16,17,16,19,17,17,18, - 18,19,18,17,18,17,21,19,19,19,20,19,16,17,17,18, - 18,17,17,18,18,19,16,17,16,18,18,19,19,19,19,20, - 18,18,17,20,18,11,13,13,16,15,13,14,14,16,17,13, - 15,14,17,16,16,17,17,18,18,17,17,17,19,18,13,14, - 13,17,16,14,13,14,16,17,15,16,15,18,16,17,16,17, - 17,19,18,18,18,20,18,13,14,14,16,17,15,15,15,17, - 18,14,15,14,18,16,18,18,18,19,20,17,18,16,20,17, - 16,17,16,18,18,16,16,17,18,18,17,18,18,19,18,18, - 17,19,17,20,19,20,19,22,20,16,16,17,18,18,18,17, - 17,19,19,16,17,16,18,17,19,20,19,22,21,18,19,18, - 21,17, 6, 8, 8,12,12, 8, 9,10,13,13, 8, 9, 9,13, - 13,12,13,13,15,16,11,13,13,16,15, 8, 9,10,13,13, - 9,10,11,13,14,10,11,11,14,14,13,13,14,15,16,13, - 14,14,16,16, 8, 9, 9,13,13,10,11,11,14,14, 9,10, - 9,14,13,13,14,14,16,17,12,14,12,16,14,12,13,13, - 15,16,13,13,14,15,16,13,14,14,15,17,15,15,16,15, - 18,16,16,17,17,17,12,13,13,16,14,13,14,14,16,16, - 12,14,13,16,14,16,17,17,18,18,15,15,14,18,14, 7, - 9, 9,13,13, 9,10,11,13,14, 9,10,10,14,13,13,14, - 14,15,17,13,14,14,16,15, 9,10,10,14,14,10,10,11, - 13,15,11,12,12,15,14,14,13,15,14,17,14,15,15,17, - 17, 9,10,10,13,14,11,11,12,14,15, 9,11,10,14,13, - 14,15,15,16,18,13,14,13,16,14,13,14,14,16,16,13, - 13,14,15,17,15,15,15,16,17,15,14,16,15,18,17,17, - 18,19,18,13,14,14,16,16,14,15,15,17,17,13,14,13, - 16,15,17,17,18,18,18,15,16,14,18,15, 7, 9, 9,13, - 13, 9,10,10,13,14, 9,11,10,14,13,12,13,14,15,16, - 12,14,13,16,15, 9,10,10,13,14,10,10,11,13,14,11, - 11,11,15,14,13,13,14,14,16,14,14,14,17,16, 9,10, - 9,14,13,11,11,11,14,14,10,11, 9,15,13,14,14,14, - 16,16,13,14,12,17,14,13,13,14,15,16,13,13,14,15, - 16,14,15,14,16,17,15,14,16,14,18,16,17,17,18,18, - 13,14,13,16,14,14,14,14,16,16,13,14,13,17,14,17, - 17,17,18,18,15,16,14,18,15,11,13,13,16,16,13,14, - 15,16,17,13,14,14,17,16,16,17,17,18,19,17,17,17, - 19,18,13,14,14,17,17,13,13,15,16,18,15,15,15,17, - 17,17,16,18,17,20,18,17,18,19,19,13,14,14,16,17, - 15,15,16,16,18,14,15,14,16,16,17,17,18,18,20,17, - 18,16,18,17,16,17,16,19,18,16,16,17,18,19,18,18, - 18,19,19,18,17,18,17,21,20,19,19,21,21,16,16,17, - 18,18,17,17,18,19,19,16,17,16,19,18,20,20,20,19, - 21,18,18,17,20,18,12,13,13,16,15,13,14,14,16,16, - 13,14,13,17,16,16,17,17,18,18,15,17,15,19,17,13, - 14,14,16,17,14,14,15,16,17,14,15,15,17,17,16,16, - 17,17,18,17,17,17,19,19,13,14,13,17,15,14,15,15, - 17,16,14,15,13,17,15,17,18,17,19,18,16,17,15,20, - 16,16,17,17,18,18,16,16,17,18,18,17,18,17,19,18, - 17,17,18,18,20,19,20,19,20,19,16,16,16,19,16,17, - 17,17,19,18,16,17,16,19,16,19,19,19,19,19,18,19, - 17,19,17,11,13,13,16,16,13,14,14,17,17,13,14,14, - 17,17,15,17,17,19,19,16,18,17,20,19,12,14,14,17, - 17,13,14,15,17,18,14,15,15,17,18,16,16,17,18,20, - 17,18,18,20,18,13,14,14,17,17,14,15,15,17,18,14, - 15,15,17,17,17,18,17,19,19,17,18,17,19,19,15,16, - 16,18,18,15,16,17,18,19,16,17,17,19,19,17,17,18, - 18,21,18,19,19,21,19,16,17,17,18,18,17,17,18,19, - 19,17,18,17,19,19,19,19,19,20,20,18,19,18,21,19, - 12,13,13,16,16,13,14,14,16,17,13,15,14,17,16,15, - 16,17,17,19,16,17,17,19,18,13,13,14,16,17,14,13, - 15,16,17,14,15,15,17,17,15,15,17,17,20,17,17,18, - 19,18,13,14,14,17,16,15,15,15,17,18,14,15,14,17, - 16,17,17,17,18,18,16,17,16,19,17,16,15,17,17,19, - 16,15,17,16,19,17,16,17,18,19,17,16,19,16,20,19, - 18,19,19,19,16,17,17,18,18,17,17,17,18,19,16,17, - 16,19,18,20,19,19,20,19,18,18,17,20,17,11,13,13, - 16,16,13,14,15,16,17,14,15,14,18,16,17,17,17,18, - 21,17,18,17,20,19,13,14,14,17,16,13,14,15,16,18, - 15,16,15,18,17,17,16,17,17,19,17,18,18,20,19,13, - 14,14,16,17,15,15,16,17,18,14,15,14,18,17,17,18, - 18,19,20,17,18,16,19,17,16,17,15,19,18,16,16,16, - 18,18,17,18,17,20,19,18,17,18,17,20,20,20,19,22, - 20,16,17,17,18,19,18,18,18,19,20,16,17,16,19,18, - 20,19,19,20,20,18,19,17,20,17,13,14,14,16,17,14, - 14,16,16,18,14,16,15,17,16,16,16,17,17,18,17,17, - 16,19,18,14,14,15,16,17,14,14,16,16,18,16,16,16, - 17,17,16,15,17,16,19,18,18,18,19,19,14,15,15,17, - 17,15,16,16,17,18,14,16,14,18,16,17,17,18,18,19, - 16,17,16,19,17,16,16,17,16,18,16,16,17,16,19,18, - 18,18,17,18,17,16,18,16,20,19,19,19,19,19,16,17, - 17,18,18,17,17,18,19,19,16,17,16,19,17,18,19,19, - 19,20,17,18,16,20,16,11,14,13,17,17,14,14,16,16, - 18,14,16,14,19,16,18,18,19,18,19,18,19,18,21,18, - 13,15,14,18,16,14,14,16,16,18,16,17,16,19,17,18, - 16,19,17,20,19,19,19,21,19,13,14,15,17,18,17,16, - 17,17,19,14,16,14,18,16,20,19,19,20,21,18,19,16, - 21,17,17,18,16,19,17,16,16,17,18,18,19,19,18,21, - 18,17,17,18,17,20,20,20,20,22,20,17,17,18,18,20, - 19,19,19,18,20,16,17,17,19,19,21,21,21,20,21,17, - 19,17,23,17,11,13,13,16,16,13,14,14,17,17,13,14, - 14,17,17,16,17,17,19,20,15,16,16,19,19,13,14,14, - 16,17,14,15,15,17,18,14,15,15,17,17,17,17,18,19, - 19,17,17,18,19,19,13,14,14,17,16,14,15,15,17,17, - 13,15,14,18,17,17,18,18,19,20,16,17,16,19,18,16, - 16,17,18,18,17,17,17,18,19,17,18,17,19,19,19,19, - 19,19,20,19,20,19,20,20,15,16,16,18,17,16,17,17, - 20,18,15,16,16,19,17,19,19,19,20,20,17,18,17,21, - 17,11,13,13,16,16,13,14,15,16,17,13,15,14,17,16, - 17,17,18,18,20,17,17,17,19,19,13,14,14,17,17,14, - 14,15,17,18,15,15,15,18,17,17,17,18,17,20,18,18, - 17,20,18,13,14,14,16,17,15,15,16,17,18,14,15,13, - 17,17,17,18,18,19,20,17,17,16,19,17,16,17,17,18, - 18,16,16,17,18,18,18,18,18,19,19,18,17,19,18,21, - 19,20,20,20,20,16,15,17,18,18,17,17,18,18,20,16, - 16,16,18,17,20,19,20,21,22,17,18,17,20,17,12,13, - 13,16,16,13,14,15,16,17,13,14,14,17,16,16,17,18, - 18,19,15,16,16,19,18,13,14,14,16,17,14,14,15,16, - 17,14,15,15,17,17,16,16,17,17,19,17,17,17,19,18, - 13,14,13,17,16,14,15,15,17,17,13,15,13,17,16,17, - 17,17,19,19,15,17,15,19,17,16,17,17,18,18,16,16, - 17,17,19,17,18,17,19,19,18,17,19,17,19,19,19,19, - 20,19,15,17,15,19,16,17,17,16,19,18,16,17,15,18, - 16,19,19,19,20,19,17,19,16,19,16,11,14,14,17,17, - 15,14,16,16,18,15,16,14,18,16,18,18,19,18,21,18, - 19,18,20,18,13,15,14,18,17,14,14,16,16,18,16,17, - 16,19,17,17,17,19,17,22,19,19,19,21,19,13,14,15, - 17,18,17,16,17,17,19,14,16,14,18,16,19,19,19,20, - 21,18,18,16,20,17,17,18,16,19,18,15,17,17,19,19, - 19,19,18,21,19,18,17,20,17,21,22,21,20,21,21,17, - 16,19,18,20,19,18,19,18,20,16,17,16,19,18,21,20, - 21,19,23,18,19,16,20,17,13,14,14,17,16,14,14,15, - 16,18,14,16,14,17,16,16,16,17,17,19,16,17,16,19, - 17,14,15,15,17,17,14,14,16,16,17,15,16,16,18,17, - 16,16,17,17,19,17,18,17,19,18,14,15,14,17,16,16, - 16,16,17,17,14,16,14,17,16,18,18,18,18,19,16,17, - 15,19,16,17,17,17,18,18,16,15,17,17,18,18,18,18, - 19,19,17,16,18,16,19,19,19,19,19,19,16,17,16,19, - 16,18,18,17,19,18,16,17,16,19,16,19,19,20,19,19, - 17,18,16,20,16, -}; - -static const static_codebook _44p6_p5_0 = { - 5, 3125, - (char *)_vq_lengthlist__44p6_p5_0, - 1, -528744448, 1616642048, 3, 0, - (long *)_vq_quantlist__44p6_p5_0, - 0 -}; - -static const long _vq_quantlist__44p6_p5_1[] = { - 3, - 2, - 4, - 1, - 5, - 0, - 6, -}; - -static const char _vq_lengthlist__44p6_p5_1[] = { - 2, 3, 3, 3, 3, 3, 3, -}; - -static const static_codebook _44p6_p5_1 = { - 1, 7, - (char *)_vq_lengthlist__44p6_p5_1, - 1, -533200896, 1611661312, 3, 0, - (long *)_vq_quantlist__44p6_p5_1, - 0 -}; - -static const long _vq_quantlist__44p6_p6_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p6_p6_0[] = { - 1, 5, 5, 5, 7, 9, 5, 9, 7, 5, 7, 8, 7, 7,10, 9, - 10,10, 5, 8, 7, 9,10,10, 7,10, 7, 6, 9, 9, 9,10, - 12, 9,11,11, 9,10,11,11,11,13,12,13,13, 9,11,11, - 12,13,13,11,13,11, 6, 9, 9, 9,11,11, 9,12,10, 9, - 11,11,11,11,13,12,13,13, 9,11,10,12,13,13,11,13, - 11, 6, 9, 9, 9,11,12, 9,12,11, 9,10,11,10,10,13, - 12,13,13, 9,11,11,12,13,12,11,13,11, 7, 9,10, 9, - 10,12,10,12,11,10,10,12,10,10,12,12,12,13,10,11, - 11,12,12,13,10,12,10, 7,10,10,11,11,14,11,14,11, - 10,12,11,11,11,14,14,14,14,10,11,12,14,14,14,11, - 14,11, 6, 9, 9, 9,11,12, 9,12,11, 9,11,11,11,11, - 13,12,12,13, 9,11,10,12,13,13,10,13,10, 7,10,10, - 11,11,14,11,14,11,10,12,11,11,11,14,14,15,14,10, - 11,12,13,14,15,11,14,11, 7,10, 9,10,11,12, 9,12, - 10,10,11,11,10,10,12,12,13,12, 9,12,10,12,13,12, - 10,12,10, -}; - -static const static_codebook _44p6_p6_0 = { - 5, 243, - (char *)_vq_lengthlist__44p6_p6_0, - 1, -527106048, 1620377600, 2, 0, - (long *)_vq_quantlist__44p6_p6_0, - 0 -}; - -static const long _vq_quantlist__44p6_p6_1[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p6_p6_1[] = { - 2, 6, 6, 6, 7, 8, 6, 8, 7, 6, 7, 7, 7, 7, 8, 7, - 8, 8, 6, 7, 7, 7, 8, 8, 7, 8, 7, 6, 8, 8, 8, 9, - 9, 8, 9, 9, 8, 9, 9, 9, 9,10, 9,10,10, 8, 9, 9, - 9,10,10, 9,10, 9, 6, 8, 8, 8, 9, 9, 8, 9, 9, 8, - 9, 9, 9, 9,10, 9,10,10, 8, 9, 9, 9,10, 9, 9,10, - 9, 6, 8, 8, 8, 9, 9, 8, 9, 9, 8, 9, 9, 9, 9,10, - 9, 9,10, 8, 9, 9, 9,10, 9, 9,10, 9, 7, 8, 8, 8, - 9, 9, 8, 9, 9, 8, 8, 9, 9, 9, 9, 9, 9, 9, 8, 9, - 9, 9,10, 9, 9, 9, 9, 7, 9, 9, 9, 9,10, 9,10, 9, - 9, 9, 9, 9, 9,10,10,10,10, 9, 9, 9,10,10,10, 9, - 10, 9, 6, 8, 8, 8, 9, 9, 8, 9, 9, 8, 9, 9, 9, 9, - 10, 9,10,10, 8, 9, 9, 9,10, 9, 9,10, 9, 7, 9, 9, - 9, 9,10, 9,10, 9, 9, 9, 9, 9, 9,10,10,10,10, 9, - 9, 9,10,10,10, 9,10, 9, 7, 8, 8, 8, 9, 9, 8, 9, - 9, 8, 9, 9, 9, 9,10, 9, 9,10, 8, 9, 8, 9, 9, 9, - 9,10, 9, -}; - -static const static_codebook _44p6_p6_1 = { - 5, 243, - (char *)_vq_lengthlist__44p6_p6_1, - 1, -530841600, 1616642048, 2, 0, - (long *)_vq_quantlist__44p6_p6_1, - 0 -}; - -static const long _vq_quantlist__44p6_p7_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p6_p7_0[] = { - 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, -}; - -static const static_codebook _44p6_p7_0 = { - 5, 243, - (char *)_vq_lengthlist__44p6_p7_0, - 1, -513979392, 1633504256, 2, 0, - (long *)_vq_quantlist__44p6_p7_0, - 0 -}; - -static const long _vq_quantlist__44p6_p7_1[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p6_p7_1[] = { - 1, 4, 5, 5,10,10, 5,10,10, 5,10,10,10,10,10,10, - 10,10, 5,10,10,10,10,10,10,10,10, 7,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10, 6,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10, 6,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10, 9,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10, 9,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10, 6,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10, 9,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, 9,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11, - 11,11,11, -}; - -static const static_codebook _44p6_p7_1 = { - 5, 243, - (char *)_vq_lengthlist__44p6_p7_1, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44p6_p7_1, - 0 -}; - -static const long _vq_quantlist__44p6_p7_2[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const char _vq_lengthlist__44p6_p7_2[] = { - 1, 2, 3, 4, 5, 7, 7, 8, 8, 9, 9,10,10,11,11,12, - 12,13,13,14,14,15,15,15,15, -}; - -static const static_codebook _44p6_p7_2 = { - 1, 25, - (char *)_vq_lengthlist__44p6_p7_2, - 1, -518864896, 1620639744, 5, 0, - (long *)_vq_quantlist__44p6_p7_2, - 0 -}; - -static const long _vq_quantlist__44p6_p7_3[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const char _vq_lengthlist__44p6_p7_3[] = { - 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44p6_p7_3 = { - 1, 25, - (char *)_vq_lengthlist__44p6_p7_3, - 1, -529006592, 1611661312, 5, 0, - (long *)_vq_quantlist__44p6_p7_3, - 0 -}; - -static const char _huff_lengthlist__44p6_short[] = { - 2, 8,13,15,16,18,21,22, 5, 4, 6, 8,10,12,17,21, - 9, 5, 5, 6, 8,11,15,19,11, 6, 5, 5, 6, 7,12,14, - 14, 8, 7, 5, 4, 4, 9,11,16,11, 9, 7, 4, 3, 7,10, - 22,15,14,12, 8, 7, 9,11,21,16,15,12, 9, 5, 6, 8, -}; - -static const static_codebook _huff_book__44p6_short = { - 2, 64, - (char *)_huff_lengthlist__44p6_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p7_l0_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44p7_l0_0[] = { - 2, 4, 4, 7, 7, 8, 8,10,10,11,11,12,12, 4, 5, 5, - 7, 7, 9, 9,11, 9,12,11,12,12, 4, 5, 5, 7, 7, 9, - 9, 9,10,10,11,12,12, 7, 7, 7, 7, 8, 9, 8,11, 5, - 12, 6,12,10, 7, 7, 7, 8, 7, 8, 9, 5,11, 6,12,10, - 12, 8, 9, 9, 9, 9,10,10,11, 7,11, 7,12, 9, 8, 9, - 8, 9, 9,10,10, 7,11, 7,11, 9,11,10,10,10,10,10, - 10,10,11,10,11, 8,11, 9,10,10,10,10,10,10,10,10, - 11, 8,10, 9,11,10,11,11,11,11,11,10,11,10,12,10, - 12,11,10,11,11,11,11,10,11,10,11,10,12,11,12,11, - 12,12,12,12,12,12,12,12,12,12,13,12,11,12,11,12, - 12,12,12,12,11,12,11,12,13, -}; - -static const static_codebook _44p7_l0_0 = { - 2, 169, - (char *)_vq_lengthlist__44p7_l0_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44p7_l0_0, - 0 -}; - -static const long _vq_quantlist__44p7_l0_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p7_l0_1[] = { - 4, 4, 4, 5, 5, 4, 4, 5, 5, 5, 4, 5, 4, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44p7_l0_1 = { - 2, 25, - (char *)_vq_lengthlist__44p7_l0_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p7_l0_1, - 0 -}; - -static const long _vq_quantlist__44p7_l1_0[] = { - 54, - 29, - 79, - 0, - 108, -}; - -static const char _vq_lengthlist__44p7_l1_0[] = { - 1, 2, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _44p7_l1_0 = { - 2, 25, - (char *)_vq_lengthlist__44p7_l1_0, - 1, -514516992, 1620639744, 7, 0, - (long *)_vq_quantlist__44p7_l1_0, - 0 -}; - -static const char _huff_lengthlist__44p7_lfe[] = { - 2, 3, 1, 3, -}; - -static const static_codebook _huff_book__44p7_lfe = { - 2, 4, - (char *)_huff_lengthlist__44p7_lfe, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44p7_long[] = { - 2, 7,14,16,17,17,18,20, 6, 3, 5, 8,10,11,13,15, - 13, 5, 3, 5, 8, 9,11,12,15, 7, 4, 3, 5, 7, 9,11, - 16,10, 7, 5, 6, 7, 9,10,17,11, 8, 7, 7, 6, 8, 8, - 19,13,11, 9, 9, 8, 8, 9,20,14,13,11,10, 8, 9, 9, -}; - -static const static_codebook _huff_book__44p7_long = { - 2, 64, - (char *)_huff_lengthlist__44p7_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p7_p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p7_p1_0[] = { - 2, 5, 5, 4, 7, 7, 4, 7, 7, 5, 7, 7, 7, 8, 9, 7, - 9, 9, 5, 7, 7, 7, 9, 9, 7, 9, 8, 6, 7, 8, 8, 9, - 10, 8, 9,10, 8, 9,10,10,10,12,10,11,11, 8,10,10, - 10,11,12,10,11,11, 6, 8, 7, 8,10, 9, 8,10, 9, 8, - 10,10,10,11,11,10,12,11, 8,10, 9,10,11,11,10,12, - 10, 5, 8, 8, 8,10,10, 8,10,10, 7, 9,10, 9,10,11, - 9,11,11, 8,10,10,10,11,12,10,12,11, 7, 9, 9, 9, - 10,11, 9,11,11, 9, 9,11,10,11,12,11,11,12, 9,11, - 11,11,12,12,11,12,12, 7, 9, 9,10,11,11,10,12,11, - 9,11,10,11,11,12,11,13,12,10,11,11,12,13,13,11, - 13,11, 5, 8, 8, 8,10,10, 8,10,10, 8,10,10,10,11, - 12,10,12,11, 7,10, 9, 9,11,11, 9,11,10, 7, 9, 9, - 10,11,12,10,11,11,10,11,11,11,11,13,12,13,13, 9, - 10,11,11,12,13,11,12,11, 7, 9, 9, 9,11,11, 9,11, - 10, 9,11,11,11,12,12,11,12,12, 9,11, 9,11,12,11, - 10,12,11, -}; - -static const static_codebook _44p7_p1_0 = { - 5, 243, - (char *)_vq_lengthlist__44p7_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p7_p1_0, - 0 -}; - -static const long _vq_quantlist__44p7_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p7_p2_0[] = { - 4, 6, 6, 9, 9, 6, 8, 8,10,10, 6, 8, 8,10,10, 8, - 10,10,12,13, 8,10,10,13,12, 6, 8, 8,10,10, 8, 8, - 9,10,11, 8, 9, 9,11,11,10,10,11,12,13,10,11,11, - 13,13, 6, 8, 8,10,10, 8, 9, 9,11,11, 8, 9, 8,11, - 10,10,11,11,13,13,10,11,10,13,12, 9,10,10,12,12, - 10,10,11,12,13,10,11,11,13,13,12,12,13,12,15,13, - 13,13,15,14, 9,10,10,12,12,10,11,11,13,13,10,11, - 10,13,12,12,13,13,14,15,12,13,12,15,12, 6, 8, 8, - 10,11, 8, 9,10,11,12, 8, 9, 9,11,11,10,11,12,13, - 14,10,11,11,13,13, 8, 9, 9,11,12, 9,10,11,12,13, - 9,10,10,12,13,11,12,13,13,15,11,12,12,14,14, 8, - 9, 9,11,12, 9,10,11,12,13, 9,10,10,13,12,11,12, - 13,14,15,11,12,12,14,13,10,11,12,13,14,11,12,13, - 13,15,12,13,13,14,14,13,13,14,14,16,14,15,14,16, - 15,10,12,11,14,13,12,12,13,14,14,11,12,12,14,14, - 14,14,15,15,16,13,14,14,16,14, 6, 8, 8,11,10, 8, - 9, 9,11,11, 8,10, 9,12,11,10,11,11,13,13,10,12, - 11,14,13, 8, 9, 9,12,11, 9,10,10,12,13, 9,11,10, - 13,12,11,12,12,14,14,11,13,12,15,14, 8, 9, 9,12, - 11, 9,10,10,13,12, 9,11,10,13,12,11,12,12,14,14, - 11,13,12,15,13,10,11,12,13,14,11,12,13,13,14,12, - 13,12,14,14,13,13,14,14,16,14,15,14,16,16,10,12, - 11,14,13,12,13,13,14,14,11,13,12,15,13,14,14,15, - 16,16,13,14,13,16,14, 9,10,11,12,13,11,11,12,13, - 14,11,11,12,13,14,13,13,14,14,16,13,14,14,15,15, - 11,11,12,13,14,12,12,13,13,15,12,13,13,14,15,14, - 14,15,15,17,14,14,15,16,16,11,12,12,13,14,12,12, - 13,14,15,12,13,12,14,15,14,14,15,15,17,14,15,14, - 16,16,13,14,14,15,16,14,14,15,15,17,14,15,15,16, - 16,15,16,17,16,18,16,17,16,17,17,13,14,14,16,15, - 14,15,15,16,16,14,15,14,16,15,16,16,17,17,18,16, - 16,16,17,16, 9,11,10,13,12,11,12,11,14,13,11,12, - 11,14,13,13,14,14,16,15,13,14,13,16,14,11,12,12, - 14,13,12,12,13,14,14,12,13,13,15,14,14,14,15,16, - 16,14,15,14,17,15,11,12,11,14,13,12,13,13,15,14, - 12,13,12,15,13,14,15,14,16,16,14,15,14,17,15,13, - 14,14,15,16,14,14,15,16,16,14,15,15,16,16,15,16, - 16,16,17,16,16,16,17,17,13,14,14,16,15,14,15,15, - 17,16,14,15,14,17,15,16,17,17,17,17,16,16,16,18, - 16, 6, 8, 8,11,11, 8, 9, 9,11,12, 8, 9, 9,12,11, - 10,11,11,13,14,10,11,11,14,13, 8, 9, 9,11,12, 9, - 10,10,12,13, 9,10,10,13,12,11,11,12,13,15,11,12, - 12,15,14, 8, 9, 9,12,11, 9,10,11,12,13, 9,11,10, - 13,12,11,12,12,14,15,11,13,12,15,14,10,11,11,13, - 14,11,12,12,13,14,11,12,12,14,14,13,13,14,14,16, - 13,14,14,16,15,11,12,11,14,13,12,13,13,14,14,11, - 13,12,14,13,14,14,15,16,16,13,14,14,16,14, 8, 9, - 9,11,12, 9,10,10,12,13, 9,10,10,13,12,11,12,12, - 14,15,11,12,12,14,14, 9, 9,10,11,13,10,10,12,12, - 14,10,10,11,13,13,12,12,13,14,16,12,12,13,15,15, - 9,10,10,13,12,10,11,11,13,14,10,12,11,14,13,12, - 13,13,15,15,12,13,13,15,15,11,11,12,13,15,12,12, - 13,13,15,12,13,13,14,15,14,14,15,15,17,14,15,15, - 16,16,11,13,12,15,14,13,13,13,15,15,12,14,13,15, - 14,15,15,15,16,16,14,15,15,17,15, 7, 9, 9,12,11, - 9,10,10,12,12, 9,11,10,13,12,11,12,12,14,14,11, - 13,12,15,14, 9,10,10,12,12,10,10,11,12,13,10,11, - 11,14,13,12,12,13,14,15,12,13,13,15,14, 9,10,10, - 12,12,10,11,11,13,13,10,11,10,14,12,12,13,13,15, - 15,12,13,12,15,13,11,12,12,14,14,12,12,13,14,15, - 12,13,13,15,15,14,13,14,13,16,14,15,15,16,16,11, - 12,12,14,14,13,13,14,15,15,12,13,12,15,14,15,15, - 15,16,16,14,15,14,17,14,10,11,12,13,14,11,12,13, - 14,15,11,12,12,14,15,13,14,15,15,17,14,14,14,16, - 16,11,12,13,12,15,12,12,14,13,16,13,13,14,13,16, - 14,14,15,14,17,15,15,15,15,17,11,13,12,15,15,13, - 13,14,15,16,12,14,13,16,15,15,15,15,17,17,15,15, - 15,17,16,14,14,15,14,16,14,14,16,14,17,15,15,15, - 14,17,16,16,17,15,18,17,17,17,16,18,14,15,15,17, - 16,15,16,16,17,17,15,16,15,17,16,17,17,17,18,18, - 16,17,16,18,17,10,11,11,14,13,11,12,12,14,14,11, - 13,12,15,14,14,14,14,16,16,14,15,14,16,15,11,12, - 12,15,13,12,13,13,15,14,13,14,13,16,14,14,15,15, - 16,16,15,16,15,17,16,11,13,12,15,14,13,13,14,15, - 15,12,14,13,16,14,15,15,15,17,17,14,16,15,17,16, - 14,14,14,16,15,14,15,15,16,16,15,16,15,17,16,16, - 16,16,16,17,16,17,17,18,17,14,15,15,16,16,15,15, - 16,17,16,14,15,15,17,16,17,17,17,18,18,16,17,16, - 18,16, 6, 8, 8,11,11, 8, 9, 9,11,12, 8, 9, 9,12, - 11,10,11,12,13,14,10,11,11,14,13, 8, 9, 9,11,12, - 9,10,11,12,13, 9,11,10,13,12,11,12,13,14,15,11, - 12,12,15,14, 8, 9, 9,12,11, 9,10,10,12,13, 9,10, - 10,13,12,11,12,12,14,15,11,12,12,14,13,11,11,12, - 13,14,11,12,13,13,15,12,13,13,14,14,13,14,14,14, - 16,14,15,14,16,16,10,11,11,14,13,11,12,12,14,14, - 11,12,12,14,13,13,14,14,15,16,13,14,13,16,14, 7, - 9, 9,11,11, 9,10,11,12,13, 9,10,10,12,12,11,12, - 13,14,15,11,12,12,14,14, 9,10,10,12,12,10,10,11, - 12,13,10,11,11,13,13,12,12,13,13,15,12,13,13,15, - 15, 9,10,10,12,12,10,11,11,13,13,10,11,10,13,12, - 12,13,13,14,15,12,13,12,15,13,11,12,12,14,14,12, - 12,13,14,15,13,14,13,15,15,14,13,15,13,16,15,15, - 15,16,16,11,12,12,14,14,12,13,13,14,15,12,13,12, - 15,14,14,15,15,16,17,13,14,13,16,13, 8, 9, 9,12, - 11, 9,10,10,12,13, 9,10,10,13,12,11,12,12,14,15, - 11,12,12,15,14, 9,10,10,12,13,10,11,12,13,14,10, - 11,11,14,13,12,13,13,15,15,12,13,13,15,15, 9,10, - 9,13,11,10,11,10,13,13,10,12,10,14,12,12,13,12, - 15,15,12,13,12,15,14,11,12,13,14,15,12,13,14,14, - 15,13,13,13,15,15,14,15,15,15,17,15,15,15,16,16, - 11,12,11,15,13,12,13,13,15,14,12,13,12,16,13,14, - 15,15,16,16,14,15,14,17,14,10,11,11,13,14,11,12, - 13,14,15,11,12,12,14,14,14,14,15,15,17,14,14,14, - 15,16,11,12,13,14,15,12,13,14,14,16,13,14,13,15, - 15,14,15,16,15,17,15,15,15,17,17,11,12,12,13,15, - 13,13,14,14,16,12,13,13,14,15,15,15,15,16,17,14, - 15,15,16,16,14,15,15,16,16,14,15,15,16,17,15,15, - 16,16,17,16,16,17,16,18,17,17,17,18,18,14,14,15, - 15,16,15,15,15,16,17,14,15,15,16,16,16,17,17,17, - 18,16,16,16,17,16,10,11,11,14,13,11,13,12,15,14, - 11,13,12,15,14,14,15,14,16,16,13,15,14,17,15,11, - 12,13,15,15,12,13,14,15,16,13,14,13,16,15,15,15, - 15,16,17,15,15,15,17,16,11,13,11,15,12,13,14,13, - 16,13,12,14,12,16,13,15,15,15,17,15,14,16,14,17, - 14,14,15,15,16,17,15,15,16,16,17,15,16,15,17,17, - 16,16,17,17,18,16,17,17,18,18,14,15,14,17,13,15, - 16,15,17,15,15,16,15,17,14,16,17,16,18,16,16,17, - 16,18,15, 9,11,11,13,13,10,12,12,14,14,11,12,12, - 14,14,13,14,14,15,16,13,14,14,16,16,10,11,12,14, - 14,11,12,13,14,15,11,13,13,15,15,13,14,14,15,16, - 14,15,15,16,16,11,12,12,14,14,12,13,13,15,15,12, - 13,12,15,14,14,15,15,16,16,14,15,14,17,16,12,13, - 13,15,16,13,13,14,15,16,13,14,14,16,16,14,15,16, - 16,17,15,16,16,17,17,13,14,14,16,15,14,15,15,17, - 16,14,15,14,17,15,16,16,17,17,17,16,16,16,18,16, - 10,11,12,14,14,11,12,13,14,15,11,13,12,15,15,13, - 14,15,16,16,14,15,15,17,16,11,11,13,14,15,12,12, - 14,14,16,12,13,14,15,15,14,14,15,16,17,15,15,15, - 17,17,12,13,12,15,15,13,14,14,16,15,13,14,13,16, - 15,15,16,15,17,17,15,16,15,17,16,13,12,15,14,16, - 14,13,15,14,17,14,13,15,15,17,15,14,17,15,18,16, - 15,17,17,18,14,15,15,17,16,15,16,16,17,17,15,16, - 15,17,16,16,17,17,18,18,16,17,16,18,17,10,11,11, - 14,14,11,12,12,14,15,11,13,12,15,14,13,14,14,16, - 16,14,15,14,16,16,11,12,12,14,14,12,12,13,15,15, - 12,13,13,15,15,14,14,15,16,16,14,15,15,17,16,11, - 12,12,15,15,13,13,13,15,15,12,13,13,15,15,15,15, - 15,17,17,14,15,15,17,16,13,14,13,16,15,14,14,14, - 16,16,14,15,14,17,16,15,15,16,16,17,16,17,16,18, - 17,14,15,15,16,16,15,15,15,17,17,14,15,15,17,16, - 16,17,17,18,18,16,17,16,18,16,12,13,13,15,15,13, - 14,14,16,16,13,14,14,16,16,14,15,16,16,18,15,16, - 16,17,17,13,13,14,14,16,14,14,15,15,17,14,14,15, - 15,17,15,15,17,15,18,16,16,17,17,18,13,14,14,16, - 16,14,15,15,16,17,14,15,15,17,16,16,17,16,17,18, - 16,17,16,18,17,15,14,16,13,18,16,15,17,14,18,16, - 15,17,14,18,17,16,18,15,19,17,17,18,16,19,15,16, - 16,17,17,16,17,17,18,18,16,17,16,18,17,18,18,18, - 19,18,17,18,17,19,17,11,12,12,15,15,13,13,14,15, - 16,13,14,13,16,15,15,15,15,16,17,15,16,15,17,16, - 12,13,13,15,15,13,13,14,15,16,14,15,14,16,15,15, - 15,16,16,17,16,16,16,18,17,12,13,13,15,15,14,14, - 15,16,16,13,14,13,16,15,16,16,16,17,17,15,16,15, - 18,16,15,15,15,17,15,14,15,15,16,16,16,17,16,17, - 16,16,16,17,16,17,17,18,17,19,18,15,15,16,17,17, - 16,16,16,17,17,15,16,15,17,16,17,18,18,18,18,16, - 17,16,18,16, 9,11,11,13,13,11,12,12,14,14,10,12, - 12,14,14,13,14,14,15,16,13,14,14,16,15,11,12,12, - 14,14,12,12,13,14,15,12,13,13,15,15,14,14,15,16, - 17,14,15,15,16,16,10,12,11,14,14,11,13,13,15,15, - 11,13,12,15,14,14,14,15,16,16,13,14,14,16,15,13, - 14,14,15,16,14,14,15,15,17,14,15,15,16,17,16,16, - 16,16,18,16,16,17,17,17,12,13,13,16,15,13,14,14, - 16,16,12,14,13,16,15,15,16,16,17,17,14,16,15,17, - 16,10,11,11,14,14,11,12,13,14,15,11,12,12,15,14, - 14,14,15,16,16,13,14,14,16,16,11,12,12,14,15,12, - 13,14,15,15,13,13,13,15,15,14,15,15,16,17,15,15, - 15,16,17,11,12,12,14,14,12,13,13,15,15,12,13,12, - 15,15,14,15,15,16,17,14,15,14,16,16,14,14,15,16, - 16,14,15,15,16,17,15,16,15,17,17,16,16,17,16,18, - 16,17,17,18,18,13,13,14,15,16,14,14,15,16,17,14, - 14,14,16,15,16,16,17,17,18,15,16,15,17,16,10,12, - 11,14,14,11,13,13,15,15,11,13,12,15,15,14,15,15, - 16,16,13,15,14,16,16,12,12,13,15,15,13,13,14,15, - 16,13,14,14,16,15,15,15,16,16,17,15,15,15,17,17, - 11,13,11,15,14,12,14,13,16,15,12,14,12,16,14,15, - 15,15,17,17,14,15,14,17,15,14,15,15,16,17,15,15, - 16,16,17,15,16,16,17,17,16,16,17,17,18,16,17,17, - 18,18,13,14,12,16,14,14,15,13,17,15,14,15,13,17, - 14,16,17,15,18,17,15,17,14,18,15,11,12,12,14,15, - 13,13,14,15,16,13,14,13,16,15,15,15,16,16,17,15, - 15,15,16,16,12,13,13,15,15,13,13,14,15,16,14,15, - 14,16,16,15,15,16,16,18,16,16,16,18,17,12,13,13, - 15,15,14,14,15,15,16,13,14,13,15,15,16,16,16,17, - 18,15,16,15,17,16,15,16,15,17,16,15,15,16,16,17, - 16,17,16,17,17,16,16,17,16,18,17,18,18,18,18,14, - 15,15,15,17,16,15,17,16,17,14,15,15,16,16,17,17, - 18,18,19,16,16,16,17,16,12,13,13,15,15,13,14,14, - 16,16,13,14,14,16,16,15,16,16,17,17,15,16,15,18, - 16,13,14,14,16,16,14,15,15,16,17,14,15,15,17,16, - 16,16,17,17,18,16,17,16,18,18,13,14,13,16,14,14, - 15,14,17,15,14,15,14,17,14,16,17,16,18,17,15,17, - 15,18,15,15,16,16,17,18,16,16,17,17,18,16,17,17, - 17,18,17,17,18,18,19,17,18,18,19,18,15,16,14,17, - 13,16,17,15,18,14,16,17,15,18,14,18,18,17,19,16, - 17,18,16,19,15, -}; - -static const static_codebook _44p7_p2_0 = { - 5, 3125, - (char *)_vq_lengthlist__44p7_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p7_p2_0, - 0 -}; - -static const long _vq_quantlist__44p7_p3_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p7_p3_0[] = { - 2, 5, 5, 4, 7, 7, 4, 7, 7, 5, 7, 8, 7, 8,10, 8, - 9, 9, 5, 7, 7, 8, 9, 9, 7,10, 8, 5, 7, 8, 8, 9, - 10, 8,10,10, 8, 9,10,10,10,12,10,12,12, 8,10,10, - 10,12,12,10,12,11, 5, 8, 7, 8,10,10, 8,10, 9, 8, - 10,10,10,11,12,10,12,12, 8,10, 9,10,12,12,10,12, - 10, 5, 8, 8, 7,10,10, 8,10,10, 7, 9,10, 9,10,12, - 10,12,12, 8,10,10,10,12,12,10,12,11, 7, 9,10, 9, - 11,12,10,12,11, 9, 9,12,11,10,14,12,12,13,10,12, - 11,12,13,13,11,14,12, 7,10, 9,10,11,11,10,12,11, - 9,11,11,11,11,13,12,14,13,10,12,12,12,14,14,11, - 14,12, 5, 8, 8, 8,10,10, 7,10,10, 8,10,10,10,11, - 12,10,12,12, 7,10, 9,10,12,12, 9,12,10, 7, 9,10, - 10,11,12,10,11,11,10,12,12,11,12,14,12,14,14, 9, - 11,11,12,13,14,11,13,11, 7,10, 9,10,11,12, 9,12, - 11,10,11,12,11,12,14,12,13,13, 9,12, 9,12,13,12, - 11,14,10, -}; - -static const static_codebook _44p7_p3_0 = { - 5, 243, - (char *)_vq_lengthlist__44p7_p3_0, - 1, -533200896, 1614282752, 2, 0, - (long *)_vq_quantlist__44p7_p3_0, - 0 -}; - -static const long _vq_quantlist__44p7_p3_1[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p7_p3_1[] = { - 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 7, 8, 8, 7, - 8, 8, 7, 8, 7, 7, 8, 8, 7, 8, 8, 7, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 8, 9, 8, 8, 8, - 8, 8, 8, 8, 9, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 9, 8, 8, 8, 8, 8, 8, 8, 9, 8, 8, 9, - 8, 7, 8, 8, 7, 8, 8, 7, 8, 8, 7, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 9, 8, 8, 9, 8, 7, 8, 8, 8, - 8, 9, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, 8, - 8, 9, 9, 9, 8, 9, 9, 7, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, - 9, 8, 7, 8, 8, 7, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, - 9, 8, 8, 9, 7, 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, - 8, 8, 8, 9, 9, 8, 9, 8, 7, 8, 8, 8, 8, 8, 8, 9, - 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 8, 8, 8, 8, 9, 9, - 8, 9, 8, -}; - -static const static_codebook _44p7_p3_1 = { - 5, 243, - (char *)_vq_lengthlist__44p7_p3_1, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p7_p3_1, - 0 -}; - -static const long _vq_quantlist__44p7_p4_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p7_p4_0[] = { - 1, 5, 5, 5, 7, 8, 5, 8, 7, 5, 7, 8, 7, 8,10, 8, - 10,10, 5, 8, 7, 8,10,10, 7,10, 8, 6, 8, 9, 9,10, - 12, 9,11,11, 9,10,11,11,11,13,11,13,13, 9,11,11, - 11,12,13,11,13,11, 6, 9, 8, 9,11,11, 9,12,10, 9, - 11,11,11,11,13,11,13,13, 9,11,10,11,13,13,11,13, - 11, 6, 9, 9, 8,10,11, 9,12,11, 8,10,11,10,11,13, - 11,13,13, 9,11,11,11,13,12,11,13,11, 8,10,10, 9, - 11,12,10,12,12,10,10,12,11,11,14,12,13,14,10,12, - 12,12,13,13,11,14,11, 8,11,10,11,12,13,11,14,12, - 10,12,11,11,12,14,13,15,14,10,12,12,13,14,15,12, - 14,12, 5, 9, 9, 9,11,12, 8,11,10, 9,11,11,11,11, - 13,11,12,13, 8,11,10,11,13,13,10,13,11, 8,10,11, - 11,12,14,11,13,12,10,12,12,12,12,14,14,15,14,10, - 11,12,13,14,15,11,14,12, 8,10,10,10,12,12, 9,12, - 11,10,12,12,11,11,14,12,13,13,10,12,10,12,14,13, - 11,13,11, -}; - -static const static_codebook _44p7_p4_0 = { - 5, 243, - (char *)_vq_lengthlist__44p7_p4_0, - 1, -531365888, 1616117760, 2, 0, - (long *)_vq_quantlist__44p7_p4_0, - 0 -}; - -static const long _vq_quantlist__44p7_p4_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p7_p4_1[] = { - 7, 8, 8,10,10, 8, 9, 9,10,11, 8, 9, 9,10,10, 9, - 10,10,11,11, 9,10,10,11,11, 8, 9, 9,10,10, 9, 9, - 10,11,11, 9,10,10,11,11,10,10,11,11,11,10,11,11, - 11,11, 8, 9, 9,10,10, 9,10,10,11,11, 9,10, 9,11, - 11,10,11,11,11,11,10,11,10,11,11,10,10,10,11,11, - 10,11,11,11,11,10,11,11,11,11,11,11,11,11,12,11, - 11,11,11,12,10,10,10,11,11,10,11,11,11,11,10,11, - 11,11,11,11,11,11,12,11,11,11,11,12,11, 8, 9,10, - 11,11, 9,10,11,11,11, 9,10,10,11,11,10,11,11,12, - 12,10,11,11,12,12,10,10,10,11,11,10,10,11,11,12, - 10,11,11,12,12,11,11,12,12,12,11,11,12,12,12,10, - 10,10,11,11,10,11,11,12,12,10,11,11,12,11,11,12, - 12,12,12,11,12,11,12,12,11,11,11,11,12,11,11,12, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,11,11,11,12,12,11,12,12,12,12,11,12,11,12,12, - 12,12,12,12,12,12,12,12,12,12, 8,10, 9,11,11, 9, - 10,10,11,11, 9,10,10,11,11,10,11,11,12,12,10,11, - 11,12,12,10,10,10,11,11,10,11,11,12,12,10,11,11, - 12,12,11,11,12,12,12,11,12,12,12,12,10,10,10,11, - 11,10,11,11,12,12,10,11,10,12,11,11,12,11,12,12, - 11,12,11,12,12,11,11,11,12,12,11,12,12,12,12,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,11,11, - 11,12,11,11,12,12,12,12,11,12,11,12,12,12,12,12, - 12,12,12,12,12,12,12,10,11,11,11,12,11,11,12,12, - 12,11,11,11,12,12,11,12,12,12,12,11,12,12,12,12, - 11,11,12,12,12,11,12,12,12,12,12,12,12,12,12,12, - 12,13,12,13,12,12,12,13,13,11,12,11,12,12,11,12, - 12,12,12,11,12,12,12,12,12,12,12,13,13,12,12,12, - 13,13,12,12,12,12,12,12,12,12,12,13,12,12,13,13, - 13,12,13,13,13,13,12,13,13,13,13,12,12,12,12,12, - 12,12,13,13,13,12,12,12,13,12,12,13,13,13,13,12, - 13,13,13,13,10,11,11,12,11,11,11,11,12,12,11,12, - 11,12,12,11,12,12,12,12,11,12,12,12,12,11,11,11, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,13, - 13,12,12,12,13,13,11,12,11,12,12,12,12,12,12,12, - 11,12,11,12,12,12,12,12,13,13,12,12,12,13,12,12, - 12,12,12,12,12,12,12,13,13,12,12,12,13,13,12,13, - 13,13,13,12,13,13,13,13,12,12,12,12,12,12,12,12, - 13,13,12,13,12,13,12,12,13,13,13,13,13,13,13,13, - 13, 8,10,10,11,11, 9,10,10,11,11, 9,10,10,11,11, - 10,11,11,12,12,10,11,11,12,12, 9,10,10,11,11,10, - 10,11,11,12,10,11,11,12,12,11,11,12,12,12,11,11, - 12,12,12,10,10,10,11,11,10,11,11,12,12,10,11,10, - 12,11,11,12,11,12,12,11,12,11,12,12,11,11,11,12, - 12,11,11,12,12,12,11,12,12,12,12,11,12,12,12,12, - 12,12,12,12,12,11,11,11,12,11,11,12,12,12,12,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12, 9,10, - 10,11,11,10,11,11,11,12,10,11,11,12,12,11,11,11, - 12,12,11,11,11,12,12,10,10,11,11,12,11,11,12,12, - 12,11,11,11,12,12,11,11,12,12,12,11,12,12,12,12, - 10,11,11,12,12,11,11,11,12,12,11,12,11,12,12,11, - 12,12,12,12,11,12,12,12,12,11,11,12,12,12,11,12, - 12,12,12,12,12,12,12,12,12,12,12,12,13,12,12,12, - 12,13,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,13,12, 9,10,10,11,11, - 10,11,11,12,12,10,11,11,12,11,11,12,11,12,12,11, - 12,11,12,12,10,11,11,12,12,11,11,11,12,12,11,12, - 11,12,12,11,12,12,12,12,12,12,12,12,12,10,11,11, - 12,12,11,12,11,12,12,11,12,11,12,12,12,12,12,13, - 12,12,12,12,12,12,11,12,11,12,12,11,12,12,12,12, - 12,12,12,12,12,12,12,12,12,13,12,12,12,12,13,11, - 12,12,12,12,12,12,12,13,12,11,12,12,12,12,12,12, - 12,13,12,12,12,12,13,12,10,11,11,12,12,11,12,12, - 12,12,11,12,12,12,12,12,12,12,12,13,12,12,12,13, - 13,11,11,12,12,12,12,12,12,12,13,12,12,12,12,12, - 12,12,13,12,13,12,12,13,13,13,11,12,12,12,12,12, - 12,12,13,13,12,12,12,13,12,12,13,12,13,13,12,13, - 12,13,13,12,12,12,12,12,12,12,13,12,13,12,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,12,12,12,13, - 13,12,13,13,13,13,12,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,10,11,11,12,12,11,12,12,12,12,11, - 12,12,12,12,12,12,12,13,13,12,12,12,13,13,11,12, - 12,12,12,12,12,12,12,13,12,12,12,13,12,12,12,13, - 13,13,12,13,13,13,13,11,12,12,12,12,12,12,12,13, - 13,12,12,12,13,12,12,13,13,13,13,12,13,12,13,13, - 12,12,12,12,12,12,13,13,13,13,12,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,12,12,12,13,12,12,13, - 13,13,13,12,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13, 8,10,10,11,11, 9,10,10,11,11, 9,10,10,11, - 11,10,11,11,12,12,10,11,11,12,12,10,10,10,11,11, - 10,11,11,11,12,10,11,11,12,12,11,11,12,12,12,11, - 11,12,12,12, 9,10,10,11,11,10,11,11,12,12,10,11, - 10,12,11,11,12,11,12,12,11,12,11,12,12,11,11,11, - 12,12,11,11,12,12,12,11,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,11,11,11,12,11,11,12,12,12,12, - 11,12,11,12,12,12,12,12,12,12,12,12,12,12,12, 9, - 10,10,11,11,10,11,11,12,12,10,11,11,12,12,11,11, - 12,12,12,11,12,12,12,12,10,11,11,12,12,11,11,12, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,10,11,11,12,12,11,11,12,12,12,11,11,11,12,12, - 12,12,12,12,12,11,12,12,12,12,11,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,13,12,13,12,12, - 12,13,12,11,12,12,12,12,12,12,12,12,12,11,12,12, - 12,12,12,12,12,13,12,12,12,12,13,12, 9,10,10,11, - 11,10,11,11,12,12,10,11,11,12,12,11,11,11,12,12, - 11,12,11,12,12,10,11,11,12,12,11,11,12,12,12,11, - 11,11,12,12,11,12,12,12,12,11,12,12,12,12,10,11, - 10,12,11,11,11,11,12,12,11,12,11,12,12,11,12,12, - 12,12,11,12,11,12,12,11,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,13,12,12,12,12,13, - 11,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12, - 12,12,13,12,12,12,12,13,12,10,11,11,12,12,11,12, - 12,12,12,11,12,12,12,12,12,12,12,13,13,12,12,12, - 13,13,11,12,12,12,12,12,12,12,12,13,12,12,12,13, - 13,12,12,13,13,13,12,13,13,13,13,11,12,12,12,12, - 12,12,12,12,13,12,12,12,12,12,12,13,13,13,13,12, - 13,12,13,13,12,12,12,12,13,12,13,13,13,13,12,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,12,12,12, - 12,12,12,13,13,13,13,12,13,12,13,13,13,13,13,13, - 13,13,13,13,13,13,11,11,11,12,12,11,12,12,12,12, - 11,12,12,12,12,12,12,12,13,13,12,12,12,13,12,11, - 12,12,12,12,12,12,12,13,13,12,12,12,13,13,12,12, - 13,13,13,12,13,13,13,13,11,12,11,12,12,12,12,12, - 13,12,12,12,12,13,12,12,13,12,13,13,12,13,12,13, - 12,12,12,12,12,13,12,12,13,13,13,12,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,12,12,12,12,12,12, - 13,13,13,13,12,13,12,13,12,13,13,13,13,13,13,13, - 13,13,13,10,11,11,12,12,10,11,11,12,12,10,11,11, - 12,12,11,12,12,12,12,11,12,12,12,12,11,11,11,12, - 12,11,11,12,12,12,11,12,12,12,12,12,12,12,13,13, - 12,12,12,13,13,11,11,11,12,12,11,12,12,12,12,11, - 12,11,13,12,12,12,12,13,13,12,12,12,13,13,11,12, - 12,12,12,12,12,12,12,13,12,12,12,13,13,12,12,13, - 13,13,12,13,12,13,13,11,12,12,12,12,12,12,12,13, - 12,12,12,12,13,12,12,13,13,13,13,12,13,13,13,13, - 10,11,11,12,12,11,12,12,12,12,11,12,12,12,12,12, - 12,12,13,13,12,12,12,13,13,11,11,12,12,12,11,12, - 12,12,13,12,12,12,13,13,12,12,13,13,13,12,12,13, - 13,13,11,12,12,12,12,12,12,12,13,13,12,12,12,13, - 13,12,13,13,13,13,12,13,12,13,13,12,12,12,12,13, - 12,12,13,12,13,12,12,13,13,13,12,12,13,13,13,12, - 13,13,13,13,12,12,12,12,13,12,12,13,13,13,12,12, - 12,13,13,13,13,13,13,13,12,13,13,13,13,10,11,11, - 12,12,11,12,12,12,12,11,12,12,12,12,12,12,12,13, - 13,12,12,12,13,13,11,12,12,12,12,11,12,12,12,13, - 12,12,12,13,13,12,12,13,13,13,12,13,13,13,13,11, - 12,12,12,12,12,12,12,13,13,12,12,12,13,12,12,13, - 12,13,13,12,13,12,13,13,12,12,12,12,12,12,12,12, - 13,13,12,13,12,13,13,12,13,13,13,13,13,13,13,13, - 13,12,12,12,13,12,12,13,13,13,13,12,13,12,13,13, - 13,13,13,13,13,13,13,13,13,13,11,11,11,12,12,11, - 12,12,12,12,11,12,12,12,12,12,12,12,13,13,12,12, - 12,13,13,11,12,12,12,12,12,12,12,12,13,12,12,12, - 13,13,12,12,13,13,13,12,12,13,13,13,11,12,12,12, - 12,12,12,12,13,13,12,12,12,13,13,12,13,13,13,13, - 12,13,12,13,13,12,12,12,12,12,12,12,13,12,13,12, - 13,13,13,13,12,13,13,12,13,13,13,13,13,13,12,12, - 12,12,12,12,13,13,13,13,12,13,12,13,13,13,13,13, - 13,13,13,13,13,13,13,10,11,11,12,12,11,12,12,12, - 13,11,12,12,13,12,12,12,12,13,13,12,12,12,13,13, - 11,12,12,12,12,12,12,12,13,13,12,13,12,13,13,12, - 12,13,13,13,12,13,13,13,13,11,12,12,12,13,12,12, - 12,13,13,12,12,12,13,12,12,13,13,13,13,12,13,12, - 13,13,12,12,12,12,12,12,12,13,13,13,12,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,12,12,12,13,12, - 12,13,13,13,13,12,13,12,13,13,13,13,13,13,13,13, - 13,13,13,13,10,11,11,12,12,10,11,11,12,12,10,11, - 11,12,12,11,12,12,12,12,11,12,12,12,12,11,11,11, - 12,12,11,11,12,12,13,11,12,12,12,12,12,12,12,13, - 13,12,12,12,13,13,10,11,11,12,12,11,12,12,12,12, - 11,12,11,12,12,12,12,12,13,13,12,12,12,13,12,11, - 12,12,12,12,12,12,12,12,13,12,12,12,13,13,12,12, - 13,13,13,12,13,13,13,13,11,12,12,12,12,12,12,12, - 13,13,12,12,12,13,12,12,13,13,13,13,12,13,12,13, - 13,10,11,11,12,12,11,12,12,12,12,11,12,12,12,12, - 12,12,12,13,13,12,12,12,13,13,11,12,12,12,12,12, - 12,12,12,13,12,12,12,13,13,12,12,13,13,13,12,12, - 13,13,13,11,12,12,12,12,12,12,12,13,13,11,12,12, - 13,12,12,13,13,13,13,12,13,12,13,13,12,12,12,12, - 13,12,12,13,13,13,12,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,12,12,12,13,12,12,12,13,13,13,12, - 12,12,13,13,13,13,13,13,13,12,13,13,13,13,10,11, - 11,12,12,11,12,12,12,12,11,12,12,12,12,12,12,12, - 13,13,12,12,12,13,13,11,12,12,12,12,12,12,12,12, - 13,12,12,12,13,13,12,12,13,13,13,12,12,13,13,13, - 11,12,11,12,12,12,12,12,13,13,11,12,12,13,12,12, - 13,12,13,13,12,13,12,13,13,12,12,12,12,12,12,12, - 13,13,13,12,13,12,13,13,12,13,13,13,13,13,13,13, - 13,13,12,12,12,13,12,12,13,12,13,13,12,13,12,13, - 13,13,13,13,13,13,12,13,12,13,13,10,11,11,12,12, - 11,12,12,12,12,11,12,12,13,12,12,12,12,13,13,12, - 12,12,13,13,11,12,12,12,12,12,12,12,12,13,12,12, - 12,13,13,12,12,13,13,13,12,13,13,13,13,11,12,12, - 12,12,12,12,12,13,13,12,12,12,13,12,12,13,13,13, - 13,12,13,12,13,13,12,12,12,12,13,12,12,13,13,13, - 12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,12, - 12,12,12,12,12,13,13,13,13,12,13,12,13,13,13,13, - 13,13,13,13,13,13,13,13,11,11,11,12,12,11,12,12, - 12,12,11,12,12,12,12,12,12,12,13,13,12,12,12,13, - 13,11,12,12,12,12,12,12,12,13,13,12,12,12,13,13, - 12,12,13,13,13,12,13,13,13,13,11,12,12,12,12,12, - 12,12,13,13,12,12,12,13,12,12,13,12,13,13,12,13, - 12,13,13,12,12,12,12,12,12,13,13,13,13,12,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,12,12,12,12, - 12,12,13,13,13,13,12,13,12,13,12,13,13,13,13,13, - 13,13,13,13,12, -}; - -static const static_codebook _44p7_p4_1 = { - 5, 3125, - (char *)_vq_lengthlist__44p7_p4_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p7_p4_1, - 0 -}; - -static const long _vq_quantlist__44p7_p5_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p7_p5_0[] = { - 2, 6, 6, 9, 9, 5, 7, 8,10,11, 5, 8, 7,11,10, 8, - 10,11,12,13, 8,11,10,13,12, 6, 7, 8,10,11, 7, 8, - 10,10,12, 8, 9, 9,12,11,10,10,12,11,14,10,11,12, - 14,13, 6, 8, 7,11,10, 8, 9, 9,11,12, 7,10, 8,12, - 10,10,12,12,13,14,10,12,10,14,11, 9,10,11,11,12, - 10,10,11,11,13,11,12,12,13,13,12,11,13,11,15,13, - 14,13,14,14, 9,11,10,12,11,11,12,12,13,13,10,11, - 10,13,11,13,13,14,14,14,12,13,11,14,11, 7, 8, 9, - 11,12, 9, 9,11,12,13, 9,10,10,13,12,11,12,13,13, - 15,11,12,12,14,14, 9,10,10,12,13,10,10,12,12,14, - 11,11,11,13,13,12,12,13,13,15,12,13,13,15,14, 9, - 10,10,12,13,10,11,11,13,14,10,12,11,14,13,12,13, - 13,14,15,12,13,13,15,14,12,12,13,13,14,12,13,13, - 13,15,13,14,14,14,15,14,14,15,14,16,14,15,15,16, - 16,12,13,13,14,14,13,13,14,15,14,12,13,13,15,14, - 14,15,15,15,16,14,15,14,16,14, 7, 9, 8,12,11, 9, - 10,10,12,13, 9,11, 9,13,12,11,12,12,14,14,11,13, - 12,15,13, 9,10,10,13,12,10,11,12,13,14,10,12,11, - 14,13,12,13,13,14,15,13,13,13,15,14, 9,10,10,13, - 12,11,11,11,13,13,10,12,10,14,12,13,13,13,14,15, - 12,13,12,15,13,12,13,13,14,14,12,13,13,14,15,13, - 14,13,15,15,14,14,15,14,16,14,15,15,16,15,12,13, - 12,14,13,13,13,13,15,14,12,13,13,15,13,14,15,15, - 16,15,14,15,14,16,14,11,12,12,13,14,12,13,14,14, - 15,12,13,13,14,15,14,14,15,15,16,14,15,15,16,16, - 12,13,13,14,15,13,13,14,14,16,13,14,14,15,15,15, - 15,16,15,17,15,15,15,16,16,12,13,13,14,15,13,14, - 14,15,16,13,14,14,15,15,15,15,16,16,17,15,15,15, - 17,16,14,15,15,16,16,15,15,16,15,16,15,16,16,16, - 17,16,16,17,16,18,16,16,17,18,17,14,15,15,16,16, - 15,16,16,16,17,15,16,15,17,16,16,17,17,17,18,16, - 16,16,17,16,11,12,12,14,13,12,13,13,15,14,12,14, - 13,15,14,14,15,15,16,16,14,15,14,16,15,12,13,13, - 15,14,13,14,14,15,15,13,14,14,16,15,15,15,15,16, - 16,15,16,15,17,16,12,13,13,15,14,13,14,14,15,15, - 13,14,13,16,14,15,15,15,16,16,15,15,15,17,15,14, - 15,15,16,16,15,15,15,16,16,15,16,16,17,17,16,16, - 17,17,17,16,17,17,18,17,14,15,15,16,15,15,15,16, - 16,16,15,15,15,17,15,17,17,17,18,17,16,17,16,18, - 16, 6, 9, 9,12,12, 8,10,10,12,13, 9,11,10,13,12, - 10,12,12,14,14,11,13,12,14,14, 8,10,10,12,12, 9, - 10,11,12,14,10,11,11,13,13,12,12,13,13,15,12,13, - 13,15,14, 9,10,10,13,13,10,11,11,13,13,10,12,10, - 14,13,12,13,13,14,15,12,13,13,15,14,11,12,12,13, - 14,12,12,13,13,15,12,13,13,14,14,13,13,14,13,16, - 14,15,15,16,15,11,12,12,14,14,13,13,13,15,14,12, - 13,13,15,14,14,15,15,16,15,14,14,14,16,14, 7, 9, - 10,12,12, 9,10,11,13,13, 9,11,10,13,13,11,12,13, - 14,15,12,13,13,15,14, 9,10,11,12,13,10,10,12,13, - 14,11,11,12,14,14,12,12,14,14,15,13,13,13,15,15, - 9,11,11,13,13,11,12,12,14,14,10,12,10,14,13,13, - 14,13,15,15,12,14,13,15,14,12,12,13,13,15,12,12, - 14,13,15,13,14,14,15,15,14,14,15,14,17,14,15,15, - 16,16,12,13,13,15,14,13,14,14,15,15,12,14,13,15, - 14,14,15,15,16,16,14,15,14,16,14, 7,10,10,12,12, - 10,11,11,12,13,10,12,10,14,12,12,13,13,14,15,12, - 13,13,15,14, 9,11,10,13,12,10,10,12,12,14,11,13, - 12,14,13,13,13,14,13,15,13,14,14,15,14,10,11,11, - 13,13,12,12,12,13,14,10,12,10,14,12,13,14,14,15, - 15,13,14,13,15,13,12,13,13,14,14,12,12,13,14,15, - 13,14,14,15,15,13,13,14,13,15,14,15,15,16,16,12, - 13,13,14,14,13,14,14,15,15,12,13,13,15,13,15,15, - 15,16,16,13,14,13,16,13,11,12,13,14,14,12,13,14, - 14,15,12,13,13,15,15,14,14,15,15,17,14,15,15,16, - 16,12,13,14,14,15,13,13,14,14,16,13,14,14,15,16, - 14,14,16,15,17,15,15,16,16,16,12,13,13,15,15,13, - 14,14,15,16,13,14,14,15,16,15,15,16,17,17,15,16, - 15,17,16,14,15,15,15,16,15,15,16,15,17,15,15,16, - 16,17,16,16,16,16,18,16,16,17,17,17,14,15,15,16, - 16,15,16,16,16,17,15,16,15,17,16,16,17,17,17,17, - 16,17,16,18,17,11,12,12,14,14,13,13,14,14,15,13, - 14,13,15,14,14,15,15,15,16,14,15,15,17,15,12,13, - 13,15,14,13,13,14,15,15,14,15,14,16,15,15,15,15, - 15,16,15,16,15,17,16,12,13,13,15,15,14,14,14,15, - 16,13,14,13,16,15,15,15,16,16,17,15,16,15,17,15, - 14,15,15,16,16,14,15,15,16,16,15,16,16,17,16,15, - 15,16,15,17,16,17,17,18,17,14,15,15,16,16,15,16, - 16,16,17,14,15,15,17,16,17,17,17,17,18,15,16,16, - 18,15, 6, 9, 9,12,12, 9,10,11,12,13, 8,10,10,13, - 12,11,12,13,14,14,10,12,12,14,13, 9,10,10,12,13, - 10,10,12,13,14,10,11,11,13,13,12,13,13,14,15,12, - 13,13,15,14, 8,10,10,12,12,10,11,11,13,13, 9,11, - 10,13,13,12,13,13,14,15,12,13,12,15,13,11,12,12, - 14,14,12,13,13,13,15,13,13,13,14,15,14,14,15,14, - 16,14,15,15,15,15,11,12,12,14,13,12,13,13,15,14, - 12,13,12,15,13,14,14,15,16,16,13,14,13,16,13, 7, - 10,10,12,12,10,10,12,12,14,10,11,11,13,12,12,13, - 13,13,15,12,13,13,15,14,10,11,11,13,13,10,10,12, - 12,14,12,12,12,14,13,13,13,14,13,15,13,14,14,15, - 14, 9,10,11,13,13,11,12,12,13,14,10,12,10,14,12, - 13,13,14,14,15,13,13,12,15,13,12,13,13,14,14,12, - 13,13,14,15,13,14,14,15,15,13,13,15,13,16,15,15, - 15,16,16,12,13,13,14,14,13,14,14,15,15,12,13,12, - 15,14,15,15,15,16,16,13,14,13,15,13, 7,10, 9,12, - 12, 9,10,11,13,13, 9,11,10,13,13,11,13,13,14,15, - 11,13,12,15,14, 9,11,11,13,13,10,10,12,13,14,11, - 12,12,14,14,12,13,14,14,15,13,13,13,15,15, 9,11, - 10,13,12,11,12,11,14,14,10,12,10,14,13,13,14,13, - 15,15,12,14,12,15,14,12,13,13,14,15,13,13,14,14, - 15,13,14,14,15,15,14,14,15,14,17,14,15,15,16,16, - 12,13,12,15,13,13,14,14,15,15,12,14,13,15,13,14, - 15,15,16,16,14,15,14,16,14,11,12,12,14,14,13,13, - 14,14,15,13,14,13,15,15,14,15,15,16,17,14,15,15, - 16,15,12,13,13,15,15,13,13,14,15,16,14,14,14,16, - 15,15,15,16,15,17,15,16,15,17,16,12,13,13,14,15, - 14,14,15,15,16,13,14,13,15,15,15,15,16,16,17,15, - 15,15,16,15,14,15,15,16,16,14,15,15,16,17,15,16, - 16,17,17,16,15,16,15,17,16,17,17,17,17,14,15,15, - 15,16,15,15,16,16,17,14,15,15,16,16,16,16,17,17, - 18,15,16,15,17,15,11,13,12,14,14,12,13,13,15,15, - 12,14,13,15,14,14,15,15,16,16,14,15,14,16,15,12, - 13,13,15,15,13,14,14,15,16,13,14,14,16,16,15,15, - 16,16,17,15,16,15,17,16,12,13,13,15,14,13,14,14, - 16,15,13,14,13,16,14,15,16,15,17,16,15,15,14,18, - 15,14,15,15,16,16,15,15,16,16,17,15,16,15,17,16, - 16,16,17,17,18,16,17,17,18,17,14,15,15,16,15,15, - 16,15,17,16,15,15,15,17,15,16,17,17,18,17,16,17, - 16,18,15,10,12,12,14,14,12,13,13,14,14,12,13,13, - 14,14,13,14,14,15,15,13,14,14,16,15,11,12,13,14, - 14,12,13,13,15,15,12,13,13,15,15,13,14,15,15,16, - 14,15,15,16,16,12,13,13,14,14,13,13,14,15,15,13, - 14,13,15,15,14,15,15,16,16,14,15,14,16,15,13,14, - 14,15,15,13,14,14,15,16,14,14,15,16,16,14,15,15, - 15,17,15,16,16,17,17,13,14,14,15,15,14,15,15,16, - 16,14,15,15,16,16,15,16,16,16,17,15,16,15,17,16, - 11,12,12,14,14,12,13,13,14,15,12,13,13,15,14,13, - 14,14,15,16,13,14,14,16,15,12,13,13,14,15,13,13, - 14,15,15,13,14,14,15,15,14,14,15,15,17,14,15,15, - 16,16,12,13,13,15,15,13,14,14,15,15,13,14,13,15, - 15,14,15,15,16,17,14,15,15,16,16,13,13,14,15,16, - 14,14,15,15,16,14,15,15,16,16,15,15,16,15,18,15, - 16,16,17,17,14,15,15,16,16,15,15,15,16,16,14,15, - 15,17,16,16,16,16,17,17,15,16,16,17,16,10,12,12, - 14,14,12,13,13,14,15,12,13,13,15,14,14,14,15,15, - 16,14,15,14,16,15,12,13,13,15,14,13,13,14,15,15, - 13,14,14,15,15,14,14,15,15,16,14,15,15,16,16,12, - 13,13,15,15,13,14,14,15,16,13,14,13,15,14,15,15, - 15,16,16,14,15,15,16,15,13,14,14,16,15,14,14,14, - 15,16,14,15,15,16,16,15,15,16,15,17,16,17,16,17, - 17,14,14,15,15,16,15,15,16,16,16,14,15,14,16,15, - 16,16,16,17,17,15,16,15,17,15,11,13,13,14,15,13, - 13,14,15,15,13,14,13,15,15,14,15,15,15,16,14,15, - 15,17,15,13,13,14,15,15,13,14,15,15,16,14,14,14, - 16,16,15,14,16,15,17,15,16,16,17,16,13,14,14,15, - 15,14,14,14,16,16,13,15,14,16,15,15,15,16,17,17, - 15,16,15,17,16,14,15,15,15,16,15,15,16,15,17,15, - 16,16,16,17,16,16,17,15,18,16,17,17,17,17,14,15, - 15,16,16,15,16,16,17,17,15,16,15,17,16,16,17,17, - 18,18,16,17,15,18,16,10,12,12,14,14,13,13,14,14, - 15,13,14,13,15,14,14,15,15,15,16,15,15,15,16,15, - 12,13,13,15,14,12,12,14,14,15,14,15,14,16,15,15, - 14,15,14,17,15,16,16,17,16,12,13,13,14,15,14,14, - 15,15,16,13,14,12,16,14,15,16,16,16,17,15,16,14, - 17,15,14,15,14,16,15,14,14,15,15,15,15,16,15,17, - 16,15,14,16,14,16,16,17,17,18,17,14,14,15,15,16, - 15,16,16,16,17,14,15,14,16,15,16,16,17,17,17,15, - 16,14,17,14,10,12,12,14,13,12,13,13,14,14,11,13, - 12,14,14,13,14,14,15,16,13,14,14,16,15,12,13,13, - 14,14,13,13,14,15,15,13,14,13,15,15,14,14,15,15, - 16,14,15,15,16,16,11,13,12,14,14,12,13,13,15,15, - 12,13,13,15,15,14,15,15,16,16,13,14,14,16,15,13, - 14,14,15,15,14,15,15,15,16,14,15,15,16,16,15,16, - 16,16,17,16,16,16,17,17,13,14,14,15,15,14,15,15, - 16,16,13,14,14,16,15,15,16,16,17,17,15,15,15,17, - 15,11,12,12,14,14,12,13,13,14,15,12,13,13,15,14, - 14,14,15,15,16,14,14,14,16,15,12,13,13,15,14,13, - 13,14,15,15,13,14,14,16,15,14,15,15,15,16,15,15, - 15,16,16,12,13,13,14,15,13,13,14,15,15,13,14,13, - 15,15,15,15,15,16,16,14,15,14,16,15,14,14,15,16, - 16,14,15,15,15,16,15,16,15,16,16,15,15,16,15,17, - 16,16,16,17,17,13,14,14,15,16,14,15,15,16,16,14, - 14,14,16,16,16,16,16,17,17,15,15,15,17,15,11,12, - 12,14,14,12,13,13,14,15,12,13,13,15,14,14,14,14, - 15,16,13,14,14,16,15,12,13,13,15,15,13,13,14,15, - 16,13,14,14,15,15,14,15,15,16,17,14,15,15,17,16, - 12,13,13,15,14,13,14,14,15,15,13,14,13,15,15,14, - 15,15,16,16,14,15,14,17,15,14,15,15,16,16,14,15, - 15,16,17,15,15,15,17,17,15,16,16,16,17,16,17,16, - 17,17,13,15,14,16,15,14,15,15,16,16,14,15,14,16, - 15,16,16,16,17,17,15,16,15,17,15,10,12,12,14,14, - 13,13,14,14,15,13,14,13,15,14,14,15,15,15,17,14, - 15,15,16,15,12,13,13,15,14,12,12,14,14,15,14,15, - 14,16,15,15,14,16,15,17,15,16,16,17,16,12,13,13, - 14,15,14,14,15,15,16,12,14,12,15,14,15,16,16,16, - 17,15,16,14,17,14,14,15,14,16,16,14,14,15,15,16, - 15,16,16,17,16,15,14,16,14,17,16,17,17,18,17,14, - 14,15,15,16,15,15,16,16,17,14,15,14,16,15,16,17, - 17,17,18,15,16,14,17,14,11,13,13,15,14,13,13,14, - 15,15,12,14,13,15,15,14,15,15,15,17,14,15,14,16, - 15,13,14,14,15,15,13,14,15,15,16,14,15,14,16,16, - 15,15,16,16,17,15,16,16,17,17,13,14,13,15,15,14, - 14,14,16,16,13,15,14,16,15,15,16,16,17,17,15,16, - 14,17,15,15,15,15,16,17,15,15,16,16,17,15,16,16, - 17,17,16,15,17,16,17,17,17,17,18,18,14,15,15,17, - 15,15,16,16,17,16,15,16,15,17,15,16,17,17,17,17, - 16,17,15,18,15, -}; - -static const static_codebook _44p7_p5_0 = { - 5, 3125, - (char *)_vq_lengthlist__44p7_p5_0, - 1, -528744448, 1616642048, 3, 0, - (long *)_vq_quantlist__44p7_p5_0, - 0 -}; - -static const long _vq_quantlist__44p7_p5_1[] = { - 3, - 2, - 4, - 1, - 5, - 0, - 6, -}; - -static const char _vq_lengthlist__44p7_p5_1[] = { - 2, 3, 3, 3, 3, 3, 3, -}; - -static const static_codebook _44p7_p5_1 = { - 1, 7, - (char *)_vq_lengthlist__44p7_p5_1, - 1, -533200896, 1611661312, 3, 0, - (long *)_vq_quantlist__44p7_p5_1, - 0 -}; - -static const long _vq_quantlist__44p7_p6_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p7_p6_0[] = { - 2, 5, 6, 5, 7, 8, 5, 8, 7, 5, 7, 7, 7, 7, 9, 8, - 9, 9, 5, 7, 7, 8, 9, 9, 7, 9, 7, 6, 8, 8, 8, 9, - 10, 8, 9, 9, 8, 9,10, 9, 9,11,10,10,11, 8,10, 9, - 10,10,11, 9,10,10, 6, 8, 8, 8, 9, 9, 8,10, 9, 8, - 9,10, 9,10,10,10,11,10, 8,10, 9,10,11,10, 9,11, - 9, 6, 8, 8, 7, 9, 9, 8, 9, 9, 7, 9, 9, 9, 9,10, - 9,10,10, 8, 9, 9, 9,10,10, 9,10, 9, 7, 9, 9, 9, - 10,10, 9,10,10, 9, 9,10,10, 9,11,10,11,11, 9,10, - 10,10,11,11,10,11,10, 6, 9, 8, 9,10,10, 9,10, 9, - 8,10,10, 9, 9,10,10,11,11, 9,10,10,10,11,11, 9, - 11, 9, 6, 8, 8, 8, 9, 9, 7, 9, 9, 8, 9, 9, 9, 9, - 10, 9,10,10, 7, 9, 9, 9,10,10, 9,10, 9, 6, 8, 9, - 9, 9,10, 9,10,10, 9,10,10, 9, 9,11,10,11,11, 8, - 10,10,10,11,11, 9,10, 9, 7, 9, 9, 9,10,10, 9,10, - 10, 9,10,10,10,10,11,10,11,11, 9,10, 9,10,11,11, - 10,11, 9, -}; - -static const static_codebook _44p7_p6_0 = { - 5, 243, - (char *)_vq_lengthlist__44p7_p6_0, - 1, -527106048, 1620377600, 2, 0, - (long *)_vq_quantlist__44p7_p6_0, - 0 -}; - -static const long _vq_quantlist__44p7_p6_1[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p7_p6_1[] = { - 4, 7, 7, 6, 7, 8, 6, 8, 7, 7, 7, 8, 7, 7, 8, 8, - 8, 8, 7, 7, 7, 8, 8, 8, 7, 8, 8, 7, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, 8, 8, - 8, 9, 9, 8, 9, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 9, 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, 9, - 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, - 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, 9, 8, 7, 8, 8, 8, - 8, 9, 8, 9, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, 8, - 8, 9, 9, 9, 8, 9, 9, 7, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, - 9, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 9, 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, 9, 8, 7, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, - 8, 8, 8, 9, 9, 8, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 9, 9, 8, 9, 9, 8, 8, 8, 9, 9, 9, - 8, 9, 8, -}; - -static const static_codebook _44p7_p6_1 = { - 5, 243, - (char *)_vq_lengthlist__44p7_p6_1, - 1, -530841600, 1616642048, 2, 0, - (long *)_vq_quantlist__44p7_p6_1, - 0 -}; - -static const long _vq_quantlist__44p7_p7_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p7_p7_0[] = { - 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, -}; - -static const static_codebook _44p7_p7_0 = { - 5, 243, - (char *)_vq_lengthlist__44p7_p7_0, - 1, -513979392, 1633504256, 2, 0, - (long *)_vq_quantlist__44p7_p7_0, - 0 -}; - -static const long _vq_quantlist__44p7_p7_1[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p7_p7_1[] = { - 1, 5, 5, 4,10,10, 5,10,10, 5,10,10,10,10,10,10, - 10,10, 5,10,10,10,10,10, 9,10,10, 6,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10, 7,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10, 6,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10, 6,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,11,11, -}; - -static const static_codebook _44p7_p7_1 = { - 5, 243, - (char *)_vq_lengthlist__44p7_p7_1, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44p7_p7_1, - 0 -}; - -static const long _vq_quantlist__44p7_p7_2[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const char _vq_lengthlist__44p7_p7_2[] = { - 1, 3, 2, 4, 5, 7, 7, 8, 8, 9, 9,10,10,11,11,12, - 12,13,13,14,14,15,15,15,15, -}; - -static const static_codebook _44p7_p7_2 = { - 1, 25, - (char *)_vq_lengthlist__44p7_p7_2, - 1, -518864896, 1620639744, 5, 0, - (long *)_vq_quantlist__44p7_p7_2, - 0 -}; - -static const long _vq_quantlist__44p7_p7_3[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const char _vq_lengthlist__44p7_p7_3[] = { - 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44p7_p7_3 = { - 1, 25, - (char *)_vq_lengthlist__44p7_p7_3, - 1, -529006592, 1611661312, 5, 0, - (long *)_vq_quantlist__44p7_p7_3, - 0 -}; - -static const char _huff_lengthlist__44p7_short[] = { - 3, 9,14,16,17,19,22,22, 5, 4, 6, 9,11,13,17,20, - 9, 5, 5, 6, 9,11,15,19,11, 7, 5, 5, 7, 9,13,17, - 14, 9, 7, 6, 6, 7,11,14,16,11, 9, 7, 6, 4, 4, 8, - 19,15,13,11, 9, 4, 3, 4,21,16,16,15,12, 6, 4, 4, -}; - -static const static_codebook _huff_book__44p7_short = { - 2, 64, - (char *)_huff_lengthlist__44p7_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p8_l0_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44p8_l0_0[] = { - 2, 4, 4, 7, 7, 8, 8,10,10,11,11,12,12, 4, 5, 5, - 7, 7, 9, 9,10, 9,12,10,12,12, 4, 5, 5, 7, 7, 9, - 9, 9,10,10,12,12,12, 7, 7, 7, 7, 8, 9, 8,11, 5, - 12, 6,12,10, 7, 7, 7, 8, 7, 8, 9, 5,11, 6,12,10, - 12, 8, 9, 9, 9, 9, 9, 9,11, 7,11, 7,11, 9, 8, 9, - 9, 9, 9, 9, 9, 7,10, 7,11, 9,11,10,10,10,10,10, - 10,10,11,10,11, 8,12, 9,10,10,10,10,10,10,10,10, - 11, 8,11, 9,12,10,11,11,11,11,11,11,11,11,12,10, - 12,11,10,11,11,11,11,11,11,11,11,10,12,11,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,11,12,12,12, - 12,12,12,12,12,12,11,12,12, -}; - -static const static_codebook _44p8_l0_0 = { - 2, 169, - (char *)_vq_lengthlist__44p8_l0_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44p8_l0_0, - 0 -}; - -static const long _vq_quantlist__44p8_l0_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p8_l0_1[] = { - 4, 4, 4, 5, 5, 4, 4, 5, 5, 5, 4, 5, 4, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44p8_l0_1 = { - 2, 25, - (char *)_vq_lengthlist__44p8_l0_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p8_l0_1, - 0 -}; - -static const long _vq_quantlist__44p8_l1_0[] = { - 54, - 29, - 79, - 0, - 108, -}; - -static const char _vq_lengthlist__44p8_l1_0[] = { - 1, 2, 3, 6, 7, 7, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _44p8_l1_0 = { - 2, 25, - (char *)_vq_lengthlist__44p8_l1_0, - 1, -514516992, 1620639744, 7, 0, - (long *)_vq_quantlist__44p8_l1_0, - 0 -}; - -static const char _huff_lengthlist__44p8_lfe[] = { - 2, 3, 1, 3, -}; - -static const static_codebook _huff_book__44p8_lfe = { - 2, 4, - (char *)_huff_lengthlist__44p8_lfe, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44p8_long[] = { - 2, 7,14,16,17,18,20,21, 7, 4, 6, 8,11,12,14,16, - 13, 5, 4, 4, 8, 9,11,13,15, 8, 4, 3, 5, 7, 9,10, - 17,11, 8, 4, 4, 6, 9, 9,17,11, 9, 7, 6, 5, 7, 8, - 19,13,11, 9, 9, 7, 8, 8,21,15,13,11,10, 8, 8, 7, -}; - -static const static_codebook _huff_book__44p8_long = { - 2, 64, - (char *)_huff_lengthlist__44p8_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p8_p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p8_p1_0[] = { - 2, 5, 5, 4, 7, 7, 4, 7, 7, 5, 7, 7, 7, 8, 9, 7, - 9, 9, 5, 7, 7, 7, 9, 9, 7, 9, 8, 6, 7, 8, 8, 9, - 10, 8, 9,10, 8, 9,10,10,10,12,10,11,12, 8,10,10, - 10,11,12,10,11,11, 6, 8, 7, 8,10, 9, 8,10, 9, 8, - 10,10,10,11,11,10,12,11, 8,10, 9,10,12,11,10,12, - 10, 5, 8, 8, 8,10,10, 8,10,10, 7, 9,10, 9,10,11, - 9,11,11, 8,10,10,10,12,12,10,12,11, 7, 9, 9, 9, - 10,11, 9,11,11, 9, 9,11,10,11,12,10,11,12, 9,11, - 11,11,12,12,11,12,12, 7, 9, 9,10,11,11,10,12,11, - 9,11,10,11,11,12,11,13,12,10,11,11,12,13,13,11, - 13,11, 5, 8, 8, 8,10,10, 8,10,10, 8,10,10,10,11, - 12,10,12,11, 7,10, 9, 9,11,11, 9,11,10, 7, 9, 9, - 10,11,12,10,11,11,10,11,11,11,11,13,12,13,13, 9, - 10,11,12,12,13,11,12,11, 7, 9, 9, 9,11,11, 9,11, - 10, 9,11,11,11,12,12,11,12,12, 9,11, 9,10,12,11, - 10,12,11, -}; - -static const static_codebook _44p8_p1_0 = { - 5, 243, - (char *)_vq_lengthlist__44p8_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p8_p1_0, - 0 -}; - -static const long _vq_quantlist__44p8_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p8_p2_0[] = { - 4, 6, 6, 9, 9, 6, 8, 8,10,10, 6, 8, 8,10,10, 8, - 9,10,12,12, 8,10, 9,12,12, 6, 8, 8,10,10, 8, 8, - 9,10,11, 8, 9, 9,11,11, 9,10,11,12,13,10,11,11, - 13,13, 6, 8, 8,10,10, 8, 9, 9,11,11, 8, 9, 8,11, - 10,10,11,11,13,13, 9,11,10,13,12, 9,10,10,12,12, - 10,10,11,12,13,10,11,11,13,13,12,12,13,12,15,12, - 13,13,15,14, 9,10,10,12,12,10,11,11,13,13,10,11, - 10,13,12,12,13,13,14,15,12,13,12,15,12, 7, 8, 8, - 10,11, 8, 9,10,11,12, 8, 9, 9,11,11,10,11,11,13, - 14,10,11,11,13,13, 8, 9, 9,11,12, 9,10,11,11,13, - 9,10,10,12,12,11,11,12,13,15,11,12,12,14,14, 8, - 9, 9,11,11, 9,10,11,12,13, 9,10,10,12,12,11,12, - 12,14,15,11,12,12,14,14,10,11,12,13,13,11,12,12, - 13,14,12,12,12,14,14,13,13,14,14,16,14,14,14,16, - 15,10,11,11,13,13,12,12,12,14,14,11,12,12,14,13, - 14,14,14,15,16,13,14,13,16,14, 7, 8, 8,11,10, 8, - 9, 9,11,11, 8,10, 9,12,11,10,11,11,13,13,10,11, - 11,14,13, 8, 9, 9,12,11, 9,10,10,12,12, 9,11,10, - 13,12,11,12,12,13,14,11,12,12,15,14, 8, 9, 9,12, - 11, 9,10,10,12,12, 9,11,10,13,11,11,12,12,14,14, - 11,12,12,14,13,10,11,11,13,13,11,12,12,13,14,12, - 13,12,14,14,13,13,14,14,16,13,14,14,16,15,10,11, - 11,13,13,12,12,12,14,14,11,12,12,14,13,13,14,14, - 15,15,13,14,13,16,14, 9,10,11,12,13,11,11,12,12, - 14,11,11,12,13,14,13,13,14,14,16,13,13,14,15,15, - 11,11,12,12,14,12,12,13,13,15,12,12,13,13,15,14, - 14,15,15,16,14,14,14,15,16,11,12,12,13,14,12,12, - 13,14,15,12,13,12,14,14,14,14,15,15,16,14,14,14, - 16,16,13,13,14,15,16,14,14,15,15,16,14,15,15,16, - 16,15,15,16,16,18,16,16,16,17,17,13,14,14,15,15, - 14,14,15,16,16,14,15,14,16,16,16,16,16,17,18,15, - 16,16,17,16, 9,11,10,13,12,11,12,11,14,13,11,12, - 11,14,12,13,14,13,15,14,13,14,13,16,14,11,12,12, - 14,13,12,12,13,14,14,12,13,12,15,14,14,14,14,16, - 16,14,15,14,17,15,11,12,11,14,12,12,13,12,15,13, - 12,13,12,15,13,14,14,14,16,15,14,15,14,16,15,13, - 14,14,15,15,14,14,15,16,16,14,15,14,16,16,15,15, - 16,16,17,16,16,16,17,17,13,14,14,16,15,14,15,15, - 16,16,14,15,14,17,15,16,16,16,17,17,15,16,15,18, - 16, 7, 8, 8,10,11, 8, 9, 9,11,12, 8, 9, 9,12,11, - 10,11,11,13,14,10,11,11,14,13, 8, 9, 9,11,11, 9, - 10,10,12,12, 9,10,10,12,12,11,12,12,13,14,11,12, - 12,14,14, 8, 9, 9,12,11, 9,10,11,12,13, 9,11,10, - 13,12,11,12,12,14,14,11,12,12,14,13,10,11,11,13, - 13,11,12,12,13,14,11,12,12,14,14,13,13,14,14,16, - 13,14,14,16,15,10,12,11,13,13,12,12,12,14,14,11, - 12,12,14,13,14,14,14,15,16,13,14,14,16,14, 8, 9, - 9,11,11, 9,10,10,12,12, 9,10,10,12,12,11,11,12, - 13,14,11,12,12,14,14, 9, 9,10,11,12,10,10,11,12, - 13,10,10,11,12,13,12,12,13,14,15,12,12,13,14,15, - 9,10,10,12,12,10,11,11,13,13,10,11,11,13,13,12, - 13,13,15,15,12,13,13,15,14,11,11,12,13,14,12,12, - 13,13,15,12,12,13,14,15,14,14,15,14,16,14,14,15, - 15,16,11,12,12,14,14,12,13,13,15,15,12,13,13,15, - 14,14,15,15,16,16,14,15,14,17,15, 8, 9, 9,11,11, - 9,10,10,12,12, 9,11,10,13,12,11,12,12,14,14,11, - 13,12,15,13, 9,10,10,12,12,10,10,11,12,13,10,12, - 11,13,13,12,12,13,13,15,12,13,13,15,14, 9,10,10, - 12,12,11,11,12,13,13,10,12,10,13,12,12,13,13,15, - 15,12,13,13,15,13,11,12,12,14,14,12,12,13,14,14, - 12,13,13,15,14,13,13,14,13,16,14,15,14,16,16,11, - 12,12,14,14,13,13,13,15,15,12,13,12,15,14,14,15, - 15,16,17,14,15,13,16,13,10,11,11,13,14,11,12,12, - 13,15,11,12,12,14,14,13,14,14,15,16,13,14,14,16, - 16,11,11,12,12,14,12,12,13,13,15,12,13,13,13,15, - 14,14,15,14,17,14,14,15,15,16,11,12,12,14,14,12, - 13,13,15,15,12,13,13,15,15,14,15,15,16,17,14,15, - 15,16,16,13,14,14,14,16,14,14,15,14,17,14,15,15, - 14,17,16,16,17,15,18,16,16,17,16,18,13,14,14,16, - 16,14,15,15,17,16,14,15,15,17,16,16,17,17,18,18, - 16,17,16,18,17,10,11,11,14,13,11,12,12,14,14,11, - 13,12,15,14,14,14,14,16,15,14,15,14,16,15,11,12, - 12,14,13,12,13,13,15,14,13,14,13,15,14,14,15,15, - 16,16,14,15,15,17,15,11,12,12,14,14,13,13,13,15, - 15,12,13,13,15,14,15,15,15,17,17,14,15,15,17,15, - 13,14,14,16,15,14,15,15,16,16,15,15,15,17,16,16, - 16,16,16,17,16,17,16,18,17,14,14,14,16,16,15,15, - 15,16,16,14,15,14,17,16,16,17,17,17,18,16,17,16, - 18,16, 7, 8, 8,11,11, 8, 9, 9,11,12, 8, 9, 9,12, - 11,10,11,11,13,14,10,11,11,14,13, 8, 9, 9,11,12, - 9,10,11,12,13, 9,11,10,13,12,11,12,12,13,14,11, - 12,12,14,14, 8, 9, 9,11,11, 9,10,10,12,12, 9,10, - 10,13,12,11,12,12,14,14,11,12,11,14,13,10,11,12, - 13,13,11,12,12,13,14,12,13,12,14,14,13,13,14,14, - 16,13,14,14,16,15,10,11,11,13,13,11,12,12,14,14, - 11,12,12,14,13,13,14,14,15,16,13,14,13,16,14, 8, - 9, 9,11,11, 9,10,11,12,13, 9,10,10,12,12,11,12, - 13,13,14,11,12,12,14,14, 9,10,10,12,12,10,10,11, - 12,13,11,12,11,13,13,12,12,13,13,15,12,13,13,15, - 15, 9,10,10,12,12,10,11,12,13,14,10,11,10,13,12, - 12,13,13,14,15,12,13,12,15,13,12,12,12,14,14,12, - 12,13,14,15,13,13,13,15,15,14,14,15,13,16,14,15, - 15,16,16,11,12,12,14,14,12,13,13,14,15,12,13,12, - 14,14,14,14,15,16,16,13,14,13,16,14, 8, 9, 9,11, - 11, 9,10,10,12,12, 9,10,10,12,12,11,12,12,14,14, - 11,12,11,14,14, 9,10,10,12,12,10,11,11,13,13,10, - 11,11,13,13,12,13,13,14,15,12,13,13,15,14, 9,10, - 9,12,11,10,11,10,13,12,10,11,10,13,12,12,13,12, - 15,14,12,13,12,15,14,11,12,12,14,14,12,13,13,14, - 15,12,13,13,15,15,14,14,15,15,17,14,15,15,16,16, - 11,12,11,14,13,12,13,12,15,14,12,13,12,15,13,14, - 15,14,16,15,13,15,14,17,14,10,11,11,13,14,11,12, - 13,13,15,11,12,12,14,14,14,14,15,15,17,13,14,14, - 15,16,11,12,12,14,14,12,12,13,14,15,13,13,13,15, - 15,14,15,15,15,17,15,15,15,16,16,11,12,12,13,14, - 13,13,14,14,15,12,13,13,14,15,14,15,15,16,17,14, - 15,15,16,16,14,14,14,16,16,14,14,15,15,17,15,15, - 15,17,16,16,16,17,16,18,16,17,17,18,17,13,14,14, - 15,16,14,15,15,16,17,14,15,15,16,16,16,17,17,17, - 18,16,16,16,17,16,10,11,11,14,13,11,12,12,14,14, - 11,12,12,15,13,13,14,14,16,15,13,14,14,16,15,11, - 12,12,14,14,12,13,13,15,15,12,13,13,15,15,14,15, - 15,16,17,14,15,15,17,16,11,12,11,14,12,12,13,13, - 15,13,12,13,12,15,13,14,15,15,16,15,14,15,14,17, - 14,13,14,14,16,16,14,15,15,16,17,14,15,15,16,17, - 16,16,17,17,18,16,17,17,18,18,13,14,14,16,13,14, - 15,15,17,14,14,15,14,17,14,16,17,16,17,16,16,17, - 16,18,15, 8,11,11,13,13,10,12,12,14,14,11,12,12, - 14,14,13,13,14,15,16,13,14,14,16,15,10,11,11,14, - 14,11,12,12,14,15,11,12,12,15,14,13,14,14,15,16, - 13,14,14,16,16,11,12,12,14,14,12,13,13,15,15,12, - 13,12,15,14,14,14,15,16,16,14,15,14,16,16,12,13, - 13,15,15,12,13,14,15,16,13,14,14,16,16,14,15,15, - 16,17,15,15,16,17,17,13,14,14,16,15,14,15,15,16, - 16,14,15,14,16,16,16,16,16,17,17,15,16,16,18,16, - 10,11,11,13,14,11,12,12,14,15,11,12,12,15,14,13, - 14,14,16,16,13,14,14,16,16,11,11,12,14,14,12,12, - 13,14,15,12,13,13,15,15,14,14,15,15,17,14,14,15, - 16,16,11,12,12,15,14,12,13,13,15,15,12,13,13,15, - 15,14,15,15,17,17,14,15,15,17,16,13,12,14,14,16, - 13,13,15,14,17,14,13,15,15,17,15,14,16,15,18,16, - 15,16,16,18,13,14,14,16,16,14,15,15,17,17,14,15, - 15,17,16,16,17,17,18,18,16,17,16,18,17,10,11,11, - 14,13,11,12,12,14,14,11,13,12,15,14,13,14,14,15, - 16,13,14,14,16,16,11,12,12,14,14,12,13,13,14,15, - 12,13,13,15,15,14,14,15,15,16,14,15,15,17,16,11, - 12,12,14,14,13,13,13,15,15,12,13,13,15,14,14,15, - 15,16,17,14,15,14,17,15,13,14,13,16,15,14,14,14, - 15,16,14,15,14,16,16,15,15,16,16,17,16,16,16,18, - 17,14,14,14,16,16,15,15,15,17,16,14,15,14,17,16, - 16,16,17,17,18,16,17,16,18,16,11,13,13,15,15,12, - 13,14,15,16,12,14,14,15,15,14,15,15,16,17,14,15, - 15,17,17,12,13,14,14,16,13,14,14,14,16,14,14,14, - 15,16,15,15,16,15,18,15,16,16,17,17,13,14,14,16, - 16,14,14,15,16,16,14,15,14,16,16,15,16,16,17,18, - 15,16,16,18,17,14,14,16,13,17,15,15,16,14,18,15, - 15,16,14,18,16,16,18,15,19,17,17,18,16,18,15,16, - 15,17,17,15,16,17,18,18,16,16,16,18,17,17,18,18, - 19,19,17,18,17,19,18,11,12,12,15,14,13,13,14,15, - 16,13,14,13,16,14,15,15,15,16,17,15,16,15,17,16, - 12,13,13,15,14,13,13,14,15,15,14,15,14,16,15,15, - 15,16,16,17,16,16,16,18,17,12,13,13,15,15,14,14, - 15,16,16,13,14,13,16,15,16,16,16,17,18,15,16,15, - 17,16,14,15,14,17,15,14,15,15,16,16,15,16,15,17, - 16,16,15,16,15,17,17,18,17,18,17,15,15,15,16,17, - 16,16,16,17,17,15,16,15,17,16,17,18,18,18,18,16, - 17,16,18,15, 8,11,11,13,13,11,12,12,14,14,10,12, - 12,14,14,13,14,14,15,16,13,14,13,16,15,11,12,12, - 14,14,12,12,13,14,15,12,13,13,15,15,14,14,15,15, - 16,14,14,14,16,16,10,11,11,14,14,11,12,12,14,15, - 11,12,12,15,14,13,14,14,16,16,13,14,14,16,15,13, - 14,14,15,16,14,14,15,16,16,14,15,15,16,16,15,16, - 16,16,18,16,16,16,17,17,12,13,13,15,15,13,14,14, - 16,16,12,14,13,16,15,15,16,15,17,17,14,16,15,17, - 16,10,11,11,13,14,11,12,13,14,15,11,13,12,14,14, - 14,14,15,16,16,13,14,14,16,16,11,12,12,14,14,12, - 13,13,14,15,13,14,13,15,15,14,15,15,16,17,14,15, - 15,17,16,11,12,12,14,14,12,13,13,15,15,12,13,12, - 15,14,14,15,15,16,17,14,15,15,16,16,14,14,14,16, - 16,14,14,15,16,16,15,15,15,16,16,16,16,17,16,18, - 16,17,17,18,18,13,13,14,15,16,14,14,15,16,17,13, - 14,14,16,16,16,16,17,17,18,15,16,15,17,16,10,11, - 11,14,13,11,12,12,14,14,11,12,12,15,14,13,14,14, - 16,16,13,14,14,16,16,11,12,12,14,14,12,13,13,15, - 15,12,13,13,15,15,14,15,15,16,17,14,15,15,17,16, - 11,12,11,14,14,12,13,13,15,15,12,13,12,15,14,14, - 15,14,16,16,14,15,14,17,16,14,14,14,16,16,14,15, - 15,16,17,14,15,15,17,17,16,16,17,17,18,16,17,17, - 18,18,13,14,12,16,14,14,15,13,17,15,13,15,13,17, - 14,16,16,15,18,16,15,17,14,18,15,11,12,12,14,15, - 13,13,14,14,16,13,14,13,15,14,15,15,16,16,17,15, - 16,15,17,16,12,13,13,15,15,13,13,14,15,16,14,15, - 14,16,16,15,15,16,15,18,16,16,16,18,17,12,13,13, - 15,15,14,14,15,15,16,13,14,13,15,15,16,16,16,16, - 18,15,16,15,17,16,15,15,15,17,16,15,15,16,16,17, - 16,16,16,18,17,16,16,17,15,18,17,18,17,19,18,14, - 14,15,15,17,15,15,16,16,17,14,15,15,16,16,17,17, - 18,17,19,16,17,15,17,15,11,13,12,15,15,12,14,14, - 15,15,12,14,13,16,15,15,15,15,17,17,14,15,15,17, - 16,12,14,14,16,16,14,14,15,16,16,14,14,14,16,16, - 15,16,17,17,18,15,16,16,18,17,12,14,13,16,14,13, - 14,14,16,15,13,15,14,16,14,15,16,16,17,17,15,16, - 15,18,15,15,15,16,17,17,15,16,16,17,18,16,16,16, - 18,18,17,17,18,18,19,17,17,18,19,19,14,15,14,17, - 13,15,16,15,18,14,15,16,15,18,14,17,18,17,18,16, - 16,18,16,19,15, -}; - -static const static_codebook _44p8_p2_0 = { - 5, 3125, - (char *)_vq_lengthlist__44p8_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p8_p2_0, - 0 -}; - -static const long _vq_quantlist__44p8_p3_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p8_p3_0[] = { - 2, 5, 5, 5, 7, 7, 5, 7, 7, 5, 7, 7, 7, 8, 9, 7, - 9, 9, 5, 7, 7, 7, 9, 9, 7, 9, 8, 5, 7, 8, 7, 9, - 10, 8, 9, 9, 8, 9,10, 9,10,12,10,11,11, 8,10, 9, - 10,11,12, 9,11,10, 5, 8, 7, 8,10, 9, 7,10, 9, 8, - 9,10, 9,10,11,10,12,11, 8,10, 9,10,11,11, 9,12, - 10, 5, 8, 8, 7, 9,10, 8,10, 9, 7, 9,10, 9,10,11, - 9,11,11, 8,10, 9,10,11,11,10,12,10, 7, 9,10, 9, - 10,12, 9,11,11, 9, 9,12,11,10,13,11,11,13,10,12, - 11,11,13,13,11,13,12, 7, 9, 9, 9,11,11, 9,12,11, - 9,11,10,10,11,12,11,13,12, 9,11,11,12,13,13,11, - 13,11, 5, 8, 8, 8, 9,10, 7,10, 9, 8, 9,10,10,10, - 12,10,11,11, 7,10, 9, 9,11,11, 9,11,10, 7, 9, 9, - 9,11,12, 9,11,11, 9,11,11,11,11,13,12,13,13, 9, - 10,11,11,12,13,10,12,11, 7,10, 9, 9,11,11, 9,12, - 10,10,11,12,11,12,13,12,13,13, 9,12, 9,11,13,11, - 10,13,10, -}; - -static const static_codebook _44p8_p3_0 = { - 5, 243, - (char *)_vq_lengthlist__44p8_p3_0, - 1, -533200896, 1614282752, 2, 0, - (long *)_vq_quantlist__44p8_p3_0, - 0 -}; - -static const long _vq_quantlist__44p8_p3_1[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p8_p3_1[] = { - 6, 7, 7, 7, 7, 8, 7, 8, 7, 7, 7, 8, 7, 8, 8, 8, - 8, 8, 7, 8, 7, 7, 8, 8, 7, 8, 8, 7, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 8, 9, 8, 8, - 8, 8, 9, 9, 8, 9, 9, 7, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 9, 8, 8, 8, 8, 8, 9, 9, 8, - 9, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, - 8, 8, 8, 8, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 9, 9, 8, 9, 9, 8, 8, 8, 8, 9, 8, - 8, 9, 8, -}; - -static const static_codebook _44p8_p3_1 = { - 5, 243, - (char *)_vq_lengthlist__44p8_p3_1, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p8_p3_1, - 0 -}; - -static const long _vq_quantlist__44p8_p4_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p8_p4_0[] = { - 2, 5, 5, 4, 7, 8, 4, 8, 7, 5, 7, 8, 7, 7,10, 8, - 9, 9, 5, 7, 7, 8, 9, 9, 7,10, 7, 5, 7, 8, 8, 9, - 11, 8,10,10, 8, 9,10,10,10,12,11,12,12, 8,10,10, - 10,12,12,10,12,11, 5, 8, 7, 8,10,10, 8,11, 9, 8, - 10,10,10,11,12,10,12,12, 8,10, 9,11,12,12,10,12, - 10, 5, 8, 8, 7,10,10, 8,11,10, 7, 9,10, 9,10,12, - 10,12,12, 8,10,10,10,12,12,10,12,11, 7, 9,10, 9, - 11,12,10,12,11, 9, 9,12,10,10,13,12,12,13,10,12, - 11,12,13,13,11,13,11, 7,10, 9,10,11,12,10,13,11, - 9,11,11,11,11,13,12,14,13,10,11,11,12,14,14,11, - 14,11, 5, 8, 8, 8,10,11, 7,10,10, 8,10,10,10,11, - 12,10,12,12, 7,10, 9,10,12,12, 9,12,10, 7, 9,10, - 10,11,13,10,12,11,10,11,11,11,11,14,12,14,14, 9, - 11,11,12,13,14,11,13,11, 7,10, 9,10,11,12, 9,12, - 10,10,11,12,11,11,13,12,13,13, 9,12, 9,12,13,12, - 10,13,10, -}; - -static const static_codebook _44p8_p4_0 = { - 5, 243, - (char *)_vq_lengthlist__44p8_p4_0, - 1, -531365888, 1616117760, 2, 0, - (long *)_vq_quantlist__44p8_p4_0, - 0 -}; - -static const long _vq_quantlist__44p8_p4_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p8_p4_1[] = { - 7, 9, 9,10,10, 9,10,10,10,11, 9,10,10,11,10, 9, - 10,10,11,11, 9,10,10,11,11, 9,10,10,11,11,10,10, - 10,11,11,10,10,10,11,11,10,11,11,11,11,10,11,11, - 11,11, 9,10,10,11,11,10,10,10,11,11, 9,10,10,11, - 11,10,11,11,11,11,10,11,11,11,11,10,11,11,11,11, - 10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,12,10,11,11,11,11,11,11,11,11,11,10,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11, 9,10,10, - 11,11,10,10,11,11,11,10,10,11,11,11,10,11,11,11, - 12,10,11,11,12,12,10,10,11,11,11,10,11,11,11,12, - 11,11,11,12,12,11,11,12,12,12,11,11,12,12,12,10, - 11,11,11,11,11,11,11,12,12,10,11,11,12,12,11,12, - 11,12,12,11,12,11,12,12,11,11,11,11,12,11,11,12, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,11,11,11,12,12,11,12,12,12,12,11,12,11,12,12, - 12,12,12,12,12,12,12,12,12,12, 9,10,10,11,11,10, - 11,10,11,11,10,11,10,11,11,10,11,11,12,12,10,11, - 11,12,11,10,11,11,11,11,10,11,11,11,12,11,11,11, - 12,12,11,11,12,12,12,11,11,11,12,12,10,11,10,11, - 11,11,11,11,12,12,10,11,11,12,11,11,12,11,12,12, - 11,12,11,12,12,11,11,11,12,12,11,11,12,12,12,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,11,11, - 11,12,11,11,12,12,12,12,11,12,11,12,12,12,12,12, - 12,12,12,12,12,12,12,10,11,11,11,11,11,11,11,12, - 12,11,11,11,12,12,11,12,12,12,12,11,12,12,12,12, - 11,11,11,12,12,11,11,12,12,12,11,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,11,11,11,12,12,11,12, - 12,12,12,11,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,13,12,13,12,12,12,12,13,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,13,12,10,11,11,11,11,11,11,11,12,12,11,11, - 11,12,12,11,12,12,12,12,11,12,12,12,12,11,11,11, - 12,12,11,12,12,12,12,11,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,11,11,11,12,12,11,12,12,12,12, - 11,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,13,12,12,13,12,13, - 12, 9,10,10,11,11,10,10,11,11,11,10,11,10,11,11, - 10,11,11,12,12,10,11,11,12,12,10,10,11,11,11,10, - 11,11,11,12,10,11,11,12,12,11,11,12,12,12,11,11, - 11,12,12,10,11,10,11,11,11,11,11,12,12,10,11,11, - 12,11,11,12,11,12,12,11,12,11,12,12,11,11,11,11, - 12,11,11,12,12,12,11,12,12,12,12,11,12,12,12,12, - 11,12,12,12,12,11,11,11,12,11,11,12,12,12,12,11, - 12,11,12,12,12,12,12,12,12,12,12,12,12,12,10,10, - 11,11,11,10,11,11,12,12,10,11,11,12,12,11,11,11, - 12,12,11,11,12,12,12,10,11,11,11,12,11,11,12,12, - 12,11,11,12,12,12,11,11,12,12,12,11,12,12,12,12, - 11,11,11,12,12,11,12,12,12,12,11,12,11,12,12,11, - 12,12,12,12,11,12,12,12,12,11,11,12,12,12,11,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12, 9,10,10,11,11, - 10,11,11,11,12,10,11,11,12,11,11,12,11,12,12,11, - 12,11,12,12,10,11,11,12,11,11,11,11,12,12,11,12, - 11,12,12,11,12,12,12,12,11,12,12,12,12,10,11,11, - 12,12,11,12,11,12,12,11,12,11,12,12,12,12,12,12, - 12,11,12,12,12,12,11,12,11,12,12,11,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,11, - 12,12,12,12,12,12,12,12,12,11,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,11,11,11,12,12,11,12,12, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,13,12,12,12,12,12,11,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,13,13,12,12, - 12,13,13,12,12,12,12,12,12,12,12,12,13,12,12,12, - 12,13,12,12,13,12,13,12,13,13,13,13,12,12,12,12, - 12,12,12,12,13,12,12,12,12,13,12,12,13,13,13,13, - 12,13,13,13,13,10,11,11,12,12,11,12,12,12,12,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,11,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,12, - 12,12,12,12,13,12,12,12,12,13,13,12,12,12,13,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,12, - 13,13,12,13,12,13,13,13,13,12,12,12,12,12,12,12, - 12,13,12,12,12,12,13,12,12,13,13,13,13,12,13,13, - 13,13, 9,10,10,11,11,10,10,11,11,11,10,11,10,11, - 11,10,11,11,12,12,10,11,11,12,12,10,11,11,11,11, - 10,11,11,12,12,11,11,11,12,12,11,11,12,12,12,11, - 11,12,12,12,10,11,10,11,11,10,11,11,12,12,10,11, - 11,12,11,11,12,11,12,12,11,11,11,12,12,11,11,11, - 11,12,11,11,12,12,12,11,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,11,11,11,12,11,11,12,12,12,12, - 11,12,11,12,12,12,12,12,12,12,11,12,12,12,12, 9, - 10,10,11,11,10,11,11,11,12,10,11,11,12,11,11,11, - 12,12,12,11,11,12,12,12,10,11,11,12,12,11,11,12, - 12,12,11,11,12,12,12,12,12,12,12,12,12,12,12,12, - 12,10,11,11,12,12,11,11,11,12,12,11,11,11,12,12, - 11,12,12,12,12,11,12,12,12,12,11,12,12,12,12,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,11,11,12,12,12,12,12,12,12,12,11,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,10,11,10,11, - 11,10,11,11,12,12,10,11,11,12,12,11,11,11,12,12, - 11,12,11,12,12,11,11,11,12,12,11,11,12,12,12,11, - 11,12,12,12,11,12,12,12,12,11,12,12,12,12,10,11, - 11,12,11,11,12,11,12,12,11,12,11,12,12,11,12,12, - 12,12,11,12,11,12,12,11,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 11,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,11,11,11,12,12,11,11, - 12,12,12,11,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,11,12,12,12,12,12,12,12,12,13,12,12,12,12, - 12,12,12,12,13,13,12,12,12,13,13,11,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,12, - 12,12,12,12,12,12,12,12,12,12,12,13,12,13,12,12, - 12,13,13,12,13,13,12,13,12,13,13,13,13,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13, - 13,12,13,12,13,12,11,11,11,12,12,11,12,12,12,12, - 11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,13,13,12,12,12,13,13,11,12,11,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,13,12,12,12,12,13, - 12,12,12,12,12,12,12,12,12,13,13,12,12,12,12,13, - 12,13,13,13,13,12,13,13,13,13,12,12,12,12,12,12, - 12,12,13,12,12,12,12,13,12,12,13,13,13,13,12,13, - 13,13,12,10,11,11,12,12,11,11,11,12,12,11,11,11, - 12,12,11,12,12,12,12,11,12,12,12,12,11,11,11,12, - 12,11,11,12,12,12,11,12,12,12,12,11,12,12,12,12, - 12,12,12,12,12,11,11,11,12,12,11,12,12,12,12,11, - 12,11,12,12,12,12,12,12,12,12,12,12,12,12,11,12, - 12,12,12,11,12,12,12,12,12,12,12,12,12,12,12,12, - 12,13,12,12,12,12,12,11,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,13,12,12,12,12,12,12, - 11,11,11,12,12,11,12,12,12,12,11,12,12,12,12,12, - 12,12,12,12,11,12,12,12,12,11,11,12,12,12,11,12, - 12,12,12,12,12,12,12,12,12,12,12,12,13,12,12,12, - 13,13,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,13,13,12,12,12,13,13,12,12,12,12,12, - 12,12,12,12,13,12,12,12,12,13,12,12,13,12,13,12, - 12,13,13,13,12,12,12,12,12,12,12,12,12,13,12,12, - 12,13,12,12,13,13,13,13,12,13,13,13,13,10,11,11, - 12,12,11,12,12,12,12,11,12,12,12,12,11,12,12,12, - 12,12,12,12,12,12,11,11,12,12,12,11,12,12,12,12, - 12,12,12,12,12,12,12,12,12,13,12,12,12,13,13,11, - 12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12, - 12,13,13,12,12,12,13,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,13,12,12,12,12,12,13,12,13,12,13, - 13,12,12,12,12,12,12,12,12,13,12,12,12,12,13,12, - 12,13,12,13,13,12,13,12,13,12,11,11,11,12,12,11, - 12,12,12,12,11,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,11,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,13,12,13,12,12,13,13,13,11,12,12,12, - 12,12,12,12,12,12,12,12,12,13,12,12,12,12,13,13, - 12,12,12,13,12,12,12,12,12,12,12,12,13,12,13,12, - 12,12,12,13,12,12,13,12,13,12,13,13,12,13,12,12, - 12,12,12,12,13,13,13,12,12,12,12,13,12,12,13,13, - 13,13,12,13,13,13,12,11,11,11,12,12,11,12,12,12, - 12,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,13,12,12,13,13,13,11,12,12,12,12,12,12, - 12,12,13,12,12,12,13,12,12,13,12,13,13,12,13,12, - 13,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,13,12,13,12,13,13,13,12,12,12,12,12,12, - 12,13,12,13,12,12,12,12,13,12,12,13,13,13,12,12, - 13,12,13,12,10,11,11,12,12,11,11,11,12,12,11,11, - 11,12,12,11,12,12,12,12,11,12,12,12,12,11,11,11, - 12,12,11,11,12,12,12,11,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,11,11,11,12,12,11,12,12,12,12, - 11,12,11,12,12,12,12,12,12,12,11,12,12,12,12,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,13,12,12,12,12,12,11,12,12,12,12,12,12,12, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,10,11,11,12,12,11,11,12,12,12,11,12,12,12,12, - 11,12,12,12,12,12,12,12,12,12,11,11,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,13,12,12, - 12,13,13,11,11,11,12,12,12,12,12,12,12,11,12,12, - 12,12,12,12,12,13,13,12,12,12,13,13,12,12,12,12, - 12,12,12,12,12,13,12,12,12,12,13,12,12,13,12,13, - 12,12,13,13,13,12,12,12,12,12,12,12,12,12,13,12, - 12,12,12,12,12,12,13,13,13,12,12,12,13,12,11,11, - 11,12,12,11,12,12,12,12,11,12,12,12,12,12,12,12, - 12,12,11,12,12,12,12,11,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,13,13,12,12,12,13,13, - 11,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12, - 12,12,13,13,12,12,12,13,12,12,12,12,12,12,12,12, - 12,12,13,12,12,12,13,13,12,13,13,13,13,12,13,13, - 13,13,12,12,12,12,12,12,12,12,13,12,12,12,12,13, - 12,12,13,12,13,13,12,13,12,13,12,11,11,11,12,12, - 11,12,12,12,12,11,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,11,12,12,12,12,12,12,12,12,13,12,12, - 12,13,13,12,12,13,12,13,12,12,13,13,13,11,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13, - 13,12,12,12,13,12,12,12,12,12,12,12,12,12,12,13, - 12,12,12,13,13,12,12,13,12,13,12,13,13,13,13,12, - 12,12,12,12,12,12,13,12,13,12,12,12,12,12,12,13, - 13,12,12,12,13,12,12,12,11,11,11,12,12,11,12,12, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,11,12,12,12,12,12,12,12,12,13,12,12,12,12,13, - 12,12,13,13,13,12,12,12,13,13,11,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,13,12,13,13,12,13, - 12,13,12,12,12,12,12,12,12,12,12,12,13,12,13,12, - 13,13,12,13,13,12,13,12,13,13,13,13,12,12,12,12, - 12,12,12,12,13,12,12,13,12,13,12,12,13,12,13,12, - 12,13,12,13,12, -}; - -static const static_codebook _44p8_p4_1 = { - 5, 3125, - (char *)_vq_lengthlist__44p8_p4_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p8_p4_1, - 0 -}; - -static const long _vq_quantlist__44p8_p5_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p8_p5_0[] = { - 2, 6, 6, 9, 9, 5, 7, 8,10,11, 5, 8, 7,11,10, 8, - 10,11,12,13, 8,11,10,13,12, 6, 7, 8,10,11, 7, 8, - 10,10,12, 8, 9, 9,12,12,10,10,12,12,14,10,12,12, - 14,13, 6, 8, 7,11,10, 8, 9, 9,12,12, 7,10, 8,12, - 11,10,12,12,13,14,10,12,10,14,12, 9,10,11,11,13, - 10,10,11,11,13,11,12,12,13,14,12,12,13,11,15,13, - 14,14,15,14, 9,11,10,13,11,11,12,12,13,13,10,11, - 10,13,11,13,14,14,15,15,12,13,12,15,11, 6, 8, 9, - 11,12, 8, 9,11,12,13, 8,10,10,13,13,11,12,13,14, - 15,11,12,13,14,14, 9, 9,10,12,13,10,10,12,12,14, - 10,11,11,13,14,12,12,14,14,15,13,13,14,15,15, 9, - 10,10,13,13,10,11,11,13,14,10,11,10,14,13,13,13, - 14,15,15,12,14,13,15,14,12,12,13,13,14,12,13,14, - 13,15,13,14,14,15,15,14,14,15,14,16,15,15,15,16, - 16,12,13,13,14,14,13,14,14,15,15,12,14,13,15,14, - 14,15,15,16,16,14,15,14,16,14, 6, 9, 8,12,11, 8, - 10,10,13,13, 8,11, 9,13,12,11,12,12,14,14,11,13, - 12,15,14, 9,10,10,13,13,10,10,11,13,14,10,12,11, - 14,13,12,13,14,14,15,13,13,13,15,14, 9,10, 9,13, - 12,10,11,11,14,13,10,12,10,14,12,13,14,13,15,15, - 12,14,12,15,14,12,13,13,14,14,13,13,13,14,15,13, - 14,14,15,15,14,14,15,14,16,14,15,15,16,16,12,13, - 12,14,13,13,14,14,15,15,12,14,13,15,13,15,15,15, - 16,16,14,15,14,16,14,11,12,12,13,14,12,13,14,14, - 16,12,13,13,15,15,14,14,16,15,17,14,15,15,16,16, - 12,13,14,14,15,13,13,15,15,16,14,14,14,15,16,15, - 15,16,16,17,15,15,16,16,17,13,13,13,15,15,14,14, - 15,15,16,13,14,14,15,16,15,15,16,16,17,15,16,15, - 17,16,14,15,15,16,16,15,15,16,16,17,15,16,16,17, - 17,16,16,17,16,18,16,17,17,17,17,15,15,15,16,16, - 15,16,16,17,17,15,16,16,17,16,16,17,17,18,18,16, - 17,16,17,16,11,12,12,15,13,13,13,13,15,15,12,14, - 13,16,14,14,15,15,16,16,14,15,14,17,15,13,13,13, - 15,14,13,14,14,16,15,14,14,14,16,15,15,15,16,16, - 17,15,16,15,17,16,12,14,13,15,14,14,14,14,16,15, - 13,14,13,16,15,15,16,16,17,16,15,16,15,17,16,15, - 15,15,16,16,15,15,16,16,17,15,16,16,17,17,16,16, - 17,17,17,17,17,17,18,17,14,15,15,16,16,15,16,16, - 17,16,15,16,15,17,16,17,17,17,18,17,16,17,16,18, - 16, 6, 9, 9,12,12, 8,10,10,12,13, 8,10,10,13,12, - 10,12,12,14,15,11,13,12,15,14, 8, 9,10,12,13, 9, - 10,11,13,14,10,11,11,14,13,12,12,13,14,15,12,13, - 13,15,15, 8,10,10,13,13,10,11,11,13,14,10,12,10, - 14,13,12,13,13,15,15,12,14,13,15,14,11,12,12,13, - 14,12,12,13,13,15,12,13,13,15,15,14,13,15,14,16, - 14,15,15,16,16,12,13,13,14,14,13,13,14,15,14,12, - 14,13,15,14,14,15,15,16,15,14,15,14,16,14, 7, 9, - 10,12,12, 9,10,11,13,14, 9,11,10,13,13,11,12,13, - 14,15,12,13,13,15,14, 9,10,11,12,13,10,10,12,13, - 14,11,11,12,14,14,12,12,14,14,15,13,13,14,15,15, - 9,11,11,13,13,11,12,12,14,14,10,12,10,14,13,13, - 14,14,15,15,13,14,13,16,14,12,12,13,14,15,13,13, - 14,14,16,13,14,14,15,15,14,14,15,14,17,14,15,15, - 16,16,12,13,13,15,14,13,14,14,15,15,13,14,13,16, - 14,15,15,15,16,16,14,15,14,16,14, 7,10, 9,13,12, - 10,11,12,12,14,10,12,11,14,12,12,13,13,14,15,12, - 14,13,15,14, 9,11,10,13,13,10,11,12,13,14,12,13, - 12,15,13,13,13,14,13,15,13,14,14,16,15,10,11,11, - 13,13,12,12,13,14,14,11,12,11,14,13,14,14,14,15, - 16,13,14,13,16,13,12,13,13,14,14,12,13,13,14,15, - 14,14,14,15,15,14,13,15,13,16,15,15,15,17,16,13, - 13,13,14,14,14,14,14,15,15,12,13,13,15,14,15,16, - 16,16,16,14,15,14,16,13,11,12,13,14,15,12,13,14, - 15,16,13,14,14,15,15,14,14,15,15,17,14,15,15,16, - 16,13,13,14,14,15,13,13,15,14,16,14,14,15,15,16, - 15,14,16,15,17,15,16,16,16,17,13,14,14,15,15,14, - 14,15,16,16,13,15,14,16,16,15,16,16,17,17,15,16, - 15,17,16,14,15,15,15,17,15,15,16,15,17,15,16,16, - 16,17,16,16,17,16,18,17,17,17,17,18,15,15,15,17, - 16,15,16,16,17,17,15,16,16,17,16,16,17,17,18,18, - 16,17,16,18,17,11,13,12,15,14,13,13,14,15,15,13, - 14,13,16,14,15,15,15,16,16,15,16,15,17,16,13,14, - 13,15,14,13,13,14,15,15,14,15,14,16,15,15,15,16, - 16,16,15,16,15,18,16,13,14,14,15,15,14,15,15,15, - 16,13,15,13,16,15,15,16,16,17,17,15,16,15,17,16, - 15,15,15,16,16,15,15,15,16,17,16,16,16,17,16,16, - 16,17,16,17,17,17,17,18,17,15,15,15,16,16,16,16, - 16,17,17,15,16,15,17,16,17,17,17,18,18,16,17,16, - 17,15, 6, 9, 9,12,12, 8,10,10,12,13, 8,10,10,13, - 12,11,12,13,14,15,10,12,12,14,14, 9,10,10,13,13, - 10,10,12,13,14,10,11,11,14,13,12,13,14,14,15,12, - 13,13,15,15, 8,10, 9,13,12,10,11,11,13,14, 9,11, - 10,14,13,12,13,13,15,15,12,13,12,15,14,12,13,13, - 14,14,12,13,13,14,15,13,14,14,14,15,14,14,15,14, - 16,14,15,15,16,16,11,12,12,14,13,13,13,13,15,15, - 12,13,12,15,13,14,15,15,16,16,14,15,14,16,14, 7, - 9,10,12,13,10,10,12,12,14,10,12,11,14,13,12,13, - 14,14,15,12,13,13,15,14,10,11,11,13,13,11,11,12, - 13,14,12,13,12,14,14,13,13,14,13,16,14,14,14,15, - 15, 9,10,11,13,14,12,12,13,13,15,10,12,10,14,13, - 13,14,14,15,16,13,14,13,15,13,13,14,13,14,15,12, - 13,13,14,15,14,14,14,15,15,14,13,15,13,16,15,16, - 16,16,16,12,13,13,14,14,14,14,14,15,15,12,13,13, - 15,14,15,15,16,16,16,14,15,13,16,13, 7,10, 9,12, - 12, 9,10,11,13,13, 9,11,10,14,13,12,13,13,14,15, - 11,13,12,15,14, 9,11,11,13,13,10,10,12,13,14,11, - 12,12,14,14,13,13,14,14,16,13,14,14,16,15, 9,11, - 10,13,12,11,12,11,14,14,10,12,10,14,13,13,14,13, - 15,15,12,14,12,16,14,12,13,13,14,15,13,13,14,14, - 16,13,14,14,15,15,14,14,15,14,16,15,15,15,16,16, - 12,13,12,15,14,13,14,14,15,15,12,14,13,16,14,14, - 15,15,16,16,14,15,14,17,14,11,12,13,14,15,13,13, - 14,14,16,13,14,13,15,15,15,15,16,16,17,15,15,15, - 16,16,13,14,13,15,15,13,13,15,15,16,14,15,15,16, - 16,15,15,16,15,17,16,16,16,17,17,13,13,14,14,15, - 14,14,15,15,16,13,14,13,15,15,15,16,16,16,17,15, - 16,15,16,16,15,15,15,16,16,15,15,16,16,17,16,16, - 16,17,17,16,16,17,16,18,17,17,17,18,18,15,15,15, - 16,16,16,16,16,17,17,15,15,15,16,16,17,17,17,17, - 18,16,16,16,17,15,11,13,12,15,14,13,13,14,15,15, - 12,14,13,16,14,14,15,15,16,16,14,15,14,16,15,13, - 14,14,15,15,13,14,14,16,16,14,15,14,16,16,15,15, - 16,17,17,15,16,16,17,17,13,14,13,15,14,14,14,14, - 16,15,13,15,13,16,14,15,16,15,17,16,15,16,14,17, - 15,14,16,15,16,17,15,16,16,16,17,15,16,16,17,17, - 16,16,17,17,18,16,17,17,18,17,14,15,15,17,15,15, - 16,16,17,16,15,16,15,17,15,16,17,17,18,17,16,17, - 16,18,15,10,12,12,14,14,12,13,13,15,15,12,13,13, - 15,15,13,14,14,15,16,14,15,14,16,16,12,13,13,15, - 15,12,13,14,15,15,13,14,14,15,15,14,14,15,16,17, - 14,15,15,17,16,12,13,13,15,15,13,14,14,15,16,13, - 14,14,16,15,14,15,15,16,17,14,15,15,17,16,13,14, - 14,15,16,14,14,15,15,16,14,15,15,16,16,15,15,16, - 16,17,15,16,16,17,17,14,15,15,16,16,15,15,15,16, - 16,15,15,15,16,16,16,17,16,17,17,16,16,16,18,16, - 11,12,12,14,14,12,13,14,15,15,12,13,13,15,15,13, - 14,15,16,16,14,15,15,16,16,12,13,13,15,15,13,13, - 14,15,16,13,14,14,15,16,14,14,15,16,17,15,15,15, - 16,17,12,13,13,15,15,13,14,14,15,16,13,14,14,16, - 15,15,15,15,16,17,15,16,15,17,16,14,14,15,15,16, - 14,14,15,15,17,15,15,16,16,17,15,15,16,15,18,16, - 16,16,17,17,14,15,15,16,16,15,16,16,17,17,15,15, - 15,17,16,16,17,16,17,17,16,16,16,18,16,11,12,12, - 14,14,13,13,14,15,15,13,14,13,15,15,14,15,15,16, - 16,14,15,15,16,16,12,13,13,15,15,13,13,14,15,15, - 14,14,14,16,15,15,15,15,15,16,15,16,15,17,16,12, - 13,13,15,15,14,14,15,15,16,13,14,13,16,15,15,15, - 16,16,17,15,16,15,17,15,14,15,14,16,16,14,15,15, - 16,16,15,16,15,17,16,15,15,16,15,17,16,17,16,17, - 17,14,15,15,16,16,15,16,16,16,17,14,15,15,16,16, - 16,17,17,17,18,16,16,16,17,16,12,13,13,15,15,13, - 13,14,15,16,13,14,14,16,15,14,15,15,16,17,14,15, - 15,17,16,13,14,14,15,16,14,14,15,15,17,14,15,15, - 16,16,15,14,16,15,17,15,16,16,17,17,13,14,14,16, - 16,14,15,15,16,16,14,15,14,16,16,15,16,16,17,17, - 15,16,15,17,16,15,15,16,15,17,15,15,16,15,17,15, - 16,16,16,17,16,15,17,15,18,17,17,17,17,17,15,15, - 15,17,17,16,16,16,17,17,15,16,15,17,17,16,17,17, - 18,18,16,17,15,18,15,11,12,12,15,15,13,13,15,14, - 16,13,14,13,16,14,15,15,16,16,17,15,16,15,17,15, - 12,14,13,16,14,13,13,14,14,16,14,15,14,16,15,15, - 15,16,15,17,16,16,16,17,16,12,13,14,15,16,15,15, - 15,15,16,13,15,13,16,14,16,16,16,17,17,15,16,15, - 17,15,15,16,15,16,15,14,14,15,16,16,16,16,16,17, - 16,15,15,16,15,17,17,17,17,18,17,15,15,15,16,16, - 16,16,16,16,17,14,15,15,17,16,17,17,17,17,18,15, - 16,15,18,14,10,12,12,14,14,12,13,13,15,15,12,13, - 13,15,15,14,14,15,15,16,13,15,14,16,16,12,13,13, - 15,15,13,14,14,15,16,13,14,14,15,15,14,15,15,16, - 17,14,15,15,17,16,12,13,13,15,15,13,14,14,15,15, - 12,14,13,15,15,14,15,15,16,17,14,15,14,17,15,14, - 15,15,16,16,14,15,15,16,17,15,15,15,17,16,16,16, - 16,16,17,16,16,16,17,17,13,14,14,16,15,14,15,15, - 16,16,14,15,14,16,16,15,16,16,17,17,15,16,15,17, - 16,11,12,12,14,15,13,13,14,14,15,13,14,13,15,15, - 14,15,15,16,16,14,15,15,16,16,12,14,13,15,15,13, - 13,14,15,16,14,15,14,16,15,15,15,16,15,17,15,16, - 16,17,16,12,13,13,15,15,14,14,15,15,16,13,14,13, - 16,15,15,15,16,16,17,15,15,15,16,16,14,15,15,16, - 16,14,15,15,16,16,15,16,16,17,17,16,16,16,16,17, - 16,17,17,18,17,14,14,15,15,16,15,15,16,16,17,14, - 15,15,16,16,16,16,16,17,17,15,16,15,17,15,11,12, - 12,14,14,12,13,14,15,15,12,13,13,15,15,14,15,15, - 16,16,13,15,14,16,16,12,13,13,15,15,13,14,14,15, - 16,13,14,14,16,16,15,15,15,16,17,15,15,15,17,16, - 12,13,13,15,15,13,14,14,16,15,13,14,13,16,15,15, - 16,15,17,17,14,15,14,17,16,14,15,15,16,16,15,15, - 16,16,17,15,16,16,17,17,16,16,16,16,18,16,17,16, - 18,17,14,15,14,16,15,15,15,15,17,16,14,15,14,17, - 15,16,17,16,17,17,15,16,15,17,15,11,12,12,15,15, - 13,13,15,14,16,13,15,13,16,14,15,15,16,15,17,15, - 16,15,17,16,12,14,13,15,15,13,13,15,15,16,15,15, - 15,16,15,15,15,16,15,17,16,16,16,17,16,12,13,14, - 15,16,14,14,15,15,16,13,14,13,16,14,16,16,16,16, - 17,15,16,15,17,15,15,16,15,16,16,14,15,15,16,16, - 16,16,16,17,16,15,15,16,15,17,17,17,17,18,17,15, - 15,15,15,16,16,16,16,16,17,14,15,14,16,15,17,17, - 17,17,18,15,16,15,17,15,12,13,13,15,15,13,14,14, - 15,16,13,14,14,16,15,14,15,15,16,17,14,15,15,17, - 16,13,14,14,16,15,13,14,15,16,16,14,15,15,16,16, - 15,15,16,16,17,15,16,16,17,17,13,14,13,16,15,14, - 15,15,16,16,13,15,14,16,15,15,16,16,17,17,15,16, - 14,17,15,15,15,16,17,17,15,15,16,16,17,16,16,16, - 17,17,16,15,17,16,18,17,17,17,18,18,15,15,15,17, - 14,16,16,16,17,16,15,16,15,17,15,16,17,17,18,17, - 16,17,15,18,15, -}; - -static const static_codebook _44p8_p5_0 = { - 5, 3125, - (char *)_vq_lengthlist__44p8_p5_0, - 1, -528744448, 1616642048, 3, 0, - (long *)_vq_quantlist__44p8_p5_0, - 0 -}; - -static const long _vq_quantlist__44p8_p5_1[] = { - 3, - 2, - 4, - 1, - 5, - 0, - 6, -}; - -static const char _vq_lengthlist__44p8_p5_1[] = { - 2, 3, 3, 3, 3, 3, 3, -}; - -static const static_codebook _44p8_p5_1 = { - 1, 7, - (char *)_vq_lengthlist__44p8_p5_1, - 1, -533200896, 1611661312, 3, 0, - (long *)_vq_quantlist__44p8_p5_1, - 0 -}; - -static const long _vq_quantlist__44p8_p6_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p8_p6_0[] = { - 2, 6, 6, 5, 7, 7, 5, 7, 7, 5, 7, 7, 7, 7, 9, 7, - 9, 9, 6, 7, 7, 8, 9, 9, 7, 9, 7, 6, 8, 8, 8, 9, - 10, 8, 9, 9, 8, 9,10, 9, 9,10,10,10,10, 8, 9, 9, - 10,10,11, 9,10,10, 6, 8, 8, 8, 9, 9, 8,10, 9, 8, - 9, 9, 9,10,10,10,11,10, 8,10, 9,10,11,10, 9,11, - 9, 6, 8, 8, 7, 9, 9, 7, 9, 9, 7, 9, 9, 8, 9,10, - 9,10,10, 8, 9, 9, 9,10,10, 9,10, 9, 7, 9, 9, 9, - 9,10, 9,10,10, 9, 9,10,10, 9,11,10,11,11, 9,10, - 10,10,11,11,10,11,10, 6, 9, 8, 9, 9,10, 9,10, 9, - 8,10,10, 9, 9,10,10,11,11, 9,10,10,10,11,11, 9, - 11, 9, 6, 8, 8, 7, 9, 9, 7, 9, 9, 8, 9, 9, 9, 9, - 10, 9,10,10, 7, 9, 9, 9,10,10, 8,10, 9, 6, 8, 9, - 9, 9,10, 9,10, 9, 9,10,10, 9, 9,11,10,11,11, 8, - 9,10,10,11,11, 9,10, 9, 7, 9, 9, 9,10,10, 9,10, - 9, 9,10,10,10,10,11,10,11,11, 9,10, 9,10,11,11, - 10,11, 9, -}; - -static const static_codebook _44p8_p6_0 = { - 5, 243, - (char *)_vq_lengthlist__44p8_p6_0, - 1, -527106048, 1620377600, 2, 0, - (long *)_vq_quantlist__44p8_p6_0, - 0 -}; - -static const long _vq_quantlist__44p8_p6_1[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p8_p6_1[] = { - 4, 7, 7, 7, 7, 8, 7, 8, 7, 7, 7, 8, 7, 8, 8, 8, - 8, 8, 7, 8, 7, 8, 8, 8, 7, 8, 8, 7, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 8, 9, 8, 8, 8, - 8, 9, 8, 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 8, 9, - 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, - 8, 8, 9, 8, 8, 8, 8, 9, 9, 8, 9, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, 8, - 8, 8, 9, 9, 8, 9, 9, 7, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 9, 8, 9, 8, 8, 8, 8, 8, 9, 9, 8, - 9, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 9, 8, 9, 9, 8, 8, 8, 8, 9, 8, 8, 9, 8, 7, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, - 8, 8, 8, 9, 9, 8, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 9, 9, 8, 9, 9, 8, 8, 8, 8, 9, 9, - 8, 9, 8, -}; - -static const static_codebook _44p8_p6_1 = { - 5, 243, - (char *)_vq_lengthlist__44p8_p6_1, - 1, -530841600, 1616642048, 2, 0, - (long *)_vq_quantlist__44p8_p6_1, - 0 -}; - -static const long _vq_quantlist__44p8_p7_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p8_p7_0[] = { - 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, -}; - -static const static_codebook _44p8_p7_0 = { - 5, 243, - (char *)_vq_lengthlist__44p8_p7_0, - 1, -512202240, 1635281408, 2, 0, - (long *)_vq_quantlist__44p8_p7_0, - 0 -}; - -static const long _vq_quantlist__44p8_p7_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p8_p7_1[] = { - 1, 7, 7,12,12, 5,11,12,12,12, 5,12,11,12,12,12, - 12,12,12,12,12,13,13,13,13, 7,11,11,13,13,13,12, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13, 7,13,10,13,13,13,13,13,13,13,12,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13, 7,13,12, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,12, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13, 8,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,12,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,12,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13, 8,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,12,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,10,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13, 8,13,12,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,11, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,11,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13, -}; - -static const static_codebook _44p8_p7_1 = { - 5, 3125, - (char *)_vq_lengthlist__44p8_p7_1, - 1, -514619392, 1630767104, 3, 0, - (long *)_vq_quantlist__44p8_p7_1, - 0 -}; - -static const long _vq_quantlist__44p8_p7_2[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const char _vq_lengthlist__44p8_p7_2[] = { - 1, 3, 2, 4, 5, 7, 7, 8, 8, 9, 9,10,10,11,11,12, - 12,13,13,14,14,15,15,15,15, -}; - -static const static_codebook _44p8_p7_2 = { - 1, 25, - (char *)_vq_lengthlist__44p8_p7_2, - 1, -518864896, 1620639744, 5, 0, - (long *)_vq_quantlist__44p8_p7_2, - 0 -}; - -static const long _vq_quantlist__44p8_p7_3[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const char _vq_lengthlist__44p8_p7_3[] = { - 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44p8_p7_3 = { - 1, 25, - (char *)_vq_lengthlist__44p8_p7_3, - 1, -529006592, 1611661312, 5, 0, - (long *)_vq_quantlist__44p8_p7_3, - 0 -}; - -static const char _huff_lengthlist__44p8_short[] = { - 3, 9,15,17,20,21,22,23, 5, 5, 7, 9,11,13,17,20, - 9, 5, 5, 6, 8,10,15,18,11, 7, 5, 4, 6, 9,13,17, - 14, 9, 7, 5, 6, 7,10,14,17,10, 8, 6, 6, 4, 5, 8, - 20,14,13,10, 8, 4, 3, 4,23,17,16,14,12, 6, 4, 4, -}; - -static const static_codebook _huff_book__44p8_short = { - 2, 64, - (char *)_huff_lengthlist__44p8_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p9_l0_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44p9_l0_0[] = { - 2, 5, 5, 7, 6, 8, 8, 9, 9,10,10,11,11, 4, 5, 5, - 6, 7, 8, 8, 9, 9,10,10,11,10, 4, 5, 5, 7, 6, 8, - 8, 9, 9,10,10,10,10, 6, 6, 7, 6, 7, 8, 8, 9, 9, - 10, 9,11, 9, 6, 6, 6, 7, 6, 8, 8, 9, 9, 9,10, 9, - 11, 7, 7, 8, 8, 8, 8, 9, 9, 9,10, 9,11, 9, 7, 8, - 8, 8, 8, 9, 8, 9, 9, 9,10, 9,11, 8, 9, 9, 9, 9, - 9, 9,10,10,11,10,12,10, 8, 9, 9, 9, 9, 9, 9,10, - 9,10,11,11,12, 9,10,10,10,10,10,10,10,11,11,11, - 11,12, 9,10,10,10,10,11,10,11,10,11,11,12,11,11, - 11,11,11,11,11,11,11,12,11,12,11,12,11,11,11,11, - 11,11,11,12,11,12,11,12,11, -}; - -static const static_codebook _44p9_l0_0 = { - 2, 169, - (char *)_vq_lengthlist__44p9_l0_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44p9_l0_0, - 0 -}; - -static const long _vq_quantlist__44p9_l0_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p9_l0_1[] = { - 4, 4, 4, 5, 5, 4, 4, 5, 5, 5, 4, 5, 4, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44p9_l0_1 = { - 2, 25, - (char *)_vq_lengthlist__44p9_l0_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p9_l0_1, - 0 -}; - -static const long _vq_quantlist__44p9_l1_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p9_l1_0[] = { - 1, 2, 3, 5, 9, 9, 4, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9,10,10,10,10,10,10,10,10, -}; - -static const static_codebook _44p9_l1_0 = { - 2, 25, - (char *)_vq_lengthlist__44p9_l1_0, - 1, -514619392, 1630767104, 3, 0, - (long *)_vq_quantlist__44p9_l1_0, - 0 -}; - -static const char _huff_lengthlist__44p9_lfe[] = { - 1, 1, -}; - -static const static_codebook _huff_book__44p9_lfe = { - 1, 2, - (char *)_huff_lengthlist__44p9_lfe, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44p9_long[] = { - 3, 3, 3, 3, 3, 3, 3, 3, -}; - -static const static_codebook _huff_book__44p9_long = { - 1, 8, - (char *)_huff_lengthlist__44p9_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p9_p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p9_p1_0[] = { - 1, 5, 5, 4, 8, 8, 4, 8, 8, 5, 7, 8, 8, 9,10, 8, - 10,10, 5, 8, 7, 8,10,10, 8,10, 9, 7, 9, 9, 9,11, - 11, 9,11,11, 9,11,11,11,12,13,11,13,13, 9,11,11, - 11,13,13,11,13,13, 7, 9, 9, 9,11,11, 9,11,11, 9, - 11,11,11,13,13,11,13,13, 9,11,11,11,13,13,11,13, - 12, 5, 9, 9, 9,11,11, 9,11,11, 9,11,11,11,12,13, - 11,13,13, 9,11,11,11,13,13,11,13,13, 9,11,12,11, - 13,13,12,13,13,11,12,13,13,14,15,13,14,14,12,13, - 13,13,15,15,13,15,14, 8,10,10,11,13,13,12,14,13, - 11,12,12,13,14,15,13,15,15,11,12,12,13,15,15,13, - 15,14, 5, 9, 9, 9,11,11, 9,11,11, 9,11,11,11,13, - 13,11,13,13, 9,11,10,11,13,13,11,13,12, 8,10,10, - 11,13,13,12,13,13,11,12,12,13,14,15,14,15,15,10, - 12,12,13,14,15,13,15,14, 9,12,11,12,13,13,11,13, - 13,12,13,13,13,15,15,13,14,15,11,13,12,13,15,14, - 13,15,14, -}; - -static const static_codebook _44p9_p1_0 = { - 5, 243, - (char *)_vq_lengthlist__44p9_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p9_p1_0, - 0 -}; - -static const long _vq_quantlist__44p9_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p9_p2_0[] = { - 4, 6, 6, 8, 8, 5, 7, 7, 9, 9, 5, 7, 7, 9, 9, 6, - 8, 8,11,11, 6, 8, 8,11,11, 6, 7, 7, 9, 9, 7, 8, - 9,10,11, 7, 9, 9,11,10, 8, 9,10,12,12, 8,10,10, - 12,12, 6, 7, 7, 9, 9, 7, 9, 9,10,10, 7, 9, 8,11, - 10, 8,10,10,12,12, 8,10, 9,12,12, 8, 9, 9,11,11, - 9,10,10,12,12, 9,11,11,12,13,11,12,12,13,14,11, - 12,12,14,14, 8, 9, 9,11,11, 9,11,10,13,12, 9,10, - 10,13,12,11,12,12,14,14,11,12,12,14,13, 7, 8, 9, - 10,10, 8,10,10,11,11, 8,10,10,11,11,10,11,11,13, - 13,10,11,11,13,13, 8, 9,10,10,11,10,11,11,12,13, - 10,11,11,12,12,11,11,12,13,14,11,12,12,14,14, 8, - 10,10,11,11,10,11,11,12,13,10,11,11,12,12,11,12, - 12,14,14,11,12,12,14,14,10,11,11,12,13,11,12,12, - 13,14,12,13,13,14,14,13,13,14,14,16,13,14,14,15, - 16,10,11,11,13,13,12,12,12,14,14,11,12,12,14,14, - 13,14,14,15,16,13,14,14,16,15, 7, 8, 8,10,10, 8, - 10,10,11,11, 8,10,10,12,11,10,11,11,13,13,10,11, - 11,13,13, 8,10,10,11,11,10,11,11,12,12,10,11,11, - 12,12,11,12,12,14,14,11,12,12,14,14, 8,10, 9,11, - 10,10,11,11,13,12,10,11,10,13,12,11,12,12,14,14, - 11,12,11,14,13,10,11,11,13,13,11,12,12,14,14,12, - 12,12,14,14,13,14,14,15,16,13,14,14,15,15,10,11, - 11,13,12,12,12,12,14,14,11,12,12,14,13,13,14,14, - 16,15,13,14,13,16,14,10,11,11,13,13,12,12,13,14, - 15,12,13,13,14,15,13,14,15,15,16,13,14,14,16,16, - 11,12,13,14,14,13,13,14,15,16,13,14,14,15,16,14, - 15,15,16,17,14,15,16,17,17,11,12,12,14,14,13,14, - 14,15,16,13,14,14,15,15,14,15,15,16,18,14,15,15, - 17,16,13,14,15,15,16,15,15,16,16,18,15,15,15,17, - 17,16,16,17,17,18,16,16,16,18,18,14,14,14,16,16, - 15,15,15,16,17,15,15,15,16,17,16,17,17,18,18,16, - 16,17,18,17,10,11,11,14,13,12,13,13,15,14,11,13, - 13,15,14,13,15,15,16,16,13,14,14,16,16,11,12,12, - 14,14,13,13,13,15,15,13,14,13,15,15,15,15,15,17, - 16,14,15,15,17,16,11,13,12,14,14,13,14,13,15,15, - 13,14,13,15,15,14,15,15,17,17,14,15,15,17,16,14, - 14,14,16,16,14,15,15,17,17,15,15,16,17,16,17,16, - 17,18,18,16,17,17,18,18,13,14,14,16,15,15,15,15, - 17,17,14,16,15,16,16,17,17,17,18,18,16,17,16,20, - 19, 6, 8, 8,10,10, 8,10,10,11,11, 8,10,10,12,11, - 10,11,11,13,13,10,11,11,13,13, 8, 9,10,11,11,10, - 11,11,12,12,10,11,11,13,12,11,12,12,14,14,11,12, - 12,14,14, 9,10,10,11,11,10,11,11,12,12,10,11,11, - 13,12,11,12,12,14,14,11,12,12,14,14,10,10,11,12, - 13,11,12,12,14,14,11,12,12,14,14,13,14,14,15,16, - 13,14,14,15,16,10,11,11,13,13,12,12,12,14,14,12, - 13,12,14,14,13,14,14,16,16,13,14,14,15,15, 9,10, - 10,11,12,10,11,11,12,13,10,11,11,13,12,11,12,12, - 14,14,11,12,12,14,14,10,10,11,12,13,11,12,12,13, - 14,11,12,12,13,14,12,13,14,14,15,12,13,13,15,15, - 10,11,11,13,13,11,12,12,13,14,11,12,12,14,13,12, - 13,13,15,15,12,13,13,15,15,12,11,13,12,14,13,13, - 14,14,15,13,13,14,14,15,14,15,15,16,17,14,15,15, - 16,17,12,13,12,14,14,13,14,14,15,15,13,14,14,15, - 15,14,15,15,16,17,14,15,15,16,17, 8, 9, 9,11,11, - 10,11,11,12,13,10,11,11,13,12,12,13,13,14,15,11, - 13,12,15,14, 9,11,10,12,12,11,12,12,13,14,11,12, - 12,14,13,13,13,14,15,15,13,14,13,15,15, 9,11,11, - 12,12,11,12,12,14,14,11,12,12,14,13,13,14,14,15, - 16,13,14,13,15,14,11,12,12,14,13,12,13,13,14,15, - 13,14,14,16,15,15,15,15,15,16,15,16,15,17,17,11, - 12,12,14,14,13,14,14,15,15,12,13,13,15,14,15,15, - 15,17,17,14,15,15,17,15,11,12,12,14,14,12,13,13, - 15,15,12,13,13,15,15,14,15,15,17,17,14,15,15,16, - 16,12,13,13,14,15,13,14,14,16,16,14,14,14,15,16, - 15,16,16,17,17,15,16,16,17,17,12,13,13,15,15,14, - 14,14,16,16,14,14,15,16,16,15,16,16,17,17,15,16, - 16,17,17,14,15,15,15,16,15,15,16,16,18,15,16,16, - 17,17,17,17,17,18,18,16,17,17,19,18,14,15,15,16, - 17,15,16,16,17,17,15,16,16,18,17,16,17,17,19,18, - 17,17,17,19,18,10,12,12,14,14,13,13,14,15,15,12, - 14,13,16,15,15,15,15,17,17,14,15,15,17,16,12,13, - 13,15,14,13,14,14,16,16,14,14,15,17,16,15,16,16, - 17,17,15,16,16,18,17,12,13,13,15,14,14,15,15,16, - 16,13,15,14,16,15,16,17,16,19,17,15,16,16,17,17, - 14,15,15,17,15,15,16,15,17,17,16,17,16,18,17,17, - 17,18,18,18,17,17,18,19,18,14,15,15,16,16,15,16, - 16,17,18,15,16,16,18,16,17,18,18,19,19,17,18,17, - 18,19, 6, 8, 8,10,10, 8,10,10,11,11, 8,10,10,12, - 11,10,11,11,13,13, 9,11,11,13,13, 9,10,10,11,11, - 10,11,11,12,12,10,11,11,12,12,11,12,12,14,14,11, - 12,12,14,14, 8,10, 9,11,11,10,11,11,12,12,10,11, - 11,12,12,11,12,12,14,14,11,12,12,14,14,10,11,11, - 13,13,11,12,13,14,14,12,12,12,14,14,13,14,14,15, - 16,13,14,14,16,16,10,11,10,13,12,11,12,12,14,14, - 11,12,12,14,14,13,14,14,15,16,13,14,14,16,15, 8, - 9, 9,11,11,10,11,11,12,13,10,11,11,13,12,12,13, - 13,14,15,12,13,13,15,14,10,11,11,12,12,11,11,12, - 13,14,11,12,12,14,14,13,13,14,15,16,13,14,14,15, - 15, 9,10,11,12,12,11,12,12,13,14,11,12,12,14,13, - 13,14,14,15,16,12,14,13,15,15,11,12,12,14,14,12, - 13,13,14,15,13,14,14,16,15,14,15,15,15,17,15,15, - 16,16,17,11,12,12,13,14,13,14,14,15,15,12,13,13, - 15,14,15,16,15,16,17,14,16,15,17,15, 9,10,10,12, - 11,10,11,11,13,13,10,11,11,13,12,11,12,12,14,14, - 11,12,12,14,14,10,11,11,12,13,11,12,12,13,14,11, - 12,12,14,14,12,13,13,15,15,12,13,13,15,15,10,11, - 10,13,12,11,12,12,13,13,11,12,12,14,13,12,13,13, - 15,15,12,13,13,15,14,12,13,12,14,14,13,14,14,15, - 15,13,14,14,15,15,14,15,15,16,16,14,15,15,16,16, - 11,13,11,14,12,13,13,13,15,14,12,14,13,15,14,15, - 15,15,17,16,14,15,14,17,15,10,12,12,14,14,13,13, - 14,15,16,12,14,13,15,15,14,15,16,17,17,14,15,16, - 17,17,12,13,13,14,15,13,14,14,16,16,14,14,15,16, - 16,16,16,16,17,17,16,16,16,18,18,12,13,13,14,15, - 14,14,15,16,16,13,14,14,16,15,16,16,16,17,18,15, - 16,16,17,17,14,15,15,16,16,15,15,16,17,17,15,16, - 16,17,18,17,18,18,18,19,17,18,18,19,19,14,15,15, - 16,16,15,16,16,17,17,15,16,16,17,17,17,17,18,20, - 18,17,18,17,18,18,11,12,12,14,14,12,13,14,15,15, - 12,13,13,15,15,14,15,15,16,17,14,15,15,16,17,12, - 13,13,15,15,14,14,14,16,16,14,14,14,16,16,15,16, - 16,17,17,15,16,16,17,17,12,13,13,15,14,13,14,14, - 16,15,14,15,14,16,15,15,16,16,17,17,15,16,16,17, - 16,14,15,15,16,16,15,16,16,17,17,16,16,16,17,17, - 17,17,17,19,18,17,17,17,18,19,14,15,14,17,15,15, - 16,16,17,17,15,16,15,17,17,16,17,17,18,18,16,17, - 17,18,17, 6,11,11,13,13,11,12,12,14,14,11,12,12, - 14,14,13,14,14,16,16,13,14,14,16,16,11,12,12,14, - 14,12,13,13,15,15,12,13,13,15,15,14,15,15,16,17, - 14,15,15,17,18,11,12,12,14,14,12,13,13,15,15,12, - 13,13,15,15,14,15,15,17,17,14,15,15,16,16,13,14, - 14,15,16,14,15,15,16,17,14,15,15,17,16,15,16,17, - 18,17,16,16,16,18,17,14,14,15,16,16,14,15,15,18, - 16,14,15,15,17,16,16,17,17,18,18,16,17,16,18,17, - 11,12,12,14,14,12,13,13,15,15,12,13,13,15,15,14, - 15,15,17,17,14,15,15,16,16,12,13,13,15,15,13,14, - 14,15,16,13,14,14,16,16,15,16,16,17,17,15,15,16, - 17,17,12,13,13,15,15,14,14,14,16,16,13,14,14,16, - 16,15,16,16,17,17,15,16,16,17,17,14,14,15,15,16, - 15,15,16,16,17,15,15,16,16,17,16,17,17,17,18,16, - 17,17,18,18,14,15,15,16,16,15,16,16,17,17,15,16, - 16,17,17,17,17,17,18,19,17,17,17,18,18,10,12,12, - 14,14,12,13,14,15,16,13,14,13,15,15,14,15,15,17, - 17,14,15,16,17,17,12,13,13,15,15,13,14,14,15,15, - 14,15,14,16,16,15,16,16,17,18,15,17,16,18,17,12, - 13,13,15,15,14,14,14,16,16,13,14,14,16,15,15,16, - 16,17,18,15,16,16,17,17,14,14,14,16,16,15,15,16, - 17,17,15,16,16,17,17,17,17,17,18,20,17,17,17,19, - 19,14,15,15,16,16,15,17,16,18,18,15,16,15,17,16, - 17,18,19,19,19,17,17,17,18,17,13,14,14,16,16,14, - 15,15,17,17,14,15,15,16,17,15,17,17,18,18,16,16, - 17,18,17,14,15,15,16,17,15,16,16,17,17,15,16,16, - 17,17,16,17,17,18,18,17,17,17,18,19,14,15,15,16, - 17,15,16,16,17,17,15,16,16,17,17,16,17,17,18,18, - 17,17,17,19,19,16,16,16,16,18,16,17,17,17,18,17, - 17,17,17,19,18,18,18,19,19,18,18,18,19,20,16,16, - 17,18,18,16,18,17,18,18,17,17,17,20,19,18,18,19, - 21,20,18,20,18,18,19,10,12,12,14,14,14,14,15,15, - 17,14,15,14,17,15,16,16,17,18,18,16,18,17,19,18, - 12,14,13,16,15,14,14,15,15,17,15,16,16,18,17,16, - 17,18,17,19,17,19,18,20,19,12,13,13,15,15,15,16, - 17,17,18,14,16,14,17,16,17,18,18,19,19,17,17,17, - 18,18,15,15,15,17,16,15,16,16,17,17,17,19,17,18, - 18,18,18,18,18,21,19,20,19,20,19,15,15,16,16,17, - 17,17,18,20,20,15,16,16,18,17,18,19,19,19,20,18, - 19,18,19,17, 6,11,11,13,13,11,12,12,14,14,11,12, - 12,14,14,13,14,14,16,16,13,14,14,16,16,11,12,12, - 14,14,12,13,13,15,15,12,13,13,15,15,14,15,15,17, - 17,14,15,15,17,16,11,12,12,14,14,12,13,13,15,15, - 12,13,13,15,15,14,15,15,16,16,14,15,15,16,16,13, - 14,14,16,16,15,15,15,16,16,14,15,15,17,16,16,17, - 17,19,18,16,17,17,18,18,13,14,14,15,15,14,15,15, - 17,16,14,15,15,17,16,16,17,16,17,18,15,16,16,18, - 18,10,12,12,14,14,12,13,14,15,15,12,13,13,15,15, - 14,15,15,17,17,14,15,15,17,16,12,13,13,15,15,14, - 14,14,15,16,14,15,15,16,16,15,16,16,17,18,16,16, - 16,18,18,12,13,13,14,14,14,14,15,16,16,13,14,14, - 16,16,15,16,16,18,18,15,16,16,19,17,14,15,15,16, - 17,15,15,16,17,17,16,17,16,17,18,17,17,18,17,19, - 17,17,18,18,19,14,14,14,16,16,15,16,16,17,17,15, - 16,15,17,17,17,17,17,19,20,16,17,17,18,18,11,12, - 12,14,14,12,13,13,15,15,12,13,13,15,15,14,15,15, - 16,16,14,15,14,16,16,12,13,13,15,15,14,14,14,16, - 16,13,14,14,16,16,15,16,16,18,17,15,16,16,17,17, - 12,13,13,15,15,13,14,14,16,16,13,14,14,16,16,15, - 16,15,18,18,15,16,15,17,16,14,15,15,16,16,15,16, - 16,17,17,15,16,16,18,17,16,17,17,18,18,16,17,17, - 18,18,14,15,14,16,15,15,16,15,17,17,15,16,15,17, - 16,16,17,17,18,18,17,17,16,19,17,10,12,12,14,15, - 14,14,15,15,17,14,15,14,17,15,16,17,17,17,18,16, - 17,17,18,18,12,14,13,16,15,14,14,16,15,17,15,17, - 16,18,17,17,17,18,17,19,18,18,18,19,18,12,13,14, - 15,15,15,16,16,16,17,14,15,14,18,16,18,17,18,19, - 19,17,18,17,20,18,15,15,15,17,17,15,16,16,17,18, - 18,18,18,19,18,18,18,19,18,20,18,19,19,21,21,15, - 15,16,16,17,17,18,18,18,18,15,16,16,17,17,17,19, - 20,19,20,17,18,18,19,17,13,14,14,16,16,14,15,15, - 16,17,14,15,15,17,17,16,16,17,17,18,15,17,16,17, - 17,14,15,15,16,16,15,16,16,17,17,16,16,16,17,17, - 17,17,18,17,18,17,17,17,18,20,14,15,15,17,16,15, - 16,16,17,17,15,16,16,17,17,17,17,17,18,18,16,17, - 17,19,18,16,16,17,17,17,17,18,17,19,18,17,17,17, - 18,19,17,20,18,19,21,17,19,18,19,20,15,17,15,17, - 16,16,17,17,18,18,17,17,17,18,17,18,19,18,19,21, - 18,18,17,19,19, -}; - -static const static_codebook _44p9_p2_0 = { - 5, 3125, - (char *)_vq_lengthlist__44p9_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p9_p2_0, - 0 -}; - -static const long _vq_quantlist__44p9_p3_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p9_p3_0[] = { - 2, 5, 4, 4, 7, 7, 4, 7, 6, 5, 6, 7, 7, 8, 9, 7, - 9, 9, 5, 7, 6, 7, 9, 9, 7, 9, 8, 6, 8, 8, 8,10, - 10, 8,10,10, 8, 9,10,10,11,12,10,12,12, 8,10,10, - 10,12,12,10,12,11, 6, 8, 8, 8,10,10, 8,10,10, 8, - 10,10,10,11,12,10,12,12, 8,10, 9,10,12,11,10,12, - 11, 5, 8, 8, 8,10,10, 8,10,10, 8, 9,10,10,11,11, - 10,11,11, 8,10,10,10,11,12,10,12,11, 8,10,10,10, - 11,11,10,11,11,10,11,11,11,12,13,11,12,13,10,11, - 11,11,13,13,11,13,13, 7, 9, 9,10,11,12,10,12,11, - 9,11,11,11,12,13,12,14,13, 9,11,11,12,13,14,11, - 13,12, 5, 8, 8, 8,10,10, 8,10,10, 8,10,10,10,11, - 12,10,12,12, 8,10, 9,10,12,11, 9,11,11, 7, 9, 9, - 10,11,12,10,12,11, 9,11,11,11,12,13,12,14,13, 9, - 11,11,12,13,14,11,13,12, 8,10,10,10,11,11,10,11, - 11,10,11,11,11,13,13,11,13,13,10,11,10,11,13,12, - 11,13,12, -}; - -static const static_codebook _44p9_p3_0 = { - 5, 243, - (char *)_vq_lengthlist__44p9_p3_0, - 1, -533200896, 1614282752, 2, 0, - (long *)_vq_quantlist__44p9_p3_0, - 0 -}; - -static const long _vq_quantlist__44p9_p3_1[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p9_p3_1[] = { - 4, 6, 6, 6, 7, 7, 6, 7, 7, 6, 7, 7, 7, 7, 8, 7, - 7, 8, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 8, 9, 9, 8, 8, 8, - 8, 9, 9, 8, 9, 9, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 9, 9, 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, 9, - 9, 5, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, - 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, 9, 9, 8, 8, 8, 8, - 9, 9, 8, 9, 9, 8, 8, 9, 9, 9, 9, 9, 9, 9, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 7, 8, 8, 8, 9, 9, 8, 9, 9, - 8, 9, 8, 9, 9, 9, 9, 9, 9, 8, 8, 8, 9, 9, 9, 9, - 9, 9, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, - 9, 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, 9, 9, 7, 8, 8, - 8, 9, 9, 8, 9, 9, 8, 8, 9, 9, 9, 9, 9, 9, 9, 8, - 8, 8, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 9, 9, 8, 9, - 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 8, 9, 9, 9, - 9, 9, 9, -}; - -static const static_codebook _44p9_p3_1 = { - 5, 243, - (char *)_vq_lengthlist__44p9_p3_1, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p9_p3_1, - 0 -}; - -static const long _vq_quantlist__44p9_p4_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p9_p4_0[] = { - 2, 5, 5, 4, 7, 7, 4, 7, 6, 5, 7, 7, 7, 8, 9, 7, - 9, 9, 5, 7, 7, 7, 9, 9, 7, 9, 8, 6, 7, 8, 8, 9, - 10, 8,10,10, 8, 9,10,10,11,12,10,11,12, 8,10,10, - 10,11,12,10,12,11, 6, 8, 7, 8,10,10, 8,10, 9, 8, - 10,10,10,11,12,10,12,12, 8,10, 9,10,12,11,10,12, - 11, 5, 8, 8, 8,10,10, 8,10,10, 7, 9,10, 9,10,11, - 10,11,11, 8,10,10,10,12,12,10,12,11, 7, 9, 9, 9, - 11,11, 9,11,11, 9,10,11,11,11,12,11,12,12, 9,11, - 11,11,12,12,11,12,12, 7, 9, 9,10,11,12,10,12,11, - 9,11,10,11,11,12,12,13,13, 9,11,11,12,13,13,11, - 13,11, 5, 8, 8, 8,10,10, 8,10,10, 8,10,10,10,11, - 12,10,12,12, 7, 9, 9, 9,11,11, 9,11,10, 7, 9, 9, - 10,11,12,10,12,11, 9,11,11,11,11,13,12,13,13, 9, - 10,11,12,13,13,11,12,11, 7, 9, 9, 9,11,11, 9,11, - 11, 9,11,11,11,12,12,11,12,12, 9,11,10,11,12,12, - 10,12,11, -}; - -static const static_codebook _44p9_p4_0 = { - 5, 243, - (char *)_vq_lengthlist__44p9_p4_0, - 1, -531365888, 1616117760, 2, 0, - (long *)_vq_quantlist__44p9_p4_0, - 0 -}; - -static const long _vq_quantlist__44p9_p4_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p9_p4_1[] = { - 6, 8, 8,10, 9, 8, 9, 9,10,10, 8, 9, 9,10,10, 8, - 10,10,10,10, 8,10,10,10,10, 9, 9, 9,10,10, 9,10, - 10,10,11, 9,10,10,11,11,10,10,10,11,11,10,10,10, - 11,11, 9, 9, 9,10,10, 9,10,10,11,11, 9,10,10,11, - 10,10,10,10,11,11,10,10,10,11,11,10,10,10,10,11, - 10,10,11,11,11,10,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,10,10,10,11,10,10,11,11,11,11,10,11, - 10,11,11,11,11,11,11,11,10,11,11,11,11, 9,10,10, - 10,11,10,10,11,11,11,10,11,11,11,11,10,11,11,11, - 11,10,11,11,11,11,10,10,11,11,11,11,11,11,11,11, - 11,11,11,11,12,11,11,12,12,12,11,11,11,12,12,10, - 11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11, - 11,12,12,11,11,11,12,12,11,11,11,11,11,11,12,12, - 12,12,11,12,12,12,12,11,12,12,12,12,12,12,12,12, - 12,11,11,11,11,11,11,12,12,12,12,11,12,11,12,12, - 11,12,12,12,12,12,12,12,12,12, 9,10,10,11,10,10, - 11,11,11,11,10,11,11,11,11,10,11,11,11,11,10,11, - 11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11, - 12,12,11,11,12,12,12,11,11,11,12,12,10,11,10,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12, - 11,11,11,12,12,11,11,11,11,11,11,12,12,12,12,11, - 12,12,12,12,11,12,12,12,12,12,12,12,12,12,11,11, - 11,11,11,11,12,12,12,12,11,12,11,12,12,12,12,12, - 12,12,11,12,12,12,12,11,11,11,11,11,11,12,12,12, - 12,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,13,13,12,12,12,13,13,11,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,13,13,12,12,12, - 13,13,12,12,12,12,12,12,12,12,12,13,12,12,12,13, - 13,12,13,13,13,13,12,13,13,13,13,12,12,12,12,12, - 12,12,12,13,13,12,12,12,13,13,12,13,13,13,13,12, - 13,13,13,13,11,11,11,11,11,11,12,12,12,12,11,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,11,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13, - 13,12,12,12,13,13,11,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,13,13,12,12,12,13,13,12, - 12,12,12,12,12,12,12,13,13,12,12,12,13,13,12,13, - 13,13,13,12,13,13,13,13,12,12,12,12,12,12,12,12, - 13,13,12,12,12,13,12,12,13,13,13,13,12,13,13,13, - 13, 7,10,10,11,11,10,10,11,11,11,10,11,11,11,11, - 10,11,11,11,11,10,11,11,11,11,10,10,10,11,11,10, - 11,11,11,11,11,11,11,11,12,11,11,11,12,12,11,11, - 11,12,12,10,11,11,11,11,11,11,11,12,11,11,11,11, - 12,11,11,11,11,12,12,11,11,11,12,12,11,11,11,11, - 11,11,11,11,12,12,11,11,12,12,12,11,12,12,12,12, - 11,12,12,12,12,11,11,11,11,11,11,12,12,12,12,11, - 11,12,12,12,11,12,12,12,12,11,12,12,12,12,10,11, - 11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11, - 12,12,11,11,11,12,12,11,11,11,11,11,11,11,12,12, - 12,11,11,11,12,12,11,12,12,12,12,11,12,12,12,12, - 11,11,11,11,11,11,12,11,12,12,11,11,11,12,12,11, - 12,12,12,12,11,12,12,12,12,11,11,11,11,12,11,12, - 12,12,12,11,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,11,11,11,12,12,11,12,12,12,12,11,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,10,11,10,11,11, - 11,11,11,12,12,11,11,11,12,12,11,12,12,12,12,11, - 12,12,12,12,10,11,11,12,11,11,11,12,12,12,11,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,11,11,11, - 12,11,11,12,12,12,12,11,12,11,12,12,12,12,12,12, - 12,12,12,12,12,12,11,12,11,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,13,12,12,12,12,12,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,13,12,12,12,13,12,11,11,11,12,12,12,12,12, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 13,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,13,13,13,12,12,12,13,13,11,12,12,12,12,12, - 12,12,12,13,12,12,12,12,12,12,12,13,13,13,12,13, - 12,13,13,12,12,12,12,12,12,12,12,13,13,12,12,12, - 13,13,12,13,13,13,13,12,13,13,13,13,12,12,12,12, - 12,12,12,12,13,13,12,13,12,13,13,12,13,13,13,13, - 12,13,13,13,13,11,11,11,12,12,12,12,12,12,12,11, - 12,12,12,12,12,12,12,13,13,12,12,12,13,13,11,12, - 12,12,12,12,12,12,12,12,12,12,12,13,13,12,13,12, - 13,13,12,13,13,13,13,11,12,12,12,12,12,12,12,13, - 13,12,12,12,13,12,12,13,13,13,13,12,13,13,13,13, - 12,12,12,12,12,12,12,13,13,13,12,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,12,12,12,12,12,12,13, - 13,13,13,12,12,12,13,13,13,13,13,13,13,13,13,13, - 13,13, 7,10,10,11,11,10,11,11,11,11,10,11,11,11, - 11,10,11,11,11,11,10,11,11,11,11,10,11,11,11,11, - 11,11,11,11,11,11,11,11,12,11,11,11,12,12,12,11, - 11,11,12,12,10,10,10,11,11,11,11,11,12,11,10,11, - 11,11,11,11,11,11,12,12,11,11,11,12,12,11,11,11, - 11,11,11,11,12,12,12,11,12,11,12,12,11,12,12,12, - 12,11,12,12,12,12,11,11,11,11,11,11,11,11,12,12, - 11,12,11,12,12,11,12,12,12,12,11,12,12,12,12,10, - 10,10,11,11,11,11,11,12,12,11,11,11,12,12,11,12, - 12,12,12,11,12,12,12,12,11,11,11,11,11,11,11,12, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,11,11,11,11,11,11,12,12,12,12,11,12,11,12,12, - 12,12,12,12,12,12,12,12,12,12,11,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,13,12,12, - 12,13,12,11,11,11,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,10,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12, - 11,11,11,12,12,11,11,11,11,11,11,11,12,12,12,11, - 12,11,12,12,11,12,12,12,12,11,12,12,12,12,11,11, - 11,11,11,11,11,11,12,12,11,11,11,12,12,11,12,12, - 12,12,11,12,12,12,12,11,11,11,12,11,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 11,11,11,12,11,11,12,12,12,12,11,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,11,11,11,12,12,11,12, - 12,12,12,12,12,12,12,12,12,12,12,13,13,12,12,12, - 13,12,11,12,12,12,12,12,12,12,12,13,12,12,12,13, - 13,12,13,13,13,13,12,13,13,13,13,11,12,12,12,12, - 12,12,12,12,13,12,12,12,12,12,12,13,13,13,13,12, - 13,13,13,13,12,12,12,12,12,12,12,13,13,13,12,13, - 12,13,13,13,13,13,13,13,13,13,13,13,13,12,12,12, - 12,12,12,13,13,13,13,12,13,12,13,13,13,13,13,13, - 13,13,13,13,13,13,11,11,11,12,12,11,12,12,12,12, - 11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13, - 12,13,13,12,12,12,13,13,11,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,13,13,12,13,12,13, - 13,12,12,12,12,12,12,12,12,13,13,12,12,12,13,13, - 13,13,13,13,13,12,13,13,13,13,12,12,12,12,12,12, - 13,12,13,13,12,13,12,13,12,12,13,13,13,13,12,13, - 13,13,13, 8,11,11,12,12,11,12,12,12,12,11,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,11,11,11,12, - 12,11,12,12,12,12,12,12,12,12,12,12,12,12,13,13, - 12,12,12,13,13,11,11,11,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,13,13,12,12,12,13,13,11,12, - 12,12,12,12,12,12,12,13,12,12,12,12,12,12,12,13, - 13,13,12,12,13,13,13,11,12,12,12,12,12,12,12,13, - 12,12,12,12,13,13,12,13,13,13,13,12,13,13,13,13, - 11,11,11,12,12,11,12,12,12,12,11,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,11,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,13,13,12,12,12, - 13,13,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,13,12,13,13,12,13,12,13,13,12,12,12,12,12, - 12,12,12,12,13,12,12,12,13,13,12,13,13,13,13,12, - 13,13,13,13,12,12,12,12,12,12,12,12,13,13,12,12, - 12,13,13,12,13,13,13,13,12,13,13,13,13,11,11,11, - 12,12,11,12,12,12,12,11,12,12,12,12,12,12,12,13, - 12,12,12,12,12,13,11,12,12,12,12,12,12,12,12,13, - 12,12,12,12,13,12,13,13,13,13,12,13,13,13,13,11, - 12,12,12,12,12,12,12,12,13,12,12,12,13,12,12,13, - 13,13,13,12,13,13,13,13,12,12,12,12,12,12,12,12, - 13,13,12,12,13,13,13,12,13,13,13,13,12,13,13,13, - 13,12,12,12,12,12,12,13,13,13,13,12,13,12,13,13, - 12,13,13,13,13,13,13,13,13,13,11,11,11,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,11,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,13,13,13,12,13,13,13,13,11,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13, - 12,13,12,13,13,12,12,12,12,12,12,12,12,13,13,12, - 12,12,13,13,12,13,13,13,13,12,13,13,13,13,12,12, - 12,12,12,12,13,12,13,13,12,12,12,13,13,13,13,13, - 13,13,12,13,13,13,13,11,11,11,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,13,12,12,12,13,12, - 11,12,12,12,12,12,12,12,12,12,12,12,12,13,13,12, - 12,13,13,13,12,13,13,13,13,11,12,12,12,12,12,12, - 12,12,13,12,12,12,13,12,12,13,13,13,13,12,13,13, - 13,13,12,12,12,12,12,12,12,12,13,13,12,12,12,13, - 13,13,13,13,13,13,13,13,13,13,13,12,12,12,12,12, - 12,13,13,13,13,12,13,12,13,13,13,13,13,13,13,13, - 13,13,13,13, 8,11,11,11,11,11,12,12,12,12,11,12, - 12,12,12,12,12,12,12,12,11,12,12,12,12,11,11,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 13,12,12,12,13,13,11,11,11,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,13,13,12,12,12,13,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,13,13,12,13, - 13,13,13,12,13,13,13,13,11,12,12,12,12,12,12,12, - 12,13,12,12,12,13,12,12,13,13,13,13,12,13,12,13, - 13,11,11,11,12,12,12,12,12,12,12,11,12,12,12,12, - 12,12,12,13,13,12,12,12,13,12,11,12,12,12,12,12, - 12,12,12,12,12,12,12,13,13,12,12,13,13,13,12,13, - 13,13,13,11,12,12,12,12,12,12,12,13,13,12,12,12, - 12,12,12,13,13,13,13,12,13,13,13,13,12,12,12,12, - 12,12,12,13,13,13,12,12,13,13,13,13,13,13,13,13, - 12,13,13,13,13,12,12,12,12,12,12,13,12,13,13,12, - 12,12,13,13,13,13,13,13,13,12,13,13,13,13,11,11, - 11,12,12,11,12,12,12,12,11,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,13,12,13,13,12,12,12,13,13, - 11,12,12,12,12,12,12,12,12,13,12,12,12,12,12,12, - 12,12,13,13,12,13,12,13,13,12,12,12,12,12,12,12, - 12,13,12,12,12,12,13,13,12,13,13,13,13,12,13,13, - 13,13,12,12,12,12,12,12,12,12,13,13,12,12,12,13, - 12,12,13,13,13,13,12,13,13,13,13,11,11,11,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,13,13,11,12,12,12,12,12,12,12,12,13,12,12, - 12,12,12,12,13,13,13,13,12,13,13,13,13,11,12,12, - 12,12,12,12,12,12,13,12,12,12,12,12,12,13,13,13, - 13,12,13,13,13,13,12,12,12,12,12,12,12,12,13,13, - 12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,12, - 12,12,12,12,12,13,13,13,13,12,12,12,13,12,13,13, - 13,13,13,12,13,13,13,13,11,11,11,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 13,11,12,12,12,12,12,12,12,12,12,12,12,12,13,12, - 12,12,12,13,13,12,13,13,13,13,11,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,13,13,13,13,12,13, - 12,13,13,12,12,12,12,12,12,12,13,13,13,12,13,12, - 13,13,12,13,13,13,13,13,13,13,13,13,12,12,12,12, - 12,12,12,12,12,13,12,12,12,13,13,13,13,13,13,13, - 12,13,13,13,13, -}; - -static const static_codebook _44p9_p4_1 = { - 5, 3125, - (char *)_vq_lengthlist__44p9_p4_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p9_p4_1, - 0 -}; - -static const long _vq_quantlist__44p9_p5_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p9_p5_0[] = { - 4, 6, 6, 9, 9, 6, 7, 8,10,11, 6, 8, 7,10,10, 8, - 10,10,12,12, 8,10,10,12,12, 6, 7, 8,10,10, 7, 8, - 9,10,11, 8, 9, 9,11,11,10,10,11,12,13,10,11,11, - 13,13, 6, 8, 7,10,10, 8, 9, 9,11,11, 7, 9, 8,11, - 10,10,11,11,13,13,10,11,10,13,12, 9,10,10,11,12, - 10,10,11,12,13,10,11,11,12,13,12,12,13,12,14,12, - 13,13,14,14, 9,10,10,12,11,10,11,11,13,12,10,11, - 10,13,12,12,13,13,14,14,12,13,12,14,12, 7, 8, 8, - 10,11, 8, 9,10,11,12, 8, 9, 9,11,12,10,11,12,13, - 14,10,11,11,13,13, 8, 9,10,11,12, 9,10,11,12,13, - 10,10,11,12,12,11,12,12,13,14,11,12,12,14,14, 8, - 9, 9,11,12,10,10,11,12,13, 9,10,10,12,12,11,12, - 12,14,14,11,12,12,14,13,11,11,12,12,13,11,12,12, - 13,14,12,12,13,14,14,13,13,14,14,16,13,14,14,15, - 15,11,12,11,13,13,12,12,12,14,14,11,12,12,14,13, - 13,14,14,15,15,13,14,13,15,14, 7, 8, 8,11,10, 8, - 10, 9,12,11, 8,10, 9,12,11,10,11,11,13,13,10,12, - 11,14,13, 8, 9, 9,12,11, 9,10,10,12,12,10,11,10, - 13,12,11,12,12,13,14,11,12,12,14,14, 8,10, 9,12, - 11,10,11,10,12,12, 9,11,10,13,11,11,12,12,14,14, - 11,12,12,14,13,11,11,12,13,13,11,12,12,13,14,12, - 12,12,14,14,13,13,14,14,15,13,14,14,15,15,11,12, - 11,13,12,12,12,12,14,14,11,12,12,14,13,13,14,14, - 15,15,13,14,13,15,14,10,11,11,12,13,11,12,12,13, - 14,11,12,12,13,14,13,13,14,14,16,13,14,14,15,15, - 11,12,12,12,14,12,12,13,13,15,12,13,13,13,15,14, - 14,15,15,16,14,14,15,15,16,11,12,12,13,14,12,13, - 13,14,15,12,13,13,14,14,14,14,15,15,16,14,14,14, - 15,15,13,14,14,14,15,14,14,15,15,16,14,15,15,15, - 16,15,15,16,16,18,16,16,16,17,17,13,14,14,15,15, - 14,14,15,16,16,14,14,14,16,15,16,16,16,17,17,15, - 16,16,17,16,10,11,11,13,12,11,12,12,14,13,11,12, - 12,14,13,13,14,14,15,15,13,14,13,16,14,11,12,12, - 14,13,12,13,13,14,14,12,13,13,15,14,14,14,14,15, - 15,14,15,14,16,15,11,12,12,14,12,12,13,13,15,14, - 12,13,12,15,13,14,15,14,16,15,14,15,14,16,15,13, - 14,14,15,15,14,14,14,15,16,14,15,14,16,16,15,16, - 16,16,17,16,16,16,17,17,13,14,14,15,14,14,15,15, - 16,15,14,15,14,16,15,16,16,16,17,17,15,16,15,18, - 16, 6, 8, 8,11,11, 8, 9,10,11,12, 8,10, 9,12,12, - 10,11,11,13,13,10,12,11,14,13, 8, 9, 9,11,12, 9, - 10,10,12,12, 9,10,10,12,12,11,11,12,13,14,11,12, - 12,14,14, 8,10, 9,12,11,10,11,11,12,12, 9,11,10, - 13,12,11,12,12,14,14,11,12,12,14,13,10,11,11,13, - 13,11,12,12,13,14,11,12,12,14,14,13,13,14,13,15, - 13,14,14,15,15,11,12,11,13,13,12,12,12,14,14,11, - 12,12,14,13,13,14,14,15,15,13,14,13,15,14, 8, 9, - 9,11,11, 9,10,10,12,12, 9,10,10,12,12,11,12,12, - 13,14,11,12,12,14,14, 9, 9,10,11,12,10,10,11,12, - 13,10,10,11,12,13,12,12,13,13,15,12,12,13,14,14, - 9,10,10,12,12,10,11,11,13,13,10,11,11,13,13,12, - 13,13,14,15,12,13,12,14,14,11,11,12,12,14,12,12, - 13,13,14,12,12,13,13,14,13,13,14,14,16,14,14,14, - 15,15,11,12,12,14,13,12,13,13,14,14,12,13,13,15, - 14,14,14,14,16,16,13,14,14,16,14, 7, 9, 9,12,11, - 9,10,10,12,12, 9,11,10,13,12,11,12,12,13,14,11, - 13,12,14,13, 9,10,10,12,12,10,10,11,12,13,10,12, - 11,13,13,12,12,13,13,14,12,13,13,15,14, 9,10,10, - 12,12,11,11,11,13,13,10,12,10,13,12,12,13,13,14, - 15,12,13,12,15,13,11,12,12,14,13,12,12,13,13,14, - 12,13,13,15,14,13,13,14,13,16,14,15,14,16,15,12, - 12,12,14,14,13,13,13,14,14,12,13,12,14,13,14,15, - 15,16,16,13,14,13,16,13,10,11,12,13,14,11,12,13, - 13,15,12,12,13,14,14,13,14,14,15,16,13,14,14,16, - 15,12,12,13,12,14,12,12,13,13,15,13,13,13,13,15, - 14,14,15,14,16,14,15,15,15,16,12,13,12,14,14,13, - 13,13,15,15,12,13,13,15,15,14,15,15,16,16,14,15, - 15,16,16,13,14,14,13,16,14,14,15,14,16,14,14,15, - 14,16,15,15,16,15,18,16,16,16,16,17,14,14,14,16, - 15,14,15,15,16,16,14,15,15,16,16,16,16,16,17,17, - 15,16,16,17,16,10,12,11,14,13,12,13,13,14,14,12, - 13,12,15,14,14,14,14,15,15,14,15,14,16,15,12,13, - 12,14,13,12,13,13,15,14,13,14,13,15,14,14,15,15, - 16,16,14,15,15,17,15,12,13,12,14,14,13,14,14,15, - 15,13,14,13,15,14,15,15,15,16,16,14,15,15,17,15, - 14,14,14,16,15,14,15,15,16,16,14,15,15,16,15,16, - 16,16,16,17,16,17,16,18,17,14,14,14,16,15,15,15, - 15,16,16,14,15,14,16,15,16,16,17,17,17,15,16,15, - 17,16, 6, 8, 8,11,11, 8, 9,10,12,12, 8,10, 9,12, - 11,10,11,12,13,13,10,11,11,13,13, 8, 9,10,11,12, - 9,10,11,12,13,10,11,11,12,12,11,12,12,13,14,11, - 12,12,14,14, 8, 9, 9,12,11, 9,10,10,12,12, 9,10, - 10,12,12,11,12,12,14,14,11,12,11,14,13,11,11,12, - 13,13,11,12,12,13,14,12,12,12,14,14,13,13,14,14, - 15,13,14,14,15,15,10,11,11,13,13,11,12,12,14,14, - 11,12,12,14,13,13,14,14,15,15,13,14,13,15,13, 7, - 9, 9,11,12, 9,10,11,12,13, 9,10,10,12,12,11,12, - 13,13,14,11,12,12,14,14, 9,10,10,12,12,10,10,11, - 12,13,11,12,11,13,13,12,12,13,13,15,12,13,13,15, - 14, 9,10,10,12,12,10,11,12,13,13,10,11,10,13,12, - 12,13,13,14,15,12,13,12,14,13,12,12,12,14,14,12, - 12,13,13,14,13,13,13,15,14,14,13,14,13,16,14,15, - 15,16,16,11,12,12,13,14,12,13,13,14,15,12,13,12, - 14,13,14,14,15,15,16,13,14,13,15,13, 8, 9, 9,11, - 11, 9,10,10,12,12, 9,10,10,12,12,11,12,12,14,14, - 11,12,11,14,13, 9,10,10,12,12,10,11,11,13,13,10, - 11,11,13,13,12,12,13,14,15,12,13,13,15,14, 9,10, - 9,12,11,10,11,10,13,12,10,11,10,13,12,12,13,12, - 14,14,12,13,12,15,13,11,12,12,13,14,12,13,13,14, - 14,12,13,13,14,14,14,14,14,14,16,14,14,14,16,15, - 11,12,11,14,12,12,13,12,15,13,12,13,12,15,13,14, - 14,14,16,15,13,14,13,16,14,10,11,12,13,14,12,12, - 13,13,15,12,13,13,14,14,14,14,15,15,16,14,14,14, - 15,16,12,12,13,14,14,12,13,14,14,15,13,14,14,15, - 15,14,15,15,15,17,15,15,15,16,16,12,12,13,13,14, - 13,13,14,14,15,12,13,13,14,15,15,15,15,15,17,14, - 15,15,15,15,14,14,14,16,16,14,15,15,15,16,15,15, - 15,16,16,16,15,16,16,18,16,16,17,17,17,14,14,14, - 15,16,15,15,15,16,17,14,15,14,16,16,16,16,17,17, - 18,16,16,15,17,16,10,12,11,14,13,12,12,12,14,14, - 11,13,12,14,13,13,14,14,15,15,13,14,13,16,15,12, - 12,13,14,14,12,13,13,15,15,13,13,13,15,15,14,15, - 15,16,16,14,15,15,17,16,12,13,12,14,12,13,13,13, - 15,13,12,13,12,15,13,14,15,15,16,15,14,15,14,16, - 14,14,14,14,16,16,14,15,15,16,16,14,15,15,16,16, - 15,16,16,16,17,16,17,16,18,17,13,14,14,16,13,14, - 15,15,16,14,14,15,14,16,14,16,16,16,17,16,15,16, - 15,18,15, 9,11,11,13,13,11,12,12,14,14,11,12,12, - 14,14,13,14,14,15,15,13,14,14,15,15,11,12,12,14, - 14,11,12,13,14,15,12,13,13,15,14,13,14,14,15,16, - 13,14,14,16,16,11,12,12,14,14,12,13,13,15,15,12, - 13,13,15,14,14,14,14,16,16,14,15,14,16,15,12,13, - 13,14,15,12,13,14,15,16,13,14,14,16,16,14,14,15, - 16,17,15,15,15,17,17,13,14,14,15,15,14,15,14,16, - 16,14,15,14,16,15,15,16,16,17,17,15,16,15,17,16, - 10,12,12,13,14,11,12,13,14,14,12,13,12,14,14,13, - 14,14,15,16,13,14,14,16,15,11,12,12,14,14,12,12, - 13,14,15,12,13,13,15,15,13,13,15,15,17,14,14,15, - 16,16,12,13,12,14,14,12,13,13,15,15,12,13,13,15, - 14,14,15,15,16,16,14,15,14,16,16,13,12,14,13,16, - 13,13,15,14,16,14,13,15,15,16,14,14,16,15,17,15, - 15,16,16,17,13,14,14,16,15,14,15,15,16,16,14,15, - 14,16,15,16,16,16,17,17,15,16,16,18,16,10,12,12, - 14,14,12,12,13,14,14,12,13,12,15,14,13,14,14,15, - 16,14,15,14,16,15,11,12,12,14,14,12,13,13,14,15, - 13,14,13,15,15,14,14,15,15,16,14,15,15,17,16,12, - 13,13,14,14,13,13,14,15,15,12,14,13,15,15,14,15, - 15,16,16,14,15,15,17,15,13,14,13,15,15,13,14,14, - 15,16,14,15,14,17,16,15,15,15,15,17,16,16,16,18, - 17,14,14,14,16,16,15,15,15,16,16,14,15,14,16,16, - 16,16,17,17,17,16,16,16,17,16,11,12,13,14,14,12, - 13,13,15,15,12,13,13,15,15,14,15,15,16,16,14,15, - 15,17,16,12,13,13,14,15,13,13,14,14,16,13,14,14, - 15,16,15,14,16,15,17,15,15,16,16,17,12,13,13,15, - 15,13,14,14,16,16,13,14,14,16,15,15,15,16,17,17, - 15,16,15,17,16,14,14,15,13,16,15,14,16,14,17,15, - 15,16,14,17,16,15,17,15,18,16,16,17,16,18,14,15, - 15,17,16,15,16,16,17,17,15,16,15,17,16,16,17,17, - 18,18,16,17,15,18,16,11,12,12,14,14,13,13,14,14, - 15,13,14,13,16,14,15,15,15,16,16,15,16,15,17,16, - 12,13,13,15,14,13,13,14,15,15,14,15,14,16,15,15, - 15,16,15,16,16,16,16,18,16,12,13,13,15,15,14,14, - 15,15,16,13,14,13,16,15,16,16,16,17,17,15,16,15, - 17,15,14,15,14,16,15,14,15,15,16,16,15,16,15,17, - 16,16,15,16,15,17,17,18,17,18,17,15,15,15,16,16, - 16,16,16,17,17,14,15,15,17,16,17,17,18,18,18,16, - 17,15,18,15, 9,11,11,13,13,11,12,12,14,14,11,12, - 12,14,14,13,14,14,15,16,13,14,14,15,15,11,12,12, - 14,14,12,13,13,14,15,12,13,13,14,14,14,14,15,15, - 16,14,14,14,16,16,11,12,12,14,14,12,13,13,14,15, - 11,13,12,14,14,13,14,14,16,16,13,14,14,16,15,13, - 14,14,15,15,14,14,15,15,16,14,15,14,16,16,15,15, - 16,16,17,15,16,16,17,17,12,13,13,15,15,13,14,14, - 16,15,12,14,13,16,15,15,16,15,17,17,14,15,15,17, - 15,10,12,12,14,14,12,12,13,14,15,12,13,12,14,14, - 14,14,15,15,16,13,14,14,16,16,12,13,13,14,14,13, - 13,14,14,15,13,14,13,15,15,14,15,15,15,17,14,15, - 15,16,16,11,12,12,14,14,13,13,14,15,15,12,13,13, - 15,14,14,15,15,16,17,14,15,14,16,15,14,14,14,16, - 16,14,15,15,16,16,15,15,15,16,16,15,16,16,16,18, - 16,17,16,18,17,13,13,14,15,15,14,14,15,16,16,13, - 14,14,16,15,16,16,17,17,17,15,15,15,17,15,10,12, - 12,14,13,12,12,13,14,14,11,13,12,14,14,13,14,14, - 16,16,13,14,14,16,15,12,12,13,14,14,12,13,13,14, - 15,13,13,13,15,15,14,14,15,16,16,14,15,15,16,16, - 11,12,12,14,14,12,13,13,15,15,12,13,12,15,14,14, - 15,14,16,16,13,15,13,16,15,13,14,14,15,16,14,15, - 15,15,17,14,15,15,16,16,16,15,16,16,17,16,16,16, - 17,17,13,14,12,16,13,14,15,13,16,15,13,15,13,16, - 14,15,16,15,17,16,15,16,14,17,15,11,12,12,14,15, - 13,13,14,14,16,13,14,13,15,14,15,15,16,16,17,15, - 15,15,16,16,12,13,13,15,15,13,13,14,15,16,14,15, - 14,16,15,15,15,16,15,17,16,16,16,17,17,12,13,13, - 14,15,14,14,15,15,16,13,14,13,15,15,16,16,16,17, - 17,15,16,15,16,15,15,15,15,16,16,14,15,15,16,17, - 16,16,16,17,17,16,15,17,15,18,17,18,17,18,18,14, - 14,15,15,17,15,15,16,16,17,14,15,15,16,16,17,17, - 17,17,18,16,16,15,17,15,11,12,12,14,14,12,13,13, - 15,15,12,13,13,15,15,14,15,15,16,16,14,15,14,17, - 16,13,13,13,15,15,13,14,14,15,16,13,14,14,16,16, - 15,15,16,16,17,15,16,16,17,17,12,13,13,15,14,13, - 14,14,16,15,13,14,13,16,14,15,16,16,17,16,15,16, - 14,17,15,14,15,15,16,17,15,15,16,16,17,15,16,16, - 17,17,16,15,17,16,18,16,17,17,18,18,14,15,14,16, - 13,15,16,15,17,14,15,16,14,17,14,16,17,16,18,16, - 16,17,15,18,15, -}; - -static const static_codebook _44p9_p5_0 = { - 5, 3125, - (char *)_vq_lengthlist__44p9_p5_0, - 1, -528744448, 1616642048, 3, 0, - (long *)_vq_quantlist__44p9_p5_0, - 0 -}; - -static const long _vq_quantlist__44p9_p5_1[] = { - 3, - 2, - 4, - 1, - 5, - 0, - 6, -}; - -static const char _vq_lengthlist__44p9_p5_1[] = { - 2, 3, 3, 3, 3, 3, 3, -}; - -static const static_codebook _44p9_p5_1 = { - 1, 7, - (char *)_vq_lengthlist__44p9_p5_1, - 1, -533200896, 1611661312, 3, 0, - (long *)_vq_quantlist__44p9_p5_1, - 0 -}; - -static const long _vq_quantlist__44p9_p6_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p9_p6_0[] = { - 2, 5, 5, 5, 7, 7, 5, 7, 7, 5, 7, 7, 7, 8, 9, 7, - 9, 9, 5, 7, 7, 7, 9, 9, 7, 9, 8, 5, 7, 8, 8, 9, - 10, 8, 9,10, 8, 9,10,10,10,12,10,11,11, 8,10,10, - 10,11,12,10,11,10, 5, 8, 7, 8,10,10, 8,10, 9, 8, - 10,10,10,10,11,10,12,11, 8,10, 9,10,11,11,10,12, - 10, 5, 8, 8, 7, 9,10, 8,10, 9, 7, 9,10, 9,10,11, - 9,11,11, 8,10, 9,10,11,11, 9,11,10, 7, 9, 9, 9, - 10,11, 9,11,11, 9, 9,11,10,10,13,11,12,12, 9,11, - 11,11,12,13,11,13,11, 7, 9, 9, 9,10,11, 9,11,10, - 9,11,10,10,10,12,11,13,12, 9,11,11,11,12,12,10, - 12,10, 5, 8, 8, 8, 9,10, 7,10, 9, 8, 9,10, 9,10, - 11,10,11,11, 7,10, 9, 9,11,11, 9,11,10, 7, 9, 9, - 9,10,11, 9,11,10, 9,11,11,10,10,12,11,12,12, 9, - 10,11,11,12,13,10,12,10, 7, 9, 9, 9,11,11, 9,11, - 10, 9,11,11,11,11,13,11,13,12, 9,11, 9,11,12,12, - 10,13,10, -}; - -static const static_codebook _44p9_p6_0 = { - 5, 243, - (char *)_vq_lengthlist__44p9_p6_0, - 1, -527106048, 1620377600, 2, 0, - (long *)_vq_quantlist__44p9_p6_0, - 0 -}; - -static const long _vq_quantlist__44p9_p6_1[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44p9_p6_1[] = { - 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 7, 8, 8, 7, - 8, 8, 7, 8, 7, 7, 8, 8, 7, 8, 8, 7, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 8, 9, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, - 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 8, 9, 8, 8, - 8, 8, 9, 9, 8, 9, 9, 7, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 9, 8, 8, 8, 8, 8, 9, 9, 8, - 9, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, - 8, 8, 8, 8, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 9, 9, 8, 9, 9, 8, 8, 8, 8, 9, 8, - 8, 9, 8, -}; - -static const static_codebook _44p9_p6_1 = { - 5, 243, - (char *)_vq_lengthlist__44p9_p6_1, - 1, -530841600, 1616642048, 2, 0, - (long *)_vq_quantlist__44p9_p6_1, - 0 -}; - -static const long _vq_quantlist__44p9_p7_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p9_p7_0[] = { - 1,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13, -}; - -static const static_codebook _44p9_p7_0 = { - 5, 3125, - (char *)_vq_lengthlist__44p9_p7_0, - 1, -510105088, 1635281408, 3, 0, - (long *)_vq_quantlist__44p9_p7_0, - 0 -}; - -static const long _vq_quantlist__44p9_p7_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44p9_p7_1[] = { - 1, 4, 4,16,16, 4, 9,11,15,16, 4,12, 8,16,16,12, - 16,16,16,16,13,16,16,16,16, 5, 8,10,16,16, 9, 9, - 14,15,16,12,14,14,16,16,16,16,16,16,16,16,16,16, - 16,16, 5,11, 8,16,15,12,14,16,16,16, 9,15, 9,16, - 16,16,16,16,16,16,16,16,16,16,16,15,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16, 6,11,11, - 16,16,12,13,16,16,16,12,16,14,16,16,16,16,16,16, - 16,16,16,16,16,16,11,15,15,16,16,14,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,12, - 15,16,16,16,16,16,16,16,16,14,16,15,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16, 5,11,11,16,16,12, - 15,16,16,16,12,16,14,16,16,16,16,16,16,16,16,16, - 16,16,16,12,15,15,16,16,14,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,11,15,15,16, - 16,16,16,16,16,16,15,16,14,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16, 6,11,12,16,16,11,15,16,16,16,13,16,14,16,16, - 16,16,16,16,16,16,16,16,16,16,11,16,14,16,16,14, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,12,14,14,16,16,16,16,16,16,16,15,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,15,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16, 8,13, - 15,16,16,15,15,16,16,16,14,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,14,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 15,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16, 7,12,12,16,16, - 13,12,16,16,16,14,16,14,16,16,16,16,16,16,16,16, - 16,16,16,16,13,16,16,16,16,14,14,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,12,14,16, - 16,16,16,16,16,16,16,14,16,14,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16, 6,11,11,16,16,13,15,16,16,16,11,15,14,16, - 16,16,16,16,16,16,14,16,16,16,16,11,16,16,16,16, - 16,16,16,16,16,15,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,11,16,14,16,16,14,16,16,16,16,13,15, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 7, - 11,11,16,16,13,13,16,16,16,13,16,13,16,16,16,16, - 16,16,16,16,16,16,16,16,12,16,15,16,16,14,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,12,14,16,16,16,16,16,16,16,16,14,16,13,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16, 8,13,14,16, - 16,15,16,16,16,16,14,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,15,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,15,16, - 15,16,16,16,16,16,16,16,16,16,15,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,15,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,15,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16, -}; - -static const static_codebook _44p9_p7_1 = { - 5, 3125, - (char *)_vq_lengthlist__44p9_p7_1, - 1, -514619392, 1630767104, 3, 0, - (long *)_vq_quantlist__44p9_p7_1, - 0 -}; - -static const long _vq_quantlist__44p9_p7_2[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const char _vq_lengthlist__44p9_p7_2[] = { - 1, 3, 2, 5, 4, 7, 7, 8, 8, 9,10,10,10,11,11,11, - 12,12,12,13,13,13,13,13,13, -}; - -static const static_codebook _44p9_p7_2 = { - 1, 25, - (char *)_vq_lengthlist__44p9_p7_2, - 1, -518864896, 1620639744, 5, 0, - (long *)_vq_quantlist__44p9_p7_2, - 0 -}; - -static const long _vq_quantlist__44p9_p7_3[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const char _vq_lengthlist__44p9_p7_3[] = { - 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44p9_p7_3 = { - 1, 25, - (char *)_vq_lengthlist__44p9_p7_3, - 1, -529006592, 1611661312, 5, 0, - (long *)_vq_quantlist__44p9_p7_3, - 0 -}; - -static const char _huff_lengthlist__44p9_short[] = { - 3, 3, 3, 3, 3, 3, 3, 3, -}; - -static const static_codebook _huff_book__44p9_short = { - 1, 8, - (char *)_huff_lengthlist__44p9_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44pn1_l0_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44pn1_l0_0[] = { - 1, 3, 3, 8, 8,10,10,10,10,10,10,10,10, 5, 7, 5, - 9, 8,10,10,10,10,11,10,11,10, 5, 5, 7, 8, 9,10, - 10,11,10,10,11,10,11,10,10,10,11,11,11,11,11,11, - 11,10,11,11,10,10,10,10,11,11,11,11,11,10,11,11, - 11,11,11,11,11,11,12,11,10,11,11,11,11,11,11,11, - 11,11,11,11,11,10,10,11,11,12,11,11,11,11,11,11, - 12,11,11,11,10,11,11,11,11,11,11,11,11,10,11,11, - 10,11,10,11,11,11,11,11,11,11,11,11,11,12,11,11, - 12,12,11,11,11,11,11,11,11,11,11,11,11,11,12,11, - 10,11,11,11,11,11,11,11,12,11,13,11,11,11,11,11, - 11,11,11,11,11,11,12,11,13, -}; - -static const static_codebook _44pn1_l0_0 = { - 2, 169, - (char *)_vq_lengthlist__44pn1_l0_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44pn1_l0_0, - 0 -}; - -static const long _vq_quantlist__44pn1_l0_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44pn1_l0_1[] = { - 1, 4, 4, 7, 7, 4, 5, 6, 7, 7, 4, 6, 5, 7, 7, 7, - 6, 7, 6, 7, 7, 7, 6, 7, 6, -}; - -static const static_codebook _44pn1_l0_1 = { - 2, 25, - (char *)_vq_lengthlist__44pn1_l0_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44pn1_l0_1, - 0 -}; - -static const long _vq_quantlist__44pn1_l1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44pn1_l1_0[] = { - 1, 4, 4, 4, 4, 4, 4, 4, 4, -}; - -static const static_codebook _44pn1_l1_0 = { - 2, 9, - (char *)_vq_lengthlist__44pn1_l1_0, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44pn1_l1_0, - 0 -}; - -static const char _huff_lengthlist__44pn1_lfe[] = { - 1, 3, 2, 3, -}; - -static const static_codebook _huff_book__44pn1_lfe = { - 2, 4, - (char *)_huff_lengthlist__44pn1_lfe, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44pn1_long[] = { - 2, 3, 6, 7, 9,13,17, 3, 2, 5, 7, 9,13,17, 6, 5, - 5, 6, 9,12,16, 7, 7, 6, 6, 7,10,13,10,10, 9, 7, - 6,10,13,13,13,12,10,10,11,15,17,17,17,14,14,15, - 17, -}; - -static const static_codebook _huff_book__44pn1_long = { - 2, 49, - (char *)_huff_lengthlist__44pn1_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44pn1_p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44pn1_p1_0[] = { - 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44pn1_p1_0 = { - 5, 243, - (char *)_vq_lengthlist__44pn1_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44pn1_p1_0, - 0 -}; - -static const long _vq_quantlist__44pn1_p2_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44pn1_p2_0[] = { - 1, 5, 5, 0, 7, 7, 0, 8, 8, 0, 9, 9, 0,12,12, 0, - 8, 8, 0, 9, 9, 0,13,13, 0, 8, 8, 0, 6, 6, 0,11, - 11, 0,12,12, 0,12,12, 0,14,14, 0,11,12, 0,12,12, - 0,15,15, 0,12,12, 0, 5, 5, 0, 5, 5, 0, 6, 6, 0, - 7, 7, 0,10,10, 0, 6, 6, 0, 7, 7, 0,11,11, 0, 6, - 6, 0, 7, 7, 0,11,11, 0,12,11, 0,11,11, 0,14,14, - 0,10,10, 0,12,12, 0,15,15, 0,12,12, 0, 6, 6, 0, - 12,12, 0,12,12, 0,12,12, 0,14,14, 0,11,11, 0,12, - 12, 0,16,16, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 8, 8, 0,12,12, 0,12,12, 0,12,12, 0,15, - 15, 0,12,12, 0,11,11, 0,16,16, 0,11,11, 0, 6, 6, - 0,12,12, 0,12,12, 0,13,13, 0,15,15, 0,12,12, 0, - 13,13, 0,15,15, 0,12,12, 0, 0, 0, 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 static_codebook _44pn1_p2_0 = { - 5, 243, - (char *)_vq_lengthlist__44pn1_p2_0, - 1, -533200896, 1614282752, 2, 0, - (long *)_vq_quantlist__44pn1_p2_0, - 0 -}; - -static const long _vq_quantlist__44pn1_p2_1[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44pn1_p2_1[] = { - 1, 3, 3, 0, 9, 9, 0, 9, 9, 0,10,10, 0, 9, 9, 0, - 10,10, 0,10,10, 0,10,10, 0,10,10, 0, 7, 7, 0, 7, - 7, 0, 6, 6, 0, 8, 8, 0, 7, 7, 0, 8, 8, 0, 8, 8, - 0, 7, 7, 0, 8, 8, 0, 7, 7, 0, 9, 9, 0, 8, 9, 0, - 10,10, 0, 9, 9, 0,10,10, 0,10,11, 0, 9, 9, 0,10, - 10, 0, 9, 9, 0,11,11, 0,12,12, 0,12,12, 0,11,11, - 0,12,12, 0,13,13, 0,12,12, 0,13,13, 0, 8, 8, 0, - 12,12, 0,12,12, 0,13,13, 0,13,13, 0,13,13, 0,13, - 13, 0,13,13, 0,13,13, 0, 7, 7, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 9, 0,11,11, 0,12,12, 0,13,13, 0,12, - 12, 0,13,13, 0,13,13, 0,12,12, 0,12,12, 0, 9, 9, - 0,12,12, 0,13,13, 0,14,14, 0,13,13, 0,14,14, 0, - 14,14, 0,13,13, 0,14,14, 0, 7, 7, 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 static_codebook _44pn1_p2_1 = { - 5, 243, - (char *)_vq_lengthlist__44pn1_p2_1, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44pn1_p2_1, - 0 -}; - -static const long _vq_quantlist__44pn1_p3_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44pn1_p3_0[] = { - 1, 6, 6, 6, 8, 8, 6, 8, 8, 7, 9, 9,10,11,11, 8, - 8, 8, 7, 9, 9,11,12,12, 9, 9, 9, 6, 7, 7,10,11, - 11,10,11,11,10,11,11,13,13,13,12,12,12,10,12,11, - 14,14,14,12,12,12, 6, 5, 5, 9, 6, 6, 9, 6, 6, 9, - 7, 7,12,10,10,11, 7, 6, 9, 7, 7,13,11,11,12, 7, - 7, 7, 8, 8,12,10,10,12,10,10,11,10,10,15,13,13, - 13, 9, 9,12,11,11,15,14,14,15,11,11, 8, 7, 7,12, - 11,11,12,11,11,11,11,11,14,13,14,14,12,12,12,11, - 11,16,15,15,14,12,12, 0,10,10, 0,12,12, 0,12,12, - 0,11,11, 0,14,14, 0,11,11, 0,11,11, 0,15,15, 0, - 11,11, 7, 8, 8,13,11,11,12,10,10,12,11,11,15,13, - 13,14,11,11,12,10,10,16,14,14,15,10,10, 9, 7, 7, - 13,11,12,13,12,11,12,11,11,15,14,14,14,12,12,13, - 12,12,16,15,15,15,12,12, 0,11,11, 0,12,12, 0,12, - 13, 0,12,12, 0,15,15, 0,12,12, 0,12,12, 0,16,15, - 0,12,12, -}; - -static const static_codebook _44pn1_p3_0 = { - 5, 243, - (char *)_vq_lengthlist__44pn1_p3_0, - 1, -531365888, 1616117760, 2, 0, - (long *)_vq_quantlist__44pn1_p3_0, - 0 -}; - -static const long _vq_quantlist__44pn1_p3_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44pn1_p3_1[] = { - 2, 3, 4, 9, 9,10,12,12,12,11,10,12,12,13,12,11, - 13,12,11,11,11,12,12,12,11,11,13,13,13,13,11,12, - 12,14,14,12,13,13,13,13,11,13,13,13,13,11,13,13, - 13,13,11,13,13,13,13,11,12,12,14,14,12,13,13,12, - 12,11,13,13,13,13,11,13,13,12,12,11,13,13,13,13, - 12,12,13,14,14,12,13,13,12,12,11,13,13,13,13,11, - 13,13,12,12,11,13,13,13,13,12,13,13,14,14,12,13, - 13,12,12,11,13,13,13,13,11,13,13,12,12,11,10,10, - 10,10,12,10,10,11,11,12, 9, 9,11,11,13,11,11,10, - 10,13,10,10,10,10,13,11,11,12,12,13,10,10,12,12, - 14,12,11,12,12,13,11,11,11,12,13,12,12,12,12,13, - 11,11,12,12,13,10,10,12,12,14,11,11,12,12,13,11, - 11,12,12,13,11,11,12,12,14,12,12,12,12,14,10,10, - 11,11,14,12,11,11,11,13,11,11,11,11,13,12,12,11, - 11,14,12,12,12,11,14,10,10,11,11,14,12,11,11,11, - 13,11,11,11,11,13,12,12,11,11,11,11,11,10,10,12, - 10,11, 9, 9,12,12,12,11,11,13,12,12, 9, 9,13,13, - 13,10,10,13,13,13,12,12,13,13,13,14,14,13,12,12, - 11,11,14,13,13,12,12,14,13,13,11,11,13,13,13,12, - 11,13,13,13,14,14,13,12,12,10,10,14,13,13,11,11, - 13,13,13,10,10,13,13,13,11,11,14,13,13,14,14,14, - 12,12,10,10,13,13,13,11,11,13,13,13,10,10,13,13, - 13,11,11,14,13,13,14,14,14,13,13,10,10,13,13,13, - 11,11,13,13,13,10,10,14,12,12, 8, 8,14,12,12, 9, - 9,14,11,11, 9, 9,14,12,12, 8, 8,14,12,12, 7, 7, - 15,13,13,10,10,15,12,12,10,10,15,13,13,10,10,15, - 12,13, 9, 9,15,13,13,10,10,15,13,13,10,10,15,12, - 12,10,10,15,13,13,10,10,15,13,13, 9, 9,15,13,13, - 10,10,15,13,13,10,10,15,12,12,10,10,15,13,13, 9, - 9,14,13,12, 9, 9,14,13,13, 9, 9,15,13,13,10,10, - 15,12,12,10,10,15,13,13, 9, 9,15,13,13, 9, 9,14, - 13,13, 9, 9,14,12,12, 8, 8,13,13,13, 8, 8,14,14, - 13, 9, 9,14,14,13, 7, 7,14,14,14, 8, 8,14,14,14, - 10,10,15,14,14,12,12,14,14,14, 9, 9,15,14,14,10, - 10,14,14,14, 9, 9,14,14,14,10, 9,15,14,14,12,12, - 14,14,14, 9, 9,15,14,14,10,10,14,14,14, 9, 9,15, - 14,15, 9, 9,15,14,14,11,11,14,14,14, 8, 8,14,14, - 14, 9, 9,14,14,14, 8, 8,14,15,14,10,10,15,14,14, - 11,11,14,14,14, 8, 8,15,14,14, 9, 9,14,14,14, 8, - 8,12,12,12,13,13,16,16,15,12,12,17,16,16,13,13, - 17,16,16,11,11,17,16,16,12,12,17,16,17,13,13,17, - 16,16,14,14,17,17,16,12,12,18,16,16,13,13,17,16, - 17,12,12,17,17,17,13,13,18,16,16,14,14,18,17,17, - 12,12,17,17,17,13,13,18,17,17,13,13,17,17,17,13, - 13,17,16,16,14,14,17,17,17,12,12,16,16,17,13,13, - 17,17,16,12,12,18,17,17,13,13,18,16,16,14,14,18, - 17,17,12,12,19,16,17,13,13,17,16,17,12,12,13,14, - 14,10,10,16,14,14,13,13,17,15,15,14,14,17,14,14, - 13,13,16,14,14,13,13,17,16,15,14,14,16,16,16,15, - 15,17,15,15,14,14,17,15,15,14,14,17,15,15,14,14, - 17,16,15,14,14,16,16,16,15,15,18,15,15,13,13,16, - 16,15,14,14,17,15,15,14,13,17,15,15,14,14,16,16, - 16,15,15,18,15,14,13,13,17,15,15,14,14,18,14,15, - 13,13,18,15,15,14,14,16,16,16,15,15,17,15,15,13, - 13,17,15,15,14,14,17,15,15,13,13,13,11,11,10,10, - 16,14,14,13,13,17,14,15,14,14,17,15,15,12,12,17, - 14,14,12,12,16,15,15,14,14,16,14,14,14,14,16,15, - 15,14,14,16,15,15,14,14,16,15,15,14,14,16,15,15, - 14,14,16,15,14,15,15,17,15,15,14,14,17,15,15,14, - 14,17,15,15,14,14,17,15,16,14,14,16,14,14,14,14, - 17,15,15,13,13,17,15,15,13,13,16,15,15,13,13,17, - 16,16,14,14,17,15,14,15,14,17,15,15,13,13,17,15, - 15,13,13,17,15,15,13,13,14,14,14, 9, 9,14,14,14, - 18,19,14,15,15,19,18,14,14,14,19,19,15,14,14,19, - 19,15,16,16,19,19,15,16,16,19,19,15,15,15,19,19, - 15,16,16,19,20,15,15,15,19,19,15,15,15,19,19,15, - 16,16,20,20,15,15,15,18,19,15,15,16,19,20,15,15, - 15,19,18,15,15,15,18,18,15,16,16,21,20,15,15,15, - 19,19,15,15,15,19,19,15,15,14,19,20,15,15,15,20, - 19,15,16,16,19,20,15,15,15,19,19,15,15,15,20,21, - 15,14,15,19,19,14,12,12, 9, 9,14,14,15,21,19,14, - 14,14,18,19,14,15,15,19,20,14,14,14,19,19,15,15, - 15,19,20,15,15,14,21,19,15,15,15,20,19,15,14,15, - 20,21,15,15,15,18,18,15,15,15,20,21,16,14,14,18, - 19,15,15,15,20,19,15,15,15,18,21,15,15,15,19,19, - 15,15,15,19,20,16,15,14,20,19,15,16,15,19,19,15, - 15,15,19, 0,14,15,15,19,19,15,15,15,19,19,15,15, - 14,20,19,15,15,15,20,19,15,15,15,19,19,15,15,15, - 20,19,12,12,12,13,13,16,15,16,11,11,16,16,16,12, - 12,17,16,16,11,11,17,16,16,12,11,17,17,17,13,13, - 18,16,16,14,14,18,18,17,13,13,17,16,16,13,13,17, - 17,17,13,13,17,16,17,12,12,17,15,16,13,13,17,16, - 17,12,12,17,16,16,13,12,17,16,16,12,12,18,17,17, - 13,13,18,16,16,13,14,18,17,17,12,12,17,16,16,12, - 12,17,17,17,12,12,18,17,17,13,13,17,16,16,14,14, - 17,17,17,12,12,17,16,16,12,12,18,17,17,12,12,13, - 14,14, 9, 9,16,14,14,13,13,16,15,15,14,14,16,14, - 14,13,13,16,14,14,13,13,17,16,15,15,15,16,15,16, - 16,15,17,15,15,14,14,17,15,15,15,15,17,15,15,14, - 14,17,15,15,14,14,16,15,16,16,16,17,15,15,14,14, - 16,15,15,14,15,16,15,15,14,14,17,15,15,15,15,16, - 16,16,15,16,18,15,14,13,14,17,15,15,14,14,17,14, - 14,13,13,17,15,15,14,14,16,15,15,15,15,17,15,14, - 14,14,17,15,15,14,14,17,14,14,13,13,13,11,11,11, - 11,16,14,14,12,12,16,14,14,13,13,16,14,14,12,12, - 16,14,14,12,12,16,15,15,13,13,17,14,14,14,14,17, - 15,15,13,13,16,15,15,14,13,16,15,15,13,13,16,15, - 15,13,13,16,14,14,14,14,16,15,15,13,13,16,14,15, - 13,13,17,15,15,13,13,17,15,15,13,13,16,14,14,14, - 14,17,15,15,12,12,17,14,15,13,13,17,15,15,12,12, - 16,15,15,13,13,17,14,14,14,14,17,15,15,12,12,17, - 15,15,13,13,16,15,15,12,12,14,15,15, 8, 8,14,14, - 14,19,18,14,15,15,19,20,14,14,14,19,19,14,14,15, - 19,20,15,16,15,19,21,15,16,16,21,19,15,15,15,20, - 19,15,16,16,19,20,15,15,15,19,18,15,16,15,20,19, - 15,16,16,19,20,15,15,15,19,19,15,16,15,20,20,14, - 15,15,19,19,15,15,15,21,19,15,17,16,19,20,15,14, - 15, 0,21,15,15,15,19,20,14,14,14,19,19,15,15,15, - 20,19,15,16,16,19,19,15,15,15,19,18,15,15,15,20, - 19,14,14,15,18,18,14,12,12, 9, 9,14,14,14,18,18, - 14,14,14,18,18,14,15,14,19,18,14,14,14,19,18,15, - 15,15,19,20,15,14,14,18,18,15,15,15,20,19,15,15, - 15,18,20,15,15,15,19,18,15,15,15,19,19,15,14,14, - 19,21,15,15,15,20,20,15,15,15,18,19,14,15,15,19, - 20,15,15,15,20,19,15,14,14,19,21,15,15,15,18,19, - 15,14,15,20,19,14,15,15,21,21,14,15,15,19,20,15, - 14,14,19,20,15,15,15,19,20,15,15,14,20,20,14,15, - 15,20,19,13,12,12,13,13,17,16,16,11,11,17,16,16, - 12,12,18,17,16,11,11,18,16,16,11,11,17,17,17,13, - 13,18,16,16,13,13,18,17,17,12,12,18,16,16,13,13, - 18,17,17,12,12,18,17,17,13,13,18,16,16,14,14,18, - 16,17,12,12,18,17,17,13,13,17,17,17,12,12,17,17, - 17,12,12,17,16,15,13,13,18,16,16,11,11,17,16,16, - 12,12,17,16,17,11,11,18,17,17,13,12,17,16,16,13, - 13,17,17,17,12,12,17,16,17,12,12,18,17,17,11,11, - 14,14,14, 9, 9,16,14,14,13,13,17,15,15,14,14,17, - 14,14,13,13,16,14,14,13,13,17,15,15,14,14,16,16, - 16,16,15,18,15,15,14,14,17,16,15,15,15,17,15,15, - 14,14,17,15,15,14,15,16,16,16,15,16,18,15,15,14, - 14,17,15,15,14,15,17,15,15,14,14,17,15,15,14,14, - 16,16,16,15,16,17,14,14,13,13,17,15,15,14,14,18, - 15,15,13,13,17,15,15,14,14,16,16,16,15,15,17,14, - 14,13,13,17,15,15,14,14,17,14,14,13,13,13,11,11, - 11,11,16,14,14,12,12,16,14,14,12,13,17,15,14,11, - 11,17,14,14,11,11,17,15,15,13,14,17,14,14,14,14, - 17,15,15,13,13,17,14,14,13,13,17,15,15,13,13,17, - 15,15,13,13,17,14,14,14,14,17,15,15,13,13,18,14, - 15,13,13,17,15,15,13,13,16,15,15,13,13,17,14,14, - 13,13,17,15,15,12,12,16,14,14,12,12,16,15,15,12, - 12,17,16,15,13,13,17,14,14,13,13,17,15,15,12,12, - 16,15,15,12,12,16,15,15,12,12,13,15,15, 8, 8,14, - 14,14,18,19,14,15,15,19,20,14,14,14,18,18,14,15, - 15,18,18,15,16,16,19,19,15,16,17,20,20,15,15,15, - 19,19,15,16,16,18,20,15,15,15,19,19,15,15,16,18, - 18,15,17,16,19,19,15,15,15,18,21,15,16,16,21,20, - 15,15,15,19,21,15,16,15,20,19,15,16,17,20,20,15, - 15,15,19,19,15,16,16,21,20,15,15,15,19,20,15,15, - 15,19,19,15,16,16,20,19,15,15,15,19,19,15,16,15, - 20,21,15,15,15,21,19,14,12,12, 8, 8,14,14,14,20, - 18,14,13,13,19,19,14,14,14,19,18,15,14,14,19,20, - 14,15,15,20,20,15,14,14,21,20,15,15,15,20,20,15, - 15,14,21,19,15,15,15,19,19,15,15,15,19,20,15,14, - 14,20,20,15,15,15,19,20,15,14,14,19,20,15,15,15, - 20,20,15,15,15,20,19,15,14,14,20,21,15,15,15,20, - 21,15,14,14,20, 0,15,16,15,20,21,15,15,15,19,20, - 15,14,14,19,19,15,15,15,19,20,15,15,15,19,19,15, - 15,15,18,20,13,12,12,13,13,18,16,17,12,12,17,16, - 16,12,12,17,17,16,11,11,18,16,16,11,11,17,17,18, - 13,13,18,16,16,14,14,18,17,17,13,13,18,16,16,13, - 13,18,17,17,12,12,17,17,16,13,13,17,16,16,13,14, - 18,17,17,12,12,18,16,16,12,13,17,16,17,12,12,17, - 18,17,13,13,18,16,16,13,13,18,17,17,12,12,17,16, - 16,12,12,17,17,17,11,11,17,16,17,12,12,17,16,16, - 13,13,17,16,16,11,11,17,16,16,12,12,18,16,17,11, - 11,14,14,14, 9, 9,16,14,15,13,13,17,15,15,14,14, - 17,14,14,12,12,16,14,14,13,13,18,15,15,15,15,17, - 15,16,15,16,18,15,15,14,14,17,15,16,15,15,17,15, - 15,14,14,18,15,15,14,14,16,16,16,16,15,17,15,15, - 14,14,16,15,15,14,14,17,15,15,14,14,17,15,15,14, - 14,17,16,16,15,15,17,15,14,13,13,17,15,15,14,14, - 17,15,15,13,13,17,15,15,14,14,16,16,16,15,15,18, - 15,14,14,14,17,15,15,14,14,18,15,15,13,13,13,12, - 12,11,11,16,14,14,12,12,16,14,14,13,13,17,15,15, - 12,12,17,14,14,12,12,17,15,15,14,14,17,14,14,14, - 14,17,15,15,13,13,17,15,14,13,13,17,15,15,13,13, - 17,15,15,13,13,16,14,14,14,14,17,15,15,13,13,16, - 14,14,13,13,16,15,15,13,13,17,15,16,13,13,17,14, - 14,14,13,17,15,15,12,12,16,15,14,12,12,17,15,15, - 12,12,16,15,16,13,13,16,14,14,14,13,17,15,15,12, - 12,16,14,14,12,12,17,15,15,12,12,14,15,15, 8, 8, - 14,14,14,18,18,14,15,15,19,18,14,14,14,18,18,14, - 15,15,19,20,15,16,15,21,18,15,16,16,18, 0,15,15, - 15,19,20,15,16,16,20, 0,15,16,15,19,18,15,15,15, - 19,19,15,16,16,21,19,15,15,15,19,19,15,16,16,20, - 20,15,15,15,19,19,15,15,15,19,18,15,16,16,20,20, - 15,14,15,20,19,15,15,15,19,20,15,15,15,19,19,15, - 16,15,19,20,15,16,16,19,20,15,15,15,19,19,15,16, - 15,20,20,15,15,15,20,18,13,12,12, 8, 8,14,14,14, - 19,20,14,14,14,19,19,14,15,15,20,20,14,14,14,18, - 19,15,15,15,20, 0,15,14,14,18,20,15,15,15,19,19, - 15,15,15,21,19,15,15,15,19,20,15,15,15,20,21,15, - 14,14,20,19,15,15,15,20,19,15,15,14,21,19,15,15, - 15,19,18,15,15,15,20,19,15,14,14,19,19,15,15,16, - 20,19,15,15,15,20, 0,15,15,15,19,21,15,15,15,22, - 20,15,14,14,22,19,15,15,15,19,20,15,14,14,20,19, - 14,15,15,19,21, -}; - -static const static_codebook _44pn1_p3_1 = { - 5, 3125, - (char *)_vq_lengthlist__44pn1_p3_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44pn1_p3_1, - 0 -}; - -static const long _vq_quantlist__44pn1_p4_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44pn1_p4_0[] = { - 1, 7, 7,14,14, 6, 8, 8,15,16, 7, 8, 8,16,15, 0, - 14,14,17,17, 0,14,14,16,16, 7, 9, 9,16,16,10,11, - 11,17,18, 9, 8, 8,16,16, 0,14,14,19,19, 0,14,14, - 17,16, 8, 9, 9,16,16,12,12,12,17,17,10, 9, 9,16, - 16, 0,15,14,18,20, 0,14,14,17,17, 0,15,15,18,17, - 0,21, 0, 0,21, 0,13,13,17,17, 0,17,17, 0, 0, 0, - 15,15,17,17, 0,15,15,17,18, 0, 0, 0, 0,21, 0,13, - 13,17,17, 0,18,18, 0,21, 0,16,15,17,18, 6, 7, 7, - 14,14, 9,10,10,16,16,11,10,10,15,15, 0,21, 0,20, - 21, 0, 0, 0,18,20,10,10,10,15,16,12,13,13,18,18, - 12,11,11,15,15, 0, 0, 0,20,20, 0, 0,21,19,19,12, - 11,11,15,15,15,14,14,18,18,13,11,11,15,16, 0, 0, - 0,20,19, 0, 0, 0,20,21, 0, 0,20,19,19, 0, 0, 0, - 0, 0, 0,20, 0,17,18, 0, 0,21, 0, 0, 0, 0, 0,21, - 0, 0,21, 0,20,19, 0, 0, 0, 0, 0, 0,21, 0,18,18, - 0, 0, 0,21, 0, 0, 0, 0, 0,20, 7, 6, 6,13,13, 9, - 6, 6,12,12, 9, 7, 7,14,14, 0,10,10,12,12, 0,11, - 11,15,15, 9, 7, 7,14,14,12, 9, 9,14,14,10, 7, 7, - 14,13, 0,11,11,16,15, 0,11,11,14,14, 9, 7, 7,14, - 14,13,10,10,14,14,11, 7, 7,14,13, 0,11,11,16,16, - 0,11,11,14,14, 0,12,12,16,16, 0,19, 0,17,18, 0, - 10,10,14,14, 0,15,14, 0, 0, 0,12,12,14,14, 0,12, - 12,15,15, 0,20, 0,18,19, 0,10,10,14,14, 0,16,15, - 0,20, 0,13,13,14,14, 0,11,11,13,13, 0,12,13,16, - 16, 0,12,12,16,16, 0,16,16, 0,21, 0,17,18, 0, 0, - 0,12,12,16,16, 0,15,15,18, 0, 0,12,12,16,16, 0, - 17,16,21,21, 0,16,17, 0, 0, 0,13,13,17,16, 0,16, - 16,20,21, 0,12,12,17,16, 0,17,17, 0,21, 0,17,17, - 21,21, 0,17,18, 0, 0, 0, 0, 0, 0, 0, 0,15,15, 0, - 0, 0,18,21, 0, 0, 0,18,19, 0, 0, 0,18,17,21,21, - 0, 0, 0, 0, 0, 0,16,16, 0, 0, 0, 0, 0, 0, 0, 0, - 19,19, 0, 0, 0,11,11,12,12, 0,11,11,10,10, 0,12, - 12,13,13, 0,12,12, 9, 9, 0,14,14,13,13, 0,12,12, - 13,13, 0,14,14,12,13, 0,11,11,12,12, 0,13,13,13, - 13, 0,13,13,13,13, 0,12,12,13,13, 0,14,14,12,12, - 0,11,11,12,12, 0,14,13,14,14, 0,13,13,13,13, 0, - 15,15,14,15, 0, 0, 0,16,16, 0,12,12,13,13, 0,16, - 17,20,21, 0,14,13,12,12, 0,14,14,14,14, 0,21, 0, - 16,16, 0,12,12,13,13, 0,18,17,21, 0, 0,14,14,13, - 13, 7, 8, 8,17,17,11,10,10,18,18,12,10,10,17,17, - 0,15,15,20,18, 0,15,15,17,17,11, 9, 9,17,17,14, - 12,12,19,19,13, 9, 9,16,16, 0,15,14, 0,19, 0,14, - 14,16,16,12,10,10,20,18,16,13,13,21,20,14,10,10, - 17,17, 0,15,15,21,20, 0,15,14,17,17, 0,15,15,21, - 21, 0, 0,21, 0, 0, 0,13,13,18,18, 0,19,16, 0, 0, - 0,15,15,17,16, 0,16,16, 0,21, 0, 0, 0, 0,21, 0, - 13,14,18,17, 0,20,19, 0, 0, 0,15,15,18,18, 8, 7, - 7,15,15,12,11,11,17,16,13,11,11,16,16, 0, 0, 0, - 21,20, 0, 0, 0, 0,20,11,10,10,17,17,14,13,13,19, - 18,14,11,11,16,16, 0,20, 0,21,19, 0, 0,21, 0,20, - 12,11,11,17,17,16,15,15, 0,19,14,11,11,17,16, 0, - 21, 0, 0,19, 0, 0, 0,21,20, 0, 0,21,20, 0, 0, 0, - 0, 0, 0, 0, 0, 0,19,21, 0, 0, 0, 0, 0, 0, 0, 0, - 19,20, 0, 0, 0,20,21, 0, 0, 0, 0, 0, 0,20, 0,19, - 21, 0, 0, 0, 0, 0, 0, 0, 0,21,20,11,10, 9,15,15, - 14,11,11,15,15,14,11,11,16,16, 0,14,14,14,14, 0, - 16,15,17,16,13,11,11,16,16,16,13,13,16,16,15,10, - 10,15,15, 0,14,15,17,17, 0,14,14,16,15,13,11,11, - 16,16,17,15,14,16,16,15,10,10,15,15, 0,15,15,17, - 18, 0,15,15,16,16, 0,16,16,17,17, 0,21, 0,21,20, - 0,13,13,15,15, 0,18,18, 0,21, 0,15,15,15,15, 0, - 16,16,17,17, 0, 0, 0, 0,18, 0,13,13,15,15, 0,19, - 18, 0, 0, 0,15,15,16,16, 0,12,12,15,15, 0,13,13, - 17,17, 0,13,13,17,18, 0,16,17,21, 0, 0,20,18, 0, - 0, 0,13,13,17,17, 0,15,15, 0,18, 0,12,12,17,18, - 0,16,16, 0, 0, 0,17,17,21, 0, 0,13,13,18,18, 0, - 16,16,21,21, 0,12,12,17,18, 0,16,17,21, 0, 0,17, - 17, 0,21, 0,17,18, 0, 0, 0, 0, 0, 0, 0, 0,16,15, - 0,21, 0,21,19, 0, 0, 0,18,18, 0, 0, 0,18,19, 0, - 0, 0, 0, 0, 0, 0, 0,16,16,21,21, 0,20,19, 0, 0, - 0,19,21, 0,21, 0,12,12,15,15, 0,12,12,15,16, 0, - 13,13,16,16, 0,14,14,15,15, 0,16,15,17,17, 0,13, - 13,17,17, 0,15,15,16,18, 0,12,12,16,16, 0,14,14, - 17,17, 0,15,14,16,16, 0,13,13,16,16, 0,16,15,17, - 17, 0,12,12,16,16, 0,15,15,18,18, 0,14,14,17,16, - 0,16,16,17,18, 0, 0, 0,20,21, 0,13,13,16,17, 0, - 17,17, 0, 0, 0,15,15,16,16, 0,15,16,17,17, 0, 0, - 0,19, 0, 0,13,13,15,16, 0,19,18, 0, 0, 0,16,15, - 16,17, 8, 8, 8,17,17,13,11,10,17,18,13,10,10,17, - 17, 0,15,15,20,19, 0,15,15,17,17,12,10,10,19,18, - 15,12,12,20,18,14,10,10,17,16, 0,15,15,20,20, 0, - 14,15,16,16,13,10,10,17,17,17,14,14, 0,18,15,10, - 10,17,17, 0,16,15,20,20, 0,14,14,17,17, 0,15,16, - 20,20, 0, 0,21, 0, 0, 0,13,13,17,17, 0,18,17, 0, - 0, 0,15,16,17,18, 0,15,15,18,21, 0, 0, 0,21, 0, - 0,13,13,18,18, 0,19,19, 0, 0, 0,16,16,18,17, 9, - 8, 8,15,15,12,11,11,16,16,13,11,11,16,15, 0, 0, - 0, 0,21, 0,21, 0,19,19,12,11,11,17,18,15,13,13, - 18,19,14,11,11,16,16, 0, 0,21,21,19, 0, 0, 0,21, - 20,13,11,11,18,17,17,14,15,20,21,15,11,12,16,16, - 0, 0, 0,20, 0, 0, 0,21, 0,19, 0, 0, 0, 0,19, 0, - 0, 0, 0, 0, 0,21,21,19,19, 0, 0, 0,21, 0, 0, 0, - 0,19,21, 0, 0, 0,19,20, 0, 0, 0,21, 0, 0, 0,21, - 19,19, 0, 0, 0, 0, 0, 0, 0, 0,21,20, 0,11,11,15, - 15, 0,12,12,15,16, 0,12,12,16,16, 0,15,15,16,15, - 0,16,16,17,17, 0,12,12,17,17, 0,14,14,17,17, 0, - 11,11,16,16, 0,15,15,19,18, 0,15,15,16,16, 0,12, - 12,17,16, 0,14,15,16,16, 0,11,11,15,15, 0,16,16, - 18,19, 0,15,15,15,16, 0,17,17,18,20, 0,21, 0,21, - 19, 0,14,14,16,16, 0,18,18, 0, 0, 0,16,16,15,15, - 0,16,16,18,17, 0, 0, 0,19,20, 0,14,14,16,16, 0, - 19,19, 0, 0, 0,16,17,15,15, 0,12,12,14,15, 0,13, - 13,16,17, 0,12,12,17,17, 0,17,16, 0, 0, 0,18,17, - 21, 0, 0,13,13,19,17, 0,15,15,20,21, 0,12,12,17, - 17, 0,17,17, 0, 0, 0,17,17, 0, 0, 0,13,13,17,18, - 0,16,16,21, 0, 0,12,12,17,17, 0,17,17, 0, 0, 0, - 17,17, 0, 0, 0,18,21, 0, 0, 0, 0, 0, 0, 0, 0,15, - 15,21, 0, 0,20,21, 0, 0, 0,18,19, 0, 0, 0,18,17, - 0, 0, 0, 0, 0, 0, 0, 0,16,16,21, 0, 0,21,21, 0, - 0, 0,18,19, 0, 0, 0,12,12,16,16, 0,13,13,16,17, - 0,13,13,17,16, 0,14,14,16,16, 0,16,15,19,18, 0, - 13,13,17,17, 0,15,15,18,18, 0,12,12,16,16, 0,15, - 15,18,19, 0,15,15,17,16, 0,13,13,17,17, 0,16,16, - 18,17, 0,12,12,17,16, 0,15,15,18,18, 0,15,15,17, - 17, 0,16,16, 0,19, 0, 0, 0, 0, 0, 0,14,14,16,17, - 0,18,18, 0, 0, 0,15,15,17,17, 0,16,16,21,19, 0, - 21, 0,21,21, 0,13,14,16,16, 0,19,19, 0, 0, 0,15, - 16,16,16, 0,11,11,17,16, 0,15,14,19,18, 0,14,14, - 19,19, 0,18,17,18,20, 0,17,17,18,19, 0,13,13,17, - 17, 0,16,17,21,18, 0,13,13,17,16, 0,18,17,19, 0, - 0,16,17,18,18, 0,12,12,19,18, 0,18,18,20,20, 0, - 13,13,17,17, 0,17,17,21, 0, 0,16,17,17,18, 0,18, - 17,19,18, 0, 0, 0, 0, 0, 0,14,14,17,17, 0,19,19, - 21, 0, 0,16,16,16,17, 0,17,17,19,20, 0, 0, 0, 0, - 21, 0,15,15,17,18, 0,21,21, 0, 0, 0,17,17,17,18, - 0,10,10,15,15, 0,15,14,17,18, 0,14,14,16,16, 0, - 0, 0,18, 0, 0,21, 0,19, 0, 0,13,13,17,16, 0,17, - 17,18, 0, 0,14,14,16,15, 0, 0, 0,21, 0, 0,21, 0, - 19,18, 0,13,13,17,17, 0,18,18,20,20, 0,15,15,16, - 16, 0, 0, 0,21,21, 0, 0, 0,20,20, 0, 0, 0,19, 0, - 0, 0, 0, 0, 0, 0,21,20,18,18, 0, 0, 0, 0, 0, 0, - 0, 0, 0,20, 0, 0, 0, 0,20, 0, 0, 0, 0, 0, 0, 0, - 0,19,18, 0, 0, 0, 0,21, 0, 0, 0,18,20, 0,18,19, - 16,17, 0,21,19,17,17, 0, 0,21,18,18, 0, 0,21,20, - 19, 0, 0, 0,20,20, 0, 0,21,17,17, 0, 0, 0,19,19, - 0,20,20,17,17, 0, 0, 0, 0,20, 0, 0,20,18,18, 0, - 21,20,17,17, 0, 0, 0,20,21, 0,19, 0,17,17, 0, 0, - 21, 0, 0, 0,20, 0,18,19, 0, 0, 0,21,21, 0, 0, 0, - 0,21, 0,20,20,17,17, 0, 0, 0, 0, 0, 0,21, 0,18, - 17, 0, 0, 0,20,19, 0, 0, 0, 0,21, 0,20,20,17,17, - 0, 0, 0, 0, 0, 0,21,21,18,18, 0,12,12,15,14, 0, - 14,14,17,17, 0,14,14,17,16, 0,18,18,21, 0, 0,19, - 20, 0, 0, 0,13,13,18,17, 0,16,16,19,18, 0,13,13, - 17,17, 0,17,17, 0, 0, 0,17,17,21, 0, 0,13,13,17, - 17, 0,17,17,21,20, 0,13,13,18,17, 0,18,19,21,21, - 0,19,18, 0, 0, 0,18,17, 0, 0, 0, 0, 0, 0, 0, 0, - 15,16, 0, 0, 0,21,21, 0, 0, 0,20,18,21, 0, 0,17, - 18, 0, 0, 0, 0, 0, 0, 0, 0,15,16, 0, 0, 0, 0,20, - 0, 0, 0, 0,19, 0, 0, 0,15,15,18,19, 0,18,17,21, - 0, 0,16,18, 0,20, 0,17,18,21, 0, 0,18,20, 0, 0, - 0,16,16,21,21, 0,19,20,21, 0, 0,16,15, 0,21, 0, - 18,20, 0, 0, 0,18,19, 0, 0, 0,16,15,21,21, 0,21, - 0, 0, 0, 0,16,15,21, 0, 0,20,19, 0, 0, 0,18,21, - 21, 0, 0,20,18, 0, 0, 0, 0, 0, 0, 0, 0,16,16, 0, - 20, 0,21, 0, 0, 0, 0,17,18,20,21, 0,18,18,21,21, - 0, 0, 0, 0, 0, 0,16,16,20, 0, 0, 0,21, 0, 0, 0, - 21,18, 0, 0, 0,12,12,20,17, 0,15,15,19,18, 0,14, - 14,19,18, 0,18,17,21,19, 0,17,17,21,17, 0,13,13, - 21,19, 0,16,17,20,19, 0,13,13,16,16, 0,17,17,20, - 21, 0,16,16,19,17, 0,13,13,18,18, 0,17,19,19,19, - 0,13,13,17,17, 0,18,18, 0,19, 0,16,17,18,18, 0, - 16,17,19,21, 0, 0, 0, 0, 0, 0,15,15,16,17, 0,20, - 19,21, 0, 0,17,17,17,17, 0,17,17,21,19, 0, 0, 0, - 0, 0, 0,15,15,17,17, 0,21, 0, 0, 0, 0,18,18,17, - 17, 0,10,10,15,15, 0,15,15,17,17, 0,15,14,16,16, - 0, 0, 0,21,19, 0,21,21,19,21, 0,13,13,17,16, 0, - 17,17,18,19, 0,14,15,16,15, 0, 0, 0,21,19, 0,21, - 21,18,19, 0,14,14,16,17, 0,18,18,18,19, 0,15,15, - 15,16, 0, 0,21, 0,21, 0, 0, 0,19,20, 0, 0, 0,21, - 19, 0, 0, 0, 0, 0, 0,21,21,19,17, 0, 0, 0, 0, 0, - 0, 0, 0,21,21, 0,21, 0, 0,21, 0, 0, 0, 0, 0, 0, - 21,21,19,18, 0, 0, 0, 0, 0, 0, 0, 0, 0,19, 0,21, - 18,18,17, 0,21, 0,20,20, 0, 0, 0,18,20, 0, 0,21, - 18,21, 0, 0, 0,21,18, 0, 0, 0, 0,19, 0, 0, 0,21, - 21, 0,20,21,17,19, 0,21, 0,21, 0, 0,21, 0,18,18, - 0,20,21,17,18, 0, 0, 0,21,19, 0,20,21,17,18, 0, - 0, 0,21,21, 0, 0, 0,20,19, 0, 0, 0,21,21, 0, 0, - 0, 0, 0, 0,21,21,19,18, 0, 0, 0, 0, 0, 0, 0,21, - 19,18, 0,21,21,19, 0, 0, 0, 0,21, 0, 0,21,21,18, - 17, 0, 0, 0, 0, 0, 0,21, 0,21,18, 0,12,12,14,14, - 0,15,14,17,17, 0,14,14,17,16, 0,19,17, 0, 0, 0, - 19,19, 0, 0, 0,13,13,17,17, 0,17,17,20,20, 0,13, - 13,18,18, 0,18,17, 0, 0, 0,18,21, 0, 0, 0,13,13, - 17,17, 0,18,18,21,20, 0,14,14,18,19, 0,19,18,21, - 0, 0,19,19, 0, 0, 0,20,18,20, 0, 0, 0, 0, 0, 0, - 0,15,16, 0, 0, 0,21,21, 0, 0, 0,19,19, 0, 0, 0, - 18,18, 0, 0, 0, 0, 0, 0, 0, 0,16,16, 0,21, 0, 0, - 0, 0, 0, 0,19,20, 0, 0, 0,15,15,20,21, 0,17,17, - 21,21, 0,17,17, 0, 0, 0,19,18, 0, 0, 0,18,19, 0, - 0, 0,17,16, 0,21, 0, 0,20, 0, 0, 0,16,16, 0,20, - 0,19,19, 0,21, 0,19,18, 0,21, 0,16,16, 0, 0, 0, - 21,21, 0, 0, 0,16,16, 0, 0, 0,21,21, 0, 0, 0,19, - 19, 0, 0, 0,20, 0, 0, 0, 0, 0, 0, 0, 0, 0,17,17, - 0,21, 0, 0,20, 0, 0, 0,20,18,21,21, 0,19,18, 0, - 20, 0, 0, 0, 0, 0, 0,16,17,21, 0, 0, 0,21, 0, 0, - 0,19,20,21,20, -}; - -static const static_codebook _44pn1_p4_0 = { - 5, 3125, - (char *)_vq_lengthlist__44pn1_p4_0, - 1, -528744448, 1616642048, 3, 0, - (long *)_vq_quantlist__44pn1_p4_0, - 0 -}; - -static const long _vq_quantlist__44pn1_p4_1[] = { - 3, - 2, - 4, - 1, - 5, - 0, - 6, -}; - -static const char _vq_lengthlist__44pn1_p4_1[] = { - 2, 3, 3, 3, 3, 3, 3, -}; - -static const static_codebook _44pn1_p4_1 = { - 1, 7, - (char *)_vq_lengthlist__44pn1_p4_1, - 1, -533200896, 1611661312, 3, 0, - (long *)_vq_quantlist__44pn1_p4_1, - 0 -}; - -static const long _vq_quantlist__44pn1_p5_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44pn1_p5_0[] = { - 1, 7, 7, 6, 8, 8, 7, 8, 8, 7, 9, 9,11,11,11, 9, - 8, 8, 7, 9, 9,11,12,11, 9, 9, 9, 6, 7, 7,10,11, - 11,10,10,10,10,11,11,15,14,14,12,12,12,11,11,11, - 14,14,14,12,12,12, 5, 6, 6, 8, 5, 5, 8, 7, 7, 8, - 8, 8,12,10,10,10, 7, 7, 8, 7, 7,12,10,10,10, 7, - 7, 6, 7, 7,12,11,11,12,10,10,11,10,10,14,14,13, - 13,10,10,11,10,10,16,14,14,14,11,10, 7, 7, 7,13, - 12,12,12,12,11,11,11,11,15,14,17,13,12,12,12,11, - 11,15,15,15,14,13,13,10, 9, 9,14,12,11,13,11,11, - 12,11,11,16,15,14,14,11,11,12,11,11,17,14,14,15, - 11,11, 7, 8, 8,12,11,11,13,10,10,11,10,10,17,14, - 13,14,10,10,12,10,10,18,15,15,14,10,10, 8, 7, 7, - 13,12,12,13,11,11,12,11,11,16,14,15,14,12,12,12, - 11,11,18,16,16,14,12,12,11,10,10,13,12,11,13,11, - 11,13,12,12, 0,15,14,14,11,11,13,11,11,16,15,15, - 15,11,11, -}; - -static const static_codebook _44pn1_p5_0 = { - 5, 243, - (char *)_vq_lengthlist__44pn1_p5_0, - 1, -527106048, 1620377600, 2, 0, - (long *)_vq_quantlist__44pn1_p5_0, - 0 -}; - -static const long _vq_quantlist__44pn1_p5_1[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44pn1_p5_1[] = { - 2, 6, 7, 6, 8, 8, 7, 7, 8, 7, 8, 8, 9, 9, 9, 8, - 7, 7, 8, 8, 8, 9, 9, 9, 9, 8, 8, 6, 6, 6, 9, 7, - 7, 9, 7, 7, 9, 8, 8,10, 8, 8,10, 8, 8,10, 8, 8, - 10, 9, 8,10, 8, 8, 7, 6, 6, 9, 6, 6, 9, 6, 6, 9, - 7, 7,10, 8, 8,10, 6, 6, 9, 7, 7,10, 8, 8,10, 6, - 6, 7, 7, 7,11, 9, 9,11, 9, 9,10, 9, 9,12,10,10, - 12, 8, 8,11, 9, 9,13, 9,10,12, 8, 8, 8, 7, 7,11, - 9,10,11,10,10,10, 9, 9,11,11,11,11, 9, 9,11,10, - 9,12,11,11,11, 9,10,10, 8, 8,11, 9,10,11, 9, 9, - 11, 9, 9,12,10,10,11, 9, 9,11, 9, 9,12,10,11,11, - 9, 9, 8, 8, 8,12, 9, 9,12, 9, 9,11, 9, 9,13, 9, - 9,13, 8, 8,12, 9, 9,13,10,10,12, 8, 8, 9, 7, 7, - 11,10,10,11,10,10,11,10,10,12,11,11,11,10, 9,11, - 10,10,11,11,11,11, 9, 9,11, 9, 9,12,10,10,11,10, - 10,12,10,10,11,11,11,11, 9, 9,11,10,10,12,11,11, - 11, 9, 9, -}; - -static const static_codebook _44pn1_p5_1 = { - 5, 243, - (char *)_vq_lengthlist__44pn1_p5_1, - 1, -530841600, 1616642048, 2, 0, - (long *)_vq_quantlist__44pn1_p5_1, - 0 -}; - -static const long _vq_quantlist__44pn1_p6_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44pn1_p6_0[] = { - 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, -}; - -static const static_codebook _44pn1_p6_0 = { - 5, 243, - (char *)_vq_lengthlist__44pn1_p6_0, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44pn1_p6_0, - 0 -}; - -static const long _vq_quantlist__44pn1_p6_1[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const char _vq_lengthlist__44pn1_p6_1[] = { - 1, 3, 2, 5, 4, 7, 7, 8, 8, 9, 9,10,10,11,11,12, - 12,13,13,14,14,15,15,15,15, -}; - -static const static_codebook _44pn1_p6_1 = { - 1, 25, - (char *)_vq_lengthlist__44pn1_p6_1, - 1, -518864896, 1620639744, 5, 0, - (long *)_vq_quantlist__44pn1_p6_1, - 0 -}; - -static const long _vq_quantlist__44pn1_p6_2[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const char _vq_lengthlist__44pn1_p6_2[] = { - 3, 5, 4, 5, 4, 5, 4, 5, 5, 5, 4, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44pn1_p6_2 = { - 1, 25, - (char *)_vq_lengthlist__44pn1_p6_2, - 1, -529006592, 1611661312, 5, 0, - (long *)_vq_quantlist__44pn1_p6_2, - 0 -}; - -static const char _huff_lengthlist__44pn1_short[] = { - 4, 3, 7, 9,12,16,16, 3, 2, 5, 7,11,14,15, 7, 4, - 5, 6, 9,12,15, 8, 5, 5, 5, 8,10,14, 9, 7, 6, 6, - 8,10,12,12,10,10, 7, 6, 8,10,15,12,10, 6, 4, 7, - 9, -}; - -static const static_codebook _huff_book__44pn1_short = { - 2, 49, - (char *)_huff_lengthlist__44pn1_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/books/coupled/res_books_stereo.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/books/coupled/res_books_stereo.h deleted file mode 100644 index 9a9049f6..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/books/coupled/res_books_stereo.h +++ /dev/null @@ -1,15783 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: static codebooks autogenerated by huff/huffbuld - last modified: $Id: res_books_stereo.h 19057 2014-01-22 12:32:31Z xiphmont $ - - ********************************************************************/ - -#include "codebook.h" - -static const long _vq_quantlist__16c0_s_p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__16c0_s_p1_0[] = { - 1, 4, 4, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9,10, 0, 0, 0, - 0, 0, 0, 7, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 8, 0, 0, 0, 0, - 0, 0, 8,10,10, 0, 0, 0, 0, 0, 0, 8,10,10, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,10,10, 0, 0, 0, - 0, 0, 0, 9, 9,12, 0, 0, 0, 0, 0, 0,10,12,11, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,10,10, 0, 0, - 0, 0, 0, 0, 9,12,10, 0, 0, 0, 0, 0, 0,10,11,12, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 8,10,10, 0, 0, - 0, 0, 0, 0, 8,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 7,10,10, 0, 0, 0, 0, 0, 0,10,12,11, 0, - 0, 0, 0, 0, 0, 9,10,12, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7,10,10, 0, 0, 0, 0, 0, 0,10,11,12, - 0, 0, 0, 0, 0, 0, 9,12, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _16c0_s_p1_0 = { - 8, 6561, - (char *)_vq_lengthlist__16c0_s_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__16c0_s_p1_0, - 0 -}; - -static const long _vq_quantlist__16c0_s_p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__16c0_s_p3_0[] = { - 1, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 7, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 6, 6, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _16c0_s_p3_0 = { - 4, 625, - (char *)_vq_lengthlist__16c0_s_p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__16c0_s_p3_0, - 0 -}; - -static const long _vq_quantlist__16c0_s_p4_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__16c0_s_p4_0[] = { - 1, 3, 2, 7, 8, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, - 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 7, 7, - 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, - 8, 8, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _16c0_s_p4_0 = { - 2, 81, - (char *)_vq_lengthlist__16c0_s_p4_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__16c0_s_p4_0, - 0 -}; - -static const long _vq_quantlist__16c0_s_p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__16c0_s_p5_0[] = { - 1, 3, 3, 6, 6, 6, 6, 8, 8, 0, 0, 0, 7, 7, 7, 7, - 8, 8, 0, 0, 0, 7, 7, 7, 7, 8, 8, 0, 0, 0, 7, 7, - 8, 8, 9, 9, 0, 0, 0, 7, 7, 8, 8, 9, 9, 0, 0, 0, - 8, 9, 8, 8,10,10, 0, 0, 0, 8, 8, 8, 8,10,10, 0, - 0, 0,10,10, 9, 9,10,10, 0, 0, 0, 0, 0, 9, 9,10, - 10, -}; - -static const static_codebook _16c0_s_p5_0 = { - 2, 81, - (char *)_vq_lengthlist__16c0_s_p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__16c0_s_p5_0, - 0 -}; - -static const long _vq_quantlist__16c0_s_p6_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__16c0_s_p6_0[] = { - 1, 3, 4, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10,11, - 11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10,11, - 11,11, 0, 0, 0, 6, 6, 8, 8, 9, 9, 9, 9,10,10,11, - 11,11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10, - 11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, - 10,11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10,10, - 11,11,12,12,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10, - 10,11,11,12,12,12,13, 0, 0, 0, 9, 9, 9, 9,10,10, - 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0,10,10,10, - 10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9, - 10,10,11,11,12,12,13,13,13,13, 0, 0, 0, 0, 0, 9, - 9,10,10,11,11,12,12,13,13,13,14, 0, 0, 0, 0, 0, - 10,10,10,11,11,11,12,12,13,13,13,14, 0, 0, 0, 0, - 0, 0, 0,10,10,11,11,12,12,13,13,14,14, 0, 0, 0, - 0, 0, 0, 0,11,11,12,12,13,13,13,13,14,14, 0, 0, - 0, 0, 0, 0, 0,11,11,12,12,12,13,13,14,15,14, 0, - 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,13,14,14,15, - 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,13,13,14,13,14, - 14, -}; - -static const static_codebook _16c0_s_p6_0 = { - 2, 289, - (char *)_vq_lengthlist__16c0_s_p6_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__16c0_s_p6_0, - 0 -}; - -static const long _vq_quantlist__16c0_s_p7_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__16c0_s_p7_0[] = { - 1, 4, 4, 6, 6, 6, 7, 6, 6, 4, 7, 7,11,10,10,11, - 11,10, 4, 7, 7,10,10,10,11,10,10, 6,10,10,11,11, - 11,11,11,10, 6, 9, 9,11,12,12,11, 9, 9, 6, 9,10, - 11,12,12,11, 9,10, 7,11,11,11,11,11,12,13,12, 6, - 9,10,11,10,10,12,13,13, 6,10, 9,11,10,10,11,12, - 13, -}; - -static const static_codebook _16c0_s_p7_0 = { - 4, 81, - (char *)_vq_lengthlist__16c0_s_p7_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__16c0_s_p7_0, - 0 -}; - -static const long _vq_quantlist__16c0_s_p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__16c0_s_p7_1[] = { - 1, 3, 4, 6, 6, 7, 7, 8, 8, 8, 8,10,10,10, 7, 7, - 8, 8, 8, 9, 9, 9,10,10,10, 6, 7, 8, 8, 8, 8, 9, - 8,10,10,10, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10, 7, - 7, 8, 8, 9, 9, 8, 9,10,10,10, 8, 8, 9, 9, 9, 9, - 9, 9,11,11,11, 8, 8, 9, 9, 9, 9, 9,10,10,11,11, - 9, 9, 9, 9, 9, 9, 9,10,11,11,11,10,11, 9, 9, 9, - 9,10, 9,11,11,11,10,11,10,10, 9, 9,10,10,11,11, - 11,11,11, 9, 9, 9, 9,10,10, -}; - -static const static_codebook _16c0_s_p7_1 = { - 2, 121, - (char *)_vq_lengthlist__16c0_s_p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__16c0_s_p7_1, - 0 -}; - -static const long _vq_quantlist__16c0_s_p8_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__16c0_s_p8_0[] = { - 1, 4, 4, 7, 7, 7, 7, 7, 6, 8, 8,10,10, 6, 5, 6, - 8, 8, 8, 8, 8, 8, 8, 9,10,10, 7, 6, 6, 8, 8, 8, - 8, 8, 8, 8, 8,10,10, 0, 8, 8, 8, 8, 9, 8, 9, 9, - 9,10,10,10, 0, 9, 8, 8, 8, 9, 9, 8, 8, 9, 9,10, - 10, 0,12,11, 8, 8, 9, 9, 9, 9,10,10,11,10, 0,12, - 13, 8, 8, 9,10, 9, 9,11,11,11,12, 0, 0, 0, 8, 8, - 8, 8,10, 9,12,13,12,14, 0, 0, 0, 8, 8, 8, 9,10, - 10,12,12,13,14, 0, 0, 0,13,13, 9, 9,11,11, 0, 0, - 14, 0, 0, 0, 0,14,14,10,10,12,11,12,14,14,14, 0, - 0, 0, 0, 0,11,11,13,13,14,13,14,14, 0, 0, 0, 0, - 0,12,13,13,12,13,14,14,14, -}; - -static const static_codebook _16c0_s_p8_0 = { - 2, 169, - (char *)_vq_lengthlist__16c0_s_p8_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__16c0_s_p8_0, - 0 -}; - -static const long _vq_quantlist__16c0_s_p8_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__16c0_s_p8_1[] = { - 1, 4, 3, 5, 5, 7, 7, 7, 6, 6, 7, 7, 7, 5, 5, 7, - 7, 7, 6, 6, 7, 7, 7, 6, 6, -}; - -static const static_codebook _16c0_s_p8_1 = { - 2, 25, - (char *)_vq_lengthlist__16c0_s_p8_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__16c0_s_p8_1, - 0 -}; - -static const long _vq_quantlist__16c0_s_p9_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__16c0_s_p9_0[] = { - 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 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, 7, 7, 7, 7, 7, 7, 7, - 7, -}; - -static const static_codebook _16c0_s_p9_0 = { - 4, 81, - (char *)_vq_lengthlist__16c0_s_p9_0, - 1, -518803456, 1628680192, 2, 0, - (long *)_vq_quantlist__16c0_s_p9_0, - 0 -}; - -static const long _vq_quantlist__16c0_s_p9_1[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const char _vq_lengthlist__16c0_s_p9_1[] = { - 1, 5, 5, 5, 5, 9,11,11,10,10,10,10,10,10,10, 7, - 6, 6, 6, 6,10,10,10,10,10,10,10,10,10,10, 7, 6, - 6, 6, 6,10, 9,10,10,10,10,10,10,10,10,10, 7, 7, - 8, 9,10,10,10,10,10,10,10,10,10,10,10, 8, 7,10, - 10,10, 9,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10, -}; - -static const static_codebook _16c0_s_p9_1 = { - 2, 225, - (char *)_vq_lengthlist__16c0_s_p9_1, - 1, -520986624, 1620377600, 4, 0, - (long *)_vq_quantlist__16c0_s_p9_1, - 0 -}; - -static const long _vq_quantlist__16c0_s_p9_2[] = { - 10, - 9, - 11, - 8, - 12, - 7, - 13, - 6, - 14, - 5, - 15, - 4, - 16, - 3, - 17, - 2, - 18, - 1, - 19, - 0, - 20, -}; - -static const char _vq_lengthlist__16c0_s_p9_2[] = { - 1, 5, 5, 7, 8, 8, 7, 9, 9, 9,12,12,11,12,12,10, - 10,11,12,12,12,11,12,12, 8, 9, 8, 7, 9,10,10,11, - 11,10,11,12,10,12,10,12,12,12,11,12,11, 9, 8, 8, - 9,10, 9, 8, 9,10,12,12,11,11,12,11,10,11,12,11, - 12,12, 8, 9, 9, 9,10,11,12,11,12,11,11,11,11,12, - 12,11,11,12,12,11,11, 9, 9, 8, 9, 9,11, 9, 9,10, - 9,11,11,11,11,12,11,11,10,12,12,12, 9,12,11,10, - 11,11,11,11,12,12,12,11,11,11,12,10,12,12,12,10, - 10, 9,10, 9,10,10, 9, 9, 9,10,10,12,10,11,11, 9, - 11,11,10,11,11,11,10,10,10, 9, 9,10,10, 9, 9,10, - 11,11,10,11,10,11,10,11,11,10,11,11,11,10, 9,10, - 10, 9,10, 9, 9,11, 9, 9,11,10,10,11,11,10,10,11, - 10,11, 8, 9,11,11,10, 9,10,11,11,10,11,11,10,10, - 10,11,10, 9,10,10,11, 9,10,10, 9,11,10,10,10,10, - 11,10,11,11, 9,11,10,11,10,10,11,11,10,10,10, 9, - 10,10,11,11,11, 9,10,10,10,10,10,11,10,10,10, 9, - 10,10,11,10,10,10,10,10, 9,10,11,10,10,10,10,11, - 11,11,10,10,10,10,10,11,10,11,10,11,10,10,10, 9, - 11,11,10,10,10,11,11,10,10,10,10,10,10,10,10,11, - 11, 9,10,10,10,11,10,11,10,10,10,11, 9,10,11,10, - 11,10,10, 9,10,10,10,11,10,11,10,10,10,10,10,11, - 11,10,11,11,10,10,11,11,10, 9, 9,10,10,10,10,10, - 9,11, 9,10,10,10,11,11,10,10,10,10,11,11,11,10, - 9, 9,10,10,11,10,10,10,10,10,11,11,11,10,10,10, - 11,11,11, 9,10,10,10,10, 9,10, 9,10,11,10,11,10, - 10,11,11,10,11,11,11,11,11,10,11,10,10,10, 9,11, - 11,10,11,11,11,11,11,11,11,11,11,10,11,10,10,10, - 10,11,10,10,11, 9,10,10,10, -}; - -static const static_codebook _16c0_s_p9_2 = { - 2, 441, - (char *)_vq_lengthlist__16c0_s_p9_2, - 1, -529268736, 1611661312, 5, 0, - (long *)_vq_quantlist__16c0_s_p9_2, - 0 -}; - -static const char _huff_lengthlist__16c0_s_single[] = { - 3, 4,19, 7, 9, 7, 8,11, 9,12, 4, 1,19, 6, 7, 7, - 8,10,11,13,18,18,18,18,18,18,18,18,18,18, 8, 6, - 18, 8, 9, 9,11,12,14,18, 9, 6,18, 9, 7, 8, 9,11, - 12,18, 7, 6,18, 8, 7, 7, 7, 9,11,17, 8, 8,18, 9, - 7, 6, 6, 8,11,17,10,10,18,12, 9, 8, 7, 9,12,18, - 13,15,18,15,13,11,10,11,15,18,14,18,18,18,18,18, - 16,16,18,18, -}; - -static const static_codebook _huff_book__16c0_s_single = { - 2, 100, - (char *)_huff_lengthlist__16c0_s_single, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__16c1_s_long[] = { - 2, 5,20, 7,10, 7, 8,10,11,11, 4, 2,20, 5, 8, 6, - 7, 9,10,10,20,20,20,20,19,19,19,19,19,19, 7, 5, - 19, 6,10, 7, 9,11,13,17,11, 8,19,10, 7, 7, 8,10, - 11,15, 7, 5,19, 7, 7, 5, 6, 9,11,16, 7, 6,19, 8, - 7, 6, 6, 7, 9,13, 9, 9,19,11, 9, 8, 6, 7, 8,13, - 12,14,19,16,13,10, 9, 8, 9,13,14,17,19,18,18,17, - 12,11,11,13, -}; - -static const static_codebook _huff_book__16c1_s_long = { - 2, 100, - (char *)_huff_lengthlist__16c1_s_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__16c1_s_p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__16c1_s_p1_0[] = { - 1, 5, 5, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 8, 7, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, - 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 7, 8, 0, 0, 0, 0, 0, 0, 7, 9, 8, 0, 0, - 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 7, 0, 0, 0, 0, - 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, - 0, 0, 0, 9, 9,11, 0, 0, 0, 0, 0, 0, 9,11,10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 8,11, 9, 0, 0, 0, 0, 0, 0, 9,10,11, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 7, 8, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,11,10, 0, - 0, 0, 0, 0, 0, 8, 9,11, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,11, - 0, 0, 0, 0, 0, 0, 9,11, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _16c1_s_p1_0 = { - 8, 6561, - (char *)_vq_lengthlist__16c1_s_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__16c1_s_p1_0, - 0 -}; - -static const long _vq_quantlist__16c1_s_p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__16c1_s_p3_0[] = { - 1, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 5, 7, 7, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 5, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 7, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _16c1_s_p3_0 = { - 4, 625, - (char *)_vq_lengthlist__16c1_s_p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__16c1_s_p3_0, - 0 -}; - -static const long _vq_quantlist__16c1_s_p4_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__16c1_s_p4_0[] = { - 1, 2, 3, 7, 7, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, - 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 7, 7, - 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, - 8, 8, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 0, 0, 0, 0, - 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _16c1_s_p4_0 = { - 2, 81, - (char *)_vq_lengthlist__16c1_s_p4_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__16c1_s_p4_0, - 0 -}; - -static const long _vq_quantlist__16c1_s_p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__16c1_s_p5_0[] = { - 1, 3, 3, 5, 5, 6, 6, 8, 8, 0, 0, 0, 7, 7, 7, 7, - 9, 9, 0, 0, 0, 7, 7, 7, 7, 9, 9, 0, 0, 0, 8, 8, - 8, 8, 9, 9, 0, 0, 0, 8, 8, 8, 8,10,10, 0, 0, 0, - 9, 9, 8, 8,10,10, 0, 0, 0, 9, 9, 8, 8,10,10, 0, - 0, 0,10,10, 9, 9,10,10, 0, 0, 0, 0, 0, 9, 9,10, - 10, -}; - -static const static_codebook _16c1_s_p5_0 = { - 2, 81, - (char *)_vq_lengthlist__16c1_s_p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__16c1_s_p5_0, - 0 -}; - -static const long _vq_quantlist__16c1_s_p6_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__16c1_s_p6_0[] = { - 1, 3, 3, 6, 6, 8, 8, 9, 9, 9, 9,10,10,11,11,12, - 12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11,11, - 12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11, - 11,12,12, 0, 0, 0, 8, 8, 8, 9,10, 9,10,10,10,10, - 11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10,10,11, - 11,11,12,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10,10, - 11,11,12,12,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10, - 10,11,11,12,12,13,13, 0, 0, 0, 9, 9, 9, 9,10,10, - 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9,10, - 10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9, - 10,10,11,11,12,12,12,12,13,13, 0, 0, 0, 0, 0, 9, - 9,10,10,11,11,12,12,12,12,13,13, 0, 0, 0, 0, 0, - 10,10,11,10,11,11,12,12,13,13,13,13, 0, 0, 0, 0, - 0, 0, 0,10,10,11,11,12,12,13,13,13,13, 0, 0, 0, - 0, 0, 0, 0,11,11,12,12,12,12,13,13,14,14, 0, 0, - 0, 0, 0, 0, 0,11,11,12,12,12,12,13,13,14,14, 0, - 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,13,13,14,14, - 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,13,13,13,13,14, - 14, -}; - -static const static_codebook _16c1_s_p6_0 = { - 2, 289, - (char *)_vq_lengthlist__16c1_s_p6_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__16c1_s_p6_0, - 0 -}; - -static const long _vq_quantlist__16c1_s_p7_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__16c1_s_p7_0[] = { - 1, 4, 4, 6, 6, 6, 7, 6, 6, 4, 7, 7,10, 9,10,10, - 10, 9, 4, 7, 7,10,10,10,11,10,10, 6,10,10,11,11, - 11,11,10,10, 6,10, 9,11,11,11,11,10,10, 6,10,10, - 11,11,11,11,10,10, 7,11,11,11,11,11,12,12,11, 6, - 10,10,11,10,10,11,11,11, 6,10,10,10,11,10,11,11, - 11, -}; - -static const static_codebook _16c1_s_p7_0 = { - 4, 81, - (char *)_vq_lengthlist__16c1_s_p7_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__16c1_s_p7_0, - 0 -}; - -static const long _vq_quantlist__16c1_s_p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__16c1_s_p7_1[] = { - 2, 3, 3, 5, 6, 7, 7, 7, 7, 8, 8,10,10,10, 6, 6, - 7, 7, 8, 8, 8, 8,10,10,10, 6, 6, 7, 7, 8, 8, 8, - 8,10,10,10, 7, 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, - 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, - 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, - 8, 8, 8, 8, 8, 8, 9, 9,10,10,10,10,10, 8, 8, 8, - 8, 9, 9,10,10,10,10,10, 9, 9, 8, 8, 9, 9,10,10, - 10,10,10, 8, 8, 8, 8, 9, 9, -}; - -static const static_codebook _16c1_s_p7_1 = { - 2, 121, - (char *)_vq_lengthlist__16c1_s_p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__16c1_s_p7_1, - 0 -}; - -static const long _vq_quantlist__16c1_s_p8_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__16c1_s_p8_0[] = { - 1, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 6, 5, 5, - 7, 8, 8, 9, 8, 8, 9, 9,10,11, 6, 5, 5, 8, 8, 9, - 9, 8, 8, 9,10,10,11, 0, 8, 8, 8, 9, 9, 9, 9, 9, - 10,10,11,11, 0, 9, 9, 9, 8, 9, 9, 9, 9,10,10,11, - 11, 0,13,13, 9, 9,10,10,10,10,11,11,12,12, 0,14, - 13, 9, 9,10,10,10,10,11,11,12,12, 0, 0, 0,10,10, - 9, 9,11,11,12,12,13,12, 0, 0, 0,10,10, 9, 9,10, - 10,12,12,13,13, 0, 0, 0,13,14,11,10,11,11,12,12, - 13,14, 0, 0, 0,14,14,10,10,11,11,12,12,13,13, 0, - 0, 0, 0, 0,12,12,12,12,13,13,14,15, 0, 0, 0, 0, - 0,12,12,12,12,13,13,14,15, -}; - -static const static_codebook _16c1_s_p8_0 = { - 2, 169, - (char *)_vq_lengthlist__16c1_s_p8_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__16c1_s_p8_0, - 0 -}; - -static const long _vq_quantlist__16c1_s_p8_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__16c1_s_p8_1[] = { - 2, 3, 3, 5, 5, 6, 6, 6, 5, 5, 6, 6, 6, 5, 5, 6, - 6, 6, 5, 5, 6, 6, 6, 5, 5, -}; - -static const static_codebook _16c1_s_p8_1 = { - 2, 25, - (char *)_vq_lengthlist__16c1_s_p8_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__16c1_s_p8_1, - 0 -}; - -static const long _vq_quantlist__16c1_s_p9_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__16c1_s_p9_0[] = { - 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _16c1_s_p9_0 = { - 2, 169, - (char *)_vq_lengthlist__16c1_s_p9_0, - 1, -513964032, 1628680192, 4, 0, - (long *)_vq_quantlist__16c1_s_p9_0, - 0 -}; - -static const long _vq_quantlist__16c1_s_p9_1[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const char _vq_lengthlist__16c1_s_p9_1[] = { - 1, 4, 4, 4, 4, 8, 8,12,13,14,14,14,14,14,14, 6, - 6, 6, 6, 6,10, 9,14,14,14,14,14,14,14,14, 7, 6, - 5, 6, 6,10, 9,12,13,13,13,13,13,13,13,13, 7, 7, - 9, 9,11,11,12,13,13,13,13,13,13,13,13, 7, 7, 8, - 8,11,12,13,13,13,13,13,13,13,13,13,12,12,10,10, - 13,12,13,13,13,13,13,13,13,13,13,12,12,10,10,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,12,13,12, - 13,13,13,13,13,13,13,13,13,13,13,13,12,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,12,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,12,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13, -}; - -static const static_codebook _16c1_s_p9_1 = { - 2, 225, - (char *)_vq_lengthlist__16c1_s_p9_1, - 1, -520986624, 1620377600, 4, 0, - (long *)_vq_quantlist__16c1_s_p9_1, - 0 -}; - -static const long _vq_quantlist__16c1_s_p9_2[] = { - 10, - 9, - 11, - 8, - 12, - 7, - 13, - 6, - 14, - 5, - 15, - 4, - 16, - 3, - 17, - 2, - 18, - 1, - 19, - 0, - 20, -}; - -static const char _vq_lengthlist__16c1_s_p9_2[] = { - 1, 4, 4, 6, 6, 7, 7, 8, 7, 8, 8, 9, 9, 9, 9,10, - 10,10, 9,10,10,11,12,12, 8, 8, 8, 8, 9, 9, 9, 9, - 10,10,10,10,10,11,11,10,12,11,11,13,11, 7, 7, 8, - 8, 8, 8, 9, 9, 9,10,10,10,10, 9,10,10,11,11,12, - 11,11, 8, 8, 8, 8, 9, 9,10,10,10,10,11,11,11,11, - 11,11,11,12,11,12,12, 8, 8, 9, 9, 9, 9, 9,10,10, - 10,10,10,10,11,11,11,11,11,11,12,11, 9, 9, 9, 9, - 10,10,10,10,11,10,11,11,11,11,11,11,12,12,12,12, - 11, 9, 9, 9, 9,10,10,10,10,11,11,11,11,11,11,11, - 11,11,12,12,12,13, 9,10,10, 9,11,10,10,10,10,11, - 11,11,11,11,10,11,12,11,12,12,11,12,11,10, 9,10, - 10,11,10,11,11,11,11,11,11,11,11,11,12,12,11,12, - 12,12,10,10,10,11,10,11,11,11,11,11,11,11,11,11, - 11,11,12,13,12,12,11, 9,10,10,11,11,10,11,11,11, - 12,11,11,11,11,11,12,12,13,13,12,13,10,10,12,10, - 11,11,11,11,11,11,11,11,11,12,12,11,13,12,12,12, - 12,13,12,11,11,11,11,11,11,12,11,12,11,11,11,11, - 12,12,13,12,11,12,12,11,11,11,11,11,12,11,11,11, - 11,12,11,11,12,11,12,13,13,12,12,12,12,11,11,11, - 11,11,12,11,11,12,11,12,11,11,11,11,13,12,12,12, - 12,13,11,11,11,12,12,11,11,11,12,11,12,12,12,11, - 12,13,12,11,11,12,12,11,12,11,11,11,12,12,11,12, - 11,11,11,12,12,12,12,13,12,13,12,12,12,12,11,11, - 12,11,11,11,11,11,11,12,12,12,13,12,11,13,13,12, - 12,11,12,10,11,11,11,11,12,11,12,12,11,12,12,13, - 12,12,13,12,12,12,12,12,11,12,12,12,11,12,11,11, - 11,12,13,12,13,13,13,13,13,12,13,13,12,12,13,11, - 11,11,11,11,12,11,11,12,11, -}; - -static const static_codebook _16c1_s_p9_2 = { - 2, 441, - (char *)_vq_lengthlist__16c1_s_p9_2, - 1, -529268736, 1611661312, 5, 0, - (long *)_vq_quantlist__16c1_s_p9_2, - 0 -}; - -static const char _huff_lengthlist__16c1_s_short[] = { - 5, 6,17, 8,12, 9,10,10,12,13, 5, 2,17, 4, 9, 5, - 7, 8,11,13,16,16,16,16,16,16,16,16,16,16, 6, 4, - 16, 5,10, 5, 7,10,14,16,13, 9,16,11, 8, 7, 8, 9, - 13,16, 7, 4,16, 5, 7, 4, 6, 8,11,13, 8, 6,16, 7, - 8, 5, 5, 7, 9,13, 9, 8,16, 9, 8, 6, 6, 7, 9,13, - 11,11,16,10,10, 7, 7, 7, 9,13,13,13,16,13,13, 9, - 9, 9,10,13, -}; - -static const static_codebook _huff_book__16c1_s_short = { - 2, 100, - (char *)_huff_lengthlist__16c1_s_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__16c2_s_long[] = { - 4, 7, 9, 9, 9, 8, 9,10,13,16, 5, 4, 5, 6, 7, 7, - 8, 9,12,16, 6, 5, 5, 5, 7, 7, 9,10,12,15, 7, 6, - 5, 4, 5, 6, 8, 9,10,13, 8, 7, 7, 5, 5, 5, 7, 9, - 10,12, 7, 7, 7, 6, 5, 5, 6, 7,10,12, 8, 8, 8, 7, - 7, 5, 5, 6, 9,11, 8, 9, 9, 8, 8, 6, 6, 5, 8,11, - 10,11,12,12,11, 9, 9, 8, 9,12,13,14,15,15,14,12, - 12,11,11,13, -}; - -static const static_codebook _huff_book__16c2_s_long = { - 2, 100, - (char *)_huff_lengthlist__16c2_s_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__16c2_s_p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__16c2_s_p1_0[] = { - 1, 3, 3, 0, 0, 0, 0, 0, 0, 4, 5, 5, 0, 0, 0, 0, - 0, 0, 4, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _16c2_s_p1_0 = { - 4, 81, - (char *)_vq_lengthlist__16c2_s_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__16c2_s_p1_0, - 0 -}; - -static const long _vq_quantlist__16c2_s_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__16c2_s_p2_0[] = { - 2, 4, 4, 7, 7, 0, 0, 0, 8, 8, 0, 0, 0, 8, 8, 0, - 0, 0, 8, 8, 0, 0, 0, 8, 8, 4, 4, 4, 8, 7, 0, 0, - 0, 8, 8, 0, 0, 0, 8, 8, 0, 0, 0, 9, 9, 0, 0, 0, - 9, 9, 4, 4, 4, 7, 8, 0, 0, 0, 8, 8, 0, 0, 0, 8, - 8, 0, 0, 0, 9, 9, 0, 0, 0, 9, 9, 7, 8, 8,10, 9, - 0, 0, 0,12,11, 0, 0, 0,11,12, 0, 0, 0,14,13, 0, - 0, 0,14,14, 7, 8, 8, 9,10, 0, 0, 0,11,12, 0, 0, - 0,11,11, 0, 0, 0,14,14, 0, 0, 0,14,14, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8,11,11, 0, 0, 0, - 12,11, 0, 0, 0,12,12, 0, 0, 0,13,12, 0, 0, 0,13, - 13, 8, 8, 8,11,11, 0, 0, 0,11,11, 0, 0, 0,12,12, - 0, 0, 0,13,13, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 8, 9, 8,12,11, 0, 0, 0,12,12, 0, - 0, 0,12,11, 0, 0, 0,13,13, 0, 0, 0,13,13, 8, 8, - 8,11,12, 0, 0, 0,11,12, 0, 0, 0,11,12, 0, 0, 0, - 13,14, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 8, 9, 9,14,14, 0, 0, 0,13,13, 0, 0, 0,13, - 13, 0, 0, 0,13,12, 0, 0, 0,13,13, 8, 9, 9,14,14, - 0, 0, 0,13,13, 0, 0, 0,13,13, 0, 0, 0,12,13, 0, - 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, - 9, 9,14,14, 0, 0, 0,13,13, 0, 0, 0,13,13, 0, 0, - 0,13,13, 0, 0, 0,13,12, 8, 9, 9,14,14, 0, 0, 0, - 13,13, 0, 0, 0,13,13, 0, 0, 0,13,13, 0, 0, 0,12, - 12, -}; - -static const static_codebook _16c2_s_p2_0 = { - 4, 625, - (char *)_vq_lengthlist__16c2_s_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__16c2_s_p2_0, - 0 -}; - -static const long _vq_quantlist__16c2_s_p3_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__16c2_s_p3_0[] = { - 1, 3, 3, 5, 5, 7, 7, 8, 8, 0, 0, 0, 6, 6, 8, 8, - 9, 9, 0, 0, 0, 6, 6, 8, 8, 9, 9, 0, 0, 0, 7, 7, - 8, 9,10,10, 0, 0, 0, 7, 7, 9, 9,10,10, 0, 0, 0, - 8, 8, 9, 9,11,11, 0, 0, 0, 7, 7, 9, 9,11,11, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _16c2_s_p3_0 = { - 2, 81, - (char *)_vq_lengthlist__16c2_s_p3_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__16c2_s_p3_0, - 0 -}; - -static const long _vq_quantlist__16c2_s_p4_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__16c2_s_p4_0[] = { - 2, 3, 3, 5, 5, 6, 6, 6, 6, 7, 7, 8, 8, 8, 8, 9, - 9, 0, 0, 0, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10, - 11,10, 0, 0, 0, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10, - 10,10,10, 0, 0, 0, 6, 6, 8, 8, 9, 9, 9, 9,10,10, - 11,11,11,11, 0, 0, 0, 7, 6, 8, 8, 9, 9, 9, 9,10, - 10,11,11,11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9,10,10, - 11,11,11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9,10, - 10,11,11,11,11,12,12, 0, 0, 0, 7, 8, 8, 8, 9, 9, - 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 8, 8, 9, - 9,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _16c2_s_p4_0 = { - 2, 289, - (char *)_vq_lengthlist__16c2_s_p4_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__16c2_s_p4_0, - 0 -}; - -static const long _vq_quantlist__16c2_s_p5_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__16c2_s_p5_0[] = { - 1, 4, 4, 5, 7, 7, 6, 7, 7, 4, 6, 6,10,11,10,10, - 10,11, 4, 6, 6,10,10,11,10,11,10, 5,10,10, 9,12, - 11,10,12,12, 7,10,10,12,12,12,12,13,13, 7,11,10, - 11,12,12,12,13,13, 6,11,10,10,12,12,11,12,12, 7, - 11,10,12,13,13,12,12,12, 7,10,11,12,13,13,12,12, - 12, -}; - -static const static_codebook _16c2_s_p5_0 = { - 4, 81, - (char *)_vq_lengthlist__16c2_s_p5_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__16c2_s_p5_0, - 0 -}; - -static const long _vq_quantlist__16c2_s_p5_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__16c2_s_p5_1[] = { - 2, 3, 3, 6, 6, 6, 6, 7, 7, 7, 7,11,10,10, 6, 6, - 7, 7, 8, 8, 8, 8,10,10,10, 6, 6, 7, 7, 8, 8, 8, - 8,11,11,11, 7, 7, 8, 8, 8, 8, 9, 9,11,11,11, 6, - 7, 8, 8, 8, 8, 9, 9,11,11,11, 7, 7, 8, 8, 8, 8, - 8, 8,11,11,11, 7, 7, 8, 8, 8, 8, 9, 9,11,11,11, - 8, 8, 8, 8, 8, 8, 8, 8,11,11,11,11,11, 8, 8, 8, - 8, 8, 8,12,11,11,11,11, 8, 8, 8, 8, 8, 8,12,11, - 11,11,11, 7, 7, 8, 8, 8, 8, -}; - -static const static_codebook _16c2_s_p5_1 = { - 2, 121, - (char *)_vq_lengthlist__16c2_s_p5_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__16c2_s_p5_1, - 0 -}; - -static const long _vq_quantlist__16c2_s_p6_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__16c2_s_p6_0[] = { - 1, 4, 4, 6, 6, 8, 7, 8, 8, 9, 9,10,10, 5, 5, 5, - 7, 7, 9, 9, 9, 9,11,11,12,12, 6, 5, 5, 7, 7, 9, - 9,10, 9,11,11,12,12, 0, 7, 7, 7, 7, 9, 9,10,10, - 11,11,12,12, 0, 7, 7, 7, 7, 9, 9,10,10,11,11,12, - 12, 0,11,11, 8, 8,10,10,11,11,12,12,13,13, 0,12, - 12, 9, 9,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 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 static_codebook _16c2_s_p6_0 = { - 2, 169, - (char *)_vq_lengthlist__16c2_s_p6_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__16c2_s_p6_0, - 0 -}; - -static const long _vq_quantlist__16c2_s_p6_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__16c2_s_p6_1[] = { - 2, 3, 3, 5, 5, 6, 6, 6, 5, 5, 6, 6, 6, 5, 5, 6, - 6, 6, 5, 5, 6, 6, 6, 5, 5, -}; - -static const static_codebook _16c2_s_p6_1 = { - 2, 25, - (char *)_vq_lengthlist__16c2_s_p6_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__16c2_s_p6_1, - 0 -}; - -static const long _vq_quantlist__16c2_s_p7_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__16c2_s_p7_0[] = { - 1, 4, 4, 7, 7, 8, 8, 8, 8,10, 9,10,10, 5, 5, 5, - 7, 7, 9, 9,10,10,11,10,12,11, 6, 5, 5, 7, 7, 9, - 9,10,10,11,11,12,12,20, 7, 7, 7, 7, 9, 9,10,10, - 11,11,12,12,20, 7, 7, 7, 7, 9, 9,11,10,12,11,12, - 12,20,11,11, 8, 8,10,10,11,11,12,12,13,13,20,12, - 12, 8, 8, 9, 9,11,11,12,12,13,13,20,20,21,10,10, - 10,10,11,11,12,12,13,13,21,21,21,10,10,10,10,11, - 11,12,12,13,13,21,21,21,14,14,11,11,12,12,13,13, - 13,14,21,21,21,16,15,11,11,12,11,13,13,14,14,21, - 21,21,21,21,13,13,12,12,13,13,14,14,21,21,21,21, - 21,13,13,12,12,13,13,14,14, -}; - -static const static_codebook _16c2_s_p7_0 = { - 2, 169, - (char *)_vq_lengthlist__16c2_s_p7_0, - 1, -523206656, 1618345984, 4, 0, - (long *)_vq_quantlist__16c2_s_p7_0, - 0 -}; - -static const long _vq_quantlist__16c2_s_p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__16c2_s_p7_1[] = { - 2, 4, 4, 6, 6, 7, 7, 7, 7, 7, 7, 9, 9, 9, 6, 7, - 7, 7, 7, 7, 8, 8, 9, 9, 9, 6, 6, 7, 7, 7, 7, 8, - 8, 9, 9, 9, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 7, - 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 7, 7, 7, 7, 8, 8, - 8, 8, 9, 9, 9, 7, 7, 7, 7, 7, 7, 8, 8, 9, 9, 9, - 7, 7, 8, 8, 7, 7, 8, 8, 9, 9, 9, 9, 9, 8, 8, 7, - 7, 8, 8, 9, 9, 9, 9, 9, 8, 8, 7, 7, 8, 8, 9, 9, - 9, 9, 9, 7, 7, 7, 7, 8, 8, -}; - -static const static_codebook _16c2_s_p7_1 = { - 2, 121, - (char *)_vq_lengthlist__16c2_s_p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__16c2_s_p7_1, - 0 -}; - -static const long _vq_quantlist__16c2_s_p8_0[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const char _vq_lengthlist__16c2_s_p8_0[] = { - 1, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9,10,10, 6, - 6, 6, 8, 8, 9, 9, 8, 8, 9, 9,10,10,11,11, 6, 5, - 5, 8, 7, 9, 9, 8, 8, 9, 9,10,10,11,11,20, 8, 8, - 8, 8, 9, 9, 9, 9,10,10,11,10,12,11,20, 8, 8, 8, - 8, 9, 9, 9, 9,10,10,11,11,12,12,20,12,12, 9, 9, - 10,10,10,10,11,11,12,12,13,12,20,13,13, 9, 9,10, - 10,10,10,11,11,12,12,13,13,20,20,20, 9, 9, 9, 9, - 10,10,11,11,12,12,13,12,20,20,20, 9, 9, 9, 8,10, - 10,12,11,12,12,13,13,20,20,20,13,13,10,10,11,11, - 12,12,13,13,13,13,20,20,20,13,13,10,10,11,10,12, - 11,13,13,14,14,20,20,20,20,20,11,11,11,11,12,12, - 13,13,14,14,20,20,20,20,20,11,10,11,11,13,11,13, - 13,14,14,20,20,21,21,21,14,14,11,12,13,13,13,13, - 14,14,21,21,21,21,21,15,15,12,11,13,12,14,13,15, - 14, -}; - -static const static_codebook _16c2_s_p8_0 = { - 2, 225, - (char *)_vq_lengthlist__16c2_s_p8_0, - 1, -520986624, 1620377600, 4, 0, - (long *)_vq_quantlist__16c2_s_p8_0, - 0 -}; - -static const long _vq_quantlist__16c2_s_p8_1[] = { - 10, - 9, - 11, - 8, - 12, - 7, - 13, - 6, - 14, - 5, - 15, - 4, - 16, - 3, - 17, - 2, - 18, - 1, - 19, - 0, - 20, -}; - -static const char _vq_lengthlist__16c2_s_p8_1[] = { - 2, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8,11,11,11, 7, 7, 8, 8, 8, 8, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,11,10, 7, 7, 8, - 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11, - 11,11, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9,11,11,11, 8, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9,10, 9,10,10,10,10,11,11,11, 8, 8, 9, 9, - 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,11,11, - 11, 8, 8, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10, - 10,10,10,11,11,11, 9, 9, 9, 9, 9, 9, 9, 9,10,10, - 10,10,10,10,10,10,10,10,11,11,11,11,11, 9, 9, 9, - 9, 9, 9,10,10,10,10,10,10,10,10,10,10,11,11,11, - 11,11, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10, - 10,10,11,11,11,11,11, 9, 9, 9, 9,10,10,10,10,10, - 10,10,10,10,10,10,10,11,11,11,11,11,10, 9,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11, - 11,11,11,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,11,11,11,11,11,11,11,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,11,11,11,11,11,11,11,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11, - 11,11,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 11,11,11,11,11,11,11,11,11,10,10,10,10,10,10,10, - 10,10,10,10,10,11,11,11,11,11,11,11,11,11,10,10, - 10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11, - 11,11,11,10,10,10,10,10,10,10,10,10,10,10,10,11, - 11,11,11,11,11,11,11,11,10,10,10,10,10,10,10,10, - 10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,10, - 10,10,10,10,10,10,10,10,10, -}; - -static const static_codebook _16c2_s_p8_1 = { - 2, 441, - (char *)_vq_lengthlist__16c2_s_p8_1, - 1, -529268736, 1611661312, 5, 0, - (long *)_vq_quantlist__16c2_s_p8_1, - 0 -}; - -static const long _vq_quantlist__16c2_s_p9_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__16c2_s_p9_0[] = { - 1, 4, 3,10, 8,10,10,10,10,10,10,10,10,10,10,10, - 10, 6,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10, 6,10, 9,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10, -}; - -static const static_codebook _16c2_s_p9_0 = { - 2, 289, - (char *)_vq_lengthlist__16c2_s_p9_0, - 1, -509798400, 1631393792, 5, 0, - (long *)_vq_quantlist__16c2_s_p9_0, - 0 -}; - -static const long _vq_quantlist__16c2_s_p9_1[] = { - 9, - 8, - 10, - 7, - 11, - 6, - 12, - 5, - 13, - 4, - 14, - 3, - 15, - 2, - 16, - 1, - 17, - 0, - 18, -}; - -static const char _vq_lengthlist__16c2_s_p9_1[] = { - 1, 4, 4, 7, 7, 7, 7, 7, 7, 8, 8,10, 9,11,10,13, - 11,14,13, 6, 6, 6, 8, 8, 8, 8, 8, 7, 9, 8,11, 9, - 13,11,14,12,14,13, 5, 6, 6, 8, 8, 8, 8, 8, 8, 9, - 9,11,11,13,11,14,13,15,15,17, 8, 8, 8, 8, 9, 9, - 9, 8,11, 9,12,10,13,11,14,12,14,13,17, 8, 8, 8, - 8, 9, 9, 9, 9,10,10,11,11,13,13,13,14,16,15,17, - 12,12, 8, 8, 9, 9,10,10,11,11,12,11,13,12,13,12, - 14,13,16,12,12, 8, 8, 9, 9,10,10,11,11,12,12,13, - 13,14,14,15,15,17,17,17, 9, 9, 9, 9,11,11,12,12, - 12,13,13,13,16,14,14,14,17,17,17, 9, 8, 9, 8,11, - 10,12,12,13,13,14,14,15,15,16,16,17,17,17,12,12, - 10,10,11,12,12,13,13,14,13,15,15,14,16,15,17,17, - 17,12,12,10, 8,12, 9,13,12,14,14,15,14,15,16,16, - 16,17,17,17,17,17,11,11,12,12,14,14,14,16,15,16, - 15,16,15,17,17,17,17,17,17,11, 9,12,10,13,11,15, - 14,16,16,17,16,16,15,17,17,17,17,17,15,15,12,12, - 14,14,15,16,16,15,16,16,17,17,17,17,17,17,17,14, - 14,12,10,14,11,15,12,17,16,15,16,17,16,17,17,17, - 17,17,17,17,13,13,14,14,14,16,17,17,16,17,17,17, - 17,17,17,17,17,17,17,13, 9,13,12,15,13,16,16,17, - 17,17,17,17,17,17,17,17,17,17,15,17,14,14,15,16, - 16,17,16,17,16,17,17,17,17,17,17,17,17,17,17,14, - 13,15,16,16,17,16,17,17,17, -}; - -static const static_codebook _16c2_s_p9_1 = { - 2, 361, - (char *)_vq_lengthlist__16c2_s_p9_1, - 1, -518287360, 1622704128, 5, 0, - (long *)_vq_quantlist__16c2_s_p9_1, - 0 -}; - -static const long _vq_quantlist__16c2_s_p9_2[] = { - 24, - 23, - 25, - 22, - 26, - 21, - 27, - 20, - 28, - 19, - 29, - 18, - 30, - 17, - 31, - 16, - 32, - 15, - 33, - 14, - 34, - 13, - 35, - 12, - 36, - 11, - 37, - 10, - 38, - 9, - 39, - 8, - 40, - 7, - 41, - 6, - 42, - 5, - 43, - 4, - 44, - 3, - 45, - 2, - 46, - 1, - 47, - 0, - 48, -}; - -static const char _vq_lengthlist__16c2_s_p9_2[] = { - 2, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, - 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, -}; - -static const static_codebook _16c2_s_p9_2 = { - 1, 49, - (char *)_vq_lengthlist__16c2_s_p9_2, - 1, -526909440, 1611661312, 6, 0, - (long *)_vq_quantlist__16c2_s_p9_2, - 0 -}; - -static const char _huff_lengthlist__16c2_s_short[] = { - 7,10,12,11,12,13,15,16,18,15,10, 8, 8, 8, 9,10, - 12,13,14,17,10, 7, 7, 7, 7, 8,10,12,15,18,10, 7, - 7, 5, 5, 6, 8,10,13,15,10, 7, 6, 5, 4, 4, 6, 9, - 12,15,11, 7, 7, 5, 4, 3, 4, 7,11,13,12, 9, 8, 7, - 5, 4, 4, 5,10,13,11,11,11, 9, 7, 5, 5, 5, 9,12, - 13,12,13,12,10, 8, 8, 7, 9,13,14,14,14,14,13,11, - 11,10,10,13, -}; - -static const static_codebook _huff_book__16c2_s_short = { - 2, 100, - (char *)_huff_lengthlist__16c2_s_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__8c0_s_p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__8c0_s_p1_0[] = { - 1, 5, 4, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 7, 8, 9, 0, 0, 0, - 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 7, 9, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 8, 0, 0, 0, 0, - 0, 0, 8,10,10, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,10, 9, 0, 0, 0, - 0, 0, 0, 8, 9,11, 0, 0, 0, 0, 0, 0, 9,11,11, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9,10, 0, 0, - 0, 0, 0, 0, 9,11,10, 0, 0, 0, 0, 0, 0, 9,11,11, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, - 0, 0, 0, 0, 8, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,11,11, 0, - 0, 0, 0, 0, 0, 9,10,11, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 9,10, 0, 0, 0, 0, 0, 0, 9,11,11, - 0, 0, 0, 0, 0, 0, 8,11, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _8c0_s_p1_0 = { - 8, 6561, - (char *)_vq_lengthlist__8c0_s_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__8c0_s_p1_0, - 0 -}; - -static const long _vq_quantlist__8c0_s_p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__8c0_s_p3_0[] = { - 1, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 7, 7, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 5, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 7, 8, 8, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 7, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _8c0_s_p3_0 = { - 4, 625, - (char *)_vq_lengthlist__8c0_s_p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__8c0_s_p3_0, - 0 -}; - -static const long _vq_quantlist__8c0_s_p4_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__8c0_s_p4_0[] = { - 1, 2, 3, 7, 7, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, - 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 7, 7, - 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, - 8, 8, 0, 0, 0, 0, 0, 0, 0, 9, 8, 0, 0, 0, 0, 0, - 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _8c0_s_p4_0 = { - 2, 81, - (char *)_vq_lengthlist__8c0_s_p4_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__8c0_s_p4_0, - 0 -}; - -static const long _vq_quantlist__8c0_s_p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__8c0_s_p5_0[] = { - 1, 3, 3, 5, 5, 7, 6, 8, 8, 0, 0, 0, 7, 7, 7, 7, - 8, 8, 0, 0, 0, 7, 7, 7, 7, 8, 9, 0, 0, 0, 8, 8, - 8, 8, 9, 9, 0, 0, 0, 8, 8, 8, 8, 9, 9, 0, 0, 0, - 9, 9, 8, 8,10,10, 0, 0, 0, 9, 9, 8, 8,10,10, 0, - 0, 0,10,10, 9, 9,10,10, 0, 0, 0, 0, 0, 9, 9,10, - 10, -}; - -static const static_codebook _8c0_s_p5_0 = { - 2, 81, - (char *)_vq_lengthlist__8c0_s_p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__8c0_s_p5_0, - 0 -}; - -static const long _vq_quantlist__8c0_s_p6_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__8c0_s_p6_0[] = { - 1, 3, 3, 6, 6, 8, 8, 9, 9, 8, 8,10, 9,10,10,11, - 11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11,11, - 11,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11, - 11,12,11, 0, 0, 0, 8, 8, 9, 9,10,10, 9, 9,10,10, - 11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10,10, 9, 9,11, - 10,11,11,12,12, 0, 0, 0, 9, 9, 9, 9,10,10,10,10, - 11,11,11,12,12,12, 0, 0, 0, 9, 9, 9, 9,10,10,10, - 10,11,11,12,12,13,13, 0, 0, 0,10,10,10,10,11,11, - 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0,10, 9,10, - 11,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9, - 10, 9,10,11,12,12,13,13,14,13, 0, 0, 0, 0, 0, 9, - 9, 9,10,10,10,11,11,13,12,13,13, 0, 0, 0, 0, 0, - 10,10,10,10,11,11,12,12,13,13,14,14, 0, 0, 0, 0, - 0, 0, 0,10,10,11,11,12,12,13,13,13,14, 0, 0, 0, - 0, 0, 0, 0,11,11,11,11,12,12,13,14,14,14, 0, 0, - 0, 0, 0, 0, 0,11,11,11,11,12,12,13,13,14,13, 0, - 0, 0, 0, 0, 0, 0,11,11,12,12,13,13,14,14,14,14, - 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,14, - 14, -}; - -static const static_codebook _8c0_s_p6_0 = { - 2, 289, - (char *)_vq_lengthlist__8c0_s_p6_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__8c0_s_p6_0, - 0 -}; - -static const long _vq_quantlist__8c0_s_p7_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__8c0_s_p7_0[] = { - 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 7, 7,11, 9,10,12, - 9,10, 4, 7, 7,10,10,10,11, 9, 9, 6,11,10,11,11, - 12,11,11,11, 6,10,10,11,11,12,11,10,10, 6, 9,10, - 11,11,11,11,10,10, 7,10,11,12,11,11,12,11,12, 6, - 9, 9,10, 9, 9,11,10,10, 6, 9, 9,10,10,10,11,10, - 10, -}; - -static const static_codebook _8c0_s_p7_0 = { - 4, 81, - (char *)_vq_lengthlist__8c0_s_p7_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__8c0_s_p7_0, - 0 -}; - -static const long _vq_quantlist__8c0_s_p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__8c0_s_p7_1[] = { - 1, 3, 3, 6, 6, 8, 8, 9, 9, 9, 9,10,10,10, 7, 7, - 8, 8, 9, 9, 9, 9,10,10, 9, 7, 7, 8, 8, 9, 9, 9, - 9,10,10,10, 8, 8, 9, 9, 9, 9, 9, 9,10,10,10, 8, - 8, 9, 9, 9, 9, 8, 9,10,10,10, 8, 8, 9, 9, 9,10, - 10,10,10,10,10, 9, 9, 9, 9, 9, 9,10,10,11,10,11, - 9, 9, 9, 9,10,10,10,10,11,11,11,10,10, 9, 9,10, - 10,10, 9,11,10,10,10,10,10,10, 9, 9,10,10,11,11, - 10,10,10, 9, 9, 9,10,10,10, -}; - -static const static_codebook _8c0_s_p7_1 = { - 2, 121, - (char *)_vq_lengthlist__8c0_s_p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__8c0_s_p7_1, - 0 -}; - -static const long _vq_quantlist__8c0_s_p8_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__8c0_s_p8_0[] = { - 1, 4, 4, 7, 6, 7, 7, 7, 7, 8, 8, 9, 9, 7, 6, 6, - 7, 7, 8, 8, 7, 7, 8, 9,10,10, 7, 6, 6, 7, 7, 8, - 7, 7, 7, 9, 9,10,12, 0, 8, 8, 8, 8, 8, 9, 8, 8, - 9, 9,10,10, 0, 8, 8, 8, 8, 8, 9, 8, 9, 9, 9,11, - 10, 0, 0,13, 9, 8, 9, 9, 9, 9,10,10,11,11, 0,13, - 0, 9, 9, 9, 9, 9, 9,11,10,11,11, 0, 0, 0, 8, 9, - 10, 9,10,10,13,11,12,12, 0, 0, 0, 8, 9, 9, 9,10, - 10,13,12,12,13, 0, 0, 0,12, 0,10,10,12,11,10,11, - 12,12, 0, 0, 0,13,13,10,10,10,11,12, 0,13, 0, 0, - 0, 0, 0, 0,13,11, 0,12,12,12,13,12, 0, 0, 0, 0, - 0, 0,13,13,11,13,13,11,12, -}; - -static const static_codebook _8c0_s_p8_0 = { - 2, 169, - (char *)_vq_lengthlist__8c0_s_p8_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__8c0_s_p8_0, - 0 -}; - -static const long _vq_quantlist__8c0_s_p8_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__8c0_s_p8_1[] = { - 1, 3, 4, 5, 5, 7, 6, 6, 6, 5, 7, 7, 7, 6, 6, 7, - 7, 7, 6, 6, 7, 7, 7, 6, 6, -}; - -static const static_codebook _8c0_s_p8_1 = { - 2, 25, - (char *)_vq_lengthlist__8c0_s_p8_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__8c0_s_p8_1, - 0 -}; - -static const long _vq_quantlist__8c0_s_p9_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__8c0_s_p9_0[] = { - 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 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, 7, 7, 7, 7, 7, 7, 7, - 7, -}; - -static const static_codebook _8c0_s_p9_0 = { - 4, 81, - (char *)_vq_lengthlist__8c0_s_p9_0, - 1, -518803456, 1628680192, 2, 0, - (long *)_vq_quantlist__8c0_s_p9_0, - 0 -}; - -static const long _vq_quantlist__8c0_s_p9_1[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const char _vq_lengthlist__8c0_s_p9_1[] = { - 1, 4, 4, 5, 5,10, 8,11,11,11,11,11,11,11,11, 6, - 6, 6, 7, 6,11,10,11,11,11,11,11,11,11,11, 7, 5, - 6, 6, 6, 8, 7,11,11,11,11,11,11,11,11,11, 7, 8, - 8, 8, 9, 9,11,11,11,11,11,11,11,11,11, 9, 8, 7, - 8, 9,11,11,11,11,11,11,11,11,11,11,11,10,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11, -}; - -static const static_codebook _8c0_s_p9_1 = { - 2, 225, - (char *)_vq_lengthlist__8c0_s_p9_1, - 1, -520986624, 1620377600, 4, 0, - (long *)_vq_quantlist__8c0_s_p9_1, - 0 -}; - -static const long _vq_quantlist__8c0_s_p9_2[] = { - 10, - 9, - 11, - 8, - 12, - 7, - 13, - 6, - 14, - 5, - 15, - 4, - 16, - 3, - 17, - 2, - 18, - 1, - 19, - 0, - 20, -}; - -static const char _vq_lengthlist__8c0_s_p9_2[] = { - 1, 5, 5, 7, 7, 8, 7, 8, 8,10,10, 9, 9,10,10,10, - 11,11,10,12,11,12,12,12, 9, 8, 8, 8, 8, 8, 9,10, - 10,10,10,11,11,11,10,11,11,12,12,11,12, 8, 8, 7, - 7, 8, 9,10,10,10, 9,10,10, 9,10,10,11,11,11,11, - 11,11, 9, 9, 9, 9, 8, 9,10,10,11,10,10,11,11,12, - 10,10,12,12,11,11,10, 9, 9,10, 8, 9,10,10,10, 9, - 10,10,11,11,10,11,10,10,10,12,12,12, 9,10, 9,10, - 9, 9,10,10,11,11,11,11,10,10,10,11,12,11,12,11, - 12,10,11,10,11, 9,10, 9,10, 9,10,10, 9,10,10,11, - 10,11,11,11,11,12,11, 9,10,10,10,10,11,11,11,11, - 11,10,11,11,11,11,10,12,10,12,12,11,12,10,10,11, - 10, 9,11,10,11, 9,10,11,10,10,10,11,11,11,11,12, - 12,10, 9, 9,11,10, 9,12,11,10,12,12,11,11,11,11, - 10,11,11,12,11,10,12, 9,11,10,11,10,10,11,10,11, - 9,10,10,10,11,12,11,11,12,11,10,10,11,11, 9,10, - 10,12,10,11,10,10,10, 9,10,10,10,10, 9,10,10,11, - 11,11,11,12,11,10,10,10,10,11,11,10,11,11, 9,11, - 10,12,10,12,11,10,11,10,10,10,11,10,10,11,11,10, - 11,10,10,10,10,11,11,12,10,10,10,11,10,11,12,11, - 10,11,10,10,11,11,10,12,10, 9,10,10,11,11,11,10, - 12,10,10,11,11,11,10,10,11,10,10,10,11,10,11,10, - 12,11,11,10,10,10,12,10,10,11, 9,10,11,11,11,10, - 10,11,10,10, 9,11,11,12,12,11,12,11,11,11,11,11, - 11, 9,10,11,10,12,10,10,10,10,11,10,10,11,10,10, - 12,10,10,10,10,10, 9,12,10,10,10,10,12, 9,11,10, - 10,11,10,12,12,10,12,12,12,10,10,10,10, 9,10,11, - 10,10,12,10,10,12,11,10,11,10,10,12,11,10,12,10, - 10,11, 9,11,10, 9,10, 9,10, -}; - -static const static_codebook _8c0_s_p9_2 = { - 2, 441, - (char *)_vq_lengthlist__8c0_s_p9_2, - 1, -529268736, 1611661312, 5, 0, - (long *)_vq_quantlist__8c0_s_p9_2, - 0 -}; - -static const char _huff_lengthlist__8c0_s_single[] = { - 4, 5,18, 7,10, 6, 7, 8, 9,10, 5, 2,18, 5, 7, 5, - 6, 7, 8,11,17,17,17,17,17,17,17,17,17,17, 7, 4, - 17, 6, 9, 6, 8,10,12,15,11, 7,17, 9, 6, 6, 7, 9, - 11,15, 6, 4,17, 6, 6, 4, 5, 8,11,16, 6, 6,17, 8, - 6, 5, 6, 9,13,16, 8, 9,17,11, 9, 8, 8,11,13,17, - 9,12,17,15,14,13,12,13,14,17,12,15,17,17,17,17, - 17,16,17,17, -}; - -static const static_codebook _huff_book__8c0_s_single = { - 2, 100, - (char *)_huff_lengthlist__8c0_s_single, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__8c1_s_p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__8c1_s_p1_0[] = { - 1, 5, 5, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 8, 7, 0, 0, 0, 0, 0, 0, 7, 8, 9, 0, 0, 0, - 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 7, 8, 0, 0, 0, 0, 0, 0, 7, 9, 8, 0, 0, - 0, 0, 0, 0, 7, 9, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 8, 0, 0, 0, 0, - 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, - 0, 0, 0, 8, 8,10, 0, 0, 0, 0, 0, 0, 9,10,10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 8,10, 9, 0, 0, 0, 0, 0, 0, 9,10,10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, - 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,10, 0, - 0, 0, 0, 0, 0, 8, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,10, - 0, 0, 0, 0, 0, 0, 8,10, 8, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _8c1_s_p1_0 = { - 8, 6561, - (char *)_vq_lengthlist__8c1_s_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__8c1_s_p1_0, - 0 -}; - -static const long _vq_quantlist__8c1_s_p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__8c1_s_p3_0[] = { - 2, 4, 4, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 7, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 6, 6, 7, 7, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _8c1_s_p3_0 = { - 4, 625, - (char *)_vq_lengthlist__8c1_s_p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__8c1_s_p3_0, - 0 -}; - -static const long _vq_quantlist__8c1_s_p4_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__8c1_s_p4_0[] = { - 1, 2, 3, 7, 7, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, - 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 7, 7, - 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, - 8, 8, 0, 0, 0, 0, 0, 0, 0, 9, 8, 0, 0, 0, 0, 0, - 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _8c1_s_p4_0 = { - 2, 81, - (char *)_vq_lengthlist__8c1_s_p4_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__8c1_s_p4_0, - 0 -}; - -static const long _vq_quantlist__8c1_s_p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__8c1_s_p5_0[] = { - 1, 3, 3, 4, 5, 6, 6, 8, 8, 0, 0, 0, 8, 8, 7, 7, - 9, 9, 0, 0, 0, 8, 8, 7, 7, 9, 9, 0, 0, 0, 9,10, - 8, 8, 9, 9, 0, 0, 0,10,10, 8, 8, 9, 9, 0, 0, 0, - 11,10, 8, 8,10,10, 0, 0, 0,11,11, 8, 8,10,10, 0, - 0, 0,12,12, 9, 9,10,10, 0, 0, 0, 0, 0, 9, 9,10, - 10, -}; - -static const static_codebook _8c1_s_p5_0 = { - 2, 81, - (char *)_vq_lengthlist__8c1_s_p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__8c1_s_p5_0, - 0 -}; - -static const long _vq_quantlist__8c1_s_p6_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__8c1_s_p6_0[] = { - 1, 3, 3, 5, 5, 8, 8, 8, 8, 9, 9,10,10,11,11,11, - 11, 0, 0, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11,11, - 12,12, 0, 0, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, - 11,12,12, 0, 0, 0, 9, 9, 8, 8,10,10,10,10,11,11, - 12,12,12,12, 0, 0, 0, 9, 9, 8, 8,10,10,10,10,11, - 11,12,12,12,12, 0, 0, 0,10,10, 9, 9,10,10,10,10, - 11,11,12,12,13,13, 0, 0, 0,10,10, 9, 9,10,10,10, - 10,11,11,12,12,13,13, 0, 0, 0,11,11, 9, 9,10,10, - 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9,10, - 10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9, - 10,10,11,11,12,12,12,12,13,13, 0, 0, 0, 0, 0, 9, - 9,10,10,11,11,12,11,12,12,13,13, 0, 0, 0, 0, 0, - 10,10,11,11,11,11,12,12,13,12,13,13, 0, 0, 0, 0, - 0, 0, 0,11,10,11,11,12,12,13,13,13,13, 0, 0, 0, - 0, 0, 0, 0,11,11,12,12,12,12,13,13,13,14, 0, 0, - 0, 0, 0, 0, 0,11,11,12,12,12,12,13,13,14,13, 0, - 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,13,13,14,14, - 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,13,13,13,13,14, - 14, -}; - -static const static_codebook _8c1_s_p6_0 = { - 2, 289, - (char *)_vq_lengthlist__8c1_s_p6_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__8c1_s_p6_0, - 0 -}; - -static const long _vq_quantlist__8c1_s_p7_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__8c1_s_p7_0[] = { - 1, 4, 4, 6, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,10, - 9, 9, 5, 7, 7,10, 9, 9,10, 9, 9, 6,10,10,10,10, - 10,11,10,10, 6, 9, 9,10, 9,10,11,10,10, 6, 9, 9, - 10, 9, 9,11, 9,10, 7,10,10,11,11,11,11,10,10, 6, - 9, 9,10,10,10,11, 9, 9, 6, 9, 9,10,10,10,10, 9, - 9, -}; - -static const static_codebook _8c1_s_p7_0 = { - 4, 81, - (char *)_vq_lengthlist__8c1_s_p7_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__8c1_s_p7_0, - 0 -}; - -static const long _vq_quantlist__8c1_s_p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__8c1_s_p7_1[] = { - 2, 3, 3, 5, 5, 7, 7, 7, 7, 7, 7,10,10, 9, 7, 7, - 7, 7, 8, 8, 8, 8, 9, 9, 9, 7, 7, 7, 7, 8, 8, 8, - 8,10,10,10, 7, 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, - 7, 7, 7, 8, 8, 8, 8,10,10,10, 8, 8, 8, 8, 8, 8, - 8, 8,10,10,10, 8, 8, 8, 8, 8, 8, 8, 8,10,10,10, - 8, 8, 8, 8, 8, 8, 8, 8,10,10,10,10,10, 8, 8, 8, - 8, 8, 8,10,10,10,10,10, 8, 8, 8, 8, 8, 8,10,10, - 10,10,10, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _8c1_s_p7_1 = { - 2, 121, - (char *)_vq_lengthlist__8c1_s_p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__8c1_s_p7_1, - 0 -}; - -static const long _vq_quantlist__8c1_s_p8_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__8c1_s_p8_0[] = { - 1, 4, 4, 6, 6, 8, 8, 8, 8, 9, 9,10,10, 7, 5, 5, - 7, 7, 8, 8, 8, 8, 9,10,11,11, 7, 5, 5, 7, 7, 8, - 8, 9, 9,10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9, - 9,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, - 11, 0,12,12, 9, 9, 9, 9,10, 9,10,11,11,11, 0,13, - 12, 9, 8, 9, 9,10,10,11,11,12,11, 0, 0, 0, 9, 9, - 9, 9,10,10,11,11,12,12, 0, 0, 0,10,10, 9, 9,10, - 10,11,11,12,12, 0, 0, 0,13,13,10,10,11,11,12,11, - 13,12, 0, 0, 0,14,14,10,10,11,10,11,11,12,12, 0, - 0, 0, 0, 0,12,12,11,11,12,12,13,13, 0, 0, 0, 0, - 0,12,12,11,10,12,11,13,12, -}; - -static const static_codebook _8c1_s_p8_0 = { - 2, 169, - (char *)_vq_lengthlist__8c1_s_p8_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__8c1_s_p8_0, - 0 -}; - -static const long _vq_quantlist__8c1_s_p8_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__8c1_s_p8_1[] = { - 2, 3, 3, 5, 5, 6, 6, 6, 5, 5, 6, 6, 6, 5, 5, 6, - 6, 6, 5, 5, 6, 6, 6, 5, 5, -}; - -static const static_codebook _8c1_s_p8_1 = { - 2, 25, - (char *)_vq_lengthlist__8c1_s_p8_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__8c1_s_p8_1, - 0 -}; - -static const long _vq_quantlist__8c1_s_p9_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__8c1_s_p9_0[] = { - 1, 3, 3,10,10,10,10,10,10,10,10,10,10, 5, 6, 6, - 10,10,10,10,10,10,10,10,10,10, 6, 7, 8,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10, 9, 9, 9, 9, -}; - -static const static_codebook _8c1_s_p9_0 = { - 2, 169, - (char *)_vq_lengthlist__8c1_s_p9_0, - 1, -513964032, 1628680192, 4, 0, - (long *)_vq_quantlist__8c1_s_p9_0, - 0 -}; - -static const long _vq_quantlist__8c1_s_p9_1[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const char _vq_lengthlist__8c1_s_p9_1[] = { - 1, 4, 4, 5, 5, 7, 7, 9, 9,11,11,12,12,13,13, 6, - 5, 5, 6, 6, 9, 9,10,10,12,12,12,13,15,14, 6, 5, - 5, 7, 7, 9, 9,10,10,12,12,12,13,14,13,17, 7, 7, - 8, 8,10,10,11,11,12,13,13,13,13,13,17, 7, 7, 8, - 8,10,10,11,11,13,13,13,13,14,14,17,11,11, 9, 9, - 11,11,12,12,12,13,13,14,15,13,17,12,12, 9, 9,11, - 11,12,12,13,13,13,13,14,16,17,17,17,11,12,12,12, - 13,13,13,14,15,14,15,15,17,17,17,12,12,11,11,13, - 13,14,14,15,14,15,15,17,17,17,15,15,13,13,14,14, - 15,14,15,15,16,15,17,17,17,15,15,13,13,13,14,14, - 15,15,15,15,16,17,17,17,17,16,14,15,14,14,15,14, - 14,15,15,15,17,17,17,17,17,14,14,16,14,15,15,15, - 15,15,15,17,17,17,17,17,17,16,16,15,17,15,15,14, - 17,15,17,16,17,17,17,17,16,15,14,15,15,15,15,15, - 15, -}; - -static const static_codebook _8c1_s_p9_1 = { - 2, 225, - (char *)_vq_lengthlist__8c1_s_p9_1, - 1, -520986624, 1620377600, 4, 0, - (long *)_vq_quantlist__8c1_s_p9_1, - 0 -}; - -static const long _vq_quantlist__8c1_s_p9_2[] = { - 10, - 9, - 11, - 8, - 12, - 7, - 13, - 6, - 14, - 5, - 15, - 4, - 16, - 3, - 17, - 2, - 18, - 1, - 19, - 0, - 20, -}; - -static const char _vq_lengthlist__8c1_s_p9_2[] = { - 2, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8, 9, 8, 9, 9, 9, - 9, 9, 9, 9, 9,11,11,12, 7, 7, 7, 7, 8, 8, 9, 9, - 9, 9,10,10,10,10,10,10,10,10,11,11,11, 7, 7, 7, - 7, 8, 8, 9, 8, 9, 9, 9, 9, 9, 9,10,10,10,10,11, - 11,12, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9,10,10,10,10, - 10,10,10,10,11,11,11, 7, 7, 8, 8, 8, 8, 9, 9, 9, - 9,10,10,10,10,10,10,10,10,11,11,11, 8, 8, 8, 8, - 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,11,11, - 11, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9,10,10,10,10,10, - 10,10,10,11,12,11, 9, 9, 8, 9, 9, 9, 9, 9,10,10, - 10,10,10,10,10,10,10,10,11,11,11,11,11, 8, 8, 9, - 9, 9, 9,10,10,10,10,10,10,10,10,10,10,11,12,11, - 12,11, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10, - 10,10,11,11,11,11,11, 9, 9, 9, 9,10,10,10,10,10, - 10,10,10,10,10,10,10,12,11,12,11,11, 9, 9, 9,10, - 10,10,10,10,10,10,10,10,10,10,10,10,12,11,11,11, - 11,11,11,10,10,10,10,10,10,10,10,10,10,10,10,10, - 11,11,11,12,11,11,12,11,10,10,10,10,10,10,10,10, - 10,10,10,10,11,10,11,11,11,11,11,11,11,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,11,11,12,11,12, - 11,11,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 11,11,12,11,12,11,11,11,11,10,10,10,10,10,10,10, - 10,10,10,10,10,11,11,12,11,11,12,11,11,12,10,10, - 11,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11, - 11,11,11,10,10,10,10,10,10,10,10,10,10,10,10,12, - 12,11,12,11,11,12,12,12,11,11,10,10,10,10,10,10, - 10,10,10,11,12,12,11,12,12,11,12,11,11,11,11,10, - 10,10,10,10,10,10,10,10,10, -}; - -static const static_codebook _8c1_s_p9_2 = { - 2, 441, - (char *)_vq_lengthlist__8c1_s_p9_2, - 1, -529268736, 1611661312, 5, 0, - (long *)_vq_quantlist__8c1_s_p9_2, - 0 -}; - -static const char _huff_lengthlist__8c1_s_single[] = { - 4, 6,18, 8,11, 8, 8, 9, 9,10, 4, 4,18, 5, 9, 5, - 6, 7, 8,10,18,18,18,18,17,17,17,17,17,17, 7, 5, - 17, 6,11, 6, 7, 8, 9,12,12, 9,17,12, 8, 8, 9,10, - 10,13, 7, 5,17, 6, 8, 4, 5, 6, 8,10, 6, 5,17, 6, - 8, 5, 4, 5, 7, 9, 7, 7,17, 8, 9, 6, 5, 5, 6, 8, - 8, 8,17, 9,11, 8, 6, 6, 6, 7, 9,10,17,12,12,10, - 9, 7, 7, 8, -}; - -static const static_codebook _huff_book__8c1_s_single = { - 2, 100, - (char *)_huff_lengthlist__8c1_s_single, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44c2_s_long[] = { - 6, 6,12,10,10,10, 9,10,12,12, 6, 1,10, 5, 6, 6, - 7, 9,11,14,12, 9, 8,11, 7, 8, 9,11,13,15,10, 5, - 12, 7, 8, 7, 9,12,14,15,10, 6, 7, 8, 5, 6, 7, 9, - 12,14, 9, 6, 8, 7, 6, 6, 7, 9,12,12, 9, 7, 9, 9, - 7, 6, 6, 7,10,10,10, 9,10,11, 8, 7, 6, 6, 8,10, - 12,11,13,13,11,10, 8, 8, 8,10,11,13,15,15,14,13, - 10, 8, 8, 9, -}; - -static const static_codebook _huff_book__44c2_s_long = { - 2, 100, - (char *)_huff_lengthlist__44c2_s_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44c2_s_p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44c2_s_p1_0[] = { - 2, 4, 4, 0, 0, 0, 0, 0, 0, 5, 6, 6, 0, 0, 0, 0, - 0, 0, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, - 0, 0, 0, 6, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 6, 8, 7, 0, 0, - 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, - 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, - 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 8, 8, 0, 0, - 0, 0, 0, 0, 8, 9, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, - 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 6, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, - 0, 0, 0, 0, 0, 8, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, - 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44c2_s_p1_0 = { - 8, 6561, - (char *)_vq_lengthlist__44c2_s_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44c2_s_p1_0, - 0 -}; - -static const long _vq_quantlist__44c2_s_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44c2_s_p2_0[] = { - 1, 4, 4, 0, 0, 0, 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, - 8, 8, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 0, 8, - 8, 0, 0, 0, 8, 8, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, - 0, 0, 4, 6, 6, 0, 0, 0, 8, 8, 0, 0, 0, 8, 8, 0, - 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0,11,11, 0, 0, - 0,11,11, 0, 0, 0,12,11, 0, 0, 0, 0, 0, 0, 0, 7, - 8, 8, 0, 0, 0,10,11, 0, 0, 0,11,11, 0, 0, 0,11, - 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 6, 8, 8, 0, 0, 0,11,11, 0, 0, 0,11,11, - 0, 0, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 6, 8, 8, 0, - 0, 0,10,11, 0, 0, 0,10,11, 0, 0, 0,11,11, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 9, 9, 0, 0, 0,11,12, 0, 0, 0,11,12, 0, 0, 0, - 12,11, 0, 0, 0, 0, 0, 0, 0, 8,10, 9, 0, 0, 0,12, - 11, 0, 0, 0,12,11, 0, 0, 0,11,12, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44c2_s_p2_0 = { - 4, 625, - (char *)_vq_lengthlist__44c2_s_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c2_s_p2_0, - 0 -}; - -static const long _vq_quantlist__44c2_s_p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44c2_s_p3_0[] = { - 2, 4, 3, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 6, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44c2_s_p3_0 = { - 4, 625, - (char *)_vq_lengthlist__44c2_s_p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c2_s_p3_0, - 0 -}; - -static const long _vq_quantlist__44c2_s_p4_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44c2_s_p4_0[] = { - 1, 3, 3, 6, 6, 0, 0, 0, 0, 0, 6, 6, 6, 6, 0, 0, - 0, 0, 0, 6, 6, 6, 6, 0, 0, 0, 0, 0, 7, 7, 6, 6, - 0, 0, 0, 0, 0, 0, 0, 6, 7, 0, 0, 0, 0, 0, 0, 0, - 7, 8, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c2_s_p4_0 = { - 2, 81, - (char *)_vq_lengthlist__44c2_s_p4_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c2_s_p4_0, - 0 -}; - -static const long _vq_quantlist__44c2_s_p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44c2_s_p5_0[] = { - 1, 3, 3, 6, 6, 7, 7, 9, 9, 0, 7, 7, 7, 7, 7, 7, - 9, 9, 0, 7, 7, 7, 7, 7, 7, 9, 9, 0, 8, 8, 7, 7, - 8, 8,10,10, 0, 0, 0, 7, 7, 8, 8,10,10, 0, 0, 0, - 9, 9, 8, 8,10,10, 0, 0, 0, 9, 9, 8, 8,10,10, 0, - 0, 0,10,10, 9, 9,11,11, 0, 0, 0, 0, 0, 9, 9,11, - 11, -}; - -static const static_codebook _44c2_s_p5_0 = { - 2, 81, - (char *)_vq_lengthlist__44c2_s_p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c2_s_p5_0, - 0 -}; - -static const long _vq_quantlist__44c2_s_p6_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__44c2_s_p6_0[] = { - 1, 4, 3, 6, 6, 8, 8, 9, 9, 9, 9, 9, 9,10,10,11, - 11, 0, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11,11, - 12,11, 0, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11, - 11,11,12, 0, 8, 8, 7, 7, 9, 9,10,10, 9, 9,10,10, - 11,11,12,12, 0, 0, 0, 7, 7, 9, 9,10,10,10, 9,10, - 10,11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10,10, - 11,11,11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10, - 10,11,11,12,12,12,12, 0, 0, 0, 9, 9, 9, 9,10,10, - 10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 9, 9,10, - 10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9, - 10,10,11,11,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, - 9,10,10,11,11,11,11,12,12,13,13, 0, 0, 0, 0, 0, - 10,10,10,10,11,11,12,12,13,12,13,13, 0, 0, 0, 0, - 0, 0, 0,10,10,11,11,12,12,13,13,13,13, 0, 0, 0, - 0, 0, 0, 0,11,11,12,12,12,12,13,13,13,14, 0, 0, - 0, 0, 0, 0, 0,11,11,12,12,12,12,13,13,13,14, 0, - 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,13,13,14,14, - 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,13,13,13,13,14, - 14, -}; - -static const static_codebook _44c2_s_p6_0 = { - 2, 289, - (char *)_vq_lengthlist__44c2_s_p6_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c2_s_p6_0, - 0 -}; - -static const long _vq_quantlist__44c2_s_p7_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44c2_s_p7_0[] = { - 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,11, - 9, 9, 4, 7, 7,10, 9, 9,10, 9, 9, 7,10,10,11,10, - 11,11,10,11, 6, 9, 9,11,10,10,11,10,10, 6, 9, 9, - 11,10,11,11,10,10, 7,11,10,11,11,11,12,11,11, 6, - 9, 9,11,10,10,11,11,10, 6, 9, 9,11,10,10,12,10, - 11, -}; - -static const static_codebook _44c2_s_p7_0 = { - 4, 81, - (char *)_vq_lengthlist__44c2_s_p7_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44c2_s_p7_0, - 0 -}; - -static const long _vq_quantlist__44c2_s_p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__44c2_s_p7_1[] = { - 2, 3, 4, 6, 6, 7, 7, 7, 7, 7, 7, 9, 7, 7, 6, 6, - 7, 7, 8, 8, 8, 8, 9, 6, 6, 6, 6, 7, 7, 8, 8, 8, - 8,10, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, - 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, - 8, 8,10,10,10, 7, 8, 8, 8, 8, 8, 8, 8,10,10,10, - 8, 8, 8, 8, 8, 8, 8, 8,10,10,10,10,10, 8, 8, 8, - 8, 8, 8,10,10,10,10,10, 9, 9, 8, 8, 8, 8,10,10, - 10,10,10, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _44c2_s_p7_1 = { - 2, 121, - (char *)_vq_lengthlist__44c2_s_p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44c2_s_p7_1, - 0 -}; - -static const long _vq_quantlist__44c2_s_p8_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44c2_s_p8_0[] = { - 1, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 6, 5, 5, - 7, 7, 8, 8, 8, 8, 9, 9,10,10, 7, 6, 5, 7, 7, 8, - 8, 8, 8, 9, 9,10,10, 0, 8, 8, 8, 8, 9, 9, 9, 9, - 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, - 11, 0,12,12, 9, 9,10,10,10,10,11,11,11,11, 0,13, - 13, 9, 9,10,10,10,10,11,11,12,12, 0, 0, 0,10,10, - 10,10,11,11,12,12,12,13, 0, 0, 0,10,10,10,10,11, - 11,12,12,12,12, 0, 0, 0,14,14,10,11,11,11,12,12, - 13,13, 0, 0, 0,14,14,11,10,11,11,13,12,13,13, 0, - 0, 0, 0, 0,12,12,11,12,13,12,14,14, 0, 0, 0, 0, - 0,12,12,12,12,13,12,14,14, -}; - -static const static_codebook _44c2_s_p8_0 = { - 2, 169, - (char *)_vq_lengthlist__44c2_s_p8_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44c2_s_p8_0, - 0 -}; - -static const long _vq_quantlist__44c2_s_p8_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44c2_s_p8_1[] = { - 2, 4, 4, 5, 4, 6, 5, 5, 5, 5, 6, 5, 5, 5, 5, 6, - 5, 5, 5, 5, 6, 6, 6, 5, 5, -}; - -static const static_codebook _44c2_s_p8_1 = { - 2, 25, - (char *)_vq_lengthlist__44c2_s_p8_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c2_s_p8_1, - 0 -}; - -static const long _vq_quantlist__44c2_s_p9_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44c2_s_p9_0[] = { - 1, 5, 4,12,12,12,12,12,12,12,12,12,12, 4, 9, 8, - 11,11,11,11,11,11,11,11,11,11, 2, 8, 7,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11, -}; - -static const static_codebook _44c2_s_p9_0 = { - 2, 169, - (char *)_vq_lengthlist__44c2_s_p9_0, - 1, -514541568, 1627103232, 4, 0, - (long *)_vq_quantlist__44c2_s_p9_0, - 0 -}; - -static const long _vq_quantlist__44c2_s_p9_1[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44c2_s_p9_1[] = { - 1, 4, 4, 6, 6, 7, 6, 8, 8,10, 9,10,10, 6, 5, 5, - 7, 7, 8, 7,10, 9,11,11,12,13, 6, 5, 5, 7, 7, 8, - 8,10,10,11,11,13,13,18, 8, 8, 8, 8, 9, 9,10,10, - 12,12,12,13,18, 8, 8, 8, 8, 9, 9,10,10,12,12,13, - 13,18,11,11, 8, 8,10,10,11,11,12,11,13,12,18,11, - 11, 9, 7,10,10,11,11,11,12,12,13,17,17,17,10,10, - 11,11,12,12,12,10,12,12,17,17,17,11,10,11,10,13, - 12,11,12,12,12,17,17,17,15,14,11,11,12,11,13,10, - 13,12,17,17,17,14,14,12,10,11,11,13,13,13,13,17, - 17,16,17,16,13,13,12,10,13,10,14,13,17,16,17,16, - 17,13,12,12,10,13,11,14,14, -}; - -static const static_codebook _44c2_s_p9_1 = { - 2, 169, - (char *)_vq_lengthlist__44c2_s_p9_1, - 1, -522616832, 1620115456, 4, 0, - (long *)_vq_quantlist__44c2_s_p9_1, - 0 -}; - -static const long _vq_quantlist__44c2_s_p9_2[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__44c2_s_p9_2[] = { - 2, 4, 4, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, - 8,10, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, - 9, 9,10, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, - 9, 9, 9,10, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, - 9, 9, 9, 9,10,10,10, 8, 7, 8, 8, 8, 8, 9, 9, 9, - 9, 9, 9, 9, 9,10,11,11, 8, 8, 8, 8, 9, 9, 9, 9, - 9, 9,10, 9, 9, 9,10,11,10, 8, 8, 8, 8, 9, 9, 9, - 9, 9, 9, 9,10,10,10,10,11,10, 8, 8, 9, 9, 9, 9, - 9, 9,10, 9, 9,10, 9,10,11,10,11,11,11, 8, 8, 9, - 9, 9, 9, 9, 9, 9, 9,10,10,11,11,11,11,11, 9, 9, - 9, 9, 9, 9,10, 9, 9, 9,10,10,11,11,11,11,11, 9, - 9, 9, 9, 9, 9, 9, 9, 9,10, 9,10,11,11,11,11,11, - 9, 9, 9, 9,10,10, 9, 9, 9,10,10,10,11,11,11,11, - 11,11,11, 9, 9, 9,10, 9, 9,10,10,10,10,11,11,10, - 11,11,11,11,10, 9,10,10, 9, 9, 9, 9,10,10,11,10, - 11,11,11,11,11, 9, 9, 9, 9,10, 9,10,10,10,10,11, - 10,11,11,11,11,11,10,10, 9, 9,10, 9,10,10,10,10, - 10,10,10,11,11,11,11,11,11, 9, 9,10, 9,10, 9,10, - 10, -}; - -static const static_codebook _44c2_s_p9_2 = { - 2, 289, - (char *)_vq_lengthlist__44c2_s_p9_2, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c2_s_p9_2, - 0 -}; - -static const char _huff_lengthlist__44c2_s_short[] = { - 11, 9,13,12,12,11,12,12,13,15, 8, 2,11, 4, 8, 5, - 7,10,12,15,13, 7,10, 9, 8, 8,10,13,17,17,11, 4, - 12, 5, 9, 5, 8,11,14,16,12, 6, 8, 7, 6, 6, 8,11, - 13,16,11, 4, 9, 5, 6, 4, 6,10,13,16,11, 6,11, 7, - 7, 6, 7,10,13,15,13, 9,12, 9, 8, 6, 8,10,12,14, - 14,10,10, 8, 6, 5, 6, 9,11,13,15,11,11, 9, 6, 5, - 6, 8, 9,12, -}; - -static const static_codebook _huff_book__44c2_s_short = { - 2, 100, - (char *)_huff_lengthlist__44c2_s_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44c3_s_long[] = { - 5, 6,11,11,11,11,10,10,12,11, 5, 2,11, 5, 6, 6, - 7, 9,11,13,13,10, 7,11, 6, 7, 8, 9,10,12,11, 5, - 11, 6, 8, 7, 9,11,14,15,11, 6, 6, 8, 4, 5, 7, 8, - 10,13,10, 5, 7, 7, 5, 5, 6, 8,10,11,10, 7, 7, 8, - 6, 5, 5, 7, 9, 9,11, 8, 8,11, 8, 7, 6, 6, 7, 9, - 12,11,10,13, 9, 9, 7, 7, 7, 9,11,13,12,15,12,11, - 9, 8, 8, 8, -}; - -static const static_codebook _huff_book__44c3_s_long = { - 2, 100, - (char *)_huff_lengthlist__44c3_s_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44c3_s_p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44c3_s_p1_0[] = { - 2, 4, 4, 0, 0, 0, 0, 0, 0, 5, 6, 6, 0, 0, 0, 0, - 0, 0, 5, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, - 0, 0, 0, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 6, 8, 7, 0, 0, - 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, - 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, - 0, 0, 0, 8, 8, 9, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 8, 8, 0, 0, - 0, 0, 0, 0, 7, 9, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, - 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 6, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, - 0, 0, 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, - 0, 0, 0, 0, 0, 0, 8, 9, 8, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44c3_s_p1_0 = { - 8, 6561, - (char *)_vq_lengthlist__44c3_s_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44c3_s_p1_0, - 0 -}; - -static const long _vq_quantlist__44c3_s_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44c3_s_p2_0[] = { - 2, 5, 5, 0, 0, 0, 5, 5, 0, 0, 0, 5, 5, 0, 0, 0, - 7, 8, 0, 0, 0, 0, 0, 0, 0, 5, 6, 6, 0, 0, 0, 7, - 7, 0, 0, 0, 7, 7, 0, 0, 0,10,10, 0, 0, 0, 0, 0, - 0, 0, 5, 6, 6, 0, 0, 0, 7, 7, 0, 0, 0, 7, 7, 0, - 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 7, 7, 0, 0, - 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 5, - 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, 9, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 5, 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, 7, 7, - 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, - 0, 0, 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8,10,10, 0, 0, 0, 9, 9, 0, 0, 0, 9, 9, 0, 0, 0, - 10,10, 0, 0, 0, 0, 0, 0, 0, 8,10,10, 0, 0, 0, 9, - 9, 0, 0, 0, 9, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44c3_s_p2_0 = { - 4, 625, - (char *)_vq_lengthlist__44c3_s_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c3_s_p2_0, - 0 -}; - -static const long _vq_quantlist__44c3_s_p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44c3_s_p3_0[] = { - 2, 4, 3, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 6, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44c3_s_p3_0 = { - 4, 625, - (char *)_vq_lengthlist__44c3_s_p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c3_s_p3_0, - 0 -}; - -static const long _vq_quantlist__44c3_s_p4_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44c3_s_p4_0[] = { - 2, 3, 3, 6, 6, 0, 0, 0, 0, 0, 4, 4, 6, 6, 0, 0, - 0, 0, 0, 4, 4, 6, 6, 0, 0, 0, 0, 0, 5, 5, 6, 6, - 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, - 7, 8, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c3_s_p4_0 = { - 2, 81, - (char *)_vq_lengthlist__44c3_s_p4_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c3_s_p4_0, - 0 -}; - -static const long _vq_quantlist__44c3_s_p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44c3_s_p5_0[] = { - 1, 3, 4, 6, 6, 7, 7, 9, 9, 0, 5, 5, 7, 7, 7, 8, - 9, 9, 0, 5, 5, 7, 7, 8, 8, 9, 9, 0, 7, 7, 8, 8, - 8, 8,10,10, 0, 0, 0, 8, 8, 8, 8,10,10, 0, 0, 0, - 9, 9, 9, 9,10,10, 0, 0, 0, 9, 9, 9, 9,10,10, 0, - 0, 0,10,10,10,10,11,11, 0, 0, 0, 0, 0,10,10,11, - 11, -}; - -static const static_codebook _44c3_s_p5_0 = { - 2, 81, - (char *)_vq_lengthlist__44c3_s_p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c3_s_p5_0, - 0 -}; - -static const long _vq_quantlist__44c3_s_p6_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__44c3_s_p6_0[] = { - 2, 3, 3, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10,11, - 10, 0, 5, 5, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10,10, - 11,11, 0, 5, 5, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10, - 10,11,11, 0, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9,10,10, - 11,11,11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, - 10,11,11,11,12, 0, 0, 0, 8, 8, 8, 8, 9, 9, 9, 9, - 10,10,11,11,12,12, 0, 0, 0, 8, 8, 8, 8, 9, 9, 9, - 9,10,10,11,11,12,12, 0, 0, 0, 9, 9, 9, 9,10,10, - 10,10,11,10,11,11,12,12, 0, 0, 0, 0, 0, 9, 9,10, - 10,10,10,11,11,11,11,12,12, 0, 0, 0, 0, 0, 9, 8, - 9, 9,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 8, - 8, 9, 9,10,10,11,11,12,11,12,12, 0, 0, 0, 0, 0, - 9,10,10,10,11,11,11,11,12,12,13,13, 0, 0, 0, 0, - 0, 0, 0,10,10,10,10,11,11,12,12,13,13, 0, 0, 0, - 0, 0, 0, 0,11,11,11,11,12,12,12,12,13,13, 0, 0, - 0, 0, 0, 0, 0,11,11,11,11,12,12,12,12,13,13, 0, - 0, 0, 0, 0, 0, 0,11,11,12,12,12,12,13,13,13,13, - 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,13, - 13, -}; - -static const static_codebook _44c3_s_p6_0 = { - 2, 289, - (char *)_vq_lengthlist__44c3_s_p6_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c3_s_p6_0, - 0 -}; - -static const long _vq_quantlist__44c3_s_p7_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44c3_s_p7_0[] = { - 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,11, - 9, 9, 4, 7, 7,10, 9, 9,11, 9, 9, 7,10,10,11,11, - 10,12,11,11, 6, 9, 9,11,10,10,11,10,10, 6, 9, 9, - 11,10,10,11,10,10, 7,11,11,11,11,11,12,11,11, 6, - 9, 9,11,10,10,11,10,10, 6, 9, 9,11,10,10,11,10, - 10, -}; - -static const static_codebook _44c3_s_p7_0 = { - 4, 81, - (char *)_vq_lengthlist__44c3_s_p7_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44c3_s_p7_0, - 0 -}; - -static const long _vq_quantlist__44c3_s_p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__44c3_s_p7_1[] = { - 2, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8,10, 5, 5, 6, 6, - 7, 7, 8, 8, 8, 8,10, 5, 5, 6, 6, 7, 7, 8, 8, 8, - 8,10, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, 7, - 7, 8, 7, 8, 8, 8, 8,10,10,10, 8, 8, 8, 8, 8, 8, - 8, 8,10,10,10, 7, 8, 8, 8, 8, 8, 8, 8,10,10,10, - 8, 8, 8, 8, 8, 8, 8, 8,10,10,10,10,10, 8, 8, 8, - 8, 8, 8,10,10,10,10,10, 9, 9, 8, 8, 9, 8,10,10, - 10,10,10, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _44c3_s_p7_1 = { - 2, 121, - (char *)_vq_lengthlist__44c3_s_p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44c3_s_p7_1, - 0 -}; - -static const long _vq_quantlist__44c3_s_p8_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44c3_s_p8_0[] = { - 1, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10, 6, 5, 5, - 7, 7, 8, 8, 8, 8, 9, 9,10,10, 7, 5, 5, 7, 7, 8, - 8, 8, 8, 9, 9,11,10, 0, 8, 8, 8, 8, 9, 9, 9, 9, - 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, - 11, 0,12,12, 9, 9,10,10,10,10,11,11,11,12, 0,13, - 13, 9, 9,10,10,10,10,11,11,12,12, 0, 0, 0,10,10, - 10,10,11,11,12,12,12,12, 0, 0, 0,10,10,10,10,11, - 11,12,12,12,12, 0, 0, 0,14,14,11,11,11,11,12,12, - 13,13, 0, 0, 0,14,14,11,11,11,11,12,12,13,13, 0, - 0, 0, 0, 0,12,12,12,12,13,13,14,13, 0, 0, 0, 0, - 0,13,13,12,12,13,12,14,13, -}; - -static const static_codebook _44c3_s_p8_0 = { - 2, 169, - (char *)_vq_lengthlist__44c3_s_p8_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44c3_s_p8_0, - 0 -}; - -static const long _vq_quantlist__44c3_s_p8_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44c3_s_p8_1[] = { - 2, 4, 4, 5, 5, 6, 5, 5, 5, 5, 6, 4, 5, 5, 5, 6, - 5, 5, 5, 5, 6, 6, 6, 5, 5, -}; - -static const static_codebook _44c3_s_p8_1 = { - 2, 25, - (char *)_vq_lengthlist__44c3_s_p8_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c3_s_p8_1, - 0 -}; - -static const long _vq_quantlist__44c3_s_p9_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44c3_s_p9_0[] = { - 1, 4, 4,12,12,12,12,12,12,12,12,12,12, 4, 9, 8, - 12,12,12,12,12,12,12,12,12,12, 2, 9, 7,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,11,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11, -}; - -static const static_codebook _44c3_s_p9_0 = { - 2, 169, - (char *)_vq_lengthlist__44c3_s_p9_0, - 1, -514332672, 1627381760, 4, 0, - (long *)_vq_quantlist__44c3_s_p9_0, - 0 -}; - -static const long _vq_quantlist__44c3_s_p9_1[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const char _vq_lengthlist__44c3_s_p9_1[] = { - 1, 4, 4, 6, 6, 7, 7, 8, 7, 9, 9,10,10,10,10, 6, - 5, 5, 7, 7, 8, 8,10, 8,11,10,12,12,13,13, 6, 5, - 5, 7, 7, 8, 8,10, 9,11,11,12,12,13,12,18, 8, 8, - 8, 8, 9, 9,10, 9,11,10,12,12,13,13,18, 8, 8, 8, - 8, 9, 9,10,10,11,11,13,12,14,13,18,11,11, 9, 9, - 10,10,11,11,11,12,13,12,13,14,18,11,11, 9, 8,11, - 10,11,11,11,11,12,12,14,13,18,18,18,10,11,10,11, - 12,12,12,12,13,12,14,13,18,18,18,10,11,11, 9,12, - 11,12,12,12,13,13,13,18,18,17,14,14,11,11,12,12, - 13,12,14,12,14,13,18,18,18,14,14,11,10,12, 9,12, - 13,13,13,13,13,18,18,17,16,18,13,13,12,12,13,11, - 14,12,14,14,17,18,18,17,18,13,12,13,10,12,11,14, - 14,14,14,17,18,18,18,18,15,16,12,12,13,10,14,12, - 14,15,18,18,18,16,17,16,14,12,11,13,10,13,13,14, - 15, -}; - -static const static_codebook _44c3_s_p9_1 = { - 2, 225, - (char *)_vq_lengthlist__44c3_s_p9_1, - 1, -522338304, 1620115456, 4, 0, - (long *)_vq_quantlist__44c3_s_p9_1, - 0 -}; - -static const long _vq_quantlist__44c3_s_p9_2[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__44c3_s_p9_2[] = { - 2, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, - 8,10, 6, 6, 7, 7, 8, 7, 8, 8, 8, 8, 8, 9, 9, 9, - 9, 9,10, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, - 9, 9, 9,10, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, - 9, 9, 9, 9,10,10,10, 7, 7, 8, 8, 8, 9, 9, 9, 9, - 9, 9, 9, 9, 9,11,11,11, 8, 8, 8, 8, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9,10,10,10, 8, 8, 8, 8, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9,10,10,10, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9,10, 9,10,10,10,11,11, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9,11,10,11,11,11, 9, 9, - 9, 9, 9, 9,10,10, 9, 9,10, 9,11,10,11,11,11, 9, - 9, 9, 9, 9, 9, 9, 9,10,10,10, 9,11,11,11,11,11, - 9, 9, 9, 9,10,10, 9, 9, 9, 9,10, 9,11,11,11,11, - 11,11,11, 9, 9, 9, 9, 9, 9,10,10,10,10,11,11,11, - 11,11,11,11,10, 9,10,10, 9,10, 9, 9,10, 9,11,10, - 10,11,11,11,11, 9,10, 9, 9, 9, 9,10,10,10,10,11, - 11,11,11,11,11,10,10,10, 9, 9,10, 9,10, 9,10,10, - 10,10,11,11,11,11,11,11,11, 9, 9, 9, 9, 9,10,10, - 10, -}; - -static const static_codebook _44c3_s_p9_2 = { - 2, 289, - (char *)_vq_lengthlist__44c3_s_p9_2, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c3_s_p9_2, - 0 -}; - -static const char _huff_lengthlist__44c3_s_short[] = { - 10, 9,13,11,14,10,12,13,13,14, 7, 2,12, 5,10, 5, - 7,10,12,14,12, 6, 9, 8, 7, 7, 9,11,13,16,10, 4, - 12, 5,10, 6, 8,12,14,16,12, 6, 8, 7, 6, 5, 7,11, - 12,16,10, 4, 8, 5, 6, 4, 6, 9,13,16,10, 6,10, 7, - 7, 6, 7, 9,13,15,12, 9,11, 9, 8, 6, 7,10,12,14, - 14,11,10, 9, 6, 5, 6, 9,11,13,15,13,11,10, 6, 5, - 6, 8, 9,11, -}; - -static const static_codebook _huff_book__44c3_s_short = { - 2, 100, - (char *)_huff_lengthlist__44c3_s_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44c4_s_long[] = { - 4, 7,11,11,11,11,10,11,12,11, 5, 2,11, 5, 6, 6, - 7, 9,11,12,11, 9, 6,10, 6, 7, 8, 9,10,11,11, 5, - 11, 7, 8, 8, 9,11,13,14,11, 6, 5, 8, 4, 5, 7, 8, - 10,11,10, 6, 7, 7, 5, 5, 6, 8, 9,11,10, 7, 8, 9, - 6, 6, 6, 7, 8, 9,11, 9, 9,11, 7, 7, 6, 6, 7, 9, - 12,12,10,13, 9, 8, 7, 7, 7, 8,11,13,11,14,11,10, - 9, 8, 7, 7, -}; - -static const static_codebook _huff_book__44c4_s_long = { - 2, 100, - (char *)_huff_lengthlist__44c4_s_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44c4_s_p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44c4_s_p1_0[] = { - 2, 4, 4, 0, 0, 0, 0, 0, 0, 5, 6, 6, 0, 0, 0, 0, - 0, 0, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, - 0, 0, 0, 6, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 6, 8, 7, 0, 0, - 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, - 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, - 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 8, 8, 0, 0, - 0, 0, 0, 0, 8, 9, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, - 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 6, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, - 0, 0, 0, 0, 0, 8, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, - 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44c4_s_p1_0 = { - 8, 6561, - (char *)_vq_lengthlist__44c4_s_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44c4_s_p1_0, - 0 -}; - -static const long _vq_quantlist__44c4_s_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44c4_s_p2_0[] = { - 2, 5, 5, 0, 0, 0, 5, 5, 0, 0, 0, 5, 5, 0, 0, 0, - 7, 7, 0, 0, 0, 0, 0, 0, 0, 5, 6, 6, 0, 0, 0, 7, - 7, 0, 0, 0, 7, 7, 0, 0, 0,10,10, 0, 0, 0, 0, 0, - 0, 0, 5, 6, 6, 0, 0, 0, 7, 7, 0, 0, 0, 7, 7, 0, - 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 5, 8, 7, 0, 0, 0, 7, 7, 0, 0, - 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 5, - 7, 8, 0, 0, 0, 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, 9, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 5, 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, 7, 7, - 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, - 0, 0, 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7,10,10, 0, 0, 0, 9, 9, 0, 0, 0, 9, 9, 0, 0, 0, - 10,10, 0, 0, 0, 0, 0, 0, 0, 8,10,10, 0, 0, 0, 9, - 9, 0, 0, 0, 9, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44c4_s_p2_0 = { - 4, 625, - (char *)_vq_lengthlist__44c4_s_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c4_s_p2_0, - 0 -}; - -static const long _vq_quantlist__44c4_s_p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44c4_s_p3_0[] = { - 2, 3, 3, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 4, 6, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 4, 5, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 6, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44c4_s_p3_0 = { - 4, 625, - (char *)_vq_lengthlist__44c4_s_p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c4_s_p3_0, - 0 -}; - -static const long _vq_quantlist__44c4_s_p4_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44c4_s_p4_0[] = { - 2, 3, 3, 6, 6, 0, 0, 0, 0, 0, 4, 4, 6, 6, 0, 0, - 0, 0, 0, 4, 4, 6, 6, 0, 0, 0, 0, 0, 5, 5, 6, 6, - 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, - 7, 8, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c4_s_p4_0 = { - 2, 81, - (char *)_vq_lengthlist__44c4_s_p4_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c4_s_p4_0, - 0 -}; - -static const long _vq_quantlist__44c4_s_p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44c4_s_p5_0[] = { - 2, 3, 3, 6, 6, 7, 7, 9, 9, 0, 4, 4, 6, 6, 7, 7, - 9, 9, 0, 4, 5, 6, 6, 7, 7, 9, 9, 0, 6, 6, 7, 7, - 8, 8,10,10, 0, 0, 0, 7, 7, 8, 8,10, 9, 0, 0, 0, - 9, 8, 8, 8,10,10, 0, 0, 0, 8, 8, 8, 8,10,10, 0, - 0, 0,10,10, 9, 9,11,11, 0, 0, 0, 0, 0, 9, 9,10, - 10, -}; - -static const static_codebook _44c4_s_p5_0 = { - 2, 81, - (char *)_vq_lengthlist__44c4_s_p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c4_s_p5_0, - 0 -}; - -static const long _vq_quantlist__44c4_s_p6_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__44c4_s_p6_0[] = { - 2, 4, 4, 6, 6, 8, 8, 9, 9, 8, 8, 9, 9,10,10,11, - 11, 0, 4, 4, 6, 6, 8, 8, 9, 9, 9, 9,10,10,11,11, - 11,11, 0, 4, 4, 7, 6, 8, 8, 9, 9, 9, 9,10,10,11, - 11,11,11, 0, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9,10,10, - 11,11,11,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, - 10,11,11,12,12, 0, 0, 0, 8, 8, 8, 8, 9, 9, 9, 9, - 10,10,11,11,12,12, 0, 0, 0, 8, 8, 8, 8, 9, 9, 9, - 9,10,10,11,11,12,12, 0, 0, 0, 9, 9, 9, 9,10,10, - 10,10,11,11,11,11,12,12, 0, 0, 0, 0, 0, 9, 9,10, - 10,10,10,11,11,11,11,12,12, 0, 0, 0, 0, 0, 9, 9, - 9,10,10,10,11,11,11,11,12,12, 0, 0, 0, 0, 0, 9, - 9, 9, 9,10,10,11,11,11,12,12,12, 0, 0, 0, 0, 0, - 10,10,10,10,11,11,11,11,12,12,13,12, 0, 0, 0, 0, - 0, 0, 0,10,10,11,11,11,11,12,12,12,12, 0, 0, 0, - 0, 0, 0, 0,11,11,11,11,12,12,12,12,13,13, 0, 0, - 0, 0, 0, 0, 0,11,11,11,11,12,12,12,12,13,13, 0, - 0, 0, 0, 0, 0, 0,12,12,12,12,12,12,13,13,13,13, - 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,12,12,12,13,13, - 13, -}; - -static const static_codebook _44c4_s_p6_0 = { - 2, 289, - (char *)_vq_lengthlist__44c4_s_p6_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c4_s_p6_0, - 0 -}; - -static const long _vq_quantlist__44c4_s_p7_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44c4_s_p7_0[] = { - 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,11, - 9, 9, 4, 7, 7,10, 9, 9,11, 9, 9, 7,10,10,11,11, - 10,11,11,11, 6, 9, 9,11,10,10,11,10,10, 6, 9, 9, - 11,10,10,11,10,10, 7,11,11,12,11,11,12,11,11, 6, - 9, 9,11,10,10,11,10,10, 6, 9, 9,11,10,10,11,10, - 10, -}; - -static const static_codebook _44c4_s_p7_0 = { - 4, 81, - (char *)_vq_lengthlist__44c4_s_p7_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44c4_s_p7_0, - 0 -}; - -static const long _vq_quantlist__44c4_s_p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__44c4_s_p7_1[] = { - 2, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8,10, 5, 5, 6, 6, - 7, 7, 8, 8, 8, 8,10, 5, 5, 6, 6, 7, 7, 8, 8, 8, - 8,10, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, 7, - 7, 8, 8, 8, 8, 8, 8,10,10,10, 8, 7, 8, 8, 8, 8, - 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, - 8, 8, 8, 8, 8, 8, 8, 8,10,10,10,10,10, 8, 8, 8, - 8, 8, 8,10,10,10,10,10, 9, 9, 8, 8, 9, 8,10,10, - 10,10,10, 8, 8, 8, 8, 9, 9, -}; - -static const static_codebook _44c4_s_p7_1 = { - 2, 121, - (char *)_vq_lengthlist__44c4_s_p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44c4_s_p7_1, - 0 -}; - -static const long _vq_quantlist__44c4_s_p8_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44c4_s_p8_0[] = { - 1, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10, 6, 5, 5, - 7, 7, 8, 8, 8, 8, 9,10,11,11, 7, 5, 5, 7, 7, 8, - 8, 9, 9,10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9, - 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, - 11, 0,12,12, 9, 9, 9, 9,10,10,10,10,11,11, 0,13, - 13, 9, 9,10, 9,10,10,11,11,11,12, 0, 0, 0,10,10, - 10,10,10,10,11,11,12,12, 0, 0, 0,10,10,10,10,10, - 10,11,11,12,12, 0, 0, 0,14,14,11,11,11,11,12,12, - 12,12, 0, 0, 0,14,14,11,11,11,11,12,12,12,13, 0, - 0, 0, 0, 0,12,12,12,12,12,12,13,13, 0, 0, 0, 0, - 0,13,12,12,12,12,12,13,13, -}; - -static const static_codebook _44c4_s_p8_0 = { - 2, 169, - (char *)_vq_lengthlist__44c4_s_p8_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44c4_s_p8_0, - 0 -}; - -static const long _vq_quantlist__44c4_s_p8_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44c4_s_p8_1[] = { - 2, 4, 4, 5, 5, 6, 5, 5, 5, 5, 6, 5, 4, 5, 5, 6, - 5, 5, 5, 5, 6, 6, 6, 5, 5, -}; - -static const static_codebook _44c4_s_p8_1 = { - 2, 25, - (char *)_vq_lengthlist__44c4_s_p8_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c4_s_p8_1, - 0 -}; - -static const long _vq_quantlist__44c4_s_p9_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44c4_s_p9_0[] = { - 1, 3, 3,12,12,12,12,12,12,12,12,12,12, 4, 7, 7, - 12,12,12,12,12,12,12,12,12,12, 3, 8, 8,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12, -}; - -static const static_codebook _44c4_s_p9_0 = { - 2, 169, - (char *)_vq_lengthlist__44c4_s_p9_0, - 1, -513964032, 1628680192, 4, 0, - (long *)_vq_quantlist__44c4_s_p9_0, - 0 -}; - -static const long _vq_quantlist__44c4_s_p9_1[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const char _vq_lengthlist__44c4_s_p9_1[] = { - 1, 4, 4, 5, 5, 7, 7, 9, 8,10, 9,10,10,10,10, 6, - 5, 5, 7, 7, 9, 8,10, 9,11,10,12,12,13,13, 6, 5, - 5, 7, 7, 9, 9,10,10,11,11,12,12,12,13,19, 8, 8, - 8, 8, 9, 9,10,10,12,11,12,12,13,13,19, 8, 8, 8, - 8, 9, 9,11,11,12,12,13,13,13,13,19,12,12, 9, 9, - 11,11,11,11,12,11,13,12,13,13,18,12,12, 9, 9,11, - 10,11,11,12,12,12,13,13,14,19,18,18,11,11,11,11, - 12,12,13,12,13,13,14,14,16,18,18,11,11,11,10,12, - 11,13,13,13,13,13,14,17,18,18,14,15,11,12,12,13, - 13,13,13,14,14,14,18,18,18,15,15,12,10,13,10,13, - 13,13,13,13,14,18,17,18,17,18,12,13,12,13,13,13, - 14,14,16,14,18,17,18,18,17,13,12,13,10,12,12,14, - 14,14,14,17,18,18,18,18,14,15,12,12,13,12,14,14, - 15,15,18,18,18,17,18,15,14,12,11,12,12,14,14,14, - 15, -}; - -static const static_codebook _44c4_s_p9_1 = { - 2, 225, - (char *)_vq_lengthlist__44c4_s_p9_1, - 1, -520986624, 1620377600, 4, 0, - (long *)_vq_quantlist__44c4_s_p9_1, - 0 -}; - -static const long _vq_quantlist__44c4_s_p9_2[] = { - 10, - 9, - 11, - 8, - 12, - 7, - 13, - 6, - 14, - 5, - 15, - 4, - 16, - 3, - 17, - 2, - 18, - 1, - 19, - 0, - 20, -}; - -static const char _vq_lengthlist__44c4_s_p9_2[] = { - 2, 5, 5, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, - 8, 9, 9, 9, 9,11, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, - 9, 9, 9, 9, 9, 9,10,10,10,10,11, 6, 6, 7, 7, 8, - 8, 8, 8, 9, 9, 9, 9, 9, 9,10, 9,10,10,10,10,11, - 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9,10,10,10, - 10,10,10,10,12,11,11, 7, 7, 8, 8, 9, 9, 9, 9, 9, - 9,10,10,10,10,10,10,10,10,12,11,12, 8, 8, 8, 8, - 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,11,11, - 11, 8, 8, 8, 8, 9, 9, 9, 9,10,10,10,10,10,10,10, - 10,10,10,11,11,12, 9, 9, 9, 9, 9, 9,10, 9,10,10, - 10,10,10,10,10,10,10,10,11,11,11,11,11, 9, 9, 9, - 9,10,10,10,10,10,10,10,10,10,10,10,10,11,12,11, - 11,11, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10, - 10,10,11,11,11,11,11, 9, 9, 9, 9,10,10,10,10,10, - 10,10,10,10,10,10,10,11,11,11,12,12,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,11,12,11,12, - 11,11,11, 9,10,10,10,10,10,10,10,10,10,10,10,10, - 10,11,12,11,11,11,11,11,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,11,11,11,12,11,11,11,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,12,11,11,12,11, - 11,11,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 11,11,11,11,11,11,11,11,11,10,10,10,10,10,10,10, - 10,10,10,10,10,11,11,11,11,12,12,11,11,11,11,11, - 11,11,10,10,10,10,10,10,10,10,12,12,12,11,11,11, - 12,11,11,11,10,10,10,10,10,10,10,10,10,10,10,12, - 11,12,12,12,12,12,11,12,11,11,10,10,10,10,10,10, - 10,10,10,10,12,12,12,12,11,11,11,11,11,11,11,10, - 10,10,10,10,10,10,10,10,10, -}; - -static const static_codebook _44c4_s_p9_2 = { - 2, 441, - (char *)_vq_lengthlist__44c4_s_p9_2, - 1, -529268736, 1611661312, 5, 0, - (long *)_vq_quantlist__44c4_s_p9_2, - 0 -}; - -static const char _huff_lengthlist__44c4_s_short[] = { - 4, 7,14,10,15,10,12,15,16,15, 4, 2,11, 5,10, 6, - 8,11,14,14,14,10, 7,11, 6, 8,10,11,13,15, 9, 4, - 11, 5, 9, 6, 9,12,14,15,14, 9, 6, 9, 4, 5, 7,10, - 12,13, 9, 5, 7, 6, 5, 5, 7,10,13,13,10, 8, 9, 8, - 7, 6, 8,10,14,14,13,11,10,10, 7, 7, 8,11,14,15, - 13,12, 9, 9, 6, 5, 7,10,14,17,15,13,11,10, 6, 6, - 7, 9,12,17, -}; - -static const static_codebook _huff_book__44c4_s_short = { - 2, 100, - (char *)_huff_lengthlist__44c4_s_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44c5_s_long[] = { - 3, 8, 9,13,10,12,12,12,12,12, 6, 4, 6, 8, 6, 8, - 10,10,11,12, 8, 5, 4,10, 4, 7, 8, 9,10,11,13, 8, - 10, 8, 9, 9,11,12,13,14,10, 6, 4, 9, 3, 5, 6, 8, - 10,11,11, 8, 6, 9, 5, 5, 6, 7, 9,11,12, 9, 7,11, - 6, 6, 6, 7, 8,10,12,11, 9,12, 7, 7, 6, 6, 7, 9, - 13,12,10,13, 9, 8, 7, 7, 7, 8,11,15,11,15,11,10, - 9, 8, 7, 7, -}; - -static const static_codebook _huff_book__44c5_s_long = { - 2, 100, - (char *)_huff_lengthlist__44c5_s_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44c5_s_p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44c5_s_p1_0[] = { - 2, 4, 4, 0, 0, 0, 0, 0, 0, 4, 7, 7, 0, 0, 0, 0, - 0, 0, 4, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, - 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 7, 7, 0, 0, 0, 0, 0, 0, 7, 9, 8, 0, 0, - 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 7, 7, 0, 0, 0, 0, - 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, - 0, 0, 0, 9,10,11, 0, 0, 0, 0, 0, 0, 9,10,10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 8,10, 9, 0, 0, 0, 0, 0, 0, 9,10,11, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 7, 7, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,11,10, 0, - 0, 0, 0, 0, 0, 8, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,10, - 0, 0, 0, 0, 0, 0, 9,11,10, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44c5_s_p1_0 = { - 8, 6561, - (char *)_vq_lengthlist__44c5_s_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44c5_s_p1_0, - 0 -}; - -static const long _vq_quantlist__44c5_s_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44c5_s_p2_0[] = { - 2, 4, 4, 0, 0, 0, 5, 5, 0, 0, 0, 5, 5, 0, 0, 0, - 8, 7, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 0, 8, - 8, 0, 0, 0, 8, 7, 0, 0, 0,10,10, 0, 0, 0, 0, 0, - 0, 0, 4, 6, 6, 0, 0, 0, 8, 8, 0, 0, 0, 7, 8, 0, - 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 5, 8, 7, 0, 0, 0, 8, 8, 0, 0, - 0, 8, 8, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 5, - 7, 8, 0, 0, 0, 8, 8, 0, 0, 0, 8, 8, 0, 0, 0,10, - 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 5, 8, 8, 0, 0, 0, 8, 8, 0, 0, 0, 8, 8, - 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 5, 8, 8, 0, - 0, 0, 8, 8, 0, 0, 0, 8, 8, 0, 0, 0,10,10, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8,10,10, 0, 0, 0,10,10, 0, 0, 0, 9,10, 0, 0, 0, - 11,10, 0, 0, 0, 0, 0, 0, 0, 8,10,10, 0, 0, 0,10, - 10, 0, 0, 0,10,10, 0, 0, 0,10,11, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44c5_s_p2_0 = { - 4, 625, - (char *)_vq_lengthlist__44c5_s_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c5_s_p2_0, - 0 -}; - -static const long _vq_quantlist__44c5_s_p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44c5_s_p3_0[] = { - 2, 4, 3, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 5, 6, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 5, 5, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 8, 8, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 6, 6, 8, 8, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44c5_s_p3_0 = { - 4, 625, - (char *)_vq_lengthlist__44c5_s_p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c5_s_p3_0, - 0 -}; - -static const long _vq_quantlist__44c5_s_p4_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44c5_s_p4_0[] = { - 2, 3, 3, 6, 6, 0, 0, 0, 0, 0, 4, 4, 6, 6, 0, 0, - 0, 0, 0, 4, 4, 6, 6, 0, 0, 0, 0, 0, 5, 5, 6, 6, - 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 0, 0, 0, 0, 0, 0, 0, 8, 7, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c5_s_p4_0 = { - 2, 81, - (char *)_vq_lengthlist__44c5_s_p4_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c5_s_p4_0, - 0 -}; - -static const long _vq_quantlist__44c5_s_p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44c5_s_p5_0[] = { - 2, 4, 3, 6, 6, 7, 7, 9, 9, 0, 4, 4, 6, 6, 7, 7, - 9, 9, 0, 4, 4, 6, 6, 7, 7, 9, 9, 0, 6, 6, 7, 7, - 7, 7, 9, 9, 0, 0, 0, 7, 6, 7, 7, 9, 9, 0, 0, 0, - 8, 8, 8, 8,10,10, 0, 0, 0, 8, 8, 8, 8,10,10, 0, - 0, 0, 9, 9, 9, 9,10,10, 0, 0, 0, 0, 0, 9, 9,10, - 10, -}; - -static const static_codebook _44c5_s_p5_0 = { - 2, 81, - (char *)_vq_lengthlist__44c5_s_p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c5_s_p5_0, - 0 -}; - -static const long _vq_quantlist__44c5_s_p6_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__44c5_s_p6_0[] = { - 2, 4, 4, 6, 6, 8, 8, 9, 9, 9, 9,10,10,10,10,11, - 11, 0, 4, 4, 6, 6, 8, 8, 9, 9, 9, 9,10,10,11,11, - 12,12, 0, 4, 4, 6, 6, 8, 8, 9, 9, 9, 9,10,10,11, - 11,12,12, 0, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9,10,10, - 11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, - 10,11,11,12,12, 0, 0, 0, 7, 7, 9, 9,10,10,10,10, - 11,11,11,11,12,12, 0, 0, 0, 7, 7, 8, 9,10,10,10, - 10,11,11,11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10,10, - 10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 9, 9,10, - 10,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 9, 9, - 10,10,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 9, - 9, 9,10,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, - 10,10,10,10,11,11,11,12,12,12,13,13, 0, 0, 0, 0, - 0, 0, 0,10,10,11,11,11,11,12,12,13,13, 0, 0, 0, - 0, 0, 0, 0,11,11,11,11,12,12,12,13,13,13, 0, 0, - 0, 0, 0, 0, 0,11,11,11,11,12,12,12,12,13,13, 0, - 0, 0, 0, 0, 0, 0,12,12,12,12,13,12,13,13,13,13, - 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,13, - 13, -}; - -static const static_codebook _44c5_s_p6_0 = { - 2, 289, - (char *)_vq_lengthlist__44c5_s_p6_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c5_s_p6_0, - 0 -}; - -static const long _vq_quantlist__44c5_s_p7_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44c5_s_p7_0[] = { - 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,11, - 9, 9, 4, 7, 7,10, 9, 9,11, 9, 9, 7,10,10,11,11, - 10,11,11,11, 6, 9, 9,11,10,10,11,10,10, 6, 9, 9, - 11,10,10,11,10,10, 7,11,11,12,11,11,12,11,11, 6, - 9, 9,11,10,10,11,10,10, 6, 9, 9,11,10,10,11,10, - 10, -}; - -static const static_codebook _44c5_s_p7_0 = { - 4, 81, - (char *)_vq_lengthlist__44c5_s_p7_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44c5_s_p7_0, - 0 -}; - -static const long _vq_quantlist__44c5_s_p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__44c5_s_p7_1[] = { - 2, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8,10, 5, 5, 6, 6, - 7, 7, 8, 8, 8, 8,10, 5, 5, 6, 6, 7, 7, 8, 8, 8, - 8,10, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, 7, - 7, 8, 8, 8, 8, 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, - 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, - 8, 8, 8, 8, 8, 8, 8, 9,10,10,10,10,10, 8, 8, 8, - 8, 8, 8,10,10,10,10,10, 9, 9, 8, 8, 8, 8,10,10, - 10,10,10, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _44c5_s_p7_1 = { - 2, 121, - (char *)_vq_lengthlist__44c5_s_p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44c5_s_p7_1, - 0 -}; - -static const long _vq_quantlist__44c5_s_p8_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44c5_s_p8_0[] = { - 1, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10, 6, 5, 5, - 7, 7, 8, 8, 8, 9,10,10,10,10, 7, 5, 5, 7, 7, 8, - 8, 9, 9,10,10,10,10, 0, 8, 8, 8, 8, 9, 9, 9, 9, - 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, - 11, 0,12,12, 9, 9, 9,10,10,10,10,10,11,11, 0,13, - 13, 9, 9, 9, 9,10,10,11,11,11,11, 0, 0, 0,10,10, - 10,10,10,10,11,11,11,11, 0, 0, 0,10,10,10,10,10, - 10,11,11,12,12, 0, 0, 0,14,14,11,11,11,11,12,12, - 12,12, 0, 0, 0,14,14,11,11,11,11,12,12,12,12, 0, - 0, 0, 0, 0,12,12,12,12,12,12,13,13, 0, 0, 0, 0, - 0,12,12,12,12,12,12,13,13, -}; - -static const static_codebook _44c5_s_p8_0 = { - 2, 169, - (char *)_vq_lengthlist__44c5_s_p8_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44c5_s_p8_0, - 0 -}; - -static const long _vq_quantlist__44c5_s_p8_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44c5_s_p8_1[] = { - 2, 4, 4, 5, 5, 6, 5, 5, 5, 5, 6, 4, 5, 5, 5, 6, - 5, 5, 5, 5, 6, 6, 6, 5, 5, -}; - -static const static_codebook _44c5_s_p8_1 = { - 2, 25, - (char *)_vq_lengthlist__44c5_s_p8_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c5_s_p8_1, - 0 -}; - -static const long _vq_quantlist__44c5_s_p9_0[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const char _vq_lengthlist__44c5_s_p9_0[] = { - 1, 3, 3,13,13,13,13,13,13,13,13,13,13,13,13, 4, - 7, 7,13,13,13,13,13,13,13,13,13,13,13,13, 3, 8, - 6,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,12,12,12,12,12,12,12, - 12, -}; - -static const static_codebook _44c5_s_p9_0 = { - 2, 225, - (char *)_vq_lengthlist__44c5_s_p9_0, - 1, -512522752, 1628852224, 4, 0, - (long *)_vq_quantlist__44c5_s_p9_0, - 0 -}; - -static const long _vq_quantlist__44c5_s_p9_1[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__44c5_s_p9_1[] = { - 1, 4, 4, 5, 5, 7, 7, 9, 8,10, 9,10,10,11,10,11, - 11, 6, 5, 5, 7, 7, 8, 9,10,10,11,10,12,11,12,11, - 13,12, 6, 5, 5, 7, 7, 9, 9,10,10,11,11,12,12,13, - 12,13,13,18, 8, 8, 8, 8, 9, 9,10,11,11,11,12,11, - 13,11,13,12,18, 8, 8, 8, 8,10,10,11,11,12,12,13, - 13,13,13,13,14,18,12,12, 9, 9,11,11,11,11,12,12, - 13,12,13,12,13,13,20,13,12, 9, 9,11,11,11,11,12, - 12,13,13,13,14,14,13,20,18,19,11,12,11,11,12,12, - 13,13,13,13,13,13,14,13,18,19,19,12,11,11,11,12, - 12,13,12,13,13,13,14,14,13,18,17,19,14,15,12,12, - 12,13,13,13,14,14,14,14,14,14,19,19,19,16,15,12, - 11,13,12,14,14,14,13,13,14,14,14,19,18,19,18,19, - 13,13,13,13,14,14,14,13,14,14,14,14,18,17,19,19, - 19,13,13,13,11,13,11,13,14,14,14,14,14,19,17,17, - 18,18,16,16,13,13,13,13,14,13,15,15,14,14,19,19, - 17,17,18,16,16,13,11,14,10,13,12,14,14,14,14,19, - 19,19,19,19,18,17,13,14,13,11,14,13,14,14,15,15, - 19,19,19,17,19,18,18,14,13,12,11,14,11,15,15,15, - 15, -}; - -static const static_codebook _44c5_s_p9_1 = { - 2, 289, - (char *)_vq_lengthlist__44c5_s_p9_1, - 1, -520814592, 1620377600, 5, 0, - (long *)_vq_quantlist__44c5_s_p9_1, - 0 -}; - -static const long _vq_quantlist__44c5_s_p9_2[] = { - 10, - 9, - 11, - 8, - 12, - 7, - 13, - 6, - 14, - 5, - 15, - 4, - 16, - 3, - 17, - 2, - 18, - 1, - 19, - 0, - 20, -}; - -static const char _vq_lengthlist__44c5_s_p9_2[] = { - 3, 5, 5, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 9,11, 5, 6, 7, 7, 8, 7, 8, 8, 8, 8, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11, 5, 5, 7, 7, 7, - 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11, - 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, - 9,10, 9,10,11,11,11, 7, 7, 8, 8, 8, 8, 9, 9, 9, - 9, 9, 9,10,10,10,10,10,10,11,11,11, 8, 8, 8, 8, - 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,11,11, - 11, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9,10,10,10,10,10, - 10,10,10,11,11,11, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 10,10,10,10,10,10,10,10,11,11,11,11,11, 9, 9, 9, - 9, 9, 9,10, 9,10,10,10,10,10,10,10,10,11,11,11, - 11,11, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10, - 10,10,11,11,11,11,11, 9, 9, 9, 9, 9, 9,10,10,10, - 10,10,10,10,10,10,10,11,11,11,11,11, 9, 9,10, 9, - 10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11, - 11,11,11, 9, 9,10,10,10,10,10,10,10,10,10,10,10, - 10,11,11,11,11,11,11,11,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,11,11,11,11,11,11,11,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11, - 11,11,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 11,11,11,11,11,11,11,11,11,10,10,10,10,10,10,10, - 10,10,10,10,10,11,11,11,11,11,11,11,11,11,10,10, - 10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11, - 11,11,11,10,10,10,10,10,10,10,10,10,10,10,10,11, - 11,11,11,11,11,11,11,11,10,10,10,10,10,10,10,10, - 10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,10, - 10,10,10,10,10,10,10,10,10, -}; - -static const static_codebook _44c5_s_p9_2 = { - 2, 441, - (char *)_vq_lengthlist__44c5_s_p9_2, - 1, -529268736, 1611661312, 5, 0, - (long *)_vq_quantlist__44c5_s_p9_2, - 0 -}; - -static const char _huff_lengthlist__44c5_s_short[] = { - 5, 8,10,14,11,11,12,16,15,17, 5, 5, 7, 9, 7, 8, - 10,13,17,17, 7, 5, 5,10, 5, 7, 8,11,13,15,10, 8, - 10, 8, 8, 8,11,15,18,18, 8, 5, 5, 8, 3, 4, 6,10, - 14,16, 9, 7, 6, 7, 4, 3, 5, 9,14,18,10, 9, 8,10, - 6, 5, 6, 9,14,18,12,12,11,12, 8, 7, 8,11,14,18, - 14,13,12,10, 7, 5, 6, 9,14,18,14,14,13,10, 6, 5, - 6, 8,11,16, -}; - -static const static_codebook _huff_book__44c5_s_short = { - 2, 100, - (char *)_huff_lengthlist__44c5_s_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44c6_s_long[] = { - 3, 8,11,13,14,14,13,13,16,14, 6, 3, 4, 7, 9, 9, - 10,11,14,13,10, 4, 3, 5, 7, 7, 9,10,13,15,12, 7, - 4, 4, 6, 6, 8,10,13,15,12, 8, 6, 6, 6, 6, 8,10, - 13,14,11, 9, 7, 6, 6, 6, 7, 8,12,11,13,10, 9, 8, - 7, 6, 6, 7,11,11,13,11,10, 9, 9, 7, 7, 6,10,11, - 13,13,13,13,13,11, 9, 8,10,12,12,15,15,16,15,12, - 11,10,10,12, -}; - -static const static_codebook _huff_book__44c6_s_long = { - 2, 100, - (char *)_huff_lengthlist__44c6_s_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44c6_s_p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44c6_s_p1_0[] = { - 1, 5, 5, 0, 5, 5, 0, 5, 5, 5, 8, 7, 0, 9, 9, 0, - 9, 8, 5, 7, 8, 0, 9, 9, 0, 8, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 9, 8, 0, 8, 8, 0, 8, 8, 5, 8, 9, - 0, 8, 8, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, - 9, 9, 0, 8, 8, 0, 8, 8, 5, 9, 9, 0, 8, 8, 0, 8, - 8, -}; -static const static_codebook _44c6_s_p1_0 = { - 4, 81, - (char *)_vq_lengthlist__44c6_s_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44c6_s_p1_0, - 0 -}; - -static const long _vq_quantlist__44c6_s_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44c6_s_p2_0[] = { - 3, 5, 5, 8, 8, 0, 5, 5, 8, 8, 0, 5, 5, 8, 8, 0, - 7, 7, 9, 9, 0, 0, 0, 9, 9, 5, 7, 7, 9, 9, 0, 8, - 8,10,10, 0, 8, 7,10, 9, 0,10,10,11,11, 0, 0, 0, - 11,11, 5, 7, 7, 9, 9, 0, 8, 8,10,10, 0, 7, 8, 9, - 10, 0,10,10,11,11, 0, 0, 0,11,11, 8, 9, 9,11,11, - 0,11,11,12,12, 0,11,10,12,12, 0,13,14,14,14, 0, - 0, 0,14,13, 8, 9, 9,11,11, 0,11,11,12,12, 0,10, - 11,12,12, 0,14,13,14,14, 0, 0, 0,13,14, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 5, 8, 7,11,10, 0, 7, 7,10,10, - 0, 7, 7,10,10, 0, 9, 9,11,10, 0, 0, 0,11,11, 5, - 7, 8,10,11, 0, 7, 7,10,10, 0, 7, 7,10,10, 0, 9, - 9,10,11, 0, 0, 0,11,11, 8,10, 9,12,12, 0,10,10, - 12,12, 0,10,10,12,12, 0,12,12,13,13, 0, 0, 0,13, - 13, 8, 9,10,12,12, 0,10,10,11,12, 0,10,10,12,12, - 0,12,12,13,13, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 5, 8, 8,11,11, 0, 7, 7,10,10, 0, 7, 7, - 10,10, 0, 9, 9,10,11, 0, 0, 0,11,10, 5, 8, 8,11, - 11, 0, 7, 7,10,10, 0, 7, 7,10,10, 0, 9, 9,11,11, - 0, 0, 0,10,11, 8,10,10,12,12, 0,10,10,12,12, 0, - 10,10,12,12, 0,12,13,13,13, 0, 0, 0,14,13, 8,10, - 10,12,12, 0,10,10,12,12, 0,10,10,12,12, 0,13,12, - 13,13, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7,10,10,14,13, 0, 9, 9,13,12, 0, 9, 9,12,12, 0, - 10,10,12,12, 0, 0, 0,12,12, 7,10,10,13,14, 0, 9, - 9,12,13, 0, 9, 9,12,12, 0,10,10,12,12, 0, 0, 0, - 12,12, 9,11,11,14,13, 0,11,10,14,13, 0,11,11,13, - 13, 0,12,12,13,13, 0, 0, 0,13,13, 9,11,11,13,14, - 0,10,11,13,14, 0,11,11,13,13, 0,12,12,13,13, 0, - 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 11,11,14,14, 0,11,11,13,13, 0,11,10,13,13, 0,12, - 12,13,13, 0, 0, 0,13,13, 9,11,11,14,14, 0,11,11, - 13,13, 0,10,11,13,13, 0,12,12,14,13, 0, 0, 0,13, - 13, -}; - -static const static_codebook _44c6_s_p2_0 = { - 4, 625, - (char *)_vq_lengthlist__44c6_s_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c6_s_p2_0, - 0 -}; - -static const long _vq_quantlist__44c6_s_p3_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44c6_s_p3_0[] = { - 2, 3, 4, 6, 6, 7, 7, 9, 9, 0, 4, 4, 6, 6, 7, 7, - 9,10, 0, 4, 4, 6, 6, 7, 7,10, 9, 0, 5, 5, 7, 7, - 8, 8,10,10, 0, 0, 0, 7, 6, 8, 8,10,10, 0, 0, 0, - 7, 7, 9, 9,11,11, 0, 0, 0, 7, 7, 9, 9,11,11, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c6_s_p3_0 = { - 2, 81, - (char *)_vq_lengthlist__44c6_s_p3_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c6_s_p3_0, - 0 -}; - -static const long _vq_quantlist__44c6_s_p4_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__44c6_s_p4_0[] = { - 2, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9,10,10, - 10, 0, 4, 4, 6, 6, 8, 8, 9, 9, 9, 9,10,10,10,10, - 11,11, 0, 4, 4, 6, 6, 8, 8, 9, 9, 9, 9,10,10,10, - 10,11,11, 0, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9,10,10, - 11,11,11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, - 10,11,11,11,11, 0, 0, 0, 7, 7, 9, 9,10,10,10,10, - 11,11,11,11,12,12, 0, 0, 0, 7, 7, 9, 9,10,10,10, - 10,11,11,11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, - 10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 8, 8, 9, - 9,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44c6_s_p4_0 = { - 2, 289, - (char *)_vq_lengthlist__44c6_s_p4_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c6_s_p4_0, - 0 -}; - -static const long _vq_quantlist__44c6_s_p5_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44c6_s_p5_0[] = { - 1, 4, 4, 5, 7, 7, 6, 7, 7, 4, 6, 6, 9, 9,10,10, - 10, 9, 4, 6, 6, 9,10, 9,10, 9,10, 6, 9, 9,10,12, - 11,10,11,11, 7,10, 9,11,12,12,12,12,12, 7,10,10, - 11,12,12,12,12,12, 6,10,10,10,12,12,11,12,12, 7, - 9,10,11,12,12,12,12,12, 7,10, 9,12,12,12,12,12, - 12, -}; - -static const static_codebook _44c6_s_p5_0 = { - 4, 81, - (char *)_vq_lengthlist__44c6_s_p5_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44c6_s_p5_0, - 0 -}; - -static const long _vq_quantlist__44c6_s_p5_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__44c6_s_p5_1[] = { - 3, 5, 4, 6, 6, 7, 7, 8, 8, 8, 8,11, 4, 4, 6, 6, - 7, 7, 8, 8, 8, 8,11, 4, 4, 6, 6, 7, 7, 8, 8, 8, - 8,11, 6, 6, 6, 6, 8, 8, 8, 8, 9, 9,11,11,11, 6, - 6, 7, 8, 8, 8, 8, 9,11,11,11, 7, 7, 8, 8, 8, 8, - 8, 8,11,11,11, 7, 7, 8, 8, 8, 8, 8, 8,11,11,11, - 8, 8, 8, 8, 8, 8, 8, 8,11,11,11,10,10, 8, 8, 8, - 8, 8, 8,11,11,11,10,10, 8, 8, 8, 8, 8, 8,11,11, - 11,10,10, 7, 7, 8, 8, 8, 8, -}; - -static const static_codebook _44c6_s_p5_1 = { - 2, 121, - (char *)_vq_lengthlist__44c6_s_p5_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44c6_s_p5_1, - 0 -}; - -static const long _vq_quantlist__44c6_s_p6_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44c6_s_p6_0[] = { - 1, 4, 4, 6, 6, 8, 8, 8, 8,10, 9,10,10, 6, 5, 5, - 7, 7, 9, 9, 9, 9,10,10,11,11, 6, 5, 5, 7, 7, 9, - 9,10, 9,11,10,11,11, 0, 6, 6, 7, 7, 9, 9,10,10, - 11,11,12,12, 0, 7, 7, 7, 7, 9, 9,10,10,11,11,12, - 12, 0,11,11, 8, 8,10,10,11,11,12,12,12,12, 0,11, - 12, 9, 8,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 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 static_codebook _44c6_s_p6_0 = { - 2, 169, - (char *)_vq_lengthlist__44c6_s_p6_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44c6_s_p6_0, - 0 -}; - -static const long _vq_quantlist__44c6_s_p6_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44c6_s_p6_1[] = { - 3, 4, 4, 5, 5, 5, 4, 4, 5, 5, 5, 4, 4, 5, 5, 6, - 5, 5, 5, 5, 6, 6, 6, 5, 5, -}; - -static const static_codebook _44c6_s_p6_1 = { - 2, 25, - (char *)_vq_lengthlist__44c6_s_p6_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c6_s_p6_1, - 0 -}; - -static const long _vq_quantlist__44c6_s_p7_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44c6_s_p7_0[] = { - 1, 4, 4, 6, 6, 8, 8, 8, 8,10,10,11,10, 6, 5, 5, - 7, 7, 8, 8, 9, 9,10,10,12,11, 6, 5, 5, 7, 7, 8, - 8, 9, 9,10,10,12,11,21, 7, 7, 7, 7, 9, 9,10,10, - 11,11,12,12,21, 7, 7, 7, 7, 9, 9,10,10,11,11,12, - 12,21,12,12, 9, 9,10,10,11,11,11,11,12,12,21,12, - 12, 9, 9,10,10,11,11,12,12,12,12,21,21,21,11,11, - 10,10,11,12,12,12,13,13,21,21,21,11,11,10,10,12, - 12,12,12,13,13,21,21,21,15,15,11,11,12,12,13,13, - 13,13,21,21,21,15,16,11,11,12,12,13,13,14,14,21, - 21,21,21,20,13,13,13,13,13,13,14,14,20,20,20,20, - 20,13,13,13,13,13,13,14,14, -}; - -static const static_codebook _44c6_s_p7_0 = { - 2, 169, - (char *)_vq_lengthlist__44c6_s_p7_0, - 1, -523206656, 1618345984, 4, 0, - (long *)_vq_quantlist__44c6_s_p7_0, - 0 -}; - -static const long _vq_quantlist__44c6_s_p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__44c6_s_p7_1[] = { - 3, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 9, 5, 5, 6, 6, - 7, 7, 7, 7, 8, 7, 8, 5, 5, 6, 6, 7, 7, 7, 7, 7, - 7, 9, 6, 6, 7, 7, 7, 7, 8, 7, 7, 8, 9, 9, 9, 7, - 7, 7, 7, 7, 7, 7, 8, 9, 9, 9, 7, 7, 7, 7, 8, 8, - 8, 8, 9, 9, 9, 7, 7, 7, 7, 7, 7, 8, 8, 9, 9, 9, - 8, 8, 8, 8, 7, 7, 8, 8, 9, 9, 9, 9, 8, 8, 8, 7, - 7, 8, 8, 9, 9, 9, 8, 8, 8, 8, 7, 7, 8, 8, 9, 9, - 9, 8, 8, 7, 7, 7, 7, 8, 8, -}; - -static const static_codebook _44c6_s_p7_1 = { - 2, 121, - (char *)_vq_lengthlist__44c6_s_p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44c6_s_p7_1, - 0 -}; - -static const long _vq_quantlist__44c6_s_p8_0[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const char _vq_lengthlist__44c6_s_p8_0[] = { - 1, 4, 4, 7, 7, 8, 8, 7, 7, 8, 7, 9, 8,10, 9, 6, - 5, 5, 8, 8, 9, 9, 8, 8, 9, 9,11,10,11,10, 6, 5, - 5, 8, 8, 9, 9, 8, 8, 9, 9,10,10,11,11,18, 8, 8, - 9, 8,10,10, 9, 9,10,10,10,10,11,10,18, 8, 8, 9, - 9,10,10, 9, 9,10,10,11,11,12,12,18,12,13, 9,10, - 10,10, 9,10,10,10,11,11,12,11,18,13,13, 9, 9,10, - 10,10,10,10,10,11,11,12,12,18,18,18,10,10, 9, 9, - 11,11,11,11,11,12,12,12,18,18,18,10, 9,10, 9,11, - 10,11,11,11,11,13,12,18,18,18,14,13,10,10,11,11, - 12,12,12,12,12,12,18,18,18,14,13,10,10,11,10,12, - 12,12,12,12,12,18,18,18,18,18,12,12,11,11,12,12, - 13,13,13,14,18,18,18,18,18,12,12,11,11,12,11,13, - 13,14,13,18,18,18,18,18,16,16,11,12,12,13,13,13, - 14,13,18,18,18,18,18,16,15,12,11,12,11,13,11,15, - 14, -}; - -static const static_codebook _44c6_s_p8_0 = { - 2, 225, - (char *)_vq_lengthlist__44c6_s_p8_0, - 1, -520986624, 1620377600, 4, 0, - (long *)_vq_quantlist__44c6_s_p8_0, - 0 -}; - -static const long _vq_quantlist__44c6_s_p8_1[] = { - 10, - 9, - 11, - 8, - 12, - 7, - 13, - 6, - 14, - 5, - 15, - 4, - 16, - 3, - 17, - 2, - 18, - 1, - 19, - 0, - 20, -}; - -static const char _vq_lengthlist__44c6_s_p8_1[] = { - 3, 5, 5, 6, 6, 7, 7, 7, 7, 8, 7, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8,10, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 6, 6, 7, 7, 8, - 8, 8, 8, 8, 8, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9,10, - 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9,10,11,11, 8, 7, 8, 8, 8, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9,11,11,11, 8, 8, 8, 8, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11,11, - 11, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9,11,11,11, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9,11,11,11,11,11, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10, 9,11,11,11, - 11,11, 9, 9, 9, 9, 9, 9,10, 9, 9,10, 9,10, 9, 9, - 10, 9,11,11,11,11,11, 9, 9, 9, 9, 9, 9, 9,10,10, - 10,10, 9,10,10, 9,10,11,11,11,11,11, 9, 9, 9, 9, - 10,10,10, 9,10,10,10,10, 9,10,10, 9,11,11,11,11, - 11,11,11, 9, 9, 9, 9,10,10,10,10, 9,10,10,10,10, - 10,11,11,11,11,11,11,11,10, 9,10,10,10,10,10,10, - 10, 9,10, 9,10,10,11,11,11,11,11,11,11,10, 9,10, - 9,10,10, 9,10,10,10,10,10,10,10,11,11,11,11,11, - 11,11,10,10,10,10,10,10,10, 9,10,10,10,10,10, 9, - 11,11,11,11,11,11,11,11,11,10,10,10,10,10,10,10, - 10,10,10,10,10,11,11,11,11,11,11,11,11,11,10,10, - 10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11, - 11,11,11,10,10,10,10,10,10,10,10,10, 9,10,10,11, - 11,11,11,11,11,11,11,11,10,10,10, 9,10,10,10,10, - 10,10,10,10,10,11,11,11,11,11,11,11,11,10,11, 9, - 10,10,10,10,10,10,10,10,10, -}; - -static const static_codebook _44c6_s_p8_1 = { - 2, 441, - (char *)_vq_lengthlist__44c6_s_p8_1, - 1, -529268736, 1611661312, 5, 0, - (long *)_vq_quantlist__44c6_s_p8_1, - 0 -}; - -static const long _vq_quantlist__44c6_s_p9_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44c6_s_p9_0[] = { - 1, 3, 3,11,11,11,11,11,11,11,11,11,11, 4, 7, 7, - 11,11,11,11,11,11,11,11,11,11, 5, 8, 9,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10, -}; - -static const static_codebook _44c6_s_p9_0 = { - 2, 169, - (char *)_vq_lengthlist__44c6_s_p9_0, - 1, -511845376, 1630791680, 4, 0, - (long *)_vq_quantlist__44c6_s_p9_0, - 0 -}; - -static const long _vq_quantlist__44c6_s_p9_1[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44c6_s_p9_1[] = { - 1, 4, 4, 7, 7, 7, 7, 7, 6, 8, 8, 8, 8, 6, 6, 6, - 8, 8, 8, 8, 8, 7, 9, 8,10,10, 5, 6, 6, 8, 8, 9, - 9, 8, 8,10,10,10,10,16, 9, 9, 9, 9, 9, 9, 9, 8, - 10, 9,11,11,16, 8, 9, 9, 9, 9, 9, 9, 9,10,10,11, - 11,16,13,13, 9, 9,10, 9, 9,10,11,11,11,12,16,13, - 14, 9, 8,10, 8, 9, 9,10,10,12,11,16,14,16, 9, 9, - 9, 9,11,11,12,11,12,11,16,16,16, 9, 7, 9, 6,11, - 11,11,10,11,11,16,16,16,11,12, 9,10,11,11,12,11, - 13,13,16,16,16,12,11,10, 7,12,10,12,12,12,12,16, - 16,15,16,16,10,11,10,11,13,13,14,12,16,16,16,15, - 15,12,10,11,11,13,11,12,13, -}; - -static const static_codebook _44c6_s_p9_1 = { - 2, 169, - (char *)_vq_lengthlist__44c6_s_p9_1, - 1, -518889472, 1622704128, 4, 0, - (long *)_vq_quantlist__44c6_s_p9_1, - 0 -}; - -static const long _vq_quantlist__44c6_s_p9_2[] = { - 24, - 23, - 25, - 22, - 26, - 21, - 27, - 20, - 28, - 19, - 29, - 18, - 30, - 17, - 31, - 16, - 32, - 15, - 33, - 14, - 34, - 13, - 35, - 12, - 36, - 11, - 37, - 10, - 38, - 9, - 39, - 8, - 40, - 7, - 41, - 6, - 42, - 5, - 43, - 4, - 44, - 3, - 45, - 2, - 46, - 1, - 47, - 0, - 48, -}; - -static const char _vq_lengthlist__44c6_s_p9_2[] = { - 2, 4, 3, 4, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, -}; - -static const static_codebook _44c6_s_p9_2 = { - 1, 49, - (char *)_vq_lengthlist__44c6_s_p9_2, - 1, -526909440, 1611661312, 6, 0, - (long *)_vq_quantlist__44c6_s_p9_2, - 0 -}; - -static const char _huff_lengthlist__44c6_s_short[] = { - 3, 9,11,11,13,14,19,17,17,19, 5, 4, 5, 8,10,10, - 13,16,18,19, 7, 4, 4, 5, 8, 9,12,14,17,19, 8, 6, - 5, 5, 7, 7,10,13,16,18,10, 8, 7, 6, 5, 5, 8,11, - 17,19,11, 9, 7, 7, 5, 4, 5, 8,17,19,13,11, 8, 7, - 7, 5, 5, 7,16,18,14,13, 8, 6, 6, 5, 5, 7,16,18, - 18,16,10, 8, 8, 7, 7, 9,16,18,18,18,12,10,10, 9, - 9,10,17,18, -}; - -static const static_codebook _huff_book__44c6_s_short = { - 2, 100, - (char *)_huff_lengthlist__44c6_s_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44c7_s_long[] = { - 3, 8,11,13,15,14,14,13,15,14, 6, 4, 5, 7, 9,10, - 11,11,14,13,10, 4, 3, 5, 7, 8, 9,10,13,13,12, 7, - 4, 4, 5, 6, 8, 9,12,14,13, 9, 6, 5, 5, 6, 8, 9, - 12,14,12, 9, 7, 6, 5, 5, 6, 8,11,11,12,11, 9, 8, - 7, 6, 6, 7,10,11,13,11,10, 9, 8, 7, 6, 6, 9,11, - 13,13,12,12,12,10, 9, 8, 9,11,12,14,15,15,14,12, - 11,10,10,12, -}; - -static const static_codebook _huff_book__44c7_s_long = { - 2, 100, - (char *)_huff_lengthlist__44c7_s_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44c7_s_p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44c7_s_p1_0[] = { - 1, 5, 5, 0, 5, 5, 0, 5, 5, 5, 8, 7, 0, 9, 9, 0, - 9, 8, 5, 7, 8, 0, 9, 9, 0, 8, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 9, 9, 0, 8, 8, 0, 8, 8, 5, 8, 9, - 0, 8, 8, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, - 9, 9, 0, 8, 8, 0, 8, 8, 5, 8, 9, 0, 8, 8, 0, 8, - 8, -}; - -static const static_codebook _44c7_s_p1_0 = { - 4, 81, - (char *)_vq_lengthlist__44c7_s_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44c7_s_p1_0, - 0 -}; - -static const long _vq_quantlist__44c7_s_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44c7_s_p2_0[] = { - 3, 5, 5, 8, 8, 0, 5, 5, 8, 8, 0, 5, 5, 8, 8, 0, - 7, 7, 9, 9, 0, 0, 0, 9, 9, 5, 7, 7, 9, 9, 0, 8, - 8,10,10, 0, 8, 7,10, 9, 0,10,10,11,11, 0, 0, 0, - 11,11, 5, 7, 7, 9, 9, 0, 8, 8,10,10, 0, 7, 8, 9, - 10, 0,10,10,11,11, 0, 0, 0,11,11, 8, 9, 9,11,10, - 0,11,11,12,12, 0,11,10,12,12, 0,13,14,14,14, 0, - 0, 0,14,13, 8, 9, 9,10,11, 0,11,11,12,12, 0,10, - 11,12,12, 0,13,13,14,14, 0, 0, 0,13,14, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 5, 8, 7,11,10, 0, 7, 7,10,10, - 0, 7, 7,10,10, 0, 9, 9,11,10, 0, 0, 0,11,11, 5, - 7, 8,10,11, 0, 7, 7,10,10, 0, 7, 7,10,10, 0, 9, - 9,10,11, 0, 0, 0,11,11, 8,10, 9,12,12, 0,10,10, - 12,12, 0,10,10,12,12, 0,12,12,13,13, 0, 0, 0,13, - 13, 8, 9,10,12,12, 0,10,10,12,12, 0,10,10,11,12, - 0,12,12,13,13, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 5, 8, 8,11,11, 0, 7, 7,10,10, 0, 7, 7, - 10,10, 0, 9, 9,10,11, 0, 0, 0,11,10, 5, 8, 8,10, - 11, 0, 7, 7,10,10, 0, 7, 7,10,10, 0, 9, 9,11,10, - 0, 0, 0,10,11, 9,10,10,12,12, 0,10,10,12,12, 0, - 10,10,12,12, 0,12,13,13,13, 0, 0, 0,13,12, 9,10, - 10,12,12, 0,10,10,12,12, 0,10,10,12,12, 0,13,12, - 13,13, 0, 0, 0,12,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7,10,10,14,13, 0, 9, 9,12,12, 0, 9, 9,12,12, 0, - 10,10,12,12, 0, 0, 0,12,12, 7,10,10,13,14, 0, 9, - 9,12,13, 0, 9, 9,12,12, 0,10,10,12,12, 0, 0, 0, - 12,12, 9,11,11,14,13, 0,11,10,13,12, 0,11,11,13, - 13, 0,12,12,13,13, 0, 0, 0,13,13, 9,11,11,13,14, - 0,10,11,12,13, 0,11,11,13,13, 0,12,12,13,13, 0, - 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 11,11,14,14, 0,10,11,13,13, 0,11,10,13,13, 0,12, - 12,13,13, 0, 0, 0,13,12, 9,11,11,14,14, 0,11,10, - 13,13, 0,10,11,13,13, 0,12,12,14,13, 0, 0, 0,13, - 13, -}; - -static const static_codebook _44c7_s_p2_0 = { - 4, 625, - (char *)_vq_lengthlist__44c7_s_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c7_s_p2_0, - 0 -}; - -static const long _vq_quantlist__44c7_s_p3_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44c7_s_p3_0[] = { - 2, 4, 4, 5, 5, 7, 7, 9, 9, 0, 4, 4, 6, 6, 7, 7, - 9, 9, 0, 4, 4, 6, 6, 7, 7, 9, 9, 0, 5, 5, 6, 6, - 8, 8,10,10, 0, 0, 0, 6, 6, 8, 8,10,10, 0, 0, 0, - 7, 7, 9, 9,10,10, 0, 0, 0, 7, 7, 8, 8,10,10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c7_s_p3_0 = { - 2, 81, - (char *)_vq_lengthlist__44c7_s_p3_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c7_s_p3_0, - 0 -}; - -static const long _vq_quantlist__44c7_s_p4_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__44c7_s_p4_0[] = { - 3, 4, 4, 5, 5, 7, 7, 8, 8, 8, 8, 9, 9,10,10,11, - 11, 0, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10,11,11, - 12,12, 0, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10,11, - 11,12,12, 0, 5, 5, 6, 6, 8, 8, 9, 9, 9, 9,10,10, - 11,12,12,12, 0, 0, 0, 6, 6, 8, 7, 9, 9, 9, 9,10, - 10,11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9,10,10, - 11,11,12,12,13,12, 0, 0, 0, 7, 7, 8, 8, 9, 9,10, - 10,11,11,12,12,12,13, 0, 0, 0, 7, 7, 8, 8, 9, 9, - 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 8, 8, 9, - 9,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44c7_s_p4_0 = { - 2, 289, - (char *)_vq_lengthlist__44c7_s_p4_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c7_s_p4_0, - 0 -}; - -static const long _vq_quantlist__44c7_s_p5_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44c7_s_p5_0[] = { - 1, 4, 4, 5, 7, 7, 6, 7, 7, 4, 6, 7,10,10,10,10, - 10, 9, 4, 6, 6,10,10,10,10, 9,10, 5,10,10, 9,11, - 12,10,11,12, 7,10,10,11,12,12,12,12,12, 7,10,10, - 11,12,12,12,12,12, 6,10,10,10,12,12,11,12,12, 7, - 10,10,12,12,12,12,11,12, 7,10,10,11,12,12,12,12, - 12, -}; - -static const static_codebook _44c7_s_p5_0 = { - 4, 81, - (char *)_vq_lengthlist__44c7_s_p5_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44c7_s_p5_0, - 0 -}; - -static const long _vq_quantlist__44c7_s_p5_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__44c7_s_p5_1[] = { - 3, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8,11, 4, 4, 6, 6, - 7, 7, 8, 8, 9, 9,11, 4, 4, 6, 6, 7, 7, 8, 8, 9, - 9,12, 5, 5, 6, 6, 7, 7, 9, 9, 9, 9,12,12,12, 6, - 6, 7, 7, 9, 9, 9, 9,11,11,11, 7, 7, 7, 7, 8, 8, - 9, 9,11,11,11, 7, 7, 7, 7, 8, 8, 9, 9,11,11,11, - 7, 7, 8, 8, 8, 8, 9, 9,11,11,11,11,11, 8, 8, 8, - 8, 8, 9,11,11,11,11,11, 8, 8, 8, 8, 8, 8,11,11, - 11,11,11, 7, 7, 8, 8, 8, 8, -}; - -static const static_codebook _44c7_s_p5_1 = { - 2, 121, - (char *)_vq_lengthlist__44c7_s_p5_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44c7_s_p5_1, - 0 -}; - -static const long _vq_quantlist__44c7_s_p6_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44c7_s_p6_0[] = { - 1, 4, 4, 6, 6, 7, 7, 8, 7, 9, 8,10,10, 6, 5, 5, - 7, 7, 8, 8, 9, 9, 9,10,11,11, 7, 5, 5, 7, 7, 8, - 8, 9, 9,10,10,11,11, 0, 7, 7, 7, 7, 9, 8, 9, 9, - 10,10,11,11, 0, 8, 8, 7, 7, 8, 9, 9, 9,10,10,11, - 11, 0,11,11, 9, 9,10,10,11,10,11,11,12,12, 0,12, - 12, 9, 9,10,10,11,11,11,11,12,12, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 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 static_codebook _44c7_s_p6_0 = { - 2, 169, - (char *)_vq_lengthlist__44c7_s_p6_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44c7_s_p6_0, - 0 -}; - -static const long _vq_quantlist__44c7_s_p6_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44c7_s_p6_1[] = { - 3, 4, 4, 5, 5, 5, 4, 4, 5, 5, 5, 4, 4, 5, 5, 6, - 5, 5, 5, 5, 6, 6, 6, 5, 5, -}; - -static const static_codebook _44c7_s_p6_1 = { - 2, 25, - (char *)_vq_lengthlist__44c7_s_p6_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c7_s_p6_1, - 0 -}; - -static const long _vq_quantlist__44c7_s_p7_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44c7_s_p7_0[] = { - 1, 4, 4, 6, 6, 7, 8, 9, 9,10,10,12,11, 6, 5, 5, - 7, 7, 8, 8, 9,10,11,11,12,12, 7, 5, 5, 7, 7, 8, - 8,10,10,11,11,12,12,20, 7, 7, 7, 7, 8, 9,10,10, - 11,11,12,13,20, 7, 7, 7, 7, 9, 9,10,10,11,12,13, - 13,20,11,11, 8, 8, 9, 9,11,11,12,12,13,13,20,11, - 11, 8, 8, 9, 9,11,11,12,12,13,13,20,20,20,10,10, - 10,10,12,12,13,13,13,13,20,20,20,10,10,10,10,12, - 12,13,13,13,14,20,20,20,14,14,11,11,12,12,13,13, - 14,14,20,20,20,14,14,11,11,12,12,13,13,14,14,20, - 20,20,20,19,13,13,13,13,14,14,15,14,19,19,19,19, - 19,13,13,13,13,14,14,15,15, -}; - -static const static_codebook _44c7_s_p7_0 = { - 2, 169, - (char *)_vq_lengthlist__44c7_s_p7_0, - 1, -523206656, 1618345984, 4, 0, - (long *)_vq_quantlist__44c7_s_p7_0, - 0 -}; - -static const long _vq_quantlist__44c7_s_p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__44c7_s_p7_1[] = { - 4, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 8, 6, 6, 7, 7, - 7, 7, 7, 7, 7, 7, 8, 6, 6, 6, 7, 7, 7, 7, 7, 7, - 7, 8, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 7, - 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 7, 7, 7, 7, 7, 7, - 7, 7, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, - 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, - 7, 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 8, 8, - 8, 8, 8, 7, 7, 7, 7, 7, 7, -}; - -static const static_codebook _44c7_s_p7_1 = { - 2, 121, - (char *)_vq_lengthlist__44c7_s_p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44c7_s_p7_1, - 0 -}; - -static const long _vq_quantlist__44c7_s_p8_0[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const char _vq_lengthlist__44c7_s_p8_0[] = { - 1, 4, 4, 7, 7, 8, 8, 8, 7, 9, 8, 9, 9,10,10, 6, - 5, 5, 7, 7, 9, 9, 8, 8,10, 9,11,10,12,11, 6, 5, - 5, 8, 7, 9, 9, 8, 8,10,10,11,11,12,11,19, 8, 8, - 8, 8,10,10, 9, 9,10,10,11,11,12,11,19, 8, 8, 8, - 8,10,10, 9, 9,10,10,11,11,12,12,19,12,12, 9, 9, - 10,10, 9,10,10,10,11,11,12,12,19,12,12, 9, 9,10, - 10,10,10,10,10,12,12,12,12,19,19,19, 9, 9, 9, 9, - 11,10,11,11,12,11,13,13,19,19,19, 9, 9, 9, 9,11, - 10,11,11,11,12,13,13,19,19,19,13,13,10,10,11,11, - 12,12,12,12,13,12,19,19,19,14,13,10,10,11,11,12, - 12,12,13,13,13,19,19,19,19,19,12,12,12,11,12,13, - 14,13,13,13,19,19,19,19,19,12,12,12,11,12,12,13, - 14,13,14,19,19,19,19,19,16,16,12,13,12,13,13,14, - 15,14,19,18,18,18,18,16,15,12,11,12,11,14,12,14, - 14, -}; - -static const static_codebook _44c7_s_p8_0 = { - 2, 225, - (char *)_vq_lengthlist__44c7_s_p8_0, - 1, -520986624, 1620377600, 4, 0, - (long *)_vq_quantlist__44c7_s_p8_0, - 0 -}; - -static const long _vq_quantlist__44c7_s_p8_1[] = { - 10, - 9, - 11, - 8, - 12, - 7, - 13, - 6, - 14, - 5, - 15, - 4, - 16, - 3, - 17, - 2, - 18, - 1, - 19, - 0, - 20, -}; - -static const char _vq_lengthlist__44c7_s_p8_1[] = { - 3, 5, 5, 7, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8,10, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 6, 6, 7, 7, 8, - 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, - 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9,10,10,10, 8, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, 8, 8, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10, - 10, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9,10,11,10,10,10, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9,10, 9, 9,10, 9, 9,10,11,10, - 11,10, 9, 9, 9, 9, 9, 9, 9,10,10,10, 9,10, 9, 9, - 9, 9,11,10,11,10,10, 9, 9, 9, 9, 9, 9,10, 9, 9, - 10, 9, 9,10, 9, 9,10,11,10,10,11,10, 9, 9, 9, 9, - 9,10,10, 9,10,10,10,10, 9,10,10,10,10,10,10,11, - 11,11,10, 9, 9, 9,10,10,10,10,10,10,10,10,10,10, - 10,10,10,11,11,10,10,10,10,10,10,10,10,10,10,10, - 10, 9,10,10, 9,10,11,11,10,11,10,11,10, 9,10,10, - 9,10,10,10,10,10,10,10,10,10,10,11,11,11,11,10, - 11,11,10,10,10,10,10,10, 9,10, 9,10,10, 9,10, 9, - 10,10,10,11,10,11,10,11,11,10,10,10,10,10,10, 9, - 10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,11,10,11, - 11,10,10,10,10, 9, 9,10,10, 9, 9,10, 9,10,10,10, - 10,11,11,10,10,10,10,10,10,10, 9, 9,10,10,10, 9, - 9,10,10,10,10,10,11,10,11,10,10,10,10,10,10, 9, - 10,10,10,10,10,10,10,10,10, -}; - -static const static_codebook _44c7_s_p8_1 = { - 2, 441, - (char *)_vq_lengthlist__44c7_s_p8_1, - 1, -529268736, 1611661312, 5, 0, - (long *)_vq_quantlist__44c7_s_p8_1, - 0 -}; - -static const long _vq_quantlist__44c7_s_p9_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44c7_s_p9_0[] = { - 1, 3, 3,11,11,11,11,11,11,11,11,11,11, 4, 6, 6, - 11,11,11,11,11,11,11,11,11,11, 4, 7, 7,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11, -}; - -static const static_codebook _44c7_s_p9_0 = { - 2, 169, - (char *)_vq_lengthlist__44c7_s_p9_0, - 1, -511845376, 1630791680, 4, 0, - (long *)_vq_quantlist__44c7_s_p9_0, - 0 -}; - -static const long _vq_quantlist__44c7_s_p9_1[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44c7_s_p9_1[] = { - 1, 4, 4, 7, 7, 7, 7, 7, 6, 8, 8, 8, 8, 6, 6, 6, - 8, 8, 9, 8, 8, 7, 9, 8,11,10, 5, 6, 6, 8, 8, 9, - 8, 8, 8,10, 9,11,11,16, 8, 8, 9, 8, 9, 9, 9, 8, - 10, 9,11,10,16, 8, 8, 9, 9,10,10, 9, 9,10,10,11, - 11,16,13,13, 9, 9,10,10, 9,10,11,11,12,11,16,13, - 13, 9, 8,10, 9,10,10,10,10,11,11,16,14,16, 8, 9, - 9, 9,11,10,11,11,12,11,16,16,16, 9, 7,10, 7,11, - 10,11,11,12,11,16,16,16,12,12, 9,10,11,11,12,11, - 12,12,16,16,16,12,10,10, 7,11, 8,12,11,12,12,16, - 16,15,16,16,11,12,10,10,12,11,12,12,16,16,16,15, - 15,11,11,10,10,12,12,12,12, -}; - -static const static_codebook _44c7_s_p9_1 = { - 2, 169, - (char *)_vq_lengthlist__44c7_s_p9_1, - 1, -518889472, 1622704128, 4, 0, - (long *)_vq_quantlist__44c7_s_p9_1, - 0 -}; - -static const long _vq_quantlist__44c7_s_p9_2[] = { - 24, - 23, - 25, - 22, - 26, - 21, - 27, - 20, - 28, - 19, - 29, - 18, - 30, - 17, - 31, - 16, - 32, - 15, - 33, - 14, - 34, - 13, - 35, - 12, - 36, - 11, - 37, - 10, - 38, - 9, - 39, - 8, - 40, - 7, - 41, - 6, - 42, - 5, - 43, - 4, - 44, - 3, - 45, - 2, - 46, - 1, - 47, - 0, - 48, -}; - -static const char _vq_lengthlist__44c7_s_p9_2[] = { - 2, 4, 3, 4, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, -}; - -static const static_codebook _44c7_s_p9_2 = { - 1, 49, - (char *)_vq_lengthlist__44c7_s_p9_2, - 1, -526909440, 1611661312, 6, 0, - (long *)_vq_quantlist__44c7_s_p9_2, - 0 -}; - -static const char _huff_lengthlist__44c7_s_short[] = { - 4,11,12,14,15,15,17,17,18,18, 5, 6, 6, 8, 9,10, - 13,17,18,19, 7, 5, 4, 6, 8, 9,11,15,19,19, 8, 6, - 5, 5, 6, 7,11,14,16,17, 9, 7, 7, 6, 7, 7,10,13, - 15,19,10, 8, 7, 6, 7, 6, 7, 9,14,16,12,10, 9, 7, - 7, 6, 4, 5,10,15,14,13,11, 7, 6, 6, 4, 2, 7,13, - 16,16,15, 9, 8, 8, 8, 6, 9,13,19,19,17,12,11,10, - 10, 9,11,14, -}; - -static const static_codebook _huff_book__44c7_s_short = { - 2, 100, - (char *)_huff_lengthlist__44c7_s_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44c8_s_long[] = { - 3, 8,12,13,14,14,14,13,14,14, 6, 4, 5, 8,10,10, - 11,11,14,13, 9, 5, 4, 5, 7, 8, 9,10,13,13,12, 7, - 5, 4, 5, 6, 8, 9,12,13,13, 9, 6, 5, 5, 5, 7, 9, - 11,14,12,10, 7, 6, 5, 4, 6, 7,10,11,12,11, 9, 8, - 7, 5, 5, 6,10,10,13,12,10, 9, 8, 6, 6, 5, 8,10, - 14,13,12,12,11,10, 9, 7, 8,10,12,13,14,14,13,12, - 11, 9, 9,10, -}; - -static const static_codebook _huff_book__44c8_s_long = { - 2, 100, - (char *)_huff_lengthlist__44c8_s_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44c8_s_p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44c8_s_p1_0[] = { - 1, 5, 5, 0, 5, 5, 0, 5, 5, 5, 7, 7, 0, 9, 8, 0, - 9, 8, 6, 7, 7, 0, 8, 9, 0, 8, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 9, 8, 0, 8, 8, 0, 8, 8, 5, 8, 9, - 0, 8, 8, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, - 9, 8, 0, 8, 8, 0, 8, 8, 5, 8, 9, 0, 8, 8, 0, 8, - 8, -}; - -static const static_codebook _44c8_s_p1_0 = { - 4, 81, - (char *)_vq_lengthlist__44c8_s_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44c8_s_p1_0, - 0 -}; - -static const long _vq_quantlist__44c8_s_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44c8_s_p2_0[] = { - 3, 5, 5, 8, 8, 0, 5, 5, 8, 8, 0, 5, 5, 8, 8, 0, - 7, 7, 9, 9, 0, 0, 0, 9, 9, 5, 7, 7, 9, 9, 0, 8, - 7,10, 9, 0, 8, 7,10, 9, 0,10,10,11,11, 0, 0, 0, - 11,11, 5, 7, 7, 9, 9, 0, 7, 8, 9,10, 0, 7, 8, 9, - 10, 0,10,10,11,11, 0, 0, 0,11,11, 8, 9, 9,11,10, - 0,11,10,12,11, 0,11,10,12,12, 0,13,13,14,14, 0, - 0, 0,14,13, 8, 9, 9,10,11, 0,10,11,12,12, 0,10, - 11,12,12, 0,13,13,14,14, 0, 0, 0,13,14, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 5, 8, 7,11,10, 0, 7, 7,10,10, - 0, 7, 7,10,10, 0, 9, 9,10,10, 0, 0, 0,11,10, 5, - 7, 8,10,11, 0, 7, 7,10,10, 0, 7, 7,10,10, 0, 9, - 9,10,10, 0, 0, 0,10,10, 8,10, 9,12,12, 0,10,10, - 12,11, 0,10,10,12,12, 0,12,12,13,12, 0, 0, 0,13, - 12, 8, 9,10,12,12, 0,10,10,11,12, 0,10,10,11,12, - 0,12,12,13,13, 0, 0, 0,12,13, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 6, 8, 7,11,10, 0, 7, 7,10,10, 0, 7, 7, - 10,10, 0, 9, 9,10,11, 0, 0, 0,10,10, 6, 7, 8,10, - 11, 0, 7, 7,10,10, 0, 7, 7,10,10, 0, 9, 9,10,10, - 0, 0, 0,10,10, 9,10, 9,12,12, 0,10,10,12,12, 0, - 10,10,12,11, 0,12,12,13,13, 0, 0, 0,13,12, 8, 9, - 10,12,12, 0,10,10,12,12, 0,10,10,11,12, 0,12,12, - 13,13, 0, 0, 0,12,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7,10,10,13,13, 0, 9, 9,12,12, 0, 9, 9,12,12, 0, - 10,10,12,12, 0, 0, 0,12,12, 7,10,10,13,13, 0, 9, - 9,12,12, 0, 9, 9,12,12, 0,10,10,12,12, 0, 0, 0, - 12,12, 9,11,11,14,13, 0,10,10,13,12, 0,11,10,13, - 12, 0,12,12,13,12, 0, 0, 0,13,13, 9,11,11,13,14, - 0,10,11,12,13, 0,10,11,13,13, 0,12,12,12,13, 0, - 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 11,11,14,14, 0,10,11,13,13, 0,11,10,13,13, 0,11, - 12,13,13, 0, 0, 0,13,12, 9,11,11,14,14, 0,11,10, - 13,13, 0,10,11,13,13, 0,12,12,13,13, 0, 0, 0,12, - 13, -}; - -static const static_codebook _44c8_s_p2_0 = { - 4, 625, - (char *)_vq_lengthlist__44c8_s_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c8_s_p2_0, - 0 -}; - -static const long _vq_quantlist__44c8_s_p3_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44c8_s_p3_0[] = { - 2, 4, 4, 5, 5, 7, 7, 9, 9, 0, 4, 4, 6, 6, 7, 7, - 9, 9, 0, 4, 4, 6, 6, 7, 7, 9, 9, 0, 5, 5, 6, 6, - 8, 8,10,10, 0, 0, 0, 6, 6, 8, 8,10,10, 0, 0, 0, - 7, 7, 9, 9,10,10, 0, 0, 0, 7, 7, 8, 8,10,10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c8_s_p3_0 = { - 2, 81, - (char *)_vq_lengthlist__44c8_s_p3_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c8_s_p3_0, - 0 -}; - -static const long _vq_quantlist__44c8_s_p4_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__44c8_s_p4_0[] = { - 3, 4, 4, 5, 5, 7, 7, 8, 8, 8, 8, 9, 9,10,10,11, - 11, 0, 4, 4, 6, 6, 7, 7, 8, 8, 9, 8,10,10,11,11, - 11,11, 0, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10,11, - 11,11,11, 0, 6, 5, 6, 6, 7, 7, 9, 9, 9, 9,10,10, - 11,11,12,12, 0, 0, 0, 6, 6, 7, 7, 9, 9, 9, 9,10, - 10,11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9,10,10, - 11,11,11,12,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9,10, - 10,11,11,11,12,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, - 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 8, 8, 9, - 9,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44c8_s_p4_0 = { - 2, 289, - (char *)_vq_lengthlist__44c8_s_p4_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c8_s_p4_0, - 0 -}; - -static const long _vq_quantlist__44c8_s_p5_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44c8_s_p5_0[] = { - 1, 4, 4, 5, 7, 7, 6, 7, 7, 4, 7, 6,10,10,10,10, - 10,10, 4, 6, 6,10,10,10,10, 9,10, 5,10,10, 9,11, - 11,10,11,11, 7,10,10,11,12,12,12,12,12, 7,10,10, - 11,12,12,12,12,12, 6,10,10,10,12,12,10,12,12, 7, - 10,10,11,12,12,12,12,12, 7,10,10,11,12,12,12,12, - 12, -}; - -static const static_codebook _44c8_s_p5_0 = { - 4, 81, - (char *)_vq_lengthlist__44c8_s_p5_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44c8_s_p5_0, - 0 -}; - -static const long _vq_quantlist__44c8_s_p5_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__44c8_s_p5_1[] = { - 3, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8,11, 4, 5, 6, 6, - 7, 7, 8, 8, 8, 8,11, 5, 5, 6, 6, 7, 7, 8, 8, 8, - 9,12, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,12,12,12, 6, - 6, 7, 7, 8, 8, 9, 9,11,11,11, 6, 6, 7, 7, 8, 8, - 8, 8,11,11,11, 6, 6, 7, 7, 8, 8, 8, 8,11,11,11, - 7, 7, 7, 8, 8, 8, 8, 8,11,11,11,11,11, 7, 7, 8, - 8, 8, 8,11,11,11,11,11, 7, 7, 7, 7, 8, 8,11,11, - 11,11,11, 7, 7, 7, 7, 8, 8, -}; - -static const static_codebook _44c8_s_p5_1 = { - 2, 121, - (char *)_vq_lengthlist__44c8_s_p5_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44c8_s_p5_1, - 0 -}; - -static const long _vq_quantlist__44c8_s_p6_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44c8_s_p6_0[] = { - 1, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10, 6, 5, 5, - 7, 7, 8, 8, 9, 9,10,10,11,11, 6, 5, 5, 7, 7, 8, - 8, 9, 9,10,10,11,11, 0, 7, 7, 7, 7, 9, 9,10,10, - 10,10,11,11, 0, 7, 7, 7, 7, 9, 9,10,10,10,10,11, - 11, 0,11,11, 9, 9,10,10,11,11,11,11,12,12, 0,12, - 12, 9, 9,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 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 static_codebook _44c8_s_p6_0 = { - 2, 169, - (char *)_vq_lengthlist__44c8_s_p6_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44c8_s_p6_0, - 0 -}; - -static const long _vq_quantlist__44c8_s_p6_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44c8_s_p6_1[] = { - 3, 4, 4, 5, 5, 5, 4, 4, 5, 5, 5, 4, 4, 5, 5, 6, - 5, 5, 5, 5, 6, 6, 6, 5, 5, -}; - -static const static_codebook _44c8_s_p6_1 = { - 2, 25, - (char *)_vq_lengthlist__44c8_s_p6_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c8_s_p6_1, - 0 -}; - -static const long _vq_quantlist__44c8_s_p7_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44c8_s_p7_0[] = { - 1, 4, 4, 6, 6, 8, 7, 9, 9,10,10,12,12, 6, 5, 5, - 7, 7, 8, 8,10,10,11,11,12,12, 7, 5, 5, 7, 7, 8, - 8,10,10,11,11,12,12,21, 7, 7, 7, 7, 8, 9,10,10, - 11,11,12,12,21, 7, 7, 7, 7, 9, 9,10,10,12,12,13, - 13,21,11,11, 8, 8, 9, 9,11,11,12,12,13,13,21,11, - 11, 8, 8, 9, 9,11,11,12,12,13,13,21,21,21,10,10, - 10,10,11,11,12,13,13,13,21,21,21,10,10,10,10,11, - 11,13,13,14,13,21,21,21,13,13,11,11,12,12,13,13, - 14,14,21,21,21,14,14,11,11,12,12,13,13,14,14,21, - 21,21,21,20,13,13,13,12,14,14,16,15,20,20,20,20, - 20,13,13,13,13,14,13,15,15, -}; - -static const static_codebook _44c8_s_p7_0 = { - 2, 169, - (char *)_vq_lengthlist__44c8_s_p7_0, - 1, -523206656, 1618345984, 4, 0, - (long *)_vq_quantlist__44c8_s_p7_0, - 0 -}; - -static const long _vq_quantlist__44c8_s_p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__44c8_s_p7_1[] = { - 4, 5, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 6, 6, 6, 7, - 7, 7, 7, 7, 7, 7, 8, 6, 6, 6, 6, 7, 7, 7, 7, 7, - 7, 8, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 7, - 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 7, 7, 7, 7, 7, 7, - 7, 7, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, - 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, - 7, 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 8, 8, - 8, 8, 8, 7, 7, 7, 7, 7, 7, -}; - -static const static_codebook _44c8_s_p7_1 = { - 2, 121, - (char *)_vq_lengthlist__44c8_s_p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44c8_s_p7_1, - 0 -}; - -static const long _vq_quantlist__44c8_s_p8_0[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const char _vq_lengthlist__44c8_s_p8_0[] = { - 1, 4, 4, 7, 6, 8, 8, 8, 7, 9, 8,10,10,11,10, 6, - 5, 5, 7, 7, 9, 9, 8, 8,10,10,11,11,12,11, 6, 5, - 5, 7, 7, 9, 9, 9, 9,10,10,11,11,12,12,20, 8, 8, - 8, 8, 9, 9, 9, 9,10,10,11,11,12,12,20, 8, 8, 8, - 8,10, 9, 9, 9,10,10,11,11,12,12,20,12,12, 9, 9, - 10,10,10,10,10,11,12,12,12,12,20,12,12, 9, 9,10, - 10,10,10,11,11,12,12,13,13,20,20,20, 9, 9, 9, 9, - 11,10,11,11,12,12,12,13,20,19,19, 9, 9, 9, 9,11, - 11,11,12,12,12,13,13,19,19,19,13,13,10,10,11,11, - 12,12,13,13,13,13,19,19,19,14,13,11,10,11,11,12, - 12,12,13,13,13,19,19,19,19,19,12,12,12,12,13,13, - 13,13,14,13,19,19,19,19,19,12,12,12,11,12,12,13, - 14,14,14,19,19,19,19,19,16,15,13,12,13,13,13,14, - 14,14,19,19,19,19,19,17,17,13,12,13,11,14,13,15, - 15, -}; - -static const static_codebook _44c8_s_p8_0 = { - 2, 225, - (char *)_vq_lengthlist__44c8_s_p8_0, - 1, -520986624, 1620377600, 4, 0, - (long *)_vq_quantlist__44c8_s_p8_0, - 0 -}; - -static const long _vq_quantlist__44c8_s_p8_1[] = { - 10, - 9, - 11, - 8, - 12, - 7, - 13, - 6, - 14, - 5, - 15, - 4, - 16, - 3, - 17, - 2, - 18, - 1, - 19, - 0, - 20, -}; - -static const char _vq_lengthlist__44c8_s_p8_1[] = { - 4, 5, 5, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8,10, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 6, 6, 7, 7, 8, - 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, - 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9,10,10,10, 8, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, 8, 8, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10, - 10, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, - 10,10, 9, 9, 9, 9, 9, 9, 9, 9,10, 9, 9, 9, 9, 9, - 9, 9,10,10,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10, 9, 9, 9, 9, - 9, 9, 9, 9,10,10,10, 9, 9, 9, 9, 9,10,10,10,10, - 10,10,10, 9, 9, 9, 9, 9,10,10,10, 9, 9, 9, 9, 9, - 9,10,10,10,10,10,10,10, 9,10,10, 9,10,10,10,10, - 9,10, 9,10,10, 9,10,10,10,10,10,10,10, 9,10,10, - 10,10,10,10, 9, 9,10,10, 9,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, 9, 9, 9,10, 9, 9, 9, 9, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, - 10, 9,10, 9,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10, 9, 9,10, 9, 9, 9,10,10,10,10,10,10, - 10,10,10,10,10, 9, 9, 9, 9, 9, 9,10, 9, 9,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10, 9,10, 9, - 9,10, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10, - 10, 9, 9,10,10, 9,10, 9, 9, -}; - -static const static_codebook _44c8_s_p8_1 = { - 2, 441, - (char *)_vq_lengthlist__44c8_s_p8_1, - 1, -529268736, 1611661312, 5, 0, - (long *)_vq_quantlist__44c8_s_p8_1, - 0 -}; - -static const long _vq_quantlist__44c8_s_p9_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__44c8_s_p9_0[] = { - 1, 4, 3,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11, 4, 7, 7,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11, 4, 8,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10, -}; - -static const static_codebook _44c8_s_p9_0 = { - 2, 289, - (char *)_vq_lengthlist__44c8_s_p9_0, - 1, -509798400, 1631393792, 5, 0, - (long *)_vq_quantlist__44c8_s_p9_0, - 0 -}; - -static const long _vq_quantlist__44c8_s_p9_1[] = { - 9, - 8, - 10, - 7, - 11, - 6, - 12, - 5, - 13, - 4, - 14, - 3, - 15, - 2, - 16, - 1, - 17, - 0, - 18, -}; - -static const char _vq_lengthlist__44c8_s_p9_1[] = { - 1, 4, 4, 7, 6, 7, 7, 7, 7, 8, 8, 9, 9,10,10,10, - 10,11,11, 6, 6, 6, 8, 8, 9, 8, 8, 7,10, 8,11,10, - 12,11,12,12,13,13, 5, 5, 6, 8, 8, 9, 9, 8, 8,10, - 9,11,11,12,12,13,13,13,13,17, 8, 8, 9, 9, 9, 9, - 9, 9,10, 9,12,10,12,12,13,12,13,13,17, 9, 8, 9, - 9, 9, 9, 9, 9,10,10,12,12,12,12,13,13,13,13,17, - 13,13, 9, 9,10,10,10,10,11,11,12,11,13,12,13,13, - 14,15,17,13,13, 9, 8,10, 9,10,10,11,11,12,12,14, - 13,15,13,14,15,17,17,17, 9,10, 9,10,11,11,12,12, - 12,12,13,13,14,14,15,15,17,17,17, 9, 8, 9, 8,11, - 11,12,12,12,12,14,13,14,14,14,15,17,17,17,12,14, - 9,10,11,11,12,12,14,13,13,14,15,13,15,15,17,17, - 17,13,11,10, 8,11, 9,13,12,13,13,13,13,13,14,14, - 14,17,17,17,17,17,11,12,11,11,13,13,14,13,15,14, - 13,15,16,15,17,17,17,17,17,11,11,12, 8,13,12,14, - 13,17,14,15,14,15,14,17,17,17,17,17,15,15,12,12, - 12,12,13,14,14,14,15,14,17,14,17,17,17,17,17,16, - 17,12,12,13,12,13,13,14,14,14,14,14,14,17,17,17, - 17,17,17,17,14,14,13,12,13,13,15,15,14,13,15,17, - 17,17,17,17,17,17,17,13,14,13,13,13,13,14,15,15, - 15,14,15,17,17,17,17,17,17,17,16,15,13,14,13,13, - 14,14,15,14,14,16,17,17,17,17,17,17,17,16,16,13, - 14,13,13,14,14,15,14,15,14, -}; - -static const static_codebook _44c8_s_p9_1 = { - 2, 361, - (char *)_vq_lengthlist__44c8_s_p9_1, - 1, -518287360, 1622704128, 5, 0, - (long *)_vq_quantlist__44c8_s_p9_1, - 0 -}; - -static const long _vq_quantlist__44c8_s_p9_2[] = { - 24, - 23, - 25, - 22, - 26, - 21, - 27, - 20, - 28, - 19, - 29, - 18, - 30, - 17, - 31, - 16, - 32, - 15, - 33, - 14, - 34, - 13, - 35, - 12, - 36, - 11, - 37, - 10, - 38, - 9, - 39, - 8, - 40, - 7, - 41, - 6, - 42, - 5, - 43, - 4, - 44, - 3, - 45, - 2, - 46, - 1, - 47, - 0, - 48, -}; - -static const char _vq_lengthlist__44c8_s_p9_2[] = { - 2, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, -}; - -static const static_codebook _44c8_s_p9_2 = { - 1, 49, - (char *)_vq_lengthlist__44c8_s_p9_2, - 1, -526909440, 1611661312, 6, 0, - (long *)_vq_quantlist__44c8_s_p9_2, - 0 -}; - -static const char _huff_lengthlist__44c8_s_short[] = { - 4,11,13,14,15,15,18,17,19,17, 5, 6, 8, 9,10,10, - 12,15,19,19, 6, 6, 6, 6, 8, 8,11,14,18,19, 8, 6, - 5, 4, 6, 7,10,13,16,17, 9, 7, 6, 5, 6, 7, 9,12, - 15,19,10, 8, 7, 6, 6, 6, 7, 9,13,15,12,10, 9, 8, - 7, 6, 4, 5,10,15,13,13,11, 8, 6, 6, 4, 2, 7,12, - 17,15,16,10, 8, 8, 7, 6, 9,12,19,18,17,13,11,10, - 10, 9,11,14, -}; - -static const static_codebook _huff_book__44c8_s_short = { - 2, 100, - (char *)_huff_lengthlist__44c8_s_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44c9_s_long[] = { - 3, 8,12,14,15,15,15,13,15,15, 6, 5, 8,10,12,12, - 13,12,14,13,10, 6, 5, 6, 8, 9,11,11,13,13,13, 8, - 5, 4, 5, 6, 8,10,11,13,14,10, 7, 5, 4, 5, 7, 9, - 11,12,13,11, 8, 6, 5, 4, 5, 7, 9,11,12,11,10, 8, - 7, 5, 4, 5, 9,10,13,13,11,10, 8, 6, 5, 4, 7, 9, - 15,14,13,12,10, 9, 8, 7, 8, 9,12,12,14,13,12,11, - 10, 9, 8, 9, -}; - -static const static_codebook _huff_book__44c9_s_long = { - 2, 100, - (char *)_huff_lengthlist__44c9_s_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44c9_s_p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44c9_s_p1_0[] = { - 1, 5, 5, 0, 5, 5, 0, 5, 5, 6, 8, 8, 0, 9, 8, 0, - 9, 8, 6, 8, 8, 0, 8, 9, 0, 8, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 8, 8, 0, 7, 7, 0, 8, 8, 5, 8, 8, - 0, 7, 8, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, - 9, 8, 0, 8, 8, 0, 7, 7, 5, 8, 9, 0, 8, 8, 0, 7, - 7, -}; - -static const static_codebook _44c9_s_p1_0 = { - 4, 81, - (char *)_vq_lengthlist__44c9_s_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44c9_s_p1_0, - 0 -}; - -static const long _vq_quantlist__44c9_s_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44c9_s_p2_0[] = { - 3, 5, 5, 8, 8, 0, 5, 5, 8, 8, 0, 5, 5, 8, 8, 0, - 7, 7, 9, 9, 0, 0, 0, 9, 9, 6, 7, 7, 9, 8, 0, 8, - 8, 9, 9, 0, 8, 7, 9, 9, 0, 9,10,10,10, 0, 0, 0, - 11,10, 6, 7, 7, 8, 9, 0, 8, 8, 9, 9, 0, 7, 8, 9, - 9, 0,10, 9,11,10, 0, 0, 0,10,10, 8, 9, 8,10,10, - 0,10,10,12,11, 0,10,10,11,11, 0,12,13,13,13, 0, - 0, 0,13,12, 8, 8, 9,10,10, 0,10,10,11,12, 0,10, - 10,11,11, 0,13,12,13,13, 0, 0, 0,13,13, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 6, 8, 7,10,10, 0, 7, 7,10, 9, - 0, 7, 7,10,10, 0, 9, 9,10,10, 0, 0, 0,10,10, 6, - 7, 8,10,10, 0, 7, 7, 9,10, 0, 7, 7,10,10, 0, 9, - 9,10,10, 0, 0, 0,10,10, 8, 9, 9,11,11, 0,10,10, - 11,11, 0,10,10,11,11, 0,12,12,12,12, 0, 0, 0,12, - 12, 8, 9,10,11,11, 0, 9,10,11,11, 0,10,10,11,11, - 0,12,12,12,12, 0, 0, 0,12,12, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 5, 8, 7,10,10, 0, 7, 7,10,10, 0, 7, 7, - 10, 9, 0, 9, 9,10,10, 0, 0, 0,10,10, 6, 7, 8,10, - 10, 0, 7, 7,10,10, 0, 7, 7, 9,10, 0, 9, 9,10,10, - 0, 0, 0,10,10, 8,10, 9,12,11, 0,10,10,12,11, 0, - 10, 9,11,11, 0,11,12,12,12, 0, 0, 0,12,12, 8, 9, - 10,11,12, 0,10,10,11,11, 0, 9,10,11,11, 0,12,11, - 12,12, 0, 0, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7,10, 9,12,12, 0, 9, 9,12,11, 0, 9, 9,11,11, 0, - 10,10,12,11, 0, 0, 0,11,12, 7, 9,10,12,12, 0, 9, - 9,11,12, 0, 9, 9,11,11, 0,10,10,11,12, 0, 0, 0, - 11,11, 9,11,10,13,12, 0,10,10,12,12, 0,10,10,12, - 12, 0,11,11,12,12, 0, 0, 0,13,12, 9,10,11,12,13, - 0,10,10,12,12, 0,10,10,12,12, 0,11,12,12,12, 0, - 0, 0,12,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 11,10,13,13, 0,10,10,12,12, 0,10,10,12,12, 0,11, - 12,12,12, 0, 0, 0,12,12, 9,10,11,13,13, 0,10,10, - 12,12, 0,10,10,12,12, 0,12,11,13,12, 0, 0, 0,12, - 12, -}; - -static const static_codebook _44c9_s_p2_0 = { - 4, 625, - (char *)_vq_lengthlist__44c9_s_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c9_s_p2_0, - 0 -}; - -static const long _vq_quantlist__44c9_s_p3_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44c9_s_p3_0[] = { - 3, 4, 4, 5, 5, 6, 6, 8, 8, 0, 4, 4, 5, 5, 6, 7, - 8, 8, 0, 4, 4, 5, 5, 7, 7, 8, 8, 0, 5, 5, 6, 6, - 7, 7, 9, 9, 0, 0, 0, 6, 6, 7, 7, 9, 9, 0, 0, 0, - 7, 7, 8, 8, 9, 9, 0, 0, 0, 7, 7, 8, 8, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c9_s_p3_0 = { - 2, 81, - (char *)_vq_lengthlist__44c9_s_p3_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c9_s_p3_0, - 0 -}; - -static const long _vq_quantlist__44c9_s_p4_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__44c9_s_p4_0[] = { - 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,10,10,10, - 10, 0, 5, 4, 5, 5, 7, 7, 8, 8, 8, 8, 9, 9,10,10, - 11,11, 0, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10, - 10,11,11, 0, 6, 5, 6, 6, 7, 7, 8, 8, 9, 9,10,10, - 11,11,11,12, 0, 0, 0, 6, 6, 7, 7, 8, 8, 9, 9,10, - 10,11,11,12,12, 0, 0, 0, 7, 7, 7, 7, 9, 9, 9, 9, - 10,10,11,11,12,12, 0, 0, 0, 7, 7, 7, 8, 9, 9, 9, - 9,10,10,11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, - 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 8, 8, 9, - 9,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44c9_s_p4_0 = { - 2, 289, - (char *)_vq_lengthlist__44c9_s_p4_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c9_s_p4_0, - 0 -}; - -static const long _vq_quantlist__44c9_s_p5_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44c9_s_p5_0[] = { - 1, 4, 4, 5, 7, 7, 6, 7, 7, 4, 7, 6, 9,10,10,10, - 10, 9, 4, 6, 7, 9,10,10,10, 9,10, 5, 9, 9, 9,11, - 11,10,11,11, 7,10, 9,11,12,11,12,12,12, 7, 9,10, - 11,11,12,12,12,12, 6,10,10,10,12,12,10,12,11, 7, - 10,10,11,12,12,11,12,12, 7,10,10,11,12,12,12,12, - 12, -}; - -static const static_codebook _44c9_s_p5_0 = { - 4, 81, - (char *)_vq_lengthlist__44c9_s_p5_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44c9_s_p5_0, - 0 -}; - -static const long _vq_quantlist__44c9_s_p5_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__44c9_s_p5_1[] = { - 4, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7,11, 5, 5, 6, 6, - 7, 7, 7, 7, 8, 8,11, 5, 5, 6, 6, 7, 7, 7, 7, 8, - 8,11, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8,11,11,11, 6, - 6, 7, 7, 7, 8, 8, 8,11,11,11, 6, 6, 7, 7, 7, 8, - 8, 8,11,11,11, 6, 6, 7, 7, 7, 7, 8, 8,11,11,11, - 7, 7, 7, 7, 7, 7, 8, 8,11,11,11,10,10, 7, 7, 7, - 7, 8, 8,11,11,11,11,11, 7, 7, 7, 7, 7, 7,11,11, - 11,11,11, 7, 7, 7, 7, 7, 7, -}; - -static const static_codebook _44c9_s_p5_1 = { - 2, 121, - (char *)_vq_lengthlist__44c9_s_p5_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44c9_s_p5_1, - 0 -}; - -static const long _vq_quantlist__44c9_s_p6_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44c9_s_p6_0[] = { - 2, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 5, 4, 4, - 6, 6, 8, 8, 9, 9, 9, 9,10,10, 6, 4, 4, 6, 6, 8, - 8, 9, 9, 9, 9,10,10, 0, 6, 6, 7, 7, 8, 8, 9, 9, - 10,10,11,11, 0, 6, 6, 7, 7, 8, 8, 9, 9,10,10,11, - 11, 0,10,10, 8, 8, 9, 9,10,10,11,11,12,12, 0,11, - 11, 8, 8, 9, 9,10,10,11,11,12,12, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 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 static_codebook _44c9_s_p6_0 = { - 2, 169, - (char *)_vq_lengthlist__44c9_s_p6_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44c9_s_p6_0, - 0 -}; - -static const long _vq_quantlist__44c9_s_p6_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44c9_s_p6_1[] = { - 4, 4, 4, 5, 5, 5, 4, 4, 5, 5, 5, 4, 4, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44c9_s_p6_1 = { - 2, 25, - (char *)_vq_lengthlist__44c9_s_p6_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c9_s_p6_1, - 0 -}; - -static const long _vq_quantlist__44c9_s_p7_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44c9_s_p7_0[] = { - 2, 4, 4, 6, 6, 7, 7, 8, 8,10,10,11,11, 6, 4, 4, - 6, 6, 8, 8, 9, 9,10,10,12,12, 6, 4, 5, 6, 6, 8, - 8, 9, 9,10,10,12,12,20, 6, 6, 6, 6, 8, 8, 9,10, - 11,11,12,12,20, 6, 6, 6, 6, 8, 8,10,10,11,11,12, - 12,20,10,10, 7, 7, 9, 9,10,10,11,11,12,12,20,11, - 11, 7, 7, 9, 9,10,10,11,11,12,12,20,20,20, 9, 9, - 9, 9,11,11,12,12,13,13,20,20,20, 9, 9, 9, 9,11, - 11,12,12,13,13,20,20,20,13,13,10,10,11,11,12,13, - 13,13,20,20,20,13,13,10,10,11,11,12,13,13,13,20, - 20,20,20,19,12,12,12,12,13,13,14,15,19,19,19,19, - 19,12,12,12,12,13,13,14,14, -}; - -static const static_codebook _44c9_s_p7_0 = { - 2, 169, - (char *)_vq_lengthlist__44c9_s_p7_0, - 1, -523206656, 1618345984, 4, 0, - (long *)_vq_quantlist__44c9_s_p7_0, - 0 -}; - -static const long _vq_quantlist__44c9_s_p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__44c9_s_p7_1[] = { - 5, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, - 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 7, 7, 7, 7, 7, - 7, 8, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 6, - 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 7, 7, 7, 7, 7, 7, - 7, 7, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, - 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, - 7, 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 8, 8, - 8, 8, 8, 7, 7, 7, 7, 7, 7, -}; - -static const static_codebook _44c9_s_p7_1 = { - 2, 121, - (char *)_vq_lengthlist__44c9_s_p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44c9_s_p7_1, - 0 -}; - -static const long _vq_quantlist__44c9_s_p8_0[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const char _vq_lengthlist__44c9_s_p8_0[] = { - 1, 4, 4, 7, 6, 8, 8, 8, 8, 9, 9,10,10,11,10, 6, - 5, 5, 7, 7, 9, 9, 8, 9,10,10,11,11,12,12, 6, 5, - 5, 7, 7, 9, 9, 9, 9,10,10,11,11,12,12,21, 7, 8, - 8, 8, 9, 9, 9, 9,10,10,11,11,12,12,21, 8, 8, 8, - 8, 9, 9, 9, 9,10,10,11,11,12,12,21,11,12, 9, 9, - 10,10,10,10,10,11,11,12,12,12,21,12,12, 9, 8,10, - 10,10,10,11,11,12,12,13,13,21,21,21, 9, 9, 9, 9, - 11,11,11,11,12,12,12,13,21,20,20, 9, 9, 9, 9,10, - 11,11,11,12,12,13,13,20,20,20,13,13,10,10,11,11, - 12,12,13,13,13,13,20,20,20,13,13,10,10,11,11,12, - 12,13,13,13,13,20,20,20,20,20,12,12,12,12,12,12, - 13,13,14,14,20,20,20,20,20,12,12,12,11,13,12,13, - 13,14,14,20,20,20,20,20,15,16,13,12,13,13,14,13, - 14,14,20,20,20,20,20,16,15,12,12,13,12,14,13,14, - 14, -}; - -static const static_codebook _44c9_s_p8_0 = { - 2, 225, - (char *)_vq_lengthlist__44c9_s_p8_0, - 1, -520986624, 1620377600, 4, 0, - (long *)_vq_quantlist__44c9_s_p8_0, - 0 -}; - -static const long _vq_quantlist__44c9_s_p8_1[] = { - 10, - 9, - 11, - 8, - 12, - 7, - 13, - 6, - 14, - 5, - 15, - 4, - 16, - 3, - 17, - 2, - 18, - 1, - 19, - 0, - 20, -}; - -static const char _vq_lengthlist__44c9_s_p8_1[] = { - 4, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8,10, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 6, 6, 7, 7, 8, - 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, - 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9,10,10,10, 8, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, 8, 8, 8, 8, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10, - 10, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, - 10,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9,10,10,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9,10, 9, 9, 9,10,10,10,10, - 10,10,10, 9, 9, 9, 9, 9, 9,10, 9, 9, 9, 9, 9, 9, - 9,10,10,10,10,10,10,10, 9, 9, 9,10,10,10,10,10, - 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10, 9, 9,10, - 9,10, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10, - 10,10,10,10, 9, 9,10,10, 9, 9, 9, 9, 9, 9, 9, 9, - 10,10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, - 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10, - 10,10, 9, 9,10, 9, 9, 9, 9, 9,10,10,10,10,10,10, - 10,10,10,10,10, 9, 9,10,10, 9, 9,10, 9, 9, 9,10, - 10,10,10,10,10,10,10,10,10,10, 9, 9,10, 9, 9, 9, - 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10, 9, - 9, 9, 9,10, 9, 9, 9, 9, 9, -}; - -static const static_codebook _44c9_s_p8_1 = { - 2, 441, - (char *)_vq_lengthlist__44c9_s_p8_1, - 1, -529268736, 1611661312, 5, 0, - (long *)_vq_quantlist__44c9_s_p8_1, - 0 -}; - -static const long _vq_quantlist__44c9_s_p9_0[] = { - 9, - 8, - 10, - 7, - 11, - 6, - 12, - 5, - 13, - 4, - 14, - 3, - 15, - 2, - 16, - 1, - 17, - 0, - 18, -}; - -static const char _vq_lengthlist__44c9_s_p9_0[] = { - 1, 4, 3,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12, 4, 5, 6,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12, 4, 6, 6,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,11,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11, -}; - -static const static_codebook _44c9_s_p9_0 = { - 2, 361, - (char *)_vq_lengthlist__44c9_s_p9_0, - 1, -508535424, 1631393792, 5, 0, - (long *)_vq_quantlist__44c9_s_p9_0, - 0 -}; - -static const long _vq_quantlist__44c9_s_p9_1[] = { - 9, - 8, - 10, - 7, - 11, - 6, - 12, - 5, - 13, - 4, - 14, - 3, - 15, - 2, - 16, - 1, - 17, - 0, - 18, -}; - -static const char _vq_lengthlist__44c9_s_p9_1[] = { - 1, 4, 4, 7, 7, 7, 7, 8, 7, 9, 8, 9, 9,10,10,11, - 11,11,11, 6, 5, 5, 8, 8, 9, 9, 9, 8,10, 9,11,10, - 12,12,13,12,13,13, 5, 5, 5, 8, 8, 9, 9, 9, 9,10, - 10,11,11,12,12,13,12,13,13,17, 8, 8, 9, 9, 9, 9, - 9, 9,10,10,12,11,13,12,13,13,13,13,18, 8, 8, 9, - 9, 9, 9, 9, 9,11,11,12,12,13,13,13,13,13,13,17, - 13,12, 9, 9,10,10,10,10,11,11,12,12,12,13,13,13, - 14,14,18,13,12, 9, 9,10,10,10,10,11,11,12,12,13, - 13,13,14,14,14,17,18,18,10,10,10,10,11,11,11,12, - 12,12,14,13,14,13,13,14,18,18,18,10, 9,10, 9,11, - 11,12,12,12,12,13,13,15,14,14,14,18,18,16,13,14, - 10,11,11,11,12,13,13,13,13,14,13,13,14,14,18,18, - 18,14,12,11, 9,11,10,13,12,13,13,13,14,14,14,13, - 14,18,18,17,18,18,11,12,12,12,13,13,14,13,14,14, - 13,14,14,14,18,18,18,18,17,12,10,12, 9,13,11,13, - 14,14,14,14,14,15,14,18,18,17,17,18,14,15,12,13, - 13,13,14,13,14,14,15,14,15,14,18,17,18,18,18,15, - 15,12,10,14,10,14,14,13,13,14,14,14,14,18,16,18, - 18,18,18,17,14,14,13,14,14,13,13,14,14,14,15,15, - 18,18,18,18,17,17,17,14,14,14,12,14,13,14,14,15, - 14,15,14,18,18,18,18,18,18,18,17,16,13,13,13,14, - 14,14,14,15,16,15,18,18,18,18,18,18,18,17,17,13, - 13,13,13,14,13,14,15,15,15, -}; - -static const static_codebook _44c9_s_p9_1 = { - 2, 361, - (char *)_vq_lengthlist__44c9_s_p9_1, - 1, -518287360, 1622704128, 5, 0, - (long *)_vq_quantlist__44c9_s_p9_1, - 0 -}; - -static const long _vq_quantlist__44c9_s_p9_2[] = { - 24, - 23, - 25, - 22, - 26, - 21, - 27, - 20, - 28, - 19, - 29, - 18, - 30, - 17, - 31, - 16, - 32, - 15, - 33, - 14, - 34, - 13, - 35, - 12, - 36, - 11, - 37, - 10, - 38, - 9, - 39, - 8, - 40, - 7, - 41, - 6, - 42, - 5, - 43, - 4, - 44, - 3, - 45, - 2, - 46, - 1, - 47, - 0, - 48, -}; - -static const char _vq_lengthlist__44c9_s_p9_2[] = { - 2, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, -}; - -static const static_codebook _44c9_s_p9_2 = { - 1, 49, - (char *)_vq_lengthlist__44c9_s_p9_2, - 1, -526909440, 1611661312, 6, 0, - (long *)_vq_quantlist__44c9_s_p9_2, - 0 -}; - -static const char _huff_lengthlist__44c9_s_short[] = { - 5,13,18,16,17,17,19,18,19,19, 5, 7,10,11,12,12, - 13,16,17,18, 6, 6, 7, 7, 9, 9,10,14,17,19, 8, 7, - 6, 5, 6, 7, 9,12,19,17, 8, 7, 7, 6, 5, 6, 8,11, - 15,19, 9, 8, 7, 6, 5, 5, 6, 8,13,15,11,10, 8, 8, - 7, 5, 4, 4,10,14,12,13,11, 9, 7, 6, 4, 2, 6,12, - 18,16,16,13, 8, 7, 7, 5, 8,13,16,17,18,15,11, 9, - 9, 8,10,13, -}; - -static const static_codebook _huff_book__44c9_s_short = { - 2, 100, - (char *)_huff_lengthlist__44c9_s_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44c0_s_long[] = { - 5, 4, 8, 9, 8, 9,10,12,15, 4, 1, 5, 5, 6, 8,11, - 12,12, 8, 5, 8, 9, 9,11,13,12,12, 9, 5, 8, 5, 7, - 9,12,13,13, 8, 6, 8, 7, 7, 9,11,11,11, 9, 7, 9, - 7, 7, 7, 7,10,12,10,10,11, 9, 8, 7, 7, 9,11,11, - 12,13,12,11, 9, 8, 9,11,13,16,16,15,15,12,10,11, - 12, -}; - -static const static_codebook _huff_book__44c0_s_long = { - 2, 81, - (char *)_huff_lengthlist__44c0_s_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44c0_s_p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44c0_s_p1_0[] = { - 1, 5, 5, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 8, 7, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, - 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, - 0, 0, 8,10, 9, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, - 0, 0, 0, 9,10,11, 0, 0, 0, 0, 0, 0, 9,11,10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 9,11, 9, 0, 0, 0, 0, 0, 0, 9,10,11, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,11,10, 0, - 0, 0, 0, 0, 0, 9, 9,11, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 9,10, 0, 0, 0, 0, 0, 0, 9,10,11, - 0, 0, 0, 0, 0, 0, 9,11,10, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44c0_s_p1_0 = { - 8, 6561, - (char *)_vq_lengthlist__44c0_s_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44c0_s_p1_0, - 0 -}; - -static const long _vq_quantlist__44c0_s_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44c0_s_p2_0[] = { - 1, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 5, 7, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 5, 6, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 7, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 7, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44c0_s_p2_0 = { - 4, 625, - (char *)_vq_lengthlist__44c0_s_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c0_s_p2_0, - 0 -}; - -static const long _vq_quantlist__44c0_s_p3_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44c0_s_p3_0[] = { - 1, 3, 2, 8, 7, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, - 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 7, 7, - 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, - 8, 8, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c0_s_p3_0 = { - 2, 81, - (char *)_vq_lengthlist__44c0_s_p3_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c0_s_p3_0, - 0 -}; - -static const long _vq_quantlist__44c0_s_p4_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44c0_s_p4_0[] = { - 1, 3, 3, 6, 6, 6, 6, 8, 8, 0, 0, 0, 7, 7, 7, 7, - 9, 9, 0, 0, 0, 7, 7, 7, 7, 9, 9, 0, 0, 0, 7, 7, - 7, 8, 9, 9, 0, 0, 0, 7, 7, 7, 7, 9, 9, 0, 0, 0, - 9, 9, 8, 8,10,10, 0, 0, 0, 8, 9, 8, 8,10,10, 0, - 0, 0,10,10, 9, 9,10,10, 0, 0, 0, 0, 0, 9, 9,10, - 10, -}; - -static const static_codebook _44c0_s_p4_0 = { - 2, 81, - (char *)_vq_lengthlist__44c0_s_p4_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c0_s_p4_0, - 0 -}; - -static const long _vq_quantlist__44c0_s_p5_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__44c0_s_p5_0[] = { - 1, 4, 3, 6, 6, 8, 7, 8, 8, 8, 8, 9, 9,10,10,11, - 11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9, 9,10,10,10, - 11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10, - 10,11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10, - 11,11,11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, - 10,11,11,11,11, 0, 0, 0, 8, 8, 9, 9, 9, 9,10,10, - 10,10,11,11,12,12, 0, 0, 0, 8, 8, 9, 9, 9, 9,10, - 10,10,10,11,11,12,12, 0, 0, 0, 9, 9, 9, 9,10,10, - 10,10,11,11,11,12,12,12, 0, 0, 0, 0, 0, 9, 9,10, - 10,10,10,11,11,11,11,12,12, 0, 0, 0, 0, 0, 9, 9, - 10,10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, - 9,10,10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, - 10,10,11,11,11,11,11,12,12,12,13,13, 0, 0, 0, 0, - 0, 0, 0,11,10,11,11,11,11,12,12,13,13, 0, 0, 0, - 0, 0, 0, 0,11,11,12,11,12,12,12,12,13,13, 0, 0, - 0, 0, 0, 0, 0,11,11,11,12,12,12,12,13,13,13, 0, - 0, 0, 0, 0, 0, 0,12,12,12,12,12,13,13,13,14,14, - 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,14, - 14, -}; - -static const static_codebook _44c0_s_p5_0 = { - 2, 289, - (char *)_vq_lengthlist__44c0_s_p5_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c0_s_p5_0, - 0 -}; - -static const long _vq_quantlist__44c0_s_p6_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44c0_s_p6_0[] = { - 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,10, - 9, 9, 4, 6, 7,10, 9, 9,11, 9, 9, 7,10,10,11,11, - 11,12,10,11, 6, 9, 9,11,10,11,11,10,10, 6, 9, 9, - 11,10,11,11,10,10, 7,11,10,12,11,11,11,11,11, 7, - 9, 9,10,10,10,11,11,10, 6, 9, 9,11,10,10,11,10, - 10, -}; - -static const static_codebook _44c0_s_p6_0 = { - 4, 81, - (char *)_vq_lengthlist__44c0_s_p6_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44c0_s_p6_0, - 0 -}; - -static const long _vq_quantlist__44c0_s_p6_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__44c0_s_p6_1[] = { - 2, 3, 3, 6, 6, 7, 7, 7, 7, 7, 8,10,10,10, 6, 6, - 7, 7, 8, 8, 8, 8,10,10,10, 6, 6, 7, 7, 8, 8, 8, - 8,10,10,10, 7, 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, - 7, 7, 7, 8, 8, 8, 8,10,10,10, 8, 7, 8, 8, 8, 8, - 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, - 8, 8, 8, 8, 8, 8, 8, 8,10,10,10,10,10, 8, 8, 8, - 8, 8, 8,10,10,10,10,10, 9, 9, 8, 8, 8, 8,10,10, - 10,10,10, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _44c0_s_p6_1 = { - 2, 121, - (char *)_vq_lengthlist__44c0_s_p6_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44c0_s_p6_1, - 0 -}; - -static const long _vq_quantlist__44c0_s_p7_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44c0_s_p7_0[] = { - 1, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 7, 5, 5, - 7, 7, 8, 8, 8, 8, 9, 9,10,10, 7, 5, 6, 7, 7, 8, - 8, 8, 8, 9, 9,10,10, 0, 8, 8, 8, 8, 9, 9, 9, 9, - 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, - 11, 0,12,12, 9, 9,10,10,10,10,11,11,11,11, 0,13, - 13, 9, 9, 9, 9,10,10,11,11,11,12, 0, 0, 0,10,10, - 10,10,11,11,11,11,12,12, 0, 0, 0,10,10, 9, 9,11, - 11,11,12,12,12, 0, 0, 0,13,13,10,10,11,11,12,12, - 13,13, 0, 0, 0,14,14,10,10,11,11,12,12,13,13, 0, - 0, 0, 0, 0,11,11,11,11,13,12,13,13, 0, 0, 0, 0, - 0,12,12,11,11,12,12,13,13, -}; - -static const static_codebook _44c0_s_p7_0 = { - 2, 169, - (char *)_vq_lengthlist__44c0_s_p7_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44c0_s_p7_0, - 0 -}; - -static const long _vq_quantlist__44c0_s_p7_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44c0_s_p7_1[] = { - 2, 3, 3, 5, 5, 6, 6, 6, 5, 5, 6, 6, 6, 5, 5, 6, - 6, 6, 5, 5, 6, 6, 6, 5, 5, -}; - -static const static_codebook _44c0_s_p7_1 = { - 2, 25, - (char *)_vq_lengthlist__44c0_s_p7_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c0_s_p7_1, - 0 -}; - -static const long _vq_quantlist__44c0_s_p8_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44c0_s_p8_0[] = { - 1, 5, 5,10,10, 6, 9, 8,10,10, 6,10, 9,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10, 8,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11, -}; - -static const static_codebook _44c0_s_p8_0 = { - 4, 625, - (char *)_vq_lengthlist__44c0_s_p8_0, - 1, -518283264, 1627103232, 3, 0, - (long *)_vq_quantlist__44c0_s_p8_0, - 0 -}; - -static const long _vq_quantlist__44c0_s_p8_1[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44c0_s_p8_1[] = { - 1, 4, 4, 6, 6, 7, 7, 9, 9,11,12,13,12, 6, 5, 5, - 7, 7, 8, 8,10, 9,12,12,12,12, 6, 5, 5, 7, 7, 8, - 8,10, 9,12,11,11,13,16, 7, 7, 8, 8, 9, 9,10,10, - 12,12,13,12,16, 7, 7, 8, 7, 9, 9,10,10,11,12,12, - 13,16,10,10, 8, 8,10,10,11,12,12,12,13,13,16,11, - 10, 8, 7,11,10,11,11,12,11,13,13,16,16,16,10,10, - 10,10,11,11,13,12,13,13,16,16,16,11, 9,11, 9,15, - 13,12,13,13,13,16,16,16,15,13,11,11,12,13,12,12, - 14,13,16,16,16,14,13,11,11,13,12,14,13,13,13,16, - 16,16,16,16,13,13,13,12,14,13,14,14,16,16,16,16, - 16,13,13,12,12,14,14,15,13, -}; - -static const static_codebook _44c0_s_p8_1 = { - 2, 169, - (char *)_vq_lengthlist__44c0_s_p8_1, - 1, -522616832, 1620115456, 4, 0, - (long *)_vq_quantlist__44c0_s_p8_1, - 0 -}; - -static const long _vq_quantlist__44c0_s_p8_2[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__44c0_s_p8_2[] = { - 2, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, - 8,10,10,10, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9, - 9, 9,10,10,10, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9,10,10,10, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, - 9,10, 9, 9,10,10,10, 7, 7, 8, 8, 9, 8, 9, 9, 9, - 9,10, 9, 9,10,10,10,10, 8, 8, 8, 8, 9, 8, 9, 9, - 9, 9, 9,10, 9,10,10,10,10, 7, 7, 8, 8, 9, 9, 9, - 9, 9, 9,10, 9,10,10,10,10,10, 8, 8, 8, 9, 9, 9, - 9, 9, 9, 9,10,10,10, 9,11,10,10,10,10, 8, 8, 9, - 9, 9, 9, 9,10, 9, 9, 9,10,10,10,10,11,11, 9, 9, - 9, 9, 9, 9, 9, 9,10, 9, 9,10,11,10,10,11,11, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 9,11,11,10,11,11, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 9,11,10,10,11, - 11,11,11, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, - 11,11,11,11, 9,10, 9,10, 9, 9, 9, 9,10, 9,10,11, - 10,11,10,10,10,10,10, 9, 9, 9,10, 9, 9, 9,10,11, - 11,10,11,11,10,11,10,10,10, 9, 9, 9, 9,10, 9, 9, - 10,11,10,11,11,11,11,10,11,10,10, 9,10, 9, 9, 9, - 10, -}; - -static const static_codebook _44c0_s_p8_2 = { - 2, 289, - (char *)_vq_lengthlist__44c0_s_p8_2, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c0_s_p8_2, - 0 -}; - -static const char _huff_lengthlist__44c0_s_short[] = { - 9, 8,12,11,12,13,14,14,16, 6, 1, 5, 6, 6, 9,12, - 14,17, 9, 4, 5, 9, 7, 9,13,15,16, 8, 5, 8, 6, 8, - 10,13,17,17, 9, 6, 7, 7, 8, 9,13,15,17,11, 8, 9, - 9, 9,10,12,16,16,13, 7, 8, 7, 7, 9,12,14,15,13, - 6, 7, 5, 5, 7,10,13,13,14, 7, 8, 5, 6, 7, 9,10, - 12, -}; - -static const static_codebook _huff_book__44c0_s_short = { - 2, 81, - (char *)_huff_lengthlist__44c0_s_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44c0_sm_long[] = { - 5, 4, 9,10, 9,10,11,12,13, 4, 1, 5, 7, 7, 9,11, - 12,14, 8, 5, 7, 9, 8,10,13,13,13,10, 7, 9, 4, 6, - 7,10,12,14, 9, 6, 7, 6, 6, 7,10,12,12, 9, 8, 9, - 7, 6, 7, 8,11,12,11,11,11, 9, 8, 7, 8,10,12,12, - 13,14,12,11, 9, 9, 9,12,12,17,17,15,16,12,10,11, - 13, -}; - -static const static_codebook _huff_book__44c0_sm_long = { - 2, 81, - (char *)_huff_lengthlist__44c0_sm_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44c0_sm_p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44c0_sm_p1_0[] = { - 1, 5, 5, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 8, 7, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, - 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 9, 8, 0, 0, - 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 7, 0, 0, 0, 0, - 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, - 0, 0, 0, 9,10,10, 0, 0, 0, 0, 0, 0, 9,10,10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 8,10, 9, 0, 0, 0, 0, 0, 0, 9,10,10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 7, 8, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,10, 0, - 0, 0, 0, 0, 0, 9, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,10, - 0, 0, 0, 0, 0, 0, 9,10,10, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44c0_sm_p1_0 = { - 8, 6561, - (char *)_vq_lengthlist__44c0_sm_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44c0_sm_p1_0, - 0 -}; - -static const long _vq_quantlist__44c0_sm_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44c0_sm_p2_0[] = { - 1, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 5, 7, 7, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 5, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 7, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 7, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44c0_sm_p2_0 = { - 4, 625, - (char *)_vq_lengthlist__44c0_sm_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c0_sm_p2_0, - 0 -}; - -static const long _vq_quantlist__44c0_sm_p3_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44c0_sm_p3_0[] = { - 1, 3, 3, 7, 7, 0, 0, 0, 0, 0, 5, 4, 7, 7, 0, 0, - 0, 0, 0, 5, 5, 7, 7, 0, 0, 0, 0, 0, 6, 7, 8, 8, - 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, - 9,10, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, - 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c0_sm_p3_0 = { - 2, 81, - (char *)_vq_lengthlist__44c0_sm_p3_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c0_sm_p3_0, - 0 -}; - -static const long _vq_quantlist__44c0_sm_p4_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44c0_sm_p4_0[] = { - 1, 4, 3, 6, 6, 7, 7, 9, 9, 0, 5, 5, 7, 7, 8, 7, - 9, 9, 0, 5, 5, 7, 7, 8, 8, 9, 9, 0, 7, 7, 8, 8, - 8, 8,10,10, 0, 0, 0, 8, 8, 8, 8,10,10, 0, 0, 0, - 9, 9, 9, 9,11,11, 0, 0, 0, 9, 9, 9, 9,11,11, 0, - 0, 0,10,10,10,10,11,11, 0, 0, 0, 0, 0, 9, 9,11, - 11, -}; - -static const static_codebook _44c0_sm_p4_0 = { - 2, 81, - (char *)_vq_lengthlist__44c0_sm_p4_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c0_sm_p4_0, - 0 -}; - -static const long _vq_quantlist__44c0_sm_p5_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__44c0_sm_p5_0[] = { - 1, 4, 4, 6, 6, 8, 8, 8, 8, 8, 8, 9, 9,10,10,11, - 11, 0, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10,11, - 11,11, 0, 5, 6, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10, - 11,11,11, 0, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9,10,10, - 11,11,12,12, 0, 0, 0, 8, 8, 8, 8, 9, 9, 9, 9,10, - 10,11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10,10, - 11,11,11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10, - 10,11,11,11,11,12,12, 0, 0, 0, 9, 9, 9, 9,10,10, - 10,10,11,11,12,12,12,13, 0, 0, 0, 0, 0, 9, 9,10, - 10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9, - 10,10,11,11,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, - 9,10,10,11,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, - 10,10,10,10,11,11,12,12,12,13,13,13, 0, 0, 0, 0, - 0, 0, 0,10,10,11,11,12,12,12,13,13,13, 0, 0, 0, - 0, 0, 0, 0,11,11,12,12,12,12,13,13,14,14, 0, 0, - 0, 0, 0, 0, 0,11,11,12,11,12,12,13,13,13,13, 0, - 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,13,13,14,14, - 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,14, - 14, -}; - -static const static_codebook _44c0_sm_p5_0 = { - 2, 289, - (char *)_vq_lengthlist__44c0_sm_p5_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c0_sm_p5_0, - 0 -}; - -static const long _vq_quantlist__44c0_sm_p6_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44c0_sm_p6_0[] = { - 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,11, - 9, 9, 4, 7, 7,10, 9, 9,11, 9, 9, 7,10,10,10,11, - 11,11,10,10, 6, 9, 9,11,11,10,11,10,10, 6, 9, 9, - 11,10,11,11,10,10, 7,11,10,11,11,11,11,11,11, 6, - 9, 9,11,10,10,11,11,10, 6, 9, 9,11,10,10,11,10, - 11, -}; - -static const static_codebook _44c0_sm_p6_0 = { - 4, 81, - (char *)_vq_lengthlist__44c0_sm_p6_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44c0_sm_p6_0, - 0 -}; - -static const long _vq_quantlist__44c0_sm_p6_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__44c0_sm_p6_1[] = { - 2, 4, 4, 6, 6, 7, 7, 7, 7, 7, 8, 9, 5, 5, 6, 6, - 7, 7, 8, 8, 8, 8, 9, 5, 5, 6, 6, 7, 7, 8, 8, 8, - 8,10, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, - 7, 7, 7, 8, 8, 8, 8,10,10,10, 8, 8, 8, 8, 8, 8, - 8, 8,10,10,10, 8, 8, 8, 8, 8, 8, 8, 8,10,10,10, - 8, 8, 8, 8, 8, 8, 8, 8,10,10,10,10,10, 8, 8, 8, - 8, 8, 8,10,10,10,10,10, 9, 9, 8, 8, 8, 8,10,10, - 10,10,10, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _44c0_sm_p6_1 = { - 2, 121, - (char *)_vq_lengthlist__44c0_sm_p6_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44c0_sm_p6_1, - 0 -}; - -static const long _vq_quantlist__44c0_sm_p7_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44c0_sm_p7_0[] = { - 1, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 7, 5, 5, - 7, 7, 8, 8, 8, 8, 9, 9,10,10, 7, 6, 5, 7, 7, 8, - 8, 8, 8, 9, 9,10,10, 0, 8, 8, 8, 8, 9, 9, 9, 9, - 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, - 11, 0,12,12, 9, 9,10,10,10,10,11,11,11,11, 0,13, - 13, 9, 9, 9, 9,10,10,11,11,11,12, 0, 0, 0, 9,10, - 10,10,11,11,12,11,12,12, 0, 0, 0,10,10, 9, 9,11, - 11,12,12,12,12, 0, 0, 0,13,13,10,10,11,11,12,12, - 13,13, 0, 0, 0,14,14,10,10,11,11,12,12,13,13, 0, - 0, 0, 0, 0,11,12,11,11,13,12,13,13, 0, 0, 0, 0, - 0,12,12,11,11,13,12,14,14, -}; - -static const static_codebook _44c0_sm_p7_0 = { - 2, 169, - (char *)_vq_lengthlist__44c0_sm_p7_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44c0_sm_p7_0, - 0 -}; - -static const long _vq_quantlist__44c0_sm_p7_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44c0_sm_p7_1[] = { - 2, 4, 4, 4, 4, 6, 5, 5, 5, 5, 6, 5, 5, 5, 5, 6, - 6, 6, 5, 5, 6, 6, 6, 5, 5, -}; - -static const static_codebook _44c0_sm_p7_1 = { - 2, 25, - (char *)_vq_lengthlist__44c0_sm_p7_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c0_sm_p7_1, - 0 -}; - -static const long _vq_quantlist__44c0_sm_p8_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44c0_sm_p8_0[] = { - 1, 3, 3,11,11,11,11,11,11, 3, 7, 6,11,11,11,11, - 11,11, 4, 8, 7,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12, -}; - -static const static_codebook _44c0_sm_p8_0 = { - 2, 81, - (char *)_vq_lengthlist__44c0_sm_p8_0, - 1, -516186112, 1627103232, 4, 0, - (long *)_vq_quantlist__44c0_sm_p8_0, - 0 -}; - -static const long _vq_quantlist__44c0_sm_p8_1[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44c0_sm_p8_1[] = { - 1, 4, 4, 6, 6, 7, 7, 9, 9,10,11,12,12, 6, 5, 5, - 7, 7, 8, 8,10,10,12,11,12,12, 6, 5, 5, 7, 7, 8, - 8,10,10,12,11,12,12,17, 7, 7, 8, 8, 9, 9,10,10, - 12,12,13,13,18, 7, 7, 8, 7, 9, 9,10,10,12,12,12, - 13,19,10,10, 8, 8,10,10,11,11,12,12,13,14,19,11, - 10, 8, 7,10,10,11,11,12,12,13,12,19,19,19,10,10, - 10,10,11,11,12,12,13,13,19,19,19,11, 9,11, 9,14, - 12,13,12,13,13,19,20,18,13,14,11,11,12,12,13,13, - 14,13,20,20,20,15,13,11,10,13,11,13,13,14,13,20, - 20,20,20,20,13,14,12,12,13,13,13,13,20,20,20,20, - 20,13,13,12,12,16,13,15,13, -}; - -static const static_codebook _44c0_sm_p8_1 = { - 2, 169, - (char *)_vq_lengthlist__44c0_sm_p8_1, - 1, -522616832, 1620115456, 4, 0, - (long *)_vq_quantlist__44c0_sm_p8_1, - 0 -}; - -static const long _vq_quantlist__44c0_sm_p8_2[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__44c0_sm_p8_2[] = { - 2, 5, 5, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, - 8,10, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, - 9, 9,10, 6, 6, 7, 7, 8, 7, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9,10, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9,10,10,10, 7, 7, 8, 8, 9, 8, 9, 9, 9, - 9,10, 9, 9,10,10,10,11, 8, 8, 8, 8, 9, 9, 9, 9, - 9, 9, 9,10, 9,10,10,10,10, 8, 8, 8, 8, 9, 9, 9, - 9, 9, 9, 9, 9,10,10,11,10,10, 8, 8, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9,10,10,10,10,10,11,11, 8, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 9,10,11,11,11,11,11, 9, 9, - 9, 9, 9, 9, 9, 9,10, 9,10, 9,11,11,10,11,11, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 9,11,11,10,11,11, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 9,11,10,11,11, - 11,11,11, 9, 9,10, 9, 9, 9, 9, 9, 9, 9,10,11,10, - 11,11,11,11,10,10,10,10, 9, 9, 9, 9, 9, 9,10,11, - 11,11,11,11,11, 9,10, 9, 9, 9, 9, 9, 9, 9, 9,11, - 11,10,11,11,11,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9, - 10,11,10,11,11,11,11,11,11, 9, 9, 9, 9, 9, 9, 9, - 9, -}; - -static const static_codebook _44c0_sm_p8_2 = { - 2, 289, - (char *)_vq_lengthlist__44c0_sm_p8_2, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c0_sm_p8_2, - 0 -}; - -static const char _huff_lengthlist__44c0_sm_short[] = { - 6, 6,12,13,13,14,16,17,17, 4, 2, 5, 8, 7, 9,12, - 15,15, 9, 4, 5, 9, 7, 9,12,16,18,11, 6, 7, 4, 6, - 8,11,14,18,10, 5, 6, 5, 5, 7,10,14,17,10, 5, 7, - 7, 6, 7,10,13,16,11, 5, 7, 7, 7, 8,10,12,15,13, - 6, 7, 5, 5, 7, 9,12,13,16, 8, 9, 6, 6, 7, 9,10, - 12, -}; - -static const static_codebook _huff_book__44c0_sm_short = { - 2, 81, - (char *)_huff_lengthlist__44c0_sm_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44c1_s_long[] = { - 5, 5, 9,10, 9, 9,10,11,12, 5, 1, 5, 6, 6, 7,10, - 12,14, 9, 5, 6, 8, 8,10,12,14,14,10, 5, 8, 5, 6, - 8,11,13,14, 9, 5, 7, 6, 6, 8,10,12,11, 9, 7, 9, - 7, 6, 6, 7,10,10,10, 9,12, 9, 8, 7, 7,10,12,11, - 11,13,12,10, 9, 8, 9,11,11,14,15,15,13,11, 9, 9, - 11, -}; - -static const static_codebook _huff_book__44c1_s_long = { - 2, 81, - (char *)_huff_lengthlist__44c1_s_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44c1_s_p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44c1_s_p1_0[] = { - 2, 4, 4, 0, 0, 0, 0, 0, 0, 5, 7, 6, 0, 0, 0, 0, - 0, 0, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, - 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, - 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 7, 7, 0, 0, 0, 0, - 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, - 0, 0, 0, 8, 9,10, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 8, 8, 0, 0, - 0, 0, 0, 0, 8, 9, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, - 0, 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 6, 8, 8, 0, 0, 0, 0, 0, 0, 8,10, 9, 0, - 0, 0, 0, 0, 0, 8, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, - 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44c1_s_p1_0 = { - 8, 6561, - (char *)_vq_lengthlist__44c1_s_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44c1_s_p1_0, - 0 -}; - -static const long _vq_quantlist__44c1_s_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44c1_s_p2_0[] = { - 2, 3, 4, 6, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 4, 5, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 8, 8, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 6, 6, 8, 8, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44c1_s_p2_0 = { - 4, 625, - (char *)_vq_lengthlist__44c1_s_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c1_s_p2_0, - 0 -}; - -static const long _vq_quantlist__44c1_s_p3_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44c1_s_p3_0[] = { - 1, 3, 2, 7, 7, 0, 0, 0, 0, 0,13,13, 6, 6, 0, 0, - 0, 0, 0,12, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 7, 7, - 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, - 8, 9, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, - 0, 0,11,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c1_s_p3_0 = { - 2, 81, - (char *)_vq_lengthlist__44c1_s_p3_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c1_s_p3_0, - 0 -}; - -static const long _vq_quantlist__44c1_s_p4_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44c1_s_p4_0[] = { - 1, 3, 3, 6, 5, 6, 6, 8, 8, 0, 0, 0, 7, 7, 7, 7, - 9, 9, 0, 0, 0, 7, 7, 7, 7, 9, 9, 0, 0, 0, 7, 7, - 8, 8,10,10, 0, 0, 0, 7, 7, 8, 8,10,10, 0, 0, 0, - 9, 9, 8, 8,10,10, 0, 0, 0, 8, 8, 8, 8,10,10, 0, - 0, 0,10,10, 9, 9,11,11, 0, 0, 0, 0, 0, 9, 9,11, - 11, -}; - -static const static_codebook _44c1_s_p4_0 = { - 2, 81, - (char *)_vq_lengthlist__44c1_s_p4_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c1_s_p4_0, - 0 -}; - -static const long _vq_quantlist__44c1_s_p5_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__44c1_s_p5_0[] = { - 1, 4, 3, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10,11, - 11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10,10, - 11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10, - 10,11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10, - 11,11,11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, - 10,11,11,12,11, 0, 0, 0, 8, 8, 9, 9, 9,10,10,10, - 10,10,11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10, 9,10, - 10,10,10,11,11,12,12, 0, 0, 0, 9, 9, 9, 9,10,10, - 10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 9, 9,10, - 10,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 9, 9, - 10,10,10,11,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, - 9,10,10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, - 10,10,10,10,11,11,12,12,12,12,13,13, 0, 0, 0, 0, - 0, 0, 0,10,10,11,11,12,12,12,12,13,13, 0, 0, 0, - 0, 0, 0, 0,11,11,12,12,12,12,13,13,13,13, 0, 0, - 0, 0, 0, 0, 0,11,11,11,11,12,12,13,13,13,13, 0, - 0, 0, 0, 0, 0, 0,12,12,12,12,12,12,13,13,14,14, - 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,14, - 14, -}; - -static const static_codebook _44c1_s_p5_0 = { - 2, 289, - (char *)_vq_lengthlist__44c1_s_p5_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c1_s_p5_0, - 0 -}; - -static const long _vq_quantlist__44c1_s_p6_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44c1_s_p6_0[] = { - 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,11, - 9, 9, 4, 7, 7,10, 9, 9,11, 9, 9, 6,10,10,11,11, - 11,11,10,10, 6, 9, 9,11,10,10,11,10,10, 6, 9, 9, - 11,10,11,11,10,10, 7,11,10,11,11,11,12,11,11, 7, - 9, 9,11,10,10,11,11,10, 6, 9, 9,10,10,10,12,10, - 11, -}; - -static const static_codebook _44c1_s_p6_0 = { - 4, 81, - (char *)_vq_lengthlist__44c1_s_p6_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44c1_s_p6_0, - 0 -}; - -static const long _vq_quantlist__44c1_s_p6_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__44c1_s_p6_1[] = { - 2, 3, 3, 6, 6, 7, 7, 7, 7, 8, 8,10,10,10, 6, 6, - 7, 7, 8, 8, 8, 8,10,10,10, 6, 6, 7, 7, 8, 8, 8, - 8,10,10,10, 7, 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, - 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, - 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, - 8, 8, 8, 8, 8, 8, 8, 8,10,10,10,10,10, 8, 8, 8, - 8, 8, 8,10,10,10,10,10, 9, 9, 8, 8, 8, 8,10,10, - 10,10,10, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _44c1_s_p6_1 = { - 2, 121, - (char *)_vq_lengthlist__44c1_s_p6_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44c1_s_p6_1, - 0 -}; - -static const long _vq_quantlist__44c1_s_p7_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44c1_s_p7_0[] = { - 1, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8,10, 9, 7, 5, 6, - 7, 7, 8, 8, 8, 8, 9, 9,10,10, 7, 5, 5, 7, 7, 8, - 8, 8, 8, 9, 9,10,10, 0, 8, 8, 8, 8, 9, 9, 9, 9, - 10,10,11,10, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, - 11, 0,12,12, 9, 9, 9,10,10,10,11,11,11,11, 0,13, - 13, 9, 9, 9, 9,10,10,11,11,11,11, 0, 0, 0,10,10, - 10,10,11,11,12,11,12,12, 0, 0, 0,10,10,10, 9,11, - 11,12,11,13,12, 0, 0, 0,13,13,10,10,11,11,12,12, - 13,13, 0, 0, 0,14,14,10,10,11,11,12,12,13,13, 0, - 0, 0, 0, 0,11,12,11,11,12,12,14,13, 0, 0, 0, 0, - 0,12,11,11,11,13,10,14,13, -}; - -static const static_codebook _44c1_s_p7_0 = { - 2, 169, - (char *)_vq_lengthlist__44c1_s_p7_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44c1_s_p7_0, - 0 -}; - -static const long _vq_quantlist__44c1_s_p7_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44c1_s_p7_1[] = { - 2, 3, 3, 5, 5, 6, 6, 6, 5, 5, 6, 6, 6, 5, 5, 6, - 6, 6, 5, 5, 6, 6, 6, 5, 5, -}; - -static const static_codebook _44c1_s_p7_1 = { - 2, 25, - (char *)_vq_lengthlist__44c1_s_p7_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c1_s_p7_1, - 0 -}; - -static const long _vq_quantlist__44c1_s_p8_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44c1_s_p8_0[] = { - 1, 4, 3,10,10,10,10,10,10,10,10,10,10, 4, 8, 6, - 10,10,10,10,10,10,10,10,10,10, 4, 8, 7,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10, -}; - -static const static_codebook _44c1_s_p8_0 = { - 2, 169, - (char *)_vq_lengthlist__44c1_s_p8_0, - 1, -514541568, 1627103232, 4, 0, - (long *)_vq_quantlist__44c1_s_p8_0, - 0 -}; - -static const long _vq_quantlist__44c1_s_p8_1[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44c1_s_p8_1[] = { - 1, 4, 4, 6, 5, 7, 7, 9, 9,10,10,12,12, 6, 5, 5, - 7, 7, 8, 8,10,10,12,11,12,12, 6, 5, 5, 7, 7, 8, - 8,10,10,11,11,12,12,15, 7, 7, 8, 8, 9, 9,11,11, - 12,12,13,12,15, 8, 8, 8, 7, 9, 9,10,10,12,12,13, - 13,16,11,10, 8, 8,10,10,11,11,12,12,13,13,16,11, - 11, 9, 8,11,10,11,11,12,12,13,12,16,16,16,10,11, - 10,11,12,12,12,12,13,13,16,16,16,11, 9,11, 9,14, - 12,12,12,13,13,16,16,16,12,14,11,12,12,12,13,13, - 14,13,16,16,16,15,13,12,10,13,10,13,14,13,13,16, - 16,16,16,16,13,14,12,13,13,12,13,13,16,16,16,16, - 16,13,12,12,11,14,12,15,13, -}; - -static const static_codebook _44c1_s_p8_1 = { - 2, 169, - (char *)_vq_lengthlist__44c1_s_p8_1, - 1, -522616832, 1620115456, 4, 0, - (long *)_vq_quantlist__44c1_s_p8_1, - 0 -}; - -static const long _vq_quantlist__44c1_s_p8_2[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__44c1_s_p8_2[] = { - 2, 4, 4, 6, 6, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, - 8,10,10,10, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, - 9, 9,10,10,10, 7, 7, 8, 7, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9,10,10,10, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, - 9,10, 9, 9,10,10,10, 7, 7, 8, 8, 9, 8, 9, 9, 9, - 9,10, 9, 9,10,10,11,11, 8, 8, 8, 8, 9, 9, 9, 9, - 9, 9,10, 9, 9,10,10,10,10, 8, 8, 8, 8, 9, 9, 9, - 9, 9, 9, 9, 9,10,10,11,11,11, 8, 8, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9,10,10,10,10,11,11,11, 8, 8, 9, - 9, 9, 9,10, 9, 9, 9, 9, 9,11,11,11,11,11, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11,10,10,11,11, 9, - 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,11,10,11,11, - 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10, 9,10,10,11,11, - 11,11,11, 9, 9, 9,10, 9, 9, 9, 9, 9, 9,10,11,11, - 11,11,11,11,10,10,10,10, 9, 9, 9, 9, 9, 9,10,11, - 11,11,11,11,11, 9,10, 9, 9, 9, 9,10, 9, 9, 9,11, - 11,11,11,11,11,11,10,10, 9, 9, 9, 9, 9, 9,10, 9, - 11,11,10,11,11,11,11,10,11, 9, 9, 9, 9, 9, 9, 9, - 9, -}; - -static const static_codebook _44c1_s_p8_2 = { - 2, 289, - (char *)_vq_lengthlist__44c1_s_p8_2, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c1_s_p8_2, - 0 -}; - -static const char _huff_lengthlist__44c1_s_short[] = { - 6, 8,13,12,13,14,15,16,16, 4, 2, 4, 7, 6, 8,11, - 13,15,10, 4, 4, 8, 6, 8,11,14,17,11, 5, 6, 5, 6, - 8,12,14,17,11, 5, 5, 6, 5, 7,10,13,16,12, 6, 7, - 8, 7, 8,10,13,15,13, 8, 8, 7, 7, 8,10,12,15,15, - 7, 7, 5, 5, 7, 9,12,14,15, 8, 8, 6, 6, 7, 8,10, - 11, -}; - -static const static_codebook _huff_book__44c1_s_short = { - 2, 81, - (char *)_huff_lengthlist__44c1_s_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44c1_sm_long[] = { - 5, 4, 8,10, 9, 9,10,11,12, 4, 2, 5, 6, 6, 8,10, - 11,13, 8, 4, 6, 8, 7, 9,12,12,14,10, 6, 8, 4, 5, - 6, 9,11,12, 9, 5, 6, 5, 5, 6, 9,11,11, 9, 7, 9, - 6, 5, 5, 7,10,10,10, 9,11, 8, 7, 6, 7, 9,11,11, - 12,13,10,10, 9, 8, 9,11,11,15,15,12,13,11, 9,10, - 11, -}; - -static const static_codebook _huff_book__44c1_sm_long = { - 2, 81, - (char *)_huff_lengthlist__44c1_sm_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44c1_sm_p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44c1_sm_p1_0[] = { - 1, 5, 5, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 8, 7, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, - 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 9, 8, 0, 0, - 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 7, 0, 0, 0, 0, - 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, - 0, 0, 0, 9, 9,10, 0, 0, 0, 0, 0, 0, 9,10,10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 8,10, 9, 0, 0, 0, 0, 0, 0, 9,10,10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 7, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, - 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,10, 0, - 0, 0, 0, 0, 0, 8, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,10, - 0, 0, 0, 0, 0, 0, 9,10, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44c1_sm_p1_0 = { - 8, 6561, - (char *)_vq_lengthlist__44c1_sm_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44c1_sm_p1_0, - 0 -}; - -static const long _vq_quantlist__44c1_sm_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44c1_sm_p2_0[] = { - 2, 3, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 6, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44c1_sm_p2_0 = { - 4, 625, - (char *)_vq_lengthlist__44c1_sm_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c1_sm_p2_0, - 0 -}; - -static const long _vq_quantlist__44c1_sm_p3_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44c1_sm_p3_0[] = { - 1, 3, 3, 7, 7, 0, 0, 0, 0, 0, 5, 5, 6, 6, 0, 0, - 0, 0, 0, 5, 5, 7, 7, 0, 0, 0, 0, 0, 7, 7, 7, 7, - 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, - 8, 9, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, - 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c1_sm_p3_0 = { - 2, 81, - (char *)_vq_lengthlist__44c1_sm_p3_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c1_sm_p3_0, - 0 -}; - -static const long _vq_quantlist__44c1_sm_p4_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44c1_sm_p4_0[] = { - 1, 3, 3, 6, 6, 7, 7, 9, 9, 0, 6, 6, 7, 7, 8, 8, - 9, 9, 0, 6, 6, 7, 7, 8, 8, 9, 9, 0, 7, 7, 8, 8, - 8, 8,10,10, 0, 0, 0, 8, 8, 8, 8,10,10, 0, 0, 0, - 8, 8, 9, 9,11,11, 0, 0, 0, 9, 9, 9, 9,11,11, 0, - 0, 0,10,10,10,10,11,11, 0, 0, 0, 0, 0, 9, 9,11, - 11, -}; - -static const static_codebook _44c1_sm_p4_0 = { - 2, 81, - (char *)_vq_lengthlist__44c1_sm_p4_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c1_sm_p4_0, - 0 -}; - -static const long _vq_quantlist__44c1_sm_p5_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__44c1_sm_p5_0[] = { - 2, 3, 3, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10,11, - 11, 0, 5, 5, 6, 6, 8, 8, 9, 9, 9, 9,10,10,10,10, - 11,11, 0, 5, 5, 6, 6, 8, 8, 9, 9, 9, 9,10,10,10, - 10,11,11, 0, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9,10,10, - 11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, - 10,11,11,12,12, 0, 0, 0, 8, 8, 8, 8, 9, 9,10,10, - 10,11,11,11,12,12, 0, 0, 0, 8, 8, 8, 8, 9, 9,10, - 10,10,10,11,11,12,12, 0, 0, 0, 9, 9, 9, 9,10,10, - 10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 9, 9,10, - 10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9, - 9, 9,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, - 9, 9, 9,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, - 9, 9,10,10,11,11,12,12,12,12,13,13, 0, 0, 0, 0, - 0, 0, 0,10,10,11,11,12,12,12,12,13,13, 0, 0, 0, - 0, 0, 0, 0,11,11,11,11,12,12,13,13,13,13, 0, 0, - 0, 0, 0, 0, 0,11,11,11,11,12,12,13,13,13,13, 0, - 0, 0, 0, 0, 0, 0,11,11,12,12,12,12,13,13,14,14, - 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,14, - 14, -}; - -static const static_codebook _44c1_sm_p5_0 = { - 2, 289, - (char *)_vq_lengthlist__44c1_sm_p5_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c1_sm_p5_0, - 0 -}; - -static const long _vq_quantlist__44c1_sm_p6_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44c1_sm_p6_0[] = { - 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,11, - 9, 9, 4, 7, 7,10, 9, 9,11, 9, 9, 7,10,10,10,11, - 11,11,10,10, 6, 9, 9,11,11,10,11,10,10, 6, 9, 9, - 11,10,11,11,10,10, 7,11,11,11,11,11,11,11,11, 6, - 9, 9,11,10,10,11,11,10, 6, 9, 9,10,10,10,11,10, - 11, -}; - -static const static_codebook _44c1_sm_p6_0 = { - 4, 81, - (char *)_vq_lengthlist__44c1_sm_p6_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44c1_sm_p6_0, - 0 -}; - -static const long _vq_quantlist__44c1_sm_p6_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__44c1_sm_p6_1[] = { - 2, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8,10, 5, 5, 6, 6, - 7, 7, 8, 8, 8, 8,10, 5, 5, 6, 6, 7, 7, 8, 8, 8, - 8,10, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, 7, - 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, - 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, - 8, 8, 8, 8, 8, 8, 9, 8,10,10,10,10,10, 8, 8, 8, - 8, 8, 8,10,10,10,10,10, 9, 9, 8, 8, 8, 8,10,10, - 10,10,10, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _44c1_sm_p6_1 = { - 2, 121, - (char *)_vq_lengthlist__44c1_sm_p6_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44c1_sm_p6_1, - 0 -}; - -static const long _vq_quantlist__44c1_sm_p7_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44c1_sm_p7_0[] = { - 1, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 7, 5, 5, - 7, 7, 8, 8, 8, 8, 9, 9,10,10, 7, 5, 6, 7, 7, 8, - 8, 8, 8, 9, 9,11,10, 0, 8, 8, 8, 8, 9, 9, 9, 9, - 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, - 11, 0,12,12, 9, 9,10,10,10,10,11,11,11,11, 0,13, - 13, 9, 9, 9, 9,10,10,11,11,12,12, 0, 0, 0, 9,10, - 9,10,11,11,12,11,13,12, 0, 0, 0,10,10, 9, 9,11, - 11,12,12,13,12, 0, 0, 0,13,13,10,10,11,11,12,12, - 13,13, 0, 0, 0,14,14,10,10,11,11,12,12,13,13, 0, - 0, 0, 0, 0,11,12,11,11,12,13,14,13, 0, 0, 0, 0, - 0,12,12,11,11,13,12,14,13, -}; - -static const static_codebook _44c1_sm_p7_0 = { - 2, 169, - (char *)_vq_lengthlist__44c1_sm_p7_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44c1_sm_p7_0, - 0 -}; - -static const long _vq_quantlist__44c1_sm_p7_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44c1_sm_p7_1[] = { - 2, 4, 4, 4, 5, 6, 5, 5, 5, 5, 6, 5, 5, 5, 5, 6, - 5, 5, 5, 5, 6, 6, 6, 5, 5, -}; - -static const static_codebook _44c1_sm_p7_1 = { - 2, 25, - (char *)_vq_lengthlist__44c1_sm_p7_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c1_sm_p7_1, - 0 -}; - -static const long _vq_quantlist__44c1_sm_p8_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44c1_sm_p8_0[] = { - 1, 3, 3,13,13,13,13,13,13,13,13,13,13, 3, 6, 6, - 13,13,13,13,13,13,13,13,13,13, 4, 8, 7,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13, -}; - -static const static_codebook _44c1_sm_p8_0 = { - 2, 169, - (char *)_vq_lengthlist__44c1_sm_p8_0, - 1, -514541568, 1627103232, 4, 0, - (long *)_vq_quantlist__44c1_sm_p8_0, - 0 -}; - -static const long _vq_quantlist__44c1_sm_p8_1[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44c1_sm_p8_1[] = { - 1, 4, 4, 6, 6, 7, 7, 9, 9,10,11,12,12, 6, 5, 5, - 7, 7, 8, 7,10,10,11,11,12,12, 6, 5, 5, 7, 7, 8, - 8,10,10,11,11,12,12,16, 7, 7, 8, 8, 9, 9,11,11, - 12,12,13,13,17, 7, 7, 8, 7, 9, 9,11,10,12,12,13, - 13,19,11,10, 8, 8,10,10,11,11,12,12,13,13,19,11, - 11, 9, 7,11,10,11,11,12,12,13,12,19,19,19,10,10, - 10,10,11,12,12,12,13,14,18,19,19,11, 9,11, 9,13, - 12,12,12,13,13,19,20,19,13,15,11,11,12,12,13,13, - 14,13,18,19,20,15,13,12,10,13,10,13,13,13,14,20, - 20,20,20,20,13,14,12,12,13,12,13,13,20,20,20,20, - 20,13,12,12,12,14,12,14,13, -}; - -static const static_codebook _44c1_sm_p8_1 = { - 2, 169, - (char *)_vq_lengthlist__44c1_sm_p8_1, - 1, -522616832, 1620115456, 4, 0, - (long *)_vq_quantlist__44c1_sm_p8_1, - 0 -}; - -static const long _vq_quantlist__44c1_sm_p8_2[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__44c1_sm_p8_2[] = { - 2, 5, 5, 6, 6, 7, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, - 8,10, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, - 9, 9,10, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9,10, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9,10,10,10, 7, 7, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9,10,11,11, 8, 8, 8, 8, 9, 9, 9, 9, - 9, 9,10,10, 9,10,10,10,10, 8, 8, 8, 8, 9, 9, 9, - 9, 9, 9, 9, 9,10,10,11,10,10, 8, 8, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9,10, 9,10,10,10,11,11, 8, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9,11,11,11,11,11, 9, 9, - 9, 9, 9, 9, 9, 9,10, 9,10, 9,11,11,11,11,11, 9, - 8, 9, 9, 9, 9, 9, 9, 9,10,10, 9,11,11,10,11,11, - 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10, 9,11,11,11,11, - 11,11,11, 9, 9,10, 9, 9, 9, 9,10, 9,10,10,11,10, - 11,11,11,11, 9,10,10,10, 9, 9, 9, 9, 9, 9,10,11, - 11,11,11,11,11, 9, 9, 9, 9, 9, 9, 9, 9,10, 9,11, - 11,10,11,11,11,11,10,10, 9, 9, 9, 9, 9, 9,10, 9, - 10,11,10,11,11,11,11,11,11, 9, 9,10, 9, 9, 9, 9, - 9, -}; - -static const static_codebook _44c1_sm_p8_2 = { - 2, 289, - (char *)_vq_lengthlist__44c1_sm_p8_2, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c1_sm_p8_2, - 0 -}; - -static const char _huff_lengthlist__44c1_sm_short[] = { - 4, 7,13,14,14,15,16,18,18, 4, 2, 5, 8, 7, 9,12, - 15,15,10, 4, 5,10, 6, 8,11,15,17,12, 5, 7, 5, 6, - 8,11,14,17,11, 5, 6, 6, 5, 6, 9,13,17,12, 6, 7, - 6, 5, 6, 8,12,14,14, 7, 8, 6, 6, 7, 9,11,14,14, - 8, 9, 6, 5, 6, 9,11,13,16,10,10, 7, 6, 7, 8,10, - 11, -}; - -static const static_codebook _huff_book__44c1_sm_short = { - 2, 81, - (char *)_huff_lengthlist__44c1_sm_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44cn1_s_long[] = { - 4, 4, 7, 8, 7, 8,10,12,17, 3, 1, 6, 6, 7, 8,10, - 12,15, 7, 6, 9, 9, 9,11,12,14,17, 8, 6, 9, 6, 7, - 9,11,13,17, 7, 6, 9, 7, 7, 8, 9,12,15, 8, 8,10, - 8, 7, 7, 7,10,14, 9,10,12,10, 8, 8, 8,10,14,11, - 13,15,13,12,11,11,12,16,17,18,18,19,20,18,16,16, - 20, -}; - -static const static_codebook _huff_book__44cn1_s_long = { - 2, 81, - (char *)_huff_lengthlist__44cn1_s_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44cn1_s_p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44cn1_s_p1_0[] = { - 1, 4, 4, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, - 0, 0, 0, 7, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 7,10, 9, 0, 0, - 0, 0, 0, 0, 8,10, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 8, 0, 0, 0, 0, - 0, 0, 8,10,10, 0, 0, 0, 0, 0, 0, 8, 9,10, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,10,10, 0, 0, 0, - 0, 0, 0, 9, 9,11, 0, 0, 0, 0, 0, 0,10,11,11, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,10,10, 0, 0, - 0, 0, 0, 0, 9,11, 9, 0, 0, 0, 0, 0, 0,10,11,11, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 8,10,10, 0, 0, - 0, 0, 0, 0, 8,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 7,10,10, 0, 0, 0, 0, 0, 0,10,11,11, 0, - 0, 0, 0, 0, 0, 9, 9,11, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7,10,10, 0, 0, 0, 0, 0, 0,10,11,11, - 0, 0, 0, 0, 0, 0, 9,11, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44cn1_s_p1_0 = { - 8, 6561, - (char *)_vq_lengthlist__44cn1_s_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44cn1_s_p1_0, - 0 -}; - -static const long _vq_quantlist__44cn1_s_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44cn1_s_p2_0[] = { - 1, 4, 4, 7, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 5, 7, 7, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 5, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 7, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 7, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44cn1_s_p2_0 = { - 4, 625, - (char *)_vq_lengthlist__44cn1_s_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44cn1_s_p2_0, - 0 -}; - -static const long _vq_quantlist__44cn1_s_p3_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44cn1_s_p3_0[] = { - 1, 2, 3, 7, 7, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, - 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 7, 7, - 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, - 9, 8, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, - 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44cn1_s_p3_0 = { - 2, 81, - (char *)_vq_lengthlist__44cn1_s_p3_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44cn1_s_p3_0, - 0 -}; - -static const long _vq_quantlist__44cn1_s_p4_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44cn1_s_p4_0[] = { - 1, 3, 3, 6, 6, 6, 6, 8, 8, 0, 0, 0, 6, 6, 7, 7, - 9, 9, 0, 0, 0, 6, 6, 7, 7, 9, 9, 0, 0, 0, 7, 7, - 8, 8,10,10, 0, 0, 0, 7, 7, 8, 8,10,10, 0, 0, 0, - 9, 9, 9, 9,10,10, 0, 0, 0, 9, 9, 9, 9,10,10, 0, - 0, 0,10,10,10,10,11,11, 0, 0, 0, 0, 0,10,10,11, - 11, -}; - -static const static_codebook _44cn1_s_p4_0 = { - 2, 81, - (char *)_vq_lengthlist__44cn1_s_p4_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44cn1_s_p4_0, - 0 -}; - -static const long _vq_quantlist__44cn1_s_p5_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__44cn1_s_p5_0[] = { - 1, 4, 3, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10,10, - 10, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10,10, - 11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10, - 10,11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10, - 11,11,11,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, - 10,11,11,11,11, 0, 0, 0, 8, 8, 9, 9, 9, 9,10,10, - 10,10,11,11,12,12, 0, 0, 0, 8, 8, 9, 9, 9, 9,10, - 10,10,11,11,11,12,12, 0, 0, 0, 9, 9,10, 9,10,10, - 10,10,11,11,11,11,12,12, 0, 0, 0, 0, 0, 9, 9,10, - 10,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 9, 9, - 10,10,10,11,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, - 9,10,10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, - 10,10,11,10,11,11,11,12,13,12,13,13, 0, 0, 0, 0, - 0, 0, 0,11,10,11,11,12,12,12,12,13,13, 0, 0, 0, - 0, 0, 0, 0,11,11,12,12,12,12,13,13,13,14, 0, 0, - 0, 0, 0, 0, 0,11,11,12,12,12,12,13,13,13,14, 0, - 0, 0, 0, 0, 0, 0,12,12,12,13,13,13,13,13,14,14, - 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,13,12,13,13,14, - 14, -}; - -static const static_codebook _44cn1_s_p5_0 = { - 2, 289, - (char *)_vq_lengthlist__44cn1_s_p5_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44cn1_s_p5_0, - 0 -}; - -static const long _vq_quantlist__44cn1_s_p6_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44cn1_s_p6_0[] = { - 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 6, 6,10, 9, 9,11, - 9, 9, 4, 6, 6,10, 9, 9,10, 9, 9, 7,10,10,11,11, - 11,12,11,11, 7, 9, 9,11,11,10,11,10,10, 7, 9, 9, - 11,10,11,11,10,10, 7,10,10,11,11,11,12,11,11, 7, - 9, 9,11,10,10,11,10,10, 7, 9, 9,11,10,10,11,10, - 10, -}; - -static const static_codebook _44cn1_s_p6_0 = { - 4, 81, - (char *)_vq_lengthlist__44cn1_s_p6_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44cn1_s_p6_0, - 0 -}; - -static const long _vq_quantlist__44cn1_s_p6_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__44cn1_s_p6_1[] = { - 1, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8,10,10,10, 7, 6, - 8, 8, 8, 8, 8, 8,10,10,10, 7, 6, 7, 7, 8, 8, 8, - 8,10,10,10, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, 7, - 7, 8, 8, 8, 8, 8, 8,10,10,10, 8, 8, 8, 8, 9, 9, - 9, 9,10,10,10, 8, 8, 8, 8, 9, 9, 9, 9,10,10,10, - 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10, 9, 9, 9, - 9, 9, 9,10,10,10,10,10, 9, 9, 9, 9, 9, 9,10,10, - 10,10,10, 9, 9, 9, 9, 9, 9, -}; - -static const static_codebook _44cn1_s_p6_1 = { - 2, 121, - (char *)_vq_lengthlist__44cn1_s_p6_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44cn1_s_p6_1, - 0 -}; - -static const long _vq_quantlist__44cn1_s_p7_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44cn1_s_p7_0[] = { - 1, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10, 6, 5, 5, - 7, 7, 8, 8, 8, 8, 9, 9,11,11, 7, 5, 5, 7, 7, 8, - 8, 8, 8, 9,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9, - 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, - 11, 0,12,12, 9, 9, 9,10,10,10,11,11,11,12, 0,13, - 13, 9, 9, 9, 9,10,10,11,11,11,12, 0, 0, 0,10,10, - 10,10,11,11,12,12,12,13, 0, 0, 0,10,10,10,10,11, - 11,12,12,13,12, 0, 0, 0,14,14,11,10,11,12,12,13, - 13,14, 0, 0, 0,15,15,11,11,12,11,12,12,14,13, 0, - 0, 0, 0, 0,12,12,12,12,13,13,14,14, 0, 0, 0, 0, - 0,13,13,12,12,13,13,13,14, -}; - -static const static_codebook _44cn1_s_p7_0 = { - 2, 169, - (char *)_vq_lengthlist__44cn1_s_p7_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44cn1_s_p7_0, - 0 -}; - -static const long _vq_quantlist__44cn1_s_p7_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44cn1_s_p7_1[] = { - 2, 3, 3, 5, 5, 6, 6, 6, 5, 5, 6, 6, 6, 5, 5, 6, - 6, 6, 5, 5, 6, 6, 6, 5, 5, -}; - -static const static_codebook _44cn1_s_p7_1 = { - 2, 25, - (char *)_vq_lengthlist__44cn1_s_p7_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44cn1_s_p7_1, - 0 -}; - -static const long _vq_quantlist__44cn1_s_p8_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44cn1_s_p8_0[] = { - 1, 7, 7,11,11, 8,11,11,11,11, 4,11, 3,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11, 7,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11, 8,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12, -}; - -static const static_codebook _44cn1_s_p8_0 = { - 4, 625, - (char *)_vq_lengthlist__44cn1_s_p8_0, - 1, -518283264, 1627103232, 3, 0, - (long *)_vq_quantlist__44cn1_s_p8_0, - 0 -}; - -static const long _vq_quantlist__44cn1_s_p8_1[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44cn1_s_p8_1[] = { - 1, 4, 4, 6, 6, 8, 8, 9,10,10,11,11,11, 6, 5, 5, - 7, 7, 8, 8, 9,10, 9,11,11,12, 5, 5, 5, 7, 7, 8, - 9,10,10,12,12,14,13,15, 7, 7, 8, 8, 9,10,11,11, - 10,12,10,11,15, 7, 8, 8, 8, 9, 9,11,11,13,12,12, - 13,15,10,10, 8, 8,10,10,12,12,11,14,10,10,15,11, - 11, 8, 8,10,10,12,13,13,14,15,13,15,15,15,10,10, - 10,10,12,12,13,12,13,10,15,15,15,10,10,11,10,13, - 11,13,13,15,13,15,15,15,13,13,10,11,11,11,12,10, - 14,11,15,15,14,14,13,10,10,12,11,13,13,14,14,15, - 15,15,15,15,11,11,11,11,12,11,15,12,15,15,15,15, - 15,12,12,11,11,14,12,13,14, -}; - -static const static_codebook _44cn1_s_p8_1 = { - 2, 169, - (char *)_vq_lengthlist__44cn1_s_p8_1, - 1, -522616832, 1620115456, 4, 0, - (long *)_vq_quantlist__44cn1_s_p8_1, - 0 -}; - -static const long _vq_quantlist__44cn1_s_p8_2[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__44cn1_s_p8_2[] = { - 3, 4, 3, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, - 9,10,11,11, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, - 9, 9,10,10,10, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9,10,10,10, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, - 9, 9,10, 9,10,11,10, 7, 6, 7, 7, 8, 8, 9, 9, 9, - 9, 9, 9, 9,10,10,10,11, 7, 7, 8, 8, 8, 8, 9, 9, - 9, 9, 9, 9, 9, 9,10,10,10, 7, 7, 8, 8, 8, 8, 9, - 9, 9, 9, 9, 9, 9,10,11,11,11, 8, 8, 8, 8, 8, 8, - 9, 9, 9, 9, 9, 9, 9, 9,11,10,10,11,11, 8, 8, 8, - 9, 9, 9, 9, 9, 9,10, 9,10,10,10,10,11,11, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11,11,10,11,11, 9, - 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,11,10,11,11, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11,10,10,11, - 11,11,11, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,11,11, - 10,11,11,11, 9,10,10, 9, 9, 9, 9, 9, 9, 9,10,11, - 11,11,11,11,11, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11, - 11,11,11,11,11,11,10,10, 9, 9, 9, 9, 9, 9, 9, 9, - 11,11,11,10,11,11,11,11,11, 9, 9, 9,10, 9, 9, 9, - 9, -}; - -static const static_codebook _44cn1_s_p8_2 = { - 2, 289, - (char *)_vq_lengthlist__44cn1_s_p8_2, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44cn1_s_p8_2, - 0 -}; - -static const char _huff_lengthlist__44cn1_s_short[] = { - 10, 9,12,15,12,13,16,14,16, 7, 1, 5,14, 7,10,13, - 16,16, 9, 4, 6,16, 8,11,16,16,16,14, 4, 7,16, 9, - 12,14,16,16,10, 5, 7,14, 9,12,14,15,15,13, 8, 9, - 14,10,12,13,14,15,13, 9, 9, 7, 6, 8,11,12,12,14, - 8, 8, 5, 4, 5, 8,11,12,16,10,10, 6, 5, 6, 8, 9, - 10, -}; - -static const static_codebook _huff_book__44cn1_s_short = { - 2, 81, - (char *)_huff_lengthlist__44cn1_s_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44cn1_sm_long[] = { - 3, 3, 8, 8, 8, 8,10,12,14, 3, 2, 6, 7, 7, 8,10, - 12,16, 7, 6, 7, 9, 8,10,12,14,16, 8, 6, 8, 4, 5, - 7, 9,11,13, 7, 6, 8, 5, 6, 7, 9,11,14, 8, 8,10, - 7, 7, 6, 8,10,13, 9,11,12, 9, 9, 7, 8,10,12,10, - 13,15,11,11,10, 9,10,13,13,16,17,14,15,14,13,14, - 17, -}; - -static const static_codebook _huff_book__44cn1_sm_long = { - 2, 81, - (char *)_huff_lengthlist__44cn1_sm_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44cn1_sm_p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44cn1_sm_p1_0[] = { - 1, 4, 5, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, - 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 7, 9, 8, 0, 0, - 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 8, 0, 0, 0, 0, - 0, 0, 8,10, 9, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,10, 9, 0, 0, 0, - 0, 0, 0, 9, 9,10, 0, 0, 0, 0, 0, 0, 9,10,10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 8,10, 9, 0, 0, 0, 0, 0, 0, 9,10,10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, - 0, 0, 0, 0, 8, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,10, 0, - 0, 0, 0, 0, 0, 8, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 9,10, 0, 0, 0, 0, 0, 0, 9,10,10, - 0, 0, 0, 0, 0, 0, 9,10, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44cn1_sm_p1_0 = { - 8, 6561, - (char *)_vq_lengthlist__44cn1_sm_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44cn1_sm_p1_0, - 0 -}; - -static const long _vq_quantlist__44cn1_sm_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44cn1_sm_p2_0[] = { - 1, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 5, 7, 7, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 5, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 7, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 7, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 static_codebook _44cn1_sm_p2_0 = { - 4, 625, - (char *)_vq_lengthlist__44cn1_sm_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44cn1_sm_p2_0, - 0 -}; - -static const long _vq_quantlist__44cn1_sm_p3_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44cn1_sm_p3_0[] = { - 1, 3, 4, 7, 7, 0, 0, 0, 0, 0, 4, 4, 7, 7, 0, 0, - 0, 0, 0, 4, 5, 7, 7, 0, 0, 0, 0, 0, 6, 7, 8, 8, - 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 0, 0, 0, 0, 0, 0, 0,10, 9, 0, 0, 0, 0, 0, - 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44cn1_sm_p3_0 = { - 2, 81, - (char *)_vq_lengthlist__44cn1_sm_p3_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44cn1_sm_p3_0, - 0 -}; - -static const long _vq_quantlist__44cn1_sm_p4_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44cn1_sm_p4_0[] = { - 1, 4, 3, 6, 6, 7, 7, 9, 9, 0, 5, 5, 7, 7, 8, 7, - 9, 9, 0, 5, 5, 7, 7, 8, 8, 9, 9, 0, 7, 7, 8, 8, - 8, 8,10,10, 0, 0, 0, 8, 8, 8, 8,10,10, 0, 0, 0, - 9, 9, 9, 9,10,10, 0, 0, 0, 9, 9, 9, 9,10,10, 0, - 0, 0,10,10,10,10,11,11, 0, 0, 0, 0, 0,10,10,11, - 11, -}; - -static const static_codebook _44cn1_sm_p4_0 = { - 2, 81, - (char *)_vq_lengthlist__44cn1_sm_p4_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44cn1_sm_p4_0, - 0 -}; - -static const long _vq_quantlist__44cn1_sm_p5_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__44cn1_sm_p5_0[] = { - 1, 4, 4, 6, 6, 8, 8, 9, 9, 8, 8, 9, 9,10,10,11, - 11, 0, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11,11, - 12,12, 0, 6, 5, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11, - 11,12,12, 0, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9,10,10, - 11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9,10,10,11, - 11,11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10,10, - 11,11,12,12,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10, - 10,11,11,12,12,12,12, 0, 0, 0, 9, 9, 9, 9,10,10, - 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9,10, - 10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9, - 10,10,11,11,12,12,13,13,13,13, 0, 0, 0, 0, 0, 9, - 9,10,10,11,11,12,12,12,13,13,13, 0, 0, 0, 0, 0, - 10,10,11,11,11,11,12,12,13,13,14,14, 0, 0, 0, 0, - 0, 0, 0,11,11,11,11,12,12,13,13,14,14, 0, 0, 0, - 0, 0, 0, 0,11,11,12,12,13,13,13,13,14,14, 0, 0, - 0, 0, 0, 0, 0,11,11,12,12,13,13,13,13,14,14, 0, - 0, 0, 0, 0, 0, 0,12,12,12,13,13,13,14,14,14,14, - 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,13,13,14,14,14, - 14, -}; - -static const static_codebook _44cn1_sm_p5_0 = { - 2, 289, - (char *)_vq_lengthlist__44cn1_sm_p5_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44cn1_sm_p5_0, - 0 -}; - -static const long _vq_quantlist__44cn1_sm_p6_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44cn1_sm_p6_0[] = { - 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 7, 6,10, 9, 9,11, - 9, 9, 4, 6, 7,10, 9, 9,11, 9, 9, 7,10,10,10,11, - 11,11,11,10, 6, 9, 9,11,10,10,11,10,10, 6, 9, 9, - 11,10,11,11,10,10, 7,11,11,11,11,11,12,11,11, 7, - 9, 9,11,10,10,12,10,10, 7, 9, 9,11,10,10,11,10, - 10, -}; - -static const static_codebook _44cn1_sm_p6_0 = { - 4, 81, - (char *)_vq_lengthlist__44cn1_sm_p6_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44cn1_sm_p6_0, - 0 -}; - -static const long _vq_quantlist__44cn1_sm_p6_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__44cn1_sm_p6_1[] = { - 2, 4, 4, 5, 5, 7, 7, 7, 7, 8, 8,10, 5, 5, 6, 6, - 7, 7, 8, 8, 8, 8,10, 5, 5, 6, 6, 7, 7, 8, 8, 8, - 8,10, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, 7, - 7, 7, 7, 8, 8, 8, 8,10,10,10, 8, 8, 8, 8, 8, 8, - 8, 8,10,10,10, 8, 8, 8, 8, 8, 8, 8, 8,10,10,10, - 8, 8, 8, 8, 8, 8, 9, 9,10,10,10,10,10, 8, 8, 8, - 8, 9, 9,10,10,10,10,10, 9, 9, 9, 9, 8, 9,10,10, - 10,10,10, 8, 9, 8, 8, 9, 8, -}; - -static const static_codebook _44cn1_sm_p6_1 = { - 2, 121, - (char *)_vq_lengthlist__44cn1_sm_p6_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44cn1_sm_p6_1, - 0 -}; - -static const long _vq_quantlist__44cn1_sm_p7_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44cn1_sm_p7_0[] = { - 1, 4, 4, 6, 6, 7, 7, 7, 7, 9, 9,10,10, 7, 5, 5, - 7, 7, 8, 8, 8, 8,10, 9,11,10, 7, 5, 5, 7, 7, 8, - 8, 8, 8, 9,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9, - 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, - 11, 0,12,12, 9, 9, 9,10,10,10,11,11,12,12, 0,13, - 13, 9, 9, 9, 9,10,10,11,11,12,12, 0, 0, 0,10,10, - 10,10,11,11,12,12,12,13, 0, 0, 0,10,10,10,10,11, - 11,12,12,12,12, 0, 0, 0,14,14,11,11,11,11,12,13, - 13,13, 0, 0, 0,14,14,11,10,11,11,12,12,13,13, 0, - 0, 0, 0, 0,12,12,12,12,13,13,13,14, 0, 0, 0, 0, - 0,13,12,12,12,13,13,13,14, -}; - -static const static_codebook _44cn1_sm_p7_0 = { - 2, 169, - (char *)_vq_lengthlist__44cn1_sm_p7_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44cn1_sm_p7_0, - 0 -}; - -static const long _vq_quantlist__44cn1_sm_p7_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44cn1_sm_p7_1[] = { - 2, 4, 4, 4, 5, 6, 5, 5, 5, 5, 6, 5, 5, 5, 5, 6, - 5, 5, 5, 5, 6, 6, 6, 5, 5, -}; - -static const static_codebook _44cn1_sm_p7_1 = { - 2, 25, - (char *)_vq_lengthlist__44cn1_sm_p7_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44cn1_sm_p7_1, - 0 -}; - -static const long _vq_quantlist__44cn1_sm_p8_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44cn1_sm_p8_0[] = { - 1, 4, 4,12,11,13,13,14,14, 4, 7, 7,11,13,14,14, - 14,14, 3, 8, 3,14,14,14,14,14,14,14,10,12,14,14, - 14,14,14,14,14,14, 5,14, 8,14,14,14,14,14,12,14, - 13,14,14,14,14,14,14,14,13,14,10,14,14,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, - 14, -}; - -static const static_codebook _44cn1_sm_p8_0 = { - 2, 81, - (char *)_vq_lengthlist__44cn1_sm_p8_0, - 1, -516186112, 1627103232, 4, 0, - (long *)_vq_quantlist__44cn1_sm_p8_0, - 0 -}; - -static const long _vq_quantlist__44cn1_sm_p8_1[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44cn1_sm_p8_1[] = { - 1, 4, 4, 6, 6, 8, 8, 9, 9,10,11,11,11, 6, 5, 5, - 7, 7, 8, 8,10,10,10,11,11,11, 6, 5, 5, 7, 7, 8, - 8,10,10,11,12,12,12,14, 7, 7, 7, 8, 9, 9,11,11, - 11,12,11,12,17, 7, 7, 8, 7, 9, 9,11,11,12,12,12, - 12,14,11,11, 8, 8,10,10,11,12,12,13,11,12,14,11, - 11, 8, 8,10,10,11,12,12,13,13,12,14,15,14,10,10, - 10,10,11,12,12,12,12,11,14,13,16,10,10,10, 9,12, - 11,12,12,13,14,14,15,14,14,13,10,10,11,11,12,11, - 13,11,14,12,15,13,14,11,10,12,10,12,12,13,13,13, - 13,14,15,15,12,12,11,11,12,11,13,12,14,14,14,14, - 17,12,12,11,10,13,11,13,13, -}; - -static const static_codebook _44cn1_sm_p8_1 = { - 2, 169, - (char *)_vq_lengthlist__44cn1_sm_p8_1, - 1, -522616832, 1620115456, 4, 0, - (long *)_vq_quantlist__44cn1_sm_p8_1, - 0 -}; - -static const long _vq_quantlist__44cn1_sm_p8_2[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__44cn1_sm_p8_2[] = { - 3, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, - 9,10, 6, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9,10, 6, 6, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, - 9, 9, 9,10, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, - 9, 9, 9, 9,10,10,10, 7, 7, 7, 8, 8, 8, 9, 9, 9, - 9, 9, 9, 9, 9,10,10,10, 8, 8, 8, 8, 8, 8, 9, 9, - 9, 9, 9, 9, 9, 9,10,10,10, 8, 8, 8, 8, 8, 8, 9, - 9, 9, 9, 9, 9, 9, 9,11,10,11, 8, 8, 8, 8, 8, 8, - 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,11,11, 8, 8, 8, - 8, 9, 9, 9, 9, 9, 9, 9, 9,11,10,11,11,11, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,11,10,11,11, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,11,11,10,11,11, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11,10,11,11, - 11,11,11, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,11,11, - 11,11,11,11, 9,10,10,10, 9, 9, 9, 9, 9, 9,11,10, - 11,11,11,11,11, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11, - 11,11,11,11,11,11,10,10, 9, 9, 9, 9, 9, 9, 9, 9, - 10,11,11,11,11,11,11,11,11, 9, 9, 9, 9, 9, 9, 9, - 9, -}; - -static const static_codebook _44cn1_sm_p8_2 = { - 2, 289, - (char *)_vq_lengthlist__44cn1_sm_p8_2, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44cn1_sm_p8_2, - 0 -}; - -static const char _huff_lengthlist__44cn1_sm_short[] = { - 5, 6,12,14,12,14,16,17,18, 4, 2, 5,11, 7,10,12, - 14,15, 9, 4, 5,11, 7,10,13,15,18,15, 6, 7, 5, 6, - 8,11,13,16,11, 5, 6, 5, 5, 6, 9,13,15,12, 5, 7, - 6, 5, 6, 9,12,14,12, 6, 7, 8, 6, 7, 9,12,13,14, - 8, 8, 7, 5, 5, 8,10,12,16, 9, 9, 8, 6, 6, 7, 9, - 9, -}; - -static const static_codebook _huff_book__44cn1_sm_short = { - 2, 81, - (char *)_huff_lengthlist__44cn1_sm_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/books/floor/floor_books.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/books/floor/floor_books.h deleted file mode 100644 index e925313f..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/books/floor/floor_books.h +++ /dev/null @@ -1,1547 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: static codebooks autogenerated by huff/huffbuld - last modified: $Id: floor_books.h 19057 2014-01-22 12:32:31Z xiphmont $ - - ********************************************************************/ - -#include "codebook.h" - -static const char _huff_lengthlist_line_256x7_0sub1[] = { - 0, 2, 3, 3, 3, 3, 4, 3, 4, -}; - -static const static_codebook _huff_book_line_256x7_0sub1 = { - 1, 9, - (char *)_huff_lengthlist_line_256x7_0sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_256x7_0sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 3, 4, 3, 5, 3, - 6, 3, 6, 4, 6, 4, 7, 5, 7, -}; - -static const static_codebook _huff_book_line_256x7_0sub2 = { - 1, 25, - (char *)_huff_lengthlist_line_256x7_0sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_256x7_0sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 2, 5, 3, 5, 3, - 6, 3, 6, 4, 7, 6, 7, 8, 7, 9, 8, 9, 9, 9,10, 9, - 11,13,11,13,10,10,13,13,13,13,13,13,12,12,12,12, -}; - -static const static_codebook _huff_book_line_256x7_0sub3 = { - 1, 64, - (char *)_huff_lengthlist_line_256x7_0sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_256x7_1sub1[] = { - 0, 3, 3, 3, 3, 2, 4, 3, 4, -}; - -static const static_codebook _huff_book_line_256x7_1sub1 = { - 1, 9, - (char *)_huff_lengthlist_line_256x7_1sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_256x7_1sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 4, 3, 4, 4, - 5, 4, 6, 5, 6, 7, 6, 8, 8, -}; - -static const static_codebook _huff_book_line_256x7_1sub2 = { - 1, 25, - (char *)_huff_lengthlist_line_256x7_1sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_256x7_1sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 4, 3, 6, 3, 7, - 3, 8, 5, 8, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, -}; - -static const static_codebook _huff_book_line_256x7_1sub3 = { - 1, 64, - (char *)_huff_lengthlist_line_256x7_1sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_256x7_class0[] = { - 7, 5, 5, 9, 9, 6, 6, 9,12, 8, 7, 8,11, 8, 9,15, - 6, 3, 3, 7, 7, 4, 3, 6, 9, 6, 5, 6, 8, 6, 8,15, - 8, 5, 5, 9, 8, 5, 4, 6,10, 7, 5, 5,11, 8, 7,15, - 14,15,13,13,13,13, 8,11,15,10, 7, 6,11, 9,10,15, -}; - -static const static_codebook _huff_book_line_256x7_class0 = { - 1, 64, - (char *)_huff_lengthlist_line_256x7_class0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_256x7_class1[] = { - 5, 6, 8,15, 6, 9,10,15,10,11,12,15,15,15,15,15, - 4, 6, 7,15, 6, 7, 8,15, 9, 8, 9,15,15,15,15,15, - 6, 8, 9,15, 7, 7, 8,15,10, 9,10,15,15,15,15,15, - 15,13,15,15,15,10,11,15,15,13,13,15,15,15,15,15, - 4, 6, 7,15, 6, 8, 9,15,10,10,12,15,15,15,15,15, - 2, 5, 6,15, 5, 6, 7,15, 8, 6, 7,15,15,15,15,15, - 5, 6, 8,15, 5, 6, 7,15, 9, 6, 7,15,15,15,15,15, - 14,12,13,15,12,10,11,15,15,15,15,15,15,15,15,15, - 7, 8, 9,15, 9,10,10,15,15,14,14,15,15,15,15,15, - 5, 6, 7,15, 7, 8, 9,15,12, 9,10,15,15,15,15,15, - 7, 7, 9,15, 7, 7, 8,15,12, 8, 9,15,15,15,15,15, - 13,13,14,15,12,11,12,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 13,13,13,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,12,13,15,15,12,13,15,15,14,15,15,15,15,15,15, - 15,15,15,15,15,15,13,15,15,15,15,15,15,15,15,15, -}; - -static const static_codebook _huff_book_line_256x7_class1 = { - 1, 256, - (char *)_huff_lengthlist_line_256x7_class1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_512x17_0sub0[] = { - 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 6, 5, 6, 6, 6, 6, 5, 6, 6, 7, 6, 7, 6, 7, 6, - 7, 6, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 9, 7, 9, 7, - 9, 7, 9, 8, 9, 8,10, 8,10, 8,10, 7,10, 6,10, 8, - 10, 8,11, 7,10, 7,11, 8,11,11,12,12,11,11,12,11, - 13,11,13,11,13,12,15,12,13,13,14,14,14,14,14,15, - 15,15,16,14,17,19,19,18,18,18,18,18,18,18,18,18, - 18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18, -}; - -static const static_codebook _huff_book_line_512x17_0sub0 = { - 1, 128, - (char *)_huff_lengthlist_line_512x17_0sub0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_512x17_1sub0[] = { - 2, 4, 5, 4, 5, 4, 5, 4, 5, 5, 5, 5, 5, 5, 6, 5, - 6, 5, 6, 6, 7, 6, 7, 6, 8, 7, 8, 7, 8, 7, 8, 7, -}; - -static const static_codebook _huff_book_line_512x17_1sub0 = { - 1, 32, - (char *)_huff_lengthlist_line_512x17_1sub0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_512x17_1sub1[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 3, 5, 3, 5, 4, 5, 4, 5, 4, 5, 5, 5, 5, 6, 5, - 6, 5, 7, 5, 8, 6, 8, 6, 8, 6, 8, 6, 8, 7, 9, 7, - 9, 7,11, 9,11,11,12,11,14,12,14,16,14,16,13,16, - 14,16,12,15,13,16,14,16,13,14,12,15,13,15,13,13, - 13,15,12,14,14,15,13,15,12,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, -}; - -static const static_codebook _huff_book_line_512x17_1sub1 = { - 1, 128, - (char *)_huff_lengthlist_line_512x17_1sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_512x17_2sub1[] = { - 0, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 5, 4, 5, 3, - 5, 3, -}; - -static const static_codebook _huff_book_line_512x17_2sub1 = { - 1, 18, - (char *)_huff_lengthlist_line_512x17_2sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_512x17_2sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 3, 4, 3, 4, 4, 5, 4, 5, 4, 6, 4, 6, 5, - 6, 5, 7, 5, 7, 6, 8, 6, 8, 6, 8, 7, 8, 7, 9, 7, - 9, 8, -}; - -static const static_codebook _huff_book_line_512x17_2sub2 = { - 1, 50, - (char *)_huff_lengthlist_line_512x17_2sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_512x17_2sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 3, 3, 3, 4, 3, 4, 4, 5, 5, 6, 6, 7, 7, - 7, 8, 8,11, 8, 9, 9, 9,10,11,11,11, 9,10,10,11, - 11,11,11,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, -}; - -static const static_codebook _huff_book_line_512x17_2sub3 = { - 1, 128, - (char *)_huff_lengthlist_line_512x17_2sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_512x17_3sub1[] = { - 0, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 5, 4, 5, - 5, 5, -}; - -static const static_codebook _huff_book_line_512x17_3sub1 = { - 1, 18, - (char *)_huff_lengthlist_line_512x17_3sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_512x17_3sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 3, 3, 4, 3, 5, 4, 6, 4, 6, 5, 7, 6, 7, - 6, 8, 6, 8, 7, 9, 8,10, 8,12, 9,13,10,15,10,15, - 11,14, -}; - -static const static_codebook _huff_book_line_512x17_3sub2 = { - 1, 50, - (char *)_huff_lengthlist_line_512x17_3sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_512x17_3sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 8, 4, 8, 4, 8, 4, 8, 5, 8, 5, 8, 6, 8, - 4, 8, 4, 8, 5, 8, 5, 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, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, -}; - -static const static_codebook _huff_book_line_512x17_3sub3 = { - 1, 128, - (char *)_huff_lengthlist_line_512x17_3sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_512x17_class1[] = { - 1, 2, 3, 6, 5, 4, 7, 7, -}; - -static const static_codebook _huff_book_line_512x17_class1 = { - 1, 8, - (char *)_huff_lengthlist_line_512x17_class1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_512x17_class2[] = { - 3, 3, 3,14, 5, 4, 4,11, 8, 6, 6,10,17,12,11,17, - 6, 5, 5,15, 5, 3, 4,11, 8, 5, 5, 8,16, 9,10,14, - 10, 8, 9,17, 8, 6, 6,13,10, 7, 7,10,16,11,13,14, - 17,17,17,17,17,16,16,16,16,15,16,16,16,16,16,16, -}; - -static const static_codebook _huff_book_line_512x17_class2 = { - 1, 64, - (char *)_huff_lengthlist_line_512x17_class2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_512x17_class3[] = { - 2, 4, 6,17, 4, 5, 7,17, 8, 7,10,17,17,17,17,17, - 3, 4, 6,15, 3, 3, 6,15, 7, 6, 9,17,17,17,17,17, - 6, 8,10,17, 6, 6, 8,16, 9, 8,10,17,17,15,16,17, - 17,17,17,17,12,15,15,16,12,15,15,16,16,16,16,16, -}; - -static const static_codebook _huff_book_line_512x17_class3 = { - 1, 64, - (char *)_huff_lengthlist_line_512x17_class3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x4_class0[] = { - 7, 7, 7,11, 6, 6, 7,11, 7, 6, 6,10,12,10,10,13, - 7, 7, 8,11, 7, 7, 7,11, 7, 6, 7,10,11,10,10,13, - 10,10, 9,12, 9, 9, 9,11, 8, 8, 8,11,13,11,10,14, - 15,15,14,15,15,14,13,14,15,12,12,17,17,17,17,17, - 7, 7, 6, 9, 6, 6, 6, 9, 7, 6, 6, 8,11,11,10,12, - 7, 7, 7, 9, 7, 6, 6, 9, 7, 6, 6, 9,13,10,10,11, - 10, 9, 8,10, 9, 8, 8,10, 8, 8, 7, 9,13,12,10,11, - 17,14,14,13,15,14,12,13,17,13,12,15,17,17,14,17, - 7, 6, 6, 7, 6, 6, 5, 7, 6, 6, 6, 6,11, 9, 9, 9, - 7, 7, 6, 7, 7, 6, 6, 7, 6, 6, 6, 6,10, 9, 8, 9, - 10, 9, 8, 8, 9, 8, 7, 8, 8, 7, 6, 8,11,10, 9,10, - 17,17,12,15,15,15,12,14,14,14,10,12,15,13,12,13, - 11,10, 8,10,11,10, 8, 8,10, 9, 7, 7,10, 9, 9,11, - 11,11, 9,10,11,10, 8, 9,10, 8, 6, 8,10, 9, 9,11, - 14,13,10,12,12,11,10,10, 8, 7, 8,10,10,11,11,12, - 17,17,15,17,17,17,17,17,17,13,12,17,17,17,14,17, -}; - -static const static_codebook _huff_book_line_128x4_class0 = { - 1, 256, - (char *)_huff_lengthlist_line_128x4_class0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x4_0sub0[] = { - 2, 2, 2, 2, -}; - -static const static_codebook _huff_book_line_128x4_0sub0 = { - 1, 4, - (char *)_huff_lengthlist_line_128x4_0sub0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x4_0sub1[] = { - 0, 0, 0, 0, 3, 2, 3, 2, 3, 3, -}; - -static const static_codebook _huff_book_line_128x4_0sub1 = { - 1, 10, - (char *)_huff_lengthlist_line_128x4_0sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x4_0sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 4, 3, 4, 3, - 4, 4, 5, 4, 5, 4, 6, 5, 6, -}; - -static const static_codebook _huff_book_line_128x4_0sub2 = { - 1, 25, - (char *)_huff_lengthlist_line_128x4_0sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x4_0sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 3, 5, 3, 5, 3, - 5, 4, 6, 5, 6, 5, 7, 6, 6, 7, 7, 9, 9,11,11,16, - 11,14,10,11,11,13,16,15,15,15,15,15,15,15,15,15, -}; - -static const static_codebook _huff_book_line_128x4_0sub3 = { - 1, 64, - (char *)_huff_lengthlist_line_128x4_0sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_256x4_class0[] = { - 6, 7, 7,12, 6, 6, 7,12, 7, 6, 6,10,15,12,11,13, - 7, 7, 8,13, 7, 7, 8,12, 7, 7, 7,11,12,12,11,13, - 10, 9, 9,11, 9, 9, 9,10,10, 8, 8,12,14,12,12,14, - 11,11,12,14,11,12,11,15,15,12,13,15,15,15,15,15, - 6, 6, 7,10, 6, 6, 6,11, 7, 6, 6, 9,14,12,11,13, - 7, 7, 7,10, 6, 6, 7, 9, 7, 7, 6,10,13,12,10,12, - 9, 9, 9,11, 9, 9, 8, 9, 9, 8, 8,10,13,12,10,12, - 12,12,11,13,12,12,11,12,15,13,12,15,15,15,14,14, - 6, 6, 6, 8, 6, 6, 5, 6, 7, 7, 6, 5,11,10, 9, 8, - 7, 6, 6, 7, 6, 6, 5, 6, 7, 7, 6, 6,11,10, 9, 8, - 8, 8, 8, 9, 8, 8, 7, 8, 8, 8, 6, 7,11,10, 9, 9, - 14,11,10,14,14,11,10,15,13,11, 9,11,15,12,12,11, - 11, 9, 8, 8,10, 9, 8, 9,11,10, 9, 8,12,11,12,11, - 13,10, 8, 9,11,10, 8, 9,10, 9, 8, 9,10, 8,12,12, - 15,11,10,10,13,11,10,10, 8, 8, 7,12,10, 9,11,12, - 15,12,11,15,13,11,11,15,12,14,11,13,15,15,13,13, -}; - -static const static_codebook _huff_book_line_256x4_class0 = { - 1, 256, - (char *)_huff_lengthlist_line_256x4_class0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_256x4_0sub0[] = { - 2, 2, 2, 2, -}; - -static const static_codebook _huff_book_line_256x4_0sub0 = { - 1, 4, - (char *)_huff_lengthlist_line_256x4_0sub0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_256x4_0sub1[] = { - 0, 0, 0, 0, 2, 2, 3, 3, 3, 3, -}; - -static const static_codebook _huff_book_line_256x4_0sub1 = { - 1, 10, - (char *)_huff_lengthlist_line_256x4_0sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_256x4_0sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 4, 3, 4, 3, - 5, 3, 5, 4, 5, 4, 6, 4, 6, -}; - -static const static_codebook _huff_book_line_256x4_0sub2 = { - 1, 25, - (char *)_huff_lengthlist_line_256x4_0sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_256x4_0sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 3, 5, 3, 5, 3, - 6, 4, 7, 4, 7, 5, 7, 6, 7, 6, 7, 8,10,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,12,12,12,12,12, -}; - -static const static_codebook _huff_book_line_256x4_0sub3 = { - 1, 64, - (char *)_huff_lengthlist_line_256x4_0sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x7_class0[] = { - 10, 7, 8,13, 9, 6, 7,11,10, 8, 8,12,17,17,17,17, - 7, 5, 5, 9, 6, 4, 4, 8, 8, 5, 5, 8,16,14,13,16, - 7, 5, 5, 7, 6, 3, 3, 5, 8, 5, 4, 7,14,12,12,15, - 10, 7, 8, 9, 7, 5, 5, 6, 9, 6, 5, 5,15,12, 9,10, -}; - -static const static_codebook _huff_book_line_128x7_class0 = { - 1, 64, - (char *)_huff_lengthlist_line_128x7_class0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x7_class1[] = { - 8,13,17,17, 8,11,17,17,11,13,17,17,17,17,17,17, - 6,10,16,17, 6,10,15,17, 8,10,16,17,17,17,17,17, - 9,13,15,17, 8,11,17,17,10,12,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 6,11,15,17, 7,10,15,17, 8,10,17,17,17,15,17,17, - 4, 8,13,17, 4, 7,13,17, 6, 8,15,17,16,15,17,17, - 6,11,15,17, 6, 9,13,17, 8,10,17,17,15,17,17,17, - 16,17,17,17,12,14,15,17,13,14,15,17,17,17,17,17, - 5,10,14,17, 5, 9,14,17, 7, 9,15,17,15,15,17,17, - 3, 7,12,17, 3, 6,11,17, 5, 7,13,17,12,12,17,17, - 5, 9,14,17, 3, 7,11,17, 5, 8,13,17,13,11,16,17, - 12,17,17,17, 9,14,15,17,10,11,14,17,16,14,17,17, - 8,12,17,17, 8,12,17,17,10,12,17,17,17,17,17,17, - 5,10,17,17, 5, 9,15,17, 7, 9,17,17,13,13,17,17, - 7,11,17,17, 6,10,15,17, 7, 9,15,17,12,11,17,17, - 12,15,17,17,11,14,17,17,11,10,15,17,17,16,17,17, -}; - -static const static_codebook _huff_book_line_128x7_class1 = { - 1, 256, - (char *)_huff_lengthlist_line_128x7_class1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x7_0sub1[] = { - 0, 3, 3, 3, 3, 3, 3, 3, 3, -}; - -static const static_codebook _huff_book_line_128x7_0sub1 = { - 1, 9, - (char *)_huff_lengthlist_line_128x7_0sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x7_0sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 4, 4, 4, 4, - 5, 4, 5, 4, 5, 4, 6, 4, 6, -}; - -static const static_codebook _huff_book_line_128x7_0sub2 = { - 1, 25, - (char *)_huff_lengthlist_line_128x7_0sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x7_0sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 3, 5, 3, 5, 4, - 5, 4, 5, 5, 5, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, - 7, 8, 9,11,13,13,13,13,13,13,13,13,13,13,13,13, -}; - -static const static_codebook _huff_book_line_128x7_0sub3 = { - 1, 64, - (char *)_huff_lengthlist_line_128x7_0sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x7_1sub1[] = { - 0, 3, 3, 2, 3, 3, 4, 3, 4, -}; - -static const static_codebook _huff_book_line_128x7_1sub1 = { - 1, 9, - (char *)_huff_lengthlist_line_128x7_1sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x7_1sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 3, 6, 3, 6, 3, - 6, 3, 7, 3, 8, 4, 9, 4, 9, -}; - -static const static_codebook _huff_book_line_128x7_1sub2 = { - 1, 25, - (char *)_huff_lengthlist_line_128x7_1sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x7_1sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 7, 2, 7, 3, 8, 4, - 9, 5, 9, 8,10,11,11,12,14,14,14,14,14,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,13,13,13,13, -}; - -static const static_codebook _huff_book_line_128x7_1sub3 = { - 1, 64, - (char *)_huff_lengthlist_line_128x7_1sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x11_class1[] = { - 1, 6, 3, 7, 2, 4, 5, 7, -}; - -static const static_codebook _huff_book_line_128x11_class1 = { - 1, 8, - (char *)_huff_lengthlist_line_128x11_class1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x11_class2[] = { - 1, 6,12,16, 4,12,15,16, 9,15,16,16,16,16,16,16, - 2, 5,11,16, 5,11,13,16, 9,13,16,16,16,16,16,16, - 4, 8,12,16, 5, 9,12,16, 9,13,15,16,16,16,16,16, - 15,16,16,16,11,14,13,16,12,15,16,16,16,16,16,15, -}; - -static const static_codebook _huff_book_line_128x11_class2 = { - 1, 64, - (char *)_huff_lengthlist_line_128x11_class2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x11_class3[] = { - 7, 6, 9,17, 7, 6, 8,17,12, 9,11,16,16,16,16,16, - 5, 4, 7,16, 5, 3, 6,14, 9, 6, 8,15,16,16,16,16, - 5, 4, 6,13, 3, 2, 4,11, 7, 4, 6,13,16,11,10,14, - 12,12,12,16, 9, 7,10,15,12, 9,11,16,16,15,15,16, -}; - -static const static_codebook _huff_book_line_128x11_class3 = { - 1, 64, - (char *)_huff_lengthlist_line_128x11_class3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x11_0sub0[] = { - 5, 5, 5, 5, 5, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, - 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 6, 6, 6, 7, 6, - 7, 6, 7, 6, 7, 6, 7, 6, 7, 6, 8, 6, 8, 6, 8, 7, - 8, 7, 8, 7, 8, 7, 9, 7, 9, 8, 9, 8, 9, 8,10, 8, - 10, 9,10, 9,10, 9,11, 9,11, 9,10,10,11,10,11,10, - 11,11,11,11,11,11,12,13,14,14,14,15,15,16,16,16, - 17,15,16,15,16,16,17,17,16,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, -}; - -static const static_codebook _huff_book_line_128x11_0sub0 = { - 1, 128, - (char *)_huff_lengthlist_line_128x11_0sub0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x11_1sub0[] = { - 2, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, - 6, 5, 6, 5, 6, 5, 7, 6, 7, 6, 7, 6, 8, 6, 8, 6, -}; - -static const static_codebook _huff_book_line_128x11_1sub0 = { - 1, 32, - (char *)_huff_lengthlist_line_128x11_1sub0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x11_1sub1[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 5, 3, 5, 3, 6, 4, 6, 4, 7, 4, 7, 4, 7, 4, 8, 4, - 8, 4, 9, 5, 9, 5, 9, 5, 9, 6,10, 6,10, 6,11, 7, - 10, 7,10, 8,11, 9,11, 9,11,10,11,11,12,11,11,12, - 15,15,12,14,11,14,12,14,11,14,13,14,12,14,11,14, - 11,14,12,14,11,14,11,14,13,13,14,14,14,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, -}; - -static const static_codebook _huff_book_line_128x11_1sub1 = { - 1, 128, - (char *)_huff_lengthlist_line_128x11_1sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x11_2sub1[] = { - 0, 4, 5, 4, 5, 4, 5, 3, 5, 3, 5, 3, 5, 4, 4, 4, - 5, 5, -}; - -static const static_codebook _huff_book_line_128x11_2sub1 = { - 1, 18, - (char *)_huff_lengthlist_line_128x11_2sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x11_2sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 3, 3, 4, 4, 4, 4, 5, 4, 5, 4, 6, 5, 7, - 5, 7, 6, 8, 6, 8, 6, 9, 7, 9, 7,10, 7, 9, 8,11, - 8,11, -}; - -static const static_codebook _huff_book_line_128x11_2sub2 = { - 1, 50, - (char *)_huff_lengthlist_line_128x11_2sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x11_2sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 8, 3, 8, 4, 8, 4, 8, 6, 8, 5, 8, 4, 8, - 4, 8, 6, 8, 7, 8, 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, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, -}; - -static const static_codebook _huff_book_line_128x11_2sub3 = { - 1, 128, - (char *)_huff_lengthlist_line_128x11_2sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x11_3sub1[] = { - 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, - 5, 4, -}; - -static const static_codebook _huff_book_line_128x11_3sub1 = { - 1, 18, - (char *)_huff_lengthlist_line_128x11_3sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x11_3sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 3, 5, 4, 6, 4, 6, 4, 7, 4, 7, 4, 8, 4, - 8, 4, 9, 4, 9, 4,10, 4,10, 5,10, 5,11, 5,12, 6, - 12, 6, -}; - -static const static_codebook _huff_book_line_128x11_3sub2 = { - 1, 50, - (char *)_huff_lengthlist_line_128x11_3sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x11_3sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 7, 1, 6, 3, 7, 3, 8, 4, 8, 5, 8, 8, 8, 9, - 7, 8, 8, 7, 7, 7, 8, 9,10, 9, 9,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, -}; - -static const static_codebook _huff_book_line_128x11_3sub3 = { - 1, 128, - (char *)_huff_lengthlist_line_128x11_3sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x17_class1[] = { - 1, 3, 4, 7, 2, 5, 6, 7, -}; - -static const static_codebook _huff_book_line_128x17_class1 = { - 1, 8, - (char *)_huff_lengthlist_line_128x17_class1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x17_class2[] = { - 1, 4,10,19, 3, 8,13,19, 7,12,19,19,19,19,19,19, - 2, 6,11,19, 8,13,19,19, 9,11,19,19,19,19,19,19, - 6, 7,13,19, 9,13,19,19,10,13,18,18,18,18,18,18, - 18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18, -}; - -static const static_codebook _huff_book_line_128x17_class2 = { - 1, 64, - (char *)_huff_lengthlist_line_128x17_class2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x17_class3[] = { - 3, 6,10,17, 4, 8,11,20, 8,10,11,20,20,20,20,20, - 2, 4, 8,18, 4, 6, 8,17, 7, 8,10,20,20,17,20,20, - 3, 5, 8,17, 3, 4, 6,17, 8, 8,10,17,17,12,16,20, - 13,13,15,20,10,10,12,20,15,14,15,20,20,20,19,19, -}; - -static const static_codebook _huff_book_line_128x17_class3 = { - 1, 64, - (char *)_huff_lengthlist_line_128x17_class3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x17_0sub0[] = { - 5, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, - 7, 5, 7, 5, 7, 5, 7, 5, 7, 5, 7, 5, 8, 5, 8, 5, - 8, 5, 8, 5, 8, 6, 8, 6, 8, 6, 9, 6, 9, 6, 9, 6, - 9, 6, 9, 7, 9, 7, 9, 7, 9, 7,10, 7,10, 8,10, 8, - 10, 8,10, 8,10, 8,11, 8,11, 8,11, 8,11, 8,11, 9, - 12, 9,12, 9,12, 9,12, 9,12,10,12,10,13,11,13,11, - 14,12,14,13,15,14,16,14,17,15,18,16,20,20,20,20, - 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, -}; - -static const static_codebook _huff_book_line_128x17_0sub0 = { - 1, 128, - (char *)_huff_lengthlist_line_128x17_0sub0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x17_1sub0[] = { - 2, 5, 5, 4, 5, 4, 5, 4, 5, 5, 5, 5, 5, 5, 6, 5, - 6, 5, 6, 5, 7, 6, 7, 6, 7, 6, 8, 6, 9, 7, 9, 7, -}; - -static const static_codebook _huff_book_line_128x17_1sub0 = { - 1, 32, - (char *)_huff_lengthlist_line_128x17_1sub0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x17_1sub1[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 3, 5, 3, 5, 3, 6, 3, 6, 4, 6, 4, 7, 4, 7, 5, - 8, 5, 8, 6, 9, 7, 9, 7, 9, 8,10, 9,10, 9,11,10, - 11,11,11,11,11,11,12,12,12,13,12,13,12,14,12,15, - 12,14,12,16,13,17,13,17,14,17,14,16,13,17,14,17, - 14,17,15,17,15,15,16,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,16,16,16,16,16,16,16,16,16,16, -}; - -static const static_codebook _huff_book_line_128x17_1sub1 = { - 1, 128, - (char *)_huff_lengthlist_line_128x17_1sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x17_2sub1[] = { - 0, 4, 5, 4, 6, 4, 8, 3, 9, 3, 9, 2, 9, 3, 8, 4, - 9, 4, -}; - -static const static_codebook _huff_book_line_128x17_2sub1 = { - 1, 18, - (char *)_huff_lengthlist_line_128x17_2sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x17_2sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 1, 5, 3, 5, 3, 5, 4, 7, 5,10, 7,10, 7, - 12,10,14,10,14, 9,14,11,14,14,14,13,13,13,13,13, - 13,13, -}; - -static const static_codebook _huff_book_line_128x17_2sub2 = { - 1, 50, - (char *)_huff_lengthlist_line_128x17_2sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x17_2sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 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, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, -}; - -static const static_codebook _huff_book_line_128x17_2sub3 = { - 1, 128, - (char *)_huff_lengthlist_line_128x17_2sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x17_3sub1[] = { - 0, 4, 4, 4, 4, 4, 4, 4, 5, 3, 5, 3, 5, 4, 6, 4, - 6, 4, -}; - -static const static_codebook _huff_book_line_128x17_3sub1 = { - 1, 18, - (char *)_huff_lengthlist_line_128x17_3sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x17_3sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 3, 6, 3, 6, 4, 7, 4, 7, 4, 7, 4, 8, 4, - 8, 4, 8, 4, 8, 4, 9, 4, 9, 5,10, 5,10, 7,10, 8, - 10, 8, -}; - -static const static_codebook _huff_book_line_128x17_3sub2 = { - 1, 50, - (char *)_huff_lengthlist_line_128x17_3sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_128x17_3sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 2, 4, 3, 4, 4, 4, 5, 4, 7, 5, 8, 5,11, - 6,10, 6,12, 7,12, 7,12, 8,12, 8,12,10,12,12,12, - 12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, -}; - -static const static_codebook _huff_book_line_128x17_3sub3 = { - 1, 128, - (char *)_huff_lengthlist_line_128x17_3sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_1024x27_class1[] = { - 2,10, 8,14, 7,12,11,14, 1, 5, 3, 7, 4, 9, 7,13, -}; - -static const static_codebook _huff_book_line_1024x27_class1 = { - 1, 16, - (char *)_huff_lengthlist_line_1024x27_class1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_1024x27_class2[] = { - 1, 4, 2, 6, 3, 7, 5, 7, -}; - -static const static_codebook _huff_book_line_1024x27_class2 = { - 1, 8, - (char *)_huff_lengthlist_line_1024x27_class2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_1024x27_class3[] = { - 1, 5, 7,21, 5, 8, 9,21,10, 9,12,20,20,16,20,20, - 4, 8, 9,20, 6, 8, 9,20,11,11,13,20,20,15,17,20, - 9,11,14,20, 8,10,15,20,11,13,15,20,20,20,20,20, - 20,20,20,20,13,20,20,20,18,18,20,20,20,20,20,20, - 3, 6, 8,20, 6, 7, 9,20,10, 9,12,20,20,20,20,20, - 5, 7, 9,20, 6, 6, 9,20,10, 9,12,20,20,20,20,20, - 8,10,13,20, 8, 9,12,20,11,10,12,20,20,20,20,20, - 18,20,20,20,15,17,18,20,18,17,18,20,20,20,20,20, - 7,10,12,20, 8, 9,11,20,14,13,14,20,20,20,20,20, - 6, 9,12,20, 7, 8,11,20,12,11,13,20,20,20,20,20, - 9,11,15,20, 8,10,14,20,12,11,14,20,20,20,20,20, - 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, - 11,16,18,20,15,15,17,20,20,17,20,20,20,20,20,20, - 9,14,16,20,12,12,15,20,17,15,18,20,20,20,20,20, - 16,19,18,20,15,16,20,20,17,17,20,20,20,20,20,20, - 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, -}; - -static const static_codebook _huff_book_line_1024x27_class3 = { - 1, 256, - (char *)_huff_lengthlist_line_1024x27_class3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_1024x27_class4[] = { - 2, 3, 7,13, 4, 4, 7,15, 8, 6, 9,17,21,16,15,21, - 2, 5, 7,11, 5, 5, 7,14, 9, 7,10,16,17,15,16,21, - 4, 7,10,17, 7, 7, 9,15,11, 9,11,16,21,18,15,21, - 18,21,21,21,15,17,17,19,21,19,18,20,21,21,21,20, -}; - -static const static_codebook _huff_book_line_1024x27_class4 = { - 1, 64, - (char *)_huff_lengthlist_line_1024x27_class4, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_1024x27_0sub0[] = { - 5, 5, 5, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, - 6, 5, 6, 5, 6, 5, 6, 5, 7, 5, 7, 5, 7, 5, 7, 5, - 8, 6, 8, 6, 8, 6, 9, 6, 9, 6,10, 6,10, 6,11, 6, - 11, 7,11, 7,12, 7,12, 7,12, 7,12, 7,12, 7,12, 7, - 12, 7,12, 8,13, 8,12, 8,12, 8,13, 8,13, 9,13, 9, - 13, 9,13, 9,12,10,12,10,13,10,14,11,14,12,14,13, - 14,13,14,14,15,16,15,15,15,14,15,17,21,22,22,21, - 22,22,22,22,22,22,21,21,21,21,21,21,21,21,21,21, -}; - -static const static_codebook _huff_book_line_1024x27_0sub0 = { - 1, 128, - (char *)_huff_lengthlist_line_1024x27_0sub0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_1024x27_1sub0[] = { - 2, 5, 5, 4, 5, 4, 5, 4, 5, 4, 6, 5, 6, 5, 6, 5, - 6, 5, 7, 5, 7, 6, 8, 6, 8, 6, 8, 6, 9, 6, 9, 6, -}; - -static const static_codebook _huff_book_line_1024x27_1sub0 = { - 1, 32, - (char *)_huff_lengthlist_line_1024x27_1sub0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_1024x27_1sub1[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 5, 8, 4, 9, 4, 9, 4, 9, 4, 9, 4, 9, 4, 9, 4, - 9, 4, 9, 4, 9, 4, 8, 4, 8, 4, 9, 5, 9, 5, 9, 5, - 9, 5, 9, 6,10, 6,10, 7,10, 8,11, 9,11,11,12,13, - 12,14,13,15,13,15,14,16,14,17,15,17,15,15,16,16, - 15,16,16,16,15,18,16,15,17,17,19,19,19,19,19,19, - 19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19, -}; - -static const static_codebook _huff_book_line_1024x27_1sub1 = { - 1, 128, - (char *)_huff_lengthlist_line_1024x27_1sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_1024x27_2sub0[] = { - 1, 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 5, 6, 5, 6, 5, - 6, 6, 7, 7, 7, 7, 8, 7, 8, 8, 9, 8,10, 9,10, 9, -}; - -static const static_codebook _huff_book_line_1024x27_2sub0 = { - 1, 32, - (char *)_huff_lengthlist_line_1024x27_2sub0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_1024x27_2sub1[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 3, 4, 3, 4, 4, 5, 4, 5, 4, 5, 5, 6, 5, 6, 5, - 7, 5, 7, 6, 7, 6, 8, 7, 8, 7, 8, 7, 9, 8, 9, 9, - 9, 9,10,10,10,11, 9,12, 9,12, 9,15,10,14, 9,13, - 10,13,10,12,10,12,10,13,10,12,11,13,11,14,12,13, - 13,14,14,13,14,15,14,16,13,13,14,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,15,15, -}; - -static const static_codebook _huff_book_line_1024x27_2sub1 = { - 1, 128, - (char *)_huff_lengthlist_line_1024x27_2sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_1024x27_3sub1[] = { - 0, 4, 5, 4, 5, 3, 5, 3, 5, 3, 5, 4, 4, 4, 4, 5, - 5, 5, -}; - -static const static_codebook _huff_book_line_1024x27_3sub1 = { - 1, 18, - (char *)_huff_lengthlist_line_1024x27_3sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_1024x27_3sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 3, 4, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, - 5, 7, 5, 8, 6, 8, 6, 9, 7,10, 7,10, 8,10, 8,11, - 9,11, -}; - -static const static_codebook _huff_book_line_1024x27_3sub2 = { - 1, 50, - (char *)_huff_lengthlist_line_1024x27_3sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_1024x27_3sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 7, 3, 8, 3,10, 3, 8, 3, 9, 3, 8, 4, 9, - 4, 9, 5, 9, 6,10, 6, 9, 7,11, 7,12, 9,13,10,13, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, -}; - -static const static_codebook _huff_book_line_1024x27_3sub3 = { - 1, 128, - (char *)_huff_lengthlist_line_1024x27_3sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_1024x27_4sub1[] = { - 0, 4, 5, 4, 5, 4, 5, 4, 5, 3, 5, 3, 5, 3, 5, 4, - 5, 4, -}; - -static const static_codebook _huff_book_line_1024x27_4sub1 = { - 1, 18, - (char *)_huff_lengthlist_line_1024x27_4sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_1024x27_4sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 2, 4, 2, 5, 3, 5, 4, 6, 6, 6, 7, 7, 8, - 7, 8, 7, 8, 7, 9, 8, 9, 8, 9, 8,10, 8,11, 9,12, - 9,12, -}; - -static const static_codebook _huff_book_line_1024x27_4sub2 = { - 1, 50, - (char *)_huff_lengthlist_line_1024x27_4sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_1024x27_4sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 5, 2, 6, 3, 6, 4, 7, 4, 7, 5, 9, 5,11, - 6,11, 6,11, 7,11, 6,11, 6,11, 9,11, 8,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,10,10,10,10,10,10, -}; - -static const static_codebook _huff_book_line_1024x27_4sub3 = { - 1, 128, - (char *)_huff_lengthlist_line_1024x27_4sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_2048x27_class1[] = { - 2, 6, 8, 9, 7,11,13,13, 1, 3, 5, 5, 6, 6,12,10, -}; - -static const static_codebook _huff_book_line_2048x27_class1 = { - 1, 16, - (char *)_huff_lengthlist_line_2048x27_class1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_2048x27_class2[] = { - 1, 2, 3, 6, 4, 7, 5, 7, -}; - -static const static_codebook _huff_book_line_2048x27_class2 = { - 1, 8, - (char *)_huff_lengthlist_line_2048x27_class2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_2048x27_class3[] = { - 3, 3, 6,16, 5, 5, 7,16, 9, 8,11,16,16,16,16,16, - 5, 5, 8,16, 5, 5, 7,16, 8, 7, 9,16,16,16,16,16, - 9, 9,12,16, 6, 8,11,16, 9,10,11,16,16,16,16,16, - 16,16,16,16,13,16,16,16,15,16,16,16,16,16,16,16, - 5, 4, 7,16, 6, 5, 8,16, 9, 8,10,16,16,16,16,16, - 5, 5, 7,15, 5, 4, 6,15, 7, 6, 8,16,16,16,16,16, - 9, 9,11,15, 7, 7, 9,16, 8, 8, 9,16,16,16,16,16, - 16,16,16,16,15,15,15,16,15,15,14,16,16,16,16,16, - 8, 8,11,16, 8, 9,10,16,11,10,14,16,16,16,16,16, - 6, 8,10,16, 6, 7,10,16, 8, 8,11,16,14,16,16,16, - 10,11,14,16, 9, 9,11,16,10,10,11,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,15,16,16,16,16,16,16,16,16,16,16,16, - 12,16,15,16,12,14,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, -}; - -static const static_codebook _huff_book_line_2048x27_class3 = { - 1, 256, - (char *)_huff_lengthlist_line_2048x27_class3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_2048x27_class4[] = { - 2, 4, 7,13, 4, 5, 7,15, 8, 7,10,16,16,14,16,16, - 2, 4, 7,16, 3, 4, 7,14, 8, 8,10,16,16,16,15,16, - 6, 8,11,16, 7, 7, 9,16,11, 9,13,16,16,16,15,16, - 16,16,16,16,14,16,16,16,16,16,16,16,16,16,16,16, -}; - -static const static_codebook _huff_book_line_2048x27_class4 = { - 1, 64, - (char *)_huff_lengthlist_line_2048x27_class4, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_2048x27_0sub0[] = { - 5, 5, 5, 5, 5, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, - 6, 5, 7, 5, 7, 5, 7, 5, 8, 5, 8, 5, 8, 5, 9, 5, - 9, 6,10, 6,10, 6,11, 6,11, 6,11, 6,11, 6,11, 6, - 11, 6,11, 6,12, 7,11, 7,11, 7,11, 7,11, 7,10, 7, - 11, 7,11, 7,12, 7,11, 8,11, 8,11, 8,11, 8,13, 8, - 12, 9,11, 9,11, 9,11,10,12,10,12, 9,12,10,12,11, - 14,12,16,12,12,11,14,16,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,16,16,16,16, -}; - -static const static_codebook _huff_book_line_2048x27_0sub0 = { - 1, 128, - (char *)_huff_lengthlist_line_2048x27_0sub0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_2048x27_1sub0[] = { - 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 6, 6, 6, 6, 6, 6, 7, 6, 7, 6, 7, 6, 7, 6, -}; - -static const static_codebook _huff_book_line_2048x27_1sub0 = { - 1, 32, - (char *)_huff_lengthlist_line_2048x27_1sub0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_2048x27_1sub1[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 5, 7, 5, 7, 4, 7, 4, 8, 4, 8, 4, 8, 4, 8, 3, - 8, 4, 9, 4, 9, 4, 9, 4, 9, 4, 9, 5, 9, 5, 9, 6, - 9, 7, 9, 8, 9, 9, 9,10, 9,11, 9,14, 9,15,10,15, - 10,15,10,15,10,15,11,15,10,14,12,14,11,14,13,14, - 13,15,15,15,12,15,15,15,13,15,13,15,13,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, -}; - -static const static_codebook _huff_book_line_2048x27_1sub1 = { - 1, 128, - (char *)_huff_lengthlist_line_2048x27_1sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_2048x27_2sub0[] = { - 2, 4, 5, 4, 5, 4, 5, 4, 5, 5, 5, 5, 5, 5, 6, 5, - 6, 5, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, -}; - -static const static_codebook _huff_book_line_2048x27_2sub0 = { - 1, 32, - (char *)_huff_lengthlist_line_2048x27_2sub0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_2048x27_2sub1[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 4, 3, 4, 3, 4, 4, 5, 4, 5, 5, 5, 6, 6, 6, 7, - 6, 8, 6, 8, 6, 9, 7,10, 7,10, 7,10, 7,12, 7,12, - 7,12, 9,12,11,12,10,12,10,12,11,12,12,12,10,12, - 10,12,10,12, 9,12,11,12,12,12,12,12,11,12,11,12, - 12,12,12,12,12,12,12,12,10,10,12,12,12,12,12,10, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, -}; - -static const static_codebook _huff_book_line_2048x27_2sub1 = { - 1, 128, - (char *)_huff_lengthlist_line_2048x27_2sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_2048x27_3sub1[] = { - 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 5, 5, -}; - -static const static_codebook _huff_book_line_2048x27_3sub1 = { - 1, 18, - (char *)_huff_lengthlist_line_2048x27_3sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_2048x27_3sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, - 6, 7, 6, 7, 6, 8, 6, 9, 7, 9, 7, 9, 9,11, 9,12, - 10,12, -}; - -static const static_codebook _huff_book_line_2048x27_3sub2 = { - 1, 50, - (char *)_huff_lengthlist_line_2048x27_3sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_2048x27_3sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 6, 3, 7, 3, 7, 5, 7, 7, 7, 7, 7, 6, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, -}; - -static const static_codebook _huff_book_line_2048x27_3sub3 = { - 1, 128, - (char *)_huff_lengthlist_line_2048x27_3sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_2048x27_4sub1[] = { - 0, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 5, 4, 5, 4, - 4, 5, -}; - -static const static_codebook _huff_book_line_2048x27_4sub1 = { - 1, 18, - (char *)_huff_lengthlist_line_2048x27_4sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_2048x27_4sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 2, 4, 3, 4, 4, 4, 5, 5, 6, 5, 6, 5, 7, - 6, 6, 6, 7, 7, 7, 8, 9, 9, 9,12,10,11,10,10,12, - 10,10, -}; - -static const static_codebook _huff_book_line_2048x27_4sub2 = { - 1, 50, - (char *)_huff_lengthlist_line_2048x27_4sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_2048x27_4sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 6, 5, 7, 5, 7, 7, 7, 7, 7, 5, 7, 5, 7, - 5, 7, 5, 7, 7, 7, 7, 7, 4, 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, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, -}; - -static const static_codebook _huff_book_line_2048x27_4sub3 = { - 1, 128, - (char *)_huff_lengthlist_line_2048x27_4sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_256x4low_class0[] = { - 4, 5, 6,11, 5, 5, 6,10, 7, 7, 6, 6,14,13, 9, 9, - 6, 6, 6,10, 6, 6, 6, 9, 8, 7, 7, 9,14,12, 8,11, - 8, 7, 7,11, 8, 8, 7,11, 9, 9, 7, 9,13,11, 9,13, - 19,19,18,19,15,16,16,19,11,11,10,13,10,10, 9,15, - 5, 5, 6,13, 6, 6, 6,11, 8, 7, 6, 7,14,11,10,11, - 6, 6, 6,12, 7, 6, 6,11, 8, 7, 7,11,13,11, 9,11, - 9, 7, 6,12, 8, 7, 6,12, 9, 8, 8,11,13,10, 7,13, - 19,19,17,19,17,14,14,19,12,10, 8,12,13,10, 9,16, - 7, 8, 7,12, 7, 7, 7,11, 8, 7, 7, 8,12,12,11,11, - 8, 8, 7,12, 8, 7, 6,11, 8, 7, 7,10,10,11,10,11, - 9, 8, 8,13, 9, 8, 7,12,10, 9, 7,11, 9, 8, 7,11, - 18,18,15,18,18,16,17,18,15,11,10,18,11, 9, 9,18, - 16,16,13,16,12,11,10,16,12,11, 9, 6,15,12,11,13, - 16,16,14,14,13,11,12,16,12, 9, 9,13,13,10,10,12, - 17,18,17,17,14,15,14,16,14,12,14,15,12,10,11,12, - 18,18,18,18,18,18,18,18,18,12,13,18,16,11, 9,18, -}; - -static const static_codebook _huff_book_line_256x4low_class0 = { - 1, 256, - (char *)_huff_lengthlist_line_256x4low_class0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_256x4low_0sub0[] = { - 1, 3, 2, 3, -}; - -static const static_codebook _huff_book_line_256x4low_0sub0 = { - 1, 4, - (char *)_huff_lengthlist_line_256x4low_0sub0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_256x4low_0sub1[] = { - 0, 0, 0, 0, 2, 3, 2, 3, 3, 3, -}; - -static const static_codebook _huff_book_line_256x4low_0sub1 = { - 1, 10, - (char *)_huff_lengthlist_line_256x4low_0sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_256x4low_0sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 4, 3, 4, - 4, 4, 4, 4, 5, 5, 5, 6, 6, -}; - -static const static_codebook _huff_book_line_256x4low_0sub2 = { - 1, 25, - (char *)_huff_lengthlist_line_256x4low_0sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist_line_256x4low_0sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 2, 4, 3, 5, 4, - 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 8, 6, 9, - 7,12,11,16,13,16,12,15,13,15,12,14,12,15,15,15, -}; - -static const static_codebook _huff_book_line_256x4low_0sub3 = { - 1, 64, - (char *)_huff_lengthlist_line_256x4low_0sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/books/uncoupled/res_books_uncoupled.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/books/uncoupled/res_books_uncoupled.h deleted file mode 100644 index 736353b6..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/books/uncoupled/res_books_uncoupled.h +++ /dev/null @@ -1,7758 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: static codebooks autogenerated by huff/huffbuld - last modified: $Id: res_books_uncoupled.h 19057 2014-01-22 12:32:31Z xiphmont $ - - ********************************************************************/ - -#include "codebook.h" - -static const long _vq_quantlist__16u0__p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__16u0__p1_0[] = { - 1, 4, 4, 5, 7, 7, 5, 7, 8, 5, 8, 8, 8,10,10, 8, - 10,11, 5, 8, 8, 8,10,10, 8,10,10, 4, 9, 9, 9,12, - 11, 8,11,11, 8,12,11,10,12,14,10,13,13, 7,11,11, - 10,14,12,11,14,14, 4, 9, 9, 8,11,11, 9,11,12, 7, - 11,11,10,13,14,10,12,14, 8,11,12,10,14,14,10,13, - 12, -}; - -static const static_codebook _16u0__p1_0 = { - 4, 81, - (char *)_vq_lengthlist__16u0__p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__16u0__p1_0, - 0 -}; - -static const long _vq_quantlist__16u0__p2_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__16u0__p2_0[] = { - 2, 4, 4, 5, 6, 6, 5, 6, 6, 5, 7, 7, 7, 8, 9, 7, - 8, 9, 5, 7, 7, 7, 9, 8, 7, 9, 7, 4, 7, 7, 7, 9, - 9, 7, 8, 8, 6, 9, 8, 7, 8,11, 9,11,10, 6, 8, 9, - 8,11, 8, 9,10,11, 4, 7, 7, 7, 8, 8, 7, 9, 9, 6, - 9, 8, 9,11,10, 8, 8,11, 6, 8, 9, 9,10,11, 8,11, - 8, -}; - -static const static_codebook _16u0__p2_0 = { - 4, 81, - (char *)_vq_lengthlist__16u0__p2_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__16u0__p2_0, - 0 -}; - -static const long _vq_quantlist__16u0__p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__16u0__p3_0[] = { - 1, 5, 5, 7, 7, 6, 7, 7, 8, 8, 6, 7, 8, 8, 8, 8, - 9, 9,11,11, 8, 9, 9,11,11, 6, 9, 8,10,10, 8,10, - 10,11,11, 8,10,10,11,11,10,11,10,13,12, 9,11,10, - 13,13, 6, 8, 9,10,10, 8,10,10,11,11, 8,10,10,11, - 11, 9,10,11,13,12,10,10,11,12,12, 8,11,11,14,13, - 10,12,11,15,13, 9,12,11,15,14,12,14,13,16,14,12, - 13,13,17,14, 8,11,11,13,14, 9,11,12,14,15,10,11, - 12,13,15,11,13,13,14,16,12,13,14,14,16, 5, 9, 9, - 11,11, 9,11,11,12,12, 8,11,11,12,12,11,12,12,15, - 14,10,12,12,15,15, 8,11,11,13,12,10,12,12,13,13, - 10,12,12,14,13,12,12,13,14,15,11,13,13,17,16, 7, - 11,11,13,13,10,12,12,14,13,10,12,12,13,14,12,13, - 12,15,14,11,13,13,15,14, 9,12,12,16,15,11,13,13, - 17,16,10,13,13,16,16,13,14,15,15,16,13,15,14,19, - 17, 9,12,12,14,16,11,13,13,15,16,10,13,13,17,16, - 13,14,13,17,15,12,15,15,16,17, 5, 9, 9,11,11, 8, - 11,11,13,12, 9,11,11,12,12,10,12,12,14,15,11,12, - 12,14,14, 7,11,10,13,12,10,12,12,14,13,10,11,12, - 13,13,11,13,13,15,16,12,12,13,15,15, 7,11,11,13, - 13,10,13,13,14,14,10,12,12,13,13,11,13,13,16,15, - 12,13,13,15,14, 9,12,12,15,15,10,13,13,17,16,11, - 12,13,15,15,12,15,14,18,18,13,14,14,16,17, 9,12, - 12,15,16,10,13,13,15,16,11,13,13,15,16,13,15,15, - 17,17,13,15,14,16,15, 7,11,11,15,16,10,13,12,16, - 17,10,12,13,15,17,15,16,16,18,17,13,15,15,17,18, - 8,12,12,16,16,11,13,14,17,18,11,13,13,18,16,15, - 17,16,17,19,14,15,15,17,16, 8,12,12,16,15,11,14, - 13,18,17,11,13,14,18,17,15,16,16,18,17,13,16,16, - 18,18,11,15,14,18,17,13,14,15,18, 0,12,15,15, 0, - 17,17,16,17,17,18,14,16,18,18, 0,11,14,14,17, 0, - 12,15,14,17,19,12,15,14,18, 0,15,18,16, 0,17,14, - 18,16,18, 0, 7,11,11,16,15,10,12,12,18,16,10,13, - 13,16,15,13,15,14,17,17,14,16,16,19,18, 8,12,12, - 16,16,11,13,13,18,16,11,13,14,17,16,14,15,15,19, - 18,15,16,16, 0,19, 8,12,12,16,17,11,13,13,17,17, - 11,14,13,17,17,13,15,15,17,19,15,17,17,19, 0,11, - 14,15,19,17,12,15,16,18,18,12,14,15,19,17,14,16, - 17, 0,18,16,16,19,17, 0,11,14,14,18,19,12,15,14, - 17,17,13,16,14,17,16,14,17,16,18,18,15,18,15, 0, - 18, -}; - -static const static_codebook _16u0__p3_0 = { - 4, 625, - (char *)_vq_lengthlist__16u0__p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__16u0__p3_0, - 0 -}; - -static const long _vq_quantlist__16u0__p4_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__16u0__p4_0[] = { - 3, 5, 5, 8, 8, 6, 6, 6, 9, 9, 6, 6, 6, 9, 9, 9, - 10, 9,11,11, 9, 9, 9,11,11, 6, 7, 7,10,10, 7, 7, - 8,10,10, 7, 7, 8,10,10,10,10,10,11,12, 9,10,10, - 11,12, 6, 7, 7,10,10, 7, 8, 7,10,10, 7, 8, 7,10, - 10,10,11,10,12,11,10,10,10,13,10, 9,10,10,12,12, - 10,11,10,14,12, 9,11,11,13,13,11,12,13,13,13,11, - 12,12,15,13, 9,10,10,12,13, 9,11,10,12,13,10,10, - 11,12,13,11,12,12,12,13,11,12,12,13,13, 5, 7, 7, - 10,10, 7, 8, 8,10,10, 7, 8, 8,10,10,10,11,10,12, - 13,10,10,11,12,12, 6, 8, 8,11,10, 7, 8, 9,10,12, - 8, 9, 9,11,11,11,10,11,11,12,10,11,11,13,12, 7, - 8, 8,10,11, 8, 9, 8,11,10, 8, 9, 9,11,11,10,12, - 10,13,11,10,11,11,13,13,10,11,10,14,13,10,10,11, - 13,13,10,12,11,14,13,12,11,13,12,13,13,12,13,14, - 14,10,11,11,13,13,10,11,10,12,13,10,12,12,12,14, - 12,12,12,14,12,12,13,12,17,15, 5, 7, 7,10,10, 7, - 8, 8,10,10, 7, 8, 8,11,10,10,10,11,12,12,10,11, - 11,12,13, 6, 8, 8,11,10, 8, 9, 9,11,11, 7, 8, 9, - 10,11,11,11,11,12,12,10,10,11,12,13, 6, 8, 8,10, - 11, 8, 9, 9,11,11, 7, 9, 7,11,10,10,12,12,13,13, - 11,11,10,13,11, 9,11,10,14,13,11,11,11,15,13,10, - 10,11,13,13,12,13,13,14,14,12,11,12,12,13,10,11, - 11,12,13,10,11,12,13,13,10,11,10,13,12,12,12,13, - 14, 0,12,13,11,13,11, 8,10,10,13,13,10,11,11,14, - 13,10,11,11,13,12,13,14,14,14,15,12,12,12,15,14, - 9,11,10,13,12,10,10,11,13,14,11,11,11,15,12,13, - 12,14,15,16,13,13,13,14,13, 9,11,11,12,12,10,12, - 11,13,13,10,11,11,13,14,13,13,13,15,15,13,13,14, - 17,15,11,12,12,14,14,10,11,12,13,15,12,13,13, 0, - 15,13,11,14,12,16,14,16,14, 0,15,11,12,12,14,16, - 11,13,12,16,15,12,13,13,14,15,12,14,12,15,13,15, - 14,14,16,16, 8,10,10,13,13,10,11,10,13,14,10,11, - 11,13,13,13,13,12,14,14,14,13,13,16,17, 9,10,10, - 12,14,10,12,11,14,13,10,11,12,13,14,12,12,12,15, - 15,13,13,13,14,14, 9,10,10,13,13,10,11,12,12,14, - 10,11,10,13,13,13,13,13,14,16,13,13,13,14,14,11, - 12,13,15,13,12,14,13,14,16,12,12,13,13,14,13,14, - 14,17,15,13,12,17,13,16,11,12,13,14,15,12,13,14, - 14,17,11,12,11,14,14,13,16,14,16, 0,14,15,11,15, - 11, -}; - -static const static_codebook _16u0__p4_0 = { - 4, 625, - (char *)_vq_lengthlist__16u0__p4_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__16u0__p4_0, - 0 -}; - -static const long _vq_quantlist__16u0__p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__16u0__p5_0[] = { - 1, 4, 4, 7, 7, 7, 7, 9, 9, 4, 6, 6, 8, 8, 8, 8, - 9, 9, 4, 6, 6, 8, 8, 8, 8, 9, 9, 7, 8, 8, 9, 9, - 9, 9,11,10, 7, 8, 8, 9, 9, 9, 9,10,11, 7, 8, 8, - 9, 9,10,10,11,11, 7, 8, 8, 9, 9,10,10,11,11, 9, - 9, 9,10,10,11,11,12,12, 9, 9, 9,10,10,11,11,12, - 12, -}; - -static const static_codebook _16u0__p5_0 = { - 2, 81, - (char *)_vq_lengthlist__16u0__p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__16u0__p5_0, - 0 -}; - -static const long _vq_quantlist__16u0__p6_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__16u0__p6_0[] = { - 1, 4, 4, 7, 7,10,10,12,12,13,13,18,17, 3, 6, 6, - 9, 9,11,11,13,13,14,14,18,17, 3, 6, 6, 9, 9,11, - 11,13,13,14,14,17,18, 7, 9, 9,11,11,13,13,14,14, - 15,15, 0, 0, 7, 9, 9,11,11,13,13,14,14,15,16,19, - 18,10,11,11,13,13,14,14,16,15,17,18, 0, 0,10,11, - 11,13,13,14,14,15,15,16,18, 0, 0,11,13,13,14,14, - 15,15,17,17, 0,19, 0, 0,11,13,13,14,14,14,15,16, - 18, 0,19, 0, 0,13,14,14,15,15,18,17,18,18, 0,19, - 0, 0,13,14,14,15,16,16,16,18,18,19, 0, 0, 0,16, - 17,17, 0,17,19,19, 0,19, 0, 0, 0, 0,16,19,16,17, - 18, 0,19, 0, 0, 0, 0, 0, 0, -}; - -static const static_codebook _16u0__p6_0 = { - 2, 169, - (char *)_vq_lengthlist__16u0__p6_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__16u0__p6_0, - 0 -}; - -static const long _vq_quantlist__16u0__p6_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__16u0__p6_1[] = { - 1, 4, 5, 6, 6, 4, 6, 6, 6, 6, 4, 6, 6, 6, 6, 6, - 6, 6, 7, 7, 6, 6, 6, 7, 7, -}; - -static const static_codebook _16u0__p6_1 = { - 2, 25, - (char *)_vq_lengthlist__16u0__p6_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__16u0__p6_1, - 0 -}; - -static const long _vq_quantlist__16u0__p7_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__16u0__p7_0[] = { - 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 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, 7, 7, 7, 7, 7, 7, 7, - 7, -}; - -static const static_codebook _16u0__p7_0 = { - 4, 81, - (char *)_vq_lengthlist__16u0__p7_0, - 1, -518803456, 1628680192, 2, 0, - (long *)_vq_quantlist__16u0__p7_0, - 0 -}; - -static const long _vq_quantlist__16u0__p7_1[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const char _vq_lengthlist__16u0__p7_1[] = { - 1, 5, 5, 6, 5, 9,10,11,11,10,10,10,10,10,10, 5, - 8, 8, 8,10,10,10,10,10,10,10,10,10,10,10, 5, 8, - 9, 9, 9,10,10,10,10,10,10,10,10,10,10, 5,10, 8, - 10,10,10,10,10,10,10,10,10,10,10,10, 4, 8, 9,10, - 10,10,10,10,10,10,10,10,10,10,10, 9,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10, 9,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10, -}; - -static const static_codebook _16u0__p7_1 = { - 2, 225, - (char *)_vq_lengthlist__16u0__p7_1, - 1, -520986624, 1620377600, 4, 0, - (long *)_vq_quantlist__16u0__p7_1, - 0 -}; - -static const long _vq_quantlist__16u0__p7_2[] = { - 10, - 9, - 11, - 8, - 12, - 7, - 13, - 6, - 14, - 5, - 15, - 4, - 16, - 3, - 17, - 2, - 18, - 1, - 19, - 0, - 20, -}; - -static const char _vq_lengthlist__16u0__p7_2[] = { - 1, 6, 6, 7, 8, 7, 7,10, 9,10, 9,11,10, 9,11,10, - 9, 9, 9, 9,10, 6, 8, 7, 9, 9, 8, 8,10,10, 9,11, - 11,12,12,10, 9,11, 9,12,10, 9, 6, 9, 8, 9,12, 8, - 8,11, 9,11,11,12,11,12,12,10,11,11,10,10,11, 7, - 10, 9, 9, 9, 9, 9,10, 9,10, 9,10,10,12,10,10,10, - 11,12,10,10, 7, 9, 9, 9,10, 9, 9,10,10, 9, 9, 9, - 11,11,10,10,10,10, 9, 9,12, 7, 9,10, 9,11, 9,10, - 9,10,11,11,11,10,11,12, 9,12,11,10,10,10, 7, 9, - 9, 9, 9,10,12,10, 9,11,12,10,11,12,12,11, 9,10, - 11,10,11, 7, 9,10,10,11,10, 9,10,11,11,11,10,12, - 12,12,11,11,10,11,11,12, 8, 9,10,12,11,10,10,12, - 12,12,12,12,10,11,11, 9,11,10,12,11,11, 8, 9,10, - 10,11,12,11,11,10,10,10,12,12,12, 9,10,12,12,12, - 12,12, 8,10,11,10,10,12, 9,11,12,12,11,12,12,12, - 12,10,12,10,10,10,10, 8,12,11,11,11,10,10,11,12, - 12,12,12,11,12,12,12,11,11,11,12,10, 9,10,10,12, - 10,12,10,12,12,10,10,10,11,12,12,12,11,12,12,12, - 11,10,11,12,12,12,11,12,12,11,12,12,11,12,12,12, - 12,11,12,12,10,10,10,10,11,11,12,11,12,12,12,12, - 12,12,12,11,12,11,10,11,11,12,11,11, 9,10,10,10, - 12,10,10,11, 9,11,12,11,12,11,12,12,10,11,10,12, - 9, 9, 9,12,11,10,11,10,12,10,12,10,12,12,12,11, - 11,11,11,11,10, 9,10,10,11,10,11,11,12,11,10,11, - 12,12,12,11,11, 9,12,10,12, 9,10,12,10,10,11,10, - 11,11,12,11,10,11,10,11,11,11,11,12,11,11,10, 9, - 10,10,10, 9,11,11,10, 9,12,10,11,12,11,12,12,11, - 12,11,12,11,10,11,10,12,11,12,11,12,11,12,10,11, - 10,10,12,11,10,11,11,11,10, -}; - -static const static_codebook _16u0__p7_2 = { - 2, 441, - (char *)_vq_lengthlist__16u0__p7_2, - 1, -529268736, 1611661312, 5, 0, - (long *)_vq_quantlist__16u0__p7_2, - 0 -}; - -static const char _huff_lengthlist__16u0__single[] = { - 3, 5, 8, 7,14, 8, 9,19, 5, 2, 5, 5, 9, 6, 9,19, - 8, 4, 5, 7, 8, 9,13,19, 7, 4, 6, 5, 9, 6, 9,19, - 12, 8, 7, 9,10,11,13,19, 8, 5, 8, 6, 9, 6, 7,19, - 8, 8,10, 7, 7, 4, 5,19,12,17,19,15,18,13,11,18, -}; - -static const static_codebook _huff_book__16u0__single = { - 2, 64, - (char *)_huff_lengthlist__16u0__single, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__16u1__long[] = { - 3, 6,10, 8,12, 8,14, 8,14,19, 5, 3, 5, 5, 7, 6, - 11, 7,16,19, 7, 5, 6, 7, 7, 9,11,12,19,19, 6, 4, - 7, 5, 7, 6,10, 7,18,18, 8, 6, 7, 7, 7, 7, 8, 9, - 18,18, 7, 5, 8, 5, 7, 5, 8, 6,18,18,12, 9,10, 9, - 9, 9, 8, 9,18,18, 8, 7,10, 6, 8, 5, 6, 4,11,18, - 11,15,16,12,11, 8, 8, 6, 9,18,14,18,18,18,16,16, - 16,13,16,18, -}; - -static const static_codebook _huff_book__16u1__long = { - 2, 100, - (char *)_huff_lengthlist__16u1__long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__16u1__p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__16u1__p1_0[] = { - 1, 4, 4, 5, 7, 7, 5, 7, 7, 5, 8, 7, 7,10,10, 7, - 9,10, 5, 7, 8, 7,10, 9, 7,10,10, 5, 8, 8, 8,10, - 10, 8,10,10, 7,10,10,10,11,12,10,12,13, 7,10,10, - 9,13,11,10,12,13, 5, 8, 8, 8,10,10, 8,10,10, 7, - 10,10,10,12,12, 9,11,12, 7,10,11,10,12,12,10,13, - 11, -}; - -static const static_codebook _16u1__p1_0 = { - 4, 81, - (char *)_vq_lengthlist__16u1__p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__16u1__p1_0, - 0 -}; - -static const long _vq_quantlist__16u1__p2_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__16u1__p2_0[] = { - 3, 4, 4, 5, 6, 6, 5, 6, 6, 5, 6, 6, 6, 7, 8, 6, - 7, 8, 5, 6, 6, 6, 8, 7, 6, 8, 7, 5, 6, 6, 6, 8, - 8, 6, 8, 8, 6, 8, 8, 7, 7,10, 8, 9, 9, 6, 8, 8, - 7, 9, 8, 8, 9,10, 5, 6, 6, 6, 8, 8, 7, 8, 8, 6, - 8, 8, 8,10, 9, 7, 8, 9, 6, 8, 8, 8, 9, 9, 7,10, - 8, -}; - -static const static_codebook _16u1__p2_0 = { - 4, 81, - (char *)_vq_lengthlist__16u1__p2_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__16u1__p2_0, - 0 -}; - -static const long _vq_quantlist__16u1__p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__16u1__p3_0[] = { - 1, 5, 5, 8, 8, 6, 7, 7, 9, 9, 5, 7, 7, 9, 9, 9, - 10, 9,11,11, 9, 9,10,11,11, 6, 8, 8,10,10, 8, 9, - 10,11,11, 8, 9,10,11,11,10,11,11,12,13,10,11,11, - 13,13, 6, 8, 8,10,10, 8,10, 9,11,11, 8,10, 9,11, - 11,10,11,11,13,13,10,11,11,13,12, 9,11,11,14,13, - 10,12,12,15,14,10,12,11,14,13,12,13,13,15,15,12, - 13,13,16,14, 9,11,11,13,14,10,11,12,14,14,10,12, - 12,14,15,12,13,13,14,15,12,13,14,15,16, 5, 8, 8, - 11,11, 8,10,10,12,12, 8,10,10,12,12,11,12,12,14, - 14,11,12,12,14,14, 8,10,10,12,12, 9,11,12,12,13, - 10,12,12,13,13,12,12,13,14,15,11,13,13,15,15, 7, - 10,10,12,12, 9,12,11,13,12,10,11,12,13,13,12,13, - 12,15,14,11,12,13,15,15,10,12,12,15,14,11,13,13, - 16,15,11,13,13,16,15,14,13,14,15,16,13,15,15,17, - 17,10,12,12,14,15,11,12,12,15,15,11,13,13,15,16, - 13,15,13,16,15,13,15,15,16,17, 5, 8, 8,11,11, 8, - 10,10,12,12, 8,10,10,12,12,11,12,12,14,14,11,12, - 12,14,14, 7,10,10,12,12,10,12,12,14,13, 9,11,12, - 12,13,12,13,13,15,15,12,12,13,13,15, 7,10,10,12, - 13,10,11,12,13,13,10,12,11,13,13,11,13,13,15,15, - 12,13,12,15,14, 9,12,12,15,14,11,13,13,15,15,11, - 12,13,15,15,13,14,14,17,19,13,13,14,16,16,10,12, - 12,14,15,11,13,13,15,16,11,13,12,16,15,13,15,15, - 17,18,14,15,13,16,15, 8,11,11,15,14,10,12,12,16, - 15,10,12,12,16,16,14,15,15,18,17,13,14,15,16,18, - 9,12,12,15,15,11,12,14,16,17,11,13,13,16,15,15, - 15,15,17,18,14,15,16,17,17, 9,12,12,15,15,11,14, - 13,16,16,11,13,13,16,16,15,16,15,17,18,14,16,15, - 17,16,12,14,14,17,16,12,14,15,18,17,13,15,15,17, - 17,15,15,18,16,20,15,16,17,18,18,11,14,14,16,17, - 13,15,14,18,17,13,15,15,17,17,15,17,15,18,17,15, - 17,16,19,18, 8,11,11,14,15,10,12,12,15,15,10,12, - 12,16,16,13,14,14,17,16,14,15,15,17,17, 9,12,12, - 15,16,11,13,13,16,16,11,12,13,16,16,14,16,15,20, - 17,14,16,16,17,17, 9,12,12,15,16,11,13,13,16,17, - 11,13,13,17,16,14,15,15,17,18,15,15,15,18,18,11, - 14,14,17,16,13,15,15,17,17,13,14,14,18,17,15,16, - 16,18,19,15,15,17,17,19,11,14,14,16,17,13,15,14, - 17,19,13,15,14,18,17,15,17,16,18,18,15,17,15,18, - 16, -}; - -static const static_codebook _16u1__p3_0 = { - 4, 625, - (char *)_vq_lengthlist__16u1__p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__16u1__p3_0, - 0 -}; - -static const long _vq_quantlist__16u1__p4_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__16u1__p4_0[] = { - 4, 5, 5, 8, 8, 6, 6, 7, 9, 9, 6, 6, 6, 9, 9, 9, - 10, 9,11,11, 9, 9,10,11,11, 6, 7, 7,10, 9, 7, 7, - 8, 9,10, 7, 7, 8,10,10,10,10,10,10,12, 9, 9,10, - 11,12, 6, 7, 7, 9, 9, 7, 8, 7,10,10, 7, 8, 7,10, - 10, 9,10, 9,12,11,10,10, 9,12,10, 9,10,10,12,11, - 10,10,10,12,12, 9,10,10,12,12,12,11,12,13,13,11, - 11,12,12,13, 9,10,10,11,12, 9,10,10,12,12,10,10, - 10,12,12,11,12,11,14,13,11,12,12,14,13, 5, 7, 7, - 10,10, 7, 8, 8,10,10, 7, 8, 7,10,10,10,10,10,12, - 12,10,10,10,12,12, 6, 8, 7,10,10, 7, 7, 9,10,11, - 8, 9, 9,11,10,10,10,11,11,13,10,10,11,12,13, 6, - 8, 8,10,10, 7, 9, 8,11,10, 8, 9, 9,10,11,10,11, - 10,13,11,10,11,10,12,12,10,11,10,12,11,10,10,10, - 12,13,10,11,11,13,12,11,11,13,11,14,12,12,13,14, - 14, 9,10,10,12,13,10,11,10,13,12,10,11,11,12,13, - 11,12,11,14,12,12,13,13,15,14, 5, 7, 7,10,10, 7, - 7, 8,10,10, 7, 8, 8,10,10,10,10,10,11,12,10,10, - 10,12,12, 7, 8, 8,10,10, 8, 9, 8,11,10, 7, 8, 9, - 10,11,10,11,11,12,12,10,10,11,11,13, 7, 7, 8,10, - 10, 8, 8, 9,10,11, 7, 9, 7,11,10,10,11,11,13,12, - 11,11,10,13,11, 9,10,10,12,12,10,11,11,13,12,10, - 10,11,12,12,12,13,13,14,14,11,11,12,12,14,10,10, - 11,12,12,10,11,11,12,13,10,10,10,13,12,12,13,13, - 15,14,12,13,10,14,11, 8,10,10,12,12,10,11,10,13, - 13, 9,10,10,12,12,12,13,13,15,14,11,12,12,13,13, - 9,10,10,13,12,10,10,11,13,13,10,11,10,13,12,12, - 12,13,14,15,12,13,12,15,13, 9,10,10,12,13,10,11, - 10,13,12,10,10,11,12,13,12,14,12,15,13,12,12,13, - 14,15,11,12,11,14,13,11,11,12,14,15,12,13,12,15, - 14,13,11,15,11,16,13,14,14,16,15,11,12,12,14,14, - 11,12,11,14,13,12,12,13,14,15,13,14,12,16,12,14, - 14,14,15,15, 8,10,10,12,12, 9,10,10,12,12,10,10, - 11,13,13,11,12,12,13,13,12,13,13,14,15, 9,10,10, - 13,12,10,11,11,13,12,10,10,11,13,13,12,13,12,15, - 14,12,12,13,13,16, 9, 9,10,12,13,10,10,11,12,13, - 10,11,10,13,13,12,12,13,13,15,13,13,12,15,13,11, - 12,12,14,14,12,13,12,15,14,11,11,12,13,14,14,14, - 14,16,15,13,12,15,12,16,11,11,12,13,14,12,13,13, - 14,15,10,12,11,14,13,14,15,14,16,16,13,14,11,15, - 11, -}; - -static const static_codebook _16u1__p4_0 = { - 4, 625, - (char *)_vq_lengthlist__16u1__p4_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__16u1__p4_0, - 0 -}; - -static const long _vq_quantlist__16u1__p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__16u1__p5_0[] = { - 1, 4, 4, 7, 7, 7, 7, 9, 9, 4, 6, 6, 8, 8, 8, 8, - 10,10, 4, 5, 6, 8, 8, 8, 8,10,10, 7, 8, 8, 9, 9, - 9, 9,11,11, 7, 8, 8, 9, 9, 9, 9,11,11, 7, 8, 8, - 10, 9,11,11,12,11, 7, 8, 8, 9, 9,11,11,12,12, 9, - 10,10,11,11,12,12,13,12, 9,10,10,11,11,12,12,12, - 13, -}; - -static const static_codebook _16u1__p5_0 = { - 2, 81, - (char *)_vq_lengthlist__16u1__p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__16u1__p5_0, - 0 -}; - -static const long _vq_quantlist__16u1__p6_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__16u1__p6_0[] = { - 3, 4, 4, 6, 6, 7, 7, 9, 9, 4, 4, 4, 6, 6, 8, 8, - 9, 9, 4, 4, 4, 6, 6, 7, 7, 9, 9, 6, 6, 6, 7, 7, - 8, 8,10, 9, 6, 6, 6, 7, 7, 8, 8, 9,10, 7, 8, 7, - 8, 8, 9, 9,10,10, 7, 8, 8, 8, 8, 9, 9,10,10, 9, - 9, 9,10,10,10,10,11,11, 9, 9, 9,10,10,10,10,11, - 11, -}; - -static const static_codebook _16u1__p6_0 = { - 2, 81, - (char *)_vq_lengthlist__16u1__p6_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__16u1__p6_0, - 0 -}; - -static const long _vq_quantlist__16u1__p7_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__16u1__p7_0[] = { - 1, 4, 4, 4, 8, 8, 4, 8, 8, 5,11, 9, 8,12,11, 8, - 12,11, 5,10,11, 8,11,12, 8,11,12, 4,11,11,11,14, - 13,10,13,13, 8,14,13,12,14,16,12,16,15, 8,14,14, - 13,16,14,12,15,16, 4,11,11,10,14,13,11,14,14, 8, - 15,14,12,15,15,12,14,16, 8,14,14,11,16,15,12,15, - 13, -}; - -static const static_codebook _16u1__p7_0 = { - 4, 81, - (char *)_vq_lengthlist__16u1__p7_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__16u1__p7_0, - 0 -}; - -static const long _vq_quantlist__16u1__p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__16u1__p7_1[] = { - 2, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8, 4, 6, 5, 7, 7, - 8, 8, 8, 8, 8, 8, 4, 5, 6, 7, 7, 8, 8, 8, 8, 8, - 8, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 6, 7, 7, 8, - 8, 8, 8, 9, 9, 9, 9, 7, 8, 8, 8, 8, 9, 9, 9,10, - 9,10, 7, 8, 8, 8, 8, 9, 9, 9, 9,10, 9, 8, 8, 8, - 9, 9,10,10,10,10,10,10, 8, 8, 8, 9, 9, 9, 9,10, - 10,10,10, 8, 8, 8, 9, 9, 9,10,10,10,10,10, 8, 8, - 8, 9, 9,10,10,10,10,10,10, -}; - -static const static_codebook _16u1__p7_1 = { - 2, 121, - (char *)_vq_lengthlist__16u1__p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__16u1__p7_1, - 0 -}; - -static const long _vq_quantlist__16u1__p8_0[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__16u1__p8_0[] = { - 1, 4, 4, 5, 5, 8, 8,10,10,12,12, 4, 7, 7, 8, 8, - 9, 9,12,11,14,13, 4, 7, 7, 7, 8, 9,10,11,11,13, - 12, 5, 8, 8, 9, 9,11,11,12,13,15,14, 5, 7, 8, 9, - 9,11,11,13,13,17,15, 8, 9,10,11,11,12,13,17,14, - 17,16, 8,10, 9,11,11,12,12,13,15,15,17,10,11,11, - 12,13,14,15,15,16,16,17, 9,11,11,12,12,14,15,17, - 15,15,16,11,14,12,14,15,16,15,16,16,16,15,11,13, - 13,14,14,15,15,16,16,15,16, -}; - -static const static_codebook _16u1__p8_0 = { - 2, 121, - (char *)_vq_lengthlist__16u1__p8_0, - 1, -524582912, 1618345984, 4, 0, - (long *)_vq_quantlist__16u1__p8_0, - 0 -}; - -static const long _vq_quantlist__16u1__p8_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__16u1__p8_1[] = { - 2, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 4, 6, 6, 7, 7, - 8, 7, 8, 8, 8, 8, 4, 6, 6, 7, 7, 7, 7, 8, 8, 8, - 8, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 6, 7, 7, 7, - 7, 8, 8, 8, 8, 9, 9, 7, 7, 7, 8, 8, 8, 8, 9, 9, - 9, 9, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 8, 8, 8, - 8, 8, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 9, 9, 9, - 9, 9, 9, 8, 8, 8, 9, 8, 9, 9, 9, 9, 9, 9, 8, 8, - 8, 9, 9, 9, 9, 9, 9, 9, 9, -}; - -static const static_codebook _16u1__p8_1 = { - 2, 121, - (char *)_vq_lengthlist__16u1__p8_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__16u1__p8_1, - 0 -}; - -static const long _vq_quantlist__16u1__p9_0[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const char _vq_lengthlist__16u1__p9_0[] = { - 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, -}; - -static const static_codebook _16u1__p9_0 = { - 2, 225, - (char *)_vq_lengthlist__16u1__p9_0, - 1, -514071552, 1627381760, 4, 0, - (long *)_vq_quantlist__16u1__p9_0, - 0 -}; - -static const long _vq_quantlist__16u1__p9_1[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const char _vq_lengthlist__16u1__p9_1[] = { - 1, 6, 5, 9, 9,10,10, 6, 7, 9, 9,10,10,10,10, 5, - 10, 8,10, 8,10,10, 8, 8,10, 9,10,10,10,10, 5, 8, - 9,10,10,10,10, 8,10,10,10,10,10,10,10, 9,10,10, - 10,10,10,10, 9, 9,10,10,10,10,10,10, 9, 9, 8, 9, - 10,10,10, 9,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10, 8,10,10,10,10, - 10,10,10,10,10,10,10,10,10, 6, 8, 8,10,10,10, 8, - 10,10,10,10,10,10,10,10, 5, 8, 8,10,10,10, 9, 9, - 10,10,10,10,10,10,10,10, 9,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, -}; - -static const static_codebook _16u1__p9_1 = { - 2, 225, - (char *)_vq_lengthlist__16u1__p9_1, - 1, -522338304, 1620115456, 4, 0, - (long *)_vq_quantlist__16u1__p9_1, - 0 -}; - -static const long _vq_quantlist__16u1__p9_2[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__16u1__p9_2[] = { - 1, 6, 6, 7, 8, 8,11,10, 9, 9,11, 9,10, 9,11,11, - 9, 6, 7, 6,11, 8,11, 9,10,10,11, 9,11,10,10,10, - 11, 9, 5, 7, 7, 8, 8,10,11, 8, 8,11, 9, 9,10,11, - 9,10,11, 8, 9, 6, 8, 8, 9, 9,10,10,11,11,11, 9, - 11,10, 9,11, 8, 8, 8, 9, 8, 9,10,11, 9, 9,11,11, - 10, 9, 9,11,10, 8,11, 8, 9, 8,11, 9,10, 9,10,11, - 11,10,10, 9,10,10, 8, 8, 9,10,10,10, 9,11, 9,10, - 11,11,11,11,10, 9,11, 9, 9,11,11,10, 8,11,11,11, - 9,10,10,11,10,11,11, 9,11,10, 9,11,10,10,10,10, - 9,11,10,11,10, 9, 9,10,11, 9, 8,10,11,11,10,10, - 11, 9,11,10,11,11,10,11, 9, 9, 8,10, 8, 9,11, 9, - 8,10,10, 9,11,10,11,10,11, 9,11, 8,10,11,11,11, - 11,10,10,11,11,11,11,10,11,11,10, 9, 8,10,10, 9, - 11,10,11,11,11, 9, 9, 9,11,11,11,10,10, 9, 9,10, - 9,11,11,11,11, 8,10,11,10,11,11,10,11,11, 9, 9, - 9,10, 9,11, 9,11,11,11,11,11,10,11,11,10,11,10, - 11,11, 9,11,10,11,10, 9,10, 9,10,10,11,11,11,11, - 9,10, 9,10,11,11,10,11,11,11,11,11,11,10,11,11, - 10, -}; - -static const static_codebook _16u1__p9_2 = { - 2, 289, - (char *)_vq_lengthlist__16u1__p9_2, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__16u1__p9_2, - 0 -}; - -static const char _huff_lengthlist__16u1__short[] = { - 5, 7,10, 9,11,10,15,11,13,16, 6, 4, 6, 6, 7, 7, - 10, 9,12,16,10, 6, 5, 6, 6, 7,10,11,16,16, 9, 6, - 7, 6, 7, 7,10, 8,14,16,11, 6, 5, 4, 5, 6, 8, 9, - 15,16, 9, 6, 6, 5, 6, 6, 9, 8,14,16,12, 7, 6, 6, - 5, 6, 6, 7,13,16, 8, 6, 7, 6, 5, 5, 4, 4,11,16, - 9, 8, 9, 9, 7, 7, 6, 5,13,16,14,14,16,15,16,15, - 16,16,16,16, -}; - -static const static_codebook _huff_book__16u1__short = { - 2, 100, - (char *)_huff_lengthlist__16u1__short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__16u2__long[] = { - 5, 8,10,10,10,11,11,12,14,18, 7, 5, 5, 6, 8, 9, - 10,12,14,17, 9, 5, 4, 5, 6, 8,10,11,13,19, 9, 5, - 4, 4, 5, 6, 9,10,12,17, 8, 6, 5, 4, 4, 5, 7,10, - 11,15, 8, 7, 7, 6, 5, 5, 6, 9,11,14, 8, 9, 8, 7, - 6, 5, 6, 7,11,14, 9,11,11, 9, 7, 6, 6, 6, 9,14, - 11,14,15,13, 9, 8, 7, 7, 9,14,13,15,19,17,12,11, - 10, 9,10,14, -}; - -static const static_codebook _huff_book__16u2__long = { - 2, 100, - (char *)_huff_lengthlist__16u2__long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__16u2_p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__16u2_p1_0[] = { - 1, 5, 5, 5, 7, 7, 5, 7, 7, 5, 7, 7, 7, 9, 9, 7, - 9, 9, 5, 7, 7, 7, 9, 9, 8, 9, 9, 5, 7, 7, 8, 9, - 9, 7, 9, 9, 7, 9, 9, 9,10,11, 9,10,10, 7, 9, 9, - 9,10, 9, 9,10,11, 5, 8, 7, 7, 9, 9, 8, 9, 9, 7, - 9, 9, 9,11,10, 9, 9,10, 7, 9, 9, 9,10,10, 9,11, - 10, -}; - -static const static_codebook _16u2_p1_0 = { - 4, 81, - (char *)_vq_lengthlist__16u2_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__16u2_p1_0, - 0 -}; - -static const long _vq_quantlist__16u2_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__16u2_p2_0[] = { - 3, 5, 5, 8, 8, 5, 7, 7, 9, 9, 5, 7, 7, 9, 9, 9, - 10, 9,11,11, 9, 9, 9,11,11, 5, 7, 7, 9, 9, 7, 8, - 8,10,10, 7, 8, 8,10,10,10,10,10,12,12, 9,10,10, - 11,12, 5, 7, 7, 9, 9, 7, 8, 8,10,10, 7, 8, 8,10, - 10, 9,10,10,12,11,10,10,10,12,12, 9,10,10,12,12, - 10,10,10,12,12, 9,10,10,12,12,12,12,12,14,14,11, - 12,12,13,14, 9,10,10,12,12, 9,10,10,12,12,10,10, - 10,12,12,11,12,12,14,13,12,12,12,14,13, 5, 7, 7, - 9, 9, 7, 8, 8,10,10, 7, 8, 8,10,10,10,10,10,12, - 12,10,10,10,12,12, 7, 8, 8,11,10, 8, 9, 9,11,11, - 8, 9, 9,11,11,10,11,11,12,13,10,11,11,12,13, 7, - 8, 8,10,10, 8, 9, 8,11,10, 8, 9, 9,11,11,10,11, - 10,13,12,10,11,11,13,13,10,11,10,13,12,10,11,11, - 13,13,10,11,11,13,13,12,12,13,13,14,12,13,13,14, - 14, 9,10,10,12,12,10,11,10,13,12,10,11,11,13,13, - 12,13,12,14,13,12,13,13,14,15, 5, 7, 7, 9,10, 7, - 8, 8,10,10, 7, 8, 8,10,10,10,10,10,12,12,10,10, - 11,12,12, 7, 8, 8,10,10, 8, 9, 9,11,11, 8, 8, 9, - 10,11,10,11,11,13,13,10,10,11,12,13, 7, 8, 8,10, - 10, 8, 9, 9,11,11, 8, 9, 9,11,11,10,11,11,13,12, - 10,11,11,13,12, 9,10,10,12,12,10,11,11,13,13,10, - 10,11,12,13,12,13,13,15,14,12,12,13,12,14, 9,10, - 11,12,13,10,11,11,13,13,10,11,11,13,13,12,13,13, - 14,14,12,13,12,14,13, 8,10,10,12,12, 9,11,10,13, - 12, 9,10,10,12,13,12,13,13,14,14,12,12,12,14,14, - 9,10,10,13,13,10,11,11,13,13,10,11,11,13,13,13, - 13,13,14,15,12,13,13,14,15, 9,10,10,12,13,10,11, - 10,13,13,10,11,11,12,13,12,13,12,15,14,12,13,13, - 14,15,11,12,12,15,14,12,12,13,14,15,12,13,13,15, - 14,13,13,15,14,16,14,14,14,16,15,11,12,12,14,14, - 11,12,12,14,14,12,13,13,14,15,13,14,13,15,13,14, - 14,14,15,16, 8, 9,10,12,12, 9,10,10,13,12, 9,10, - 11,12,13,12,12,12,14,14,12,13,13,14,14, 9,10,10, - 13,12,10,11,11,13,13,10,10,11,13,13,12,13,13,15, - 14,12,12,13,14,15, 9,10,10,13,13,10,11,11,13,13, - 10,11,11,13,13,12,13,13,14,14,13,13,13,15,15,11, - 12,12,14,13,12,13,13,15,14,11,12,12,14,14,14,14, - 14,16,15,13,13,14,13,16,11,12,12,14,14,12,13,13, - 14,15,12,13,12,14,14,14,14,14,16,16,14,15,13,16, - 14, -}; - -static const static_codebook _16u2_p2_0 = { - 4, 625, - (char *)_vq_lengthlist__16u2_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__16u2_p2_0, - 0 -}; - -static const long _vq_quantlist__16u2_p3_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__16u2_p3_0[] = { - 2, 4, 4, 6, 6, 7, 7, 9, 9, 4, 5, 5, 6, 6, 8, 7, - 9, 9, 4, 5, 5, 6, 6, 7, 8, 9, 9, 6, 6, 6, 7, 7, - 8, 8,10,10, 6, 6, 6, 7, 7, 8, 8,10,10, 7, 8, 7, - 8, 8, 9, 9,11,10, 7, 7, 8, 8, 8, 9, 9,10,11, 9, - 9, 9,10,10,11,10,11,11, 9, 9, 9,10,10,10,11,11, - 11, -}; - -static const static_codebook _16u2_p3_0 = { - 2, 81, - (char *)_vq_lengthlist__16u2_p3_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__16u2_p3_0, - 0 -}; - -static const long _vq_quantlist__16u2_p4_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__16u2_p4_0[] = { - 2, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,10,10,11,11,11, - 11, 5, 5, 5, 7, 6, 8, 7, 9, 9, 9, 9,10,10,11,11, - 12,12, 5, 5, 5, 6, 6, 7, 8, 8, 9, 9, 9,10,10,11, - 11,12,12, 6, 7, 6, 7, 7, 8, 8, 9, 9, 9, 9,10,10, - 11,11,12,12, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9,10, - 10,11,11,12,12, 7, 8, 8, 8, 8, 9, 9, 9, 9,10,10, - 11,11,11,11,12,12, 7, 7, 8, 8, 8, 9, 9, 9, 9,10, - 10,11,11,11,11,12,12, 8, 9, 9, 9, 9, 9, 9,10,10, - 10,10,11,11,12,12,12,12, 8, 9, 9, 9, 9, 9, 9,10, - 10,10,10,11,11,12,12,12,12, 9, 9, 9, 9, 9,10,10, - 10,10,10,11,11,11,12,12,13,13, 9, 9, 9, 9, 9,10, - 10,10,10,11,10,11,11,12,12,13,13,10,10,10,10,10, - 11,11,11,11,11,11,11,12,12,12,13,13,10,10,10,10, - 10,11,11,11,11,11,11,12,11,12,12,13,13,11,11,11, - 11,11,11,11,12,12,12,12,12,12,13,13,13,13,11,11, - 11,11,11,11,11,12,12,12,12,13,12,13,13,13,13,11, - 12,12,12,12,12,12,12,12,13,13,13,13,13,13,14,14, - 11,12,12,12,12,12,12,12,13,13,13,13,13,13,13,14, - 14, -}; - -static const static_codebook _16u2_p4_0 = { - 2, 289, - (char *)_vq_lengthlist__16u2_p4_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__16u2_p4_0, - 0 -}; - -static const long _vq_quantlist__16u2_p5_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__16u2_p5_0[] = { - 1, 4, 4, 5, 7, 7, 5, 7, 7, 5, 8, 8, 7, 9, 9, 7, - 9,10, 5, 8, 8, 7,10, 9, 7,10, 9, 5, 8, 8, 8,11, - 10, 8,10,10, 7,10,10, 9, 9,12,10,12,12, 7,10,10, - 9,12,10,10,11,12, 5, 8, 8, 8,10,10, 8,11,11, 7, - 11,10,10,12,11, 9,10,12, 7,10,11,10,12,12, 9,12, - 9, -}; - -static const static_codebook _16u2_p5_0 = { - 4, 81, - (char *)_vq_lengthlist__16u2_p5_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__16u2_p5_0, - 0 -}; - -static const long _vq_quantlist__16u2_p5_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__16u2_p5_1[] = { - 2, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 5, 6, 6, 7, 7, - 7, 7, 8, 8, 8, 8, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, - 8, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 6, 7, 7, 7, - 7, 8, 8, 8, 8, 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, - 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 9, 9, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 8, 8, - 8, 8, 8, 8, 8, 9, 9, 9, 9, -}; - -static const static_codebook _16u2_p5_1 = { - 2, 121, - (char *)_vq_lengthlist__16u2_p5_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__16u2_p5_1, - 0 -}; - -static const long _vq_quantlist__16u2_p6_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__16u2_p6_0[] = { - 1, 5, 4, 7, 7, 8, 8, 8, 8,10,10,11,11, 4, 6, 6, - 7, 7, 9, 9, 9, 9,10,10,11,11, 4, 6, 6, 7, 7, 9, - 9, 9, 9,10,10,11,11, 7, 8, 8, 9, 9, 9, 9,10,10, - 11,11,12,12, 7, 7, 7, 9, 8,10, 9,10,10,11,11,12, - 12, 8, 9, 9, 9,10,10,10,11,11,12,12,13,13, 8, 9, - 9,10, 9,10,10,11,11,12,12,13,13, 8, 9, 9,10,10, - 11,11,11,11,12,12,13,13, 8, 9, 9,10,10,11,11,12, - 11,12,12,13,13,10,10,10,11,11,12,12,12,12,13,13, - 14,14,10,10,10,11,11,12,12,12,12,13,13,14,14,11, - 11,11,12,12,13,13,13,13,14,14,14,14,11,11,11,12, - 12,13,13,13,13,14,14,14,14, -}; - -static const static_codebook _16u2_p6_0 = { - 2, 169, - (char *)_vq_lengthlist__16u2_p6_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__16u2_p6_0, - 0 -}; - -static const long _vq_quantlist__16u2_p6_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__16u2_p6_1[] = { - 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _16u2_p6_1 = { - 2, 25, - (char *)_vq_lengthlist__16u2_p6_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__16u2_p6_1, - 0 -}; - -static const long _vq_quantlist__16u2_p7_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__16u2_p7_0[] = { - 1, 4, 4, 7, 7, 8, 8, 8, 8, 9, 9,10,10, 4, 6, 6, - 8, 8, 9, 9, 9, 9,10,10,11,10, 4, 6, 6, 8, 8, 9, - 9, 9, 9,10,10,11,11, 7, 8, 8,10, 9,10,10,10,10, - 11,11,12,12, 7, 8, 8,10,10,10,10,10,10,11,11,12, - 12, 8, 9, 9,10,10,11,11,11,11,12,12,13,13, 8, 9, - 9,10,10,11,11,11,11,12,12,13,13, 8, 9, 9,11,10, - 11,11,12,12,13,13,14,13, 8, 9, 9,10,10,11,11,12, - 12,13,13,13,13, 9,10,10,11,11,12,12,13,13,13,13, - 14,14, 9,10,10,11,11,12,12,13,13,13,13,14,14,10, - 11,11,12,12,13,13,14,13,14,14,15,14,10,11,11,12, - 12,13,13,14,13,14,14,15,14, -}; - -static const static_codebook _16u2_p7_0 = { - 2, 169, - (char *)_vq_lengthlist__16u2_p7_0, - 1, -523206656, 1618345984, 4, 0, - (long *)_vq_quantlist__16u2_p7_0, - 0 -}; - -static const long _vq_quantlist__16u2_p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__16u2_p7_1[] = { - 2, 5, 5, 7, 7, 7, 7, 7, 7, 8, 8, 5, 6, 6, 7, 7, - 7, 7, 8, 8, 8, 8, 5, 6, 6, 7, 7, 7, 7, 8, 8, 8, - 8, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, - 7, 8, 8, 8, 8, 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, - 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _16u2_p7_1 = { - 2, 121, - (char *)_vq_lengthlist__16u2_p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__16u2_p7_1, - 0 -}; - -static const long _vq_quantlist__16u2_p8_0[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const char _vq_lengthlist__16u2_p8_0[] = { - 1, 4, 4, 7, 7, 8, 8, 7, 7, 9, 8,10, 9,11,11, 4, - 7, 6, 9, 8, 9, 9, 9, 9,10, 9,11, 9,12, 9, 4, 6, - 7, 8, 8, 9, 9, 9, 9,10,10,10,11,11,12, 7, 9, 8, - 10,10,11,11,10,10,11,11,12,12,13,12, 7, 8, 8,10, - 10,10,11,10,10,11,11,11,12,12,13, 8, 9, 9,11,11, - 11,11,11,11,12,12,13,13,13,13, 8, 9, 9,11,11,11, - 11,11,11,12,12,13,13,13,14, 8, 9, 9,10,10,11,11, - 12,11,13,13,14,13,14,14, 8, 9, 9,10,10,11,11,12, - 12,12,12,13,13,14,14, 9,10,10,11,11,12,12,13,12, - 13,13,14,14,15,15, 9,10,10,11,11,12,12,12,13,13, - 13,14,14,14,15,10,11,11,12,12,13,13,14,13,14,14, - 15,14,15,15,10,11,11,12,12,13,12,13,14,14,14,14, - 14,15,15,11,12,12,13,13,13,13,14,14,15,14,15,15, - 16,16,11,12,12,13,13,13,13,14,14,14,15,15,15,16, - 16, -}; - -static const static_codebook _16u2_p8_0 = { - 2, 225, - (char *)_vq_lengthlist__16u2_p8_0, - 1, -520986624, 1620377600, 4, 0, - (long *)_vq_quantlist__16u2_p8_0, - 0 -}; - -static const long _vq_quantlist__16u2_p8_1[] = { - 10, - 9, - 11, - 8, - 12, - 7, - 13, - 6, - 14, - 5, - 15, - 4, - 16, - 3, - 17, - 2, - 18, - 1, - 19, - 0, - 20, -}; - -static const char _vq_lengthlist__16u2_p8_1[] = { - 3, 5, 5, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9,10,10,10,10, 5, 6, 6, 7, 7, 8, - 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, - 7, 7, 8, 8, 9, 8, 9, 9, 9, 9, 9, 9,10,10,10,10, - 10,10,10,10, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, - 9,10, 9,10,10,10, 9,10, 9, 8, 8, 8, 9, 8, 9, 9, - 9, 9,10, 9,10,10,10,10,10,10,10,10,10,10, 8, 8, - 8, 8, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10, - 10,10,10, 8, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10, - 10,10,10,10,10,10,10,10, 8, 9, 9, 9, 9, 9, 9, 9, - 10,10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, - 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10, 9, 9, 9, 9, 9,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, - 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10, 9, 9, 9,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10, 9, 9,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10, 9,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10, 9,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, 9, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10, 9,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10, -}; - -static const static_codebook _16u2_p8_1 = { - 2, 441, - (char *)_vq_lengthlist__16u2_p8_1, - 1, -529268736, 1611661312, 5, 0, - (long *)_vq_quantlist__16u2_p8_1, - 0 -}; - -static const long _vq_quantlist__16u2_p9_0[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const char _vq_lengthlist__16u2_p9_0[] = { - 1, 5, 3, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, - 7, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 7, - 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10, -}; - -static const static_codebook _16u2_p9_0 = { - 2, 225, - (char *)_vq_lengthlist__16u2_p9_0, - 1, -510036736, 1631393792, 4, 0, - (long *)_vq_quantlist__16u2_p9_0, - 0 -}; - -static const long _vq_quantlist__16u2_p9_1[] = { - 9, - 8, - 10, - 7, - 11, - 6, - 12, - 5, - 13, - 4, - 14, - 3, - 15, - 2, - 16, - 1, - 17, - 0, - 18, -}; - -static const char _vq_lengthlist__16u2_p9_1[] = { - 1, 4, 4, 7, 7, 7, 7, 7, 6, 9, 7,10, 8,12,12,13, - 13,14,14, 4, 7, 7, 9, 9, 9, 8, 9, 8,10, 9,11, 9, - 14, 9,14,10,13,11, 4, 7, 7, 9, 9, 9, 9, 8, 9,10, - 10,11,11,12,13,12,13,14,15, 7, 9, 9,10,11,10,10, - 10,10,11,12,13,13,13,14,17,14,15,16, 7, 9, 9,10, - 10,10,10,10,10,11,12,13,13,14,14,15,15,18,18, 8, - 9, 9,11,10,11,11,11,12,13,12,14,14,16,15,15,17, - 18,15, 8, 9, 9,10,10,11,11,11,11,13,13,14,14,15, - 15,15,16,16,18, 7, 9, 8,10,10,11,11,12,12,14,14, - 15,15,16,16,15,17,16,18, 8, 9, 9,10,10,11,12,12, - 12,13,13,16,15,17,16,17,18,17,18, 9,10,10,12,11, - 13,13,14,13,14,14,15,17,16,18,17,18,17,18, 9,10, - 10,12,11,12,13,13,14,15,16,14,15,16,18,18,18,18, - 17,11,11,11,13,13,14,14,16,15,15,15,16,15,15,18, - 18,18,17,16,11,11,12,13,13,15,14,15,16,16,16,17, - 16,15,18,17,18,16,18,12,13,13,15,15,15,16,18,16, - 17,16,17,16,17,17,17,18,18,17,13,13,13,15,13,16, - 15,17,16,16,16,18,18,18,18,16,17,17,18,13,15,14, - 15,15,18,17,18,18,18,16,18,17,18,17,18,16,17,17, - 14,14,14,15,16,17,16,18,18,18,17,18,17,18,18,18, - 16,16,16,14,17,16,17,15,16,18,18,17,18,17,18,17, - 18,18,18,17,18,17,15,16,15,18,15,18,17,16,18,18, - 18,18,18,18,17,18,16,18,17, -}; - -static const static_codebook _16u2_p9_1 = { - 2, 361, - (char *)_vq_lengthlist__16u2_p9_1, - 1, -518287360, 1622704128, 5, 0, - (long *)_vq_quantlist__16u2_p9_1, - 0 -}; - -static const long _vq_quantlist__16u2_p9_2[] = { - 24, - 23, - 25, - 22, - 26, - 21, - 27, - 20, - 28, - 19, - 29, - 18, - 30, - 17, - 31, - 16, - 32, - 15, - 33, - 14, - 34, - 13, - 35, - 12, - 36, - 11, - 37, - 10, - 38, - 9, - 39, - 8, - 40, - 7, - 41, - 6, - 42, - 5, - 43, - 4, - 44, - 3, - 45, - 2, - 46, - 1, - 47, - 0, - 48, -}; - -static const char _vq_lengthlist__16u2_p9_2[] = { - 2, 3, 4, 4, 4, 5, 5, 6, 5, 6, 6, 6, 6, 6, 6, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 7, 8, 8, 8, 8, 8, - 8, -}; - -static const static_codebook _16u2_p9_2 = { - 1, 49, - (char *)_vq_lengthlist__16u2_p9_2, - 1, -526909440, 1611661312, 6, 0, - (long *)_vq_quantlist__16u2_p9_2, - 0 -}; - -static const char _huff_lengthlist__16u2__short[] = { - 8,11,13,13,15,16,19,19,19,19,11, 8, 8, 9, 9,11, - 13,15,19,20,14, 8, 7, 7, 8, 9,12,13,15,20,15, 9, - 6, 5, 5, 7,10,12,14,18,14, 9, 7, 5, 3, 4, 7,10, - 12,16,13,10, 8, 6, 3, 3, 5, 8,11,14,11,10, 9, 7, - 5, 4, 4, 6,11,14,10,10,10, 8, 6, 5, 5, 6,10,14, - 10,10,10, 9, 8, 7, 7, 7,10,14,11,12,12,12,11,10, - 10,10,12,16, -}; - -static const static_codebook _huff_book__16u2__short = { - 2, 100, - (char *)_huff_lengthlist__16u2__short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__8u0__p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__8u0__p1_0[] = { - 1, 4, 4, 5, 7, 7, 5, 7, 7, 5, 8, 8, 8,10,10, 7, - 10,10, 5, 8, 8, 7,10,10, 8,10,10, 4, 9, 8, 8,11, - 11, 8,11,11, 7,11,11,10,11,13,10,13,13, 7,11,11, - 10,13,12,10,13,13, 5, 9, 8, 8,11,11, 8,11,11, 7, - 11,11, 9,13,13,10,12,13, 7,11,11,10,13,13,10,13, - 11, -}; - -static const static_codebook _8u0__p1_0 = { - 4, 81, - (char *)_vq_lengthlist__8u0__p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__8u0__p1_0, - 0 -}; - -static const long _vq_quantlist__8u0__p2_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__8u0__p2_0[] = { - 2, 4, 4, 5, 6, 6, 5, 6, 6, 5, 7, 7, 6, 7, 8, 6, - 7, 8, 5, 7, 7, 6, 8, 8, 7, 9, 7, 5, 7, 7, 7, 9, - 9, 7, 8, 8, 6, 9, 8, 7, 7,10, 8,10,10, 6, 8, 8, - 8,10, 8, 8,10,10, 5, 7, 7, 7, 8, 8, 7, 8, 9, 6, - 8, 8, 8,10,10, 8, 8,10, 6, 8, 9, 8,10,10, 7,10, - 8, -}; - -static const static_codebook _8u0__p2_0 = { - 4, 81, - (char *)_vq_lengthlist__8u0__p2_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__8u0__p2_0, - 0 -}; - -static const long _vq_quantlist__8u0__p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__8u0__p3_0[] = { - 1, 5, 5, 7, 7, 6, 7, 7, 9, 9, 6, 7, 7, 9, 9, 8, - 10, 9,11,11, 8, 9, 9,11,11, 6, 8, 8,10,10, 8,10, - 10,11,11, 8,10,10,11,11,10,11,11,12,12,10,11,11, - 12,13, 6, 8, 8,10,10, 8,10,10,11,11, 8,10,10,11, - 11, 9,10,11,12,12,10,11,11,12,12, 8,11,11,14,13, - 10,12,11,15,13,10,12,11,14,14,12,13,12,16,14,12, - 14,12,16,15, 8,11,11,13,14,10,11,12,13,15,10,11, - 12,13,15,11,12,13,14,15,12,12,14,14,16, 5, 8, 8, - 11,11, 9,11,11,12,12, 8,10,11,12,12,11,12,12,15, - 14,11,12,12,14,14, 7,11,10,13,12,10,11,12,13,14, - 10,12,12,14,13,12,13,13,14,15,12,13,13,15,15, 7, - 10,11,12,13,10,12,11,14,13,10,12,13,13,15,12,13, - 12,14,14,11,13,13,15,16, 9,12,12,15,14,11,13,13, - 15,16,11,13,13,16,16,13,14,15,15,15,12,14,15,17, - 16, 9,12,12,14,15,11,13,13,15,16,11,13,13,16,18, - 13,14,14,17,16,13,15,15,17,18, 5, 8, 9,11,11, 8, - 11,11,12,12, 8,10,11,12,12,11,12,12,14,14,11,12, - 12,14,15, 7,11,10,12,13,10,12,12,14,13,10,11,12, - 13,14,11,13,13,15,14,12,13,13,14,15, 7,10,11,13, - 13,10,12,12,13,14,10,12,12,13,13,11,13,13,16,16, - 12,13,13,15,14, 9,12,12,16,15,10,13,13,15,15,11, - 13,13,17,15,12,15,15,18,17,13,14,14,15,16, 9,12, - 12,15,15,11,13,13,15,16,11,13,13,15,15,12,15,15, - 16,16,13,15,14,17,15, 7,11,11,15,15,10,13,13,16, - 15,10,13,13,15,16,14,15,15,17,19,13,15,14,15,18, - 9,12,12,16,16,11,13,14,17,16,11,13,13,17,16,15, - 15,16,17,19,13,15,16, 0,18, 9,12,12,16,15,11,14, - 13,17,17,11,13,14,16,16,15,16,16,19,18,13,15,15, - 17,19,11,14,14,19,16,12,14,15, 0,18,12,16,15,18, - 17,15,15,18,16,19,14,15,17,19,19,11,14,14,18,19, - 13,15,14,19,19,12,16,15,18,17,15,17,15, 0,16,14, - 17,16,19, 0, 7,11,11,14,14,10,12,12,15,15,10,13, - 13,16,15,13,15,15,17, 0,14,15,15,16,19, 9,12,12, - 16,16,11,14,14,16,16,11,13,13,16,16,14,17,16,19, - 0,14,18,17,17,19, 9,12,12,15,16,11,13,13,15,17, - 12,14,13,19,16,13,15,15,17,19,15,17,16,17,19,11, - 14,14,19,16,12,15,15,19,17,13,14,15,17,19,14,16, - 17,19,19,16,15,16,17,19,11,15,14,16,16,12,15,15, - 19, 0,12,14,15,19,19,14,16,16, 0,18,15,19,14,18, - 16, -}; - -static const static_codebook _8u0__p3_0 = { - 4, 625, - (char *)_vq_lengthlist__8u0__p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__8u0__p3_0, - 0 -}; - -static const long _vq_quantlist__8u0__p4_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__8u0__p4_0[] = { - 3, 5, 5, 8, 8, 5, 6, 7, 9, 9, 6, 7, 6, 9, 9, 9, - 9, 9,10,11, 9, 9, 9,11,10, 6, 7, 7,10,10, 7, 7, - 8,10,10, 7, 8, 8,10,10,10,10,10,10,11, 9,10,10, - 11,12, 6, 7, 7,10,10, 7, 8, 8,10,10, 7, 8, 7,10, - 10, 9,10,10,12,11,10,10,10,11,10, 9,10,10,12,11, - 10,10,10,13,11, 9,10,10,12,12,11,11,12,12,13,11, - 11,11,12,13, 9,10,10,12,12,10,10,11,12,12,10,10, - 11,12,12,11,11,11,13,13,11,12,12,13,13, 5, 7, 7, - 10,10, 7, 8, 8,10,10, 7, 8, 8,10,10,10,11,11,12, - 12,10,11,10,12,12, 7, 8, 8,11,11, 7, 8, 9,10,11, - 8, 9, 9,11,11,11,10,11,10,12,10,11,11,12,13, 7, - 8, 8,10,11, 8, 9, 8,12,10, 8, 9, 9,11,12,10,11, - 10,13,11,10,11,11,13,12, 9,11,10,13,12,10,10,11, - 12,12,10,11,11,13,13,12,10,13,11,14,11,12,12,15, - 13, 9,11,11,13,13,10,11,11,13,12,10,11,11,12,14, - 12,13,11,14,12,12,12,12,14,14, 5, 7, 7,10,10, 7, - 8, 8,10,10, 7, 8, 8,11,10,10,11,11,12,12,10,11, - 10,12,12, 7, 8, 8,10,11, 8, 9, 9,12,11, 8, 8, 9, - 10,11,10,11,11,12,13,11,10,11,11,13, 6, 8, 8,10, - 11, 8, 9, 9,11,11, 7, 9, 7,11,10,10,11,11,12,12, - 10,11,10,13,10, 9,11,10,13,12,10,12,11,13,13,10, - 10,11,12,13,11,12,13,15,14,11,11,13,12,13, 9,10, - 11,12,13,10,11,11,12,13,10,11,10,13,12,12,13,13, - 13,14,12,12,11,14,11, 8,10,10,12,13,10,11,11,13, - 13,10,11,10,13,13,12,13,14,15,14,12,12,12,14,13, - 9,10,10,13,12,10,10,12,13,13,10,11,11,15,12,12, - 12,13,15,14,12,13,13,15,13, 9,10,11,12,13,10,12, - 10,13,12,10,11,11,12,13,12,14,12,15,13,12,12,12, - 15,14,11,12,11,14,13,11,11,12,14,14,12,13,13,14, - 13,13,11,15,11,15,14,14,14,16,15,11,12,12,13,14, - 11,13,11,14,14,12,12,13,14,15,12,14,12,15,12,13, - 15,14,16,15, 8,10,10,12,12,10,10,10,12,13,10,11, - 11,13,13,12,12,12,13,14,13,13,13,15,15, 9,10,10, - 12,12,10,11,11,13,12,10,10,11,13,13,12,12,12,14, - 14,12,12,13,15,14, 9,10,10,13,12,10,10,12,12,13, - 10,11,10,13,13,12,13,13,14,14,12,13,12,14,13,11, - 12,12,14,13,12,13,12,14,14,10,12,12,14,14,14,14, - 14,16,14,13,12,14,12,15,10,12,12,14,15,12,13,13, - 14,16,11,12,11,15,14,13,14,14,14,15,13,14,11,14, - 12, -}; - -static const static_codebook _8u0__p4_0 = { - 4, 625, - (char *)_vq_lengthlist__8u0__p4_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__8u0__p4_0, - 0 -}; - -static const long _vq_quantlist__8u0__p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__8u0__p5_0[] = { - 1, 4, 4, 7, 7, 7, 7, 9, 9, 4, 6, 6, 8, 7, 8, 8, - 10,10, 4, 6, 6, 8, 8, 8, 8,10,10, 6, 8, 8, 9, 9, - 9, 9,11,11, 7, 8, 8, 9, 9, 9, 9,11,11, 7, 8, 8, - 9, 9,10,10,12,11, 7, 8, 8, 9, 9,10,10,11,11, 9, - 10,10,11,11,11,12,12,12, 9,10,10,11,11,12,12,12, - 12, -}; - -static const static_codebook _8u0__p5_0 = { - 2, 81, - (char *)_vq_lengthlist__8u0__p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__8u0__p5_0, - 0 -}; - -static const long _vq_quantlist__8u0__p6_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__8u0__p6_0[] = { - 1, 4, 4, 7, 7, 9, 9,11,11,12,12,16,16, 3, 6, 6, - 9, 9,11,11,12,12,13,14,18,16, 3, 6, 7, 9, 9,11, - 11,13,12,14,14,17,16, 7, 9, 9,11,11,12,12,14,14, - 14,14,17,16, 7, 9, 9,11,11,13,12,13,13,14,14,17, - 0, 9,11,11,12,13,14,14,14,13,15,14,17,17, 9,11, - 11,12,12,14,14,13,14,14,15, 0, 0,11,12,12,15,14, - 15,14,15,14,15,16,17, 0,11,12,13,13,13,14,14,15, - 14,15,15, 0, 0,12,14,14,15,15,14,16,15,15,17,16, - 0,18,13,14,14,15,14,15,14,15,16,17,16, 0, 0,17, - 17,18, 0,16,18,16, 0, 0, 0,17, 0, 0,16, 0, 0,16, - 16, 0,15, 0,17, 0, 0, 0, 0, -}; - -static const static_codebook _8u0__p6_0 = { - 2, 169, - (char *)_vq_lengthlist__8u0__p6_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__8u0__p6_0, - 0 -}; - -static const long _vq_quantlist__8u0__p6_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__8u0__p6_1[] = { - 1, 4, 4, 6, 6, 4, 6, 5, 7, 7, 4, 5, 6, 7, 7, 6, - 7, 7, 7, 7, 6, 7, 7, 7, 7, -}; - -static const static_codebook _8u0__p6_1 = { - 2, 25, - (char *)_vq_lengthlist__8u0__p6_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__8u0__p6_1, - 0 -}; - -static const long _vq_quantlist__8u0__p7_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__8u0__p7_0[] = { - 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 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, 7, 7, 7, 7, 7, 7, 7, - 7, -}; - -static const static_codebook _8u0__p7_0 = { - 4, 81, - (char *)_vq_lengthlist__8u0__p7_0, - 1, -518803456, 1628680192, 2, 0, - (long *)_vq_quantlist__8u0__p7_0, - 0 -}; - -static const long _vq_quantlist__8u0__p7_1[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const char _vq_lengthlist__8u0__p7_1[] = { - 1, 5, 5, 5, 5,10,10,11,11,11,11,11,11,11,11, 5, - 7, 6, 8, 8, 9,10,11,11,11,11,11,11,11,11, 6, 6, - 7, 9, 7,11,10,11,11,11,11,11,11,11,11, 5, 6, 6, - 11, 8,11,11,11,11,11,11,11,11,11,11, 5, 6, 6, 9, - 10,11,10,11,11,11,11,11,11,11,11, 7,10,10,11,11, - 11,11,11,11,11,11,11,11,11,11, 7,11, 8,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10, -}; - -static const static_codebook _8u0__p7_1 = { - 2, 225, - (char *)_vq_lengthlist__8u0__p7_1, - 1, -520986624, 1620377600, 4, 0, - (long *)_vq_quantlist__8u0__p7_1, - 0 -}; - -static const long _vq_quantlist__8u0__p7_2[] = { - 10, - 9, - 11, - 8, - 12, - 7, - 13, - 6, - 14, - 5, - 15, - 4, - 16, - 3, - 17, - 2, - 18, - 1, - 19, - 0, - 20, -}; - -static const char _vq_lengthlist__8u0__p7_2[] = { - 1, 6, 5, 7, 7, 9, 9, 9, 9,10,12,12,10,11,11,10, - 11,11,11,10,11, 6, 8, 8, 9, 9,10,10, 9,10,11,11, - 10,11,11,11,11,10,11,11,11,11, 6, 7, 8, 9, 9, 9, - 10,11,10,11,12,11,10,11,11,11,11,11,11,12,10, 8, - 9, 9,10, 9,10,10, 9,10,10,10,10,10, 9,10,10,10, - 10, 9,10,10, 9, 9, 9, 9,10,10, 9, 9,10,10,11,10, - 9,12,10,11,10, 9,10,10,10, 8, 9, 9,10, 9,10, 9, - 9,10,10, 9,10, 9,11,10,10,10,10,10, 9,10, 8, 8, - 9, 9,10, 9,11, 9, 8, 9, 9,10,11,10,10,10,11,12, - 9, 9,11, 8, 9, 8,11,10,11,10,10, 9,11,10,10,10, - 10,10,10,10,11,11,11,11, 8, 9, 9, 9,10,10,10,11, - 11,12,11,12,11,10,10,10,12,11,11,11,10, 8,10, 9, - 11,10,10,11,12,10,11,12,11,11,12,11,12,12,10,11, - 11,10, 9, 9,10,11,12,10,10,10,11,10,11,11,10,12, - 12,10,11,10,11,12,10, 9,10,10,11,10,11,11,11,11, - 11,12,11,11,11, 9,11,10,11,10,11,10, 9, 9,10,11, - 11,11,10,10,11,12,12,11,12,11,11,11,12,12,12,12, - 11, 9,11,11,12,10,11,11,11,11,11,11,12,11,11,12, - 11,11,11,10,11,11, 9,11,10,11,11,11,10,10,10,11, - 11,11,12,10,11,10,11,11,11,11,12, 9,11,10,11,11, - 10,10,11,11, 9,11,11,12,10,10,10,10,10,11,11,10, - 9,10,11,11,12,11,10,10,12,11,11,12,11,12,11,11, - 10,10,11,11,10,12,11,10,11,10,11,10,10,10,11,11, - 10,10,11,11,11,11,10,10,10,12,11,11,11,11,10, 9, - 10,11,11,11,12,11,11,11,12,10,11,11,11, 9,10,11, - 11,11,11,11,11,10,10,11,11,12,11,10,11,12,11,10, - 10,11, 9,10,11,11,11,11,11,10,11,11,10,12,11,11, - 11,12,11,11,11,10,10,11,11, -}; - -static const static_codebook _8u0__p7_2 = { - 2, 441, - (char *)_vq_lengthlist__8u0__p7_2, - 1, -529268736, 1611661312, 5, 0, - (long *)_vq_quantlist__8u0__p7_2, - 0 -}; - -static const char _huff_lengthlist__8u0__single[] = { - 4, 7,11, 9,12, 8, 7,10, 6, 4, 5, 5, 7, 5, 6,16, - 9, 5, 5, 6, 7, 7, 9,16, 7, 4, 6, 5, 7, 5, 7,17, - 10, 7, 7, 8, 7, 7, 8,18, 7, 5, 6, 4, 5, 4, 5,15, - 7, 6, 7, 5, 6, 4, 5,15,12,13,18,12,17,11, 9,17, -}; - -static const static_codebook _huff_book__8u0__single = { - 2, 64, - (char *)_huff_lengthlist__8u0__single, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__8u1__p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__8u1__p1_0[] = { - 1, 4, 4, 5, 7, 7, 5, 7, 7, 5, 8, 8, 7, 9,10, 7, - 9, 9, 5, 8, 8, 7,10, 9, 7, 9, 9, 5, 8, 8, 8,10, - 10, 8,10,10, 7,10,10, 9,10,12,10,12,12, 7,10,10, - 9,12,11,10,12,12, 5, 8, 8, 8,10,10, 8,10,10, 7, - 10,10,10,12,12, 9,11,12, 7,10,10,10,12,12, 9,12, - 10, -}; - -static const static_codebook _8u1__p1_0 = { - 4, 81, - (char *)_vq_lengthlist__8u1__p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__8u1__p1_0, - 0 -}; - -static const long _vq_quantlist__8u1__p2_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__8u1__p2_0[] = { - 3, 4, 5, 5, 6, 6, 5, 6, 6, 5, 7, 6, 6, 7, 8, 6, - 7, 8, 5, 6, 6, 6, 8, 7, 6, 8, 7, 5, 6, 6, 7, 8, - 8, 6, 7, 7, 6, 8, 7, 7, 7, 9, 8, 9, 9, 6, 7, 8, - 7, 9, 7, 8, 9, 9, 5, 6, 6, 6, 7, 7, 7, 8, 8, 6, - 8, 7, 8, 9, 9, 7, 7, 9, 6, 7, 8, 8, 9, 9, 7, 9, - 7, -}; - -static const static_codebook _8u1__p2_0 = { - 4, 81, - (char *)_vq_lengthlist__8u1__p2_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__8u1__p2_0, - 0 -}; - -static const long _vq_quantlist__8u1__p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__8u1__p3_0[] = { - 1, 5, 5, 7, 7, 6, 7, 7, 9, 9, 6, 7, 7, 9, 9, 8, - 10, 9,11,11, 9, 9, 9,11,11, 6, 8, 8,10,10, 8,10, - 10,11,11, 8, 9,10,11,11,10,11,11,12,12,10,11,11, - 12,13, 6, 8, 8,10,10, 8,10, 9,11,11, 8,10, 9,11, - 11,10,11,11,12,12,10,11,11,12,12, 9,11,11,14,13, - 10,12,11,14,14,10,12,11,14,13,12,13,13,15,14,12, - 13,13,15,14, 8,11,11,13,14,10,11,12,13,15,10,11, - 12,14,14,12,13,13,14,15,12,13,13,14,15, 5, 8, 8, - 11,11, 8,10,10,12,12, 8,10,10,12,12,11,12,12,14, - 13,11,12,12,13,14, 8,10,10,12,12, 9,11,12,13,14, - 10,12,12,13,13,12,12,13,14,14,11,13,13,15,15, 7, - 10,10,12,12, 9,12,11,14,12,10,11,12,13,14,12,13, - 12,14,14,12,13,13,15,16,10,12,12,15,14,11,12,13, - 15,15,11,13,13,15,16,14,14,15,15,16,13,14,15,17, - 15, 9,12,12,14,15,11,13,12,15,15,11,13,13,15,15, - 13,14,13,15,14,13,14,14,17, 0, 5, 8, 8,11,11, 8, - 10,10,12,12, 8,10,10,12,12,11,12,12,14,14,11,12, - 12,14,14, 7,10,10,12,12,10,12,12,13,13, 9,11,12, - 12,13,11,12,13,15,15,11,12,13,14,15, 8,10,10,12, - 12,10,12,11,13,13,10,12,11,13,13,11,13,13,15,14, - 12,13,12,15,13, 9,12,12,14,14,11,13,13,16,15,11, - 12,13,16,15,13,14,15,16,16,13,13,15,15,16,10,12, - 12,15,14,11,13,13,14,16,11,13,13,15,16,13,15,15, - 16,17,13,15,14,16,15, 8,11,11,14,15,10,12,12,15, - 15,10,12,12,15,16,14,15,15,16,17,13,14,14,16,16, - 9,12,12,15,15,11,13,14,15,17,11,13,13,15,16,14, - 15,16,19,17,13,15,15, 0,17, 9,12,12,15,15,11,14, - 13,16,15,11,13,13,15,16,15,15,15,18,17,13,15,15, - 17,17,11,15,14,18,16,12,14,15,17,17,12,15,15,18, - 18,15,15,16,15,19,14,16,16, 0, 0,11,14,14,16,17, - 12,15,14,18,17,12,15,15,18,18,15,17,15,18,16,14, - 16,16,18,18, 7,11,11,14,14,10,12,12,15,15,10,12, - 13,15,15,13,14,15,16,16,14,15,15,18,18, 9,12,12, - 15,15,11,13,13,16,15,11,12,13,16,16,14,15,15,17, - 16,15,16,16,17,17, 9,12,12,15,15,11,13,13,15,17, - 11,14,13,16,15,13,15,15,17,17,15,15,15,18,17,11, - 14,14,17,15,12,14,15,17,18,13,13,15,17,17,14,16, - 16,19,18,16,15,17,17, 0,11,14,14,17,17,12,15,15, - 18, 0,12,15,14,18,16,14,17,17,19, 0,16,18,15, 0, - 16, -}; - -static const static_codebook _8u1__p3_0 = { - 4, 625, - (char *)_vq_lengthlist__8u1__p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__8u1__p3_0, - 0 -}; - -static const long _vq_quantlist__8u1__p4_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__8u1__p4_0[] = { - 4, 5, 5, 9, 9, 6, 7, 7, 9, 9, 6, 7, 7, 9, 9, 9, - 9, 9,11,11, 9, 9, 9,11,11, 6, 7, 7, 9, 9, 7, 7, - 8, 9,10, 7, 7, 8, 9,10, 9, 9,10,10,11, 9, 9,10, - 10,12, 6, 7, 7, 9, 9, 7, 8, 7,10, 9, 7, 8, 7,10, - 9, 9,10, 9,12,11,10,10, 9,12,10, 9,10,10,12,11, - 9,10,10,12,11, 9,10,10,12,12,11,11,12,12,13,11, - 11,12,12,13, 9, 9,10,12,11, 9,10,10,12,12,10,10, - 10,12,12,11,12,11,13,12,11,12,11,13,12, 6, 7, 7, - 9, 9, 7, 8, 8,10,10, 7, 8, 7,10, 9,10,10,10,12, - 12,10,10,10,12,11, 7, 8, 7,10,10, 7, 7, 9,10,11, - 8, 9, 9,11,10,10,10,11,10,12,10,10,11,12,12, 7, - 8, 8,10,10, 7, 9, 8,11,10, 8, 8, 9,11,11,10,11, - 10,12,11,10,11,11,12,12, 9,10,10,12,12, 9,10,10, - 12,12,10,11,11,13,12,11,10,12,10,14,12,12,12,13, - 14, 9,10,10,12,12, 9,11,10,12,12,10,11,11,12,12, - 11,12,11,14,12,12,12,12,14,14, 5, 7, 7, 9, 9, 7, - 7, 7, 9,10, 7, 8, 8,10,10,10,10,10,11,11,10,10, - 10,12,12, 7, 8, 8,10,10, 8, 9, 8,11,10, 7, 8, 9, - 10,11,10,10,10,11,12,10,10,11,11,13, 6, 7, 8,10, - 10, 8, 9, 9,10,10, 7, 9, 7,11,10,10,11,10,12,12, - 10,11,10,12,10, 9,10,10,12,12,10,11,11,13,12, 9, - 10,10,12,12,12,12,12,14,13,11,11,12,11,14, 9,10, - 10,11,12,10,11,11,12,13, 9,10,10,12,12,12,12,12, - 14,13,11,12,10,14,11, 9, 9,10,11,12, 9,10,10,12, - 12, 9,10,10,12,12,12,12,12,14,14,11,12,12,13,12, - 9,10, 9,12,12, 9,10,11,12,13,10,11,10,13,11,12, - 12,13,13,14,12,12,12,13,13, 9,10,10,12,12,10,11, - 10,13,12,10,10,11,12,13,12,13,12,14,13,12,12,12, - 13,14,11,12,11,14,13,10,10,11,13,13,12,12,12,14, - 13,12,10,14,10,15,13,14,14,14,14,11,11,12,13,14, - 10,12,11,13,13,12,12,12,13,15,12,13,11,15,12,13, - 13,14,14,14, 9,10, 9,12,12, 9,10,10,12,12,10,10, - 10,12,12,11,11,12,12,13,12,12,12,14,14, 9,10,10, - 12,12,10,11,10,13,12,10,10,11,12,13,12,12,12,14, - 13,12,12,13,13,14, 9,10,10,12,13,10,10,11,11,12, - 9,11,10,13,12,12,12,12,13,14,12,13,12,14,13,11, - 12,11,13,13,12,13,12,14,13,10,11,12,13,13,13,13, - 13,14,15,12,11,14,12,14,11,11,12,12,13,12,12,12, - 13,14,10,12,10,14,13,13,13,13,14,15,12,14,11,15, - 10, -}; - -static const static_codebook _8u1__p4_0 = { - 4, 625, - (char *)_vq_lengthlist__8u1__p4_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__8u1__p4_0, - 0 -}; - -static const long _vq_quantlist__8u1__p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__8u1__p5_0[] = { - 1, 4, 4, 7, 7, 7, 7, 9, 9, 4, 6, 5, 8, 7, 8, 8, - 10,10, 4, 6, 6, 8, 8, 8, 8,10,10, 7, 8, 8, 9, 9, - 9, 9,11,11, 7, 8, 8, 9, 9, 9, 9,11,11, 8, 8, 8, - 9, 9,10,10,12,11, 8, 8, 8, 9, 9,10,10,11,11, 9, - 10,10,11,11,11,11,13,12, 9,10,10,11,11,12,12,12, - 13, -}; - -static const static_codebook _8u1__p5_0 = { - 2, 81, - (char *)_vq_lengthlist__8u1__p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__8u1__p5_0, - 0 -}; - -static const long _vq_quantlist__8u1__p6_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__8u1__p6_0[] = { - 3, 4, 4, 6, 6, 7, 7, 9, 9, 4, 4, 5, 6, 6, 7, 7, - 9, 9, 4, 4, 4, 6, 6, 7, 7, 9, 9, 6, 6, 6, 7, 7, - 8, 8, 9, 9, 6, 6, 6, 7, 7, 8, 8, 9, 9, 7, 7, 7, - 8, 8, 8, 9,10,10, 7, 7, 7, 8, 8, 9, 8,10,10, 9, - 9, 9, 9, 9,10,10,10,10, 9, 9, 9, 9, 9,10,10,10, - 10, -}; - -static const static_codebook _8u1__p6_0 = { - 2, 81, - (char *)_vq_lengthlist__8u1__p6_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__8u1__p6_0, - 0 -}; - -static const long _vq_quantlist__8u1__p7_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__8u1__p7_0[] = { - 1, 4, 4, 5, 7, 7, 5, 7, 7, 5, 9, 9, 8,10,10, 8, - 10,10, 5, 9, 9, 7,10,10, 8,10,10, 4,10,10, 9,12, - 12, 9,11,11, 7,12,11,10,11,13,10,13,13, 7,12,12, - 10,13,12,10,13,13, 4,10,10, 9,12,12, 9,12,12, 7, - 12,12,10,13,13,10,12,13, 7,11,12,10,13,13,10,13, - 11, -}; - -static const static_codebook _8u1__p7_0 = { - 4, 81, - (char *)_vq_lengthlist__8u1__p7_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__8u1__p7_0, - 0 -}; - -static const long _vq_quantlist__8u1__p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__8u1__p7_1[] = { - 2, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8, 4, 5, 5, 7, 7, - 8, 8, 9, 9, 9, 9, 4, 5, 5, 7, 7, 8, 8, 9, 9, 9, - 9, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 6, 7, 7, 8, - 8, 8, 8, 9, 9, 9, 9, 8, 8, 8, 8, 8, 9, 9, 9, 9, - 9, 9, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 8, 9, 9, - 9, 9, 9, 9,10,10,10,10, 8, 9, 9, 9, 9, 9, 9,10, - 10,10,10, 8, 9, 9, 9, 9, 9, 9,10,10,10,10, 8, 9, - 9, 9, 9, 9, 9,10,10,10,10, -}; - -static const static_codebook _8u1__p7_1 = { - 2, 121, - (char *)_vq_lengthlist__8u1__p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__8u1__p7_1, - 0 -}; - -static const long _vq_quantlist__8u1__p8_0[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__8u1__p8_0[] = { - 1, 4, 4, 6, 6, 8, 8,10,10,11,11, 4, 6, 6, 7, 7, - 9, 9,11,11,13,12, 4, 6, 6, 7, 7, 9, 9,11,11,12, - 12, 6, 7, 7, 9, 9,11,11,12,12,13,13, 6, 7, 7, 9, - 9,11,11,12,12,13,13, 8, 9, 9,11,11,12,12,13,13, - 14,14, 8, 9, 9,11,11,12,12,13,13,14,14, 9,11,11, - 12,12,13,13,14,14,15,15, 9,11,11,12,12,13,13,14, - 14,15,14,11,12,12,13,13,14,14,15,15,16,16,11,12, - 12,13,13,14,14,15,15,15,15, -}; - -static const static_codebook _8u1__p8_0 = { - 2, 121, - (char *)_vq_lengthlist__8u1__p8_0, - 1, -524582912, 1618345984, 4, 0, - (long *)_vq_quantlist__8u1__p8_0, - 0 -}; - -static const long _vq_quantlist__8u1__p8_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__8u1__p8_1[] = { - 2, 5, 5, 6, 6, 7, 7, 7, 7, 8, 8, 5, 6, 6, 7, 7, - 7, 7, 8, 8, 8, 8, 5, 6, 6, 7, 7, 7, 7, 8, 8, 8, - 8, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 6, 7, 7, 7, - 7, 8, 8, 8, 8, 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, - 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 9, 8, 9, 9, 7, 8, 8, 8, 8, 8, 8, 9, - 8, 9, 9, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 8, 8, - 8, 8, 8, 8, 8, 9, 9, 9, 9, -}; - -static const static_codebook _8u1__p8_1 = { - 2, 121, - (char *)_vq_lengthlist__8u1__p8_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__8u1__p8_1, - 0 -}; - -static const long _vq_quantlist__8u1__p9_0[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const char _vq_lengthlist__8u1__p9_0[] = { - 1, 4, 4,11,11,11,11,11,11,11,11,11,11,11,11, 3, - 11, 8,11,11,11,11,11,11,11,11,11,11,11,11, 3, 9, - 9,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10, -}; - -static const static_codebook _8u1__p9_0 = { - 2, 225, - (char *)_vq_lengthlist__8u1__p9_0, - 1, -514071552, 1627381760, 4, 0, - (long *)_vq_quantlist__8u1__p9_0, - 0 -}; - -static const long _vq_quantlist__8u1__p9_1[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const char _vq_lengthlist__8u1__p9_1[] = { - 1, 4, 4, 7, 7, 9, 9, 7, 7, 8, 8,10,10,11,11, 4, - 7, 7, 9, 9,10,10, 8, 8,10,10,10,11,10,11, 4, 7, - 7, 9, 9,10,10, 8, 8,10, 9,11,11,11,11, 7, 9, 9, - 12,12,11,12,10,10,11,10,12,11,11,11, 7, 9, 9,11, - 11,13,12, 9, 9,11,10,11,11,12,11, 9,10,10,12,12, - 14,14,10,10,11,12,12,11,11,11, 9,10,11,11,13,14, - 13,10,11,11,11,12,11,12,12, 7, 8, 8,10, 9,11,10, - 11,12,12,11,12,14,12,13, 7, 8, 8, 9,10,10,11,12, - 12,12,11,12,12,12,13, 9, 9, 9,11,11,13,12,12,12, - 12,11,12,12,13,12, 8,10,10,11,10,11,12,12,12,12, - 12,12,14,12,12, 9,11,11,11,12,12,12,12,13,13,12, - 12,13,13,12,10,11,11,12,11,12,12,12,11,12,13,12, - 12,12,13,11,11,12,12,12,13,12,12,11,12,13,13,12, - 12,13,12,11,12,12,13,13,12,13,12,13,13,13,13,14, - 13, -}; - -static const static_codebook _8u1__p9_1 = { - 2, 225, - (char *)_vq_lengthlist__8u1__p9_1, - 1, -522338304, 1620115456, 4, 0, - (long *)_vq_quantlist__8u1__p9_1, - 0 -}; - -static const long _vq_quantlist__8u1__p9_2[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__8u1__p9_2[] = { - 2, 5, 4, 6, 6, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, - 9, 5, 6, 6, 7, 7, 8, 8, 9, 8, 9, 9, 9, 9, 9, 9, - 9, 9, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, - 9,10,10, 9, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9,10,10, 8, 8, 8, 9, 9, 9, 9,10,10,10, 9, - 10,10,10,10,10,10, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, - 10,10,10,10,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9,10, - 10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9,10,10,10, - 10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9, 9,10, - 10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9,10, - 10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9,10, - 10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, - 9,10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10, 9,10, - 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10, 9, - 10, 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 9, 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10, -}; - -static const static_codebook _8u1__p9_2 = { - 2, 289, - (char *)_vq_lengthlist__8u1__p9_2, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__8u1__p9_2, - 0 -}; - -static const char _huff_lengthlist__8u1__single[] = { - 4, 7,13, 9,15, 9,16, 8,10,13, 7, 5, 8, 6, 9, 7, - 10, 7,10,11,11, 6, 7, 8, 8, 9, 9, 9,12,16, 8, 5, - 8, 6, 8, 6, 9, 7,10,12,11, 7, 7, 7, 6, 7, 7, 7, - 11,15, 7, 5, 8, 6, 7, 5, 7, 6, 9,13,13, 9, 9, 8, - 6, 6, 5, 5, 9,14, 8, 6, 8, 6, 6, 4, 5, 3, 5,13, - 9, 9,11, 8,10, 7, 8, 4, 5,12,11,16,17,15,17,12, - 13, 8, 8,15, -}; - -static const static_codebook _huff_book__8u1__single = { - 2, 100, - (char *)_huff_lengthlist__8u1__single, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44u0__long[] = { - 5, 8,13,10,17,11,11,15, 7, 2, 4, 5, 8, 7, 9,16, - 13, 4, 3, 5, 6, 8,11,20,10, 4, 5, 5, 7, 6, 8,18, - 15, 7, 6, 7, 8,10,14,20,10, 6, 7, 6, 9, 7, 8,17, - 9, 8,10, 8,10, 5, 4,11,12,17,19,14,16,10, 7,12, -}; - -static const static_codebook _huff_book__44u0__long = { - 2, 64, - (char *)_huff_lengthlist__44u0__long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44u0__p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44u0__p1_0[] = { - 1, 4, 4, 5, 8, 7, 5, 7, 8, 5, 8, 8, 8,11,11, 8, - 10,10, 5, 8, 8, 8,11,10, 8,11,11, 4, 8, 8, 8,11, - 11, 8,11,11, 8,12,11,11,13,13,11,13,14, 7,11,11, - 10,13,12,11,13,14, 4, 8, 8, 8,11,11, 8,11,12, 8, - 11,11,11,13,13,10,12,13, 8,11,11,11,14,13,11,14, - 13, -}; - -static const static_codebook _44u0__p1_0 = { - 4, 81, - (char *)_vq_lengthlist__44u0__p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u0__p1_0, - 0 -}; - -static const long _vq_quantlist__44u0__p2_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44u0__p2_0[] = { - 2, 4, 4, 5, 6, 6, 5, 6, 6, 5, 7, 7, 7, 8, 8, 6, - 8, 8, 5, 7, 7, 6, 8, 8, 7, 8, 8, 4, 7, 7, 7, 8, - 8, 7, 8, 8, 7, 8, 8, 8, 9,10, 8,10,10, 6, 8, 8, - 8,10, 8, 8,10,10, 5, 7, 7, 7, 8, 8, 7, 8, 8, 6, - 8, 8, 8,10,10, 8, 8,10, 6, 8, 8, 8,10,10, 8,10, - 9, -}; - -static const static_codebook _44u0__p2_0 = { - 4, 81, - (char *)_vq_lengthlist__44u0__p2_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u0__p2_0, - 0 -}; - -static const long _vq_quantlist__44u0__p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44u0__p3_0[] = { - 1, 5, 5, 8, 8, 5, 8, 7, 9, 9, 5, 7, 8, 9, 9, 9, - 10, 9,12,12, 9, 9,10,12,12, 6, 8, 8,11,10, 8,10, - 10,11,11, 8, 9,10,11,11,10,11,11,14,13,10,11,11, - 13,13, 5, 8, 8,10,10, 8,10,10,11,11, 8,10,10,11, - 11,10,11,11,13,13,10,11,11,13,13, 9,11,11,15,14, - 10,12,12,15,14,10,12,11,15,14,13,14,14,16,16,12, - 14,13,17,15, 9,11,11,14,15,10,11,12,14,16,10,11, - 12,14,16,12,13,14,16,16,13,13,15,15,18, 5, 8, 8, - 11,11, 8,10,10,12,12, 8,10,10,12,13,11,12,12,14, - 14,11,12,12,15,15, 8,10,10,13,13,10,12,12,13,13, - 10,12,12,14,14,12,13,13,15,15,12,13,13,16,16, 7, - 10,10,12,12,10,12,11,13,13,10,12,12,13,14,12,13, - 12,15,14,12,13,13,16,16,10,12,12,17,16,12,13,13, - 16,15,11,13,13,17,17,15,15,15,16,17,14,15,15,19, - 19,10,12,12,15,16,11,13,12,15,18,11,13,13,16,16, - 14,15,15,17,17,14,15,15,17,19, 5, 8, 8,11,11, 8, - 10,10,12,12, 8,10,10,12,12,11,12,12,16,15,11,12, - 12,14,15, 7,10,10,13,13,10,12,12,14,13,10,11,12, - 13,13,12,13,13,16,16,12,12,13,15,15, 8,10,10,13, - 13,10,12,12,14,14,10,12,12,13,13,12,13,13,16,16, - 12,13,13,15,15,10,12,12,16,15,11,13,13,17,16,11, - 12,13,16,15,13,15,15,19,17,14,15,14,17,16,10,12, - 12,16,16,11,13,13,16,17,12,13,13,15,17,14,15,15, - 17,19,14,15,15,17,17, 8,11,11,16,16,10,13,12,17, - 17,10,12,13,16,16,15,17,16,20,19,14,15,17,18,19, - 9,12,12,16,17,11,13,14,17,18,11,13,13,19,18,16, - 17,18,19,19,15,16,16,19,19, 9,12,12,16,17,11,14, - 13,18,17,11,13,13,17,17,16,17,16,20,19,14,16,16, - 18,18,12,15,15,19,17,14,15,16, 0,20,13,15,16,20, - 17,18,16,20, 0, 0,15,16,19,20, 0,12,15,14,18,19, - 13,16,15,20,19,13,16,15,20,18,17,18,17, 0,20,16, - 17,16, 0, 0, 8,11,11,16,15,10,12,12,17,17,10,13, - 13,17,16,14,16,15,18,20,15,16,16,19,19, 9,12,12, - 16,16,11,13,13,17,16,11,13,14,17,18,15,15,16,20, - 20,16,16,17,19,19, 9,13,12,16,17,11,14,13,17,17, - 11,14,14,18,17,14,16,15,18,19,16,17,18,18,19,12, - 14,15,19,18,13,15,16,18, 0,13,14,15, 0, 0,16,16, - 17,20, 0,17,17,20,20, 0,12,15,15,19,20,13,15,15, - 0, 0,14,16,15, 0, 0,15,18,16, 0, 0,17,18,16, 0, - 19, -}; - -static const static_codebook _44u0__p3_0 = { - 4, 625, - (char *)_vq_lengthlist__44u0__p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u0__p3_0, - 0 -}; - -static const long _vq_quantlist__44u0__p4_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44u0__p4_0[] = { - 4, 5, 5, 9, 9, 5, 6, 6, 9, 9, 5, 6, 6, 9, 9, 9, - 10, 9,12,12, 9, 9,10,12,12, 5, 7, 7,10,10, 7, 7, - 8,10,10, 6, 7, 8,10,10,10,10,10,11,13,10, 9,10, - 12,13, 5, 7, 7,10,10, 6, 8, 7,10,10, 7, 8, 7,10, - 10, 9,10,10,12,12,10,10,10,13,11, 9,10,10,13,13, - 10,11,10,13,13,10,10,10,13,13,12,12,13,14,14,12, - 12,13,14,14, 9,10,10,13,13,10,10,10,13,13,10,10, - 10,13,13,12,13,12,15,14,12,13,12,15,15, 5, 7, 6, - 10,10, 7, 8, 8,10,10, 7, 8, 8,10,10,10,11,10,13, - 13,10,10,10,12,12, 7, 8, 8,11,10, 8, 8, 9,10,11, - 8, 9, 9,11,11,11,10,11,11,14,11,11,11,13,13, 6, - 8, 8,10,10, 7, 9, 8,11,10, 8, 9, 9,11,11,10,11, - 10,14,11,10,11,11,13,13,10,11,11,14,13,10,10,11, - 14,13,10,11,11,14,14,12,11,13,12,16,13,14,14,15, - 15,10,10,11,13,14,10,11,10,14,13,10,11,11,14,14, - 12,13,12,15,13,13,13,14,15,16, 5, 7, 7,10,10, 7, - 8, 8,10,10, 7, 8, 8,10,10,10,10,10,13,13,10,10, - 11,12,13, 6, 8, 8,11,10, 8, 9, 9,11,11, 7, 8, 9, - 10,11,10,11,11,13,13,10,10,11,11,13, 6, 8, 8,10, - 11, 8, 9, 9,11,11, 8, 9, 8,12,10,10,11,11,13,13, - 10,11,10,14,11,10,10,10,14,13,10,11,11,14,13,10, - 10,11,13,13,12,14,14,16,16,12,12,13,13,15,10,11, - 11,13,14,10,11,11,14,15,10,11,10,13,13,13,14,13, - 16,16,12,13,11,15,12, 9,10,10,13,13,10,11,11,14, - 13,10,10,11,13,14,13,14,13,16,16,13,13,13,15,16, - 9,10,10,13,13,10,10,11,13,14,10,11,11,15,13,13, - 13,14,14,18,13,13,14,16,15, 9,10,10,13,14,10,11, - 10,14,13,10,11,11,13,14,13,14,13,16,15,13,13,14, - 15,16,12,13,12,16,14,11,11,13,15,15,13,14,13,16, - 15,15,12,16,12,17,14,15,15,17,17,12,13,13,14,16, - 11,13,11,16,15,12,13,14,15,16,14,15,13, 0,14,14, - 16,16, 0, 0, 9,10,10,13,13,10,11,10,14,14,10,11, - 11,13,13,12,13,13,14,16,13,14,14,16,16, 9,10,10, - 14,14,11,11,11,14,13,10,10,11,14,14,13,13,13,16, - 16,13,13,14,14,17, 9,10,10,13,14,10,11,11,13,15, - 10,11,10,14,14,13,13,13,14,17,13,14,13,17,14,12, - 13,13,16,14,13,14,13,16,15,12,12,13,15,16,15,15, - 16,18,16,15,13,15,14, 0,12,12,13,14,16,13,13,14, - 15,16,11,12,11,16,14,15,16,16,17,17,14,15,12,17, - 12, -}; - -static const static_codebook _44u0__p4_0 = { - 4, 625, - (char *)_vq_lengthlist__44u0__p4_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u0__p4_0, - 0 -}; - -static const long _vq_quantlist__44u0__p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44u0__p5_0[] = { - 1, 4, 4, 7, 7, 7, 7, 9, 9, 4, 6, 6, 8, 8, 8, 8, - 9, 9, 4, 6, 6, 8, 8, 8, 8, 9, 9, 7, 8, 8, 9, 9, - 9, 9,11,10, 7, 8, 8, 9, 9, 9, 9,10,10, 7, 8, 8, - 9, 9,10,10,11,11, 7, 8, 8, 9, 9,10,10,11,11, 9, - 9, 9,10,10,11,11,12,12, 9, 9, 9,10,11,11,11,12, - 12, -}; - -static const static_codebook _44u0__p5_0 = { - 2, 81, - (char *)_vq_lengthlist__44u0__p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44u0__p5_0, - 0 -}; - -static const long _vq_quantlist__44u0__p6_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44u0__p6_0[] = { - 1, 4, 4, 6, 6, 8, 8,10, 9,11,10,14,13, 4, 6, 5, - 8, 8, 9, 9,11,10,11,11,14,14, 4, 5, 6, 8, 8, 9, - 9,10,10,11,11,14,14, 6, 8, 8, 9, 9,10,10,11,11, - 12,12,16,15, 7, 8, 8, 9, 9,10,10,11,11,12,12,15, - 15, 9,10,10,10,10,11,11,12,12,12,12,15,15, 9,10, - 9,10,11,11,11,12,12,12,13,15,15,10,10,11,11,11, - 12,12,13,12,13,13,16,15,10,11,11,11,11,12,12,13, - 12,13,13,16,17,11,11,12,12,12,13,13,13,14,14,15, - 17,17,11,11,12,12,12,13,13,13,14,14,14,16,18,14, - 15,15,15,15,16,16,16,16,17,18, 0, 0,14,15,15,15, - 15,17,16,17,18,17,17,18, 0, -}; - -static const static_codebook _44u0__p6_0 = { - 2, 169, - (char *)_vq_lengthlist__44u0__p6_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44u0__p6_0, - 0 -}; - -static const long _vq_quantlist__44u0__p6_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44u0__p6_1[] = { - 2, 4, 4, 5, 5, 4, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, - 6, 6, 6, 6, 5, 6, 6, 6, 6, -}; - -static const static_codebook _44u0__p6_1 = { - 2, 25, - (char *)_vq_lengthlist__44u0__p6_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u0__p6_1, - 0 -}; - -static const long _vq_quantlist__44u0__p7_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44u0__p7_0[] = { - 1, 4, 4,11,11, 9,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11, 9,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10, -}; - -static const static_codebook _44u0__p7_0 = { - 4, 625, - (char *)_vq_lengthlist__44u0__p7_0, - 1, -518709248, 1626677248, 3, 0, - (long *)_vq_quantlist__44u0__p7_0, - 0 -}; - -static const long _vq_quantlist__44u0__p7_1[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44u0__p7_1[] = { - 1, 4, 4, 6, 6, 6, 6, 7, 7, 8, 8, 9, 9, 5, 7, 7, - 8, 7, 7, 7, 9, 8,10, 9,10,11, 5, 7, 7, 8, 8, 7, - 7, 8, 9,10,10,11,11, 6, 8, 8, 9, 9, 9, 9,11,10, - 12,12,15,12, 6, 8, 8, 9, 9, 9, 9,11,11,12,11,14, - 12, 7, 8, 8,10,10,12,12,13,13,13,15,13,13, 7, 8, - 8,10,10,11,11,13,12,14,15,15,15, 9,10,10,11,12, - 13,13,14,15,14,15,14,15, 8,10,10,12,12,14,14,15, - 14,14,15,15,14,10,12,12,14,14,15,14,15,15,15,14, - 15,15,10,12,12,13,14,15,14,15,15,14,15,15,15,12, - 15,13,15,14,15,15,15,15,15,15,15,15,13,13,15,15, - 15,15,15,15,15,15,15,15,15, -}; - -static const static_codebook _44u0__p7_1 = { - 2, 169, - (char *)_vq_lengthlist__44u0__p7_1, - 1, -523010048, 1618608128, 4, 0, - (long *)_vq_quantlist__44u0__p7_1, - 0 -}; - -static const long _vq_quantlist__44u0__p7_2[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44u0__p7_2[] = { - 2, 5, 4, 6, 6, 7, 7, 8, 8, 8, 8, 9, 8, 5, 5, 6, - 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 5, 6, 5, 7, 7, 8, - 8, 8, 8, 9, 9, 9, 9, 6, 7, 7, 8, 8, 8, 8, 9, 8, - 9, 9, 9, 9, 6, 7, 7, 8, 7, 8, 8, 9, 9, 9, 9, 9, - 9, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 7, 8, - 8, 9, 8, 9, 8, 9, 9, 9, 9, 9, 9, 8, 9, 8, 9, 9, - 9, 9, 9, 9, 9, 9,10,10, 8, 8, 9, 9, 9, 9, 9, 9, - 9, 9,10, 9,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, 9, 9, 9, 9, 9, - 9, 9, 9,10, 9, 9,10,10, 9, -}; - -static const static_codebook _44u0__p7_2 = { - 2, 169, - (char *)_vq_lengthlist__44u0__p7_2, - 1, -531103744, 1611661312, 4, 0, - (long *)_vq_quantlist__44u0__p7_2, - 0 -}; - -static const char _huff_lengthlist__44u0__short[] = { - 12,13,14,13,17,12,15,17, 5, 5, 6,10,10,11,15,16, - 4, 3, 3, 7, 5, 7,10,16, 7, 7, 7,10, 9,11,12,16, - 6, 5, 5, 9, 5, 6,10,16, 8, 7, 7, 9, 6, 7, 9,16, - 11, 7, 3, 6, 4, 5, 8,16,12, 9, 4, 8, 5, 7, 9,16, -}; - -static const static_codebook _huff_book__44u0__short = { - 2, 64, - (char *)_huff_lengthlist__44u0__short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44u1__long[] = { - 5, 8,13,10,17,11,11,15, 7, 2, 4, 5, 8, 7, 9,16, - 13, 4, 3, 5, 6, 8,11,20,10, 4, 5, 5, 7, 6, 8,18, - 15, 7, 6, 7, 8,10,14,20,10, 6, 7, 6, 9, 7, 8,17, - 9, 8,10, 8,10, 5, 4,11,12,17,19,14,16,10, 7,12, -}; - -static const static_codebook _huff_book__44u1__long = { - 2, 64, - (char *)_huff_lengthlist__44u1__long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44u1__p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44u1__p1_0[] = { - 1, 4, 4, 5, 8, 7, 5, 7, 8, 5, 8, 8, 8,11,11, 8, - 10,10, 5, 8, 8, 8,11,10, 8,11,11, 4, 8, 8, 8,11, - 11, 8,11,11, 8,12,11,11,13,13,11,13,14, 7,11,11, - 10,13,12,11,13,14, 4, 8, 8, 8,11,11, 8,11,12, 8, - 11,11,11,13,13,10,12,13, 8,11,11,11,14,13,11,14, - 13, -}; - -static const static_codebook _44u1__p1_0 = { - 4, 81, - (char *)_vq_lengthlist__44u1__p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u1__p1_0, - 0 -}; - -static const long _vq_quantlist__44u1__p2_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44u1__p2_0[] = { - 2, 4, 4, 5, 6, 6, 5, 6, 6, 5, 7, 7, 7, 8, 8, 6, - 8, 8, 5, 7, 7, 6, 8, 8, 7, 8, 8, 4, 7, 7, 7, 8, - 8, 7, 8, 8, 7, 8, 8, 8, 9,10, 8,10,10, 6, 8, 8, - 8,10, 8, 8,10,10, 5, 7, 7, 7, 8, 8, 7, 8, 8, 6, - 8, 8, 8,10,10, 8, 8,10, 6, 8, 8, 8,10,10, 8,10, - 9, -}; - -static const static_codebook _44u1__p2_0 = { - 4, 81, - (char *)_vq_lengthlist__44u1__p2_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u1__p2_0, - 0 -}; - -static const long _vq_quantlist__44u1__p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44u1__p3_0[] = { - 1, 5, 5, 8, 8, 5, 8, 7, 9, 9, 5, 7, 8, 9, 9, 9, - 10, 9,12,12, 9, 9,10,12,12, 6, 8, 8,11,10, 8,10, - 10,11,11, 8, 9,10,11,11,10,11,11,14,13,10,11,11, - 13,13, 5, 8, 8,10,10, 8,10,10,11,11, 8,10,10,11, - 11,10,11,11,13,13,10,11,11,13,13, 9,11,11,15,14, - 10,12,12,15,14,10,12,11,15,14,13,14,14,16,16,12, - 14,13,17,15, 9,11,11,14,15,10,11,12,14,16,10,11, - 12,14,16,12,13,14,16,16,13,13,15,15,18, 5, 8, 8, - 11,11, 8,10,10,12,12, 8,10,10,12,13,11,12,12,14, - 14,11,12,12,15,15, 8,10,10,13,13,10,12,12,13,13, - 10,12,12,14,14,12,13,13,15,15,12,13,13,16,16, 7, - 10,10,12,12,10,12,11,13,13,10,12,12,13,14,12,13, - 12,15,14,12,13,13,16,16,10,12,12,17,16,12,13,13, - 16,15,11,13,13,17,17,15,15,15,16,17,14,15,15,19, - 19,10,12,12,15,16,11,13,12,15,18,11,13,13,16,16, - 14,15,15,17,17,14,15,15,17,19, 5, 8, 8,11,11, 8, - 10,10,12,12, 8,10,10,12,12,11,12,12,16,15,11,12, - 12,14,15, 7,10,10,13,13,10,12,12,14,13,10,11,12, - 13,13,12,13,13,16,16,12,12,13,15,15, 8,10,10,13, - 13,10,12,12,14,14,10,12,12,13,13,12,13,13,16,16, - 12,13,13,15,15,10,12,12,16,15,11,13,13,17,16,11, - 12,13,16,15,13,15,15,19,17,14,15,14,17,16,10,12, - 12,16,16,11,13,13,16,17,12,13,13,15,17,14,15,15, - 17,19,14,15,15,17,17, 8,11,11,16,16,10,13,12,17, - 17,10,12,13,16,16,15,17,16,20,19,14,15,17,18,19, - 9,12,12,16,17,11,13,14,17,18,11,13,13,19,18,16, - 17,18,19,19,15,16,16,19,19, 9,12,12,16,17,11,14, - 13,18,17,11,13,13,17,17,16,17,16,20,19,14,16,16, - 18,18,12,15,15,19,17,14,15,16, 0,20,13,15,16,20, - 17,18,16,20, 0, 0,15,16,19,20, 0,12,15,14,18,19, - 13,16,15,20,19,13,16,15,20,18,17,18,17, 0,20,16, - 17,16, 0, 0, 8,11,11,16,15,10,12,12,17,17,10,13, - 13,17,16,14,16,15,18,20,15,16,16,19,19, 9,12,12, - 16,16,11,13,13,17,16,11,13,14,17,18,15,15,16,20, - 20,16,16,17,19,19, 9,13,12,16,17,11,14,13,17,17, - 11,14,14,18,17,14,16,15,18,19,16,17,18,18,19,12, - 14,15,19,18,13,15,16,18, 0,13,14,15, 0, 0,16,16, - 17,20, 0,17,17,20,20, 0,12,15,15,19,20,13,15,15, - 0, 0,14,16,15, 0, 0,15,18,16, 0, 0,17,18,16, 0, - 19, -}; - -static const static_codebook _44u1__p3_0 = { - 4, 625, - (char *)_vq_lengthlist__44u1__p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u1__p3_0, - 0 -}; - -static const long _vq_quantlist__44u1__p4_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44u1__p4_0[] = { - 4, 5, 5, 9, 9, 5, 6, 6, 9, 9, 5, 6, 6, 9, 9, 9, - 10, 9,12,12, 9, 9,10,12,12, 5, 7, 7,10,10, 7, 7, - 8,10,10, 6, 7, 8,10,10,10,10,10,11,13,10, 9,10, - 12,13, 5, 7, 7,10,10, 6, 8, 7,10,10, 7, 8, 7,10, - 10, 9,10,10,12,12,10,10,10,13,11, 9,10,10,13,13, - 10,11,10,13,13,10,10,10,13,13,12,12,13,14,14,12, - 12,13,14,14, 9,10,10,13,13,10,10,10,13,13,10,10, - 10,13,13,12,13,12,15,14,12,13,12,15,15, 5, 7, 6, - 10,10, 7, 8, 8,10,10, 7, 8, 8,10,10,10,11,10,13, - 13,10,10,10,12,12, 7, 8, 8,11,10, 8, 8, 9,10,11, - 8, 9, 9,11,11,11,10,11,11,14,11,11,11,13,13, 6, - 8, 8,10,10, 7, 9, 8,11,10, 8, 9, 9,11,11,10,11, - 10,14,11,10,11,11,13,13,10,11,11,14,13,10,10,11, - 14,13,10,11,11,14,14,12,11,13,12,16,13,14,14,15, - 15,10,10,11,13,14,10,11,10,14,13,10,11,11,14,14, - 12,13,12,15,13,13,13,14,15,16, 5, 7, 7,10,10, 7, - 8, 8,10,10, 7, 8, 8,10,10,10,10,10,13,13,10,10, - 11,12,13, 6, 8, 8,11,10, 8, 9, 9,11,11, 7, 8, 9, - 10,11,10,11,11,13,13,10,10,11,11,13, 6, 8, 8,10, - 11, 8, 9, 9,11,11, 8, 9, 8,12,10,10,11,11,13,13, - 10,11,10,14,11,10,10,10,14,13,10,11,11,14,13,10, - 10,11,13,13,12,14,14,16,16,12,12,13,13,15,10,11, - 11,13,14,10,11,11,14,15,10,11,10,13,13,13,14,13, - 16,16,12,13,11,15,12, 9,10,10,13,13,10,11,11,14, - 13,10,10,11,13,14,13,14,13,16,16,13,13,13,15,16, - 9,10,10,13,13,10,10,11,13,14,10,11,11,15,13,13, - 13,14,14,18,13,13,14,16,15, 9,10,10,13,14,10,11, - 10,14,13,10,11,11,13,14,13,14,13,16,15,13,13,14, - 15,16,12,13,12,16,14,11,11,13,15,15,13,14,13,16, - 15,15,12,16,12,17,14,15,15,17,17,12,13,13,14,16, - 11,13,11,16,15,12,13,14,15,16,14,15,13, 0,14,14, - 16,16, 0, 0, 9,10,10,13,13,10,11,10,14,14,10,11, - 11,13,13,12,13,13,14,16,13,14,14,16,16, 9,10,10, - 14,14,11,11,11,14,13,10,10,11,14,14,13,13,13,16, - 16,13,13,14,14,17, 9,10,10,13,14,10,11,11,13,15, - 10,11,10,14,14,13,13,13,14,17,13,14,13,17,14,12, - 13,13,16,14,13,14,13,16,15,12,12,13,15,16,15,15, - 16,18,16,15,13,15,14, 0,12,12,13,14,16,13,13,14, - 15,16,11,12,11,16,14,15,16,16,17,17,14,15,12,17, - 12, -}; - -static const static_codebook _44u1__p4_0 = { - 4, 625, - (char *)_vq_lengthlist__44u1__p4_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u1__p4_0, - 0 -}; - -static const long _vq_quantlist__44u1__p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44u1__p5_0[] = { - 1, 4, 4, 7, 7, 7, 7, 9, 9, 4, 6, 6, 8, 8, 8, 8, - 9, 9, 4, 6, 6, 8, 8, 8, 8, 9, 9, 7, 8, 8, 9, 9, - 9, 9,11,10, 7, 8, 8, 9, 9, 9, 9,10,10, 7, 8, 8, - 9, 9,10,10,11,11, 7, 8, 8, 9, 9,10,10,11,11, 9, - 9, 9,10,10,11,11,12,12, 9, 9, 9,10,11,11,11,12, - 12, -}; - -static const static_codebook _44u1__p5_0 = { - 2, 81, - (char *)_vq_lengthlist__44u1__p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44u1__p5_0, - 0 -}; - -static const long _vq_quantlist__44u1__p6_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44u1__p6_0[] = { - 1, 4, 4, 6, 6, 8, 8,10, 9,11,10,14,13, 4, 6, 5, - 8, 8, 9, 9,11,10,11,11,14,14, 4, 5, 6, 8, 8, 9, - 9,10,10,11,11,14,14, 6, 8, 8, 9, 9,10,10,11,11, - 12,12,16,15, 7, 8, 8, 9, 9,10,10,11,11,12,12,15, - 15, 9,10,10,10,10,11,11,12,12,12,12,15,15, 9,10, - 9,10,11,11,11,12,12,12,13,15,15,10,10,11,11,11, - 12,12,13,12,13,13,16,15,10,11,11,11,11,12,12,13, - 12,13,13,16,17,11,11,12,12,12,13,13,13,14,14,15, - 17,17,11,11,12,12,12,13,13,13,14,14,14,16,18,14, - 15,15,15,15,16,16,16,16,17,18, 0, 0,14,15,15,15, - 15,17,16,17,18,17,17,18, 0, -}; - -static const static_codebook _44u1__p6_0 = { - 2, 169, - (char *)_vq_lengthlist__44u1__p6_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44u1__p6_0, - 0 -}; - -static const long _vq_quantlist__44u1__p6_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44u1__p6_1[] = { - 2, 4, 4, 5, 5, 4, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, - 6, 6, 6, 6, 5, 6, 6, 6, 6, -}; - -static const static_codebook _44u1__p6_1 = { - 2, 25, - (char *)_vq_lengthlist__44u1__p6_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u1__p6_1, - 0 -}; - -static const long _vq_quantlist__44u1__p7_0[] = { - 3, - 2, - 4, - 1, - 5, - 0, - 6, -}; - -static const char _vq_lengthlist__44u1__p7_0[] = { - 1, 3, 2, 9, 9, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, -}; - -static const static_codebook _44u1__p7_0 = { - 2, 49, - (char *)_vq_lengthlist__44u1__p7_0, - 1, -518017024, 1626677248, 3, 0, - (long *)_vq_quantlist__44u1__p7_0, - 0 -}; - -static const long _vq_quantlist__44u1__p7_1[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44u1__p7_1[] = { - 1, 4, 4, 6, 6, 6, 6, 7, 7, 8, 8, 9, 9, 5, 7, 7, - 8, 7, 7, 7, 9, 8,10, 9,10,11, 5, 7, 7, 8, 8, 7, - 7, 8, 9,10,10,11,11, 6, 8, 8, 9, 9, 9, 9,11,10, - 12,12,15,12, 6, 8, 8, 9, 9, 9, 9,11,11,12,11,14, - 12, 7, 8, 8,10,10,12,12,13,13,13,15,13,13, 7, 8, - 8,10,10,11,11,13,12,14,15,15,15, 9,10,10,11,12, - 13,13,14,15,14,15,14,15, 8,10,10,12,12,14,14,15, - 14,14,15,15,14,10,12,12,14,14,15,14,15,15,15,14, - 15,15,10,12,12,13,14,15,14,15,15,14,15,15,15,12, - 15,13,15,14,15,15,15,15,15,15,15,15,13,13,15,15, - 15,15,15,15,15,15,15,15,15, -}; - -static const static_codebook _44u1__p7_1 = { - 2, 169, - (char *)_vq_lengthlist__44u1__p7_1, - 1, -523010048, 1618608128, 4, 0, - (long *)_vq_quantlist__44u1__p7_1, - 0 -}; - -static const long _vq_quantlist__44u1__p7_2[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44u1__p7_2[] = { - 2, 5, 4, 6, 6, 7, 7, 8, 8, 8, 8, 9, 8, 5, 5, 6, - 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 5, 6, 5, 7, 7, 8, - 8, 8, 8, 9, 9, 9, 9, 6, 7, 7, 8, 8, 8, 8, 9, 8, - 9, 9, 9, 9, 6, 7, 7, 8, 7, 8, 8, 9, 9, 9, 9, 9, - 9, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 7, 8, - 8, 9, 8, 9, 8, 9, 9, 9, 9, 9, 9, 8, 9, 8, 9, 9, - 9, 9, 9, 9, 9, 9,10,10, 8, 8, 9, 9, 9, 9, 9, 9, - 9, 9,10, 9,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, 9, 9, 9, 9, 9, - 9, 9, 9,10, 9, 9,10,10, 9, -}; - -static const static_codebook _44u1__p7_2 = { - 2, 169, - (char *)_vq_lengthlist__44u1__p7_2, - 1, -531103744, 1611661312, 4, 0, - (long *)_vq_quantlist__44u1__p7_2, - 0 -}; - -static const char _huff_lengthlist__44u1__short[] = { - 12,13,14,13,17,12,15,17, 5, 5, 6,10,10,11,15,16, - 4, 3, 3, 7, 5, 7,10,16, 7, 7, 7,10, 9,11,12,16, - 6, 5, 5, 9, 5, 6,10,16, 8, 7, 7, 9, 6, 7, 9,16, - 11, 7, 3, 6, 4, 5, 8,16,12, 9, 4, 8, 5, 7, 9,16, -}; - -static const static_codebook _huff_book__44u1__short = { - 2, 64, - (char *)_huff_lengthlist__44u1__short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44u2__long[] = { - 5, 9,14,12,15,13,10,13, 7, 4, 5, 6, 8, 7, 8,12, - 13, 4, 3, 5, 5, 6, 9,15,12, 6, 5, 6, 6, 6, 7,14, - 14, 7, 4, 6, 4, 6, 8,15,12, 6, 6, 5, 5, 5, 6,14, - 9, 7, 8, 6, 7, 5, 4,10,10,13,14,14,15,10, 6, 8, -}; - -static const static_codebook _huff_book__44u2__long = { - 2, 64, - (char *)_huff_lengthlist__44u2__long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44u2__p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44u2__p1_0[] = { - 1, 4, 4, 5, 8, 7, 5, 7, 8, 5, 8, 8, 8,11,11, 8, - 10,11, 5, 8, 8, 8,11,10, 8,11,11, 4, 8, 8, 8,11, - 11, 8,11,11, 8,11,11,11,13,14,11,13,13, 7,11,11, - 10,13,12,11,14,14, 4, 8, 8, 8,11,11, 8,11,11, 8, - 11,11,11,14,13,10,12,13, 8,11,11,11,13,13,11,13, - 13, -}; - -static const static_codebook _44u2__p1_0 = { - 4, 81, - (char *)_vq_lengthlist__44u2__p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u2__p1_0, - 0 -}; - -static const long _vq_quantlist__44u2__p2_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44u2__p2_0[] = { - 2, 5, 5, 5, 6, 6, 5, 6, 6, 5, 6, 6, 7, 8, 8, 6, - 8, 8, 5, 6, 6, 6, 8, 7, 7, 8, 8, 5, 6, 6, 7, 8, - 8, 6, 8, 8, 6, 8, 8, 8, 9,10, 8,10,10, 6, 8, 8, - 7,10, 8, 8,10,10, 5, 6, 6, 6, 8, 8, 7, 8, 8, 6, - 8, 8, 8,10,10, 8, 8,10, 6, 8, 8, 8,10,10, 8,10, - 9, -}; - -static const static_codebook _44u2__p2_0 = { - 4, 81, - (char *)_vq_lengthlist__44u2__p2_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u2__p2_0, - 0 -}; - -static const long _vq_quantlist__44u2__p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44u2__p3_0[] = { - 2, 4, 4, 7, 8, 5, 7, 7, 9, 9, 5, 7, 7, 9, 9, 8, - 9, 9,12,11, 8, 9, 9,11,12, 5, 7, 7,10,10, 7, 9, - 9,11,11, 7, 9, 9,10,11,10,11,11,13,13, 9,10,11, - 12,13, 5, 7, 7,10,10, 7, 9, 9,11,10, 7, 9, 9,11, - 11, 9,11,10,13,13,10,11,11,13,13, 8,10,10,14,13, - 10,11,11,15,14, 9,11,11,15,14,13,14,13,16,14,12, - 13,13,15,16, 8,10,10,13,14, 9,11,11,14,15,10,11, - 11,14,15,12,13,13,15,15,12,13,14,15,16, 5, 7, 7, - 10,10, 7, 9, 9,11,11, 7, 9, 9,11,12,10,11,11,14, - 13,10,11,11,14,14, 7, 9, 9,12,12, 9,11,11,13,13, - 9,11,11,13,13,12,13,12,14,14,11,12,13,15,15, 7, - 9, 9,12,12, 8,11,10,13,12, 9,11,11,13,13,11,13, - 12,15,13,11,13,13,15,16, 9,12,11,15,15,11,12,12, - 16,15,11,12,13,16,16,13,14,15,16,15,13,15,15,17, - 17, 9,11,11,14,15,10,12,12,15,15,11,13,12,15,16, - 13,15,14,16,16,13,15,15,17,19, 5, 7, 7,10,10, 7, - 9, 9,12,11, 7, 9, 9,11,11,10,11,11,14,14,10,11, - 11,13,14, 7, 9, 9,12,12, 9,11,11,13,13, 9,10,11, - 12,13,11,13,12,16,15,11,12,12,14,15, 7, 9, 9,12, - 12, 9,11,11,13,13, 9,11,11,13,12,11,13,12,15,16, - 12,13,13,15,14, 9,11,11,15,14,11,13,12,16,15,10, - 11,12,15,15,13,14,14,18,17,13,14,14,15,17,10,11, - 11,14,15,11,13,12,15,17,11,13,12,15,16,13,15,14, - 18,17,14,15,15,16,18, 7,10,10,14,14,10,12,12,15, - 15,10,12,12,15,15,14,15,15,18,17,13,15,15,16,16, - 9,11,11,16,15,11,13,13,16,18,11,13,13,16,16,15, - 16,16, 0, 0,14,15,16,18,17, 9,11,11,15,15,10,13, - 12,17,16,11,12,13,16,17,14,15,16,19,19,14,15,15, - 0,20,12,14,14, 0, 0,13,14,16,19,18,13,15,16,20, - 17,16,18, 0, 0, 0,15,16,17,18,19,11,14,14, 0,19, - 12,15,14,17,17,13,15,15, 0, 0,16,17,15,20,19,15, - 17,16,19, 0, 8,10,10,14,15,10,12,11,15,15,10,11, - 12,16,15,13,14,14,19,17,14,15,15, 0, 0, 9,11,11, - 16,15,11,13,13,17,16,10,12,13,16,17,14,15,15,18, - 18,14,15,16,20,19, 9,12,12, 0,15,11,13,13,16,17, - 11,13,13,19,17,14,16,16,18,17,15,16,16,17,19,11, - 14,14,18,18,13,14,15, 0, 0,12,14,15,19,18,15,16, - 19, 0,19,15,16,19,19,17,12,14,14,16,19,13,15,15, - 0,17,13,15,14,18,18,15,16,15, 0,18,16,17,17, 0, - 0, -}; - -static const static_codebook _44u2__p3_0 = { - 4, 625, - (char *)_vq_lengthlist__44u2__p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u2__p3_0, - 0 -}; - -static const long _vq_quantlist__44u2__p4_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44u2__p4_0[] = { - 4, 5, 5, 8, 8, 5, 7, 6, 9, 9, 5, 6, 7, 9, 9, 9, - 9, 9,11,11, 9, 9, 9,11,11, 5, 7, 7, 9, 9, 7, 8, - 8,10,10, 7, 7, 8,10,10,10,10,10,11,12, 9,10,10, - 11,12, 5, 7, 7, 9, 9, 6, 8, 7,10,10, 7, 8, 8,10, - 10, 9,10,10,12,11, 9,10,10,12,11, 9,10,10,12,12, - 10,10,10,13,12, 9,10,10,12,13,12,12,12,14,14,11, - 12,12,13,14, 9,10,10,12,12, 9,10,10,12,13,10,10, - 10,12,13,11,12,12,14,13,12,12,12,14,13, 5, 7, 7, - 10, 9, 7, 8, 8,10,10, 7, 8, 8,10,10,10,10,10,12, - 12,10,10,10,12,12, 7, 8, 8,11,10, 8, 8, 9,11,11, - 8, 9, 9,11,11,10,11,11,12,13,10,11,11,13,13, 6, - 8, 8,10,10, 7, 9, 8,11,10, 8, 9, 9,11,11,10,11, - 10,13,11,10,11,11,13,13, 9,10,10,13,13,10,11,11, - 13,13,10,11,11,14,13,12,11,13,12,15,12,13,13,15, - 15, 9,10,10,12,13,10,11,10,13,13,10,11,11,13,13, - 12,13,11,15,13,12,13,13,15,15, 5, 7, 7, 9,10, 7, - 8, 8,10,10, 7, 8, 8,10,10,10,10,10,12,12,10,10, - 11,12,12, 6, 8, 8,10,10, 8, 9, 9,11,11, 7, 8, 9, - 10,11,10,11,11,13,13,10,10,11,11,13, 7, 8, 8,10, - 11, 8, 9, 9,11,11, 8, 9, 8,11,11,10,11,11,13,13, - 10,11,11,13,12, 9,10,10,13,12,10,11,11,14,13,10, - 10,11,13,13,12,13,13,15,15,12,11,13,12,14, 9,10, - 10,12,13,10,11,11,13,14,10,11,11,13,13,12,13,13, - 15,15,12,13,12,15,12, 8, 9, 9,12,12, 9,11,10,13, - 13, 9,10,10,13,13,12,13,13,15,15,12,12,12,14,14, - 9,10,10,13,13,10,11,11,13,14,10,11,11,14,12,13, - 13,14,14,16,12,13,13,15,14, 9,10,10,13,13,10,11, - 10,14,13,10,11,11,13,14,12,14,13,16,14,13,13,13, - 14,15,11,13,12,15,14,11,12,13,14,15,12,13,13,16, - 15,14,12,15,12,16,14,15,15,17,16,11,12,12,14,15, - 11,13,11,15,14,12,13,13,15,16,13,15,12,17,13,14, - 15,15,16,16, 8, 9, 9,12,12, 9,10,10,13,13, 9,10, - 10,13,13,12,13,12,14,14,12,13,13,15,15, 9,10,10, - 13,13,10,11,11,14,13,10,10,11,13,14,12,13,13,15, - 14,12,12,14,14,16, 9,10,10,13,13,10,11,11,13,14, - 10,11,11,14,13,13,13,13,15,15,13,14,13,16,14,11, - 12,12,14,14,12,13,13,16,15,11,12,13,14,15,14,15, - 15,16,16,14,13,15,13,17,11,12,12,14,15,12,13,13, - 15,16,11,13,12,15,15,14,15,14,16,16,14,15,12,17, - 13, -}; - -static const static_codebook _44u2__p4_0 = { - 4, 625, - (char *)_vq_lengthlist__44u2__p4_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u2__p4_0, - 0 -}; - -static const long _vq_quantlist__44u2__p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44u2__p5_0[] = { - 1, 4, 4, 7, 7, 8, 8, 9, 9, 4, 6, 5, 8, 8, 8, 8, - 10,10, 4, 5, 6, 8, 8, 8, 8,10,10, 7, 8, 8, 9, 9, - 9, 9,11,11, 7, 8, 8, 9, 9, 9, 9,11,11, 8, 8, 8, - 9, 9,10,11,12,12, 8, 8, 8, 9, 9,10,10,12,12,10, - 10,10,11,11,12,12,13,13,10,10,10,11,11,12,12,13, - 13, -}; - -static const static_codebook _44u2__p5_0 = { - 2, 81, - (char *)_vq_lengthlist__44u2__p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44u2__p5_0, - 0 -}; - -static const long _vq_quantlist__44u2__p6_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44u2__p6_0[] = { - 1, 4, 4, 6, 6, 8, 8,10,10,11,11,14,13, 4, 6, 5, - 8, 8, 9, 9,11,10,12,11,15,14, 4, 5, 6, 8, 8, 9, - 9,11,11,11,11,14,14, 6, 8, 8,10, 9,11,11,11,11, - 12,12,15,15, 6, 8, 8, 9, 9,11,11,11,12,12,12,15, - 15, 8,10,10,11,11,11,11,12,12,13,13,15,16, 8,10, - 10,11,11,11,11,12,12,13,13,16,16,10,11,11,12,12, - 12,12,13,13,13,13,17,16,10,11,11,12,12,12,12,13, - 13,13,14,16,17,11,12,12,13,13,13,13,14,14,15,14, - 18,17,11,12,12,13,13,13,13,14,14,14,15,19,18,14, - 15,15,15,15,16,16,18,19,18,18, 0, 0,14,15,15,16, - 15,17,17,16,18,17,18, 0, 0, -}; - -static const static_codebook _44u2__p6_0 = { - 2, 169, - (char *)_vq_lengthlist__44u2__p6_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44u2__p6_0, - 0 -}; - -static const long _vq_quantlist__44u2__p6_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44u2__p6_1[] = { - 2, 4, 4, 5, 5, 4, 5, 5, 6, 5, 4, 5, 5, 5, 6, 5, - 6, 5, 6, 6, 5, 5, 6, 6, 6, -}; - -static const static_codebook _44u2__p6_1 = { - 2, 25, - (char *)_vq_lengthlist__44u2__p6_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u2__p6_1, - 0 -}; - -static const long _vq_quantlist__44u2__p7_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44u2__p7_0[] = { - 1, 3, 2,12,12,12,12,12,12, 4,12,12,12,12,12,12, - 12,12, 5,12,12,12,12,12,12,12,12,12,12,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11, -}; - -static const static_codebook _44u2__p7_0 = { - 2, 81, - (char *)_vq_lengthlist__44u2__p7_0, - 1, -516612096, 1626677248, 4, 0, - (long *)_vq_quantlist__44u2__p7_0, - 0 -}; - -static const long _vq_quantlist__44u2__p7_1[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44u2__p7_1[] = { - 1, 4, 4, 7, 6, 7, 6, 8, 7, 9, 7, 9, 8, 4, 7, 6, - 8, 8, 9, 8,10, 9,10,10,11,11, 4, 7, 7, 8, 8, 8, - 8, 9,10,11,11,11,11, 6, 8, 8,10,10,10,10,11,11, - 12,12,12,12, 7, 8, 8,10,10,10,10,11,11,12,12,13, - 13, 7, 9, 9,11,10,12,12,13,13,14,13,14,14, 7, 9, - 9,10,11,11,12,13,13,13,13,16,14, 9,10,10,12,12, - 13,13,14,14,15,16,15,16, 9,10,10,12,12,12,13,14, - 14,14,15,16,15,10,12,12,13,13,15,13,16,16,15,17, - 17,17,10,11,11,12,14,14,14,15,15,17,17,15,17,11, - 12,12,14,14,14,15,15,15,17,16,17,17,10,12,12,13, - 14,14,14,17,15,17,17,17,17, -}; - -static const static_codebook _44u2__p7_1 = { - 2, 169, - (char *)_vq_lengthlist__44u2__p7_1, - 1, -523010048, 1618608128, 4, 0, - (long *)_vq_quantlist__44u2__p7_1, - 0 -}; - -static const long _vq_quantlist__44u2__p7_2[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44u2__p7_2[] = { - 2, 5, 5, 6, 6, 7, 7, 8, 7, 8, 8, 8, 8, 5, 6, 6, - 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 5, 6, 6, 7, 7, 8, - 7, 8, 8, 8, 8, 8, 8, 6, 7, 7, 7, 8, 8, 8, 8, 8, - 9, 9, 9, 9, 6, 7, 7, 8, 7, 8, 8, 9, 9, 9, 9, 9, - 9, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 7, 8, - 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, -}; - -static const static_codebook _44u2__p7_2 = { - 2, 169, - (char *)_vq_lengthlist__44u2__p7_2, - 1, -531103744, 1611661312, 4, 0, - (long *)_vq_quantlist__44u2__p7_2, - 0 -}; - -static const char _huff_lengthlist__44u2__short[] = { - 13,15,17,17,15,15,12,17,11, 9, 7,10,10, 9,12,17, - 10, 6, 3, 6, 5, 7,10,17,15,10, 6, 9, 8, 9,11,17, - 15, 8, 4, 7, 3, 5, 9,16,16,10, 5, 8, 4, 5, 8,16, - 13,11, 5, 8, 3, 3, 5,14,13,12, 7,10, 5, 5, 7,14, -}; - -static const static_codebook _huff_book__44u2__short = { - 2, 64, - (char *)_huff_lengthlist__44u2__short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44u3__long[] = { - 6, 9,13,12,14,11,10,13, 8, 4, 5, 7, 8, 7, 8,12, - 11, 4, 3, 5, 5, 7, 9,14,11, 6, 5, 6, 6, 6, 7,13, - 13, 7, 5, 6, 4, 5, 7,14,11, 7, 6, 6, 5, 5, 6,13, - 9, 7, 8, 6, 7, 5, 3, 9, 9,12,13,12,14,10, 6, 7, -}; - -static const static_codebook _huff_book__44u3__long = { - 2, 64, - (char *)_huff_lengthlist__44u3__long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44u3__p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44u3__p1_0[] = { - 1, 4, 4, 5, 8, 7, 5, 7, 8, 5, 8, 8, 8,10,11, 8, - 10,11, 5, 8, 8, 8,11,10, 8,11,11, 4, 8, 8, 8,11, - 11, 8,11,11, 8,11,11,11,13,14,11,14,14, 8,11,11, - 10,14,12,11,14,14, 4, 8, 8, 8,11,11, 8,11,11, 7, - 11,11,11,14,14,10,12,14, 8,11,11,11,14,14,11,14, - 13, -}; - -static const static_codebook _44u3__p1_0 = { - 4, 81, - (char *)_vq_lengthlist__44u3__p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u3__p1_0, - 0 -}; - -static const long _vq_quantlist__44u3__p2_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44u3__p2_0[] = { - 2, 5, 4, 5, 6, 6, 5, 6, 6, 5, 6, 6, 7, 8, 8, 6, - 8, 8, 5, 6, 6, 6, 8, 8, 7, 8, 8, 5, 7, 6, 7, 8, - 8, 6, 8, 8, 7, 8, 8, 8, 9,10, 8,10,10, 6, 8, 8, - 8,10, 8, 8,10,10, 5, 6, 6, 6, 8, 8, 7, 8, 8, 6, - 8, 8, 8,10,10, 8, 8,10, 7, 8, 8, 8,10,10, 8,10, - 9, -}; - -static const static_codebook _44u3__p2_0 = { - 4, 81, - (char *)_vq_lengthlist__44u3__p2_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u3__p2_0, - 0 -}; - -static const long _vq_quantlist__44u3__p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44u3__p3_0[] = { - 2, 4, 4, 7, 7, 5, 7, 7, 9, 9, 5, 7, 7, 9, 9, 8, - 9, 9,12,12, 8, 9, 9,11,12, 5, 7, 7,10,10, 7, 9, - 9,11,11, 7, 9, 9,10,11,10,11,11,13,13, 9,10,11, - 13,13, 5, 7, 7,10,10, 7, 9, 9,11,10, 7, 9, 9,11, - 11, 9,11,10,13,13,10,11,11,14,13, 8,10,10,14,13, - 10,11,11,15,14, 9,11,11,14,14,13,14,13,16,16,12, - 13,13,15,15, 8,10,10,13,14, 9,11,11,14,14,10,11, - 11,14,15,12,13,13,15,15,13,14,14,15,16, 5, 7, 7, - 10,10, 7, 9, 9,11,11, 7, 9, 9,11,12,10,11,11,14, - 14,10,11,11,14,14, 7, 9, 9,12,12, 9,11,11,13,13, - 9,11,11,13,13,12,12,13,15,15,11,12,13,15,16, 7, - 9, 9,11,11, 8,11,10,13,12, 9,11,11,13,13,11,13, - 12,15,13,11,13,13,15,16, 9,12,11,15,14,11,12,13, - 16,15,11,13,13,15,16,14,14,15,17,16,13,15,16, 0, - 17, 9,11,11,15,15,10,13,12,15,15,11,13,13,15,16, - 13,15,13,16,15,14,16,15, 0,19, 5, 7, 7,10,10, 7, - 9, 9,11,11, 7, 9, 9,11,11,10,12,11,14,14,10,11, - 12,14,14, 7, 9, 9,12,12, 9,11,11,14,13, 9,10,11, - 12,13,11,13,13,16,16,11,12,13,13,16, 7, 9, 9,12, - 12, 9,11,11,13,13, 9,11,11,13,13,11,13,13,15,15, - 12,13,12,15,14, 9,11,11,15,14,11,13,12,16,16,10, - 12,12,15,15,13,15,15,17,19,13,14,15,16,17,10,12, - 12,15,15,11,13,13,16,16,11,13,13,15,16,13,15,15, - 0, 0,14,15,15,16,16, 8,10,10,14,14,10,12,12,15, - 15,10,12,11,15,16,14,15,15,19,20,13,14,14,18,16, - 9,11,11,15,15,11,13,13,17,16,11,13,13,16,16,15, - 17,17,20,20,14,15,16,17,20, 9,11,11,15,15,10,13, - 12,16,15,11,13,13,15,17,14,16,15,18, 0,14,16,15, - 18,20,12,14,14, 0, 0,14,14,16, 0, 0,13,16,15, 0, - 0,17,17,18, 0, 0,16,17,19,19, 0,12,14,14,18, 0, - 12,16,14, 0,17,13,15,15,18, 0,16,18,17, 0,17,16, - 18,17, 0, 0, 7,10,10,14,14,10,12,11,15,15,10,12, - 12,16,15,13,15,15,18, 0,14,15,15,17, 0, 9,11,11, - 15,15,11,13,13,16,16,11,12,13,16,16,14,15,16,17, - 17,14,16,16,16,18, 9,11,12,16,16,11,13,13,17,17, - 11,14,13,20,17,15,16,16,19, 0,15,16,17, 0,19,11, - 13,14,17,16,14,15,15,20,18,13,14,15,17,19,16,18, - 18, 0,20,16,16,19,17, 0,12,15,14,17, 0,14,15,15, - 18,19,13,16,15,19,20,15,18,18, 0,20,17, 0,16, 0, - 0, -}; - -static const static_codebook _44u3__p3_0 = { - 4, 625, - (char *)_vq_lengthlist__44u3__p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u3__p3_0, - 0 -}; - -static const long _vq_quantlist__44u3__p4_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44u3__p4_0[] = { - 4, 5, 5, 8, 8, 5, 7, 6, 9, 9, 5, 6, 7, 9, 9, 9, - 9, 9,11,11, 9, 9, 9,11,11, 5, 7, 7, 9, 9, 7, 8, - 8,10,10, 7, 7, 8,10,10, 9,10,10,11,12, 9,10,10, - 11,12, 5, 7, 7, 9, 9, 7, 8, 7,10,10, 7, 8, 8,10, - 10, 9,10, 9,12,11, 9,10,10,12,11, 9,10, 9,12,12, - 9,10,10,13,12, 9,10,10,12,13,12,12,12,14,14,11, - 12,12,13,14, 9, 9,10,12,12, 9,10,10,12,12, 9,10, - 10,12,13,11,12,11,14,13,12,12,12,14,13, 5, 7, 7, - 9, 9, 7, 8, 8,10,10, 7, 8, 8,10,10,10,10,10,12, - 12, 9,10,10,12,12, 7, 8, 8,11,10, 8, 8, 9,11,11, - 8, 9, 9,11,11,11,11,11,12,13,10,11,11,13,13, 6, - 8, 8,10,10, 7, 9, 8,11,10, 8, 9, 9,11,11,10,11, - 10,13,11,10,11,11,13,13, 9,11,10,13,12,10,11,11, - 13,13,10,11,11,13,13,12,12,13,12,15,12,13,13,15, - 15, 9,10,10,12,13,10,11,10,13,12,10,11,11,13,14, - 12,13,11,15,13,12,13,13,15,15, 5, 7, 7, 9, 9, 7, - 8, 8,10,10, 7, 8, 8,10,10, 9,10,10,12,12,10,10, - 11,12,12, 6, 8, 8,10,10, 8, 9, 9,11,11, 7, 8, 9, - 10,11,10,11,11,13,13,10,10,11,11,13, 7, 8, 8,10, - 10, 8, 9, 9,11,11, 8, 9, 9,11,11,10,11,11,13,13, - 11,11,11,13,12, 9,10,10,13,12,10,11,11,14,13,10, - 10,11,12,13,12,13,13,15,15,12,11,13,13,14, 9,10, - 11,12,13,10,11,11,13,13,10,11,11,13,13,12,13,13, - 15,15,12,13,12,15,12, 8, 9, 9,12,12, 9,11,10,13, - 13, 9,10,10,13,13,12,13,13,15,14,12,12,12,14,13, - 9,10,10,13,12,10,11,11,13,13,10,11,11,14,12,13, - 13,14,14,16,12,13,13,15,15, 9,10,10,13,13,10,11, - 10,14,13,10,11,11,13,14,12,14,13,15,14,13,13,13, - 15,15,11,13,12,15,14,11,12,13,14,15,12,13,13,16, - 14,14,12,15,12,16,14,15,15,17,15,11,12,12,14,14, - 11,13,11,15,14,12,13,13,15,15,13,15,12,17,13,14, - 15,15,16,16, 8, 9, 9,12,12, 9,10,10,12,13, 9,10, - 10,13,13,12,12,12,14,14,12,13,13,15,15, 9,10,10, - 13,12,10,11,11,14,13,10,10,11,13,14,12,13,13,15, - 15,12,12,13,14,16, 9,10,10,13,13,10,11,11,13,14, - 10,11,11,14,13,12,13,13,14,15,13,14,13,16,14,11, - 12,12,14,14,12,13,13,15,14,11,12,13,14,15,14,15, - 15,16,16,13,13,15,13,16,11,12,12,14,15,12,13,13, - 14,15,11,13,12,15,14,14,15,15,16,16,14,15,12,16, - 13, -}; - -static const static_codebook _44u3__p4_0 = { - 4, 625, - (char *)_vq_lengthlist__44u3__p4_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u3__p4_0, - 0 -}; - -static const long _vq_quantlist__44u3__p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44u3__p5_0[] = { - 2, 3, 3, 6, 6, 7, 7, 9, 9, 4, 5, 5, 7, 7, 8, 8, - 10,10, 4, 5, 5, 7, 7, 8, 8,10,10, 6, 7, 7, 8, 8, - 9, 9,11,10, 6, 7, 7, 8, 8, 9, 9,10,10, 7, 8, 8, - 9, 9,10,10,11,11, 7, 8, 8, 9, 9,10,10,11,11, 9, - 10,10,11,10,11,11,12,12, 9,10,10,10,10,11,11,12, - 12, -}; - -static const static_codebook _44u3__p5_0 = { - 2, 81, - (char *)_vq_lengthlist__44u3__p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44u3__p5_0, - 0 -}; - -static const long _vq_quantlist__44u3__p6_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44u3__p6_0[] = { - 1, 4, 4, 6, 6, 8, 8, 9, 9,10,11,13,14, 4, 6, 5, - 8, 8, 9, 9,10,10,11,11,14,14, 4, 6, 6, 8, 8, 9, - 9,10,10,11,11,14,14, 6, 8, 8, 9, 9,10,10,11,11, - 12,12,15,15, 6, 8, 8, 9, 9,10,11,11,11,12,12,15, - 15, 8, 9, 9,11,10,11,11,12,12,13,13,15,16, 8, 9, - 9,10,11,11,11,12,12,13,13,16,16,10,10,11,11,11, - 12,12,13,13,13,14,17,16, 9,10,11,12,11,12,12,13, - 13,13,13,16,18,11,12,11,12,12,13,13,13,14,15,14, - 17,17,11,11,12,12,12,13,13,13,14,14,15,18,17,14, - 15,15,15,15,16,16,17,17,19,18, 0,20,14,15,14,15, - 15,16,16,16,17,18,16,20,18, -}; - -static const static_codebook _44u3__p6_0 = { - 2, 169, - (char *)_vq_lengthlist__44u3__p6_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44u3__p6_0, - 0 -}; - -static const long _vq_quantlist__44u3__p6_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44u3__p6_1[] = { - 2, 4, 4, 5, 5, 4, 5, 5, 6, 5, 4, 5, 5, 5, 6, 5, - 6, 5, 6, 6, 5, 5, 6, 6, 6, -}; - -static const static_codebook _44u3__p6_1 = { - 2, 25, - (char *)_vq_lengthlist__44u3__p6_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u3__p6_1, - 0 -}; - -static const long _vq_quantlist__44u3__p7_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44u3__p7_0[] = { - 1, 3, 3,10,10,10,10,10,10, 4,10,10,10,10,10,10, - 10,10, 4,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, -}; - -static const static_codebook _44u3__p7_0 = { - 2, 81, - (char *)_vq_lengthlist__44u3__p7_0, - 1, -515907584, 1627381760, 4, 0, - (long *)_vq_quantlist__44u3__p7_0, - 0 -}; - -static const long _vq_quantlist__44u3__p7_1[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const char _vq_lengthlist__44u3__p7_1[] = { - 1, 4, 4, 6, 6, 7, 6, 8, 7, 9, 8,10, 9,11,11, 4, - 7, 7, 8, 7, 9, 9,10,10,11,11,11,11,12,12, 4, 7, - 7, 7, 7, 9, 9,10,10,11,11,12,12,12,11, 6, 8, 8, - 9, 9,10,10,11,11,12,12,13,12,13,13, 6, 8, 8, 9, - 9,10,11,11,11,12,12,13,14,13,13, 8, 9, 9,11,11, - 12,12,12,13,14,13,14,14,14,15, 8, 9, 9,11,11,11, - 12,13,14,13,14,15,17,14,15, 9,10,10,12,12,13,13, - 13,14,15,15,15,16,16,16, 9,11,11,12,12,13,13,14, - 14,14,15,16,16,16,16,10,12,12,13,13,14,14,15,15, - 15,16,17,17,17,17,10,12,11,13,13,15,14,15,14,16, - 17,16,16,16,16,11,13,12,14,14,14,14,15,16,17,16, - 17,17,17,17,11,13,12,14,14,14,15,17,16,17,17,17, - 17,17,17,12,13,13,15,16,15,16,17,17,16,16,17,17, - 17,17,12,13,13,15,15,15,16,17,17,17,16,17,16,17, - 17, -}; - -static const static_codebook _44u3__p7_1 = { - 2, 225, - (char *)_vq_lengthlist__44u3__p7_1, - 1, -522338304, 1620115456, 4, 0, - (long *)_vq_quantlist__44u3__p7_1, - 0 -}; - -static const long _vq_quantlist__44u3__p7_2[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__44u3__p7_2[] = { - 2, 5, 5, 7, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 5, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, - 10,10, 5, 6, 6, 7, 7, 8, 8, 8, 8, 9, 8, 9, 9, 9, - 9,10, 9, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, - 10,10,10,10, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9,10, - 9,10,10,10,10, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, - 10,10,10,10,10,10, 7, 8, 8, 9, 8, 9, 9, 9, 9,10, - 9,10,10,10,10,10,10, 8, 8, 8, 9, 9, 9, 9, 9, 9, - 9,10,10,10,10,10,10,10, 8, 9, 8, 9, 9, 9, 9,10, - 9,10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9, 9,10, - 9,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9,10, - 9,10,10,10,10,10,10,10,10,10,10, 9, 9, 9,10, 9, - 10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, - 10,10,10,10,10,10,10,10,10,10,10,10,10,11, 9,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,11, 9, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 9,10,10,10,10,10,10,10,10,10,10,10,11,11,11,10, - 11, -}; - -static const static_codebook _44u3__p7_2 = { - 2, 289, - (char *)_vq_lengthlist__44u3__p7_2, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44u3__p7_2, - 0 -}; - -static const char _huff_lengthlist__44u3__short[] = { - 14,14,14,15,13,15,12,16,10, 8, 7, 9, 9, 8,12,16, - 10, 5, 4, 6, 5, 6, 9,16,14, 8, 6, 8, 7, 8,10,16, - 14, 7, 4, 6, 3, 5, 8,16,15, 9, 5, 7, 4, 4, 7,16, - 13,10, 6, 7, 4, 3, 4,13,13,12, 7, 9, 5, 5, 6,12, -}; - -static const static_codebook _huff_book__44u3__short = { - 2, 64, - (char *)_huff_lengthlist__44u3__short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44u4__long[] = { - 3, 8,12,12,13,12,11,13, 5, 4, 6, 7, 8, 8, 9,13, - 9, 5, 4, 5, 5, 7, 9,13, 9, 6, 5, 6, 6, 7, 8,12, - 12, 7, 5, 6, 4, 5, 8,13,11, 7, 6, 6, 5, 5, 6,12, - 10, 8, 8, 7, 7, 5, 3, 8,10,12,13,12,12, 9, 6, 7, -}; - -static const static_codebook _huff_book__44u4__long = { - 2, 64, - (char *)_huff_lengthlist__44u4__long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44u4__p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44u4__p1_0[] = { - 1, 4, 4, 5, 8, 7, 5, 7, 8, 5, 8, 8, 8,10,11, 8, - 10,11, 5, 8, 8, 8,11,10, 8,11,11, 4, 8, 8, 8,11, - 11, 8,11,11, 8,11,11,11,13,14,11,15,14, 8,11,11, - 10,13,12,11,14,14, 4, 8, 8, 8,11,11, 8,11,11, 7, - 11,11,11,15,14,10,12,14, 8,11,11,11,14,14,11,14, - 13, -}; - -static const static_codebook _44u4__p1_0 = { - 4, 81, - (char *)_vq_lengthlist__44u4__p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u4__p1_0, - 0 -}; - -static const long _vq_quantlist__44u4__p2_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44u4__p2_0[] = { - 2, 5, 5, 5, 6, 6, 5, 6, 6, 5, 6, 6, 7, 8, 8, 6, - 8, 8, 5, 6, 6, 6, 8, 8, 7, 8, 8, 5, 7, 6, 6, 8, - 8, 6, 8, 8, 6, 8, 8, 8, 9,10, 8,10,10, 6, 8, 8, - 8,10, 8, 8,10,10, 5, 6, 6, 6, 8, 8, 6, 8, 8, 6, - 8, 8, 8,10,10, 8, 8,10, 6, 8, 8, 8,10,10, 8,10, - 9, -}; - -static const static_codebook _44u4__p2_0 = { - 4, 81, - (char *)_vq_lengthlist__44u4__p2_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u4__p2_0, - 0 -}; - -static const long _vq_quantlist__44u4__p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44u4__p3_0[] = { - 2, 4, 4, 8, 8, 5, 7, 7, 9, 9, 5, 7, 7, 9, 9, 8, - 10, 9,12,12, 8, 9,10,12,12, 5, 7, 7,10,10, 7, 9, - 9,11,11, 7, 9, 9,11,11,10,12,11,14,14, 9,10,11, - 13,14, 5, 7, 7,10,10, 7, 9, 9,11,11, 7, 9, 9,11, - 11, 9,11,10,14,13,10,11,11,14,14, 8,10,10,14,13, - 10,12,12,15,14, 9,11,11,15,14,13,14,14,17,17,12, - 14,14,16,16, 8,10,10,14,14, 9,11,11,14,15,10,12, - 12,14,15,12,14,13,16,16,13,14,15,15,18, 4, 7, 7, - 10,10, 7, 9, 9,12,11, 7, 9, 9,11,12,10,12,11,15, - 14,10,11,12,14,15, 7, 9, 9,12,12, 9,11,12,13,13, - 9,11,12,13,13,12,13,13,15,16,11,13,13,15,16, 7, - 9, 9,12,12, 9,11,10,13,12, 9,11,12,13,14,11,13, - 12,16,14,12,13,13,15,16,10,12,12,16,15,11,13,13, - 17,16,11,13,13,17,16,14,15,15,17,17,14,16,16,18, - 20, 9,11,11,15,16,11,13,12,16,16,11,13,13,16,17, - 14,15,14,18,16,14,16,16,17,20, 5, 7, 7,10,10, 7, - 9, 9,12,11, 7, 9,10,11,12,10,12,11,15,15,10,12, - 12,14,14, 7, 9, 9,12,12, 9,12,11,14,13, 9,10,11, - 12,13,12,13,14,16,16,11,12,13,14,16, 7, 9, 9,12, - 12, 9,12,11,13,13, 9,12,11,13,13,11,13,13,16,16, - 12,13,13,16,15, 9,11,11,16,14,11,13,13,16,16,11, - 12,13,16,16,14,16,16,17,17,13,14,15,16,17,10,12, - 12,15,15,11,13,13,16,17,11,13,13,16,16,14,16,15, - 19,19,14,15,15,17,18, 8,10,10,14,14,10,12,12,15, - 15,10,12,12,16,16,14,16,15,20,19,13,15,15,17,16, - 9,12,12,16,16,11,13,13,16,18,11,14,13,16,17,16, - 17,16,20, 0,15,16,18,18,20, 9,11,11,15,15,11,14, - 12,17,16,11,13,13,17,17,15,17,15,20,20,14,16,16, - 17, 0,13,15,14,18,16,14,15,16, 0,18,14,16,16, 0, - 0,18,16, 0, 0,20,16,18,18, 0, 0,12,14,14,17,18, - 13,15,14,20,18,14,16,15,19,19,16,20,16, 0,18,16, - 19,17,19, 0, 8,10,10,14,14,10,12,12,16,15,10,12, - 12,16,16,13,15,15,18,17,14,16,16,19, 0, 9,11,11, - 16,15,11,14,13,18,17,11,12,13,17,18,14,17,16,18, - 18,15,16,17,18,18, 9,12,12,16,16,11,13,13,16,18, - 11,14,13,17,17,15,16,16,18,20,16,17,17,20,20,12, - 14,14,18,17,14,16,16, 0,19,13,14,15,18, 0,16, 0, - 0, 0, 0,16,16, 0,19,20,13,15,14, 0, 0,14,16,16, - 18,19,14,16,15, 0,20,16,20,18, 0,20,17,20,17, 0, - 0, -}; - -static const static_codebook _44u4__p3_0 = { - 4, 625, - (char *)_vq_lengthlist__44u4__p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u4__p3_0, - 0 -}; - -static const long _vq_quantlist__44u4__p4_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44u4__p4_0[] = { - 4, 5, 5, 8, 8, 5, 7, 6, 9, 9, 5, 6, 7, 9, 9, 9, - 9, 9,11,11, 8, 9, 9,11,11, 5, 7, 7, 9, 9, 7, 8, - 8,10,10, 7, 7, 8,10,10, 9,10,10,11,12, 9,10,10, - 11,12, 5, 7, 7, 9, 9, 7, 8, 7,10,10, 7, 8, 8,10, - 10, 9,10,10,12,11, 9,10,10,12,11, 9,10, 9,12,12, - 9,10,10,13,12, 9,10,10,12,12,12,12,12,14,14,11, - 12,12,13,14, 9, 9,10,12,12, 9,10,10,13,13, 9,10, - 10,12,13,11,12,12,14,13,11,12,12,14,14, 5, 7, 7, - 9, 9, 7, 8, 8,10,10, 7, 8, 8,10,10,10,10,10,12, - 12, 9,10,10,12,12, 7, 8, 8,11,10, 8, 8, 9,11,11, - 8, 9, 9,11,11,11,11,11,12,13,10,11,11,13,13, 6, - 8, 8,10,10, 7, 9, 8,11,10, 8, 9, 9,11,11,10,11, - 10,13,11,10,11,11,13,13, 9,11,10,13,12,10,11,11, - 13,14,10,11,11,14,13,12,12,13,12,15,12,13,13,15, - 15, 9,10,10,12,13,10,11,10,13,12,10,11,11,13,14, - 12,13,11,15,13,13,13,13,15,15, 5, 7, 7, 9, 9, 7, - 8, 8,10,10, 7, 8, 8,10,10, 9,10,10,12,12,10,10, - 11,12,13, 6, 8, 8,10,10, 8, 9, 9,11,11, 7, 8, 9, - 10,11,10,11,11,13,13,10,10,11,11,13, 7, 8, 8,10, - 11, 8, 9, 9,11,11, 8, 9, 8,11,11,10,11,11,13,13, - 11,12,11,13,12, 9,10,10,13,12,10,11,11,14,13,10, - 10,11,12,13,12,13,13,15,15,12,11,13,13,14, 9,10, - 11,12,13,10,11,11,13,14,10,11,11,13,13,12,13,13, - 15,15,12,13,12,15,12, 8, 9, 9,12,12, 9,11,10,13, - 13, 9,10,10,13,13,12,13,13,15,15,12,12,12,14,14, - 9,10,10,13,13,10,11,11,13,14,10,11,11,14,13,13, - 13,14,14,16,13,13,13,15,15, 9,10,10,13,13,10,11, - 10,14,13,10,11,11,13,14,12,14,13,16,14,12,13,13, - 14,15,11,12,12,15,14,11,12,13,14,15,12,13,13,16, - 15,14,12,15,12,16,14,15,15,16,16,11,12,12,14,14, - 11,13,12,15,14,12,13,13,15,16,13,15,13,17,13,14, - 15,15,16,17, 8, 9, 9,12,12, 9,10,10,12,13, 9,10, - 10,13,13,12,12,12,14,14,12,13,13,15,15, 9,10,10, - 13,12,10,11,11,14,13,10,10,11,13,14,13,13,13,15, - 15,12,13,14,14,16, 9,10,10,13,13,10,11,11,13,14, - 10,11,11,14,14,13,13,13,15,15,13,14,13,16,14,11, - 12,12,15,14,12,13,13,16,15,11,12,13,14,15,14,15, - 15,17,16,13,13,15,13,16,11,12,13,14,15,13,13,13, - 15,16,11,13,12,15,14,14,15,15,16,16,14,15,12,17, - 13, -}; - -static const static_codebook _44u4__p4_0 = { - 4, 625, - (char *)_vq_lengthlist__44u4__p4_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u4__p4_0, - 0 -}; - -static const long _vq_quantlist__44u4__p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44u4__p5_0[] = { - 2, 3, 3, 6, 6, 7, 7, 9, 9, 4, 5, 5, 7, 7, 8, 8, - 10, 9, 4, 5, 5, 7, 7, 8, 8,10,10, 6, 7, 7, 8, 8, - 9, 9,11,10, 6, 7, 7, 8, 8, 9, 9,10,11, 7, 8, 8, - 9, 9,10,10,11,11, 7, 8, 8, 9, 9,10,10,11,11, 9, - 10,10,11,10,11,11,12,12, 9,10,10,10,11,11,11,12, - 12, -}; - -static const static_codebook _44u4__p5_0 = { - 2, 81, - (char *)_vq_lengthlist__44u4__p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44u4__p5_0, - 0 -}; - -static const long _vq_quantlist__44u4__p6_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44u4__p6_0[] = { - 1, 4, 4, 6, 6, 8, 8, 9, 9,11,10,13,13, 4, 6, 5, - 8, 8, 9, 9,10,10,11,11,14,14, 4, 6, 6, 8, 8, 9, - 9,10,10,11,11,14,14, 6, 8, 8, 9, 9,10,10,11,11, - 12,12,15,15, 6, 8, 8, 9, 9,10,11,11,11,12,12,15, - 15, 8, 9, 9,11,10,11,11,12,12,13,13,16,16, 8, 9, - 9,10,10,11,11,12,12,13,13,16,16,10,10,10,12,11, - 12,12,13,13,14,14,16,16,10,10,10,11,12,12,12,13, - 13,13,14,16,17,11,12,11,12,12,13,13,14,14,15,14, - 18,17,11,11,12,12,12,13,13,14,14,14,15,19,18,14, - 15,14,15,15,17,16,17,17,17,17,21, 0,14,15,15,16, - 16,16,16,17,17,18,17,20,21, -}; - -static const static_codebook _44u4__p6_0 = { - 2, 169, - (char *)_vq_lengthlist__44u4__p6_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44u4__p6_0, - 0 -}; - -static const long _vq_quantlist__44u4__p6_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44u4__p6_1[] = { - 2, 4, 4, 5, 5, 4, 5, 5, 6, 5, 4, 5, 5, 5, 6, 5, - 6, 5, 6, 6, 5, 5, 6, 6, 6, -}; - -static const static_codebook _44u4__p6_1 = { - 2, 25, - (char *)_vq_lengthlist__44u4__p6_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u4__p6_1, - 0 -}; - -static const long _vq_quantlist__44u4__p7_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44u4__p7_0[] = { - 1, 3, 3,12,12,12,12,12,12,12,12,12,12, 3,12,11, - 12,12,12,12,12,12,12,12,12,12, 4,11,10,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11, -}; - -static const static_codebook _44u4__p7_0 = { - 2, 169, - (char *)_vq_lengthlist__44u4__p7_0, - 1, -514332672, 1627381760, 4, 0, - (long *)_vq_quantlist__44u4__p7_0, - 0 -}; - -static const long _vq_quantlist__44u4__p7_1[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const char _vq_lengthlist__44u4__p7_1[] = { - 1, 4, 4, 6, 6, 7, 7, 9, 8,10, 8,10, 9,11,11, 4, - 7, 6, 8, 7, 9, 9,10,10,11,10,11,10,12,10, 4, 6, - 7, 8, 8, 9, 9,10,10,11,11,11,11,12,12, 6, 8, 8, - 10, 9,11,10,12,11,12,12,12,12,13,13, 6, 8, 8,10, - 10,10,11,11,11,12,12,13,12,13,13, 8, 9, 9,11,11, - 12,11,12,12,13,13,13,13,13,13, 8, 9, 9,11,11,11, - 12,12,12,13,13,13,13,13,13, 9,10,10,12,11,13,13, - 13,13,14,13,13,14,14,14, 9,10,11,11,12,12,13,13, - 13,13,13,14,15,14,14,10,11,11,12,12,13,13,14,14, - 14,14,14,15,16,16,10,11,11,12,13,13,13,13,15,14, - 14,15,16,15,16,10,12,12,13,13,14,14,14,15,15,15, - 15,15,15,16,11,12,12,13,13,14,14,14,15,15,15,16, - 15,17,16,11,12,12,13,13,13,15,15,14,16,16,16,16, - 16,17,11,12,12,13,13,14,14,15,14,15,15,17,17,16, - 16, -}; - -static const static_codebook _44u4__p7_1 = { - 2, 225, - (char *)_vq_lengthlist__44u4__p7_1, - 1, -522338304, 1620115456, 4, 0, - (long *)_vq_quantlist__44u4__p7_1, - 0 -}; - -static const long _vq_quantlist__44u4__p7_2[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__44u4__p7_2[] = { - 2, 5, 5, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 5, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, - 9, 9, 5, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, - 10,10,10,10, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9,10, - 9,10, 9,10,10, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, - 10,10,10,10,10,10, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, - 9,10,10,10,10,10,10, 8, 9, 8, 9, 9, 9, 9, 9, 9, - 10,10,10,10,10,10,10,10, 8, 8, 8, 9, 9, 9, 9, 9, - 10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9,10,10, - 10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9,10, - 10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9,10, - 10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, - 10,10,10,10,10,10,10,10,10,11,10,10,10, 9, 9, 9, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, - 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10, 9, - 10, 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 9,10, 9,10,10,10,10,10,10,10,10,10,10,11,10,10, - 10, -}; - -static const static_codebook _44u4__p7_2 = { - 2, 289, - (char *)_vq_lengthlist__44u4__p7_2, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44u4__p7_2, - 0 -}; - -static const char _huff_lengthlist__44u4__short[] = { - 14,17,15,17,16,14,13,16,10, 7, 7,10,13,10,15,16, - 9, 4, 4, 6, 5, 7, 9,16,12, 8, 7, 8, 8, 8,11,16, - 14, 7, 4, 6, 3, 5, 8,15,13, 8, 5, 7, 4, 5, 7,16, - 12, 9, 6, 8, 3, 3, 5,16,14,13, 7,10, 5, 5, 7,15, -}; - -static const static_codebook _huff_book__44u4__short = { - 2, 64, - (char *)_huff_lengthlist__44u4__short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44u5__long[] = { - 3, 8,13,12,14,12,16,11,13,14, 5, 4, 5, 6, 7, 8, - 10, 9,12,15,10, 5, 5, 5, 6, 8, 9, 9,13,15,10, 5, - 5, 6, 6, 7, 8, 8,11,13,12, 7, 5, 6, 4, 6, 7, 7, - 11,14,11, 7, 7, 6, 6, 6, 7, 6,10,14,14, 9, 8, 8, - 6, 7, 7, 7,11,16,11, 8, 8, 7, 6, 6, 7, 4, 7,12, - 10,10,12,10,10, 9,10, 5, 6, 9,10,12,15,13,14,14, - 14, 8, 7, 8, -}; - -static const static_codebook _huff_book__44u5__long = { - 2, 100, - (char *)_huff_lengthlist__44u5__long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44u5__p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44u5__p1_0[] = { - 1, 4, 4, 5, 8, 7, 5, 7, 7, 5, 8, 8, 8,10,10, 7, - 9,10, 5, 8, 8, 7,10, 9, 8,10,10, 5, 8, 8, 8,10, - 10, 8,10,10, 8,10,10,10,12,13,10,13,13, 7,10,10, - 10,13,11,10,13,13, 4, 8, 8, 8,11,10, 8,10,10, 7, - 10,10,10,13,13,10,11,13, 8,10,11,10,13,13,10,13, - 12, -}; - -static const static_codebook _44u5__p1_0 = { - 4, 81, - (char *)_vq_lengthlist__44u5__p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u5__p1_0, - 0 -}; - -static const long _vq_quantlist__44u5__p2_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44u5__p2_0[] = { - 3, 4, 4, 5, 6, 6, 5, 6, 6, 5, 6, 6, 6, 8, 8, 6, - 7, 8, 5, 6, 6, 6, 8, 7, 6, 8, 8, 5, 6, 6, 6, 8, - 8, 6, 8, 8, 6, 8, 8, 8, 9, 9, 8, 9, 9, 6, 8, 7, - 7, 9, 8, 8, 9, 9, 5, 6, 6, 6, 8, 7, 6, 8, 8, 6, - 8, 7, 8, 9, 9, 7, 8, 9, 6, 8, 8, 8, 9, 9, 8, 9, - 9, -}; - -static const static_codebook _44u5__p2_0 = { - 4, 81, - (char *)_vq_lengthlist__44u5__p2_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u5__p2_0, - 0 -}; - -static const long _vq_quantlist__44u5__p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44u5__p3_0[] = { - 2, 4, 5, 8, 8, 5, 7, 6, 9, 9, 5, 6, 7, 9, 9, 8, - 10, 9,13,12, 8, 9,10,12,12, 5, 7, 7,10,10, 7, 9, - 9,11,11, 6, 8, 9,11,11,10,11,11,14,14, 9,10,11, - 13,14, 5, 7, 7, 9,10, 7, 9, 8,11,11, 7, 9, 9,11, - 11, 9,11,10,14,13,10,11,11,14,14, 8,10,10,13,13, - 10,11,11,15,14, 9,11,11,14,14,13,14,14,17,16,12, - 13,13,15,16, 8,10,10,13,13, 9,11,11,14,15,10,11, - 11,14,15,12,14,13,16,16,13,15,14,15,17, 5, 7, 7, - 10,10, 7, 9, 9,11,11, 7, 9, 9,11,11,10,11,11,14, - 14,10,11,12,14,14, 7, 9, 9,12,11, 9,11,11,13,13, - 9,11,11,13,13,12,13,13,15,16,11,12,13,15,16, 6, - 9, 9,11,11, 8,11,10,13,12, 9,11,11,13,14,11,13, - 12,16,14,11,13,13,16,17,10,12,11,15,15,11,13,13, - 16,16,11,13,13,17,16,14,15,15,17,17,14,16,16,17, - 18, 9,11,11,14,15,10,12,12,15,15,11,13,13,16,17, - 13,15,13,17,15,14,15,16,18, 0, 5, 7, 7,10,10, 7, - 9, 9,11,11, 7, 9, 9,11,11,10,11,11,14,14,10,11, - 12,14,15, 6, 9, 9,12,11, 9,11,11,13,13, 8,10,11, - 12,13,11,13,13,16,15,11,12,13,14,15, 7, 9, 9,11, - 12, 9,11,11,13,13, 9,11,11,13,13,11,13,13,15,16, - 11,13,13,15,14, 9,11,11,15,14,11,13,13,17,15,10, - 12,12,15,15,14,16,16,17,17,13,13,15,15,17,10,11, - 12,15,15,11,13,13,16,16,11,13,13,15,15,14,15,15, - 18,18,14,15,15,17,17, 8,10,10,13,13,10,12,11,15, - 15,10,11,12,15,15,14,15,15,18,18,13,14,14,18,18, - 9,11,11,15,16,11,13,13,17,17,11,13,13,16,16,15, - 15,16,17, 0,14,15,17, 0, 0, 9,11,11,15,15,10,13, - 12,18,16,11,13,13,15,16,14,16,15,20,20,14,15,16, - 17, 0,13,14,14,20,16,14,15,16,19,18,14,15,15,19, - 0,18,16, 0,20,20,16,18,18, 0, 0,12,14,14,18,18, - 13,15,14,18,16,14,15,16,18,20,16,19,16, 0,17,17, - 18,18,19, 0, 8,10,10,14,14,10,11,11,14,15,10,11, - 12,15,15,13,15,14,19,17,13,15,15,17, 0, 9,11,11, - 16,15,11,13,13,16,16,10,12,13,15,17,14,16,16,18, - 18,14,15,15,18, 0, 9,11,11,15,15,11,13,13,16,17, - 11,13,13,18,17,14,18,16,18,18,15,17,17,18, 0,12, - 14,14,18,18,14,15,15,20, 0,13,14,15,17, 0,16,18, - 17, 0, 0,16,16, 0,17,20,12,14,14,18,18,14,16,15, - 0,18,14,16,15,18, 0,16,19,17, 0, 0,17,18,16, 0, - 0, -}; - -static const static_codebook _44u5__p3_0 = { - 4, 625, - (char *)_vq_lengthlist__44u5__p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u5__p3_0, - 0 -}; - -static const long _vq_quantlist__44u5__p4_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44u5__p4_0[] = { - 4, 5, 5, 8, 8, 6, 7, 6, 9, 9, 6, 6, 7, 9, 9, 8, - 9, 9,11,11, 8, 9, 9,11,11, 6, 7, 7, 9, 9, 7, 8, - 8,10,10, 6, 7, 8, 9,10, 9,10,10,11,12, 9, 9,10, - 11,12, 6, 7, 7, 9, 9, 6, 8, 7,10, 9, 7, 8, 8,10, - 10, 9,10, 9,12,11, 9,10,10,12,11, 8, 9, 9,12,11, - 9,10,10,12,12, 9,10,10,12,12,11,12,12,13,14,11, - 11,12,13,14, 8, 9, 9,11,12, 9,10,10,12,12, 9,10, - 10,12,12,11,12,11,14,13,11,12,12,13,13, 5, 7, 7, - 9, 9, 7, 8, 8,10,10, 7, 8, 8,10,10, 9,10,10,12, - 12, 9,10,10,12,12, 7, 8, 8,10,10, 8, 8, 9,10,11, - 8, 9, 9,11,11,10,10,11,11,13,10,11,11,12,13, 6, - 7, 8,10,10, 7, 9, 8,11,10, 8, 9, 9,11,11,10,11, - 10,13,11,10,11,11,12,12, 9,10,10,12,12,10,10,11, - 12,13,10,11,11,13,13,12,11,13,12,15,12,13,13,14, - 15, 9,10,10,12,12, 9,11,10,13,12,10,11,11,13,13, - 11,13,11,14,12,12,13,13,14,15, 5, 7, 7, 9, 9, 7, - 8, 8,10,10, 7, 8, 8,10,10, 9,10,10,12,12, 9,10, - 10,12,12, 6, 8, 7,10,10, 8, 9, 9,11,11, 7, 8, 9, - 10,11,10,11,11,12,12,10,10,11,11,13, 7, 8, 8,10, - 10, 8, 9, 9,11,11, 8, 9, 8,11,10,10,11,11,13,12, - 10,11,10,13,11, 9,10,10,12,12,10,11,11,13,12, 9, - 10,10,12,13,12,13,13,14,15,11,11,13,12,14, 9,10, - 10,12,12,10,11,11,13,13,10,11,10,13,12,12,13,13, - 14,14,12,13,11,14,12, 8, 9, 9,12,12, 9,10,10,12, - 12, 9,10,10,12,12,12,12,12,14,14,11,12,12,14,13, - 9,10,10,12,12,10,11,11,13,13,10,11,11,13,12,12, - 12,13,14,15,12,13,13,15,14, 9,10,10,12,12,10,11, - 10,13,12,10,11,11,12,13,12,13,12,15,13,12,13,13, - 14,15,11,12,12,14,13,11,12,12,14,15,12,13,13,15, - 14,13,12,14,12,16,13,14,14,15,15,11,11,12,14,14, - 11,12,11,14,13,12,13,13,14,15,13,14,12,16,12,14, - 14,15,16,16, 8, 9, 9,11,12, 9,10,10,12,12, 9,10, - 10,12,13,11,12,12,13,13,12,12,13,14,14, 9,10,10, - 12,12,10,11,10,13,12,10,10,11,12,13,12,13,13,15, - 14,12,12,13,13,15, 9,10,10,12,13,10,11,11,12,13, - 10,11,11,13,13,12,13,13,14,15,12,13,12,15,14,11, - 12,11,14,13,12,13,13,15,14,11,11,12,13,14,14,15, - 14,16,15,13,12,14,13,16,11,12,12,13,14,12,13,13, - 14,15,11,12,11,14,14,14,14,14,15,16,13,15,12,16, - 12, -}; - -static const static_codebook _44u5__p4_0 = { - 4, 625, - (char *)_vq_lengthlist__44u5__p4_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u5__p4_0, - 0 -}; - -static const long _vq_quantlist__44u5__p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44u5__p5_0[] = { - 2, 3, 3, 6, 6, 8, 8,10,10, 4, 5, 5, 8, 7, 8, 8, - 11,10, 3, 5, 5, 7, 8, 8, 8,10,11, 6, 8, 7,10, 9, - 10,10,11,11, 6, 7, 8, 9, 9, 9,10,11,12, 8, 8, 8, - 10,10,11,11,13,12, 8, 8, 9, 9,10,11,11,12,13,10, - 11,10,12,11,13,12,14,14,10,10,11,11,12,12,13,14, - 14, -}; - -static const static_codebook _44u5__p5_0 = { - 2, 81, - (char *)_vq_lengthlist__44u5__p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44u5__p5_0, - 0 -}; - -static const long _vq_quantlist__44u5__p6_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44u5__p6_0[] = { - 3, 4, 4, 5, 5, 7, 7, 9, 9, 4, 5, 4, 6, 6, 7, 7, - 9, 9, 4, 4, 5, 6, 6, 7, 7, 9, 9, 5, 6, 6, 7, 7, - 8, 8,10,10, 6, 6, 6, 7, 7, 8, 8,10,10, 7, 7, 7, - 8, 8, 9, 9,11,10, 7, 7, 7, 8, 8, 9, 9,10,11, 9, - 9, 9,10,10,11,10,11,11, 9, 9, 9,10,10,11,10,11, - 11, -}; - -static const static_codebook _44u5__p6_0 = { - 2, 81, - (char *)_vq_lengthlist__44u5__p6_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44u5__p6_0, - 0 -}; - -static const long _vq_quantlist__44u5__p7_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44u5__p7_0[] = { - 1, 4, 4, 5, 7, 7, 5, 7, 7, 5, 9, 9, 8,11,10, 7, - 11,10, 5, 9, 9, 7,10,10, 8,10,11, 4, 9, 9, 9,12, - 12, 9,12,12, 8,12,12,11,12,12,10,12,13, 7,12,12, - 11,12,12,10,12,13, 4, 9, 9, 9,12,12, 9,12,12, 7, - 12,11,10,13,13,11,12,12, 7,12,12,10,13,13,11,12, - 12, -}; - -static const static_codebook _44u5__p7_0 = { - 4, 81, - (char *)_vq_lengthlist__44u5__p7_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44u5__p7_0, - 0 -}; - -static const long _vq_quantlist__44u5__p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__44u5__p7_1[] = { - 2, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8, 4, 5, 5, 7, 7, - 8, 8, 9, 8, 8, 9, 4, 5, 5, 7, 7, 8, 8, 9, 9, 8, - 9, 6, 7, 7, 8, 8, 9, 8, 9, 9, 9, 9, 6, 7, 7, 8, - 8, 9, 9, 9, 9, 9, 9, 7, 8, 8, 9, 9, 9, 9, 9, 9, - 9, 9, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 9, - 9, 9, 9, 9,10,10,10,10, 8, 9, 9, 9, 9, 9, 9,10, - 10,10,10, 8, 9, 9, 9, 9, 9, 9,10,10,10,10, 8, 9, - 9, 9, 9, 9, 9,10,10,10,10, -}; - -static const static_codebook _44u5__p7_1 = { - 2, 121, - (char *)_vq_lengthlist__44u5__p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44u5__p7_1, - 0 -}; - -static const long _vq_quantlist__44u5__p8_0[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__44u5__p8_0[] = { - 1, 4, 4, 6, 6, 8, 8, 9, 9,10,10, 4, 6, 6, 7, 7, - 9, 9,10,10,11,11, 4, 6, 6, 7, 7, 9, 9,10,10,11, - 11, 6, 8, 7, 9, 9,10,10,11,11,13,12, 6, 8, 8, 9, - 9,10,10,11,11,12,13, 8, 9, 9,10,10,12,12,13,12, - 14,13, 8, 9, 9,10,10,12,12,13,13,14,14, 9,11,11, - 12,12,13,13,14,14,15,14, 9,11,11,12,12,13,13,14, - 14,15,14,11,12,12,13,13,14,14,15,14,15,14,11,11, - 12,13,13,14,14,14,14,15,15, -}; - -static const static_codebook _44u5__p8_0 = { - 2, 121, - (char *)_vq_lengthlist__44u5__p8_0, - 1, -524582912, 1618345984, 4, 0, - (long *)_vq_quantlist__44u5__p8_0, - 0 -}; - -static const long _vq_quantlist__44u5__p8_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__44u5__p8_1[] = { - 3, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 5, 6, 5, 7, 6, - 7, 7, 8, 8, 8, 8, 5, 5, 5, 6, 6, 7, 7, 8, 8, 8, - 8, 6, 7, 6, 7, 7, 8, 8, 8, 8, 8, 8, 6, 6, 7, 7, - 7, 8, 8, 8, 8, 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, - 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _44u5__p8_1 = { - 2, 121, - (char *)_vq_lengthlist__44u5__p8_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44u5__p8_1, - 0 -}; - -static const long _vq_quantlist__44u5__p9_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44u5__p9_0[] = { - 1, 3, 2,12,10,13,13,13,13,13,13,13,13, 4, 9, 9, - 13,13,13,13,13,13,13,13,13,13, 5,10, 9,13,13,13, - 13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,13, - 13,13,13,13,11,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12, -}; - -static const static_codebook _44u5__p9_0 = { - 2, 169, - (char *)_vq_lengthlist__44u5__p9_0, - 1, -514332672, 1627381760, 4, 0, - (long *)_vq_quantlist__44u5__p9_0, - 0 -}; - -static const long _vq_quantlist__44u5__p9_1[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const char _vq_lengthlist__44u5__p9_1[] = { - 1, 4, 4, 7, 7, 8, 8, 8, 7, 8, 7, 9, 8, 9, 9, 4, - 7, 6, 9, 8,10,10, 9, 8, 9, 9, 9, 9, 9, 8, 5, 6, - 6, 8, 9,10,10, 9, 9, 9,10,10,10,10,11, 7, 8, 8, - 10,10,11,11,10,10,11,11,11,12,11,11, 7, 8, 8,10, - 10,11,11,10,10,11,11,12,11,11,11, 8, 9, 9,11,11, - 12,12,11,11,12,11,12,12,12,12, 8, 9,10,11,11,12, - 12,11,11,12,12,12,12,12,12, 8, 9, 9,10,10,12,11, - 12,12,12,12,12,12,12,13, 8, 9, 9,11,11,11,11,12, - 12,12,12,13,12,13,13, 9,10,10,11,11,12,12,12,13, - 12,13,13,13,14,13, 9,10,10,11,11,12,12,12,13,13, - 12,13,13,14,13, 9,11,10,12,11,13,12,12,13,13,13, - 13,13,13,14, 9,10,10,12,12,12,12,12,13,13,13,13, - 13,14,14,10,11,11,12,12,12,13,13,13,14,14,13,14, - 14,14,10,11,11,12,12,12,12,13,12,13,14,13,14,14, - 14, -}; - -static const static_codebook _44u5__p9_1 = { - 2, 225, - (char *)_vq_lengthlist__44u5__p9_1, - 1, -522338304, 1620115456, 4, 0, - (long *)_vq_quantlist__44u5__p9_1, - 0 -}; - -static const long _vq_quantlist__44u5__p9_2[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__44u5__p9_2[] = { - 2, 5, 5, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 5, 6, 6, 7, 7, 8, 8, 9, 8, 9, 9, 9, 9, 9, 9, - 9, 9, 5, 6, 6, 7, 7, 8, 8, 9, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 7, 7, 7, 8, 8, 9, 8, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 7, 7, 7, 8, 8, 9, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, - 9,10, 9,10,10,10, 8, 8, 8, 9, 8, 9, 9, 9, 9, 9, - 9, 9,10, 9,10, 9,10, 8, 9, 9, 9, 9, 9, 9, 9, 9, - 9,10, 9,10,10,10,10,10, 8, 9, 9, 9, 9, 9, 9,10, - 9,10, 9,10,10,10,10,10,10, 9, 9, 9, 9, 9,10, 9, - 10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9, 9, - 9,10, 9,10, 9,10,10,10,10,10,10, 9, 9, 9, 9, 9, - 10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, - 9, 9,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, - 9,10,10, 9,10,10,10,10,10,10,10,10,10,10, 9, 9, - 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10, 9, - 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10, - 9, 9, 9,10, 9,10,10,10,10,10,10,10,10,10,10,10, - 10, -}; - -static const static_codebook _44u5__p9_2 = { - 2, 289, - (char *)_vq_lengthlist__44u5__p9_2, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44u5__p9_2, - 0 -}; - -static const char _huff_lengthlist__44u5__short[] = { - 4,10,17,13,17,13,17,17,17,17, 3, 6, 8, 9,11, 9, - 15,12,16,17, 6, 5, 5, 7, 7, 8,10,11,17,17, 7, 8, - 7, 9, 9,10,13,13,17,17, 8, 6, 5, 7, 4, 7, 5, 8, - 14,17, 9, 9, 8, 9, 7, 9, 8,10,16,17,12,10, 7, 8, - 4, 7, 4, 7,16,17,12,11, 9,10, 6, 9, 5, 7,14,17, - 14,13,10,15, 4, 8, 3, 5,14,17,17,14,11,15, 6,10, - 6, 8,15,17, -}; - -static const static_codebook _huff_book__44u5__short = { - 2, 100, - (char *)_huff_lengthlist__44u5__short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44u6__long[] = { - 3, 9,14,13,14,13,16,12,13,14, 5, 4, 6, 6, 8, 9, - 11,10,12,15,10, 5, 5, 6, 6, 8,10,10,13,16,10, 6, - 6, 6, 6, 8, 9, 9,12,14,13, 7, 6, 6, 4, 6, 6, 7, - 11,14,10, 7, 7, 7, 6, 6, 6, 7,10,13,15,10, 9, 8, - 5, 6, 5, 6,10,14,10, 9, 8, 8, 6, 6, 5, 4, 6,11, - 11,11,12,11,10, 9, 9, 5, 5, 9,10,12,15,13,13,13, - 13, 8, 7, 7, -}; - -static const static_codebook _huff_book__44u6__long = { - 2, 100, - (char *)_huff_lengthlist__44u6__long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44u6__p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44u6__p1_0[] = { - 1, 4, 4, 4, 8, 7, 5, 7, 7, 5, 8, 8, 8,10,10, 7, - 9,10, 5, 8, 8, 7,10, 9, 8,10,10, 5, 8, 8, 8,10, - 10, 8,10,10, 8,10,10,10,12,13,10,13,13, 7,10,10, - 10,13,11,10,13,13, 5, 8, 8, 8,11,10, 8,10,10, 7, - 10,10,10,13,13,10,11,13, 8,10,11,10,13,13,10,13, - 12, -}; - -static const static_codebook _44u6__p1_0 = { - 4, 81, - (char *)_vq_lengthlist__44u6__p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u6__p1_0, - 0 -}; - -static const long _vq_quantlist__44u6__p2_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44u6__p2_0[] = { - 3, 4, 4, 5, 6, 6, 5, 6, 6, 5, 6, 6, 6, 8, 8, 6, - 7, 8, 5, 6, 6, 6, 8, 7, 6, 8, 8, 5, 6, 6, 6, 8, - 8, 6, 8, 8, 6, 8, 8, 8, 9, 9, 8, 9, 9, 6, 7, 7, - 7, 9, 8, 8, 9, 9, 5, 6, 6, 6, 8, 7, 6, 8, 8, 6, - 8, 8, 8, 9, 9, 7, 8, 9, 6, 8, 8, 8, 9, 9, 8, 9, - 9, -}; - -static const static_codebook _44u6__p2_0 = { - 4, 81, - (char *)_vq_lengthlist__44u6__p2_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u6__p2_0, - 0 -}; - -static const long _vq_quantlist__44u6__p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44u6__p3_0[] = { - 2, 5, 4, 8, 8, 5, 7, 6, 9, 9, 5, 6, 7, 9, 9, 8, - 9, 9,13,12, 8, 9,10,12,13, 5, 7, 7,10, 9, 7, 9, - 9,11,11, 7, 8, 9,11,11,10,11,11,14,14, 9,10,11, - 13,14, 5, 7, 7, 9,10, 6, 9, 8,11,11, 7, 9, 9,11, - 11, 9,11,10,14,13,10,11,11,14,13, 8,10,10,13,13, - 10,11,11,15,15, 9,11,11,14,14,13,14,14,17,16,12, - 13,14,16,16, 8,10,10,13,14, 9,11,11,14,15,10,11, - 12,14,15,12,14,13,16,15,13,14,14,15,17, 5, 7, 7, - 10,10, 7, 9, 9,11,11, 7, 9, 9,11,11,10,12,11,14, - 14,10,11,11,14,14, 7, 9, 9,12,11, 9,11,11,13,13, - 9,11,11,13,13,11,13,13,14,15,11,12,13,15,16, 6, - 9, 9,11,12, 8,11,10,13,12, 9,11,11,13,14,11,13, - 12,16,14,11,13,13,15,16,10,12,11,14,15,11,13,13, - 15,17,11,13,13,17,16,15,15,16,17,16,14,15,16,18, - 0, 9,11,11,14,15,10,12,12,16,15,11,13,13,16,16, - 13,15,14,18,15,14,16,16, 0, 0, 5, 7, 7,10,10, 7, - 9, 9,11,11, 7, 9, 9,11,11,10,11,11,14,14,10,11, - 12,14,14, 6, 9, 9,11,11, 9,11,11,13,13, 8,10,11, - 12,13,11,13,13,16,15,11,12,13,14,16, 7, 9, 9,11, - 12, 9,11,11,13,13, 9,11,11,13,13,11,13,13,16,15, - 11,13,12,15,15, 9,11,11,15,14,11,13,13,17,16,10, - 12,13,15,16,14,16,16, 0,18,14,14,15,15,17,10,11, - 12,15,15,11,13,13,16,16,11,13,13,16,16,14,16,16, - 19,17,14,15,15,17,17, 8,10,10,14,14,10,12,11,15, - 15,10,11,12,16,15,14,15,15,18,20,13,14,16,17,18, - 9,11,11,15,16,11,13,13,17,17,11,13,13,17,16,15, - 16,16, 0, 0,15,16,16, 0, 0, 9,11,11,15,15,10,13, - 12,17,15,11,13,13,17,16,15,17,15,20,19,15,16,16, - 19, 0,13,15,14, 0,17,14,15,16, 0,20,15,16,16, 0, - 19,17,18, 0, 0, 0,16,17,18, 0, 0,12,14,14,19,18, - 13,15,14, 0,17,14,15,16,19,19,16,18,16, 0,19,19, - 20,17,20, 0, 8,10,10,13,14,10,11,11,15,15,10,12, - 12,15,16,14,15,14,19,16,14,15,15, 0,18, 9,11,11, - 16,15,11,13,13, 0,16,11,12,13,16,17,14,16,17, 0, - 19,15,16,16,18, 0, 9,11,11,15,16,11,13,13,16,16, - 11,14,13,18,17,15,16,16,18,20,15,17,19, 0, 0,12, - 14,14,17,17,14,16,15, 0, 0,13,14,15,19, 0,16,18, - 20, 0, 0,16,16,18,18, 0,12,14,14,17,20,14,16,16, - 19, 0,14,16,14, 0,20,16,20,17, 0, 0,17, 0,15, 0, - 19, -}; - -static const static_codebook _44u6__p3_0 = { - 4, 625, - (char *)_vq_lengthlist__44u6__p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u6__p3_0, - 0 -}; - -static const long _vq_quantlist__44u6__p4_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44u6__p4_0[] = { - 4, 5, 5, 8, 8, 6, 7, 6, 9, 9, 6, 6, 7, 9, 9, 8, - 9, 9,11,11, 8, 9, 9,11,11, 6, 7, 7, 9, 9, 7, 8, - 8,10,10, 7, 7, 8, 9,10, 9,10,10,11,11, 9, 9,10, - 11,12, 6, 7, 7, 9, 9, 7, 8, 7,10, 9, 7, 8, 8,10, - 10, 9,10, 9,12,11, 9,10,10,12,11, 8, 9, 9,11,11, - 9,10,10,12,12, 9,10,10,12,12,11,12,12,14,13,11, - 11,12,13,13, 8, 9, 9,11,11, 9,10,10,12,12, 9,10, - 10,12,12,11,12,11,13,12,11,12,12,13,13, 5, 7, 7, - 9, 9, 7, 8, 7,10,10, 7, 7, 8,10,10, 9,10,10,12, - 11, 9,10,10,11,12, 7, 8, 8,10,10, 8, 8, 9,11,11, - 8, 9, 9,11,11,10,10,11,12,13,10,10,11,12,12, 6, - 7, 7,10,10, 7, 9, 8,11,10, 8, 8, 9,10,11,10,11, - 10,13,11,10,11,11,12,12, 9,10,10,12,12,10,10,11, - 13,13,10,11,11,12,13,12,12,12,13,14,12,12,13,14, - 14, 9,10,10,12,12, 9,10,10,13,12,10,11,11,13,13, - 11,12,11,14,12,12,13,13,14,14, 6, 7, 7, 9, 9, 7, - 8, 7,10,10, 7, 8, 8,10,10, 9,10,10,12,11, 9,10, - 10,11,12, 6, 7, 7,10,10, 8, 9, 8,11,10, 7, 8, 9, - 10,11,10,11,11,12,12,10,10,11,11,13, 7, 8, 8,10, - 10, 8, 9, 9,11,11, 8, 9, 8,11,11,10,11,10,13,12, - 10,11,11,13,12, 9,10,10,12,12,10,11,11,13,12, 9, - 10,10,12,13,12,13,12,14,14,11,11,12,12,14, 9,10, - 10,12,12,10,11,11,13,13,10,11,10,13,12,12,12,12, - 14,14,12,13,12,14,13, 8, 9, 9,11,11, 9,10,10,12, - 12, 9,10,10,12,12,11,12,12,14,13,11,12,12,13,14, - 9,10,10,12,12,10,11,11,13,13,10,11,11,13,13,12, - 12,13,14,15,12,12,13,14,14, 9,10,10,12,12, 9,11, - 10,13,12,10,10,11,12,13,12,13,12,14,13,12,12,13, - 14,15,11,12,12,14,13,11,12,12,14,14,12,13,13,14, - 14,13,13,14,14,16,13,14,14,15,15,11,12,11,13,13, - 11,12,11,14,13,12,12,13,14,15,12,14,12,15,12,13, - 14,15,15,16, 8, 9, 9,11,11, 9,10,10,12,12, 9,10, - 10,12,12,11,12,12,14,13,11,12,12,13,13, 9,10,10, - 12,12,10,11,10,13,12, 9,10,11,12,13,12,13,12,14, - 14,12,12,13,13,14, 9,10,10,12,12,10,11,11,13,13, - 10,11,11,13,13,12,13,12,14,14,12,13,13,14,14,11, - 11,11,13,13,12,13,12,14,14,11,11,12,13,14,14,14, - 14,16,15,12,12,14,12,15,11,12,12,13,14,12,13,13, - 14,15,11,12,12,14,14,13,14,14,16,16,13,14,13,16, - 13, -}; - -static const static_codebook _44u6__p4_0 = { - 4, 625, - (char *)_vq_lengthlist__44u6__p4_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u6__p4_0, - 0 -}; - -static const long _vq_quantlist__44u6__p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44u6__p5_0[] = { - 2, 3, 3, 6, 6, 8, 8,10,10, 4, 5, 5, 8, 7, 8, 8, - 11,11, 3, 5, 5, 7, 8, 8, 8,11,11, 6, 8, 7, 9, 9, - 10, 9,12,11, 6, 7, 8, 9, 9, 9,10,11,12, 8, 8, 8, - 10, 9,12,11,13,13, 8, 8, 9, 9,10,11,12,13,13,10, - 11,11,12,12,13,13,14,14,10,10,11,11,12,13,13,14, - 14, -}; - -static const static_codebook _44u6__p5_0 = { - 2, 81, - (char *)_vq_lengthlist__44u6__p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44u6__p5_0, - 0 -}; - -static const long _vq_quantlist__44u6__p6_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44u6__p6_0[] = { - 3, 4, 4, 5, 5, 7, 7, 9, 9, 4, 5, 4, 6, 6, 7, 7, - 9, 9, 4, 4, 5, 6, 6, 7, 8, 9, 9, 5, 6, 6, 7, 7, - 8, 8,10,10, 5, 6, 6, 7, 7, 8, 8,10,10, 7, 8, 7, - 8, 8,10, 9,11,11, 7, 7, 8, 8, 8, 9,10,10,11, 9, - 9, 9,10,10,11,11,12,11, 9, 9, 9,10,10,11,11,11, - 12, -}; - -static const static_codebook _44u6__p6_0 = { - 2, 81, - (char *)_vq_lengthlist__44u6__p6_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44u6__p6_0, - 0 -}; - -static const long _vq_quantlist__44u6__p7_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44u6__p7_0[] = { - 1, 4, 4, 5, 7, 7, 5, 7, 7, 5, 9, 8, 7,10,10, 8, - 10,10, 5, 8, 9, 7,10,10, 7,10, 9, 4, 8, 8, 9,11, - 11, 8,11,11, 7,11,11,10,10,13,10,13,13, 7,11,11, - 10,13,12,10,13,13, 5, 9, 8, 8,11,11, 9,11,11, 7, - 11,11,10,13,13,10,12,13, 7,11,11,10,13,13, 9,13, - 10, -}; - -static const static_codebook _44u6__p7_0 = { - 4, 81, - (char *)_vq_lengthlist__44u6__p7_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44u6__p7_0, - 0 -}; - -static const long _vq_quantlist__44u6__p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__44u6__p7_1[] = { - 3, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8, 4, 5, 5, 7, 6, - 8, 8, 8, 8, 8, 8, 4, 5, 5, 6, 7, 8, 8, 8, 8, 8, - 8, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 6, 7, 7, 7, - 7, 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 9, 9, - 9, 9, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 8, 8, 8, - 8, 8, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 9, 9, 9, - 9, 9, 9, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 8, 8, - 8, 8, 8, 9, 9, 9, 9, 9, 9, -}; - -static const static_codebook _44u6__p7_1 = { - 2, 121, - (char *)_vq_lengthlist__44u6__p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44u6__p7_1, - 0 -}; - -static const long _vq_quantlist__44u6__p8_0[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__44u6__p8_0[] = { - 1, 4, 4, 6, 6, 8, 8, 9, 9,10,10, 4, 6, 6, 7, 7, - 9, 9,10,10,11,11, 4, 6, 6, 7, 7, 9, 9,10,10,11, - 11, 6, 8, 8, 9, 9,10,10,11,11,12,12, 6, 8, 8, 9, - 9,10,10,11,11,12,12, 8, 9, 9,10,10,11,11,12,12, - 13,13, 8, 9, 9,10,10,11,11,12,12,13,13,10,10,10, - 11,11,13,13,13,13,15,14, 9,10,10,12,11,12,13,13, - 13,14,15,11,12,12,13,13,13,13,15,14,15,15,11,11, - 12,13,13,14,14,14,15,15,15, -}; - -static const static_codebook _44u6__p8_0 = { - 2, 121, - (char *)_vq_lengthlist__44u6__p8_0, - 1, -524582912, 1618345984, 4, 0, - (long *)_vq_quantlist__44u6__p8_0, - 0 -}; - -static const long _vq_quantlist__44u6__p8_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__44u6__p8_1[] = { - 3, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 5, 6, 5, 7, 7, - 7, 7, 8, 7, 8, 8, 5, 5, 6, 6, 7, 7, 7, 7, 7, 8, - 8, 6, 7, 7, 7, 7, 8, 7, 8, 8, 8, 8, 6, 6, 7, 7, - 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, - 8, 8, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, - 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _44u6__p8_1 = { - 2, 121, - (char *)_vq_lengthlist__44u6__p8_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44u6__p8_1, - 0 -}; - -static const long _vq_quantlist__44u6__p9_0[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const char _vq_lengthlist__44u6__p9_0[] = { - 1, 3, 2, 9, 8,15,15,15,15,15,15,15,15,15,15, 4, - 8, 9,13,14,14,14,14,14,14,14,14,14,14,14, 5, 8, - 9,14,14,14,14,14,14,14,14,14,14,14,14,11,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,11,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, - 14, -}; - -static const static_codebook _44u6__p9_0 = { - 2, 225, - (char *)_vq_lengthlist__44u6__p9_0, - 1, -514071552, 1627381760, 4, 0, - (long *)_vq_quantlist__44u6__p9_0, - 0 -}; - -static const long _vq_quantlist__44u6__p9_1[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const char _vq_lengthlist__44u6__p9_1[] = { - 1, 4, 4, 7, 7, 8, 9, 8, 8, 9, 8, 9, 8, 9, 9, 4, - 7, 6, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 4, 7, - 6, 9, 9,10,10, 9, 9,10,10,10,10,11,11, 7, 9, 8, - 10,10,11,11,10,10,11,11,11,11,11,11, 7, 8, 9,10, - 10,11,11,10,10,11,11,11,11,11,12, 8,10,10,11,11, - 12,12,11,11,12,12,12,12,13,12, 8,10,10,11,11,12, - 11,11,11,11,12,12,12,12,13, 8, 9, 9,11,10,11,11, - 12,12,12,12,13,12,13,12, 8, 9, 9,11,11,11,11,12, - 12,12,12,12,13,13,13, 9,10,10,11,12,12,12,12,12, - 13,13,13,13,13,13, 9,10,10,11,11,12,12,12,12,13, - 13,13,13,14,13,10,10,10,12,11,12,12,13,13,13,13, - 13,13,13,13,10,10,11,11,11,12,12,13,13,13,13,13, - 13,13,13,10,11,11,12,12,13,12,12,13,13,13,13,13, - 13,14,10,11,11,12,12,13,12,13,13,13,14,13,13,14, - 13, -}; - -static const static_codebook _44u6__p9_1 = { - 2, 225, - (char *)_vq_lengthlist__44u6__p9_1, - 1, -522338304, 1620115456, 4, 0, - (long *)_vq_quantlist__44u6__p9_1, - 0 -}; - -static const long _vq_quantlist__44u6__p9_2[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__44u6__p9_2[] = { - 3, 5, 5, 7, 7, 8, 8, 8, 8, 8, 8, 9, 8, 8, 9, 9, - 9, 5, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, - 9, 9, 5, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, - 9, 9, 9, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9,10, 9, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9,10, 9, 9, 9,10, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9,10, 9, 9, 9,10, 9, 9,10, 9, - 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, 9,10, 9,10,10, - 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10, 9,10,10, 9, 9, - 10, -}; - -static const static_codebook _44u6__p9_2 = { - 2, 289, - (char *)_vq_lengthlist__44u6__p9_2, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44u6__p9_2, - 0 -}; - -static const char _huff_lengthlist__44u6__short[] = { - 4,11,16,13,17,13,17,16,17,17, 4, 7, 9, 9,13,10, - 16,12,16,17, 7, 6, 5, 7, 8, 9,12,12,16,17, 6, 9, - 7, 9,10,10,15,15,17,17, 6, 7, 5, 7, 5, 7, 7,10, - 16,17, 7, 9, 8, 9, 8,10,11,11,15,17, 7, 7, 7, 8, - 5, 8, 8, 9,15,17, 8, 7, 9, 9, 7, 8, 7, 2, 7,15, - 14,13,13,15, 5,10, 4, 3, 6,17,17,15,13,17, 7,11, - 7, 6, 9,16, -}; - -static const static_codebook _huff_book__44u6__short = { - 2, 100, - (char *)_huff_lengthlist__44u6__short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44u7__long[] = { - 3, 9,14,13,15,14,16,13,13,14, 5, 5, 7, 7, 8, 9, - 11,10,12,15,10, 6, 5, 6, 6, 9,10,10,13,16,10, 6, - 6, 6, 6, 8, 9, 9,12,15,14, 7, 6, 6, 5, 6, 6, 8, - 12,15,10, 8, 7, 7, 6, 7, 7, 7,11,13,14,10, 9, 8, - 5, 6, 4, 5, 9,12,10, 9, 9, 8, 6, 6, 5, 3, 6,11, - 12,11,12,12,10, 9, 8, 5, 5, 8,10,11,15,13,13,13, - 12, 8, 6, 7, -}; - -static const static_codebook _huff_book__44u7__long = { - 2, 100, - (char *)_huff_lengthlist__44u7__long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44u7__p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44u7__p1_0[] = { - 1, 4, 4, 4, 7, 7, 5, 7, 7, 5, 8, 8, 8,10,10, 7, - 10,10, 5, 8, 8, 7,10,10, 8,10,10, 5, 8, 8, 8,11, - 10, 8,10,10, 8,10,10,10,12,13,10,13,13, 7,10,10, - 10,13,12,10,13,13, 5, 8, 8, 8,11,10, 8,10,11, 7, - 10,10,10,13,13,10,12,13, 8,11,11,10,13,13,10,13, - 12, -}; - -static const static_codebook _44u7__p1_0 = { - 4, 81, - (char *)_vq_lengthlist__44u7__p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u7__p1_0, - 0 -}; - -static const long _vq_quantlist__44u7__p2_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44u7__p2_0[] = { - 3, 4, 4, 5, 6, 6, 5, 6, 6, 5, 6, 6, 6, 8, 8, 6, - 7, 8, 5, 6, 6, 6, 8, 7, 6, 8, 8, 5, 6, 6, 6, 8, - 7, 6, 8, 8, 6, 8, 8, 8, 9, 9, 8, 9, 9, 6, 8, 7, - 7, 9, 8, 8, 9, 9, 5, 6, 6, 6, 8, 7, 6, 8, 8, 6, - 8, 8, 8, 9, 9, 7, 8, 9, 6, 8, 8, 8, 9, 9, 8, 9, - 9, -}; - -static const static_codebook _44u7__p2_0 = { - 4, 81, - (char *)_vq_lengthlist__44u7__p2_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u7__p2_0, - 0 -}; - -static const long _vq_quantlist__44u7__p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44u7__p3_0[] = { - 2, 5, 4, 8, 8, 5, 7, 6, 9, 9, 5, 6, 7, 9, 9, 8, - 9, 9,13,12, 8, 9,10,12,13, 5, 7, 7,10, 9, 7, 9, - 9,11,11, 6, 8, 9,11,11,10,11,11,14,14, 9,10,11, - 13,14, 5, 7, 7, 9, 9, 7, 9, 8,11,11, 7, 9, 9,11, - 11, 9,11,10,14,13,10,11,11,14,14, 8,10,10,14,13, - 10,11,12,15,14, 9,11,11,15,14,13,14,14,16,16,12, - 13,14,17,16, 8,10,10,13,13, 9,11,11,14,15,10,11, - 12,14,15,12,14,13,16,16,13,14,15,15,17, 5, 7, 7, - 10,10, 7, 9, 9,11,11, 7, 9, 9,11,11,10,12,11,15, - 14,10,11,12,14,14, 7, 9, 9,12,12, 9,11,11,13,13, - 9,11,11,13,13,11,13,13,14,17,11,13,13,15,16, 6, - 9, 9,11,11, 8,11,10,13,12, 9,11,11,13,13,11,13, - 12,16,14,11,13,13,16,16,10,12,12,15,15,11,13,13, - 16,16,11,13,13,16,15,14,16,17,17,19,14,16,16,18, - 0, 9,11,11,14,15,10,13,12,16,15,11,13,13,16,16, - 14,15,14, 0,16,14,16,16,18, 0, 5, 7, 7,10,10, 7, - 9, 9,12,11, 7, 9, 9,11,12,10,11,11,15,14,10,11, - 12,14,14, 6, 9, 9,11,11, 9,11,11,13,13, 8,10,11, - 12,13,11,13,13,17,15,11,12,13,14,15, 7, 9, 9,11, - 12, 9,11,11,13,13, 9,11,11,13,13,11,13,12,16,16, - 11,13,13,15,14, 9,11,11,14,15,11,13,13,16,15,10, - 12,13,16,16,15,16,16, 0, 0,14,13,15,16,18,10,11, - 11,15,15,11,13,14,16,18,11,13,13,16,15,15,16,16, - 19, 0,14,15,15,16,16, 8,10,10,13,13,10,12,11,16, - 15,10,11,11,16,15,13,15,16,18, 0,13,14,15,17,17, - 9,11,11,15,15,11,13,13,16,18,11,13,13,16,17,15, - 16,16, 0, 0,15,18,16, 0,17, 9,11,11,15,15,11,13, - 12,17,15,11,13,14,16,17,15,18,15, 0,17,15,16,16, - 18,19,13,15,14, 0,18,14,16,16,19,18,14,16,15,19, - 19,16,18,19, 0, 0,16,17, 0, 0, 0,12,14,14,17,17, - 13,16,14, 0,18,14,16,15,18, 0,16,18,16,19,17,18, - 19,17, 0, 0, 8,10,10,14,14, 9,12,11,15,15,10,11, - 12,15,17,13,15,15,18,16,14,16,15,18,17, 9,11,11, - 16,15,11,13,13, 0,16,11,12,13,16,15,15,16,16, 0, - 17,15,15,16,18,17, 9,12,11,15,17,11,13,13,16,16, - 11,14,13,16,16,15,15,16,18,19,16,18,16, 0, 0,12, - 14,14, 0,16,14,16,16, 0,18,13,14,15,16, 0,17,16, - 18, 0, 0,16,16,17,19, 0,13,14,14,17, 0,14,17,16, - 0,19,14,15,15,18,19,17,16,18, 0, 0,15,19,16, 0, - 0, -}; - -static const static_codebook _44u7__p3_0 = { - 4, 625, - (char *)_vq_lengthlist__44u7__p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u7__p3_0, - 0 -}; - -static const long _vq_quantlist__44u7__p4_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44u7__p4_0[] = { - 4, 5, 5, 8, 8, 6, 7, 6, 9, 9, 6, 6, 7, 9, 9, 8, - 9, 9,11,11, 8, 9, 9,10,11, 6, 7, 7, 9, 9, 7, 8, - 8,10,10, 6, 7, 8, 9,10, 9,10,10,12,12, 9, 9,10, - 11,12, 6, 7, 7, 9, 9, 6, 8, 7,10, 9, 7, 8, 8,10, - 10, 9,10, 9,12,11, 9,10,10,12,11, 8, 9, 9,11,11, - 9,10,10,12,12, 9,10,10,12,12,11,12,12,13,14,11, - 11,12,13,13, 8, 9, 9,11,11, 9,10,10,12,11, 9,10, - 10,12,12,11,12,11,13,13,11,12,12,13,13, 6, 7, 7, - 9, 9, 7, 8, 7,10,10, 7, 7, 8,10,10, 9,10,10,12, - 11, 9,10,10,12,12, 7, 8, 8,10,10, 8, 8, 9,11,11, - 8, 9, 9,11,11,10,11,11,12,12,10,10,11,12,13, 6, - 7, 7,10,10, 7, 9, 8,11,10, 8, 8, 9,10,11,10,11, - 10,13,11,10,11,11,12,12, 9,10,10,12,12,10,10,11, - 13,13,10,11,11,13,12,12,12,13,13,14,12,12,13,14, - 14, 9,10,10,12,12, 9,10,10,12,12,10,11,11,13,13, - 11,12,11,14,12,12,13,13,14,14, 6, 7, 7, 9, 9, 7, - 8, 7,10,10, 7, 7, 8,10,10, 9,10,10,12,11, 9,10, - 10,11,12, 6, 7, 7,10,10, 8, 9, 8,11,10, 7, 8, 9, - 10,11,10,11,11,13,12,10,10,11,11,13, 7, 8, 8,10, - 10, 8, 9, 9,11,11, 8, 9, 9,11,11,10,11,10,13,12, - 10,11,11,12,12, 9,10,10,12,12,10,11,11,13,12, 9, - 10,10,12,13,12,13,12,14,14,11,11,12,12,14, 9,10, - 10,12,12,10,11,11,13,13,10,11,11,13,13,12,13,12, - 14,14,12,13,12,14,13, 8, 9, 9,11,11, 9,10,10,12, - 12, 9,10,10,12,12,11,12,12,14,13,11,12,12,13,13, - 9,10,10,12,12,10,11,11,13,13,10,11,11,13,12,12, - 13,13,14,14,12,12,13,14,14, 9,10,10,12,12, 9,11, - 10,13,12,10,10,11,12,13,11,13,12,14,13,12,12,13, - 14,14,11,12,12,13,13,11,12,13,14,14,12,13,13,14, - 14,13,13,14,14,16,13,14,14,16,16,11,11,11,13,13, - 11,12,11,14,13,12,12,13,14,15,13,14,12,16,13,14, - 14,14,15,16, 8, 9, 9,11,11, 9,10,10,12,12, 9,10, - 10,12,12,11,12,12,14,13,11,12,12,13,14, 9,10,10, - 12,12,10,11,10,13,12, 9,10,11,12,13,12,13,12,14, - 14,12,12,13,13,14, 9,10,10,12,12,10,11,11,12,13, - 10,11,11,13,13,12,13,12,14,14,12,13,13,14,14,11, - 12,12,13,13,12,13,12,14,14,11,11,12,13,14,13,15, - 14,16,15,13,12,14,13,16,11,12,12,13,13,12,13,13, - 14,14,12,12,12,14,14,13,14,14,15,15,13,14,13,16, - 14, -}; - -static const static_codebook _44u7__p4_0 = { - 4, 625, - (char *)_vq_lengthlist__44u7__p4_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u7__p4_0, - 0 -}; - -static const long _vq_quantlist__44u7__p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44u7__p5_0[] = { - 2, 3, 3, 6, 6, 7, 8,10,10, 4, 5, 5, 8, 7, 8, 8, - 11,11, 3, 5, 5, 7, 7, 8, 9,11,11, 6, 8, 7, 9, 9, - 10,10,12,12, 6, 7, 8, 9,10,10,10,12,12, 8, 8, 8, - 10,10,12,11,13,13, 8, 8, 9,10,10,11,11,13,13,10, - 11,11,12,12,13,13,14,14,10,11,11,12,12,13,13,14, - 14, -}; - -static const static_codebook _44u7__p5_0 = { - 2, 81, - (char *)_vq_lengthlist__44u7__p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44u7__p5_0, - 0 -}; - -static const long _vq_quantlist__44u7__p6_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44u7__p6_0[] = { - 3, 4, 4, 5, 5, 7, 7, 9, 9, 4, 5, 4, 6, 6, 8, 7, - 9, 9, 4, 4, 5, 6, 6, 7, 7, 9, 9, 5, 6, 6, 7, 7, - 8, 8,10,10, 5, 6, 6, 7, 7, 8, 8,10,10, 7, 8, 7, - 8, 8,10, 9,11,11, 7, 7, 8, 8, 8, 9,10,11,11, 9, - 9, 9,10,10,11,10,12,11, 9, 9, 9,10,10,11,11,11, - 12, -}; - -static const static_codebook _44u7__p6_0 = { - 2, 81, - (char *)_vq_lengthlist__44u7__p6_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44u7__p6_0, - 0 -}; - -static const long _vq_quantlist__44u7__p7_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44u7__p7_0[] = { - 1, 4, 4, 5, 7, 7, 5, 7, 7, 5, 9, 8, 8, 9, 9, 7, - 10,10, 5, 8, 9, 7, 9,10, 8, 9, 9, 4, 9, 9, 9,11, - 10, 8,10,10, 7,11,10,10,10,12,10,12,12, 7,10,10, - 10,12,11,10,12,12, 5, 9, 9, 8,10,10, 9,11,11, 7, - 11,10,10,12,12,10,11,12, 7,10,11,10,12,12,10,12, - 10, -}; - -static const static_codebook _44u7__p7_0 = { - 4, 81, - (char *)_vq_lengthlist__44u7__p7_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44u7__p7_0, - 0 -}; - -static const long _vq_quantlist__44u7__p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__44u7__p7_1[] = { - 3, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8, 4, 5, 5, 6, 6, - 8, 7, 8, 8, 8, 8, 4, 5, 5, 6, 6, 7, 8, 8, 8, 8, - 8, 6, 7, 6, 7, 7, 8, 8, 9, 9, 9, 9, 6, 6, 7, 7, - 7, 8, 8, 9, 9, 9, 9, 7, 8, 7, 8, 8, 9, 9, 9, 9, - 9, 9, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9, 8, 8, 8, - 9, 9, 9, 9,10, 9, 9, 9, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9,10, 8, 8, 8, 9, 9, 9, 9,10, 9,10,10, 8, 8, - 8, 9, 9, 9, 9, 9,10,10,10, -}; - -static const static_codebook _44u7__p7_1 = { - 2, 121, - (char *)_vq_lengthlist__44u7__p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44u7__p7_1, - 0 -}; - -static const long _vq_quantlist__44u7__p8_0[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__44u7__p8_0[] = { - 1, 4, 4, 6, 6, 8, 8,10,10,11,11, 4, 6, 6, 7, 7, - 9, 9,11,10,12,12, 5, 6, 5, 7, 7, 9, 9,10,11,12, - 12, 6, 7, 7, 8, 8,10,10,11,11,13,13, 6, 7, 7, 8, - 8,10,10,11,12,13,13, 8, 9, 9,10,10,11,11,12,12, - 14,14, 8, 9, 9,10,10,11,11,12,12,14,14,10,10,10, - 11,11,13,12,14,14,15,15,10,10,10,12,12,13,13,14, - 14,15,15,11,12,12,13,13,14,14,15,14,16,15,11,12, - 12,13,13,14,14,15,15,15,16, -}; - -static const static_codebook _44u7__p8_0 = { - 2, 121, - (char *)_vq_lengthlist__44u7__p8_0, - 1, -524582912, 1618345984, 4, 0, - (long *)_vq_quantlist__44u7__p8_0, - 0 -}; - -static const long _vq_quantlist__44u7__p8_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__44u7__p8_1[] = { - 4, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 5, 6, 6, 7, 7, - 7, 7, 7, 7, 7, 7, 5, 6, 6, 6, 7, 7, 7, 7, 7, 7, - 7, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 6, 7, 7, 7, - 7, 7, 7, 7, 7, 8, 8, 7, 7, 7, 7, 7, 8, 7, 8, 8, - 8, 8, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, - 7, 7, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 8, 8, 8, - 8, 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, - 7, 8, 8, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _44u7__p8_1 = { - 2, 121, - (char *)_vq_lengthlist__44u7__p8_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44u7__p8_1, - 0 -}; - -static const long _vq_quantlist__44u7__p9_0[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__44u7__p9_0[] = { - 1, 3, 3,10,10,10,10,10,10,10,10, 4,10,10,10,10, - 10,10,10,10,10,10, 4,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, -}; - -static const static_codebook _44u7__p9_0 = { - 2, 121, - (char *)_vq_lengthlist__44u7__p9_0, - 1, -512171520, 1630791680, 4, 0, - (long *)_vq_quantlist__44u7__p9_0, - 0 -}; - -static const long _vq_quantlist__44u7__p9_1[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44u7__p9_1[] = { - 1, 4, 4, 6, 5, 8, 6, 9, 8,10, 9,11,10, 4, 6, 6, - 8, 8, 9, 9,11,10,11,11,11,11, 4, 6, 6, 8, 8,10, - 9,11,11,11,11,11,12, 6, 8, 8,10,10,11,11,12,12, - 13,12,13,13, 6, 8, 8,10,10,11,11,12,12,12,13,14, - 13, 8,10,10,11,11,12,13,14,14,14,14,15,15, 8,10, - 10,11,12,12,13,13,14,14,14,14,15, 9,11,11,13,13, - 14,14,15,14,16,15,17,15, 9,11,11,12,13,14,14,15, - 14,15,15,15,16,10,12,12,13,14,15,15,15,15,16,17, - 16,17,10,13,12,13,14,14,16,16,16,16,15,16,17,11, - 13,13,14,15,14,17,15,16,17,17,17,17,11,13,13,14, - 15,15,15,15,17,17,16,17,16, -}; - -static const static_codebook _44u7__p9_1 = { - 2, 169, - (char *)_vq_lengthlist__44u7__p9_1, - 1, -518889472, 1622704128, 4, 0, - (long *)_vq_quantlist__44u7__p9_1, - 0 -}; - -static const long _vq_quantlist__44u7__p9_2[] = { - 24, - 23, - 25, - 22, - 26, - 21, - 27, - 20, - 28, - 19, - 29, - 18, - 30, - 17, - 31, - 16, - 32, - 15, - 33, - 14, - 34, - 13, - 35, - 12, - 36, - 11, - 37, - 10, - 38, - 9, - 39, - 8, - 40, - 7, - 41, - 6, - 42, - 5, - 43, - 4, - 44, - 3, - 45, - 2, - 46, - 1, - 47, - 0, - 48, -}; - -static const char _vq_lengthlist__44u7__p9_2[] = { - 2, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, - 8, -}; - -static const static_codebook _44u7__p9_2 = { - 1, 49, - (char *)_vq_lengthlist__44u7__p9_2, - 1, -526909440, 1611661312, 6, 0, - (long *)_vq_quantlist__44u7__p9_2, - 0 -}; - -static const char _huff_lengthlist__44u7__short[] = { - 5,12,17,16,16,17,17,17,17,17, 4, 7,11,11,12, 9, - 17,10,17,17, 7, 7, 8, 9, 7, 9,11,10,15,17, 7, 9, - 10,11,10,12,14,12,16,17, 7, 8, 5, 7, 4, 7, 7, 8, - 16,16, 6,10, 9,10, 7,10,11,11,16,17, 6, 8, 8, 9, - 5, 7, 5, 8,16,17, 5, 5, 8, 7, 6, 7, 7, 6, 6,14, - 12,10,12,11, 7,11, 4, 4, 2, 7,17,15,15,15, 8,15, - 6, 8, 5, 9, -}; - -static const static_codebook _huff_book__44u7__short = { - 2, 100, - (char *)_huff_lengthlist__44u7__short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44u8__long[] = { - 3, 9,13,14,14,15,14,14,15,15, 5, 4, 6, 8,10,12, - 12,14,15,15, 9, 5, 4, 5, 8,10,11,13,16,16,10, 7, - 4, 3, 5, 7, 9,11,13,13,10, 9, 7, 4, 4, 6, 8,10, - 12,14,13,11, 9, 6, 5, 5, 6, 8,12,14,13,11,10, 8, - 7, 6, 6, 7,10,14,13,11,12,10, 8, 7, 6, 6, 9,13, - 12,11,14,12,11, 9, 8, 7, 9,11,11,12,14,13,14,11, - 10, 8, 8, 9, -}; - -static const static_codebook _huff_book__44u8__long = { - 2, 100, - (char *)_huff_lengthlist__44u8__long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44u8__short[] = { - 6,14,18,18,17,17,17,17,17,17, 4, 7, 9, 9,10,13, - 15,17,17,17, 6, 7, 5, 6, 8,11,16,17,16,17, 5, 7, - 5, 4, 6,10,14,17,17,17, 6, 6, 6, 5, 7,10,13,16, - 17,17, 7, 6, 7, 7, 7, 8, 7,10,15,16,12, 9, 9, 6, - 6, 5, 3, 5,11,15,14,14,13, 5, 5, 7, 3, 4, 8,15, - 17,17,13, 7, 7,10, 6, 6,10,15,17,17,16,10,11,14, - 10,10,15,17, -}; - -static const static_codebook _huff_book__44u8__short = { - 2, 100, - (char *)_huff_lengthlist__44u8__short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44u8_p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44u8_p1_0[] = { - 1, 5, 5, 5, 7, 7, 5, 7, 7, 5, 7, 7, 8, 9, 9, 7, - 9, 9, 5, 7, 7, 7, 9, 9, 8, 9, 9, 5, 7, 7, 7, 9, - 9, 7, 9, 9, 7, 9, 9, 9,10,11, 9,11,10, 7, 9, 9, - 9,11,10, 9,10,11, 5, 7, 7, 7, 9, 9, 7, 9, 9, 7, - 9, 9, 9,11,10, 9,10,10, 8, 9, 9, 9,11,11, 9,11, - 10, -}; - -static const static_codebook _44u8_p1_0 = { - 4, 81, - (char *)_vq_lengthlist__44u8_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u8_p1_0, - 0 -}; - -static const long _vq_quantlist__44u8_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44u8_p2_0[] = { - 4, 5, 5, 8, 8, 5, 7, 6, 9, 9, 5, 6, 7, 9, 9, 8, - 9, 9,11,11, 8, 9, 9,11,11, 5, 7, 7, 9, 9, 7, 8, - 8,10,10, 7, 8, 8,10,10, 9,10,10,12,12, 9,10,10, - 11,12, 5, 7, 7, 9, 9, 7, 8, 7,10,10, 7, 8, 8,10, - 10, 9,10, 9,12,11, 9,10,10,12,12, 8, 9, 9,12,11, - 9,10,10,12,12, 9,10,10,12,12,11,12,12,14,14,11, - 11,12,13,14, 8, 9, 9,11,11, 9,10,10,12,12, 9,10, - 10,12,12,11,12,11,13,13,11,12,12,14,14, 5, 7, 7, - 9, 9, 7, 8, 8,10,10, 7, 8, 8,10,10, 9,10,10,12, - 12, 9,10,10,11,12, 7, 8, 8,10,10, 8, 9, 9,11,11, - 8, 9, 9,11,11,10,11,11,12,13,10,11,11,12,13, 6, - 8, 8,10,10, 8, 9, 8,11,10, 8, 9, 9,11,11,10,11, - 10,13,12,10,11,11,13,13, 9,10,10,12,12,10,11,11, - 13,13,10,11,11,13,13,12,12,13,13,14,12,13,13,14, - 14, 9,10,10,12,12,10,11,10,13,12,10,11,11,13,13, - 11,13,12,14,13,12,13,13,14,14, 5, 7, 7, 9, 9, 7, - 8, 8,10,10, 7, 8, 8,10,10, 9,10,10,12,12, 9,10, - 10,12,12, 7, 8, 8,10,10, 8, 9, 9,11,11, 8, 8, 9, - 10,11,10,11,11,13,13,10,10,11,12,13, 7, 8, 8,10, - 10, 8, 9, 9,11,11, 8, 9, 9,11,11,10,11,11,13,13, - 10,11,11,13,12, 9,10,10,12,12,10,11,11,13,13,10, - 10,11,12,13,12,13,13,14,14,12,12,13,13,14, 9,10, - 10,12,12,10,11,11,13,13,10,11,11,13,13,12,13,13, - 15,14,12,13,13,14,13, 8, 9, 9,11,11, 9,10,10,12, - 12, 9,10,10,12,12,12,12,12,14,13,11,12,12,14,14, - 9,10,10,12,12,10,11,11,13,13,10,11,11,13,13,12, - 13,13,14,15,12,13,13,14,15, 9,10,10,12,12,10,11, - 10,13,12,10,11,11,13,13,12,13,12,15,14,12,13,13, - 14,15,11,12,12,14,14,12,13,13,14,14,12,13,13,15, - 14,14,14,14,14,16,14,14,15,16,16,11,12,12,14,14, - 11,12,12,14,14,12,13,13,14,15,13,14,13,16,14,14, - 14,14,16,16, 8, 9, 9,11,11, 9,10,10,12,12, 9,10, - 10,12,12,11,12,12,14,13,11,12,12,14,14, 9,10,10, - 12,12,10,11,11,13,13,10,10,11,12,13,12,13,13,15, - 14,12,12,13,13,14, 9,10,10,12,12,10,11,11,13,13, - 10,11,11,13,13,12,13,13,14,14,12,13,13,15,14,11, - 12,12,14,13,12,13,13,15,14,11,12,12,13,14,14,15, - 14,16,15,13,13,14,13,16,11,12,12,14,14,12,13,13, - 14,15,12,13,12,15,14,14,14,14,16,15,14,15,13,16, - 14, -}; - -static const static_codebook _44u8_p2_0 = { - 4, 625, - (char *)_vq_lengthlist__44u8_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u8_p2_0, - 0 -}; - -static const long _vq_quantlist__44u8_p3_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44u8_p3_0[] = { - 3, 4, 4, 5, 5, 7, 7, 9, 9, 4, 5, 4, 6, 6, 7, 7, - 9, 9, 4, 4, 5, 6, 6, 7, 7, 9, 9, 5, 6, 6, 7, 7, - 8, 8,10,10, 6, 6, 6, 7, 7, 8, 8,10,10, 7, 7, 7, - 8, 8, 9, 9,11,10, 7, 7, 7, 8, 8, 9, 9,10,11, 9, - 9, 9,10,10,11,10,12,11, 9, 9, 9, 9,10,11,11,11, - 12, -}; - -static const static_codebook _44u8_p3_0 = { - 2, 81, - (char *)_vq_lengthlist__44u8_p3_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44u8_p3_0, - 0 -}; - -static const long _vq_quantlist__44u8_p4_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__44u8_p4_0[] = { - 4, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8,10,10,11,11,11, - 11, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,10,10,11,11, - 12,12, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,10,10,11, - 11,12,12, 6, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9,10,10, - 11,11,12,12, 6, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9,10, - 10,11,11,12,12, 7, 7, 7, 8, 8, 9, 8,10, 9,10, 9, - 11,10,12,11,13,12, 7, 7, 7, 8, 8, 8, 9, 9,10, 9, - 10,10,11,11,12,12,13, 8, 8, 8, 9, 9, 9, 9,10,10, - 11,10,11,11,12,12,13,13, 8, 8, 8, 9, 9, 9,10,10, - 10,10,11,11,11,12,12,12,13, 8, 9, 9, 9, 9,10, 9, - 11,10,11,11,12,11,13,12,13,13, 8, 9, 9, 9, 9, 9, - 10,10,11,11,11,11,12,12,13,13,13,10,10,10,10,10, - 11,10,11,11,12,11,13,12,13,13,14,13,10,10,10,10, - 10,10,11,11,11,11,12,12,13,13,13,13,14,11,11,11, - 11,11,12,11,12,12,13,12,13,13,14,13,14,14,11,11, - 11,11,11,11,12,12,12,12,13,13,13,13,14,14,14,11, - 12,12,12,12,13,12,13,12,13,13,14,13,14,14,14,14, - 11,12,12,12,12,12,12,13,13,13,13,13,14,14,14,14, - 14, -}; - -static const static_codebook _44u8_p4_0 = { - 2, 289, - (char *)_vq_lengthlist__44u8_p4_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44u8_p4_0, - 0 -}; - -static const long _vq_quantlist__44u8_p5_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44u8_p5_0[] = { - 1, 4, 4, 5, 7, 7, 5, 7, 7, 5, 8, 8, 8, 9, 9, 7, - 9, 9, 5, 8, 8, 7, 9, 9, 8, 9, 9, 5, 8, 8, 8,10, - 10, 8,10,10, 7,10,10, 9,10,12, 9,12,11, 7,10,10, - 9,11,10, 9,11,12, 5, 8, 8, 8,10,10, 8,10,10, 7, - 10,10, 9,11,11, 9,10,11, 7,10,10, 9,11,11,10,12, - 10, -}; - -static const static_codebook _44u8_p5_0 = { - 4, 81, - (char *)_vq_lengthlist__44u8_p5_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44u8_p5_0, - 0 -}; - -static const long _vq_quantlist__44u8_p5_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__44u8_p5_1[] = { - 4, 5, 5, 6, 6, 7, 7, 7, 7, 8, 8, 5, 5, 5, 6, 6, - 7, 7, 8, 8, 8, 8, 5, 5, 5, 6, 6, 7, 7, 7, 8, 8, - 8, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 6, 6, 6, 7, - 7, 7, 7, 8, 8, 8, 8, 7, 7, 7, 7, 7, 8, 8, 8, 8, - 8, 8, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 7, 8, 7, - 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 9, 9, -}; - -static const static_codebook _44u8_p5_1 = { - 2, 121, - (char *)_vq_lengthlist__44u8_p5_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44u8_p5_1, - 0 -}; - -static const long _vq_quantlist__44u8_p6_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44u8_p6_0[] = { - 2, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10, 4, 6, 5, - 7, 7, 8, 8, 8, 8, 9, 9,10,10, 4, 6, 6, 7, 7, 8, - 8, 8, 8, 9, 9,10,10, 6, 7, 7, 7, 8, 8, 8, 8, 9, - 9,10,10,10, 6, 7, 7, 8, 8, 8, 8, 9, 8,10, 9,11, - 10, 7, 8, 8, 8, 8, 8, 9, 9, 9,10,10,11,11, 7, 8, - 8, 8, 8, 9, 8, 9, 9,10,10,11,11, 8, 8, 8, 9, 9, - 9, 9, 9,10,10,10,11,11, 8, 8, 8, 9, 9, 9, 9,10, - 9,10,10,11,11, 9, 9, 9, 9,10,10,10,10,10,10,11, - 11,12, 9, 9, 9,10, 9,10,10,10,10,11,10,12,11,10, - 10,10,10,10,11,11,11,11,11,12,12,12,10,10,10,10, - 11,11,11,11,11,12,11,12,12, -}; - -static const static_codebook _44u8_p6_0 = { - 2, 169, - (char *)_vq_lengthlist__44u8_p6_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44u8_p6_0, - 0 -}; - -static const long _vq_quantlist__44u8_p6_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44u8_p6_1[] = { - 3, 4, 4, 5, 5, 4, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44u8_p6_1 = { - 2, 25, - (char *)_vq_lengthlist__44u8_p6_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u8_p6_1, - 0 -}; - -static const long _vq_quantlist__44u8_p7_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44u8_p7_0[] = { - 1, 4, 5, 6, 6, 7, 7, 8, 8,10,10,11,11, 5, 6, 6, - 7, 7, 8, 8, 9, 9,11,10,12,11, 5, 6, 6, 7, 7, 8, - 8, 9, 9,10,11,11,12, 6, 7, 7, 8, 8, 9, 9,10,10, - 11,11,12,12, 6, 7, 7, 8, 8, 9, 9,10,10,11,12,13, - 12, 7, 8, 8, 9, 9,10,10,11,11,12,12,13,13, 8, 8, - 8, 9, 9,10,10,11,11,12,12,13,13, 9, 9, 9,10,10, - 11,11,12,12,13,13,14,14, 9, 9, 9,10,10,11,11,12, - 12,13,13,14,14,10,11,11,12,11,13,12,13,13,14,14, - 15,15,10,11,11,11,12,12,13,13,14,14,14,15,15,11, - 12,12,13,13,14,13,15,14,15,15,16,15,11,11,12,13, - 13,13,14,14,14,15,15,15,16, -}; - -static const static_codebook _44u8_p7_0 = { - 2, 169, - (char *)_vq_lengthlist__44u8_p7_0, - 1, -523206656, 1618345984, 4, 0, - (long *)_vq_quantlist__44u8_p7_0, - 0 -}; - -static const long _vq_quantlist__44u8_p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__44u8_p7_1[] = { - 4, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 5, 6, 6, 7, 7, - 7, 7, 7, 7, 7, 7, 5, 6, 6, 7, 7, 7, 7, 7, 7, 7, - 7, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 6, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 8, 8, - 8, 8, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 7, 7, 7, - 8, 7, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 8, 8, 8, - 8, 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, - 7, 8, 8, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _44u8_p7_1 = { - 2, 121, - (char *)_vq_lengthlist__44u8_p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44u8_p7_1, - 0 -}; - -static const long _vq_quantlist__44u8_p8_0[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const char _vq_lengthlist__44u8_p8_0[] = { - 1, 4, 4, 7, 7, 8, 8, 8, 7, 9, 8,10, 9,11,10, 4, - 6, 6, 8, 8,10, 9, 9, 9,10,10,11,10,12,10, 4, 6, - 6, 8, 8,10,10, 9, 9,10,10,11,11,11,12, 7, 8, 8, - 10,10,11,11,11,10,12,11,12,12,13,11, 7, 8, 8,10, - 10,11,11,10,10,11,11,12,12,13,13, 8,10,10,11,11, - 12,11,12,11,13,12,13,12,14,13, 8,10, 9,11,11,12, - 12,12,12,12,12,13,13,14,13, 8, 9, 9,11,10,12,11, - 13,12,13,13,14,13,14,13, 8, 9, 9,10,11,12,12,12, - 12,13,13,14,15,14,14, 9,10,10,12,11,13,12,13,13, - 14,13,14,14,14,14, 9,10,10,12,12,12,12,13,13,14, - 14,14,15,14,14,10,11,11,13,12,13,12,14,14,14,14, - 14,14,15,15,10,11,11,12,12,13,13,14,14,14,15,15, - 14,16,15,11,12,12,13,12,14,14,14,13,15,14,15,15, - 15,17,11,12,12,13,13,14,14,14,15,15,14,15,15,14, - 17, -}; - -static const static_codebook _44u8_p8_0 = { - 2, 225, - (char *)_vq_lengthlist__44u8_p8_0, - 1, -520986624, 1620377600, 4, 0, - (long *)_vq_quantlist__44u8_p8_0, - 0 -}; - -static const long _vq_quantlist__44u8_p8_1[] = { - 10, - 9, - 11, - 8, - 12, - 7, - 13, - 6, - 14, - 5, - 15, - 4, - 16, - 3, - 17, - 2, - 18, - 1, - 19, - 0, - 20, -}; - -static const char _vq_lengthlist__44u8_p8_1[] = { - 4, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 6, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 6, 6, 7, 7, 8, - 8, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, - 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10, 9,10, 8, 8, - 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 9,10, - 10, 9,10, 8, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9,10, 9, - 10,10,10,10,10,10,10,10, 8, 9, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9,10,10,10,10, 9,10,10, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9,10, 9,10,10,10,10,10,10, - 10,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 9,10, - 10,10,10,10,10,10,10, 9, 9, 9, 9, 9, 9, 9,10, 9, - 10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10, - 10, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10, 9, 9, 9, 9, 9, 9, 9,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9, - 9, 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10, 9, 9, 9,10, 9,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9,10, - 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10, 9, - 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10, 9, 9, 9,10, 9,10, 9,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10, -}; - -static const static_codebook _44u8_p8_1 = { - 2, 441, - (char *)_vq_lengthlist__44u8_p8_1, - 1, -529268736, 1611661312, 5, 0, - (long *)_vq_quantlist__44u8_p8_1, - 0 -}; - -static const long _vq_quantlist__44u8_p9_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44u8_p9_0[] = { - 1, 3, 3, 9, 9, 9, 9, 9, 9, 4, 9, 9, 9, 9, 9, 9, - 9, 9, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, - 8, -}; - -static const static_codebook _44u8_p9_0 = { - 2, 81, - (char *)_vq_lengthlist__44u8_p9_0, - 1, -511895552, 1631393792, 4, 0, - (long *)_vq_quantlist__44u8_p9_0, - 0 -}; - -static const long _vq_quantlist__44u8_p9_1[] = { - 9, - 8, - 10, - 7, - 11, - 6, - 12, - 5, - 13, - 4, - 14, - 3, - 15, - 2, - 16, - 1, - 17, - 0, - 18, -}; - -static const char _vq_lengthlist__44u8_p9_1[] = { - 1, 4, 4, 7, 7, 8, 7, 8, 6, 9, 7,10, 8,11,10,11, - 11,11,11, 4, 7, 6, 9, 9,10, 9, 9, 9,10,10,11,10, - 11,10,11,11,13,11, 4, 7, 7, 9, 9, 9, 9, 9, 9,10, - 10,11,10,11,11,11,12,11,12, 7, 9, 8,11,11,11,11, - 10,10,11,11,12,12,12,12,12,12,14,13, 7, 8, 9,10, - 11,11,11,10,10,11,11,11,11,12,12,14,12,13,14, 8, - 9, 9,11,11,11,11,11,11,12,12,14,12,15,14,14,14, - 15,14, 8, 9, 9,11,11,11,11,12,11,12,12,13,13,13, - 13,13,13,14,14, 8, 9, 9,11,10,12,11,12,12,13,13, - 13,13,15,14,14,14,16,16, 8, 9, 9,10,11,11,12,12, - 12,13,13,13,14,14,14,15,16,15,15, 9,10,10,11,12, - 12,13,13,13,14,14,16,14,14,16,16,16,16,15, 9,10, - 10,11,11,12,13,13,14,15,14,16,14,15,16,16,16,16, - 15,10,11,11,12,13,13,14,15,15,15,15,15,16,15,16, - 15,16,15,15,10,11,11,13,13,14,13,13,15,14,15,15, - 16,15,15,15,16,15,16,10,12,12,14,14,14,14,14,16, - 16,15,15,15,16,16,16,16,16,16,11,12,12,14,14,14, - 14,15,15,16,15,16,15,16,15,16,16,16,16,12,12,13, - 14,14,15,16,16,16,16,16,16,15,16,16,16,16,16,16, - 12,13,13,14,14,14,14,15,16,15,16,16,16,16,16,16, - 16,16,16,12,13,14,14,14,16,15,16,15,16,16,16,16, - 16,16,16,16,16,16,12,14,13,14,15,15,15,16,15,16, - 16,15,16,16,16,16,16,16,16, -}; - -static const static_codebook _44u8_p9_1 = { - 2, 361, - (char *)_vq_lengthlist__44u8_p9_1, - 1, -518287360, 1622704128, 5, 0, - (long *)_vq_quantlist__44u8_p9_1, - 0 -}; - -static const long _vq_quantlist__44u8_p9_2[] = { - 24, - 23, - 25, - 22, - 26, - 21, - 27, - 20, - 28, - 19, - 29, - 18, - 30, - 17, - 31, - 16, - 32, - 15, - 33, - 14, - 34, - 13, - 35, - 12, - 36, - 11, - 37, - 10, - 38, - 9, - 39, - 8, - 40, - 7, - 41, - 6, - 42, - 5, - 43, - 4, - 44, - 3, - 45, - 2, - 46, - 1, - 47, - 0, - 48, -}; - -static const char _vq_lengthlist__44u8_p9_2[] = { - 2, 3, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, -}; - -static const static_codebook _44u8_p9_2 = { - 1, 49, - (char *)_vq_lengthlist__44u8_p9_2, - 1, -526909440, 1611661312, 6, 0, - (long *)_vq_quantlist__44u8_p9_2, - 0 -}; - -static const char _huff_lengthlist__44u9__long[] = { - 3, 9,13,13,14,15,14,14,15,15, 5, 5, 9,10,12,12, - 13,14,16,15,10, 6, 6, 6, 8,11,12,13,16,15,11, 7, - 5, 3, 5, 8,10,12,15,15,10,10, 7, 4, 3, 5, 8,10, - 12,12,12,12, 9, 7, 5, 4, 6, 8,10,13,13,12,11, 9, - 7, 5, 5, 6, 9,12,14,12,12,10, 8, 6, 6, 6, 7,11, - 13,12,14,13,10, 8, 7, 7, 7,10,11,11,12,13,12,11, - 10, 8, 8, 9, -}; - -static const static_codebook _huff_book__44u9__long = { - 2, 100, - (char *)_huff_lengthlist__44u9__long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const char _huff_lengthlist__44u9__short[] = { - 9,16,18,18,17,17,17,17,17,17, 5, 8,11,12,11,12, - 17,17,16,16, 6, 6, 8, 8, 9,10,14,15,16,16, 6, 7, - 7, 4, 6, 9,13,16,16,16, 6, 6, 7, 4, 5, 8,11,15, - 17,16, 7, 6, 7, 6, 6, 8, 9,10,14,16,11, 8, 8, 7, - 6, 6, 3, 4,10,15,14,12,12,10, 5, 6, 3, 3, 8,13, - 15,17,15,11, 6, 8, 6, 6, 9,14,17,15,15,12, 8,10, - 9, 9,12,15, -}; - -static const static_codebook _huff_book__44u9__short = { - 2, 100, - (char *)_huff_lengthlist__44u9__short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44u9_p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44u9_p1_0[] = { - 1, 5, 5, 5, 7, 7, 5, 7, 7, 5, 7, 7, 7, 9, 9, 7, - 9, 9, 5, 7, 7, 7, 9, 9, 7, 9, 9, 5, 7, 7, 7, 9, - 9, 7, 9, 9, 8, 9, 9, 9,10,11, 9,11,11, 7, 9, 9, - 9,11,10, 9,11,11, 5, 7, 7, 7, 9, 9, 8, 9,10, 7, - 9, 9, 9,11,11, 9,10,11, 7, 9,10, 9,11,11, 9,11, - 10, -}; - -static const static_codebook _44u9_p1_0 = { - 4, 81, - (char *)_vq_lengthlist__44u9_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u9_p1_0, - 0 -}; - -static const long _vq_quantlist__44u9_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44u9_p2_0[] = { - 3, 5, 5, 8, 8, 5, 7, 7, 9, 9, 6, 7, 7, 9, 9, 8, - 9, 9,11,10, 8, 9, 9,11,11, 6, 7, 7, 9, 9, 7, 8, - 8,10,10, 7, 8, 8, 9,10, 9,10,10,11,11, 9, 9,10, - 11,11, 6, 7, 7, 9, 9, 7, 8, 8,10, 9, 7, 8, 8,10, - 10, 9,10, 9,11,11, 9,10,10,11,11, 8, 9, 9,11,11, - 9,10,10,12,11, 9,10,10,11,12,11,11,11,13,13,11, - 11,11,12,13, 8, 9, 9,11,11, 9,10,10,11,11, 9,10, - 10,12,11,11,12,11,13,12,11,11,12,13,13, 6, 7, 7, - 9, 9, 7, 8, 8,10,10, 7, 8, 8,10,10, 9,10,10,12, - 11, 9,10,10,11,12, 7, 8, 8,10,10, 8, 9, 9,11,11, - 8, 9, 9,10,10,10,11,11,12,12,10,10,11,12,12, 7, - 8, 8,10,10, 8, 9, 8,10,10, 8, 9, 9,10,10,10,11, - 10,12,11,10,10,11,12,12, 9,10,10,11,12,10,11,11, - 12,12,10,11,10,12,12,12,12,12,13,13,11,12,12,13, - 13, 9,10,10,11,11, 9,10,10,12,12,10,11,11,12,13, - 11,12,11,13,12,12,12,12,13,14, 6, 7, 7, 9, 9, 7, - 8, 8,10,10, 7, 8, 8,10,10, 9,10,10,11,11, 9,10, - 10,11,12, 7, 8, 8,10,10, 8, 9, 9,11,10, 8, 8, 9, - 10,10,10,11,10,12,12,10,10,11,11,12, 7, 8, 8,10, - 10, 8, 9, 9,10,10, 8, 9, 9,10,10,10,11,10,12,12, - 10,11,10,12,12, 9,10,10,12,11,10,11,11,12,12, 9, - 10,10,12,12,12,12,12,13,13,11,11,12,12,14, 9,10, - 10,11,12,10,11,11,12,12,10,11,11,12,12,11,12,12, - 14,14,12,12,12,13,13, 8, 9, 9,11,11, 9,10,10,12, - 11, 9,10,10,12,12,11,12,11,13,13,11,11,12,13,13, - 9,10,10,12,12,10,11,11,12,12,10,11,11,12,12,12, - 12,12,14,14,12,12,12,13,13, 9,10,10,12,11,10,11, - 10,12,12,10,11,11,12,12,11,12,12,14,13,12,12,12, - 13,14,11,12,11,13,13,11,12,12,13,13,12,12,12,14, - 14,13,13,13,13,15,13,13,14,15,15,11,11,11,13,13, - 11,12,11,13,13,11,12,12,13,13,12,13,12,15,13,13, - 13,14,14,15, 8, 9, 9,11,11, 9,10,10,11,12, 9,10, - 10,11,12,11,12,11,13,13,11,12,12,13,13, 9,10,10, - 11,12,10,11,10,12,12,10,10,11,12,13,12,12,12,14, - 13,11,12,12,13,14, 9,10,10,12,12,10,11,11,12,12, - 10,11,11,12,12,12,12,12,14,13,12,12,12,14,13,11, - 11,11,13,13,11,12,12,14,13,11,11,12,13,13,13,13, - 13,15,14,12,12,13,13,15,11,12,12,13,13,12,12,12, - 13,14,11,12,12,13,13,13,13,14,14,15,13,13,13,14, - 14, -}; - -static const static_codebook _44u9_p2_0 = { - 4, 625, - (char *)_vq_lengthlist__44u9_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u9_p2_0, - 0 -}; - -static const long _vq_quantlist__44u9_p3_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44u9_p3_0[] = { - 3, 4, 4, 5, 5, 7, 7, 8, 8, 4, 5, 5, 6, 6, 7, 7, - 9, 9, 4, 4, 5, 6, 6, 7, 7, 9, 9, 5, 6, 6, 7, 7, - 8, 8, 9, 9, 5, 6, 6, 7, 7, 8, 8, 9, 9, 7, 7, 7, - 8, 8, 9, 9,10,10, 7, 7, 7, 8, 8, 9, 9,10,10, 8, - 9, 9,10, 9,10,10,11,11, 8, 9, 9, 9,10,10,10,11, - 11, -}; - -static const static_codebook _44u9_p3_0 = { - 2, 81, - (char *)_vq_lengthlist__44u9_p3_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44u9_p3_0, - 0 -}; - -static const long _vq_quantlist__44u9_p4_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const char _vq_lengthlist__44u9_p4_0[] = { - 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10,11, - 11, 5, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10, - 11,11, 5, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10, - 10,11,11, 6, 6, 6, 7, 6, 7, 7, 8, 8, 9, 9,10,10, - 11,11,12,11, 6, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9,10, - 10,11,11,11,12, 7, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, - 10,10,11,11,12,12, 7, 7, 7, 7, 7, 8, 8, 9, 9, 9, - 9,10,10,11,11,12,12, 8, 8, 8, 8, 8, 9, 8,10, 9, - 10,10,11,10,12,11,13,12, 8, 8, 8, 8, 8, 9, 9, 9, - 10,10,10,10,11,11,12,12,12, 8, 8, 8, 9, 9, 9, 9, - 10,10,11,10,12,11,12,12,13,12, 8, 8, 8, 9, 9, 9, - 9,10,10,10,11,11,11,12,12,12,13, 9, 9, 9,10,10, - 10,10,11,10,11,11,12,11,13,12,13,13, 9, 9,10,10, - 10,10,10,10,11,11,11,11,12,12,13,13,13,10,11,10, - 11,11,11,11,12,11,12,12,13,12,13,13,14,13,10,10, - 10,11,11,11,11,11,12,12,12,12,13,13,13,13,14,11, - 11,11,12,11,12,12,12,12,13,13,13,13,14,13,14,14, - 11,11,11,11,12,12,12,12,12,12,13,13,13,13,14,14, - 14, -}; - -static const static_codebook _44u9_p4_0 = { - 2, 289, - (char *)_vq_lengthlist__44u9_p4_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44u9_p4_0, - 0 -}; - -static const long _vq_quantlist__44u9_p5_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44u9_p5_0[] = { - 1, 4, 4, 5, 7, 7, 5, 7, 7, 5, 8, 8, 8, 9, 9, 7, - 9, 9, 5, 8, 8, 7, 9, 9, 8, 9, 9, 5, 8, 8, 8,10, - 10, 8,10,10, 7,10,10, 9,10,12, 9,11,11, 7,10,10, - 9,11,10, 9,11,12, 5, 8, 8, 8,10,10, 8,10,10, 7, - 10,10, 9,12,11, 9,10,11, 7,10,10, 9,11,11,10,12, - 10, -}; - -static const static_codebook _44u9_p5_0 = { - 4, 81, - (char *)_vq_lengthlist__44u9_p5_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44u9_p5_0, - 0 -}; - -static const long _vq_quantlist__44u9_p5_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__44u9_p5_1[] = { - 5, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 5, 6, 6, 6, 6, - 7, 7, 7, 7, 8, 7, 5, 6, 6, 6, 6, 7, 7, 7, 7, 7, - 7, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 6, 6, 6, 7, - 7, 7, 7, 7, 7, 8, 8, 7, 7, 7, 7, 7, 8, 7, 8, 8, - 8, 8, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, - 8, 7, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 8, 8, 8, 8, - 8, 8, 8, 7, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _44u9_p5_1 = { - 2, 121, - (char *)_vq_lengthlist__44u9_p5_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44u9_p5_1, - 0 -}; - -static const long _vq_quantlist__44u9_p6_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44u9_p6_0[] = { - 2, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10, 4, 6, 5, - 7, 7, 8, 8, 8, 8, 9, 9,10,10, 4, 5, 6, 7, 7, 8, - 8, 8, 8, 9, 9,10,10, 6, 7, 7, 8, 8, 8, 8, 9, 9, - 10,10,10,10, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10,10, - 10, 7, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11,11, 7, 8, - 8, 8, 8, 9, 9, 9, 9,10,10,11,11, 8, 8, 8, 9, 9, - 9, 9, 9,10,10,10,11,11, 8, 8, 8, 9, 9, 9, 9,10, - 9,10,10,11,11, 9, 9, 9,10,10,10,10,10,11,11,11, - 11,12, 9, 9, 9,10,10,10,10,10,10,11,10,12,11,10, - 10,10,10,10,11,11,11,11,11,12,12,12,10,10,10,10, - 10,11,11,11,11,12,11,12,12, -}; - -static const static_codebook _44u9_p6_0 = { - 2, 169, - (char *)_vq_lengthlist__44u9_p6_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44u9_p6_0, - 0 -}; - -static const long _vq_quantlist__44u9_p6_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44u9_p6_1[] = { - 4, 4, 4, 5, 5, 4, 5, 4, 5, 5, 4, 4, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44u9_p6_1 = { - 2, 25, - (char *)_vq_lengthlist__44u9_p6_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u9_p6_1, - 0 -}; - -static const long _vq_quantlist__44u9_p7_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44u9_p7_0[] = { - 1, 4, 5, 6, 6, 7, 7, 8, 9,10,10,11,11, 5, 6, 6, - 7, 7, 8, 8, 9, 9,10,10,11,11, 5, 6, 6, 7, 7, 8, - 8, 9, 9,10,10,11,11, 6, 7, 7, 8, 8, 9, 9,10,10, - 11,11,12,12, 6, 7, 7, 8, 8, 9, 9,10,10,11,11,12, - 12, 8, 8, 8, 9, 9,10,10,11,11,12,12,13,13, 8, 8, - 8, 9, 9,10,10,11,11,12,12,13,13, 9, 9, 9,10,10, - 11,11,12,12,13,13,13,13, 9, 9, 9,10,10,11,11,12, - 12,13,13,14,14,10,10,10,11,11,12,12,13,13,14,13, - 15,14,10,10,10,11,11,12,12,13,13,14,14,14,14,11, - 11,12,12,12,13,13,14,14,14,14,15,15,11,11,12,12, - 12,13,13,14,14,14,15,15,15, -}; - -static const static_codebook _44u9_p7_0 = { - 2, 169, - (char *)_vq_lengthlist__44u9_p7_0, - 1, -523206656, 1618345984, 4, 0, - (long *)_vq_quantlist__44u9_p7_0, - 0 -}; - -static const long _vq_quantlist__44u9_p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const char _vq_lengthlist__44u9_p7_1[] = { - 5, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 7, 7, - 7, 7, 7, 7, 7, 7, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 8, 8, 7, 7, 7, 7, 7, 7, 7, 8, 7, 8, 8, 7, 7, - 7, 7, 7, 7, 7, 8, 8, 8, 8, -}; - -static const static_codebook _44u9_p7_1 = { - 2, 121, - (char *)_vq_lengthlist__44u9_p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44u9_p7_1, - 0 -}; - -static const long _vq_quantlist__44u9_p8_0[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const char _vq_lengthlist__44u9_p8_0[] = { - 1, 4, 4, 7, 7, 8, 8, 8, 8, 9, 9,10, 9,11,10, 4, - 6, 6, 8, 8, 9, 9, 9, 9,10,10,11,10,12,10, 4, 6, - 6, 8, 8, 9,10, 9, 9,10,10,11,11,12,12, 7, 8, 8, - 10,10,11,11,10,10,11,11,12,12,13,12, 7, 8, 8,10, - 10,11,11,10,10,11,11,12,12,12,13, 8,10, 9,11,11, - 12,12,11,11,12,12,13,13,14,13, 8, 9, 9,11,11,12, - 12,11,12,12,12,13,13,14,13, 8, 9, 9,10,10,12,11, - 13,12,13,13,14,13,15,14, 8, 9, 9,10,10,11,12,12, - 12,13,13,13,14,14,14, 9,10,10,12,11,13,12,13,13, - 14,13,14,14,14,15, 9,10,10,11,12,12,12,13,13,14, - 14,14,15,15,15,10,11,11,12,12,13,13,14,14,14,14, - 15,14,16,15,10,11,11,12,12,13,13,13,14,14,14,14, - 14,15,16,11,12,12,13,13,14,13,14,14,15,14,15,16, - 16,16,11,12,12,13,13,14,13,14,14,15,15,15,16,15, - 15, -}; - -static const static_codebook _44u9_p8_0 = { - 2, 225, - (char *)_vq_lengthlist__44u9_p8_0, - 1, -520986624, 1620377600, 4, 0, - (long *)_vq_quantlist__44u9_p8_0, - 0 -}; - -static const long _vq_quantlist__44u9_p8_1[] = { - 10, - 9, - 11, - 8, - 12, - 7, - 13, - 6, - 14, - 5, - 15, - 4, - 16, - 3, - 17, - 2, - 18, - 1, - 19, - 0, - 20, -}; - -static const char _vq_lengthlist__44u9_p8_1[] = { - 4, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 6, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 6, 6, 6, 7, 7, 8, - 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, - 7, 7, 8, 8, 8, 8, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 9,10,10,10, 8, 8, - 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9,10,10, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 10, 9,10, 9,10,10,10,10, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9,10,10, 9,10,10,10,10,10, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9,10, 9,10,10,10,10,10,10, - 10,10, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, - 10,10,10,10,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10, - 10, 9, 9, 9, 9, 9, 9, 9,10, 9,10,10,10,10,10,10, - 10,10,10,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9,10,10, - 10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 9, 9, 9, 9,10, 9, 9,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10, 9, 9, 9,10, 9,10, 9,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10, 9, 9, 9,10, 9,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, 9, - 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10, 9, 9, 9,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10, -}; - -static const static_codebook _44u9_p8_1 = { - 2, 441, - (char *)_vq_lengthlist__44u9_p8_1, - 1, -529268736, 1611661312, 5, 0, - (long *)_vq_quantlist__44u9_p8_1, - 0 -}; - -static const long _vq_quantlist__44u9_p9_0[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const char _vq_lengthlist__44u9_p9_0[] = { - 1, 3, 3,11,11,11,11,11,11,11,11,11,11,11,11, 4, - 10,11,11,11,11,11,11,11,11,11,11,11,11,11, 4,10, - 10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10, -}; - -static const static_codebook _44u9_p9_0 = { - 2, 225, - (char *)_vq_lengthlist__44u9_p9_0, - 1, -510036736, 1631393792, 4, 0, - (long *)_vq_quantlist__44u9_p9_0, - 0 -}; - -static const long _vq_quantlist__44u9_p9_1[] = { - 9, - 8, - 10, - 7, - 11, - 6, - 12, - 5, - 13, - 4, - 14, - 3, - 15, - 2, - 16, - 1, - 17, - 0, - 18, -}; - -static const char _vq_lengthlist__44u9_p9_1[] = { - 1, 4, 4, 7, 7, 8, 7, 8, 7, 9, 8,10, 9,10,10,11, - 11,12,12, 4, 7, 6, 9, 9,10, 9, 9, 8,10,10,11,10, - 12,10,13,12,13,12, 4, 6, 6, 9, 9, 9, 9, 9, 9,10, - 10,11,11,11,12,12,12,12,12, 7, 9, 8,11,10,10,10, - 11,10,11,11,12,12,13,12,13,13,13,13, 7, 8, 9,10, - 10,11,11,10,10,11,11,11,12,13,13,13,13,14,14, 8, - 9, 9,11,11,12,11,12,12,13,12,12,13,13,14,15,14, - 14,14, 8, 9, 9,10,11,11,11,12,12,13,12,13,13,14, - 14,14,15,14,16, 8, 9, 9,11,10,12,12,12,12,15,13, - 13,13,17,14,15,15,15,14, 8, 9, 9,10,11,11,12,13, - 12,13,13,13,14,15,14,14,14,16,15, 9,11,10,12,12, - 13,13,13,13,14,14,16,15,14,14,14,15,15,17, 9,10, - 10,11,11,13,13,13,14,14,13,15,14,15,14,15,16,15, - 16,10,11,11,12,12,13,14,15,14,15,14,14,15,17,16, - 15,15,17,17,10,12,11,13,12,14,14,13,14,15,15,15, - 15,16,17,17,15,17,16,11,12,12,14,13,15,14,15,16, - 17,15,17,15,17,15,15,16,17,15,11,11,12,14,14,14, - 14,14,15,15,16,15,17,17,17,16,17,16,15,12,12,13, - 14,14,14,15,14,15,15,16,16,17,16,17,15,17,17,16, - 12,14,12,14,14,15,15,15,14,14,16,16,16,15,16,16, - 15,17,15,12,13,13,14,15,14,15,17,15,17,16,17,17, - 17,16,17,16,17,17,12,13,13,14,16,15,15,15,16,15, - 17,17,15,17,15,17,16,16,17, -}; - -static const static_codebook _44u9_p9_1 = { - 2, 361, - (char *)_vq_lengthlist__44u9_p9_1, - 1, -518287360, 1622704128, 5, 0, - (long *)_vq_quantlist__44u9_p9_1, - 0 -}; - -static const long _vq_quantlist__44u9_p9_2[] = { - 24, - 23, - 25, - 22, - 26, - 21, - 27, - 20, - 28, - 19, - 29, - 18, - 30, - 17, - 31, - 16, - 32, - 15, - 33, - 14, - 34, - 13, - 35, - 12, - 36, - 11, - 37, - 10, - 38, - 9, - 39, - 8, - 40, - 7, - 41, - 6, - 42, - 5, - 43, - 4, - 44, - 3, - 45, - 2, - 46, - 1, - 47, - 0, - 48, -}; - -static const char _vq_lengthlist__44u9_p9_2[] = { - 2, 4, 4, 5, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 7, 6, 7, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, -}; - -static const static_codebook _44u9_p9_2 = { - 1, 49, - (char *)_vq_lengthlist__44u9_p9_2, - 1, -526909440, 1611661312, 6, 0, - (long *)_vq_quantlist__44u9_p9_2, - 0 -}; - -static const char _huff_lengthlist__44un1__long[] = { - 5, 6,12, 9,14, 9, 9,19, 6, 1, 5, 5, 8, 7, 9,19, - 12, 4, 4, 7, 7, 9,11,18, 9, 5, 6, 6, 8, 7, 8,17, - 14, 8, 7, 8, 8,10,12,18, 9, 6, 8, 6, 8, 6, 8,18, - 9, 8,11, 8,11, 7, 5,15,16,18,18,18,17,15,11,18, -}; - -static const static_codebook _huff_book__44un1__long = { - 2, 64, - (char *)_huff_lengthlist__44un1__long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44un1__p1_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44un1__p1_0[] = { - 1, 4, 4, 5, 8, 7, 5, 7, 8, 5, 8, 8, 8,10,11, 8, - 10,11, 5, 8, 8, 8,11,10, 8,11,10, 4, 9, 9, 8,11, - 11, 8,11,11, 8,12,11,10,12,14,11,13,13, 7,11,11, - 10,13,11,11,13,14, 4, 8, 9, 8,11,11, 8,11,12, 7, - 11,11,11,14,13,10,11,13, 8,11,12,11,13,13,10,14, - 12, -}; - -static const static_codebook _44un1__p1_0 = { - 4, 81, - (char *)_vq_lengthlist__44un1__p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44un1__p1_0, - 0 -}; - -static const long _vq_quantlist__44un1__p2_0[] = { - 1, - 0, - 2, -}; - -static const char _vq_lengthlist__44un1__p2_0[] = { - 2, 4, 4, 5, 6, 6, 5, 6, 6, 5, 7, 7, 7, 8, 8, 6, - 7, 9, 5, 7, 7, 6, 8, 7, 7, 9, 8, 4, 7, 7, 7, 9, - 8, 7, 8, 8, 7, 9, 8, 8, 8,10, 9,10,10, 6, 8, 8, - 7,10, 8, 9,10,10, 5, 7, 7, 7, 8, 8, 7, 8, 9, 6, - 8, 8, 9,10,10, 7, 8,10, 6, 8, 9, 9,10,10, 8,10, - 8, -}; - -static const static_codebook _44un1__p2_0 = { - 4, 81, - (char *)_vq_lengthlist__44un1__p2_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44un1__p2_0, - 0 -}; - -static const long _vq_quantlist__44un1__p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44un1__p3_0[] = { - 1, 5, 5, 8, 8, 5, 8, 7, 9, 9, 5, 7, 8, 9, 9, 9, - 10, 9,12,12, 9, 9,10,11,12, 6, 8, 8,10,10, 8,10, - 10,11,11, 8, 9,10,11,11,10,11,11,13,13,10,11,11, - 12,13, 6, 8, 8,10,10, 8,10, 9,11,11, 8,10,10,11, - 11,10,11,11,13,12,10,11,11,13,12, 9,11,11,15,13, - 10,12,11,15,13,10,11,11,15,14,12,14,13,16,15,12, - 13,13,17,16, 9,11,11,13,15,10,11,12,14,15,10,11, - 12,14,15,12,13,13,15,16,12,13,13,16,16, 5, 8, 8, - 11,11, 8,10,10,12,12, 8,10,10,12,12,11,12,12,14, - 14,11,12,12,14,14, 8,11,10,13,12,10,11,12,12,13, - 10,12,12,13,13,12,12,13,13,15,11,12,13,15,14, 7, - 10,10,12,12, 9,12,11,13,12,10,12,12,13,14,12,13, - 12,15,13,11,13,12,14,15,10,12,12,16,14,11,12,12, - 16,15,11,13,12,17,16,13,13,15,15,17,13,15,15,20, - 17,10,12,12,14,16,11,12,12,15,15,11,13,13,15,18, - 13,14,13,15,15,13,15,14,16,16, 5, 8, 8,11,11, 8, - 10,10,12,12, 8,10,10,12,12,11,12,12,14,14,11,12, - 12,14,15, 7,10,10,13,12,10,12,12,14,13, 9,10,12, - 12,13,11,13,13,15,15,11,12,13,13,15, 8,10,10,12, - 13,10,12,12,13,13,10,12,11,13,13,11,13,12,15,15, - 12,13,12,15,13,10,12,12,16,14,11,12,12,16,15,10, - 12,12,16,14,14,15,14,18,16,13,13,14,15,16,10,12, - 12,14,16,11,13,13,16,16,11,13,12,14,16,13,15,15, - 18,18,13,15,13,16,14, 8,11,11,16,16,10,13,13,17, - 16,10,12,12,16,15,14,16,15,20,17,13,14,14,17,17, - 9,12,12,16,16,11,13,14,16,17,11,13,13,16,16,15, - 15,19,18, 0,14,15,15,18,18, 9,12,12,17,16,11,13, - 12,17,16,11,12,13,15,17,15,16,15, 0,19,14,15,14, - 19,18,12,14,14, 0,16,13,14,14,19,18,13,15,16,17, - 16,15,15,17,18, 0,14,16,16,19, 0,12,14,14,16,18, - 13,15,13,17,18,13,15,14,17,18,15,18,14,18,18,16, - 17,16, 0,17, 8,11,11,15,15,10,12,12,16,16,10,13, - 13,16,16,13,15,14,17,17,14,15,17,17,18, 9,12,12, - 16,15,11,13,13,16,16,11,12,13,17,17,14,14,15,17, - 17,14,15,16, 0,18, 9,12,12,16,17,11,13,13,16,17, - 11,14,13,18,17,14,16,14,17,17,15,17,17,18,18,12, - 14,14, 0,16,13,15,15,19, 0,12,13,15, 0, 0,14,17, - 16,19, 0,16,15,18,18, 0,12,14,14,17, 0,13,14,14, - 17, 0,13,15,14, 0,18,15,16,16, 0,18,15,18,15, 0, - 17, -}; - -static const static_codebook _44un1__p3_0 = { - 4, 625, - (char *)_vq_lengthlist__44un1__p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44un1__p3_0, - 0 -}; - -static const long _vq_quantlist__44un1__p4_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44un1__p4_0[] = { - 3, 5, 5, 9, 9, 5, 6, 6,10, 9, 5, 6, 6, 9,10,10, - 10,10,12,11, 9,10,10,12,12, 5, 7, 7,10,10, 7, 7, - 8,10,11, 7, 7, 8,10,11,10,10,11,11,13,10,10,11, - 11,13, 6, 7, 7,10,10, 7, 8, 7,11,10, 7, 8, 7,10, - 10,10,11, 9,13,11,10,11,10,13,11,10,10,10,14,13, - 10,11,11,14,13,10,10,11,13,14,12,12,13,15,15,12, - 12,13,13,14,10,10,10,12,13,10,11,10,13,13,10,11, - 11,13,13,12,13,12,14,13,12,13,13,14,13, 5, 7, 7, - 10,10, 7, 8, 8,11,10, 7, 8, 8,10,10,11,11,11,13, - 13,10,11,11,12,12, 7, 8, 8,11,11, 7, 8, 9,10,12, - 8, 9, 9,11,11,11,10,12,11,14,11,11,12,13,13, 6, - 8, 8,10,11, 7, 9, 7,12,10, 8, 9,10,11,12,10,12, - 10,14,11,11,12,11,13,13,10,11,11,14,14,10,10,11, - 13,14,11,12,12,15,13,12,11,14,12,16,12,13,14,15, - 16,10,10,11,13,14,10,11,10,14,12,11,12,12,13,14, - 12,13,11,15,12,14,14,14,15,15, 5, 7, 7,10,10, 7, - 8, 8,10,10, 7, 8, 8,10,11,10,11,10,12,12,10,11, - 11,12,13, 6, 8, 8,11,11, 8, 9, 9,12,11, 7, 7, 9, - 10,12,11,11,11,12,13,11,10,12,11,15, 7, 8, 8,11, - 11, 8, 9, 9,11,11, 7, 9, 8,12,10,11,12,11,13,12, - 11,12,10,15,11,10,11,10,14,12,11,12,11,14,13,10, - 10,11,13,14,13,13,13,17,15,12,11,14,12,15,10,10, - 11,13,14,11,12,12,14,14,10,11,10,14,13,13,14,13, - 16,17,12,14,11,16,12, 9,10,10,14,13,10,11,10,14, - 14,10,11,11,13,13,13,14,14,16,15,12,13,13,14,14, - 9,11,10,14,13,10,10,12,13,14,11,12,11,14,13,13, - 14,14,14,15,13,14,14,15,15, 9,10,11,13,14,10,11, - 10,15,13,11,11,12,12,15,13,14,12,15,14,13,13,14, - 14,15,12,13,12,16,14,11,11,12,15,14,13,15,13,16, - 14,13,12,15,12,17,15,16,15,16,16,12,12,13,13,15, - 11,13,11,15,14,13,13,14,15,17,13,14,12, 0,13,14, - 15,14,15, 0, 9,10,10,13,13,10,11,11,13,13,10,11, - 11,13,13,12,13,12,14,14,13,14,14,15,17, 9,10,10, - 13,13,11,12,11,15,12,10,10,11,13,16,13,14,13,15, - 14,13,13,14,15,16,10,10,11,13,14,11,11,12,13,14, - 10,12,11,14,14,13,13,13,14,15,13,15,13,16,15,12, - 13,12,15,13,12,15,13,15,15,11,11,13,14,15,15,15, - 15,15,17,13,12,14,13,17,12,12,14,14,15,13,13,14, - 14,16,11,13,11,16,15,14,16,16,17, 0,14,13,11,16, - 12, -}; - -static const static_codebook _44un1__p4_0 = { - 4, 625, - (char *)_vq_lengthlist__44un1__p4_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44un1__p4_0, - 0 -}; - -static const long _vq_quantlist__44un1__p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const char _vq_lengthlist__44un1__p5_0[] = { - 1, 4, 4, 7, 7, 8, 8, 9, 9, 4, 6, 5, 8, 7, 8, 8, - 10, 9, 4, 6, 6, 8, 8, 8, 8,10,10, 7, 8, 7, 9, 9, - 9, 9,11,10, 7, 8, 8, 9, 9, 9, 9,10,11, 8, 8, 8, - 9, 9,10,10,11,11, 8, 8, 8, 9, 9,10,10,11,11, 9, - 10,10,11,10,11,11,12,12, 9,10,10,10,11,11,11,12, - 12, -}; - -static const static_codebook _44un1__p5_0 = { - 2, 81, - (char *)_vq_lengthlist__44un1__p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44un1__p5_0, - 0 -}; - -static const long _vq_quantlist__44un1__p6_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44un1__p6_0[] = { - 1, 4, 4, 6, 6, 8, 8,10,10,11,11,15,15, 4, 5, 5, - 8, 8, 9, 9,11,11,12,12,16,16, 4, 5, 6, 8, 8, 9, - 9,11,11,12,12,14,14, 7, 8, 8, 9, 9,10,10,11,12, - 13,13,16,17, 7, 8, 8, 9, 9,10,10,12,12,12,13,15, - 15, 9,10,10,10,10,11,11,12,12,13,13,15,16, 9, 9, - 9,10,10,11,11,13,12,13,13,17,17,10,11,11,11,12, - 12,12,13,13,14,15, 0,18,10,11,11,12,12,12,13,14, - 13,14,14,17,16,11,12,12,13,13,14,14,14,14,15,16, - 17,16,11,12,12,13,13,14,14,14,14,15,15,17,17,14, - 15,15,16,16,16,17,17,16, 0,17, 0,18,14,15,15,16, - 16, 0,15,18,18, 0,16, 0, 0, -}; - -static const static_codebook _44un1__p6_0 = { - 2, 169, - (char *)_vq_lengthlist__44un1__p6_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44un1__p6_0, - 0 -}; - -static const long _vq_quantlist__44un1__p6_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44un1__p6_1[] = { - 2, 4, 4, 5, 5, 4, 5, 5, 5, 5, 4, 5, 5, 6, 5, 5, - 6, 5, 6, 6, 5, 6, 6, 6, 6, -}; - -static const static_codebook _44un1__p6_1 = { - 2, 25, - (char *)_vq_lengthlist__44un1__p6_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44un1__p6_1, - 0 -}; - -static const long _vq_quantlist__44un1__p7_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const char _vq_lengthlist__44un1__p7_0[] = { - 1, 5, 3,11,11,11,11,11,11,11, 8,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11, 8,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11, 7,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10, -}; - -static const static_codebook _44un1__p7_0 = { - 4, 625, - (char *)_vq_lengthlist__44un1__p7_0, - 1, -518709248, 1626677248, 3, 0, - (long *)_vq_quantlist__44un1__p7_0, - 0 -}; - -static const long _vq_quantlist__44un1__p7_1[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44un1__p7_1[] = { - 1, 4, 4, 6, 6, 6, 6, 9, 8, 9, 8, 8, 8, 5, 7, 7, - 7, 7, 8, 8, 8,10, 8,10, 8, 9, 5, 7, 7, 8, 7, 7, - 8,10,10,11,10,12,11, 7, 8, 8, 9, 9, 9,10,11,11, - 11,11,11,11, 7, 8, 8, 8, 9, 9, 9,10,10,10,11,11, - 12, 7, 8, 8, 9, 9,10,11,11,12,11,12,11,11, 7, 8, - 8, 9, 9,10,10,11,11,11,12,12,11, 8,10,10,10,10, - 11,11,14,11,12,12,12,13, 9,10,10,10,10,12,11,14, - 11,14,11,12,13,10,11,11,11,11,13,11,14,14,13,13, - 13,14,11,11,11,12,11,12,12,12,13,14,14,13,14,12, - 11,12,12,12,12,13,13,13,14,13,14,14,11,12,12,14, - 12,13,13,12,13,13,14,14,14, -}; - -static const static_codebook _44un1__p7_1 = { - 2, 169, - (char *)_vq_lengthlist__44un1__p7_1, - 1, -523010048, 1618608128, 4, 0, - (long *)_vq_quantlist__44un1__p7_1, - 0 -}; - -static const long _vq_quantlist__44un1__p7_2[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const char _vq_lengthlist__44un1__p7_2[] = { - 3, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9, 9, 8, 4, 5, 5, - 6, 6, 8, 8, 9, 8, 9, 9, 9, 9, 4, 5, 5, 7, 6, 8, - 8, 8, 8, 9, 8, 9, 8, 6, 7, 7, 7, 8, 8, 8, 9, 9, - 9, 9, 9, 9, 6, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, - 9, 7, 8, 8, 8, 8, 9, 8, 9, 9,10, 9, 9,10, 7, 8, - 8, 8, 8, 9, 9, 9, 9, 9, 9,10,10, 8, 9, 9, 9, 9, - 9, 9, 9, 9,10,10, 9,10, 8, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9,10,10, 9, 9, 9,10, 9, 9,10, 9, 9,10,10, - 10,10, 9, 9, 9, 9, 9, 9, 9,10, 9,10,10,10,10, 9, - 9, 9,10, 9, 9,10,10, 9,10,10,10,10, 9, 9, 9,10, - 9, 9, 9,10,10,10,10,10,10, -}; - -static const static_codebook _44un1__p7_2 = { - 2, 169, - (char *)_vq_lengthlist__44un1__p7_2, - 1, -531103744, 1611661312, 4, 0, - (long *)_vq_quantlist__44un1__p7_2, - 0 -}; - -static const char _huff_lengthlist__44un1__short[] = { - 12,12,14,12,14,14,14,14,12, 6, 6, 8, 9, 9,11,14, - 12, 4, 2, 6, 6, 7,11,14,13, 6, 5, 7, 8, 9,11,14, - 13, 8, 5, 8, 6, 8,12,14,12, 7, 7, 8, 8, 8,10,14, - 12, 6, 3, 4, 4, 4, 7,14,11, 7, 4, 6, 6, 6, 8,14, -}; - -static const static_codebook _huff_book__44un1__short = { - 2, 64, - (char *)_huff_lengthlist__44un1__short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/codebook.c b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/codebook.c deleted file mode 100644 index 72f8a17a..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/codebook.c +++ /dev/null @@ -1,490 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2015 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: basic codebook pack/unpack/code/decode operations - last mod: $Id: codebook.c 19457 2015-03-03 00:15:29Z giles $ - - ********************************************************************/ - -#include -#include -#include -#include -#include "vorbis/codec.h" -#include "codebook.h" -#include "scales.h" -#include "misc.h" -#include "os.h" - -/* packs the given codebook into the bitstream **************************/ - -int vorbis_staticbook_pack(const static_codebook *c,oggpack_buffer *opb){ - long i,j; - int ordered=0; - - /* first the basic parameters */ - oggpack_write(opb,0x564342,24); - oggpack_write(opb,c->dim,16); - oggpack_write(opb,c->entries,24); - - /* pack the codewords. There are two packings; length ordered and - length random. Decide between the two now. */ - - for(i=1;ientries;i++) - if(c->lengthlist[i-1]==0 || c->lengthlist[i]lengthlist[i-1])break; - if(i==c->entries)ordered=1; - - if(ordered){ - /* length ordered. We only need to say how many codewords of - each length. The actual codewords are generated - deterministically */ - - long count=0; - oggpack_write(opb,1,1); /* ordered */ - oggpack_write(opb,c->lengthlist[0]-1,5); /* 1 to 32 */ - - for(i=1;ientries;i++){ - char this=c->lengthlist[i]; - char last=c->lengthlist[i-1]; - if(this>last){ - for(j=last;jentries-count)); - count=i; - } - } - } - oggpack_write(opb,i-count,ov_ilog(c->entries-count)); - - }else{ - /* length random. Again, we don't code the codeword itself, just - the length. This time, though, we have to encode each length */ - oggpack_write(opb,0,1); /* unordered */ - - /* algortihmic mapping has use for 'unused entries', which we tag - here. The algorithmic mapping happens as usual, but the unused - entry has no codeword. */ - for(i=0;ientries;i++) - if(c->lengthlist[i]==0)break; - - if(i==c->entries){ - oggpack_write(opb,0,1); /* no unused entries */ - for(i=0;ientries;i++) - oggpack_write(opb,c->lengthlist[i]-1,5); - }else{ - oggpack_write(opb,1,1); /* we have unused entries; thus we tag */ - for(i=0;ientries;i++){ - if(c->lengthlist[i]==0){ - oggpack_write(opb,0,1); - }else{ - oggpack_write(opb,1,1); - oggpack_write(opb,c->lengthlist[i]-1,5); - } - } - } - } - - /* is the entry number the desired return value, or do we have a - mapping? If we have a mapping, what type? */ - oggpack_write(opb,c->maptype,4); - switch(c->maptype){ - case 0: - /* no mapping */ - break; - case 1:case 2: - /* implicitly populated value mapping */ - /* explicitly populated value mapping */ - - if(!c->quantlist){ - /* no quantlist? error */ - return(-1); - } - - /* values that define the dequantization */ - oggpack_write(opb,c->q_min,32); - oggpack_write(opb,c->q_delta,32); - oggpack_write(opb,c->q_quant-1,4); - oggpack_write(opb,c->q_sequencep,1); - - { - int quantvals; - switch(c->maptype){ - case 1: - /* a single column of (c->entries/c->dim) quantized values for - building a full value list algorithmically (square lattice) */ - quantvals=_book_maptype1_quantvals(c); - break; - case 2: - /* every value (c->entries*c->dim total) specified explicitly */ - quantvals=c->entries*c->dim; - break; - default: /* NOT_REACHABLE */ - quantvals=-1; - } - - /* quantized values */ - for(i=0;iquantlist[i]),c->q_quant); - - } - break; - default: - /* error case; we don't have any other map types now */ - return(-1); - } - - return(0); -} - -/* unpacks a codebook from the packet buffer into the codebook struct, - readies the codebook auxiliary structures for decode *************/ -static_codebook *vorbis_staticbook_unpack(oggpack_buffer *opb){ - long i,j; - static_codebook *s=_ogg_calloc(1,sizeof(*s)); - s->allocedp=1; - - /* make sure alignment is correct */ - if(oggpack_read(opb,24)!=0x564342)goto _eofout; - - /* first the basic parameters */ - s->dim=oggpack_read(opb,16); - s->entries=oggpack_read(opb,24); - if(s->entries==-1)goto _eofout; - - if(ov_ilog(s->dim)+ov_ilog(s->entries)>24)goto _eofout; - - /* codeword ordering.... length ordered or unordered? */ - switch((int)oggpack_read(opb,1)){ - case 0:{ - long unused; - /* allocated but unused entries? */ - unused=oggpack_read(opb,1); - if((s->entries*(unused?1:5)+7)>>3>opb->storage-oggpack_bytes(opb)) - goto _eofout; - /* unordered */ - s->lengthlist=_ogg_malloc(sizeof(*s->lengthlist)*s->entries); - - /* allocated but unused entries? */ - if(unused){ - /* yes, unused entries */ - - for(i=0;ientries;i++){ - if(oggpack_read(opb,1)){ - long num=oggpack_read(opb,5); - if(num==-1)goto _eofout; - s->lengthlist[i]=num+1; - }else - s->lengthlist[i]=0; - } - }else{ - /* all entries used; no tagging */ - for(i=0;ientries;i++){ - long num=oggpack_read(opb,5); - if(num==-1)goto _eofout; - s->lengthlist[i]=num+1; - } - } - - break; - } - case 1: - /* ordered */ - { - long length=oggpack_read(opb,5)+1; - if(length==0)goto _eofout; - s->lengthlist=_ogg_malloc(sizeof(*s->lengthlist)*s->entries); - - for(i=0;ientries;){ - long num=oggpack_read(opb,ov_ilog(s->entries-i)); - if(num==-1)goto _eofout; - if(length>32 || num>s->entries-i || - (num>0 && (num-1)>>(length-1)>1)){ - goto _errout; - } - if(length>32)goto _errout; - for(j=0;jlengthlist[i]=length; - length++; - } - } - break; - default: - /* EOF */ - goto _eofout; - } - - /* Do we have a mapping to unpack? */ - switch((s->maptype=oggpack_read(opb,4))){ - case 0: - /* no mapping */ - break; - case 1: case 2: - /* implicitly populated value mapping */ - /* explicitly populated value mapping */ - - s->q_min=oggpack_read(opb,32); - s->q_delta=oggpack_read(opb,32); - s->q_quant=oggpack_read(opb,4)+1; - s->q_sequencep=oggpack_read(opb,1); - if(s->q_sequencep==-1)goto _eofout; - - { - int quantvals=0; - switch(s->maptype){ - case 1: - quantvals=(s->dim==0?0:_book_maptype1_quantvals(s)); - break; - case 2: - quantvals=s->entries*s->dim; - break; - } - - /* quantized values */ - if(((quantvals*s->q_quant+7)>>3)>opb->storage-oggpack_bytes(opb)) - goto _eofout; - s->quantlist=_ogg_malloc(sizeof(*s->quantlist)*quantvals); - for(i=0;iquantlist[i]=oggpack_read(opb,s->q_quant); - - if(quantvals&&s->quantlist[quantvals-1]==-1)goto _eofout; - } - break; - default: - goto _errout; - } - - /* all set */ - return(s); - - _errout: - _eofout: - vorbis_staticbook_destroy(s); - return(NULL); -} - -/* returns the number of bits ************************************************/ -int vorbis_book_encode(codebook *book, int a, oggpack_buffer *b){ - if(a<0 || a>=book->c->entries)return(0); - oggpack_write(b,book->codelist[a],book->c->lengthlist[a]); - return(book->c->lengthlist[a]); -} - -/* the 'eliminate the decode tree' optimization actually requires the - codewords to be MSb first, not LSb. This is an annoying inelegancy - (and one of the first places where carefully thought out design - turned out to be wrong; Vorbis II and future Ogg codecs should go - to an MSb bitpacker), but not actually the huge hit it appears to - be. The first-stage decode table catches most words so that - bitreverse is not in the main execution path. */ - -static ogg_uint32_t bitreverse(ogg_uint32_t x){ - x= ((x>>16)&0x0000ffff) | ((x<<16)&0xffff0000); - x= ((x>> 8)&0x00ff00ff) | ((x<< 8)&0xff00ff00); - x= ((x>> 4)&0x0f0f0f0f) | ((x<< 4)&0xf0f0f0f0); - x= ((x>> 2)&0x33333333) | ((x<< 2)&0xcccccccc); - return((x>> 1)&0x55555555) | ((x<< 1)&0xaaaaaaaa); -} - -STIN long decode_packed_entry_number(codebook *book, oggpack_buffer *b){ - int read=book->dec_maxlength; - long lo,hi; - long lok = oggpack_look(b,book->dec_firsttablen); - - if (lok >= 0) { - long entry = book->dec_firsttable[lok]; - if(entry&0x80000000UL){ - lo=(entry>>15)&0x7fff; - hi=book->used_entries-(entry&0x7fff); - }else{ - oggpack_adv(b, book->dec_codelengths[entry-1]); - return(entry-1); - } - }else{ - lo=0; - hi=book->used_entries; - } - - /* Single entry codebooks use a firsttablen of 1 and a - dec_maxlength of 1. If a single-entry codebook gets here (due to - failure to read one bit above), the next look attempt will also - fail and we'll correctly kick out instead of trying to walk the - underformed tree */ - - lok = oggpack_look(b, read); - - while(lok<0 && read>1) - lok = oggpack_look(b, --read); - if(lok<0)return -1; - - /* bisect search for the codeword in the ordered list */ - { - ogg_uint32_t testword=bitreverse((ogg_uint32_t)lok); - - while(hi-lo>1){ - long p=(hi-lo)>>1; - long test=book->codelist[lo+p]>testword; - lo+=p&(test-1); - hi-=p&(-test); - } - - if(book->dec_codelengths[lo]<=read){ - oggpack_adv(b, book->dec_codelengths[lo]); - return(lo); - } - } - - oggpack_adv(b, read); - - return(-1); -} - -/* Decode side is specced and easier, because we don't need to find - matches using different criteria; we simply read and map. There are - two things we need to do 'depending': - - We may need to support interleave. We don't really, but it's - convenient to do it here rather than rebuild the vector later. - - Cascades may be additive or multiplicitive; this is not inherent in - the codebook, but set in the code using the codebook. Like - interleaving, it's easiest to do it here. - addmul==0 -> declarative (set the value) - addmul==1 -> additive - addmul==2 -> multiplicitive */ - -/* returns the [original, not compacted] entry number or -1 on eof *********/ -long vorbis_book_decode(codebook *book, oggpack_buffer *b){ - if(book->used_entries>0){ - long packed_entry=decode_packed_entry_number(book,b); - if(packed_entry>=0) - return(book->dec_index[packed_entry]); - } - - /* if there's no dec_index, the codebook unpacking isn't collapsed */ - return(-1); -} - -/* returns 0 on OK or -1 on eof *************************************/ -/* decode vector / dim granularity gaurding is done in the upper layer */ -long vorbis_book_decodevs_add(codebook *book,float *a,oggpack_buffer *b,int n){ - if(book->used_entries>0){ - int step=n/book->dim; - long *entry = alloca(sizeof(*entry)*step); - float **t = alloca(sizeof(*t)*step); - int i,j,o; - - for (i = 0; i < step; i++) { - entry[i]=decode_packed_entry_number(book,b); - if(entry[i]==-1)return(-1); - t[i] = book->valuelist+entry[i]*book->dim; - } - for(i=0,o=0;idim;i++,o+=step) - for (j=0;jused_entries>0){ - int i,j,entry; - float *t; - - if(book->dim>8){ - for(i=0;ivaluelist+entry*book->dim; - for (j=0;jdim;) - a[i++]+=t[j++]; - } - }else{ - for(i=0;ivaluelist+entry*book->dim; - j=0; - switch((int)book->dim){ - case 8: - a[i++]+=t[j++]; - case 7: - a[i++]+=t[j++]; - case 6: - a[i++]+=t[j++]; - case 5: - a[i++]+=t[j++]; - case 4: - a[i++]+=t[j++]; - case 3: - a[i++]+=t[j++]; - case 2: - a[i++]+=t[j++]; - case 1: - a[i++]+=t[j++]; - case 0: - break; - } - } - } - } - return(0); -} - -/* unlike the others, we guard against n not being an integer number - of internally rather than in the upper layer (called only by - floor0) */ -long vorbis_book_decodev_set(codebook *book,float *a,oggpack_buffer *b,int n){ - if(book->used_entries>0){ - int i,j,entry; - float *t; - - for(i=0;ivaluelist+entry*book->dim; - for (j=0;idim;){ - a[i++]=t[j++]; - } - } - }else{ - int i; - - for(i=0;iused_entries>0){ - for(i=offset/ch;i<(offset+n)/ch;){ - entry = decode_packed_entry_number(book,b); - if(entry==-1)return(-1); - { - const float *t = book->valuelist+entry*book->dim; - for (j=0;jdim;j++){ - a[chptr++][i]+=t[j]; - if(chptr==ch){ - chptr=0; - i++; - } - } - } - } - } - return(0); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/codebook.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/codebook.h deleted file mode 100644 index 537d6c12..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/codebook.h +++ /dev/null @@ -1,118 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2015 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: basic shared codebook operations - last mod: $Id: codebook.h 19457 2015-03-03 00:15:29Z giles $ - - ********************************************************************/ - -#ifndef _V_CODEBOOK_H_ -#define _V_CODEBOOK_H_ - -#include - -/* This structure encapsulates huffman and VQ style encoding books; it - doesn't do anything specific to either. - - valuelist/quantlist are nonNULL (and q_* significant) only if - there's entry->value mapping to be done. - - If encode-side mapping must be done (and thus the entry needs to be - hunted), the auxiliary encode pointer will point to a decision - tree. This is true of both VQ and huffman, but is mostly useful - with VQ. - -*/ - -typedef struct static_codebook{ - long dim; /* codebook dimensions (elements per vector) */ - long entries; /* codebook entries */ - char *lengthlist; /* codeword lengths in bits */ - - /* mapping ***************************************************************/ - int maptype; /* 0=none - 1=implicitly populated values from map column - 2=listed arbitrary values */ - - /* The below does a linear, single monotonic sequence mapping. */ - long q_min; /* packed 32 bit float; quant value 0 maps to minval */ - long q_delta; /* packed 32 bit float; val 1 - val 0 == delta */ - int q_quant; /* bits: 0 < quant <= 16 */ - int q_sequencep; /* bitflag */ - - long *quantlist; /* map == 1: (int)(entries^(1/dim)) element column map - map == 2: list of dim*entries quantized entry vals - */ - int allocedp; -} static_codebook; - -typedef struct codebook{ - long dim; /* codebook dimensions (elements per vector) */ - long entries; /* codebook entries */ - long used_entries; /* populated codebook entries */ - const static_codebook *c; - - /* for encode, the below are entry-ordered, fully populated */ - /* for decode, the below are ordered by bitreversed codeword and only - used entries are populated */ - float *valuelist; /* list of dim*entries actual entry values */ - ogg_uint32_t *codelist; /* list of bitstream codewords for each entry */ - - int *dec_index; /* only used if sparseness collapsed */ - char *dec_codelengths; - ogg_uint32_t *dec_firsttable; - int dec_firsttablen; - int dec_maxlength; - - /* The current encoder uses only centered, integer-only lattice books. */ - int quantvals; - int minval; - int delta; -} codebook; - -extern void vorbis_staticbook_destroy(static_codebook *b); -extern int vorbis_book_init_encode(codebook *dest,const static_codebook *source); -extern int vorbis_book_init_decode(codebook *dest,const static_codebook *source); -extern void vorbis_book_clear(codebook *b); - -extern float *_book_unquantize(const static_codebook *b,int n,int *map); -extern float *_book_logdist(const static_codebook *b,float *vals); -extern float _float32_unpack(long val); -extern long _float32_pack(float val); -extern int _best(codebook *book, float *a, int step); -extern long _book_maptype1_quantvals(const static_codebook *b); - -extern int vorbis_book_besterror(codebook *book,float *a,int step,int addmul); -extern long vorbis_book_codeword(codebook *book,int entry); -extern long vorbis_book_codelen(codebook *book,int entry); - - - -extern int vorbis_staticbook_pack(const static_codebook *c,oggpack_buffer *b); -extern static_codebook *vorbis_staticbook_unpack(oggpack_buffer *b); - -extern int vorbis_book_encode(codebook *book, int a, oggpack_buffer *b); - -extern long vorbis_book_decode(codebook *book, oggpack_buffer *b); -extern long vorbis_book_decodevs_add(codebook *book, float *a, - oggpack_buffer *b,int n); -extern long vorbis_book_decodev_set(codebook *book, float *a, - oggpack_buffer *b,int n); -extern long vorbis_book_decodev_add(codebook *book, float *a, - oggpack_buffer *b,int n); -extern long vorbis_book_decodevv_add(codebook *book, float **a, - long off,int ch, - oggpack_buffer *b,int n); - - - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/codec_internal.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/codec_internal.h deleted file mode 100644 index de1bccae..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/codec_internal.h +++ /dev/null @@ -1,167 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: libvorbis codec headers - last mod: $Id: codec_internal.h 16227 2009-07-08 06:58:46Z xiphmont $ - - ********************************************************************/ - -#ifndef _V_CODECI_H_ -#define _V_CODECI_H_ - -#include "envelope.h" -#include "codebook.h" - -#define BLOCKTYPE_IMPULSE 0 -#define BLOCKTYPE_PADDING 1 -#define BLOCKTYPE_TRANSITION 0 -#define BLOCKTYPE_LONG 1 - -#define PACKETBLOBS 15 - -typedef struct vorbis_block_internal{ - float **pcmdelay; /* this is a pointer into local storage */ - float ampmax; - int blocktype; - - oggpack_buffer *packetblob[PACKETBLOBS]; /* initialized, must be freed; - blob [PACKETBLOBS/2] points to - the oggpack_buffer in the - main vorbis_block */ -} vorbis_block_internal; - -typedef void vorbis_look_floor; -typedef void vorbis_look_residue; -typedef void vorbis_look_transform; - -/* mode ************************************************************/ -typedef struct { - int blockflag; - int windowtype; - int transformtype; - int mapping; -} vorbis_info_mode; - -typedef void vorbis_info_floor; -typedef void vorbis_info_residue; -typedef void vorbis_info_mapping; - -#include "psy.h" -#include "bitrate.h" - -typedef struct private_state { - /* local lookup storage */ - envelope_lookup *ve; /* envelope lookup */ - int window[2]; - vorbis_look_transform **transform[2]; /* block, type */ - drft_lookup fft_look[2]; - - int modebits; - vorbis_look_floor **flr; - vorbis_look_residue **residue; - vorbis_look_psy *psy; - vorbis_look_psy_global *psy_g_look; - - /* local storage, only used on the encoding side. This way the - application does not need to worry about freeing some packets' - memory and not others'; packet storage is always tracked. - Cleared next call to a _dsp_ function */ - unsigned char *header; - unsigned char *header1; - unsigned char *header2; - - bitrate_manager_state bms; - - ogg_int64_t sample_count; -} private_state; - -/* codec_setup_info contains all the setup information specific to the - specific compression/decompression mode in progress (eg, - psychoacoustic settings, channel setup, options, codebook - etc). -*********************************************************************/ - -#include "highlevel.h" -typedef struct codec_setup_info { - - /* Vorbis supports only short and long blocks, but allows the - encoder to choose the sizes */ - - long blocksizes[2]; - - /* modes are the primary means of supporting on-the-fly different - blocksizes, different channel mappings (LR or M/A), - different residue backends, etc. Each mode consists of a - blocksize flag and a mapping (along with the mapping setup */ - - int modes; - int maps; - int floors; - int residues; - int books; - int psys; /* encode only */ - - vorbis_info_mode *mode_param[64]; - int map_type[64]; - vorbis_info_mapping *map_param[64]; - int floor_type[64]; - vorbis_info_floor *floor_param[64]; - int residue_type[64]; - vorbis_info_residue *residue_param[64]; - static_codebook *book_param[256]; - codebook *fullbooks; - - vorbis_info_psy *psy_param[4]; /* encode only */ - vorbis_info_psy_global psy_g_param; - - bitrate_manager_info bi; - highlevel_encode_setup hi; /* used only by vorbisenc.c. It's a - highly redundant structure, but - improves clarity of program flow. */ - int halfrate_flag; /* painless downsample for decode */ -} codec_setup_info; - -extern vorbis_look_psy_global *_vp_global_look(vorbis_info *vi); -extern void _vp_global_free(vorbis_look_psy_global *look); - - - -typedef struct { - int sorted_index[VIF_POSIT+2]; - int forward_index[VIF_POSIT+2]; - int reverse_index[VIF_POSIT+2]; - - int hineighbor[VIF_POSIT]; - int loneighbor[VIF_POSIT]; - int posts; - - int n; - int quant_q; - vorbis_info_floor1 *vi; - - long phrasebits; - long postbits; - long frames; -} vorbis_look_floor1; - - - -extern int *floor1_fit(vorbis_block *vb,vorbis_look_floor1 *look, - const float *logmdct, /* in */ - const float *logmask); -extern int *floor1_interpolate_fit(vorbis_block *vb,vorbis_look_floor1 *look, - int *A,int *B, - int del); -extern int floor1_encode(oggpack_buffer *opb,vorbis_block *vb, - vorbis_look_floor1 *look, - int *post,int *ilogmask); -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/envelope.c b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/envelope.c deleted file mode 100644 index 010c66e2..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/envelope.c +++ /dev/null @@ -1,375 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: PCM data envelope analysis - last mod: $Id: envelope.c 16227 2009-07-08 06:58:46Z xiphmont $ - - ********************************************************************/ - -#include -#include -#include -#include -#include -#include "vorbis/codec.h" -#include "codec_internal.h" - -#include "os.h" -#include "scales.h" -#include "envelope.h" -#include "mdct.h" -#include "misc.h" - -void _ve_envelope_init(envelope_lookup *e,vorbis_info *vi){ - codec_setup_info *ci=vi->codec_setup; - vorbis_info_psy_global *gi=&ci->psy_g_param; - int ch=vi->channels; - int i,j; - int n=e->winlength=128; - e->searchstep=64; /* not random */ - - e->minenergy=gi->preecho_minenergy; - e->ch=ch; - e->storage=128; - e->cursor=ci->blocksizes[1]/2; - e->mdct_win=_ogg_calloc(n,sizeof(*e->mdct_win)); - mdct_init(&e->mdct,n); - - for(i=0;imdct_win[i]=sin(i/(n-1.)*M_PI); - e->mdct_win[i]*=e->mdct_win[i]; - } - - /* magic follows */ - e->band[0].begin=2; e->band[0].end=4; - e->band[1].begin=4; e->band[1].end=5; - e->band[2].begin=6; e->band[2].end=6; - e->band[3].begin=9; e->band[3].end=8; - e->band[4].begin=13; e->band[4].end=8; - e->band[5].begin=17; e->band[5].end=8; - e->band[6].begin=22; e->band[6].end=8; - - for(j=0;jband[j].end; - e->band[j].window=_ogg_malloc(n*sizeof(*e->band[0].window)); - for(i=0;iband[j].window[i]=sin((i+.5)/n*M_PI); - e->band[j].total+=e->band[j].window[i]; - } - e->band[j].total=1./e->band[j].total; - } - - e->filter=_ogg_calloc(VE_BANDS*ch,sizeof(*e->filter)); - e->mark=_ogg_calloc(e->storage,sizeof(*e->mark)); - -} - -void _ve_envelope_clear(envelope_lookup *e){ - int i; - mdct_clear(&e->mdct); - for(i=0;iband[i].window); - _ogg_free(e->mdct_win); - _ogg_free(e->filter); - _ogg_free(e->mark); - memset(e,0,sizeof(*e)); -} - -/* fairly straight threshhold-by-band based until we find something - that works better and isn't patented. */ - -static int _ve_amp(envelope_lookup *ve, - vorbis_info_psy_global *gi, - float *data, - envelope_band *bands, - envelope_filter_state *filters){ - long n=ve->winlength; - int ret=0; - long i,j; - float decay; - - /* we want to have a 'minimum bar' for energy, else we're just - basing blocks on quantization noise that outweighs the signal - itself (for low power signals) */ - - float minV=ve->minenergy; - float *vec=alloca(n*sizeof(*vec)); - - /* stretch is used to gradually lengthen the number of windows - considered prevoius-to-potential-trigger */ - int stretch=max(VE_MINSTRETCH,ve->stretch/2); - float penalty=gi->stretch_penalty-(ve->stretch/2-VE_MINSTRETCH); - if(penalty<0.f)penalty=0.f; - if(penalty>gi->stretch_penalty)penalty=gi->stretch_penalty; - - /*_analysis_output_always("lpcm",seq2,data,n,0,0, - totalshift+pos*ve->searchstep);*/ - - /* window and transform */ - for(i=0;imdct_win[i]; - mdct_forward(&ve->mdct,vec,vec); - - /*_analysis_output_always("mdct",seq2,vec,n/2,0,1,0); */ - - /* near-DC spreading function; this has nothing to do with - psychoacoustics, just sidelobe leakage and window size */ - { - float temp=vec[0]*vec[0]+.7*vec[1]*vec[1]+.2*vec[2]*vec[2]; - int ptr=filters->nearptr; - - /* the accumulation is regularly refreshed from scratch to avoid - floating point creep */ - if(ptr==0){ - decay=filters->nearDC_acc=filters->nearDC_partialacc+temp; - filters->nearDC_partialacc=temp; - }else{ - decay=filters->nearDC_acc+=temp; - filters->nearDC_partialacc+=temp; - } - filters->nearDC_acc-=filters->nearDC[ptr]; - filters->nearDC[ptr]=temp; - - decay*=(1./(VE_NEARDC+1)); - filters->nearptr++; - if(filters->nearptr>=VE_NEARDC)filters->nearptr=0; - decay=todB(&decay)*.5-15.f; - } - - /* perform spreading and limiting, also smooth the spectrum. yes, - the MDCT results in all real coefficients, but it still *behaves* - like real/imaginary pairs */ - for(i=0;i>1]=val; - decay-=8.; - } - - /*_analysis_output_always("spread",seq2++,vec,n/4,0,0,0);*/ - - /* perform preecho/postecho triggering by band */ - for(j=0;j=VE_AMP)filters[j].ampptr=0; - } - - /* look at min/max, decide trigger */ - if(valmax>gi->preecho_thresh[j]+penalty){ - ret|=1; - ret|=4; - } - if(valminpostecho_thresh[j]-penalty)ret|=2; - } - - return(ret); -} - -#if 0 -static int seq=0; -static ogg_int64_t totalshift=-1024; -#endif - -long _ve_envelope_search(vorbis_dsp_state *v){ - vorbis_info *vi=v->vi; - codec_setup_info *ci=vi->codec_setup; - vorbis_info_psy_global *gi=&ci->psy_g_param; - envelope_lookup *ve=((private_state *)(v->backend_state))->ve; - long i,j; - - int first=ve->current/ve->searchstep; - int last=v->pcm_current/ve->searchstep-VE_WIN; - if(first<0)first=0; - - /* make sure we have enough storage to match the PCM */ - if(last+VE_WIN+VE_POST>ve->storage){ - ve->storage=last+VE_WIN+VE_POST; /* be sure */ - ve->mark=_ogg_realloc(ve->mark,ve->storage*sizeof(*ve->mark)); - } - - for(j=first;jstretch++; - if(ve->stretch>VE_MAXSTRETCH*2) - ve->stretch=VE_MAXSTRETCH*2; - - for(i=0;ich;i++){ - float *pcm=v->pcm[i]+ve->searchstep*(j); - ret|=_ve_amp(ve,gi,pcm,ve->band,ve->filter+i*VE_BANDS); - } - - ve->mark[j+VE_POST]=0; - if(ret&1){ - ve->mark[j]=1; - ve->mark[j+1]=1; - } - - if(ret&2){ - ve->mark[j]=1; - if(j>0)ve->mark[j-1]=1; - } - - if(ret&4)ve->stretch=-1; - } - - ve->current=last*ve->searchstep; - - { - long centerW=v->centerW; - long testW= - centerW+ - ci->blocksizes[v->W]/4+ - ci->blocksizes[1]/2+ - ci->blocksizes[0]/4; - - j=ve->cursor; - - while(jcurrent-(ve->searchstep)){/* account for postecho - working back one window */ - if(j>=testW)return(1); - - ve->cursor=j; - - if(ve->mark[j/ve->searchstep]){ - if(j>centerW){ - -#if 0 - if(j>ve->curmark){ - float *marker=alloca(v->pcm_current*sizeof(*marker)); - int l,m; - memset(marker,0,sizeof(*marker)*v->pcm_current); - fprintf(stderr,"mark! seq=%d, cursor:%fs time:%fs\n", - seq, - (totalshift+ve->cursor)/44100., - (totalshift+j)/44100.); - _analysis_output_always("pcmL",seq,v->pcm[0],v->pcm_current,0,0,totalshift); - _analysis_output_always("pcmR",seq,v->pcm[1],v->pcm_current,0,0,totalshift); - - _analysis_output_always("markL",seq,v->pcm[0],j,0,0,totalshift); - _analysis_output_always("markR",seq,v->pcm[1],j,0,0,totalshift); - - for(m=0;msearchstep]=ve->filter[m].markers[l]*.1; - _analysis_output_always(buf,seq,marker,v->pcm_current,0,0,totalshift); - } - - for(m=0;msearchstep]=ve->filter[m+VE_BANDS].markers[l]*.1; - _analysis_output_always(buf,seq,marker,v->pcm_current,0,0,totalshift); - } - - for(l=0;lsearchstep]=ve->mark[l]*.4; - _analysis_output_always("mark",seq,marker,v->pcm_current,0,0,totalshift); - - - seq++; - - } -#endif - - ve->curmark=j; - if(j>=testW)return(1); - return(0); - } - } - j+=ve->searchstep; - } - } - - return(-1); -} - -int _ve_envelope_mark(vorbis_dsp_state *v){ - envelope_lookup *ve=((private_state *)(v->backend_state))->ve; - vorbis_info *vi=v->vi; - codec_setup_info *ci=vi->codec_setup; - long centerW=v->centerW; - long beginW=centerW-ci->blocksizes[v->W]/4; - long endW=centerW+ci->blocksizes[v->W]/4; - if(v->W){ - beginW-=ci->blocksizes[v->lW]/4; - endW+=ci->blocksizes[v->nW]/4; - }else{ - beginW-=ci->blocksizes[0]/4; - endW+=ci->blocksizes[0]/4; - } - - if(ve->curmark>=beginW && ve->curmarksearchstep; - long last=endW/ve->searchstep; - long i; - for(i=first;imark[i])return(1); - } - return(0); -} - -void _ve_envelope_shift(envelope_lookup *e,long shift){ - int smallsize=e->current/e->searchstep+VE_POST; /* adjust for placing marks - ahead of ve->current */ - int smallshift=shift/e->searchstep; - - memmove(e->mark,e->mark+smallshift,(smallsize-smallshift)*sizeof(*e->mark)); - -#if 0 - for(i=0;ich;i++) - memmove(e->filter[i].markers, - e->filter[i].markers+smallshift, - (1024-smallshift)*sizeof(*(*e->filter).markers)); - totalshift+=shift; -#endif - - e->current-=shift; - if(e->curmark>=0) - e->curmark-=shift; - e->cursor-=shift; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/envelope.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/envelope.h deleted file mode 100644 index f5ec92cf..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/envelope.h +++ /dev/null @@ -1,80 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: PCM data envelope analysis and manipulation - last mod: $Id: envelope.h 16227 2009-07-08 06:58:46Z xiphmont $ - - ********************************************************************/ - -#ifndef _V_ENVELOPE_ -#define _V_ENVELOPE_ - -#include "mdct.h" - -#define VE_PRE 16 -#define VE_WIN 4 -#define VE_POST 2 -#define VE_AMP (VE_PRE+VE_POST-1) - -#define VE_BANDS 7 -#define VE_NEARDC 15 - -#define VE_MINSTRETCH 2 /* a bit less than short block */ -#define VE_MAXSTRETCH 12 /* one-third full block */ - -typedef struct { - float ampbuf[VE_AMP]; - int ampptr; - - float nearDC[VE_NEARDC]; - float nearDC_acc; - float nearDC_partialacc; - int nearptr; - -} envelope_filter_state; - -typedef struct { - int begin; - int end; - float *window; - float total; -} envelope_band; - -typedef struct { - int ch; - int winlength; - int searchstep; - float minenergy; - - vbs_mdct_lookup mdct; - float *mdct_win; - - envelope_band band[VE_BANDS]; - envelope_filter_state *filter; - int stretch; - - int *mark; - - long storage; - long current; - long curmark; - long cursor; -} envelope_lookup; - -extern void _ve_envelope_init(envelope_lookup *e,vorbis_info *vi); -extern void _ve_envelope_clear(envelope_lookup *e); -extern long _ve_envelope_search(vorbis_dsp_state *v); -extern void _ve_envelope_shift(envelope_lookup *e,long shift); -extern int _ve_envelope_mark(vorbis_dsp_state *v); - - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/floor0.c b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/floor0.c deleted file mode 100644 index 213cce4e..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/floor0.c +++ /dev/null @@ -1,224 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2015 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: floor backend 0 implementation - last mod: $Id: floor0.c 19457 2015-03-03 00:15:29Z giles $ - - ********************************************************************/ - -#include -#include -#include -#include -#include "vorbis/codec.h" -#include "codec_internal.h" -#include "registry.h" -#include "lpc.h" -#include "lsp.h" -#include "codebook.h" -#include "scales.h" -#include "misc.h" -#include "os.h" - -#include "misc.h" -#include - -typedef struct { - int ln; - int m; - int **linearmap; - int n[2]; - - vorbis_info_floor0 *vi; - - long bits; - long frames; -} vorbis_look_floor0; - - -/***********************************************/ - -static void floor0_free_info(vorbis_info_floor *i){ - vorbis_info_floor0 *info=(vorbis_info_floor0 *)i; - if(info){ - memset(info,0,sizeof(*info)); - _ogg_free(info); - } -} - -static void floor0_free_look(vorbis_look_floor *i){ - vorbis_look_floor0 *look=(vorbis_look_floor0 *)i; - if(look){ - - if(look->linearmap){ - - if(look->linearmap[0])_ogg_free(look->linearmap[0]); - if(look->linearmap[1])_ogg_free(look->linearmap[1]); - - _ogg_free(look->linearmap); - } - memset(look,0,sizeof(*look)); - _ogg_free(look); - } -} - -static vorbis_info_floor *floor0_unpack (vorbis_info *vi,oggpack_buffer *opb){ - codec_setup_info *ci=vi->codec_setup; - int j; - - vorbis_info_floor0 *info=_ogg_malloc(sizeof(*info)); - info->order=oggpack_read(opb,8); - info->rate=oggpack_read(opb,16); - info->barkmap=oggpack_read(opb,16); - info->ampbits=oggpack_read(opb,6); - info->ampdB=oggpack_read(opb,8); - info->numbooks=oggpack_read(opb,4)+1; - - if(info->order<1)goto err_out; - if(info->rate<1)goto err_out; - if(info->barkmap<1)goto err_out; - if(info->numbooks<1)goto err_out; - - for(j=0;jnumbooks;j++){ - info->books[j]=oggpack_read(opb,8); - if(info->books[j]<0 || info->books[j]>=ci->books)goto err_out; - if(ci->book_param[info->books[j]]->maptype==0)goto err_out; - if(ci->book_param[info->books[j]]->dim<1)goto err_out; - } - return(info); - - err_out: - floor0_free_info(info); - return(NULL); -} - -/* initialize Bark scale and normalization lookups. We could do this - with static tables, but Vorbis allows a number of possible - combinations, so it's best to do it computationally. - - The below is authoritative in terms of defining scale mapping. - Note that the scale depends on the sampling rate as well as the - linear block and mapping sizes */ - -static void floor0_map_lazy_init(vorbis_block *vb, - vorbis_info_floor *infoX, - vorbis_look_floor0 *look){ - if(!look->linearmap[vb->W]){ - vorbis_dsp_state *vd=vb->vd; - vorbis_info *vi=vd->vi; - codec_setup_info *ci=vi->codec_setup; - vorbis_info_floor0 *info=(vorbis_info_floor0 *)infoX; - int W=vb->W; - int n=ci->blocksizes[W]/2,j; - - /* we choose a scaling constant so that: - floor(bark(rate/2-1)*C)=mapped-1 - floor(bark(rate/2)*C)=mapped */ - float scale=look->ln/toBARK(info->rate/2.f); - - /* the mapping from a linear scale to a smaller bark scale is - straightforward. We do *not* make sure that the linear mapping - does not skip bark-scale bins; the decoder simply skips them and - the encoder may do what it wishes in filling them. They're - necessary in some mapping combinations to keep the scale spacing - accurate */ - look->linearmap[W]=_ogg_malloc((n+1)*sizeof(**look->linearmap)); - for(j=0;jrate/2.f)/n*j) - *scale); /* bark numbers represent band edges */ - if(val>=look->ln)val=look->ln-1; /* guard against the approximation */ - look->linearmap[W][j]=val; - } - look->linearmap[W][j]=-1; - look->n[W]=n; - } -} - -static vorbis_look_floor *floor0_look(vorbis_dsp_state *vd, - vorbis_info_floor *i){ - vorbis_info_floor0 *info=(vorbis_info_floor0 *)i; - vorbis_look_floor0 *look=_ogg_calloc(1,sizeof(*look)); - - (void)vd; - - look->m=info->order; - look->ln=info->barkmap; - look->vi=info; - - look->linearmap=_ogg_calloc(2,sizeof(*look->linearmap)); - - return look; -} - -static void *floor0_inverse1(vorbis_block *vb,vorbis_look_floor *i){ - vorbis_look_floor0 *look=(vorbis_look_floor0 *)i; - vorbis_info_floor0 *info=look->vi; - int j,k; - - int ampraw=oggpack_read(&vb->opb,info->ampbits); - if(ampraw>0){ /* also handles the -1 out of data case */ - long maxval=(1<ampbits)-1; - float amp=(float)ampraw/maxval*info->ampdB; - int booknum=oggpack_read(&vb->opb,ov_ilog(info->numbooks)); - - if(booknum!=-1 && booknumnumbooks){ /* be paranoid */ - codec_setup_info *ci=vb->vd->vi->codec_setup; - codebook *b=ci->fullbooks+info->books[booknum]; - float last=0.f; - - /* the additional b->dim is a guard against any possible stack - smash; b->dim is provably more than we can overflow the - vector */ - float *lsp=_vorbis_block_alloc(vb,sizeof(*lsp)*(look->m+b->dim+1)); - - if(vorbis_book_decodev_set(b,lsp,&vb->opb,look->m)==-1)goto eop; - for(j=0;jm;){ - for(k=0;jm && kdim;k++,j++)lsp[j]+=last; - last=lsp[j-1]; - } - - lsp[look->m]=amp; - return(lsp); - } - } - eop: - return(NULL); -} - -static int floor0_inverse2(vorbis_block *vb,vorbis_look_floor *i, - void *memo,float *out){ - vorbis_look_floor0 *look=(vorbis_look_floor0 *)i; - vorbis_info_floor0 *info=look->vi; - - floor0_map_lazy_init(vb,info,look); - - if(memo){ - float *lsp=(float *)memo; - float amp=lsp[look->m]; - - /* take the coefficients back to a spectral envelope curve */ - vorbis_lsp_to_curve(out, - look->linearmap[vb->W], - look->n[vb->W], - look->ln, - lsp,look->m,amp,(float)info->ampdB); - return(1); - } - memset(out,0,sizeof(*out)*look->n[vb->W]); - return(0); -} - -/* export hooks */ -const vorbis_func_floor floor0_exportbundle={ - NULL,&floor0_unpack,&floor0_look,&floor0_free_info, - &floor0_free_look,&floor0_inverse1,&floor0_inverse2 -}; diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/floor1.c b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/floor1.c deleted file mode 100644 index 993bbd05..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/floor1.c +++ /dev/null @@ -1,1087 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2015 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: floor backend 1 implementation - last mod: $Id: floor1.c 19457 2015-03-03 00:15:29Z giles $ - - ********************************************************************/ - -#include -#include -#include -#include -#include "vorbis/codec.h" -#include "codec_internal.h" -#include "registry.h" -#include "codebook.h" -#include "misc.h" -#include "scales.h" - -#include - -#define floor1_rangedB 140 /* floor 1 fixed at -140dB to 0dB range */ - -typedef struct lsfit_acc{ - int x0; - int x1; - - int xa; - int ya; - int x2a; - int y2a; - int xya; - int an; - - int xb; - int yb; - int x2b; - int y2b; - int xyb; - int bn; -} lsfit_acc; - -/***********************************************/ - -static void floor1_free_info(vorbis_info_floor *i){ - vorbis_info_floor1 *info=(vorbis_info_floor1 *)i; - if(info){ - memset(info,0,sizeof(*info)); - _ogg_free(info); - } -} - -static void floor1_free_look(vorbis_look_floor *i){ - vorbis_look_floor1 *look=(vorbis_look_floor1 *)i; - if(look){ - /*fprintf(stderr,"floor 1 bit usage %f:%f (%f total)\n", - (float)look->phrasebits/look->frames, - (float)look->postbits/look->frames, - (float)(look->postbits+look->phrasebits)/look->frames);*/ - - memset(look,0,sizeof(*look)); - _ogg_free(look); - } -} - -static void floor1_pack (vorbis_info_floor *i,oggpack_buffer *opb){ - vorbis_info_floor1 *info=(vorbis_info_floor1 *)i; - int j,k; - int count=0; - int rangebits; - int maxposit=info->postlist[1]; - int maxclass=-1; - - /* save out partitions */ - oggpack_write(opb,info->partitions,5); /* only 0 to 31 legal */ - for(j=0;jpartitions;j++){ - oggpack_write(opb,info->partitionclass[j],4); /* only 0 to 15 legal */ - if(maxclasspartitionclass[j])maxclass=info->partitionclass[j]; - } - - /* save out partition classes */ - for(j=0;jclass_dim[j]-1,3); /* 1 to 8 */ - oggpack_write(opb,info->class_subs[j],2); /* 0 to 3 */ - if(info->class_subs[j])oggpack_write(opb,info->class_book[j],8); - for(k=0;k<(1<class_subs[j]);k++) - oggpack_write(opb,info->class_subbook[j][k]+1,8); - } - - /* save out the post list */ - oggpack_write(opb,info->mult-1,2); /* only 1,2,3,4 legal now */ - /* maxposit cannot legally be less than 1; this is encode-side, we - can assume our setup is OK */ - oggpack_write(opb,ov_ilog(maxposit-1),4); - rangebits=ov_ilog(maxposit-1); - - for(j=0,k=0;jpartitions;j++){ - count+=info->class_dim[info->partitionclass[j]]; - for(;kpostlist[k+2],rangebits); - } -} - -static int icomp(const void *a,const void *b){ - return(**(int **)a-**(int **)b); -} - -static vorbis_info_floor *floor1_unpack (vorbis_info *vi,oggpack_buffer *opb){ - codec_setup_info *ci=vi->codec_setup; - int j,k,count=0,maxclass=-1,rangebits; - - vorbis_info_floor1 *info=_ogg_calloc(1,sizeof(*info)); - /* read partitions */ - info->partitions=oggpack_read(opb,5); /* only 0 to 31 legal */ - for(j=0;jpartitions;j++){ - info->partitionclass[j]=oggpack_read(opb,4); /* only 0 to 15 legal */ - if(info->partitionclass[j]<0)goto err_out; - if(maxclasspartitionclass[j])maxclass=info->partitionclass[j]; - } - - /* read partition classes */ - for(j=0;jclass_dim[j]=oggpack_read(opb,3)+1; /* 1 to 8 */ - info->class_subs[j]=oggpack_read(opb,2); /* 0,1,2,3 bits */ - if(info->class_subs[j]<0) - goto err_out; - if(info->class_subs[j])info->class_book[j]=oggpack_read(opb,8); - if(info->class_book[j]<0 || info->class_book[j]>=ci->books) - goto err_out; - for(k=0;k<(1<class_subs[j]);k++){ - info->class_subbook[j][k]=oggpack_read(opb,8)-1; - if(info->class_subbook[j][k]<-1 || info->class_subbook[j][k]>=ci->books) - goto err_out; - } - } - - /* read the post list */ - info->mult=oggpack_read(opb,2)+1; /* only 1,2,3,4 legal now */ - rangebits=oggpack_read(opb,4); - if(rangebits<0)goto err_out; - - for(j=0,k=0;jpartitions;j++){ - count+=info->class_dim[info->partitionclass[j]]; - if(count>VIF_POSIT) goto err_out; - for(;kpostlist[k+2]=oggpack_read(opb,rangebits); - if(t<0 || t>=(1<postlist[0]=0; - info->postlist[1]=1<postlist+j; - qsort(sortpointer,count+2,sizeof(*sortpointer),icomp); - - for(j=1;jvi=info; - look->n=info->postlist[1]; - - /* we drop each position value in-between already decoded values, - and use linear interpolation to predict each new value past the - edges. The positions are read in the order of the position - list... we precompute the bounding positions in the lookup. Of - course, the neighbors can change (if a position is declined), but - this is an initial mapping */ - - for(i=0;ipartitions;i++)n+=info->class_dim[info->partitionclass[i]]; - n+=2; - look->posts=n; - - /* also store a sorted position index */ - for(i=0;ipostlist+i; - qsort(sortpointer,n,sizeof(*sortpointer),icomp); - - /* points from sort order back to range number */ - for(i=0;iforward_index[i]=sortpointer[i]-info->postlist; - /* points from range order to sorted position */ - for(i=0;ireverse_index[look->forward_index[i]]=i; - /* we actually need the post values too */ - for(i=0;isorted_index[i]=info->postlist[look->forward_index[i]]; - - /* quantize values to multiplier spec */ - switch(info->mult){ - case 1: /* 1024 -> 256 */ - look->quant_q=256; - break; - case 2: /* 1024 -> 128 */ - look->quant_q=128; - break; - case 3: /* 1024 -> 86 */ - look->quant_q=86; - break; - case 4: /* 1024 -> 64 */ - look->quant_q=64; - break; - } - - /* discover our neighbors for decode where we don't use fit flags - (that would push the neighbors outward) */ - for(i=0;in; - int currentx=info->postlist[i+2]; - for(j=0;jpostlist[j]; - if(x>lx && xcurrentx){ - hi=j; - hx=x; - } - } - look->loneighbor[i]=lo; - look->hineighbor[i]=hi; - } - - return(look); -} - -static int render_point(int x0,int x1,int y0,int y1,int x){ - y0&=0x7fff; /* mask off flag */ - y1&=0x7fff; - - { - int dy=y1-y0; - int adx=x1-x0; - int ady=abs(dy); - int err=ady*(x-x0); - - int off=err/adx; - if(dy<0)return(y0-off); - return(y0+off); - } -} - -static int vorbis_dBquant(const float *x){ - int i= *x*7.3142857f+1023.5f; - if(i>1023)return(1023); - if(i<0)return(0); - return i; -} - -static float FLOOR1_fromdB_LOOKUP[256]={ - 1.0649863e-07F, 1.1341951e-07F, 1.2079015e-07F, 1.2863978e-07F, - 1.3699951e-07F, 1.4590251e-07F, 1.5538408e-07F, 1.6548181e-07F, - 1.7623575e-07F, 1.8768855e-07F, 1.9988561e-07F, 2.128753e-07F, - 2.2670913e-07F, 2.4144197e-07F, 2.5713223e-07F, 2.7384213e-07F, - 2.9163793e-07F, 3.1059021e-07F, 3.3077411e-07F, 3.5226968e-07F, - 3.7516214e-07F, 3.9954229e-07F, 4.2550680e-07F, 4.5315863e-07F, - 4.8260743e-07F, 5.1396998e-07F, 5.4737065e-07F, 5.8294187e-07F, - 6.2082472e-07F, 6.6116941e-07F, 7.0413592e-07F, 7.4989464e-07F, - 7.9862701e-07F, 8.5052630e-07F, 9.0579828e-07F, 9.6466216e-07F, - 1.0273513e-06F, 1.0941144e-06F, 1.1652161e-06F, 1.2409384e-06F, - 1.3215816e-06F, 1.4074654e-06F, 1.4989305e-06F, 1.5963394e-06F, - 1.7000785e-06F, 1.8105592e-06F, 1.9282195e-06F, 2.0535261e-06F, - 2.1869758e-06F, 2.3290978e-06F, 2.4804557e-06F, 2.6416497e-06F, - 2.8133190e-06F, 2.9961443e-06F, 3.1908506e-06F, 3.3982101e-06F, - 3.6190449e-06F, 3.8542308e-06F, 4.1047004e-06F, 4.3714470e-06F, - 4.6555282e-06F, 4.9580707e-06F, 5.2802740e-06F, 5.6234160e-06F, - 5.9888572e-06F, 6.3780469e-06F, 6.7925283e-06F, 7.2339451e-06F, - 7.7040476e-06F, 8.2047000e-06F, 8.7378876e-06F, 9.3057248e-06F, - 9.9104632e-06F, 1.0554501e-05F, 1.1240392e-05F, 1.1970856e-05F, - 1.2748789e-05F, 1.3577278e-05F, 1.4459606e-05F, 1.5399272e-05F, - 1.6400004e-05F, 1.7465768e-05F, 1.8600792e-05F, 1.9809576e-05F, - 2.1096914e-05F, 2.2467911e-05F, 2.3928002e-05F, 2.5482978e-05F, - 2.7139006e-05F, 2.8902651e-05F, 3.0780908e-05F, 3.2781225e-05F, - 3.4911534e-05F, 3.7180282e-05F, 3.9596466e-05F, 4.2169667e-05F, - 4.4910090e-05F, 4.7828601e-05F, 5.0936773e-05F, 5.4246931e-05F, - 5.7772202e-05F, 6.1526565e-05F, 6.5524908e-05F, 6.9783085e-05F, - 7.4317983e-05F, 7.9147585e-05F, 8.4291040e-05F, 8.9768747e-05F, - 9.5602426e-05F, 0.00010181521F, 0.00010843174F, 0.00011547824F, - 0.00012298267F, 0.00013097477F, 0.00013948625F, 0.00014855085F, - 0.00015820453F, 0.00016848555F, 0.00017943469F, 0.00019109536F, - 0.00020351382F, 0.00021673929F, 0.00023082423F, 0.00024582449F, - 0.00026179955F, 0.00027881276F, 0.00029693158F, 0.00031622787F, - 0.00033677814F, 0.00035866388F, 0.00038197188F, 0.00040679456F, - 0.00043323036F, 0.00046138411F, 0.00049136745F, 0.00052329927F, - 0.00055730621F, 0.00059352311F, 0.00063209358F, 0.00067317058F, - 0.00071691700F, 0.00076350630F, 0.00081312324F, 0.00086596457F, - 0.00092223983F, 0.00098217216F, 0.0010459992F, 0.0011139742F, - 0.0011863665F, 0.0012634633F, 0.0013455702F, 0.0014330129F, - 0.0015261382F, 0.0016253153F, 0.0017309374F, 0.0018434235F, - 0.0019632195F, 0.0020908006F, 0.0022266726F, 0.0023713743F, - 0.0025254795F, 0.0026895994F, 0.0028643847F, 0.0030505286F, - 0.0032487691F, 0.0034598925F, 0.0036847358F, 0.0039241906F, - 0.0041792066F, 0.0044507950F, 0.0047400328F, 0.0050480668F, - 0.0053761186F, 0.0057254891F, 0.0060975636F, 0.0064938176F, - 0.0069158225F, 0.0073652516F, 0.0078438871F, 0.0083536271F, - 0.0088964928F, 0.009474637F, 0.010090352F, 0.010746080F, - 0.011444421F, 0.012188144F, 0.012980198F, 0.013823725F, - 0.014722068F, 0.015678791F, 0.016697687F, 0.017782797F, - 0.018938423F, 0.020169149F, 0.021479854F, 0.022875735F, - 0.024362330F, 0.025945531F, 0.027631618F, 0.029427276F, - 0.031339626F, 0.033376252F, 0.035545228F, 0.037855157F, - 0.040315199F, 0.042935108F, 0.045725273F, 0.048696758F, - 0.051861348F, 0.055231591F, 0.058820850F, 0.062643361F, - 0.066714279F, 0.071049749F, 0.075666962F, 0.080584227F, - 0.085821044F, 0.091398179F, 0.097337747F, 0.10366330F, - 0.11039993F, 0.11757434F, 0.12521498F, 0.13335215F, - 0.14201813F, 0.15124727F, 0.16107617F, 0.17154380F, - 0.18269168F, 0.19456402F, 0.20720788F, 0.22067342F, - 0.23501402F, 0.25028656F, 0.26655159F, 0.28387361F, - 0.30232132F, 0.32196786F, 0.34289114F, 0.36517414F, - 0.38890521F, 0.41417847F, 0.44109412F, 0.46975890F, - 0.50028648F, 0.53279791F, 0.56742212F, 0.60429640F, - 0.64356699F, 0.68538959F, 0.72993007F, 0.77736504F, - 0.82788260F, 0.88168307F, 0.9389798F, 1.F, -}; - -static void render_line(int n, int x0,int x1,int y0,int y1,float *d){ - int dy=y1-y0; - int adx=x1-x0; - int ady=abs(dy); - int base=dy/adx; - int sy=(dy<0?base-1:base+1); - int x=x0; - int y=y0; - int err=0; - - ady-=abs(base*adx); - - if(n>x1)n=x1; - - if(x=adx){ - err-=adx; - y+=sy; - }else{ - y+=base; - } - d[x]*=FLOOR1_fromdB_LOOKUP[y]; - } -} - -static void render_line0(int n, int x0,int x1,int y0,int y1,int *d){ - int dy=y1-y0; - int adx=x1-x0; - int ady=abs(dy); - int base=dy/adx; - int sy=(dy<0?base-1:base+1); - int x=x0; - int y=y0; - int err=0; - - ady-=abs(base*adx); - - if(n>x1)n=x1; - - if(x=adx){ - err-=adx; - y+=sy; - }else{ - y+=base; - } - d[x]=y; - } -} - -/* the floor has already been filtered to only include relevant sections */ -static int accumulate_fit(const float *flr,const float *mdct, - int x0, int x1,lsfit_acc *a, - int n,vorbis_info_floor1 *info){ - long i; - - int xa=0,ya=0,x2a=0,y2a=0,xya=0,na=0, xb=0,yb=0,x2b=0,y2b=0,xyb=0,nb=0; - - memset(a,0,sizeof(*a)); - a->x0=x0; - a->x1=x1; - if(x1>=n)x1=n-1; - - for(i=x0;i<=x1;i++){ - int quantized=vorbis_dBquant(flr+i); - if(quantized){ - if(mdct[i]+info->twofitatten>=flr[i]){ - xa += i; - ya += quantized; - x2a += i*i; - y2a += quantized*quantized; - xya += i*quantized; - na++; - }else{ - xb += i; - yb += quantized; - x2b += i*i; - y2b += quantized*quantized; - xyb += i*quantized; - nb++; - } - } - } - - a->xa=xa; - a->ya=ya; - a->x2a=x2a; - a->y2a=y2a; - a->xya=xya; - a->an=na; - - a->xb=xb; - a->yb=yb; - a->x2b=x2b; - a->y2b=y2b; - a->xyb=xyb; - a->bn=nb; - - return(na); -} - -static int fit_line(lsfit_acc *a,int fits,int *y0,int *y1, - vorbis_info_floor1 *info){ - double xb=0,yb=0,x2b=0,y2b=0,xyb=0,bn=0; - int i; - int x0=a[0].x0; - int x1=a[fits-1].x1; - - for(i=0;itwofitweight/(a[i].an+1)+1.; - - xb+=a[i].xb + a[i].xa * weight; - yb+=a[i].yb + a[i].ya * weight; - x2b+=a[i].x2b + a[i].x2a * weight; - y2b+=a[i].y2b + a[i].y2a * weight; - xyb+=a[i].xyb + a[i].xya * weight; - bn+=a[i].bn + a[i].an * weight; - } - - if(*y0>=0){ - xb+= x0; - yb+= *y0; - x2b+= x0 * x0; - y2b+= *y0 * *y0; - xyb+= *y0 * x0; - bn++; - } - - if(*y1>=0){ - xb+= x1; - yb+= *y1; - x2b+= x1 * x1; - y2b+= *y1 * *y1; - xyb+= *y1 * x1; - bn++; - } - - { - double denom=(bn*x2b-xb*xb); - - if(denom>0.){ - double a=(yb*x2b-xyb*xb)/denom; - double b=(bn*xyb-xb*yb)/denom; - *y0=rint(a+b*x0); - *y1=rint(a+b*x1); - - /* limit to our range! */ - if(*y0>1023)*y0=1023; - if(*y1>1023)*y1=1023; - if(*y0<0)*y0=0; - if(*y1<0)*y1=0; - - return 0; - }else{ - *y0=0; - *y1=0; - return 1; - } - } -} - -static int inspect_error(int x0,int x1,int y0,int y1,const float *mask, - const float *mdct, - vorbis_info_floor1 *info){ - int dy=y1-y0; - int adx=x1-x0; - int ady=abs(dy); - int base=dy/adx; - int sy=(dy<0?base-1:base+1); - int x=x0; - int y=y0; - int err=0; - int val=vorbis_dBquant(mask+x); - int mse=0; - int n=0; - - ady-=abs(base*adx); - - mse=(y-val); - mse*=mse; - n++; - if(mdct[x]+info->twofitatten>=mask[x]){ - if(y+info->maxovermaxunder>val)return(1); - } - - while(++x=adx){ - err-=adx; - y+=sy; - }else{ - y+=base; - } - - val=vorbis_dBquant(mask+x); - mse+=((y-val)*(y-val)); - n++; - if(mdct[x]+info->twofitatten>=mask[x]){ - if(val){ - if(y+info->maxovermaxunder>val)return(1); - } - } - } - - if(info->maxover*info->maxover/n>info->maxerr)return(0); - if(info->maxunder*info->maxunder/n>info->maxerr)return(0); - if(mse/n>info->maxerr)return(1); - return(0); -} - -static int post_Y(int *A,int *B,int pos){ - if(A[pos]<0) - return B[pos]; - if(B[pos]<0) - return A[pos]; - - return (A[pos]+B[pos])>>1; -} - -int *floor1_fit(vorbis_block *vb,vorbis_look_floor1 *look, - const float *logmdct, /* in */ - const float *logmask){ - long i,j; - vorbis_info_floor1 *info=look->vi; - long n=look->n; - long posts=look->posts; - long nonzero=0; - lsfit_acc fits[VIF_POSIT+1]; - int fit_valueA[VIF_POSIT+2]; /* index by range list position */ - int fit_valueB[VIF_POSIT+2]; /* index by range list position */ - - int loneighbor[VIF_POSIT+2]; /* sorted index of range list position (+2) */ - int hineighbor[VIF_POSIT+2]; - int *output=NULL; - int memo[VIF_POSIT+2]; - - for(i=0;isorted_index[i], - look->sorted_index[i+1],fits+i, - n,info); - } - - if(nonzero){ - /* start by fitting the implicit base case.... */ - int y0=-200; - int y1=-200; - fit_line(fits,posts-1,&y0,&y1,info); - - fit_valueA[0]=y0; - fit_valueB[0]=y0; - fit_valueB[1]=y1; - fit_valueA[1]=y1; - - /* Non degenerate case */ - /* start progressive splitting. This is a greedy, non-optimal - algorithm, but simple and close enough to the best - answer. */ - for(i=2;ireverse_index[i]; - int ln=loneighbor[sortpos]; - int hn=hineighbor[sortpos]; - - /* eliminate repeat searches of a particular range with a memo */ - if(memo[ln]!=hn){ - /* haven't performed this error search yet */ - int lsortpos=look->reverse_index[ln]; - int hsortpos=look->reverse_index[hn]; - memo[ln]=hn; - - { - /* A note: we want to bound/minimize *local*, not global, error */ - int lx=info->postlist[ln]; - int hx=info->postlist[hn]; - int ly=post_Y(fit_valueA,fit_valueB,ln); - int hy=post_Y(fit_valueA,fit_valueB,hn); - - if(ly==-1 || hy==-1){ - exit(1); - } - - if(inspect_error(lx,hx,ly,hy,logmask,logmdct,info)){ - /* outside error bounds/begin search area. Split it. */ - int ly0=-200; - int ly1=-200; - int hy0=-200; - int hy1=-200; - int ret0=fit_line(fits+lsortpos,sortpos-lsortpos,&ly0,&ly1,info); - int ret1=fit_line(fits+sortpos,hsortpos-sortpos,&hy0,&hy1,info); - - if(ret0){ - ly0=ly; - ly1=hy0; - } - if(ret1){ - hy0=ly1; - hy1=hy; - } - - if(ret0 && ret1){ - fit_valueA[i]=-200; - fit_valueB[i]=-200; - }else{ - /* store new edge values */ - fit_valueB[ln]=ly0; - if(ln==0)fit_valueA[ln]=ly0; - fit_valueA[i]=ly1; - fit_valueB[i]=hy0; - fit_valueA[hn]=hy1; - if(hn==1)fit_valueB[hn]=hy1; - - if(ly1>=0 || hy0>=0){ - /* store new neighbor values */ - for(j=sortpos-1;j>=0;j--) - if(hineighbor[j]==hn) - hineighbor[j]=i; - else - break; - for(j=sortpos+1;jloneighbor[i-2]; - int hn=look->hineighbor[i-2]; - int x0=info->postlist[ln]; - int x1=info->postlist[hn]; - int y0=output[ln]; - int y1=output[hn]; - - int predicted=render_point(x0,x1,y0,y1,info->postlist[i]); - int vx=post_Y(fit_valueA,fit_valueB,i); - - if(vx>=0 && predicted!=vx){ - output[i]=vx; - }else{ - output[i]= predicted|0x8000; - } - } - } - - return(output); - -} - -int *floor1_interpolate_fit(vorbis_block *vb,vorbis_look_floor1 *look, - int *A,int *B, - int del){ - - long i; - long posts=look->posts; - int *output=NULL; - - if(A && B){ - output=_vorbis_block_alloc(vb,sizeof(*output)*posts); - - /* overly simpleminded--- look again post 1.2 */ - for(i=0;i>16; - if(A[i]&0x8000 && B[i]&0x8000)output[i]|=0x8000; - } - } - - return(output); -} - - -int floor1_encode(oggpack_buffer *opb,vorbis_block *vb, - vorbis_look_floor1 *look, - int *post,int *ilogmask){ - - long i,j; - vorbis_info_floor1 *info=look->vi; - long posts=look->posts; - codec_setup_info *ci=vb->vd->vi->codec_setup; - int out[VIF_POSIT+2]; - static_codebook **sbooks=ci->book_param; - codebook *books=ci->fullbooks; - - /* quantize values to multiplier spec */ - if(post){ - for(i=0;imult){ - case 1: /* 1024 -> 256 */ - val>>=2; - break; - case 2: /* 1024 -> 128 */ - val>>=3; - break; - case 3: /* 1024 -> 86 */ - val/=12; - break; - case 4: /* 1024 -> 64 */ - val>>=4; - break; - } - post[i]=val | (post[i]&0x8000); - } - - out[0]=post[0]; - out[1]=post[1]; - - /* find prediction values for each post and subtract them */ - for(i=2;iloneighbor[i-2]; - int hn=look->hineighbor[i-2]; - int x0=info->postlist[ln]; - int x1=info->postlist[hn]; - int y0=post[ln]; - int y1=post[hn]; - - int predicted=render_point(x0,x1,y0,y1,info->postlist[i]); - - if((post[i]&0x8000) || (predicted==post[i])){ - post[i]=predicted|0x8000; /* in case there was roundoff jitter - in interpolation */ - out[i]=0; - }else{ - int headroom=(look->quant_q-predictedquant_q-predicted:predicted); - - int val=post[i]-predicted; - - /* at this point the 'deviation' value is in the range +/- max - range, but the real, unique range can always be mapped to - only [0-maxrange). So we want to wrap the deviation into - this limited range, but do it in the way that least screws - an essentially gaussian probability distribution. */ - - if(val<0) - if(val<-headroom) - val=headroom-val-1; - else - val=-1-(val<<1); - else - if(val>=headroom) - val= val+headroom; - else - val<<=1; - - out[i]=val; - post[ln]&=0x7fff; - post[hn]&=0x7fff; - } - } - - /* we have everything we need. pack it out */ - /* mark nontrivial floor */ - oggpack_write(opb,1,1); - - /* beginning/end post */ - look->frames++; - look->postbits+=ov_ilog(look->quant_q-1)*2; - oggpack_write(opb,out[0],ov_ilog(look->quant_q-1)); - oggpack_write(opb,out[1],ov_ilog(look->quant_q-1)); - - - /* partition by partition */ - for(i=0,j=2;ipartitions;i++){ - int class=info->partitionclass[i]; - int cdim=info->class_dim[class]; - int csubbits=info->class_subs[class]; - int csub=1<class_subbook[class][k]; - if(booknum<0){ - maxval[k]=1; - }else{ - maxval[k]=sbooks[info->class_subbook[class][k]]->entries; - } - } - for(k=0;kphrasebits+= - vorbis_book_encode(books+info->class_book[class],cval,opb); - -#ifdef TRAIN_FLOOR1 - { - FILE *of; - char buffer[80]; - sprintf(buffer,"line_%dx%ld_class%d.vqd", - vb->pcmend/2,posts-2,class); - of=fopen(buffer,"a"); - fprintf(of,"%d\n",cval); - fclose(of); - } -#endif - } - - /* write post values */ - for(k=0;kclass_subbook[class][bookas[k]]; - if(book>=0){ - /* hack to allow training with 'bad' books */ - if(out[j+k]<(books+book)->entries) - look->postbits+=vorbis_book_encode(books+book, - out[j+k],opb); - /*else - fprintf(stderr,"+!");*/ - -#ifdef TRAIN_FLOOR1 - { - FILE *of; - char buffer[80]; - sprintf(buffer,"line_%dx%ld_%dsub%d.vqd", - vb->pcmend/2,posts-2,class,bookas[k]); - of=fopen(buffer,"a"); - fprintf(of,"%d\n",out[j+k]); - fclose(of); - } -#endif - } - } - j+=cdim; - } - - { - /* generate quantized floor equivalent to what we'd unpack in decode */ - /* render the lines */ - int hx=0; - int lx=0; - int ly=post[0]*info->mult; - int n=ci->blocksizes[vb->W]/2; - - for(j=1;jposts;j++){ - int current=look->forward_index[j]; - int hy=post[current]&0x7fff; - if(hy==post[current]){ - - hy*=info->mult; - hx=info->postlist[current]; - - render_line0(n,lx,hx,ly,hy,ilogmask); - - lx=hx; - ly=hy; - } - } - for(j=hx;jpcmend/2;j++)ilogmask[j]=ly; /* be certain */ - return(1); - } - }else{ - oggpack_write(opb,0,1); - memset(ilogmask,0,vb->pcmend/2*sizeof(*ilogmask)); - return(0); - } -} - -static void *floor1_inverse1(vorbis_block *vb,vorbis_look_floor *in){ - vorbis_look_floor1 *look=(vorbis_look_floor1 *)in; - vorbis_info_floor1 *info=look->vi; - codec_setup_info *ci=vb->vd->vi->codec_setup; - - int i,j,k; - codebook *books=ci->fullbooks; - - /* unpack wrapped/predicted values from stream */ - if(oggpack_read(&vb->opb,1)==1){ - int *fit_value=_vorbis_block_alloc(vb,(look->posts)*sizeof(*fit_value)); - - fit_value[0]=oggpack_read(&vb->opb,ov_ilog(look->quant_q-1)); - fit_value[1]=oggpack_read(&vb->opb,ov_ilog(look->quant_q-1)); - - /* partition by partition */ - for(i=0,j=2;ipartitions;i++){ - int class=info->partitionclass[i]; - int cdim=info->class_dim[class]; - int csubbits=info->class_subs[class]; - int csub=1<class_book[class],&vb->opb); - - if(cval==-1)goto eop; - } - - for(k=0;kclass_subbook[class][cval&(csub-1)]; - cval>>=csubbits; - if(book>=0){ - if((fit_value[j+k]=vorbis_book_decode(books+book,&vb->opb))==-1) - goto eop; - }else{ - fit_value[j+k]=0; - } - } - j+=cdim; - } - - /* unwrap positive values and reconsitute via linear interpolation */ - for(i=2;iposts;i++){ - int predicted=render_point(info->postlist[look->loneighbor[i-2]], - info->postlist[look->hineighbor[i-2]], - fit_value[look->loneighbor[i-2]], - fit_value[look->hineighbor[i-2]], - info->postlist[i]); - int hiroom=look->quant_q-predicted; - int loroom=predicted; - int room=(hiroom=room){ - if(hiroom>loroom){ - val = val-loroom; - }else{ - val = -1-(val-hiroom); - } - }else{ - if(val&1){ - val= -((val+1)>>1); - }else{ - val>>=1; - } - } - - fit_value[i]=(val+predicted)&0x7fff; - fit_value[look->loneighbor[i-2]]&=0x7fff; - fit_value[look->hineighbor[i-2]]&=0x7fff; - - }else{ - fit_value[i]=predicted|0x8000; - } - - } - - return(fit_value); - } - eop: - return(NULL); -} - -static int floor1_inverse2(vorbis_block *vb,vorbis_look_floor *in,void *memo, - float *out){ - vorbis_look_floor1 *look=(vorbis_look_floor1 *)in; - vorbis_info_floor1 *info=look->vi; - - codec_setup_info *ci=vb->vd->vi->codec_setup; - int n=ci->blocksizes[vb->W]/2; - int j; - - if(memo){ - /* render the lines */ - int *fit_value=(int *)memo; - int hx=0; - int lx=0; - int ly=fit_value[0]*info->mult; - /* guard lookup against out-of-range values */ - ly=(ly<0?0:ly>255?255:ly); - - for(j=1;jposts;j++){ - int current=look->forward_index[j]; - int hy=fit_value[current]&0x7fff; - if(hy==fit_value[current]){ - - hx=info->postlist[current]; - hy*=info->mult; - /* guard lookup against out-of-range values */ - hy=(hy<0?0:hy>255?255:hy); - - render_line(n,lx,hx,ly,hy,out); - - lx=hx; - ly=hy; - } - } - for(j=hx;j header packets - last mod: $Id: info.c 19441 2015-01-21 01:17:41Z xiphmont $ - - ********************************************************************/ - -/* general handling of the header and the vorbis_info structure (and - substructures) */ - -#include -#include -#include -#include -#include "vorbis/codec.h" -#include "codec_internal.h" -#include "codebook.h" -#include "registry.h" -#include "window.h" -#include "psy.h" -#include "misc.h" -#include "os.h" - -#define GENERAL_VENDOR_STRING "Xiph.Org libVorbis 1.3.5" -#define ENCODE_VENDOR_STRING "Xiph.Org libVorbis I 20150105 (⛄⛄⛄⛄)" - -/* helpers */ -static void _v_writestring(oggpack_buffer *o,const char *s, int bytes){ - - while(bytes--){ - oggpack_write(o,*s++,8); - } -} - -static void _v_readstring(oggpack_buffer *o,char *buf,int bytes){ - while(bytes--){ - *buf++=oggpack_read(o,8); - } -} - -void vorbis_comment_init(vorbis_comment *vc){ - memset(vc,0,sizeof(*vc)); -} - -void vorbis_comment_add(vorbis_comment *vc,const char *comment){ - vc->user_comments=_ogg_realloc(vc->user_comments, - (vc->comments+2)*sizeof(*vc->user_comments)); - vc->comment_lengths=_ogg_realloc(vc->comment_lengths, - (vc->comments+2)*sizeof(*vc->comment_lengths)); - vc->comment_lengths[vc->comments]=strlen(comment); - vc->user_comments[vc->comments]=_ogg_malloc(vc->comment_lengths[vc->comments]+1); - strcpy(vc->user_comments[vc->comments], comment); - vc->comments++; - vc->user_comments[vc->comments]=NULL; -} - -void vorbis_comment_add_tag(vorbis_comment *vc, const char *tag, const char *contents){ - char *comment=alloca(strlen(tag)+strlen(contents)+2); /* +2 for = and \0 */ - strcpy(comment, tag); - strcat(comment, "="); - strcat(comment, contents); - vorbis_comment_add(vc, comment); -} - -/* This is more or less the same as strncasecmp - but that doesn't exist - * everywhere, and this is a fairly trivial function, so we include it */ -static int tagcompare(const char *s1, const char *s2, int n){ - int c=0; - while(c < n){ - if(toupper(s1[c]) != toupper(s2[c])) - return !0; - c++; - } - return 0; -} - -char *vorbis_comment_query(vorbis_comment *vc, const char *tag, int count){ - long i; - int found = 0; - int taglen = strlen(tag)+1; /* +1 for the = we append */ - char *fulltag = alloca(taglen+ 1); - - strcpy(fulltag, tag); - strcat(fulltag, "="); - - for(i=0;icomments;i++){ - if(!tagcompare(vc->user_comments[i], fulltag, taglen)){ - if(count == found) - /* We return a pointer to the data, not a copy */ - return vc->user_comments[i] + taglen; - else - found++; - } - } - return NULL; /* didn't find anything */ -} - -int vorbis_comment_query_count(vorbis_comment *vc, const char *tag){ - int i,count=0; - int taglen = strlen(tag)+1; /* +1 for the = we append */ - char *fulltag = alloca(taglen+1); - strcpy(fulltag,tag); - strcat(fulltag, "="); - - for(i=0;icomments;i++){ - if(!tagcompare(vc->user_comments[i], fulltag, taglen)) - count++; - } - - return count; -} - -void vorbis_comment_clear(vorbis_comment *vc){ - if(vc){ - long i; - if(vc->user_comments){ - for(i=0;icomments;i++) - if(vc->user_comments[i])_ogg_free(vc->user_comments[i]); - _ogg_free(vc->user_comments); - } - if(vc->comment_lengths)_ogg_free(vc->comment_lengths); - if(vc->vendor)_ogg_free(vc->vendor); - memset(vc,0,sizeof(*vc)); - } -} - -/* blocksize 0 is guaranteed to be short, 1 is guaranteed to be long. - They may be equal, but short will never ge greater than long */ -int vorbis_info_blocksize(vorbis_info *vi,int zo){ - codec_setup_info *ci = vi->codec_setup; - return ci ? ci->blocksizes[zo] : -1; -} - -/* used by synthesis, which has a full, alloced vi */ -void vorbis_info_init(vorbis_info *vi){ - memset(vi,0,sizeof(*vi)); - vi->codec_setup=_ogg_calloc(1,sizeof(codec_setup_info)); -} - -void vorbis_info_clear(vorbis_info *vi){ - codec_setup_info *ci=vi->codec_setup; - int i; - - if(ci){ - - for(i=0;imodes;i++) - if(ci->mode_param[i])_ogg_free(ci->mode_param[i]); - - for(i=0;imaps;i++) /* unpack does the range checking */ - if(ci->map_param[i]) /* this may be cleaning up an aborted - unpack, in which case the below type - cannot be trusted */ - _mapping_P[ci->map_type[i]]->free_info(ci->map_param[i]); - - for(i=0;ifloors;i++) /* unpack does the range checking */ - if(ci->floor_param[i]) /* this may be cleaning up an aborted - unpack, in which case the below type - cannot be trusted */ - _floor_P[ci->floor_type[i]]->free_info(ci->floor_param[i]); - - for(i=0;iresidues;i++) /* unpack does the range checking */ - if(ci->residue_param[i]) /* this may be cleaning up an aborted - unpack, in which case the below type - cannot be trusted */ - _residue_P[ci->residue_type[i]]->free_info(ci->residue_param[i]); - - for(i=0;ibooks;i++){ - if(ci->book_param[i]){ - /* knows if the book was not alloced */ - vorbis_staticbook_destroy(ci->book_param[i]); - } - if(ci->fullbooks) - vorbis_book_clear(ci->fullbooks+i); - } - if(ci->fullbooks) - _ogg_free(ci->fullbooks); - - for(i=0;ipsys;i++) - _vi_psy_free(ci->psy_param[i]); - - _ogg_free(ci); - } - - memset(vi,0,sizeof(*vi)); -} - -/* Header packing/unpacking ********************************************/ - -static int _vorbis_unpack_info(vorbis_info *vi,oggpack_buffer *opb){ - codec_setup_info *ci=vi->codec_setup; - if(!ci)return(OV_EFAULT); - - vi->version=oggpack_read(opb,32); - if(vi->version!=0)return(OV_EVERSION); - - vi->channels=oggpack_read(opb,8); - vi->rate=oggpack_read(opb,32); - - vi->bitrate_upper=oggpack_read(opb,32); - vi->bitrate_nominal=oggpack_read(opb,32); - vi->bitrate_lower=oggpack_read(opb,32); - - ci->blocksizes[0]=1<blocksizes[1]=1<rate<1)goto err_out; - if(vi->channels<1)goto err_out; - if(ci->blocksizes[0]<64)goto err_out; - if(ci->blocksizes[1]blocksizes[0])goto err_out; - if(ci->blocksizes[1]>8192)goto err_out; - - if(oggpack_read(opb,1)!=1)goto err_out; /* EOP check */ - - return(0); - err_out: - vorbis_info_clear(vi); - return(OV_EBADHEADER); -} - -static int _vorbis_unpack_comment(vorbis_comment *vc,oggpack_buffer *opb){ - int i; - int vendorlen=oggpack_read(opb,32); - if(vendorlen<0)goto err_out; - if(vendorlen>opb->storage-8)goto err_out; - vc->vendor=_ogg_calloc(vendorlen+1,1); - _v_readstring(opb,vc->vendor,vendorlen); - i=oggpack_read(opb,32); - if(i<0)goto err_out; - if(i>((opb->storage-oggpack_bytes(opb))>>2))goto err_out; - vc->comments=i; - vc->user_comments=_ogg_calloc(vc->comments+1,sizeof(*vc->user_comments)); - vc->comment_lengths=_ogg_calloc(vc->comments+1, sizeof(*vc->comment_lengths)); - - for(i=0;icomments;i++){ - int len=oggpack_read(opb,32); - if(len<0)goto err_out; - if(len>opb->storage-oggpack_bytes(opb))goto err_out; - vc->comment_lengths[i]=len; - vc->user_comments[i]=_ogg_calloc(len+1,1); - _v_readstring(opb,vc->user_comments[i],len); - } - if(oggpack_read(opb,1)!=1)goto err_out; /* EOP check */ - - return(0); - err_out: - vorbis_comment_clear(vc); - return(OV_EBADHEADER); -} - -/* all of the real encoding details are here. The modes, books, - everything */ -static int _vorbis_unpack_books(vorbis_info *vi,oggpack_buffer *opb){ - codec_setup_info *ci=vi->codec_setup; - int i; - - /* codebooks */ - ci->books=oggpack_read(opb,8)+1; - if(ci->books<=0)goto err_out; - for(i=0;ibooks;i++){ - ci->book_param[i]=vorbis_staticbook_unpack(opb); - if(!ci->book_param[i])goto err_out; - } - - /* time backend settings; hooks are unused */ - { - int times=oggpack_read(opb,6)+1; - if(times<=0)goto err_out; - for(i=0;i=VI_TIMEB)goto err_out; - } - } - - /* floor backend settings */ - ci->floors=oggpack_read(opb,6)+1; - if(ci->floors<=0)goto err_out; - for(i=0;ifloors;i++){ - ci->floor_type[i]=oggpack_read(opb,16); - if(ci->floor_type[i]<0 || ci->floor_type[i]>=VI_FLOORB)goto err_out; - ci->floor_param[i]=_floor_P[ci->floor_type[i]]->unpack(vi,opb); - if(!ci->floor_param[i])goto err_out; - } - - /* residue backend settings */ - ci->residues=oggpack_read(opb,6)+1; - if(ci->residues<=0)goto err_out; - for(i=0;iresidues;i++){ - ci->residue_type[i]=oggpack_read(opb,16); - if(ci->residue_type[i]<0 || ci->residue_type[i]>=VI_RESB)goto err_out; - ci->residue_param[i]=_residue_P[ci->residue_type[i]]->unpack(vi,opb); - if(!ci->residue_param[i])goto err_out; - } - - /* map backend settings */ - ci->maps=oggpack_read(opb,6)+1; - if(ci->maps<=0)goto err_out; - for(i=0;imaps;i++){ - ci->map_type[i]=oggpack_read(opb,16); - if(ci->map_type[i]<0 || ci->map_type[i]>=VI_MAPB)goto err_out; - ci->map_param[i]=_mapping_P[ci->map_type[i]]->unpack(vi,opb); - if(!ci->map_param[i])goto err_out; - } - - /* mode settings */ - ci->modes=oggpack_read(opb,6)+1; - if(ci->modes<=0)goto err_out; - for(i=0;imodes;i++){ - ci->mode_param[i]=_ogg_calloc(1,sizeof(*ci->mode_param[i])); - ci->mode_param[i]->blockflag=oggpack_read(opb,1); - ci->mode_param[i]->windowtype=oggpack_read(opb,16); - ci->mode_param[i]->transformtype=oggpack_read(opb,16); - ci->mode_param[i]->mapping=oggpack_read(opb,8); - - if(ci->mode_param[i]->windowtype>=VI_WINDOWB)goto err_out; - if(ci->mode_param[i]->transformtype>=VI_WINDOWB)goto err_out; - if(ci->mode_param[i]->mapping>=ci->maps)goto err_out; - if(ci->mode_param[i]->mapping<0)goto err_out; - } - - if(oggpack_read(opb,1)!=1)goto err_out; /* top level EOP check */ - - return(0); - err_out: - vorbis_info_clear(vi); - return(OV_EBADHEADER); -} - -/* Is this packet a vorbis ID header? */ -int vorbis_synthesis_idheader(ogg_packet *op){ - oggpack_buffer opb; - char buffer[6]; - - if(op){ - oggpack_readinit(&opb,op->packet,op->bytes); - - if(!op->b_o_s) - return(0); /* Not the initial packet */ - - if(oggpack_read(&opb,8) != 1) - return 0; /* not an ID header */ - - memset(buffer,0,6); - _v_readstring(&opb,buffer,6); - if(memcmp(buffer,"vorbis",6)) - return 0; /* not vorbis */ - - return 1; - } - - return 0; -} - -/* The Vorbis header is in three packets; the initial small packet in - the first page that identifies basic parameters, a second packet - with bitstream comments and a third packet that holds the - codebook. */ - -int vorbis_synthesis_headerin(vorbis_info *vi,vorbis_comment *vc,ogg_packet *op){ - oggpack_buffer opb; - - if(op){ - oggpack_readinit(&opb,op->packet,op->bytes); - - /* Which of the three types of header is this? */ - /* Also verify header-ness, vorbis */ - { - char buffer[6]; - int packtype=oggpack_read(&opb,8); - memset(buffer,0,6); - _v_readstring(&opb,buffer,6); - if(memcmp(buffer,"vorbis",6)){ - /* not a vorbis header */ - return(OV_ENOTVORBIS); - } - switch(packtype){ - case 0x01: /* least significant *bit* is read first */ - if(!op->b_o_s){ - /* Not the initial packet */ - return(OV_EBADHEADER); - } - if(vi->rate!=0){ - /* previously initialized info header */ - return(OV_EBADHEADER); - } - - return(_vorbis_unpack_info(vi,&opb)); - - case 0x03: /* least significant *bit* is read first */ - if(vi->rate==0){ - /* um... we didn't get the initial header */ - return(OV_EBADHEADER); - } - if(vc->vendor!=NULL){ - /* previously initialized comment header */ - return(OV_EBADHEADER); - } - - return(_vorbis_unpack_comment(vc,&opb)); - - case 0x05: /* least significant *bit* is read first */ - if(vi->rate==0 || vc->vendor==NULL){ - /* um... we didn;t get the initial header or comments yet */ - return(OV_EBADHEADER); - } - if(vi->codec_setup==NULL){ - /* improperly initialized vorbis_info */ - return(OV_EFAULT); - } - if(((codec_setup_info *)vi->codec_setup)->books>0){ - /* previously initialized setup header */ - return(OV_EBADHEADER); - } - - return(_vorbis_unpack_books(vi,&opb)); - - default: - /* Not a valid vorbis header type */ - return(OV_EBADHEADER); - break; - } - } - } - return(OV_EBADHEADER); -} - -/* pack side **********************************************************/ - -static int _vorbis_pack_info(oggpack_buffer *opb,vorbis_info *vi){ - codec_setup_info *ci=vi->codec_setup; - if(!ci|| - ci->blocksizes[0]<64|| - ci->blocksizes[1]blocksizes[0]){ - return(OV_EFAULT); - } - - /* preamble */ - oggpack_write(opb,0x01,8); - _v_writestring(opb,"vorbis", 6); - - /* basic information about the stream */ - oggpack_write(opb,0x00,32); - oggpack_write(opb,vi->channels,8); - oggpack_write(opb,vi->rate,32); - - oggpack_write(opb,vi->bitrate_upper,32); - oggpack_write(opb,vi->bitrate_nominal,32); - oggpack_write(opb,vi->bitrate_lower,32); - - oggpack_write(opb,ov_ilog(ci->blocksizes[0]-1),4); - oggpack_write(opb,ov_ilog(ci->blocksizes[1]-1),4); - oggpack_write(opb,1,1); - - return(0); -} - -static int _vorbis_pack_comment(oggpack_buffer *opb,vorbis_comment *vc){ - int bytes = strlen(ENCODE_VENDOR_STRING); - - /* preamble */ - oggpack_write(opb,0x03,8); - _v_writestring(opb,"vorbis", 6); - - /* vendor */ - oggpack_write(opb,bytes,32); - _v_writestring(opb,ENCODE_VENDOR_STRING, bytes); - - /* comments */ - - oggpack_write(opb,vc->comments,32); - if(vc->comments){ - int i; - for(i=0;icomments;i++){ - if(vc->user_comments[i]){ - oggpack_write(opb,vc->comment_lengths[i],32); - _v_writestring(opb,vc->user_comments[i], vc->comment_lengths[i]); - }else{ - oggpack_write(opb,0,32); - } - } - } - oggpack_write(opb,1,1); - - return(0); -} - -static int _vorbis_pack_books(oggpack_buffer *opb,vorbis_info *vi){ - codec_setup_info *ci=vi->codec_setup; - int i; - if(!ci)return(OV_EFAULT); - - oggpack_write(opb,0x05,8); - _v_writestring(opb,"vorbis", 6); - - /* books */ - oggpack_write(opb,ci->books-1,8); - for(i=0;ibooks;i++) - if(vorbis_staticbook_pack(ci->book_param[i],opb))goto err_out; - - /* times; hook placeholders */ - oggpack_write(opb,0,6); - oggpack_write(opb,0,16); - - /* floors */ - oggpack_write(opb,ci->floors-1,6); - for(i=0;ifloors;i++){ - oggpack_write(opb,ci->floor_type[i],16); - if(_floor_P[ci->floor_type[i]]->pack) - _floor_P[ci->floor_type[i]]->pack(ci->floor_param[i],opb); - else - goto err_out; - } - - /* residues */ - oggpack_write(opb,ci->residues-1,6); - for(i=0;iresidues;i++){ - oggpack_write(opb,ci->residue_type[i],16); - _residue_P[ci->residue_type[i]]->pack(ci->residue_param[i],opb); - } - - /* maps */ - oggpack_write(opb,ci->maps-1,6); - for(i=0;imaps;i++){ - oggpack_write(opb,ci->map_type[i],16); - _mapping_P[ci->map_type[i]]->pack(vi,ci->map_param[i],opb); - } - - /* modes */ - oggpack_write(opb,ci->modes-1,6); - for(i=0;imodes;i++){ - oggpack_write(opb,ci->mode_param[i]->blockflag,1); - oggpack_write(opb,ci->mode_param[i]->windowtype,16); - oggpack_write(opb,ci->mode_param[i]->transformtype,16); - oggpack_write(opb,ci->mode_param[i]->mapping,8); - } - oggpack_write(opb,1,1); - - return(0); -err_out: - return(-1); -} - -int vorbis_commentheader_out(vorbis_comment *vc, - ogg_packet *op){ - - oggpack_buffer opb; - - oggpack_writeinit(&opb); - if(_vorbis_pack_comment(&opb,vc)){ - oggpack_writeclear(&opb); - return OV_EIMPL; - } - - op->packet = _ogg_malloc(oggpack_bytes(&opb)); - memcpy(op->packet, opb.buffer, oggpack_bytes(&opb)); - - op->bytes=oggpack_bytes(&opb); - op->b_o_s=0; - op->e_o_s=0; - op->granulepos=0; - op->packetno=1; - - oggpack_writeclear(&opb); - return 0; -} - -int vorbis_analysis_headerout(vorbis_dsp_state *v, - vorbis_comment *vc, - ogg_packet *op, - ogg_packet *op_comm, - ogg_packet *op_code){ - int ret=OV_EIMPL; - vorbis_info *vi=v->vi; - oggpack_buffer opb; - private_state *b=v->backend_state; - - if(!b||vi->channels<=0){ - ret=OV_EFAULT; - goto err_out; - } - - /* first header packet **********************************************/ - - oggpack_writeinit(&opb); - if(_vorbis_pack_info(&opb,vi))goto err_out; - - /* build the packet */ - if(b->header)_ogg_free(b->header); - b->header=_ogg_malloc(oggpack_bytes(&opb)); - memcpy(b->header,opb.buffer,oggpack_bytes(&opb)); - op->packet=b->header; - op->bytes=oggpack_bytes(&opb); - op->b_o_s=1; - op->e_o_s=0; - op->granulepos=0; - op->packetno=0; - - /* second header packet (comments) **********************************/ - - oggpack_reset(&opb); - if(_vorbis_pack_comment(&opb,vc))goto err_out; - - if(b->header1)_ogg_free(b->header1); - b->header1=_ogg_malloc(oggpack_bytes(&opb)); - memcpy(b->header1,opb.buffer,oggpack_bytes(&opb)); - op_comm->packet=b->header1; - op_comm->bytes=oggpack_bytes(&opb); - op_comm->b_o_s=0; - op_comm->e_o_s=0; - op_comm->granulepos=0; - op_comm->packetno=1; - - /* third header packet (modes/codebooks) ****************************/ - - oggpack_reset(&opb); - if(_vorbis_pack_books(&opb,vi))goto err_out; - - if(b->header2)_ogg_free(b->header2); - b->header2=_ogg_malloc(oggpack_bytes(&opb)); - memcpy(b->header2,opb.buffer,oggpack_bytes(&opb)); - op_code->packet=b->header2; - op_code->bytes=oggpack_bytes(&opb); - op_code->b_o_s=0; - op_code->e_o_s=0; - op_code->granulepos=0; - op_code->packetno=2; - - oggpack_writeclear(&opb); - return(0); - err_out: - memset(op,0,sizeof(*op)); - memset(op_comm,0,sizeof(*op_comm)); - memset(op_code,0,sizeof(*op_code)); - - if(b){ - oggpack_writeclear(&opb); - if(b->header)_ogg_free(b->header); - if(b->header1)_ogg_free(b->header1); - if(b->header2)_ogg_free(b->header2); - b->header=NULL; - b->header1=NULL; - b->header2=NULL; - } - return(ret); -} - -double vorbis_granule_time(vorbis_dsp_state *v,ogg_int64_t granulepos){ - if(granulepos == -1) return -1; - - /* We're not guaranteed a 64 bit unsigned type everywhere, so we - have to put the unsigned granpo in a signed type. */ - if(granulepos>=0){ - return((double)granulepos/v->vi->rate); - }else{ - ogg_int64_t granuleoff=0xffffffff; - granuleoff<<=31; - granuleoff|=0x7ffffffff; - return(((double)granulepos+2+granuleoff+granuleoff)/v->vi->rate); - } -} - -const char *vorbis_version_string(void){ - return GENERAL_VENDOR_STRING; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/lookup.c b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/lookup.c deleted file mode 100644 index 3321ed3d..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/lookup.c +++ /dev/null @@ -1,94 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: lookup based functions - last mod: $Id: lookup.c 16227 2009-07-08 06:58:46Z xiphmont $ - - ********************************************************************/ - -#include -#include "lookup.h" -#include "lookup_data.h" -#include "os.h" -#include "misc.h" - -#ifdef FLOAT_LOOKUP - -/* interpolated lookup based cos function, domain 0 to PI only */ -float vorbis_coslook(float a){ - double d=a*(.31830989*(float)COS_LOOKUP_SZ); - int i=vorbis_ftoi(d-.5); - - return COS_LOOKUP[i]+ (d-i)*(COS_LOOKUP[i+1]-COS_LOOKUP[i]); -} - -/* interpolated 1./sqrt(p) where .5 <= p < 1. */ -float vorbis_invsqlook(float a){ - double d=a*(2.f*(float)INVSQ_LOOKUP_SZ)-(float)INVSQ_LOOKUP_SZ; - int i=vorbis_ftoi(d-.5f); - return INVSQ_LOOKUP[i]+ (d-i)*(INVSQ_LOOKUP[i+1]-INVSQ_LOOKUP[i]); -} - -/* interpolated 1./sqrt(p) where .5 <= p < 1. */ -float vorbis_invsq2explook(int a){ - return INVSQ2EXP_LOOKUP[a-INVSQ2EXP_LOOKUP_MIN]; -} - -#include -/* interpolated lookup based fromdB function, domain -140dB to 0dB only */ -float vorbis_fromdBlook(float a){ - int i=vorbis_ftoi(a*((float)(-(1<=(FROMdB_LOOKUP_SZ<>FROMdB_SHIFT]*FROMdB2_LOOKUP[i&FROMdB2_MASK]); -} - -#endif - -#ifdef INT_LOOKUP -/* interpolated 1./sqrt(p) where .5 <= a < 1. (.100000... to .111111...) in - 16.16 format - - returns in m.8 format */ -long vorbis_invsqlook_i(long a,long e){ - long i=(a&0x7fff)>>(INVSQ_LOOKUP_I_SHIFT-1); - long d=(a&INVSQ_LOOKUP_I_MASK)<<(16-INVSQ_LOOKUP_I_SHIFT); /* 0.16 */ - long val=INVSQ_LOOKUP_I[i]- /* 1.16 */ - (((INVSQ_LOOKUP_I[i]-INVSQ_LOOKUP_I[i+1])* /* 0.16 */ - d)>>16); /* result 1.16 */ - - e+=32; - if(e&1)val=(val*5792)>>13; /* multiply val by 1/sqrt(2) */ - e=(e>>1)-8; - - return(val>>e); -} - -/* interpolated lookup based fromdB function, domain -140dB to 0dB only */ -/* a is in n.12 format */ -float vorbis_fromdBlook_i(long a){ - int i=(-a)>>(12-FROMdB2_SHIFT); - return (i<0)?1.f: - ((i>=(FROMdB_LOOKUP_SZ<>FROMdB_SHIFT]*FROMdB2_LOOKUP[i&FROMdB2_MASK]); -} - -/* interpolated lookup based cos function, domain 0 to PI only */ -/* a is in 0.16 format, where 0==0, 2^^16-1==PI, return 0.14 */ -long vorbis_coslook_i(long a){ - int i=a>>COS_LOOKUP_I_SHIFT; - int d=a&COS_LOOKUP_I_MASK; - return COS_LOOKUP_I[i]- ((d*(COS_LOOKUP_I[i]-COS_LOOKUP_I[i+1]))>> - COS_LOOKUP_I_SHIFT); -} - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/lookup.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/lookup.h deleted file mode 100644 index f8b5b827..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/lookup.h +++ /dev/null @@ -1,32 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: lookup based functions - last mod: $Id: lookup.h 16227 2009-07-08 06:58:46Z xiphmont $ - - ********************************************************************/ - -#ifndef _V_LOOKUP_H_ - -#ifdef FLOAT_LOOKUP -extern float vorbis_coslook(float a); -extern float vorbis_invsqlook(float a); -extern float vorbis_invsq2explook(int a); -extern float vorbis_fromdBlook(float a); -#endif -#ifdef INT_LOOKUP -extern long vorbis_invsqlook_i(long a,long e); -extern long vorbis_coslook_i(long a); -extern float vorbis_fromdBlook_i(long a); -#endif - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/lookup_data.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/lookup_data.h deleted file mode 100644 index 2424a1b3..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/lookup_data.h +++ /dev/null @@ -1,192 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: lookup data; generated by lookups.pl; edit there - last mod: $Id: lookup_data.h 16037 2009-05-26 21:10:58Z xiphmont $ - - ********************************************************************/ - -#ifndef _V_LOOKUP_DATA_H_ - -#ifdef FLOAT_LOOKUP -#define COS_LOOKUP_SZ 128 -static const float COS_LOOKUP[COS_LOOKUP_SZ+1]={ - +1.0000000000000f,+0.9996988186962f,+0.9987954562052f,+0.9972904566787f, - +0.9951847266722f,+0.9924795345987f,+0.9891765099648f,+0.9852776423889f, - +0.9807852804032f,+0.9757021300385f,+0.9700312531945f,+0.9637760657954f, - +0.9569403357322f,+0.9495281805930f,+0.9415440651830f,+0.9329927988347f, - +0.9238795325113f,+0.9142097557035f,+0.9039892931234f,+0.8932243011955f, - +0.8819212643484f,+0.8700869911087f,+0.8577286100003f,+0.8448535652497f, - +0.8314696123025f,+0.8175848131516f,+0.8032075314806f,+0.7883464276266f, - +0.7730104533627f,+0.7572088465065f,+0.7409511253550f,+0.7242470829515f, - +0.7071067811865f,+0.6895405447371f,+0.6715589548470f,+0.6531728429538f, - +0.6343932841636f,+0.6152315905806f,+0.5956993044924f,+0.5758081914178f, - +0.5555702330196f,+0.5349976198871f,+0.5141027441932f,+0.4928981922298f, - +0.4713967368260f,+0.4496113296546f,+0.4275550934303f,+0.4052413140050f, - +0.3826834323651f,+0.3598950365350f,+0.3368898533922f,+0.3136817403989f, - +0.2902846772545f,+0.2667127574749f,+0.2429801799033f,+0.2191012401569f, - +0.1950903220161f,+0.1709618887603f,+0.1467304744554f,+0.1224106751992f, - +0.0980171403296f,+0.0735645635997f,+0.0490676743274f,+0.0245412285229f, - +0.0000000000000f,-0.0245412285229f,-0.0490676743274f,-0.0735645635997f, - -0.0980171403296f,-0.1224106751992f,-0.1467304744554f,-0.1709618887603f, - -0.1950903220161f,-0.2191012401569f,-0.2429801799033f,-0.2667127574749f, - -0.2902846772545f,-0.3136817403989f,-0.3368898533922f,-0.3598950365350f, - -0.3826834323651f,-0.4052413140050f,-0.4275550934303f,-0.4496113296546f, - -0.4713967368260f,-0.4928981922298f,-0.5141027441932f,-0.5349976198871f, - -0.5555702330196f,-0.5758081914178f,-0.5956993044924f,-0.6152315905806f, - -0.6343932841636f,-0.6531728429538f,-0.6715589548470f,-0.6895405447371f, - -0.7071067811865f,-0.7242470829515f,-0.7409511253550f,-0.7572088465065f, - -0.7730104533627f,-0.7883464276266f,-0.8032075314806f,-0.8175848131516f, - -0.8314696123025f,-0.8448535652497f,-0.8577286100003f,-0.8700869911087f, - -0.8819212643484f,-0.8932243011955f,-0.9039892931234f,-0.9142097557035f, - -0.9238795325113f,-0.9329927988347f,-0.9415440651830f,-0.9495281805930f, - -0.9569403357322f,-0.9637760657954f,-0.9700312531945f,-0.9757021300385f, - -0.9807852804032f,-0.9852776423889f,-0.9891765099648f,-0.9924795345987f, - -0.9951847266722f,-0.9972904566787f,-0.9987954562052f,-0.9996988186962f, - -1.0000000000000f, -}; - -#define INVSQ_LOOKUP_SZ 32 -static const float INVSQ_LOOKUP[INVSQ_LOOKUP_SZ+1]={ - 1.414213562373f,1.392621247646f,1.371988681140f,1.352246807566f, - 1.333333333333f,1.315191898443f,1.297771369046f,1.281025230441f, - 1.264911064067f,1.249390095109f,1.234426799697f,1.219988562661f, - 1.206045378311f,1.192569588000f,1.179535649239f,1.166919931983f, - 1.154700538379f,1.142857142857f,1.131370849898f,1.120224067222f, - 1.109400392450f,1.098884511590f,1.088662107904f,1.078719779941f, - 1.069044967650f,1.059625885652f,1.050451462878f,1.041511287847f, - 1.032795558989f,1.024295039463f,1.016001016002f,1.007905261358f, - 1.000000000000f, -}; - -#define INVSQ2EXP_LOOKUP_MIN (-32) -#define INVSQ2EXP_LOOKUP_MAX 32 -static const float INVSQ2EXP_LOOKUP[INVSQ2EXP_LOOKUP_MAX-\ - INVSQ2EXP_LOOKUP_MIN+1]={ - 65536.f, 46340.95001f, 32768.f, 23170.47501f, - 16384.f, 11585.2375f, 8192.f, 5792.618751f, - 4096.f, 2896.309376f, 2048.f, 1448.154688f, - 1024.f, 724.0773439f, 512.f, 362.038672f, - 256.f, 181.019336f, 128.f, 90.50966799f, - 64.f, 45.254834f, 32.f, 22.627417f, - 16.f, 11.3137085f, 8.f, 5.656854249f, - 4.f, 2.828427125f, 2.f, 1.414213562f, - 1.f, 0.7071067812f, 0.5f, 0.3535533906f, - 0.25f, 0.1767766953f, 0.125f, 0.08838834765f, - 0.0625f, 0.04419417382f, 0.03125f, 0.02209708691f, - 0.015625f, 0.01104854346f, 0.0078125f, 0.005524271728f, - 0.00390625f, 0.002762135864f, 0.001953125f, 0.001381067932f, - 0.0009765625f, 0.000690533966f, 0.00048828125f, 0.000345266983f, - 0.000244140625f,0.0001726334915f,0.0001220703125f,8.631674575e-05f, - 6.103515625e-05f,4.315837288e-05f,3.051757812e-05f,2.157918644e-05f, - 1.525878906e-05f, -}; - -#endif - -#define FROMdB_LOOKUP_SZ 35 -#define FROMdB2_LOOKUP_SZ 32 -#define FROMdB_SHIFT 5 -#define FROMdB2_SHIFT 3 -#define FROMdB2_MASK 31 - -#ifdef FLOAT_LOOKUP -static const float FROMdB_LOOKUP[FROMdB_LOOKUP_SZ]={ - 1.f, 0.6309573445f, 0.3981071706f, 0.2511886432f, - 0.1584893192f, 0.1f, 0.06309573445f, 0.03981071706f, - 0.02511886432f, 0.01584893192f, 0.01f, 0.006309573445f, - 0.003981071706f, 0.002511886432f, 0.001584893192f, 0.001f, - 0.0006309573445f,0.0003981071706f,0.0002511886432f,0.0001584893192f, - 0.0001f,6.309573445e-05f,3.981071706e-05f,2.511886432e-05f, - 1.584893192e-05f, 1e-05f,6.309573445e-06f,3.981071706e-06f, - 2.511886432e-06f,1.584893192e-06f, 1e-06f,6.309573445e-07f, - 3.981071706e-07f,2.511886432e-07f,1.584893192e-07f, -}; - -static const float FROMdB2_LOOKUP[FROMdB2_LOOKUP_SZ]={ - 0.9928302478f, 0.9786445908f, 0.9646616199f, 0.9508784391f, - 0.9372921937f, 0.92390007f, 0.9106992942f, 0.8976871324f, - 0.8848608897f, 0.8722179097f, 0.8597555737f, 0.8474713009f, - 0.835362547f, 0.8234268041f, 0.8116616003f, 0.8000644989f, - 0.7886330981f, 0.7773650302f, 0.7662579617f, 0.755309592f, - 0.7445176537f, 0.7338799116f, 0.7233941627f, 0.7130582353f, - 0.7028699885f, 0.6928273125f, 0.6829281272f, 0.6731703824f, - 0.6635520573f, 0.6540711597f, 0.6447257262f, 0.6355138211f, -}; -#endif - -#ifdef INT_LOOKUP - -#define INVSQ_LOOKUP_I_SHIFT 10 -#define INVSQ_LOOKUP_I_MASK 1023 -static const long INVSQ_LOOKUP_I[64+1]={ - 92682l, 91966l, 91267l, 90583l, - 89915l, 89261l, 88621l, 87995l, - 87381l, 86781l, 86192l, 85616l, - 85051l, 84497l, 83953l, 83420l, - 82897l, 82384l, 81880l, 81385l, - 80899l, 80422l, 79953l, 79492l, - 79039l, 78594l, 78156l, 77726l, - 77302l, 76885l, 76475l, 76072l, - 75674l, 75283l, 74898l, 74519l, - 74146l, 73778l, 73415l, 73058l, - 72706l, 72359l, 72016l, 71679l, - 71347l, 71019l, 70695l, 70376l, - 70061l, 69750l, 69444l, 69141l, - 68842l, 68548l, 68256l, 67969l, - 67685l, 67405l, 67128l, 66855l, - 66585l, 66318l, 66054l, 65794l, - 65536l, -}; - -#define COS_LOOKUP_I_SHIFT 9 -#define COS_LOOKUP_I_MASK 511 -#define COS_LOOKUP_I_SZ 128 -static const long COS_LOOKUP_I[COS_LOOKUP_I_SZ+1]={ - 16384l, 16379l, 16364l, 16340l, - 16305l, 16261l, 16207l, 16143l, - 16069l, 15986l, 15893l, 15791l, - 15679l, 15557l, 15426l, 15286l, - 15137l, 14978l, 14811l, 14635l, - 14449l, 14256l, 14053l, 13842l, - 13623l, 13395l, 13160l, 12916l, - 12665l, 12406l, 12140l, 11866l, - 11585l, 11297l, 11003l, 10702l, - 10394l, 10080l, 9760l, 9434l, - 9102l, 8765l, 8423l, 8076l, - 7723l, 7366l, 7005l, 6639l, - 6270l, 5897l, 5520l, 5139l, - 4756l, 4370l, 3981l, 3590l, - 3196l, 2801l, 2404l, 2006l, - 1606l, 1205l, 804l, 402l, - 0l, -401l, -803l, -1204l, - -1605l, -2005l, -2403l, -2800l, - -3195l, -3589l, -3980l, -4369l, - -4755l, -5138l, -5519l, -5896l, - -6269l, -6638l, -7004l, -7365l, - -7722l, -8075l, -8422l, -8764l, - -9101l, -9433l, -9759l, -10079l, - -10393l, -10701l, -11002l, -11296l, - -11584l, -11865l, -12139l, -12405l, - -12664l, -12915l, -13159l, -13394l, - -13622l, -13841l, -14052l, -14255l, - -14448l, -14634l, -14810l, -14977l, - -15136l, -15285l, -15425l, -15556l, - -15678l, -15790l, -15892l, -15985l, - -16068l, -16142l, -16206l, -16260l, - -16304l, -16339l, -16363l, -16378l, - -16383l, -}; - -#endif - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/lpc.c b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/lpc.c deleted file mode 100644 index f5199ec2..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/lpc.c +++ /dev/null @@ -1,160 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: LPC low level routines - last mod: $Id: lpc.c 16227 2009-07-08 06:58:46Z xiphmont $ - - ********************************************************************/ - -/* Some of these routines (autocorrelator, LPC coefficient estimator) - are derived from code written by Jutta Degener and Carsten Bormann; - thus we include their copyright below. The entirety of this file - is freely redistributable on the condition that both of these - copyright notices are preserved without modification. */ - -/* Preserved Copyright: *********************************************/ - -/* Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann, -Technische Universita"t Berlin - -Any use of this software is permitted provided that this notice is not -removed and that neither the authors nor the Technische Universita"t -Berlin are deemed to have made any representations as to the -suitability of this software for any purpose nor are held responsible -for any defects of this software. THERE IS ABSOLUTELY NO WARRANTY FOR -THIS SOFTWARE. - -As a matter of courtesy, the authors request to be informed about uses -this software has found, about bugs in this software, and about any -improvements that may be of general interest. - -Berlin, 28.11.1994 -Jutta Degener -Carsten Bormann - -*********************************************************************/ - -#include -#include -#include -#include "os.h" -#include "smallft.h" -#include "lpc.h" -#include "scales.h" -#include "misc.h" - -/* Autocorrelation LPC coeff generation algorithm invented by - N. Levinson in 1947, modified by J. Durbin in 1959. */ - -/* Input : n elements of time doamin data - Output: m lpc coefficients, excitation energy */ - -float vorbis_lpc_from_data(float *data,float *lpci,int n,int m){ - double *aut=alloca(sizeof(*aut)*(m+1)); - double *lpc=alloca(sizeof(*lpc)*(m)); - double error; - double epsilon; - int i,j; - - /* autocorrelation, p+1 lag coefficients */ - j=m+1; - while(j--){ - double d=0; /* double needed for accumulator depth */ - for(i=j;i -#include -#include -#include "lsp.h" -#include "os.h" -#include "misc.h" -#include "lookup.h" -#include "scales.h" - -/* three possible LSP to f curve functions; the exact computation - (float), a lookup based float implementation, and an integer - implementation. The float lookup is likely the optimal choice on - any machine with an FPU. The integer implementation is *not* fixed - point (due to the need for a large dynamic range and thus a - separately tracked exponent) and thus much more complex than the - relatively simple float implementations. It's mostly for future - work on a fully fixed point implementation for processors like the - ARM family. */ - -/* define either of these (preferably FLOAT_LOOKUP) to have faster - but less precise implementation. */ -#undef FLOAT_LOOKUP -#undef INT_LOOKUP - -#ifdef FLOAT_LOOKUP -#include "lookup.c" /* catch this in the build system; we #include for - compilers (like gcc) that can't inline across - modules */ - -/* side effect: changes *lsp to cosines of lsp */ -void vorbis_lsp_to_curve(float *curve,int *map,int n,int ln,float *lsp,int m, - float amp,float ampoffset){ - int i; - float wdel=M_PI/ln; - vorbis_fpu_control fpu; - - vorbis_fpu_setround(&fpu); - for(i=0;i>1; - - while(c--){ - q*=ftmp[0]-w; - p*=ftmp[1]-w; - ftmp+=2; - } - - if(m&1){ - /* odd order filter; slightly assymetric */ - /* the last coefficient */ - q*=ftmp[0]-w; - q*=q; - p*=p*(1.f-w*w); - }else{ - /* even order filter; still symmetric */ - q*=q*(1.f+w); - p*=p*(1.f-w); - } - - q=frexp(p+q,&qexp); - q=vorbis_fromdBlook(amp* - vorbis_invsqlook(q)* - vorbis_invsq2explook(qexp+m)- - ampoffset); - - do{ - curve[i++]*=q; - }while(map[i]==k); - } - vorbis_fpu_restore(fpu); -} - -#else - -#ifdef INT_LOOKUP -#include "lookup.c" /* catch this in the build system; we #include for - compilers (like gcc) that can't inline across - modules */ - -static const int MLOOP_1[64]={ - 0,10,11,11, 12,12,12,12, 13,13,13,13, 13,13,13,13, - 14,14,14,14, 14,14,14,14, 14,14,14,14, 14,14,14,14, - 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, - 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, -}; - -static const int MLOOP_2[64]={ - 0,4,5,5, 6,6,6,6, 7,7,7,7, 7,7,7,7, - 8,8,8,8, 8,8,8,8, 8,8,8,8, 8,8,8,8, - 9,9,9,9, 9,9,9,9, 9,9,9,9, 9,9,9,9, - 9,9,9,9, 9,9,9,9, 9,9,9,9, 9,9,9,9, -}; - -static const int MLOOP_3[8]={0,1,2,2,3,3,3,3}; - - -/* side effect: changes *lsp to cosines of lsp */ -void vorbis_lsp_to_curve(float *curve,int *map,int n,int ln,float *lsp,int m, - float amp,float ampoffset){ - - /* 0 <= m < 256 */ - - /* set up for using all int later */ - int i; - int ampoffseti=rint(ampoffset*4096.f); - int ampi=rint(amp*16.f); - long *ilsp=alloca(m*sizeof(*ilsp)); - for(i=0;i>25])) - if(!(shift=MLOOP_2[(pi|qi)>>19])) - shift=MLOOP_3[(pi|qi)>>16]; - qi=(qi>>shift)*labs(ilsp[j-1]-wi); - pi=(pi>>shift)*labs(ilsp[j]-wi); - qexp+=shift; - } - if(!(shift=MLOOP_1[(pi|qi)>>25])) - if(!(shift=MLOOP_2[(pi|qi)>>19])) - shift=MLOOP_3[(pi|qi)>>16]; - - /* pi,qi normalized collectively, both tracked using qexp */ - - if(m&1){ - /* odd order filter; slightly assymetric */ - /* the last coefficient */ - qi=(qi>>shift)*labs(ilsp[j-1]-wi); - pi=(pi>>shift)<<14; - qexp+=shift; - - if(!(shift=MLOOP_1[(pi|qi)>>25])) - if(!(shift=MLOOP_2[(pi|qi)>>19])) - shift=MLOOP_3[(pi|qi)>>16]; - - pi>>=shift; - qi>>=shift; - qexp+=shift-14*((m+1)>>1); - - pi=((pi*pi)>>16); - qi=((qi*qi)>>16); - qexp=qexp*2+m; - - pi*=(1<<14)-((wi*wi)>>14); - qi+=pi>>14; - - }else{ - /* even order filter; still symmetric */ - - /* p*=p(1-w), q*=q(1+w), let normalization drift because it isn't - worth tracking step by step */ - - pi>>=shift; - qi>>=shift; - qexp+=shift-7*m; - - pi=((pi*pi)>>16); - qi=((qi*qi)>>16); - qexp=qexp*2+m; - - pi*=(1<<14)-wi; - qi*=(1<<14)+wi; - qi=(qi+pi)>>14; - - } - - - /* we've let the normalization drift because it wasn't important; - however, for the lookup, things must be normalized again. We - need at most one right shift or a number of left shifts */ - - if(qi&0xffff0000){ /* checks for 1.xxxxxxxxxxxxxxxx */ - qi>>=1; qexp++; - }else - while(qi && !(qi&0x8000)){ /* checks for 0.0xxxxxxxxxxxxxxx or less*/ - qi<<=1; qexp--; - } - - amp=vorbis_fromdBlook_i(ampi* /* n.4 */ - vorbis_invsqlook_i(qi,qexp)- - /* m.8, m+n<=8 */ - ampoffseti); /* 8.12[0] */ - - curve[i]*=amp; - while(map[++i]==k)curve[i]*=amp; - } -} - -#else - -/* old, nonoptimized but simple version for any poor sap who needs to - figure out what the hell this code does, or wants the other - fraction of a dB precision */ - -/* side effect: changes *lsp to cosines of lsp */ -void vorbis_lsp_to_curve(float *curve,int *map,int n,int ln,float *lsp,int m, - float amp,float ampoffset){ - int i; - float wdel=M_PI/ln; - for(i=0;i= i; j--) { - g[j-2] -= g[j]; - g[j] += g[j]; - } - } -} - -static int comp(const void *a,const void *b){ - return (*(float *)a<*(float *)b)-(*(float *)a>*(float *)b); -} - -/* Newton-Raphson-Maehly actually functioned as a decent root finder, - but there are root sets for which it gets into limit cycles - (exacerbated by zero suppression) and fails. We can't afford to - fail, even if the failure is 1 in 100,000,000, so we now use - Laguerre and later polish with Newton-Raphson (which can then - afford to fail) */ - -#define EPSILON 10e-7 -static int Laguerre_With_Deflation(float *a,int ord,float *r){ - int i,m; - double *defl=alloca(sizeof(*defl)*(ord+1)); - for(i=0;i<=ord;i++)defl[i]=a[i]; - - for(m=ord;m>0;m--){ - double new=0.f,delta; - - /* iterate a root */ - while(1){ - double p=defl[m],pp=0.f,ppp=0.f,denom; - - /* eval the polynomial and its first two derivatives */ - for(i=m;i>0;i--){ - ppp = new*ppp + pp; - pp = new*pp + p; - p = new*p + defl[i-1]; - } - - /* Laguerre's method */ - denom=(m-1) * ((m-1)*pp*pp - m*p*ppp); - if(denom<0) - return(-1); /* complex root! The LPC generator handed us a bad filter */ - - if(pp>0){ - denom = pp + sqrt(denom); - if(denom-(EPSILON))denom=-(EPSILON); - } - - delta = m*p/denom; - new -= delta; - - if(delta<0.f)delta*=-1; - - if(fabs(delta/new)<10e-12)break; - } - - r[m-1]=new; - - /* forward deflation */ - - for(i=m;i>0;i--) - defl[i-1]+=new*defl[i]; - defl++; - - } - return(0); -} - - -/* for spit-and-polish only */ -static int Newton_Raphson(float *a,int ord,float *r){ - int i, k, count=0; - double error=1.f; - double *root=alloca(ord*sizeof(*root)); - - for(i=0; i1e-20){ - error=0; - - for(i=0; i= 0; k--) { - - pp= pp* rooti + p; - p = p * rooti + a[k]; - } - - delta = p/pp; - root[i] -= delta; - error+= delta*delta; - } - - if(count>40)return(-1); - - count++; - } - - /* Replaced the original bubble sort with a real sort. With your - help, we can eliminate the bubble sort in our lifetime. --Monty */ - - for(i=0; i>1; - int g1_order,g2_order; - float *g1=alloca(sizeof(*g1)*(order2+1)); - float *g2=alloca(sizeof(*g2)*(order2+1)); - float *g1r=alloca(sizeof(*g1r)*(order2+1)); - float *g2r=alloca(sizeof(*g2r)*(order2+1)); - int i; - - /* even and odd are slightly different base cases */ - g1_order=(m+1)>>1; - g2_order=(m) >>1; - - /* Compute the lengths of the x polynomials. */ - /* Compute the first half of K & R F1 & F2 polynomials. */ - /* Compute half of the symmetric and antisymmetric polynomials. */ - /* Remove the roots at +1 and -1. */ - - g1[g1_order] = 1.f; - for(i=1;i<=g1_order;i++) g1[g1_order-i] = lpc[i-1]+lpc[m-i]; - g2[g2_order] = 1.f; - for(i=1;i<=g2_order;i++) g2[g2_order-i] = lpc[i-1]-lpc[m-i]; - - if(g1_order>g2_order){ - for(i=2; i<=g2_order;i++) g2[g2_order-i] += g2[g2_order-i+2]; - }else{ - for(i=1; i<=g1_order;i++) g1[g1_order-i] -= g1[g1_order-i+1]; - for(i=1; i<=g2_order;i++) g2[g2_order-i] += g2[g2_order-i+1]; - } - - /* Convert into polynomials in cos(alpha) */ - cheby(g1,g1_order); - cheby(g2,g2_order); - - /* Find the roots of the 2 even polynomials.*/ - if(Laguerre_With_Deflation(g1,g1_order,g1r) || - Laguerre_With_Deflation(g2,g2_order,g2r)) - return(-1); - - Newton_Raphson(g1,g1_order,g1r); /* if it fails, it leaves g1r alone */ - Newton_Raphson(g2,g2_order,g2r); /* if it fails, it leaves g2r alone */ - - qsort(g1r,g1_order,sizeof(*g1r),comp); - qsort(g2r,g2_order,sizeof(*g2r),comp); - - for(i=0;i -#include -#include -#include -#include -#include "vorbis/codec.h" -#include "codec_internal.h" -#include "codebook.h" -#include "window.h" -#include "registry.h" -#include "psy.h" -#include "misc.h" - -/* simplistic, wasteful way of doing this (unique lookup for each - mode/submapping); there should be a central repository for - identical lookups. That will require minor work, so I'm putting it - off as low priority. - - Why a lookup for each backend in a given mode? Because the - blocksize is set by the mode, and low backend lookups may require - parameters from other areas of the mode/mapping */ - -static void mapping0_free_info(vorbis_info_mapping *i){ - vorbis_info_mapping0 *info=(vorbis_info_mapping0 *)i; - if(info){ - memset(info,0,sizeof(*info)); - _ogg_free(info); - } -} - -static void mapping0_pack(vorbis_info *vi,vorbis_info_mapping *vm, - oggpack_buffer *opb){ - int i; - vorbis_info_mapping0 *info=(vorbis_info_mapping0 *)vm; - - /* another 'we meant to do it this way' hack... up to beta 4, we - packed 4 binary zeros here to signify one submapping in use. We - now redefine that to mean four bitflags that indicate use of - deeper features; bit0:submappings, bit1:coupling, - bit2,3:reserved. This is backward compatable with all actual uses - of the beta code. */ - - if(info->submaps>1){ - oggpack_write(opb,1,1); - oggpack_write(opb,info->submaps-1,4); - }else - oggpack_write(opb,0,1); - - if(info->coupling_steps>0){ - oggpack_write(opb,1,1); - oggpack_write(opb,info->coupling_steps-1,8); - - for(i=0;icoupling_steps;i++){ - oggpack_write(opb,info->coupling_mag[i],ov_ilog(vi->channels-1)); - oggpack_write(opb,info->coupling_ang[i],ov_ilog(vi->channels-1)); - } - }else - oggpack_write(opb,0,1); - - oggpack_write(opb,0,2); /* 2,3:reserved */ - - /* we don't write the channel submappings if we only have one... */ - if(info->submaps>1){ - for(i=0;ichannels;i++) - oggpack_write(opb,info->chmuxlist[i],4); - } - for(i=0;isubmaps;i++){ - oggpack_write(opb,0,8); /* time submap unused */ - oggpack_write(opb,info->floorsubmap[i],8); - oggpack_write(opb,info->residuesubmap[i],8); - } -} - -/* also responsible for range checking */ -static vorbis_info_mapping *mapping0_unpack(vorbis_info *vi,oggpack_buffer *opb){ - int i,b; - vorbis_info_mapping0 *info=_ogg_calloc(1,sizeof(*info)); - codec_setup_info *ci=vi->codec_setup; - memset(info,0,sizeof(*info)); - if(vi->channels<=0)goto err_out; - - b=oggpack_read(opb,1); - if(b<0)goto err_out; - if(b){ - info->submaps=oggpack_read(opb,4)+1; - if(info->submaps<=0)goto err_out; - }else - info->submaps=1; - - b=oggpack_read(opb,1); - if(b<0)goto err_out; - if(b){ - info->coupling_steps=oggpack_read(opb,8)+1; - if(info->coupling_steps<=0)goto err_out; - for(i=0;icoupling_steps;i++){ - /* vi->channels > 0 is enforced in the caller */ - int testM=info->coupling_mag[i]= - oggpack_read(opb,ov_ilog(vi->channels-1)); - int testA=info->coupling_ang[i]= - oggpack_read(opb,ov_ilog(vi->channels-1)); - - if(testM<0 || - testA<0 || - testM==testA || - testM>=vi->channels || - testA>=vi->channels) goto err_out; - } - - } - - if(oggpack_read(opb,2)!=0)goto err_out; /* 2,3:reserved */ - - if(info->submaps>1){ - for(i=0;ichannels;i++){ - info->chmuxlist[i]=oggpack_read(opb,4); - if(info->chmuxlist[i]>=info->submaps || info->chmuxlist[i]<0)goto err_out; - } - } - for(i=0;isubmaps;i++){ - oggpack_read(opb,8); /* time submap unused */ - info->floorsubmap[i]=oggpack_read(opb,8); - if(info->floorsubmap[i]>=ci->floors || info->floorsubmap[i]<0)goto err_out; - info->residuesubmap[i]=oggpack_read(opb,8); - if(info->residuesubmap[i]>=ci->residues || info->residuesubmap[i]<0)goto err_out; - } - - return info; - - err_out: - mapping0_free_info(info); - return(NULL); -} - -#include "os.h" -#include "lpc.h" -#include "lsp.h" -#include "envelope.h" -#include "mdct.h" -#include "psy.h" -#include "scales.h" - -#if 0 -static long seq=0; -static ogg_int64_t total=0; -static float FLOOR1_fromdB_LOOKUP[256]={ - 1.0649863e-07F, 1.1341951e-07F, 1.2079015e-07F, 1.2863978e-07F, - 1.3699951e-07F, 1.4590251e-07F, 1.5538408e-07F, 1.6548181e-07F, - 1.7623575e-07F, 1.8768855e-07F, 1.9988561e-07F, 2.128753e-07F, - 2.2670913e-07F, 2.4144197e-07F, 2.5713223e-07F, 2.7384213e-07F, - 2.9163793e-07F, 3.1059021e-07F, 3.3077411e-07F, 3.5226968e-07F, - 3.7516214e-07F, 3.9954229e-07F, 4.2550680e-07F, 4.5315863e-07F, - 4.8260743e-07F, 5.1396998e-07F, 5.4737065e-07F, 5.8294187e-07F, - 6.2082472e-07F, 6.6116941e-07F, 7.0413592e-07F, 7.4989464e-07F, - 7.9862701e-07F, 8.5052630e-07F, 9.0579828e-07F, 9.6466216e-07F, - 1.0273513e-06F, 1.0941144e-06F, 1.1652161e-06F, 1.2409384e-06F, - 1.3215816e-06F, 1.4074654e-06F, 1.4989305e-06F, 1.5963394e-06F, - 1.7000785e-06F, 1.8105592e-06F, 1.9282195e-06F, 2.0535261e-06F, - 2.1869758e-06F, 2.3290978e-06F, 2.4804557e-06F, 2.6416497e-06F, - 2.8133190e-06F, 2.9961443e-06F, 3.1908506e-06F, 3.3982101e-06F, - 3.6190449e-06F, 3.8542308e-06F, 4.1047004e-06F, 4.3714470e-06F, - 4.6555282e-06F, 4.9580707e-06F, 5.2802740e-06F, 5.6234160e-06F, - 5.9888572e-06F, 6.3780469e-06F, 6.7925283e-06F, 7.2339451e-06F, - 7.7040476e-06F, 8.2047000e-06F, 8.7378876e-06F, 9.3057248e-06F, - 9.9104632e-06F, 1.0554501e-05F, 1.1240392e-05F, 1.1970856e-05F, - 1.2748789e-05F, 1.3577278e-05F, 1.4459606e-05F, 1.5399272e-05F, - 1.6400004e-05F, 1.7465768e-05F, 1.8600792e-05F, 1.9809576e-05F, - 2.1096914e-05F, 2.2467911e-05F, 2.3928002e-05F, 2.5482978e-05F, - 2.7139006e-05F, 2.8902651e-05F, 3.0780908e-05F, 3.2781225e-05F, - 3.4911534e-05F, 3.7180282e-05F, 3.9596466e-05F, 4.2169667e-05F, - 4.4910090e-05F, 4.7828601e-05F, 5.0936773e-05F, 5.4246931e-05F, - 5.7772202e-05F, 6.1526565e-05F, 6.5524908e-05F, 6.9783085e-05F, - 7.4317983e-05F, 7.9147585e-05F, 8.4291040e-05F, 8.9768747e-05F, - 9.5602426e-05F, 0.00010181521F, 0.00010843174F, 0.00011547824F, - 0.00012298267F, 0.00013097477F, 0.00013948625F, 0.00014855085F, - 0.00015820453F, 0.00016848555F, 0.00017943469F, 0.00019109536F, - 0.00020351382F, 0.00021673929F, 0.00023082423F, 0.00024582449F, - 0.00026179955F, 0.00027881276F, 0.00029693158F, 0.00031622787F, - 0.00033677814F, 0.00035866388F, 0.00038197188F, 0.00040679456F, - 0.00043323036F, 0.00046138411F, 0.00049136745F, 0.00052329927F, - 0.00055730621F, 0.00059352311F, 0.00063209358F, 0.00067317058F, - 0.00071691700F, 0.00076350630F, 0.00081312324F, 0.00086596457F, - 0.00092223983F, 0.00098217216F, 0.0010459992F, 0.0011139742F, - 0.0011863665F, 0.0012634633F, 0.0013455702F, 0.0014330129F, - 0.0015261382F, 0.0016253153F, 0.0017309374F, 0.0018434235F, - 0.0019632195F, 0.0020908006F, 0.0022266726F, 0.0023713743F, - 0.0025254795F, 0.0026895994F, 0.0028643847F, 0.0030505286F, - 0.0032487691F, 0.0034598925F, 0.0036847358F, 0.0039241906F, - 0.0041792066F, 0.0044507950F, 0.0047400328F, 0.0050480668F, - 0.0053761186F, 0.0057254891F, 0.0060975636F, 0.0064938176F, - 0.0069158225F, 0.0073652516F, 0.0078438871F, 0.0083536271F, - 0.0088964928F, 0.009474637F, 0.010090352F, 0.010746080F, - 0.011444421F, 0.012188144F, 0.012980198F, 0.013823725F, - 0.014722068F, 0.015678791F, 0.016697687F, 0.017782797F, - 0.018938423F, 0.020169149F, 0.021479854F, 0.022875735F, - 0.024362330F, 0.025945531F, 0.027631618F, 0.029427276F, - 0.031339626F, 0.033376252F, 0.035545228F, 0.037855157F, - 0.040315199F, 0.042935108F, 0.045725273F, 0.048696758F, - 0.051861348F, 0.055231591F, 0.058820850F, 0.062643361F, - 0.066714279F, 0.071049749F, 0.075666962F, 0.080584227F, - 0.085821044F, 0.091398179F, 0.097337747F, 0.10366330F, - 0.11039993F, 0.11757434F, 0.12521498F, 0.13335215F, - 0.14201813F, 0.15124727F, 0.16107617F, 0.17154380F, - 0.18269168F, 0.19456402F, 0.20720788F, 0.22067342F, - 0.23501402F, 0.25028656F, 0.26655159F, 0.28387361F, - 0.30232132F, 0.32196786F, 0.34289114F, 0.36517414F, - 0.38890521F, 0.41417847F, 0.44109412F, 0.46975890F, - 0.50028648F, 0.53279791F, 0.56742212F, 0.60429640F, - 0.64356699F, 0.68538959F, 0.72993007F, 0.77736504F, - 0.82788260F, 0.88168307F, 0.9389798F, 1.F, -}; - -#endif - - -static int mapping0_forward(vorbis_block *vb){ - vorbis_dsp_state *vd=vb->vd; - vorbis_info *vi=vd->vi; - codec_setup_info *ci=vi->codec_setup; - private_state *b=vb->vd->backend_state; - vorbis_block_internal *vbi=(vorbis_block_internal *)vb->internal; - int n=vb->pcmend; - int i,j,k; - - int *nonzero = alloca(sizeof(*nonzero)*vi->channels); - float **gmdct = _vorbis_block_alloc(vb,vi->channels*sizeof(*gmdct)); - int **iwork = _vorbis_block_alloc(vb,vi->channels*sizeof(*iwork)); - int ***floor_posts = _vorbis_block_alloc(vb,vi->channels*sizeof(*floor_posts)); - - float global_ampmax=vbi->ampmax; - float *local_ampmax=alloca(sizeof(*local_ampmax)*vi->channels); - int blocktype=vbi->blocktype; - - int modenumber=vb->W; - vorbis_info_mapping0 *info=ci->map_param[modenumber]; - vorbis_look_psy *psy_look=b->psy+blocktype+(vb->W?2:0); - - vb->mode=modenumber; - - for(i=0;ichannels;i++){ - float scale=4.f/n; - float scale_dB; - - float *pcm =vb->pcm[i]; - float *logfft =pcm; - - iwork[i]=_vorbis_block_alloc(vb,n/2*sizeof(**iwork)); - gmdct[i]=_vorbis_block_alloc(vb,n/2*sizeof(**gmdct)); - - scale_dB=todB(&scale) + .345; /* + .345 is a hack; the original - todB estimation used on IEEE 754 - compliant machines had a bug that - returned dB values about a third - of a decibel too high. The bug - was harmless because tunings - implicitly took that into - account. However, fixing the bug - in the estimator requires - changing all the tunings as well. - For now, it's easier to sync - things back up here, and - recalibrate the tunings in the - next major model upgrade. */ - -#if 0 - if(vi->channels==2){ - if(i==0) - _analysis_output("pcmL",seq,pcm,n,0,0,total-n/2); - else - _analysis_output("pcmR",seq,pcm,n,0,0,total-n/2); - }else{ - _analysis_output("pcm",seq,pcm,n,0,0,total-n/2); - } -#endif - - /* window the PCM data */ - _vorbis_apply_window(pcm,b->window,ci->blocksizes,vb->lW,vb->W,vb->nW); - -#if 0 - if(vi->channels==2){ - if(i==0) - _analysis_output("windowedL",seq,pcm,n,0,0,total-n/2); - else - _analysis_output("windowedR",seq,pcm,n,0,0,total-n/2); - }else{ - _analysis_output("windowed",seq,pcm,n,0,0,total-n/2); - } -#endif - - /* transform the PCM data */ - /* only MDCT right now.... */ - mdct_forward(b->transform[vb->W][0],pcm,gmdct[i]); - - /* FFT yields more accurate tonal estimation (not phase sensitive) */ - drft_forward(&b->fft_look[vb->W],pcm); - logfft[0]=scale_dB+todB(pcm) + .345; /* + .345 is a hack; the - original todB estimation used on - IEEE 754 compliant machines had a - bug that returned dB values about - a third of a decibel too high. - The bug was harmless because - tunings implicitly took that into - account. However, fixing the bug - in the estimator requires - changing all the tunings as well. - For now, it's easier to sync - things back up here, and - recalibrate the tunings in the - next major model upgrade. */ - local_ampmax[i]=logfft[0]; - for(j=1;j>1]=scale_dB+.5f*todB(&temp) + .345; /* + - .345 is a hack; the original todB - estimation used on IEEE 754 - compliant machines had a bug that - returned dB values about a third - of a decibel too high. The bug - was harmless because tunings - implicitly took that into - account. However, fixing the bug - in the estimator requires - changing all the tunings as well. - For now, it's easier to sync - things back up here, and - recalibrate the tunings in the - next major model upgrade. */ - if(temp>local_ampmax[i])local_ampmax[i]=temp; - } - - if(local_ampmax[i]>0.f)local_ampmax[i]=0.f; - if(local_ampmax[i]>global_ampmax)global_ampmax=local_ampmax[i]; - -#if 0 - if(vi->channels==2){ - if(i==0){ - _analysis_output("fftL",seq,logfft,n/2,1,0,0); - }else{ - _analysis_output("fftR",seq,logfft,n/2,1,0,0); - } - }else{ - _analysis_output("fft",seq,logfft,n/2,1,0,0); - } -#endif - - } - - { - float *noise = _vorbis_block_alloc(vb,n/2*sizeof(*noise)); - float *tone = _vorbis_block_alloc(vb,n/2*sizeof(*tone)); - - for(i=0;ichannels;i++){ - /* the encoder setup assumes that all the modes used by any - specific bitrate tweaking use the same floor */ - - int submap=info->chmuxlist[i]; - - /* the following makes things clearer to *me* anyway */ - float *mdct =gmdct[i]; - float *logfft =vb->pcm[i]; - - float *logmdct =logfft+n/2; - float *logmask =logfft; - - vb->mode=modenumber; - - floor_posts[i]=_vorbis_block_alloc(vb,PACKETBLOBS*sizeof(**floor_posts)); - memset(floor_posts[i],0,sizeof(**floor_posts)*PACKETBLOBS); - - for(j=0;jchannels==2){ - if(i==0) - _analysis_output("mdctL",seq,logmdct,n/2,1,0,0); - else - _analysis_output("mdctR",seq,logmdct,n/2,1,0,0); - }else{ - _analysis_output("mdct",seq,logmdct,n/2,1,0,0); - } -#endif - - /* first step; noise masking. Not only does 'noise masking' - give us curves from which we can decide how much resolution - to give noise parts of the spectrum, it also implicitly hands - us a tonality estimate (the larger the value in the - 'noise_depth' vector, the more tonal that area is) */ - - _vp_noisemask(psy_look, - logmdct, - noise); /* noise does not have by-frequency offset - bias applied yet */ -#if 0 - if(vi->channels==2){ - if(i==0) - _analysis_output("noiseL",seq,noise,n/2,1,0,0); - else - _analysis_output("noiseR",seq,noise,n/2,1,0,0); - }else{ - _analysis_output("noise",seq,noise,n/2,1,0,0); - } -#endif - - /* second step: 'all the other crap'; all the stuff that isn't - computed/fit for bitrate management goes in the second psy - vector. This includes tone masking, peak limiting and ATH */ - - _vp_tonemask(psy_look, - logfft, - tone, - global_ampmax, - local_ampmax[i]); - -#if 0 - if(vi->channels==2){ - if(i==0) - _analysis_output("toneL",seq,tone,n/2,1,0,0); - else - _analysis_output("toneR",seq,tone,n/2,1,0,0); - }else{ - _analysis_output("tone",seq,tone,n/2,1,0,0); - } -#endif - - /* third step; we offset the noise vectors, overlay tone - masking. We then do a floor1-specific line fit. If we're - performing bitrate management, the line fit is performed - multiple times for up/down tweakage on demand. */ - -#if 0 - { - float aotuv[psy_look->n]; -#endif - - _vp_offset_and_mix(psy_look, - noise, - tone, - 1, - logmask, - mdct, - logmdct); - -#if 0 - if(vi->channels==2){ - if(i==0) - _analysis_output("aotuvM1_L",seq,aotuv,psy_look->n,1,1,0); - else - _analysis_output("aotuvM1_R",seq,aotuv,psy_look->n,1,1,0); - }else{ - _analysis_output("aotuvM1",seq,aotuv,psy_look->n,1,1,0); - } - } -#endif - - -#if 0 - if(vi->channels==2){ - if(i==0) - _analysis_output("mask1L",seq,logmask,n/2,1,0,0); - else - _analysis_output("mask1R",seq,logmask,n/2,1,0,0); - }else{ - _analysis_output("mask1",seq,logmask,n/2,1,0,0); - } -#endif - - /* this algorithm is hardwired to floor 1 for now; abort out if - we're *not* floor1. This won't happen unless someone has - broken the encode setup lib. Guard it anyway. */ - if(ci->floor_type[info->floorsubmap[submap]]!=1)return(-1); - - floor_posts[i][PACKETBLOBS/2]= - floor1_fit(vb,b->flr[info->floorsubmap[submap]], - logmdct, - logmask); - - /* are we managing bitrate? If so, perform two more fits for - later rate tweaking (fits represent hi/lo) */ - if(vorbis_bitrate_managed(vb) && floor_posts[i][PACKETBLOBS/2]){ - /* higher rate by way of lower noise curve */ - - _vp_offset_and_mix(psy_look, - noise, - tone, - 2, - logmask, - mdct, - logmdct); - -#if 0 - if(vi->channels==2){ - if(i==0) - _analysis_output("mask2L",seq,logmask,n/2,1,0,0); - else - _analysis_output("mask2R",seq,logmask,n/2,1,0,0); - }else{ - _analysis_output("mask2",seq,logmask,n/2,1,0,0); - } -#endif - - floor_posts[i][PACKETBLOBS-1]= - floor1_fit(vb,b->flr[info->floorsubmap[submap]], - logmdct, - logmask); - - /* lower rate by way of higher noise curve */ - _vp_offset_and_mix(psy_look, - noise, - tone, - 0, - logmask, - mdct, - logmdct); - -#if 0 - if(vi->channels==2){ - if(i==0) - _analysis_output("mask0L",seq,logmask,n/2,1,0,0); - else - _analysis_output("mask0R",seq,logmask,n/2,1,0,0); - }else{ - _analysis_output("mask0",seq,logmask,n/2,1,0,0); - } -#endif - - floor_posts[i][0]= - floor1_fit(vb,b->flr[info->floorsubmap[submap]], - logmdct, - logmask); - - /* we also interpolate a range of intermediate curves for - intermediate rates */ - for(k=1;kflr[info->floorsubmap[submap]], - floor_posts[i][0], - floor_posts[i][PACKETBLOBS/2], - k*65536/(PACKETBLOBS/2)); - for(k=PACKETBLOBS/2+1;kflr[info->floorsubmap[submap]], - floor_posts[i][PACKETBLOBS/2], - floor_posts[i][PACKETBLOBS-1], - (k-PACKETBLOBS/2)*65536/(PACKETBLOBS/2)); - } - } - } - vbi->ampmax=global_ampmax; - - /* - the next phases are performed once for vbr-only and PACKETBLOB - times for bitrate managed modes. - - 1) encode actual mode being used - 2) encode the floor for each channel, compute coded mask curve/res - 3) normalize and couple. - 4) encode residue - 5) save packet bytes to the packetblob vector - - */ - - /* iterate over the many masking curve fits we've created */ - - { - int **couple_bundle=alloca(sizeof(*couple_bundle)*vi->channels); - int *zerobundle=alloca(sizeof(*zerobundle)*vi->channels); - - for(k=(vorbis_bitrate_managed(vb)?0:PACKETBLOBS/2); - k<=(vorbis_bitrate_managed(vb)?PACKETBLOBS-1:PACKETBLOBS/2); - k++){ - oggpack_buffer *opb=vbi->packetblob[k]; - - /* start out our new packet blob with packet type and mode */ - /* Encode the packet type */ - oggpack_write(opb,0,1); - /* Encode the modenumber */ - /* Encode frame mode, pre,post windowsize, then dispatch */ - oggpack_write(opb,modenumber,b->modebits); - if(vb->W){ - oggpack_write(opb,vb->lW,1); - oggpack_write(opb,vb->nW,1); - } - - /* encode floor, compute masking curve, sep out residue */ - for(i=0;ichannels;i++){ - int submap=info->chmuxlist[i]; - int *ilogmask=iwork[i]; - - nonzero[i]=floor1_encode(opb,vb,b->flr[info->floorsubmap[submap]], - floor_posts[i][k], - ilogmask); -#if 0 - { - char buf[80]; - sprintf(buf,"maskI%c%d",i?'R':'L',k); - float work[n/2]; - for(j=0;jpsy_g_param, - psy_look, - info, - gmdct, - iwork, - nonzero, - ci->psy_g_param.sliding_lowpass[vb->W][k], - vi->channels); - -#if 0 - for(i=0;ichannels;i++){ - char buf[80]; - sprintf(buf,"res%c%d",i?'R':'L',k); - float work[n/2]; - for(j=0;jsubmaps;i++){ - int ch_in_bundle=0; - long **classifications; - int resnum=info->residuesubmap[i]; - - for(j=0;jchannels;j++){ - if(info->chmuxlist[j]==i){ - zerobundle[ch_in_bundle]=0; - if(nonzero[j])zerobundle[ch_in_bundle]=1; - couple_bundle[ch_in_bundle++]=iwork[j]; - } - } - - classifications=_residue_P[ci->residue_type[resnum]]-> - class(vb,b->residue[resnum],couple_bundle,zerobundle,ch_in_bundle); - - ch_in_bundle=0; - for(j=0;jchannels;j++) - if(info->chmuxlist[j]==i) - couple_bundle[ch_in_bundle++]=iwork[j]; - - _residue_P[ci->residue_type[resnum]]-> - forward(opb,vb,b->residue[resnum], - couple_bundle,zerobundle,ch_in_bundle,classifications,i); - } - - /* ok, done encoding. Next protopacket. */ - } - - } - -#if 0 - seq++; - total+=ci->blocksizes[vb->W]/4+ci->blocksizes[vb->nW]/4; -#endif - return(0); -} - -static int mapping0_inverse(vorbis_block *vb,vorbis_info_mapping *l){ - vorbis_dsp_state *vd=vb->vd; - vorbis_info *vi=vd->vi; - codec_setup_info *ci=vi->codec_setup; - private_state *b=vd->backend_state; - vorbis_info_mapping0 *info=(vorbis_info_mapping0 *)l; - - int i,j; - long n=vb->pcmend=ci->blocksizes[vb->W]; - - float **pcmbundle=alloca(sizeof(*pcmbundle)*vi->channels); - int *zerobundle=alloca(sizeof(*zerobundle)*vi->channels); - - int *nonzero =alloca(sizeof(*nonzero)*vi->channels); - void **floormemo=alloca(sizeof(*floormemo)*vi->channels); - - /* recover the spectral envelope; store it in the PCM vector for now */ - for(i=0;ichannels;i++){ - int submap=info->chmuxlist[i]; - floormemo[i]=_floor_P[ci->floor_type[info->floorsubmap[submap]]]-> - inverse1(vb,b->flr[info->floorsubmap[submap]]); - if(floormemo[i]) - nonzero[i]=1; - else - nonzero[i]=0; - memset(vb->pcm[i],0,sizeof(*vb->pcm[i])*n/2); - } - - /* channel coupling can 'dirty' the nonzero listing */ - for(i=0;icoupling_steps;i++){ - if(nonzero[info->coupling_mag[i]] || - nonzero[info->coupling_ang[i]]){ - nonzero[info->coupling_mag[i]]=1; - nonzero[info->coupling_ang[i]]=1; - } - } - - /* recover the residue into our working vectors */ - for(i=0;isubmaps;i++){ - int ch_in_bundle=0; - for(j=0;jchannels;j++){ - if(info->chmuxlist[j]==i){ - if(nonzero[j]) - zerobundle[ch_in_bundle]=1; - else - zerobundle[ch_in_bundle]=0; - pcmbundle[ch_in_bundle++]=vb->pcm[j]; - } - } - - _residue_P[ci->residue_type[info->residuesubmap[i]]]-> - inverse(vb,b->residue[info->residuesubmap[i]], - pcmbundle,zerobundle,ch_in_bundle); - } - - /* channel coupling */ - for(i=info->coupling_steps-1;i>=0;i--){ - float *pcmM=vb->pcm[info->coupling_mag[i]]; - float *pcmA=vb->pcm[info->coupling_ang[i]]; - - for(j=0;j0) - if(ang>0){ - pcmM[j]=mag; - pcmA[j]=mag-ang; - }else{ - pcmA[j]=mag; - pcmM[j]=mag+ang; - } - else - if(ang>0){ - pcmM[j]=mag; - pcmA[j]=mag+ang; - }else{ - pcmA[j]=mag; - pcmM[j]=mag-ang; - } - } - } - - /* compute and apply spectral envelope */ - for(i=0;ichannels;i++){ - float *pcm=vb->pcm[i]; - int submap=info->chmuxlist[i]; - _floor_P[ci->floor_type[info->floorsubmap[submap]]]-> - inverse2(vb,b->flr[info->floorsubmap[submap]], - floormemo[i],pcm); - } - - /* transform the PCM data; takes PCM vector, vb; modifies PCM vector */ - /* only MDCT right now.... */ - for(i=0;ichannels;i++){ - float *pcm=vb->pcm[i]; - mdct_backward(b->transform[vb->W][0],pcm,pcm); - } - - /* all done! */ - return(0); -} - -/* export hooks */ -const vorbis_func_mapping mapping0_exportbundle={ - &mapping0_pack, - &mapping0_unpack, - &mapping0_free_info, - &mapping0_forward, - &mapping0_inverse -}; diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/masking.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/masking.h deleted file mode 100644 index 3576ab78..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/masking.h +++ /dev/null @@ -1,785 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: masking curve data for psychoacoustics - last mod: $Id: masking.h 16227 2009-07-08 06:58:46Z xiphmont $ - - ********************************************************************/ - -#ifndef _V_MASKING_H_ -#define _V_MASKING_H_ - -/* more detailed ATH; the bass if flat to save stressing the floor - overly for only a bin or two of savings. */ - -#define MAX_ATH 88 -static const float ATH[]={ - /*15*/ -51, -52, -53, -54, -55, -56, -57, -58, - /*31*/ -59, -60, -61, -62, -63, -64, -65, -66, - /*63*/ -67, -68, -69, -70, -71, -72, -73, -74, - /*125*/ -75, -76, -77, -78, -80, -81, -82, -83, - /*250*/ -84, -85, -86, -87, -88, -88, -89, -89, - /*500*/ -90, -91, -91, -92, -93, -94, -95, -96, - /*1k*/ -96, -97, -98, -98, -99, -99,-100,-100, - /*2k*/ -101,-102,-103,-104,-106,-107,-107,-107, - /*4k*/ -107,-105,-103,-102,-101, -99, -98, -96, - /*8k*/ -95, -95, -96, -97, -96, -95, -93, -90, - /*16k*/ -80, -70, -50, -40, -30, -30, -30, -30 -}; - -/* The tone masking curves from Ehmer's and Fielder's papers have been - replaced by an empirically collected data set. The previously - published values were, far too often, simply on crack. */ - -#define EHMER_OFFSET 16 -#define EHMER_MAX 56 - -/* masking tones from -50 to 0dB, 62.5 through 16kHz at half octaves - test tones from -2 octaves to +5 octaves sampled at eighth octaves */ -/* (Vorbis 0dB, the loudest possible tone, is assumed to be ~100dB SPL - for collection of these curves) */ - -static const float tonemasks[P_BANDS][6][EHMER_MAX]={ - /* 62.5 Hz */ - {{ -60, -60, -60, -60, -60, -60, -60, -60, - -60, -60, -60, -60, -62, -62, -65, -73, - -69, -68, -68, -67, -70, -70, -72, -74, - -75, -79, -79, -80, -83, -88, -93, -100, - -110, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - { -48, -48, -48, -48, -48, -48, -48, -48, - -48, -48, -48, -48, -48, -53, -61, -66, - -66, -68, -67, -70, -76, -76, -72, -73, - -75, -76, -78, -79, -83, -88, -93, -100, - -110, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - { -37, -37, -37, -37, -37, -37, -37, -37, - -38, -40, -42, -46, -48, -53, -55, -62, - -65, -58, -56, -56, -61, -60, -65, -67, - -69, -71, -77, -77, -78, -80, -82, -84, - -88, -93, -98, -106, -112, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - { -25, -25, -25, -25, -25, -25, -25, -25, - -25, -26, -27, -29, -32, -38, -48, -52, - -52, -50, -48, -48, -51, -52, -54, -60, - -67, -67, -66, -68, -69, -73, -73, -76, - -80, -81, -81, -85, -85, -86, -88, -93, - -100, -110, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - { -16, -16, -16, -16, -16, -16, -16, -16, - -17, -19, -20, -22, -26, -28, -31, -40, - -47, -39, -39, -40, -42, -43, -47, -51, - -57, -52, -55, -55, -60, -58, -62, -63, - -70, -67, -69, -72, -73, -77, -80, -82, - -83, -87, -90, -94, -98, -104, -115, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - { -8, -8, -8, -8, -8, -8, -8, -8, - -8, -8, -10, -11, -15, -19, -25, -30, - -34, -31, -30, -31, -29, -32, -35, -42, - -48, -42, -44, -46, -50, -50, -51, -52, - -59, -54, -55, -55, -58, -62, -63, -66, - -72, -73, -76, -75, -78, -80, -80, -81, - -84, -88, -90, -94, -98, -101, -106, -110}}, - /* 88Hz */ - {{ -66, -66, -66, -66, -66, -66, -66, -66, - -66, -66, -66, -66, -66, -67, -67, -67, - -76, -72, -71, -74, -76, -76, -75, -78, - -79, -79, -81, -83, -86, -89, -93, -97, - -100, -105, -110, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - { -47, -47, -47, -47, -47, -47, -47, -47, - -47, -47, -47, -48, -51, -55, -59, -66, - -66, -66, -67, -66, -68, -69, -70, -74, - -79, -77, -77, -78, -80, -81, -82, -84, - -86, -88, -91, -95, -100, -108, -116, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - { -36, -36, -36, -36, -36, -36, -36, -36, - -36, -37, -37, -41, -44, -48, -51, -58, - -62, -60, -57, -59, -59, -60, -63, -65, - -72, -71, -70, -72, -74, -77, -76, -78, - -81, -81, -80, -83, -86, -91, -96, -100, - -105, -110, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - { -28, -28, -28, -28, -28, -28, -28, -28, - -28, -30, -32, -32, -33, -35, -41, -49, - -50, -49, -47, -48, -48, -52, -51, -57, - -65, -61, -59, -61, -64, -69, -70, -74, - -77, -77, -78, -81, -84, -85, -87, -90, - -92, -96, -100, -107, -112, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - { -19, -19, -19, -19, -19, -19, -19, -19, - -20, -21, -23, -27, -30, -35, -36, -41, - -46, -44, -42, -40, -41, -41, -43, -48, - -55, -53, -52, -53, -56, -59, -58, -60, - -67, -66, -69, -71, -72, -75, -79, -81, - -84, -87, -90, -93, -97, -101, -107, -114, - -999, -999, -999, -999, -999, -999, -999, -999}, - { -9, -9, -9, -9, -9, -9, -9, -9, - -11, -12, -12, -15, -16, -20, -23, -30, - -37, -34, -33, -34, -31, -32, -32, -38, - -47, -44, -41, -40, -47, -49, -46, -46, - -58, -50, -50, -54, -58, -62, -64, -67, - -67, -70, -72, -76, -79, -83, -87, -91, - -96, -100, -104, -110, -999, -999, -999, -999}}, - /* 125 Hz */ - {{ -62, -62, -62, -62, -62, -62, -62, -62, - -62, -62, -63, -64, -66, -67, -66, -68, - -75, -72, -76, -75, -76, -78, -79, -82, - -84, -85, -90, -94, -101, -110, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - { -59, -59, -59, -59, -59, -59, -59, -59, - -59, -59, -59, -60, -60, -61, -63, -66, - -71, -68, -70, -70, -71, -72, -72, -75, - -81, -78, -79, -82, -83, -86, -90, -97, - -103, -113, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - { -53, -53, -53, -53, -53, -53, -53, -53, - -53, -54, -55, -57, -56, -57, -55, -61, - -65, -60, -60, -62, -63, -63, -66, -68, - -74, -73, -75, -75, -78, -80, -80, -82, - -85, -90, -96, -101, -108, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - { -46, -46, -46, -46, -46, -46, -46, -46, - -46, -46, -47, -47, -47, -47, -48, -51, - -57, -51, -49, -50, -51, -53, -54, -59, - -66, -60, -62, -67, -67, -70, -72, -75, - -76, -78, -81, -85, -88, -94, -97, -104, - -112, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - { -36, -36, -36, -36, -36, -36, -36, -36, - -39, -41, -42, -42, -39, -38, -41, -43, - -52, -44, -40, -39, -37, -37, -40, -47, - -54, -50, -48, -50, -55, -61, -59, -62, - -66, -66, -66, -69, -69, -73, -74, -74, - -75, -77, -79, -82, -87, -91, -95, -100, - -108, -115, -999, -999, -999, -999, -999, -999}, - { -28, -26, -24, -22, -20, -20, -23, -29, - -30, -31, -28, -27, -28, -28, -28, -35, - -40, -33, -32, -29, -30, -30, -30, -37, - -45, -41, -37, -38, -45, -47, -47, -48, - -53, -49, -48, -50, -49, -49, -51, -52, - -58, -56, -57, -56, -60, -61, -62, -70, - -72, -74, -78, -83, -88, -93, -100, -106}}, - /* 177 Hz */ - {{-999, -999, -999, -999, -999, -999, -999, -999, - -999, -110, -105, -100, -95, -91, -87, -83, - -80, -78, -76, -78, -78, -81, -83, -85, - -86, -85, -86, -87, -90, -97, -107, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -110, -105, -100, -95, -90, - -85, -81, -77, -73, -70, -67, -67, -68, - -75, -73, -70, -69, -70, -72, -75, -79, - -84, -83, -84, -86, -88, -89, -89, -93, - -98, -105, -112, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-105, -100, -95, -90, -85, -80, -76, -71, - -68, -68, -65, -63, -63, -62, -62, -64, - -65, -64, -61, -62, -63, -64, -66, -68, - -73, -73, -74, -75, -76, -81, -83, -85, - -88, -89, -92, -95, -100, -108, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - { -80, -75, -71, -68, -65, -63, -62, -61, - -61, -61, -61, -59, -56, -57, -53, -50, - -58, -52, -50, -50, -52, -53, -54, -58, - -67, -63, -67, -68, -72, -75, -78, -80, - -81, -81, -82, -85, -89, -90, -93, -97, - -101, -107, -114, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - { -65, -61, -59, -57, -56, -55, -55, -56, - -56, -57, -55, -53, -52, -47, -44, -44, - -50, -44, -41, -39, -39, -42, -40, -46, - -51, -49, -50, -53, -54, -63, -60, -61, - -62, -66, -66, -66, -70, -73, -74, -75, - -76, -75, -79, -85, -89, -91, -96, -102, - -110, -999, -999, -999, -999, -999, -999, -999}, - { -52, -50, -49, -49, -48, -48, -48, -49, - -50, -50, -49, -46, -43, -39, -35, -33, - -38, -36, -32, -29, -32, -32, -32, -35, - -44, -39, -38, -38, -46, -50, -45, -46, - -53, -50, -50, -50, -54, -54, -53, -53, - -56, -57, -59, -66, -70, -72, -74, -79, - -83, -85, -90, -97, -114, -999, -999, -999}}, - /* 250 Hz */ - {{-999, -999, -999, -999, -999, -999, -110, -105, - -100, -95, -90, -86, -80, -75, -75, -79, - -80, -79, -80, -81, -82, -88, -95, -103, - -110, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -108, -103, -98, -93, - -88, -83, -79, -78, -75, -71, -67, -68, - -73, -73, -72, -73, -75, -77, -80, -82, - -88, -93, -100, -107, -114, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -110, -105, -101, -96, -90, - -86, -81, -77, -73, -69, -66, -61, -62, - -66, -64, -62, -65, -66, -70, -72, -76, - -81, -80, -84, -90, -95, -102, -110, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -107, -103, -97, -92, -88, - -83, -79, -74, -70, -66, -59, -53, -58, - -62, -55, -54, -54, -54, -58, -61, -62, - -72, -70, -72, -75, -78, -80, -81, -80, - -83, -83, -88, -93, -100, -107, -115, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -105, -100, -95, -90, -85, - -80, -75, -70, -66, -62, -56, -48, -44, - -48, -46, -46, -43, -46, -48, -48, -51, - -58, -58, -59, -60, -62, -62, -61, -61, - -65, -64, -65, -68, -70, -74, -75, -78, - -81, -86, -95, -110, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -105, -100, -95, -90, -85, -80, - -75, -70, -65, -61, -55, -49, -39, -33, - -40, -35, -32, -38, -40, -33, -35, -37, - -46, -41, -45, -44, -46, -42, -45, -46, - -52, -50, -50, -50, -54, -54, -55, -57, - -62, -64, -66, -68, -70, -76, -81, -90, - -100, -110, -999, -999, -999, -999, -999, -999}}, - /* 354 hz */ - {{-999, -999, -999, -999, -999, -999, -999, -999, - -105, -98, -90, -85, -82, -83, -80, -78, - -84, -79, -80, -83, -87, -89, -91, -93, - -99, -106, -117, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -105, -98, -90, -85, -80, -75, -70, -68, - -74, -72, -74, -77, -80, -82, -85, -87, - -92, -89, -91, -95, -100, -106, -112, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -105, -98, -90, -83, -75, -71, -63, -64, - -67, -62, -64, -67, -70, -73, -77, -81, - -84, -83, -85, -89, -90, -93, -98, -104, - -109, -114, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -103, -96, -88, -81, -75, -68, -58, -54, - -56, -54, -56, -56, -58, -60, -63, -66, - -74, -69, -72, -72, -75, -74, -77, -81, - -81, -82, -84, -87, -93, -96, -99, -104, - -110, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -108, -102, -96, - -91, -85, -80, -74, -68, -60, -51, -46, - -48, -46, -43, -45, -47, -47, -49, -48, - -56, -53, -55, -58, -57, -63, -58, -60, - -66, -64, -67, -70, -70, -74, -77, -84, - -86, -89, -91, -93, -94, -101, -109, -118, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -108, -103, -98, -93, -88, - -83, -78, -73, -68, -60, -53, -44, -35, - -38, -38, -34, -34, -36, -40, -41, -44, - -51, -45, -46, -47, -46, -54, -50, -49, - -50, -50, -50, -51, -54, -57, -58, -60, - -66, -66, -66, -64, -65, -68, -77, -82, - -87, -95, -110, -999, -999, -999, -999, -999}}, - /* 500 Hz */ - {{-999, -999, -999, -999, -999, -999, -999, -999, - -107, -102, -97, -92, -87, -83, -78, -75, - -82, -79, -83, -85, -89, -92, -95, -98, - -101, -105, -109, -113, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -106, - -100, -95, -90, -86, -81, -78, -74, -69, - -74, -74, -76, -79, -83, -84, -86, -89, - -92, -97, -93, -100, -103, -107, -110, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -106, -100, - -95, -90, -87, -83, -80, -75, -69, -60, - -66, -66, -68, -70, -74, -78, -79, -81, - -81, -83, -84, -87, -93, -96, -99, -103, - -107, -110, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -108, -103, -98, - -93, -89, -85, -82, -78, -71, -62, -55, - -58, -58, -54, -54, -55, -59, -61, -62, - -70, -66, -66, -67, -70, -72, -75, -78, - -84, -84, -84, -88, -91, -90, -95, -98, - -102, -103, -106, -110, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -108, -103, -98, -94, - -90, -87, -82, -79, -73, -67, -58, -47, - -50, -45, -41, -45, -48, -44, -44, -49, - -54, -51, -48, -47, -49, -50, -51, -57, - -58, -60, -63, -69, -70, -69, -71, -74, - -78, -82, -90, -95, -101, -105, -110, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -105, -101, -97, -93, -90, - -85, -80, -77, -72, -65, -56, -48, -37, - -40, -36, -34, -40, -50, -47, -38, -41, - -47, -38, -35, -39, -38, -43, -40, -45, - -50, -45, -44, -47, -50, -55, -48, -48, - -52, -66, -70, -76, -82, -90, -97, -105, - -110, -999, -999, -999, -999, -999, -999, -999}}, - /* 707 Hz */ - {{-999, -999, -999, -999, -999, -999, -999, -999, - -999, -108, -103, -98, -93, -86, -79, -76, - -83, -81, -85, -87, -89, -93, -98, -102, - -107, -112, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -108, -103, -98, -93, -86, -79, -71, - -77, -74, -77, -79, -81, -84, -85, -90, - -92, -93, -92, -98, -101, -108, -112, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -108, -103, -98, -93, -87, -78, -68, -65, - -66, -62, -65, -67, -70, -73, -75, -78, - -82, -82, -83, -84, -91, -93, -98, -102, - -106, -110, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -105, -100, -95, -90, -82, -74, -62, -57, - -58, -56, -51, -52, -52, -54, -54, -58, - -66, -59, -60, -63, -66, -69, -73, -79, - -83, -84, -80, -81, -81, -82, -88, -92, - -98, -105, -113, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -107, - -102, -97, -92, -84, -79, -69, -57, -47, - -52, -47, -44, -45, -50, -52, -42, -42, - -53, -43, -43, -48, -51, -56, -55, -52, - -57, -59, -61, -62, -67, -71, -78, -83, - -86, -94, -98, -103, -110, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -105, -100, - -95, -90, -84, -78, -70, -61, -51, -41, - -40, -38, -40, -46, -52, -51, -41, -40, - -46, -40, -38, -38, -41, -46, -41, -46, - -47, -43, -43, -45, -41, -45, -56, -67, - -68, -83, -87, -90, -95, -102, -107, -113, - -999, -999, -999, -999, -999, -999, -999, -999}}, - /* 1000 Hz */ - {{-999, -999, -999, -999, -999, -999, -999, -999, - -999, -109, -105, -101, -96, -91, -84, -77, - -82, -82, -85, -89, -94, -100, -106, -110, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -106, -103, -98, -92, -85, -80, -71, - -75, -72, -76, -80, -84, -86, -89, -93, - -100, -107, -113, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -107, - -104, -101, -97, -92, -88, -84, -80, -64, - -66, -63, -64, -66, -69, -73, -77, -83, - -83, -86, -91, -98, -104, -111, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -107, - -104, -101, -97, -92, -90, -84, -74, -57, - -58, -52, -55, -54, -50, -52, -50, -52, - -63, -62, -69, -76, -77, -78, -78, -79, - -82, -88, -94, -100, -106, -111, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -106, -102, - -98, -95, -90, -85, -83, -78, -70, -50, - -50, -41, -44, -49, -47, -50, -50, -44, - -55, -46, -47, -48, -48, -54, -49, -49, - -58, -62, -71, -81, -87, -92, -97, -102, - -108, -114, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -106, -102, - -98, -95, -90, -85, -83, -78, -70, -45, - -43, -41, -47, -50, -51, -50, -49, -45, - -47, -41, -44, -41, -39, -43, -38, -37, - -40, -41, -44, -50, -58, -65, -73, -79, - -85, -92, -97, -101, -105, -109, -113, -999, - -999, -999, -999, -999, -999, -999, -999, -999}}, - /* 1414 Hz */ - {{-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -107, -100, -95, -87, -81, - -85, -83, -88, -93, -100, -107, -114, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -107, -101, -95, -88, -83, -76, - -73, -72, -79, -84, -90, -95, -100, -105, - -110, -115, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -104, -98, -92, -87, -81, -70, - -65, -62, -67, -71, -74, -80, -85, -91, - -95, -99, -103, -108, -111, -114, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -103, -97, -90, -85, -76, -60, - -56, -54, -60, -62, -61, -56, -63, -65, - -73, -74, -77, -75, -78, -81, -86, -87, - -88, -91, -94, -98, -103, -110, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -105, - -100, -97, -92, -86, -81, -79, -70, -57, - -51, -47, -51, -58, -60, -56, -53, -50, - -58, -52, -50, -50, -53, -55, -64, -69, - -71, -85, -82, -78, -81, -85, -95, -102, - -112, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -105, - -100, -97, -92, -85, -83, -79, -72, -49, - -40, -43, -43, -54, -56, -51, -50, -40, - -43, -38, -36, -35, -37, -38, -37, -44, - -54, -60, -57, -60, -70, -75, -84, -92, - -103, -112, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}}, - /* 2000 Hz */ - {{-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -110, -102, -95, -89, -82, - -83, -84, -90, -92, -99, -107, -113, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -107, -101, -95, -89, -83, -72, - -74, -78, -85, -88, -88, -90, -92, -98, - -105, -111, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -109, -103, -97, -93, -87, -81, -70, - -70, -67, -75, -73, -76, -79, -81, -83, - -88, -89, -97, -103, -110, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -107, -100, -94, -88, -83, -75, -63, - -59, -59, -63, -66, -60, -62, -67, -67, - -77, -76, -81, -88, -86, -92, -96, -102, - -109, -116, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -105, -98, -92, -86, -81, -73, -56, - -52, -47, -55, -60, -58, -52, -51, -45, - -49, -50, -53, -54, -61, -71, -70, -69, - -78, -79, -87, -90, -96, -104, -112, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -103, -96, -90, -86, -78, -70, -51, - -42, -47, -48, -55, -54, -54, -53, -42, - -35, -28, -33, -38, -37, -44, -47, -49, - -54, -63, -68, -78, -82, -89, -94, -99, - -104, -109, -114, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}}, - /* 2828 Hz */ - {{-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -110, -100, -90, -79, - -85, -81, -82, -82, -89, -94, -99, -103, - -109, -115, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -105, -97, -85, -72, - -74, -70, -70, -70, -76, -85, -91, -93, - -97, -103, -109, -115, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -112, -93, -81, -68, - -62, -60, -60, -57, -63, -70, -77, -82, - -90, -93, -98, -104, -109, -113, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -113, -100, -93, -84, -63, - -58, -48, -53, -54, -52, -52, -57, -64, - -66, -76, -83, -81, -85, -85, -90, -95, - -98, -101, -103, -106, -108, -111, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -105, -95, -86, -74, -53, - -50, -38, -43, -49, -43, -42, -39, -39, - -46, -52, -57, -56, -72, -69, -74, -81, - -87, -92, -94, -97, -99, -102, -105, -108, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -108, -99, -90, -76, -66, -45, - -43, -41, -44, -47, -43, -47, -40, -30, - -31, -31, -39, -33, -40, -41, -43, -53, - -59, -70, -73, -77, -79, -82, -84, -87, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}}, - /* 4000 Hz */ - {{-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -110, -91, -76, - -75, -85, -93, -98, -104, -110, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -110, -91, -70, - -70, -75, -86, -89, -94, -98, -101, -106, - -110, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -110, -95, -80, -60, - -65, -64, -74, -83, -88, -91, -95, -99, - -103, -107, -110, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -110, -95, -80, -58, - -55, -49, -66, -68, -71, -78, -78, -80, - -88, -85, -89, -97, -100, -105, -110, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -110, -95, -80, -53, - -52, -41, -59, -59, -49, -58, -56, -63, - -86, -79, -90, -93, -98, -103, -107, -112, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -110, -97, -91, -73, -45, - -40, -33, -53, -61, -49, -54, -50, -50, - -60, -52, -67, -74, -81, -92, -96, -100, - -105, -110, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}}, - /* 5657 Hz */ - {{-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -113, -106, -99, -92, -77, - -80, -88, -97, -106, -115, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -116, -109, -102, -95, -89, -74, - -72, -88, -87, -95, -102, -109, -116, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -116, -109, -102, -95, -89, -75, - -66, -74, -77, -78, -86, -87, -90, -96, - -105, -115, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -115, -108, -101, -94, -88, -66, - -56, -61, -70, -65, -78, -72, -83, -84, - -93, -98, -105, -110, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -110, -105, -95, -89, -82, -57, - -52, -52, -59, -56, -59, -58, -69, -67, - -88, -82, -82, -89, -94, -100, -108, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -110, -101, -96, -90, -83, -77, -54, - -43, -38, -50, -48, -52, -48, -42, -42, - -51, -52, -53, -59, -65, -71, -78, -85, - -95, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}}, - /* 8000 Hz */ - {{-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -120, -105, -86, -68, - -78, -79, -90, -100, -110, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -120, -105, -86, -66, - -73, -77, -88, -96, -105, -115, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -120, -105, -92, -80, -61, - -64, -68, -80, -87, -92, -100, -110, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -120, -104, -91, -79, -52, - -60, -54, -64, -69, -77, -80, -82, -84, - -85, -87, -88, -90, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -118, -100, -87, -77, -49, - -50, -44, -58, -61, -61, -67, -65, -62, - -62, -62, -65, -68, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -115, -98, -84, -62, -49, - -44, -38, -46, -49, -49, -46, -39, -37, - -39, -40, -42, -43, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}}, - /* 11314 Hz */ - {{-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -110, -88, -74, - -77, -82, -82, -85, -90, -94, -99, -104, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -110, -88, -66, - -70, -81, -80, -81, -84, -88, -91, -93, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -110, -88, -61, - -63, -70, -71, -74, -77, -80, -83, -85, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -110, -86, -62, - -63, -62, -62, -58, -52, -50, -50, -52, - -54, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -118, -108, -84, -53, - -50, -50, -50, -55, -47, -45, -40, -40, - -40, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -118, -100, -73, -43, - -37, -42, -43, -53, -38, -37, -35, -35, - -38, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}}, - /* 16000 Hz */ - {{-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -110, -100, -91, -84, -74, - -80, -80, -80, -80, -80, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -110, -100, -91, -84, -74, - -68, -68, -68, -68, -68, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -110, -100, -86, -78, -70, - -60, -45, -30, -21, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -110, -100, -87, -78, -67, - -48, -38, -29, -21, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -110, -100, -86, -69, -56, - -45, -35, -33, -29, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -110, -100, -83, -71, -48, - -27, -38, -37, -34, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}} -}; - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/mdct.c b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/mdct.c deleted file mode 100644 index 5bcabaf4..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/mdct.c +++ /dev/null @@ -1,563 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: normalized modified discrete cosine transform - power of two length transform only [64 <= n ] - last mod: $Id: mdct.c 16227 2009-07-08 06:58:46Z xiphmont $ - - Original algorithm adapted long ago from _The use of multirate filter - banks for coding of high quality digital audio_, by T. Sporer, - K. Brandenburg and B. Edler, collection of the European Signal - Processing Conference (EUSIPCO), Amsterdam, June 1992, Vol.1, pp - 211-214 - - The below code implements an algorithm that no longer looks much like - that presented in the paper, but the basic structure remains if you - dig deep enough to see it. - - This module DOES NOT INCLUDE code to generate/apply the window - function. Everybody has their own weird favorite including me... I - happen to like the properties of y=sin(.5PI*sin^2(x)), but others may - vehemently disagree. - - ********************************************************************/ - -/* this can also be run as an integer transform by uncommenting a - define in mdct.h; the integerization is a first pass and although - it's likely stable for Vorbis, the dynamic range is constrained and - roundoff isn't done (so it's noisy). Consider it functional, but - only a starting point. There's no point on a machine with an FPU */ - -#include -#include -#include -#include -#include "vorbis/codec.h" -#include "mdct.h" -#include "os.h" -#include "misc.h" - -/* build lookups for trig functions; also pre-figure scaling and - some window function algebra. */ - -void mdct_init(vbs_mdct_lookup *lookup,int n){ - int *bitrev=_ogg_malloc(sizeof(*bitrev)*(n/4)); - DATA_TYPE *T=_ogg_malloc(sizeof(*T)*(n+n/4)); - - int i; - int n2=n>>1; - int log2n=lookup->log2n=rint(log((float)n)/log(2.f)); - lookup->n=n; - lookup->trig=T; - lookup->bitrev=bitrev; - -/* trig lookups... */ - - for(i=0;i>j;j++) - if((msb>>j)&i)acc|=1<scale=FLOAT_CONV(4.f/n); -} - -/* 8 point butterfly (in place, 4 register) */ -STIN void mdct_butterfly_8(DATA_TYPE *x){ - REG_TYPE r0 = x[6] + x[2]; - REG_TYPE r1 = x[6] - x[2]; - REG_TYPE r2 = x[4] + x[0]; - REG_TYPE r3 = x[4] - x[0]; - - x[6] = r0 + r2; - x[4] = r0 - r2; - - r0 = x[5] - x[1]; - r2 = x[7] - x[3]; - x[0] = r1 + r0; - x[2] = r1 - r0; - - r0 = x[5] + x[1]; - r1 = x[7] + x[3]; - x[3] = r2 + r3; - x[1] = r2 - r3; - x[7] = r1 + r0; - x[5] = r1 - r0; - -} - -/* 16 point butterfly (in place, 4 register) */ -STIN void mdct_butterfly_16(DATA_TYPE *x){ - REG_TYPE r0 = x[1] - x[9]; - REG_TYPE r1 = x[0] - x[8]; - - x[8] += x[0]; - x[9] += x[1]; - x[0] = MULT_NORM((r0 + r1) * cPI2_8); - x[1] = MULT_NORM((r0 - r1) * cPI2_8); - - r0 = x[3] - x[11]; - r1 = x[10] - x[2]; - x[10] += x[2]; - x[11] += x[3]; - x[2] = r0; - x[3] = r1; - - r0 = x[12] - x[4]; - r1 = x[13] - x[5]; - x[12] += x[4]; - x[13] += x[5]; - x[4] = MULT_NORM((r0 - r1) * cPI2_8); - x[5] = MULT_NORM((r0 + r1) * cPI2_8); - - r0 = x[14] - x[6]; - r1 = x[15] - x[7]; - x[14] += x[6]; - x[15] += x[7]; - x[6] = r0; - x[7] = r1; - - mdct_butterfly_8(x); - mdct_butterfly_8(x+8); -} - -/* 32 point butterfly (in place, 4 register) */ -STIN void mdct_butterfly_32(DATA_TYPE *x){ - REG_TYPE r0 = x[30] - x[14]; - REG_TYPE r1 = x[31] - x[15]; - - x[30] += x[14]; - x[31] += x[15]; - x[14] = r0; - x[15] = r1; - - r0 = x[28] - x[12]; - r1 = x[29] - x[13]; - x[28] += x[12]; - x[29] += x[13]; - x[12] = MULT_NORM( r0 * cPI1_8 - r1 * cPI3_8 ); - x[13] = MULT_NORM( r0 * cPI3_8 + r1 * cPI1_8 ); - - r0 = x[26] - x[10]; - r1 = x[27] - x[11]; - x[26] += x[10]; - x[27] += x[11]; - x[10] = MULT_NORM(( r0 - r1 ) * cPI2_8); - x[11] = MULT_NORM(( r0 + r1 ) * cPI2_8); - - r0 = x[24] - x[8]; - r1 = x[25] - x[9]; - x[24] += x[8]; - x[25] += x[9]; - x[8] = MULT_NORM( r0 * cPI3_8 - r1 * cPI1_8 ); - x[9] = MULT_NORM( r1 * cPI3_8 + r0 * cPI1_8 ); - - r0 = x[22] - x[6]; - r1 = x[7] - x[23]; - x[22] += x[6]; - x[23] += x[7]; - x[6] = r1; - x[7] = r0; - - r0 = x[4] - x[20]; - r1 = x[5] - x[21]; - x[20] += x[4]; - x[21] += x[5]; - x[4] = MULT_NORM( r1 * cPI1_8 + r0 * cPI3_8 ); - x[5] = MULT_NORM( r1 * cPI3_8 - r0 * cPI1_8 ); - - r0 = x[2] - x[18]; - r1 = x[3] - x[19]; - x[18] += x[2]; - x[19] += x[3]; - x[2] = MULT_NORM(( r1 + r0 ) * cPI2_8); - x[3] = MULT_NORM(( r1 - r0 ) * cPI2_8); - - r0 = x[0] - x[16]; - r1 = x[1] - x[17]; - x[16] += x[0]; - x[17] += x[1]; - x[0] = MULT_NORM( r1 * cPI3_8 + r0 * cPI1_8 ); - x[1] = MULT_NORM( r1 * cPI1_8 - r0 * cPI3_8 ); - - mdct_butterfly_16(x); - mdct_butterfly_16(x+16); - -} - -/* N point first stage butterfly (in place, 2 register) */ -STIN void mdct_butterfly_first(DATA_TYPE *T, - DATA_TYPE *x, - int points){ - - DATA_TYPE *x1 = x + points - 8; - DATA_TYPE *x2 = x + (points>>1) - 8; - REG_TYPE r0; - REG_TYPE r1; - - do{ - - r0 = x1[6] - x2[6]; - r1 = x1[7] - x2[7]; - x1[6] += x2[6]; - x1[7] += x2[7]; - x2[6] = MULT_NORM(r1 * T[1] + r0 * T[0]); - x2[7] = MULT_NORM(r1 * T[0] - r0 * T[1]); - - r0 = x1[4] - x2[4]; - r1 = x1[5] - x2[5]; - x1[4] += x2[4]; - x1[5] += x2[5]; - x2[4] = MULT_NORM(r1 * T[5] + r0 * T[4]); - x2[5] = MULT_NORM(r1 * T[4] - r0 * T[5]); - - r0 = x1[2] - x2[2]; - r1 = x1[3] - x2[3]; - x1[2] += x2[2]; - x1[3] += x2[3]; - x2[2] = MULT_NORM(r1 * T[9] + r0 * T[8]); - x2[3] = MULT_NORM(r1 * T[8] - r0 * T[9]); - - r0 = x1[0] - x2[0]; - r1 = x1[1] - x2[1]; - x1[0] += x2[0]; - x1[1] += x2[1]; - x2[0] = MULT_NORM(r1 * T[13] + r0 * T[12]); - x2[1] = MULT_NORM(r1 * T[12] - r0 * T[13]); - - x1-=8; - x2-=8; - T+=16; - - }while(x2>=x); -} - -/* N/stage point generic N stage butterfly (in place, 2 register) */ -STIN void mdct_butterfly_generic(DATA_TYPE *T, - DATA_TYPE *x, - int points, - int trigint){ - - DATA_TYPE *x1 = x + points - 8; - DATA_TYPE *x2 = x + (points>>1) - 8; - REG_TYPE r0; - REG_TYPE r1; - - do{ - - r0 = x1[6] - x2[6]; - r1 = x1[7] - x2[7]; - x1[6] += x2[6]; - x1[7] += x2[7]; - x2[6] = MULT_NORM(r1 * T[1] + r0 * T[0]); - x2[7] = MULT_NORM(r1 * T[0] - r0 * T[1]); - - T+=trigint; - - r0 = x1[4] - x2[4]; - r1 = x1[5] - x2[5]; - x1[4] += x2[4]; - x1[5] += x2[5]; - x2[4] = MULT_NORM(r1 * T[1] + r0 * T[0]); - x2[5] = MULT_NORM(r1 * T[0] - r0 * T[1]); - - T+=trigint; - - r0 = x1[2] - x2[2]; - r1 = x1[3] - x2[3]; - x1[2] += x2[2]; - x1[3] += x2[3]; - x2[2] = MULT_NORM(r1 * T[1] + r0 * T[0]); - x2[3] = MULT_NORM(r1 * T[0] - r0 * T[1]); - - T+=trigint; - - r0 = x1[0] - x2[0]; - r1 = x1[1] - x2[1]; - x1[0] += x2[0]; - x1[1] += x2[1]; - x2[0] = MULT_NORM(r1 * T[1] + r0 * T[0]); - x2[1] = MULT_NORM(r1 * T[0] - r0 * T[1]); - - T+=trigint; - x1-=8; - x2-=8; - - }while(x2>=x); -} - -STIN void mdct_butterflies(vbs_mdct_lookup *init, - DATA_TYPE *x, - int points){ - - DATA_TYPE *T=init->trig; - int stages=init->log2n-5; - int i,j; - - if(--stages>0){ - mdct_butterfly_first(T,x,points); - } - - for(i=1;--stages>0;i++){ - for(j=0;j<(1<>i)*j,points>>i,4<trig)_ogg_free(l->trig); - if(l->bitrev)_ogg_free(l->bitrev); - memset(l,0,sizeof(*l)); - } -} - -STIN void mdct_bitreverse(vbs_mdct_lookup *init, - DATA_TYPE *x){ - int n = init->n; - int *bit = init->bitrev; - DATA_TYPE *w0 = x; - DATA_TYPE *w1 = x = w0+(n>>1); - DATA_TYPE *T = init->trig+n; - - do{ - DATA_TYPE *x0 = x+bit[0]; - DATA_TYPE *x1 = x+bit[1]; - - REG_TYPE r0 = x0[1] - x1[1]; - REG_TYPE r1 = x0[0] + x1[0]; - REG_TYPE r2 = MULT_NORM(r1 * T[0] + r0 * T[1]); - REG_TYPE r3 = MULT_NORM(r1 * T[1] - r0 * T[0]); - - w1 -= 4; - - r0 = HALVE(x0[1] + x1[1]); - r1 = HALVE(x0[0] - x1[0]); - - w0[0] = r0 + r2; - w1[2] = r0 - r2; - w0[1] = r1 + r3; - w1[3] = r3 - r1; - - x0 = x+bit[2]; - x1 = x+bit[3]; - - r0 = x0[1] - x1[1]; - r1 = x0[0] + x1[0]; - r2 = MULT_NORM(r1 * T[2] + r0 * T[3]); - r3 = MULT_NORM(r1 * T[3] - r0 * T[2]); - - r0 = HALVE(x0[1] + x1[1]); - r1 = HALVE(x0[0] - x1[0]); - - w0[2] = r0 + r2; - w1[0] = r0 - r2; - w0[3] = r1 + r3; - w1[1] = r3 - r1; - - T += 4; - bit += 4; - w0 += 4; - - }while(w0n; - int n2=n>>1; - int n4=n>>2; - - /* rotate */ - - DATA_TYPE *iX = in+n2-7; - DATA_TYPE *oX = out+n2+n4; - DATA_TYPE *T = init->trig+n4; - - do{ - oX -= 4; - oX[0] = MULT_NORM(-iX[2] * T[3] - iX[0] * T[2]); - oX[1] = MULT_NORM (iX[0] * T[3] - iX[2] * T[2]); - oX[2] = MULT_NORM(-iX[6] * T[1] - iX[4] * T[0]); - oX[3] = MULT_NORM (iX[4] * T[1] - iX[6] * T[0]); - iX -= 8; - T += 4; - }while(iX>=in); - - iX = in+n2-8; - oX = out+n2+n4; - T = init->trig+n4; - - do{ - T -= 4; - oX[0] = MULT_NORM (iX[4] * T[3] + iX[6] * T[2]); - oX[1] = MULT_NORM (iX[4] * T[2] - iX[6] * T[3]); - oX[2] = MULT_NORM (iX[0] * T[1] + iX[2] * T[0]); - oX[3] = MULT_NORM (iX[0] * T[0] - iX[2] * T[1]); - iX -= 8; - oX += 4; - }while(iX>=in); - - mdct_butterflies(init,out+n2,n2); - mdct_bitreverse(init,out); - - /* roatate + window */ - - { - DATA_TYPE *oX1=out+n2+n4; - DATA_TYPE *oX2=out+n2+n4; - DATA_TYPE *iX =out; - T =init->trig+n2; - - do{ - oX1-=4; - - oX1[3] = MULT_NORM (iX[0] * T[1] - iX[1] * T[0]); - oX2[0] = -MULT_NORM (iX[0] * T[0] + iX[1] * T[1]); - - oX1[2] = MULT_NORM (iX[2] * T[3] - iX[3] * T[2]); - oX2[1] = -MULT_NORM (iX[2] * T[2] + iX[3] * T[3]); - - oX1[1] = MULT_NORM (iX[4] * T[5] - iX[5] * T[4]); - oX2[2] = -MULT_NORM (iX[4] * T[4] + iX[5] * T[5]); - - oX1[0] = MULT_NORM (iX[6] * T[7] - iX[7] * T[6]); - oX2[3] = -MULT_NORM (iX[6] * T[6] + iX[7] * T[7]); - - oX2+=4; - iX += 8; - T += 8; - }while(iXoX2); - } -} - -void mdct_forward(vbs_mdct_lookup *init, DATA_TYPE *in, DATA_TYPE *out){ - int n=init->n; - int n2=n>>1; - int n4=n>>2; - int n8=n>>3; - DATA_TYPE *w=alloca(n*sizeof(*w)); /* forward needs working space */ - DATA_TYPE *w2=w+n2; - - /* rotate */ - - /* window + rotate + step 1 */ - - REG_TYPE r0; - REG_TYPE r1; - DATA_TYPE *x0=in+n2+n4; - DATA_TYPE *x1=x0+1; - DATA_TYPE *T=init->trig+n2; - - int i=0; - - for(i=0;itrig+n2; - x0=out+n2; - - for(i=0;iscale); - x0[0] =MULT_NORM((w[0]*T[1]-w[1]*T[0])*init->scale); - w+=2; - T+=2; - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/mdct.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/mdct.h deleted file mode 100644 index 4fd97212..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/mdct.h +++ /dev/null @@ -1,71 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: modified discrete cosine transform prototypes - last mod: $Id: mdct.h 16227 2009-07-08 06:58:46Z xiphmont $ - - ********************************************************************/ - -#ifndef _OGG_mdct_H_ -#define _OGG_mdct_H_ - -#include "vorbis/codec.h" - - - - - -/*#define MDCT_INTEGERIZED <- be warned there could be some hurt left here*/ -#ifdef MDCT_INTEGERIZED - -#define DATA_TYPE int -#define REG_TYPE register int -#define TRIGBITS 14 -#define cPI3_8 6270 -#define cPI2_8 11585 -#define cPI1_8 15137 - -#define FLOAT_CONV(x) ((int)((x)*(1<>TRIGBITS) -#define HALVE(x) ((x)>>1) - -#else - -#define DATA_TYPE float -#define REG_TYPE float -#define cPI3_8 .38268343236508977175F -#define cPI2_8 .70710678118654752441F -#define cPI1_8 .92387953251128675613F - -#define FLOAT_CONV(x) (x) -#define MULT_NORM(x) (x) -#define HALVE(x) ((x)*.5f) - -#endif - - -typedef struct { - int n; - int log2n; - - DATA_TYPE *trig; - int *bitrev; - - DATA_TYPE scale; -} vbs_mdct_lookup; - -extern void mdct_init(vbs_mdct_lookup *lookup,int n); -extern void mdct_clear(vbs_mdct_lookup *l); -extern void mdct_forward(vbs_mdct_lookup *init, DATA_TYPE *in, DATA_TYPE *out); -extern void mdct_backward(vbs_mdct_lookup *init, DATA_TYPE *in, DATA_TYPE *out); - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/misc.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/misc.h deleted file mode 100644 index 73b45198..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/misc.h +++ /dev/null @@ -1,58 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2015 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: miscellaneous prototypes - last mod: $Id: misc.h 19457 2015-03-03 00:15:29Z giles $ - - ********************************************************************/ - -#ifndef _V_RANDOM_H_ -#define _V_RANDOM_H_ -#include "vorbis/codec.h" - -extern void *_vorbis_block_alloc(vorbis_block *vb,long bytes); -extern void _vorbis_block_ripcord(vorbis_block *vb); -extern int ov_ilog(ogg_uint32_t v); - -#ifdef ANALYSIS -extern int analysis_noisy; -extern void _analysis_output(char *base,int i,float *v,int n,int bark,int dB, - ogg_int64_t off); -extern void _analysis_output_always(char *base,int i,float *v,int n,int bark,int dB, - ogg_int64_t off); -#endif - -#ifdef DEBUG_MALLOC - -#define _VDBG_GRAPHFILE "malloc.m" -#undef _VDBG_GRAPHFILE -extern void *_VDBG_malloc(void *ptr,long bytes,char *file,long line); -extern void _VDBG_free(void *ptr,char *file,long line); - -#ifndef MISC_C -#undef _ogg_malloc -#undef _ogg_calloc -#undef _ogg_realloc -#undef _ogg_free - -#define _ogg_malloc(x) _VDBG_malloc(NULL,(x),__FILE__,__LINE__) -#define _ogg_calloc(x,y) _VDBG_malloc(NULL,(x)*(y),__FILE__,__LINE__) -#define _ogg_realloc(x,y) _VDBG_malloc((x),(y),__FILE__,__LINE__) -#define _ogg_free(x) _VDBG_free((x),__FILE__,__LINE__) -#endif -#endif - -#endif - - - - diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/floor_all.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/floor_all.h deleted file mode 100644 index 4292be32..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/floor_all.h +++ /dev/null @@ -1,260 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: key floor settings - last mod: $Id: floor_all.h 17050 2010-03-26 01:34:42Z xiphmont $ - - ********************************************************************/ - -#include "vorbis/codec.h" -#include "backends.h" -#include "books/floor/floor_books.h" - -static const static_codebook*const _floor_128x4_books[]={ - &_huff_book_line_128x4_class0, - &_huff_book_line_128x4_0sub0, - &_huff_book_line_128x4_0sub1, - &_huff_book_line_128x4_0sub2, - &_huff_book_line_128x4_0sub3, -}; -static const static_codebook*const _floor_256x4_books[]={ - &_huff_book_line_256x4_class0, - &_huff_book_line_256x4_0sub0, - &_huff_book_line_256x4_0sub1, - &_huff_book_line_256x4_0sub2, - &_huff_book_line_256x4_0sub3, -}; -static const static_codebook*const _floor_128x7_books[]={ - &_huff_book_line_128x7_class0, - &_huff_book_line_128x7_class1, - - &_huff_book_line_128x7_0sub1, - &_huff_book_line_128x7_0sub2, - &_huff_book_line_128x7_0sub3, - &_huff_book_line_128x7_1sub1, - &_huff_book_line_128x7_1sub2, - &_huff_book_line_128x7_1sub3, -}; -static const static_codebook*const _floor_256x7_books[]={ - &_huff_book_line_256x7_class0, - &_huff_book_line_256x7_class1, - - &_huff_book_line_256x7_0sub1, - &_huff_book_line_256x7_0sub2, - &_huff_book_line_256x7_0sub3, - &_huff_book_line_256x7_1sub1, - &_huff_book_line_256x7_1sub2, - &_huff_book_line_256x7_1sub3, -}; -static const static_codebook*const _floor_128x11_books[]={ - &_huff_book_line_128x11_class1, - &_huff_book_line_128x11_class2, - &_huff_book_line_128x11_class3, - - &_huff_book_line_128x11_0sub0, - &_huff_book_line_128x11_1sub0, - &_huff_book_line_128x11_1sub1, - &_huff_book_line_128x11_2sub1, - &_huff_book_line_128x11_2sub2, - &_huff_book_line_128x11_2sub3, - &_huff_book_line_128x11_3sub1, - &_huff_book_line_128x11_3sub2, - &_huff_book_line_128x11_3sub3, -}; -static const static_codebook*const _floor_128x17_books[]={ - &_huff_book_line_128x17_class1, - &_huff_book_line_128x17_class2, - &_huff_book_line_128x17_class3, - - &_huff_book_line_128x17_0sub0, - &_huff_book_line_128x17_1sub0, - &_huff_book_line_128x17_1sub1, - &_huff_book_line_128x17_2sub1, - &_huff_book_line_128x17_2sub2, - &_huff_book_line_128x17_2sub3, - &_huff_book_line_128x17_3sub1, - &_huff_book_line_128x17_3sub2, - &_huff_book_line_128x17_3sub3, -}; -static const static_codebook*const _floor_256x4low_books[]={ - &_huff_book_line_256x4low_class0, - &_huff_book_line_256x4low_0sub0, - &_huff_book_line_256x4low_0sub1, - &_huff_book_line_256x4low_0sub2, - &_huff_book_line_256x4low_0sub3, -}; -static const static_codebook*const _floor_1024x27_books[]={ - &_huff_book_line_1024x27_class1, - &_huff_book_line_1024x27_class2, - &_huff_book_line_1024x27_class3, - &_huff_book_line_1024x27_class4, - - &_huff_book_line_1024x27_0sub0, - &_huff_book_line_1024x27_1sub0, - &_huff_book_line_1024x27_1sub1, - &_huff_book_line_1024x27_2sub0, - &_huff_book_line_1024x27_2sub1, - &_huff_book_line_1024x27_3sub1, - &_huff_book_line_1024x27_3sub2, - &_huff_book_line_1024x27_3sub3, - &_huff_book_line_1024x27_4sub1, - &_huff_book_line_1024x27_4sub2, - &_huff_book_line_1024x27_4sub3, -}; -static const static_codebook*const _floor_2048x27_books[]={ - &_huff_book_line_2048x27_class1, - &_huff_book_line_2048x27_class2, - &_huff_book_line_2048x27_class3, - &_huff_book_line_2048x27_class4, - - &_huff_book_line_2048x27_0sub0, - &_huff_book_line_2048x27_1sub0, - &_huff_book_line_2048x27_1sub1, - &_huff_book_line_2048x27_2sub0, - &_huff_book_line_2048x27_2sub1, - &_huff_book_line_2048x27_3sub1, - &_huff_book_line_2048x27_3sub2, - &_huff_book_line_2048x27_3sub3, - &_huff_book_line_2048x27_4sub1, - &_huff_book_line_2048x27_4sub2, - &_huff_book_line_2048x27_4sub3, -}; - -static const static_codebook*const _floor_512x17_books[]={ - &_huff_book_line_512x17_class1, - &_huff_book_line_512x17_class2, - &_huff_book_line_512x17_class3, - - &_huff_book_line_512x17_0sub0, - &_huff_book_line_512x17_1sub0, - &_huff_book_line_512x17_1sub1, - &_huff_book_line_512x17_2sub1, - &_huff_book_line_512x17_2sub2, - &_huff_book_line_512x17_2sub3, - &_huff_book_line_512x17_3sub1, - &_huff_book_line_512x17_3sub2, - &_huff_book_line_512x17_3sub3, -}; - -static const static_codebook*const _floor_Xx0_books[]={ - 0 -}; - -static const static_codebook*const *const _floor_books[11]={ - _floor_128x4_books, - _floor_256x4_books, - _floor_128x7_books, - _floor_256x7_books, - _floor_128x11_books, - _floor_128x17_books, - _floor_256x4low_books, - _floor_1024x27_books, - _floor_2048x27_books, - _floor_512x17_books, - _floor_Xx0_books, -}; - -static const vorbis_info_floor1 _floor[11]={ - /* 0: 128 x 4 */ - { - 1,{0},{4},{2},{0}, - {{1,2,3,4}}, - 4,{0,128, 33,8,16,70}, - - 60,30,500, 1.,18., 128 - }, - /* 1: 256 x 4 */ - { - 1,{0},{4},{2},{0}, - {{1,2,3,4}}, - 4,{0,256, 66,16,32,140}, - - 60,30,500, 1.,18., 256 - }, - /* 2: 128 x 7 */ - { - 2,{0,1},{3,4},{2,2},{0,1}, - {{-1,2,3,4},{-1,5,6,7}}, - 4,{0,128, 14,4,58, 2,8,28,90}, - - 60,30,500, 1.,18., 128 - }, - /* 3: 256 x 7 */ - { - 2,{0,1},{3,4},{2,2},{0,1}, - {{-1,2,3,4},{-1,5,6,7}}, - 4,{0,256, 28,8,116, 4,16,56,180}, - - 60,30,500, 1.,18., 256 - }, - /* 4: 128 x 11 */ - { - 4,{0,1,2,3},{2,3,3,3},{0,1,2,2},{-1,0,1,2}, - {{3},{4,5},{-1,6,7,8},{-1,9,10,11}}, - - 2,{0,128, 8,33, 4,16,70, 2,6,12, 23,46,90}, - - 60,30,500, 1,18., 128 - }, - /* 5: 128 x 17 */ - { - 6,{0,1,1,2,3,3},{2,3,3,3},{0,1,2,2},{-1,0,1,2}, - {{3},{4,5},{-1,6,7,8},{-1,9,10,11}}, - 2,{0,128, 12,46, 4,8,16, 23,33,70, 2,6,10, 14,19,28, 39,58,90}, - - 60,30,500, 1,18., 128 - }, - /* 6: 256 x 4 (low bitrate version) */ - { - 1,{0},{4},{2},{0}, - {{1,2,3,4}}, - 4,{0,256, 66,16,32,140}, - - 60,30,500, 1.,18., 256 - }, - /* 7: 1024 x 27 */ - { - 8,{0,1,2,2,3,3,4,4},{3,4,3,4,3},{0,1,1,2,2},{-1,0,1,2,3}, - {{4},{5,6},{7,8},{-1,9,10,11},{-1,12,13,14}}, - 2,{0,1024, 93,23,372, 6,46,186,750, 14,33,65, 130,260,556, - 3,10,18,28, 39,55,79,111, 158,220,312, 464,650,850}, - - 60,30,500, 3,18., 1024 - }, - /* 8: 2048 x 27 */ - { - 8,{0,1,2,2,3,3,4,4},{3,4,3,4,3},{0,1,1,2,2},{-1,0,1,2,3}, - {{4},{5,6},{7,8},{-1,9,10,11},{-1,12,13,14}}, - 2,{0,2048, 186,46,744, 12,92,372,1500, 28,66,130, 260,520,1112, - 6,20,36,56, 78,110,158,222, 316,440,624, 928,1300,1700}, - - 60,30,500, 3,18., 2048 - }, - /* 9: 512 x 17 */ - { - 6,{0,1,1,2,3,3},{2,3,3,3},{0,1,2,2},{-1,0,1,2}, - {{3},{4,5},{-1,6,7,8},{-1,9,10,11}}, - 2,{0,512, 46,186, 16,33,65, 93,130,278, - 7,23,39, 55,79,110, 156,232,360}, - - 60,30,500, 1,18., 512 - }, - - /* 10: X x 0 (LFE floor; edge posts only) */ - { - 0,{0}, {0},{0},{-1}, - {{-1}}, - 2,{0,12}, - 60,30,500, 1.,18., 10 - }, - -}; diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/psych_11.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/psych_11.h deleted file mode 100644 index 844a8ed3..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/psych_11.h +++ /dev/null @@ -1,51 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: 11kHz settings - last mod: $Id: psych_11.h 16227 2009-07-08 06:58:46Z xiphmont $ - - ********************************************************************/ - -static const double _psy_lowpass_11[3]={4.5,5.5,30.,}; - -static const att3 _psy_tone_masteratt_11[3]={ - {{ 30, 25, 12}, 0, 0}, /* 0 */ - {{ 30, 25, 12}, 0, 0}, /* 0 */ - {{ 20, 0, -14}, 0, 0}, /* 0 */ -}; - -static const vp_adjblock _vp_tonemask_adj_11[3]={ - /* adjust for mode zero */ - /* 63 125 250 500 1 2 4 8 16 */ - {{-20,-20,-20,-20,-20,-16,-10, 0, 0, 0, 0,10, 2, 0,99,99,99}}, /* 0 */ - {{-20,-20,-20,-20,-20,-16,-10, 0, 0, 0, 0, 5, 0, 0,99,99,99}}, /* 1 */ - {{-20,-20,-20,-20,-20,-16,-10, 0, 0, 0, 0, 0, 0, 0,99,99,99}}, /* 2 */ -}; - - -static const noise3 _psy_noisebias_11[3]={ - /* 63 125 250 500 1k 2k 4k 8k 16k*/ - {{{-10,-10,-10,-10, -5, -5, -5, 0, 4, 10, 10, 12, 12, 12, 99, 99, 99}, - {-15,-15,-15,-15,-10,-10, -5, 0, 0, 4, 4, 5, 5, 10, 99, 99, 99}, - {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, 99, 99, 99}}}, - - {{{-10,-10,-10,-10, -5, -5, -5, 0, 4, 10, 10, 12, 12, 12, 99, 99, 99}, - {-15,-15,-15,-15,-10,-10, -5, -5, -5, 0, 0, 0, 0, 0, 99, 99, 99}, - {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, 99, 99, 99}}}, - - {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 4, 4, 5, 5, 99, 99, 99}, - {-30,-30,-30,-30,-26,-22,-20,-14,-12,-12,-10,-10,-10,-10, 99, 99, 99}, - {-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26,-24, 99, 99, 99}}}, -}; - -static const double _noise_thresh_11[3]={ .3,.5,.5 }; - diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/psych_16.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/psych_16.h deleted file mode 100644 index 1c10b395..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/psych_16.h +++ /dev/null @@ -1,133 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: 16kHz settings - last mod: $Id: psych_16.h 16227 2009-07-08 06:58:46Z xiphmont $ - - ********************************************************************/ - -/* stereo mode by base quality level */ -static const adj_stereo _psy_stereo_modes_16[4]={ - /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 */ - {{ 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - { 6, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, - { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, - {{ 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - { 6, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, - { 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 4, 4, 4, 4, 4}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, - {{ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - { 5, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, - {{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, -}; - -static const double _psy_lowpass_16[4]={6.5,8,30.,99.}; - -static const att3 _psy_tone_masteratt_16[4]={ - {{ 30, 25, 12}, 0, 0}, /* 0 */ - {{ 25, 22, 12}, 0, 0}, /* 0 */ - {{ 20, 12, 0}, 0, 0}, /* 0 */ - {{ 15, 0, -14}, 0, 0}, /* 0 */ -}; - -static const vp_adjblock _vp_tonemask_adj_16[4]={ - /* adjust for mode zero */ - /* 63 125 250 500 1 2 4 8 16 */ - {{-20,-20,-20,-20,-20,-16,-10, 0, 0, 0, 0,10, 0, 0, 0, 0, 0}}, /* 0 */ - {{-20,-20,-20,-20,-20,-16,-10, 0, 0, 0, 0,10, 0, 0, 0, 0, 0}}, /* 1 */ - {{-20,-20,-20,-20,-20,-16,-10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, /* 2 */ - {{-30,-30,-30,-30,-30,-26,-20,-10, -5, 0, 0, 0, 0, 0, 0, 0, 0}}, /* 2 */ -}; - - -static const noise3 _psy_noisebias_16_short[4]={ - /* 63 125 250 500 1k 2k 4k 8k 16k*/ - {{{-15,-15,-15,-15,-15,-10,-10,-5, 4, 10, 10, 10, 10, 12, 12, 14, 20}, - {-15,-15,-15,-15,-15,-10,-10, -5, 0, 0, 4, 5, 5, 6, 8, 8, 15}, - {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -6, -6}}}, - - {{{-15,-15,-15,-15,-15,-10,-10,-5, 4, 6, 6, 6, 6, 8, 10, 12, 20}, - {-15,-15,-15,-15,-15,-15,-15,-10, -5, -5, -5, 4, 5, 6, 8, 8, 15}, - {-30,-30,-30,-30,-30,-24,-20,-14,-10,-10,-10,-10,-10,-10,-10,-10,-10}}}, - - {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 4, 4, 5, 5, 5, 8, 12}, - {-20,-20,-20,-20,-16,-12,-20,-14,-10,-10, -8, 0, 0, 0, 0, 2, 5}, - {-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26,-24,-20,-20,-20}}}, - - {{{-15,-15,-15,-15,-15,-12,-10, -8, -5, -5, -5, -5, -5, 0, 0, 0, 6}, - {-30,-30,-30,-30,-26,-22,-20,-14,-12,-12,-10,-10,-10,-10,-10,-10, -6}, - {-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26,-24,-20,-20,-20}}}, -}; - -static const noise3 _psy_noisebias_16_impulse[4]={ - /* 63 125 250 500 1k 2k 4k 8k 16k*/ - {{{-15,-15,-15,-15,-15,-10,-10,-5, 4, 10, 10, 10, 10, 12, 12, 14, 20}, - {-15,-15,-15,-15,-15,-10,-10, -5, 0, 0, 4, 5, 5, 6, 8, 8, 15}, - {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -6, -6}}}, - - {{{-15,-15,-15,-15,-15,-10,-10,-5, 4, 4, 4, 4, 5, 5, 6, 8, 15}, - {-15,-15,-15,-15,-15,-15,-15,-10, -5, -5, -5, 0, 0, 0, 0, 4, 10}, - {-30,-30,-30,-30,-30,-24,-20,-14,-10,-10,-10,-10,-10,-10,-10,-10,-10}}}, - - {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 4, 10}, - {-20,-20,-20,-20,-16,-12,-20,-14,-10,-10,-10,-10,-10,-10,-10, -7, -5}, - {-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26,-24,-20,-20,-20}}}, - - {{{-15,-15,-15,-15,-15,-12,-10, -8, -5, -5, -5, -5, -5, 0, 0, 0, 6}, - {-30,-30,-30,-30,-26,-22,-20,-18,-18,-18,-20,-20,-20,-20,-20,-20,-16}, - {-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26,-24,-20,-20,-20}}}, -}; - -static const noise3 _psy_noisebias_16[4]={ - /* 63 125 250 500 1k 2k 4k 8k 16k*/ - {{{-10,-10,-10,-10, -5, -5, -5, 0, 4, 6, 8, 8, 10, 10, 10, 14, 20}, - {-10,-10,-10,-10,-10, -5, -2, -2, 0, 0, 0, 4, 5, 6, 8, 8, 15}, - {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -6, -6}}}, - - {{{-10,-10,-10,-10, -5, -5, -5, 0, 4, 6, 6, 6, 6, 8, 10, 12, 20}, - {-15,-15,-15,-15,-15,-10, -5, -5, 0, 0, 0, 4, 5, 6, 8, 8, 15}, - {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -6, -6}}}, - - {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 4, 4, 5, 5, 5, 8, 12}, - {-20,-20,-20,-20,-16,-12,-20,-10, -5, -5, 0, 0, 0, 0, 0, 2, 5}, - {-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26,-24,-20,-20,-20}}}, - - {{{-15,-15,-15,-15,-15,-12,-10, -8, -5, -5, -5, -5, -5, 0, 0, 0, 6}, - {-30,-30,-30,-30,-26,-22,-20,-14,-12,-12,-10,-10,-10,-10,-10,-10, -6}, - {-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26,-24,-20,-20,-20}}}, -}; - -static const noiseguard _psy_noiseguards_16[4]={ - {10,10,-1}, - {10,10,-1}, - {20,20,-1}, - {20,20,-1}, -}; - -static const double _noise_thresh_16[4]={ .3,.5,.5,.5 }; - -static const int _noise_start_16[3]={ 256,256,9999 }; -static const int _noise_part_16[4]={ 8,8,8,8 }; - -static const int _psy_ath_floater_16[4]={ - -100,-100,-100,-105, -}; - -static const int _psy_ath_abs_16[4]={ - -130,-130,-130,-140, -}; diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/psych_44.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/psych_44.h deleted file mode 100644 index f05c0326..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/psych_44.h +++ /dev/null @@ -1,642 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: key psychoacoustic settings for 44.1/48kHz - last mod: $Id: psych_44.h 16962 2010-03-11 07:30:34Z xiphmont $ - - ********************************************************************/ - - -/* preecho trigger settings *****************************************/ - -static const vorbis_info_psy_global _psy_global_44[5]={ - - {8, /* lines per eighth octave */ - {20.f,14.f,12.f,12.f,12.f,12.f,12.f}, - {-60.f,-30.f,-40.f,-40.f,-40.f,-40.f,-40.f}, 2,-75.f, - -6.f, - {99.},{{99.},{99.}},{0},{0},{{0.},{0.}} - }, - {8, /* lines per eighth octave */ - {14.f,10.f,10.f,10.f,10.f,10.f,10.f}, - {-40.f,-30.f,-25.f,-25.f,-25.f,-25.f,-25.f}, 2,-80.f, - -6.f, - {99.},{{99.},{99.}},{0},{0},{{0.},{0.}} - }, - {8, /* lines per eighth octave */ - {12.f,10.f,10.f,10.f,10.f,10.f,10.f}, - {-20.f,-20.f,-15.f,-15.f,-15.f,-15.f,-15.f}, 0,-80.f, - -6.f, - {99.},{{99.},{99.}},{0},{0},{{0.},{0.}} - }, - {8, /* lines per eighth octave */ - {10.f,8.f,8.f,8.f,8.f,8.f,8.f}, - {-20.f,-15.f,-12.f,-12.f,-12.f,-12.f,-12.f}, 0,-80.f, - -6.f, - {99.},{{99.},{99.}},{0},{0},{{0.},{0.}} - }, - {8, /* lines per eighth octave */ - {10.f,6.f,6.f,6.f,6.f,6.f,6.f}, - {-15.f,-15.f,-12.f,-12.f,-12.f,-12.f,-12.f}, 0,-85.f, - -6.f, - {99.},{{99.},{99.}},{0},{0},{{0.},{0.}} - }, -}; - -/* noise compander lookups * low, mid, high quality ****************/ -static const compandblock _psy_compand_44[6]={ - /* sub-mode Z short */ - {{ - 0, 1, 2, 3, 4, 5, 6, 7, /* 7dB */ - 8, 9,10,11,12,13,14, 15, /* 15dB */ - 16,17,18,19,20,21,22, 23, /* 23dB */ - 24,25,26,27,28,29,30, 31, /* 31dB */ - 32,33,34,35,36,37,38, 39, /* 39dB */ - }}, - /* mode_Z nominal short */ - {{ - 0, 1, 2, 3, 4, 5, 6, 6, /* 7dB */ - 7, 7, 7, 7, 6, 6, 6, 7, /* 15dB */ - 7, 8, 9,10,11,12,13, 14, /* 23dB */ - 15,16,17,17,17,18,18, 19, /* 31dB */ - 19,19,20,21,22,23,24, 25, /* 39dB */ - }}, - /* mode A short */ - {{ - 0, 1, 2, 3, 4, 5, 5, 5, /* 7dB */ - 6, 6, 6, 5, 4, 4, 4, 4, /* 15dB */ - 4, 4, 5, 5, 5, 6, 6, 6, /* 23dB */ - 7, 7, 7, 8, 8, 8, 9, 10, /* 31dB */ - 11,12,13,14,15,16,17, 18, /* 39dB */ - }}, - /* sub-mode Z long */ - {{ - 0, 1, 2, 3, 4, 5, 6, 7, /* 7dB */ - 8, 9,10,11,12,13,14, 15, /* 15dB */ - 16,17,18,19,20,21,22, 23, /* 23dB */ - 24,25,26,27,28,29,30, 31, /* 31dB */ - 32,33,34,35,36,37,38, 39, /* 39dB */ - }}, - /* mode_Z nominal long */ - {{ - 0, 1, 2, 3, 4, 5, 6, 7, /* 7dB */ - 8, 9,10,11,12,12,13, 13, /* 15dB */ - 13,14,14,14,15,15,15, 15, /* 23dB */ - 16,16,17,17,17,18,18, 19, /* 31dB */ - 19,19,20,21,22,23,24, 25, /* 39dB */ - }}, - /* mode A long */ - {{ - 0, 1, 2, 3, 4, 5, 6, 7, /* 7dB */ - 8, 8, 7, 6, 5, 4, 4, 4, /* 15dB */ - 4, 4, 5, 5, 5, 6, 6, 6, /* 23dB */ - 7, 7, 7, 8, 8, 8, 9, 10, /* 31dB */ - 11,12,13,14,15,16,17, 18, /* 39dB */ - }} -}; - -/* tonal masking curve level adjustments *************************/ - -static const vp_adjblock _vp_tonemask_adj_longblock[12]={ - - /* 63 125 250 500 1 2 4 8 16 */ - - {{ -3, -8,-13,-15,-10,-10,-10,-10,-10,-10,-10, 0, 0, 0, 0, 0, 0}}, /* -1 */ - -/* {{-15,-15,-15,-15,-10, -8, -4, -2, 0, 0, 0, 10, 0, 0, 0, 0, 0}}, 0 */ - {{ -4,-10,-14,-16,-15,-14,-13,-12,-12,-12,-11, -1, -1, -1, -1, -1, 0}}, /* 0 */ - -/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 5, 0, 0, 0, 0, 0}}, 1 */ - {{ -6,-12,-14,-16,-15,-15,-14,-13,-13,-12,-12, -2, -2, -1, -1, -1, 0}}, /* 1 */ - -/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 2 */ - {{-12,-13,-14,-16,-16,-16,-15,-14,-13,-12,-12, -6, -3, -1, -1, -1, 0}}, /* 2 */ - -/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 3 */ - {{-15,-15,-15,-16,-16,-16,-16,-14,-13,-13,-13,-10, -4, -2, -1, -1, 0}}, /* 3 */ - -/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, *//* 4 */ - {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-13,-11, -7 -3, -1, -1 , 0}}, /* 4 */ - -/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 5 */ - {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-13,-11, -7 -3, -1, -1 , 0}}, /* 5 */ - -/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 6 */ - {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -8, -4, -2, -2, 0}}, /* 6 */ - -/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 7 */ - {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -9, -4, -2, -2, 0}}, /* 7 */ - -/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 8 */ - {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -9, -4, -2, -2, 0}}, /* 8 */ - -/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 9 */ - {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -9, -4, -2, -2, 0}}, /* 9 */ - -/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 10 */ - {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -9, -4, -2, -2, 0}}, /* 10 */ -}; - -static const vp_adjblock _vp_tonemask_adj_otherblock[12]={ - /* 63 125 250 500 1 2 4 8 16 */ - - {{ -3, -8,-13,-15,-10,-10, -9, -9, -9, -9, -9, 1, 1, 1, 1, 1, 1}}, /* -1 */ - -/* {{-20,-20,-20,-20,-14,-12,-10, -8, -4, 0, 0, 10, 0, 0, 0, 0, 0}}, 0 */ - {{ -4,-10,-14,-16,-14,-13,-12,-12,-11,-11,-10, 0, 0, 0, 0, 0, 0}}, /* 0 */ - -/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 5, 0, 0, 0, 0, 0}}, 1 */ - {{ -6,-12,-14,-16,-15,-15,-14,-13,-13,-12,-12, -2, -2, -1, 0, 0, 0}}, /* 1 */ - -/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 2 */ - {{-12,-13,-14,-16,-16,-16,-15,-14,-13,-12,-12, -5, -2, -1, 0, 0, 0}}, /* 2 */ - -/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 3 */ - {{-15,-15,-15,-16,-16,-16,-16,-14,-13,-13,-13,-10, -4, -2, 0, 0, 0}}, /* 3 */ - -/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 4 */ - {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-13,-11, -7 -3, -1, -1 , 0}}, /* 4 */ - -/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 5 */ - {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-13,-11, -7 -3, -1, -1 , 0}}, /* 5 */ - -/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 6 */ - {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -8, -4, -2, -2, 0}}, /* 6 */ - -/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 7 */ - {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -9, -4, -2, -2, 0}}, /* 7 */ - -/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 8 */ - {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -9, -4, -2, -2, 0}}, /* 8 */ - -/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 9 */ - {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -9, -4, -2, -2, 0}}, /* 9 */ - -/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 10 */ - {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -9, -4, -2, -2, 0}}, /* 10 */ -}; - -/* noise bias (transition block) */ -static const noise3 _psy_noisebias_trans[12]={ - /* 63 125 250 500 1k 2k 4k 8k 16k*/ - /* -1 */ - {{{-10,-10,-10,-10,-10, -4, 0, 0, 4, 8, 8, 8, 8, 10, 12, 14, 20}, - {-30,-30,-30,-30,-26,-20,-16, -8, -6, -6, -2, 2, 2, 3, 6, 6, 15}, - {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -4, -2}}}, - /* 0 - {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 4, 4, 5, 5, 5, 8, 10}, - {-30,-30,-30,-30,-26,-22,-20,-14, -8, -4, 0, 0, 0, 0, 2, 4, 10}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -6, -6, -6, -4, -4, -4, -2}}},*/ - {{{-15,-15,-15,-15,-15,-12, -6, -4, 0, 2, 4, 4, 5, 5, 5, 8, 10}, - {-30,-30,-30,-30,-26,-22,-20,-14, -8, -4, 0, 0, 0, 0, 2, 3, 6}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -6, -6, -6, -4, -4, -4, -2}}}, - /* 1 - {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 4, 4, 5, 5, 5, 8, 10}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -2, -2, -2, -2, 0, 2, 8}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -8, -8, -8, -8, -6, -6, -6, -4}}},*/ - {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 4, 4, 5, 5, 5, 8, 10}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -2, -2, -2, -2, 0, 1, 4}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -8, -8, -8, -8, -6, -6, -6, -4}}}, - /* 2 - {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 2, 2, 4, 4, 5, 6, 10}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -2, -2, -2, -2, 0, 2, 6}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}}, */ - {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 2, 2, 4, 4, 5, 6, 10}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -3, -3, -3, -2, -1, 0, 3}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10, -8, -8, -7, -4}}}, - /* 3 - {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 2, 2, 4, 4, 4, 5, 8}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -3, -3, -3, -3, -1, 1, 6}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}},*/ - {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 2, 2, 4, 4, 4, 5, 8}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -3, -3, -3, -3, -2, 0, 2}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}}, - /* 4 - {{{-20,-20,-20,-20,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -3, -3, -3, -3, -1, 1, 5}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}},*/ - {{{-20,-20,-20,-20,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -3, -3, -3, -3, -2, -1, 1}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}}, - /* 5 - {{{-24,-24,-24,-24,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7}, - {-32,-32,-32,-32,-28,-24,-22,-16,-12, -6, -4, -4, -4, -4, -2, -1, 2}, - {-34,-34,-34,-34,-30,-24,-24,-18,-14,-12,-12,-12,-12,-10,-10, -9, -5}}}, */ - {{{-24,-24,-24,-24,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7}, - {-32,-32,-32,-32,-28,-24,-22,-16,-12, -6, -4, -4, -4, -4, -3, -1, 0}, - {-34,-34,-34,-34,-30,-24,-24,-18,-14,-12,-12,-12,-12,-10,-10, -9, -5}}}, - /* 6 - {{{-24,-24,-24,-24,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7}, - {-32,-32,-32,-32,-28,-24,-24,-18,-14, -8, -6, -6, -6, -6, -4, -2, 1}, - {-34,-34,-34,-34,-30,-26,-24,-18,-17,-15,-15,-15,-15,-13,-13,-12, -8}}},*/ - {{{-24,-24,-24,-24,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7}, - {-32,-32,-32,-32,-28,-24,-24,-18,-14, -8, -6, -6, -6, -6, -5, -2, 0}, - {-34,-34,-34,-34,-30,-26,-26,-24,-22,-19,-19,-19,-19,-18,-17,-16,-12}}}, - /* 7 - {{{-24,-24,-24,-24,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7}, - {-32,-32,-32,-32,-28,-24,-24,-18,-14,-12,-10, -8, -8, -8, -6, -4, 0}, - {-34,-34,-34,-34,-30,-26,-26,-24,-22,-19,-19,-19,-19,-18,-17,-16,-12}}},*/ - {{{-24,-24,-24,-24,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7}, - {-32,-32,-32,-32,-28,-24,-24,-24,-18,-14,-12,-10,-10,-10, -8, -6, -2}, - {-34,-34,-34,-34,-30,-26,-26,-26,-24,-24,-24,-24,-24,-24,-24,-20,-16}}}, - /* 8 - {{{-24,-24,-24,-24,-22,-20,-15,-10, -8, -2, 0, 0, 0, 1, 2, 3, 7}, - {-36,-36,-36,-36,-30,-30,-30,-24,-18,-14,-12,-10,-10,-10, -8, -6, -2}, - {-36,-36,-36,-36,-34,-30,-28,-26,-24,-24,-24,-24,-24,-24,-24,-20,-16}}},*/ - {{{-24,-24,-24,-24,-22,-20,-15,-10, -8, -2, 0, 0, 0, 1, 2, 3, 7}, - {-36,-36,-36,-36,-30,-30,-30,-24,-20,-16,-16,-16,-16,-14,-12,-10, -7}, - {-36,-36,-36,-36,-34,-30,-28,-26,-24,-30,-30,-30,-30,-30,-30,-24,-20}}}, - /* 9 - {{{-28,-28,-28,-28,-28,-28,-28,-20,-14, -8, -4, -4, -4, -4, -4, -2, 2}, - {-36,-36,-36,-36,-34,-32,-32,-28,-20,-16,-16,-16,-16,-14,-12,-10, -7}, - {-40,-40,-40,-40,-40,-40,-40,-32,-30,-30,-30,-30,-30,-30,-30,-24,-20}}},*/ - {{{-28,-28,-28,-28,-28,-28,-28,-20,-14, -8, -4, -4, -4, -4, -4, -2, 2}, - {-38,-38,-38,-38,-36,-34,-34,-30,-24,-20,-20,-20,-20,-18,-16,-12,-10}, - {-40,-40,-40,-40,-40,-40,-40,-38,-35,-35,-35,-35,-35,-35,-35,-35,-30}}}, - /* 10 */ - {{{-30,-30,-30,-30,-30,-30,-30,-28,-20,-14,-14,-14,-14,-14,-14,-12,-10}, - {-40,-40,-40,-40,-40,-40,-40,-40,-35,-30,-30,-30,-30,-30,-30,-30,-20}, - {-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40}}}, -}; - -/* noise bias (long block) */ -static const noise3 _psy_noisebias_long[12]={ - /*63 125 250 500 1k 2k 4k 8k 16k*/ - /* -1 */ - {{{-10,-10,-10,-10,-10, -4, 0, 0, 0, 6, 6, 6, 6, 10, 10, 12, 20}, - {-20,-20,-20,-20,-20,-20,-10, -2, 0, 0, 0, 0, 0, 2, 4, 6, 15}, - {-20,-20,-20,-20,-20,-20,-20,-10, -6, -6, -6, -6, -6, -4, -4, -4, -2}}}, - - /* 0 */ - /* {{{-10,-10,-10,-10,-10,-10, -8, 2, 2, 2, 4, 4, 5, 5, 5, 8, 10}, - {-20,-20,-20,-20,-20,-20,-20,-14, -6, 0, 0, 0, 0, 0, 2, 4, 10}, - {-20,-20,-20,-20,-20,-20,-20,-14, -8, -6, -6, -6, -6, -4, -4, -4, -2}}},*/ - {{{-10,-10,-10,-10,-10,-10, -8, 2, 2, 2, 4, 4, 5, 5, 5, 8, 10}, - {-20,-20,-20,-20,-20,-20,-20,-14, -6, 0, 0, 0, 0, 0, 2, 3, 6}, - {-20,-20,-20,-20,-20,-20,-20,-14, -8, -6, -6, -6, -6, -4, -4, -4, -2}}}, - /* 1 */ - /* {{{-10,-10,-10,-10,-10,-10, -8, -4, 0, 2, 4, 4, 5, 5, 5, 8, 10}, - {-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -2, -2, -2, -2, 0, 2, 8}, - {-20,-20,-20,-20,-20,-20,-20,-14,-10, -8, -8, -8, -8, -6, -6, -6, -4}}},*/ - {{{-10,-10,-10,-10,-10,-10, -8, -4, 0, 2, 4, 4, 5, 5, 5, 8, 10}, - {-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -2, -2, -2, -2, 0, 1, 4}, - {-20,-20,-20,-20,-20,-20,-20,-14,-10, -8, -8, -8, -8, -6, -6, -6, -4}}}, - /* 2 */ - /* {{{-10,-10,-10,-10,-10,-10,-10, -8, 0, 2, 2, 2, 4, 4, 5, 6, 10}, - {-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -2, -2, -2, -2, 0, 2, 6}, - {-20,-20,-20,-20,-20,-20,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}},*/ - {{{-10,-10,-10,-10,-10,-10,-10, -8, 0, 2, 2, 2, 4, 4, 5, 6, 10}, - {-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -3, -3, -3, -2, -1, 0, 3}, - {-20,-20,-20,-20,-20,-20,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}}, - /* 3 */ - /* {{{-10,-10,-10,-10,-10,-10,-10, -8, 0, 2, 2, 2, 4, 4, 4, 5, 8}, - {-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -3, -3, -3, -3, -1, 1, 6}, - {-20,-20,-20,-20,-20,-20,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}},*/ - {{{-10,-10,-10,-10,-10,-10,-10, -8, 0, 2, 2, 2, 4, 4, 4, 5, 8}, - {-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -3, -3, -3, -3, -2, 0, 2}, - {-20,-20,-20,-20,-20,-20,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -5}}}, - /* 4 */ - /* {{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 1, 1, 1, 2, 3, 3, 4, 7}, - {-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -3, -3, -3, -3, -1, 1, 5}, - {-20,-20,-20,-20,-20,-20,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}},*/ - {{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 1, 1, 1, 2, 3, 3, 4, 7}, - {-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -3, -3, -3, -3, -2, -1, 1}, - {-20,-20,-20,-20,-20,-20,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -7}}}, - /* 5 */ - /* {{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 1, 1, 1, 2, 3, 3, 4, 7}, - {-22,-22,-22,-22,-22,-22,-22,-16,-12, -6, -4, -4, -4, -4, -2, -1, 2}, - {-24,-24,-24,-24,-24,-24,-24,-18,-14,-12,-12,-12,-12,-10,-10, -9, -5}}},*/ - {{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 1, 1, 1, 2, 3, 3, 4, 7}, - {-22,-22,-22,-22,-22,-22,-22,-16,-12, -6, -4, -4, -4, -4, -3, -1, 0}, - {-24,-24,-24,-24,-24,-24,-24,-18,-14,-12,-12,-12,-12,-10,-10, -9, -8}}}, - /* 6 */ - /* {{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 1, 1, 1, 2, 3, 3, 4, 7}, - {-24,-24,-24,-24,-24,-24,-24,-18,-14, -8, -6, -6, -6, -6, -4, -2, 1}, - {-26,-26,-26,-26,-26,-26,-26,-18,-16,-15,-15,-15,-15,-13,-13,-12, -8}}},*/ - {{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 1, 1, 1, 2, 3, 3, 4, 7}, - {-24,-24,-24,-24,-24,-24,-24,-18,-14, -8, -6, -6, -6, -6, -5, -2, 0}, - {-26,-26,-26,-26,-26,-26,-26,-18,-16,-15,-15,-15,-15,-13,-13,-12,-10}}}, - /* 7 */ - {{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 1, 1, 1, 2, 3, 3, 4, 7}, - {-24,-24,-24,-24,-24,-24,-24,-18,-14,-10, -8, -8, -8, -8, -6, -4, 0}, - {-26,-26,-26,-26,-26,-26,-26,-22,-20,-19,-19,-19,-19,-18,-17,-16,-12}}}, - /* 8 */ - {{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 0, 0, 0, 0, 1, 2, 3, 7}, - {-26,-26,-26,-26,-26,-26,-26,-20,-16,-12,-10,-10,-10,-10, -8, -6, -2}, - {-28,-28,-28,-28,-28,-28,-28,-26,-24,-24,-24,-24,-24,-24,-24,-20,-16}}}, - /* 9 */ - {{{-22,-22,-22,-22,-22,-22,-22,-18,-14, -8, -4, -4, -4, -4, -4, -2, 2}, - {-26,-26,-26,-26,-26,-26,-26,-22,-18,-16,-16,-16,-16,-14,-12,-10, -7}, - {-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-24,-20}}}, - /* 10 */ - {{{-24,-24,-24,-24,-24,-24,-24,-24,-24,-18,-14,-14,-14,-14,-14,-12,-10}, - {-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-20}, - {-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40}}}, -}; - -/* noise bias (impulse block) */ -static const noise3 _psy_noisebias_impulse[12]={ - /* 63 125 250 500 1k 2k 4k 8k 16k*/ - /* -1 */ - {{{-10,-10,-10,-10,-10, -4, 0, 0, 4, 8, 8, 8, 8, 10, 12, 14, 20}, - {-30,-30,-30,-30,-26,-20,-16, -8, -6, -6, -2, 2, 2, 3, 6, 6, 15}, - {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -4, -2}}}, - - /* 0 */ - /* {{{-10,-10,-10,-10,-10, -4, 0, 0, 4, 4, 8, 8, 8, 10, 12, 14, 20}, - {-30,-30,-30,-30,-26,-22,-20,-14, -6, -2, 0, 0, 0, 0, 2, 4, 10}, - {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -4, -2}}},*/ - {{{-10,-10,-10,-10,-10, -4, 0, 0, 4, 4, 8, 8, 8, 10, 12, 14, 20}, - {-30,-30,-30,-30,-26,-22,-20,-14, -6, -2, 0, 0, 0, 0, 2, 3, 6}, - {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -4, -2}}}, - /* 1 */ - {{{-12,-12,-12,-12,-12, -8, -6, -4, 0, 4, 4, 4, 4, 10, 12, 14, 20}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -4, -4, -2, -2, -2, -2, 2}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -8,-10,-10, -8, -8, -8, -6, -4}}}, - /* 2 */ - {{{-14,-14,-14,-14,-14,-10, -8, -6, -2, 2, 2, 2, 2, 8, 10, 10, 16}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -6, -6, -4, -4, -4, -2, 0}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10,-10,-10, -8, -4}}}, - /* 3 */ - {{{-14,-14,-14,-14,-14,-10, -8, -6, -2, 2, 2, 2, 2, 6, 8, 8, 14}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -6, -6, -4, -4, -4, -2, 0}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10,-10,-10, -8, -4}}}, - /* 4 */ - {{{-16,-16,-16,-16,-16,-12,-10, -6, -2, 0, 0, 0, 0, 4, 6, 6, 12}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -6, -6, -4, -4, -4, -2, 0}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10,-10,-10, -8, -4}}}, - /* 5 */ - {{{-20,-20,-20,-20,-20,-18,-14,-10, -4, 0, 0, 0, 0, 4, 4, 6, 11}, - {-32,-32,-32,-32,-28,-24,-22,-16,-10, -6, -8, -8, -6, -6, -6, -4, -2}, - {-34,-34,-34,-34,-30,-26,-24,-18,-14,-12,-12,-12,-12,-12,-10, -9, -5}}}, - /* 6 - {{{-20,-20,-20,-20,-20,-18,-14,-10, -4, 0, 0, 0, 0, 4, 4, 6, 11}, - {-34,-34,-34,-34,-30,-30,-24,-20,-12,-12,-14,-14,-10, -9, -8, -6, -4}, - {-34,-34,-34,-34,-34,-30,-26,-20,-16,-15,-15,-15,-15,-15,-13,-12, -8}}},*/ - {{{-20,-20,-20,-20,-20,-18,-14,-10, -4, 0, 0, 0, 0, 4, 4, 6, 11}, - {-34,-34,-34,-34,-30,-30,-30,-24,-16,-16,-16,-16,-16,-16,-14,-14,-12}, - {-36,-36,-36,-36,-36,-34,-28,-24,-20,-20,-20,-20,-20,-20,-20,-18,-16}}}, - /* 7 */ - /* {{{-22,-22,-22,-22,-22,-20,-14,-10, -6, 0, 0, 0, 0, 4, 4, 6, 11}, - {-34,-34,-34,-34,-30,-30,-24,-20,-14,-14,-16,-16,-14,-12,-10,-10,-10}, - {-34,-34,-34,-34,-32,-32,-30,-24,-20,-19,-19,-19,-19,-19,-17,-16,-12}}},*/ - {{{-22,-22,-22,-22,-22,-20,-14,-10, -6, 0, 0, 0, 0, 4, 4, 6, 11}, - {-34,-34,-34,-34,-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-24,-22}, - {-40,-40,-40,-40,-40,-40,-40,-32,-30,-30,-30,-30,-30,-30,-30,-30,-24}}}, - /* 8 */ - /* {{{-24,-24,-24,-24,-24,-22,-14,-10, -6, -1, -1, -1, -1, 3, 3, 5, 10}, - {-34,-34,-34,-34,-30,-30,-30,-24,-20,-20,-20,-20,-20,-18,-16,-16,-14}, - {-36,-36,-36,-36,-36,-34,-28,-24,-24,-24,-24,-24,-24,-24,-24,-20,-16}}},*/ - {{{-24,-24,-24,-24,-24,-22,-14,-10, -6, -1, -1, -1, -1, 3, 3, 5, 10}, - {-34,-34,-34,-34,-34,-32,-32,-30,-26,-26,-26,-26,-26,-26,-26,-26,-24}, - {-40,-40,-40,-40,-40,-40,-40,-32,-30,-30,-30,-30,-30,-30,-30,-30,-24}}}, - /* 9 */ - /* {{{-28,-28,-28,-28,-28,-28,-28,-20,-14, -8, -4, -4, -4, -4, -4, -2, 2}, - {-36,-36,-36,-36,-34,-32,-32,-30,-26,-26,-26,-26,-26,-22,-20,-20,-18}, - {-40,-40,-40,-40,-40,-40,-40,-32,-30,-30,-30,-30,-30,-30,-30,-24,-20}}},*/ - {{{-28,-28,-28,-28,-28,-28,-28,-20,-14, -8, -4, -4, -4, -4, -4, -2, 2}, - {-36,-36,-36,-36,-34,-32,-32,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26}, - {-40,-40,-40,-40,-40,-40,-40,-32,-30,-30,-30,-30,-30,-30,-30,-24,-20}}}, - /* 10 */ - {{{-30,-30,-30,-30,-30,-26,-24,-24,-24,-20,-16,-16,-16,-16,-16,-14,-12}, - {-40,-40,-40,-40,-40,-40,-40,-40,-35,-30,-30,-30,-30,-30,-30,-30,-26}, - {-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40}}}, -}; - -/* noise bias (padding block) */ -static const noise3 _psy_noisebias_padding[12]={ - /* 63 125 250 500 1k 2k 4k 8k 16k*/ - - /* -1 */ - {{{-10,-10,-10,-10,-10, -4, 0, 0, 4, 8, 8, 8, 8, 10, 12, 14, 20}, - {-30,-30,-30,-30,-26,-20,-16, -8, -6, -6, -2, 2, 2, 3, 6, 6, 15}, - {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -4, -2}}}, - - /* 0 */ - {{{-10,-10,-10,-10,-10, -4, 0, 0, 4, 8, 8, 8, 8, 10, 12, 14, 20}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -2, 2, 3, 6, 6, 8, 10}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -4, -4, -4, -4, -2, 0, 2}}}, - /* 1 */ - {{{-12,-12,-12,-12,-12, -8, -6, -4, 0, 4, 4, 4, 4, 10, 12, 14, 20}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, 0, 0, 0, 2, 2, 4, 8}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -6, -6, -6, -6, -4, -2, 0}}}, - /* 2 */ - /* {{{-14,-14,-14,-14,-14,-10, -8, -6, -2, 2, 2, 2, 2, 8, 10, 10, 16}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, 0, 0, 0, 2, 2, 4, 8}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -8, -8, -8, -8, -8, -6, -4, -2}}},*/ - {{{-14,-14,-14,-14,-14,-10, -8, -6, -2, 2, 2, 2, 2, 8, 10, 10, 16}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -1, -1, -1, 0, 0, 2, 6}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -8, -8, -8, -8, -8, -6, -4, -2}}}, - /* 3 */ - {{{-14,-14,-14,-14,-14,-10, -8, -6, -2, 2, 2, 2, 2, 6, 8, 8, 14}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -1, -1, -1, 0, 0, 2, 6}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -8, -8, -8, -8, -8, -6, -4, -2}}}, - /* 4 */ - {{{-16,-16,-16,-16,-16,-12,-10, -6, -2, 0, 0, 0, 0, 4, 6, 6, 12}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -1, -1, -1, -1, 0, 2, 6}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -8, -8, -8, -8, -8, -6, -4, -2}}}, - /* 5 */ - {{{-20,-20,-20,-20,-20,-18,-14,-10, -4, 0, 0, 0, 0, 4, 6, 6, 12}, - {-32,-32,-32,-32,-28,-24,-22,-16,-12, -6, -3, -3, -3, -3, -2, 0, 4}, - {-34,-34,-34,-34,-30,-26,-24,-18,-14,-10,-10,-10,-10,-10, -8, -5, -3}}}, - /* 6 */ - {{{-20,-20,-20,-20,-20,-18,-14,-10, -4, 0, 0, 0, 0, 4, 6, 6, 12}, - {-34,-34,-34,-34,-30,-30,-24,-20,-14, -8, -4, -4, -4, -4, -3, -1, 4}, - {-34,-34,-34,-34,-34,-30,-26,-20,-16,-13,-13,-13,-13,-13,-11, -8, -6}}}, - /* 7 */ - {{{-20,-20,-20,-20,-20,-18,-14,-10, -4, 0, 0, 0, 0, 4, 6, 6, 12}, - {-34,-34,-34,-34,-30,-30,-30,-24,-16,-10, -8, -6, -6, -6, -5, -3, 1}, - {-34,-34,-34,-34,-32,-32,-28,-22,-18,-16,-16,-16,-16,-16,-14,-12,-10}}}, - /* 8 */ - {{{-22,-22,-22,-22,-22,-20,-14,-10, -4, 0, 0, 0, 0, 3, 5, 5, 11}, - {-34,-34,-34,-34,-30,-30,-30,-24,-16,-12,-10, -8, -8, -8, -7, -5, -2}, - {-36,-36,-36,-36,-36,-34,-28,-22,-20,-20,-20,-20,-20,-20,-20,-16,-14}}}, - /* 9 */ - {{{-28,-28,-28,-28,-28,-28,-28,-20,-14, -8, -2, -2, -2, -2, 0, 2, 6}, - {-36,-36,-36,-36,-34,-32,-32,-24,-16,-12,-12,-12,-12,-12,-10, -8, -5}, - {-40,-40,-40,-40,-40,-40,-40,-32,-26,-24,-24,-24,-24,-24,-24,-20,-18}}}, - /* 10 */ - {{{-30,-30,-30,-30,-30,-26,-24,-24,-24,-20,-12,-12,-12,-12,-12,-10, -8}, - {-40,-40,-40,-40,-40,-40,-40,-40,-35,-30,-25,-25,-25,-25,-25,-25,-15}, - {-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40}}}, -}; - - -static const noiseguard _psy_noiseguards_44[4]={ - {3,3,15}, - {3,3,15}, - {10,10,100}, - {10,10,100}, -}; - -static const int _psy_tone_suppress[12]={ - -20,-20,-20,-20,-20,-24,-30,-40,-40,-45,-45,-45, -}; -static const int _psy_tone_0dB[12]={ - 90,90,95,95,95,95,105,105,105,105,105,105, -}; -static const int _psy_noise_suppress[12]={ - -20,-20,-24,-24,-24,-24,-30,-40,-40,-45,-45,-45, -}; - -static const vorbis_info_psy _psy_info_template={ - /* blockflag */ - -1, - /* ath_adjatt, ath_maxatt */ - -140.,-140., - /* tonemask att boost/decay,suppr,curves */ - {0.f,0.f,0.f}, 0.,0., -40.f, {0.}, - - /*noisemaskp,supp, low/high window, low/hi guard, minimum */ - 1, -0.f, .5f, .5f, 0,0,0, - /* noiseoffset*3, noisecompand, max_curve_dB */ - {{-1},{-1},{-1}},{-1},105.f, - /* noise normalization - noise_p, start, partition, thresh. */ - 0,-1,-1,0., -}; - -/* ath ****************/ - -static const int _psy_ath_floater[12]={ - -100,-100,-100,-100,-100,-100,-105,-105,-105,-105,-110,-120, -}; -static const int _psy_ath_abs[12]={ - -130,-130,-130,-130,-140,-140,-140,-140,-140,-140,-140,-150, -}; - -/* stereo setup. These don't map directly to quality level, there's - an additional indirection as several of the below may be used in a - single bitmanaged stream - -****************/ - -/* various stereo possibilities */ - -/* stereo mode by base quality level */ -static const adj_stereo _psy_stereo_modes_44[12]={ - /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 -1 */ - {{ 4, 4, 4, 4, 4, 4, 4, 3, 2, 2, 1, 0, 0, 0, 0}, - { 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 5, 4, 3}, - { 1, 2, 3, 4, 4, 4, 4, 4, 4, 5, 6, 7, 8, 8, 8}, - { 12,12.5, 13,13.5, 14,14.5, 15, 99, 99, 99, 99, 99, 99, 99, 99}}, - -/* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0 */ - {{ 4, 4, 4, 4, 4, 4, 4, 3, 2, 1, 0, 0, 0, 0, 0}, - { 8, 8, 8, 8, 6, 6, 5, 5, 5, 5, 5, 5, 5, 4, 3}, - { 1, 2, 3, 4, 4, 5, 6, 6, 6, 6, 6, 8, 8, 8, 8}, - { 12,12.5, 13,13.5, 14,14.5, 15, 99, 99, 99, 99, 99, 99, 99, 99}}, - - - /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1 */ - {{ 3, 3, 3, 3, 3, 3, 3, 3, 2, 1, 0, 0, 0, 0, 0}, - { 8, 8, 8, 8, 6, 6, 5, 5, 5, 5, 5, 5, 5, 4, 3}, - { 1, 2, 3, 4, 4, 5, 6, 6, 6, 6, 6, 8, 8, 8, 8}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, - - - /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 2 */ - {{ 3, 3, 3, 3, 3, 3, 3, 2, 1, 1, 0, 0, 0, 0, 0}, - { 8, 8, 6, 6, 5, 5, 4, 4, 4, 4, 4, 4, 3, 2, 1}, - { 3, 4, 4, 5, 5, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, - /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 3 */ - {{ 2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0}, - { 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 2, 1}, - { 4, 4, 5, 6, 6, 6, 6, 6, 8, 8, 10, 10, 10, 10, 10}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, - /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 4 */ - {{ 2, 2, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 2, 1, 0}, - { 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, - /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 5 */ - {{ 2, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0}, - { 6, 7, 8, 8, 8, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, - /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 6 */ - {{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 3, 3, 3, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 8, 8, 8, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, - /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 7 */ - {{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 3, 3, 3, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 8, 8, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, - /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 8 */ - {{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 8, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, - /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 9 */ - {{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, - /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 10 */ - {{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, -}; - -/* tone master attenuation by base quality mode and bitrate tweak */ -static const att3 _psy_tone_masteratt_44[12]={ - {{ 35, 21, 9}, 0, 0}, /* -1 */ - {{ 30, 20, 8}, -2, 1.25}, /* 0 */ - /* {{ 25, 14, 4}, 0, 0}, *//* 1 */ - {{ 25, 12, 2}, 0, 0}, /* 1 */ - /* {{ 20, 10, -2}, 0, 0}, *//* 2 */ - {{ 20, 9, -3}, 0, 0}, /* 2 */ - {{ 20, 9, -4}, 0, 0}, /* 3 */ - {{ 20, 9, -4}, 0, 0}, /* 4 */ - {{ 20, 6, -6}, 0, 0}, /* 5 */ - {{ 20, 3, -10}, 0, 0}, /* 6 */ - {{ 18, 1, -14}, 0, 0}, /* 7 */ - {{ 18, 0, -16}, 0, 0}, /* 8 */ - {{ 18, -2, -16}, 0, 0}, /* 9 */ - {{ 12, -2, -20}, 0, 0}, /* 10 */ -}; - -/* lowpass by mode **************/ -static const double _psy_lowpass_44[12]={ - /* 15.1,15.8,16.5,17.9,20.5,48.,999.,999.,999.,999.,999. */ - 13.9,15.1,15.8,16.5,17.2,18.9,20.1,48.,999.,999.,999.,999. -}; - -/* noise normalization **********/ - -static const int _noise_start_short_44[11]={ - /* 16,16,16,16,32,32,9999,9999,9999,9999 */ - 32,16,16,16,32,9999,9999,9999,9999,9999,9999 -}; -static const int _noise_start_long_44[11]={ - /* 128,128,128,256,512,512,9999,9999,9999,9999 */ - 256,128,128,256,512,9999,9999,9999,9999,9999,9999 -}; - -static const int _noise_part_short_44[11]={ - 8,8,8,8,8,8,8,8,8,8,8 -}; -static const int _noise_part_long_44[11]={ - 32,32,32,32,32,32,32,32,32,32,32 -}; - -static const double _noise_thresh_44[11]={ - /* .2,.2,.3,.4,.5,.5,9999.,9999.,9999.,9999., */ - .2,.2,.2,.4,.6,9999.,9999.,9999.,9999.,9999.,9999., -}; - -static const double _noise_thresh_5only[2]={ - .5,.5, -}; diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/psych_8.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/psych_8.h deleted file mode 100644 index 0e2dd573..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/psych_8.h +++ /dev/null @@ -1,101 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: 8kHz psychoacoustic settings - last mod: $Id: psych_8.h 16227 2009-07-08 06:58:46Z xiphmont $ - - ********************************************************************/ - -static const att3 _psy_tone_masteratt_8[3]={ - {{ 32, 25, 12}, 0, 0}, /* 0 */ - {{ 30, 25, 12}, 0, 0}, /* 0 */ - {{ 20, 0, -14}, 0, 0}, /* 0 */ -}; - -static const vp_adjblock _vp_tonemask_adj_8[3]={ - /* adjust for mode zero */ - /* 63 125 250 500 1 2 4 8 16 */ - {{-15,-15,-15,-15,-10,-10, -6, 0, 0, 0, 0,10, 0, 0,99,99,99}}, /* 1 */ - {{-15,-15,-15,-15,-10,-10, -6, 0, 0, 0, 0,10, 0, 0,99,99,99}}, /* 1 */ - {{-15,-15,-15,-15,-10,-10, -6, 0, 0, 0, 0, 0, 0, 0,99,99,99}}, /* 1 */ -}; - - -static const noise3 _psy_noisebias_8[3]={ - /* 63 125 250 500 1k 2k 4k 8k 16k*/ - {{{-10,-10,-10,-10, -5, -5, -5, 0, 4, 8, 8, 8, 10, 10, 99, 99, 99}, - {-10,-10,-10,-10, -5, -5, -5, 0, 0, 4, 4, 4, 4, 4, 99, 99, 99}, - {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, 99, 99, 99}}}, - - {{{-10,-10,-10,-10, -5, -5, -5, 0, 4, 8, 8, 8, 10, 10, 99, 99, 99}, - {-10,-10,-10,-10,-10,-10, -5, -5, -5, 0, 0, 0, 0, 0, 99, 99, 99}, - {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, 99, 99, 99}}}, - - {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 4, 4, 5, 5, 99, 99, 99}, - {-30,-30,-30,-30,-26,-22,-20,-14,-12,-12,-10,-10,-10,-10, 99, 99, 99}, - {-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26,-24, 99, 99, 99}}}, -}; - -/* stereo mode by base quality level */ -static const adj_stereo _psy_stereo_modes_8[3]={ - /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 */ - {{ 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - { 6, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, - {{ 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - { 6, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, - {{ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, -}; - -static const noiseguard _psy_noiseguards_8[2]={ - {10,10,-1}, - {10,10,-1}, -}; - -static const compandblock _psy_compand_8[2]={ - {{ - 0, 1, 2, 3, 4, 5, 6, 7, /* 7dB */ - 8, 8, 9, 9,10,10,11, 11, /* 15dB */ - 12,12,13,13,14,14,15, 15, /* 23dB */ - 16,16,17,17,17,18,18, 19, /* 31dB */ - 19,19,20,21,22,23,24, 25, /* 39dB */ - }}, - {{ - 0, 1, 2, 3, 4, 5, 6, 6, /* 7dB */ - 7, 7, 6, 6, 5, 5, 4, 4, /* 15dB */ - 3, 3, 3, 4, 5, 6, 7, 8, /* 23dB */ - 9,10,11,12,13,14,15, 16, /* 31dB */ - 17,18,19,20,21,22,23, 24, /* 39dB */ - }}, -}; - -static const double _psy_lowpass_8[3]={3.,4.,4.}; -static const int _noise_start_8[2]={ - 64,64, -}; -static const int _noise_part_8[2]={ - 8,8, -}; - -static const int _psy_ath_floater_8[3]={ - -100,-100,-105, -}; - -static const int _psy_ath_abs_8[3]={ - -130,-130,-140, -}; diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/residue_16.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/residue_16.h deleted file mode 100644 index dcaca545..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/residue_16.h +++ /dev/null @@ -1,163 +0,0 @@ -/******************************************************************** - * * - * This FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: toplevel residue templates 16/22kHz - last mod: $Id: residue_16.h 16962 2010-03-11 07:30:34Z xiphmont $ - - ********************************************************************/ - -/***** residue backends *********************************************/ - -static const static_bookblock _resbook_16s_0={ - { - {0}, - {0,0,&_16c0_s_p1_0}, - {0}, - {0,0,&_16c0_s_p3_0}, - {0,0,&_16c0_s_p4_0}, - {0,0,&_16c0_s_p5_0}, - {0,0,&_16c0_s_p6_0}, - {&_16c0_s_p7_0,&_16c0_s_p7_1}, - {&_16c0_s_p8_0,&_16c0_s_p8_1}, - {&_16c0_s_p9_0,&_16c0_s_p9_1,&_16c0_s_p9_2} - } -}; -static const static_bookblock _resbook_16s_1={ - { - {0}, - {0,0,&_16c1_s_p1_0}, - {0}, - {0,0,&_16c1_s_p3_0}, - {0,0,&_16c1_s_p4_0}, - {0,0,&_16c1_s_p5_0}, - {0,0,&_16c1_s_p6_0}, - {&_16c1_s_p7_0,&_16c1_s_p7_1}, - {&_16c1_s_p8_0,&_16c1_s_p8_1}, - {&_16c1_s_p9_0,&_16c1_s_p9_1,&_16c1_s_p9_2} - } -}; -static const static_bookblock _resbook_16s_2={ - { - {0}, - {0,0,&_16c2_s_p1_0}, - {0,0,&_16c2_s_p2_0}, - {0,0,&_16c2_s_p3_0}, - {0,0,&_16c2_s_p4_0}, - {&_16c2_s_p5_0,&_16c2_s_p5_1}, - {&_16c2_s_p6_0,&_16c2_s_p6_1}, - {&_16c2_s_p7_0,&_16c2_s_p7_1}, - {&_16c2_s_p8_0,&_16c2_s_p8_1}, - {&_16c2_s_p9_0,&_16c2_s_p9_1,&_16c2_s_p9_2} - } -}; - -static const vorbis_residue_template _res_16s_0[]={ - {2,0,32, &_residue_44_mid, - &_huff_book__16c0_s_single,&_huff_book__16c0_s_single, - &_resbook_16s_0,&_resbook_16s_0}, -}; -static const vorbis_residue_template _res_16s_1[]={ - {2,0,32, &_residue_44_mid, - &_huff_book__16c1_s_short,&_huff_book__16c1_s_short, - &_resbook_16s_1,&_resbook_16s_1}, - - {2,0,32, &_residue_44_mid, - &_huff_book__16c1_s_long,&_huff_book__16c1_s_long, - &_resbook_16s_1,&_resbook_16s_1} -}; -static const vorbis_residue_template _res_16s_2[]={ - {2,0,32, &_residue_44_high, - &_huff_book__16c2_s_short,&_huff_book__16c2_s_short, - &_resbook_16s_2,&_resbook_16s_2}, - - {2,0,32, &_residue_44_high, - &_huff_book__16c2_s_long,&_huff_book__16c2_s_long, - &_resbook_16s_2,&_resbook_16s_2} -}; - -static const vorbis_mapping_template _mapres_template_16_stereo[3]={ - { _map_nominal, _res_16s_0 }, /* 0 */ - { _map_nominal, _res_16s_1 }, /* 1 */ - { _map_nominal, _res_16s_2 }, /* 2 */ -}; - -static const static_bookblock _resbook_16u_0={ - { - {0}, - {0,0,&_16u0__p1_0}, - {0,0,&_16u0__p2_0}, - {0,0,&_16u0__p3_0}, - {0,0,&_16u0__p4_0}, - {0,0,&_16u0__p5_0}, - {&_16u0__p6_0,&_16u0__p6_1}, - {&_16u0__p7_0,&_16u0__p7_1,&_16u0__p7_2} - } -}; -static const static_bookblock _resbook_16u_1={ - { - {0}, - {0,0,&_16u1__p1_0}, - {0,0,&_16u1__p2_0}, - {0,0,&_16u1__p3_0}, - {0,0,&_16u1__p4_0}, - {0,0,&_16u1__p5_0}, - {0,0,&_16u1__p6_0}, - {&_16u1__p7_0,&_16u1__p7_1}, - {&_16u1__p8_0,&_16u1__p8_1}, - {&_16u1__p9_0,&_16u1__p9_1,&_16u1__p9_2} - } -}; -static const static_bookblock _resbook_16u_2={ - { - {0}, - {0,0,&_16u2_p1_0}, - {0,0,&_16u2_p2_0}, - {0,0,&_16u2_p3_0}, - {0,0,&_16u2_p4_0}, - {&_16u2_p5_0,&_16u2_p5_1}, - {&_16u2_p6_0,&_16u2_p6_1}, - {&_16u2_p7_0,&_16u2_p7_1}, - {&_16u2_p8_0,&_16u2_p8_1}, - {&_16u2_p9_0,&_16u2_p9_1,&_16u2_p9_2} - } -}; - -static const vorbis_residue_template _res_16u_0[]={ - {1,0,32, &_residue_44_low_un, - &_huff_book__16u0__single,&_huff_book__16u0__single, - &_resbook_16u_0,&_resbook_16u_0}, -}; -static const vorbis_residue_template _res_16u_1[]={ - {1,0,32, &_residue_44_mid_un, - &_huff_book__16u1__short,&_huff_book__16u1__short, - &_resbook_16u_1,&_resbook_16u_1}, - - {1,0,32, &_residue_44_mid_un, - &_huff_book__16u1__long,&_huff_book__16u1__long, - &_resbook_16u_1,&_resbook_16u_1} -}; -static const vorbis_residue_template _res_16u_2[]={ - {1,0,32, &_residue_44_hi_un, - &_huff_book__16u2__short,&_huff_book__16u2__short, - &_resbook_16u_2,&_resbook_16u_2}, - - {1,0,32, &_residue_44_hi_un, - &_huff_book__16u2__long,&_huff_book__16u2__long, - &_resbook_16u_2,&_resbook_16u_2} -}; - - -static const vorbis_mapping_template _mapres_template_16_uncoupled[3]={ - { _map_nominal_u, _res_16u_0 }, /* 0 */ - { _map_nominal_u, _res_16u_1 }, /* 1 */ - { _map_nominal_u, _res_16u_2 }, /* 2 */ -}; diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/residue_44.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/residue_44.h deleted file mode 100644 index 236c1834..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/residue_44.h +++ /dev/null @@ -1,292 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: toplevel residue templates for 32/44.1/48kHz - last mod: $Id: residue_44.h 16962 2010-03-11 07:30:34Z xiphmont $ - - ********************************************************************/ - -#include "vorbis/codec.h" -#include "backends.h" -#include "books/coupled/res_books_stereo.h" - -/***** residue backends *********************************************/ - -static const vorbis_info_residue0 _residue_44_low={ - 0,-1, -1, 9,-1,-1, - /* 0 1 2 3 4 5 6 7 */ - {0}, - {-1}, - { 0, 1, 2, 2, 4, 8, 16, 32}, - { 0, 0, 0,999, 4, 8, 16, 32}, -}; - -static const vorbis_info_residue0 _residue_44_mid={ - 0,-1, -1, 10,-1,-1, - /* 0 1 2 3 4 5 6 7 8 */ - {0}, - {-1}, - { 0, 1, 1, 2, 2, 4, 8, 16, 32}, - { 0, 0,999, 0,999, 4, 8, 16, 32}, -}; - -static const vorbis_info_residue0 _residue_44_high={ - 0,-1, -1, 10,-1,-1, - /* 0 1 2 3 4 5 6 7 8 */ - {0}, - {-1}, - { 0, 1, 2, 4, 8, 16, 32, 71,157}, - { 0, 1, 2, 3, 4, 8, 16, 71,157}, -}; - -static const static_bookblock _resbook_44s_n1={ - { - {0},{0,0,&_44cn1_s_p1_0},{0,0,&_44cn1_s_p2_0}, - {0,0,&_44cn1_s_p3_0},{0,0,&_44cn1_s_p4_0},{0,0,&_44cn1_s_p5_0}, - {&_44cn1_s_p6_0,&_44cn1_s_p6_1},{&_44cn1_s_p7_0,&_44cn1_s_p7_1}, - {&_44cn1_s_p8_0,&_44cn1_s_p8_1,&_44cn1_s_p8_2} - } -}; -static const static_bookblock _resbook_44sm_n1={ - { - {0},{0,0,&_44cn1_sm_p1_0},{0,0,&_44cn1_sm_p2_0}, - {0,0,&_44cn1_sm_p3_0},{0,0,&_44cn1_sm_p4_0},{0,0,&_44cn1_sm_p5_0}, - {&_44cn1_sm_p6_0,&_44cn1_sm_p6_1},{&_44cn1_sm_p7_0,&_44cn1_sm_p7_1}, - {&_44cn1_sm_p8_0,&_44cn1_sm_p8_1,&_44cn1_sm_p8_2} - } -}; - -static const static_bookblock _resbook_44s_0={ - { - {0},{0,0,&_44c0_s_p1_0},{0,0,&_44c0_s_p2_0}, - {0,0,&_44c0_s_p3_0},{0,0,&_44c0_s_p4_0},{0,0,&_44c0_s_p5_0}, - {&_44c0_s_p6_0,&_44c0_s_p6_1},{&_44c0_s_p7_0,&_44c0_s_p7_1}, - {&_44c0_s_p8_0,&_44c0_s_p8_1,&_44c0_s_p8_2} - } -}; -static const static_bookblock _resbook_44sm_0={ - { - {0},{0,0,&_44c0_sm_p1_0},{0,0,&_44c0_sm_p2_0}, - {0,0,&_44c0_sm_p3_0},{0,0,&_44c0_sm_p4_0},{0,0,&_44c0_sm_p5_0}, - {&_44c0_sm_p6_0,&_44c0_sm_p6_1},{&_44c0_sm_p7_0,&_44c0_sm_p7_1}, - {&_44c0_sm_p8_0,&_44c0_sm_p8_1,&_44c0_sm_p8_2} - } -}; - -static const static_bookblock _resbook_44s_1={ - { - {0},{0,0,&_44c1_s_p1_0},{0,0,&_44c1_s_p2_0}, - {0,0,&_44c1_s_p3_0},{0,0,&_44c1_s_p4_0},{0,0,&_44c1_s_p5_0}, - {&_44c1_s_p6_0,&_44c1_s_p6_1},{&_44c1_s_p7_0,&_44c1_s_p7_1}, - {&_44c1_s_p8_0,&_44c1_s_p8_1,&_44c1_s_p8_2} - } -}; -static const static_bookblock _resbook_44sm_1={ - { - {0},{0,0,&_44c1_sm_p1_0},{0,0,&_44c1_sm_p2_0}, - {0,0,&_44c1_sm_p3_0},{0,0,&_44c1_sm_p4_0},{0,0,&_44c1_sm_p5_0}, - {&_44c1_sm_p6_0,&_44c1_sm_p6_1},{&_44c1_sm_p7_0,&_44c1_sm_p7_1}, - {&_44c1_sm_p8_0,&_44c1_sm_p8_1,&_44c1_sm_p8_2} - } -}; - -static const static_bookblock _resbook_44s_2={ - { - {0},{0,0,&_44c2_s_p1_0},{0,0,&_44c2_s_p2_0},{0,0,&_44c2_s_p3_0}, - {0,0,&_44c2_s_p4_0},{0,0,&_44c2_s_p5_0},{0,0,&_44c2_s_p6_0}, - {&_44c2_s_p7_0,&_44c2_s_p7_1},{&_44c2_s_p8_0,&_44c2_s_p8_1}, - {&_44c2_s_p9_0,&_44c2_s_p9_1,&_44c2_s_p9_2} - } -}; -static const static_bookblock _resbook_44s_3={ - { - {0},{0,0,&_44c3_s_p1_0},{0,0,&_44c3_s_p2_0},{0,0,&_44c3_s_p3_0}, - {0,0,&_44c3_s_p4_0},{0,0,&_44c3_s_p5_0},{0,0,&_44c3_s_p6_0}, - {&_44c3_s_p7_0,&_44c3_s_p7_1},{&_44c3_s_p8_0,&_44c3_s_p8_1}, - {&_44c3_s_p9_0,&_44c3_s_p9_1,&_44c3_s_p9_2} - } -}; -static const static_bookblock _resbook_44s_4={ - { - {0},{0,0,&_44c4_s_p1_0},{0,0,&_44c4_s_p2_0},{0,0,&_44c4_s_p3_0}, - {0,0,&_44c4_s_p4_0},{0,0,&_44c4_s_p5_0},{0,0,&_44c4_s_p6_0}, - {&_44c4_s_p7_0,&_44c4_s_p7_1},{&_44c4_s_p8_0,&_44c4_s_p8_1}, - {&_44c4_s_p9_0,&_44c4_s_p9_1,&_44c4_s_p9_2} - } -}; -static const static_bookblock _resbook_44s_5={ - { - {0},{0,0,&_44c5_s_p1_0},{0,0,&_44c5_s_p2_0},{0,0,&_44c5_s_p3_0}, - {0,0,&_44c5_s_p4_0},{0,0,&_44c5_s_p5_0},{0,0,&_44c5_s_p6_0}, - {&_44c5_s_p7_0,&_44c5_s_p7_1},{&_44c5_s_p8_0,&_44c5_s_p8_1}, - {&_44c5_s_p9_0,&_44c5_s_p9_1,&_44c5_s_p9_2} - } -}; -static const static_bookblock _resbook_44s_6={ - { - {0},{0,0,&_44c6_s_p1_0},{0,0,&_44c6_s_p2_0},{0,0,&_44c6_s_p3_0}, - {0,0,&_44c6_s_p4_0}, - {&_44c6_s_p5_0,&_44c6_s_p5_1}, - {&_44c6_s_p6_0,&_44c6_s_p6_1}, - {&_44c6_s_p7_0,&_44c6_s_p7_1}, - {&_44c6_s_p8_0,&_44c6_s_p8_1}, - {&_44c6_s_p9_0,&_44c6_s_p9_1,&_44c6_s_p9_2} - } -}; -static const static_bookblock _resbook_44s_7={ - { - {0},{0,0,&_44c7_s_p1_0},{0,0,&_44c7_s_p2_0},{0,0,&_44c7_s_p3_0}, - {0,0,&_44c7_s_p4_0}, - {&_44c7_s_p5_0,&_44c7_s_p5_1}, - {&_44c7_s_p6_0,&_44c7_s_p6_1}, - {&_44c7_s_p7_0,&_44c7_s_p7_1}, - {&_44c7_s_p8_0,&_44c7_s_p8_1}, - {&_44c7_s_p9_0,&_44c7_s_p9_1,&_44c7_s_p9_2} - } -}; -static const static_bookblock _resbook_44s_8={ - { - {0},{0,0,&_44c8_s_p1_0},{0,0,&_44c8_s_p2_0},{0,0,&_44c8_s_p3_0}, - {0,0,&_44c8_s_p4_0}, - {&_44c8_s_p5_0,&_44c8_s_p5_1}, - {&_44c8_s_p6_0,&_44c8_s_p6_1}, - {&_44c8_s_p7_0,&_44c8_s_p7_1}, - {&_44c8_s_p8_0,&_44c8_s_p8_1}, - {&_44c8_s_p9_0,&_44c8_s_p9_1,&_44c8_s_p9_2} - } -}; -static const static_bookblock _resbook_44s_9={ - { - {0},{0,0,&_44c9_s_p1_0},{0,0,&_44c9_s_p2_0},{0,0,&_44c9_s_p3_0}, - {0,0,&_44c9_s_p4_0}, - {&_44c9_s_p5_0,&_44c9_s_p5_1}, - {&_44c9_s_p6_0,&_44c9_s_p6_1}, - {&_44c9_s_p7_0,&_44c9_s_p7_1}, - {&_44c9_s_p8_0,&_44c9_s_p8_1}, - {&_44c9_s_p9_0,&_44c9_s_p9_1,&_44c9_s_p9_2} - } -}; - -static const vorbis_residue_template _res_44s_n1[]={ - {2,0,32, &_residue_44_low, - &_huff_book__44cn1_s_short,&_huff_book__44cn1_sm_short, - &_resbook_44s_n1,&_resbook_44sm_n1}, - - {2,0,32, &_residue_44_low, - &_huff_book__44cn1_s_long,&_huff_book__44cn1_sm_long, - &_resbook_44s_n1,&_resbook_44sm_n1} -}; -static const vorbis_residue_template _res_44s_0[]={ - {2,0,16, &_residue_44_low, - &_huff_book__44c0_s_short,&_huff_book__44c0_sm_short, - &_resbook_44s_0,&_resbook_44sm_0}, - - {2,0,32, &_residue_44_low, - &_huff_book__44c0_s_long,&_huff_book__44c0_sm_long, - &_resbook_44s_0,&_resbook_44sm_0} -}; -static const vorbis_residue_template _res_44s_1[]={ - {2,0,16, &_residue_44_low, - &_huff_book__44c1_s_short,&_huff_book__44c1_sm_short, - &_resbook_44s_1,&_resbook_44sm_1}, - - {2,0,32, &_residue_44_low, - &_huff_book__44c1_s_long,&_huff_book__44c1_sm_long, - &_resbook_44s_1,&_resbook_44sm_1} -}; - -static const vorbis_residue_template _res_44s_2[]={ - {2,0,16, &_residue_44_mid, - &_huff_book__44c2_s_short,&_huff_book__44c2_s_short, - &_resbook_44s_2,&_resbook_44s_2}, - - {2,0,32, &_residue_44_mid, - &_huff_book__44c2_s_long,&_huff_book__44c2_s_long, - &_resbook_44s_2,&_resbook_44s_2} -}; -static const vorbis_residue_template _res_44s_3[]={ - {2,0,16, &_residue_44_mid, - &_huff_book__44c3_s_short,&_huff_book__44c3_s_short, - &_resbook_44s_3,&_resbook_44s_3}, - - {2,0,32, &_residue_44_mid, - &_huff_book__44c3_s_long,&_huff_book__44c3_s_long, - &_resbook_44s_3,&_resbook_44s_3} -}; -static const vorbis_residue_template _res_44s_4[]={ - {2,0,16, &_residue_44_mid, - &_huff_book__44c4_s_short,&_huff_book__44c4_s_short, - &_resbook_44s_4,&_resbook_44s_4}, - - {2,0,32, &_residue_44_mid, - &_huff_book__44c4_s_long,&_huff_book__44c4_s_long, - &_resbook_44s_4,&_resbook_44s_4} -}; -static const vorbis_residue_template _res_44s_5[]={ - {2,0,16, &_residue_44_mid, - &_huff_book__44c5_s_short,&_huff_book__44c5_s_short, - &_resbook_44s_5,&_resbook_44s_5}, - - {2,0,32, &_residue_44_mid, - &_huff_book__44c5_s_long,&_huff_book__44c5_s_long, - &_resbook_44s_5,&_resbook_44s_5} -}; -static const vorbis_residue_template _res_44s_6[]={ - {2,0,16, &_residue_44_high, - &_huff_book__44c6_s_short,&_huff_book__44c6_s_short, - &_resbook_44s_6,&_resbook_44s_6}, - - {2,0,32, &_residue_44_high, - &_huff_book__44c6_s_long,&_huff_book__44c6_s_long, - &_resbook_44s_6,&_resbook_44s_6} -}; -static const vorbis_residue_template _res_44s_7[]={ - {2,0,16, &_residue_44_high, - &_huff_book__44c7_s_short,&_huff_book__44c7_s_short, - &_resbook_44s_7,&_resbook_44s_7}, - - {2,0,32, &_residue_44_high, - &_huff_book__44c7_s_long,&_huff_book__44c7_s_long, - &_resbook_44s_7,&_resbook_44s_7} -}; -static const vorbis_residue_template _res_44s_8[]={ - {2,0,16, &_residue_44_high, - &_huff_book__44c8_s_short,&_huff_book__44c8_s_short, - &_resbook_44s_8,&_resbook_44s_8}, - - {2,0,32, &_residue_44_high, - &_huff_book__44c8_s_long,&_huff_book__44c8_s_long, - &_resbook_44s_8,&_resbook_44s_8} -}; -static const vorbis_residue_template _res_44s_9[]={ - {2,0,16, &_residue_44_high, - &_huff_book__44c9_s_short,&_huff_book__44c9_s_short, - &_resbook_44s_9,&_resbook_44s_9}, - - {2,0,32, &_residue_44_high, - &_huff_book__44c9_s_long,&_huff_book__44c9_s_long, - &_resbook_44s_9,&_resbook_44s_9} -}; - -static const vorbis_mapping_template _mapres_template_44_stereo[]={ - { _map_nominal, _res_44s_n1 }, /* -1 */ - { _map_nominal, _res_44s_0 }, /* 0 */ - { _map_nominal, _res_44s_1 }, /* 1 */ - { _map_nominal, _res_44s_2 }, /* 2 */ - { _map_nominal, _res_44s_3 }, /* 3 */ - { _map_nominal, _res_44s_4 }, /* 4 */ - { _map_nominal, _res_44s_5 }, /* 5 */ - { _map_nominal, _res_44s_6 }, /* 6 */ - { _map_nominal, _res_44s_7 }, /* 7 */ - { _map_nominal, _res_44s_8 }, /* 8 */ - { _map_nominal, _res_44s_9 }, /* 9 */ -}; diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/residue_44p51.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/residue_44p51.h deleted file mode 100644 index a52cc524..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/residue_44p51.h +++ /dev/null @@ -1,451 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2010 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: toplevel residue templates for 32/44.1/48kHz uncoupled - last mod: $Id: residue_44p51.h 19013 2013-11-12 04:04:50Z giles $ - - ********************************************************************/ - -#include "vorbis/codec.h" -#include "backends.h" - -#include "books/coupled/res_books_51.h" - -/***** residue backends *********************************************/ - -static const vorbis_info_residue0 _residue_44p_lo={ - 0,-1, -1, 7,-1,-1, - /* 0 1 2 3 4 5 6 7 8 */ - {0}, - {-1}, - { 0, 1, 2, 7, 17, 31}, - { 0, 0, 99, 7, 17, 31}, -}; - -static const vorbis_info_residue0 _residue_44p={ - 0,-1, -1, 8,-1,-1, - /* 0 1 2 3 4 5 6 7 8 */ - {0}, - {-1}, - { 0, 1, 1, 2, 7, 17, 31}, - { 0, 0, 99, 99, 7, 17, 31}, -}; - -static const vorbis_info_residue0 _residue_44p_hi={ - 0,-1, -1, 8,-1,-1, - /* 0 1 2 3 4 5 6 7 8 */ - {0}, - {-1}, - { 0, 1, 2, 4, 7, 17, 31}, - { 0, 1, 2, 4, 7, 17, 31}, -}; - -static const vorbis_info_residue0 _residue_44p_lfe={ - 0,-1, -1, 2,-1,-1, - /* 0 1 2 3 4 5 6 7 8 */ - {0}, - {-1}, - { 32}, - { -1} -}; - -static const static_bookblock _resbook_44p_n1={ - { - {0}, - {0,&_44pn1_p1_0}, - - {&_44pn1_p2_0,&_44pn1_p2_1,0}, - {&_44pn1_p3_0,&_44pn1_p3_1,0}, - {&_44pn1_p4_0,&_44pn1_p4_1,0}, - - {&_44pn1_p5_0,&_44pn1_p5_1,&_44pn1_p4_1}, - {&_44pn1_p6_0,&_44pn1_p6_1,&_44pn1_p6_2}, - } -}; - -static const static_bookblock _resbook_44p_0={ - { - {0}, - {0,&_44p0_p1_0}, - - {&_44p0_p2_0,&_44p0_p2_1,0}, - {&_44p0_p3_0,&_44p0_p3_1,0}, - {&_44p0_p4_0,&_44p0_p4_1,0}, - - {&_44p0_p5_0,&_44p0_p5_1,&_44p0_p4_1}, - {&_44p0_p6_0,&_44p0_p6_1,&_44p0_p6_2}, - } -}; - -static const static_bookblock _resbook_44p_1={ - { - {0}, - {0,&_44p1_p1_0}, - - {&_44p1_p2_0,&_44p1_p2_1,0}, - {&_44p1_p3_0,&_44p1_p3_1,0}, - {&_44p1_p4_0,&_44p1_p4_1,0}, - - {&_44p1_p5_0,&_44p1_p5_1,&_44p1_p4_1}, - {&_44p1_p6_0,&_44p1_p6_1,&_44p1_p6_2}, - } -}; - -static const static_bookblock _resbook_44p_2={ - { - {0}, - {0,0,&_44p2_p1_0}, - {0,&_44p2_p2_0,0}, - - {&_44p2_p3_0,&_44p2_p3_1,0}, - {&_44p2_p4_0,&_44p2_p4_1,0}, - {&_44p2_p5_0,&_44p2_p5_1,0}, - - {&_44p2_p6_0,&_44p2_p6_1,&_44p2_p5_1}, - {&_44p2_p7_0,&_44p2_p7_1,&_44p2_p7_2,&_44p2_p7_3} - } -}; -static const static_bookblock _resbook_44p_3={ - { - {0}, - {0,0,&_44p3_p1_0}, - {0,&_44p3_p2_0,0}, - - {&_44p3_p3_0,&_44p3_p3_1,0}, - {&_44p3_p4_0,&_44p3_p4_1,0}, - {&_44p3_p5_0,&_44p3_p5_1,0}, - - {&_44p3_p6_0,&_44p3_p6_1,&_44p3_p5_1}, - {&_44p3_p7_0,&_44p3_p7_1,&_44p3_p7_2,&_44p3_p7_3} - } -}; -static const static_bookblock _resbook_44p_4={ - { - {0}, - {0,0,&_44p4_p1_0}, - {0,&_44p4_p2_0,0}, - - {&_44p4_p3_0,&_44p4_p3_1,0}, - {&_44p4_p4_0,&_44p4_p4_1,0}, - {&_44p4_p5_0,&_44p4_p5_1,0}, - - {&_44p4_p6_0,&_44p4_p6_1,&_44p4_p5_1}, - {&_44p4_p7_0,&_44p4_p7_1,&_44p4_p7_2,&_44p4_p7_3} - } -}; -static const static_bookblock _resbook_44p_5={ - { - {0}, - {0,0,&_44p5_p1_0}, - {0,&_44p5_p2_0,0}, - - {&_44p5_p3_0,&_44p5_p3_1,0}, - {&_44p5_p4_0,&_44p5_p4_1,0}, - {&_44p5_p5_0,&_44p5_p5_1,0}, - - {&_44p5_p6_0,&_44p5_p6_1,&_44p5_p5_1}, - {&_44p5_p7_0,&_44p5_p7_1,&_44p5_p7_2,&_44p5_p7_3} - } -}; -static const static_bookblock _resbook_44p_6={ - { - {0}, - {0,0,&_44p6_p1_0}, - {0,&_44p6_p2_0,0}, - - {&_44p6_p3_0,&_44p6_p3_1,0}, - {&_44p6_p4_0,&_44p6_p4_1,0}, - {&_44p6_p5_0,&_44p6_p5_1,0}, - - {&_44p6_p6_0,&_44p6_p6_1,&_44p6_p5_1}, - {&_44p6_p7_0,&_44p6_p7_1,&_44p6_p7_2,&_44p6_p7_3} - } -}; -static const static_bookblock _resbook_44p_7={ - { - {0}, - {0,0,&_44p7_p1_0}, - {0,&_44p7_p2_0,0}, - - {&_44p7_p3_0,&_44p7_p3_1,0}, - {&_44p7_p4_0,&_44p7_p4_1,0}, - {&_44p7_p5_0,&_44p7_p5_1,0}, - - {&_44p7_p6_0,&_44p7_p6_1,&_44p7_p5_1}, - {&_44p7_p7_0,&_44p7_p7_1,&_44p7_p7_2,&_44p7_p7_3} - } -}; -static const static_bookblock _resbook_44p_8={ - { - {0}, - {0,0,&_44p8_p1_0}, - {0,&_44p8_p2_0,0}, - - {&_44p8_p3_0,&_44p8_p3_1,0}, - {&_44p8_p4_0,&_44p8_p4_1,0}, - {&_44p8_p5_0,&_44p8_p5_1,0}, - - {&_44p8_p6_0,&_44p8_p6_1,&_44p8_p5_1}, - {&_44p8_p7_0,&_44p8_p7_1,&_44p8_p7_2,&_44p8_p7_3} - } -}; -static const static_bookblock _resbook_44p_9={ - { - {0}, - {0,0,&_44p9_p1_0}, - {0,&_44p9_p2_0,0}, - - {&_44p9_p3_0,&_44p9_p3_1,0}, - {&_44p9_p4_0,&_44p9_p4_1,0}, - {&_44p9_p5_0,&_44p9_p5_1,0}, - - {&_44p9_p6_0,&_44p9_p6_1,&_44p9_p5_1}, - {&_44p9_p7_0,&_44p9_p7_1,&_44p9_p7_2,&_44p9_p7_3} - } -}; - -static const static_bookblock _resbook_44p_ln1={ - { - {&_44pn1_l0_0,&_44pn1_l0_1,0}, - {&_44pn1_l1_0,&_44pn1_p6_1,&_44pn1_p6_2}, - } -}; -static const static_bookblock _resbook_44p_l0={ - { - {&_44p0_l0_0,&_44p0_l0_1,0}, - {&_44p0_l1_0,&_44p0_p6_1,&_44p0_p6_2}, - } -}; -static const static_bookblock _resbook_44p_l1={ - { - {&_44p1_l0_0,&_44p1_l0_1,0}, - {&_44p1_l1_0,&_44p1_p6_1,&_44p1_p6_2}, - } -}; -static const static_bookblock _resbook_44p_l2={ - { - {&_44p2_l0_0,&_44p2_l0_1,0}, - {&_44p2_l1_0,&_44p2_p7_2,&_44p2_p7_3}, - } -}; -static const static_bookblock _resbook_44p_l3={ - { - {&_44p3_l0_0,&_44p3_l0_1,0}, - {&_44p3_l1_0,&_44p3_p7_2,&_44p3_p7_3}, - } -}; -static const static_bookblock _resbook_44p_l4={ - { - {&_44p4_l0_0,&_44p4_l0_1,0}, - {&_44p4_l1_0,&_44p4_p7_2,&_44p4_p7_3}, - } -}; -static const static_bookblock _resbook_44p_l5={ - { - {&_44p5_l0_0,&_44p5_l0_1,0}, - {&_44p5_l1_0,&_44p5_p7_2,&_44p5_p7_3}, - } -}; -static const static_bookblock _resbook_44p_l6={ - { - {&_44p6_l0_0,&_44p6_l0_1,0}, - {&_44p6_l1_0,&_44p6_p7_2,&_44p6_p7_3}, - } -}; -static const static_bookblock _resbook_44p_l7={ - { - {&_44p7_l0_0,&_44p7_l0_1,0}, - {&_44p7_l1_0,&_44p7_p7_2,&_44p7_p7_3}, - } -}; -static const static_bookblock _resbook_44p_l8={ - { - {&_44p8_l0_0,&_44p8_l0_1,0}, - {&_44p8_l1_0,&_44p8_p7_2,&_44p8_p7_3}, - } -}; -static const static_bookblock _resbook_44p_l9={ - { - {&_44p9_l0_0,&_44p9_l0_1,0}, - {&_44p9_l1_0,&_44p9_p7_2,&_44p9_p7_3}, - } -}; - - -static const vorbis_info_mapping0 _map_nominal_51[2]={ - {2, {0,0,0,0,0,1}, {0,2}, {0,2}, 4,{0,3,0,0},{2,4,1,3}}, - {2, {0,0,0,0,0,1}, {1,2}, {1,2}, 4,{0,3,0,0},{2,4,1,3}} -}; -static const vorbis_info_mapping0 _map_nominal_51u[2]={ - {2, {0,0,0,0,0,1}, {0,2}, {0,2}, 0,{0},{0}}, - {2, {0,0,0,0,0,1}, {1,2}, {1,2}, 0,{0},{0}} -}; - -static const vorbis_residue_template _res_44p51_n1[]={ - {2,0,30, &_residue_44p_lo, - &_huff_book__44pn1_short,&_huff_book__44pn1_short, - &_resbook_44p_n1,&_resbook_44p_n1}, - - {2,0,30, &_residue_44p_lo, - &_huff_book__44pn1_long,&_huff_book__44pn1_long, - &_resbook_44p_n1,&_resbook_44p_n1}, - - {1,2,6, &_residue_44p_lfe, - &_huff_book__44pn1_lfe,&_huff_book__44pn1_lfe, - &_resbook_44p_ln1,&_resbook_44p_ln1} -}; -static const vorbis_residue_template _res_44p51_0[]={ - {2,0,15, &_residue_44p_lo, - &_huff_book__44p0_short,&_huff_book__44p0_short, - &_resbook_44p_0,&_resbook_44p_0}, - - {2,0,30, &_residue_44p_lo, - &_huff_book__44p0_long,&_huff_book__44p0_long, - &_resbook_44p_0,&_resbook_44p_0}, - - {1,2,6, &_residue_44p_lfe, - &_huff_book__44p0_lfe,&_huff_book__44p0_lfe, - &_resbook_44p_l0,&_resbook_44p_l0} -}; -static const vorbis_residue_template _res_44p51_1[]={ - {2,0,15, &_residue_44p_lo, - &_huff_book__44p1_short,&_huff_book__44p1_short, - &_resbook_44p_1,&_resbook_44p_1}, - - {2,0,30, &_residue_44p_lo, - &_huff_book__44p1_long,&_huff_book__44p1_long, - &_resbook_44p_1,&_resbook_44p_1}, - - {1,2,6, &_residue_44p_lfe, - &_huff_book__44p1_lfe,&_huff_book__44p1_lfe, - &_resbook_44p_l1,&_resbook_44p_l1} -}; -static const vorbis_residue_template _res_44p51_2[]={ - {2,0,15, &_residue_44p, - &_huff_book__44p2_short,&_huff_book__44p2_short, - &_resbook_44p_2,&_resbook_44p_2}, - - {2,0,30, &_residue_44p, - &_huff_book__44p2_long,&_huff_book__44p2_long, - &_resbook_44p_2,&_resbook_44p_2}, - - {1,2,6, &_residue_44p_lfe, - &_huff_book__44p2_lfe,&_huff_book__44p2_lfe, - &_resbook_44p_l2,&_resbook_44p_l2} -}; -static const vorbis_residue_template _res_44p51_3[]={ - {2,0,15, &_residue_44p, - &_huff_book__44p3_short,&_huff_book__44p3_short, - &_resbook_44p_3,&_resbook_44p_3}, - - {2,0,30, &_residue_44p, - &_huff_book__44p3_long,&_huff_book__44p3_long, - &_resbook_44p_3,&_resbook_44p_3}, - - {1,2,6, &_residue_44p_lfe, - &_huff_book__44p3_lfe,&_huff_book__44p3_lfe, - &_resbook_44p_l3,&_resbook_44p_l3} -}; -static const vorbis_residue_template _res_44p51_4[]={ - {2,0,15, &_residue_44p, - &_huff_book__44p4_short,&_huff_book__44p4_short, - &_resbook_44p_4,&_resbook_44p_4}, - - {2,0,30, &_residue_44p, - &_huff_book__44p4_long,&_huff_book__44p4_long, - &_resbook_44p_4,&_resbook_44p_4}, - - {1,2,6, &_residue_44p_lfe, - &_huff_book__44p4_lfe,&_huff_book__44p4_lfe, - &_resbook_44p_l4,&_resbook_44p_l4} -}; -static const vorbis_residue_template _res_44p51_5[]={ - {2,0,15, &_residue_44p_hi, - &_huff_book__44p5_short,&_huff_book__44p5_short, - &_resbook_44p_5,&_resbook_44p_5}, - - {2,0,30, &_residue_44p_hi, - &_huff_book__44p5_long,&_huff_book__44p5_long, - &_resbook_44p_5,&_resbook_44p_5}, - - {1,2,6, &_residue_44p_lfe, - &_huff_book__44p5_lfe,&_huff_book__44p5_lfe, - &_resbook_44p_l5,&_resbook_44p_l5} -}; -static const vorbis_residue_template _res_44p51_6[]={ - {2,0,15, &_residue_44p_hi, - &_huff_book__44p6_short,&_huff_book__44p6_short, - &_resbook_44p_6,&_resbook_44p_6}, - - {2,0,30, &_residue_44p_hi, - &_huff_book__44p6_long,&_huff_book__44p6_long, - &_resbook_44p_6,&_resbook_44p_6}, - - {1,2,6, &_residue_44p_lfe, - &_huff_book__44p6_lfe,&_huff_book__44p6_lfe, - &_resbook_44p_l6,&_resbook_44p_l6} -}; - - -static const vorbis_residue_template _res_44p51_7[]={ - {2,0,15, &_residue_44p_hi, - &_huff_book__44p7_short,&_huff_book__44p7_short, - &_resbook_44p_7,&_resbook_44p_7}, - - {2,0,30, &_residue_44p_hi, - &_huff_book__44p7_long,&_huff_book__44p7_long, - &_resbook_44p_7,&_resbook_44p_7}, - - {1,2,6, &_residue_44p_lfe, - &_huff_book__44p6_lfe,&_huff_book__44p6_lfe, - &_resbook_44p_l6,&_resbook_44p_l6} -}; -static const vorbis_residue_template _res_44p51_8[]={ - {2,0,15, &_residue_44p_hi, - &_huff_book__44p8_short,&_huff_book__44p8_short, - &_resbook_44p_8,&_resbook_44p_8}, - - {2,0,30, &_residue_44p_hi, - &_huff_book__44p8_long,&_huff_book__44p8_long, - &_resbook_44p_8,&_resbook_44p_8}, - - {1,2,6, &_residue_44p_lfe, - &_huff_book__44p6_lfe,&_huff_book__44p6_lfe, - &_resbook_44p_l6,&_resbook_44p_l6} -}; -static const vorbis_residue_template _res_44p51_9[]={ - {2,0,15, &_residue_44p_hi, - &_huff_book__44p9_short,&_huff_book__44p9_short, - &_resbook_44p_9,&_resbook_44p_9}, - - {2,0,30, &_residue_44p_hi, - &_huff_book__44p9_long,&_huff_book__44p9_long, - &_resbook_44p_9,&_resbook_44p_9}, - - {1,2,6, &_residue_44p_lfe, - &_huff_book__44p6_lfe,&_huff_book__44p6_lfe, - &_resbook_44p_l6,&_resbook_44p_l6} -}; - -static const vorbis_mapping_template _mapres_template_44_51[]={ - { _map_nominal_51, _res_44p51_n1 }, /* -1 */ - { _map_nominal_51, _res_44p51_0 }, /* 0 */ - { _map_nominal_51, _res_44p51_1 }, /* 1 */ - { _map_nominal_51, _res_44p51_2 }, /* 2 */ - { _map_nominal_51, _res_44p51_3 }, /* 3 */ - { _map_nominal_51, _res_44p51_4 }, /* 4 */ - { _map_nominal_51u, _res_44p51_5 }, /* 5 */ - { _map_nominal_51u, _res_44p51_6 }, /* 6 */ - { _map_nominal_51u, _res_44p51_7 }, /* 7 */ - { _map_nominal_51u, _res_44p51_8 }, /* 8 */ - { _map_nominal_51u, _res_44p51_9 }, /* 9 */ -}; diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/residue_44u.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/residue_44u.h deleted file mode 100644 index 92c4a09c..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/residue_44u.h +++ /dev/null @@ -1,318 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: toplevel residue templates for 32/44.1/48kHz uncoupled - last mod: $Id: residue_44u.h 16962 2010-03-11 07:30:34Z xiphmont $ - - ********************************************************************/ - -#include "vorbis/codec.h" -#include "backends.h" -#include "books/uncoupled/res_books_uncoupled.h" - -/***** residue backends *********************************************/ - - -static const vorbis_info_residue0 _residue_44_low_un={ - 0,-1, -1, 8,-1,-1, - {0}, - {-1}, - { 0, 1, 1, 2, 2, 4, 28}, - { -1, 25, -1, 45, -1, -1, -1} -}; - -static const vorbis_info_residue0 _residue_44_mid_un={ - 0,-1, -1, 10,-1,-1, - /* 0 1 2 3 4 5 6 7 8 9 */ - {0}, - {-1}, - { 0, 1, 1, 2, 2, 4, 4, 16, 60}, - { -1, 30, -1, 50, -1, 80, -1, -1, -1} -}; - -static const vorbis_info_residue0 _residue_44_hi_un={ - 0,-1, -1, 10,-1,-1, - /* 0 1 2 3 4 5 6 7 8 9 */ - {0}, - {-1}, - { 0, 1, 2, 4, 8, 16, 32, 71,157}, - { -1, -1, -1, -1, -1, -1, -1, -1, -1} -}; - -/* mapping conventions: - only one submap (this would change for efficient 5.1 support for example)*/ -/* Four psychoacoustic profiles are used, one for each blocktype */ -static const vorbis_info_mapping0 _map_nominal_u[2]={ - {1, {0,0,0,0,0,0}, {0}, {0}, 0,{0},{0}}, - {1, {0,0,0,0,0,0}, {1}, {1}, 0,{0},{0}} -}; - -static const static_bookblock _resbook_44u_n1={ - { - {0}, - {0,0,&_44un1__p1_0}, - {0,0,&_44un1__p2_0}, - {0,0,&_44un1__p3_0}, - {0,0,&_44un1__p4_0}, - {0,0,&_44un1__p5_0}, - {&_44un1__p6_0,&_44un1__p6_1}, - {&_44un1__p7_0,&_44un1__p7_1,&_44un1__p7_2} - } -}; -static const static_bookblock _resbook_44u_0={ - { - {0}, - {0,0,&_44u0__p1_0}, - {0,0,&_44u0__p2_0}, - {0,0,&_44u0__p3_0}, - {0,0,&_44u0__p4_0}, - {0,0,&_44u0__p5_0}, - {&_44u0__p6_0,&_44u0__p6_1}, - {&_44u0__p7_0,&_44u0__p7_1,&_44u0__p7_2} - } -}; -static const static_bookblock _resbook_44u_1={ - { - {0}, - {0,0,&_44u1__p1_0}, - {0,0,&_44u1__p2_0}, - {0,0,&_44u1__p3_0}, - {0,0,&_44u1__p4_0}, - {0,0,&_44u1__p5_0}, - {&_44u1__p6_0,&_44u1__p6_1}, - {&_44u1__p7_0,&_44u1__p7_1,&_44u1__p7_2} - } -}; -static const static_bookblock _resbook_44u_2={ - { - {0}, - {0,0,&_44u2__p1_0}, - {0,0,&_44u2__p2_0}, - {0,0,&_44u2__p3_0}, - {0,0,&_44u2__p4_0}, - {0,0,&_44u2__p5_0}, - {&_44u2__p6_0,&_44u2__p6_1}, - {&_44u2__p7_0,&_44u2__p7_1,&_44u2__p7_2} - } -}; -static const static_bookblock _resbook_44u_3={ - { - {0}, - {0,0,&_44u3__p1_0}, - {0,0,&_44u3__p2_0}, - {0,0,&_44u3__p3_0}, - {0,0,&_44u3__p4_0}, - {0,0,&_44u3__p5_0}, - {&_44u3__p6_0,&_44u3__p6_1}, - {&_44u3__p7_0,&_44u3__p7_1,&_44u3__p7_2} - } -}; -static const static_bookblock _resbook_44u_4={ - { - {0}, - {0,0,&_44u4__p1_0}, - {0,0,&_44u4__p2_0}, - {0,0,&_44u4__p3_0}, - {0,0,&_44u4__p4_0}, - {0,0,&_44u4__p5_0}, - {&_44u4__p6_0,&_44u4__p6_1}, - {&_44u4__p7_0,&_44u4__p7_1,&_44u4__p7_2} - } -}; -static const static_bookblock _resbook_44u_5={ - { - {0}, - {0,0,&_44u5__p1_0}, - {0,0,&_44u5__p2_0}, - {0,0,&_44u5__p3_0}, - {0,0,&_44u5__p4_0}, - {0,0,&_44u5__p5_0}, - {0,0,&_44u5__p6_0}, - {&_44u5__p7_0,&_44u5__p7_1}, - {&_44u5__p8_0,&_44u5__p8_1}, - {&_44u5__p9_0,&_44u5__p9_1,&_44u5__p9_2} - } -}; -static const static_bookblock _resbook_44u_6={ - { - {0}, - {0,0,&_44u6__p1_0}, - {0,0,&_44u6__p2_0}, - {0,0,&_44u6__p3_0}, - {0,0,&_44u6__p4_0}, - {0,0,&_44u6__p5_0}, - {0,0,&_44u6__p6_0}, - {&_44u6__p7_0,&_44u6__p7_1}, - {&_44u6__p8_0,&_44u6__p8_1}, - {&_44u6__p9_0,&_44u6__p9_1,&_44u6__p9_2} - } -}; -static const static_bookblock _resbook_44u_7={ - { - {0}, - {0,0,&_44u7__p1_0}, - {0,0,&_44u7__p2_0}, - {0,0,&_44u7__p3_0}, - {0,0,&_44u7__p4_0}, - {0,0,&_44u7__p5_0}, - {0,0,&_44u7__p6_0}, - {&_44u7__p7_0,&_44u7__p7_1}, - {&_44u7__p8_0,&_44u7__p8_1}, - {&_44u7__p9_0,&_44u7__p9_1,&_44u7__p9_2} - } -}; -static const static_bookblock _resbook_44u_8={ - { - {0}, - {0,0,&_44u8_p1_0}, - {0,0,&_44u8_p2_0}, - {0,0,&_44u8_p3_0}, - {0,0,&_44u8_p4_0}, - {&_44u8_p5_0,&_44u8_p5_1}, - {&_44u8_p6_0,&_44u8_p6_1}, - {&_44u8_p7_0,&_44u8_p7_1}, - {&_44u8_p8_0,&_44u8_p8_1}, - {&_44u8_p9_0,&_44u8_p9_1,&_44u8_p9_2} - } -}; -static const static_bookblock _resbook_44u_9={ - { - {0}, - {0,0,&_44u9_p1_0}, - {0,0,&_44u9_p2_0}, - {0,0,&_44u9_p3_0}, - {0,0,&_44u9_p4_0}, - {&_44u9_p5_0,&_44u9_p5_1}, - {&_44u9_p6_0,&_44u9_p6_1}, - {&_44u9_p7_0,&_44u9_p7_1}, - {&_44u9_p8_0,&_44u9_p8_1}, - {&_44u9_p9_0,&_44u9_p9_1,&_44u9_p9_2} - } -}; - -static const vorbis_residue_template _res_44u_n1[]={ - {1,0,32, &_residue_44_low_un, - &_huff_book__44un1__short,&_huff_book__44un1__short, - &_resbook_44u_n1,&_resbook_44u_n1}, - - {1,0,32, &_residue_44_low_un, - &_huff_book__44un1__long,&_huff_book__44un1__long, - &_resbook_44u_n1,&_resbook_44u_n1} -}; -static const vorbis_residue_template _res_44u_0[]={ - {1,0,16, &_residue_44_low_un, - &_huff_book__44u0__short,&_huff_book__44u0__short, - &_resbook_44u_0,&_resbook_44u_0}, - - {1,0,32, &_residue_44_low_un, - &_huff_book__44u0__long,&_huff_book__44u0__long, - &_resbook_44u_0,&_resbook_44u_0} -}; -static const vorbis_residue_template _res_44u_1[]={ - {1,0,16, &_residue_44_low_un, - &_huff_book__44u1__short,&_huff_book__44u1__short, - &_resbook_44u_1,&_resbook_44u_1}, - - {1,0,32, &_residue_44_low_un, - &_huff_book__44u1__long,&_huff_book__44u1__long, - &_resbook_44u_1,&_resbook_44u_1} -}; -static const vorbis_residue_template _res_44u_2[]={ - {1,0,16, &_residue_44_low_un, - &_huff_book__44u2__short,&_huff_book__44u2__short, - &_resbook_44u_2,&_resbook_44u_2}, - - {1,0,32, &_residue_44_low_un, - &_huff_book__44u2__long,&_huff_book__44u2__long, - &_resbook_44u_2,&_resbook_44u_2} -}; -static const vorbis_residue_template _res_44u_3[]={ - {1,0,16, &_residue_44_low_un, - &_huff_book__44u3__short,&_huff_book__44u3__short, - &_resbook_44u_3,&_resbook_44u_3}, - - {1,0,32, &_residue_44_low_un, - &_huff_book__44u3__long,&_huff_book__44u3__long, - &_resbook_44u_3,&_resbook_44u_3} -}; -static const vorbis_residue_template _res_44u_4[]={ - {1,0,16, &_residue_44_low_un, - &_huff_book__44u4__short,&_huff_book__44u4__short, - &_resbook_44u_4,&_resbook_44u_4}, - - {1,0,32, &_residue_44_low_un, - &_huff_book__44u4__long,&_huff_book__44u4__long, - &_resbook_44u_4,&_resbook_44u_4} -}; - -static const vorbis_residue_template _res_44u_5[]={ - {1,0,16, &_residue_44_mid_un, - &_huff_book__44u5__short,&_huff_book__44u5__short, - &_resbook_44u_5,&_resbook_44u_5}, - - {1,0,32, &_residue_44_mid_un, - &_huff_book__44u5__long,&_huff_book__44u5__long, - &_resbook_44u_5,&_resbook_44u_5} -}; - -static const vorbis_residue_template _res_44u_6[]={ - {1,0,16, &_residue_44_mid_un, - &_huff_book__44u6__short,&_huff_book__44u6__short, - &_resbook_44u_6,&_resbook_44u_6}, - - {1,0,32, &_residue_44_mid_un, - &_huff_book__44u6__long,&_huff_book__44u6__long, - &_resbook_44u_6,&_resbook_44u_6} -}; - -static const vorbis_residue_template _res_44u_7[]={ - {1,0,16, &_residue_44_mid_un, - &_huff_book__44u7__short,&_huff_book__44u7__short, - &_resbook_44u_7,&_resbook_44u_7}, - - {1,0,32, &_residue_44_mid_un, - &_huff_book__44u7__long,&_huff_book__44u7__long, - &_resbook_44u_7,&_resbook_44u_7} -}; - -static const vorbis_residue_template _res_44u_8[]={ - {1,0,16, &_residue_44_hi_un, - &_huff_book__44u8__short,&_huff_book__44u8__short, - &_resbook_44u_8,&_resbook_44u_8}, - - {1,0,32, &_residue_44_hi_un, - &_huff_book__44u8__long,&_huff_book__44u8__long, - &_resbook_44u_8,&_resbook_44u_8} -}; -static const vorbis_residue_template _res_44u_9[]={ - {1,0,16, &_residue_44_hi_un, - &_huff_book__44u9__short,&_huff_book__44u9__short, - &_resbook_44u_9,&_resbook_44u_9}, - - {1,0,32, &_residue_44_hi_un, - &_huff_book__44u9__long,&_huff_book__44u9__long, - &_resbook_44u_9,&_resbook_44u_9} -}; - -static const vorbis_mapping_template _mapres_template_44_uncoupled[]={ - { _map_nominal_u, _res_44u_n1 }, /* -1 */ - { _map_nominal_u, _res_44u_0 }, /* 0 */ - { _map_nominal_u, _res_44u_1 }, /* 1 */ - { _map_nominal_u, _res_44u_2 }, /* 2 */ - { _map_nominal_u, _res_44u_3 }, /* 3 */ - { _map_nominal_u, _res_44u_4 }, /* 4 */ - { _map_nominal_u, _res_44u_5 }, /* 5 */ - { _map_nominal_u, _res_44u_6 }, /* 6 */ - { _map_nominal_u, _res_44u_7 }, /* 7 */ - { _map_nominal_u, _res_44u_8 }, /* 8 */ - { _map_nominal_u, _res_44u_9 }, /* 9 */ -}; diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/residue_8.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/residue_8.h deleted file mode 100644 index 94c6d84c..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/residue_8.h +++ /dev/null @@ -1,109 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: toplevel residue templates 8/11kHz - last mod: $Id: residue_8.h 16962 2010-03-11 07:30:34Z xiphmont $ - - ********************************************************************/ - -#include "vorbis/codec.h" -#include "backends.h" - -/***** residue backends *********************************************/ - -static const static_bookblock _resbook_8s_0={ - { - {0}, - {0,0,&_8c0_s_p1_0}, - {0}, - {0,0,&_8c0_s_p3_0}, - {0,0,&_8c0_s_p4_0}, - {0,0,&_8c0_s_p5_0}, - {0,0,&_8c0_s_p6_0}, - {&_8c0_s_p7_0,&_8c0_s_p7_1}, - {&_8c0_s_p8_0,&_8c0_s_p8_1}, - {&_8c0_s_p9_0,&_8c0_s_p9_1,&_8c0_s_p9_2} - } -}; -static const static_bookblock _resbook_8s_1={ - { - {0}, - {0,0,&_8c1_s_p1_0}, - {0}, - {0,0,&_8c1_s_p3_0}, - {0,0,&_8c1_s_p4_0}, - {0,0,&_8c1_s_p5_0}, - {0,0,&_8c1_s_p6_0}, - {&_8c1_s_p7_0,&_8c1_s_p7_1}, - {&_8c1_s_p8_0,&_8c1_s_p8_1}, - {&_8c1_s_p9_0,&_8c1_s_p9_1,&_8c1_s_p9_2} - } -}; - -static const vorbis_residue_template _res_8s_0[]={ - {2,0,32, &_residue_44_mid, - &_huff_book__8c0_s_single,&_huff_book__8c0_s_single, - &_resbook_8s_0,&_resbook_8s_0}, -}; -static const vorbis_residue_template _res_8s_1[]={ - {2,0,32, &_residue_44_mid, - &_huff_book__8c1_s_single,&_huff_book__8c1_s_single, - &_resbook_8s_1,&_resbook_8s_1}, -}; - -static const vorbis_mapping_template _mapres_template_8_stereo[2]={ - { _map_nominal, _res_8s_0 }, /* 0 */ - { _map_nominal, _res_8s_1 }, /* 1 */ -}; - -static const static_bookblock _resbook_8u_0={ - { - {0}, - {0,0,&_8u0__p1_0}, - {0,0,&_8u0__p2_0}, - {0,0,&_8u0__p3_0}, - {0,0,&_8u0__p4_0}, - {0,0,&_8u0__p5_0}, - {&_8u0__p6_0,&_8u0__p6_1}, - {&_8u0__p7_0,&_8u0__p7_1,&_8u0__p7_2} - } -}; -static const static_bookblock _resbook_8u_1={ - { - {0}, - {0,0,&_8u1__p1_0}, - {0,0,&_8u1__p2_0}, - {0,0,&_8u1__p3_0}, - {0,0,&_8u1__p4_0}, - {0,0,&_8u1__p5_0}, - {0,0,&_8u1__p6_0}, - {&_8u1__p7_0,&_8u1__p7_1}, - {&_8u1__p8_0,&_8u1__p8_1}, - {&_8u1__p9_0,&_8u1__p9_1,&_8u1__p9_2} - } -}; - -static const vorbis_residue_template _res_8u_0[]={ - {1,0,32, &_residue_44_low_un, - &_huff_book__8u0__single,&_huff_book__8u0__single, - &_resbook_8u_0,&_resbook_8u_0}, -}; -static const vorbis_residue_template _res_8u_1[]={ - {1,0,32, &_residue_44_mid_un, - &_huff_book__8u1__single,&_huff_book__8u1__single, - &_resbook_8u_1,&_resbook_8u_1}, -}; - -static const vorbis_mapping_template _mapres_template_8_uncoupled[2]={ - { _map_nominal_u, _res_8u_0 }, /* 0 */ - { _map_nominal_u, _res_8u_1 }, /* 1 */ -}; diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_11.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_11.h deleted file mode 100644 index 4c2d619c..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_11.h +++ /dev/null @@ -1,143 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: 11kHz settings - last mod: $Id: setup_11.h 16894 2010-02-12 20:32:12Z xiphmont $ - - ********************************************************************/ - -#include "psych_11.h" - -static const int blocksize_11[2]={ - 512,512 -}; - -static const int _floor_mapping_11a[]={ - 6,6 -}; -static const int *_floor_mapping_11[]={ - _floor_mapping_11a -}; - -static const double rate_mapping_11[3]={ - 8000.,13000.,44000., -}; - -static const double rate_mapping_11_uncoupled[3]={ - 12000.,20000.,50000., -}; - -static const double quality_mapping_11[3]={ - -.1,.0,1. -}; - -static const ve_setup_data_template ve_setup_11_stereo={ - 2, - rate_mapping_11, - quality_mapping_11, - 2, - 9000, - 15000, - - blocksize_11, - blocksize_11, - - _psy_tone_masteratt_11, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_11, - NULL, - _vp_tonemask_adj_11, - - _psy_noiseguards_8, - _psy_noisebias_11, - _psy_noisebias_11, - NULL, - NULL, - _psy_noise_suppress, - - _psy_compand_8, - _psy_compand_8_mapping, - NULL, - - {_noise_start_8,_noise_start_8}, - {_noise_part_8,_noise_part_8}, - _noise_thresh_11, - - _psy_ath_floater_8, - _psy_ath_abs_8, - - _psy_lowpass_11, - - _psy_global_44, - _global_mapping_8, - _psy_stereo_modes_8, - - _floor_books, - _floor, - 1, - _floor_mapping_11, - - _mapres_template_8_stereo -}; - -static const ve_setup_data_template ve_setup_11_uncoupled={ - 2, - rate_mapping_11_uncoupled, - quality_mapping_11, - -1, - 9000, - 15000, - - blocksize_11, - blocksize_11, - - _psy_tone_masteratt_11, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_11, - NULL, - _vp_tonemask_adj_11, - - _psy_noiseguards_8, - _psy_noisebias_11, - _psy_noisebias_11, - NULL, - NULL, - _psy_noise_suppress, - - _psy_compand_8, - _psy_compand_8_mapping, - NULL, - - {_noise_start_8,_noise_start_8}, - {_noise_part_8,_noise_part_8}, - _noise_thresh_11, - - _psy_ath_floater_8, - _psy_ath_abs_8, - - _psy_lowpass_11, - - _psy_global_44, - _global_mapping_8, - _psy_stereo_modes_8, - - _floor_books, - _floor, - 1, - _floor_mapping_11, - - _mapres_template_8_uncoupled -}; diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_16.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_16.h deleted file mode 100644 index 336007f9..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_16.h +++ /dev/null @@ -1,153 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: 16kHz settings - last mod: $Id: setup_16.h 16894 2010-02-12 20:32:12Z xiphmont $ - - ********************************************************************/ - -#include "psych_16.h" -#include "residue_16.h" - -static const int blocksize_16_short[3]={ - 1024,512,512 -}; -static const int blocksize_16_long[3]={ - 1024,1024,1024 -}; - -static const int _floor_mapping_16a[]={ - 9,3,3 -}; -static const int _floor_mapping_16b[]={ - 9,9,9 -}; -static const int *_floor_mapping_16[]={ - _floor_mapping_16a, - _floor_mapping_16b -}; - -static const double rate_mapping_16[4]={ - 12000.,20000.,44000.,86000. -}; - -static const double rate_mapping_16_uncoupled[4]={ - 16000.,28000.,64000.,100000. -}; - -static const double _global_mapping_16[4]={ 1., 2., 3., 4. }; - -static const double quality_mapping_16[4]={ -.1,.05,.5,1. }; - -static const double _psy_compand_16_mapping[4]={ 0., .8, 1., 1.}; - -static const ve_setup_data_template ve_setup_16_stereo={ - 3, - rate_mapping_16, - quality_mapping_16, - 2, - 15000, - 19000, - - blocksize_16_short, - blocksize_16_long, - - _psy_tone_masteratt_16, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_16, - _vp_tonemask_adj_16, - _vp_tonemask_adj_16, - - _psy_noiseguards_16, - _psy_noisebias_16_impulse, - _psy_noisebias_16_short, - _psy_noisebias_16_short, - _psy_noisebias_16, - _psy_noise_suppress, - - _psy_compand_8, - _psy_compand_16_mapping, - _psy_compand_16_mapping, - - {_noise_start_16,_noise_start_16}, - { _noise_part_16, _noise_part_16}, - _noise_thresh_16, - - _psy_ath_floater_16, - _psy_ath_abs_16, - - _psy_lowpass_16, - - _psy_global_44, - _global_mapping_16, - _psy_stereo_modes_16, - - _floor_books, - _floor, - 2, - _floor_mapping_16, - - _mapres_template_16_stereo -}; - -static const ve_setup_data_template ve_setup_16_uncoupled={ - 3, - rate_mapping_16_uncoupled, - quality_mapping_16, - -1, - 15000, - 19000, - - blocksize_16_short, - blocksize_16_long, - - _psy_tone_masteratt_16, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_16, - _vp_tonemask_adj_16, - _vp_tonemask_adj_16, - - _psy_noiseguards_16, - _psy_noisebias_16_impulse, - _psy_noisebias_16_short, - _psy_noisebias_16_short, - _psy_noisebias_16, - _psy_noise_suppress, - - _psy_compand_8, - _psy_compand_16_mapping, - _psy_compand_16_mapping, - - {_noise_start_16,_noise_start_16}, - { _noise_part_16, _noise_part_16}, - _noise_thresh_16, - - _psy_ath_floater_16, - _psy_ath_abs_16, - - _psy_lowpass_16, - - _psy_global_44, - _global_mapping_16, - _psy_stereo_modes_16, - - _floor_books, - _floor, - 2, - _floor_mapping_16, - - _mapres_template_16_uncoupled -}; diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_22.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_22.h deleted file mode 100644 index 4fd5e571..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_22.h +++ /dev/null @@ -1,128 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: 22kHz settings - last mod: $Id: setup_22.h 17026 2010-03-25 05:00:27Z xiphmont $ - - ********************************************************************/ - -static const double rate_mapping_22[4]={ - 15000.,20000.,44000.,86000. -}; - -static const double rate_mapping_22_uncoupled[4]={ - 16000.,28000.,50000.,90000. -}; - -static const double _psy_lowpass_22[4]={9.5,11.,30.,99.}; - -static const ve_setup_data_template ve_setup_22_stereo={ - 3, - rate_mapping_22, - quality_mapping_16, - 2, - 19000, - 26000, - - blocksize_16_short, - blocksize_16_long, - - _psy_tone_masteratt_16, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_16, - _vp_tonemask_adj_16, - _vp_tonemask_adj_16, - - _psy_noiseguards_16, - _psy_noisebias_16_impulse, - _psy_noisebias_16_short, - _psy_noisebias_16_short, - _psy_noisebias_16, - _psy_noise_suppress, - - _psy_compand_8, - _psy_compand_16_mapping, - _psy_compand_16_mapping, - - {_noise_start_16,_noise_start_16}, - { _noise_part_16, _noise_part_16}, - _noise_thresh_16, - - _psy_ath_floater_16, - _psy_ath_abs_16, - - _psy_lowpass_22, - - _psy_global_44, - _global_mapping_16, - _psy_stereo_modes_16, - - _floor_books, - _floor, - 2, - _floor_mapping_16, - - _mapres_template_16_stereo -}; - -static const ve_setup_data_template ve_setup_22_uncoupled={ - 3, - rate_mapping_22_uncoupled, - quality_mapping_16, - -1, - 19000, - 26000, - - blocksize_16_short, - blocksize_16_long, - - _psy_tone_masteratt_16, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_16, - _vp_tonemask_adj_16, - _vp_tonemask_adj_16, - - _psy_noiseguards_16, - _psy_noisebias_16_impulse, - _psy_noisebias_16_short, - _psy_noisebias_16_short, - _psy_noisebias_16, - _psy_noise_suppress, - - _psy_compand_8, - _psy_compand_16_mapping, - _psy_compand_16_mapping, - - {_noise_start_16,_noise_start_16}, - { _noise_part_16, _noise_part_16}, - _noise_thresh_16, - - _psy_ath_floater_16, - _psy_ath_abs_16, - - _psy_lowpass_22, - - _psy_global_44, - _global_mapping_16, - _psy_stereo_modes_16, - - _floor_books, - _floor, - 2, - _floor_mapping_16, - - _mapres_template_16_uncoupled -}; diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_32.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_32.h deleted file mode 100644 index 2275ac96..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_32.h +++ /dev/null @@ -1,132 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: toplevel settings for 32kHz - last mod: $Id: setup_32.h 16894 2010-02-12 20:32:12Z xiphmont $ - - ********************************************************************/ - -static const double rate_mapping_32[12]={ - 18000.,28000.,35000.,45000.,56000.,60000., - 75000.,90000.,100000.,115000.,150000.,190000., -}; - -static const double rate_mapping_32_un[12]={ - 30000.,42000.,52000.,64000.,72000.,78000., - 86000.,92000.,110000.,120000.,140000.,190000., -}; - -static const double _psy_lowpass_32[12]={ - 12.3,13.,13.,14.,15.,99.,99.,99.,99.,99.,99.,99. -}; - -static const ve_setup_data_template ve_setup_32_stereo={ - 11, - rate_mapping_32, - quality_mapping_44, - 2, - 26000, - 40000, - - blocksize_short_44, - blocksize_long_44, - - _psy_tone_masteratt_44, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_otherblock, - _vp_tonemask_adj_longblock, - _vp_tonemask_adj_otherblock, - - _psy_noiseguards_44, - _psy_noisebias_impulse, - _psy_noisebias_padding, - _psy_noisebias_trans, - _psy_noisebias_long, - _psy_noise_suppress, - - _psy_compand_44, - _psy_compand_short_mapping, - _psy_compand_long_mapping, - - {_noise_start_short_44,_noise_start_long_44}, - {_noise_part_short_44,_noise_part_long_44}, - _noise_thresh_44, - - _psy_ath_floater, - _psy_ath_abs, - - _psy_lowpass_32, - - _psy_global_44, - _global_mapping_44, - _psy_stereo_modes_44, - - _floor_books, - _floor, - 2, - _floor_mapping_44, - - _mapres_template_44_stereo -}; - -static const ve_setup_data_template ve_setup_32_uncoupled={ - 11, - rate_mapping_32_un, - quality_mapping_44, - -1, - 26000, - 40000, - - blocksize_short_44, - blocksize_long_44, - - _psy_tone_masteratt_44, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_otherblock, - _vp_tonemask_adj_longblock, - _vp_tonemask_adj_otherblock, - - _psy_noiseguards_44, - _psy_noisebias_impulse, - _psy_noisebias_padding, - _psy_noisebias_trans, - _psy_noisebias_long, - _psy_noise_suppress, - - _psy_compand_44, - _psy_compand_short_mapping, - _psy_compand_long_mapping, - - {_noise_start_short_44,_noise_start_long_44}, - {_noise_part_short_44,_noise_part_long_44}, - _noise_thresh_44, - - _psy_ath_floater, - _psy_ath_abs, - - _psy_lowpass_32, - - _psy_global_44, - _global_mapping_44, - NULL, - - _floor_books, - _floor, - 2, - _floor_mapping_44, - - _mapres_template_44_uncoupled -}; diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_44.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_44.h deleted file mode 100644 index 3b88a89a..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_44.h +++ /dev/null @@ -1,117 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: toplevel settings for 44.1/48kHz - last mod: $Id: setup_44.h 16962 2010-03-11 07:30:34Z xiphmont $ - - ********************************************************************/ - -#include "modes/floor_all.h" -#include "modes/residue_44.h" -#include "modes/psych_44.h" - -static const double rate_mapping_44_stereo[12]={ - 22500.,32000.,40000.,48000.,56000.,64000., - 80000.,96000.,112000.,128000.,160000.,250001. -}; - -static const double quality_mapping_44[12]={ - -.1,.0,.1,.2,.3,.4,.5,.6,.7,.8,.9,1.0 -}; - -static const int blocksize_short_44[11]={ - 512,256,256,256,256,256,256,256,256,256,256 -}; -static const int blocksize_long_44[11]={ - 4096,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048 -}; - -static const double _psy_compand_short_mapping[12]={ - 0.5, 1., 1., 1.3, 1.6, 2., 2., 2., 2., 2., 2., 2. -}; -static const double _psy_compand_long_mapping[12]={ - 3.5, 4., 4., 4.3, 4.6, 5., 5., 5., 5., 5., 5., 5. -}; - -static const double _global_mapping_44[12]={ - /* 1., 1., 1.5, 2., 2., 2.5, 2.7, 3.0, 3.5, 4., 4. */ - 0., 1., 1., 1.5, 2., 2., 2.5, 2.7, 3.0, 3.7, 4., 4. -}; - -static const int _floor_mapping_44a[11]={ - 1,0,0,2,2,4,5,5,5,5,5 -}; - -static const int _floor_mapping_44b[11]={ - 8,7,7,7,7,7,7,7,7,7,7 -}; - -static const int _floor_mapping_44c[11]={ - 10,10,10,10,10,10,10,10,10,10,10 -}; - -static const int *_floor_mapping_44[]={ - _floor_mapping_44a, - _floor_mapping_44b, - _floor_mapping_44c, -}; - -static const ve_setup_data_template ve_setup_44_stereo={ - 11, - rate_mapping_44_stereo, - quality_mapping_44, - 2, - 40000, - 50000, - - blocksize_short_44, - blocksize_long_44, - - _psy_tone_masteratt_44, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_otherblock, - _vp_tonemask_adj_longblock, - _vp_tonemask_adj_otherblock, - - _psy_noiseguards_44, - _psy_noisebias_impulse, - _psy_noisebias_padding, - _psy_noisebias_trans, - _psy_noisebias_long, - _psy_noise_suppress, - - _psy_compand_44, - _psy_compand_short_mapping, - _psy_compand_long_mapping, - - {_noise_start_short_44,_noise_start_long_44}, - {_noise_part_short_44,_noise_part_long_44}, - _noise_thresh_44, - - _psy_ath_floater, - _psy_ath_abs, - - _psy_lowpass_44, - - _psy_global_44, - _global_mapping_44, - _psy_stereo_modes_44, - - _floor_books, - _floor, - 2, - _floor_mapping_44, - - _mapres_template_44_stereo -}; diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_44p51.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_44p51.h deleted file mode 100644 index 67d99796..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_44p51.h +++ /dev/null @@ -1,74 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2010 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: toplevel settings for 44.1/48kHz 5.1 surround modes - last mod: $Id: setup_44p51.h 19013 2013-11-12 04:04:50Z giles $ - - ********************************************************************/ - -#include "modes/residue_44p51.h" - -static const double rate_mapping_44p51[12]={ - 14000.,20000.,28000.,38000.,46000.,54000., - 75000.,96000.,120000.,140000.,180000.,240001. -}; - -static const ve_setup_data_template ve_setup_44_51={ - 11, - rate_mapping_44p51, - quality_mapping_44, - 6, - 40000, - 70000, - - blocksize_short_44, - blocksize_long_44, - - _psy_tone_masteratt_44, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_otherblock, - _vp_tonemask_adj_longblock, - _vp_tonemask_adj_otherblock, - - _psy_noiseguards_44, - _psy_noisebias_impulse, - _psy_noisebias_padding, - _psy_noisebias_trans, - _psy_noisebias_long, - _psy_noise_suppress, - - _psy_compand_44, - _psy_compand_short_mapping, - _psy_compand_long_mapping, - - {_noise_start_short_44,_noise_start_long_44}, - {_noise_part_short_44,_noise_part_long_44}, - _noise_thresh_44, - - _psy_ath_floater, - _psy_ath_abs, - - _psy_lowpass_44, - - _psy_global_44, - _global_mapping_44, - _psy_stereo_modes_44, - - _floor_books, - _floor, - 3, - _floor_mapping_44, - - _mapres_template_44_51 -}; diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_44u.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_44u.h deleted file mode 100644 index 568b5f89..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_44u.h +++ /dev/null @@ -1,74 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: toplevel settings for 44.1/48kHz uncoupled modes - last mod: $Id: setup_44u.h 16962 2010-03-11 07:30:34Z xiphmont $ - - ********************************************************************/ - -#include "modes/residue_44u.h" - -static const double rate_mapping_44_un[12]={ - 32000.,48000.,60000.,70000.,80000.,86000., - 96000.,110000.,120000.,140000.,160000.,240001. -}; - -static const ve_setup_data_template ve_setup_44_uncoupled={ - 11, - rate_mapping_44_un, - quality_mapping_44, - -1, - 40000, - 50000, - - blocksize_short_44, - blocksize_long_44, - - _psy_tone_masteratt_44, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_otherblock, - _vp_tonemask_adj_longblock, - _vp_tonemask_adj_otherblock, - - _psy_noiseguards_44, - _psy_noisebias_impulse, - _psy_noisebias_padding, - _psy_noisebias_trans, - _psy_noisebias_long, - _psy_noise_suppress, - - _psy_compand_44, - _psy_compand_short_mapping, - _psy_compand_long_mapping, - - {_noise_start_short_44,_noise_start_long_44}, - {_noise_part_short_44,_noise_part_long_44}, - _noise_thresh_44, - - _psy_ath_floater, - _psy_ath_abs, - - _psy_lowpass_44, - - _psy_global_44, - _global_mapping_44, - _psy_stereo_modes_44, - - _floor_books, - _floor, - 2, - _floor_mapping_44, - - _mapres_template_44_uncoupled -}; diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_8.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_8.h deleted file mode 100644 index 14c48374..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_8.h +++ /dev/null @@ -1,149 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: 8kHz settings - last mod: $Id: setup_8.h 16894 2010-02-12 20:32:12Z xiphmont $ - - ********************************************************************/ - -#include "psych_8.h" -#include "residue_8.h" - -static const int blocksize_8[2]={ - 512,512 -}; - -static const int _floor_mapping_8a[]={ - 6,6 -}; - -static const int *_floor_mapping_8[]={ - _floor_mapping_8a -}; - -static const double rate_mapping_8[3]={ - 6000.,9000.,32000., -}; - -static const double rate_mapping_8_uncoupled[3]={ - 8000.,14000.,42000., -}; - -static const double quality_mapping_8[3]={ - -.1,.0,1. -}; - -static const double _psy_compand_8_mapping[3]={ 0., 1., 1.}; - -static const double _global_mapping_8[3]={ 1., 2., 3. }; - -static const ve_setup_data_template ve_setup_8_stereo={ - 2, - rate_mapping_8, - quality_mapping_8, - 2, - 8000, - 9000, - - blocksize_8, - blocksize_8, - - _psy_tone_masteratt_8, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_8, - NULL, - _vp_tonemask_adj_8, - - _psy_noiseguards_8, - _psy_noisebias_8, - _psy_noisebias_8, - NULL, - NULL, - _psy_noise_suppress, - - _psy_compand_8, - _psy_compand_8_mapping, - NULL, - - {_noise_start_8,_noise_start_8}, - {_noise_part_8,_noise_part_8}, - _noise_thresh_5only, - - _psy_ath_floater_8, - _psy_ath_abs_8, - - _psy_lowpass_8, - - _psy_global_44, - _global_mapping_8, - _psy_stereo_modes_8, - - _floor_books, - _floor, - 1, - _floor_mapping_8, - - _mapres_template_8_stereo -}; - -static const ve_setup_data_template ve_setup_8_uncoupled={ - 2, - rate_mapping_8_uncoupled, - quality_mapping_8, - -1, - 8000, - 9000, - - blocksize_8, - blocksize_8, - - _psy_tone_masteratt_8, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_8, - NULL, - _vp_tonemask_adj_8, - - _psy_noiseguards_8, - _psy_noisebias_8, - _psy_noisebias_8, - NULL, - NULL, - _psy_noise_suppress, - - _psy_compand_8, - _psy_compand_8_mapping, - NULL, - - {_noise_start_8,_noise_start_8}, - {_noise_part_8,_noise_part_8}, - _noise_thresh_5only, - - _psy_ath_floater_8, - _psy_ath_abs_8, - - _psy_lowpass_8, - - _psy_global_44, - _global_mapping_8, - _psy_stereo_modes_8, - - _floor_books, - _floor, - 1, - _floor_mapping_8, - - _mapres_template_8_uncoupled -}; diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_X.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_X.h deleted file mode 100644 index a69f5d40..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/modes/setup_X.h +++ /dev/null @@ -1,225 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: catch-all toplevel settings for q modes only - last mod: $Id: setup_X.h 16894 2010-02-12 20:32:12Z xiphmont $ - - ********************************************************************/ - -static const double rate_mapping_X[12]={ - -1.,-1.,-1.,-1.,-1.,-1., - -1.,-1.,-1.,-1.,-1.,-1. -}; - -static const ve_setup_data_template ve_setup_X_stereo={ - 11, - rate_mapping_X, - quality_mapping_44, - 2, - 50000, - 200000, - - blocksize_short_44, - blocksize_long_44, - - _psy_tone_masteratt_44, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_otherblock, - _vp_tonemask_adj_longblock, - _vp_tonemask_adj_otherblock, - - _psy_noiseguards_44, - _psy_noisebias_impulse, - _psy_noisebias_padding, - _psy_noisebias_trans, - _psy_noisebias_long, - _psy_noise_suppress, - - _psy_compand_44, - _psy_compand_short_mapping, - _psy_compand_long_mapping, - - {_noise_start_short_44,_noise_start_long_44}, - {_noise_part_short_44,_noise_part_long_44}, - _noise_thresh_44, - - _psy_ath_floater, - _psy_ath_abs, - - _psy_lowpass_44, - - _psy_global_44, - _global_mapping_44, - _psy_stereo_modes_44, - - _floor_books, - _floor, - 2, - _floor_mapping_44, - - _mapres_template_44_stereo -}; - -static const ve_setup_data_template ve_setup_X_uncoupled={ - 11, - rate_mapping_X, - quality_mapping_44, - -1, - 50000, - 200000, - - blocksize_short_44, - blocksize_long_44, - - _psy_tone_masteratt_44, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_otherblock, - _vp_tonemask_adj_longblock, - _vp_tonemask_adj_otherblock, - - _psy_noiseguards_44, - _psy_noisebias_impulse, - _psy_noisebias_padding, - _psy_noisebias_trans, - _psy_noisebias_long, - _psy_noise_suppress, - - _psy_compand_44, - _psy_compand_short_mapping, - _psy_compand_long_mapping, - - {_noise_start_short_44,_noise_start_long_44}, - {_noise_part_short_44,_noise_part_long_44}, - _noise_thresh_44, - - _psy_ath_floater, - _psy_ath_abs, - - _psy_lowpass_44, - - _psy_global_44, - _global_mapping_44, - NULL, - - _floor_books, - _floor, - 2, - _floor_mapping_44, - - _mapres_template_44_uncoupled -}; - -static const ve_setup_data_template ve_setup_XX_stereo={ - 2, - rate_mapping_X, - quality_mapping_8, - 2, - 0, - 8000, - - blocksize_8, - blocksize_8, - - _psy_tone_masteratt_8, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_8, - NULL, - _vp_tonemask_adj_8, - - _psy_noiseguards_8, - _psy_noisebias_8, - _psy_noisebias_8, - NULL, - NULL, - _psy_noise_suppress, - - _psy_compand_8, - _psy_compand_8_mapping, - NULL, - - {_noise_start_8,_noise_start_8}, - {_noise_part_8,_noise_part_8}, - _noise_thresh_5only, - - _psy_ath_floater_8, - _psy_ath_abs_8, - - _psy_lowpass_8, - - _psy_global_44, - _global_mapping_8, - _psy_stereo_modes_8, - - _floor_books, - _floor, - 1, - _floor_mapping_8, - - _mapres_template_8_stereo -}; - -static const ve_setup_data_template ve_setup_XX_uncoupled={ - 2, - rate_mapping_X, - quality_mapping_8, - -1, - 0, - 8000, - - blocksize_8, - blocksize_8, - - _psy_tone_masteratt_8, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_8, - NULL, - _vp_tonemask_adj_8, - - _psy_noiseguards_8, - _psy_noisebias_8, - _psy_noisebias_8, - NULL, - NULL, - _psy_noise_suppress, - - _psy_compand_8, - _psy_compand_8_mapping, - NULL, - - {_noise_start_8,_noise_start_8}, - {_noise_part_8,_noise_part_8}, - _noise_thresh_5only, - - _psy_ath_floater_8, - _psy_ath_abs_8, - - _psy_lowpass_8, - - _psy_global_44, - _global_mapping_8, - _psy_stereo_modes_8, - - _floor_books, - _floor, - 1, - _floor_mapping_8, - - _mapres_template_8_uncoupled -}; diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/os.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/os.h deleted file mode 100644 index 8bc3e5fe..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/os.h +++ /dev/null @@ -1,191 +0,0 @@ -#ifndef _OS_H -#define _OS_H -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2015 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: #ifdef jail to whip a few platforms into the UNIX ideal. - last mod: $Id: os.h 19457 2015-03-03 00:15:29Z giles $ - - ********************************************************************/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include - -#include "misc.h" - -#ifndef _V_IFDEFJAIL_H_ -# define _V_IFDEFJAIL_H_ - -# ifdef __GNUC__ -# define STIN static __inline__ -# elif _WIN32 -# define STIN static __inline -# else -# define STIN static -# endif - -#ifdef DJGPP -# define rint(x) (floor((x)+0.5f)) -#endif - -#ifndef M_PI -# define M_PI (3.1415926536f) -#endif - -#if defined(_WIN32) && !defined(__SYMBIAN32__) -# include -# define rint(x) (floor((x)+0.5f)) -# define NO_FLOAT_MATH_LIB -# define FAST_HYPOT(a, b) sqrt((a)*(a) + (b)*(b)) -#endif - -#if defined(__SYMBIAN32__) && defined(__WINS__) -void *_alloca(size_t size); -# define alloca _alloca -#endif - -#ifndef FAST_HYPOT -# define FAST_HYPOT hypot -#endif - -#endif - -#ifdef HAVE_ALLOCA_H -# include -#endif - -#ifdef USE_MEMORY_H -# include -#endif - -#ifndef min -# define min(x,y) ((x)>(y)?(y):(x)) -#endif - -#ifndef max -# define max(x,y) ((x)<(y)?(y):(x)) -#endif - - -/* Special i386 GCC implementation */ -#if defined(__i386__) && defined(__GNUC__) && !defined(__BEOS__) -# define VORBIS_FPU_CONTROL -/* both GCC and MSVC are kinda stupid about rounding/casting to int. - Because of encapsulation constraints (GCC can't see inside the asm - block and so we end up doing stupid things like a store/load that - is collectively a noop), we do it this way */ - -/* we must set up the fpu before this works!! */ - -typedef ogg_int16_t vorbis_fpu_control; - -static inline void vorbis_fpu_setround(vorbis_fpu_control *fpu){ - ogg_int16_t ret; - ogg_int16_t temp; - __asm__ __volatile__("fnstcw %0\n\t" - "movw %0,%%dx\n\t" - "andw $62463,%%dx\n\t" - "movw %%dx,%1\n\t" - "fldcw %1\n\t":"=m"(ret):"m"(temp): "dx"); - *fpu=ret; -} - -static inline void vorbis_fpu_restore(vorbis_fpu_control fpu){ - __asm__ __volatile__("fldcw %0":: "m"(fpu)); -} - -/* assumes the FPU is in round mode! */ -static inline int vorbis_ftoi(double f){ /* yes, double! Otherwise, - we get extra fst/fld to - truncate precision */ - int i; - __asm__("fistl %0": "=m"(i) : "t"(f)); - return(i); -} -#endif /* Special i386 GCC implementation */ - - -/* MSVC inline assembly. 32 bit only; inline ASM isn't implemented in the - * 64 bit compiler and doesn't work on arm. */ -#if defined(_MSC_VER) && !defined(_WIN64) && \ - !defined(_WIN32_WCE) && !defined(_M_ARM) -# define VORBIS_FPU_CONTROL - -typedef ogg_int16_t vorbis_fpu_control; - -static __inline int vorbis_ftoi(double f){ - int i; - __asm{ - fld f - fistp i - } - return i; -} - -static __inline void vorbis_fpu_setround(vorbis_fpu_control *fpu){ - (void)fpu; -} - -static __inline void vorbis_fpu_restore(vorbis_fpu_control fpu){ - (void)fpu; -} - -#endif /* Special MSVC 32 bit implementation */ - - -/* Optimized code path for x86_64 builds. Uses SSE2 intrinsics. This can be - done safely because all x86_64 CPUs supports SSE2. */ -#if (defined(_MSC_VER) && defined(_WIN64)) || (defined(__GNUC__) && defined (__x86_64__)) -# define VORBIS_FPU_CONTROL - -typedef ogg_int16_t vorbis_fpu_control; - -#include -static __inline int vorbis_ftoi(double f){ - return _mm_cvtsd_si32(_mm_load_sd(&f)); -} - -static __inline void vorbis_fpu_setround(vorbis_fpu_control *fpu){ - (void)fpu; -} - -static __inline void vorbis_fpu_restore(vorbis_fpu_control fpu){ - (void)fpu; -} - -#endif /* Special MSVC x64 implementation */ - - -/* If no special implementation was found for the current compiler / platform, - use the default implementation here: */ -#ifndef VORBIS_FPU_CONTROL - -typedef int vorbis_fpu_control; - -static int vorbis_ftoi(double f){ - /* Note: MSVC and GCC (at least on some systems) round towards zero, thus, - the floor() call is required to ensure correct roudning of - negative numbers */ - return (int)floor(f+.5); -} - -/* We don't have special code for this compiler/arch, so do it the slow way */ -# define vorbis_fpu_setround(vorbis_fpu_control) {} -# define vorbis_fpu_restore(vorbis_fpu_control) {} - -#endif /* default implementation */ - -#endif /* _OS_H */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/psy.c b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/psy.c deleted file mode 100644 index 89eaa995..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/psy.c +++ /dev/null @@ -1,1209 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2010 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: psychoacoustics not including preecho - last mod: $Id: psy.c 18077 2011-09-02 02:49:00Z giles $ - - ********************************************************************/ - -#include -#include -#include -#include "vorbis/codec.h" -#include "codec_internal.h" - -#include "masking.h" -#include "psy.h" -#include "os.h" -#include "lpc.h" -#include "smallft.h" -#include "scales.h" -#include "misc.h" - -#define NEGINF -9999.f -static const double stereo_threshholds[]={0.0, .5, 1.0, 1.5, 2.5, 4.5, 8.5, 16.5, 9e10}; -static const double stereo_threshholds_limited[]={0.0, .5, 1.0, 1.5, 2.0, 2.5, 4.5, 8.5, 9e10}; - -vorbis_look_psy_global *_vp_global_look(vorbis_info *vi){ - codec_setup_info *ci=vi->codec_setup; - vorbis_info_psy_global *gi=&ci->psy_g_param; - vorbis_look_psy_global *look=_ogg_calloc(1,sizeof(*look)); - - look->channels=vi->channels; - - look->ampmax=-9999.; - look->gi=gi; - return(look); -} - -void _vp_global_free(vorbis_look_psy_global *look){ - if(look){ - memset(look,0,sizeof(*look)); - _ogg_free(look); - } -} - -void _vi_gpsy_free(vorbis_info_psy_global *i){ - if(i){ - memset(i,0,sizeof(*i)); - _ogg_free(i); - } -} - -void _vi_psy_free(vorbis_info_psy *i){ - if(i){ - memset(i,0,sizeof(*i)); - _ogg_free(i); - } -} - -static void min_curve(float *c, - float *c2){ - int i; - for(i=0;ic[i])c[i]=c2[i]; -} - -static void attenuate_curve(float *c,float att){ - int i; - for(i=0;iATH[j+k+ath_offset])min=ATH[j+k+ath_offset]; - }else{ - if(min>ATH[MAX_ATH-1])min=ATH[MAX_ATH-1]; - } - ath[j]=min; - } - - /* copy curves into working space, replicate the 50dB curve to 30 - and 40, replicate the 100dB curve to 110 */ - for(j=0;j<6;j++) - memcpy(workc[i][j+2],tonemasks[i][j],EHMER_MAX*sizeof(*tonemasks[i][j])); - memcpy(workc[i][0],tonemasks[i][0],EHMER_MAX*sizeof(*tonemasks[i][0])); - memcpy(workc[i][1],tonemasks[i][0],EHMER_MAX*sizeof(*tonemasks[i][0])); - - /* apply centered curve boost/decay */ - for(j=0;j0)adj=0.; - if(adj>0. && center_boost<0)adj=0.; - workc[i][j][k]+=adj; - } - } - - /* normalize curves so the driving amplitude is 0dB */ - /* make temp curves with the ATH overlayed */ - for(j=0;j an eighth of an octave and that the eighth - octave values may also be composited. */ - - /* which octave curves will we be compositing? */ - bin=floor(fromOC(i*.5)/binHz); - lo_curve= ceil(toOC(bin*binHz+1)*2); - hi_curve= floor(toOC((bin+1)*binHz)*2); - if(lo_curve>i)lo_curve=i; - if(lo_curve<0)lo_curve=0; - if(hi_curve>=P_BANDS)hi_curve=P_BANDS-1; - - for(m=0;mn)lo_bin=n; - if(lo_binn)hi_bin=n; - - for(;lworkc[k][m][j]) - brute_buffer[l]=workc[k][m][j]; - } - - for(;lworkc[k][m][EHMER_MAX-1]) - brute_buffer[l]=workc[k][m][EHMER_MAX-1]; - - } - - /* be equally paranoid about being valid up to next half ocatve */ - if(i+1n)lo_bin=n; - if(lo_binn)hi_bin=n; - - for(;lworkc[k][m][j]) - brute_buffer[l]=workc[k][m][j]; - } - - for(;lworkc[k][m][EHMER_MAX-1]) - brute_buffer[l]=workc[k][m][EHMER_MAX-1]; - - } - - - for(j=0;j=n){ - ret[i][m][j+2]=-999.; - }else{ - ret[i][m][j+2]=brute_buffer[bin]; - } - } - } - - /* add fenceposts */ - for(j=0;j-200.f)break; - ret[i][m][0]=j; - - for(j=EHMER_MAX-1;j>EHMER_OFFSET+1;j--) - if(ret[i][m][j+2]>-200.f) - break; - ret[i][m][1]=j; - - } - } - - return(ret); -} - -void _vp_psy_init(vorbis_look_psy *p,vorbis_info_psy *vi, - vorbis_info_psy_global *gi,int n,long rate){ - long i,j,lo=-99,hi=1; - long maxoc; - memset(p,0,sizeof(*p)); - - p->eighth_octave_lines=gi->eighth_octave_lines; - p->shiftoc=rint(log(gi->eighth_octave_lines*8.f)/log(2.f))-1; - - p->firstoc=toOC(.25f*rate*.5/n)*(1<<(p->shiftoc+1))-gi->eighth_octave_lines; - maxoc=toOC((n+.25f)*rate*.5/n)*(1<<(p->shiftoc+1))+.5f; - p->total_octave_lines=maxoc-p->firstoc+1; - p->ath=_ogg_malloc(n*sizeof(*p->ath)); - - p->octave=_ogg_malloc(n*sizeof(*p->octave)); - p->bark=_ogg_malloc(n*sizeof(*p->bark)); - p->vi=vi; - p->n=n; - p->rate=rate; - - /* AoTuV HF weighting */ - p->m_val = 1.; - if(rate < 26000) p->m_val = 0; - else if(rate < 38000) p->m_val = .94; /* 32kHz */ - else if(rate > 46000) p->m_val = 1.275; /* 48kHz */ - - /* set up the lookups for a given blocksize and sample rate */ - - for(i=0,j=0;iath[j]=base+100.; - base+=delta; - } - } - } - - for(;jath[j]=p->ath[j-1]; - } - - for(i=0;inoisewindowlominnoisewindowlo);lo++); - - for(;hi<=n && (hinoisewindowhimin || - toBARK(rate/(2*n)*hi)<(bark+vi->noisewindowhi));hi++); - - p->bark[i]=((lo-1)<<16)+(hi-1); - - } - - for(i=0;ioctave[i]=toOC((i+.25f)*.5*rate/n)*(1<<(p->shiftoc+1))+.5f; - - p->tonecurves=setup_tone_curves(vi->toneatt,rate*.5/n,n, - vi->tone_centerboost,vi->tone_decay); - - /* set up rolling noise median */ - p->noiseoffset=_ogg_malloc(P_NOISECURVES*sizeof(*p->noiseoffset)); - for(i=0;inoiseoffset[i]=_ogg_malloc(n*sizeof(**p->noiseoffset)); - - for(i=0;i=P_BANDS-1)halfoc=P_BANDS-1; - inthalfoc=(int)halfoc; - del=halfoc-inthalfoc; - - for(j=0;jnoiseoffset[j][i]= - p->vi->noiseoff[j][inthalfoc]*(1.-del) + - p->vi->noiseoff[j][inthalfoc+1]*del; - - } -#if 0 - { - static int ls=0; - _analysis_output_always("noiseoff0",ls,p->noiseoffset[0],n,1,0,0); - _analysis_output_always("noiseoff1",ls,p->noiseoffset[1],n,1,0,0); - _analysis_output_always("noiseoff2",ls++,p->noiseoffset[2],n,1,0,0); - } -#endif -} - -void _vp_psy_clear(vorbis_look_psy *p){ - int i,j; - if(p){ - if(p->ath)_ogg_free(p->ath); - if(p->octave)_ogg_free(p->octave); - if(p->bark)_ogg_free(p->bark); - if(p->tonecurves){ - for(i=0;itonecurves[i][j]); - } - _ogg_free(p->tonecurves[i]); - } - _ogg_free(p->tonecurves); - } - if(p->noiseoffset){ - for(i=0;inoiseoffset[i]); - } - _ogg_free(p->noiseoffset); - } - memset(p,0,sizeof(*p)); - } -} - -/* octave/(8*eighth_octave_lines) x scale and dB y scale */ -static void seed_curve(float *seed, - const float **curves, - float amp, - int oc, int n, - int linesper,float dBoffset){ - int i,post1; - int seedptr; - const float *posts,*curve; - - int choice=(int)((amp+dBoffset-P_LEVEL_0)*.1f); - choice=max(choice,0); - choice=min(choice,P_LEVELS-1); - posts=curves[choice]; - curve=posts+2; - post1=(int)posts[1]; - seedptr=oc+(posts[0]-EHMER_OFFSET)*linesper-(linesper>>1); - - for(i=posts[0];i0){ - float lin=amp+curve[i]; - if(seed[seedptr]=n)break; - } -} - -static void seed_loop(vorbis_look_psy *p, - const float ***curves, - const float *f, - const float *flr, - float *seed, - float specmax){ - vorbis_info_psy *vi=p->vi; - long n=p->n,i; - float dBoffset=vi->max_curve_dB-specmax; - - /* prime the working vector with peak values */ - - for(i=0;ioctave[i]; - while(i+1octave[i+1]==oc){ - i++; - if(f[i]>max)max=f[i]; - } - - if(max+6.f>flr[i]){ - oc=oc>>p->shiftoc; - - if(oc>=P_BANDS)oc=P_BANDS-1; - if(oc<0)oc=0; - - seed_curve(seed, - curves[oc], - max, - p->octave[i]-p->firstoc, - p->total_octave_lines, - p->eighth_octave_lines, - dBoffset); - } - } -} - -static void seed_chase(float *seeds, int linesper, long n){ - long *posstack=alloca(n*sizeof(*posstack)); - float *ampstack=alloca(n*sizeof(*ampstack)); - long stack=0; - long pos=0; - long i; - - for(i=0;i1 && ampstack[stack-1]<=ampstack[stack-2] && - iampstack[i]){ - endpos=posstack[i+1]; - }else{ - endpos=posstack[i]+linesper+1; /* +1 is important, else bin 0 is - discarded in short frames */ - } - if(endpos>n)endpos=n; - for(;pos -static void max_seeds(vorbis_look_psy *p, - float *seed, - float *flr){ - long n=p->total_octave_lines; - int linesper=p->eighth_octave_lines; - long linpos=0; - long pos; - - seed_chase(seed,linesper,n); /* for masking */ - - pos=p->octave[0]-p->firstoc-(linesper>>1); - - while(linpos+1n){ - float minV=seed[pos]; - long end=((p->octave[linpos]+p->octave[linpos+1])>>1)-p->firstoc; - if(minV>p->vi->tone_abs_limit)minV=p->vi->tone_abs_limit; - while(pos+1<=end){ - pos++; - if((seed[pos]>NEGINF && seed[pos]firstoc; - for(;linposn && p->octave[linpos]<=end;linpos++) - if(flr[linpos]total_octave_lines-1]; - for(;linposn;linpos++) - if(flr[linpos]> 16; - if( lo>=0 ) break; - hi = b[i] & 0xffff; - - tN = N[hi] + N[-lo]; - tX = X[hi] - X[-lo]; - tXX = XX[hi] + XX[-lo]; - tY = Y[hi] + Y[-lo]; - tXY = XY[hi] - XY[-lo]; - - A = tY * tXX - tX * tXY; - B = tN * tXY - tX * tY; - D = tN * tXX - tX * tX; - R = (A + x * B) / D; - if (R < 0.f) - R = 0.f; - - noise[i] = R - offset; - } - - for ( ;; i++, x += 1.f) { - - lo = b[i] >> 16; - hi = b[i] & 0xffff; - if(hi>=n)break; - - tN = N[hi] - N[lo]; - tX = X[hi] - X[lo]; - tXX = XX[hi] - XX[lo]; - tY = Y[hi] - Y[lo]; - tXY = XY[hi] - XY[lo]; - - A = tY * tXX - tX * tXY; - B = tN * tXY - tX * tY; - D = tN * tXX - tX * tX; - R = (A + x * B) / D; - if (R < 0.f) R = 0.f; - - noise[i] = R - offset; - } - for ( ; i < n; i++, x += 1.f) { - - R = (A + x * B) / D; - if (R < 0.f) R = 0.f; - - noise[i] = R - offset; - } - - if (fixed <= 0) return; - - for (i = 0, x = 0.f;; i++, x += 1.f) { - hi = i + fixed / 2; - lo = hi - fixed; - if(lo>=0)break; - - tN = N[hi] + N[-lo]; - tX = X[hi] - X[-lo]; - tXX = XX[hi] + XX[-lo]; - tY = Y[hi] + Y[-lo]; - tXY = XY[hi] - XY[-lo]; - - - A = tY * tXX - tX * tXY; - B = tN * tXY - tX * tY; - D = tN * tXX - tX * tX; - R = (A + x * B) / D; - - if (R - offset < noise[i]) noise[i] = R - offset; - } - for ( ;; i++, x += 1.f) { - - hi = i + fixed / 2; - lo = hi - fixed; - if(hi>=n)break; - - tN = N[hi] - N[lo]; - tX = X[hi] - X[lo]; - tXX = XX[hi] - XX[lo]; - tY = Y[hi] - Y[lo]; - tXY = XY[hi] - XY[lo]; - - A = tY * tXX - tX * tXY; - B = tN * tXY - tX * tY; - D = tN * tXX - tX * tX; - R = (A + x * B) / D; - - if (R - offset < noise[i]) noise[i] = R - offset; - } - for ( ; i < n; i++, x += 1.f) { - R = (A + x * B) / D; - if (R - offset < noise[i]) noise[i] = R - offset; - } -} - -void _vp_noisemask(vorbis_look_psy *p, - float *logmdct, - float *logmask){ - - int i,n=p->n; - float *work=alloca(n*sizeof(*work)); - - bark_noise_hybridmp(n,p->bark,logmdct,logmask, - 140.,-1); - - for(i=0;ibark,work,logmask,0., - p->vi->noisewindowfixed); - - for(i=0;i=NOISE_COMPAND_LEVELS)dB=NOISE_COMPAND_LEVELS-1; - if(dB<0)dB=0; - logmask[i]= work[i]+p->vi->noisecompand[dB]; - } - -} - -void _vp_tonemask(vorbis_look_psy *p, - float *logfft, - float *logmask, - float global_specmax, - float local_specmax){ - - int i,n=p->n; - - float *seed=alloca(sizeof(*seed)*p->total_octave_lines); - float att=local_specmax+p->vi->ath_adjatt; - for(i=0;itotal_octave_lines;i++)seed[i]=NEGINF; - - /* set the ATH (floating below localmax, not global max by a - specified att) */ - if(attvi->ath_maxatt)att=p->vi->ath_maxatt; - - for(i=0;iath[i]+att; - - /* tone masking */ - seed_loop(p,(const float ***)p->tonecurves,logfft,logmask,seed,global_specmax); - max_seeds(p,seed,logmask); - -} - -void _vp_offset_and_mix(vorbis_look_psy *p, - float *noise, - float *tone, - int offset_select, - float *logmask, - float *mdct, - float *logmdct){ - int i,n=p->n; - float de, coeffi, cx;/* AoTuV */ - float toneatt=p->vi->tone_masteratt[offset_select]; - - cx = p->m_val; - - for(i=0;inoiseoffset[offset_select][i]; - if(val>p->vi->noisemaxsupp)val=p->vi->noisemaxsupp; - logmask[i]=max(val,tone[i]+toneatt); - - - /* AoTuV */ - /** @ M1 ** - The following codes improve a noise problem. - A fundamental idea uses the value of masking and carries out - the relative compensation of the MDCT. - However, this code is not perfect and all noise problems cannot be solved. - by Aoyumi @ 2004/04/18 - */ - - if(offset_select == 1) { - coeffi = -17.2; /* coeffi is a -17.2dB threshold */ - val = val - logmdct[i]; /* val == mdct line value relative to floor in dB */ - - if(val > coeffi){ - /* mdct value is > -17.2 dB below floor */ - - de = 1.0-((val-coeffi)*0.005*cx); - /* pro-rated attenuation: - -0.00 dB boost if mdct value is -17.2dB (relative to floor) - -0.77 dB boost if mdct value is 0dB (relative to floor) - -1.64 dB boost if mdct value is +17.2dB (relative to floor) - etc... */ - - if(de < 0) de = 0.0001; - }else - /* mdct value is <= -17.2 dB below floor */ - - de = 1.0-((val-coeffi)*0.0003*cx); - /* pro-rated attenuation: - +0.00 dB atten if mdct value is -17.2dB (relative to floor) - +0.45 dB atten if mdct value is -34.4dB (relative to floor) - etc... */ - - mdct[i] *= de; - - } - } -} - -float _vp_ampmax_decay(float amp,vorbis_dsp_state *vd){ - vorbis_info *vi=vd->vi; - codec_setup_info *ci=vi->codec_setup; - vorbis_info_psy_global *gi=&ci->psy_g_param; - - int n=ci->blocksizes[vd->W]/2; - float secs=(float)n/vi->rate; - - amp+=secs*gi->ampmax_att_per_sec; - if(amp<-9999)amp=-9999; - return(amp); -} - -/* -static float FLOOR1_fromdB_LOOKUP[256]={ - 1.0649863e-07F, 1.1341951e-07F, 1.2079015e-07F, 1.2863978e-07F, - 1.3699951e-07F, 1.4590251e-07F, 1.5538408e-07F, 1.6548181e-07F, - 1.7623575e-07F, 1.8768855e-07F, 1.9988561e-07F, 2.128753e-07F, - 2.2670913e-07F, 2.4144197e-07F, 2.5713223e-07F, 2.7384213e-07F, - 2.9163793e-07F, 3.1059021e-07F, 3.3077411e-07F, 3.5226968e-07F, - 3.7516214e-07F, 3.9954229e-07F, 4.2550680e-07F, 4.5315863e-07F, - 4.8260743e-07F, 5.1396998e-07F, 5.4737065e-07F, 5.8294187e-07F, - 6.2082472e-07F, 6.6116941e-07F, 7.0413592e-07F, 7.4989464e-07F, - 7.9862701e-07F, 8.5052630e-07F, 9.0579828e-07F, 9.6466216e-07F, - 1.0273513e-06F, 1.0941144e-06F, 1.1652161e-06F, 1.2409384e-06F, - 1.3215816e-06F, 1.4074654e-06F, 1.4989305e-06F, 1.5963394e-06F, - 1.7000785e-06F, 1.8105592e-06F, 1.9282195e-06F, 2.0535261e-06F, - 2.1869758e-06F, 2.3290978e-06F, 2.4804557e-06F, 2.6416497e-06F, - 2.8133190e-06F, 2.9961443e-06F, 3.1908506e-06F, 3.3982101e-06F, - 3.6190449e-06F, 3.8542308e-06F, 4.1047004e-06F, 4.3714470e-06F, - 4.6555282e-06F, 4.9580707e-06F, 5.2802740e-06F, 5.6234160e-06F, - 5.9888572e-06F, 6.3780469e-06F, 6.7925283e-06F, 7.2339451e-06F, - 7.7040476e-06F, 8.2047000e-06F, 8.7378876e-06F, 9.3057248e-06F, - 9.9104632e-06F, 1.0554501e-05F, 1.1240392e-05F, 1.1970856e-05F, - 1.2748789e-05F, 1.3577278e-05F, 1.4459606e-05F, 1.5399272e-05F, - 1.6400004e-05F, 1.7465768e-05F, 1.8600792e-05F, 1.9809576e-05F, - 2.1096914e-05F, 2.2467911e-05F, 2.3928002e-05F, 2.5482978e-05F, - 2.7139006e-05F, 2.8902651e-05F, 3.0780908e-05F, 3.2781225e-05F, - 3.4911534e-05F, 3.7180282e-05F, 3.9596466e-05F, 4.2169667e-05F, - 4.4910090e-05F, 4.7828601e-05F, 5.0936773e-05F, 5.4246931e-05F, - 5.7772202e-05F, 6.1526565e-05F, 6.5524908e-05F, 6.9783085e-05F, - 7.4317983e-05F, 7.9147585e-05F, 8.4291040e-05F, 8.9768747e-05F, - 9.5602426e-05F, 0.00010181521F, 0.00010843174F, 0.00011547824F, - 0.00012298267F, 0.00013097477F, 0.00013948625F, 0.00014855085F, - 0.00015820453F, 0.00016848555F, 0.00017943469F, 0.00019109536F, - 0.00020351382F, 0.00021673929F, 0.00023082423F, 0.00024582449F, - 0.00026179955F, 0.00027881276F, 0.00029693158F, 0.00031622787F, - 0.00033677814F, 0.00035866388F, 0.00038197188F, 0.00040679456F, - 0.00043323036F, 0.00046138411F, 0.00049136745F, 0.00052329927F, - 0.00055730621F, 0.00059352311F, 0.00063209358F, 0.00067317058F, - 0.00071691700F, 0.00076350630F, 0.00081312324F, 0.00086596457F, - 0.00092223983F, 0.00098217216F, 0.0010459992F, 0.0011139742F, - 0.0011863665F, 0.0012634633F, 0.0013455702F, 0.0014330129F, - 0.0015261382F, 0.0016253153F, 0.0017309374F, 0.0018434235F, - 0.0019632195F, 0.0020908006F, 0.0022266726F, 0.0023713743F, - 0.0025254795F, 0.0026895994F, 0.0028643847F, 0.0030505286F, - 0.0032487691F, 0.0034598925F, 0.0036847358F, 0.0039241906F, - 0.0041792066F, 0.0044507950F, 0.0047400328F, 0.0050480668F, - 0.0053761186F, 0.0057254891F, 0.0060975636F, 0.0064938176F, - 0.0069158225F, 0.0073652516F, 0.0078438871F, 0.0083536271F, - 0.0088964928F, 0.009474637F, 0.010090352F, 0.010746080F, - 0.011444421F, 0.012188144F, 0.012980198F, 0.013823725F, - 0.014722068F, 0.015678791F, 0.016697687F, 0.017782797F, - 0.018938423F, 0.020169149F, 0.021479854F, 0.022875735F, - 0.024362330F, 0.025945531F, 0.027631618F, 0.029427276F, - 0.031339626F, 0.033376252F, 0.035545228F, 0.037855157F, - 0.040315199F, 0.042935108F, 0.045725273F, 0.048696758F, - 0.051861348F, 0.055231591F, 0.058820850F, 0.062643361F, - 0.066714279F, 0.071049749F, 0.075666962F, 0.080584227F, - 0.085821044F, 0.091398179F, 0.097337747F, 0.10366330F, - 0.11039993F, 0.11757434F, 0.12521498F, 0.13335215F, - 0.14201813F, 0.15124727F, 0.16107617F, 0.17154380F, - 0.18269168F, 0.19456402F, 0.20720788F, 0.22067342F, - 0.23501402F, 0.25028656F, 0.26655159F, 0.28387361F, - 0.30232132F, 0.32196786F, 0.34289114F, 0.36517414F, - 0.38890521F, 0.41417847F, 0.44109412F, 0.46975890F, - 0.50028648F, 0.53279791F, 0.56742212F, 0.60429640F, - 0.64356699F, 0.68538959F, 0.72993007F, 0.77736504F, - 0.82788260F, 0.88168307F, 0.9389798F, 1.F, -}; - - */ - -/* this is for per-channel noise normalization */ -static int apsort(const void *a, const void *b){ - float f1=**(float**)a; - float f2=**(float**)b; - return (f1f2); -} - -static void flag_lossless(int limit, float prepoint, float postpoint, float *mdct, - float *floor, int *flag, int i, int jn){ - int j; - for(j=0;j=limit-i ? postpoint : prepoint; - float r = fabs(mdct[j])/floor[j]; - if(rvi; - float **sort = alloca(n*sizeof(*sort)); - int j,count=0; - int start = (vi->normal_p ? vi->normal_start-i : n); - if(start>n)start=n; - - /* force classic behavior where only energy in the current band is considered */ - acc=0.f; - - /* still responsible for populating *out where noise norm not in - effect. There's no need to [re]populate *q in these areas */ - for(j=0;j pointlimit */ - if(ve<.25f && (!flags || j>=limit-i)){ - acc += ve; - sort[count++]=q+j; /* q is fabs(r) for unflagged element */ - }else{ - /* For now: no acc adjustment for nonzero quantization. populate *out and q as this value is final. */ - if(r[j]<0) - out[j] = -rint(sqrt(ve)); - else - out[j] = rint(sqrt(ve)); - q[j] = out[j]*out[j]*f[j]; - } - }/* else{ - again, no energy adjustment for error in nonzero quant-- for now - }*/ - } - - if(count){ - /* noise norm to do */ - qsort(sort,count,sizeof(*sort),apsort); - for(j=0;j=vi->normal_thresh){ - out[k]=unitnorm(r[k]); - acc-=1.f; - q[k]=f[k]; - }else{ - out[k]=0; - q[k]=0.f; - } - } - } - - return acc; -} - -/* Noise normalization, quantization and coupling are not wholly - seperable processes in depth>1 coupling. */ -void _vp_couple_quantize_normalize(int blobno, - vorbis_info_psy_global *g, - vorbis_look_psy *p, - vorbis_info_mapping0 *vi, - float **mdct, - int **iwork, - int *nonzero, - int sliding_lowpass, - int ch){ - - int i; - int n = p->n; - int partition=(p->vi->normal_p ? p->vi->normal_partition : 16); - int limit = g->coupling_pointlimit[p->vi->blockflag][blobno]; - float prepoint=stereo_threshholds[g->coupling_prepointamp[blobno]]; - float postpoint=stereo_threshholds[g->coupling_postpointamp[blobno]]; -#if 0 - float de=0.1*p->m_val; /* a blend of the AoTuV M2 and M3 code here and below */ -#endif - - /* mdct is our raw mdct output, floor not removed. */ - /* inout passes in the ifloor, passes back quantized result */ - - /* unquantized energy (negative indicates amplitude has negative sign) */ - float **raw = alloca(ch*sizeof(*raw)); - - /* dual pupose; quantized energy (if flag set), othersize fabs(raw) */ - float **quant = alloca(ch*sizeof(*quant)); - - /* floor energy */ - float **floor = alloca(ch*sizeof(*floor)); - - /* flags indicating raw/quantized status of elements in raw vector */ - int **flag = alloca(ch*sizeof(*flag)); - - /* non-zero flag working vector */ - int *nz = alloca(ch*sizeof(*nz)); - - /* energy surplus/defecit tracking */ - float *acc = alloca((ch+vi->coupling_steps)*sizeof(*acc)); - - /* The threshold of a stereo is changed with the size of n */ - if(n > 1000) - postpoint=stereo_threshholds_limited[g->coupling_postpointamp[blobno]]; - - raw[0] = alloca(ch*partition*sizeof(**raw)); - quant[0] = alloca(ch*partition*sizeof(**quant)); - floor[0] = alloca(ch*partition*sizeof(**floor)); - flag[0] = alloca(ch*partition*sizeof(**flag)); - - for(i=1;icoupling_steps;i++) - acc[i]=0.f; - - for(i=0;i n-i ? n-i : partition; - int step,track = 0; - - memcpy(nz,nonzero,sizeof(*nz)*ch); - - /* prefill */ - memset(flag[0],0,ch*partition*sizeof(**flag)); - for(k=0;kcoupling_steps;step++){ - int Mi = vi->coupling_mag[step]; - int Ai = vi->coupling_ang[step]; - int *iM = &iwork[Mi][i]; - int *iA = &iwork[Ai][i]; - float *reM = raw[Mi]; - float *reA = raw[Ai]; - float *qeM = quant[Mi]; - float *qeA = quant[Ai]; - float *floorM = floor[Mi]; - float *floorA = floor[Ai]; - int *fM = flag[Mi]; - int *fA = flag[Ai]; - - if(nz[Mi] || nz[Ai]){ - nz[Mi] = nz[Ai] = 1; - - for(j=0;jabs(B)){ - iA[j]=(A>0?A-B:B-A); - }else{ - iA[j]=(B>0?A-B:B-A); - iM[j]=B; - } - - /* collapse two equivalent tuples to one */ - if(iA[j]>=abs(iM[j])*2){ - iA[j]= -iA[j]; - iM[j]= -iM[j]; - } - - } - - }else{ - /* lossy (point) coupling */ - if(jcoupling_steps;i++){ - /* make sure coupling a zero and a nonzero channel results in two - nonzero channels. */ - if(nonzero[vi->coupling_mag[i]] || - nonzero[vi->coupling_ang[i]]){ - nonzero[vi->coupling_mag[i]]=1; - nonzero[vi->coupling_ang[i]]=1; - } - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/psy.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/psy.h deleted file mode 100644 index c1ea8244..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/psy.h +++ /dev/null @@ -1,154 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: random psychoacoustics (not including preecho) - last mod: $Id: psy.h 16946 2010-03-03 16:12:40Z xiphmont $ - - ********************************************************************/ - -#ifndef _V_PSY_H_ -#define _V_PSY_H_ -#include "smallft.h" - -#include "backends.h" -#include "envelope.h" - -#ifndef EHMER_MAX -#define EHMER_MAX 56 -#endif - -/* psychoacoustic setup ********************************************/ -#define P_BANDS 17 /* 62Hz to 16kHz */ -#define P_LEVELS 8 /* 30dB to 100dB */ -#define P_LEVEL_0 30. /* 30 dB */ -#define P_NOISECURVES 3 - -#define NOISE_COMPAND_LEVELS 40 -typedef struct vorbis_info_psy{ - int blockflag; - - float ath_adjatt; - float ath_maxatt; - - float tone_masteratt[P_NOISECURVES]; - float tone_centerboost; - float tone_decay; - float tone_abs_limit; - float toneatt[P_BANDS]; - - int noisemaskp; - float noisemaxsupp; - float noisewindowlo; - float noisewindowhi; - int noisewindowlomin; - int noisewindowhimin; - int noisewindowfixed; - float noiseoff[P_NOISECURVES][P_BANDS]; - float noisecompand[NOISE_COMPAND_LEVELS]; - - float max_curve_dB; - - int normal_p; - int normal_start; - int normal_partition; - double normal_thresh; -} vorbis_info_psy; - -typedef struct{ - int eighth_octave_lines; - - /* for block long/short tuning; encode only */ - float preecho_thresh[VE_BANDS]; - float postecho_thresh[VE_BANDS]; - float stretch_penalty; - float preecho_minenergy; - - float ampmax_att_per_sec; - - /* channel coupling config */ - int coupling_pkHz[PACKETBLOBS]; - int coupling_pointlimit[2][PACKETBLOBS]; - int coupling_prepointamp[PACKETBLOBS]; - int coupling_postpointamp[PACKETBLOBS]; - int sliding_lowpass[2][PACKETBLOBS]; - -} vorbis_info_psy_global; - -typedef struct { - float ampmax; - int channels; - - vorbis_info_psy_global *gi; - int coupling_pointlimit[2][P_NOISECURVES]; -} vorbis_look_psy_global; - - -typedef struct { - int n; - struct vorbis_info_psy *vi; - - float ***tonecurves; - float **noiseoffset; - - float *ath; - long *octave; /* in n.ocshift format */ - long *bark; - - long firstoc; - long shiftoc; - int eighth_octave_lines; /* power of two, please */ - int total_octave_lines; - long rate; /* cache it */ - - float m_val; /* Masking compensation value */ - -} vorbis_look_psy; - -extern void _vp_psy_init(vorbis_look_psy *p,vorbis_info_psy *vi, - vorbis_info_psy_global *gi,int n,long rate); -extern void _vp_psy_clear(vorbis_look_psy *p); -extern void *_vi_psy_dup(void *source); - -extern void _vi_psy_free(vorbis_info_psy *i); -extern vorbis_info_psy *_vi_psy_copy(vorbis_info_psy *i); - -extern void _vp_noisemask(vorbis_look_psy *p, - float *logmdct, - float *logmask); - -extern void _vp_tonemask(vorbis_look_psy *p, - float *logfft, - float *logmask, - float global_specmax, - float local_specmax); - -extern void _vp_offset_and_mix(vorbis_look_psy *p, - float *noise, - float *tone, - int offset_select, - float *logmask, - float *mdct, - float *logmdct); - -extern float _vp_ampmax_decay(float amp,vorbis_dsp_state *vd); - -extern void _vp_couple_quantize_normalize(int blobno, - vorbis_info_psy_global *g, - vorbis_look_psy *p, - vorbis_info_mapping0 *vi, - float **mdct, - int **iwork, - int *nonzero, - int sliding_lowpass, - int ch); - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/psytune.c b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/psytune.c deleted file mode 100644 index be15bc22..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/psytune.c +++ /dev/null @@ -1,524 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: simple utility that runs audio through the psychoacoustics - without encoding - last mod: $Id: psytune.c 16037 2009-05-26 21:10:58Z xiphmont $ - - ********************************************************************/ - -/* NB: this is dead code, retained purely for doc and reference value - don't try to compile it */ - -#include -#include -#include -#include - -#include "vorbis/codec.h" -#include "codec_internal.h" -#include "os.h" -#include "misc.h" -#include "psy.h" -#include "mdct.h" -#include "smallft.h" -#include "window.h" -#include "scales.h" -#include "lpc.h" -#include "lsp.h" -#include "masking.h" -#include "registry.h" - -static vorbis_info_psy_global _psy_set0G={ - 0, /* decaydBpms */ - 8, /* lines per eighth octave */ - - /* thresh sample period, preecho clamp trigger threshhold, range, minenergy */ - 256, {26.f,26.f,26.f,30.f}, {-90.f,-90.f,-90.f,-90.f}, -90.f, - -6.f, - - 0, - - 0., - 0., -}; - -static vp_part _vp_part0[]={ - { 1,9e10f, 9e10f, 1.f,9999.f}, - { 9999, .75f, 9e10f, .5f,9999.f}, -/*{ 9999, 1.5f, 9e10f, .5f,9999.f},*/ - { 18,9e10f, 9e10f, .5f, 30.f}, - { 9999,9e10f, 9e10f, .5f, 30.f} -}; - -static vp_couple _vp_couple0[]={ - { 1, {9e10f,9e10f,0}, { 0.f, 0.f,0}, { 0.f, 0.f,0}, {0.f,0.f,0}}, - { 18, {9e10f,9e10f,0}, { 0.f, 0.f,0}, { 0.f, 0.f,0}, {0.f,0.f,0}}, - { 9999, {9e10f,9e10f,0}, { 0.f, 9e10f,0}, { 0.f,22.f,1}, {0.f,0.f,0}} -}; - -static vorbis_info_psy _psy_set0={ - ATH_Bark_dB_lineaggressive, - - -100.f, - -140.f, - 6.f, /* floor master att */ - - /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 */ - /* x: 63 88 125 175 250 350 500 700 1k 1.4k 2k 2.8k 4k 5.6k 8k 11.5k 16k Hz */ - /* y: 0 10 20 30 40 50 60 70 80 90 100 dB */ - 1, /* tonemaskp */ - 0.f, /* tone master att */ - /* 0 10 20 30 40 50 60 70 80 90 100 */ - { - {-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f}, /*63*/ - {-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f}, /*88*/ - {-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f,-999.f}, /*125*/ - - {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*175*/ - {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*250*/ - {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*350*/ - {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*500*/ - {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*700*/ - {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*1000*/ - {-30.f,-30.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*1400*/ - {-40.f,-40.f,-40.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*2000*/ - {-40.f,-40.f,-40.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*2800*/ - {-40.f,-40.f,-40.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*4000*/ - - {-30.f,-35.f,-35.f,-40.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*5600*/ - - {-30.f,-30.f,-33.f,-35.f,-40.f,-50.f,-60.f,-70.f,-80.f,-90.f,-100.f}, /*8000*/ - {-30.f,-30.f,-33.f,-35.f,-40.f,-45.f,-50.f,-60.f,-70.f,-85.f,-100.f}, /*11500*/ - {-24.f,-24.f,-26.f,-32.f,-32.f,-42.f,-50.f,-60.f,-70.f,-85.f,-100.f}, /*16000*/ - - }, - - 1,/* peakattp */ - {{-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*63*/ - {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*88*/ - {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*125*/ - {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*175*/ - {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*250*/ - {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*350*/ - {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*500*/ - {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*700*/ - {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*1000*/ - {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*1400*/ - {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*2000*/ - {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*2800*/ - {-14.f,-20.f,-20.f,-20.f,-26.f,-32.f,-40.f,-40.f,-40.f,-40.f,-40.f},/*4000*/ - {-10.f,-12.f,-14.f,-16.f,-16.f,-20.f,-24.f,-30.f,-32.f,-40.f,-40.f},/*5600*/ - {-10.f,-12.f,-14.f,-16.f,-16.f,-20.f,-24.f,-30.f,-32.f,-40.f,-40.f},/*8000*/ - {-10.f,-10.f,-10.f,-12.f,-14.f,-18.f,-22.f,-28.f,-32.f,-40.f,-40.f},/*11500*/ - {-10.f,-10.f,-10.f,-12.f,-14.f,-18.f,-22.f,-28.f,-32.f,-40.f,-40.f},/*16000*/ - }, - - 1,/*noisemaskp */ - -10.f, /* suppress any noise curve over maxspec+n */ - .5f, /* low window */ - .5f, /* high window */ - 10, - 10, - 25, - {.000f, 0.f, /*63*/ - .000f, 0.f, /*88*/ - .000f, 0.f, /*125*/ - .000f, 0.f, /*175*/ - .000f, 0.f, /*250*/ - .000f, 0.f, /*350*/ - .000f, 0.f, /*500*/ - .000f, 0.f, /*700*/ - .000f, 0.f, /*1000*/ - .300f, 0.f, /*1400*/ - .300f, 0.f, /*2000*/ - .300f, 0.f, /*2800*/ - .500f, 0.f, /*4000*/ - .700f, 0.f, /*5600*/ - .850f, 0.f, /*8000*/ - .900f, 0.f, /*11500*/ - .900f, 1.f, /*16000*/ - }, - - 95.f, /* even decade + 5 is important; saves an rint() later in a - tight loop) */ - -44., - - 32, - _vp_part0,_vp_couple0 -}; - -static vorbis_info_floor1 _floor_set0={1, - {0}, - - {32}, - {0}, - {0}, - {{-1}}, - - 2, - {0,1024, - - 88,31,243, - - 14,54,143,460, - - 6,3,10, 22,18,26, 41,36,47, - 69,61,78, 112,99,126, 185,162,211, - 329,282,387, 672,553,825 - }, - - 60,30,400, - 20,8,1,18., - 20,600, - 960}; - - -static vorbis_info_mapping0 mapping_info={1,{0,1},{0},{0},{0},0, 1, {0},{1}}; -static codec_setup_info codec_setup0={ {0,0}, - 1,1,1,1,1,0,1, - {NULL}, - {0},{&mapping_info}, - {0},{NULL}, - {1},{&_floor_set0}, - {2},{NULL}, - {NULL}, - {&_psy_set0}, - &_psy_set0G}; - -static int noisy=0; -void analysis(char *base,int i,float *v,int n,int bark,int dB){ - if(noisy){ - int j; - FILE *of; - char buffer[80]; - sprintf(buffer,"%s_%d.m",base,i); - of=fopen(buffer,"w"); - - for(j=0;jlook(NULL,NULL,&_floor_set0); - - /* we cheat on the WAV header; we just bypass 44 bytes and never - verify that it matches 16bit/stereo/44.1kHz. */ - - fread(buffer,1,44,stdin); - fwrite(buffer,1,44,stdout); - memset(buffer,0,framesize*2); - - analysis("window",0,window,framesize,0,0); - - fprintf(stderr,"Processing for frame size %d...\n",framesize); - - while(!eos){ - long bytes=fread(buffer2,1,framesize*2,stdin); - if(bytes>1]=todB(&temp); - if(temp>local_ampmax[i])local_ampmax[i]=temp; - } - if(local_ampmax[i]>ampmax)ampmax=local_ampmax[i]; - - mdct_forward(&m_look,pcm[i],mdct); - for(j=0;jforward(&vb,floor_look, - mdct, - logmdct, - mask, - logmax, - - flr[i]); - } - - _vp_remove_floor(&p_look, - pg_look, - logmdct, - mdct, - flr[i], - pcm[i], - local_ampmax[i]); - - for(j=0;j1500) - fprintf(stderr,"%ld ",frameno+i); - - analysis("res",frameno+i,pcm[i],framesize/2,1,0); - analysis("codedflr",frameno+i,flr[i],framesize/2,1,1); - } - - /* residue prequantization */ - _vp_partition_prequant(&p_look, - &vi, - pcm, - nonzero); - - for(i=0;i<2;i++) - analysis("quant",frameno+i,pcm[i],framesize/2,1,0); - - /* channel coupling / stereo quantization */ - - _vp_couple(&p_look, - &mapping_info, - pcm, - nonzero); - - for(i=0;i<2;i++) - analysis("coupled",frameno+i,pcm[i],framesize/2,1,0); - - /* decoupling */ - for(i=mapping_info.coupling_steps-1;i>=0;i--){ - float *pcmM=pcm[mapping_info.coupling_mag[i]]; - float *pcmA=pcm[mapping_info.coupling_ang[i]]; - - for(j=0;j0) - if(ang>0){ - pcmM[j]=mag; - pcmA[j]=mag-ang; - }else{ - pcmA[j]=mag; - pcmM[j]=mag+ang; - } - else - if(ang>0){ - pcmM[j]=mag; - pcmA[j]=mag+ang; - }else{ - pcmA[j]=mag; - pcmM[j]=mag-ang; - } - } - } - - for(i=0;i<2;i++) - analysis("decoupled",frameno+i,pcm[i],framesize/2,1,0); - - for(i=0;i<2;i++){ - float amp; - - for(j=0;j32767){ - if(!flag)fprintf(stderr,"clipping in frame %ld ",frameno+i); - flag=1; - val=32767; - } - if(val<-32768){ - if(!flag)fprintf(stderr,"clipping in frame %ld ",frameno+i); - flag=1; - val=-32768; - } - ptr[0]=val&0xff; - ptr[1]=(val>>8)&0xff; - ptr+=4; - } - } - - fprintf(stderr,"*"); - fwrite(buffer,1,framesize*2,stdout); - memmove(buffer,buffer2,framesize*2); - - for(i=0;i<2;i++){ - for(j=0,k=framesize/2;j -#include -#include -#include -#include "vorbis/codec.h" -#include "codec_internal.h" -#include "registry.h" -#include "codebook.h" -#include "misc.h" -#include "os.h" - -//#define TRAIN_RES 1 -//#define TRAIN_RESAUX 1 - -#if defined(TRAIN_RES) || defined (TRAIN_RESAUX) -#include -#endif - -typedef struct { - vorbis_info_residue0 *info; - - int parts; - int stages; - codebook *fullbooks; - codebook *phrasebook; - codebook ***partbooks; - - int partvals; - int **decodemap; - - long postbits; - long phrasebits; - long frames; - -#if defined(TRAIN_RES) || defined(TRAIN_RESAUX) - int train_seq; - long *training_data[8][64]; - float training_max[8][64]; - float training_min[8][64]; - float tmin; - float tmax; - int submap; -#endif - -} vorbis_look_residue0; - -void res0_free_info(vorbis_info_residue *i){ - vorbis_info_residue0 *info=(vorbis_info_residue0 *)i; - if(info){ - memset(info,0,sizeof(*info)); - _ogg_free(info); - } -} - -void res0_free_look(vorbis_look_residue *i){ - int j; - if(i){ - - vorbis_look_residue0 *look=(vorbis_look_residue0 *)i; - -#ifdef TRAIN_RES - { - int j,k,l; - for(j=0;jparts;j++){ - /*fprintf(stderr,"partition %d: ",j);*/ - for(k=0;k<8;k++) - if(look->training_data[k][j]){ - char buffer[80]; - FILE *of; - codebook *statebook=look->partbooks[j][k]; - - /* long and short into the same bucket by current convention */ - sprintf(buffer,"res_sub%d_part%d_pass%d.vqd",look->submap,j,k); - of=fopen(buffer,"a"); - - for(l=0;lentries;l++) - fprintf(of,"%d:%ld\n",l,look->training_data[k][j][l]); - - fclose(of); - - /*fprintf(stderr,"%d(%.2f|%.2f) ",k, - look->training_min[k][j],look->training_max[k][j]);*/ - - _ogg_free(look->training_data[k][j]); - look->training_data[k][j]=NULL; - } - /*fprintf(stderr,"\n");*/ - } - } - fprintf(stderr,"min/max residue: %g::%g\n",look->tmin,look->tmax); - - /*fprintf(stderr,"residue bit usage %f:%f (%f total)\n", - (float)look->phrasebits/look->frames, - (float)look->postbits/look->frames, - (float)(look->postbits+look->phrasebits)/look->frames);*/ -#endif - - - /*vorbis_info_residue0 *info=look->info; - - fprintf(stderr, - "%ld frames encoded in %ld phrasebits and %ld residue bits " - "(%g/frame) \n",look->frames,look->phrasebits, - look->resbitsflat, - (look->phrasebits+look->resbitsflat)/(float)look->frames); - - for(j=0;jparts;j++){ - long acc=0; - fprintf(stderr,"\t[%d] == ",j); - for(k=0;kstages;k++) - if((info->secondstages[j]>>k)&1){ - fprintf(stderr,"%ld,",look->resbits[j][k]); - acc+=look->resbits[j][k]; - } - - fprintf(stderr,":: (%ld vals) %1.2fbits/sample\n",look->resvals[j], - acc?(float)acc/(look->resvals[j]*info->grouping):0); - } - fprintf(stderr,"\n");*/ - - for(j=0;jparts;j++) - if(look->partbooks[j])_ogg_free(look->partbooks[j]); - _ogg_free(look->partbooks); - for(j=0;jpartvals;j++) - _ogg_free(look->decodemap[j]); - _ogg_free(look->decodemap); - - memset(look,0,sizeof(*look)); - _ogg_free(look); - } -} - -static int icount(unsigned int v){ - int ret=0; - while(v){ - ret+=v&1; - v>>=1; - } - return(ret); -} - - -void res0_pack(vorbis_info_residue *vr,oggpack_buffer *opb){ - vorbis_info_residue0 *info=(vorbis_info_residue0 *)vr; - int j,acc=0; - oggpack_write(opb,info->begin,24); - oggpack_write(opb,info->end,24); - - oggpack_write(opb,info->grouping-1,24); /* residue vectors to group and - code with a partitioned book */ - oggpack_write(opb,info->partitions-1,6); /* possible partition choices */ - oggpack_write(opb,info->groupbook,8); /* group huffman book */ - - /* secondstages is a bitmask; as encoding progresses pass by pass, a - bitmask of one indicates this partition class has bits to write - this pass */ - for(j=0;jpartitions;j++){ - if(ov_ilog(info->secondstages[j])>3){ - /* yes, this is a minor hack due to not thinking ahead */ - oggpack_write(opb,info->secondstages[j],3); - oggpack_write(opb,1,1); - oggpack_write(opb,info->secondstages[j]>>3,5); - }else - oggpack_write(opb,info->secondstages[j],4); /* trailing zero */ - acc+=icount(info->secondstages[j]); - } - for(j=0;jbooklist[j],8); - -} - -/* vorbis_info is for range checking */ -vorbis_info_residue *res0_unpack(vorbis_info *vi,oggpack_buffer *opb){ - int j,acc=0; - vorbis_info_residue0 *info=_ogg_calloc(1,sizeof(*info)); - codec_setup_info *ci=vi->codec_setup; - - info->begin=oggpack_read(opb,24); - info->end=oggpack_read(opb,24); - info->grouping=oggpack_read(opb,24)+1; - info->partitions=oggpack_read(opb,6)+1; - info->groupbook=oggpack_read(opb,8); - - /* check for premature EOP */ - if(info->groupbook<0)goto errout; - - for(j=0;jpartitions;j++){ - int cascade=oggpack_read(opb,3); - int cflag=oggpack_read(opb,1); - if(cflag<0) goto errout; - if(cflag){ - int c=oggpack_read(opb,5); - if(c<0) goto errout; - cascade|=(c<<3); - } - info->secondstages[j]=cascade; - - acc+=icount(cascade); - } - for(j=0;jbooklist[j]=book; - } - - if(info->groupbook>=ci->books)goto errout; - for(j=0;jbooklist[j]>=ci->books)goto errout; - if(ci->book_param[info->booklist[j]]->maptype==0)goto errout; - } - - /* verify the phrasebook is not specifying an impossible or - inconsistent partitioning scheme. */ - /* modify the phrasebook ranging check from r16327; an early beta - encoder had a bug where it used an oversized phrasebook by - accident. These files should continue to be playable, but don't - allow an exploit */ - { - int entries = ci->book_param[info->groupbook]->entries; - int dim = ci->book_param[info->groupbook]->dim; - int partvals = 1; - if (dim<1) goto errout; - while(dim>0){ - partvals *= info->partitions; - if(partvals > entries) goto errout; - dim--; - } - info->partvals = partvals; - } - - return(info); - errout: - res0_free_info(info); - return(NULL); -} - -vorbis_look_residue *res0_look(vorbis_dsp_state *vd, - vorbis_info_residue *vr){ - vorbis_info_residue0 *info=(vorbis_info_residue0 *)vr; - vorbis_look_residue0 *look=_ogg_calloc(1,sizeof(*look)); - codec_setup_info *ci=vd->vi->codec_setup; - - int j,k,acc=0; - int dim; - int maxstage=0; - look->info=info; - - look->parts=info->partitions; - look->fullbooks=ci->fullbooks; - look->phrasebook=ci->fullbooks+info->groupbook; - dim=look->phrasebook->dim; - - look->partbooks=_ogg_calloc(look->parts,sizeof(*look->partbooks)); - - for(j=0;jparts;j++){ - int stages=ov_ilog(info->secondstages[j]); - if(stages){ - if(stages>maxstage)maxstage=stages; - look->partbooks[j]=_ogg_calloc(stages,sizeof(*look->partbooks[j])); - for(k=0;ksecondstages[j]&(1<partbooks[j][k]=ci->fullbooks+info->booklist[acc++]; -#ifdef TRAIN_RES - look->training_data[k][j]=_ogg_calloc(look->partbooks[j][k]->entries, - sizeof(***look->training_data)); -#endif - } - } - } - - look->partvals=1; - for(j=0;jpartvals*=look->parts; - - look->stages=maxstage; - look->decodemap=_ogg_malloc(look->partvals*sizeof(*look->decodemap)); - for(j=0;jpartvals;j++){ - long val=j; - long mult=look->partvals/look->parts; - look->decodemap[j]=_ogg_malloc(dim*sizeof(*look->decodemap[j])); - for(k=0;kparts; - look->decodemap[j][k]=deco; - } - } -#if defined(TRAIN_RES) || defined (TRAIN_RESAUX) - { - static int train_seq=0; - look->train_seq=train_seq++; - } -#endif - return(look); -} - -/* break an abstraction and copy some code for performance purposes */ -static int local_book_besterror(codebook *book,int *a){ - int dim=book->dim; - int i,j,o; - int minval=book->minval; - int del=book->delta; - int qv=book->quantvals; - int ze=(qv>>1); - int index=0; - /* assumes integer/centered encoder codebook maptype 1 no more than dim 8 */ - int p[8]={0,0,0,0,0,0,0,0}; - - if(del!=1){ - for(i=0,o=dim;i>1))/del; - int m = (v=qv?qv-1:m)); - p[o]=v*del+minval; - } - }else{ - for(i=0,o=dim;i=qv?qv-1:m)); - p[o]=v*del+minval; - } - } - - if(book->c->lengthlist[index]<=0){ - const static_codebook *c=book->c; - int best=-1; - /* assumes integer/centered encoder codebook maptype 1 no more than dim 8 */ - int e[8]={0,0,0,0,0,0,0,0}; - int maxval = book->minval + book->delta*(book->quantvals-1); - for(i=0;ientries;i++){ - if(c->lengthlist[i]>0){ - int this=0; - for(j=0;j=maxval) - e[j++]=0; - if(e[j]>=0) - e[j]+=book->delta; - e[j]= -e[j]; - } - } - - if(index>-1){ - for(i=0;idim; - int step=n/dim; - - for(i=0;i=0) - acc[entry]++; -#endif - - bits+=vorbis_book_encode(book,entry,opb); - - } - - return(bits); -} - -static long **_01class(vorbis_block *vb,vorbis_look_residue *vl, - int **in,int ch){ - long i,j,k; - vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl; - vorbis_info_residue0 *info=look->info; - - /* move all this setup out later */ - int samples_per_partition=info->grouping; - int possible_partitions=info->partitions; - int n=info->end-info->begin; - - int partvals=n/samples_per_partition; - long **partword=_vorbis_block_alloc(vb,ch*sizeof(*partword)); - float scale=100./samples_per_partition; - - /* we find the partition type for each partition of each - channel. We'll go back and do the interleaved encoding in a - bit. For now, clarity */ - - for(i=0;ibegin; - for(j=0;jmax)max=abs(in[j][offset+k]); - ent+=abs(in[j][offset+k]); - } - ent*=scale; - - for(k=0;kclassmetric1[k] && - (info->classmetric2[k]<0 || entclassmetric2[k])) - break; - - partword[j][i]=k; - } - } - -#ifdef TRAIN_RESAUX - { - FILE *of; - char buffer[80]; - - for(i=0;itrain_seq); - of=fopen(buffer,"a"); - for(j=0;jframes++; - - return(partword); -} - -/* designed for stereo or other modes where the partition size is an - integer multiple of the number of channels encoded in the current - submap */ -static long **_2class(vorbis_block *vb,vorbis_look_residue *vl,int **in, - int ch){ - long i,j,k,l; - vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl; - vorbis_info_residue0 *info=look->info; - - /* move all this setup out later */ - int samples_per_partition=info->grouping; - int possible_partitions=info->partitions; - int n=info->end-info->begin; - - int partvals=n/samples_per_partition; - long **partword=_vorbis_block_alloc(vb,sizeof(*partword)); - -#if defined(TRAIN_RES) || defined (TRAIN_RESAUX) - FILE *of; - char buffer[80]; -#endif - - partword[0]=_vorbis_block_alloc(vb,partvals*sizeof(*partword[0])); - memset(partword[0],0,partvals*sizeof(*partword[0])); - - for(i=0,l=info->begin/ch;imagmax)magmax=abs(in[0][l]); - for(k=1;kangmax)angmax=abs(in[k][l]); - l++; - } - - for(j=0;jclassmetric1[j] && - angmax<=info->classmetric2[j]) - break; - - partword[0][i]=j; - - } - -#ifdef TRAIN_RESAUX - sprintf(buffer,"resaux_%d.vqd",look->train_seq); - of=fopen(buffer,"a"); - for(i=0;iframes++; - - return(partword); -} - -static int _01forward(oggpack_buffer *opb, - vorbis_look_residue *vl, - int **in,int ch, - long **partword, -#ifdef TRAIN_RES - int (*encode)(oggpack_buffer *,int *,int, - codebook *,long *), - int submap -#else - int (*encode)(oggpack_buffer *,int *,int, - codebook *) -#endif -){ - long i,j,k,s; - vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl; - vorbis_info_residue0 *info=look->info; - -#ifdef TRAIN_RES - look->submap=submap; -#endif - - /* move all this setup out later */ - int samples_per_partition=info->grouping; - int possible_partitions=info->partitions; - int partitions_per_word=look->phrasebook->dim; - int n=info->end-info->begin; - - int partvals=n/samples_per_partition; - long resbits[128]; - long resvals[128]; - -#ifdef TRAIN_RES - for(i=0;ibegin;jend;j++){ - if(in[i][j]>look->tmax)look->tmax=in[i][j]; - if(in[i][j]tmin)look->tmin=in[i][j]; - } -#endif - - memset(resbits,0,sizeof(resbits)); - memset(resvals,0,sizeof(resvals)); - - /* we code the partition words for each channel, then the residual - words for a partition per channel until we've written all the - residual words for that partition word. Then write the next - partition channel words... */ - - for(s=0;sstages;s++){ - - for(i=0;iphrasebook->entries) - look->phrasebits+=vorbis_book_encode(look->phrasebook,val,opb); -#if 0 /*def TRAIN_RES*/ - else - fprintf(stderr,"!"); -#endif - - } - } - - /* now we encode interleaved residual values for the partitions */ - for(k=0;kbegin; - - for(j=0;jsecondstages[partword[j][i]]&(1<partbooks[partword[j][i]][s]; - if(statebook){ - int ret; -#ifdef TRAIN_RES - long *accumulator=NULL; - accumulator=look->training_data[s][partword[j][i]]; - { - int l; - int *samples=in[j]+offset; - for(l=0;ltraining_min[s][partword[j][i]]) - look->training_min[s][partword[j][i]]=samples[l]; - if(samples[l]>look->training_max[s][partword[j][i]]) - look->training_max[s][partword[j][i]]=samples[l]; - } - } - ret=encode(opb,in[j]+offset,samples_per_partition, - statebook,accumulator); -#else - ret=encode(opb,in[j]+offset,samples_per_partition, - statebook); -#endif - - look->postbits+=ret; - resbits[partword[j][i]]+=ret; - } - } - } - } - } - } - - return(0); -} - -/* a truncated packet here just means 'stop working'; it's not an error */ -static int _01inverse(vorbis_block *vb,vorbis_look_residue *vl, - float **in,int ch, - long (*decodepart)(codebook *, float *, - oggpack_buffer *,int)){ - - long i,j,k,l,s; - vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl; - vorbis_info_residue0 *info=look->info; - - /* move all this setup out later */ - int samples_per_partition=info->grouping; - int partitions_per_word=look->phrasebook->dim; - int max=vb->pcmend>>1; - int end=(info->endend:max); - int n=end-info->begin; - - if(n>0){ - int partvals=n/samples_per_partition; - int partwords=(partvals+partitions_per_word-1)/partitions_per_word; - int ***partword=alloca(ch*sizeof(*partword)); - - for(j=0;jstages;s++){ - - /* each loop decodes on partition codeword containing - partitions_per_word partitions */ - for(i=0,l=0;iphrasebook,&vb->opb); - - if(temp==-1 || temp>=info->partvals)goto eopbreak; - partword[j][l]=look->decodemap[temp]; - if(partword[j][l]==NULL)goto errout; - } - } - - /* now we decode residual values for the partitions */ - for(k=0;kbegin+i*samples_per_partition; - if(info->secondstages[partword[j][l][k]]&(1<partbooks[partword[j][l][k]][s]; - if(stagebook){ - if(decodepart(stagebook,in[j]+offset,&vb->opb, - samples_per_partition)==-1)goto eopbreak; - } - } - } - } - } - } - errout: - eopbreak: - return(0); -} - -int res0_inverse(vorbis_block *vb,vorbis_look_residue *vl, - float **in,int *nonzero,int ch){ - int i,used=0; - for(i=0;ipcmend/2,used=0; - - /* don't duplicate the code; use a working vector hack for now and - reshape ourselves into a single channel res1 */ - /* ugly; reallocs for each coupling pass :-( */ - int *work=_vorbis_block_alloc(vb,ch*n*sizeof(*work)); - for(i=0;iinfo; - - /* move all this setup out later */ - int samples_per_partition=info->grouping; - int partitions_per_word=look->phrasebook->dim; - int max=(vb->pcmend*ch)>>1; - int end=(info->endend:max); - int n=end-info->begin; - - if(n>0){ - int partvals=n/samples_per_partition; - int partwords=(partvals+partitions_per_word-1)/partitions_per_word; - int **partword=_vorbis_block_alloc(vb,partwords*sizeof(*partword)); - - for(i=0;istages;s++){ - for(i=0,l=0;iphrasebook,&vb->opb); - if(temp==-1 || temp>=info->partvals)goto eopbreak; - partword[l]=look->decodemap[temp]; - if(partword[l]==NULL)goto errout; - } - - /* now we decode residual values for the partitions */ - for(k=0;ksecondstages[partword[l][k]]&(1<partbooks[partword[l][k]][s]; - - if(stagebook){ - if(vorbis_book_decodevv_add(stagebook,in, - i*samples_per_partition+info->begin,ch, - &vb->opb,samples_per_partition)==-1) - goto eopbreak; - } - } - } - } - } - errout: - eopbreak: - return(0); -} - - -const vorbis_func_residue residue0_exportbundle={ - NULL, - &res0_unpack, - &res0_look, - &res0_free_info, - &res0_free_look, - NULL, - NULL, - &res0_inverse -}; - -const vorbis_func_residue residue1_exportbundle={ - &res0_pack, - &res0_unpack, - &res0_look, - &res0_free_info, - &res0_free_look, - &res1_class, - &res1_forward, - &res1_inverse -}; - -const vorbis_func_residue residue2_exportbundle={ - &res0_pack, - &res0_unpack, - &res0_look, - &res0_free_info, - &res0_free_look, - &res2_class, - &res2_forward, - &res2_inverse -}; diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/scales.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/scales.h deleted file mode 100644 index 613f796e..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/scales.h +++ /dev/null @@ -1,90 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: linear scale -> dB, Bark and Mel scales - last mod: $Id: scales.h 16227 2009-07-08 06:58:46Z xiphmont $ - - ********************************************************************/ - -#ifndef _V_SCALES_H_ -#define _V_SCALES_H_ - -#include -#include "os.h" - -#ifdef _MSC_VER -/* MS Visual Studio doesn't have C99 inline keyword. */ -#define inline __inline -#endif - -/* 20log10(x) */ -#define VORBIS_IEEE_FLOAT32 1 -#ifdef VORBIS_IEEE_FLOAT32 - -static inline float unitnorm(float x){ - union { - ogg_uint32_t i; - float f; - } ix; - ix.f = x; - ix.i = (ix.i & 0x80000000U) | (0x3f800000U); - return ix.f; -} - -/* Segher was off (too high) by ~ .3 decibel. Center the conversion correctly. */ -static inline float todB(const float *x){ - union { - ogg_uint32_t i; - float f; - } ix; - ix.f = *x; - ix.i = ix.i&0x7fffffff; - return (float)(ix.i * 7.17711438e-7f -764.6161886f); -} - -#define todB_nn(x) todB(x) - -#else - -static float unitnorm(float x){ - if(x<0)return(-1.f); - return(1.f); -} - -#define todB(x) (*(x)==0?-400.f:log(*(x)**(x))*4.34294480f) -#define todB_nn(x) (*(x)==0.f?-400.f:log(*(x))*8.6858896f) - -#endif - -#define fromdB(x) (exp((x)*.11512925f)) - -/* The bark scale equations are approximations, since the original - table was somewhat hand rolled. The below are chosen to have the - best possible fit to the rolled tables, thus their somewhat odd - appearance (these are more accurate and over a longer range than - the oft-quoted bark equations found in the texts I have). The - approximations are valid from 0 - 30kHz (nyquist) or so. - - all f in Hz, z in Bark */ - -#define toBARK(n) (13.1f*atan(.00074f*(n))+2.24f*atan((n)*(n)*1.85e-8f)+1e-4f*(n)) -#define fromBARK(z) (102.f*(z)-2.f*pow(z,2.f)+.4f*pow(z,3.f)+pow(1.46f,z)-1.f) -#define toMEL(n) (log(1.f+(n)*.001f)*1442.695f) -#define fromMEL(m) (1000.f*exp((m)/1442.695f)-1000.f) - -/* Frequency to octave. We arbitrarily declare 63.5 Hz to be octave - 0.0 */ - -#define toOC(n) (log(n)*1.442695f-5.965784f) -#define fromOC(o) (exp(((o)+5.965784f)*.693147f)) - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/sharedbook.c b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/sharedbook.c deleted file mode 100644 index 0aa08c63..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/sharedbook.c +++ /dev/null @@ -1,588 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2015 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: basic shared codebook operations - last mod: $Id: sharedbook.c 19457 2015-03-03 00:15:29Z giles $ - - ********************************************************************/ - -#include -#include -#include -#include -#include "os.h" -#include "misc.h" -#include "vorbis/codec.h" -#include "codebook.h" -#include "scales.h" - -/**** pack/unpack helpers ******************************************/ - -int ov_ilog(ogg_uint32_t v){ - int ret; - for(ret=0;v;ret++)v>>=1; - return ret; -} - -/* 32 bit float (not IEEE; nonnormalized mantissa + - biased exponent) : neeeeeee eeemmmmm mmmmmmmm mmmmmmmm - Why not IEEE? It's just not that important here. */ - -#define VQ_FEXP 10 -#define VQ_FMAN 21 -#define VQ_FEXP_BIAS 768 /* bias toward values smaller than 1. */ - -/* doesn't currently guard under/overflow */ -long _float32_pack(float val){ - int sign=0; - long exp; - long mant; - if(val<0){ - sign=0x80000000; - val= -val; - } - exp= floor(log(val)/log(2.f)+.001); //+epsilon - mant=rint(ldexp(val,(VQ_FMAN-1)-exp)); - exp=(exp+VQ_FEXP_BIAS)<>VQ_FMAN; - if(sign)mant= -mant; - return(ldexp(mant,exp-(VQ_FMAN-1)-VQ_FEXP_BIAS)); -} - -/* given a list of word lengths, generate a list of codewords. Works - for length ordered or unordered, always assigns the lowest valued - codewords first. Extended to handle unused entries (length 0) */ -ogg_uint32_t *_make_words(char *l,long n,long sparsecount){ - long i,j,count=0; - ogg_uint32_t marker[33]; - ogg_uint32_t *r=_ogg_malloc((sparsecount?sparsecount:n)*sizeof(*r)); - memset(marker,0,sizeof(marker)); - - for(i=0;i0){ - ogg_uint32_t entry=marker[length]; - - /* when we claim a node for an entry, we also claim the nodes - below it (pruning off the imagined tree that may have dangled - from it) as well as blocking the use of any nodes directly - above for leaves */ - - /* update ourself */ - if(length<32 && (entry>>length)){ - /* error condition; the lengths must specify an overpopulated tree */ - _ogg_free(r); - return(NULL); - } - r[count++]=entry; - - /* Look to see if the next shorter marker points to the node - above. if so, update it and repeat. */ - { - for(j=length;j>0;j--){ - - if(marker[j]&1){ - /* have to jump branches */ - if(j==1) - marker[1]++; - else - marker[j]=marker[j-1]<<1; - break; /* invariant says next upper marker would already - have been moved if it was on the same path */ - } - marker[j]++; - } - } - - /* prune the tree; the implicit invariant says all the longer - markers were dangling from our just-taken node. Dangle them - from our *new* node. */ - for(j=length+1;j<33;j++) - if((marker[j]>>1) == entry){ - entry=marker[j]; - marker[j]=marker[j-1]<<1; - }else - break; - }else - if(sparsecount==0)count++; - } - - /* any underpopulated tree must be rejected. */ - /* Single-entry codebooks are a retconned extension to the spec. - They have a single codeword '0' of length 1 that results in an - underpopulated tree. Shield that case from the underformed tree check. */ - if(!(count==1 && marker[2]==2)){ - for(i=1;i<33;i++) - if(marker[i] & (0xffffffffUL>>(32-i))){ - _ogg_free(r); - return(NULL); - } - } - - /* bitreverse the words because our bitwise packer/unpacker is LSb - endian */ - for(i=0,count=0;i>j)&1; - } - - if(sparsecount){ - if(l[i]) - r[count++]=temp; - }else - r[count++]=temp; - } - - return(r); -} - -/* there might be a straightforward one-line way to do the below - that's portable and totally safe against roundoff, but I haven't - thought of it. Therefore, we opt on the side of caution */ -long _book_maptype1_quantvals(const static_codebook *b){ - long vals=floor(pow((float)b->entries,1.f/b->dim)); - - /* the above *should* be reliable, but we'll not assume that FP is - ever reliable when bitstream sync is at stake; verify via integer - means that vals really is the greatest value of dim for which - vals^b->bim <= b->entries */ - /* treat the above as an initial guess */ - while(1){ - long acc=1; - long acc1=1; - int i; - for(i=0;idim;i++){ - acc*=vals; - acc1*=vals+1; - } - if(acc<=b->entries && acc1>b->entries){ - return(vals); - }else{ - if(acc>b->entries){ - vals--; - }else{ - vals++; - } - } - } -} - -/* unpack the quantized list of values for encode/decode ***********/ -/* we need to deal with two map types: in map type 1, the values are - generated algorithmically (each column of the vector counts through - the values in the quant vector). in map type 2, all the values came - in in an explicit list. Both value lists must be unpacked */ -float *_book_unquantize(const static_codebook *b,int n,int *sparsemap){ - long j,k,count=0; - if(b->maptype==1 || b->maptype==2){ - int quantvals; - float mindel=_float32_unpack(b->q_min); - float delta=_float32_unpack(b->q_delta); - float *r=_ogg_calloc(n*b->dim,sizeof(*r)); - - /* maptype 1 and 2 both use a quantized value vector, but - different sizes */ - switch(b->maptype){ - case 1: - /* most of the time, entries%dimensions == 0, but we need to be - well defined. We define that the possible vales at each - scalar is values == entries/dim. If entries%dim != 0, we'll - have 'too few' values (values*dimentries;j++){ - if((sparsemap && b->lengthlist[j]) || !sparsemap){ - float last=0.f; - int indexdiv=1; - for(k=0;kdim;k++){ - int index= (j/indexdiv)%quantvals; - float val=b->quantlist[index]; - val=fabs(val)*delta+mindel+last; - if(b->q_sequencep)last=val; - if(sparsemap) - r[sparsemap[count]*b->dim+k]=val; - else - r[count*b->dim+k]=val; - indexdiv*=quantvals; - } - count++; - } - - } - break; - case 2: - for(j=0;jentries;j++){ - if((sparsemap && b->lengthlist[j]) || !sparsemap){ - float last=0.f; - - for(k=0;kdim;k++){ - float val=b->quantlist[j*b->dim+k]; - val=fabs(val)*delta+mindel+last; - if(b->q_sequencep)last=val; - if(sparsemap) - r[sparsemap[count]*b->dim+k]=val; - else - r[count*b->dim+k]=val; - } - count++; - } - } - break; - } - - return(r); - } - return(NULL); -} - -void vorbis_staticbook_destroy(static_codebook *b){ - if(b->allocedp){ - if(b->quantlist)_ogg_free(b->quantlist); - if(b->lengthlist)_ogg_free(b->lengthlist); - memset(b,0,sizeof(*b)); - _ogg_free(b); - } /* otherwise, it is in static memory */ -} - -void vorbis_book_clear(codebook *b){ - /* static book is not cleared; we're likely called on the lookup and - the static codebook belongs to the info struct */ - if(b->valuelist)_ogg_free(b->valuelist); - if(b->codelist)_ogg_free(b->codelist); - - if(b->dec_index)_ogg_free(b->dec_index); - if(b->dec_codelengths)_ogg_free(b->dec_codelengths); - if(b->dec_firsttable)_ogg_free(b->dec_firsttable); - - memset(b,0,sizeof(*b)); -} - -int vorbis_book_init_encode(codebook *c,const static_codebook *s){ - - memset(c,0,sizeof(*c)); - c->c=s; - c->entries=s->entries; - c->used_entries=s->entries; - c->dim=s->dim; - c->codelist=_make_words(s->lengthlist,s->entries,0); - //c->valuelist=_book_unquantize(s,s->entries,NULL); - c->quantvals=_book_maptype1_quantvals(s); - c->minval=(int)rint(_float32_unpack(s->q_min)); - c->delta=(int)rint(_float32_unpack(s->q_delta)); - - return(0); -} - -/* -static ogg_uint32_t bitreverse(ogg_uint32_t x){ - x= ((x>>16)&0x0000ffffUL) | ((x<<16)&0xffff0000UL); - x= ((x>> 8)&0x00ff00ffUL) | ((x<< 8)&0xff00ff00UL); - x= ((x>> 4)&0x0f0f0f0fUL) | ((x<< 4)&0xf0f0f0f0UL); - x= ((x>> 2)&0x33333333UL) | ((x<< 2)&0xccccccccUL); - return((x>> 1)&0x55555555UL) | ((x<< 1)&0xaaaaaaaaUL); -} -*/ - -static int sort32a(const void *a,const void *b){ - return ( **(ogg_uint32_t **)a>**(ogg_uint32_t **)b)- - ( **(ogg_uint32_t **)a<**(ogg_uint32_t **)b); -} - -/* decode codebook arrangement is more heavily optimized than encode */ -int vorbis_book_init_decode(codebook *c,const static_codebook *s){ - int i,j,n=0,tabn; - int *sortindex; - - memset(c,0,sizeof(*c)); - - /* count actually used entries and find max length */ - for(i=0;ientries;i++) - if(s->lengthlist[i]>0) - n++; - - c->entries=s->entries; - c->used_entries=n; - c->dim=s->dim; - - if(n>0){ - /* two different remappings go on here. - - First, we collapse the likely sparse codebook down only to - actually represented values/words. This collapsing needs to be - indexed as map-valueless books are used to encode original entry - positions as integers. - - Second, we reorder all vectors, including the entry index above, - by sorted bitreversed codeword to allow treeless decode. */ - - /* perform sort */ - ogg_uint32_t *codes=_make_words(s->lengthlist,s->entries,c->used_entries); - ogg_uint32_t **codep=alloca(sizeof(*codep)*n); - - if(codes==NULL)goto err_out; - - for(i=0;icodelist=_ogg_malloc(n*sizeof(*c->codelist)); - /* the index is a reverse index */ - for(i=0;icodelist[sortindex[i]]=codes[i]; - _ogg_free(codes); - - c->valuelist=_book_unquantize(s,n,sortindex); - c->dec_index=_ogg_malloc(n*sizeof(*c->dec_index)); - - for(n=0,i=0;ientries;i++) - if(s->lengthlist[i]>0) - c->dec_index[sortindex[n++]]=i; - - c->dec_codelengths=_ogg_malloc(n*sizeof(*c->dec_codelengths)); - c->dec_maxlength=0; - for(n=0,i=0;ientries;i++) - if(s->lengthlist[i]>0){ - c->dec_codelengths[sortindex[n++]]=s->lengthlist[i]; - if(s->lengthlist[i]>c->dec_maxlength) - c->dec_maxlength=s->lengthlist[i]; - } - - if(n==1 && c->dec_maxlength==1){ - /* special case the 'single entry codebook' with a single bit - fastpath table (that always returns entry 0 )in order to use - unmodified decode paths. */ - c->dec_firsttablen=1; - c->dec_firsttable=_ogg_calloc(2,sizeof(*c->dec_firsttable)); - c->dec_firsttable[0]=c->dec_firsttable[1]=1; - - }else{ - c->dec_firsttablen=ov_ilog(c->used_entries)-4; /* this is magic */ - if(c->dec_firsttablen<5)c->dec_firsttablen=5; - if(c->dec_firsttablen>8)c->dec_firsttablen=8; - - tabn=1<dec_firsttablen; - c->dec_firsttable=_ogg_calloc(tabn,sizeof(*c->dec_firsttable)); - - for(i=0;idec_codelengths[i]<=c->dec_firsttablen){ - ogg_uint32_t orig=bitreverse(c->codelist[i]); - for(j=0;j<(1<<(c->dec_firsttablen-c->dec_codelengths[i]));j++) - c->dec_firsttable[orig|(j<dec_codelengths[i])]=i+1; - } - } - - /* now fill in 'unused' entries in the firsttable with hi/lo search - hints for the non-direct-hits */ - { - ogg_uint32_t mask=0xfffffffeUL<<(31-c->dec_firsttablen); - long lo=0,hi=0; - - for(i=0;idec_firsttablen); - if(c->dec_firsttable[bitreverse(word)]==0){ - while((lo+1)codelist[lo+1]<=word)lo++; - while( hi=(c->codelist[hi]&mask))hi++; - - /* we only actually have 15 bits per hint to play with here. - In order to overflow gracefully (nothing breaks, efficiency - just drops), encode as the difference from the extremes. */ - { - unsigned long loval=lo; - unsigned long hival=n-hi; - - if(loval>0x7fff)loval=0x7fff; - if(hival>0x7fff)hival=0x7fff; - c->dec_firsttable[bitreverse(word)]= - 0x80000000UL | (loval<<15) | hival; - } - } - } - } - } - } - - return(0); - err_out: - vorbis_book_clear(c); - return(-1); -} - -long vorbis_book_codeword(codebook *book,int entry){ - if(book->c) /* only use with encode; decode optimizations are - allowed to break this */ - return book->codelist[entry]; - return -1; -} - -long vorbis_book_codelen(codebook *book,int entry){ - if(book->c) /* only use with encode; decode optimizations are - allowed to break this */ - return book->c->lengthlist[entry]; - return -1; -} - -#ifdef _V_SELFTEST - -/* Unit tests of the dequantizer; this stuff will be OK - cross-platform, I simply want to be sure that special mapping cases - actually work properly; a bug could go unnoticed for a while */ - -#include - -/* cases: - - no mapping - full, explicit mapping - algorithmic mapping - - nonsequential - sequential -*/ - -static long full_quantlist1[]={0,1,2,3, 4,5,6,7, 8,3,6,1}; -static long partial_quantlist1[]={0,7,2}; - -/* no mapping */ -static_codebook test1={ - 4,16, - NULL, - 0, - 0,0,0,0, - NULL, - 0 -}; -static float *test1_result=NULL; - -/* linear, full mapping, nonsequential */ -static_codebook test2={ - 4,3, - NULL, - 2, - -533200896,1611661312,4,0, - full_quantlist1, - 0 -}; -static float test2_result[]={-3,-2,-1,0, 1,2,3,4, 5,0,3,-2}; - -/* linear, full mapping, sequential */ -static_codebook test3={ - 4,3, - NULL, - 2, - -533200896,1611661312,4,1, - full_quantlist1, - 0 -}; -static float test3_result[]={-3,-5,-6,-6, 1,3,6,10, 5,5,8,6}; - -/* linear, algorithmic mapping, nonsequential */ -static_codebook test4={ - 3,27, - NULL, - 1, - -533200896,1611661312,4,0, - partial_quantlist1, - 0 -}; -static float test4_result[]={-3,-3,-3, 4,-3,-3, -1,-3,-3, - -3, 4,-3, 4, 4,-3, -1, 4,-3, - -3,-1,-3, 4,-1,-3, -1,-1,-3, - -3,-3, 4, 4,-3, 4, -1,-3, 4, - -3, 4, 4, 4, 4, 4, -1, 4, 4, - -3,-1, 4, 4,-1, 4, -1,-1, 4, - -3,-3,-1, 4,-3,-1, -1,-3,-1, - -3, 4,-1, 4, 4,-1, -1, 4,-1, - -3,-1,-1, 4,-1,-1, -1,-1,-1}; - -/* linear, algorithmic mapping, sequential */ -static_codebook test5={ - 3,27, - NULL, - 1, - -533200896,1611661312,4,1, - partial_quantlist1, - 0 -}; -static float test5_result[]={-3,-6,-9, 4, 1,-2, -1,-4,-7, - -3, 1,-2, 4, 8, 5, -1, 3, 0, - -3,-4,-7, 4, 3, 0, -1,-2,-5, - -3,-6,-2, 4, 1, 5, -1,-4, 0, - -3, 1, 5, 4, 8,12, -1, 3, 7, - -3,-4, 0, 4, 3, 7, -1,-2, 2, - -3,-6,-7, 4, 1, 0, -1,-4,-5, - -3, 1, 0, 4, 8, 7, -1, 3, 2, - -3,-4,-5, 4, 3, 2, -1,-2,-3}; - -void run_test(static_codebook *b,float *comp){ - float *out=_book_unquantize(b,b->entries,NULL); - int i; - - if(comp){ - if(!out){ - fprintf(stderr,"_book_unquantize incorrectly returned NULL\n"); - exit(1); - } - - for(i=0;ientries*b->dim;i++) - if(fabs(out[i]-comp[i])>.0001){ - fprintf(stderr,"disagreement in unquantized and reference data:\n" - "position %d, %g != %g\n",i,out[i],comp[i]); - exit(1); - } - - }else{ - if(out){ - fprintf(stderr,"_book_unquantize returned a value array: \n" - " correct result should have been NULL\n"); - exit(1); - } - } -} - -int main(){ - /* run the nine dequant tests, and compare to the hand-rolled results */ - fprintf(stderr,"Dequant test 1... "); - run_test(&test1,test1_result); - fprintf(stderr,"OK\nDequant test 2... "); - run_test(&test2,test2_result); - fprintf(stderr,"OK\nDequant test 3... "); - run_test(&test3,test3_result); - fprintf(stderr,"OK\nDequant test 4... "); - run_test(&test4,test4_result); - fprintf(stderr,"OK\nDequant test 5... "); - run_test(&test5,test5_result); - fprintf(stderr,"OK\n\n"); - - return(0); -} - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/smallft.c b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/smallft.c deleted file mode 100644 index ae2bc41b..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/smallft.c +++ /dev/null @@ -1,1255 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: *unnormalized* fft transform - last mod: $Id: smallft.c 16227 2009-07-08 06:58:46Z xiphmont $ - - ********************************************************************/ - -/* FFT implementation from OggSquish, minus cosine transforms, - * minus all but radix 2/4 case. In Vorbis we only need this - * cut-down version. - * - * To do more than just power-of-two sized vectors, see the full - * version I wrote for NetLib. - * - * Note that the packing is a little strange; rather than the FFT r/i - * packing following R_0, I_n, R_1, I_1, R_2, I_2 ... R_n-1, I_n-1, - * it follows R_0, R_1, I_1, R_2, I_2 ... R_n-1, I_n-1, I_n like the - * FORTRAN version - */ - -#include -#include -#include -#include "smallft.h" -#include "os.h" -#include "misc.h" - -static void drfti1(int n, float *wa, int *ifac){ - static int ntryh[4] = { 4,2,3,5 }; - static float tpi = 6.28318530717958648f; - float arg,argh,argld,fi; - int ntry=0,i,j=-1; - int k1, l1, l2, ib; - int ld, ii, ip, is, nq, nr; - int ido, ipm, nfm1; - int nl=n; - int nf=0; - - L101: - j++; - if (j < 4) - ntry=ntryh[j]; - else - ntry+=2; - - L104: - nq=nl/ntry; - nr=nl-ntry*nq; - if (nr!=0) goto L101; - - nf++; - ifac[nf+1]=ntry; - nl=nq; - if(ntry!=2)goto L107; - if(nf==1)goto L107; - - for (i=1;i>1; - ipp2=ip; - idp2=ido; - nbd=(ido-1)>>1; - t0=l1*ido; - t10=ip*ido; - - if(ido==1)goto L119; - for(ik=0;ikl1){ - for(j=1;j>1; - ipp2=ip; - ipph=(ip+1)>>1; - if(idol1)goto L139; - - is= -ido-1; - t1=0; - for(j=1;jn==1)return; - drftf1(l->n,data,l->trigcache,l->trigcache+l->n,l->splitcache); -} - -void drft_backward(drft_lookup *l,float *data){ - if (l->n==1)return; - drftb1(l->n,data,l->trigcache,l->trigcache+l->n,l->splitcache); -} - -void drft_init(drft_lookup *l,int n){ - l->n=n; - l->trigcache=_ogg_calloc(3*n,sizeof(*l->trigcache)); - l->splitcache=_ogg_calloc(32,sizeof(*l->splitcache)); - fdrffti(n, l->trigcache, l->splitcache); -} - -void drft_clear(drft_lookup *l){ - if(l){ - if(l->trigcache)_ogg_free(l->trigcache); - if(l->splitcache)_ogg_free(l->splitcache); - memset(l,0,sizeof(*l)); - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/smallft.h b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/smallft.h deleted file mode 100644 index 45649732..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/smallft.h +++ /dev/null @@ -1,34 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: fft transform - last mod: $Id: smallft.h 13293 2007-07-24 00:09:47Z xiphmont $ - - ********************************************************************/ - -#ifndef _V_SMFT_H_ -#define _V_SMFT_H_ - -#include "vorbis/codec.h" - -typedef struct { - int n; - float *trigcache; - int *splitcache; -} drft_lookup; - -extern void drft_forward(drft_lookup *l,float *data); -extern void drft_backward(drft_lookup *l,float *data); -extern void drft_init(drft_lookup *l,int n); -extern void drft_clear(drft_lookup *l); - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/synthesis.c b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/synthesis.c deleted file mode 100644 index 932d271a..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/synthesis.c +++ /dev/null @@ -1,180 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2015 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: single-block PCM synthesis - last mod: $Id: synthesis.c 19441 2015-01-21 01:17:41Z xiphmont $ - - ********************************************************************/ - -#include -#include -#include "vorbis/codec.h" -#include "codec_internal.h" -#include "registry.h" -#include "misc.h" -#include "os.h" - -int vorbis_synthesis(vorbis_block *vb,ogg_packet *op){ - vorbis_dsp_state *vd= vb ? vb->vd : 0; - private_state *b= vd ? vd->backend_state : 0; - vorbis_info *vi= vd ? vd->vi : 0; - codec_setup_info *ci= vi ? vi->codec_setup : 0; - oggpack_buffer *opb=vb ? &vb->opb : 0; - int type,mode,i; - - if (!vd || !b || !vi || !ci || !opb) { - return OV_EBADPACKET; - } - - /* first things first. Make sure decode is ready */ - _vorbis_block_ripcord(vb); - oggpack_readinit(opb,op->packet,op->bytes); - - /* Check the packet type */ - if(oggpack_read(opb,1)!=0){ - /* Oops. This is not an audio data packet */ - return(OV_ENOTAUDIO); - } - - /* read our mode and pre/post windowsize */ - mode=oggpack_read(opb,b->modebits); - if(mode==-1){ - return(OV_EBADPACKET); - } - - vb->mode=mode; - if(!ci->mode_param[mode]){ - return(OV_EBADPACKET); - } - - vb->W=ci->mode_param[mode]->blockflag; - if(vb->W){ - - /* this doesn;t get mapped through mode selection as it's used - only for window selection */ - vb->lW=oggpack_read(opb,1); - vb->nW=oggpack_read(opb,1); - if(vb->nW==-1){ - return(OV_EBADPACKET); - } - }else{ - vb->lW=0; - vb->nW=0; - } - - /* more setup */ - vb->granulepos=op->granulepos; - vb->sequence=op->packetno; - vb->eofflag=op->e_o_s; - - /* alloc pcm passback storage */ - vb->pcmend=ci->blocksizes[vb->W]; - vb->pcm=_vorbis_block_alloc(vb,sizeof(*vb->pcm)*vi->channels); - for(i=0;ichannels;i++) - vb->pcm[i]=_vorbis_block_alloc(vb,vb->pcmend*sizeof(*vb->pcm[i])); - - /* unpack_header enforces range checking */ - type=ci->map_type[ci->mode_param[mode]->mapping]; - - return(_mapping_P[type]->inverse(vb,ci->map_param[ci->mode_param[mode]-> - mapping])); -} - -/* used to track pcm position without actually performing decode. - Useful for sequential 'fast forward' */ -int vorbis_synthesis_trackonly(vorbis_block *vb,ogg_packet *op){ - vorbis_dsp_state *vd=vb->vd; - private_state *b=vd->backend_state; - vorbis_info *vi=vd->vi; - codec_setup_info *ci=vi->codec_setup; - oggpack_buffer *opb=&vb->opb; - int mode; - - /* first things first. Make sure decode is ready */ - _vorbis_block_ripcord(vb); - oggpack_readinit(opb,op->packet,op->bytes); - - /* Check the packet type */ - if(oggpack_read(opb,1)!=0){ - /* Oops. This is not an audio data packet */ - return(OV_ENOTAUDIO); - } - - /* read our mode and pre/post windowsize */ - mode=oggpack_read(opb,b->modebits); - if(mode==-1)return(OV_EBADPACKET); - - vb->mode=mode; - if(!ci->mode_param[mode]){ - return(OV_EBADPACKET); - } - - vb->W=ci->mode_param[mode]->blockflag; - if(vb->W){ - vb->lW=oggpack_read(opb,1); - vb->nW=oggpack_read(opb,1); - if(vb->nW==-1) return(OV_EBADPACKET); - }else{ - vb->lW=0; - vb->nW=0; - } - - /* more setup */ - vb->granulepos=op->granulepos; - vb->sequence=op->packetno; - vb->eofflag=op->e_o_s; - - /* no pcm */ - vb->pcmend=0; - vb->pcm=NULL; - - return(0); -} - -long vorbis_packet_blocksize(vorbis_info *vi,ogg_packet *op){ - codec_setup_info *ci=vi->codec_setup; - oggpack_buffer opb; - int mode; - - if(ci==NULL || ci->modes<=0){ - /* codec setup not properly intialized */ - return(OV_EFAULT); - } - - oggpack_readinit(&opb,op->packet,op->bytes); - - /* Check the packet type */ - if(oggpack_read(&opb,1)!=0){ - /* Oops. This is not an audio data packet */ - return(OV_ENOTAUDIO); - } - - /* read our mode and pre/post windowsize */ - mode=oggpack_read(&opb,ov_ilog(ci->modes-1)); - if(mode==-1 || !ci->mode_param[mode])return(OV_EBADPACKET); - return(ci->blocksizes[ci->mode_param[mode]->blockflag]); -} - -int vorbis_synthesis_halfrate(vorbis_info *vi,int flag){ - /* set / clear half-sample-rate mode */ - codec_setup_info *ci=vi->codec_setup; - - /* right now, our MDCT can't handle < 64 sample windows. */ - if(ci->blocksizes[0]<=64 && flag)return -1; - ci->halfrate_flag=(flag?1:0); - return 0; -} - -int vorbis_synthesis_halfrate_p(vorbis_info *vi){ - codec_setup_info *ci=vi->codec_setup; - return ci->halfrate_flag; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/tone.c b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/tone.c deleted file mode 100644 index 73afc67d..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/tone.c +++ /dev/null @@ -1,54 +0,0 @@ -#include -#include -#include -#include - -void usage(){ - fprintf(stderr,"tone ,[] [,[]...]\n"); - exit(1); -} - -int main (int argc,char *argv[]){ - int i,j; - double *f; - double *amp; - - if(argc<2)usage(); - - f=alloca(sizeof(*f)*(argc-1)); - amp=alloca(sizeof(*amp)*(argc-1)); - - i=0; - while(argv[i+1]){ - char *pos=strchr(argv[i+1],','); - - f[i]=atof(argv[i+1]); - if(pos) - amp[i]=atof(pos+1)*32767.f; - else - amp[i]=32767.f; - - fprintf(stderr,"%g Hz, %g amp\n",f[i],amp[i]); - - i++; - } - - for(i=0;i<44100*10;i++){ - float val=0; - int ival; - for(j=0;j32767.f)ival=32767.f; - if(ival<-32768.f)ival=-32768.f; - - fprintf(stdout,"%c%c%c%c", - (char)(ival&0xff), - (char)((ival>>8)&0xff), - (char)(ival&0xff), - (char)((ival>>8)&0xff)); - } - return(0); -} - diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/vorbisenc.c b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/vorbisenc.c deleted file mode 100644 index b5d621e9..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/vorbisenc.c +++ /dev/null @@ -1,1224 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2015 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: simple programmatic interface for encoder mode setup - last mod: $Id: vorbisenc.c 19457 2015-03-03 00:15:29Z giles $ - - ********************************************************************/ - -#include -#include -#include - -#include "vorbis/codec.h" -#include "vorbis/vorbisenc.h" - -#include "codec_internal.h" - -#include "os.h" -#include "misc.h" - -/* careful with this; it's using static array sizing to make managing - all the modes a little less annoying. If we use a residue backend - with > 12 partition types, or a different division of iteration, - this needs to be updated. */ -typedef struct { - const static_codebook *books[12][4]; -} static_bookblock; - -typedef struct { - int res_type; - int limit_type; /* 0 lowpass limited, 1 point stereo limited */ - int grouping; - const vorbis_info_residue0 *res; - const static_codebook *book_aux; - const static_codebook *book_aux_managed; - const static_bookblock *books_base; - const static_bookblock *books_base_managed; -} vorbis_residue_template; - -typedef struct { - const vorbis_info_mapping0 *map; - const vorbis_residue_template *res; -} vorbis_mapping_template; - -typedef struct vp_adjblock{ - int block[P_BANDS]; -} vp_adjblock; - -typedef struct { - int data[NOISE_COMPAND_LEVELS]; -} compandblock; - -/* high level configuration information for setting things up - step-by-step with the detailed vorbis_encode_ctl interface. - There's a fair amount of redundancy such that interactive setup - does not directly deal with any vorbis_info or codec_setup_info - initialization; it's all stored (until full init) in this highlevel - setup, then flushed out to the real codec setup structs later. */ - -typedef struct { - int att[P_NOISECURVES]; - float boost; - float decay; -} att3; -typedef struct { int data[P_NOISECURVES]; } adj3; - -typedef struct { - int pre[PACKETBLOBS]; - int post[PACKETBLOBS]; - float kHz[PACKETBLOBS]; - float lowpasskHz[PACKETBLOBS]; -} adj_stereo; - -typedef struct { - int lo; - int hi; - int fixed; -} noiseguard; -typedef struct { - int data[P_NOISECURVES][17]; -} noise3; - -typedef struct { - int mappings; - const double *rate_mapping; - const double *quality_mapping; - int coupling_restriction; - long samplerate_min_restriction; - long samplerate_max_restriction; - - - const int *blocksize_short; - const int *blocksize_long; - - const att3 *psy_tone_masteratt; - const int *psy_tone_0dB; - const int *psy_tone_dBsuppress; - - const vp_adjblock *psy_tone_adj_impulse; - const vp_adjblock *psy_tone_adj_long; - const vp_adjblock *psy_tone_adj_other; - - const noiseguard *psy_noiseguards; - const noise3 *psy_noise_bias_impulse; - const noise3 *psy_noise_bias_padding; - const noise3 *psy_noise_bias_trans; - const noise3 *psy_noise_bias_long; - const int *psy_noise_dBsuppress; - - const compandblock *psy_noise_compand; - const double *psy_noise_compand_short_mapping; - const double *psy_noise_compand_long_mapping; - - const int *psy_noise_normal_start[2]; - const int *psy_noise_normal_partition[2]; - const double *psy_noise_normal_thresh; - - const int *psy_ath_float; - const int *psy_ath_abs; - - const double *psy_lowpass; - - const vorbis_info_psy_global *global_params; - const double *global_mapping; - const adj_stereo *stereo_modes; - - const static_codebook *const *const *const floor_books; - const vorbis_info_floor1 *floor_params; - const int floor_mappings; - const int **floor_mapping_list; - - const vorbis_mapping_template *maps; -} ve_setup_data_template; - -/* a few static coder conventions */ -static const vorbis_info_mode _mode_template[2]={ - {0,0,0,0}, - {1,0,0,1} -}; - -static const vorbis_info_mapping0 _map_nominal[2]={ - {1, {0,0}, {0}, {0}, 1,{0},{1}}, - {1, {0,0}, {1}, {1}, 1,{0},{1}} -}; - -#include "modes/setup_44.h" -#include "modes/setup_44u.h" -#include "modes/setup_44p51.h" -#include "modes/setup_32.h" -#include "modes/setup_8.h" -#include "modes/setup_11.h" -#include "modes/setup_16.h" -#include "modes/setup_22.h" -#include "modes/setup_X.h" - -static const ve_setup_data_template *const setup_list[]={ - &ve_setup_44_stereo, - &ve_setup_44_51, - &ve_setup_44_uncoupled, - - &ve_setup_32_stereo, - &ve_setup_32_uncoupled, - - &ve_setup_22_stereo, - &ve_setup_22_uncoupled, - &ve_setup_16_stereo, - &ve_setup_16_uncoupled, - - &ve_setup_11_stereo, - &ve_setup_11_uncoupled, - &ve_setup_8_stereo, - &ve_setup_8_uncoupled, - - &ve_setup_X_stereo, - &ve_setup_X_uncoupled, - &ve_setup_XX_stereo, - &ve_setup_XX_uncoupled, - 0 -}; - -static void vorbis_encode_floor_setup(vorbis_info *vi,int s, - const static_codebook *const *const *const books, - const vorbis_info_floor1 *in, - const int *x){ - int i,k,is=s; - vorbis_info_floor1 *f=_ogg_calloc(1,sizeof(*f)); - codec_setup_info *ci=vi->codec_setup; - - memcpy(f,in+x[is],sizeof(*f)); - - /* books */ - { - int partitions=f->partitions; - int maxclass=-1; - int maxbook=-1; - for(i=0;ipartitionclass[i]>maxclass)maxclass=f->partitionclass[i]; - for(i=0;i<=maxclass;i++){ - if(f->class_book[i]>maxbook)maxbook=f->class_book[i]; - f->class_book[i]+=ci->books; - for(k=0;k<(1<class_subs[i]);k++){ - if(f->class_subbook[i][k]>maxbook)maxbook=f->class_subbook[i][k]; - if(f->class_subbook[i][k]>=0)f->class_subbook[i][k]+=ci->books; - } - } - - for(i=0;i<=maxbook;i++) - ci->book_param[ci->books++]=(static_codebook *)books[x[is]][i]; - } - - /* for now, we're only using floor 1 */ - ci->floor_type[ci->floors]=1; - ci->floor_param[ci->floors]=f; - ci->floors++; - - return; -} - -static void vorbis_encode_global_psych_setup(vorbis_info *vi,double s, - const vorbis_info_psy_global *in, - const double *x){ - int i,is=s; - double ds=s-is; - codec_setup_info *ci=vi->codec_setup; - vorbis_info_psy_global *g=&ci->psy_g_param; - - memcpy(g,in+(int)x[is],sizeof(*g)); - - ds=x[is]*(1.-ds)+x[is+1]*ds; - is=(int)ds; - ds-=is; - if(ds==0 && is>0){ - is--; - ds=1.; - } - - /* interpolate the trigger threshholds */ - for(i=0;i<4;i++){ - g->preecho_thresh[i]=in[is].preecho_thresh[i]*(1.-ds)+in[is+1].preecho_thresh[i]*ds; - g->postecho_thresh[i]=in[is].postecho_thresh[i]*(1.-ds)+in[is+1].postecho_thresh[i]*ds; - } - g->ampmax_att_per_sec=ci->hi.amplitude_track_dBpersec; - return; -} - -static void vorbis_encode_global_stereo(vorbis_info *vi, - const highlevel_encode_setup *const hi, - const adj_stereo *p){ - float s=hi->stereo_point_setting; - int i,is=s; - double ds=s-is; - codec_setup_info *ci=vi->codec_setup; - vorbis_info_psy_global *g=&ci->psy_g_param; - - if(p){ - memcpy(g->coupling_prepointamp,p[is].pre,sizeof(*p[is].pre)*PACKETBLOBS); - memcpy(g->coupling_postpointamp,p[is].post,sizeof(*p[is].post)*PACKETBLOBS); - - if(hi->managed){ - /* interpolate the kHz threshholds */ - for(i=0;icoupling_pointlimit[0][i]=kHz*1000./vi->rate*ci->blocksizes[0]; - g->coupling_pointlimit[1][i]=kHz*1000./vi->rate*ci->blocksizes[1]; - g->coupling_pkHz[i]=kHz; - - kHz=p[is].lowpasskHz[i]*(1.-ds)+p[is+1].lowpasskHz[i]*ds; - g->sliding_lowpass[0][i]=kHz*1000./vi->rate*ci->blocksizes[0]; - g->sliding_lowpass[1][i]=kHz*1000./vi->rate*ci->blocksizes[1]; - - } - }else{ - float kHz=p[is].kHz[PACKETBLOBS/2]*(1.-ds)+p[is+1].kHz[PACKETBLOBS/2]*ds; - for(i=0;icoupling_pointlimit[0][i]=kHz*1000./vi->rate*ci->blocksizes[0]; - g->coupling_pointlimit[1][i]=kHz*1000./vi->rate*ci->blocksizes[1]; - g->coupling_pkHz[i]=kHz; - } - - kHz=p[is].lowpasskHz[PACKETBLOBS/2]*(1.-ds)+p[is+1].lowpasskHz[PACKETBLOBS/2]*ds; - for(i=0;isliding_lowpass[0][i]=kHz*1000./vi->rate*ci->blocksizes[0]; - g->sliding_lowpass[1][i]=kHz*1000./vi->rate*ci->blocksizes[1]; - } - } - }else{ - for(i=0;isliding_lowpass[0][i]=ci->blocksizes[0]; - g->sliding_lowpass[1][i]=ci->blocksizes[1]; - } - } - return; -} - -static void vorbis_encode_psyset_setup(vorbis_info *vi,double s, - const int *nn_start, - const int *nn_partition, - const double *nn_thresh, - int block){ - codec_setup_info *ci=vi->codec_setup; - vorbis_info_psy *p=ci->psy_param[block]; - highlevel_encode_setup *hi=&ci->hi; - int is=s; - - if(block>=ci->psys) - ci->psys=block+1; - if(!p){ - p=_ogg_calloc(1,sizeof(*p)); - ci->psy_param[block]=p; - } - - memcpy(p,&_psy_info_template,sizeof(*p)); - p->blockflag=block>>1; - - if(hi->noise_normalize_p){ - p->normal_p=1; - p->normal_start=nn_start[is]; - p->normal_partition=nn_partition[is]; - p->normal_thresh=nn_thresh[is]; - } - - return; -} - -static void vorbis_encode_tonemask_setup(vorbis_info *vi,double s,int block, - const att3 *att, - const int *max, - const vp_adjblock *in){ - int i,is=s; - double ds=s-is; - codec_setup_info *ci=vi->codec_setup; - vorbis_info_psy *p=ci->psy_param[block]; - - /* 0 and 2 are only used by bitmanagement, but there's no harm to always - filling the values in here */ - p->tone_masteratt[0]=att[is].att[0]*(1.-ds)+att[is+1].att[0]*ds; - p->tone_masteratt[1]=att[is].att[1]*(1.-ds)+att[is+1].att[1]*ds; - p->tone_masteratt[2]=att[is].att[2]*(1.-ds)+att[is+1].att[2]*ds; - p->tone_centerboost=att[is].boost*(1.-ds)+att[is+1].boost*ds; - p->tone_decay=att[is].decay*(1.-ds)+att[is+1].decay*ds; - - p->max_curve_dB=max[is]*(1.-ds)+max[is+1]*ds; - - for(i=0;itoneatt[i]=in[is].block[i]*(1.-ds)+in[is+1].block[i]*ds; - return; -} - - -static void vorbis_encode_compand_setup(vorbis_info *vi,double s,int block, - const compandblock *in, - const double *x){ - int i,is=s; - double ds=s-is; - codec_setup_info *ci=vi->codec_setup; - vorbis_info_psy *p=ci->psy_param[block]; - - ds=x[is]*(1.-ds)+x[is+1]*ds; - is=(int)ds; - ds-=is; - if(ds==0 && is>0){ - is--; - ds=1.; - } - - /* interpolate the compander settings */ - for(i=0;inoisecompand[i]=in[is].data[i]*(1.-ds)+in[is+1].data[i]*ds; - return; -} - -static void vorbis_encode_peak_setup(vorbis_info *vi,double s,int block, - const int *suppress){ - int is=s; - double ds=s-is; - codec_setup_info *ci=vi->codec_setup; - vorbis_info_psy *p=ci->psy_param[block]; - - p->tone_abs_limit=suppress[is]*(1.-ds)+suppress[is+1]*ds; - - return; -} - -static void vorbis_encode_noisebias_setup(vorbis_info *vi,double s,int block, - const int *suppress, - const noise3 *in, - const noiseguard *guard, - double userbias){ - int i,is=s,j; - double ds=s-is; - codec_setup_info *ci=vi->codec_setup; - vorbis_info_psy *p=ci->psy_param[block]; - - p->noisemaxsupp=suppress[is]*(1.-ds)+suppress[is+1]*ds; - p->noisewindowlomin=guard[block].lo; - p->noisewindowhimin=guard[block].hi; - p->noisewindowfixed=guard[block].fixed; - - for(j=0;jnoiseoff[j][i]=in[is].data[j][i]*(1.-ds)+in[is+1].data[j][i]*ds; - - /* impulse blocks may take a user specified bias to boost the - nominal/high noise encoding depth */ - for(j=0;jnoiseoff[j][0]+6; /* the lowest it can go */ - for(i=0;inoiseoff[j][i]+=userbias; - if(p->noiseoff[j][i]noiseoff[j][i]=min; - } - } - - return; -} - -static void vorbis_encode_ath_setup(vorbis_info *vi,int block){ - codec_setup_info *ci=vi->codec_setup; - vorbis_info_psy *p=ci->psy_param[block]; - - p->ath_adjatt=ci->hi.ath_floating_dB; - p->ath_maxatt=ci->hi.ath_absolute_dB; - return; -} - - -static int book_dup_or_new(codec_setup_info *ci,const static_codebook *book){ - int i; - for(i=0;ibooks;i++) - if(ci->book_param[i]==book)return(i); - - return(ci->books++); -} - -static void vorbis_encode_blocksize_setup(vorbis_info *vi,double s, - const int *shortb,const int *longb){ - - codec_setup_info *ci=vi->codec_setup; - int is=s; - - int blockshort=shortb[is]; - int blocklong=longb[is]; - ci->blocksizes[0]=blockshort; - ci->blocksizes[1]=blocklong; - -} - -static void vorbis_encode_residue_setup(vorbis_info *vi, - int number, int block, - const vorbis_residue_template *res){ - - codec_setup_info *ci=vi->codec_setup; - int i; - - vorbis_info_residue0 *r=ci->residue_param[number]= - _ogg_malloc(sizeof(*r)); - - memcpy(r,res->res,sizeof(*r)); - if(ci->residues<=number)ci->residues=number+1; - - r->grouping=res->grouping; - ci->residue_type[number]=res->res_type; - - /* fill in all the books */ - { - int booklist=0,k; - - if(ci->hi.managed){ - for(i=0;ipartitions;i++) - for(k=0;k<4;k++) - if(res->books_base_managed->books[i][k]) - r->secondstages[i]|=(1<groupbook=book_dup_or_new(ci,res->book_aux_managed); - ci->book_param[r->groupbook]=(static_codebook *)res->book_aux_managed; - - for(i=0;ipartitions;i++){ - for(k=0;k<4;k++){ - if(res->books_base_managed->books[i][k]){ - int bookid=book_dup_or_new(ci,res->books_base_managed->books[i][k]); - r->booklist[booklist++]=bookid; - ci->book_param[bookid]=(static_codebook *)res->books_base_managed->books[i][k]; - } - } - } - - }else{ - - for(i=0;ipartitions;i++) - for(k=0;k<4;k++) - if(res->books_base->books[i][k]) - r->secondstages[i]|=(1<groupbook=book_dup_or_new(ci,res->book_aux); - ci->book_param[r->groupbook]=(static_codebook *)res->book_aux; - - for(i=0;ipartitions;i++){ - for(k=0;k<4;k++){ - if(res->books_base->books[i][k]){ - int bookid=book_dup_or_new(ci,res->books_base->books[i][k]); - r->booklist[booklist++]=bookid; - ci->book_param[bookid]=(static_codebook *)res->books_base->books[i][k]; - } - } - } - } - } - - /* lowpass setup/pointlimit */ - { - double freq=ci->hi.lowpass_kHz*1000.; - vorbis_info_floor1 *f=ci->floor_param[block]; /* by convention */ - double nyq=vi->rate/2.; - long blocksize=ci->blocksizes[block]>>1; - - /* lowpass needs to be set in the floor and the residue. */ - if(freq>nyq)freq=nyq; - /* in the floor, the granularity can be very fine; it doesn't alter - the encoding structure, only the samples used to fit the floor - approximation */ - f->n=freq/nyq*blocksize; - - /* this res may by limited by the maximum pointlimit of the mode, - not the lowpass. the floor is always lowpass limited. */ - switch(res->limit_type){ - case 1: /* point stereo limited */ - if(ci->hi.managed) - freq=ci->psy_g_param.coupling_pkHz[PACKETBLOBS-1]*1000.; - else - freq=ci->psy_g_param.coupling_pkHz[PACKETBLOBS/2]*1000.; - if(freq>nyq)freq=nyq; - break; - case 2: /* LFE channel; lowpass at ~ 250Hz */ - freq=250; - break; - default: - /* already set */ - break; - } - - /* in the residue, we're constrained, physically, by partition - boundaries. We still lowpass 'wherever', but we have to round up - here to next boundary, or the vorbis spec will round it *down* to - previous boundary in encode/decode */ - if(ci->residue_type[number]==2){ - /* residue 2 bundles together multiple channels; used by stereo - and surround. Count the channels in use */ - /* Multiple maps/submaps can point to the same residue. In the case - of residue 2, they all better have the same number of - channels/samples. */ - int j,k,ch=0; - for(i=0;imaps&&ch==0;i++){ - vorbis_info_mapping0 *mi=(vorbis_info_mapping0 *)ci->map_param[i]; - for(j=0;jsubmaps && ch==0;j++) - if(mi->residuesubmap[j]==number) /* we found a submap referencing theis residue backend */ - for(k=0;kchannels;k++) - if(mi->chmuxlist[k]==j) /* this channel belongs to the submap */ - ch++; - } - - r->end=(int)((freq/nyq*blocksize*ch)/r->grouping+.9)* /* round up only if we're well past */ - r->grouping; - /* the blocksize and grouping may disagree at the end */ - if(r->end>blocksize*ch)r->end=blocksize*ch/r->grouping*r->grouping; - - }else{ - - r->end=(int)((freq/nyq*blocksize)/r->grouping+.9)* /* round up only if we're well past */ - r->grouping; - /* the blocksize and grouping may disagree at the end */ - if(r->end>blocksize)r->end=blocksize/r->grouping*r->grouping; - - } - - if(r->end==0)r->end=r->grouping; /* LFE channel */ - - } -} - -/* we assume two maps in this encoder */ -static void vorbis_encode_map_n_res_setup(vorbis_info *vi,double s, - const vorbis_mapping_template *maps){ - - codec_setup_info *ci=vi->codec_setup; - int i,j,is=s,modes=2; - const vorbis_info_mapping0 *map=maps[is].map; - const vorbis_info_mode *mode=_mode_template; - const vorbis_residue_template *res=maps[is].res; - - if(ci->blocksizes[0]==ci->blocksizes[1])modes=1; - - for(i=0;imap_param[i]=_ogg_calloc(1,sizeof(*map)); - ci->mode_param[i]=_ogg_calloc(1,sizeof(*mode)); - - memcpy(ci->mode_param[i],mode+i,sizeof(*_mode_template)); - if(i>=ci->modes)ci->modes=i+1; - - ci->map_type[i]=0; - memcpy(ci->map_param[i],map+i,sizeof(*map)); - if(i>=ci->maps)ci->maps=i+1; - - for(j=0;jcodec_setup; - highlevel_encode_setup *hi=&ci->hi; - ve_setup_data_template *setup=(ve_setup_data_template *)hi->setup; - int is=hi->base_setting; - double ds=hi->base_setting-is; - int ch=vi->channels; - const double *r=setup->rate_mapping; - - if(r==NULL) - return(-1); - - return((r[is]*(1.-ds)+r[is+1]*ds)*ch); -} - -static const void *get_setup_template(long ch,long srate, - double req,int q_or_bitrate, - double *base_setting){ - int i=0,j; - if(q_or_bitrate)req/=ch; - - while(setup_list[i]){ - if(setup_list[i]->coupling_restriction==-1 || - setup_list[i]->coupling_restriction==ch){ - if(srate>=setup_list[i]->samplerate_min_restriction && - srate<=setup_list[i]->samplerate_max_restriction){ - int mappings=setup_list[i]->mappings; - const double *map=(q_or_bitrate? - setup_list[i]->rate_mapping: - setup_list[i]->quality_mapping); - - /* the template matches. Does the requested quality mode - fall within this template's modes? */ - if(reqmap[setup_list[i]->mappings]){++i;continue;} - for(j=0;j=map[j] && reqcodec_setup; - ve_setup_data_template *setup=NULL; - highlevel_encode_setup *hi=&ci->hi; - - if(ci==NULL)return(OV_EINVAL); - if(!hi->impulse_block_p)i0=1; - - /* too low/high an ATH floater is nonsensical, but doesn't break anything */ - if(hi->ath_floating_dB>-80)hi->ath_floating_dB=-80; - if(hi->ath_floating_dB<-200)hi->ath_floating_dB=-200; - - /* again, bound this to avoid the app shooting itself int he foot - too badly */ - if(hi->amplitude_track_dBpersec>0.)hi->amplitude_track_dBpersec=0.; - if(hi->amplitude_track_dBpersec<-99999.)hi->amplitude_track_dBpersec=-99999.; - - /* get the appropriate setup template; matches the fetch in previous - stages */ - setup=(ve_setup_data_template *)hi->setup; - if(setup==NULL)return(OV_EINVAL); - - hi->set_in_stone=1; - /* choose block sizes from configured sizes as well as paying - attention to long_block_p and short_block_p. If the configured - short and long blocks are the same length, we set long_block_p - and unset short_block_p */ - vorbis_encode_blocksize_setup(vi,hi->base_setting, - setup->blocksize_short, - setup->blocksize_long); - if(ci->blocksizes[0]==ci->blocksizes[1])singleblock=1; - - /* floor setup; choose proper floor params. Allocated on the floor - stack in order; if we alloc only a single long floor, it's 0 */ - for(i=0;ifloor_mappings;i++) - vorbis_encode_floor_setup(vi,hi->base_setting, - setup->floor_books, - setup->floor_params, - setup->floor_mapping_list[i]); - - /* setup of [mostly] short block detection and stereo*/ - vorbis_encode_global_psych_setup(vi,hi->trigger_setting, - setup->global_params, - setup->global_mapping); - vorbis_encode_global_stereo(vi,hi,setup->stereo_modes); - - /* basic psych setup and noise normalization */ - vorbis_encode_psyset_setup(vi,hi->base_setting, - setup->psy_noise_normal_start[0], - setup->psy_noise_normal_partition[0], - setup->psy_noise_normal_thresh, - 0); - vorbis_encode_psyset_setup(vi,hi->base_setting, - setup->psy_noise_normal_start[0], - setup->psy_noise_normal_partition[0], - setup->psy_noise_normal_thresh, - 1); - if(!singleblock){ - vorbis_encode_psyset_setup(vi,hi->base_setting, - setup->psy_noise_normal_start[1], - setup->psy_noise_normal_partition[1], - setup->psy_noise_normal_thresh, - 2); - vorbis_encode_psyset_setup(vi,hi->base_setting, - setup->psy_noise_normal_start[1], - setup->psy_noise_normal_partition[1], - setup->psy_noise_normal_thresh, - 3); - } - - /* tone masking setup */ - vorbis_encode_tonemask_setup(vi,hi->block[i0].tone_mask_setting,0, - setup->psy_tone_masteratt, - setup->psy_tone_0dB, - setup->psy_tone_adj_impulse); - vorbis_encode_tonemask_setup(vi,hi->block[1].tone_mask_setting,1, - setup->psy_tone_masteratt, - setup->psy_tone_0dB, - setup->psy_tone_adj_other); - if(!singleblock){ - vorbis_encode_tonemask_setup(vi,hi->block[2].tone_mask_setting,2, - setup->psy_tone_masteratt, - setup->psy_tone_0dB, - setup->psy_tone_adj_other); - vorbis_encode_tonemask_setup(vi,hi->block[3].tone_mask_setting,3, - setup->psy_tone_masteratt, - setup->psy_tone_0dB, - setup->psy_tone_adj_long); - } - - /* noise companding setup */ - vorbis_encode_compand_setup(vi,hi->block[i0].noise_compand_setting,0, - setup->psy_noise_compand, - setup->psy_noise_compand_short_mapping); - vorbis_encode_compand_setup(vi,hi->block[1].noise_compand_setting,1, - setup->psy_noise_compand, - setup->psy_noise_compand_short_mapping); - if(!singleblock){ - vorbis_encode_compand_setup(vi,hi->block[2].noise_compand_setting,2, - setup->psy_noise_compand, - setup->psy_noise_compand_long_mapping); - vorbis_encode_compand_setup(vi,hi->block[3].noise_compand_setting,3, - setup->psy_noise_compand, - setup->psy_noise_compand_long_mapping); - } - - /* peak guarding setup */ - vorbis_encode_peak_setup(vi,hi->block[i0].tone_peaklimit_setting,0, - setup->psy_tone_dBsuppress); - vorbis_encode_peak_setup(vi,hi->block[1].tone_peaklimit_setting,1, - setup->psy_tone_dBsuppress); - if(!singleblock){ - vorbis_encode_peak_setup(vi,hi->block[2].tone_peaklimit_setting,2, - setup->psy_tone_dBsuppress); - vorbis_encode_peak_setup(vi,hi->block[3].tone_peaklimit_setting,3, - setup->psy_tone_dBsuppress); - } - - /* noise bias setup */ - vorbis_encode_noisebias_setup(vi,hi->block[i0].noise_bias_setting,0, - setup->psy_noise_dBsuppress, - setup->psy_noise_bias_impulse, - setup->psy_noiseguards, - (i0==0?hi->impulse_noisetune:0.)); - vorbis_encode_noisebias_setup(vi,hi->block[1].noise_bias_setting,1, - setup->psy_noise_dBsuppress, - setup->psy_noise_bias_padding, - setup->psy_noiseguards,0.); - if(!singleblock){ - vorbis_encode_noisebias_setup(vi,hi->block[2].noise_bias_setting,2, - setup->psy_noise_dBsuppress, - setup->psy_noise_bias_trans, - setup->psy_noiseguards,0.); - vorbis_encode_noisebias_setup(vi,hi->block[3].noise_bias_setting,3, - setup->psy_noise_dBsuppress, - setup->psy_noise_bias_long, - setup->psy_noiseguards,0.); - } - - vorbis_encode_ath_setup(vi,0); - vorbis_encode_ath_setup(vi,1); - if(!singleblock){ - vorbis_encode_ath_setup(vi,2); - vorbis_encode_ath_setup(vi,3); - } - - vorbis_encode_map_n_res_setup(vi,hi->base_setting,setup->maps); - - /* set bitrate readonlies and management */ - if(hi->bitrate_av>0) - vi->bitrate_nominal=hi->bitrate_av; - else{ - vi->bitrate_nominal=setting_to_approx_bitrate(vi); - } - - vi->bitrate_lower=hi->bitrate_min; - vi->bitrate_upper=hi->bitrate_max; - if(hi->bitrate_av) - vi->bitrate_window=(double)hi->bitrate_reservoir/hi->bitrate_av; - else - vi->bitrate_window=0.; - - if(hi->managed){ - ci->bi.avg_rate=hi->bitrate_av; - ci->bi.min_rate=hi->bitrate_min; - ci->bi.max_rate=hi->bitrate_max; - - ci->bi.reservoir_bits=hi->bitrate_reservoir; - ci->bi.reservoir_bias= - hi->bitrate_reservoir_bias; - - ci->bi.slew_damp=hi->bitrate_av_damp; - - } - - return(0); - -} - -static void vorbis_encode_setup_setting(vorbis_info *vi, - long channels, - long rate){ - int i,is; - codec_setup_info *ci=vi->codec_setup; - highlevel_encode_setup *hi=&ci->hi; - const ve_setup_data_template *setup=hi->setup; - double ds; - - vi->version=0; - vi->channels=channels; - vi->rate=rate; - - hi->impulse_block_p=1; - hi->noise_normalize_p=1; - - is=hi->base_setting; - ds=hi->base_setting-is; - - hi->stereo_point_setting=hi->base_setting; - - if(!hi->lowpass_altered) - hi->lowpass_kHz= - setup->psy_lowpass[is]*(1.-ds)+setup->psy_lowpass[is+1]*ds; - - hi->ath_floating_dB=setup->psy_ath_float[is]*(1.-ds)+ - setup->psy_ath_float[is+1]*ds; - hi->ath_absolute_dB=setup->psy_ath_abs[is]*(1.-ds)+ - setup->psy_ath_abs[is+1]*ds; - - hi->amplitude_track_dBpersec=-6.; - hi->trigger_setting=hi->base_setting; - - for(i=0;i<4;i++){ - hi->block[i].tone_mask_setting=hi->base_setting; - hi->block[i].tone_peaklimit_setting=hi->base_setting; - hi->block[i].noise_bias_setting=hi->base_setting; - hi->block[i].noise_compand_setting=hi->base_setting; - } -} - -int vorbis_encode_setup_vbr(vorbis_info *vi, - long channels, - long rate, - float quality){ - codec_setup_info *ci; - highlevel_encode_setup *hi; - if(rate<=0) return OV_EINVAL; - - ci=vi->codec_setup; - hi=&ci->hi; - - quality+=.0000001; - if(quality>=1.)quality=.9999; - - hi->req=quality; - hi->setup=get_setup_template(channels,rate,quality,0,&hi->base_setting); - if(!hi->setup)return OV_EIMPL; - - vorbis_encode_setup_setting(vi,channels,rate); - hi->managed=0; - hi->coupling_p=1; - - return 0; -} - -int vorbis_encode_init_vbr(vorbis_info *vi, - long channels, - long rate, - - float base_quality /* 0. to 1. */ - ){ - int ret=0; - - ret=vorbis_encode_setup_vbr(vi,channels,rate,base_quality); - - if(ret){ - vorbis_info_clear(vi); - return ret; - } - ret=vorbis_encode_setup_init(vi); - if(ret) - vorbis_info_clear(vi); - return(ret); -} - -int vorbis_encode_setup_managed(vorbis_info *vi, - long channels, - long rate, - - long max_bitrate, - long nominal_bitrate, - long min_bitrate){ - - codec_setup_info *ci; - highlevel_encode_setup *hi; - double tnominal; - if(rate<=0) return OV_EINVAL; - - ci=vi->codec_setup; - hi=&ci->hi; - tnominal=nominal_bitrate; - - if(nominal_bitrate<=0.){ - if(max_bitrate>0.){ - if(min_bitrate>0.) - nominal_bitrate=(max_bitrate+min_bitrate)*.5; - else - nominal_bitrate=max_bitrate*.875; - }else{ - if(min_bitrate>0.){ - nominal_bitrate=min_bitrate; - }else{ - return(OV_EINVAL); - } - } - } - - hi->req=nominal_bitrate; - hi->setup=get_setup_template(channels,rate,nominal_bitrate,1,&hi->base_setting); - if(!hi->setup)return OV_EIMPL; - - vorbis_encode_setup_setting(vi,channels,rate); - - /* initialize management with sane defaults */ - hi->coupling_p=1; - hi->managed=1; - hi->bitrate_min=min_bitrate; - hi->bitrate_max=max_bitrate; - hi->bitrate_av=tnominal; - hi->bitrate_av_damp=1.5f; /* full range in no less than 1.5 second */ - hi->bitrate_reservoir=nominal_bitrate*2; - hi->bitrate_reservoir_bias=.1; /* bias toward hoarding bits */ - - return(0); - -} - -int vorbis_encode_init(vorbis_info *vi, - long channels, - long rate, - - long max_bitrate, - long nominal_bitrate, - long min_bitrate){ - - int ret=vorbis_encode_setup_managed(vi,channels,rate, - max_bitrate, - nominal_bitrate, - min_bitrate); - if(ret){ - vorbis_info_clear(vi); - return(ret); - } - - ret=vorbis_encode_setup_init(vi); - if(ret) - vorbis_info_clear(vi); - return(ret); -} - -int vorbis_encode_ctl(vorbis_info *vi,int number,void *arg){ - if(vi){ - codec_setup_info *ci=vi->codec_setup; - highlevel_encode_setup *hi=&ci->hi; - int setp=(number&0xf); /* a read request has a low nibble of 0 */ - - if(setp && hi->set_in_stone)return(OV_EINVAL); - - switch(number){ - - /* now deprecated *****************/ - case OV_ECTL_RATEMANAGE_GET: - { - - struct ovectl_ratemanage_arg *ai= - (struct ovectl_ratemanage_arg *)arg; - - ai->management_active=hi->managed; - ai->bitrate_hard_window=ai->bitrate_av_window= - (double)hi->bitrate_reservoir/vi->rate; - ai->bitrate_av_window_center=1.; - ai->bitrate_hard_min=hi->bitrate_min; - ai->bitrate_hard_max=hi->bitrate_max; - ai->bitrate_av_lo=hi->bitrate_av; - ai->bitrate_av_hi=hi->bitrate_av; - - } - return(0); - - /* now deprecated *****************/ - case OV_ECTL_RATEMANAGE_SET: - { - struct ovectl_ratemanage_arg *ai= - (struct ovectl_ratemanage_arg *)arg; - if(ai==NULL){ - hi->managed=0; - }else{ - hi->managed=ai->management_active; - vorbis_encode_ctl(vi,OV_ECTL_RATEMANAGE_AVG,arg); - vorbis_encode_ctl(vi,OV_ECTL_RATEMANAGE_HARD,arg); - } - } - return 0; - - /* now deprecated *****************/ - case OV_ECTL_RATEMANAGE_AVG: - { - struct ovectl_ratemanage_arg *ai= - (struct ovectl_ratemanage_arg *)arg; - if(ai==NULL){ - hi->bitrate_av=0; - }else{ - hi->bitrate_av=(ai->bitrate_av_lo+ai->bitrate_av_hi)*.5; - } - } - return(0); - /* now deprecated *****************/ - case OV_ECTL_RATEMANAGE_HARD: - { - struct ovectl_ratemanage_arg *ai= - (struct ovectl_ratemanage_arg *)arg; - if(ai==NULL){ - hi->bitrate_min=0; - hi->bitrate_max=0; - }else{ - hi->bitrate_min=ai->bitrate_hard_min; - hi->bitrate_max=ai->bitrate_hard_max; - hi->bitrate_reservoir=ai->bitrate_hard_window* - (hi->bitrate_max+hi->bitrate_min)*.5; - } - if(hi->bitrate_reservoir<128.) - hi->bitrate_reservoir=128.; - } - return(0); - - /* replacement ratemanage interface */ - case OV_ECTL_RATEMANAGE2_GET: - { - struct ovectl_ratemanage2_arg *ai= - (struct ovectl_ratemanage2_arg *)arg; - if(ai==NULL)return OV_EINVAL; - - ai->management_active=hi->managed; - ai->bitrate_limit_min_kbps=hi->bitrate_min/1000; - ai->bitrate_limit_max_kbps=hi->bitrate_max/1000; - ai->bitrate_average_kbps=hi->bitrate_av/1000; - ai->bitrate_average_damping=hi->bitrate_av_damp; - ai->bitrate_limit_reservoir_bits=hi->bitrate_reservoir; - ai->bitrate_limit_reservoir_bias=hi->bitrate_reservoir_bias; - } - return (0); - case OV_ECTL_RATEMANAGE2_SET: - { - struct ovectl_ratemanage2_arg *ai= - (struct ovectl_ratemanage2_arg *)arg; - if(ai==NULL){ - hi->managed=0; - }else{ - /* sanity check; only catch invariant violations */ - if(ai->bitrate_limit_min_kbps>0 && - ai->bitrate_average_kbps>0 && - ai->bitrate_limit_min_kbps>ai->bitrate_average_kbps) - return OV_EINVAL; - - if(ai->bitrate_limit_max_kbps>0 && - ai->bitrate_average_kbps>0 && - ai->bitrate_limit_max_kbpsbitrate_average_kbps) - return OV_EINVAL; - - if(ai->bitrate_limit_min_kbps>0 && - ai->bitrate_limit_max_kbps>0 && - ai->bitrate_limit_min_kbps>ai->bitrate_limit_max_kbps) - return OV_EINVAL; - - if(ai->bitrate_average_damping <= 0.) - return OV_EINVAL; - - if(ai->bitrate_limit_reservoir_bits < 0) - return OV_EINVAL; - - if(ai->bitrate_limit_reservoir_bias < 0.) - return OV_EINVAL; - - if(ai->bitrate_limit_reservoir_bias > 1.) - return OV_EINVAL; - - hi->managed=ai->management_active; - hi->bitrate_min=ai->bitrate_limit_min_kbps * 1000; - hi->bitrate_max=ai->bitrate_limit_max_kbps * 1000; - hi->bitrate_av=ai->bitrate_average_kbps * 1000; - hi->bitrate_av_damp=ai->bitrate_average_damping; - hi->bitrate_reservoir=ai->bitrate_limit_reservoir_bits; - hi->bitrate_reservoir_bias=ai->bitrate_limit_reservoir_bias; - } - } - return 0; - - case OV_ECTL_LOWPASS_GET: - { - double *farg=(double *)arg; - *farg=hi->lowpass_kHz; - } - return(0); - case OV_ECTL_LOWPASS_SET: - { - double *farg=(double *)arg; - hi->lowpass_kHz=*farg; - - if(hi->lowpass_kHz<2.)hi->lowpass_kHz=2.; - if(hi->lowpass_kHz>99.)hi->lowpass_kHz=99.; - hi->lowpass_altered=1; - } - return(0); - case OV_ECTL_IBLOCK_GET: - { - double *farg=(double *)arg; - *farg=hi->impulse_noisetune; - } - return(0); - case OV_ECTL_IBLOCK_SET: - { - double *farg=(double *)arg; - hi->impulse_noisetune=*farg; - - if(hi->impulse_noisetune>0.)hi->impulse_noisetune=0.; - if(hi->impulse_noisetune<-15.)hi->impulse_noisetune=-15.; - } - return(0); - case OV_ECTL_COUPLING_GET: - { - int *iarg=(int *)arg; - *iarg=hi->coupling_p; - } - return(0); - case OV_ECTL_COUPLING_SET: - { - const void *new_template; - double new_base=0.; - int *iarg=(int *)arg; - hi->coupling_p=((*iarg)!=0); - - /* Fetching a new template can alter the base_setting, which - many other parameters are based on. Right now, the only - parameter drawn from the base_setting that can be altered - by an encctl is the lowpass, so that is explictly flagged - to not be overwritten when we fetch a new template and - recompute the dependant settings */ - new_template = get_setup_template(hi->coupling_p?vi->channels:-1, - vi->rate, - hi->req, - hi->managed, - &new_base); - if(!hi->setup)return OV_EIMPL; - hi->setup=new_template; - hi->base_setting=new_base; - vorbis_encode_setup_setting(vi,vi->channels,vi->rate); - } - return(0); - } - return(OV_EIMPL); - } - return(OV_EINVAL); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/vorbisfile.c b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/vorbisfile.c deleted file mode 100644 index fc0c86ff..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/vorbisfile.c +++ /dev/null @@ -1,2425 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2015 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: stdio-based convenience library for opening/seeking/decoding - last mod: $Id: vorbisfile.c 19457 2015-03-03 00:15:29Z giles $ - - ********************************************************************/ - -#include -#include -#include -#include -#include - -#include "vorbis/codec.h" - -/* we don't need or want the static callback symbols here */ -#define OV_EXCLUDE_STATIC_CALLBACKS -#include "vorbis/vorbisfile.h" - -#include "os.h" -#include "misc.h" - -/* A 'chained bitstream' is a Vorbis bitstream that contains more than - one logical bitstream arranged end to end (the only form of Ogg - multiplexing allowed in a Vorbis bitstream; grouping [parallel - multiplexing] is not allowed in Vorbis) */ - -/* A Vorbis file can be played beginning to end (streamed) without - worrying ahead of time about chaining (see decoder_example.c). If - we have the whole file, however, and want random access - (seeking/scrubbing) or desire to know the total length/time of a - file, we need to account for the possibility of chaining. */ - -/* We can handle things a number of ways; we can determine the entire - bitstream structure right off the bat, or find pieces on demand. - This example determines and caches structure for the entire - bitstream, but builds a virtual decoder on the fly when moving - between links in the chain. */ - -/* There are also different ways to implement seeking. Enough - information exists in an Ogg bitstream to seek to - sample-granularity positions in the output. Or, one can seek by - picking some portion of the stream roughly in the desired area if - we only want coarse navigation through the stream. */ - -/************************************************************************* - * Many, many internal helpers. The intention is not to be confusing; - * rampant duplication and monolithic function implementation would be - * harder to understand anyway. The high level functions are last. Begin - * grokking near the end of the file */ - -/* read a little more data from the file/pipe into the ogg_sync framer -*/ -#define CHUNKSIZE 65536 /* greater-than-page-size granularity seeking */ -#define READSIZE 2048 /* a smaller read size is needed for low-rate streaming. */ - -static long _get_data(OggVorbis_File *vf){ - errno=0; - if(!(vf->callbacks.read_func))return(-1); - if(vf->datasource){ - char *buffer=ogg_sync_buffer(&vf->oy,READSIZE); - long bytes=(vf->callbacks.read_func)(buffer,1,READSIZE,vf->datasource); - if(bytes>0)ogg_sync_wrote(&vf->oy,bytes); - if(bytes==0 && errno)return(-1); - return(bytes); - }else - return(0); -} - -/* save a tiny smidge of verbosity to make the code more readable */ -static int _seek_helper(OggVorbis_File *vf,ogg_int64_t offset){ - if(vf->datasource){ - /* only seek if the file position isn't already there */ - if(vf->offset != offset){ - if(!(vf->callbacks.seek_func)|| - (vf->callbacks.seek_func)(vf->datasource, offset, SEEK_SET) == -1) - return OV_EREAD; - vf->offset=offset; - ogg_sync_reset(&vf->oy); - } - }else{ - /* shouldn't happen unless someone writes a broken callback */ - return OV_EFAULT; - } - return 0; -} - -/* The read/seek functions track absolute position within the stream */ - -/* from the head of the stream, get the next page. boundary specifies - if the function is allowed to fetch more data from the stream (and - how much) or only use internally buffered data. - - boundary: -1) unbounded search - 0) read no additional data; use cached only - n) search for a new page beginning for n bytes - - return: <0) did not find a page (OV_FALSE, OV_EOF, OV_EREAD) - n) found a page at absolute offset n */ - -static ogg_int64_t _get_next_page(OggVorbis_File *vf,ogg_page *og, - ogg_int64_t boundary){ - if(boundary>0)boundary+=vf->offset; - while(1){ - long more; - - if(boundary>0 && vf->offset>=boundary)return(OV_FALSE); - more=ogg_sync_pageseek(&vf->oy,og); - - if(more<0){ - /* skipped n bytes */ - vf->offset-=more; - }else{ - if(more==0){ - /* send more paramedics */ - if(!boundary)return(OV_FALSE); - { - long ret=_get_data(vf); - if(ret==0)return(OV_EOF); - if(ret<0)return(OV_EREAD); - } - }else{ - /* got a page. Return the offset at the page beginning, - advance the internal offset past the page end */ - ogg_int64_t ret=vf->offset; - vf->offset+=more; - return(ret); - - } - } - } -} - -/* find the latest page beginning before the passed in position. Much - dirtier than the above as Ogg doesn't have any backward search - linkage. no 'readp' as it will certainly have to read. */ -/* returns offset or OV_EREAD, OV_FAULT */ -static ogg_int64_t _get_prev_page(OggVorbis_File *vf,ogg_int64_t begin,ogg_page *og){ - ogg_int64_t end = begin; - ogg_int64_t ret; - ogg_int64_t offset=-1; - - while(offset==-1){ - begin-=CHUNKSIZE; - if(begin<0) - begin=0; - - ret=_seek_helper(vf,begin); - if(ret)return(ret); - - while(vf->offsetoffset); - if(ret==OV_EREAD)return(OV_EREAD); - if(ret<0){ - break; - }else{ - offset=ret; - } - } - } - - /* In a fully compliant, non-multiplexed stream, we'll still be - holding the last page. In multiplexed (or noncompliant streams), - we will probably have to re-read the last page we saw */ - if(og->header_len==0){ - ret=_seek_helper(vf,offset); - if(ret)return(ret); - - ret=_get_next_page(vf,og,CHUNKSIZE); - if(ret<0) - /* this shouldn't be possible */ - return(OV_EFAULT); - } - - return(offset); -} - -static void _add_serialno(ogg_page *og,long **serialno_list, int *n){ - long s = ogg_page_serialno(og); - (*n)++; - - if(*serialno_list){ - *serialno_list = _ogg_realloc(*serialno_list, sizeof(**serialno_list)*(*n)); - }else{ - *serialno_list = _ogg_malloc(sizeof(**serialno_list)); - } - - (*serialno_list)[(*n)-1] = s; -} - -/* returns nonzero if found */ -static int _lookup_serialno(long s, long *serialno_list, int n){ - if(serialno_list){ - while(n--){ - if(*serialno_list == s) return 1; - serialno_list++; - } - } - return 0; -} - -static int _lookup_page_serialno(ogg_page *og, long *serialno_list, int n){ - long s = ogg_page_serialno(og); - return _lookup_serialno(s,serialno_list,n); -} - -/* performs the same search as _get_prev_page, but prefers pages of - the specified serial number. If a page of the specified serialno is - spotted during the seek-back-and-read-forward, it will return the - info of last page of the matching serial number instead of the very - last page. If no page of the specified serialno is seen, it will - return the info of last page and alter *serialno. */ -static ogg_int64_t _get_prev_page_serial(OggVorbis_File *vf, ogg_int64_t begin, - long *serial_list, int serial_n, - int *serialno, ogg_int64_t *granpos){ - ogg_page og; - ogg_int64_t end=begin; - ogg_int64_t ret; - - ogg_int64_t prefoffset=-1; - ogg_int64_t offset=-1; - ogg_int64_t ret_serialno=-1; - ogg_int64_t ret_gran=-1; - - while(offset==-1){ - begin-=CHUNKSIZE; - if(begin<0) - begin=0; - - ret=_seek_helper(vf,begin); - if(ret)return(ret); - - while(vf->offsetoffset); - if(ret==OV_EREAD)return(OV_EREAD); - if(ret<0){ - break; - }else{ - ret_serialno=ogg_page_serialno(&og); - ret_gran=ogg_page_granulepos(&og); - offset=ret; - - if(ret_serialno == *serialno){ - prefoffset=ret; - *granpos=ret_gran; - } - - if(!_lookup_serialno(ret_serialno,serial_list,serial_n)){ - /* we fell off the end of the link, which means we seeked - back too far and shouldn't have been looking in that link - to begin with. If we found the preferred serial number, - forget that we saw it. */ - prefoffset=-1; - } - } - } - } - - /* we're not interested in the page... just the serialno and granpos. */ - if(prefoffset>=0)return(prefoffset); - - *serialno = ret_serialno; - *granpos = ret_gran; - return(offset); - -} - -/* uses the local ogg_stream storage in vf; this is important for - non-streaming input sources */ -static int _fetch_headers(OggVorbis_File *vf,vorbis_info *vi,vorbis_comment *vc, - long **serialno_list, int *serialno_n, - ogg_page *og_ptr){ - ogg_page og; - ogg_packet op; - int i,ret; - int allbos=0; - - if(!og_ptr){ - ogg_int64_t llret=_get_next_page(vf,&og,CHUNKSIZE); - if(llret==OV_EREAD)return(OV_EREAD); - if(llret<0)return(OV_ENOTVORBIS); - og_ptr=&og; - } - - vorbis_info_init(vi); - vorbis_comment_init(vc); - vf->ready_state=OPENED; - - /* extract the serialnos of all BOS pages + the first set of vorbis - headers we see in the link */ - - while(ogg_page_bos(og_ptr)){ - if(serialno_list){ - if(_lookup_page_serialno(og_ptr,*serialno_list,*serialno_n)){ - /* a dupe serialnumber in an initial header packet set == invalid stream */ - if(*serialno_list)_ogg_free(*serialno_list); - *serialno_list=0; - *serialno_n=0; - ret=OV_EBADHEADER; - goto bail_header; - } - - _add_serialno(og_ptr,serialno_list,serialno_n); - } - - if(vf->ready_stateos,ogg_page_serialno(og_ptr)); - ogg_stream_pagein(&vf->os,og_ptr); - - if(ogg_stream_packetout(&vf->os,&op) > 0 && - vorbis_synthesis_idheader(&op)){ - /* vorbis header; continue setup */ - vf->ready_state=STREAMSET; - if((ret=vorbis_synthesis_headerin(vi,vc,&op))){ - ret=OV_EBADHEADER; - goto bail_header; - } - } - } - - /* get next page */ - { - ogg_int64_t llret=_get_next_page(vf,og_ptr,CHUNKSIZE); - if(llret==OV_EREAD){ - ret=OV_EREAD; - goto bail_header; - } - if(llret<0){ - ret=OV_ENOTVORBIS; - goto bail_header; - } - - /* if this page also belongs to our vorbis stream, submit it and break */ - if(vf->ready_state==STREAMSET && - vf->os.serialno == ogg_page_serialno(og_ptr)){ - ogg_stream_pagein(&vf->os,og_ptr); - break; - } - } - } - - if(vf->ready_state!=STREAMSET){ - ret = OV_ENOTVORBIS; - goto bail_header; - } - - while(1){ - - i=0; - while(i<2){ /* get a page loop */ - - while(i<2){ /* get a packet loop */ - - int result=ogg_stream_packetout(&vf->os,&op); - if(result==0)break; - if(result==-1){ - ret=OV_EBADHEADER; - goto bail_header; - } - - if((ret=vorbis_synthesis_headerin(vi,vc,&op))) - goto bail_header; - - i++; - } - - while(i<2){ - if(_get_next_page(vf,og_ptr,CHUNKSIZE)<0){ - ret=OV_EBADHEADER; - goto bail_header; - } - - /* if this page belongs to the correct stream, go parse it */ - if(vf->os.serialno == ogg_page_serialno(og_ptr)){ - ogg_stream_pagein(&vf->os,og_ptr); - break; - } - - /* if we never see the final vorbis headers before the link - ends, abort */ - if(ogg_page_bos(og_ptr)){ - if(allbos){ - ret = OV_EBADHEADER; - goto bail_header; - }else - allbos=1; - } - - /* otherwise, keep looking */ - } - } - - return 0; - } - - bail_header: - vorbis_info_clear(vi); - vorbis_comment_clear(vc); - vf->ready_state=OPENED; - - return ret; -} - -/* Starting from current cursor position, get initial PCM offset of - next page. Consumes the page in the process without decoding - audio, however this is only called during stream parsing upon - seekable open. */ -static ogg_int64_t _initial_pcmoffset(OggVorbis_File *vf, vorbis_info *vi){ - ogg_page og; - ogg_int64_t accumulated=0; - long lastblock=-1; - int result; - int serialno = vf->os.serialno; - - while(1){ - ogg_packet op; - if(_get_next_page(vf,&og,-1)<0) - break; /* should not be possible unless the file is truncated/mangled */ - - if(ogg_page_bos(&og)) break; - if(ogg_page_serialno(&og)!=serialno) continue; - - /* count blocksizes of all frames in the page */ - ogg_stream_pagein(&vf->os,&og); - while((result=ogg_stream_packetout(&vf->os,&op))){ - if(result>0){ /* ignore holes */ - long thisblock=vorbis_packet_blocksize(vi,&op); - if(thisblock>=0){ - if(lastblock!=-1) - accumulated+=(lastblock+thisblock)>>2; - lastblock=thisblock; - } - } - } - - if(ogg_page_granulepos(&og)!=-1){ - /* pcm offset of last packet on the first audio page */ - accumulated= ogg_page_granulepos(&og)-accumulated; - break; - } - } - - /* less than zero? Either a corrupt file or a stream with samples - trimmed off the beginning, a normal occurrence; in both cases set - the offset to zero */ - if(accumulated<0)accumulated=0; - - return accumulated; -} - -/* finds each bitstream link one at a time using a bisection search - (has to begin by knowing the offset of the lb's initial page). - Recurses for each link so it can alloc the link storage after - finding them all, then unroll and fill the cache at the same time */ -static int _bisect_forward_serialno(OggVorbis_File *vf, - ogg_int64_t begin, - ogg_int64_t searched, - ogg_int64_t end, - ogg_int64_t endgran, - int endserial, - long *currentno_list, - int currentnos, - long m){ - ogg_int64_t pcmoffset; - ogg_int64_t dataoffset=searched; - ogg_int64_t endsearched=end; - ogg_int64_t next=end; - ogg_int64_t searchgran=-1; - ogg_page og; - ogg_int64_t ret,last; - int serialno = vf->os.serialno; - - /* invariants: - we have the headers and serialnos for the link beginning at 'begin' - we have the offset and granpos of the last page in the file (potentially - not a page we care about) - */ - - /* Is the last page in our list of current serialnumbers? */ - if(_lookup_serialno(endserial,currentno_list,currentnos)){ - - /* last page is in the starting serialno list, so we've bisected - down to (or just started with) a single link. Now we need to - find the last vorbis page belonging to the first vorbis stream - for this link. */ - searched = end; - while(endserial != serialno){ - endserial = serialno; - searched=_get_prev_page_serial(vf,searched,currentno_list,currentnos,&endserial,&endgran); - } - - vf->links=m+1; - if(vf->offsets)_ogg_free(vf->offsets); - if(vf->serialnos)_ogg_free(vf->serialnos); - if(vf->dataoffsets)_ogg_free(vf->dataoffsets); - - vf->offsets=_ogg_malloc((vf->links+1)*sizeof(*vf->offsets)); - vf->vi=_ogg_realloc(vf->vi,vf->links*sizeof(*vf->vi)); - vf->vc=_ogg_realloc(vf->vc,vf->links*sizeof(*vf->vc)); - vf->serialnos=_ogg_malloc(vf->links*sizeof(*vf->serialnos)); - vf->dataoffsets=_ogg_malloc(vf->links*sizeof(*vf->dataoffsets)); - vf->pcmlengths=_ogg_malloc(vf->links*2*sizeof(*vf->pcmlengths)); - - vf->offsets[m+1]=end; - vf->offsets[m]=begin; - vf->pcmlengths[m*2+1]=(endgran<0?0:endgran); - - }else{ - - /* last page is not in the starting stream's serial number list, - so we have multiple links. Find where the stream that begins - our bisection ends. */ - - long *next_serialno_list=NULL; - int next_serialnos=0; - vorbis_info vi; - vorbis_comment vc; - int testserial = serialno+1; - - /* the below guards against garbage seperating the last and - first pages of two links. */ - while(searched=0)next=last; - }else{ - searched=vf->offset; - } - } - - /* Bisection point found */ - /* for the time being, fetch end PCM offset the simple way */ - searched = next; - while(testserial != serialno){ - testserial = serialno; - searched = _get_prev_page_serial(vf,searched,currentno_list,currentnos,&testserial,&searchgran); - } - - ret=_seek_helper(vf,next); - if(ret)return(ret); - - ret=_fetch_headers(vf,&vi,&vc,&next_serialno_list,&next_serialnos,NULL); - if(ret)return(ret); - serialno = vf->os.serialno; - dataoffset = vf->offset; - - /* this will consume a page, however the next bisection always - starts with a raw seek */ - pcmoffset = _initial_pcmoffset(vf,&vi); - - ret=_bisect_forward_serialno(vf,next,vf->offset,end,endgran,endserial, - next_serialno_list,next_serialnos,m+1); - if(ret)return(ret); - - if(next_serialno_list)_ogg_free(next_serialno_list); - - vf->offsets[m+1]=next; - vf->serialnos[m+1]=serialno; - vf->dataoffsets[m+1]=dataoffset; - - vf->vi[m+1]=vi; - vf->vc[m+1]=vc; - - vf->pcmlengths[m*2+1]=searchgran; - vf->pcmlengths[m*2+2]=pcmoffset; - vf->pcmlengths[m*2+3]-=pcmoffset; - if(vf->pcmlengths[m*2+3]<0)vf->pcmlengths[m*2+3]=0; - } - return(0); -} - -static int _make_decode_ready(OggVorbis_File *vf){ - if(vf->ready_state>STREAMSET)return 0; - if(vf->ready_stateseekable){ - if(vorbis_synthesis_init(&vf->vd,vf->vi+vf->current_link)) - return OV_EBADLINK; - }else{ - if(vorbis_synthesis_init(&vf->vd,vf->vi)) - return OV_EBADLINK; - } - vorbis_block_init(&vf->vd,&vf->vb); - vf->ready_state=INITSET; - vf->bittrack=0.f; - vf->samptrack=0.f; - return 0; -} - -static int _open_seekable2(OggVorbis_File *vf){ - ogg_int64_t dataoffset=vf->dataoffsets[0],end,endgran=-1; - int endserial=vf->os.serialno; - int serialno=vf->os.serialno; - - /* we're partially open and have a first link header state in - storage in vf */ - - /* fetch initial PCM offset */ - ogg_int64_t pcmoffset = _initial_pcmoffset(vf,vf->vi); - - /* we can seek, so set out learning all about this file */ - if(vf->callbacks.seek_func && vf->callbacks.tell_func){ - (vf->callbacks.seek_func)(vf->datasource,0,SEEK_END); - vf->offset=vf->end=(vf->callbacks.tell_func)(vf->datasource); - }else{ - vf->offset=vf->end=-1; - } - - /* If seek_func is implemented, tell_func must also be implemented */ - if(vf->end==-1) return(OV_EINVAL); - - /* Get the offset of the last page of the physical bitstream, or, if - we're lucky the last vorbis page of this link as most OggVorbis - files will contain a single logical bitstream */ - end=_get_prev_page_serial(vf,vf->end,vf->serialnos+2,vf->serialnos[1],&endserial,&endgran); - if(end<0)return(end); - - /* now determine bitstream structure recursively */ - if(_bisect_forward_serialno(vf,0,dataoffset,end,endgran,endserial, - vf->serialnos+2,vf->serialnos[1],0)<0)return(OV_EREAD); - - vf->offsets[0]=0; - vf->serialnos[0]=serialno; - vf->dataoffsets[0]=dataoffset; - vf->pcmlengths[0]=pcmoffset; - vf->pcmlengths[1]-=pcmoffset; - if(vf->pcmlengths[1]<0)vf->pcmlengths[1]=0; - - return(ov_raw_seek(vf,dataoffset)); -} - -/* clear out the current logical bitstream decoder */ -static void _decode_clear(OggVorbis_File *vf){ - vorbis_dsp_clear(&vf->vd); - vorbis_block_clear(&vf->vb); - vf->ready_state=OPENED; -} - -/* fetch and process a packet. Handles the case where we're at a - bitstream boundary and dumps the decoding machine. If the decoding - machine is unloaded, it loads it. It also keeps pcm_offset up to - date (seek and read both use this. seek uses a special hack with - readp). - - return: <0) error, OV_HOLE (lost packet) or OV_EOF - 0) need more data (only if readp==0) - 1) got a packet -*/ - -static int _fetch_and_process_packet(OggVorbis_File *vf, - ogg_packet *op_in, - int readp, - int spanp){ - ogg_page og; - - /* handle one packet. Try to fetch it from current stream state */ - /* extract packets from page */ - while(1){ - - if(vf->ready_state==STREAMSET){ - int ret=_make_decode_ready(vf); - if(ret<0)return ret; - } - - /* process a packet if we can. */ - - if(vf->ready_state==INITSET){ - int hs=vorbis_synthesis_halfrate_p(vf->vi); - - while(1) { - ogg_packet op; - ogg_packet *op_ptr=(op_in?op_in:&op); - int result=ogg_stream_packetout(&vf->os,op_ptr); - ogg_int64_t granulepos; - - op_in=NULL; - if(result==-1)return(OV_HOLE); /* hole in the data. */ - if(result>0){ - /* got a packet. process it */ - granulepos=op_ptr->granulepos; - if(!vorbis_synthesis(&vf->vb,op_ptr)){ /* lazy check for lazy - header handling. The - header packets aren't - audio, so if/when we - submit them, - vorbis_synthesis will - reject them */ - - /* suck in the synthesis data and track bitrate */ - { - int oldsamples=vorbis_synthesis_pcmout(&vf->vd,NULL); - /* for proper use of libvorbis within libvorbisfile, - oldsamples will always be zero. */ - if(oldsamples)return(OV_EFAULT); - - vorbis_synthesis_blockin(&vf->vd,&vf->vb); - vf->samptrack+=(vorbis_synthesis_pcmout(&vf->vd,NULL)<bittrack+=op_ptr->bytes*8; - } - - /* update the pcm offset. */ - if(granulepos!=-1 && !op_ptr->e_o_s){ - int link=(vf->seekable?vf->current_link:0); - int i,samples; - - /* this packet has a pcm_offset on it (the last packet - completed on a page carries the offset) After processing - (above), we know the pcm position of the *last* sample - ready to be returned. Find the offset of the *first* - - As an aside, this trick is inaccurate if we begin - reading anew right at the last page; the end-of-stream - granulepos declares the last frame in the stream, and the - last packet of the last page may be a partial frame. - So, we need a previous granulepos from an in-sequence page - to have a reference point. Thus the !op_ptr->e_o_s clause - above */ - - if(vf->seekable && link>0) - granulepos-=vf->pcmlengths[link*2]; - if(granulepos<0)granulepos=0; /* actually, this - shouldn't be possible - here unless the stream - is very broken */ - - samples=(vorbis_synthesis_pcmout(&vf->vd,NULL)<pcmlengths[i*2+1]; - vf->pcm_offset=granulepos; - } - return(1); - } - } - else - break; - } - } - - if(vf->ready_state>=OPENED){ - ogg_int64_t ret; - - while(1){ - /* the loop is not strictly necessary, but there's no sense in - doing the extra checks of the larger loop for the common - case in a multiplexed bistream where the page is simply - part of a different logical bitstream; keep reading until - we get one with the correct serialno */ - - if(!readp)return(0); - if((ret=_get_next_page(vf,&og,-1))<0){ - return(OV_EOF); /* eof. leave unitialized */ - } - - /* bitrate tracking; add the header's bytes here, the body bytes - are done by packet above */ - vf->bittrack+=og.header_len*8; - - if(vf->ready_state==INITSET){ - if(vf->current_serialno!=ogg_page_serialno(&og)){ - - /* two possibilities: - 1) our decoding just traversed a bitstream boundary - 2) another stream is multiplexed into this logical section */ - - if(ogg_page_bos(&og)){ - /* boundary case */ - if(!spanp) - return(OV_EOF); - - _decode_clear(vf); - - if(!vf->seekable){ - vorbis_info_clear(vf->vi); - vorbis_comment_clear(vf->vc); - } - break; - - }else - continue; /* possibility #2 */ - } - } - - break; - } - } - - /* Do we need to load a new machine before submitting the page? */ - /* This is different in the seekable and non-seekable cases. - - In the seekable case, we already have all the header - information loaded and cached; we just initialize the machine - with it and continue on our merry way. - - In the non-seekable (streaming) case, we'll only be at a - boundary if we just left the previous logical bitstream and - we're now nominally at the header of the next bitstream - */ - - if(vf->ready_state!=INITSET){ - int link; - - if(vf->ready_stateseekable){ - long serialno = ogg_page_serialno(&og); - - /* match the serialno to bitstream section. We use this rather than - offset positions to avoid problems near logical bitstream - boundaries */ - - for(link=0;linklinks;link++) - if(vf->serialnos[link]==serialno)break; - - if(link==vf->links) continue; /* not the desired Vorbis - bitstream section; keep - trying */ - - vf->current_serialno=serialno; - vf->current_link=link; - - ogg_stream_reset_serialno(&vf->os,vf->current_serialno); - vf->ready_state=STREAMSET; - - }else{ - /* we're streaming */ - /* fetch the three header packets, build the info struct */ - - int ret=_fetch_headers(vf,vf->vi,vf->vc,NULL,NULL,&og); - if(ret)return(ret); - vf->current_serialno=vf->os.serialno; - vf->current_link++; - link=0; - } - } - } - - /* the buffered page is the data we want, and we're ready for it; - add it to the stream state */ - ogg_stream_pagein(&vf->os,&og); - - } -} - -/* if, eg, 64 bit stdio is configured by default, this will build with - fseek64 */ -static int _fseek64_wrap(FILE *f,ogg_int64_t off,int whence){ - if(f==NULL)return(-1); - return fseek(f,off,whence); -} - -static int _ov_open1(void *f,OggVorbis_File *vf,const char *initial, - long ibytes, ov_callbacks callbacks){ - int offsettest=((f && callbacks.seek_func)?callbacks.seek_func(f,0,SEEK_CUR):-1); - long *serialno_list=NULL; - int serialno_list_size=0; - int ret; - - memset(vf,0,sizeof(*vf)); - vf->datasource=f; - vf->callbacks = callbacks; - - /* init the framing state */ - ogg_sync_init(&vf->oy); - - /* perhaps some data was previously read into a buffer for testing - against other stream types. Allow initialization from this - previously read data (especially as we may be reading from a - non-seekable stream) */ - if(initial){ - char *buffer=ogg_sync_buffer(&vf->oy,ibytes); - memcpy(buffer,initial,ibytes); - ogg_sync_wrote(&vf->oy,ibytes); - } - - /* can we seek? Stevens suggests the seek test was portable */ - if(offsettest!=-1)vf->seekable=1; - - /* No seeking yet; Set up a 'single' (current) logical bitstream - entry for partial open */ - vf->links=1; - vf->vi=_ogg_calloc(vf->links,sizeof(*vf->vi)); - vf->vc=_ogg_calloc(vf->links,sizeof(*vf->vc)); - ogg_stream_init(&vf->os,-1); /* fill in the serialno later */ - - /* Fetch all BOS pages, store the vorbis header and all seen serial - numbers, load subsequent vorbis setup headers */ - if((ret=_fetch_headers(vf,vf->vi,vf->vc,&serialno_list,&serialno_list_size,NULL))<0){ - vf->datasource=NULL; - ov_clear(vf); - }else{ - /* serial number list for first link needs to be held somewhere - for second stage of seekable stream open; this saves having to - seek/reread first link's serialnumber data then. */ - vf->serialnos=_ogg_calloc(serialno_list_size+2,sizeof(*vf->serialnos)); - vf->serialnos[0]=vf->current_serialno=vf->os.serialno; - vf->serialnos[1]=serialno_list_size; - memcpy(vf->serialnos+2,serialno_list,serialno_list_size*sizeof(*vf->serialnos)); - - vf->offsets=_ogg_calloc(1,sizeof(*vf->offsets)); - vf->dataoffsets=_ogg_calloc(1,sizeof(*vf->dataoffsets)); - vf->offsets[0]=0; - vf->dataoffsets[0]=vf->offset; - - vf->ready_state=PARTOPEN; - } - if(serialno_list)_ogg_free(serialno_list); - return(ret); -} - -static int _ov_open2(OggVorbis_File *vf){ - if(vf->ready_state != PARTOPEN) return OV_EINVAL; - vf->ready_state=OPENED; - if(vf->seekable){ - int ret=_open_seekable2(vf); - if(ret){ - vf->datasource=NULL; - ov_clear(vf); - } - return(ret); - }else - vf->ready_state=STREAMSET; - - return 0; -} - - -/* clear out the OggVorbis_File struct */ -int ov_clear(OggVorbis_File *vf){ - if(vf){ - vorbis_block_clear(&vf->vb); - vorbis_dsp_clear(&vf->vd); - ogg_stream_clear(&vf->os); - - if(vf->vi && vf->links){ - int i; - for(i=0;ilinks;i++){ - vorbis_info_clear(vf->vi+i); - vorbis_comment_clear(vf->vc+i); - } - _ogg_free(vf->vi); - _ogg_free(vf->vc); - } - if(vf->dataoffsets)_ogg_free(vf->dataoffsets); - if(vf->pcmlengths)_ogg_free(vf->pcmlengths); - if(vf->serialnos)_ogg_free(vf->serialnos); - if(vf->offsets)_ogg_free(vf->offsets); - ogg_sync_clear(&vf->oy); - if(vf->datasource && vf->callbacks.close_func) - (vf->callbacks.close_func)(vf->datasource); - memset(vf,0,sizeof(*vf)); - } -#ifdef DEBUG_LEAKS - _VDBG_dump(); -#endif - return(0); -} - -/* inspects the OggVorbis file and finds/documents all the logical - bitstreams contained in it. Tries to be tolerant of logical - bitstream sections that are truncated/woogie. - - return: -1) error - 0) OK -*/ - -int ov_open_callbacks(void *f,OggVorbis_File *vf, - const char *initial,long ibytes,ov_callbacks callbacks){ - int ret=_ov_open1(f,vf,initial,ibytes,callbacks); - if(ret)return ret; - return _ov_open2(vf); -} - -int ov_open(FILE *f,OggVorbis_File *vf,const char *initial,long ibytes){ - ov_callbacks callbacks = { - (size_t (*)(void *, size_t, size_t, void *)) fread, - (int (*)(void *, ogg_int64_t, int)) _fseek64_wrap, - (int (*)(void *)) fclose, - (long (*)(void *)) ftell - }; - - return ov_open_callbacks((void *)f, vf, initial, ibytes, callbacks); -} - -int ov_fopen(const char *path,OggVorbis_File *vf){ - int ret; - FILE *f = fopen(path,"rb"); - if(!f) return -1; - - ret = ov_open(f,vf,NULL,0); - if(ret) fclose(f); - return ret; -} - - -/* cheap hack for game usage where downsampling is desirable; there's - no need for SRC as we can just do it cheaply in libvorbis. */ - -int ov_halfrate(OggVorbis_File *vf,int flag){ - int i; - if(vf->vi==NULL)return OV_EINVAL; - if(vf->ready_state>STREAMSET){ - /* clear out stream state; dumping the decode machine is needed to - reinit the MDCT lookups. */ - vorbis_dsp_clear(&vf->vd); - vorbis_block_clear(&vf->vb); - vf->ready_state=STREAMSET; - if(vf->pcm_offset>=0){ - ogg_int64_t pos=vf->pcm_offset; - vf->pcm_offset=-1; /* make sure the pos is dumped if unseekable */ - ov_pcm_seek(vf,pos); - } - } - - for(i=0;ilinks;i++){ - if(vorbis_synthesis_halfrate(vf->vi+i,flag)){ - if(flag) ov_halfrate(vf,0); - return OV_EINVAL; - } - } - return 0; -} - -int ov_halfrate_p(OggVorbis_File *vf){ - if(vf->vi==NULL)return OV_EINVAL; - return vorbis_synthesis_halfrate_p(vf->vi); -} - -/* Only partially open the vorbis file; test for Vorbisness, and load - the headers for the first chain. Do not seek (although test for - seekability). Use ov_test_open to finish opening the file, else - ov_clear to close/free it. Same return codes as open. - - Note that vorbisfile does _not_ take ownership of the file if the - call fails; the calling applicaiton is responsible for closing the file - if this call returns an error. */ - -int ov_test_callbacks(void *f,OggVorbis_File *vf, - const char *initial,long ibytes,ov_callbacks callbacks) -{ - return _ov_open1(f,vf,initial,ibytes,callbacks); -} - -int ov_test(FILE *f,OggVorbis_File *vf,const char *initial,long ibytes){ - ov_callbacks callbacks = { - (size_t (*)(void *, size_t, size_t, void *)) fread, - (int (*)(void *, ogg_int64_t, int)) _fseek64_wrap, - (int (*)(void *)) fclose, - (long (*)(void *)) ftell - }; - - return ov_test_callbacks((void *)f, vf, initial, ibytes, callbacks); -} - -int ov_test_open(OggVorbis_File *vf){ - if(vf->ready_state!=PARTOPEN)return(OV_EINVAL); - return _ov_open2(vf); -} - -/* How many logical bitstreams in this physical bitstream? */ -long ov_streams(OggVorbis_File *vf){ - return vf->links; -} - -/* Is the FILE * associated with vf seekable? */ -long ov_seekable(OggVorbis_File *vf){ - return vf->seekable; -} - -/* returns the bitrate for a given logical bitstream or the entire - physical bitstream. If the file is open for random access, it will - find the *actual* average bitrate. If the file is streaming, it - returns the nominal bitrate (if set) else the average of the - upper/lower bounds (if set) else -1 (unset). - - If you want the actual bitrate field settings, get them from the - vorbis_info structs */ - -long ov_bitrate(OggVorbis_File *vf,int i){ - if(vf->ready_state=vf->links)return(OV_EINVAL); - if(!vf->seekable && i!=0)return(ov_bitrate(vf,0)); - if(i<0){ - ogg_int64_t bits=0; - int i; - float br; - for(i=0;ilinks;i++) - bits+=(vf->offsets[i+1]-vf->dataoffsets[i])*8; - /* This once read: return(rint(bits/ov_time_total(vf,-1))); - * gcc 3.x on x86 miscompiled this at optimisation level 2 and above, - * so this is slightly transformed to make it work. - */ - br = bits/ov_time_total(vf,-1); - return(rint(br)); - }else{ - if(vf->seekable){ - /* return the actual bitrate */ - return(rint((vf->offsets[i+1]-vf->dataoffsets[i])*8/ov_time_total(vf,i))); - }else{ - /* return nominal if set */ - if(vf->vi[i].bitrate_nominal>0){ - return vf->vi[i].bitrate_nominal; - }else{ - if(vf->vi[i].bitrate_upper>0){ - if(vf->vi[i].bitrate_lower>0){ - return (vf->vi[i].bitrate_upper+vf->vi[i].bitrate_lower)/2; - }else{ - return vf->vi[i].bitrate_upper; - } - } - return(OV_FALSE); - } - } - } -} - -/* returns the actual bitrate since last call. returns -1 if no - additional data to offer since last call (or at beginning of stream), - EINVAL if stream is only partially open -*/ -long ov_bitrate_instant(OggVorbis_File *vf){ - int link=(vf->seekable?vf->current_link:0); - long ret; - if(vf->ready_statesamptrack==0)return(OV_FALSE); - ret=vf->bittrack/vf->samptrack*vf->vi[link].rate+.5; - vf->bittrack=0.f; - vf->samptrack=0.f; - return(ret); -} - -/* Guess */ -long ov_serialnumber(OggVorbis_File *vf,int i){ - if(i>=vf->links)return(ov_serialnumber(vf,vf->links-1)); - if(!vf->seekable && i>=0)return(ov_serialnumber(vf,-1)); - if(i<0){ - return(vf->current_serialno); - }else{ - return(vf->serialnos[i]); - } -} - -/* returns: total raw (compressed) length of content if i==-1 - raw (compressed) length of that logical bitstream for i==0 to n - OV_EINVAL if the stream is not seekable (we can't know the length) - or if stream is only partially open -*/ -ogg_int64_t ov_raw_total(OggVorbis_File *vf,int i){ - if(vf->ready_stateseekable || i>=vf->links)return(OV_EINVAL); - if(i<0){ - ogg_int64_t acc=0; - int i; - for(i=0;ilinks;i++) - acc+=ov_raw_total(vf,i); - return(acc); - }else{ - return(vf->offsets[i+1]-vf->offsets[i]); - } -} - -/* returns: total PCM length (samples) of content if i==-1 PCM length - (samples) of that logical bitstream for i==0 to n - OV_EINVAL if the stream is not seekable (we can't know the - length) or only partially open -*/ -ogg_int64_t ov_pcm_total(OggVorbis_File *vf,int i){ - if(vf->ready_stateseekable || i>=vf->links)return(OV_EINVAL); - if(i<0){ - ogg_int64_t acc=0; - int i; - for(i=0;ilinks;i++) - acc+=ov_pcm_total(vf,i); - return(acc); - }else{ - return(vf->pcmlengths[i*2+1]); - } -} - -/* returns: total seconds of content if i==-1 - seconds in that logical bitstream for i==0 to n - OV_EINVAL if the stream is not seekable (we can't know the - length) or only partially open -*/ -double ov_time_total(OggVorbis_File *vf,int i){ - if(vf->ready_stateseekable || i>=vf->links)return(OV_EINVAL); - if(i<0){ - double acc=0; - int i; - for(i=0;ilinks;i++) - acc+=ov_time_total(vf,i); - return(acc); - }else{ - return((double)(vf->pcmlengths[i*2+1])/vf->vi[i].rate); - } -} - -/* seek to an offset relative to the *compressed* data. This also - scans packets to update the PCM cursor. It will cross a logical - bitstream boundary, but only if it can't get any packets out of the - tail of the bitstream we seek to (so no surprises). - - returns zero on success, nonzero on failure */ - -int ov_raw_seek(OggVorbis_File *vf,ogg_int64_t pos){ - ogg_stream_state work_os; - int ret; - - if(vf->ready_stateseekable) - return(OV_ENOSEEK); /* don't dump machine if we can't seek */ - - if(pos<0 || pos>vf->end)return(OV_EINVAL); - - /* is the seek position outside our current link [if any]? */ - if(vf->ready_state>=STREAMSET){ - if(posoffsets[vf->current_link] || pos>=vf->offsets[vf->current_link+1]) - _decode_clear(vf); /* clear out stream state */ - } - - /* don't yet clear out decoding machine (if it's initialized), in - the case we're in the same link. Restart the decode lapping, and - let _fetch_and_process_packet deal with a potential bitstream - boundary */ - vf->pcm_offset=-1; - ogg_stream_reset_serialno(&vf->os, - vf->current_serialno); /* must set serialno */ - vorbis_synthesis_restart(&vf->vd); - - ret=_seek_helper(vf,pos); - if(ret)goto seek_error; - - /* we need to make sure the pcm_offset is set, but we don't want to - advance the raw cursor past good packets just to get to the first - with a granulepos. That's not equivalent behavior to beginning - decoding as immediately after the seek position as possible. - - So, a hack. We use two stream states; a local scratch state and - the shared vf->os stream state. We use the local state to - scan, and the shared state as a buffer for later decode. - - Unfortuantely, on the last page we still advance to last packet - because the granulepos on the last page is not necessarily on a - packet boundary, and we need to make sure the granpos is - correct. - */ - - { - ogg_page og; - ogg_packet op; - int lastblock=0; - int accblock=0; - int thisblock=0; - int lastflag=0; - int firstflag=0; - ogg_int64_t pagepos=-1; - - ogg_stream_init(&work_os,vf->current_serialno); /* get the memory ready */ - ogg_stream_reset(&work_os); /* eliminate the spurious OV_HOLE - return from not necessarily - starting from the beginning */ - - while(1){ - if(vf->ready_state>=STREAMSET){ - /* snarf/scan a packet if we can */ - int result=ogg_stream_packetout(&work_os,&op); - - if(result>0){ - - if(vf->vi[vf->current_link].codec_setup){ - thisblock=vorbis_packet_blocksize(vf->vi+vf->current_link,&op); - if(thisblock<0){ - ogg_stream_packetout(&vf->os,NULL); - thisblock=0; - }else{ - - /* We can't get a guaranteed correct pcm position out of the - last page in a stream because it might have a 'short' - granpos, which can only be detected in the presence of a - preceding page. However, if the last page is also the first - page, the granpos rules of a first page take precedence. Not - only that, but for first==last, the EOS page must be treated - as if its a normal first page for the stream to open/play. */ - if(lastflag && !firstflag) - ogg_stream_packetout(&vf->os,NULL); - else - if(lastblock)accblock+=(lastblock+thisblock)>>2; - } - - if(op.granulepos!=-1){ - int i,link=vf->current_link; - ogg_int64_t granulepos=op.granulepos-vf->pcmlengths[link*2]; - if(granulepos<0)granulepos=0; - - for(i=0;ipcmlengths[i*2+1]; - vf->pcm_offset=granulepos-accblock; - if(vf->pcm_offset<0)vf->pcm_offset=0; - break; - } - lastblock=thisblock; - continue; - }else - ogg_stream_packetout(&vf->os,NULL); - } - } - - if(!lastblock){ - pagepos=_get_next_page(vf,&og,-1); - if(pagepos<0){ - vf->pcm_offset=ov_pcm_total(vf,-1); - break; - } - }else{ - /* huh? Bogus stream with packets but no granulepos */ - vf->pcm_offset=-1; - break; - } - - /* has our decoding just traversed a bitstream boundary? */ - if(vf->ready_state>=STREAMSET){ - if(vf->current_serialno!=ogg_page_serialno(&og)){ - - /* two possibilities: - 1) our decoding just traversed a bitstream boundary - 2) another stream is multiplexed into this logical section? */ - - if(ogg_page_bos(&og)){ - /* we traversed */ - _decode_clear(vf); /* clear out stream state */ - ogg_stream_clear(&work_os); - } /* else, do nothing; next loop will scoop another page */ - } - } - - if(vf->ready_statelinks;link++) - if(vf->serialnos[link]==serialno)break; - - if(link==vf->links) continue; /* not the desired Vorbis - bitstream section; keep - trying */ - vf->current_link=link; - vf->current_serialno=serialno; - ogg_stream_reset_serialno(&vf->os,serialno); - ogg_stream_reset_serialno(&work_os,serialno); - vf->ready_state=STREAMSET; - firstflag=(pagepos<=vf->dataoffsets[link]); - } - - ogg_stream_pagein(&vf->os,&og); - ogg_stream_pagein(&work_os,&og); - lastflag=ogg_page_eos(&og); - - } - } - - ogg_stream_clear(&work_os); - vf->bittrack=0.f; - vf->samptrack=0.f; - return(0); - - seek_error: - /* dump the machine so we're in a known state */ - vf->pcm_offset=-1; - ogg_stream_clear(&work_os); - _decode_clear(vf); - return OV_EBADLINK; -} - -/* Page granularity seek (faster than sample granularity because we - don't do the last bit of decode to find a specific sample). - - Seek to the last [granule marked] page preceding the specified pos - location, such that decoding past the returned point will quickly - arrive at the requested position. */ -int ov_pcm_seek_page(OggVorbis_File *vf,ogg_int64_t pos){ - int link=-1; - ogg_int64_t result=0; - ogg_int64_t total=ov_pcm_total(vf,-1); - - if(vf->ready_stateseekable)return(OV_ENOSEEK); - - if(pos<0 || pos>total)return(OV_EINVAL); - - /* which bitstream section does this pcm offset occur in? */ - for(link=vf->links-1;link>=0;link--){ - total-=vf->pcmlengths[link*2+1]; - if(pos>=total)break; - } - - /* Search within the logical bitstream for the page with the highest - pcm_pos preceding pos. If we're looking for a position on the - first page, bisection will halt without finding our position as - it's before the first explicit granulepos fencepost. That case is - handled separately below. - - There is a danger here; missing pages or incorrect frame number - information in the bitstream could make our task impossible. - Account for that (it would be an error condition) */ - - /* new search algorithm originally by HB (Nicholas Vinen) */ - - { - ogg_int64_t end=vf->offsets[link+1]; - ogg_int64_t begin=vf->dataoffsets[link]; - ogg_int64_t begintime = vf->pcmlengths[link*2]; - ogg_int64_t endtime = vf->pcmlengths[link*2+1]+begintime; - ogg_int64_t target=pos-total+begintime; - ogg_int64_t best=-1; - int got_page=0; - - ogg_page og; - - /* if we have only one page, there will be no bisection. Grab the page here */ - if(begin==end){ - result=_seek_helper(vf,begin); - if(result) goto seek_error; - - result=_get_next_page(vf,&og,1); - if(result<0) goto seek_error; - - got_page=1; - } - - /* bisection loop */ - while(beginoffset); - if(result==OV_EREAD) goto seek_error; - if(result<0){ - /* there is no next page! */ - if(bisect<=begin+1) - /* No bisection left to perform. We've either found the - best candidate already or failed. Exit loop. */ - end=begin; - else{ - /* We tried to load a fraction of the last page; back up a - bit and try to get the whole last page */ - if(bisect==0) goto seek_error; - bisect-=CHUNKSIZE; - - /* don't repeat/loop on a read we've already performed */ - if(bisect<=begin)bisect=begin+1; - - /* seek and cntinue bisection */ - result=_seek_helper(vf,bisect); - if(result) goto seek_error; - } - }else{ - ogg_int64_t granulepos; - got_page=1; - - /* got a page. analyze it */ - /* only consider pages from primary vorbis stream */ - if(ogg_page_serialno(&og)!=vf->serialnos[link]) - continue; - - /* only consider pages with the granulepos set */ - granulepos=ogg_page_granulepos(&og); - if(granulepos==-1)continue; - - if(granuleposoffset; /* raw offset of next page */ - begintime=granulepos; - - /* if we're before our target but within a short distance, - don't bisect; read forward */ - if(target-begintime>44100)break; - - bisect=begin; /* *not* begin + 1 as above */ - }else{ - - /* This is one of our pages, but the granpos is - post-target; it is not a bisection return - candidate. (The only way we'd use it is if it's the - first page in the stream; we handle that case later - outside the bisection) */ - if(bisect<=begin+1){ - /* No bisection left to perform. We've either found the - best candidate already or failed. Exit loop. */ - end=begin; - }else{ - if(end==vf->offset){ - /* bisection read to the end; use the known page - boundary (result) to update bisection, back up a - little bit, and try again */ - end=result; - bisect-=CHUNKSIZE; - if(bisect<=begin)bisect=begin+1; - result=_seek_helper(vf,bisect); - if(result) goto seek_error; - }else{ - /* Normal bisection */ - end=bisect; - endtime=granulepos; - break; - } - } - } - } - } - } - - /* Out of bisection: did it 'fail?' */ - if(best == -1){ - - /* Check the 'looking for data in first page' special case; - bisection would 'fail' because our search target was before the - first PCM granule position fencepost. */ - - if(got_page && - begin == vf->dataoffsets[link] && - ogg_page_serialno(&og)==vf->serialnos[link]){ - - /* Yes, this is the beginning-of-stream case. We already have - our page, right at the beginning of PCM data. Set state - and return. */ - - vf->pcm_offset=total; - - if(link!=vf->current_link){ - /* Different link; dump entire decode machine */ - _decode_clear(vf); - - vf->current_link=link; - vf->current_serialno=vf->serialnos[link]; - vf->ready_state=STREAMSET; - - }else{ - vorbis_synthesis_restart(&vf->vd); - } - - ogg_stream_reset_serialno(&vf->os,vf->current_serialno); - ogg_stream_pagein(&vf->os,&og); - - }else - goto seek_error; - - }else{ - - /* Bisection found our page. seek to it, update pcm offset. Easier case than - raw_seek, don't keep packets preceding granulepos. */ - - ogg_page og; - ogg_packet op; - - /* seek */ - result=_seek_helper(vf,best); - vf->pcm_offset=-1; - if(result) goto seek_error; - result=_get_next_page(vf,&og,-1); - if(result<0) goto seek_error; - - if(link!=vf->current_link){ - /* Different link; dump entire decode machine */ - _decode_clear(vf); - - vf->current_link=link; - vf->current_serialno=vf->serialnos[link]; - vf->ready_state=STREAMSET; - - }else{ - vorbis_synthesis_restart(&vf->vd); - } - - ogg_stream_reset_serialno(&vf->os,vf->current_serialno); - ogg_stream_pagein(&vf->os,&og); - - /* pull out all but last packet; the one with granulepos */ - while(1){ - result=ogg_stream_packetpeek(&vf->os,&op); - if(result==0){ - /* No packet returned; we exited the bisection with 'best' - pointing to a page with a granule position, so the packet - finishing this page ('best') originated on a preceding - page. Keep fetching previous pages until we get one with - a granulepos or without the 'continued' flag set. Then - just use raw_seek for simplicity. */ - /* Do not rewind past the beginning of link data; if we do, - it's either a bug or a broken stream */ - result=best; - while(result>vf->dataoffsets[link]){ - result=_get_prev_page(vf,result,&og); - if(result<0) goto seek_error; - if(ogg_page_serialno(&og)==vf->current_serialno && - (ogg_page_granulepos(&og)>-1 || - !ogg_page_continued(&og))){ - return ov_raw_seek(vf,result); - } - } - } - if(result<0){ - result = OV_EBADPACKET; - goto seek_error; - } - if(op.granulepos!=-1){ - vf->pcm_offset=op.granulepos-vf->pcmlengths[vf->current_link*2]; - if(vf->pcm_offset<0)vf->pcm_offset=0; - vf->pcm_offset+=total; - break; - }else - result=ogg_stream_packetout(&vf->os,NULL); - } - } - } - - /* verify result */ - if(vf->pcm_offset>pos || pos>ov_pcm_total(vf,-1)){ - result=OV_EFAULT; - goto seek_error; - } - vf->bittrack=0.f; - vf->samptrack=0.f; - return(0); - - seek_error: - /* dump machine so we're in a known state */ - vf->pcm_offset=-1; - _decode_clear(vf); - return (int)result; -} - -/* seek to a sample offset relative to the decompressed pcm stream - returns zero on success, nonzero on failure */ - -int ov_pcm_seek(OggVorbis_File *vf,ogg_int64_t pos){ - int thisblock,lastblock=0; - int ret=ov_pcm_seek_page(vf,pos); - if(ret<0)return(ret); - if((ret=_make_decode_ready(vf)))return ret; - - /* discard leading packets we don't need for the lapping of the - position we want; don't decode them */ - - while(1){ - ogg_packet op; - ogg_page og; - - int ret=ogg_stream_packetpeek(&vf->os,&op); - if(ret>0){ - thisblock=vorbis_packet_blocksize(vf->vi+vf->current_link,&op); - if(thisblock<0){ - ogg_stream_packetout(&vf->os,NULL); - continue; /* non audio packet */ - } - if(lastblock)vf->pcm_offset+=(lastblock+thisblock)>>2; - - if(vf->pcm_offset+((thisblock+ - vorbis_info_blocksize(vf->vi,1))>>2)>=pos)break; - - /* remove the packet from packet queue and track its granulepos */ - ogg_stream_packetout(&vf->os,NULL); - vorbis_synthesis_trackonly(&vf->vb,&op); /* set up a vb with - only tracking, no - pcm_decode */ - vorbis_synthesis_blockin(&vf->vd,&vf->vb); - - /* end of logical stream case is hard, especially with exact - length positioning. */ - - if(op.granulepos>-1){ - int i; - /* always believe the stream markers */ - vf->pcm_offset=op.granulepos-vf->pcmlengths[vf->current_link*2]; - if(vf->pcm_offset<0)vf->pcm_offset=0; - for(i=0;icurrent_link;i++) - vf->pcm_offset+=vf->pcmlengths[i*2+1]; - } - - lastblock=thisblock; - - }else{ - if(ret<0 && ret!=OV_HOLE)break; - - /* suck in a new page */ - if(_get_next_page(vf,&og,-1)<0)break; - if(ogg_page_bos(&og))_decode_clear(vf); - - if(vf->ready_statelinks;link++) - if(vf->serialnos[link]==serialno)break; - if(link==vf->links) continue; - vf->current_link=link; - - vf->ready_state=STREAMSET; - vf->current_serialno=ogg_page_serialno(&og); - ogg_stream_reset_serialno(&vf->os,serialno); - ret=_make_decode_ready(vf); - if(ret)return ret; - lastblock=0; - } - - ogg_stream_pagein(&vf->os,&og); - } - } - - vf->bittrack=0.f; - vf->samptrack=0.f; - /* discard samples until we reach the desired position. Crossing a - logical bitstream boundary with abandon is OK. */ - { - /* note that halfrate could be set differently in each link, but - vorbisfile encoforces all links are set or unset */ - int hs=vorbis_synthesis_halfrate_p(vf->vi); - while(vf->pcm_offset<((pos>>hs)<pcm_offset)>>hs; - long samples=vorbis_synthesis_pcmout(&vf->vd,NULL); - - if(samples>target)samples=target; - vorbis_synthesis_read(&vf->vd,samples); - vf->pcm_offset+=samples<pcm_offset=ov_pcm_total(vf,-1); /* eof */ - } - } - return 0; -} - -/* seek to a playback time relative to the decompressed pcm stream - returns zero on success, nonzero on failure */ -int ov_time_seek(OggVorbis_File *vf,double seconds){ - /* translate time to PCM position and call ov_pcm_seek */ - - int link=-1; - ogg_int64_t pcm_total=0; - double time_total=0.; - - if(vf->ready_stateseekable)return(OV_ENOSEEK); - if(seconds<0)return(OV_EINVAL); - - /* which bitstream section does this time offset occur in? */ - for(link=0;linklinks;link++){ - double addsec = ov_time_total(vf,link); - if(secondspcmlengths[link*2+1]; - } - - if(link==vf->links)return(OV_EINVAL); - - /* enough information to convert time offset to pcm offset */ - { - ogg_int64_t target=pcm_total+(seconds-time_total)*vf->vi[link].rate; - return(ov_pcm_seek(vf,target)); - } -} - -/* page-granularity version of ov_time_seek - returns zero on success, nonzero on failure */ -int ov_time_seek_page(OggVorbis_File *vf,double seconds){ - /* translate time to PCM position and call ov_pcm_seek */ - - int link=-1; - ogg_int64_t pcm_total=0; - double time_total=0.; - - if(vf->ready_stateseekable)return(OV_ENOSEEK); - if(seconds<0)return(OV_EINVAL); - - /* which bitstream section does this time offset occur in? */ - for(link=0;linklinks;link++){ - double addsec = ov_time_total(vf,link); - if(secondspcmlengths[link*2+1]; - } - - if(link==vf->links)return(OV_EINVAL); - - /* enough information to convert time offset to pcm offset */ - { - ogg_int64_t target=pcm_total+(seconds-time_total)*vf->vi[link].rate; - return(ov_pcm_seek_page(vf,target)); - } -} - -/* tell the current stream offset cursor. Note that seek followed by - tell will likely not give the set offset due to caching */ -ogg_int64_t ov_raw_tell(OggVorbis_File *vf){ - if(vf->ready_stateoffset); -} - -/* return PCM offset (sample) of next PCM sample to be read */ -ogg_int64_t ov_pcm_tell(OggVorbis_File *vf){ - if(vf->ready_statepcm_offset); -} - -/* return time offset (seconds) of next PCM sample to be read */ -double ov_time_tell(OggVorbis_File *vf){ - int link=0; - ogg_int64_t pcm_total=0; - double time_total=0.f; - - if(vf->ready_stateseekable){ - pcm_total=ov_pcm_total(vf,-1); - time_total=ov_time_total(vf,-1); - - /* which bitstream section does this time offset occur in? */ - for(link=vf->links-1;link>=0;link--){ - pcm_total-=vf->pcmlengths[link*2+1]; - time_total-=ov_time_total(vf,link); - if(vf->pcm_offset>=pcm_total)break; - } - } - - return((double)time_total+(double)(vf->pcm_offset-pcm_total)/vf->vi[link].rate); -} - -/* link: -1) return the vorbis_info struct for the bitstream section - currently being decoded - 0-n) to request information for a specific bitstream section - - In the case of a non-seekable bitstream, any call returns the - current bitstream. NULL in the case that the machine is not - initialized */ - -vorbis_info *ov_info(OggVorbis_File *vf,int link){ - if(vf->seekable){ - if(link<0) - if(vf->ready_state>=STREAMSET) - return vf->vi+vf->current_link; - else - return vf->vi; - else - if(link>=vf->links) - return NULL; - else - return vf->vi+link; - }else{ - return vf->vi; - } -} - -/* grr, strong typing, grr, no templates/inheritence, grr */ -vorbis_comment *ov_comment(OggVorbis_File *vf,int link){ - if(vf->seekable){ - if(link<0) - if(vf->ready_state>=STREAMSET) - return vf->vc+vf->current_link; - else - return vf->vc; - else - if(link>=vf->links) - return NULL; - else - return vf->vc+link; - }else{ - return vf->vc; - } -} - -static int host_is_big_endian() { - ogg_int32_t pattern = 0xfeedface; /* deadbeef */ - unsigned char *bytewise = (unsigned char *)&pattern; - if (bytewise[0] == 0xfe) return 1; - return 0; -} - -/* up to this point, everything could more or less hide the multiple - logical bitstream nature of chaining from the toplevel application - if the toplevel application didn't particularly care. However, at - the point that we actually read audio back, the multiple-section - nature must surface: Multiple bitstream sections do not necessarily - have to have the same number of channels or sampling rate. - - ov_read returns the sequential logical bitstream number currently - being decoded along with the PCM data in order that the toplevel - application can take action on channel/sample rate changes. This - number will be incremented even for streamed (non-seekable) streams - (for seekable streams, it represents the actual logical bitstream - index within the physical bitstream. Note that the accessor - functions above are aware of this dichotomy). - - ov_read_filter is exactly the same as ov_read except that it processes - the decoded audio data through a filter before packing it into the - requested format. This gives greater accuracy than applying a filter - after the audio has been converted into integral PCM. - - input values: buffer) a buffer to hold packed PCM data for return - length) the byte length requested to be placed into buffer - bigendianp) should the data be packed LSB first (0) or - MSB first (1) - word) word size for output. currently 1 (byte) or - 2 (16 bit short) - - return values: <0) error/hole in data (OV_HOLE), partial open (OV_EINVAL) - 0) EOF - n) number of bytes of PCM actually returned. The - below works on a packet-by-packet basis, so the - return length is not related to the 'length' passed - in, just guaranteed to fit. - - *section) set to the logical bitstream number */ - -long ov_read_filter(OggVorbis_File *vf,char *buffer,int length, - int bigendianp,int word,int sgned,int *bitstream, - void (*filter)(float **pcm,long channels,long samples,void *filter_param),void *filter_param){ - int i,j; - int host_endian = host_is_big_endian(); - int hs; - - float **pcm; - long samples; - - if(vf->ready_stateready_state==INITSET){ - samples=vorbis_synthesis_pcmout(&vf->vd,&pcm); - if(samples)break; - } - - /* suck in another packet */ - { - int ret=_fetch_and_process_packet(vf,NULL,1,1); - if(ret==OV_EOF) - return(0); - if(ret<=0) - return(ret); - } - - } - - if(samples>0){ - - /* yay! proceed to pack data into the byte buffer */ - - long channels=ov_info(vf,-1)->channels; - long bytespersample=word * channels; - vorbis_fpu_control fpu; - if(samples>length/bytespersample)samples=length/bytespersample; - - if(samples <= 0) - return OV_EINVAL; - - /* Here. */ - if(filter) - filter(pcm,channels,samples,filter_param); - - /* a tight loop to pack each size */ - { - int val; - if(word==1){ - int off=(sgned?0:128); - vorbis_fpu_setround(&fpu); - for(j=0;j127)val=127; - else if(val<-128)val=-128; - *buffer++=val+off; - } - vorbis_fpu_restore(fpu); - }else{ - int off=(sgned?0:32768); - - if(host_endian==bigendianp){ - if(sgned){ - - vorbis_fpu_setround(&fpu); - for(i=0;i32767)val=32767; - else if(val<-32768)val=-32768; - *dest=val; - dest+=channels; - } - } - vorbis_fpu_restore(fpu); - - }else{ - - vorbis_fpu_setround(&fpu); - for(i=0;i32767)val=32767; - else if(val<-32768)val=-32768; - *dest=val+off; - dest+=channels; - } - } - vorbis_fpu_restore(fpu); - - } - }else if(bigendianp){ - - vorbis_fpu_setround(&fpu); - for(j=0;j32767)val=32767; - else if(val<-32768)val=-32768; - val+=off; - *buffer++=(val>>8); - *buffer++=(val&0xff); - } - vorbis_fpu_restore(fpu); - - }else{ - int val; - vorbis_fpu_setround(&fpu); - for(j=0;j32767)val=32767; - else if(val<-32768)val=-32768; - val+=off; - *buffer++=(val&0xff); - *buffer++=(val>>8); - } - vorbis_fpu_restore(fpu); - - } - } - } - - vorbis_synthesis_read(&vf->vd,samples); - hs=vorbis_synthesis_halfrate_p(vf->vi); - vf->pcm_offset+=(samples<current_link; - return(samples*bytespersample); - }else{ - return(samples); - } -} - -long ov_read(OggVorbis_File *vf,char *buffer,int length, - int bigendianp,int word,int sgned,int *bitstream){ - return ov_read_filter(vf, buffer, length, bigendianp, word, sgned, bitstream, NULL, NULL); -} - -/* input values: pcm_channels) a float vector per channel of output - length) the sample length being read by the app - - return values: <0) error/hole in data (OV_HOLE), partial open (OV_EINVAL) - 0) EOF - n) number of samples of PCM actually returned. The - below works on a packet-by-packet basis, so the - return length is not related to the 'length' passed - in, just guaranteed to fit. - - *section) set to the logical bitstream number */ - - - -long ov_read_float(OggVorbis_File *vf,float ***pcm_channels,int length, - int *bitstream){ - - if(vf->ready_stateready_state==INITSET){ - float **pcm; - long samples=vorbis_synthesis_pcmout(&vf->vd,&pcm); - if(samples){ - int hs=vorbis_synthesis_halfrate_p(vf->vi); - if(pcm_channels)*pcm_channels=pcm; - if(samples>length)samples=length; - vorbis_synthesis_read(&vf->vd,samples); - vf->pcm_offset+=samples<current_link; - return samples; - - } - } - - /* suck in another packet */ - { - int ret=_fetch_and_process_packet(vf,NULL,1,1); - if(ret==OV_EOF)return(0); - if(ret<=0)return(ret); - } - - } -} - -extern const float *vorbis_window(vorbis_dsp_state *v,int W); - -static void _ov_splice(float **pcm,float **lappcm, - int n1, int n2, - int ch1, int ch2, - const float *w1, const float *w2){ - int i,j; - const float *w=w1; - int n=n1; - - if(n1>n2){ - n=n2; - w=w2; - } - - /* splice */ - for(j=0;jready_state==INITSET)break; - /* suck in another packet */ - { - int ret=_fetch_and_process_packet(vf,NULL,1,0); - if(ret<0 && ret!=OV_HOLE)return(ret); - } - } - return 0; -} - -/* make sure vf is INITSET and that we have a primed buffer; if - we're crosslapping at a stream section boundary, this also makes - sure we're sanity checking against the right stream information */ -static int _ov_initprime(OggVorbis_File *vf){ - vorbis_dsp_state *vd=&vf->vd; - while(1){ - if(vf->ready_state==INITSET) - if(vorbis_synthesis_pcmout(vd,NULL))break; - - /* suck in another packet */ - { - int ret=_fetch_and_process_packet(vf,NULL,1,0); - if(ret<0 && ret!=OV_HOLE)return(ret); - } - } - return 0; -} - -/* grab enough data for lapping from vf; this may be in the form of - unreturned, already-decoded pcm, remaining PCM we will need to - decode, or synthetic postextrapolation from last packets. */ -static void _ov_getlap(OggVorbis_File *vf,vorbis_info *vi,vorbis_dsp_state *vd, - float **lappcm,int lapsize){ - int lapcount=0,i; - float **pcm; - - /* try first to decode the lapping data */ - while(lapcountlapsize-lapcount)samples=lapsize-lapcount; - for(i=0;ichannels;i++) - memcpy(lappcm[i]+lapcount,pcm[i],sizeof(**pcm)*samples); - lapcount+=samples; - vorbis_synthesis_read(vd,samples); - }else{ - /* suck in another packet */ - int ret=_fetch_and_process_packet(vf,NULL,1,0); /* do *not* span */ - if(ret==OV_EOF)break; - } - } - if(lapcountvd,&pcm); - if(samples==0){ - for(i=0;ichannels;i++) - memset(lappcm[i]+lapcount,0,sizeof(**pcm)*lapsize-lapcount); - lapcount=lapsize; - }else{ - if(samples>lapsize-lapcount)samples=lapsize-lapcount; - for(i=0;ichannels;i++) - memcpy(lappcm[i]+lapcount,pcm[i],sizeof(**pcm)*samples); - lapcount+=samples; - } - } -} - -/* this sets up crosslapping of a sample by using trailing data from - sample 1 and lapping it into the windowing buffer of sample 2 */ -int ov_crosslap(OggVorbis_File *vf1, OggVorbis_File *vf2){ - vorbis_info *vi1,*vi2; - float **lappcm; - float **pcm; - const float *w1,*w2; - int n1,n2,i,ret,hs1,hs2; - - if(vf1==vf2)return(0); /* degenerate case */ - if(vf1->ready_stateready_statechannels); - n1=vorbis_info_blocksize(vi1,0)>>(1+hs1); - n2=vorbis_info_blocksize(vi2,0)>>(1+hs2); - w1=vorbis_window(&vf1->vd,0); - w2=vorbis_window(&vf2->vd,0); - - for(i=0;ichannels;i++) - lappcm[i]=alloca(sizeof(**lappcm)*n1); - - _ov_getlap(vf1,vi1,&vf1->vd,lappcm,n1); - - /* have a lapping buffer from vf1; now to splice it into the lapping - buffer of vf2 */ - /* consolidate and expose the buffer. */ - vorbis_synthesis_lapout(&vf2->vd,&pcm); - -#if 0 - _analysis_output_always("pcmL",0,pcm[0],n1*2,0,0,0); - _analysis_output_always("pcmR",0,pcm[1],n1*2,0,0,0); -#endif - - /* splice */ - _ov_splice(pcm,lappcm,n1,n2,vi1->channels,vi2->channels,w1,w2); - - /* done */ - return(0); -} - -static int _ov_64_seek_lap(OggVorbis_File *vf,ogg_int64_t pos, - int (*localseek)(OggVorbis_File *,ogg_int64_t)){ - vorbis_info *vi; - float **lappcm; - float **pcm; - const float *w1,*w2; - int n1,n2,ch1,ch2,hs; - int i,ret; - - if(vf->ready_statechannels; - n1=vorbis_info_blocksize(vi,0)>>(1+hs); - w1=vorbis_window(&vf->vd,0); /* window arrays from libvorbis are - persistent; even if the decode state - from this link gets dumped, this - window array continues to exist */ - - lappcm=alloca(sizeof(*lappcm)*ch1); - for(i=0;ivd,lappcm,n1); - - /* have lapping data; seek and prime the buffer */ - ret=localseek(vf,pos); - if(ret)return ret; - ret=_ov_initprime(vf); - if(ret)return(ret); - - /* Guard against cross-link changes; they're perfectly legal */ - vi=ov_info(vf,-1); - ch2=vi->channels; - n2=vorbis_info_blocksize(vi,0)>>(1+hs); - w2=vorbis_window(&vf->vd,0); - - /* consolidate and expose the buffer. */ - vorbis_synthesis_lapout(&vf->vd,&pcm); - - /* splice */ - _ov_splice(pcm,lappcm,n1,n2,ch1,ch2,w1,w2); - - /* done */ - return(0); -} - -int ov_raw_seek_lap(OggVorbis_File *vf,ogg_int64_t pos){ - return _ov_64_seek_lap(vf,pos,ov_raw_seek); -} - -int ov_pcm_seek_lap(OggVorbis_File *vf,ogg_int64_t pos){ - return _ov_64_seek_lap(vf,pos,ov_pcm_seek); -} - -int ov_pcm_seek_page_lap(OggVorbis_File *vf,ogg_int64_t pos){ - return _ov_64_seek_lap(vf,pos,ov_pcm_seek_page); -} - -static int _ov_d_seek_lap(OggVorbis_File *vf,double pos, - int (*localseek)(OggVorbis_File *,double)){ - vorbis_info *vi; - float **lappcm; - float **pcm; - const float *w1,*w2; - int n1,n2,ch1,ch2,hs; - int i,ret; - - if(vf->ready_statechannels; - n1=vorbis_info_blocksize(vi,0)>>(1+hs); - w1=vorbis_window(&vf->vd,0); /* window arrays from libvorbis are - persistent; even if the decode state - from this link gets dumped, this - window array continues to exist */ - - lappcm=alloca(sizeof(*lappcm)*ch1); - for(i=0;ivd,lappcm,n1); - - /* have lapping data; seek and prime the buffer */ - ret=localseek(vf,pos); - if(ret)return ret; - ret=_ov_initprime(vf); - if(ret)return(ret); - - /* Guard against cross-link changes; they're perfectly legal */ - vi=ov_info(vf,-1); - ch2=vi->channels; - n2=vorbis_info_blocksize(vi,0)>>(1+hs); - w2=vorbis_window(&vf->vd,0); - - /* consolidate and expose the buffer. */ - vorbis_synthesis_lapout(&vf->vd,&pcm); - - /* splice */ - _ov_splice(pcm,lappcm,n1,n2,ch1,ch2,w1,w2); - - /* done */ - return(0); -} - -int ov_time_seek_lap(OggVorbis_File *vf,double pos){ - return _ov_d_seek_lap(vf,pos,ov_time_seek); -} - -int ov_time_seek_page_lap(OggVorbis_File *vf,double pos){ - return _ov_d_seek_lap(vf,pos,ov_time_seek_page); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/window.c b/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/window.c deleted file mode 100644 index 0305b792..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/libvorbis/src/window.c +++ /dev/null @@ -1,2136 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: window functions - last mod: $Id: window.c 19028 2013-12-02 23:23:39Z tterribe $ - - ********************************************************************/ - -#include -#include -#include "os.h" -#include "misc.h" -#include "window.h" - -static const float vwin64[32] = { - 0.0009460463F, 0.0085006468F, 0.0235352254F, 0.0458950567F, - 0.0753351908F, 0.1115073077F, 0.1539457973F, 0.2020557475F, - 0.2551056759F, 0.3122276645F, 0.3724270287F, 0.4346027792F, - 0.4975789974F, 0.5601459521F, 0.6211085051F, 0.6793382689F, - 0.7338252629F, 0.7837245849F, 0.8283939355F, 0.8674186656F, - 0.9006222429F, 0.9280614787F, 0.9500073081F, 0.9669131782F, - 0.9793740220F, 0.9880792941F, 0.9937636139F, 0.9971582668F, - 0.9989462667F, 0.9997230082F, 0.9999638688F, 0.9999995525F, -}; - -static const float vwin128[64] = { - 0.0002365472F, 0.0021280687F, 0.0059065254F, 0.0115626550F, - 0.0190823442F, 0.0284463735F, 0.0396300935F, 0.0526030430F, - 0.0673285281F, 0.0837631763F, 0.1018564887F, 0.1215504095F, - 0.1427789367F, 0.1654677960F, 0.1895342001F, 0.2148867160F, - 0.2414252576F, 0.2690412240F, 0.2976177952F, 0.3270303960F, - 0.3571473350F, 0.3878306189F, 0.4189369387F, 0.4503188188F, - 0.4818259135F, 0.5133064334F, 0.5446086751F, 0.5755826278F, - 0.6060816248F, 0.6359640047F, 0.6650947483F, 0.6933470543F, - 0.7206038179F, 0.7467589810F, 0.7717187213F, 0.7954024542F, - 0.8177436264F, 0.8386902831F, 0.8582053981F, 0.8762669622F, - 0.8928678298F, 0.9080153310F, 0.9217306608F, 0.9340480615F, - 0.9450138200F, 0.9546851041F, 0.9631286621F, 0.9704194171F, - 0.9766389810F, 0.9818741197F, 0.9862151938F, 0.9897546035F, - 0.9925852598F, 0.9947991032F, 0.9964856900F, 0.9977308602F, - 0.9986155015F, 0.9992144193F, 0.9995953200F, 0.9998179155F, - 0.9999331503F, 0.9999825563F, 0.9999977357F, 0.9999999720F, -}; - -static const float vwin256[128] = { - 0.0000591390F, 0.0005321979F, 0.0014780301F, 0.0028960636F, - 0.0047854363F, 0.0071449926F, 0.0099732775F, 0.0132685298F, - 0.0170286741F, 0.0212513119F, 0.0259337111F, 0.0310727950F, - 0.0366651302F, 0.0427069140F, 0.0491939614F, 0.0561216907F, - 0.0634851102F, 0.0712788035F, 0.0794969160F, 0.0881331402F, - 0.0971807028F, 0.1066323515F, 0.1164803426F, 0.1267164297F, - 0.1373318534F, 0.1483173323F, 0.1596630553F, 0.1713586755F, - 0.1833933062F, 0.1957555184F, 0.2084333404F, 0.2214142599F, - 0.2346852280F, 0.2482326664F, 0.2620424757F, 0.2761000481F, - 0.2903902813F, 0.3048975959F, 0.3196059553F, 0.3344988887F, - 0.3495595160F, 0.3647705766F, 0.3801144597F, 0.3955732382F, - 0.4111287047F, 0.4267624093F, 0.4424557009F, 0.4581897696F, - 0.4739456913F, 0.4897044744F, 0.5054471075F, 0.5211546088F, - 0.5368080763F, 0.5523887395F, 0.5678780103F, 0.5832575361F, - 0.5985092508F, 0.6136154277F, 0.6285587300F, 0.6433222619F, - 0.6578896175F, 0.6722449294F, 0.6863729144F, 0.7002589187F, - 0.7138889597F, 0.7272497662F, 0.7403288154F, 0.7531143679F, - 0.7655954985F, 0.7777621249F, 0.7896050322F, 0.8011158947F, - 0.8122872932F, 0.8231127294F, 0.8335866365F, 0.8437043850F, - 0.8534622861F, 0.8628575905F, 0.8718884835F, 0.8805540765F, - 0.8888543947F, 0.8967903616F, 0.9043637797F, 0.9115773078F, - 0.9184344360F, 0.9249394562F, 0.9310974312F, 0.9369141608F, - 0.9423961446F, 0.9475505439F, 0.9523851406F, 0.9569082947F, - 0.9611289005F, 0.9650563408F, 0.9687004405F, 0.9720714191F, - 0.9751798427F, 0.9780365753F, 0.9806527301F, 0.9830396204F, - 0.9852087111F, 0.9871715701F, 0.9889398207F, 0.9905250941F, - 0.9919389832F, 0.9931929973F, 0.9942985174F, 0.9952667537F, - 0.9961087037F, 0.9968351119F, 0.9974564312F, 0.9979827858F, - 0.9984239359F, 0.9987892441F, 0.9990876435F, 0.9993276081F, - 0.9995171241F, 0.9996636648F, 0.9997741654F, 0.9998550016F, - 0.9999119692F, 0.9999502656F, 0.9999744742F, 0.9999885497F, - 0.9999958064F, 0.9999989077F, 0.9999998584F, 0.9999999983F, -}; - -static const float vwin512[256] = { - 0.0000147849F, 0.0001330607F, 0.0003695946F, 0.0007243509F, - 0.0011972759F, 0.0017882983F, 0.0024973285F, 0.0033242588F, - 0.0042689632F, 0.0053312973F, 0.0065110982F, 0.0078081841F, - 0.0092223540F, 0.0107533880F, 0.0124010466F, 0.0141650703F, - 0.0160451800F, 0.0180410758F, 0.0201524373F, 0.0223789233F, - 0.0247201710F, 0.0271757958F, 0.0297453914F, 0.0324285286F, - 0.0352247556F, 0.0381335972F, 0.0411545545F, 0.0442871045F, - 0.0475306997F, 0.0508847676F, 0.0543487103F, 0.0579219038F, - 0.0616036982F, 0.0653934164F, 0.0692903546F, 0.0732937809F, - 0.0774029356F, 0.0816170305F, 0.0859352485F, 0.0903567428F, - 0.0948806375F, 0.0995060259F, 0.1042319712F, 0.1090575056F, - 0.1139816300F, 0.1190033137F, 0.1241214941F, 0.1293350764F, - 0.1346429333F, 0.1400439046F, 0.1455367974F, 0.1511203852F, - 0.1567934083F, 0.1625545735F, 0.1684025537F, 0.1743359881F, - 0.1803534820F, 0.1864536069F, 0.1926349000F, 0.1988958650F, - 0.2052349715F, 0.2116506555F, 0.2181413191F, 0.2247053313F, - 0.2313410275F, 0.2380467105F, 0.2448206500F, 0.2516610835F, - 0.2585662164F, 0.2655342226F, 0.2725632448F, 0.2796513950F, - 0.2867967551F, 0.2939973773F, 0.3012512852F, 0.3085564739F, - 0.3159109111F, 0.3233125375F, 0.3307592680F, 0.3382489922F, - 0.3457795756F, 0.3533488602F, 0.3609546657F, 0.3685947904F, - 0.3762670121F, 0.3839690896F, 0.3916987634F, 0.3994537572F, - 0.4072317788F, 0.4150305215F, 0.4228476653F, 0.4306808783F, - 0.4385278181F, 0.4463861329F, 0.4542534630F, 0.4621274424F, - 0.4700057001F, 0.4778858615F, 0.4857655502F, 0.4936423891F, - 0.5015140023F, 0.5093780165F, 0.5172320626F, 0.5250737772F, - 0.5329008043F, 0.5407107971F, 0.5485014192F, 0.5562703465F, - 0.5640152688F, 0.5717338914F, 0.5794239366F, 0.5870831457F, - 0.5947092801F, 0.6023001235F, 0.6098534829F, 0.6173671907F, - 0.6248391059F, 0.6322671161F, 0.6396491384F, 0.6469831217F, - 0.6542670475F, 0.6614989319F, 0.6686768267F, 0.6757988210F, - 0.6828630426F, 0.6898676592F, 0.6968108799F, 0.7036909564F, - 0.7105061843F, 0.7172549043F, 0.7239355032F, 0.7305464154F, - 0.7370861235F, 0.7435531598F, 0.7499461068F, 0.7562635986F, - 0.7625043214F, 0.7686670148F, 0.7747504721F, 0.7807535410F, - 0.7866751247F, 0.7925141825F, 0.7982697296F, 0.8039408387F, - 0.8095266395F, 0.8150263196F, 0.8204391248F, 0.8257643590F, - 0.8310013848F, 0.8361496236F, 0.8412085555F, 0.8461777194F, - 0.8510567129F, 0.8558451924F, 0.8605428730F, 0.8651495278F, - 0.8696649882F, 0.8740891432F, 0.8784219392F, 0.8826633797F, - 0.8868135244F, 0.8908724888F, 0.8948404441F, 0.8987176157F, - 0.9025042831F, 0.9062007791F, 0.9098074886F, 0.9133248482F, - 0.9167533451F, 0.9200935163F, 0.9233459472F, 0.9265112712F, - 0.9295901680F, 0.9325833632F, 0.9354916263F, 0.9383157705F, - 0.9410566504F, 0.9437151618F, 0.9462922398F, 0.9487888576F, - 0.9512060252F, 0.9535447882F, 0.9558062262F, 0.9579914516F, - 0.9601016078F, 0.9621378683F, 0.9641014348F, 0.9659935361F, - 0.9678154261F, 0.9695683830F, 0.9712537071F, 0.9728727198F, - 0.9744267618F, 0.9759171916F, 0.9773453842F, 0.9787127293F, - 0.9800206298F, 0.9812705006F, 0.9824637665F, 0.9836018613F, - 0.9846862258F, 0.9857183066F, 0.9866995544F, 0.9876314227F, - 0.9885153662F, 0.9893528393F, 0.9901452948F, 0.9908941823F, - 0.9916009470F, 0.9922670279F, 0.9928938570F, 0.9934828574F, - 0.9940354423F, 0.9945530133F, 0.9950369595F, 0.9954886562F, - 0.9959094633F, 0.9963007242F, 0.9966637649F, 0.9969998925F, - 0.9973103939F, 0.9975965351F, 0.9978595598F, 0.9981006885F, - 0.9983211172F, 0.9985220166F, 0.9987045311F, 0.9988697776F, - 0.9990188449F, 0.9991527924F, 0.9992726499F, 0.9993794157F, - 0.9994740570F, 0.9995575079F, 0.9996306699F, 0.9996944099F, - 0.9997495605F, 0.9997969190F, 0.9998372465F, 0.9998712678F, - 0.9998996704F, 0.9999231041F, 0.9999421807F, 0.9999574732F, - 0.9999695157F, 0.9999788026F, 0.9999857885F, 0.9999908879F, - 0.9999944746F, 0.9999968817F, 0.9999984010F, 0.9999992833F, - 0.9999997377F, 0.9999999317F, 0.9999999911F, 0.9999999999F, -}; - -static const float vwin1024[512] = { - 0.0000036962F, 0.0000332659F, 0.0000924041F, 0.0001811086F, - 0.0002993761F, 0.0004472021F, 0.0006245811F, 0.0008315063F, - 0.0010679699F, 0.0013339631F, 0.0016294757F, 0.0019544965F, - 0.0023090133F, 0.0026930125F, 0.0031064797F, 0.0035493989F, - 0.0040217533F, 0.0045235250F, 0.0050546946F, 0.0056152418F, - 0.0062051451F, 0.0068243817F, 0.0074729278F, 0.0081507582F, - 0.0088578466F, 0.0095941655F, 0.0103596863F, 0.0111543789F, - 0.0119782122F, 0.0128311538F, 0.0137131701F, 0.0146242260F, - 0.0155642855F, 0.0165333111F, 0.0175312640F, 0.0185581042F, - 0.0196137903F, 0.0206982797F, 0.0218115284F, 0.0229534910F, - 0.0241241208F, 0.0253233698F, 0.0265511886F, 0.0278075263F, - 0.0290923308F, 0.0304055484F, 0.0317471241F, 0.0331170013F, - 0.0345151222F, 0.0359414274F, 0.0373958560F, 0.0388783456F, - 0.0403888325F, 0.0419272511F, 0.0434935347F, 0.0450876148F, - 0.0467094213F, 0.0483588828F, 0.0500359261F, 0.0517404765F, - 0.0534724575F, 0.0552317913F, 0.0570183983F, 0.0588321971F, - 0.0606731048F, 0.0625410369F, 0.0644359070F, 0.0663576272F, - 0.0683061077F, 0.0702812571F, 0.0722829821F, 0.0743111878F, - 0.0763657775F, 0.0784466526F, 0.0805537129F, 0.0826868561F, - 0.0848459782F, 0.0870309736F, 0.0892417345F, 0.0914781514F, - 0.0937401128F, 0.0960275056F, 0.0983402145F, 0.1006781223F, - 0.1030411101F, 0.1054290568F, 0.1078418397F, 0.1102793336F, - 0.1127414119F, 0.1152279457F, 0.1177388042F, 0.1202738544F, - 0.1228329618F, 0.1254159892F, 0.1280227980F, 0.1306532471F, - 0.1333071937F, 0.1359844927F, 0.1386849970F, 0.1414085575F, - 0.1441550230F, 0.1469242403F, 0.1497160539F, 0.1525303063F, - 0.1553668381F, 0.1582254875F, 0.1611060909F, 0.1640084822F, - 0.1669324936F, 0.1698779549F, 0.1728446939F, 0.1758325362F, - 0.1788413055F, 0.1818708232F, 0.1849209084F, 0.1879913785F, - 0.1910820485F, 0.1941927312F, 0.1973232376F, 0.2004733764F, - 0.2036429541F, 0.2068317752F, 0.2100396421F, 0.2132663552F, - 0.2165117125F, 0.2197755102F, 0.2230575422F, 0.2263576007F, - 0.2296754753F, 0.2330109540F, 0.2363638225F, 0.2397338646F, - 0.2431208619F, 0.2465245941F, 0.2499448389F, 0.2533813719F, - 0.2568339669F, 0.2603023956F, 0.2637864277F, 0.2672858312F, - 0.2708003718F, 0.2743298135F, 0.2778739186F, 0.2814324472F, - 0.2850051576F, 0.2885918065F, 0.2921921485F, 0.2958059366F, - 0.2994329219F, 0.3030728538F, 0.3067254799F, 0.3103905462F, - 0.3140677969F, 0.3177569747F, 0.3214578205F, 0.3251700736F, - 0.3288934718F, 0.3326277513F, 0.3363726468F, 0.3401278914F, - 0.3438932168F, 0.3476683533F, 0.3514530297F, 0.3552469734F, - 0.3590499106F, 0.3628615659F, 0.3666816630F, 0.3705099239F, - 0.3743460698F, 0.3781898204F, 0.3820408945F, 0.3858990095F, - 0.3897638820F, 0.3936352274F, 0.3975127601F, 0.4013961936F, - 0.4052852405F, 0.4091796123F, 0.4130790198F, 0.4169831732F, - 0.4208917815F, 0.4248045534F, 0.4287211965F, 0.4326414181F, - 0.4365649248F, 0.4404914225F, 0.4444206167F, 0.4483522125F, - 0.4522859146F, 0.4562214270F, 0.4601584538F, 0.4640966984F, - 0.4680358644F, 0.4719756548F, 0.4759157726F, 0.4798559209F, - 0.4837958024F, 0.4877351199F, 0.4916735765F, 0.4956108751F, - 0.4995467188F, 0.5034808109F, 0.5074128550F, 0.5113425550F, - 0.5152696149F, 0.5191937395F, 0.5231146336F, 0.5270320028F, - 0.5309455530F, 0.5348549910F, 0.5387600239F, 0.5426603597F, - 0.5465557070F, 0.5504457754F, 0.5543302752F, 0.5582089175F, - 0.5620814145F, 0.5659474793F, 0.5698068262F, 0.5736591704F, - 0.5775042283F, 0.5813417176F, 0.5851713571F, 0.5889928670F, - 0.5928059689F, 0.5966103856F, 0.6004058415F, 0.6041920626F, - 0.6079687761F, 0.6117357113F, 0.6154925986F, 0.6192391705F, - 0.6229751612F, 0.6267003064F, 0.6304143441F, 0.6341170137F, - 0.6378080569F, 0.6414872173F, 0.6451542405F, 0.6488088741F, - 0.6524508681F, 0.6560799742F, 0.6596959469F, 0.6632985424F, - 0.6668875197F, 0.6704626398F, 0.6740236662F, 0.6775703649F, - 0.6811025043F, 0.6846198554F, 0.6881221916F, 0.6916092892F, - 0.6950809269F, 0.6985368861F, 0.7019769510F, 0.7054009085F, - 0.7088085484F, 0.7121996632F, 0.7155740484F, 0.7189315023F, - 0.7222718263F, 0.7255948245F, 0.7289003043F, 0.7321880760F, - 0.7354579530F, 0.7387097518F, 0.7419432921F, 0.7451583966F, - 0.7483548915F, 0.7515326059F, 0.7546913723F, 0.7578310265F, - 0.7609514077F, 0.7640523581F, 0.7671337237F, 0.7701953535F, - 0.7732371001F, 0.7762588195F, 0.7792603711F, 0.7822416178F, - 0.7852024259F, 0.7881426654F, 0.7910622097F, 0.7939609356F, - 0.7968387237F, 0.7996954579F, 0.8025310261F, 0.8053453193F, - 0.8081382324F, 0.8109096638F, 0.8136595156F, 0.8163876936F, - 0.8190941071F, 0.8217786690F, 0.8244412960F, 0.8270819086F, - 0.8297004305F, 0.8322967896F, 0.8348709171F, 0.8374227481F, - 0.8399522213F, 0.8424592789F, 0.8449438672F, 0.8474059356F, - 0.8498454378F, 0.8522623306F, 0.8546565748F, 0.8570281348F, - 0.8593769787F, 0.8617030779F, 0.8640064080F, 0.8662869477F, - 0.8685446796F, 0.8707795899F, 0.8729916682F, 0.8751809079F, - 0.8773473059F, 0.8794908626F, 0.8816115819F, 0.8837094713F, - 0.8857845418F, 0.8878368079F, 0.8898662874F, 0.8918730019F, - 0.8938569760F, 0.8958182380F, 0.8977568194F, 0.8996727552F, - 0.9015660837F, 0.9034368465F, 0.9052850885F, 0.9071108577F, - 0.9089142057F, 0.9106951869F, 0.9124538591F, 0.9141902832F, - 0.9159045233F, 0.9175966464F, 0.9192667228F, 0.9209148257F, - 0.9225410313F, 0.9241454187F, 0.9257280701F, 0.9272890704F, - 0.9288285075F, 0.9303464720F, 0.9318430576F, 0.9333183603F, - 0.9347724792F, 0.9362055158F, 0.9376175745F, 0.9390087622F, - 0.9403791881F, 0.9417289644F, 0.9430582055F, 0.9443670283F, - 0.9456555521F, 0.9469238986F, 0.9481721917F, 0.9494005577F, - 0.9506091252F, 0.9517980248F, 0.9529673894F, 0.9541173540F, - 0.9552480557F, 0.9563596334F, 0.9574522282F, 0.9585259830F, - 0.9595810428F, 0.9606175542F, 0.9616356656F, 0.9626355274F, - 0.9636172915F, 0.9645811114F, 0.9655271425F, 0.9664555414F, - 0.9673664664F, 0.9682600774F, 0.9691365355F, 0.9699960034F, - 0.9708386448F, 0.9716646250F, 0.9724741103F, 0.9732672685F, - 0.9740442683F, 0.9748052795F, 0.9755504729F, 0.9762800205F, - 0.9769940950F, 0.9776928703F, 0.9783765210F, 0.9790452223F, - 0.9796991504F, 0.9803384823F, 0.9809633954F, 0.9815740679F, - 0.9821706784F, 0.9827534063F, 0.9833224312F, 0.9838779332F, - 0.9844200928F, 0.9849490910F, 0.9854651087F, 0.9859683274F, - 0.9864589286F, 0.9869370940F, 0.9874030054F, 0.9878568447F, - 0.9882987937F, 0.9887290343F, 0.9891477481F, 0.9895551169F, - 0.9899513220F, 0.9903365446F, 0.9907109658F, 0.9910747662F, - 0.9914281260F, 0.9917712252F, 0.9921042433F, 0.9924273593F, - 0.9927407516F, 0.9930445982F, 0.9933390763F, 0.9936243626F, - 0.9939006331F, 0.9941680631F, 0.9944268269F, 0.9946770982F, - 0.9949190498F, 0.9951528537F, 0.9953786808F, 0.9955967011F, - 0.9958070836F, 0.9960099963F, 0.9962056061F, 0.9963940787F, - 0.9965755786F, 0.9967502693F, 0.9969183129F, 0.9970798704F, - 0.9972351013F, 0.9973841640F, 0.9975272151F, 0.9976644103F, - 0.9977959036F, 0.9979218476F, 0.9980423932F, 0.9981576901F, - 0.9982678862F, 0.9983731278F, 0.9984735596F, 0.9985693247F, - 0.9986605645F, 0.9987474186F, 0.9988300248F, 0.9989085193F, - 0.9989830364F, 0.9990537085F, 0.9991206662F, 0.9991840382F, - 0.9992439513F, 0.9993005303F, 0.9993538982F, 0.9994041757F, - 0.9994514817F, 0.9994959330F, 0.9995376444F, 0.9995767286F, - 0.9996132960F, 0.9996474550F, 0.9996793121F, 0.9997089710F, - 0.9997365339F, 0.9997621003F, 0.9997857677F, 0.9998076311F, - 0.9998277836F, 0.9998463156F, 0.9998633155F, 0.9998788692F, - 0.9998930603F, 0.9999059701F, 0.9999176774F, 0.9999282586F, - 0.9999377880F, 0.9999463370F, 0.9999539749F, 0.9999607685F, - 0.9999667820F, 0.9999720773F, 0.9999767136F, 0.9999807479F, - 0.9999842344F, 0.9999872249F, 0.9999897688F, 0.9999919127F, - 0.9999937009F, 0.9999951749F, 0.9999963738F, 0.9999973342F, - 0.9999980900F, 0.9999986724F, 0.9999991103F, 0.9999994297F, - 0.9999996543F, 0.9999998049F, 0.9999999000F, 0.9999999552F, - 0.9999999836F, 0.9999999957F, 0.9999999994F, 1.0000000000F, -}; - -static const float vwin2048[1024] = { - 0.0000009241F, 0.0000083165F, 0.0000231014F, 0.0000452785F, - 0.0000748476F, 0.0001118085F, 0.0001561608F, 0.0002079041F, - 0.0002670379F, 0.0003335617F, 0.0004074748F, 0.0004887765F, - 0.0005774661F, 0.0006735427F, 0.0007770054F, 0.0008878533F, - 0.0010060853F, 0.0011317002F, 0.0012646969F, 0.0014050742F, - 0.0015528307F, 0.0017079650F, 0.0018704756F, 0.0020403610F, - 0.0022176196F, 0.0024022497F, 0.0025942495F, 0.0027936173F, - 0.0030003511F, 0.0032144490F, 0.0034359088F, 0.0036647286F, - 0.0039009061F, 0.0041444391F, 0.0043953253F, 0.0046535621F, - 0.0049191472F, 0.0051920781F, 0.0054723520F, 0.0057599664F, - 0.0060549184F, 0.0063572052F, 0.0066668239F, 0.0069837715F, - 0.0073080449F, 0.0076396410F, 0.0079785566F, 0.0083247884F, - 0.0086783330F, 0.0090391871F, 0.0094073470F, 0.0097828092F, - 0.0101655700F, 0.0105556258F, 0.0109529726F, 0.0113576065F, - 0.0117695237F, 0.0121887200F, 0.0126151913F, 0.0130489335F, - 0.0134899422F, 0.0139382130F, 0.0143937415F, 0.0148565233F, - 0.0153265536F, 0.0158038279F, 0.0162883413F, 0.0167800889F, - 0.0172790660F, 0.0177852675F, 0.0182986882F, 0.0188193231F, - 0.0193471668F, 0.0198822141F, 0.0204244594F, 0.0209738974F, - 0.0215305225F, 0.0220943289F, 0.0226653109F, 0.0232434627F, - 0.0238287784F, 0.0244212519F, 0.0250208772F, 0.0256276481F, - 0.0262415582F, 0.0268626014F, 0.0274907711F, 0.0281260608F, - 0.0287684638F, 0.0294179736F, 0.0300745833F, 0.0307382859F, - 0.0314090747F, 0.0320869424F, 0.0327718819F, 0.0334638860F, - 0.0341629474F, 0.0348690586F, 0.0355822122F, 0.0363024004F, - 0.0370296157F, 0.0377638502F, 0.0385050960F, 0.0392533451F, - 0.0400085896F, 0.0407708211F, 0.0415400315F, 0.0423162123F, - 0.0430993552F, 0.0438894515F, 0.0446864926F, 0.0454904698F, - 0.0463013742F, 0.0471191969F, 0.0479439288F, 0.0487755607F, - 0.0496140836F, 0.0504594879F, 0.0513117642F, 0.0521709031F, - 0.0530368949F, 0.0539097297F, 0.0547893979F, 0.0556758894F, - 0.0565691941F, 0.0574693019F, 0.0583762026F, 0.0592898858F, - 0.0602103410F, 0.0611375576F, 0.0620715250F, 0.0630122324F, - 0.0639596688F, 0.0649138234F, 0.0658746848F, 0.0668422421F, - 0.0678164838F, 0.0687973985F, 0.0697849746F, 0.0707792005F, - 0.0717800645F, 0.0727875547F, 0.0738016591F, 0.0748223656F, - 0.0758496620F, 0.0768835359F, 0.0779239751F, 0.0789709668F, - 0.0800244985F, 0.0810845574F, 0.0821511306F, 0.0832242052F, - 0.0843037679F, 0.0853898056F, 0.0864823050F, 0.0875812525F, - 0.0886866347F, 0.0897984378F, 0.0909166480F, 0.0920412513F, - 0.0931722338F, 0.0943095813F, 0.0954532795F, 0.0966033140F, - 0.0977596702F, 0.0989223336F, 0.1000912894F, 0.1012665227F, - 0.1024480185F, 0.1036357616F, 0.1048297369F, 0.1060299290F, - 0.1072363224F, 0.1084489014F, 0.1096676504F, 0.1108925534F, - 0.1121235946F, 0.1133607577F, 0.1146040267F, 0.1158533850F, - 0.1171088163F, 0.1183703040F, 0.1196378312F, 0.1209113812F, - 0.1221909370F, 0.1234764815F, 0.1247679974F, 0.1260654674F, - 0.1273688740F, 0.1286781995F, 0.1299934263F, 0.1313145365F, - 0.1326415121F, 0.1339743349F, 0.1353129866F, 0.1366574490F, - 0.1380077035F, 0.1393637315F, 0.1407255141F, 0.1420930325F, - 0.1434662677F, 0.1448452004F, 0.1462298115F, 0.1476200814F, - 0.1490159906F, 0.1504175195F, 0.1518246482F, 0.1532373569F, - 0.1546556253F, 0.1560794333F, 0.1575087606F, 0.1589435866F, - 0.1603838909F, 0.1618296526F, 0.1632808509F, 0.1647374648F, - 0.1661994731F, 0.1676668546F, 0.1691395880F, 0.1706176516F, - 0.1721010238F, 0.1735896829F, 0.1750836068F, 0.1765827736F, - 0.1780871610F, 0.1795967468F, 0.1811115084F, 0.1826314234F, - 0.1841564689F, 0.1856866221F, 0.1872218600F, 0.1887621595F, - 0.1903074974F, 0.1918578503F, 0.1934131947F, 0.1949735068F, - 0.1965387630F, 0.1981089393F, 0.1996840117F, 0.2012639560F, - 0.2028487479F, 0.2044383630F, 0.2060327766F, 0.2076319642F, - 0.2092359007F, 0.2108445614F, 0.2124579211F, 0.2140759545F, - 0.2156986364F, 0.2173259411F, 0.2189578432F, 0.2205943168F, - 0.2222353361F, 0.2238808751F, 0.2255309076F, 0.2271854073F, - 0.2288443480F, 0.2305077030F, 0.2321754457F, 0.2338475493F, - 0.2355239869F, 0.2372047315F, 0.2388897560F, 0.2405790329F, - 0.2422725350F, 0.2439702347F, 0.2456721043F, 0.2473781159F, - 0.2490882418F, 0.2508024539F, 0.2525207240F, 0.2542430237F, - 0.2559693248F, 0.2576995986F, 0.2594338166F, 0.2611719498F, - 0.2629139695F, 0.2646598466F, 0.2664095520F, 0.2681630564F, - 0.2699203304F, 0.2716813445F, 0.2734460691F, 0.2752144744F, - 0.2769865307F, 0.2787622079F, 0.2805414760F, 0.2823243047F, - 0.2841106637F, 0.2859005227F, 0.2876938509F, 0.2894906179F, - 0.2912907928F, 0.2930943447F, 0.2949012426F, 0.2967114554F, - 0.2985249520F, 0.3003417009F, 0.3021616708F, 0.3039848301F, - 0.3058111471F, 0.3076405901F, 0.3094731273F, 0.3113087266F, - 0.3131473560F, 0.3149889833F, 0.3168335762F, 0.3186811024F, - 0.3205315294F, 0.3223848245F, 0.3242409552F, 0.3260998886F, - 0.3279615918F, 0.3298260319F, 0.3316931758F, 0.3335629903F, - 0.3354354423F, 0.3373104982F, 0.3391881247F, 0.3410682882F, - 0.3429509551F, 0.3448360917F, 0.3467236642F, 0.3486136387F, - 0.3505059811F, 0.3524006575F, 0.3542976336F, 0.3561968753F, - 0.3580983482F, 0.3600020179F, 0.3619078499F, 0.3638158096F, - 0.3657258625F, 0.3676379737F, 0.3695521086F, 0.3714682321F, - 0.3733863094F, 0.3753063055F, 0.3772281852F, 0.3791519134F, - 0.3810774548F, 0.3830047742F, 0.3849338362F, 0.3868646053F, - 0.3887970459F, 0.3907311227F, 0.3926667998F, 0.3946040417F, - 0.3965428125F, 0.3984830765F, 0.4004247978F, 0.4023679403F, - 0.4043124683F, 0.4062583455F, 0.4082055359F, 0.4101540034F, - 0.4121037117F, 0.4140546246F, 0.4160067058F, 0.4179599190F, - 0.4199142277F, 0.4218695956F, 0.4238259861F, 0.4257833627F, - 0.4277416888F, 0.4297009279F, 0.4316610433F, 0.4336219983F, - 0.4355837562F, 0.4375462803F, 0.4395095337F, 0.4414734797F, - 0.4434380815F, 0.4454033021F, 0.4473691046F, 0.4493354521F, - 0.4513023078F, 0.4532696345F, 0.4552373954F, 0.4572055533F, - 0.4591740713F, 0.4611429123F, 0.4631120393F, 0.4650814151F, - 0.4670510028F, 0.4690207650F, 0.4709906649F, 0.4729606651F, - 0.4749307287F, 0.4769008185F, 0.4788708972F, 0.4808409279F, - 0.4828108732F, 0.4847806962F, 0.4867503597F, 0.4887198264F, - 0.4906890593F, 0.4926580213F, 0.4946266753F, 0.4965949840F, - 0.4985629105F, 0.5005304176F, 0.5024974683F, 0.5044640255F, - 0.5064300522F, 0.5083955114F, 0.5103603659F, 0.5123245790F, - 0.5142881136F, 0.5162509328F, 0.5182129997F, 0.5201742774F, - 0.5221347290F, 0.5240943178F, 0.5260530070F, 0.5280107598F, - 0.5299675395F, 0.5319233095F, 0.5338780330F, 0.5358316736F, - 0.5377841946F, 0.5397355596F, 0.5416857320F, 0.5436346755F, - 0.5455823538F, 0.5475287304F, 0.5494737691F, 0.5514174337F, - 0.5533596881F, 0.5553004962F, 0.5572398218F, 0.5591776291F, - 0.5611138821F, 0.5630485449F, 0.5649815818F, 0.5669129570F, - 0.5688426349F, 0.5707705799F, 0.5726967564F, 0.5746211290F, - 0.5765436624F, 0.5784643212F, 0.5803830702F, 0.5822998743F, - 0.5842146984F, 0.5861275076F, 0.5880382669F, 0.5899469416F, - 0.5918534968F, 0.5937578981F, 0.5956601107F, 0.5975601004F, - 0.5994578326F, 0.6013532732F, 0.6032463880F, 0.6051371429F, - 0.6070255039F, 0.6089114372F, 0.6107949090F, 0.6126758856F, - 0.6145543334F, 0.6164302191F, 0.6183035092F, 0.6201741706F, - 0.6220421700F, 0.6239074745F, 0.6257700513F, 0.6276298674F, - 0.6294868903F, 0.6313410873F, 0.6331924262F, 0.6350408745F, - 0.6368864001F, 0.6387289710F, 0.6405685552F, 0.6424051209F, - 0.6442386364F, 0.6460690702F, 0.6478963910F, 0.6497205673F, - 0.6515415682F, 0.6533593625F, 0.6551739194F, 0.6569852082F, - 0.6587931984F, 0.6605978593F, 0.6623991609F, 0.6641970728F, - 0.6659915652F, 0.6677826081F, 0.6695701718F, 0.6713542268F, - 0.6731347437F, 0.6749116932F, 0.6766850461F, 0.6784547736F, - 0.6802208469F, 0.6819832374F, 0.6837419164F, 0.6854968559F, - 0.6872480275F, 0.6889954034F, 0.6907389556F, 0.6924786566F, - 0.6942144788F, 0.6959463950F, 0.6976743780F, 0.6993984008F, - 0.7011184365F, 0.7028344587F, 0.7045464407F, 0.7062543564F, - 0.7079581796F, 0.7096578844F, 0.7113534450F, 0.7130448359F, - 0.7147320316F, 0.7164150070F, 0.7180937371F, 0.7197681970F, - 0.7214383620F, 0.7231042077F, 0.7247657098F, 0.7264228443F, - 0.7280755871F, 0.7297239147F, 0.7313678035F, 0.7330072301F, - 0.7346421715F, 0.7362726046F, 0.7378985069F, 0.7395198556F, - 0.7411366285F, 0.7427488034F, 0.7443563584F, 0.7459592717F, - 0.7475575218F, 0.7491510873F, 0.7507399471F, 0.7523240803F, - 0.7539034661F, 0.7554780839F, 0.7570479136F, 0.7586129349F, - 0.7601731279F, 0.7617284730F, 0.7632789506F, 0.7648245416F, - 0.7663652267F, 0.7679009872F, 0.7694318044F, 0.7709576599F, - 0.7724785354F, 0.7739944130F, 0.7755052749F, 0.7770111035F, - 0.7785118815F, 0.7800075916F, 0.7814982170F, 0.7829837410F, - 0.7844641472F, 0.7859394191F, 0.7874095408F, 0.7888744965F, - 0.7903342706F, 0.7917888476F, 0.7932382124F, 0.7946823501F, - 0.7961212460F, 0.7975548855F, 0.7989832544F, 0.8004063386F, - 0.8018241244F, 0.8032365981F, 0.8046437463F, 0.8060455560F, - 0.8074420141F, 0.8088331080F, 0.8102188253F, 0.8115991536F, - 0.8129740810F, 0.8143435957F, 0.8157076861F, 0.8170663409F, - 0.8184195489F, 0.8197672994F, 0.8211095817F, 0.8224463853F, - 0.8237777001F, 0.8251035161F, 0.8264238235F, 0.8277386129F, - 0.8290478750F, 0.8303516008F, 0.8316497814F, 0.8329424083F, - 0.8342294731F, 0.8355109677F, 0.8367868841F, 0.8380572148F, - 0.8393219523F, 0.8405810893F, 0.8418346190F, 0.8430825345F, - 0.8443248294F, 0.8455614974F, 0.8467925323F, 0.8480179285F, - 0.8492376802F, 0.8504517822F, 0.8516602292F, 0.8528630164F, - 0.8540601391F, 0.8552515928F, 0.8564373733F, 0.8576174766F, - 0.8587918990F, 0.8599606368F, 0.8611236868F, 0.8622810460F, - 0.8634327113F, 0.8645786802F, 0.8657189504F, 0.8668535195F, - 0.8679823857F, 0.8691055472F, 0.8702230025F, 0.8713347503F, - 0.8724407896F, 0.8735411194F, 0.8746357394F, 0.8757246489F, - 0.8768078479F, 0.8778853364F, 0.8789571146F, 0.8800231832F, - 0.8810835427F, 0.8821381942F, 0.8831871387F, 0.8842303777F, - 0.8852679127F, 0.8862997456F, 0.8873258784F, 0.8883463132F, - 0.8893610527F, 0.8903700994F, 0.8913734562F, 0.8923711263F, - 0.8933631129F, 0.8943494196F, 0.8953300500F, 0.8963050083F, - 0.8972742985F, 0.8982379249F, 0.8991958922F, 0.9001482052F, - 0.9010948688F, 0.9020358883F, 0.9029712690F, 0.9039010165F, - 0.9048251367F, 0.9057436357F, 0.9066565195F, 0.9075637946F, - 0.9084654678F, 0.9093615456F, 0.9102520353F, 0.9111369440F, - 0.9120162792F, 0.9128900484F, 0.9137582595F, 0.9146209204F, - 0.9154780394F, 0.9163296248F, 0.9171756853F, 0.9180162296F, - 0.9188512667F, 0.9196808057F, 0.9205048559F, 0.9213234270F, - 0.9221365285F, 0.9229441704F, 0.9237463629F, 0.9245431160F, - 0.9253344404F, 0.9261203465F, 0.9269008453F, 0.9276759477F, - 0.9284456648F, 0.9292100080F, 0.9299689889F, 0.9307226190F, - 0.9314709103F, 0.9322138747F, 0.9329515245F, 0.9336838721F, - 0.9344109300F, 0.9351327108F, 0.9358492275F, 0.9365604931F, - 0.9372665208F, 0.9379673239F, 0.9386629160F, 0.9393533107F, - 0.9400385220F, 0.9407185637F, 0.9413934501F, 0.9420631954F, - 0.9427278141F, 0.9433873208F, 0.9440417304F, 0.9446910576F, - 0.9453353176F, 0.9459745255F, 0.9466086968F, 0.9472378469F, - 0.9478619915F, 0.9484811463F, 0.9490953274F, 0.9497045506F, - 0.9503088323F, 0.9509081888F, 0.9515026365F, 0.9520921921F, - 0.9526768723F, 0.9532566940F, 0.9538316742F, 0.9544018300F, - 0.9549671786F, 0.9555277375F, 0.9560835241F, 0.9566345562F, - 0.9571808513F, 0.9577224275F, 0.9582593027F, 0.9587914949F, - 0.9593190225F, 0.9598419038F, 0.9603601571F, 0.9608738012F, - 0.9613828546F, 0.9618873361F, 0.9623872646F, 0.9628826591F, - 0.9633735388F, 0.9638599227F, 0.9643418303F, 0.9648192808F, - 0.9652922939F, 0.9657608890F, 0.9662250860F, 0.9666849046F, - 0.9671403646F, 0.9675914861F, 0.9680382891F, 0.9684807937F, - 0.9689190202F, 0.9693529890F, 0.9697827203F, 0.9702082347F, - 0.9706295529F, 0.9710466953F, 0.9714596828F, 0.9718685362F, - 0.9722732762F, 0.9726739240F, 0.9730705005F, 0.9734630267F, - 0.9738515239F, 0.9742360134F, 0.9746165163F, 0.9749930540F, - 0.9753656481F, 0.9757343198F, 0.9760990909F, 0.9764599829F, - 0.9768170175F, 0.9771702164F, 0.9775196013F, 0.9778651941F, - 0.9782070167F, 0.9785450909F, 0.9788794388F, 0.9792100824F, - 0.9795370437F, 0.9798603449F, 0.9801800080F, 0.9804960554F, - 0.9808085092F, 0.9811173916F, 0.9814227251F, 0.9817245318F, - 0.9820228343F, 0.9823176549F, 0.9826090160F, 0.9828969402F, - 0.9831814498F, 0.9834625674F, 0.9837403156F, 0.9840147169F, - 0.9842857939F, 0.9845535692F, 0.9848180654F, 0.9850793052F, - 0.9853373113F, 0.9855921062F, 0.9858437127F, 0.9860921535F, - 0.9863374512F, 0.9865796287F, 0.9868187085F, 0.9870547136F, - 0.9872876664F, 0.9875175899F, 0.9877445067F, 0.9879684396F, - 0.9881894112F, 0.9884074444F, 0.9886225619F, 0.9888347863F, - 0.9890441404F, 0.9892506468F, 0.9894543284F, 0.9896552077F, - 0.9898533074F, 0.9900486502F, 0.9902412587F, 0.9904311555F, - 0.9906183633F, 0.9908029045F, 0.9909848019F, 0.9911640779F, - 0.9913407550F, 0.9915148557F, 0.9916864025F, 0.9918554179F, - 0.9920219241F, 0.9921859437F, 0.9923474989F, 0.9925066120F, - 0.9926633054F, 0.9928176012F, 0.9929695218F, 0.9931190891F, - 0.9932663254F, 0.9934112527F, 0.9935538932F, 0.9936942686F, - 0.9938324012F, 0.9939683126F, 0.9941020248F, 0.9942335597F, - 0.9943629388F, 0.9944901841F, 0.9946153170F, 0.9947383593F, - 0.9948593325F, 0.9949782579F, 0.9950951572F, 0.9952100516F, - 0.9953229625F, 0.9954339111F, 0.9955429186F, 0.9956500062F, - 0.9957551948F, 0.9958585056F, 0.9959599593F, 0.9960595769F, - 0.9961573792F, 0.9962533869F, 0.9963476206F, 0.9964401009F, - 0.9965308483F, 0.9966198833F, 0.9967072261F, 0.9967928971F, - 0.9968769164F, 0.9969593041F, 0.9970400804F, 0.9971192651F, - 0.9971968781F, 0.9972729391F, 0.9973474680F, 0.9974204842F, - 0.9974920074F, 0.9975620569F, 0.9976306521F, 0.9976978122F, - 0.9977635565F, 0.9978279039F, 0.9978908736F, 0.9979524842F, - 0.9980127547F, 0.9980717037F, 0.9981293499F, 0.9981857116F, - 0.9982408073F, 0.9982946554F, 0.9983472739F, 0.9983986810F, - 0.9984488947F, 0.9984979328F, 0.9985458132F, 0.9985925534F, - 0.9986381711F, 0.9986826838F, 0.9987261086F, 0.9987684630F, - 0.9988097640F, 0.9988500286F, 0.9988892738F, 0.9989275163F, - 0.9989647727F, 0.9990010597F, 0.9990363938F, 0.9990707911F, - 0.9991042679F, 0.9991368404F, 0.9991685244F, 0.9991993358F, - 0.9992292905F, 0.9992584038F, 0.9992866914F, 0.9993141686F, - 0.9993408506F, 0.9993667526F, 0.9993918895F, 0.9994162761F, - 0.9994399273F, 0.9994628576F, 0.9994850815F, 0.9995066133F, - 0.9995274672F, 0.9995476574F, 0.9995671978F, 0.9995861021F, - 0.9996043841F, 0.9996220573F, 0.9996391352F, 0.9996556310F, - 0.9996715579F, 0.9996869288F, 0.9997017568F, 0.9997160543F, - 0.9997298342F, 0.9997431088F, 0.9997558905F, 0.9997681914F, - 0.9997800236F, 0.9997913990F, 0.9998023292F, 0.9998128261F, - 0.9998229009F, 0.9998325650F, 0.9998418296F, 0.9998507058F, - 0.9998592044F, 0.9998673362F, 0.9998751117F, 0.9998825415F, - 0.9998896358F, 0.9998964047F, 0.9999028584F, 0.9999090066F, - 0.9999148590F, 0.9999204253F, 0.9999257148F, 0.9999307368F, - 0.9999355003F, 0.9999400144F, 0.9999442878F, 0.9999483293F, - 0.9999521472F, 0.9999557499F, 0.9999591457F, 0.9999623426F, - 0.9999653483F, 0.9999681708F, 0.9999708175F, 0.9999732959F, - 0.9999756132F, 0.9999777765F, 0.9999797928F, 0.9999816688F, - 0.9999834113F, 0.9999850266F, 0.9999865211F, 0.9999879009F, - 0.9999891721F, 0.9999903405F, 0.9999914118F, 0.9999923914F, - 0.9999932849F, 0.9999940972F, 0.9999948336F, 0.9999954989F, - 0.9999960978F, 0.9999966349F, 0.9999971146F, 0.9999975411F, - 0.9999979185F, 0.9999982507F, 0.9999985414F, 0.9999987944F, - 0.9999990129F, 0.9999992003F, 0.9999993596F, 0.9999994939F, - 0.9999996059F, 0.9999996981F, 0.9999997732F, 0.9999998333F, - 0.9999998805F, 0.9999999170F, 0.9999999444F, 0.9999999643F, - 0.9999999784F, 0.9999999878F, 0.9999999937F, 0.9999999972F, - 0.9999999990F, 0.9999999997F, 1.0000000000F, 1.0000000000F, -}; - -static const float vwin4096[2048] = { - 0.0000002310F, 0.0000020791F, 0.0000057754F, 0.0000113197F, - 0.0000187121F, 0.0000279526F, 0.0000390412F, 0.0000519777F, - 0.0000667623F, 0.0000833949F, 0.0001018753F, 0.0001222036F, - 0.0001443798F, 0.0001684037F, 0.0001942754F, 0.0002219947F, - 0.0002515616F, 0.0002829761F, 0.0003162380F, 0.0003513472F, - 0.0003883038F, 0.0004271076F, 0.0004677584F, 0.0005102563F, - 0.0005546011F, 0.0006007928F, 0.0006488311F, 0.0006987160F, - 0.0007504474F, 0.0008040251F, 0.0008594490F, 0.0009167191F, - 0.0009758351F, 0.0010367969F, 0.0010996044F, 0.0011642574F, - 0.0012307558F, 0.0012990994F, 0.0013692880F, 0.0014413216F, - 0.0015151998F, 0.0015909226F, 0.0016684898F, 0.0017479011F, - 0.0018291565F, 0.0019122556F, 0.0019971983F, 0.0020839845F, - 0.0021726138F, 0.0022630861F, 0.0023554012F, 0.0024495588F, - 0.0025455588F, 0.0026434008F, 0.0027430847F, 0.0028446103F, - 0.0029479772F, 0.0030531853F, 0.0031602342F, 0.0032691238F, - 0.0033798538F, 0.0034924239F, 0.0036068338F, 0.0037230833F, - 0.0038411721F, 0.0039610999F, 0.0040828664F, 0.0042064714F, - 0.0043319145F, 0.0044591954F, 0.0045883139F, 0.0047192696F, - 0.0048520622F, 0.0049866914F, 0.0051231569F, 0.0052614583F, - 0.0054015953F, 0.0055435676F, 0.0056873748F, 0.0058330166F, - 0.0059804926F, 0.0061298026F, 0.0062809460F, 0.0064339226F, - 0.0065887320F, 0.0067453738F, 0.0069038476F, 0.0070641531F, - 0.0072262899F, 0.0073902575F, 0.0075560556F, 0.0077236838F, - 0.0078931417F, 0.0080644288F, 0.0082375447F, 0.0084124891F, - 0.0085892615F, 0.0087678614F, 0.0089482885F, 0.0091305422F, - 0.0093146223F, 0.0095005281F, 0.0096882592F, 0.0098778153F, - 0.0100691958F, 0.0102624002F, 0.0104574281F, 0.0106542791F, - 0.0108529525F, 0.0110534480F, 0.0112557651F, 0.0114599032F, - 0.0116658618F, 0.0118736405F, 0.0120832387F, 0.0122946560F, - 0.0125078917F, 0.0127229454F, 0.0129398166F, 0.0131585046F, - 0.0133790090F, 0.0136013292F, 0.0138254647F, 0.0140514149F, - 0.0142791792F, 0.0145087572F, 0.0147401481F, 0.0149733515F, - 0.0152083667F, 0.0154451932F, 0.0156838304F, 0.0159242777F, - 0.0161665345F, 0.0164106001F, 0.0166564741F, 0.0169041557F, - 0.0171536443F, 0.0174049393F, 0.0176580401F, 0.0179129461F, - 0.0181696565F, 0.0184281708F, 0.0186884883F, 0.0189506084F, - 0.0192145303F, 0.0194802535F, 0.0197477772F, 0.0200171008F, - 0.0202882236F, 0.0205611449F, 0.0208358639F, 0.0211123801F, - 0.0213906927F, 0.0216708011F, 0.0219527043F, 0.0222364019F, - 0.0225218930F, 0.0228091769F, 0.0230982529F, 0.0233891203F, - 0.0236817782F, 0.0239762259F, 0.0242724628F, 0.0245704880F, - 0.0248703007F, 0.0251719002F, 0.0254752858F, 0.0257804565F, - 0.0260874117F, 0.0263961506F, 0.0267066722F, 0.0270189760F, - 0.0273330609F, 0.0276489263F, 0.0279665712F, 0.0282859949F, - 0.0286071966F, 0.0289301753F, 0.0292549303F, 0.0295814607F, - 0.0299097656F, 0.0302398442F, 0.0305716957F, 0.0309053191F, - 0.0312407135F, 0.0315778782F, 0.0319168122F, 0.0322575145F, - 0.0325999844F, 0.0329442209F, 0.0332902231F, 0.0336379900F, - 0.0339875208F, 0.0343388146F, 0.0346918703F, 0.0350466871F, - 0.0354032640F, 0.0357616000F, 0.0361216943F, 0.0364835458F, - 0.0368471535F, 0.0372125166F, 0.0375796339F, 0.0379485046F, - 0.0383191276F, 0.0386915020F, 0.0390656267F, 0.0394415008F, - 0.0398191231F, 0.0401984927F, 0.0405796086F, 0.0409624698F, - 0.0413470751F, 0.0417334235F, 0.0421215141F, 0.0425113457F, - 0.0429029172F, 0.0432962277F, 0.0436912760F, 0.0440880610F, - 0.0444865817F, 0.0448868370F, 0.0452888257F, 0.0456925468F, - 0.0460979992F, 0.0465051816F, 0.0469140931F, 0.0473247325F, - 0.0477370986F, 0.0481511902F, 0.0485670064F, 0.0489845458F, - 0.0494038074F, 0.0498247899F, 0.0502474922F, 0.0506719131F, - 0.0510980514F, 0.0515259060F, 0.0519554756F, 0.0523867590F, - 0.0528197550F, 0.0532544624F, 0.0536908800F, 0.0541290066F, - 0.0545688408F, 0.0550103815F, 0.0554536274F, 0.0558985772F, - 0.0563452297F, 0.0567935837F, 0.0572436377F, 0.0576953907F, - 0.0581488412F, 0.0586039880F, 0.0590608297F, 0.0595193651F, - 0.0599795929F, 0.0604415117F, 0.0609051202F, 0.0613704170F, - 0.0618374009F, 0.0623060704F, 0.0627764243F, 0.0632484611F, - 0.0637221795F, 0.0641975781F, 0.0646746555F, 0.0651534104F, - 0.0656338413F, 0.0661159469F, 0.0665997257F, 0.0670851763F, - 0.0675722973F, 0.0680610873F, 0.0685515448F, 0.0690436684F, - 0.0695374567F, 0.0700329081F, 0.0705300213F, 0.0710287947F, - 0.0715292269F, 0.0720313163F, 0.0725350616F, 0.0730404612F, - 0.0735475136F, 0.0740562172F, 0.0745665707F, 0.0750785723F, - 0.0755922207F, 0.0761075143F, 0.0766244515F, 0.0771430307F, - 0.0776632505F, 0.0781851092F, 0.0787086052F, 0.0792337371F, - 0.0797605032F, 0.0802889018F, 0.0808189315F, 0.0813505905F, - 0.0818838773F, 0.0824187903F, 0.0829553277F, 0.0834934881F, - 0.0840332697F, 0.0845746708F, 0.0851176899F, 0.0856623252F, - 0.0862085751F, 0.0867564379F, 0.0873059119F, 0.0878569954F, - 0.0884096867F, 0.0889639840F, 0.0895198858F, 0.0900773902F, - 0.0906364955F, 0.0911972000F, 0.0917595019F, 0.0923233995F, - 0.0928888909F, 0.0934559745F, 0.0940246485F, 0.0945949110F, - 0.0951667604F, 0.0957401946F, 0.0963152121F, 0.0968918109F, - 0.0974699893F, 0.0980497454F, 0.0986310773F, 0.0992139832F, - 0.0997984614F, 0.1003845098F, 0.1009721267F, 0.1015613101F, - 0.1021520582F, 0.1027443692F, 0.1033382410F, 0.1039336718F, - 0.1045306597F, 0.1051292027F, 0.1057292990F, 0.1063309466F, - 0.1069341435F, 0.1075388878F, 0.1081451776F, 0.1087530108F, - 0.1093623856F, 0.1099732998F, 0.1105857516F, 0.1111997389F, - 0.1118152597F, 0.1124323121F, 0.1130508939F, 0.1136710032F, - 0.1142926379F, 0.1149157960F, 0.1155404755F, 0.1161666742F, - 0.1167943901F, 0.1174236211F, 0.1180543652F, 0.1186866202F, - 0.1193203841F, 0.1199556548F, 0.1205924300F, 0.1212307078F, - 0.1218704860F, 0.1225117624F, 0.1231545349F, 0.1237988013F, - 0.1244445596F, 0.1250918074F, 0.1257405427F, 0.1263907632F, - 0.1270424667F, 0.1276956512F, 0.1283503142F, 0.1290064537F, - 0.1296640674F, 0.1303231530F, 0.1309837084F, 0.1316457312F, - 0.1323092193F, 0.1329741703F, 0.1336405820F, 0.1343084520F, - 0.1349777782F, 0.1356485582F, 0.1363207897F, 0.1369944704F, - 0.1376695979F, 0.1383461700F, 0.1390241842F, 0.1397036384F, - 0.1403845300F, 0.1410668567F, 0.1417506162F, 0.1424358061F, - 0.1431224240F, 0.1438104674F, 0.1444999341F, 0.1451908216F, - 0.1458831274F, 0.1465768492F, 0.1472719844F, 0.1479685308F, - 0.1486664857F, 0.1493658468F, 0.1500666115F, 0.1507687775F, - 0.1514723422F, 0.1521773031F, 0.1528836577F, 0.1535914035F, - 0.1543005380F, 0.1550110587F, 0.1557229631F, 0.1564362485F, - 0.1571509124F, 0.1578669524F, 0.1585843657F, 0.1593031499F, - 0.1600233024F, 0.1607448205F, 0.1614677017F, 0.1621919433F, - 0.1629175428F, 0.1636444975F, 0.1643728047F, 0.1651024619F, - 0.1658334665F, 0.1665658156F, 0.1672995067F, 0.1680345371F, - 0.1687709041F, 0.1695086050F, 0.1702476372F, 0.1709879978F, - 0.1717296843F, 0.1724726938F, 0.1732170237F, 0.1739626711F, - 0.1747096335F, 0.1754579079F, 0.1762074916F, 0.1769583819F, - 0.1777105760F, 0.1784640710F, 0.1792188642F, 0.1799749529F, - 0.1807323340F, 0.1814910049F, 0.1822509628F, 0.1830122046F, - 0.1837747277F, 0.1845385292F, 0.1853036062F, 0.1860699558F, - 0.1868375751F, 0.1876064613F, 0.1883766114F, 0.1891480226F, - 0.1899206919F, 0.1906946164F, 0.1914697932F, 0.1922462194F, - 0.1930238919F, 0.1938028079F, 0.1945829643F, 0.1953643583F, - 0.1961469868F, 0.1969308468F, 0.1977159353F, 0.1985022494F, - 0.1992897859F, 0.2000785420F, 0.2008685145F, 0.2016597005F, - 0.2024520968F, 0.2032457005F, 0.2040405084F, 0.2048365175F, - 0.2056337247F, 0.2064321269F, 0.2072317211F, 0.2080325041F, - 0.2088344727F, 0.2096376240F, 0.2104419547F, 0.2112474618F, - 0.2120541420F, 0.2128619923F, 0.2136710094F, 0.2144811902F, - 0.2152925315F, 0.2161050301F, 0.2169186829F, 0.2177334866F, - 0.2185494381F, 0.2193665340F, 0.2201847712F, 0.2210041465F, - 0.2218246565F, 0.2226462981F, 0.2234690680F, 0.2242929629F, - 0.2251179796F, 0.2259441147F, 0.2267713650F, 0.2275997272F, - 0.2284291979F, 0.2292597739F, 0.2300914518F, 0.2309242283F, - 0.2317581001F, 0.2325930638F, 0.2334291160F, 0.2342662534F, - 0.2351044727F, 0.2359437703F, 0.2367841431F, 0.2376255875F, - 0.2384681001F, 0.2393116776F, 0.2401563165F, 0.2410020134F, - 0.2418487649F, 0.2426965675F, 0.2435454178F, 0.2443953122F, - 0.2452462474F, 0.2460982199F, 0.2469512262F, 0.2478052628F, - 0.2486603262F, 0.2495164129F, 0.2503735194F, 0.2512316421F, - 0.2520907776F, 0.2529509222F, 0.2538120726F, 0.2546742250F, - 0.2555373760F, 0.2564015219F, 0.2572666593F, 0.2581327845F, - 0.2589998939F, 0.2598679840F, 0.2607370510F, 0.2616070916F, - 0.2624781019F, 0.2633500783F, 0.2642230173F, 0.2650969152F, - 0.2659717684F, 0.2668475731F, 0.2677243257F, 0.2686020226F, - 0.2694806601F, 0.2703602344F, 0.2712407419F, 0.2721221789F, - 0.2730045417F, 0.2738878265F, 0.2747720297F, 0.2756571474F, - 0.2765431760F, 0.2774301117F, 0.2783179508F, 0.2792066895F, - 0.2800963240F, 0.2809868505F, 0.2818782654F, 0.2827705647F, - 0.2836637447F, 0.2845578016F, 0.2854527315F, 0.2863485307F, - 0.2872451953F, 0.2881427215F, 0.2890411055F, 0.2899403433F, - 0.2908404312F, 0.2917413654F, 0.2926431418F, 0.2935457567F, - 0.2944492061F, 0.2953534863F, 0.2962585932F, 0.2971645230F, - 0.2980712717F, 0.2989788356F, 0.2998872105F, 0.3007963927F, - 0.3017063781F, 0.3026171629F, 0.3035287430F, 0.3044411145F, - 0.3053542736F, 0.3062682161F, 0.3071829381F, 0.3080984356F, - 0.3090147047F, 0.3099317413F, 0.3108495414F, 0.3117681011F, - 0.3126874163F, 0.3136074830F, 0.3145282972F, 0.3154498548F, - 0.3163721517F, 0.3172951841F, 0.3182189477F, 0.3191434385F, - 0.3200686525F, 0.3209945856F, 0.3219212336F, 0.3228485927F, - 0.3237766585F, 0.3247054271F, 0.3256348943F, 0.3265650560F, - 0.3274959081F, 0.3284274465F, 0.3293596671F, 0.3302925657F, - 0.3312261382F, 0.3321603804F, 0.3330952882F, 0.3340308574F, - 0.3349670838F, 0.3359039634F, 0.3368414919F, 0.3377796651F, - 0.3387184789F, 0.3396579290F, 0.3405980113F, 0.3415387216F, - 0.3424800556F, 0.3434220091F, 0.3443645779F, 0.3453077578F, - 0.3462515446F, 0.3471959340F, 0.3481409217F, 0.3490865036F, - 0.3500326754F, 0.3509794328F, 0.3519267715F, 0.3528746873F, - 0.3538231759F, 0.3547722330F, 0.3557218544F, 0.3566720357F, - 0.3576227727F, 0.3585740610F, 0.3595258964F, 0.3604782745F, - 0.3614311910F, 0.3623846417F, 0.3633386221F, 0.3642931280F, - 0.3652481549F, 0.3662036987F, 0.3671597548F, 0.3681163191F, - 0.3690733870F, 0.3700309544F, 0.3709890167F, 0.3719475696F, - 0.3729066089F, 0.3738661299F, 0.3748261285F, 0.3757866002F, - 0.3767475406F, 0.3777089453F, 0.3786708100F, 0.3796331302F, - 0.3805959014F, 0.3815591194F, 0.3825227796F, 0.3834868777F, - 0.3844514093F, 0.3854163698F, 0.3863817549F, 0.3873475601F, - 0.3883137810F, 0.3892804131F, 0.3902474521F, 0.3912148933F, - 0.3921827325F, 0.3931509650F, 0.3941195865F, 0.3950885925F, - 0.3960579785F, 0.3970277400F, 0.3979978725F, 0.3989683716F, - 0.3999392328F, 0.4009104516F, 0.4018820234F, 0.4028539438F, - 0.4038262084F, 0.4047988125F, 0.4057717516F, 0.4067450214F, - 0.4077186172F, 0.4086925345F, 0.4096667688F, 0.4106413155F, - 0.4116161703F, 0.4125913284F, 0.4135667854F, 0.4145425368F, - 0.4155185780F, 0.4164949044F, 0.4174715116F, 0.4184483949F, - 0.4194255498F, 0.4204029718F, 0.4213806563F, 0.4223585987F, - 0.4233367946F, 0.4243152392F, 0.4252939281F, 0.4262728566F, - 0.4272520202F, 0.4282314144F, 0.4292110345F, 0.4301908760F, - 0.4311709343F, 0.4321512047F, 0.4331316828F, 0.4341123639F, - 0.4350932435F, 0.4360743168F, 0.4370555794F, 0.4380370267F, - 0.4390186540F, 0.4400004567F, 0.4409824303F, 0.4419645701F, - 0.4429468716F, 0.4439293300F, 0.4449119409F, 0.4458946996F, - 0.4468776014F, 0.4478606418F, 0.4488438162F, 0.4498271199F, - 0.4508105483F, 0.4517940967F, 0.4527777607F, 0.4537615355F, - 0.4547454165F, 0.4557293991F, 0.4567134786F, 0.4576976505F, - 0.4586819101F, 0.4596662527F, 0.4606506738F, 0.4616351687F, - 0.4626197328F, 0.4636043614F, 0.4645890499F, 0.4655737936F, - 0.4665585880F, 0.4675434284F, 0.4685283101F, 0.4695132286F, - 0.4704981791F, 0.4714831570F, 0.4724681577F, 0.4734531766F, - 0.4744382089F, 0.4754232501F, 0.4764082956F, 0.4773933406F, - 0.4783783806F, 0.4793634108F, 0.4803484267F, 0.4813334237F, - 0.4823183969F, 0.4833033419F, 0.4842882540F, 0.4852731285F, - 0.4862579608F, 0.4872427462F, 0.4882274802F, 0.4892121580F, - 0.4901967751F, 0.4911813267F, 0.4921658083F, 0.4931502151F, - 0.4941345427F, 0.4951187863F, 0.4961029412F, 0.4970870029F, - 0.4980709667F, 0.4990548280F, 0.5000385822F, 0.5010222245F, - 0.5020057505F, 0.5029891553F, 0.5039724345F, 0.5049555834F, - 0.5059385973F, 0.5069214716F, 0.5079042018F, 0.5088867831F, - 0.5098692110F, 0.5108514808F, 0.5118335879F, 0.5128155277F, - 0.5137972956F, 0.5147788869F, 0.5157602971F, 0.5167415215F, - 0.5177225555F, 0.5187033945F, 0.5196840339F, 0.5206644692F, - 0.5216446956F, 0.5226247086F, 0.5236045035F, 0.5245840759F, - 0.5255634211F, 0.5265425344F, 0.5275214114F, 0.5285000474F, - 0.5294784378F, 0.5304565781F, 0.5314344637F, 0.5324120899F, - 0.5333894522F, 0.5343665461F, 0.5353433670F, 0.5363199102F, - 0.5372961713F, 0.5382721457F, 0.5392478287F, 0.5402232159F, - 0.5411983027F, 0.5421730845F, 0.5431475569F, 0.5441217151F, - 0.5450955548F, 0.5460690714F, 0.5470422602F, 0.5480151169F, - 0.5489876368F, 0.5499598155F, 0.5509316484F, 0.5519031310F, - 0.5528742587F, 0.5538450271F, 0.5548154317F, 0.5557854680F, - 0.5567551314F, 0.5577244174F, 0.5586933216F, 0.5596618395F, - 0.5606299665F, 0.5615976983F, 0.5625650302F, 0.5635319580F, - 0.5644984770F, 0.5654645828F, 0.5664302709F, 0.5673955370F, - 0.5683603765F, 0.5693247850F, 0.5702887580F, 0.5712522912F, - 0.5722153800F, 0.5731780200F, 0.5741402069F, 0.5751019362F, - 0.5760632034F, 0.5770240042F, 0.5779843341F, 0.5789441889F, - 0.5799035639F, 0.5808624549F, 0.5818208575F, 0.5827787673F, - 0.5837361800F, 0.5846930910F, 0.5856494961F, 0.5866053910F, - 0.5875607712F, 0.5885156324F, 0.5894699703F, 0.5904237804F, - 0.5913770586F, 0.5923298004F, 0.5932820016F, 0.5942336578F, - 0.5951847646F, 0.5961353179F, 0.5970853132F, 0.5980347464F, - 0.5989836131F, 0.5999319090F, 0.6008796298F, 0.6018267713F, - 0.6027733292F, 0.6037192993F, 0.6046646773F, 0.6056094589F, - 0.6065536400F, 0.6074972162F, 0.6084401833F, 0.6093825372F, - 0.6103242736F, 0.6112653884F, 0.6122058772F, 0.6131457359F, - 0.6140849604F, 0.6150235464F, 0.6159614897F, 0.6168987862F, - 0.6178354318F, 0.6187714223F, 0.6197067535F, 0.6206414213F, - 0.6215754215F, 0.6225087501F, 0.6234414028F, 0.6243733757F, - 0.6253046646F, 0.6262352654F, 0.6271651739F, 0.6280943862F, - 0.6290228982F, 0.6299507057F, 0.6308778048F, 0.6318041913F, - 0.6327298612F, 0.6336548105F, 0.6345790352F, 0.6355025312F, - 0.6364252945F, 0.6373473211F, 0.6382686070F, 0.6391891483F, - 0.6401089409F, 0.6410279808F, 0.6419462642F, 0.6428637869F, - 0.6437805452F, 0.6446965350F, 0.6456117524F, 0.6465261935F, - 0.6474398544F, 0.6483527311F, 0.6492648197F, 0.6501761165F, - 0.6510866174F, 0.6519963186F, 0.6529052162F, 0.6538133064F, - 0.6547205854F, 0.6556270492F, 0.6565326941F, 0.6574375162F, - 0.6583415117F, 0.6592446769F, 0.6601470079F, 0.6610485009F, - 0.6619491521F, 0.6628489578F, 0.6637479143F, 0.6646460177F, - 0.6655432643F, 0.6664396505F, 0.6673351724F, 0.6682298264F, - 0.6691236087F, 0.6700165157F, 0.6709085436F, 0.6717996889F, - 0.6726899478F, 0.6735793167F, 0.6744677918F, 0.6753553697F, - 0.6762420466F, 0.6771278190F, 0.6780126832F, 0.6788966357F, - 0.6797796728F, 0.6806617909F, 0.6815429866F, 0.6824232562F, - 0.6833025961F, 0.6841810030F, 0.6850584731F, 0.6859350031F, - 0.6868105894F, 0.6876852284F, 0.6885589168F, 0.6894316510F, - 0.6903034275F, 0.6911742430F, 0.6920440939F, 0.6929129769F, - 0.6937808884F, 0.6946478251F, 0.6955137837F, 0.6963787606F, - 0.6972427525F, 0.6981057560F, 0.6989677678F, 0.6998287845F, - 0.7006888028F, 0.7015478194F, 0.7024058309F, 0.7032628340F, - 0.7041188254F, 0.7049738019F, 0.7058277601F, 0.7066806969F, - 0.7075326089F, 0.7083834929F, 0.7092333457F, 0.7100821640F, - 0.7109299447F, 0.7117766846F, 0.7126223804F, 0.7134670291F, - 0.7143106273F, 0.7151531721F, 0.7159946602F, 0.7168350885F, - 0.7176744539F, 0.7185127534F, 0.7193499837F, 0.7201861418F, - 0.7210212247F, 0.7218552293F, 0.7226881526F, 0.7235199914F, - 0.7243507428F, 0.7251804039F, 0.7260089715F, 0.7268364426F, - 0.7276628144F, 0.7284880839F, 0.7293122481F, 0.7301353040F, - 0.7309572487F, 0.7317780794F, 0.7325977930F, 0.7334163868F, - 0.7342338579F, 0.7350502033F, 0.7358654202F, 0.7366795059F, - 0.7374924573F, 0.7383042718F, 0.7391149465F, 0.7399244787F, - 0.7407328655F, 0.7415401041F, 0.7423461920F, 0.7431511261F, - 0.7439549040F, 0.7447575227F, 0.7455589797F, 0.7463592723F, - 0.7471583976F, 0.7479563532F, 0.7487531363F, 0.7495487443F, - 0.7503431745F, 0.7511364244F, 0.7519284913F, 0.7527193726F, - 0.7535090658F, 0.7542975683F, 0.7550848776F, 0.7558709910F, - 0.7566559062F, 0.7574396205F, 0.7582221314F, 0.7590034366F, - 0.7597835334F, 0.7605624194F, 0.7613400923F, 0.7621165495F, - 0.7628917886F, 0.7636658072F, 0.7644386030F, 0.7652101735F, - 0.7659805164F, 0.7667496292F, 0.7675175098F, 0.7682841556F, - 0.7690495645F, 0.7698137341F, 0.7705766622F, 0.7713383463F, - 0.7720987844F, 0.7728579741F, 0.7736159132F, 0.7743725994F, - 0.7751280306F, 0.7758822046F, 0.7766351192F, 0.7773867722F, - 0.7781371614F, 0.7788862848F, 0.7796341401F, 0.7803807253F, - 0.7811260383F, 0.7818700769F, 0.7826128392F, 0.7833543230F, - 0.7840945263F, 0.7848334471F, 0.7855710833F, 0.7863074330F, - 0.7870424941F, 0.7877762647F, 0.7885087428F, 0.7892399264F, - 0.7899698137F, 0.7906984026F, 0.7914256914F, 0.7921516780F, - 0.7928763607F, 0.7935997375F, 0.7943218065F, 0.7950425661F, - 0.7957620142F, 0.7964801492F, 0.7971969692F, 0.7979124724F, - 0.7986266570F, 0.7993395214F, 0.8000510638F, 0.8007612823F, - 0.8014701754F, 0.8021777413F, 0.8028839784F, 0.8035888849F, - 0.8042924592F, 0.8049946997F, 0.8056956048F, 0.8063951727F, - 0.8070934020F, 0.8077902910F, 0.8084858381F, 0.8091800419F, - 0.8098729007F, 0.8105644130F, 0.8112545774F, 0.8119433922F, - 0.8126308561F, 0.8133169676F, 0.8140017251F, 0.8146851272F, - 0.8153671726F, 0.8160478598F, 0.8167271874F, 0.8174051539F, - 0.8180817582F, 0.8187569986F, 0.8194308741F, 0.8201033831F, - 0.8207745244F, 0.8214442966F, 0.8221126986F, 0.8227797290F, - 0.8234453865F, 0.8241096700F, 0.8247725781F, 0.8254341097F, - 0.8260942636F, 0.8267530385F, 0.8274104334F, 0.8280664470F, - 0.8287210782F, 0.8293743259F, 0.8300261889F, 0.8306766662F, - 0.8313257566F, 0.8319734591F, 0.8326197727F, 0.8332646963F, - 0.8339082288F, 0.8345503692F, 0.8351911167F, 0.8358304700F, - 0.8364684284F, 0.8371049907F, 0.8377401562F, 0.8383739238F, - 0.8390062927F, 0.8396372618F, 0.8402668305F, 0.8408949977F, - 0.8415217626F, 0.8421471245F, 0.8427710823F, 0.8433936354F, - 0.8440147830F, 0.8446345242F, 0.8452528582F, 0.8458697844F, - 0.8464853020F, 0.8470994102F, 0.8477121084F, 0.8483233958F, - 0.8489332718F, 0.8495417356F, 0.8501487866F, 0.8507544243F, - 0.8513586479F, 0.8519614568F, 0.8525628505F, 0.8531628283F, - 0.8537613897F, 0.8543585341F, 0.8549542611F, 0.8555485699F, - 0.8561414603F, 0.8567329315F, 0.8573229832F, 0.8579116149F, - 0.8584988262F, 0.8590846165F, 0.8596689855F, 0.8602519327F, - 0.8608334577F, 0.8614135603F, 0.8619922399F, 0.8625694962F, - 0.8631453289F, 0.8637197377F, 0.8642927222F, 0.8648642821F, - 0.8654344172F, 0.8660031272F, 0.8665704118F, 0.8671362708F, - 0.8677007039F, 0.8682637109F, 0.8688252917F, 0.8693854460F, - 0.8699441737F, 0.8705014745F, 0.8710573485F, 0.8716117953F, - 0.8721648150F, 0.8727164073F, 0.8732665723F, 0.8738153098F, - 0.8743626197F, 0.8749085021F, 0.8754529569F, 0.8759959840F, - 0.8765375835F, 0.8770777553F, 0.8776164996F, 0.8781538162F, - 0.8786897054F, 0.8792241670F, 0.8797572013F, 0.8802888082F, - 0.8808189880F, 0.8813477407F, 0.8818750664F, 0.8824009653F, - 0.8829254375F, 0.8834484833F, 0.8839701028F, 0.8844902961F, - 0.8850090636F, 0.8855264054F, 0.8860423218F, 0.8865568131F, - 0.8870698794F, 0.8875815212F, 0.8880917386F, 0.8886005319F, - 0.8891079016F, 0.8896138479F, 0.8901183712F, 0.8906214719F, - 0.8911231503F, 0.8916234067F, 0.8921222417F, 0.8926196556F, - 0.8931156489F, 0.8936102219F, 0.8941033752F, 0.8945951092F, - 0.8950854244F, 0.8955743212F, 0.8960618003F, 0.8965478621F, - 0.8970325071F, 0.8975157359F, 0.8979975490F, 0.8984779471F, - 0.8989569307F, 0.8994345004F, 0.8999106568F, 0.9003854005F, - 0.9008587323F, 0.9013306526F, 0.9018011623F, 0.9022702619F, - 0.9027379521F, 0.9032042337F, 0.9036691074F, 0.9041325739F, - 0.9045946339F, 0.9050552882F, 0.9055145376F, 0.9059723828F, - 0.9064288246F, 0.9068838638F, 0.9073375013F, 0.9077897379F, - 0.9082405743F, 0.9086900115F, 0.9091380503F, 0.9095846917F, - 0.9100299364F, 0.9104737854F, 0.9109162397F, 0.9113573001F, - 0.9117969675F, 0.9122352430F, 0.9126721275F, 0.9131076219F, - 0.9135417273F, 0.9139744447F, 0.9144057750F, 0.9148357194F, - 0.9152642787F, 0.9156914542F, 0.9161172468F, 0.9165416576F, - 0.9169646877F, 0.9173863382F, 0.9178066102F, 0.9182255048F, - 0.9186430232F, 0.9190591665F, 0.9194739359F, 0.9198873324F, - 0.9202993574F, 0.9207100120F, 0.9211192973F, 0.9215272147F, - 0.9219337653F, 0.9223389504F, 0.9227427713F, 0.9231452290F, - 0.9235463251F, 0.9239460607F, 0.9243444371F, 0.9247414557F, - 0.9251371177F, 0.9255314245F, 0.9259243774F, 0.9263159778F, - 0.9267062270F, 0.9270951264F, 0.9274826774F, 0.9278688814F, - 0.9282537398F, 0.9286372540F, 0.9290194254F, 0.9294002555F, - 0.9297797458F, 0.9301578976F, 0.9305347125F, 0.9309101919F, - 0.9312843373F, 0.9316571503F, 0.9320286323F, 0.9323987849F, - 0.9327676097F, 0.9331351080F, 0.9335012816F, 0.9338661320F, - 0.9342296607F, 0.9345918694F, 0.9349527596F, 0.9353123330F, - 0.9356705911F, 0.9360275357F, 0.9363831683F, 0.9367374905F, - 0.9370905042F, 0.9374422108F, 0.9377926122F, 0.9381417099F, - 0.9384895057F, 0.9388360014F, 0.9391811985F, 0.9395250989F, - 0.9398677043F, 0.9402090165F, 0.9405490371F, 0.9408877680F, - 0.9412252110F, 0.9415613678F, 0.9418962402F, 0.9422298301F, - 0.9425621392F, 0.9428931695F, 0.9432229226F, 0.9435514005F, - 0.9438786050F, 0.9442045381F, 0.9445292014F, 0.9448525971F, - 0.9451747268F, 0.9454955926F, 0.9458151963F, 0.9461335399F, - 0.9464506253F, 0.9467664545F, 0.9470810293F, 0.9473943517F, - 0.9477064238F, 0.9480172474F, 0.9483268246F, 0.9486351573F, - 0.9489422475F, 0.9492480973F, 0.9495527087F, 0.9498560837F, - 0.9501582243F, 0.9504591325F, 0.9507588105F, 0.9510572603F, - 0.9513544839F, 0.9516504834F, 0.9519452609F, 0.9522388186F, - 0.9525311584F, 0.9528222826F, 0.9531121932F, 0.9534008923F, - 0.9536883821F, 0.9539746647F, 0.9542597424F, 0.9545436171F, - 0.9548262912F, 0.9551077667F, 0.9553880459F, 0.9556671309F, - 0.9559450239F, 0.9562217272F, 0.9564972429F, 0.9567715733F, - 0.9570447206F, 0.9573166871F, 0.9575874749F, 0.9578570863F, - 0.9581255236F, 0.9583927890F, 0.9586588849F, 0.9589238134F, - 0.9591875769F, 0.9594501777F, 0.9597116180F, 0.9599719003F, - 0.9602310267F, 0.9604889995F, 0.9607458213F, 0.9610014942F, - 0.9612560206F, 0.9615094028F, 0.9617616433F, 0.9620127443F, - 0.9622627083F, 0.9625115376F, 0.9627592345F, 0.9630058016F, - 0.9632512411F, 0.9634955555F, 0.9637387471F, 0.9639808185F, - 0.9642217720F, 0.9644616100F, 0.9647003349F, 0.9649379493F, - 0.9651744556F, 0.9654098561F, 0.9656441534F, 0.9658773499F, - 0.9661094480F, 0.9663404504F, 0.9665703593F, 0.9667991774F, - 0.9670269071F, 0.9672535509F, 0.9674791114F, 0.9677035909F, - 0.9679269921F, 0.9681493174F, 0.9683705694F, 0.9685907506F, - 0.9688098636F, 0.9690279108F, 0.9692448948F, 0.9694608182F, - 0.9696756836F, 0.9698894934F, 0.9701022503F, 0.9703139569F, - 0.9705246156F, 0.9707342291F, 0.9709428000F, 0.9711503309F, - 0.9713568243F, 0.9715622829F, 0.9717667093F, 0.9719701060F, - 0.9721724757F, 0.9723738210F, 0.9725741446F, 0.9727734490F, - 0.9729717369F, 0.9731690109F, 0.9733652737F, 0.9735605279F, - 0.9737547762F, 0.9739480212F, 0.9741402656F, 0.9743315120F, - 0.9745217631F, 0.9747110216F, 0.9748992901F, 0.9750865714F, - 0.9752728681F, 0.9754581829F, 0.9756425184F, 0.9758258775F, - 0.9760082627F, 0.9761896768F, 0.9763701224F, 0.9765496024F, - 0.9767281193F, 0.9769056760F, 0.9770822751F, 0.9772579193F, - 0.9774326114F, 0.9776063542F, 0.9777791502F, 0.9779510023F, - 0.9781219133F, 0.9782918858F, 0.9784609226F, 0.9786290264F, - 0.9787962000F, 0.9789624461F, 0.9791277676F, 0.9792921671F, - 0.9794556474F, 0.9796182113F, 0.9797798615F, 0.9799406009F, - 0.9801004321F, 0.9802593580F, 0.9804173813F, 0.9805745049F, - 0.9807307314F, 0.9808860637F, 0.9810405046F, 0.9811940568F, - 0.9813467232F, 0.9814985065F, 0.9816494095F, 0.9817994351F, - 0.9819485860F, 0.9820968650F, 0.9822442750F, 0.9823908186F, - 0.9825364988F, 0.9826813184F, 0.9828252801F, 0.9829683868F, - 0.9831106413F, 0.9832520463F, 0.9833926048F, 0.9835323195F, - 0.9836711932F, 0.9838092288F, 0.9839464291F, 0.9840827969F, - 0.9842183351F, 0.9843530464F, 0.9844869337F, 0.9846199998F, - 0.9847522475F, 0.9848836798F, 0.9850142993F, 0.9851441090F, - 0.9852731117F, 0.9854013101F, 0.9855287073F, 0.9856553058F, - 0.9857811087F, 0.9859061188F, 0.9860303388F, 0.9861537717F, - 0.9862764202F, 0.9863982872F, 0.9865193756F, 0.9866396882F, - 0.9867592277F, 0.9868779972F, 0.9869959993F, 0.9871132370F, - 0.9872297131F, 0.9873454304F, 0.9874603918F, 0.9875746001F, - 0.9876880581F, 0.9878007688F, 0.9879127348F, 0.9880239592F, - 0.9881344447F, 0.9882441941F, 0.9883532104F, 0.9884614962F, - 0.9885690546F, 0.9886758883F, 0.9887820001F, 0.9888873930F, - 0.9889920697F, 0.9890960331F, 0.9891992859F, 0.9893018312F, - 0.9894036716F, 0.9895048100F, 0.9896052493F, 0.9897049923F, - 0.9898040418F, 0.9899024006F, 0.9900000717F, 0.9900970577F, - 0.9901933616F, 0.9902889862F, 0.9903839343F, 0.9904782087F, - 0.9905718122F, 0.9906647477F, 0.9907570180F, 0.9908486259F, - 0.9909395742F, 0.9910298658F, 0.9911195034F, 0.9912084899F, - 0.9912968281F, 0.9913845208F, 0.9914715708F, 0.9915579810F, - 0.9916437540F, 0.9917288928F, 0.9918134001F, 0.9918972788F, - 0.9919805316F, 0.9920631613F, 0.9921451707F, 0.9922265626F, - 0.9923073399F, 0.9923875052F, 0.9924670615F, 0.9925460114F, - 0.9926243577F, 0.9927021033F, 0.9927792508F, 0.9928558032F, - 0.9929317631F, 0.9930071333F, 0.9930819167F, 0.9931561158F, - 0.9932297337F, 0.9933027728F, 0.9933752362F, 0.9934471264F, - 0.9935184462F, 0.9935891985F, 0.9936593859F, 0.9937290112F, - 0.9937980771F, 0.9938665864F, 0.9939345418F, 0.9940019460F, - 0.9940688018F, 0.9941351118F, 0.9942008789F, 0.9942661057F, - 0.9943307950F, 0.9943949494F, 0.9944585717F, 0.9945216645F, - 0.9945842307F, 0.9946462728F, 0.9947077936F, 0.9947687957F, - 0.9948292820F, 0.9948892550F, 0.9949487174F, 0.9950076719F, - 0.9950661212F, 0.9951240679F, 0.9951815148F, 0.9952384645F, - 0.9952949196F, 0.9953508828F, 0.9954063568F, 0.9954613442F, - 0.9955158476F, 0.9955698697F, 0.9956234132F, 0.9956764806F, - 0.9957290746F, 0.9957811978F, 0.9958328528F, 0.9958840423F, - 0.9959347688F, 0.9959850351F, 0.9960348435F, 0.9960841969F, - 0.9961330977F, 0.9961815486F, 0.9962295521F, 0.9962771108F, - 0.9963242274F, 0.9963709043F, 0.9964171441F, 0.9964629494F, - 0.9965083228F, 0.9965532668F, 0.9965977840F, 0.9966418768F, - 0.9966855479F, 0.9967287998F, 0.9967716350F, 0.9968140559F, - 0.9968560653F, 0.9968976655F, 0.9969388591F, 0.9969796485F, - 0.9970200363F, 0.9970600250F, 0.9970996170F, 0.9971388149F, - 0.9971776211F, 0.9972160380F, 0.9972540683F, 0.9972917142F, - 0.9973289783F, 0.9973658631F, 0.9974023709F, 0.9974385042F, - 0.9974742655F, 0.9975096571F, 0.9975446816F, 0.9975793413F, - 0.9976136386F, 0.9976475759F, 0.9976811557F, 0.9977143803F, - 0.9977472521F, 0.9977797736F, 0.9978119470F, 0.9978437748F, - 0.9978752593F, 0.9979064029F, 0.9979372079F, 0.9979676768F, - 0.9979978117F, 0.9980276151F, 0.9980570893F, 0.9980862367F, - 0.9981150595F, 0.9981435600F, 0.9981717406F, 0.9981996035F, - 0.9982271511F, 0.9982543856F, 0.9982813093F, 0.9983079246F, - 0.9983342336F, 0.9983602386F, 0.9983859418F, 0.9984113456F, - 0.9984364522F, 0.9984612638F, 0.9984857825F, 0.9985100108F, - 0.9985339507F, 0.9985576044F, 0.9985809743F, 0.9986040624F, - 0.9986268710F, 0.9986494022F, 0.9986716583F, 0.9986936413F, - 0.9987153535F, 0.9987367969F, 0.9987579738F, 0.9987788864F, - 0.9987995366F, 0.9988199267F, 0.9988400587F, 0.9988599348F, - 0.9988795572F, 0.9988989278F, 0.9989180487F, 0.9989369222F, - 0.9989555501F, 0.9989739347F, 0.9989920780F, 0.9990099820F, - 0.9990276487F, 0.9990450803F, 0.9990622787F, 0.9990792460F, - 0.9990959841F, 0.9991124952F, 0.9991287812F, 0.9991448440F, - 0.9991606858F, 0.9991763084F, 0.9991917139F, 0.9992069042F, - 0.9992218813F, 0.9992366471F, 0.9992512035F, 0.9992655525F, - 0.9992796961F, 0.9992936361F, 0.9993073744F, 0.9993209131F, - 0.9993342538F, 0.9993473987F, 0.9993603494F, 0.9993731080F, - 0.9993856762F, 0.9993980559F, 0.9994102490F, 0.9994222573F, - 0.9994340827F, 0.9994457269F, 0.9994571918F, 0.9994684793F, - 0.9994795910F, 0.9994905288F, 0.9995012945F, 0.9995118898F, - 0.9995223165F, 0.9995325765F, 0.9995426713F, 0.9995526029F, - 0.9995623728F, 0.9995719829F, 0.9995814349F, 0.9995907304F, - 0.9995998712F, 0.9996088590F, 0.9996176954F, 0.9996263821F, - 0.9996349208F, 0.9996433132F, 0.9996515609F, 0.9996596656F, - 0.9996676288F, 0.9996754522F, 0.9996831375F, 0.9996906862F, - 0.9996981000F, 0.9997053804F, 0.9997125290F, 0.9997195474F, - 0.9997264371F, 0.9997331998F, 0.9997398369F, 0.9997463500F, - 0.9997527406F, 0.9997590103F, 0.9997651606F, 0.9997711930F, - 0.9997771089F, 0.9997829098F, 0.9997885973F, 0.9997941728F, - 0.9997996378F, 0.9998049936F, 0.9998102419F, 0.9998153839F, - 0.9998204211F, 0.9998253550F, 0.9998301868F, 0.9998349182F, - 0.9998395503F, 0.9998440847F, 0.9998485226F, 0.9998528654F, - 0.9998571146F, 0.9998612713F, 0.9998653370F, 0.9998693130F, - 0.9998732007F, 0.9998770012F, 0.9998807159F, 0.9998843461F, - 0.9998878931F, 0.9998913581F, 0.9998947424F, 0.9998980473F, - 0.9999012740F, 0.9999044237F, 0.9999074976F, 0.9999104971F, - 0.9999134231F, 0.9999162771F, 0.9999190601F, 0.9999217733F, - 0.9999244179F, 0.9999269950F, 0.9999295058F, 0.9999319515F, - 0.9999343332F, 0.9999366519F, 0.9999389088F, 0.9999411050F, - 0.9999432416F, 0.9999453196F, 0.9999473402F, 0.9999493044F, - 0.9999512132F, 0.9999530677F, 0.9999548690F, 0.9999566180F, - 0.9999583157F, 0.9999599633F, 0.9999615616F, 0.9999631116F, - 0.9999646144F, 0.9999660709F, 0.9999674820F, 0.9999688487F, - 0.9999701719F, 0.9999714526F, 0.9999726917F, 0.9999738900F, - 0.9999750486F, 0.9999761682F, 0.9999772497F, 0.9999782941F, - 0.9999793021F, 0.9999802747F, 0.9999812126F, 0.9999821167F, - 0.9999829878F, 0.9999838268F, 0.9999846343F, 0.9999854113F, - 0.9999861584F, 0.9999868765F, 0.9999875664F, 0.9999882287F, - 0.9999888642F, 0.9999894736F, 0.9999900577F, 0.9999906172F, - 0.9999911528F, 0.9999916651F, 0.9999921548F, 0.9999926227F, - 0.9999930693F, 0.9999934954F, 0.9999939015F, 0.9999942883F, - 0.9999946564F, 0.9999950064F, 0.9999953390F, 0.9999956547F, - 0.9999959541F, 0.9999962377F, 0.9999965062F, 0.9999967601F, - 0.9999969998F, 0.9999972260F, 0.9999974392F, 0.9999976399F, - 0.9999978285F, 0.9999980056F, 0.9999981716F, 0.9999983271F, - 0.9999984724F, 0.9999986081F, 0.9999987345F, 0.9999988521F, - 0.9999989613F, 0.9999990625F, 0.9999991562F, 0.9999992426F, - 0.9999993223F, 0.9999993954F, 0.9999994625F, 0.9999995239F, - 0.9999995798F, 0.9999996307F, 0.9999996768F, 0.9999997184F, - 0.9999997559F, 0.9999997895F, 0.9999998195F, 0.9999998462F, - 0.9999998698F, 0.9999998906F, 0.9999999088F, 0.9999999246F, - 0.9999999383F, 0.9999999500F, 0.9999999600F, 0.9999999684F, - 0.9999999754F, 0.9999999811F, 0.9999999858F, 0.9999999896F, - 0.9999999925F, 0.9999999948F, 0.9999999965F, 0.9999999978F, - 0.9999999986F, 0.9999999992F, 0.9999999996F, 0.9999999998F, - 0.9999999999F, 1.0000000000F, 1.0000000000F, 1.0000000000F, -}; - -static const float vwin8192[4096] = { - 0.0000000578F, 0.0000005198F, 0.0000014438F, 0.0000028299F, - 0.0000046780F, 0.0000069882F, 0.0000097604F, 0.0000129945F, - 0.0000166908F, 0.0000208490F, 0.0000254692F, 0.0000305515F, - 0.0000360958F, 0.0000421021F, 0.0000485704F, 0.0000555006F, - 0.0000628929F, 0.0000707472F, 0.0000790635F, 0.0000878417F, - 0.0000970820F, 0.0001067842F, 0.0001169483F, 0.0001275744F, - 0.0001386625F, 0.0001502126F, 0.0001622245F, 0.0001746984F, - 0.0001876343F, 0.0002010320F, 0.0002148917F, 0.0002292132F, - 0.0002439967F, 0.0002592421F, 0.0002749493F, 0.0002911184F, - 0.0003077493F, 0.0003248421F, 0.0003423967F, 0.0003604132F, - 0.0003788915F, 0.0003978316F, 0.0004172335F, 0.0004370971F, - 0.0004574226F, 0.0004782098F, 0.0004994587F, 0.0005211694F, - 0.0005433418F, 0.0005659759F, 0.0005890717F, 0.0006126292F, - 0.0006366484F, 0.0006611292F, 0.0006860716F, 0.0007114757F, - 0.0007373414F, 0.0007636687F, 0.0007904576F, 0.0008177080F, - 0.0008454200F, 0.0008735935F, 0.0009022285F, 0.0009313250F, - 0.0009608830F, 0.0009909025F, 0.0010213834F, 0.0010523257F, - 0.0010837295F, 0.0011155946F, 0.0011479211F, 0.0011807090F, - 0.0012139582F, 0.0012476687F, 0.0012818405F, 0.0013164736F, - 0.0013515679F, 0.0013871235F, 0.0014231402F, 0.0014596182F, - 0.0014965573F, 0.0015339576F, 0.0015718190F, 0.0016101415F, - 0.0016489251F, 0.0016881698F, 0.0017278754F, 0.0017680421F, - 0.0018086698F, 0.0018497584F, 0.0018913080F, 0.0019333185F, - 0.0019757898F, 0.0020187221F, 0.0020621151F, 0.0021059690F, - 0.0021502837F, 0.0021950591F, 0.0022402953F, 0.0022859921F, - 0.0023321497F, 0.0023787679F, 0.0024258467F, 0.0024733861F, - 0.0025213861F, 0.0025698466F, 0.0026187676F, 0.0026681491F, - 0.0027179911F, 0.0027682935F, 0.0028190562F, 0.0028702794F, - 0.0029219628F, 0.0029741066F, 0.0030267107F, 0.0030797749F, - 0.0031332994F, 0.0031872841F, 0.0032417289F, 0.0032966338F, - 0.0033519988F, 0.0034078238F, 0.0034641089F, 0.0035208539F, - 0.0035780589F, 0.0036357237F, 0.0036938485F, 0.0037524331F, - 0.0038114775F, 0.0038709817F, 0.0039309456F, 0.0039913692F, - 0.0040522524F, 0.0041135953F, 0.0041753978F, 0.0042376599F, - 0.0043003814F, 0.0043635624F, 0.0044272029F, 0.0044913028F, - 0.0045558620F, 0.0046208806F, 0.0046863585F, 0.0047522955F, - 0.0048186919F, 0.0048855473F, 0.0049528619F, 0.0050206356F, - 0.0050888684F, 0.0051575601F, 0.0052267108F, 0.0052963204F, - 0.0053663890F, 0.0054369163F, 0.0055079025F, 0.0055793474F, - 0.0056512510F, 0.0057236133F, 0.0057964342F, 0.0058697137F, - 0.0059434517F, 0.0060176482F, 0.0060923032F, 0.0061674166F, - 0.0062429883F, 0.0063190183F, 0.0063955066F, 0.0064724532F, - 0.0065498579F, 0.0066277207F, 0.0067060416F, 0.0067848205F, - 0.0068640575F, 0.0069437523F, 0.0070239051F, 0.0071045157F, - 0.0071855840F, 0.0072671102F, 0.0073490940F, 0.0074315355F, - 0.0075144345F, 0.0075977911F, 0.0076816052F, 0.0077658768F, - 0.0078506057F, 0.0079357920F, 0.0080214355F, 0.0081075363F, - 0.0081940943F, 0.0082811094F, 0.0083685816F, 0.0084565108F, - 0.0085448970F, 0.0086337401F, 0.0087230401F, 0.0088127969F, - 0.0089030104F, 0.0089936807F, 0.0090848076F, 0.0091763911F, - 0.0092684311F, 0.0093609276F, 0.0094538805F, 0.0095472898F, - 0.0096411554F, 0.0097354772F, 0.0098302552F, 0.0099254894F, - 0.0100211796F, 0.0101173259F, 0.0102139281F, 0.0103109863F, - 0.0104085002F, 0.0105064700F, 0.0106048955F, 0.0107037766F, - 0.0108031133F, 0.0109029056F, 0.0110031534F, 0.0111038565F, - 0.0112050151F, 0.0113066289F, 0.0114086980F, 0.0115112222F, - 0.0116142015F, 0.0117176359F, 0.0118215252F, 0.0119258695F, - 0.0120306686F, 0.0121359225F, 0.0122416312F, 0.0123477944F, - 0.0124544123F, 0.0125614847F, 0.0126690116F, 0.0127769928F, - 0.0128854284F, 0.0129943182F, 0.0131036623F, 0.0132134604F, - 0.0133237126F, 0.0134344188F, 0.0135455790F, 0.0136571929F, - 0.0137692607F, 0.0138817821F, 0.0139947572F, 0.0141081859F, - 0.0142220681F, 0.0143364037F, 0.0144511927F, 0.0145664350F, - 0.0146821304F, 0.0147982791F, 0.0149148808F, 0.0150319355F, - 0.0151494431F, 0.0152674036F, 0.0153858168F, 0.0155046828F, - 0.0156240014F, 0.0157437726F, 0.0158639962F, 0.0159846723F, - 0.0161058007F, 0.0162273814F, 0.0163494142F, 0.0164718991F, - 0.0165948361F, 0.0167182250F, 0.0168420658F, 0.0169663584F, - 0.0170911027F, 0.0172162987F, 0.0173419462F, 0.0174680452F, - 0.0175945956F, 0.0177215974F, 0.0178490504F, 0.0179769545F, - 0.0181053098F, 0.0182341160F, 0.0183633732F, 0.0184930812F, - 0.0186232399F, 0.0187538494F, 0.0188849094F, 0.0190164200F, - 0.0191483809F, 0.0192807923F, 0.0194136539F, 0.0195469656F, - 0.0196807275F, 0.0198149394F, 0.0199496012F, 0.0200847128F, - 0.0202202742F, 0.0203562853F, 0.0204927460F, 0.0206296561F, - 0.0207670157F, 0.0209048245F, 0.0210430826F, 0.0211817899F, - 0.0213209462F, 0.0214605515F, 0.0216006057F, 0.0217411086F, - 0.0218820603F, 0.0220234605F, 0.0221653093F, 0.0223076066F, - 0.0224503521F, 0.0225935459F, 0.0227371879F, 0.0228812779F, - 0.0230258160F, 0.0231708018F, 0.0233162355F, 0.0234621169F, - 0.0236084459F, 0.0237552224F, 0.0239024462F, 0.0240501175F, - 0.0241982359F, 0.0243468015F, 0.0244958141F, 0.0246452736F, - 0.0247951800F, 0.0249455331F, 0.0250963329F, 0.0252475792F, - 0.0253992720F, 0.0255514111F, 0.0257039965F, 0.0258570281F, - 0.0260105057F, 0.0261644293F, 0.0263187987F, 0.0264736139F, - 0.0266288747F, 0.0267845811F, 0.0269407330F, 0.0270973302F, - 0.0272543727F, 0.0274118604F, 0.0275697930F, 0.0277281707F, - 0.0278869932F, 0.0280462604F, 0.0282059723F, 0.0283661287F, - 0.0285267295F, 0.0286877747F, 0.0288492641F, 0.0290111976F, - 0.0291735751F, 0.0293363965F, 0.0294996617F, 0.0296633706F, - 0.0298275231F, 0.0299921190F, 0.0301571583F, 0.0303226409F, - 0.0304885667F, 0.0306549354F, 0.0308217472F, 0.0309890017F, - 0.0311566989F, 0.0313248388F, 0.0314934211F, 0.0316624459F, - 0.0318319128F, 0.0320018220F, 0.0321721732F, 0.0323429663F, - 0.0325142013F, 0.0326858779F, 0.0328579962F, 0.0330305559F, - 0.0332035570F, 0.0333769994F, 0.0335508829F, 0.0337252074F, - 0.0338999728F, 0.0340751790F, 0.0342508259F, 0.0344269134F, - 0.0346034412F, 0.0347804094F, 0.0349578178F, 0.0351356663F, - 0.0353139548F, 0.0354926831F, 0.0356718511F, 0.0358514588F, - 0.0360315059F, 0.0362119924F, 0.0363929182F, 0.0365742831F, - 0.0367560870F, 0.0369383297F, 0.0371210113F, 0.0373041315F, - 0.0374876902F, 0.0376716873F, 0.0378561226F, 0.0380409961F, - 0.0382263077F, 0.0384120571F, 0.0385982443F, 0.0387848691F, - 0.0389719315F, 0.0391594313F, 0.0393473683F, 0.0395357425F, - 0.0397245537F, 0.0399138017F, 0.0401034866F, 0.0402936080F, - 0.0404841660F, 0.0406751603F, 0.0408665909F, 0.0410584576F, - 0.0412507603F, 0.0414434988F, 0.0416366731F, 0.0418302829F, - 0.0420243282F, 0.0422188088F, 0.0424137246F, 0.0426090755F, - 0.0428048613F, 0.0430010819F, 0.0431977371F, 0.0433948269F, - 0.0435923511F, 0.0437903095F, 0.0439887020F, 0.0441875285F, - 0.0443867889F, 0.0445864830F, 0.0447866106F, 0.0449871717F, - 0.0451881661F, 0.0453895936F, 0.0455914542F, 0.0457937477F, - 0.0459964738F, 0.0461996326F, 0.0464032239F, 0.0466072475F, - 0.0468117032F, 0.0470165910F, 0.0472219107F, 0.0474276622F, - 0.0476338452F, 0.0478404597F, 0.0480475056F, 0.0482549827F, - 0.0484628907F, 0.0486712297F, 0.0488799994F, 0.0490891998F, - 0.0492988306F, 0.0495088917F, 0.0497193830F, 0.0499303043F, - 0.0501416554F, 0.0503534363F, 0.0505656468F, 0.0507782867F, - 0.0509913559F, 0.0512048542F, 0.0514187815F, 0.0516331376F, - 0.0518479225F, 0.0520631358F, 0.0522787775F, 0.0524948475F, - 0.0527113455F, 0.0529282715F, 0.0531456252F, 0.0533634066F, - 0.0535816154F, 0.0538002515F, 0.0540193148F, 0.0542388051F, - 0.0544587222F, 0.0546790660F, 0.0548998364F, 0.0551210331F, - 0.0553426561F, 0.0555647051F, 0.0557871801F, 0.0560100807F, - 0.0562334070F, 0.0564571587F, 0.0566813357F, 0.0569059378F, - 0.0571309649F, 0.0573564168F, 0.0575822933F, 0.0578085942F, - 0.0580353195F, 0.0582624689F, 0.0584900423F, 0.0587180396F, - 0.0589464605F, 0.0591753049F, 0.0594045726F, 0.0596342635F, - 0.0598643774F, 0.0600949141F, 0.0603258735F, 0.0605572555F, - 0.0607890597F, 0.0610212862F, 0.0612539346F, 0.0614870049F, - 0.0617204968F, 0.0619544103F, 0.0621887451F, 0.0624235010F, - 0.0626586780F, 0.0628942758F, 0.0631302942F, 0.0633667331F, - 0.0636035923F, 0.0638408717F, 0.0640785710F, 0.0643166901F, - 0.0645552288F, 0.0647941870F, 0.0650335645F, 0.0652733610F, - 0.0655135765F, 0.0657542108F, 0.0659952636F, 0.0662367348F, - 0.0664786242F, 0.0667209316F, 0.0669636570F, 0.0672068000F, - 0.0674503605F, 0.0676943384F, 0.0679387334F, 0.0681835454F, - 0.0684287742F, 0.0686744196F, 0.0689204814F, 0.0691669595F, - 0.0694138536F, 0.0696611637F, 0.0699088894F, 0.0701570307F, - 0.0704055873F, 0.0706545590F, 0.0709039458F, 0.0711537473F, - 0.0714039634F, 0.0716545939F, 0.0719056387F, 0.0721570975F, - 0.0724089702F, 0.0726612565F, 0.0729139563F, 0.0731670694F, - 0.0734205956F, 0.0736745347F, 0.0739288866F, 0.0741836510F, - 0.0744388277F, 0.0746944166F, 0.0749504175F, 0.0752068301F, - 0.0754636543F, 0.0757208899F, 0.0759785367F, 0.0762365946F, - 0.0764950632F, 0.0767539424F, 0.0770132320F, 0.0772729319F, - 0.0775330418F, 0.0777935616F, 0.0780544909F, 0.0783158298F, - 0.0785775778F, 0.0788397349F, 0.0791023009F, 0.0793652755F, - 0.0796286585F, 0.0798924498F, 0.0801566492F, 0.0804212564F, - 0.0806862712F, 0.0809516935F, 0.0812175231F, 0.0814837597F, - 0.0817504031F, 0.0820174532F, 0.0822849097F, 0.0825527724F, - 0.0828210412F, 0.0830897158F, 0.0833587960F, 0.0836282816F, - 0.0838981724F, 0.0841684682F, 0.0844391688F, 0.0847102740F, - 0.0849817835F, 0.0852536973F, 0.0855260150F, 0.0857987364F, - 0.0860718614F, 0.0863453897F, 0.0866193211F, 0.0868936554F, - 0.0871683924F, 0.0874435319F, 0.0877190737F, 0.0879950175F, - 0.0882713632F, 0.0885481105F, 0.0888252592F, 0.0891028091F, - 0.0893807600F, 0.0896591117F, 0.0899378639F, 0.0902170165F, - 0.0904965692F, 0.0907765218F, 0.0910568740F, 0.0913376258F, - 0.0916187767F, 0.0919003268F, 0.0921822756F, 0.0924646230F, - 0.0927473687F, 0.0930305126F, 0.0933140545F, 0.0935979940F, - 0.0938823310F, 0.0941670653F, 0.0944521966F, 0.0947377247F, - 0.0950236494F, 0.0953099704F, 0.0955966876F, 0.0958838007F, - 0.0961713094F, 0.0964592136F, 0.0967475131F, 0.0970362075F, - 0.0973252967F, 0.0976147805F, 0.0979046585F, 0.0981949307F, - 0.0984855967F, 0.0987766563F, 0.0990681093F, 0.0993599555F, - 0.0996521945F, 0.0999448263F, 0.1002378506F, 0.1005312671F, - 0.1008250755F, 0.1011192757F, 0.1014138675F, 0.1017088505F, - 0.1020042246F, 0.1022999895F, 0.1025961450F, 0.1028926909F, - 0.1031896268F, 0.1034869526F, 0.1037846680F, 0.1040827729F, - 0.1043812668F, 0.1046801497F, 0.1049794213F, 0.1052790813F, - 0.1055791294F, 0.1058795656F, 0.1061803894F, 0.1064816006F, - 0.1067831991F, 0.1070851846F, 0.1073875568F, 0.1076903155F, - 0.1079934604F, 0.1082969913F, 0.1086009079F, 0.1089052101F, - 0.1092098975F, 0.1095149699F, 0.1098204270F, 0.1101262687F, - 0.1104324946F, 0.1107391045F, 0.1110460982F, 0.1113534754F, - 0.1116612359F, 0.1119693793F, 0.1122779055F, 0.1125868142F, - 0.1128961052F, 0.1132057781F, 0.1135158328F, 0.1138262690F, - 0.1141370863F, 0.1144482847F, 0.1147598638F, 0.1150718233F, - 0.1153841631F, 0.1156968828F, 0.1160099822F, 0.1163234610F, - 0.1166373190F, 0.1169515559F, 0.1172661714F, 0.1175811654F, - 0.1178965374F, 0.1182122874F, 0.1185284149F, 0.1188449198F, - 0.1191618018F, 0.1194790606F, 0.1197966960F, 0.1201147076F, - 0.1204330953F, 0.1207518587F, 0.1210709976F, 0.1213905118F, - 0.1217104009F, 0.1220306647F, 0.1223513029F, 0.1226723153F, - 0.1229937016F, 0.1233154615F, 0.1236375948F, 0.1239601011F, - 0.1242829803F, 0.1246062319F, 0.1249298559F, 0.1252538518F, - 0.1255782195F, 0.1259029586F, 0.1262280689F, 0.1265535501F, - 0.1268794019F, 0.1272056241F, 0.1275322163F, 0.1278591784F, - 0.1281865099F, 0.1285142108F, 0.1288422805F, 0.1291707190F, - 0.1294995259F, 0.1298287009F, 0.1301582437F, 0.1304881542F, - 0.1308184319F, 0.1311490766F, 0.1314800881F, 0.1318114660F, - 0.1321432100F, 0.1324753200F, 0.1328077955F, 0.1331406364F, - 0.1334738422F, 0.1338074129F, 0.1341413479F, 0.1344756472F, - 0.1348103103F, 0.1351453370F, 0.1354807270F, 0.1358164801F, - 0.1361525959F, 0.1364890741F, 0.1368259145F, 0.1371631167F, - 0.1375006805F, 0.1378386056F, 0.1381768917F, 0.1385155384F, - 0.1388545456F, 0.1391939129F, 0.1395336400F, 0.1398737266F, - 0.1402141724F, 0.1405549772F, 0.1408961406F, 0.1412376623F, - 0.1415795421F, 0.1419217797F, 0.1422643746F, 0.1426073268F, - 0.1429506358F, 0.1432943013F, 0.1436383231F, 0.1439827008F, - 0.1443274342F, 0.1446725229F, 0.1450179667F, 0.1453637652F, - 0.1457099181F, 0.1460564252F, 0.1464032861F, 0.1467505006F, - 0.1470980682F, 0.1474459888F, 0.1477942620F, 0.1481428875F, - 0.1484918651F, 0.1488411942F, 0.1491908748F, 0.1495409065F, - 0.1498912889F, 0.1502420218F, 0.1505931048F, 0.1509445376F, - 0.1512963200F, 0.1516484516F, 0.1520009321F, 0.1523537612F, - 0.1527069385F, 0.1530604638F, 0.1534143368F, 0.1537685571F, - 0.1541231244F, 0.1544780384F, 0.1548332987F, 0.1551889052F, - 0.1555448574F, 0.1559011550F, 0.1562577978F, 0.1566147853F, - 0.1569721173F, 0.1573297935F, 0.1576878135F, 0.1580461771F, - 0.1584048838F, 0.1587639334F, 0.1591233255F, 0.1594830599F, - 0.1598431361F, 0.1602035540F, 0.1605643131F, 0.1609254131F, - 0.1612868537F, 0.1616486346F, 0.1620107555F, 0.1623732160F, - 0.1627360158F, 0.1630991545F, 0.1634626319F, 0.1638264476F, - 0.1641906013F, 0.1645550926F, 0.1649199212F, 0.1652850869F, - 0.1656505892F, 0.1660164278F, 0.1663826024F, 0.1667491127F, - 0.1671159583F, 0.1674831388F, 0.1678506541F, 0.1682185036F, - 0.1685866872F, 0.1689552044F, 0.1693240549F, 0.1696932384F, - 0.1700627545F, 0.1704326029F, 0.1708027833F, 0.1711732952F, - 0.1715441385F, 0.1719153127F, 0.1722868175F, 0.1726586526F, - 0.1730308176F, 0.1734033121F, 0.1737761359F, 0.1741492886F, - 0.1745227698F, 0.1748965792F, 0.1752707164F, 0.1756451812F, - 0.1760199731F, 0.1763950918F, 0.1767705370F, 0.1771463083F, - 0.1775224054F, 0.1778988279F, 0.1782755754F, 0.1786526477F, - 0.1790300444F, 0.1794077651F, 0.1797858094F, 0.1801641771F, - 0.1805428677F, 0.1809218810F, 0.1813012165F, 0.1816808739F, - 0.1820608528F, 0.1824411530F, 0.1828217739F, 0.1832027154F, - 0.1835839770F, 0.1839655584F, 0.1843474592F, 0.1847296790F, - 0.1851122175F, 0.1854950744F, 0.1858782492F, 0.1862617417F, - 0.1866455514F, 0.1870296780F, 0.1874141211F, 0.1877988804F, - 0.1881839555F, 0.1885693461F, 0.1889550517F, 0.1893410721F, - 0.1897274068F, 0.1901140555F, 0.1905010178F, 0.1908882933F, - 0.1912758818F, 0.1916637828F, 0.1920519959F, 0.1924405208F, - 0.1928293571F, 0.1932185044F, 0.1936079625F, 0.1939977308F, - 0.1943878091F, 0.1947781969F, 0.1951688939F, 0.1955598998F, - 0.1959512141F, 0.1963428364F, 0.1967347665F, 0.1971270038F, - 0.1975195482F, 0.1979123990F, 0.1983055561F, 0.1986990190F, - 0.1990927873F, 0.1994868607F, 0.1998812388F, 0.2002759212F, - 0.2006709075F, 0.2010661974F, 0.2014617904F, 0.2018576862F, - 0.2022538844F, 0.2026503847F, 0.2030471865F, 0.2034442897F, - 0.2038416937F, 0.2042393982F, 0.2046374028F, 0.2050357071F, - 0.2054343107F, 0.2058332133F, 0.2062324145F, 0.2066319138F, - 0.2070317110F, 0.2074318055F, 0.2078321970F, 0.2082328852F, - 0.2086338696F, 0.2090351498F, 0.2094367255F, 0.2098385962F, - 0.2102407617F, 0.2106432213F, 0.2110459749F, 0.2114490220F, - 0.2118523621F, 0.2122559950F, 0.2126599202F, 0.2130641373F, - 0.2134686459F, 0.2138734456F, 0.2142785361F, 0.2146839168F, - 0.2150895875F, 0.2154955478F, 0.2159017972F, 0.2163083353F, - 0.2167151617F, 0.2171222761F, 0.2175296780F, 0.2179373670F, - 0.2183453428F, 0.2187536049F, 0.2191621529F, 0.2195709864F, - 0.2199801051F, 0.2203895085F, 0.2207991961F, 0.2212091677F, - 0.2216194228F, 0.2220299610F, 0.2224407818F, 0.2228518850F, - 0.2232632699F, 0.2236749364F, 0.2240868839F, 0.2244991121F, - 0.2249116204F, 0.2253244086F, 0.2257374763F, 0.2261508229F, - 0.2265644481F, 0.2269783514F, 0.2273925326F, 0.2278069911F, - 0.2282217265F, 0.2286367384F, 0.2290520265F, 0.2294675902F, - 0.2298834292F, 0.2302995431F, 0.2307159314F, 0.2311325937F, - 0.2315495297F, 0.2319667388F, 0.2323842207F, 0.2328019749F, - 0.2332200011F, 0.2336382988F, 0.2340568675F, 0.2344757070F, - 0.2348948166F, 0.2353141961F, 0.2357338450F, 0.2361537629F, - 0.2365739493F, 0.2369944038F, 0.2374151261F, 0.2378361156F, - 0.2382573720F, 0.2386788948F, 0.2391006836F, 0.2395227380F, - 0.2399450575F, 0.2403676417F, 0.2407904902F, 0.2412136026F, - 0.2416369783F, 0.2420606171F, 0.2424845185F, 0.2429086820F, - 0.2433331072F, 0.2437577936F, 0.2441827409F, 0.2446079486F, - 0.2450334163F, 0.2454591435F, 0.2458851298F, 0.2463113747F, - 0.2467378779F, 0.2471646389F, 0.2475916573F, 0.2480189325F, - 0.2484464643F, 0.2488742521F, 0.2493022955F, 0.2497305940F, - 0.2501591473F, 0.2505879549F, 0.2510170163F, 0.2514463311F, - 0.2518758989F, 0.2523057193F, 0.2527357916F, 0.2531661157F, - 0.2535966909F, 0.2540275169F, 0.2544585931F, 0.2548899193F, - 0.2553214948F, 0.2557533193F, 0.2561853924F, 0.2566177135F, - 0.2570502822F, 0.2574830981F, 0.2579161608F, 0.2583494697F, - 0.2587830245F, 0.2592168246F, 0.2596508697F, 0.2600851593F, - 0.2605196929F, 0.2609544701F, 0.2613894904F, 0.2618247534F, - 0.2622602586F, 0.2626960055F, 0.2631319938F, 0.2635682230F, - 0.2640046925F, 0.2644414021F, 0.2648783511F, 0.2653155391F, - 0.2657529657F, 0.2661906305F, 0.2666285329F, 0.2670666725F, - 0.2675050489F, 0.2679436616F, 0.2683825101F, 0.2688215940F, - 0.2692609127F, 0.2697004660F, 0.2701402532F, 0.2705802739F, - 0.2710205278F, 0.2714610142F, 0.2719017327F, 0.2723426830F, - 0.2727838644F, 0.2732252766F, 0.2736669191F, 0.2741087914F, - 0.2745508930F, 0.2749932235F, 0.2754357824F, 0.2758785693F, - 0.2763215837F, 0.2767648251F, 0.2772082930F, 0.2776519870F, - 0.2780959066F, 0.2785400513F, 0.2789844207F, 0.2794290143F, - 0.2798738316F, 0.2803188722F, 0.2807641355F, 0.2812096211F, - 0.2816553286F, 0.2821012574F, 0.2825474071F, 0.2829937773F, - 0.2834403673F, 0.2838871768F, 0.2843342053F, 0.2847814523F, - 0.2852289174F, 0.2856765999F, 0.2861244996F, 0.2865726159F, - 0.2870209482F, 0.2874694962F, 0.2879182594F, 0.2883672372F, - 0.2888164293F, 0.2892658350F, 0.2897154540F, 0.2901652858F, - 0.2906153298F, 0.2910655856F, 0.2915160527F, 0.2919667306F, - 0.2924176189F, 0.2928687171F, 0.2933200246F, 0.2937715409F, - 0.2942232657F, 0.2946751984F, 0.2951273386F, 0.2955796856F, - 0.2960322391F, 0.2964849986F, 0.2969379636F, 0.2973911335F, - 0.2978445080F, 0.2982980864F, 0.2987518684F, 0.2992058534F, - 0.2996600409F, 0.3001144305F, 0.3005690217F, 0.3010238139F, - 0.3014788067F, 0.3019339995F, 0.3023893920F, 0.3028449835F, - 0.3033007736F, 0.3037567618F, 0.3042129477F, 0.3046693306F, - 0.3051259102F, 0.3055826859F, 0.3060396572F, 0.3064968236F, - 0.3069541847F, 0.3074117399F, 0.3078694887F, 0.3083274307F, - 0.3087855653F, 0.3092438920F, 0.3097024104F, 0.3101611199F, - 0.3106200200F, 0.3110791103F, 0.3115383902F, 0.3119978592F, - 0.3124575169F, 0.3129173627F, 0.3133773961F, 0.3138376166F, - 0.3142980238F, 0.3147586170F, 0.3152193959F, 0.3156803598F, - 0.3161415084F, 0.3166028410F, 0.3170643573F, 0.3175260566F, - 0.3179879384F, 0.3184500023F, 0.3189122478F, 0.3193746743F, - 0.3198372814F, 0.3203000685F, 0.3207630351F, 0.3212261807F, - 0.3216895048F, 0.3221530069F, 0.3226166865F, 0.3230805430F, - 0.3235445760F, 0.3240087849F, 0.3244731693F, 0.3249377285F, - 0.3254024622F, 0.3258673698F, 0.3263324507F, 0.3267977045F, - 0.3272631306F, 0.3277287286F, 0.3281944978F, 0.3286604379F, - 0.3291265482F, 0.3295928284F, 0.3300592777F, 0.3305258958F, - 0.3309926821F, 0.3314596361F, 0.3319267573F, 0.3323940451F, - 0.3328614990F, 0.3333291186F, 0.3337969033F, 0.3342648525F, - 0.3347329658F, 0.3352012427F, 0.3356696825F, 0.3361382849F, - 0.3366070492F, 0.3370759749F, 0.3375450616F, 0.3380143087F, - 0.3384837156F, 0.3389532819F, 0.3394230071F, 0.3398928905F, - 0.3403629317F, 0.3408331302F, 0.3413034854F, 0.3417739967F, - 0.3422446638F, 0.3427154860F, 0.3431864628F, 0.3436575938F, - 0.3441288782F, 0.3446003158F, 0.3450719058F, 0.3455436478F, - 0.3460155412F, 0.3464875856F, 0.3469597804F, 0.3474321250F, - 0.3479046189F, 0.3483772617F, 0.3488500527F, 0.3493229914F, - 0.3497960774F, 0.3502693100F, 0.3507426887F, 0.3512162131F, - 0.3516898825F, 0.3521636965F, 0.3526376545F, 0.3531117559F, - 0.3535860003F, 0.3540603870F, 0.3545349157F, 0.3550095856F, - 0.3554843964F, 0.3559593474F, 0.3564344381F, 0.3569096680F, - 0.3573850366F, 0.3578605432F, 0.3583361875F, 0.3588119687F, - 0.3592878865F, 0.3597639402F, 0.3602401293F, 0.3607164533F, - 0.3611929117F, 0.3616695038F, 0.3621462292F, 0.3626230873F, - 0.3631000776F, 0.3635771995F, 0.3640544525F, 0.3645318360F, - 0.3650093496F, 0.3654869926F, 0.3659647645F, 0.3664426648F, - 0.3669206930F, 0.3673988484F, 0.3678771306F, 0.3683555390F, - 0.3688340731F, 0.3693127322F, 0.3697915160F, 0.3702704237F, - 0.3707494549F, 0.3712286091F, 0.3717078857F, 0.3721872840F, - 0.3726668037F, 0.3731464441F, 0.3736262047F, 0.3741060850F, - 0.3745860843F, 0.3750662023F, 0.3755464382F, 0.3760267915F, - 0.3765072618F, 0.3769878484F, 0.3774685509F, 0.3779493686F, - 0.3784303010F, 0.3789113475F, 0.3793925076F, 0.3798737809F, - 0.3803551666F, 0.3808366642F, 0.3813182733F, 0.3817999932F, - 0.3822818234F, 0.3827637633F, 0.3832458124F, 0.3837279702F, - 0.3842102360F, 0.3846926093F, 0.3851750897F, 0.3856576764F, - 0.3861403690F, 0.3866231670F, 0.3871060696F, 0.3875890765F, - 0.3880721870F, 0.3885554007F, 0.3890387168F, 0.3895221349F, - 0.3900056544F, 0.3904892748F, 0.3909729955F, 0.3914568160F, - 0.3919407356F, 0.3924247539F, 0.3929088702F, 0.3933930841F, - 0.3938773949F, 0.3943618021F, 0.3948463052F, 0.3953309035F, - 0.3958155966F, 0.3963003838F, 0.3967852646F, 0.3972702385F, - 0.3977553048F, 0.3982404631F, 0.3987257127F, 0.3992110531F, - 0.3996964838F, 0.4001820041F, 0.4006676136F, 0.4011533116F, - 0.4016390976F, 0.4021249710F, 0.4026109313F, 0.4030969779F, - 0.4035831102F, 0.4040693277F, 0.4045556299F, 0.4050420160F, - 0.4055284857F, 0.4060150383F, 0.4065016732F, 0.4069883899F, - 0.4074751879F, 0.4079620665F, 0.4084490252F, 0.4089360635F, - 0.4094231807F, 0.4099103763F, 0.4103976498F, 0.4108850005F, - 0.4113724280F, 0.4118599315F, 0.4123475107F, 0.4128351648F, - 0.4133228934F, 0.4138106959F, 0.4142985716F, 0.4147865201F, - 0.4152745408F, 0.4157626330F, 0.4162507963F, 0.4167390301F, - 0.4172273337F, 0.4177157067F, 0.4182041484F, 0.4186926583F, - 0.4191812359F, 0.4196698805F, 0.4201585915F, 0.4206473685F, - 0.4211362108F, 0.4216251179F, 0.4221140892F, 0.4226031241F, - 0.4230922221F, 0.4235813826F, 0.4240706050F, 0.4245598887F, - 0.4250492332F, 0.4255386379F, 0.4260281022F, 0.4265176256F, - 0.4270072075F, 0.4274968473F, 0.4279865445F, 0.4284762984F, - 0.4289661086F, 0.4294559743F, 0.4299458951F, 0.4304358704F, - 0.4309258996F, 0.4314159822F, 0.4319061175F, 0.4323963050F, - 0.4328865441F, 0.4333768342F, 0.4338671749F, 0.4343575654F, - 0.4348480052F, 0.4353384938F, 0.4358290306F, 0.4363196149F, - 0.4368102463F, 0.4373009241F, 0.4377916478F, 0.4382824168F, - 0.4387732305F, 0.4392640884F, 0.4397549899F, 0.4402459343F, - 0.4407369212F, 0.4412279499F, 0.4417190198F, 0.4422101305F, - 0.4427012813F, 0.4431924717F, 0.4436837010F, 0.4441749686F, - 0.4446662742F, 0.4451576169F, 0.4456489963F, 0.4461404118F, - 0.4466318628F, 0.4471233487F, 0.4476148690F, 0.4481064230F, - 0.4485980103F, 0.4490896302F, 0.4495812821F, 0.4500729654F, - 0.4505646797F, 0.4510564243F, 0.4515481986F, 0.4520400021F, - 0.4525318341F, 0.4530236942F, 0.4535155816F, 0.4540074959F, - 0.4544994365F, 0.4549914028F, 0.4554833941F, 0.4559754100F, - 0.4564674499F, 0.4569595131F, 0.4574515991F, 0.4579437074F, - 0.4584358372F, 0.4589279881F, 0.4594201595F, 0.4599123508F, - 0.4604045615F, 0.4608967908F, 0.4613890383F, 0.4618813034F, - 0.4623735855F, 0.4628658841F, 0.4633581984F, 0.4638505281F, - 0.4643428724F, 0.4648352308F, 0.4653276028F, 0.4658199877F, - 0.4663123849F, 0.4668047940F, 0.4672972143F, 0.4677896451F, - 0.4682820861F, 0.4687745365F, 0.4692669958F, 0.4697594634F, - 0.4702519387F, 0.4707444211F, 0.4712369102F, 0.4717294052F, - 0.4722219056F, 0.4727144109F, 0.4732069204F, 0.4736994336F, - 0.4741919498F, 0.4746844686F, 0.4751769893F, 0.4756695113F, - 0.4761620341F, 0.4766545571F, 0.4771470797F, 0.4776396013F, - 0.4781321213F, 0.4786246392F, 0.4791171544F, 0.4796096663F, - 0.4801021744F, 0.4805946779F, 0.4810871765F, 0.4815796694F, - 0.4820721561F, 0.4825646360F, 0.4830571086F, 0.4835495732F, - 0.4840420293F, 0.4845344763F, 0.4850269136F, 0.4855193407F, - 0.4860117569F, 0.4865041617F, 0.4869965545F, 0.4874889347F, - 0.4879813018F, 0.4884736551F, 0.4889659941F, 0.4894583182F, - 0.4899506268F, 0.4904429193F, 0.4909351952F, 0.4914274538F, - 0.4919196947F, 0.4924119172F, 0.4929041207F, 0.4933963046F, - 0.4938884685F, 0.4943806116F, 0.4948727335F, 0.4953648335F, - 0.4958569110F, 0.4963489656F, 0.4968409965F, 0.4973330032F, - 0.4978249852F, 0.4983169419F, 0.4988088726F, 0.4993007768F, - 0.4997926539F, 0.5002845034F, 0.5007763247F, 0.5012681171F, - 0.5017598801F, 0.5022516132F, 0.5027433157F, 0.5032349871F, - 0.5037266268F, 0.5042182341F, 0.5047098086F, 0.5052013497F, - 0.5056928567F, 0.5061843292F, 0.5066757664F, 0.5071671679F, - 0.5076585330F, 0.5081498613F, 0.5086411520F, 0.5091324047F, - 0.5096236187F, 0.5101147934F, 0.5106059284F, 0.5110970230F, - 0.5115880766F, 0.5120790887F, 0.5125700587F, 0.5130609860F, - 0.5135518700F, 0.5140427102F, 0.5145335059F, 0.5150242566F, - 0.5155149618F, 0.5160056208F, 0.5164962331F, 0.5169867980F, - 0.5174773151F, 0.5179677837F, 0.5184582033F, 0.5189485733F, - 0.5194388931F, 0.5199291621F, 0.5204193798F, 0.5209095455F, - 0.5213996588F, 0.5218897190F, 0.5223797256F, 0.5228696779F, - 0.5233595755F, 0.5238494177F, 0.5243392039F, 0.5248289337F, - 0.5253186063F, 0.5258082213F, 0.5262977781F, 0.5267872760F, - 0.5272767146F, 0.5277660932F, 0.5282554112F, 0.5287446682F, - 0.5292338635F, 0.5297229965F, 0.5302120667F, 0.5307010736F, - 0.5311900164F, 0.5316788947F, 0.5321677079F, 0.5326564554F, - 0.5331451366F, 0.5336337511F, 0.5341222981F, 0.5346107771F, - 0.5350991876F, 0.5355875290F, 0.5360758007F, 0.5365640021F, - 0.5370521327F, 0.5375401920F, 0.5380281792F, 0.5385160939F, - 0.5390039355F, 0.5394917034F, 0.5399793971F, 0.5404670159F, - 0.5409545594F, 0.5414420269F, 0.5419294179F, 0.5424167318F, - 0.5429039680F, 0.5433911261F, 0.5438782053F, 0.5443652051F, - 0.5448521250F, 0.5453389644F, 0.5458257228F, 0.5463123995F, - 0.5467989940F, 0.5472855057F, 0.5477719341F, 0.5482582786F, - 0.5487445387F, 0.5492307137F, 0.5497168031F, 0.5502028063F, - 0.5506887228F, 0.5511745520F, 0.5516602934F, 0.5521459463F, - 0.5526315103F, 0.5531169847F, 0.5536023690F, 0.5540876626F, - 0.5545728649F, 0.5550579755F, 0.5555429937F, 0.5560279189F, - 0.5565127507F, 0.5569974884F, 0.5574821315F, 0.5579666794F, - 0.5584511316F, 0.5589354875F, 0.5594197465F, 0.5599039080F, - 0.5603879716F, 0.5608719367F, 0.5613558026F, 0.5618395689F, - 0.5623232350F, 0.5628068002F, 0.5632902642F, 0.5637736262F, - 0.5642568858F, 0.5647400423F, 0.5652230953F, 0.5657060442F, - 0.5661888883F, 0.5666716272F, 0.5671542603F, 0.5676367870F, - 0.5681192069F, 0.5686015192F, 0.5690837235F, 0.5695658192F, - 0.5700478058F, 0.5705296827F, 0.5710114494F, 0.5714931052F, - 0.5719746497F, 0.5724560822F, 0.5729374023F, 0.5734186094F, - 0.5738997029F, 0.5743806823F, 0.5748615470F, 0.5753422965F, - 0.5758229301F, 0.5763034475F, 0.5767838480F, 0.5772641310F, - 0.5777442960F, 0.5782243426F, 0.5787042700F, 0.5791840778F, - 0.5796637654F, 0.5801433322F, 0.5806227778F, 0.5811021016F, - 0.5815813029F, 0.5820603814F, 0.5825393363F, 0.5830181673F, - 0.5834968737F, 0.5839754549F, 0.5844539105F, 0.5849322399F, - 0.5854104425F, 0.5858885179F, 0.5863664653F, 0.5868442844F, - 0.5873219746F, 0.5877995353F, 0.5882769660F, 0.5887542661F, - 0.5892314351F, 0.5897084724F, 0.5901853776F, 0.5906621500F, - 0.5911387892F, 0.5916152945F, 0.5920916655F, 0.5925679016F, - 0.5930440022F, 0.5935199669F, 0.5939957950F, 0.5944714861F, - 0.5949470396F, 0.5954224550F, 0.5958977317F, 0.5963728692F, - 0.5968478669F, 0.5973227244F, 0.5977974411F, 0.5982720163F, - 0.5987464497F, 0.5992207407F, 0.5996948887F, 0.6001688932F, - 0.6006427537F, 0.6011164696F, 0.6015900405F, 0.6020634657F, - 0.6025367447F, 0.6030098770F, 0.6034828621F, 0.6039556995F, - 0.6044283885F, 0.6049009288F, 0.6053733196F, 0.6058455606F, - 0.6063176512F, 0.6067895909F, 0.6072613790F, 0.6077330152F, - 0.6082044989F, 0.6086758295F, 0.6091470065F, 0.6096180294F, - 0.6100888977F, 0.6105596108F, 0.6110301682F, 0.6115005694F, - 0.6119708139F, 0.6124409011F, 0.6129108305F, 0.6133806017F, - 0.6138502139F, 0.6143196669F, 0.6147889599F, 0.6152580926F, - 0.6157270643F, 0.6161958746F, 0.6166645230F, 0.6171330088F, - 0.6176013317F, 0.6180694910F, 0.6185374863F, 0.6190053171F, - 0.6194729827F, 0.6199404828F, 0.6204078167F, 0.6208749841F, - 0.6213419842F, 0.6218088168F, 0.6222754811F, 0.6227419768F, - 0.6232083032F, 0.6236744600F, 0.6241404465F, 0.6246062622F, - 0.6250719067F, 0.6255373795F, 0.6260026799F, 0.6264678076F, - 0.6269327619F, 0.6273975425F, 0.6278621487F, 0.6283265800F, - 0.6287908361F, 0.6292549163F, 0.6297188201F, 0.6301825471F, - 0.6306460966F, 0.6311094683F, 0.6315726617F, 0.6320356761F, - 0.6324985111F, 0.6329611662F, 0.6334236410F, 0.6338859348F, - 0.6343480472F, 0.6348099777F, 0.6352717257F, 0.6357332909F, - 0.6361946726F, 0.6366558704F, 0.6371168837F, 0.6375777122F, - 0.6380383552F, 0.6384988123F, 0.6389590830F, 0.6394191668F, - 0.6398790631F, 0.6403387716F, 0.6407982916F, 0.6412576228F, - 0.6417167645F, 0.6421757163F, 0.6426344778F, 0.6430930483F, - 0.6435514275F, 0.6440096149F, 0.6444676098F, 0.6449254119F, - 0.6453830207F, 0.6458404356F, 0.6462976562F, 0.6467546820F, - 0.6472115125F, 0.6476681472F, 0.6481245856F, 0.6485808273F, - 0.6490368717F, 0.6494927183F, 0.6499483667F, 0.6504038164F, - 0.6508590670F, 0.6513141178F, 0.6517689684F, 0.6522236185F, - 0.6526780673F, 0.6531323146F, 0.6535863598F, 0.6540402024F, - 0.6544938419F, 0.6549472779F, 0.6554005099F, 0.6558535373F, - 0.6563063598F, 0.6567589769F, 0.6572113880F, 0.6576635927F, - 0.6581155906F, 0.6585673810F, 0.6590189637F, 0.6594703380F, - 0.6599215035F, 0.6603724598F, 0.6608232064F, 0.6612737427F, - 0.6617240684F, 0.6621741829F, 0.6626240859F, 0.6630737767F, - 0.6635232550F, 0.6639725202F, 0.6644215720F, 0.6648704098F, - 0.6653190332F, 0.6657674417F, 0.6662156348F, 0.6666636121F, - 0.6671113731F, 0.6675589174F, 0.6680062445F, 0.6684533538F, - 0.6689002450F, 0.6693469177F, 0.6697933712F, 0.6702396052F, - 0.6706856193F, 0.6711314129F, 0.6715769855F, 0.6720223369F, - 0.6724674664F, 0.6729123736F, 0.6733570581F, 0.6738015194F, - 0.6742457570F, 0.6746897706F, 0.6751335596F, 0.6755771236F, - 0.6760204621F, 0.6764635747F, 0.6769064609F, 0.6773491204F, - 0.6777915525F, 0.6782337570F, 0.6786757332F, 0.6791174809F, - 0.6795589995F, 0.6800002886F, 0.6804413477F, 0.6808821765F, - 0.6813227743F, 0.6817631409F, 0.6822032758F, 0.6826431785F, - 0.6830828485F, 0.6835222855F, 0.6839614890F, 0.6844004585F, - 0.6848391936F, 0.6852776939F, 0.6857159589F, 0.6861539883F, - 0.6865917815F, 0.6870293381F, 0.6874666576F, 0.6879037398F, - 0.6883405840F, 0.6887771899F, 0.6892135571F, 0.6896496850F, - 0.6900855733F, 0.6905212216F, 0.6909566294F, 0.6913917963F, - 0.6918267218F, 0.6922614055F, 0.6926958471F, 0.6931300459F, - 0.6935640018F, 0.6939977141F, 0.6944311825F, 0.6948644066F, - 0.6952973859F, 0.6957301200F, 0.6961626085F, 0.6965948510F, - 0.6970268470F, 0.6974585961F, 0.6978900980F, 0.6983213521F, - 0.6987523580F, 0.6991831154F, 0.6996136238F, 0.7000438828F, - 0.7004738921F, 0.7009036510F, 0.7013331594F, 0.7017624166F, - 0.7021914224F, 0.7026201763F, 0.7030486779F, 0.7034769268F, - 0.7039049226F, 0.7043326648F, 0.7047601531F, 0.7051873870F, - 0.7056143662F, 0.7060410902F, 0.7064675586F, 0.7068937711F, - 0.7073197271F, 0.7077454264F, 0.7081708684F, 0.7085960529F, - 0.7090209793F, 0.7094456474F, 0.7098700566F, 0.7102942066F, - 0.7107180970F, 0.7111417274F, 0.7115650974F, 0.7119882066F, - 0.7124110545F, 0.7128336409F, 0.7132559653F, 0.7136780272F, - 0.7140998264F, 0.7145213624F, 0.7149426348F, 0.7153636433F, - 0.7157843874F, 0.7162048668F, 0.7166250810F, 0.7170450296F, - 0.7174647124F, 0.7178841289F, 0.7183032786F, 0.7187221613F, - 0.7191407765F, 0.7195591239F, 0.7199772030F, 0.7203950135F, - 0.7208125550F, 0.7212298271F, 0.7216468294F, 0.7220635616F, - 0.7224800233F, 0.7228962140F, 0.7233121335F, 0.7237277813F, - 0.7241431571F, 0.7245582604F, 0.7249730910F, 0.7253876484F, - 0.7258019322F, 0.7262159422F, 0.7266296778F, 0.7270431388F, - 0.7274563247F, 0.7278692353F, 0.7282818700F, 0.7286942287F, - 0.7291063108F, 0.7295181160F, 0.7299296440F, 0.7303408944F, - 0.7307518669F, 0.7311625609F, 0.7315729763F, 0.7319831126F, - 0.7323929695F, 0.7328025466F, 0.7332118435F, 0.7336208600F, - 0.7340295955F, 0.7344380499F, 0.7348462226F, 0.7352541134F, - 0.7356617220F, 0.7360690478F, 0.7364760907F, 0.7368828502F, - 0.7372893259F, 0.7376955176F, 0.7381014249F, 0.7385070475F, - 0.7389123849F, 0.7393174368F, 0.7397222029F, 0.7401266829F, - 0.7405308763F, 0.7409347829F, 0.7413384023F, 0.7417417341F, - 0.7421447780F, 0.7425475338F, 0.7429500009F, 0.7433521791F, - 0.7437540681F, 0.7441556674F, 0.7445569769F, 0.7449579960F, - 0.7453587245F, 0.7457591621F, 0.7461593084F, 0.7465591631F, - 0.7469587259F, 0.7473579963F, 0.7477569741F, 0.7481556590F, - 0.7485540506F, 0.7489521486F, 0.7493499526F, 0.7497474623F, - 0.7501446775F, 0.7505415977F, 0.7509382227F, 0.7513345521F, - 0.7517305856F, 0.7521263229F, 0.7525217636F, 0.7529169074F, - 0.7533117541F, 0.7537063032F, 0.7541005545F, 0.7544945076F, - 0.7548881623F, 0.7552815182F, 0.7556745749F, 0.7560673323F, - 0.7564597899F, 0.7568519474F, 0.7572438046F, 0.7576353611F, - 0.7580266166F, 0.7584175708F, 0.7588082235F, 0.7591985741F, - 0.7595886226F, 0.7599783685F, 0.7603678116F, 0.7607569515F, - 0.7611457879F, 0.7615343206F, 0.7619225493F, 0.7623104735F, - 0.7626980931F, 0.7630854078F, 0.7634724171F, 0.7638591209F, - 0.7642455188F, 0.7646316106F, 0.7650173959F, 0.7654028744F, - 0.7657880459F, 0.7661729100F, 0.7665574664F, 0.7669417150F, - 0.7673256553F, 0.7677092871F, 0.7680926100F, 0.7684756239F, - 0.7688583284F, 0.7692407232F, 0.7696228080F, 0.7700045826F, - 0.7703860467F, 0.7707671999F, 0.7711480420F, 0.7715285728F, - 0.7719087918F, 0.7722886989F, 0.7726682938F, 0.7730475762F, - 0.7734265458F, 0.7738052023F, 0.7741835454F, 0.7745615750F, - 0.7749392906F, 0.7753166921F, 0.7756937791F, 0.7760705514F, - 0.7764470087F, 0.7768231508F, 0.7771989773F, 0.7775744880F, - 0.7779496827F, 0.7783245610F, 0.7786991227F, 0.7790733676F, - 0.7794472953F, 0.7798209056F, 0.7801941982F, 0.7805671729F, - 0.7809398294F, 0.7813121675F, 0.7816841869F, 0.7820558873F, - 0.7824272684F, 0.7827983301F, 0.7831690720F, 0.7835394940F, - 0.7839095957F, 0.7842793768F, 0.7846488373F, 0.7850179767F, - 0.7853867948F, 0.7857552914F, 0.7861234663F, 0.7864913191F, - 0.7868588497F, 0.7872260578F, 0.7875929431F, 0.7879595055F, - 0.7883257445F, 0.7886916601F, 0.7890572520F, 0.7894225198F, - 0.7897874635F, 0.7901520827F, 0.7905163772F, 0.7908803468F, - 0.7912439912F, 0.7916073102F, 0.7919703035F, 0.7923329710F, - 0.7926953124F, 0.7930573274F, 0.7934190158F, 0.7937803774F, - 0.7941414120F, 0.7945021193F, 0.7948624991F, 0.7952225511F, - 0.7955822752F, 0.7959416711F, 0.7963007387F, 0.7966594775F, - 0.7970178875F, 0.7973759685F, 0.7977337201F, 0.7980911422F, - 0.7984482346F, 0.7988049970F, 0.7991614292F, 0.7995175310F, - 0.7998733022F, 0.8002287426F, 0.8005838519F, 0.8009386299F, - 0.8012930765F, 0.8016471914F, 0.8020009744F, 0.8023544253F, - 0.8027075438F, 0.8030603298F, 0.8034127831F, 0.8037649035F, - 0.8041166906F, 0.8044681445F, 0.8048192647F, 0.8051700512F, - 0.8055205038F, 0.8058706222F, 0.8062204062F, 0.8065698556F, - 0.8069189702F, 0.8072677499F, 0.8076161944F, 0.8079643036F, - 0.8083120772F, 0.8086595151F, 0.8090066170F, 0.8093533827F, - 0.8096998122F, 0.8100459051F, 0.8103916613F, 0.8107370806F, - 0.8110821628F, 0.8114269077F, 0.8117713151F, 0.8121153849F, - 0.8124591169F, 0.8128025108F, 0.8131455666F, 0.8134882839F, - 0.8138306627F, 0.8141727027F, 0.8145144038F, 0.8148557658F, - 0.8151967886F, 0.8155374718F, 0.8158778154F, 0.8162178192F, - 0.8165574830F, 0.8168968067F, 0.8172357900F, 0.8175744328F, - 0.8179127349F, 0.8182506962F, 0.8185883164F, 0.8189255955F, - 0.8192625332F, 0.8195991295F, 0.8199353840F, 0.8202712967F, - 0.8206068673F, 0.8209420958F, 0.8212769820F, 0.8216115256F, - 0.8219457266F, 0.8222795848F, 0.8226131000F, 0.8229462721F, - 0.8232791009F, 0.8236115863F, 0.8239437280F, 0.8242755260F, - 0.8246069801F, 0.8249380901F, 0.8252688559F, 0.8255992774F, - 0.8259293544F, 0.8262590867F, 0.8265884741F, 0.8269175167F, - 0.8272462141F, 0.8275745663F, 0.8279025732F, 0.8282302344F, - 0.8285575501F, 0.8288845199F, 0.8292111437F, 0.8295374215F, - 0.8298633530F, 0.8301889382F, 0.8305141768F, 0.8308390688F, - 0.8311636141F, 0.8314878124F, 0.8318116637F, 0.8321351678F, - 0.8324583246F, 0.8327811340F, 0.8331035957F, 0.8334257098F, - 0.8337474761F, 0.8340688944F, 0.8343899647F, 0.8347106867F, - 0.8350310605F, 0.8353510857F, 0.8356707624F, 0.8359900904F, - 0.8363090696F, 0.8366276999F, 0.8369459811F, 0.8372639131F, - 0.8375814958F, 0.8378987292F, 0.8382156130F, 0.8385321472F, - 0.8388483316F, 0.8391641662F, 0.8394796508F, 0.8397947853F, - 0.8401095697F, 0.8404240037F, 0.8407380873F, 0.8410518204F, - 0.8413652029F, 0.8416782347F, 0.8419909156F, 0.8423032456F, - 0.8426152245F, 0.8429268523F, 0.8432381289F, 0.8435490541F, - 0.8438596279F, 0.8441698502F, 0.8444797208F, 0.8447892396F, - 0.8450984067F, 0.8454072218F, 0.8457156849F, 0.8460237959F, - 0.8463315547F, 0.8466389612F, 0.8469460154F, 0.8472527170F, - 0.8475590661F, 0.8478650625F, 0.8481707063F, 0.8484759971F, - 0.8487809351F, 0.8490855201F, 0.8493897521F, 0.8496936308F, - 0.8499971564F, 0.8503003286F, 0.8506031474F, 0.8509056128F, - 0.8512077246F, 0.8515094828F, 0.8518108872F, 0.8521119379F, - 0.8524126348F, 0.8527129777F, 0.8530129666F, 0.8533126015F, - 0.8536118822F, 0.8539108087F, 0.8542093809F, 0.8545075988F, - 0.8548054623F, 0.8551029712F, 0.8554001257F, 0.8556969255F, - 0.8559933707F, 0.8562894611F, 0.8565851968F, 0.8568805775F, - 0.8571756034F, 0.8574702743F, 0.8577645902F, 0.8580585509F, - 0.8583521566F, 0.8586454070F, 0.8589383021F, 0.8592308420F, - 0.8595230265F, 0.8598148556F, 0.8601063292F, 0.8603974473F, - 0.8606882098F, 0.8609786167F, 0.8612686680F, 0.8615583636F, - 0.8618477034F, 0.8621366874F, 0.8624253156F, 0.8627135878F, - 0.8630015042F, 0.8632890646F, 0.8635762690F, 0.8638631173F, - 0.8641496096F, 0.8644357457F, 0.8647215257F, 0.8650069495F, - 0.8652920171F, 0.8655767283F, 0.8658610833F, 0.8661450820F, - 0.8664287243F, 0.8667120102F, 0.8669949397F, 0.8672775127F, - 0.8675597293F, 0.8678415894F, 0.8681230929F, 0.8684042398F, - 0.8686850302F, 0.8689654640F, 0.8692455412F, 0.8695252617F, - 0.8698046255F, 0.8700836327F, 0.8703622831F, 0.8706405768F, - 0.8709185138F, 0.8711960940F, 0.8714733174F, 0.8717501840F, - 0.8720266939F, 0.8723028469F, 0.8725786430F, 0.8728540824F, - 0.8731291648F, 0.8734038905F, 0.8736782592F, 0.8739522711F, - 0.8742259261F, 0.8744992242F, 0.8747721653F, 0.8750447496F, - 0.8753169770F, 0.8755888475F, 0.8758603611F, 0.8761315177F, - 0.8764023175F, 0.8766727603F, 0.8769428462F, 0.8772125752F, - 0.8774819474F, 0.8777509626F, 0.8780196209F, 0.8782879224F, - 0.8785558669F, 0.8788234546F, 0.8790906854F, 0.8793575594F, - 0.8796240765F, 0.8798902368F, 0.8801560403F, 0.8804214870F, - 0.8806865768F, 0.8809513099F, 0.8812156863F, 0.8814797059F, - 0.8817433687F, 0.8820066749F, 0.8822696243F, 0.8825322171F, - 0.8827944532F, 0.8830563327F, 0.8833178556F, 0.8835790219F, - 0.8838398316F, 0.8841002848F, 0.8843603815F, 0.8846201217F, - 0.8848795054F, 0.8851385327F, 0.8853972036F, 0.8856555182F, - 0.8859134764F, 0.8861710783F, 0.8864283239F, 0.8866852133F, - 0.8869417464F, 0.8871979234F, 0.8874537443F, 0.8877092090F, - 0.8879643177F, 0.8882190704F, 0.8884734671F, 0.8887275078F, - 0.8889811927F, 0.8892345216F, 0.8894874948F, 0.8897401122F, - 0.8899923738F, 0.8902442798F, 0.8904958301F, 0.8907470248F, - 0.8909978640F, 0.8912483477F, 0.8914984759F, 0.8917482487F, - 0.8919976662F, 0.8922467284F, 0.8924954353F, 0.8927437871F, - 0.8929917837F, 0.8932394252F, 0.8934867118F, 0.8937336433F, - 0.8939802199F, 0.8942264417F, 0.8944723087F, 0.8947178210F, - 0.8949629785F, 0.8952077815F, 0.8954522299F, 0.8956963239F, - 0.8959400634F, 0.8961834486F, 0.8964264795F, 0.8966691561F, - 0.8969114786F, 0.8971534470F, 0.8973950614F, 0.8976363219F, - 0.8978772284F, 0.8981177812F, 0.8983579802F, 0.8985978256F, - 0.8988373174F, 0.8990764556F, 0.8993152405F, 0.8995536720F, - 0.8997917502F, 0.9000294751F, 0.9002668470F, 0.9005038658F, - 0.9007405317F, 0.9009768446F, 0.9012128048F, 0.9014484123F, - 0.9016836671F, 0.9019185693F, 0.9021531191F, 0.9023873165F, - 0.9026211616F, 0.9028546546F, 0.9030877954F, 0.9033205841F, - 0.9035530210F, 0.9037851059F, 0.9040168392F, 0.9042482207F, - 0.9044792507F, 0.9047099293F, 0.9049402564F, 0.9051702323F, - 0.9053998569F, 0.9056291305F, 0.9058580531F, 0.9060866248F, - 0.9063148457F, 0.9065427159F, 0.9067702355F, 0.9069974046F, - 0.9072242233F, 0.9074506917F, 0.9076768100F, 0.9079025782F, - 0.9081279964F, 0.9083530647F, 0.9085777833F, 0.9088021523F, - 0.9090261717F, 0.9092498417F, 0.9094731623F, 0.9096961338F, - 0.9099187561F, 0.9101410295F, 0.9103629540F, 0.9105845297F, - 0.9108057568F, 0.9110266354F, 0.9112471656F, 0.9114673475F, - 0.9116871812F, 0.9119066668F, 0.9121258046F, 0.9123445945F, - 0.9125630367F, 0.9127811314F, 0.9129988786F, 0.9132162785F, - 0.9134333312F, 0.9136500368F, 0.9138663954F, 0.9140824073F, - 0.9142980724F, 0.9145133910F, 0.9147283632F, 0.9149429890F, - 0.9151572687F, 0.9153712023F, 0.9155847900F, 0.9157980319F, - 0.9160109282F, 0.9162234790F, 0.9164356844F, 0.9166475445F, - 0.9168590595F, 0.9170702296F, 0.9172810548F, 0.9174915354F, - 0.9177016714F, 0.9179114629F, 0.9181209102F, 0.9183300134F, - 0.9185387726F, 0.9187471879F, 0.9189552595F, 0.9191629876F, - 0.9193703723F, 0.9195774136F, 0.9197841119F, 0.9199904672F, - 0.9201964797F, 0.9204021495F, 0.9206074767F, 0.9208124616F, - 0.9210171043F, 0.9212214049F, 0.9214253636F, 0.9216289805F, - 0.9218322558F, 0.9220351896F, 0.9222377821F, 0.9224400335F, - 0.9226419439F, 0.9228435134F, 0.9230447423F, 0.9232456307F, - 0.9234461787F, 0.9236463865F, 0.9238462543F, 0.9240457822F, - 0.9242449704F, 0.9244438190F, 0.9246423282F, 0.9248404983F, - 0.9250383293F, 0.9252358214F, 0.9254329747F, 0.9256297896F, - 0.9258262660F, 0.9260224042F, 0.9262182044F, 0.9264136667F, - 0.9266087913F, 0.9268035783F, 0.9269980280F, 0.9271921405F, - 0.9273859160F, 0.9275793546F, 0.9277724566F, 0.9279652221F, - 0.9281576513F, 0.9283497443F, 0.9285415014F, 0.9287329227F, - 0.9289240084F, 0.9291147586F, 0.9293051737F, 0.9294952536F, - 0.9296849987F, 0.9298744091F, 0.9300634850F, 0.9302522266F, - 0.9304406340F, 0.9306287074F, 0.9308164471F, 0.9310038532F, - 0.9311909259F, 0.9313776654F, 0.9315640719F, 0.9317501455F, - 0.9319358865F, 0.9321212951F, 0.9323063713F, 0.9324911155F, - 0.9326755279F, 0.9328596085F, 0.9330433577F, 0.9332267756F, - 0.9334098623F, 0.9335926182F, 0.9337750434F, 0.9339571380F, - 0.9341389023F, 0.9343203366F, 0.9345014409F, 0.9346822155F, - 0.9348626606F, 0.9350427763F, 0.9352225630F, 0.9354020207F, - 0.9355811498F, 0.9357599503F, 0.9359384226F, 0.9361165667F, - 0.9362943830F, 0.9364718716F, 0.9366490327F, 0.9368258666F, - 0.9370023733F, 0.9371785533F, 0.9373544066F, 0.9375299335F, - 0.9377051341F, 0.9378800087F, 0.9380545576F, 0.9382287809F, - 0.9384026787F, 0.9385762515F, 0.9387494993F, 0.9389224223F, - 0.9390950209F, 0.9392672951F, 0.9394392453F, 0.9396108716F, - 0.9397821743F, 0.9399531536F, 0.9401238096F, 0.9402941427F, - 0.9404641530F, 0.9406338407F, 0.9408032061F, 0.9409722495F, - 0.9411409709F, 0.9413093707F, 0.9414774491F, 0.9416452062F, - 0.9418126424F, 0.9419797579F, 0.9421465528F, 0.9423130274F, - 0.9424791819F, 0.9426450166F, 0.9428105317F, 0.9429757274F, - 0.9431406039F, 0.9433051616F, 0.9434694005F, 0.9436333209F, - 0.9437969232F, 0.9439602074F, 0.9441231739F, 0.9442858229F, - 0.9444481545F, 0.9446101691F, 0.9447718669F, 0.9449332481F, - 0.9450943129F, 0.9452550617F, 0.9454154945F, 0.9455756118F, - 0.9457354136F, 0.9458949003F, 0.9460540721F, 0.9462129292F, - 0.9463714719F, 0.9465297003F, 0.9466876149F, 0.9468452157F, - 0.9470025031F, 0.9471594772F, 0.9473161384F, 0.9474724869F, - 0.9476285229F, 0.9477842466F, 0.9479396584F, 0.9480947585F, - 0.9482495470F, 0.9484040243F, 0.9485581906F, 0.9487120462F, - 0.9488655913F, 0.9490188262F, 0.9491717511F, 0.9493243662F, - 0.9494766718F, 0.9496286683F, 0.9497803557F, 0.9499317345F, - 0.9500828047F, 0.9502335668F, 0.9503840209F, 0.9505341673F, - 0.9506840062F, 0.9508335380F, 0.9509827629F, 0.9511316810F, - 0.9512802928F, 0.9514285984F, 0.9515765982F, 0.9517242923F, - 0.9518716810F, 0.9520187646F, 0.9521655434F, 0.9523120176F, - 0.9524581875F, 0.9526040534F, 0.9527496154F, 0.9528948739F, - 0.9530398292F, 0.9531844814F, 0.9533288310F, 0.9534728780F, - 0.9536166229F, 0.9537600659F, 0.9539032071F, 0.9540460470F, - 0.9541885858F, 0.9543308237F, 0.9544727611F, 0.9546143981F, - 0.9547557351F, 0.9548967723F, 0.9550375100F, 0.9551779485F, - 0.9553180881F, 0.9554579290F, 0.9555974714F, 0.9557367158F, - 0.9558756623F, 0.9560143112F, 0.9561526628F, 0.9562907174F, - 0.9564284752F, 0.9565659366F, 0.9567031017F, 0.9568399710F, - 0.9569765446F, 0.9571128229F, 0.9572488061F, 0.9573844944F, - 0.9575198883F, 0.9576549879F, 0.9577897936F, 0.9579243056F, - 0.9580585242F, 0.9581924497F, 0.9583260824F, 0.9584594226F, - 0.9585924705F, 0.9587252264F, 0.9588576906F, 0.9589898634F, - 0.9591217452F, 0.9592533360F, 0.9593846364F, 0.9595156465F, - 0.9596463666F, 0.9597767971F, 0.9599069382F, 0.9600367901F, - 0.9601663533F, 0.9602956279F, 0.9604246143F, 0.9605533128F, - 0.9606817236F, 0.9608098471F, 0.9609376835F, 0.9610652332F, - 0.9611924963F, 0.9613194733F, 0.9614461644F, 0.9615725699F, - 0.9616986901F, 0.9618245253F, 0.9619500757F, 0.9620753418F, - 0.9622003238F, 0.9623250219F, 0.9624494365F, 0.9625735679F, - 0.9626974163F, 0.9628209821F, 0.9629442656F, 0.9630672671F, - 0.9631899868F, 0.9633124251F, 0.9634345822F, 0.9635564585F, - 0.9636780543F, 0.9637993699F, 0.9639204056F, 0.9640411616F, - 0.9641616383F, 0.9642818359F, 0.9644017549F, 0.9645213955F, - 0.9646407579F, 0.9647598426F, 0.9648786497F, 0.9649971797F, - 0.9651154328F, 0.9652334092F, 0.9653511095F, 0.9654685337F, - 0.9655856823F, 0.9657025556F, 0.9658191538F, 0.9659354773F, - 0.9660515263F, 0.9661673013F, 0.9662828024F, 0.9663980300F, - 0.9665129845F, 0.9666276660F, 0.9667420750F, 0.9668562118F, - 0.9669700766F, 0.9670836698F, 0.9671969917F, 0.9673100425F, - 0.9674228227F, 0.9675353325F, 0.9676475722F, 0.9677595422F, - 0.9678712428F, 0.9679826742F, 0.9680938368F, 0.9682047309F, - 0.9683153569F, 0.9684257150F, 0.9685358056F, 0.9686456289F, - 0.9687551853F, 0.9688644752F, 0.9689734987F, 0.9690822564F, - 0.9691907483F, 0.9692989750F, 0.9694069367F, 0.9695146337F, - 0.9696220663F, 0.9697292349F, 0.9698361398F, 0.9699427813F, - 0.9700491597F, 0.9701552754F, 0.9702611286F, 0.9703667197F, - 0.9704720490F, 0.9705771169F, 0.9706819236F, 0.9707864695F, - 0.9708907549F, 0.9709947802F, 0.9710985456F, 0.9712020514F, - 0.9713052981F, 0.9714082859F, 0.9715110151F, 0.9716134862F, - 0.9717156993F, 0.9718176549F, 0.9719193532F, 0.9720207946F, - 0.9721219794F, 0.9722229080F, 0.9723235806F, 0.9724239976F, - 0.9725241593F, 0.9726240661F, 0.9727237183F, 0.9728231161F, - 0.9729222601F, 0.9730211503F, 0.9731197873F, 0.9732181713F, - 0.9733163027F, 0.9734141817F, 0.9735118088F, 0.9736091842F, - 0.9737063083F, 0.9738031814F, 0.9738998039F, 0.9739961760F, - 0.9740922981F, 0.9741881706F, 0.9742837938F, 0.9743791680F, - 0.9744742935F, 0.9745691707F, 0.9746637999F, 0.9747581814F, - 0.9748523157F, 0.9749462029F, 0.9750398435F, 0.9751332378F, - 0.9752263861F, 0.9753192887F, 0.9754119461F, 0.9755043585F, - 0.9755965262F, 0.9756884496F, 0.9757801291F, 0.9758715650F, - 0.9759627575F, 0.9760537071F, 0.9761444141F, 0.9762348789F, - 0.9763251016F, 0.9764150828F, 0.9765048228F, 0.9765943218F, - 0.9766835802F, 0.9767725984F, 0.9768613767F, 0.9769499154F, - 0.9770382149F, 0.9771262755F, 0.9772140976F, 0.9773016815F, - 0.9773890275F, 0.9774761360F, 0.9775630073F, 0.9776496418F, - 0.9777360398F, 0.9778222016F, 0.9779081277F, 0.9779938182F, - 0.9780792736F, 0.9781644943F, 0.9782494805F, 0.9783342326F, - 0.9784187509F, 0.9785030359F, 0.9785870877F, 0.9786709069F, - 0.9787544936F, 0.9788378484F, 0.9789209714F, 0.9790038631F, - 0.9790865238F, 0.9791689538F, 0.9792511535F, 0.9793331232F, - 0.9794148633F, 0.9794963742F, 0.9795776561F, 0.9796587094F, - 0.9797395345F, 0.9798201316F, 0.9799005013F, 0.9799806437F, - 0.9800605593F, 0.9801402483F, 0.9802197112F, 0.9802989483F, - 0.9803779600F, 0.9804567465F, 0.9805353082F, 0.9806136455F, - 0.9806917587F, 0.9807696482F, 0.9808473143F, 0.9809247574F, - 0.9810019778F, 0.9810789759F, 0.9811557519F, 0.9812323064F, - 0.9813086395F, 0.9813847517F, 0.9814606433F, 0.9815363147F, - 0.9816117662F, 0.9816869981F, 0.9817620108F, 0.9818368047F, - 0.9819113801F, 0.9819857374F, 0.9820598769F, 0.9821337989F, - 0.9822075038F, 0.9822809920F, 0.9823542638F, 0.9824273195F, - 0.9825001596F, 0.9825727843F, 0.9826451940F, 0.9827173891F, - 0.9827893700F, 0.9828611368F, 0.9829326901F, 0.9830040302F, - 0.9830751574F, 0.9831460720F, 0.9832167745F, 0.9832872652F, - 0.9833575444F, 0.9834276124F, 0.9834974697F, 0.9835671166F, - 0.9836365535F, 0.9837057806F, 0.9837747983F, 0.9838436071F, - 0.9839122072F, 0.9839805990F, 0.9840487829F, 0.9841167591F, - 0.9841845282F, 0.9842520903F, 0.9843194459F, 0.9843865953F, - 0.9844535389F, 0.9845202771F, 0.9845868101F, 0.9846531383F, - 0.9847192622F, 0.9847851820F, 0.9848508980F, 0.9849164108F, - 0.9849817205F, 0.9850468276F, 0.9851117324F, 0.9851764352F, - 0.9852409365F, 0.9853052366F, 0.9853693358F, 0.9854332344F, - 0.9854969330F, 0.9855604317F, 0.9856237309F, 0.9856868310F, - 0.9857497325F, 0.9858124355F, 0.9858749404F, 0.9859372477F, - 0.9859993577F, 0.9860612707F, 0.9861229871F, 0.9861845072F, - 0.9862458315F, 0.9863069601F, 0.9863678936F, 0.9864286322F, - 0.9864891764F, 0.9865495264F, 0.9866096826F, 0.9866696454F, - 0.9867294152F, 0.9867889922F, 0.9868483769F, 0.9869075695F, - 0.9869665706F, 0.9870253803F, 0.9870839991F, 0.9871424273F, - 0.9872006653F, 0.9872587135F, 0.9873165721F, 0.9873742415F, - 0.9874317222F, 0.9874890144F, 0.9875461185F, 0.9876030348F, - 0.9876597638F, 0.9877163057F, 0.9877726610F, 0.9878288300F, - 0.9878848130F, 0.9879406104F, 0.9879962225F, 0.9880516497F, - 0.9881068924F, 0.9881619509F, 0.9882168256F, 0.9882715168F, - 0.9883260249F, 0.9883803502F, 0.9884344931F, 0.9884884539F, - 0.9885422331F, 0.9885958309F, 0.9886492477F, 0.9887024838F, - 0.9887555397F, 0.9888084157F, 0.9888611120F, 0.9889136292F, - 0.9889659675F, 0.9890181273F, 0.9890701089F, 0.9891219128F, - 0.9891735392F, 0.9892249885F, 0.9892762610F, 0.9893273572F, - 0.9893782774F, 0.9894290219F, 0.9894795911F, 0.9895299853F, - 0.9895802049F, 0.9896302502F, 0.9896801217F, 0.9897298196F, - 0.9897793443F, 0.9898286961F, 0.9898778755F, 0.9899268828F, - 0.9899757183F, 0.9900243823F, 0.9900728753F, 0.9901211976F, - 0.9901693495F, 0.9902173314F, 0.9902651436F, 0.9903127865F, - 0.9903602605F, 0.9904075659F, 0.9904547031F, 0.9905016723F, - 0.9905484740F, 0.9905951086F, 0.9906415763F, 0.9906878775F, - 0.9907340126F, 0.9907799819F, 0.9908257858F, 0.9908714247F, - 0.9909168988F, 0.9909622086F, 0.9910073543F, 0.9910523364F, - 0.9910971552F, 0.9911418110F, 0.9911863042F, 0.9912306351F, - 0.9912748042F, 0.9913188117F, 0.9913626580F, 0.9914063435F, - 0.9914498684F, 0.9914932333F, 0.9915364383F, 0.9915794839F, - 0.9916223703F, 0.9916650981F, 0.9917076674F, 0.9917500787F, - 0.9917923323F, 0.9918344286F, 0.9918763679F, 0.9919181505F, - 0.9919597769F, 0.9920012473F, 0.9920425621F, 0.9920837217F, - 0.9921247263F, 0.9921655765F, 0.9922062724F, 0.9922468145F, - 0.9922872030F, 0.9923274385F, 0.9923675211F, 0.9924074513F, - 0.9924472294F, 0.9924868557F, 0.9925263306F, 0.9925656544F, - 0.9926048275F, 0.9926438503F, 0.9926827230F, 0.9927214461F, - 0.9927600199F, 0.9927984446F, 0.9928367208F, 0.9928748486F, - 0.9929128285F, 0.9929506608F, 0.9929883459F, 0.9930258841F, - 0.9930632757F, 0.9931005211F, 0.9931376207F, 0.9931745747F, - 0.9932113836F, 0.9932480476F, 0.9932845671F, 0.9933209425F, - 0.9933571742F, 0.9933932623F, 0.9934292074F, 0.9934650097F, - 0.9935006696F, 0.9935361874F, 0.9935715635F, 0.9936067982F, - 0.9936418919F, 0.9936768448F, 0.9937116574F, 0.9937463300F, - 0.9937808629F, 0.9938152565F, 0.9938495111F, 0.9938836271F, - 0.9939176047F, 0.9939514444F, 0.9939851465F, 0.9940187112F, - 0.9940521391F, 0.9940854303F, 0.9941185853F, 0.9941516044F, - 0.9941844879F, 0.9942172361F, 0.9942498495F, 0.9942823283F, - 0.9943146729F, 0.9943468836F, 0.9943789608F, 0.9944109047F, - 0.9944427158F, 0.9944743944F, 0.9945059408F, 0.9945373553F, - 0.9945686384F, 0.9945997902F, 0.9946308112F, 0.9946617017F, - 0.9946924621F, 0.9947230926F, 0.9947535937F, 0.9947839656F, - 0.9948142086F, 0.9948443232F, 0.9948743097F, 0.9949041683F, - 0.9949338995F, 0.9949635035F, 0.9949929807F, 0.9950223315F, - 0.9950515561F, 0.9950806549F, 0.9951096282F, 0.9951384764F, - 0.9951671998F, 0.9951957987F, 0.9952242735F, 0.9952526245F, - 0.9952808520F, 0.9953089564F, 0.9953369380F, 0.9953647971F, - 0.9953925340F, 0.9954201491F, 0.9954476428F, 0.9954750153F, - 0.9955022670F, 0.9955293981F, 0.9955564092F, 0.9955833003F, - 0.9956100720F, 0.9956367245F, 0.9956632582F, 0.9956896733F, - 0.9957159703F, 0.9957421494F, 0.9957682110F, 0.9957941553F, - 0.9958199828F, 0.9958456937F, 0.9958712884F, 0.9958967672F, - 0.9959221305F, 0.9959473784F, 0.9959725115F, 0.9959975300F, - 0.9960224342F, 0.9960472244F, 0.9960719011F, 0.9960964644F, - 0.9961209148F, 0.9961452525F, 0.9961694779F, 0.9961935913F, - 0.9962175930F, 0.9962414834F, 0.9962652627F, 0.9962889313F, - 0.9963124895F, 0.9963359377F, 0.9963592761F, 0.9963825051F, - 0.9964056250F, 0.9964286361F, 0.9964515387F, 0.9964743332F, - 0.9964970198F, 0.9965195990F, 0.9965420709F, 0.9965644360F, - 0.9965866946F, 0.9966088469F, 0.9966308932F, 0.9966528340F, - 0.9966746695F, 0.9966964001F, 0.9967180260F, 0.9967395475F, - 0.9967609651F, 0.9967822789F, 0.9968034894F, 0.9968245968F, - 0.9968456014F, 0.9968665036F, 0.9968873037F, 0.9969080019F, - 0.9969285987F, 0.9969490942F, 0.9969694889F, 0.9969897830F, - 0.9970099769F, 0.9970300708F, 0.9970500651F, 0.9970699601F, - 0.9970897561F, 0.9971094533F, 0.9971290522F, 0.9971485531F, - 0.9971679561F, 0.9971872617F, 0.9972064702F, 0.9972255818F, - 0.9972445968F, 0.9972635157F, 0.9972823386F, 0.9973010659F, - 0.9973196980F, 0.9973382350F, 0.9973566773F, 0.9973750253F, - 0.9973932791F, 0.9974114392F, 0.9974295059F, 0.9974474793F, - 0.9974653599F, 0.9974831480F, 0.9975008438F, 0.9975184476F, - 0.9975359598F, 0.9975533806F, 0.9975707104F, 0.9975879495F, - 0.9976050981F, 0.9976221566F, 0.9976391252F, 0.9976560043F, - 0.9976727941F, 0.9976894950F, 0.9977061073F, 0.9977226312F, - 0.9977390671F, 0.9977554152F, 0.9977716759F, 0.9977878495F, - 0.9978039361F, 0.9978199363F, 0.9978358501F, 0.9978516780F, - 0.9978674202F, 0.9978830771F, 0.9978986488F, 0.9979141358F, - 0.9979295383F, 0.9979448566F, 0.9979600909F, 0.9979752417F, - 0.9979903091F, 0.9980052936F, 0.9980201952F, 0.9980350145F, - 0.9980497515F, 0.9980644067F, 0.9980789804F, 0.9980934727F, - 0.9981078841F, 0.9981222147F, 0.9981364649F, 0.9981506350F, - 0.9981647253F, 0.9981787360F, 0.9981926674F, 0.9982065199F, - 0.9982202936F, 0.9982339890F, 0.9982476062F, 0.9982611456F, - 0.9982746074F, 0.9982879920F, 0.9983012996F, 0.9983145304F, - 0.9983276849F, 0.9983407632F, 0.9983537657F, 0.9983666926F, - 0.9983795442F, 0.9983923208F, 0.9984050226F, 0.9984176501F, - 0.9984302033F, 0.9984426827F, 0.9984550884F, 0.9984674208F, - 0.9984796802F, 0.9984918667F, 0.9985039808F, 0.9985160227F, - 0.9985279926F, 0.9985398909F, 0.9985517177F, 0.9985634734F, - 0.9985751583F, 0.9985867727F, 0.9985983167F, 0.9986097907F, - 0.9986211949F, 0.9986325297F, 0.9986437953F, 0.9986549919F, - 0.9986661199F, 0.9986771795F, 0.9986881710F, 0.9986990946F, - 0.9987099507F, 0.9987207394F, 0.9987314611F, 0.9987421161F, - 0.9987527045F, 0.9987632267F, 0.9987736829F, 0.9987840734F, - 0.9987943985F, 0.9988046584F, 0.9988148534F, 0.9988249838F, - 0.9988350498F, 0.9988450516F, 0.9988549897F, 0.9988648641F, - 0.9988746753F, 0.9988844233F, 0.9988941086F, 0.9989037313F, - 0.9989132918F, 0.9989227902F, 0.9989322269F, 0.9989416021F, - 0.9989509160F, 0.9989601690F, 0.9989693613F, 0.9989784931F, - 0.9989875647F, 0.9989965763F, 0.9990055283F, 0.9990144208F, - 0.9990232541F, 0.9990320286F, 0.9990407443F, 0.9990494016F, - 0.9990580008F, 0.9990665421F, 0.9990750257F, 0.9990834519F, - 0.9990918209F, 0.9991001331F, 0.9991083886F, 0.9991165877F, - 0.9991247307F, 0.9991328177F, 0.9991408491F, 0.9991488251F, - 0.9991567460F, 0.9991646119F, 0.9991724232F, 0.9991801801F, - 0.9991878828F, 0.9991955316F, 0.9992031267F, 0.9992106684F, - 0.9992181569F, 0.9992255925F, 0.9992329753F, 0.9992403057F, - 0.9992475839F, 0.9992548101F, 0.9992619846F, 0.9992691076F, - 0.9992761793F, 0.9992832001F, 0.9992901701F, 0.9992970895F, - 0.9993039587F, 0.9993107777F, 0.9993175470F, 0.9993242667F, - 0.9993309371F, 0.9993375583F, 0.9993441307F, 0.9993506545F, - 0.9993571298F, 0.9993635570F, 0.9993699362F, 0.9993762678F, - 0.9993825519F, 0.9993887887F, 0.9993949785F, 0.9994011216F, - 0.9994072181F, 0.9994132683F, 0.9994192725F, 0.9994252307F, - 0.9994311434F, 0.9994370107F, 0.9994428327F, 0.9994486099F, - 0.9994543423F, 0.9994600303F, 0.9994656739F, 0.9994712736F, - 0.9994768294F, 0.9994823417F, 0.9994878105F, 0.9994932363F, - 0.9994986191F, 0.9995039592F, 0.9995092568F, 0.9995145122F, - 0.9995197256F, 0.9995248971F, 0.9995300270F, 0.9995351156F, - 0.9995401630F, 0.9995451695F, 0.9995501352F, 0.9995550604F, - 0.9995599454F, 0.9995647903F, 0.9995695953F, 0.9995743607F, - 0.9995790866F, 0.9995837734F, 0.9995884211F, 0.9995930300F, - 0.9995976004F, 0.9996021324F, 0.9996066263F, 0.9996110822F, - 0.9996155004F, 0.9996198810F, 0.9996242244F, 0.9996285306F, - 0.9996327999F, 0.9996370326F, 0.9996412287F, 0.9996453886F, - 0.9996495125F, 0.9996536004F, 0.9996576527F, 0.9996616696F, - 0.9996656512F, 0.9996695977F, 0.9996735094F, 0.9996773865F, - 0.9996812291F, 0.9996850374F, 0.9996888118F, 0.9996925523F, - 0.9996962591F, 0.9996999325F, 0.9997035727F, 0.9997071798F, - 0.9997107541F, 0.9997142957F, 0.9997178049F, 0.9997212818F, - 0.9997247266F, 0.9997281396F, 0.9997315209F, 0.9997348708F, - 0.9997381893F, 0.9997414767F, 0.9997447333F, 0.9997479591F, - 0.9997511544F, 0.9997543194F, 0.9997574542F, 0.9997605591F, - 0.9997636342F, 0.9997666797F, 0.9997696958F, 0.9997726828F, - 0.9997756407F, 0.9997785698F, 0.9997814703F, 0.9997843423F, - 0.9997871860F, 0.9997900016F, 0.9997927894F, 0.9997955494F, - 0.9997982818F, 0.9998009869F, 0.9998036648F, 0.9998063157F, - 0.9998089398F, 0.9998115373F, 0.9998141082F, 0.9998166529F, - 0.9998191715F, 0.9998216642F, 0.9998241311F, 0.9998265724F, - 0.9998289884F, 0.9998313790F, 0.9998337447F, 0.9998360854F, - 0.9998384015F, 0.9998406930F, 0.9998429602F, 0.9998452031F, - 0.9998474221F, 0.9998496171F, 0.9998517885F, 0.9998539364F, - 0.9998560610F, 0.9998581624F, 0.9998602407F, 0.9998622962F, - 0.9998643291F, 0.9998663394F, 0.9998683274F, 0.9998702932F, - 0.9998722370F, 0.9998741589F, 0.9998760591F, 0.9998779378F, - 0.9998797952F, 0.9998816313F, 0.9998834464F, 0.9998852406F, - 0.9998870141F, 0.9998887670F, 0.9998904995F, 0.9998922117F, - 0.9998939039F, 0.9998955761F, 0.9998972285F, 0.9998988613F, - 0.9999004746F, 0.9999020686F, 0.9999036434F, 0.9999051992F, - 0.9999067362F, 0.9999082544F, 0.9999097541F, 0.9999112354F, - 0.9999126984F, 0.9999141433F, 0.9999155703F, 0.9999169794F, - 0.9999183709F, 0.9999197449F, 0.9999211014F, 0.9999224408F, - 0.9999237631F, 0.9999250684F, 0.9999263570F, 0.9999276289F, - 0.9999288843F, 0.9999301233F, 0.9999313461F, 0.9999325529F, - 0.9999337437F, 0.9999349187F, 0.9999360780F, 0.9999372218F, - 0.9999383503F, 0.9999394635F, 0.9999405616F, 0.9999416447F, - 0.9999427129F, 0.9999437665F, 0.9999448055F, 0.9999458301F, - 0.9999468404F, 0.9999478365F, 0.9999488185F, 0.9999497867F, - 0.9999507411F, 0.9999516819F, 0.9999526091F, 0.9999535230F, - 0.9999544236F, 0.9999553111F, 0.9999561856F, 0.9999570472F, - 0.9999578960F, 0.9999587323F, 0.9999595560F, 0.9999603674F, - 0.9999611666F, 0.9999619536F, 0.9999627286F, 0.9999634917F, - 0.9999642431F, 0.9999649828F, 0.9999657110F, 0.9999664278F, - 0.9999671334F, 0.9999678278F, 0.9999685111F, 0.9999691835F, - 0.9999698451F, 0.9999704960F, 0.9999711364F, 0.9999717662F, - 0.9999723858F, 0.9999729950F, 0.9999735942F, 0.9999741834F, - 0.9999747626F, 0.9999753321F, 0.9999758919F, 0.9999764421F, - 0.9999769828F, 0.9999775143F, 0.9999780364F, 0.9999785495F, - 0.9999790535F, 0.9999795485F, 0.9999800348F, 0.9999805124F, - 0.9999809813F, 0.9999814417F, 0.9999818938F, 0.9999823375F, - 0.9999827731F, 0.9999832005F, 0.9999836200F, 0.9999840316F, - 0.9999844353F, 0.9999848314F, 0.9999852199F, 0.9999856008F, - 0.9999859744F, 0.9999863407F, 0.9999866997F, 0.9999870516F, - 0.9999873965F, 0.9999877345F, 0.9999880656F, 0.9999883900F, - 0.9999887078F, 0.9999890190F, 0.9999893237F, 0.9999896220F, - 0.9999899140F, 0.9999901999F, 0.9999904796F, 0.9999907533F, - 0.9999910211F, 0.9999912830F, 0.9999915391F, 0.9999917896F, - 0.9999920345F, 0.9999922738F, 0.9999925077F, 0.9999927363F, - 0.9999929596F, 0.9999931777F, 0.9999933907F, 0.9999935987F, - 0.9999938018F, 0.9999940000F, 0.9999941934F, 0.9999943820F, - 0.9999945661F, 0.9999947456F, 0.9999949206F, 0.9999950912F, - 0.9999952575F, 0.9999954195F, 0.9999955773F, 0.9999957311F, - 0.9999958807F, 0.9999960265F, 0.9999961683F, 0.9999963063F, - 0.9999964405F, 0.9999965710F, 0.9999966979F, 0.9999968213F, - 0.9999969412F, 0.9999970576F, 0.9999971707F, 0.9999972805F, - 0.9999973871F, 0.9999974905F, 0.9999975909F, 0.9999976881F, - 0.9999977824F, 0.9999978738F, 0.9999979624F, 0.9999980481F, - 0.9999981311F, 0.9999982115F, 0.9999982892F, 0.9999983644F, - 0.9999984370F, 0.9999985072F, 0.9999985750F, 0.9999986405F, - 0.9999987037F, 0.9999987647F, 0.9999988235F, 0.9999988802F, - 0.9999989348F, 0.9999989873F, 0.9999990379F, 0.9999990866F, - 0.9999991334F, 0.9999991784F, 0.9999992217F, 0.9999992632F, - 0.9999993030F, 0.9999993411F, 0.9999993777F, 0.9999994128F, - 0.9999994463F, 0.9999994784F, 0.9999995091F, 0.9999995384F, - 0.9999995663F, 0.9999995930F, 0.9999996184F, 0.9999996426F, - 0.9999996657F, 0.9999996876F, 0.9999997084F, 0.9999997282F, - 0.9999997469F, 0.9999997647F, 0.9999997815F, 0.9999997973F, - 0.9999998123F, 0.9999998265F, 0.9999998398F, 0.9999998524F, - 0.9999998642F, 0.9999998753F, 0.9999998857F, 0.9999998954F, - 0.9999999045F, 0.9999999130F, 0.9999999209F, 0.9999999282F, - 0.9999999351F, 0.9999999414F, 0.9999999472F, 0.9999999526F, - 0.9999999576F, 0.9999999622F, 0.9999999664F, 0.9999999702F, - 0.9999999737F, 0.9999999769F, 0.9999999798F, 0.9999999824F, - 0.9999999847F, 0.9999999868F, 0.9999999887F, 0.9999999904F, - 0.9999999919F, 0.9999999932F, 0.9999999943F, 0.9999999953F, - 0.9999999961F, 0.9999999969F, 0.9999999975F, 0.9999999980F, - 0.9999999985F, 0.9999999988F, 0.9999999991F, 0.9999999993F, - 0.9999999995F, 0.9999999997F, 0.9999999998F, 0.9999999999F, - 0.9999999999F, 1.0000000000F, 1.0000000000F, 1.0000000000F, - 1.0000000000F, 1.0000000000F, 1.0000000000F, 1.0000000000F, -}; - -static const float *const vwin[8] = { - vwin64, - vwin128, - vwin256, - vwin512, - vwin1024, - vwin2048, - vwin4096, - vwin8192, -}; - -const float *_vorbis_window_get(int n){ - return vwin[n]; -} - -void _vorbis_apply_window(float *d,int *winno,long *blocksizes, - int lW,int W,int nW){ - lW=(W?lW:0); - nW=(W?nW:0); - - { - const float *windowLW=vwin[winno[lW]]; - const float *windowNW=vwin[winno[nW]]; - - long n=blocksizes[W]; - long ln=blocksizes[lW]; - long rn=blocksizes[nW]; - - long leftbegin=n/4-ln/4; - long leftend=leftbegin+ln/2; - - long rightbegin=n/2+n/4-rn/4; - long rightend=rightbegin+rn/2; - - int i,p; - - for(i=0;i - diff --git a/sources/LabSound/third_party/libnyquist/third_party/minimp3/minimp3.h b/sources/LabSound/third_party/libnyquist/third_party/minimp3/minimp3.h deleted file mode 100644 index 796cbc1f..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/minimp3/minimp3.h +++ /dev/null @@ -1,1855 +0,0 @@ -#ifndef MINIMP3_H -#define MINIMP3_H -/* - https://github.com/lieff/minimp3 - To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this software to the public domain worldwide. - This software is distributed without any warranty. - See . -*/ -#include - -#define MINIMP3_MAX_SAMPLES_PER_FRAME (1152*2) - -typedef struct -{ - int frame_bytes, frame_offset, channels, hz, layer, bitrate_kbps; -} mp3dec_frame_info_t; - -typedef struct -{ - float mdct_overlap[2][9*32], qmf_state[15*2*32]; - int reserv, free_format_bytes; - unsigned char header[4], reserv_buf[511]; -} mp3dec_t; - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -void mp3dec_init(mp3dec_t *dec); -#ifndef MINIMP3_FLOAT_OUTPUT -typedef int16_t mp3d_sample_t; -#else /* MINIMP3_FLOAT_OUTPUT */ -typedef float mp3d_sample_t; -void mp3dec_f32_to_s16(const float *in, int16_t *out, int num_samples); -#endif /* MINIMP3_FLOAT_OUTPUT */ -int mp3dec_decode_frame(mp3dec_t *dec, const uint8_t *mp3, int mp3_bytes, mp3d_sample_t *pcm, mp3dec_frame_info_t *info); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* MINIMP3_H */ -#if defined(MINIMP3_IMPLEMENTATION) && !defined(_MINIMP3_IMPLEMENTATION_GUARD) -#define _MINIMP3_IMPLEMENTATION_GUARD - -#include -#include - -#define MAX_FREE_FORMAT_FRAME_SIZE 2304 /* more than ISO spec's */ -#ifndef MAX_FRAME_SYNC_MATCHES -#define MAX_FRAME_SYNC_MATCHES 10 -#endif /* MAX_FRAME_SYNC_MATCHES */ - -#define MAX_L3_FRAME_PAYLOAD_BYTES MAX_FREE_FORMAT_FRAME_SIZE /* MUST be >= 320000/8/32000*1152 = 1440 */ - -#define MAX_BITRESERVOIR_BYTES 511 -#define SHORT_BLOCK_TYPE 2 -#define STOP_BLOCK_TYPE 3 -#define MODE_MONO 3 -#define MODE_JOINT_STEREO 1 -#define HDR_SIZE 4 -#define HDR_IS_MONO(h) (((h[3]) & 0xC0) == 0xC0) -#define HDR_IS_MS_STEREO(h) (((h[3]) & 0xE0) == 0x60) -#define HDR_IS_FREE_FORMAT(h) (((h[2]) & 0xF0) == 0) -#define HDR_IS_CRC(h) (!((h[1]) & 1)) -#define HDR_TEST_PADDING(h) ((h[2]) & 0x2) -#define HDR_TEST_MPEG1(h) ((h[1]) & 0x8) -#define HDR_TEST_NOT_MPEG25(h) ((h[1]) & 0x10) -#define HDR_TEST_I_STEREO(h) ((h[3]) & 0x10) -#define HDR_TEST_MS_STEREO(h) ((h[3]) & 0x20) -#define HDR_GET_STEREO_MODE(h) (((h[3]) >> 6) & 3) -#define HDR_GET_STEREO_MODE_EXT(h) (((h[3]) >> 4) & 3) -#define HDR_GET_LAYER(h) (((h[1]) >> 1) & 3) -#define HDR_GET_BITRATE(h) ((h[2]) >> 4) -#define HDR_GET_SAMPLE_RATE(h) (((h[2]) >> 2) & 3) -#define HDR_GET_MY_SAMPLE_RATE(h) (HDR_GET_SAMPLE_RATE(h) + (((h[1] >> 3) & 1) + ((h[1] >> 4) & 1))*3) -#define HDR_IS_FRAME_576(h) ((h[1] & 14) == 2) -#define HDR_IS_LAYER_1(h) ((h[1] & 6) == 6) - -#define BITS_DEQUANTIZER_OUT -1 -#define MAX_SCF (255 + BITS_DEQUANTIZER_OUT*4 - 210) -#define MAX_SCFI ((MAX_SCF + 3) & ~3) - -#define MINIMP3_MIN(a, b) ((a) > (b) ? (b) : (a)) -#define MINIMP3_MAX(a, b) ((a) < (b) ? (b) : (a)) - -#if !defined(MINIMP3_NO_SIMD) - -#if !defined(MINIMP3_ONLY_SIMD) && (defined(_M_X64) || defined(__x86_64__) || defined(__aarch64__) || defined(_M_ARM64)) -/* x64 always have SSE2, arm64 always have neon, no need for generic code */ -#define MINIMP3_ONLY_SIMD -#endif /* SIMD checks... */ - -#if (defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))) || ((defined(__i386__) || defined(__x86_64__)) && defined(__SSE2__)) -#if defined(_MSC_VER) -#include -#endif /* defined(_MSC_VER) */ -#include -#define HAVE_SSE 1 -#define HAVE_SIMD 1 -#define VSTORE _mm_storeu_ps -#define VLD _mm_loadu_ps -#define VSET _mm_set1_ps -#define VADD _mm_add_ps -#define VSUB _mm_sub_ps -#define VMUL _mm_mul_ps -#define VMAC(a, x, y) _mm_add_ps(a, _mm_mul_ps(x, y)) -#define VMSB(a, x, y) _mm_sub_ps(a, _mm_mul_ps(x, y)) -#define VMUL_S(x, s) _mm_mul_ps(x, _mm_set1_ps(s)) -#define VREV(x) _mm_shuffle_ps(x, x, _MM_SHUFFLE(0, 1, 2, 3)) -typedef __m128 f4; -#if defined(_MSC_VER) || defined(MINIMP3_ONLY_SIMD) -#define minimp3_cpuid __cpuid -#else /* defined(_MSC_VER) || defined(MINIMP3_ONLY_SIMD) */ -static __inline__ __attribute__((always_inline)) void minimp3_cpuid(int CPUInfo[], const int InfoType) -{ -#if defined(__PIC__) - __asm__ __volatile__( -#if defined(__x86_64__) - "push %%rbx\n" - "cpuid\n" - "xchgl %%ebx, %1\n" - "pop %%rbx\n" -#else /* defined(__x86_64__) */ - "xchgl %%ebx, %1\n" - "cpuid\n" - "xchgl %%ebx, %1\n" -#endif /* defined(__x86_64__) */ - : "=a" (CPUInfo[0]), "=r" (CPUInfo[1]), "=c" (CPUInfo[2]), "=d" (CPUInfo[3]) - : "a" (InfoType)); -#else /* defined(__PIC__) */ - __asm__ __volatile__( - "cpuid" - : "=a" (CPUInfo[0]), "=b" (CPUInfo[1]), "=c" (CPUInfo[2]), "=d" (CPUInfo[3]) - : "a" (InfoType)); -#endif /* defined(__PIC__)*/ -} -#endif /* defined(_MSC_VER) || defined(MINIMP3_ONLY_SIMD) */ -static int have_simd(void) -{ -#ifdef MINIMP3_ONLY_SIMD - return 1; -#else /* MINIMP3_ONLY_SIMD */ - static int g_have_simd; - int CPUInfo[4]; -#ifdef MINIMP3_TEST - static int g_counter; - if (g_counter++ > 100) - return 0; -#endif /* MINIMP3_TEST */ - if (g_have_simd) - goto end; - minimp3_cpuid(CPUInfo, 0); - g_have_simd = 1; - if (CPUInfo[0] > 0) - { - minimp3_cpuid(CPUInfo, 1); - g_have_simd = (CPUInfo[3] & (1 << 26)) + 1; /* SSE2 */ - } -end: - return g_have_simd - 1; -#endif /* MINIMP3_ONLY_SIMD */ -} -#elif defined(__ARM_NEON) || defined(__aarch64__) || defined(_M_ARM64) -#include -#define HAVE_SSE 0 -#define HAVE_SIMD 1 -#define VSTORE vst1q_f32 -#define VLD vld1q_f32 -#define VSET vmovq_n_f32 -#define VADD vaddq_f32 -#define VSUB vsubq_f32 -#define VMUL vmulq_f32 -#define VMAC(a, x, y) vmlaq_f32(a, x, y) -#define VMSB(a, x, y) vmlsq_f32(a, x, y) -#define VMUL_S(x, s) vmulq_f32(x, vmovq_n_f32(s)) -#define VREV(x) vcombine_f32(vget_high_f32(vrev64q_f32(x)), vget_low_f32(vrev64q_f32(x))) -typedef float32x4_t f4; -static int have_simd() -{ /* TODO: detect neon for !MINIMP3_ONLY_SIMD */ - return 1; -} -#else /* SIMD checks... */ -#define HAVE_SSE 0 -#define HAVE_SIMD 0 -#ifdef MINIMP3_ONLY_SIMD -#error MINIMP3_ONLY_SIMD used, but SSE/NEON not enabled -#endif /* MINIMP3_ONLY_SIMD */ -#endif /* SIMD checks... */ -#else /* !defined(MINIMP3_NO_SIMD) */ -#define HAVE_SIMD 0 -#endif /* !defined(MINIMP3_NO_SIMD) */ - -#if defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__aarch64__) && !defined(_M_ARM64) -#define HAVE_ARMV6 1 -static __inline__ __attribute__((always_inline)) int32_t minimp3_clip_int16_arm(int32_t a) -{ - int32_t x = 0; - __asm__ ("ssat %0, #16, %1" : "=r"(x) : "r"(a)); - return x; -} -#else -#define HAVE_ARMV6 0 -#endif - -typedef struct -{ - const uint8_t *buf; - int pos, limit; -} bs_t; - -typedef struct -{ - float scf[3*64]; - uint8_t total_bands, stereo_bands, bitalloc[64], scfcod[64]; -} L12_scale_info; - -typedef struct -{ - uint8_t tab_offset, code_tab_width, band_count; -} L12_subband_alloc_t; - -typedef struct -{ - const uint8_t *sfbtab; - uint16_t part_23_length, big_values, scalefac_compress; - uint8_t global_gain, block_type, mixed_block_flag, n_long_sfb, n_short_sfb; - uint8_t table_select[3], region_count[3], subblock_gain[3]; - uint8_t preflag, scalefac_scale, count1_table, scfsi; -} L3_gr_info_t; - -typedef struct -{ - bs_t bs; - uint8_t maindata[MAX_BITRESERVOIR_BYTES + MAX_L3_FRAME_PAYLOAD_BYTES]; - L3_gr_info_t gr_info[4]; - float grbuf[2][576], scf[40], syn[18 + 15][2*32]; - uint8_t ist_pos[2][39]; -} mp3dec_scratch_t; - -static void bs_init(bs_t *bs, const uint8_t *data, int bytes) -{ - bs->buf = data; - bs->pos = 0; - bs->limit = bytes*8; -} - -static uint32_t get_bits(bs_t *bs, int n) -{ - uint32_t next, cache = 0, s = bs->pos & 7; - int shl = n + s; - const uint8_t *p = bs->buf + (bs->pos >> 3); - if ((bs->pos += n) > bs->limit) - return 0; - next = *p++ & (255 >> s); - while ((shl -= 8) > 0) - { - cache |= next << shl; - next = *p++; - } - return cache | (next >> -shl); -} - -static int hdr_valid(const uint8_t *h) -{ - return h[0] == 0xff && - ((h[1] & 0xF0) == 0xf0 || (h[1] & 0xFE) == 0xe2) && - (HDR_GET_LAYER(h) != 0) && - (HDR_GET_BITRATE(h) != 15) && - (HDR_GET_SAMPLE_RATE(h) != 3); -} - -static int hdr_compare(const uint8_t *h1, const uint8_t *h2) -{ - return hdr_valid(h2) && - ((h1[1] ^ h2[1]) & 0xFE) == 0 && - ((h1[2] ^ h2[2]) & 0x0C) == 0 && - !(HDR_IS_FREE_FORMAT(h1) ^ HDR_IS_FREE_FORMAT(h2)); -} - -static unsigned hdr_bitrate_kbps(const uint8_t *h) -{ - static const uint8_t halfrate[2][3][15] = { - { { 0,4,8,12,16,20,24,28,32,40,48,56,64,72,80 }, { 0,4,8,12,16,20,24,28,32,40,48,56,64,72,80 }, { 0,16,24,28,32,40,48,56,64,72,80,88,96,112,128 } }, - { { 0,16,20,24,28,32,40,48,56,64,80,96,112,128,160 }, { 0,16,24,28,32,40,48,56,64,80,96,112,128,160,192 }, { 0,16,32,48,64,80,96,112,128,144,160,176,192,208,224 } }, - }; - return 2*halfrate[!!HDR_TEST_MPEG1(h)][HDR_GET_LAYER(h) - 1][HDR_GET_BITRATE(h)]; -} - -static unsigned hdr_sample_rate_hz(const uint8_t *h) -{ - static const unsigned g_hz[3] = { 44100, 48000, 32000 }; - return g_hz[HDR_GET_SAMPLE_RATE(h)] >> (int)!HDR_TEST_MPEG1(h) >> (int)!HDR_TEST_NOT_MPEG25(h); -} - -static unsigned hdr_frame_samples(const uint8_t *h) -{ - return HDR_IS_LAYER_1(h) ? 384 : (1152 >> (int)HDR_IS_FRAME_576(h)); -} - -static int hdr_frame_bytes(const uint8_t *h, int free_format_size) -{ - int frame_bytes = hdr_frame_samples(h)*hdr_bitrate_kbps(h)*125/hdr_sample_rate_hz(h); - if (HDR_IS_LAYER_1(h)) - { - frame_bytes &= ~3; /* slot align */ - } - return frame_bytes ? frame_bytes : free_format_size; -} - -static int hdr_padding(const uint8_t *h) -{ - return HDR_TEST_PADDING(h) ? (HDR_IS_LAYER_1(h) ? 4 : 1) : 0; -} - -#ifndef MINIMP3_ONLY_MP3 -static const L12_subband_alloc_t *L12_subband_alloc_table(const uint8_t *hdr, L12_scale_info *sci) -{ - const L12_subband_alloc_t *alloc; - int mode = HDR_GET_STEREO_MODE(hdr); - int nbands, stereo_bands = (mode == MODE_MONO) ? 0 : (mode == MODE_JOINT_STEREO) ? (HDR_GET_STEREO_MODE_EXT(hdr) << 2) + 4 : 32; - - if (HDR_IS_LAYER_1(hdr)) - { - static const L12_subband_alloc_t g_alloc_L1[] = { { 76, 4, 32 } }; - alloc = g_alloc_L1; - nbands = 32; - } else if (!HDR_TEST_MPEG1(hdr)) - { - static const L12_subband_alloc_t g_alloc_L2M2[] = { { 60, 4, 4 }, { 44, 3, 7 }, { 44, 2, 19 } }; - alloc = g_alloc_L2M2; - nbands = 30; - } else - { - static const L12_subband_alloc_t g_alloc_L2M1[] = { { 0, 4, 3 }, { 16, 4, 8 }, { 32, 3, 12 }, { 40, 2, 7 } }; - int sample_rate_idx = HDR_GET_SAMPLE_RATE(hdr); - unsigned kbps = hdr_bitrate_kbps(hdr) >> (int)(mode != MODE_MONO); - if (!kbps) /* free-format */ - { - kbps = 192; - } - - alloc = g_alloc_L2M1; - nbands = 27; - if (kbps < 56) - { - static const L12_subband_alloc_t g_alloc_L2M1_lowrate[] = { { 44, 4, 2 }, { 44, 3, 10 } }; - alloc = g_alloc_L2M1_lowrate; - nbands = sample_rate_idx == 2 ? 12 : 8; - } else if (kbps >= 96 && sample_rate_idx != 1) - { - nbands = 30; - } - } - - sci->total_bands = (uint8_t)nbands; - sci->stereo_bands = (uint8_t)MINIMP3_MIN(stereo_bands, nbands); - - return alloc; -} - -static void L12_read_scalefactors(bs_t *bs, uint8_t *pba, uint8_t *scfcod, int bands, float *scf) -{ - static const float g_deq_L12[18*3] = { -#define DQ(x) 9.53674316e-07f/x, 7.56931807e-07f/x, 6.00777173e-07f/x - DQ(3),DQ(7),DQ(15),DQ(31),DQ(63),DQ(127),DQ(255),DQ(511),DQ(1023),DQ(2047),DQ(4095),DQ(8191),DQ(16383),DQ(32767),DQ(65535),DQ(3),DQ(5),DQ(9) - }; - int i, m; - for (i = 0; i < bands; i++) - { - float s = 0; - int ba = *pba++; - int mask = ba ? 4 + ((19 >> scfcod[i]) & 3) : 0; - for (m = 4; m; m >>= 1) - { - if (mask & m) - { - int b = get_bits(bs, 6); - s = g_deq_L12[ba*3 - 6 + b % 3]*(1 << 21 >> b/3); - } - *scf++ = s; - } - } -} - -static void L12_read_scale_info(const uint8_t *hdr, bs_t *bs, L12_scale_info *sci) -{ - static const uint8_t g_bitalloc_code_tab[] = { - 0,17, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16, - 0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,16, - 0,17,18, 3,19,4,5,16, - 0,17,18,16, - 0,17,18,19, 4,5,6, 7,8, 9,10,11,12,13,14,15, - 0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,14, - 0, 2, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16 - }; - const L12_subband_alloc_t *subband_alloc = L12_subband_alloc_table(hdr, sci); - - int i, k = 0, ba_bits = 0; - const uint8_t *ba_code_tab = g_bitalloc_code_tab; - - for (i = 0; i < sci->total_bands; i++) - { - uint8_t ba; - if (i == k) - { - k += subband_alloc->band_count; - ba_bits = subband_alloc->code_tab_width; - ba_code_tab = g_bitalloc_code_tab + subband_alloc->tab_offset; - subband_alloc++; - } - ba = ba_code_tab[get_bits(bs, ba_bits)]; - sci->bitalloc[2*i] = ba; - if (i < sci->stereo_bands) - { - ba = ba_code_tab[get_bits(bs, ba_bits)]; - } - sci->bitalloc[2*i + 1] = sci->stereo_bands ? ba : 0; - } - - for (i = 0; i < 2*sci->total_bands; i++) - { - sci->scfcod[i] = sci->bitalloc[i] ? HDR_IS_LAYER_1(hdr) ? 2 : get_bits(bs, 2) : 6; - } - - L12_read_scalefactors(bs, sci->bitalloc, sci->scfcod, sci->total_bands*2, sci->scf); - - for (i = sci->stereo_bands; i < sci->total_bands; i++) - { - sci->bitalloc[2*i + 1] = 0; - } -} - -static int L12_dequantize_granule(float *grbuf, bs_t *bs, L12_scale_info *sci, int group_size) -{ - int i, j, k, choff = 576; - for (j = 0; j < 4; j++) - { - float *dst = grbuf + group_size*j; - for (i = 0; i < 2*sci->total_bands; i++) - { - int ba = sci->bitalloc[i]; - if (ba != 0) - { - if (ba < 17) - { - int half = (1 << (ba - 1)) - 1; - for (k = 0; k < group_size; k++) - { - dst[k] = (float)((int)get_bits(bs, ba) - half); - } - } else - { - unsigned mod = (2 << (ba - 17)) + 1; /* 3, 5, 9 */ - unsigned code = get_bits(bs, mod + 2 - (mod >> 3)); /* 5, 7, 10 */ - for (k = 0; k < group_size; k++, code /= mod) - { - dst[k] = (float)((int)(code % mod - mod/2)); - } - } - } - dst += choff; - choff = 18 - choff; - } - } - return group_size*4; -} - -static void L12_apply_scf_384(L12_scale_info *sci, const float *scf, float *dst) -{ - int i, k; - memcpy(dst + 576 + sci->stereo_bands*18, dst + sci->stereo_bands*18, (sci->total_bands - sci->stereo_bands)*18*sizeof(float)); - for (i = 0; i < sci->total_bands; i++, dst += 18, scf += 6) - { - for (k = 0; k < 12; k++) - { - dst[k + 0] *= scf[0]; - dst[k + 576] *= scf[3]; - } - } -} -#endif /* MINIMP3_ONLY_MP3 */ - -static int L3_read_side_info(bs_t *bs, L3_gr_info_t *gr, const uint8_t *hdr) -{ - static const uint8_t g_scf_long[8][23] = { - { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 }, - { 12,12,12,12,12,12,16,20,24,28,32,40,48,56,64,76,90,2,2,2,2,2,0 }, - { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 }, - { 6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,54,62,70,76,36,0 }, - { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 }, - { 4,4,4,4,4,4,6,6,8,8,10,12,16,20,24,28,34,42,50,54,76,158,0 }, - { 4,4,4,4,4,4,6,6,6,8,10,12,16,18,22,28,34,40,46,54,54,192,0 }, - { 4,4,4,4,4,4,6,6,8,10,12,16,20,24,30,38,46,56,68,84,102,26,0 } - }; - static const uint8_t g_scf_short[8][40] = { - { 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 }, - { 8,8,8,8,8,8,8,8,8,12,12,12,16,16,16,20,20,20,24,24,24,28,28,28,36,36,36,2,2,2,2,2,2,2,2,2,26,26,26,0 }, - { 4,4,4,4,4,4,4,4,4,6,6,6,6,6,6,8,8,8,10,10,10,14,14,14,18,18,18,26,26,26,32,32,32,42,42,42,18,18,18,0 }, - { 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,32,32,32,44,44,44,12,12,12,0 }, - { 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 }, - { 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,22,22,22,30,30,30,56,56,56,0 }, - { 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,6,6,6,10,10,10,12,12,12,14,14,14,16,16,16,20,20,20,26,26,26,66,66,66,0 }, - { 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,12,12,12,16,16,16,20,20,20,26,26,26,34,34,34,42,42,42,12,12,12,0 } - }; - static const uint8_t g_scf_mixed[8][40] = { - { 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 }, - { 12,12,12,4,4,4,8,8,8,12,12,12,16,16,16,20,20,20,24,24,24,28,28,28,36,36,36,2,2,2,2,2,2,2,2,2,26,26,26,0 }, - { 6,6,6,6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,14,14,14,18,18,18,26,26,26,32,32,32,42,42,42,18,18,18,0 }, - { 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,32,32,32,44,44,44,12,12,12,0 }, - { 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 }, - { 4,4,4,4,4,4,6,6,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,22,22,22,30,30,30,56,56,56,0 }, - { 4,4,4,4,4,4,6,6,4,4,4,6,6,6,6,6,6,10,10,10,12,12,12,14,14,14,16,16,16,20,20,20,26,26,26,66,66,66,0 }, - { 4,4,4,4,4,4,6,6,4,4,4,6,6,6,8,8,8,12,12,12,16,16,16,20,20,20,26,26,26,34,34,34,42,42,42,12,12,12,0 } - }; - - unsigned tables, scfsi = 0; - int main_data_begin, part_23_sum = 0; - int sr_idx = HDR_GET_MY_SAMPLE_RATE(hdr); sr_idx -= (sr_idx != 0); - int gr_count = HDR_IS_MONO(hdr) ? 1 : 2; - - if (HDR_TEST_MPEG1(hdr)) - { - gr_count *= 2; - main_data_begin = get_bits(bs, 9); - scfsi = get_bits(bs, 7 + gr_count); - } else - { - main_data_begin = get_bits(bs, 8 + gr_count) >> gr_count; - } - - do - { - if (HDR_IS_MONO(hdr)) - { - scfsi <<= 4; - } - gr->part_23_length = (uint16_t)get_bits(bs, 12); - part_23_sum += gr->part_23_length; - gr->big_values = (uint16_t)get_bits(bs, 9); - if (gr->big_values > 288) - { - return -1; - } - gr->global_gain = (uint8_t)get_bits(bs, 8); - gr->scalefac_compress = (uint16_t)get_bits(bs, HDR_TEST_MPEG1(hdr) ? 4 : 9); - gr->sfbtab = g_scf_long[sr_idx]; - gr->n_long_sfb = 22; - gr->n_short_sfb = 0; - if (get_bits(bs, 1)) - { - gr->block_type = (uint8_t)get_bits(bs, 2); - if (!gr->block_type) - { - return -1; - } - gr->mixed_block_flag = (uint8_t)get_bits(bs, 1); - gr->region_count[0] = 7; - gr->region_count[1] = 255; - if (gr->block_type == SHORT_BLOCK_TYPE) - { - scfsi &= 0x0F0F; - if (!gr->mixed_block_flag) - { - gr->region_count[0] = 8; - gr->sfbtab = g_scf_short[sr_idx]; - gr->n_long_sfb = 0; - gr->n_short_sfb = 39; - } else - { - gr->sfbtab = g_scf_mixed[sr_idx]; - gr->n_long_sfb = HDR_TEST_MPEG1(hdr) ? 8 : 6; - gr->n_short_sfb = 30; - } - } - tables = get_bits(bs, 10); - tables <<= 5; - gr->subblock_gain[0] = (uint8_t)get_bits(bs, 3); - gr->subblock_gain[1] = (uint8_t)get_bits(bs, 3); - gr->subblock_gain[2] = (uint8_t)get_bits(bs, 3); - } else - { - gr->block_type = 0; - gr->mixed_block_flag = 0; - tables = get_bits(bs, 15); - gr->region_count[0] = (uint8_t)get_bits(bs, 4); - gr->region_count[1] = (uint8_t)get_bits(bs, 3); - gr->region_count[2] = 255; - } - gr->table_select[0] = (uint8_t)(tables >> 10); - gr->table_select[1] = (uint8_t)((tables >> 5) & 31); - gr->table_select[2] = (uint8_t)((tables) & 31); - gr->preflag = HDR_TEST_MPEG1(hdr) ? get_bits(bs, 1) : (gr->scalefac_compress >= 500); - gr->scalefac_scale = (uint8_t)get_bits(bs, 1); - gr->count1_table = (uint8_t)get_bits(bs, 1); - gr->scfsi = (uint8_t)((scfsi >> 12) & 15); - scfsi <<= 4; - gr++; - } while(--gr_count); - - if (part_23_sum + bs->pos > bs->limit + main_data_begin*8) - { - return -1; - } - - return main_data_begin; -} - -static void L3_read_scalefactors(uint8_t *scf, uint8_t *ist_pos, const uint8_t *scf_size, const uint8_t *scf_count, bs_t *bitbuf, int scfsi) -{ - int i, k; - for (i = 0; i < 4 && scf_count[i]; i++, scfsi *= 2) - { - int cnt = scf_count[i]; - if (scfsi & 8) - { - memcpy(scf, ist_pos, cnt); - } else - { - int bits = scf_size[i]; - if (!bits) - { - memset(scf, 0, cnt); - memset(ist_pos, 0, cnt); - } else - { - int max_scf = (scfsi < 0) ? (1 << bits) - 1 : -1; - for (k = 0; k < cnt; k++) - { - int s = get_bits(bitbuf, bits); - ist_pos[k] = (s == max_scf ? -1 : s); - scf[k] = s; - } - } - } - ist_pos += cnt; - scf += cnt; - } - scf[0] = scf[1] = scf[2] = 0; -} - -static float L3_ldexp_q2(float y, int exp_q2) -{ - static const float g_expfrac[4] = { 9.31322575e-10f,7.83145814e-10f,6.58544508e-10f,5.53767716e-10f }; - int e; - do - { - e = MINIMP3_MIN(30*4, exp_q2); - y *= g_expfrac[e & 3]*(1 << 30 >> (e >> 2)); - } while ((exp_q2 -= e) > 0); - return y; -} - -static void L3_decode_scalefactors(const uint8_t *hdr, uint8_t *ist_pos, bs_t *bs, const L3_gr_info_t *gr, float *scf, int ch) -{ - static const uint8_t g_scf_partitions[3][28] = { - { 6,5,5, 5,6,5,5,5,6,5, 7,3,11,10,0,0, 7, 7, 7,0, 6, 6,6,3, 8, 8,5,0 }, - { 8,9,6,12,6,9,9,9,6,9,12,6,15,18,0,0, 6,15,12,0, 6,12,9,6, 6,18,9,0 }, - { 9,9,6,12,9,9,9,9,9,9,12,6,18,18,0,0,12,12,12,0,12, 9,9,6,15,12,9,0 } - }; - const uint8_t *scf_partition = g_scf_partitions[!!gr->n_short_sfb + !gr->n_long_sfb]; - uint8_t scf_size[4], iscf[40]; - int i, scf_shift = gr->scalefac_scale + 1, gain_exp, scfsi = gr->scfsi; - float gain; - - if (HDR_TEST_MPEG1(hdr)) - { - static const uint8_t g_scfc_decode[16] = { 0,1,2,3, 12,5,6,7, 9,10,11,13, 14,15,18,19 }; - int part = g_scfc_decode[gr->scalefac_compress]; - scf_size[1] = scf_size[0] = (uint8_t)(part >> 2); - scf_size[3] = scf_size[2] = (uint8_t)(part & 3); - } else - { - static const uint8_t g_mod[6*4] = { 5,5,4,4,5,5,4,1,4,3,1,1,5,6,6,1,4,4,4,1,4,3,1,1 }; - int k, modprod, sfc, ist = HDR_TEST_I_STEREO(hdr) && ch; - sfc = gr->scalefac_compress >> ist; - for (k = ist*3*4; sfc >= 0; sfc -= modprod, k += 4) - { - for (modprod = 1, i = 3; i >= 0; i--) - { - scf_size[i] = (uint8_t)(sfc / modprod % g_mod[k + i]); - modprod *= g_mod[k + i]; - } - } - scf_partition += k; - scfsi = -16; - } - L3_read_scalefactors(iscf, ist_pos, scf_size, scf_partition, bs, scfsi); - - if (gr->n_short_sfb) - { - int sh = 3 - scf_shift; - for (i = 0; i < gr->n_short_sfb; i += 3) - { - iscf[gr->n_long_sfb + i + 0] += gr->subblock_gain[0] << sh; - iscf[gr->n_long_sfb + i + 1] += gr->subblock_gain[1] << sh; - iscf[gr->n_long_sfb + i + 2] += gr->subblock_gain[2] << sh; - } - } else if (gr->preflag) - { - static const uint8_t g_preamp[10] = { 1,1,1,1,2,2,3,3,3,2 }; - for (i = 0; i < 10; i++) - { - iscf[11 + i] += g_preamp[i]; - } - } - - gain_exp = gr->global_gain + BITS_DEQUANTIZER_OUT*4 - 210 - (HDR_IS_MS_STEREO(hdr) ? 2 : 0); - gain = L3_ldexp_q2(1 << (MAX_SCFI/4), MAX_SCFI - gain_exp); - for (i = 0; i < (int)(gr->n_long_sfb + gr->n_short_sfb); i++) - { - scf[i] = L3_ldexp_q2(gain, iscf[i] << scf_shift); - } -} - -static const float g_pow43[129 + 16] = { - 0,-1,-2.519842f,-4.326749f,-6.349604f,-8.549880f,-10.902724f,-13.390518f,-16.000000f,-18.720754f,-21.544347f,-24.463781f,-27.473142f,-30.567351f,-33.741992f,-36.993181f, - 0,1,2.519842f,4.326749f,6.349604f,8.549880f,10.902724f,13.390518f,16.000000f,18.720754f,21.544347f,24.463781f,27.473142f,30.567351f,33.741992f,36.993181f,40.317474f,43.711787f,47.173345f,50.699631f,54.288352f,57.937408f,61.644865f,65.408941f,69.227979f,73.100443f,77.024898f,81.000000f,85.024491f,89.097188f,93.216975f,97.382800f,101.593667f,105.848633f,110.146801f,114.487321f,118.869381f,123.292209f,127.755065f,132.257246f,136.798076f,141.376907f,145.993119f,150.646117f,155.335327f,160.060199f,164.820202f,169.614826f,174.443577f,179.305980f,184.201575f,189.129918f,194.090580f,199.083145f,204.107210f,209.162385f,214.248292f,219.364564f,224.510845f,229.686789f,234.892058f,240.126328f,245.389280f,250.680604f,256.000000f,261.347174f,266.721841f,272.123723f,277.552547f,283.008049f,288.489971f,293.998060f,299.532071f,305.091761f,310.676898f,316.287249f,321.922592f,327.582707f,333.267377f,338.976394f,344.709550f,350.466646f,356.247482f,362.051866f,367.879608f,373.730522f,379.604427f,385.501143f,391.420496f,397.362314f,403.326427f,409.312672f,415.320884f,421.350905f,427.402579f,433.475750f,439.570269f,445.685987f,451.822757f,457.980436f,464.158883f,470.357960f,476.577530f,482.817459f,489.077615f,495.357868f,501.658090f,507.978156f,514.317941f,520.677324f,527.056184f,533.454404f,539.871867f,546.308458f,552.764065f,559.238575f,565.731879f,572.243870f,578.774440f,585.323483f,591.890898f,598.476581f,605.080431f,611.702349f,618.342238f,625.000000f,631.675540f,638.368763f,645.079578f -}; - -static float L3_pow_43(int x) -{ - float frac; - int sign, mult = 256; - - if (x < 129) - { - return g_pow43[16 + x]; - } - - if (x < 1024) - { - mult = 16; - x <<= 3; - } - - sign = 2*x & 64; - frac = (float)((x & 63) - sign) / ((x & ~63) + sign); - return g_pow43[16 + ((x + sign) >> 6)]*(1.f + frac*((4.f/3) + frac*(2.f/9)))*mult; -} - -static void L3_huffman(float *dst, bs_t *bs, const L3_gr_info_t *gr_info, const float *scf, int layer3gr_limit) -{ - static const int16_t tabs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 785,785,785,785,784,784,784,784,513,513,513,513,513,513,513,513,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, - -255,1313,1298,1282,785,785,785,785,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,290,288, - -255,1313,1298,1282,769,769,769,769,529,529,529,529,529,529,529,529,528,528,528,528,528,528,528,528,512,512,512,512,512,512,512,512,290,288, - -253,-318,-351,-367,785,785,785,785,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,819,818,547,547,275,275,275,275,561,560,515,546,289,274,288,258, - -254,-287,1329,1299,1314,1312,1057,1057,1042,1042,1026,1026,784,784,784,784,529,529,529,529,529,529,529,529,769,769,769,769,768,768,768,768,563,560,306,306,291,259, - -252,-413,-477,-542,1298,-575,1041,1041,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-383,-399,1107,1092,1106,1061,849,849,789,789,1104,1091,773,773,1076,1075,341,340,325,309,834,804,577,577,532,532,516,516,832,818,803,816,561,561,531,531,515,546,289,289,288,258, - -252,-429,-493,-559,1057,1057,1042,1042,529,529,529,529,529,529,529,529,784,784,784,784,769,769,769,769,512,512,512,512,512,512,512,512,-382,1077,-415,1106,1061,1104,849,849,789,789,1091,1076,1029,1075,834,834,597,581,340,340,339,324,804,833,532,532,832,772,818,803,817,787,816,771,290,290,290,290,288,258, - -253,-349,-414,-447,-463,1329,1299,-479,1314,1312,1057,1057,1042,1042,1026,1026,785,785,785,785,784,784,784,784,769,769,769,769,768,768,768,768,-319,851,821,-335,836,850,805,849,341,340,325,336,533,533,579,579,564,564,773,832,578,548,563,516,321,276,306,291,304,259, - -251,-572,-733,-830,-863,-879,1041,1041,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-511,-527,-543,1396,1351,1381,1366,1395,1335,1380,-559,1334,1138,1138,1063,1063,1350,1392,1031,1031,1062,1062,1364,1363,1120,1120,1333,1348,881,881,881,881,375,374,359,373,343,358,341,325,791,791,1123,1122,-703,1105,1045,-719,865,865,790,790,774,774,1104,1029,338,293,323,308,-799,-815,833,788,772,818,803,816,322,292,307,320,561,531,515,546,289,274,288,258, - -251,-525,-605,-685,-765,-831,-846,1298,1057,1057,1312,1282,785,785,785,785,784,784,784,784,769,769,769,769,512,512,512,512,512,512,512,512,1399,1398,1383,1367,1382,1396,1351,-511,1381,1366,1139,1139,1079,1079,1124,1124,1364,1349,1363,1333,882,882,882,882,807,807,807,807,1094,1094,1136,1136,373,341,535,535,881,775,867,822,774,-591,324,338,-671,849,550,550,866,864,609,609,293,336,534,534,789,835,773,-751,834,804,308,307,833,788,832,772,562,562,547,547,305,275,560,515,290,290, - -252,-397,-477,-557,-622,-653,-719,-735,-750,1329,1299,1314,1057,1057,1042,1042,1312,1282,1024,1024,785,785,785,785,784,784,784,784,769,769,769,769,-383,1127,1141,1111,1126,1140,1095,1110,869,869,883,883,1079,1109,882,882,375,374,807,868,838,881,791,-463,867,822,368,263,852,837,836,-543,610,610,550,550,352,336,534,534,865,774,851,821,850,805,593,533,579,564,773,832,578,578,548,548,577,577,307,276,306,291,516,560,259,259, - -250,-2107,-2507,-2764,-2909,-2974,-3007,-3023,1041,1041,1040,1040,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-767,-1052,-1213,-1277,-1358,-1405,-1469,-1535,-1550,-1582,-1614,-1647,-1662,-1694,-1726,-1759,-1774,-1807,-1822,-1854,-1886,1565,-1919,-1935,-1951,-1967,1731,1730,1580,1717,-1983,1729,1564,-1999,1548,-2015,-2031,1715,1595,-2047,1714,-2063,1610,-2079,1609,-2095,1323,1323,1457,1457,1307,1307,1712,1547,1641,1700,1699,1594,1685,1625,1442,1442,1322,1322,-780,-973,-910,1279,1278,1277,1262,1276,1261,1275,1215,1260,1229,-959,974,974,989,989,-943,735,478,478,495,463,506,414,-1039,1003,958,1017,927,942,987,957,431,476,1272,1167,1228,-1183,1256,-1199,895,895,941,941,1242,1227,1212,1135,1014,1014,490,489,503,487,910,1013,985,925,863,894,970,955,1012,847,-1343,831,755,755,984,909,428,366,754,559,-1391,752,486,457,924,997,698,698,983,893,740,740,908,877,739,739,667,667,953,938,497,287,271,271,683,606,590,712,726,574,302,302,738,736,481,286,526,725,605,711,636,724,696,651,589,681,666,710,364,467,573,695,466,466,301,465,379,379,709,604,665,679,316,316,634,633,436,436,464,269,424,394,452,332,438,363,347,408,393,448,331,422,362,407,392,421,346,406,391,376,375,359,1441,1306,-2367,1290,-2383,1337,-2399,-2415,1426,1321,-2431,1411,1336,-2447,-2463,-2479,1169,1169,1049,1049,1424,1289,1412,1352,1319,-2495,1154,1154,1064,1064,1153,1153,416,390,360,404,403,389,344,374,373,343,358,372,327,357,342,311,356,326,1395,1394,1137,1137,1047,1047,1365,1392,1287,1379,1334,1364,1349,1378,1318,1363,792,792,792,792,1152,1152,1032,1032,1121,1121,1046,1046,1120,1120,1030,1030,-2895,1106,1061,1104,849,849,789,789,1091,1076,1029,1090,1060,1075,833,833,309,324,532,532,832,772,818,803,561,561,531,560,515,546,289,274,288,258, - -250,-1179,-1579,-1836,-1996,-2124,-2253,-2333,-2413,-2477,-2542,-2574,-2607,-2622,-2655,1314,1313,1298,1312,1282,785,785,785,785,1040,1040,1025,1025,768,768,768,768,-766,-798,-830,-862,-895,-911,-927,-943,-959,-975,-991,-1007,-1023,-1039,-1055,-1070,1724,1647,-1103,-1119,1631,1767,1662,1738,1708,1723,-1135,1780,1615,1779,1599,1677,1646,1778,1583,-1151,1777,1567,1737,1692,1765,1722,1707,1630,1751,1661,1764,1614,1736,1676,1763,1750,1645,1598,1721,1691,1762,1706,1582,1761,1566,-1167,1749,1629,767,766,751,765,494,494,735,764,719,749,734,763,447,447,748,718,477,506,431,491,446,476,461,505,415,430,475,445,504,399,460,489,414,503,383,474,429,459,502,502,746,752,488,398,501,473,413,472,486,271,480,270,-1439,-1455,1357,-1471,-1487,-1503,1341,1325,-1519,1489,1463,1403,1309,-1535,1372,1448,1418,1476,1356,1462,1387,-1551,1475,1340,1447,1402,1386,-1567,1068,1068,1474,1461,455,380,468,440,395,425,410,454,364,467,466,464,453,269,409,448,268,432,1371,1473,1432,1417,1308,1460,1355,1446,1459,1431,1083,1083,1401,1416,1458,1445,1067,1067,1370,1457,1051,1051,1291,1430,1385,1444,1354,1415,1400,1443,1082,1082,1173,1113,1186,1066,1185,1050,-1967,1158,1128,1172,1097,1171,1081,-1983,1157,1112,416,266,375,400,1170,1142,1127,1065,793,793,1169,1033,1156,1096,1141,1111,1155,1080,1126,1140,898,898,808,808,897,897,792,792,1095,1152,1032,1125,1110,1139,1079,1124,882,807,838,881,853,791,-2319,867,368,263,822,852,837,866,806,865,-2399,851,352,262,534,534,821,836,594,594,549,549,593,593,533,533,848,773,579,579,564,578,548,563,276,276,577,576,306,291,516,560,305,305,275,259, - -251,-892,-2058,-2620,-2828,-2957,-3023,-3039,1041,1041,1040,1040,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-511,-527,-543,-559,1530,-575,-591,1528,1527,1407,1526,1391,1023,1023,1023,1023,1525,1375,1268,1268,1103,1103,1087,1087,1039,1039,1523,-604,815,815,815,815,510,495,509,479,508,463,507,447,431,505,415,399,-734,-782,1262,-815,1259,1244,-831,1258,1228,-847,-863,1196,-879,1253,987,987,748,-767,493,493,462,477,414,414,686,669,478,446,461,445,474,429,487,458,412,471,1266,1264,1009,1009,799,799,-1019,-1276,-1452,-1581,-1677,-1757,-1821,-1886,-1933,-1997,1257,1257,1483,1468,1512,1422,1497,1406,1467,1496,1421,1510,1134,1134,1225,1225,1466,1451,1374,1405,1252,1252,1358,1480,1164,1164,1251,1251,1238,1238,1389,1465,-1407,1054,1101,-1423,1207,-1439,830,830,1248,1038,1237,1117,1223,1148,1236,1208,411,426,395,410,379,269,1193,1222,1132,1235,1221,1116,976,976,1192,1162,1177,1220,1131,1191,963,963,-1647,961,780,-1663,558,558,994,993,437,408,393,407,829,978,813,797,947,-1743,721,721,377,392,844,950,828,890,706,706,812,859,796,960,948,843,934,874,571,571,-1919,690,555,689,421,346,539,539,944,779,918,873,932,842,903,888,570,570,931,917,674,674,-2575,1562,-2591,1609,-2607,1654,1322,1322,1441,1441,1696,1546,1683,1593,1669,1624,1426,1426,1321,1321,1639,1680,1425,1425,1305,1305,1545,1668,1608,1623,1667,1592,1638,1666,1320,1320,1652,1607,1409,1409,1304,1304,1288,1288,1664,1637,1395,1395,1335,1335,1622,1636,1394,1394,1319,1319,1606,1621,1392,1392,1137,1137,1137,1137,345,390,360,375,404,373,1047,-2751,-2767,-2783,1062,1121,1046,-2799,1077,-2815,1106,1061,789,789,1105,1104,263,355,310,340,325,354,352,262,339,324,1091,1076,1029,1090,1060,1075,833,833,788,788,1088,1028,818,818,803,803,561,561,531,531,816,771,546,546,289,274,288,258, - -253,-317,-381,-446,-478,-509,1279,1279,-811,-1179,-1451,-1756,-1900,-2028,-2189,-2253,-2333,-2414,-2445,-2511,-2526,1313,1298,-2559,1041,1041,1040,1040,1025,1025,1024,1024,1022,1007,1021,991,1020,975,1019,959,687,687,1018,1017,671,671,655,655,1016,1015,639,639,758,758,623,623,757,607,756,591,755,575,754,559,543,543,1009,783,-575,-621,-685,-749,496,-590,750,749,734,748,974,989,1003,958,988,973,1002,942,987,957,972,1001,926,986,941,971,956,1000,910,985,925,999,894,970,-1071,-1087,-1102,1390,-1135,1436,1509,1451,1374,-1151,1405,1358,1480,1420,-1167,1507,1494,1389,1342,1465,1435,1450,1326,1505,1310,1493,1373,1479,1404,1492,1464,1419,428,443,472,397,736,526,464,464,486,457,442,471,484,482,1357,1449,1434,1478,1388,1491,1341,1490,1325,1489,1463,1403,1309,1477,1372,1448,1418,1433,1476,1356,1462,1387,-1439,1475,1340,1447,1402,1474,1324,1461,1371,1473,269,448,1432,1417,1308,1460,-1711,1459,-1727,1441,1099,1099,1446,1386,1431,1401,-1743,1289,1083,1083,1160,1160,1458,1445,1067,1067,1370,1457,1307,1430,1129,1129,1098,1098,268,432,267,416,266,400,-1887,1144,1187,1082,1173,1113,1186,1066,1050,1158,1128,1143,1172,1097,1171,1081,420,391,1157,1112,1170,1142,1127,1065,1169,1049,1156,1096,1141,1111,1155,1080,1126,1154,1064,1153,1140,1095,1048,-2159,1125,1110,1137,-2175,823,823,1139,1138,807,807,384,264,368,263,868,838,853,791,867,822,852,837,866,806,865,790,-2319,851,821,836,352,262,850,805,849,-2399,533,533,835,820,336,261,578,548,563,577,532,532,832,772,562,562,547,547,305,275,560,515,290,290,288,258 }; - static const uint8_t tab32[] = { 130,162,193,209,44,28,76,140,9,9,9,9,9,9,9,9,190,254,222,238,126,94,157,157,109,61,173,205 }; - static const uint8_t tab33[] = { 252,236,220,204,188,172,156,140,124,108,92,76,60,44,28,12 }; - static const int16_t tabindex[2*16] = { 0,32,64,98,0,132,180,218,292,364,426,538,648,746,0,1126,1460,1460,1460,1460,1460,1460,1460,1460,1842,1842,1842,1842,1842,1842,1842,1842 }; - static const uint8_t g_linbits[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,6,8,10,13,4,5,6,7,8,9,11,13 }; - -#define PEEK_BITS(n) (bs_cache >> (32 - n)) -#define FLUSH_BITS(n) { bs_cache <<= (n); bs_sh += (n); } -#define CHECK_BITS while (bs_sh >= 0) { bs_cache |= (uint32_t)*bs_next_ptr++ << bs_sh; bs_sh -= 8; } -#define BSPOS ((bs_next_ptr - bs->buf)*8 - 24 + bs_sh) - - float one = 0.0f; - int ireg = 0, big_val_cnt = gr_info->big_values; - const uint8_t *sfb = gr_info->sfbtab; - const uint8_t *bs_next_ptr = bs->buf + bs->pos/8; - uint32_t bs_cache = (((bs_next_ptr[0]*256u + bs_next_ptr[1])*256u + bs_next_ptr[2])*256u + bs_next_ptr[3]) << (bs->pos & 7); - int pairs_to_decode, np, bs_sh = (bs->pos & 7) - 8; - bs_next_ptr += 4; - - while (big_val_cnt > 0) - { - int tab_num = gr_info->table_select[ireg]; - int sfb_cnt = gr_info->region_count[ireg++]; - const int16_t *codebook = tabs + tabindex[tab_num]; - int linbits = g_linbits[tab_num]; - if (linbits) - { - do - { - np = *sfb++ / 2; - pairs_to_decode = MINIMP3_MIN(big_val_cnt, np); - one = *scf++; - do - { - int j, w = 5; - int leaf = codebook[PEEK_BITS(w)]; - while (leaf < 0) - { - FLUSH_BITS(w); - w = leaf & 7; - leaf = codebook[PEEK_BITS(w) - (leaf >> 3)]; - } - FLUSH_BITS(leaf >> 8); - - for (j = 0; j < 2; j++, dst++, leaf >>= 4) - { - int lsb = leaf & 0x0F; - if (lsb == 15) - { - lsb += PEEK_BITS(linbits); - FLUSH_BITS(linbits); - CHECK_BITS; - *dst = one*L3_pow_43(lsb)*((int32_t)bs_cache < 0 ? -1: 1); - } else - { - *dst = g_pow43[16 + lsb - 16*(bs_cache >> 31)]*one; - } - FLUSH_BITS(lsb ? 1 : 0); - } - CHECK_BITS; - } while (--pairs_to_decode); - } while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0); - } else - { - do - { - np = *sfb++ / 2; - pairs_to_decode = MINIMP3_MIN(big_val_cnt, np); - one = *scf++; - do - { - int j, w = 5; - int leaf = codebook[PEEK_BITS(w)]; - while (leaf < 0) - { - FLUSH_BITS(w); - w = leaf & 7; - leaf = codebook[PEEK_BITS(w) - (leaf >> 3)]; - } - FLUSH_BITS(leaf >> 8); - - for (j = 0; j < 2; j++, dst++, leaf >>= 4) - { - int lsb = leaf & 0x0F; - *dst = g_pow43[16 + lsb - 16*(bs_cache >> 31)]*one; - FLUSH_BITS(lsb ? 1 : 0); - } - CHECK_BITS; - } while (--pairs_to_decode); - } while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0); - } - } - - for (np = 1 - big_val_cnt;; dst += 4) - { - const uint8_t *codebook_count1 = (gr_info->count1_table) ? tab33 : tab32; - int leaf = codebook_count1[PEEK_BITS(4)]; - if (!(leaf & 8)) - { - leaf = codebook_count1[(leaf >> 3) + (bs_cache << 4 >> (32 - (leaf & 3)))]; - } - FLUSH_BITS(leaf & 7); - if (BSPOS > layer3gr_limit) - { - break; - } -#define RELOAD_SCALEFACTOR if (!--np) { np = *sfb++/2; if (!np) break; one = *scf++; } -#define DEQ_COUNT1(s) if (leaf & (128 >> s)) { dst[s] = ((int32_t)bs_cache < 0) ? -one : one; FLUSH_BITS(1) } - RELOAD_SCALEFACTOR; - DEQ_COUNT1(0); - DEQ_COUNT1(1); - RELOAD_SCALEFACTOR; - DEQ_COUNT1(2); - DEQ_COUNT1(3); - CHECK_BITS; - } - - bs->pos = layer3gr_limit; -} - -static void L3_midside_stereo(float *left, int n) -{ - int i = 0; - float *right = left + 576; -#if HAVE_SIMD - if (have_simd()) for (; i < n - 3; i += 4) - { - f4 vl = VLD(left + i); - f4 vr = VLD(right + i); - VSTORE(left + i, VADD(vl, vr)); - VSTORE(right + i, VSUB(vl, vr)); - } -#endif /* HAVE_SIMD */ - for (; i < n; i++) - { - float a = left[i]; - float b = right[i]; - left[i] = a + b; - right[i] = a - b; - } -} - -static void L3_intensity_stereo_band(float *left, int n, float kl, float kr) -{ - int i; - for (i = 0; i < n; i++) - { - left[i + 576] = left[i]*kr; - left[i] = left[i]*kl; - } -} - -static void L3_stereo_top_band(const float *right, const uint8_t *sfb, int nbands, int max_band[3]) -{ - int i, k; - - max_band[0] = max_band[1] = max_band[2] = -1; - - for (i = 0; i < nbands; i++) - { - for (k = 0; k < sfb[i]; k += 2) - { - if (right[k] != 0 || right[k + 1] != 0) - { - max_band[i % 3] = i; - break; - } - } - right += sfb[i]; - } -} - -static void L3_stereo_process(float *left, const uint8_t *ist_pos, const uint8_t *sfb, const uint8_t *hdr, int max_band[3], int mpeg2_sh) -{ - static const float g_pan[7*2] = { 0,1,0.21132487f,0.78867513f,0.36602540f,0.63397460f,0.5f,0.5f,0.63397460f,0.36602540f,0.78867513f,0.21132487f,1,0 }; - unsigned i, max_pos = HDR_TEST_MPEG1(hdr) ? 7 : 64; - - for (i = 0; sfb[i]; i++) - { - unsigned ipos = ist_pos[i]; - if ((int)i > max_band[i % 3] && ipos < max_pos) - { - float kl, kr, s = HDR_TEST_MS_STEREO(hdr) ? 1.41421356f : 1; - if (HDR_TEST_MPEG1(hdr)) - { - kl = g_pan[2*ipos]; - kr = g_pan[2*ipos + 1]; - } else - { - kl = 1; - kr = L3_ldexp_q2(1, (ipos + 1) >> 1 << mpeg2_sh); - if (ipos & 1) - { - kl = kr; - kr = 1; - } - } - L3_intensity_stereo_band(left, sfb[i], kl*s, kr*s); - } else if (HDR_TEST_MS_STEREO(hdr)) - { - L3_midside_stereo(left, sfb[i]); - } - left += sfb[i]; - } -} - -static void L3_intensity_stereo(float *left, uint8_t *ist_pos, const L3_gr_info_t *gr, const uint8_t *hdr) -{ - int max_band[3], n_sfb = gr->n_long_sfb + gr->n_short_sfb; - int i, max_blocks = gr->n_short_sfb ? 3 : 1; - - L3_stereo_top_band(left + 576, gr->sfbtab, n_sfb, max_band); - if (gr->n_long_sfb) - { - max_band[0] = max_band[1] = max_band[2] = MINIMP3_MAX(MINIMP3_MAX(max_band[0], max_band[1]), max_band[2]); - } - for (i = 0; i < max_blocks; i++) - { - int default_pos = HDR_TEST_MPEG1(hdr) ? 3 : 0; - int itop = n_sfb - max_blocks + i; - int prev = itop - max_blocks; - ist_pos[itop] = max_band[i] >= prev ? default_pos : ist_pos[prev]; - } - L3_stereo_process(left, ist_pos, gr->sfbtab, hdr, max_band, gr[1].scalefac_compress & 1); -} - -static void L3_reorder(float *grbuf, float *scratch, const uint8_t *sfb) -{ - int i, len; - float *src = grbuf, *dst = scratch; - - for (;0 != (len = *sfb); sfb += 3, src += 2*len) - { - for (i = 0; i < len; i++, src++) - { - *dst++ = src[0*len]; - *dst++ = src[1*len]; - *dst++ = src[2*len]; - } - } - memcpy(grbuf, scratch, (dst - scratch)*sizeof(float)); -} - -static void L3_antialias(float *grbuf, int nbands) -{ - static const float g_aa[2][8] = { - {0.85749293f,0.88174200f,0.94962865f,0.98331459f,0.99551782f,0.99916056f,0.99989920f,0.99999316f}, - {0.51449576f,0.47173197f,0.31337745f,0.18191320f,0.09457419f,0.04096558f,0.01419856f,0.00369997f} - }; - - for (; nbands > 0; nbands--, grbuf += 18) - { - int i = 0; -#if HAVE_SIMD - if (have_simd()) for (; i < 8; i += 4) - { - f4 vu = VLD(grbuf + 18 + i); - f4 vd = VLD(grbuf + 14 - i); - f4 vc0 = VLD(g_aa[0] + i); - f4 vc1 = VLD(g_aa[1] + i); - vd = VREV(vd); - VSTORE(grbuf + 18 + i, VSUB(VMUL(vu, vc0), VMUL(vd, vc1))); - vd = VADD(VMUL(vu, vc1), VMUL(vd, vc0)); - VSTORE(grbuf + 14 - i, VREV(vd)); - } -#endif /* HAVE_SIMD */ -#ifndef MINIMP3_ONLY_SIMD - for(; i < 8; i++) - { - float u = grbuf[18 + i]; - float d = grbuf[17 - i]; - grbuf[18 + i] = u*g_aa[0][i] - d*g_aa[1][i]; - grbuf[17 - i] = u*g_aa[1][i] + d*g_aa[0][i]; - } -#endif /* MINIMP3_ONLY_SIMD */ - } -} - -static void L3_dct3_9(float *y) -{ - float s0, s1, s2, s3, s4, s5, s6, s7, s8, t0, t2, t4; - - s0 = y[0]; s2 = y[2]; s4 = y[4]; s6 = y[6]; s8 = y[8]; - t0 = s0 + s6*0.5f; - s0 -= s6; - t4 = (s4 + s2)*0.93969262f; - t2 = (s8 + s2)*0.76604444f; - s6 = (s4 - s8)*0.17364818f; - s4 += s8 - s2; - - s2 = s0 - s4*0.5f; - y[4] = s4 + s0; - s8 = t0 - t2 + s6; - s0 = t0 - t4 + t2; - s4 = t0 + t4 - s6; - - s1 = y[1]; s3 = y[3]; s5 = y[5]; s7 = y[7]; - - s3 *= 0.86602540f; - t0 = (s5 + s1)*0.98480775f; - t4 = (s5 - s7)*0.34202014f; - t2 = (s1 + s7)*0.64278761f; - s1 = (s1 - s5 - s7)*0.86602540f; - - s5 = t0 - s3 - t2; - s7 = t4 - s3 - t0; - s3 = t4 + s3 - t2; - - y[0] = s4 - s7; - y[1] = s2 + s1; - y[2] = s0 - s3; - y[3] = s8 + s5; - y[5] = s8 - s5; - y[6] = s0 + s3; - y[7] = s2 - s1; - y[8] = s4 + s7; -} - -static void L3_imdct36(float *grbuf, float *overlap, const float *window, int nbands) -{ - int i, j; - static const float g_twid9[18] = { - 0.73727734f,0.79335334f,0.84339145f,0.88701083f,0.92387953f,0.95371695f,0.97629601f,0.99144486f,0.99904822f,0.67559021f,0.60876143f,0.53729961f,0.46174861f,0.38268343f,0.30070580f,0.21643961f,0.13052619f,0.04361938f - }; - - for (j = 0; j < nbands; j++, grbuf += 18, overlap += 9) - { - float co[9], si[9]; - co[0] = -grbuf[0]; - si[0] = grbuf[17]; - for (i = 0; i < 4; i++) - { - si[8 - 2*i] = grbuf[4*i + 1] - grbuf[4*i + 2]; - co[1 + 2*i] = grbuf[4*i + 1] + grbuf[4*i + 2]; - si[7 - 2*i] = grbuf[4*i + 4] - grbuf[4*i + 3]; - co[2 + 2*i] = -(grbuf[4*i + 3] + grbuf[4*i + 4]); - } - L3_dct3_9(co); - L3_dct3_9(si); - - si[1] = -si[1]; - si[3] = -si[3]; - si[5] = -si[5]; - si[7] = -si[7]; - - i = 0; - -#if HAVE_SIMD - if (have_simd()) for (; i < 8; i += 4) - { - f4 vovl = VLD(overlap + i); - f4 vc = VLD(co + i); - f4 vs = VLD(si + i); - f4 vr0 = VLD(g_twid9 + i); - f4 vr1 = VLD(g_twid9 + 9 + i); - f4 vw0 = VLD(window + i); - f4 vw1 = VLD(window + 9 + i); - f4 vsum = VADD(VMUL(vc, vr1), VMUL(vs, vr0)); - VSTORE(overlap + i, VSUB(VMUL(vc, vr0), VMUL(vs, vr1))); - VSTORE(grbuf + i, VSUB(VMUL(vovl, vw0), VMUL(vsum, vw1))); - vsum = VADD(VMUL(vovl, vw1), VMUL(vsum, vw0)); - VSTORE(grbuf + 14 - i, VREV(vsum)); - } -#endif /* HAVE_SIMD */ - for (; i < 9; i++) - { - float ovl = overlap[i]; - float sum = co[i]*g_twid9[9 + i] + si[i]*g_twid9[0 + i]; - overlap[i] = co[i]*g_twid9[0 + i] - si[i]*g_twid9[9 + i]; - grbuf[i] = ovl*window[0 + i] - sum*window[9 + i]; - grbuf[17 - i] = ovl*window[9 + i] + sum*window[0 + i]; - } - } -} - -static void L3_idct3(float x0, float x1, float x2, float *dst) -{ - float m1 = x1*0.86602540f; - float a1 = x0 - x2*0.5f; - dst[1] = x0 + x2; - dst[0] = a1 + m1; - dst[2] = a1 - m1; -} - -static void L3_imdct12(float *x, float *dst, float *overlap) -{ - static const float g_twid3[6] = { 0.79335334f,0.92387953f,0.99144486f, 0.60876143f,0.38268343f,0.13052619f }; - float co[3], si[3]; - int i; - - L3_idct3(-x[0], x[6] + x[3], x[12] + x[9], co); - L3_idct3(x[15], x[12] - x[9], x[6] - x[3], si); - si[1] = -si[1]; - - for (i = 0; i < 3; i++) - { - float ovl = overlap[i]; - float sum = co[i]*g_twid3[3 + i] + si[i]*g_twid3[0 + i]; - overlap[i] = co[i]*g_twid3[0 + i] - si[i]*g_twid3[3 + i]; - dst[i] = ovl*g_twid3[2 - i] - sum*g_twid3[5 - i]; - dst[5 - i] = ovl*g_twid3[5 - i] + sum*g_twid3[2 - i]; - } -} - -static void L3_imdct_short(float *grbuf, float *overlap, int nbands) -{ - for (;nbands > 0; nbands--, overlap += 9, grbuf += 18) - { - float tmp[18]; - memcpy(tmp, grbuf, sizeof(tmp)); - memcpy(grbuf, overlap, 6*sizeof(float)); - L3_imdct12(tmp, grbuf + 6, overlap + 6); - L3_imdct12(tmp + 1, grbuf + 12, overlap + 6); - L3_imdct12(tmp + 2, overlap, overlap + 6); - } -} - -static void L3_change_sign(float *grbuf) -{ - int b, i; - for (b = 0, grbuf += 18; b < 32; b += 2, grbuf += 36) - for (i = 1; i < 18; i += 2) - grbuf[i] = -grbuf[i]; -} - -static void L3_imdct_gr(float *grbuf, float *overlap, unsigned block_type, unsigned n_long_bands) -{ - static const float g_mdct_window[2][18] = { - { 0.99904822f,0.99144486f,0.97629601f,0.95371695f,0.92387953f,0.88701083f,0.84339145f,0.79335334f,0.73727734f,0.04361938f,0.13052619f,0.21643961f,0.30070580f,0.38268343f,0.46174861f,0.53729961f,0.60876143f,0.67559021f }, - { 1,1,1,1,1,1,0.99144486f,0.92387953f,0.79335334f,0,0,0,0,0,0,0.13052619f,0.38268343f,0.60876143f } - }; - if (n_long_bands) - { - L3_imdct36(grbuf, overlap, g_mdct_window[0], n_long_bands); - grbuf += 18*n_long_bands; - overlap += 9*n_long_bands; - } - if (block_type == SHORT_BLOCK_TYPE) - L3_imdct_short(grbuf, overlap, 32 - n_long_bands); - else - L3_imdct36(grbuf, overlap, g_mdct_window[block_type == STOP_BLOCK_TYPE], 32 - n_long_bands); -} - -static void L3_save_reservoir(mp3dec_t *h, mp3dec_scratch_t *s) -{ - int pos = (s->bs.pos + 7)/8u; - int remains = s->bs.limit/8u - pos; - if (remains > MAX_BITRESERVOIR_BYTES) - { - pos += remains - MAX_BITRESERVOIR_BYTES; - remains = MAX_BITRESERVOIR_BYTES; - } - if (remains > 0) - { - memmove(h->reserv_buf, s->maindata + pos, remains); - } - h->reserv = remains; -} - -static int L3_restore_reservoir(mp3dec_t *h, bs_t *bs, mp3dec_scratch_t *s, int main_data_begin) -{ - int frame_bytes = (bs->limit - bs->pos)/8; - int bytes_have = MINIMP3_MIN(h->reserv, main_data_begin); - memcpy(s->maindata, h->reserv_buf + MINIMP3_MAX(0, h->reserv - main_data_begin), MINIMP3_MIN(h->reserv, main_data_begin)); - memcpy(s->maindata + bytes_have, bs->buf + bs->pos/8, frame_bytes); - bs_init(&s->bs, s->maindata, bytes_have + frame_bytes); - return h->reserv >= main_data_begin; -} - -static void L3_decode(mp3dec_t *h, mp3dec_scratch_t *s, L3_gr_info_t *gr_info, int nch) -{ - int ch; - - for (ch = 0; ch < nch; ch++) - { - int layer3gr_limit = s->bs.pos + gr_info[ch].part_23_length; - L3_decode_scalefactors(h->header, s->ist_pos[ch], &s->bs, gr_info + ch, s->scf, ch); - L3_huffman(s->grbuf[ch], &s->bs, gr_info + ch, s->scf, layer3gr_limit); - } - - if (HDR_TEST_I_STEREO(h->header)) - { - L3_intensity_stereo(s->grbuf[0], s->ist_pos[1], gr_info, h->header); - } else if (HDR_IS_MS_STEREO(h->header)) - { - L3_midside_stereo(s->grbuf[0], 576); - } - - for (ch = 0; ch < nch; ch++, gr_info++) - { - int aa_bands = 31; - int n_long_bands = (gr_info->mixed_block_flag ? 2 : 0) << (int)(HDR_GET_MY_SAMPLE_RATE(h->header) == 2); - - if (gr_info->n_short_sfb) - { - aa_bands = n_long_bands - 1; - L3_reorder(s->grbuf[ch] + n_long_bands*18, s->syn[0], gr_info->sfbtab + gr_info->n_long_sfb); - } - - L3_antialias(s->grbuf[ch], aa_bands); - L3_imdct_gr(s->grbuf[ch], h->mdct_overlap[ch], gr_info->block_type, n_long_bands); - L3_change_sign(s->grbuf[ch]); - } -} - -static void mp3d_DCT_II(float *grbuf, int n) -{ - static const float g_sec[24] = { - 10.19000816f,0.50060302f,0.50241929f,3.40760851f,0.50547093f,0.52249861f,2.05778098f,0.51544732f,0.56694406f,1.48416460f,0.53104258f,0.64682180f,1.16943991f,0.55310392f,0.78815460f,0.97256821f,0.58293498f,1.06067765f,0.83934963f,0.62250412f,1.72244716f,0.74453628f,0.67480832f,5.10114861f - }; - int i, k = 0; -#if HAVE_SIMD - if (have_simd()) for (; k < n; k += 4) - { - f4 t[4][8], *x; - float *y = grbuf + k; - - for (x = t[0], i = 0; i < 8; i++, x++) - { - f4 x0 = VLD(&y[i*18]); - f4 x1 = VLD(&y[(15 - i)*18]); - f4 x2 = VLD(&y[(16 + i)*18]); - f4 x3 = VLD(&y[(31 - i)*18]); - f4 t0 = VADD(x0, x3); - f4 t1 = VADD(x1, x2); - f4 t2 = VMUL_S(VSUB(x1, x2), g_sec[3*i + 0]); - f4 t3 = VMUL_S(VSUB(x0, x3), g_sec[3*i + 1]); - x[0] = VADD(t0, t1); - x[8] = VMUL_S(VSUB(t0, t1), g_sec[3*i + 2]); - x[16] = VADD(t3, t2); - x[24] = VMUL_S(VSUB(t3, t2), g_sec[3*i + 2]); - } - for (x = t[0], i = 0; i < 4; i++, x += 8) - { - f4 x0 = x[0], x1 = x[1], x2 = x[2], x3 = x[3], x4 = x[4], x5 = x[5], x6 = x[6], x7 = x[7], xt; - xt = VSUB(x0, x7); x0 = VADD(x0, x7); - x7 = VSUB(x1, x6); x1 = VADD(x1, x6); - x6 = VSUB(x2, x5); x2 = VADD(x2, x5); - x5 = VSUB(x3, x4); x3 = VADD(x3, x4); - x4 = VSUB(x0, x3); x0 = VADD(x0, x3); - x3 = VSUB(x1, x2); x1 = VADD(x1, x2); - x[0] = VADD(x0, x1); - x[4] = VMUL_S(VSUB(x0, x1), 0.70710677f); - x5 = VADD(x5, x6); - x6 = VMUL_S(VADD(x6, x7), 0.70710677f); - x7 = VADD(x7, xt); - x3 = VMUL_S(VADD(x3, x4), 0.70710677f); - x5 = VSUB(x5, VMUL_S(x7, 0.198912367f)); /* rotate by PI/8 */ - x7 = VADD(x7, VMUL_S(x5, 0.382683432f)); - x5 = VSUB(x5, VMUL_S(x7, 0.198912367f)); - x0 = VSUB(xt, x6); xt = VADD(xt, x6); - x[1] = VMUL_S(VADD(xt, x7), 0.50979561f); - x[2] = VMUL_S(VADD(x4, x3), 0.54119611f); - x[3] = VMUL_S(VSUB(x0, x5), 0.60134488f); - x[5] = VMUL_S(VADD(x0, x5), 0.89997619f); - x[6] = VMUL_S(VSUB(x4, x3), 1.30656302f); - x[7] = VMUL_S(VSUB(xt, x7), 2.56291556f); - } - - if (k > n - 3) - { -#if HAVE_SSE -#define VSAVE2(i, v) _mm_storel_pi((__m64 *)(void*)&y[i*18], v) -#else /* HAVE_SSE */ -#define VSAVE2(i, v) vst1_f32((float32_t *)&y[i*18], vget_low_f32(v)) -#endif /* HAVE_SSE */ - for (i = 0; i < 7; i++, y += 4*18) - { - f4 s = VADD(t[3][i], t[3][i + 1]); - VSAVE2(0, t[0][i]); - VSAVE2(1, VADD(t[2][i], s)); - VSAVE2(2, VADD(t[1][i], t[1][i + 1])); - VSAVE2(3, VADD(t[2][1 + i], s)); - } - VSAVE2(0, t[0][7]); - VSAVE2(1, VADD(t[2][7], t[3][7])); - VSAVE2(2, t[1][7]); - VSAVE2(3, t[3][7]); - } else - { -#define VSAVE4(i, v) VSTORE(&y[i*18], v) - for (i = 0; i < 7; i++, y += 4*18) - { - f4 s = VADD(t[3][i], t[3][i + 1]); - VSAVE4(0, t[0][i]); - VSAVE4(1, VADD(t[2][i], s)); - VSAVE4(2, VADD(t[1][i], t[1][i + 1])); - VSAVE4(3, VADD(t[2][1 + i], s)); - } - VSAVE4(0, t[0][7]); - VSAVE4(1, VADD(t[2][7], t[3][7])); - VSAVE4(2, t[1][7]); - VSAVE4(3, t[3][7]); - } - } else -#endif /* HAVE_SIMD */ -#ifdef MINIMP3_ONLY_SIMD - {} -#else /* MINIMP3_ONLY_SIMD */ - for (; k < n; k++) - { - float t[4][8], *x, *y = grbuf + k; - - for (x = t[0], i = 0; i < 8; i++, x++) - { - float x0 = y[i*18]; - float x1 = y[(15 - i)*18]; - float x2 = y[(16 + i)*18]; - float x3 = y[(31 - i)*18]; - float t0 = x0 + x3; - float t1 = x1 + x2; - float t2 = (x1 - x2)*g_sec[3*i + 0]; - float t3 = (x0 - x3)*g_sec[3*i + 1]; - x[0] = t0 + t1; - x[8] = (t0 - t1)*g_sec[3*i + 2]; - x[16] = t3 + t2; - x[24] = (t3 - t2)*g_sec[3*i + 2]; - } - for (x = t[0], i = 0; i < 4; i++, x += 8) - { - float x0 = x[0], x1 = x[1], x2 = x[2], x3 = x[3], x4 = x[4], x5 = x[5], x6 = x[6], x7 = x[7], xt; - xt = x0 - x7; x0 += x7; - x7 = x1 - x6; x1 += x6; - x6 = x2 - x5; x2 += x5; - x5 = x3 - x4; x3 += x4; - x4 = x0 - x3; x0 += x3; - x3 = x1 - x2; x1 += x2; - x[0] = x0 + x1; - x[4] = (x0 - x1)*0.70710677f; - x5 = x5 + x6; - x6 = (x6 + x7)*0.70710677f; - x7 = x7 + xt; - x3 = (x3 + x4)*0.70710677f; - x5 -= x7*0.198912367f; /* rotate by PI/8 */ - x7 += x5*0.382683432f; - x5 -= x7*0.198912367f; - x0 = xt - x6; xt += x6; - x[1] = (xt + x7)*0.50979561f; - x[2] = (x4 + x3)*0.54119611f; - x[3] = (x0 - x5)*0.60134488f; - x[5] = (x0 + x5)*0.89997619f; - x[6] = (x4 - x3)*1.30656302f; - x[7] = (xt - x7)*2.56291556f; - - } - for (i = 0; i < 7; i++, y += 4*18) - { - y[0*18] = t[0][i]; - y[1*18] = t[2][i] + t[3][i] + t[3][i + 1]; - y[2*18] = t[1][i] + t[1][i + 1]; - y[3*18] = t[2][i + 1] + t[3][i] + t[3][i + 1]; - } - y[0*18] = t[0][7]; - y[1*18] = t[2][7] + t[3][7]; - y[2*18] = t[1][7]; - y[3*18] = t[3][7]; - } -#endif /* MINIMP3_ONLY_SIMD */ -} - -#ifndef MINIMP3_FLOAT_OUTPUT -static int16_t mp3d_scale_pcm(float sample) -{ -#if HAVE_ARMV6 - int32_t s32 = (int32_t)(sample + .5f); - s32 -= (s32 < 0); - int16_t s = (int16_t)minimp3_clip_int16_arm(s32); -#else - if (sample >= 32766.5) return (int16_t) 32767; - if (sample <= -32767.5) return (int16_t)-32768; - int16_t s = (int16_t)(sample + .5f); - s -= (s < 0); /* away from zero, to be compliant */ -#endif - return s; -} -#else /* MINIMP3_FLOAT_OUTPUT */ -static float mp3d_scale_pcm(float sample) -{ - return sample*(1.f/32768.f); -} -#endif /* MINIMP3_FLOAT_OUTPUT */ - -static void mp3d_synth_pair(mp3d_sample_t *pcm, int nch, const float *z) -{ - float a; - a = (z[14*64] - z[ 0]) * 29; - a += (z[ 1*64] + z[13*64]) * 213; - a += (z[12*64] - z[ 2*64]) * 459; - a += (z[ 3*64] + z[11*64]) * 2037; - a += (z[10*64] - z[ 4*64]) * 5153; - a += (z[ 5*64] + z[ 9*64]) * 6574; - a += (z[ 8*64] - z[ 6*64]) * 37489; - a += z[ 7*64] * 75038; - pcm[0] = mp3d_scale_pcm(a); - - z += 2; - a = z[14*64] * 104; - a += z[12*64] * 1567; - a += z[10*64] * 9727; - a += z[ 8*64] * 64019; - a += z[ 6*64] * -9975; - a += z[ 4*64] * -45; - a += z[ 2*64] * 146; - a += z[ 0*64] * -5; - pcm[16*nch] = mp3d_scale_pcm(a); -} - -static void mp3d_synth(float *xl, mp3d_sample_t *dstl, int nch, float *lins) -{ - int i; - float *xr = xl + 576*(nch - 1); - mp3d_sample_t *dstr = dstl + (nch - 1); - - static const float g_win[] = { - -1,26,-31,208,218,401,-519,2063,2000,4788,-5517,7134,5959,35640,-39336,74992, - -1,24,-35,202,222,347,-581,2080,1952,4425,-5879,7640,5288,33791,-41176,74856, - -1,21,-38,196,225,294,-645,2087,1893,4063,-6237,8092,4561,31947,-43006,74630, - -1,19,-41,190,227,244,-711,2085,1822,3705,-6589,8492,3776,30112,-44821,74313, - -1,17,-45,183,228,197,-779,2075,1739,3351,-6935,8840,2935,28289,-46617,73908, - -1,16,-49,176,228,153,-848,2057,1644,3004,-7271,9139,2037,26482,-48390,73415, - -2,14,-53,169,227,111,-919,2032,1535,2663,-7597,9389,1082,24694,-50137,72835, - -2,13,-58,161,224,72,-991,2001,1414,2330,-7910,9592,70,22929,-51853,72169, - -2,11,-63,154,221,36,-1064,1962,1280,2006,-8209,9750,-998,21189,-53534,71420, - -2,10,-68,147,215,2,-1137,1919,1131,1692,-8491,9863,-2122,19478,-55178,70590, - -3,9,-73,139,208,-29,-1210,1870,970,1388,-8755,9935,-3300,17799,-56778,69679, - -3,8,-79,132,200,-57,-1283,1817,794,1095,-8998,9966,-4533,16155,-58333,68692, - -4,7,-85,125,189,-83,-1356,1759,605,814,-9219,9959,-5818,14548,-59838,67629, - -4,7,-91,117,177,-106,-1428,1698,402,545,-9416,9916,-7154,12980,-61289,66494, - -5,6,-97,111,163,-127,-1498,1634,185,288,-9585,9838,-8540,11455,-62684,65290 - }; - float *zlin = lins + 15*64; - const float *w = g_win; - - zlin[4*15] = xl[18*16]; - zlin[4*15 + 1] = xr[18*16]; - zlin[4*15 + 2] = xl[0]; - zlin[4*15 + 3] = xr[0]; - - zlin[4*31] = xl[1 + 18*16]; - zlin[4*31 + 1] = xr[1 + 18*16]; - zlin[4*31 + 2] = xl[1]; - zlin[4*31 + 3] = xr[1]; - - mp3d_synth_pair(dstr, nch, lins + 4*15 + 1); - mp3d_synth_pair(dstr + 32*nch, nch, lins + 4*15 + 64 + 1); - mp3d_synth_pair(dstl, nch, lins + 4*15); - mp3d_synth_pair(dstl + 32*nch, nch, lins + 4*15 + 64); - -#if HAVE_SIMD - if (have_simd()) for (i = 14; i >= 0; i--) - { -#define VLOAD(k) f4 w0 = VSET(*w++); f4 w1 = VSET(*w++); f4 vz = VLD(&zlin[4*i - 64*k]); f4 vy = VLD(&zlin[4*i - 64*(15 - k)]); -#define V0(k) { VLOAD(k) b = VADD(VMUL(vz, w1), VMUL(vy, w0)) ; a = VSUB(VMUL(vz, w0), VMUL(vy, w1)); } -#define V1(k) { VLOAD(k) b = VADD(b, VADD(VMUL(vz, w1), VMUL(vy, w0))); a = VADD(a, VSUB(VMUL(vz, w0), VMUL(vy, w1))); } -#define V2(k) { VLOAD(k) b = VADD(b, VADD(VMUL(vz, w1), VMUL(vy, w0))); a = VADD(a, VSUB(VMUL(vy, w1), VMUL(vz, w0))); } - f4 a, b; - zlin[4*i] = xl[18*(31 - i)]; - zlin[4*i + 1] = xr[18*(31 - i)]; - zlin[4*i + 2] = xl[1 + 18*(31 - i)]; - zlin[4*i + 3] = xr[1 + 18*(31 - i)]; - zlin[4*i + 64] = xl[1 + 18*(1 + i)]; - zlin[4*i + 64 + 1] = xr[1 + 18*(1 + i)]; - zlin[4*i - 64 + 2] = xl[18*(1 + i)]; - zlin[4*i - 64 + 3] = xr[18*(1 + i)]; - - V0(0) V2(1) V1(2) V2(3) V1(4) V2(5) V1(6) V2(7) - - { -#ifndef MINIMP3_FLOAT_OUTPUT -#if HAVE_SSE - static const f4 g_max = { 32767.0f, 32767.0f, 32767.0f, 32767.0f }; - static const f4 g_min = { -32768.0f, -32768.0f, -32768.0f, -32768.0f }; - __m128i pcm8 = _mm_packs_epi32(_mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(a, g_max), g_min)), - _mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(b, g_max), g_min))); - dstr[(15 - i)*nch] = _mm_extract_epi16(pcm8, 1); - dstr[(17 + i)*nch] = _mm_extract_epi16(pcm8, 5); - dstl[(15 - i)*nch] = _mm_extract_epi16(pcm8, 0); - dstl[(17 + i)*nch] = _mm_extract_epi16(pcm8, 4); - dstr[(47 - i)*nch] = _mm_extract_epi16(pcm8, 3); - dstr[(49 + i)*nch] = _mm_extract_epi16(pcm8, 7); - dstl[(47 - i)*nch] = _mm_extract_epi16(pcm8, 2); - dstl[(49 + i)*nch] = _mm_extract_epi16(pcm8, 6); -#else /* HAVE_SSE */ - int16x4_t pcma, pcmb; - a = VADD(a, VSET(0.5f)); - b = VADD(b, VSET(0.5f)); - pcma = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(a), vreinterpretq_s32_u32(vcltq_f32(a, VSET(0))))); - pcmb = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(b), vreinterpretq_s32_u32(vcltq_f32(b, VSET(0))))); - vst1_lane_s16(dstr + (15 - i)*nch, pcma, 1); - vst1_lane_s16(dstr + (17 + i)*nch, pcmb, 1); - vst1_lane_s16(dstl + (15 - i)*nch, pcma, 0); - vst1_lane_s16(dstl + (17 + i)*nch, pcmb, 0); - vst1_lane_s16(dstr + (47 - i)*nch, pcma, 3); - vst1_lane_s16(dstr + (49 + i)*nch, pcmb, 3); - vst1_lane_s16(dstl + (47 - i)*nch, pcma, 2); - vst1_lane_s16(dstl + (49 + i)*nch, pcmb, 2); -#endif /* HAVE_SSE */ - -#else /* MINIMP3_FLOAT_OUTPUT */ - - static const f4 g_scale = { 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f }; - a = VMUL(a, g_scale); - b = VMUL(b, g_scale); -#if HAVE_SSE - _mm_store_ss(dstr + (15 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1))); - _mm_store_ss(dstr + (17 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(1, 1, 1, 1))); - _mm_store_ss(dstl + (15 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0))); - _mm_store_ss(dstl + (17 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(0, 0, 0, 0))); - _mm_store_ss(dstr + (47 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 3, 3, 3))); - _mm_store_ss(dstr + (49 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 3, 3, 3))); - _mm_store_ss(dstl + (47 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2))); - _mm_store_ss(dstl + (49 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(2, 2, 2, 2))); -#else /* HAVE_SSE */ - vst1q_lane_f32(dstr + (15 - i)*nch, a, 1); - vst1q_lane_f32(dstr + (17 + i)*nch, b, 1); - vst1q_lane_f32(dstl + (15 - i)*nch, a, 0); - vst1q_lane_f32(dstl + (17 + i)*nch, b, 0); - vst1q_lane_f32(dstr + (47 - i)*nch, a, 3); - vst1q_lane_f32(dstr + (49 + i)*nch, b, 3); - vst1q_lane_f32(dstl + (47 - i)*nch, a, 2); - vst1q_lane_f32(dstl + (49 + i)*nch, b, 2); -#endif /* HAVE_SSE */ -#endif /* MINIMP3_FLOAT_OUTPUT */ - } - } else -#endif /* HAVE_SIMD */ -#ifdef MINIMP3_ONLY_SIMD - {} -#else /* MINIMP3_ONLY_SIMD */ - for (i = 14; i >= 0; i--) - { -#define LOAD(k) float w0 = *w++; float w1 = *w++; float *vz = &zlin[4*i - k*64]; float *vy = &zlin[4*i - (15 - k)*64]; -#define S0(k) { int j; LOAD(k); for (j = 0; j < 4; j++) b[j] = vz[j]*w1 + vy[j]*w0, a[j] = vz[j]*w0 - vy[j]*w1; } -#define S1(k) { int j; LOAD(k); for (j = 0; j < 4; j++) b[j] += vz[j]*w1 + vy[j]*w0, a[j] += vz[j]*w0 - vy[j]*w1; } -#define S2(k) { int j; LOAD(k); for (j = 0; j < 4; j++) b[j] += vz[j]*w1 + vy[j]*w0, a[j] += vy[j]*w1 - vz[j]*w0; } - float a[4], b[4]; - - zlin[4*i] = xl[18*(31 - i)]; - zlin[4*i + 1] = xr[18*(31 - i)]; - zlin[4*i + 2] = xl[1 + 18*(31 - i)]; - zlin[4*i + 3] = xr[1 + 18*(31 - i)]; - zlin[4*(i + 16)] = xl[1 + 18*(1 + i)]; - zlin[4*(i + 16) + 1] = xr[1 + 18*(1 + i)]; - zlin[4*(i - 16) + 2] = xl[18*(1 + i)]; - zlin[4*(i - 16) + 3] = xr[18*(1 + i)]; - - S0(0) S2(1) S1(2) S2(3) S1(4) S2(5) S1(6) S2(7) - - dstr[(15 - i)*nch] = mp3d_scale_pcm(a[1]); - dstr[(17 + i)*nch] = mp3d_scale_pcm(b[1]); - dstl[(15 - i)*nch] = mp3d_scale_pcm(a[0]); - dstl[(17 + i)*nch] = mp3d_scale_pcm(b[0]); - dstr[(47 - i)*nch] = mp3d_scale_pcm(a[3]); - dstr[(49 + i)*nch] = mp3d_scale_pcm(b[3]); - dstl[(47 - i)*nch] = mp3d_scale_pcm(a[2]); - dstl[(49 + i)*nch] = mp3d_scale_pcm(b[2]); - } -#endif /* MINIMP3_ONLY_SIMD */ -} - -static void mp3d_synth_granule(float *qmf_state, float *grbuf, int nbands, int nch, mp3d_sample_t *pcm, float *lins) -{ - int i; - for (i = 0; i < nch; i++) - { - mp3d_DCT_II(grbuf + 576*i, nbands); - } - - memcpy(lins, qmf_state, sizeof(float)*15*64); - - for (i = 0; i < nbands; i += 2) - { - mp3d_synth(grbuf + i, pcm + 32*nch*i, nch, lins + i*64); - } -#ifndef MINIMP3_NONSTANDARD_BUT_LOGICAL - if (nch == 1) - { - for (i = 0; i < 15*64; i += 2) - { - qmf_state[i] = lins[nbands*64 + i]; - } - } else -#endif /* MINIMP3_NONSTANDARD_BUT_LOGICAL */ - { - memcpy(qmf_state, lins + nbands*64, sizeof(float)*15*64); - } -} - -static int mp3d_match_frame(const uint8_t *hdr, int mp3_bytes, int frame_bytes) -{ - int i, nmatch; - for (i = 0, nmatch = 0; nmatch < MAX_FRAME_SYNC_MATCHES; nmatch++) - { - i += hdr_frame_bytes(hdr + i, frame_bytes) + hdr_padding(hdr + i); - if (i + HDR_SIZE > mp3_bytes) - return nmatch > 0; - if (!hdr_compare(hdr, hdr + i)) - return 0; - } - return 1; -} - -static int mp3d_find_frame(const uint8_t *mp3, int mp3_bytes, int *free_format_bytes, int *ptr_frame_bytes) -{ - int i, k; - for (i = 0; i < mp3_bytes - HDR_SIZE; i++, mp3++) - { - if (hdr_valid(mp3)) - { - int frame_bytes = hdr_frame_bytes(mp3, *free_format_bytes); - int frame_and_padding = frame_bytes + hdr_padding(mp3); - - for (k = HDR_SIZE; !frame_bytes && k < MAX_FREE_FORMAT_FRAME_SIZE && i + 2*k < mp3_bytes - HDR_SIZE; k++) - { - if (hdr_compare(mp3, mp3 + k)) - { - int fb = k - hdr_padding(mp3); - int nextfb = fb + hdr_padding(mp3 + k); - if (i + k + nextfb + HDR_SIZE > mp3_bytes || !hdr_compare(mp3, mp3 + k + nextfb)) - continue; - frame_and_padding = k; - frame_bytes = fb; - *free_format_bytes = fb; - } - } - if ((frame_bytes && i + frame_and_padding <= mp3_bytes && - mp3d_match_frame(mp3, mp3_bytes - i, frame_bytes)) || - (!i && frame_and_padding == mp3_bytes)) - { - *ptr_frame_bytes = frame_and_padding; - return i; - } - *free_format_bytes = 0; - } - } - *ptr_frame_bytes = 0; - return mp3_bytes; -} - -void mp3dec_init(mp3dec_t *dec) -{ - dec->header[0] = 0; -} - -int mp3dec_decode_frame(mp3dec_t *dec, const uint8_t *mp3, int mp3_bytes, mp3d_sample_t *pcm, mp3dec_frame_info_t *info) -{ - int i = 0, igr, frame_size = 0, success = 1; - const uint8_t *hdr; - bs_t bs_frame[1]; - mp3dec_scratch_t scratch; - - if (mp3_bytes > 4 && dec->header[0] == 0xff && hdr_compare(dec->header, mp3)) - { - frame_size = hdr_frame_bytes(mp3, dec->free_format_bytes) + hdr_padding(mp3); - if (frame_size != mp3_bytes && (frame_size + HDR_SIZE > mp3_bytes || !hdr_compare(mp3, mp3 + frame_size))) - { - frame_size = 0; - } - } - if (!frame_size) - { - memset(dec, 0, sizeof(mp3dec_t)); - i = mp3d_find_frame(mp3, mp3_bytes, &dec->free_format_bytes, &frame_size); - if (!frame_size || i + frame_size > mp3_bytes) - { - info->frame_bytes = i; - return 0; - } - } - - hdr = mp3 + i; - memcpy(dec->header, hdr, HDR_SIZE); - info->frame_bytes = i + frame_size; - info->frame_offset = i; - info->channels = HDR_IS_MONO(hdr) ? 1 : 2; - info->hz = hdr_sample_rate_hz(hdr); - info->layer = 4 - HDR_GET_LAYER(hdr); - info->bitrate_kbps = hdr_bitrate_kbps(hdr); - - if (!pcm) - { - return hdr_frame_samples(hdr); - } - - bs_init(bs_frame, hdr + HDR_SIZE, frame_size - HDR_SIZE); - if (HDR_IS_CRC(hdr)) - { - get_bits(bs_frame, 16); - } - - if (info->layer == 3) - { - int main_data_begin = L3_read_side_info(bs_frame, scratch.gr_info, hdr); - if (main_data_begin < 0 || bs_frame->pos > bs_frame->limit) - { - mp3dec_init(dec); - return 0; - } - success = L3_restore_reservoir(dec, bs_frame, &scratch, main_data_begin); - if (success) - { - for (igr = 0; igr < (HDR_TEST_MPEG1(hdr) ? 2 : 1); igr++, pcm += 576*info->channels) - { - memset(scratch.grbuf[0], 0, 576*2*sizeof(float)); - L3_decode(dec, &scratch, scratch.gr_info + igr*info->channels, info->channels); - mp3d_synth_granule(dec->qmf_state, scratch.grbuf[0], 18, info->channels, pcm, scratch.syn[0]); - } - } - L3_save_reservoir(dec, &scratch); - } else - { -#ifdef MINIMP3_ONLY_MP3 - return 0; -#else /* MINIMP3_ONLY_MP3 */ - L12_scale_info sci[1]; - L12_read_scale_info(hdr, bs_frame, sci); - - memset(scratch.grbuf[0], 0, 576*2*sizeof(float)); - for (i = 0, igr = 0; igr < 3; igr++) - { - if (12 == (i += L12_dequantize_granule(scratch.grbuf[0] + i, bs_frame, sci, info->layer | 1))) - { - i = 0; - L12_apply_scf_384(sci, sci->scf + igr, scratch.grbuf[0]); - mp3d_synth_granule(dec->qmf_state, scratch.grbuf[0], 12, info->channels, pcm, scratch.syn[0]); - memset(scratch.grbuf[0], 0, 576*2*sizeof(float)); - pcm += 384*info->channels; - } - if (bs_frame->pos > bs_frame->limit) - { - mp3dec_init(dec); - return 0; - } - } -#endif /* MINIMP3_ONLY_MP3 */ - } - return success*hdr_frame_samples(dec->header); -} - -#ifdef MINIMP3_FLOAT_OUTPUT -void mp3dec_f32_to_s16(const float *in, int16_t *out, int num_samples) -{ - int i = 0; -#if HAVE_SIMD - int aligned_count = num_samples & ~7; - for(; i < aligned_count; i += 8) - { - static const f4 g_scale = { 32768.0f, 32768.0f, 32768.0f, 32768.0f }; - f4 a = VMUL(VLD(&in[i ]), g_scale); - f4 b = VMUL(VLD(&in[i+4]), g_scale); -#if HAVE_SSE - static const f4 g_max = { 32767.0f, 32767.0f, 32767.0f, 32767.0f }; - static const f4 g_min = { -32768.0f, -32768.0f, -32768.0f, -32768.0f }; - __m128i pcm8 = _mm_packs_epi32(_mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(a, g_max), g_min)), - _mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(b, g_max), g_min))); - out[i ] = _mm_extract_epi16(pcm8, 0); - out[i+1] = _mm_extract_epi16(pcm8, 1); - out[i+2] = _mm_extract_epi16(pcm8, 2); - out[i+3] = _mm_extract_epi16(pcm8, 3); - out[i+4] = _mm_extract_epi16(pcm8, 4); - out[i+5] = _mm_extract_epi16(pcm8, 5); - out[i+6] = _mm_extract_epi16(pcm8, 6); - out[i+7] = _mm_extract_epi16(pcm8, 7); -#else /* HAVE_SSE */ - int16x4_t pcma, pcmb; - a = VADD(a, VSET(0.5f)); - b = VADD(b, VSET(0.5f)); - pcma = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(a), vreinterpretq_s32_u32(vcltq_f32(a, VSET(0))))); - pcmb = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(b), vreinterpretq_s32_u32(vcltq_f32(b, VSET(0))))); - vst1_lane_s16(out+i , pcma, 0); - vst1_lane_s16(out+i+1, pcma, 1); - vst1_lane_s16(out+i+2, pcma, 2); - vst1_lane_s16(out+i+3, pcma, 3); - vst1_lane_s16(out+i+4, pcmb, 0); - vst1_lane_s16(out+i+5, pcmb, 1); - vst1_lane_s16(out+i+6, pcmb, 2); - vst1_lane_s16(out+i+7, pcmb, 3); -#endif /* HAVE_SSE */ - } -#endif /* HAVE_SIMD */ - for(; i < num_samples; i++) - { - float sample = in[i] * 32768.0f; - if (sample >= 32766.5) - out[i] = (int16_t) 32767; - else if (sample <= -32767.5) - out[i] = (int16_t)-32768; - else - { - int16_t s = (int16_t)(sample + .5f); - s -= (s < 0); /* away from zero, to be compliant */ - out[i] = s; - } - } -} -#endif /* MINIMP3_FLOAT_OUTPUT */ -#endif /* MINIMP3_IMPLEMENTATION && !_MINIMP3_IMPLEMENTATION_GUARD */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/minimp3/minimp3_ex.h b/sources/LabSound/third_party/libnyquist/third_party/minimp3/minimp3_ex.h deleted file mode 100644 index e29dd15b..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/minimp3/minimp3_ex.h +++ /dev/null @@ -1,1394 +0,0 @@ -#ifndef MINIMP3_EXT_H -#define MINIMP3_EXT_H -/* - https://github.com/lieff/minimp3 - To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this software to the public domain worldwide. - This software is distributed without any warranty. - See . -*/ -#include "minimp3.h" - -/* flags for mp3dec_ex_open_* functions */ -#define MP3D_SEEK_TO_BYTE 0 /* mp3dec_ex_seek seeks to byte in stream */ -#define MP3D_SEEK_TO_SAMPLE 1 /* mp3dec_ex_seek precisely seeks to sample using index (created during duration calculation scan or when mp3dec_ex_seek called) */ -#define MP3D_DO_NOT_SCAN 2 /* do not scan whole stream for duration if vbrtag not found, mp3dec_ex_t::samples will be filled only if mp3dec_ex_t::vbr_tag_found == 1 */ -#ifdef MINIMP3_ALLOW_MONO_STEREO_TRANSITION -#define MP3D_ALLOW_MONO_STEREO_TRANSITION 4 -#define MP3D_FLAGS_MASK 7 -#else -#define MP3D_FLAGS_MASK 3 -#endif - -/* compile-time config */ -#define MINIMP3_PREDECODE_FRAMES 2 /* frames to pre-decode and skip after seek (to fill internal structures) */ -/*#define MINIMP3_SEEK_IDX_LINEAR_SEARCH*/ /* define to use linear index search instead of binary search on seek */ -#define MINIMP3_IO_SIZE (128*1024) /* io buffer size for streaming functions, must be greater than MINIMP3_BUF_SIZE */ -#define MINIMP3_BUF_SIZE (16*1024) /* buffer which can hold minimum 10 consecutive mp3 frames (~16KB) worst case */ -/*#define MINIMP3_SCAN_LIMIT (256*1024)*/ /* how many bytes will be scanned to search first valid mp3 frame, to prevent stall on large non-mp3 files */ -#define MINIMP3_ENABLE_RING 0 /* WIP enable hardware magic ring buffer if available, to make less input buffer memmove(s) in callback IO mode */ - -/* return error codes */ -#define MP3D_E_PARAM -1 -#define MP3D_E_MEMORY -2 -#define MP3D_E_IOERROR -3 -#define MP3D_E_USER -4 /* can be used to stop processing from callbacks without indicating specific error */ -#define MP3D_E_DECODE -5 /* decode error which can't be safely skipped, such as sample rate, layer and channels change */ - -typedef struct -{ - mp3d_sample_t *buffer; - size_t samples; /* channels included, byte size = samples*sizeof(mp3d_sample_t) */ - int channels, hz, layer, avg_bitrate_kbps; -} mp3dec_file_info_t; - -typedef struct -{ - const uint8_t *buffer; - size_t size; -} mp3dec_map_info_t; - -typedef struct -{ - uint64_t sample; - uint64_t offset; -} mp3dec_frame_t; - -typedef struct -{ - mp3dec_frame_t *frames; - size_t num_frames, capacity; -} mp3dec_index_t; - -typedef size_t (*MP3D_READ_CB)(void *buf, size_t size, void *user_data); -typedef int (*MP3D_SEEK_CB)(uint64_t position, void *user_data); - -typedef struct -{ - MP3D_READ_CB read; - void *read_data; - MP3D_SEEK_CB seek; - void *seek_data; -} mp3dec_io_t; - -typedef struct -{ - mp3dec_t mp3d; - mp3dec_map_info_t file; - mp3dec_io_t *io; - mp3dec_index_t index; - uint64_t offset, samples, detected_samples, cur_sample, start_offset, end_offset; - mp3dec_frame_info_t info; - mp3d_sample_t buffer[MINIMP3_MAX_SAMPLES_PER_FRAME]; - size_t input_consumed, input_filled; - int is_file, flags, vbr_tag_found, indexes_built; - int free_format_bytes; - int buffer_samples, buffer_consumed, to_skip, start_delay; - int last_error; -} mp3dec_ex_t; - -typedef int (*MP3D_ITERATE_CB)(void *user_data, const uint8_t *frame, int frame_size, int free_format_bytes, size_t buf_size, uint64_t offset, mp3dec_frame_info_t *info); -typedef int (*MP3D_PROGRESS_CB)(void *user_data, size_t file_size, uint64_t offset, mp3dec_frame_info_t *info); - -#ifdef __cplusplus -extern "C" { -#endif - -/* detect mp3/mpa format */ -int mp3dec_detect_buf(const uint8_t *buf, size_t buf_size); -int mp3dec_detect_cb(mp3dec_io_t *io, uint8_t *buf, size_t buf_size); -/* decode whole buffer block */ -int mp3dec_load_buf(mp3dec_t *dec, const uint8_t *buf, size_t buf_size, mp3dec_file_info_t *info, MP3D_PROGRESS_CB progress_cb, void *user_data); -int mp3dec_load_cb(mp3dec_t *dec, mp3dec_io_t *io, uint8_t *buf, size_t buf_size, mp3dec_file_info_t *info, MP3D_PROGRESS_CB progress_cb, void *user_data); -/* iterate through frames */ -int mp3dec_iterate_buf(const uint8_t *buf, size_t buf_size, MP3D_ITERATE_CB callback, void *user_data); -int mp3dec_iterate_cb(mp3dec_io_t *io, uint8_t *buf, size_t buf_size, MP3D_ITERATE_CB callback, void *user_data); -/* streaming decoder with seeking capability */ -int mp3dec_ex_open_buf(mp3dec_ex_t *dec, const uint8_t *buf, size_t buf_size, int flags); -int mp3dec_ex_open_cb(mp3dec_ex_t *dec, mp3dec_io_t *io, int flags); -void mp3dec_ex_close(mp3dec_ex_t *dec); -int mp3dec_ex_seek(mp3dec_ex_t *dec, uint64_t position); -size_t mp3dec_ex_read_frame(mp3dec_ex_t *dec, mp3d_sample_t **buf, mp3dec_frame_info_t *frame_info, size_t max_samples); -size_t mp3dec_ex_read(mp3dec_ex_t *dec, mp3d_sample_t *buf, size_t samples); -#ifndef MINIMP3_NO_STDIO -/* stdio versions of file detect, load, iterate and stream */ -int mp3dec_detect(const char *file_name); -int mp3dec_load(mp3dec_t *dec, const char *file_name, mp3dec_file_info_t *info, MP3D_PROGRESS_CB progress_cb, void *user_data); -int mp3dec_iterate(const char *file_name, MP3D_ITERATE_CB callback, void *user_data); -int mp3dec_ex_open(mp3dec_ex_t *dec, const char *file_name, int flags); -#ifdef _WIN32 -int mp3dec_detect_w(const wchar_t *file_name); -int mp3dec_load_w(mp3dec_t *dec, const wchar_t *file_name, mp3dec_file_info_t *info, MP3D_PROGRESS_CB progress_cb, void *user_data); -int mp3dec_iterate_w(const wchar_t *file_name, MP3D_ITERATE_CB callback, void *user_data); -int mp3dec_ex_open_w(mp3dec_ex_t *dec, const wchar_t *file_name, int flags); -#endif -#endif - -#ifdef __cplusplus -} -#endif -#endif /*MINIMP3_EXT_H*/ - -#ifdef MINIMP3_IMPLEMENTATION -#include - -static void mp3dec_skip_id3v1(const uint8_t *buf, size_t *pbuf_size) -{ - size_t buf_size = *pbuf_size; -#ifndef MINIMP3_NOSKIP_ID3V1 - if (buf_size >= 128 && !memcmp(buf + buf_size - 128, "TAG", 3)) - { - buf_size -= 128; - if (buf_size >= 227 && !memcmp(buf + buf_size - 227, "TAG+", 4)) - buf_size -= 227; - } -#endif -#ifndef MINIMP3_NOSKIP_APEV2 - if (buf_size > 32 && !memcmp(buf + buf_size - 32, "APETAGEX", 8)) - { - buf_size -= 32; - const uint8_t *tag = buf + buf_size + 8 + 4; - uint32_t tag_size = (uint32_t)(tag[3] << 24) | (tag[2] << 16) | (tag[1] << 8) | tag[0]; - if (buf_size >= tag_size) - buf_size -= tag_size; - } -#endif - *pbuf_size = buf_size; -} - -static size_t mp3dec_skip_id3v2(const uint8_t *buf, size_t buf_size) -{ -#define MINIMP3_ID3_DETECT_SIZE 10 -#ifndef MINIMP3_NOSKIP_ID3V2 - if (buf_size >= MINIMP3_ID3_DETECT_SIZE && !memcmp(buf, "ID3", 3) && !((buf[5] & 15) || (buf[6] & 0x80) || (buf[7] & 0x80) || (buf[8] & 0x80) || (buf[9] & 0x80))) - { - size_t id3v2size = (((buf[6] & 0x7f) << 21) | ((buf[7] & 0x7f) << 14) | ((buf[8] & 0x7f) << 7) | (buf[9] & 0x7f)) + 10; - if ((buf[5] & 16)) - id3v2size += 10; /* footer */ - return id3v2size; - } -#endif - return 0; -} - -static void mp3dec_skip_id3(const uint8_t **pbuf, size_t *pbuf_size) -{ - uint8_t *buf = (uint8_t *)(*pbuf); - size_t buf_size = *pbuf_size; - size_t id3v2size = mp3dec_skip_id3v2(buf, buf_size); - if (id3v2size) - { - if (id3v2size >= buf_size) - id3v2size = buf_size; - buf += id3v2size; - buf_size -= id3v2size; - } - mp3dec_skip_id3v1(buf, &buf_size); - *pbuf = (const uint8_t *)buf; - *pbuf_size = buf_size; -} - -static int mp3dec_check_vbrtag(const uint8_t *frame, int frame_size, uint32_t *frames, int *delay, int *padding) -{ - static const char g_xing_tag[4] = { 'X', 'i', 'n', 'g' }; - static const char g_info_tag[4] = { 'I', 'n', 'f', 'o' }; -#define FRAMES_FLAG 1 -#define BYTES_FLAG 2 -#define TOC_FLAG 4 -#define VBR_SCALE_FLAG 8 - /* Side info offsets after header: - / Mono Stereo - / MPEG1 17 32 - / MPEG2 & 2.5 9 17*/ - bs_t bs[1]; - L3_gr_info_t gr_info[4]; - bs_init(bs, frame + HDR_SIZE, frame_size - HDR_SIZE); - if (HDR_IS_CRC(frame)) - get_bits(bs, 16); - if (L3_read_side_info(bs, gr_info, frame) < 0) - return 0; /* side info corrupted */ - - const uint8_t *tag = frame + HDR_SIZE + bs->pos/8; - if (memcmp(g_xing_tag, tag, 4) && memcmp(g_info_tag, tag, 4)) - return 0; - int flags = tag[7]; - if (!((flags & FRAMES_FLAG))) - return -1; - tag += 8; - *frames = (uint32_t)(tag[0] << 24) | (tag[1] << 16) | (tag[2] << 8) | tag[3]; - tag += 4; - if (flags & BYTES_FLAG) - tag += 4; - if (flags & TOC_FLAG) - tag += 100; - if (flags & VBR_SCALE_FLAG) - tag += 4; - *delay = *padding = 0; - if (*tag) - { /* extension, LAME, Lavc, etc. Should be the same structure. */ - tag += 21; - if (tag - frame + 14 >= frame_size) - return 0; - *delay = ((tag[0] << 4) | (tag[1] >> 4)) + (528 + 1); - *padding = (((tag[1] & 0xF) << 8) | tag[2]) - (528 + 1); - } - return 1; -} - -int mp3dec_detect_buf(const uint8_t *buf, size_t buf_size) -{ - return mp3dec_detect_cb(0, (uint8_t *)buf, buf_size); -} - -int mp3dec_detect_cb(mp3dec_io_t *io, uint8_t *buf, size_t buf_size) -{ - if (!buf || (size_t)-1 == buf_size || (io && buf_size < MINIMP3_BUF_SIZE)) - return MP3D_E_PARAM; - size_t filled = buf_size; - if (io) - { - if (io->seek(0, io->seek_data)) - return MP3D_E_IOERROR; - filled = io->read(buf, MINIMP3_ID3_DETECT_SIZE, io->read_data); - if (filled > MINIMP3_ID3_DETECT_SIZE) - return MP3D_E_IOERROR; - } - if (filled < MINIMP3_ID3_DETECT_SIZE) - return MP3D_E_USER; /* too small, can't be mp3/mpa */ - if (mp3dec_skip_id3v2(buf, filled)) - return 0; /* id3v2 tag is enough evidence */ - if (io) - { - size_t readed = io->read(buf + MINIMP3_ID3_DETECT_SIZE, buf_size - MINIMP3_ID3_DETECT_SIZE, io->read_data); - if (readed > (buf_size - MINIMP3_ID3_DETECT_SIZE)) - return MP3D_E_IOERROR; - filled += readed; - if (filled < MINIMP3_BUF_SIZE) - mp3dec_skip_id3v1(buf, &filled); - } else - { - mp3dec_skip_id3v1(buf, &filled); - if (filled > MINIMP3_BUF_SIZE) - filled = MINIMP3_BUF_SIZE; - } - int free_format_bytes, frame_size; - mp3d_find_frame(buf, filled, &free_format_bytes, &frame_size); - if (frame_size) - return 0; /* MAX_FRAME_SYNC_MATCHES consecutive frames found */ - return MP3D_E_USER; -} - -int mp3dec_load_buf(mp3dec_t *dec, const uint8_t *buf, size_t buf_size, mp3dec_file_info_t *info, MP3D_PROGRESS_CB progress_cb, void *user_data) -{ - return mp3dec_load_cb(dec, 0, (uint8_t *)buf, buf_size, info, progress_cb, user_data); -} - -int mp3dec_load_cb(mp3dec_t *dec, mp3dec_io_t *io, uint8_t *buf, size_t buf_size, mp3dec_file_info_t *info, MP3D_PROGRESS_CB progress_cb, void *user_data) -{ - if (!dec || !buf || !info || (size_t)-1 == buf_size || (io && buf_size < MINIMP3_BUF_SIZE)) - return MP3D_E_PARAM; - uint64_t detected_samples = 0; - size_t orig_buf_size = buf_size; - int to_skip = 0; - mp3dec_frame_info_t frame_info; - memset(info, 0, sizeof(*info)); - memset(&frame_info, 0, sizeof(frame_info)); - - /* skip id3 */ - size_t filled = 0, consumed = 0; - int eof = 0, ret = 0; - if (io) - { - if (io->seek(0, io->seek_data)) - return MP3D_E_IOERROR; - filled = io->read(buf, MINIMP3_ID3_DETECT_SIZE, io->read_data); - if (filled > MINIMP3_ID3_DETECT_SIZE) - return MP3D_E_IOERROR; - if (MINIMP3_ID3_DETECT_SIZE != filled) - return 0; - size_t id3v2size = mp3dec_skip_id3v2(buf, filled); - if (id3v2size) - { - if (io->seek(id3v2size, io->seek_data)) - return MP3D_E_IOERROR; - filled = io->read(buf, buf_size, io->read_data); - if (filled > buf_size) - return MP3D_E_IOERROR; - } else - { - size_t readed = io->read(buf + MINIMP3_ID3_DETECT_SIZE, buf_size - MINIMP3_ID3_DETECT_SIZE, io->read_data); - if (readed > (buf_size - MINIMP3_ID3_DETECT_SIZE)) - return MP3D_E_IOERROR; - filled += readed; - } - if (filled < MINIMP3_BUF_SIZE) - mp3dec_skip_id3v1(buf, &filled); - } else - { - mp3dec_skip_id3((const uint8_t **)&buf, &buf_size); - if (!buf_size) - return 0; - } - /* try to make allocation size assumption by first frame or vbr tag */ - mp3dec_init(dec); - int samples; - do - { - uint32_t frames; - int i, delay, padding, free_format_bytes = 0, frame_size = 0; - const uint8_t *hdr; - if (io) - { - if (!eof && filled - consumed < MINIMP3_BUF_SIZE) - { /* keep minimum 10 consecutive mp3 frames (~16KB) worst case */ - memmove(buf, buf + consumed, filled - consumed); - filled -= consumed; - consumed = 0; - size_t readed = io->read(buf + filled, buf_size - filled, io->read_data); - if (readed > (buf_size - filled)) - return MP3D_E_IOERROR; - if (readed != (buf_size - filled)) - eof = 1; - filled += readed; - if (eof) - mp3dec_skip_id3v1(buf, &filled); - } - i = mp3d_find_frame(buf + consumed, filled - consumed, &free_format_bytes, &frame_size); - consumed += i; - hdr = buf + consumed; - } else - { - i = mp3d_find_frame(buf, buf_size, &free_format_bytes, &frame_size); - buf += i; - buf_size -= i; - hdr = buf; - } - if (i && !frame_size) - continue; - if (!frame_size) - return 0; - frame_info.channels = HDR_IS_MONO(hdr) ? 1 : 2; - frame_info.hz = hdr_sample_rate_hz(hdr); - frame_info.layer = 4 - HDR_GET_LAYER(hdr); - frame_info.bitrate_kbps = hdr_bitrate_kbps(hdr); - frame_info.frame_bytes = frame_size; - samples = hdr_frame_samples(hdr)*frame_info.channels; - if (3 != frame_info.layer) - break; - int ret = mp3dec_check_vbrtag(hdr, frame_size, &frames, &delay, &padding); - if (ret > 0) - { - padding *= frame_info.channels; - to_skip = delay*frame_info.channels; - detected_samples = samples*(uint64_t)frames; - if (detected_samples >= (uint64_t)to_skip) - detected_samples -= to_skip; - if (padding > 0 && detected_samples >= (uint64_t)padding) - detected_samples -= padding; - if (!detected_samples) - return 0; - } - if (ret) - { - if (io) - { - consumed += frame_size; - } else - { - buf += frame_size; - buf_size -= frame_size; - } - } - break; - } while(1); - size_t allocated = MINIMP3_MAX_SAMPLES_PER_FRAME*sizeof(mp3d_sample_t); - if (detected_samples) - allocated += detected_samples*sizeof(mp3d_sample_t); - else - allocated += (buf_size/frame_info.frame_bytes)*samples*sizeof(mp3d_sample_t); - info->buffer = (mp3d_sample_t*)malloc(allocated); - if (!info->buffer) - return MP3D_E_MEMORY; - /* save info */ - info->channels = frame_info.channels; - info->hz = frame_info.hz; - info->layer = frame_info.layer; - /* decode all frames */ - size_t avg_bitrate_kbps = 0, frames = 0; - do - { - if ((allocated - info->samples*sizeof(mp3d_sample_t)) < MINIMP3_MAX_SAMPLES_PER_FRAME*sizeof(mp3d_sample_t)) - { - allocated *= 2; - mp3d_sample_t *alloc_buf = (mp3d_sample_t*)realloc(info->buffer, allocated); - if (!alloc_buf) - return MP3D_E_MEMORY; - info->buffer = alloc_buf; - } - if (io) - { - if (!eof && filled - consumed < MINIMP3_BUF_SIZE) - { /* keep minimum 10 consecutive mp3 frames (~16KB) worst case */ - memmove(buf, buf + consumed, filled - consumed); - filled -= consumed; - consumed = 0; - size_t readed = io->read(buf + filled, buf_size - filled, io->read_data); - if (readed != (buf_size - filled)) - eof = 1; - filled += readed; - if (eof) - mp3dec_skip_id3v1(buf, &filled); - } - samples = mp3dec_decode_frame(dec, buf + consumed, filled - consumed, info->buffer + info->samples, &frame_info); - consumed += frame_info.frame_bytes; - } else - { - samples = mp3dec_decode_frame(dec, buf, MINIMP3_MIN(buf_size, (size_t)INT_MAX), info->buffer + info->samples, &frame_info); - buf += frame_info.frame_bytes; - buf_size -= frame_info.frame_bytes; - } - if (samples) - { - if (info->hz != frame_info.hz || info->layer != frame_info.layer) - { - ret = MP3D_E_DECODE; - break; - } - if (info->channels && info->channels != frame_info.channels) - { -#ifdef MINIMP3_ALLOW_MONO_STEREO_TRANSITION - info->channels = 0; /* mark file with mono-stereo transition */ -#else - ret = MP3D_E_DECODE; - break; -#endif - } - samples *= frame_info.channels; - if (to_skip) - { - size_t skip = MINIMP3_MIN(samples, to_skip); - to_skip -= skip; - samples -= skip; - memmove(info->buffer, info->buffer + skip, samples*sizeof(mp3d_sample_t)); - } - info->samples += samples; - avg_bitrate_kbps += frame_info.bitrate_kbps; - frames++; - if (progress_cb) - { - ret = progress_cb(user_data, orig_buf_size, orig_buf_size - buf_size, &frame_info); - if (ret) - break; - } - } - } while (frame_info.frame_bytes); - if (detected_samples && info->samples > detected_samples) - info->samples = detected_samples; /* cut padding */ - /* reallocate to normal buffer size */ - if (allocated != info->samples*sizeof(mp3d_sample_t)) - { - mp3d_sample_t *alloc_buf = (mp3d_sample_t*)realloc(info->buffer, info->samples*sizeof(mp3d_sample_t)); - if (!alloc_buf && info->samples) - return MP3D_E_MEMORY; - info->buffer = alloc_buf; - } - if (frames) - info->avg_bitrate_kbps = avg_bitrate_kbps/frames; - return ret; -} - -int mp3dec_iterate_buf(const uint8_t *buf, size_t buf_size, MP3D_ITERATE_CB callback, void *user_data) -{ - const uint8_t *orig_buf = buf; - if (!buf || (size_t)-1 == buf_size || !callback) - return MP3D_E_PARAM; - /* skip id3 */ - mp3dec_skip_id3(&buf, &buf_size); - if (!buf_size) - return 0; - mp3dec_frame_info_t frame_info; - memset(&frame_info, 0, sizeof(frame_info)); - do - { - int free_format_bytes = 0, frame_size = 0, ret; - int i = mp3d_find_frame(buf, buf_size, &free_format_bytes, &frame_size); - buf += i; - buf_size -= i; - if (i && !frame_size) - continue; - if (!frame_size) - break; - const uint8_t *hdr = buf; - frame_info.channels = HDR_IS_MONO(hdr) ? 1 : 2; - frame_info.hz = hdr_sample_rate_hz(hdr); - frame_info.layer = 4 - HDR_GET_LAYER(hdr); - frame_info.bitrate_kbps = hdr_bitrate_kbps(hdr); - frame_info.frame_bytes = frame_size; - - if (callback) - { - if ((ret = callback(user_data, hdr, frame_size, free_format_bytes, buf_size, hdr - orig_buf, &frame_info))) - return ret; - } - buf += frame_size; - buf_size -= frame_size; - } while (1); - return 0; -} - -int mp3dec_iterate_cb(mp3dec_io_t *io, uint8_t *buf, size_t buf_size, MP3D_ITERATE_CB callback, void *user_data) -{ - if (!io || !buf || (size_t)-1 == buf_size || buf_size < MINIMP3_BUF_SIZE || !callback) - return MP3D_E_PARAM; - size_t filled = io->read(buf, MINIMP3_ID3_DETECT_SIZE, io->read_data), consumed = 0; - uint64_t readed = 0; - mp3dec_frame_info_t frame_info; - int eof = 0; - memset(&frame_info, 0, sizeof(frame_info)); - if (filled > MINIMP3_ID3_DETECT_SIZE) - return MP3D_E_IOERROR; - if (MINIMP3_ID3_DETECT_SIZE != filled) - return 0; - size_t id3v2size = mp3dec_skip_id3v2(buf, filled); - if (id3v2size) - { - if (io->seek(id3v2size, io->seek_data)) - return MP3D_E_IOERROR; - filled = io->read(buf, buf_size, io->read_data); - if (filled > buf_size) - return MP3D_E_IOERROR; - readed += id3v2size; - } else - { - size_t readed = io->read(buf + MINIMP3_ID3_DETECT_SIZE, buf_size - MINIMP3_ID3_DETECT_SIZE, io->read_data); - if (readed > (buf_size - MINIMP3_ID3_DETECT_SIZE)) - return MP3D_E_IOERROR; - filled += readed; - } - if (filled < MINIMP3_BUF_SIZE) - mp3dec_skip_id3v1(buf, &filled); - do - { - int free_format_bytes = 0, frame_size = 0, ret; - int i = mp3d_find_frame(buf + consumed, filled - consumed, &free_format_bytes, &frame_size); - if (i && !frame_size) - { - consumed += i; - continue; - } - if (!frame_size) - break; - const uint8_t *hdr = buf + consumed + i; - frame_info.channels = HDR_IS_MONO(hdr) ? 1 : 2; - frame_info.hz = hdr_sample_rate_hz(hdr); - frame_info.layer = 4 - HDR_GET_LAYER(hdr); - frame_info.bitrate_kbps = hdr_bitrate_kbps(hdr); - frame_info.frame_bytes = frame_size; - - readed += i; - if (callback) - { - if ((ret = callback(user_data, hdr, frame_size, free_format_bytes, filled - consumed, readed, &frame_info))) - return ret; - } - readed += frame_size; - consumed += i + frame_size; - if (!eof && filled - consumed < MINIMP3_BUF_SIZE) - { /* keep minimum 10 consecutive mp3 frames (~16KB) worst case */ - memmove(buf, buf + consumed, filled - consumed); - filled -= consumed; - consumed = 0; - size_t readed = io->read(buf + filled, buf_size - filled, io->read_data); - if (readed > (buf_size - filled)) - return MP3D_E_IOERROR; - if (readed != (buf_size - filled)) - eof = 1; - filled += readed; - if (eof) - mp3dec_skip_id3v1(buf, &filled); - } - } while (1); - return 0; -} - -static int mp3dec_load_index(void *user_data, const uint8_t *frame, int frame_size, int free_format_bytes, size_t buf_size, uint64_t offset, mp3dec_frame_info_t *info) -{ - mp3dec_frame_t *idx_frame; - mp3dec_ex_t *dec = (mp3dec_ex_t *)user_data; - if (!dec->index.frames && !dec->start_offset) - { /* detect VBR tag and try to avoid full scan */ - uint32_t frames; - int delay, padding; - dec->info = *info; - dec->start_offset = dec->offset = offset; - dec->end_offset = offset + buf_size; - dec->free_format_bytes = free_format_bytes; /* should not change */ - if (3 == dec->info.layer) - { - int ret = mp3dec_check_vbrtag(frame, frame_size, &frames, &delay, &padding); - if (ret) - dec->start_offset = dec->offset = offset + frame_size; - if (ret > 0) - { - padding *= info->channels; - dec->start_delay = dec->to_skip = delay*info->channels; - dec->samples = hdr_frame_samples(frame)*info->channels*(uint64_t)frames; - if (dec->samples >= (uint64_t)dec->start_delay) - dec->samples -= dec->start_delay; - if (padding > 0 && dec->samples >= (uint64_t)padding) - dec->samples -= padding; - dec->detected_samples = dec->samples; - dec->vbr_tag_found = 1; - return MP3D_E_USER; - } else if (ret < 0) - return 0; - } - } - if (dec->flags & MP3D_DO_NOT_SCAN) - return MP3D_E_USER; - if (dec->index.num_frames + 1 > dec->index.capacity) - { - if (!dec->index.capacity) - dec->index.capacity = 4096; - else - dec->index.capacity *= 2; - mp3dec_frame_t *alloc_buf = (mp3dec_frame_t *)realloc((void*)dec->index.frames, sizeof(mp3dec_frame_t)*dec->index.capacity); - if (!alloc_buf) - return MP3D_E_MEMORY; - dec->index.frames = alloc_buf; - } - idx_frame = &dec->index.frames[dec->index.num_frames++]; - idx_frame->offset = offset; - idx_frame->sample = dec->samples; - if (!dec->buffer_samples && dec->index.num_frames < 256) - { /* for some cutted mp3 frames, bit-reservoir not filled and decoding can't be started from first frames */ - /* try to decode up to 255 first frames till samples starts to decode */ - dec->buffer_samples = mp3dec_decode_frame(&dec->mp3d, frame, MINIMP3_MIN(buf_size, (size_t)INT_MAX), dec->buffer, info); - dec->samples += dec->buffer_samples*info->channels; - } else - dec->samples += hdr_frame_samples(frame)*info->channels; - return 0; -} - -int mp3dec_ex_open_buf(mp3dec_ex_t *dec, const uint8_t *buf, size_t buf_size, int flags) -{ - if (!dec || !buf || (size_t)-1 == buf_size || (flags & (~MP3D_FLAGS_MASK))) - return MP3D_E_PARAM; - memset(dec, 0, sizeof(*dec)); - dec->file.buffer = buf; - dec->file.size = buf_size; - dec->flags = flags; - mp3dec_init(&dec->mp3d); - int ret = mp3dec_iterate_buf(dec->file.buffer, dec->file.size, mp3dec_load_index, dec); - if (ret && MP3D_E_USER != ret) - return ret; - mp3dec_init(&dec->mp3d); - dec->buffer_samples = 0; - dec->indexes_built = !(dec->vbr_tag_found || (flags & MP3D_DO_NOT_SCAN)); - dec->flags &= (~MP3D_DO_NOT_SCAN); - return 0; -} - -#ifndef MINIMP3_SEEK_IDX_LINEAR_SEARCH -static size_t mp3dec_idx_binary_search(mp3dec_index_t *idx, uint64_t position) -{ - size_t end = idx->num_frames, start = 0, index = 0; - while (start <= end) - { - size_t mid = (start + end) / 2; - if (idx->frames[mid].sample >= position) - { /* move left side. */ - if (idx->frames[mid].sample == position) - return mid; - end = mid - 1; - } else - { /* move to right side */ - index = mid; - start = mid + 1; - if (start == idx->num_frames) - break; - } - } - return index; -} -#endif - -int mp3dec_ex_seek(mp3dec_ex_t *dec, uint64_t position) -{ - size_t i; - if (!dec) - return MP3D_E_PARAM; - if (!(dec->flags & MP3D_SEEK_TO_SAMPLE)) - { - if (dec->io) - { - dec->offset = position; - } else - { - dec->offset = MINIMP3_MIN(position, dec->file.size); - } - dec->cur_sample = 0; - goto do_exit; - } - dec->cur_sample = position; - position += dec->start_delay; - if (0 == position) - { /* optimize seek to zero, no index needed */ -seek_zero: - dec->offset = dec->start_offset; - dec->to_skip = 0; - goto do_exit; - } - if (!dec->indexes_built) - { /* no index created yet (vbr tag used to calculate track length or MP3D_DO_NOT_SCAN open flag used) */ - dec->indexes_built = 1; - dec->samples = 0; - dec->buffer_samples = 0; - if (dec->io) - { - if (dec->io->seek(dec->start_offset, dec->io->seek_data)) - return MP3D_E_IOERROR; - int ret = mp3dec_iterate_cb(dec->io, (uint8_t *)dec->file.buffer, dec->file.size, mp3dec_load_index, dec); - if (ret && MP3D_E_USER != ret) - return ret; - } else - { - int ret = mp3dec_iterate_buf(dec->file.buffer + dec->start_offset, dec->file.size - dec->start_offset, mp3dec_load_index, dec); - if (ret && MP3D_E_USER != ret) - return ret; - } - for (i = 0; i < dec->index.num_frames; i++) - dec->index.frames[i].offset += dec->start_offset; - dec->samples = dec->detected_samples; - } - if (!dec->index.frames) - goto seek_zero; /* no frames in file - seek to zero */ -#ifdef MINIMP3_SEEK_IDX_LINEAR_SEARCH - for (i = 0; i < dec->index.num_frames; i++) - { - if (dec->index.frames[i].sample >= position) - break; - } -#else - i = mp3dec_idx_binary_search(&dec->index, position); -#endif - if (i) - { - int to_fill_bytes = 511; - int skip_frames = MINIMP3_PREDECODE_FRAMES -#ifdef MINIMP3_SEEK_IDX_LINEAR_SEARCH - + ((dec->index.frames[i].sample == position) ? 0 : 1) -#endif - ; - i -= MINIMP3_MIN(i, (size_t)skip_frames); - if (3 == dec->info.layer) - { - while (i && to_fill_bytes) - { /* make sure bit-reservoir is filled when we start decoding */ - bs_t bs[1]; - L3_gr_info_t gr_info[4]; - int frame_bytes, frame_size; - const uint8_t *hdr; - if (dec->io) - { - hdr = dec->file.buffer; - if (dec->io->seek(dec->index.frames[i - 1].offset, dec->io->seek_data)) - return MP3D_E_IOERROR; - size_t readed = dec->io->read((uint8_t *)hdr, HDR_SIZE, dec->io->read_data); - if (readed != HDR_SIZE) - return MP3D_E_IOERROR; - frame_size = hdr_frame_bytes(hdr, dec->free_format_bytes) + hdr_padding(hdr); - readed = dec->io->read((uint8_t *)hdr + HDR_SIZE, frame_size - HDR_SIZE, dec->io->read_data); - if (readed != (size_t)(frame_size - HDR_SIZE)) - return MP3D_E_IOERROR; - bs_init(bs, hdr + HDR_SIZE, frame_size - HDR_SIZE); - } else - { - hdr = dec->file.buffer + dec->index.frames[i - 1].offset; - frame_size = hdr_frame_bytes(hdr, dec->free_format_bytes) + hdr_padding(hdr); - bs_init(bs, hdr + HDR_SIZE, frame_size - HDR_SIZE); - } - if (HDR_IS_CRC(hdr)) - get_bits(bs, 16); - i--; - if (L3_read_side_info(bs, gr_info, hdr) < 0) - break; /* frame not decodable, we can start from here */ - frame_bytes = (bs->limit - bs->pos)/8; - to_fill_bytes -= MINIMP3_MIN(to_fill_bytes, frame_bytes); - } - } - } - dec->offset = dec->index.frames[i].offset; - dec->to_skip = position - dec->index.frames[i].sample; - while ((i + 1) < dec->index.num_frames && !dec->index.frames[i].sample && !dec->index.frames[i + 1].sample) - { /* skip not decodable first frames */ - const uint8_t *hdr; - if (dec->io) - { - hdr = dec->file.buffer; - if (dec->io->seek(dec->index.frames[i].offset, dec->io->seek_data)) - return MP3D_E_IOERROR; - size_t readed = dec->io->read((uint8_t *)hdr, HDR_SIZE, dec->io->read_data); - if (readed != HDR_SIZE) - return MP3D_E_IOERROR; - } else - hdr = dec->file.buffer + dec->index.frames[i].offset; - dec->to_skip += hdr_frame_samples(hdr)*dec->info.channels; - i++; - } -do_exit: - if (dec->io) - { - if (dec->io->seek(dec->offset, dec->io->seek_data)) - return MP3D_E_IOERROR; - } - dec->buffer_samples = 0; - dec->buffer_consumed = 0; - dec->input_consumed = 0; - dec->input_filled = 0; - dec->last_error = 0; - mp3dec_init(&dec->mp3d); - return 0; -} - -size_t mp3dec_ex_read_frame(mp3dec_ex_t *dec, mp3d_sample_t **buf, mp3dec_frame_info_t *frame_info, size_t max_samples) -{ - if (!dec || !buf || !frame_info) - { - if (dec) - dec->last_error = MP3D_E_PARAM; - return 0; - } - if (dec->detected_samples && dec->cur_sample >= dec->detected_samples) - return 0; /* at end of stream */ - if (dec->last_error) - return 0; /* error eof state, seek can reset it */ - *buf = NULL; - uint64_t end_offset = dec->end_offset ? dec->end_offset : dec->file.size; - int eof = 0; - while (dec->buffer_consumed == dec->buffer_samples) - { - const uint8_t *dec_buf; - if (dec->io) - { - if (!eof && (dec->input_filled - dec->input_consumed) < MINIMP3_BUF_SIZE) - { /* keep minimum 10 consecutive mp3 frames (~16KB) worst case */ - memmove((uint8_t*)dec->file.buffer, (uint8_t*)dec->file.buffer + dec->input_consumed, dec->input_filled - dec->input_consumed); - dec->input_filled -= dec->input_consumed; - dec->input_consumed = 0; - size_t readed = dec->io->read((uint8_t*)dec->file.buffer + dec->input_filled, dec->file.size - dec->input_filled, dec->io->read_data); - if (readed > (dec->file.size - dec->input_filled)) - { - dec->last_error = MP3D_E_IOERROR; - readed = 0; - } - if (readed != (dec->file.size - dec->input_filled)) - eof = 1; - dec->input_filled += readed; - if (eof) - mp3dec_skip_id3v1((uint8_t*)dec->file.buffer, &dec->input_filled); - } - dec_buf = dec->file.buffer + dec->input_consumed; - if (!(dec->input_filled - dec->input_consumed)) - return 0; - dec->buffer_samples = mp3dec_decode_frame(&dec->mp3d, dec_buf, dec->input_filled - dec->input_consumed, dec->buffer, frame_info); - dec->input_consumed += frame_info->frame_bytes; - } else - { - dec_buf = dec->file.buffer + dec->offset; - uint64_t buf_size = end_offset - dec->offset; - if (!buf_size) - return 0; - dec->buffer_samples = mp3dec_decode_frame(&dec->mp3d, dec_buf, MINIMP3_MIN(buf_size, (uint64_t)INT_MAX), dec->buffer, frame_info); - } - dec->buffer_consumed = 0; - if (dec->info.hz != frame_info->hz || dec->info.layer != frame_info->layer) - { -return_e_decode: - dec->last_error = MP3D_E_DECODE; - return 0; - } - if (dec->buffer_samples) - { - dec->buffer_samples *= frame_info->channels; - if (dec->to_skip) - { - size_t skip = MINIMP3_MIN(dec->buffer_samples, dec->to_skip); - dec->buffer_consumed += skip; - dec->to_skip -= skip; - } - if ( -#ifdef MINIMP3_ALLOW_MONO_STEREO_TRANSITION - !(dec->flags & MP3D_ALLOW_MONO_STEREO_TRANSITION) && -#endif - dec->buffer_consumed != dec->buffer_samples && dec->info.channels != frame_info->channels) - { - goto return_e_decode; - } - } else if (dec->to_skip) - { /* In mp3 decoding not always can start decode from any frame because of bit reservoir, - count skip samples for such frames */ - int frame_samples = hdr_frame_samples(dec_buf)*frame_info->channels; - dec->to_skip -= MINIMP3_MIN(frame_samples, dec->to_skip); - } - dec->offset += frame_info->frame_bytes; - } - size_t out_samples = MINIMP3_MIN((size_t)(dec->buffer_samples - dec->buffer_consumed), max_samples); - if (dec->detected_samples) - { /* count decoded samples to properly cut padding */ - if (dec->cur_sample + out_samples >= dec->detected_samples) - out_samples = dec->detected_samples - dec->cur_sample; - } - dec->cur_sample += out_samples; - *buf = dec->buffer + dec->buffer_consumed; - dec->buffer_consumed += out_samples; - return out_samples; -} - -size_t mp3dec_ex_read(mp3dec_ex_t *dec, mp3d_sample_t *buf, size_t samples) -{ - if (!dec || !buf) - { - if (dec) - dec->last_error = MP3D_E_PARAM; - return 0; - } - mp3dec_frame_info_t frame_info; - memset(&frame_info, 0, sizeof(frame_info)); - size_t samples_requested = samples; - while (samples) - { - mp3d_sample_t *buf_frame = NULL; - size_t read_samples = mp3dec_ex_read_frame(dec, &buf_frame, &frame_info, samples); - if (!read_samples) - { - break; - } - memcpy(buf, buf_frame, read_samples * sizeof(mp3d_sample_t)); - buf += read_samples; - samples -= read_samples; - } - return samples_requested - samples; -} - -int mp3dec_ex_open_cb(mp3dec_ex_t *dec, mp3dec_io_t *io, int flags) -{ - if (!dec || !io || (flags & (~MP3D_FLAGS_MASK))) - return MP3D_E_PARAM; - memset(dec, 0, sizeof(*dec)); -#ifdef MINIMP3_HAVE_RING - int ret; - if (ret = mp3dec_open_ring(&dec->file, MINIMP3_IO_SIZE)) - return ret; -#else - dec->file.size = MINIMP3_IO_SIZE; - dec->file.buffer = (const uint8_t*)malloc(dec->file.size); - if (!dec->file.buffer) - return MP3D_E_MEMORY; -#endif - dec->flags = flags; - dec->io = io; - mp3dec_init(&dec->mp3d); - if (io->seek(0, io->seek_data)) - return MP3D_E_IOERROR; - int ret = mp3dec_iterate_cb(io, (uint8_t *)dec->file.buffer, dec->file.size, mp3dec_load_index, dec); - if (ret && MP3D_E_USER != ret) - return ret; - if (dec->io->seek(dec->start_offset, dec->io->seek_data)) - return MP3D_E_IOERROR; - mp3dec_init(&dec->mp3d); - dec->buffer_samples = 0; - dec->indexes_built = !(dec->vbr_tag_found || (flags & MP3D_DO_NOT_SCAN)); - dec->flags &= (~MP3D_DO_NOT_SCAN); - return 0; -} - - -#ifndef MINIMP3_NO_STDIO - -#if defined(__linux__) || defined(__FreeBSD__) -#include -#include -#include -#include -#include -#include -#if !defined(_GNU_SOURCE) -#include -#include -#endif -#if !defined(MAP_POPULATE) && defined(__linux__) -#define MAP_POPULATE 0x08000 -#elif !defined(MAP_POPULATE) -#define MAP_POPULATE 0 -#endif - -static void mp3dec_close_file(mp3dec_map_info_t *map_info) -{ - if (map_info->buffer && MAP_FAILED != map_info->buffer) - munmap((void *)map_info->buffer, map_info->size); - map_info->buffer = 0; - map_info->size = 0; -} - -static int mp3dec_open_file(const char *file_name, mp3dec_map_info_t *map_info) -{ - if (!file_name) - return MP3D_E_PARAM; - int file; - struct stat st; - memset(map_info, 0, sizeof(*map_info)); -retry_open: - file = open(file_name, O_RDONLY); - if (file < 0 && (errno == EAGAIN || errno == EINTR)) - goto retry_open; - if (file < 0 || fstat(file, &st) < 0) - { - close(file); - return MP3D_E_IOERROR; - } - - map_info->size = st.st_size; -retry_mmap: - map_info->buffer = (const uint8_t *)mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE | MAP_POPULATE, file, 0); - if (MAP_FAILED == map_info->buffer && (errno == EAGAIN || errno == EINTR)) - goto retry_mmap; - close(file); - if (MAP_FAILED == map_info->buffer) - return MP3D_E_IOERROR; - return 0; -} - -#if MINIMP3_ENABLE_RING && defined(__linux__) && defined(_GNU_SOURCE) -#define MINIMP3_HAVE_RING -static void mp3dec_close_ring(mp3dec_map_info_t *map_info) -{ -#if defined(__linux__) && defined(_GNU_SOURCE) - if (map_info->buffer && MAP_FAILED != map_info->buffer) - munmap((void *)map_info->buffer, map_info->size*2); -#else - if (map_info->buffer) - { - shmdt(map_info->buffer); - shmdt(map_info->buffer + map_info->size); - } -#endif - map_info->buffer = 0; - map_info->size = 0; -} - -static int mp3dec_open_ring(mp3dec_map_info_t *map_info, size_t size) -{ - int memfd, page_size; -#if defined(__linux__) && defined(_GNU_SOURCE) - void *buffer; - int res; -#endif - memset(map_info, 0, sizeof(*map_info)); - -#ifdef _SC_PAGESIZE - page_size = sysconf(_SC_PAGESIZE); -#else - page_size = getpagesize(); -#endif - map_info->size = (size + page_size - 1)/page_size*page_size; - -#if defined(__linux__) && defined(_GNU_SOURCE) - memfd = memfd_create("mp3_ring", 0); - if (memfd < 0) - return MP3D_E_MEMORY; - -retry_ftruncate: - res = ftruncate(memfd, map_info->size); - if (res && (errno == EAGAIN || errno == EINTR)) - goto retry_ftruncate; - if (res) - goto error; - -retry_mmap: - map_info->buffer = (const uint8_t *)mmap(NULL, map_info->size*2, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); - if (MAP_FAILED == map_info->buffer && (errno == EAGAIN || errno == EINTR)) - goto retry_mmap; - if (MAP_FAILED == map_info->buffer || !map_info->buffer) - goto error; -retry_mmap2: - buffer = mmap((void *)map_info->buffer, map_info->size, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_SHARED, memfd, 0); - if (MAP_FAILED == map_info->buffer && (errno == EAGAIN || errno == EINTR)) - goto retry_mmap2; - if (MAP_FAILED == map_info->buffer || buffer != (void *)map_info->buffer) - goto error; -retry_mmap3: - buffer = mmap((void *)map_info->buffer + map_info->size, map_info->size, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_SHARED, memfd, 0); - if (MAP_FAILED == map_info->buffer && (errno == EAGAIN || errno == EINTR)) - goto retry_mmap3; - if (MAP_FAILED == map_info->buffer || buffer != (void *)(map_info->buffer + map_info->size)) - goto error; - - close(memfd); - return 0; -error: - close(memfd); - mp3dec_close_ring(map_info); - return MP3D_E_MEMORY; -#else - memfd = shmget(IPC_PRIVATE, map_info->size, IPC_CREAT | 0700); - if (memfd < 0) - return MP3D_E_MEMORY; -retry_mmap: - map_info->buffer = (const uint8_t *)mmap(NULL, map_info->size*2, PROT_NONE, MAP_PRIVATE, -1, 0); - if (MAP_FAILED == map_info->buffer && (errno == EAGAIN || errno == EINTR)) - goto retry_mmap; - if (MAP_FAILED == map_info->buffer) - goto error; - if (map_info->buffer != shmat(memfd, map_info->buffer, 0)) - goto error; - if ((map_info->buffer + map_info->size) != shmat(memfd, map_info->buffer + map_info->size, 0)) - goto error; - if (shmctl(memfd, IPC_RMID, NULL) < 0) - return MP3D_E_MEMORY; - return 0; -error: - shmctl(memfd, IPC_RMID, NULL); - mp3dec_close_ring(map_info); - return MP3D_E_MEMORY; -#endif -} -#endif /*MINIMP3_ENABLE_RING*/ -#elif defined(_WIN32) -#include - -static void mp3dec_close_file(mp3dec_map_info_t *map_info) -{ - if (map_info->buffer) - UnmapViewOfFile(map_info->buffer); - map_info->buffer = 0; - map_info->size = 0; -} - -static int mp3dec_open_file_h(HANDLE file, mp3dec_map_info_t *map_info) -{ - memset(map_info, 0, sizeof(*map_info)); - - HANDLE mapping = NULL; - LARGE_INTEGER s; - s.LowPart = GetFileSize(file, (DWORD*)&s.HighPart); - if (s.LowPart == INVALID_FILE_SIZE && GetLastError() != NO_ERROR) - goto error; - map_info->size = s.QuadPart; - - mapping = CreateFileMapping(file, NULL, PAGE_READONLY, 0, 0, NULL); - if (!mapping) - goto error; - map_info->buffer = (const uint8_t*)MapViewOfFile(mapping, FILE_MAP_READ, 0, 0, s.QuadPart); - CloseHandle(mapping); - if (!map_info->buffer) - goto error; - - CloseHandle(file); - return 0; -error: - mp3dec_close_file(map_info); - CloseHandle(file); - return MP3D_E_IOERROR; -} - -static int mp3dec_open_file(const char *file_name, mp3dec_map_info_t *map_info) -{ - if (!file_name) - return MP3D_E_PARAM; - HANDLE file = CreateFileA(file_name, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); - if (INVALID_HANDLE_VALUE == file) - return MP3D_E_IOERROR; - return mp3dec_open_file_h(file, map_info); -} - -static int mp3dec_open_file_w(const wchar_t *file_name, mp3dec_map_info_t *map_info) -{ - if (!file_name) - return MP3D_E_PARAM; - HANDLE file = CreateFileW(file_name, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); - if (INVALID_HANDLE_VALUE == file) - return MP3D_E_IOERROR; - return mp3dec_open_file_h(file, map_info); -} -#else -#include - -static void mp3dec_close_file(mp3dec_map_info_t *map_info) -{ - if (map_info->buffer) - free((void *)map_info->buffer); - map_info->buffer = 0; - map_info->size = 0; -} - -static int mp3dec_open_file(const char *file_name, mp3dec_map_info_t *map_info) -{ - if (!file_name) - return MP3D_E_PARAM; - memset(map_info, 0, sizeof(*map_info)); - FILE *file = fopen(file_name, "rb"); - if (!file) - return MP3D_E_IOERROR; - int res = MP3D_E_IOERROR; - long size = -1; - if (fseek(file, 0, SEEK_END)) - goto error; - size = ftell(file); - if (size < 0) - goto error; - map_info->size = (size_t)size; - if (fseek(file, 0, SEEK_SET)) - goto error; - map_info->buffer = (uint8_t *)malloc(map_info->size); - if (!map_info->buffer) - { - res = MP3D_E_MEMORY; - goto error; - } - if (fread((void *)map_info->buffer, 1, map_info->size, file) != map_info->size) - goto error; - fclose(file); - return 0; -error: - mp3dec_close_file(map_info); - fclose(file); - return res; -} -#endif - -static int mp3dec_detect_mapinfo(mp3dec_map_info_t *map_info) -{ - int ret = mp3dec_detect_buf(map_info->buffer, map_info->size); - mp3dec_close_file(map_info); - return ret; -} - -static int mp3dec_load_mapinfo(mp3dec_t *dec, mp3dec_map_info_t *map_info, mp3dec_file_info_t *info, MP3D_PROGRESS_CB progress_cb, void *user_data) -{ - int ret = mp3dec_load_buf(dec, map_info->buffer, map_info->size, info, progress_cb, user_data); - mp3dec_close_file(map_info); - return ret; -} - -static int mp3dec_iterate_mapinfo(mp3dec_map_info_t *map_info, MP3D_ITERATE_CB callback, void *user_data) -{ - int ret = mp3dec_iterate_buf(map_info->buffer, map_info->size, callback, user_data); - mp3dec_close_file(map_info); - return ret; -} - -static int mp3dec_ex_open_mapinfo(mp3dec_ex_t *dec, int flags) -{ - int ret = mp3dec_ex_open_buf(dec, dec->file.buffer, dec->file.size, flags); - dec->is_file = 1; - if (ret) - mp3dec_ex_close(dec); - return ret; -} - -int mp3dec_detect(const char *file_name) -{ - int ret; - mp3dec_map_info_t map_info; - if ((ret = mp3dec_open_file(file_name, &map_info))) - return ret; - return mp3dec_detect_mapinfo(&map_info); -} - -int mp3dec_load(mp3dec_t *dec, const char *file_name, mp3dec_file_info_t *info, MP3D_PROGRESS_CB progress_cb, void *user_data) -{ - int ret; - mp3dec_map_info_t map_info; - if ((ret = mp3dec_open_file(file_name, &map_info))) - return ret; - return mp3dec_load_mapinfo(dec, &map_info, info, progress_cb, user_data); -} - -int mp3dec_iterate(const char *file_name, MP3D_ITERATE_CB callback, void *user_data) -{ - int ret; - mp3dec_map_info_t map_info; - if ((ret = mp3dec_open_file(file_name, &map_info))) - return ret; - return mp3dec_iterate_mapinfo(&map_info, callback, user_data); -} - -int mp3dec_ex_open(mp3dec_ex_t *dec, const char *file_name, int flags) -{ - int ret; - if (!dec) - return MP3D_E_PARAM; - if ((ret = mp3dec_open_file(file_name, &dec->file))) - return ret; - return mp3dec_ex_open_mapinfo(dec, flags); -} - -void mp3dec_ex_close(mp3dec_ex_t *dec) -{ -#ifdef MINIMP3_HAVE_RING - if (dec->io) - mp3dec_close_ring(&dec->file); -#else - if (dec->io && dec->file.buffer) - free((void*)dec->file.buffer); -#endif - if (dec->is_file) - mp3dec_close_file(&dec->file); - if (dec->index.frames) - free(dec->index.frames); - memset(dec, 0, sizeof(*dec)); -} - -#ifdef _WIN32 -int mp3dec_detect_w(const wchar_t *file_name) -{ - int ret; - mp3dec_map_info_t map_info; - if ((ret = mp3dec_open_file_w(file_name, &map_info))) - return ret; - return mp3dec_detect_mapinfo(&map_info); -} - -int mp3dec_load_w(mp3dec_t *dec, const wchar_t *file_name, mp3dec_file_info_t *info, MP3D_PROGRESS_CB progress_cb, void *user_data) -{ - int ret; - mp3dec_map_info_t map_info; - if ((ret = mp3dec_open_file_w(file_name, &map_info))) - return ret; - return mp3dec_load_mapinfo(dec, &map_info, info, progress_cb, user_data); -} - -int mp3dec_iterate_w(const wchar_t *file_name, MP3D_ITERATE_CB callback, void *user_data) -{ - int ret; - mp3dec_map_info_t map_info; - if ((ret = mp3dec_open_file_w(file_name, &map_info))) - return ret; - return mp3dec_iterate_mapinfo(&map_info, callback, user_data); -} - -int mp3dec_ex_open_w(mp3dec_ex_t *dec, const wchar_t *file_name, int flags) -{ - int ret; - if ((ret = mp3dec_open_file_w(file_name, &dec->file))) - return ret; - return mp3dec_ex_open_mapinfo(dec, flags); -} -#endif -#else /* MINIMP3_NO_STDIO */ -void mp3dec_ex_close(mp3dec_ex_t *dec) -{ -#ifdef MINIMP3_HAVE_RING - if (dec->io) - mp3dec_close_ring(&dec->file); -#else - if (dec->io && dec->file.buffer) - free((void*)dec->file.buffer); -#endif - if (dec->index.frames) - free(dec->index.frames); - memset(dec, 0, sizeof(*dec)); -} -#endif - -#endif /*MINIMP3_IMPLEMENTATION*/ diff --git a/sources/LabSound/third_party/libnyquist/third_party/musepack/include/mpc/datatypes.h b/sources/LabSound/third_party/libnyquist/third_party/musepack/include/mpc/datatypes.h deleted file mode 100644 index 608ecfa2..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/musepack/include/mpc/datatypes.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Musepack audio compression - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#pragma once - -// mpcenc.h -#define CENTER 448 // offset for centering current data in Main-array -#define BLOCK 1152 // blocksize -#define ANABUFFER (BLOCK + CENTER) // size of PCM-data array for analysis - - -typedef struct { - float L [36]; - float R [36]; -} SubbandFloatTyp; - -typedef struct { - float L [ANABUFFER]; - float R [ANABUFFER]; - float M [ANABUFFER]; - float S [ANABUFFER]; -} PCMDataTyp; - diff --git a/sources/LabSound/third_party/libnyquist/third_party/musepack/include/mpc/minimax.h b/sources/LabSound/third_party/libnyquist/third_party/musepack/include/mpc/minimax.h deleted file mode 100644 index 11926265..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/musepack/include/mpc/minimax.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Musepack audio compression - * Copyright (C) 1999-2004 Buschmann/Klemm/Piecha/Wolf - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#pragma once - -# define clip(x,min,max) ( (x) < (min) ? (min) : (x) > (max) ? (max) : (x) ) - -#ifdef __cplusplus - -# define maxi(A,B) ( (A) >? (B) ) -# define mini(A,B) ( (A) ? (B) ) -# define mind(A,B) ( (A) ? (B) ) -# define minf(A,B) ( (A) (B) ? (A) : (B) ) -# define mini(A,B) ( (A) < (B) ? (A) : (B) ) -# define maxd(A,B) ( (A) > (B) ? (A) : (B) ) -# define mind(A,B) ( (A) < (B) ? (A) : (B) ) -# define maxf(A,B) ( (A) > (B) ? (A) : (B) ) -# define minf(A,B) ( (A) < (B) ? (A) : (B) ) - -#endif - -#ifdef __GNUC__ - -# define absi(A) abs (A) -# define absf(A) fabsf (A) -# define absd(A) fabs (A) - -#else - -# define absi(A) ( (A) >= 0 ? (A) : -(A) ) -# define absf(A) ( (A) >= 0.f ? (A) : -(A) ) -# define absd(A) ( (A) >= 0. ? (A) : -(A) ) - -#endif - diff --git a/sources/LabSound/third_party/libnyquist/third_party/musepack/include/mpc/mpc_types.h b/sources/LabSound/third_party/libnyquist/third_party/musepack/include/mpc/mpc_types.h deleted file mode 100644 index e750dc3c..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/musepack/include/mpc/mpc_types.h +++ /dev/null @@ -1,146 +0,0 @@ -/* - Copyright (c) 2005-2009, The Musepack Development Team - 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 the The Musepack Development Team nor the - names of its 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 _MPC_TYPES_H_ -#define _MPC_TYPES_H_ -#ifdef WIN32 -#pragma once -#endif - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef _MSC_VER -typedef __int8 mpc_int8_t; -typedef unsigned __int8 mpc_uint8_t; -typedef __int16 mpc_int16_t; -typedef unsigned __int16 mpc_uint16_t; -typedef __int32 mpc_int32_t; -typedef unsigned __int32 mpc_uint32_t; -typedef __int64 mpc_int64_t; -typedef unsigned __int64 mpc_uint64_t; -#define mpc_inline __inline -#else -#include -typedef int8_t mpc_int8_t; -typedef uint8_t mpc_uint8_t; -typedef int16_t mpc_int16_t; -typedef uint16_t mpc_uint16_t; -typedef int32_t mpc_int32_t; -typedef uint32_t mpc_uint32_t; -typedef int64_t mpc_int64_t; -typedef uint64_t mpc_uint64_t; -#define mpc_inline inline -#endif - -typedef int mpc_int_t; -typedef unsigned int mpc_uint_t; -typedef size_t mpc_size_t; -typedef mpc_uint8_t mpc_bool_t; - -// #define LONG_SEEK_TABLE -#ifdef LONG_SEEK_TABLE // define as needed (mpc_uint32_t supports files up to 512 MB) -typedef mpc_uint64_t mpc_seek_t; -#else -typedef mpc_uint32_t mpc_seek_t; -#endif - -# define mpc_int64_min -9223372036854775808ll -# define mpc_int64_max 9223372036854775807ll - -typedef struct mpc_quantizer { - mpc_int16_t L [36]; - mpc_int16_t R [36]; -} mpc_quantizer; - -/// Libmpcdec error codes -typedef enum mpc_status { - // Success. - MPC_STATUS_OK = 0, - // Generic failure (I/O error or invalid file). - MPC_STATUS_FAIL = -1 -} mpc_status; - - -#define MPC_FIXED_POINT_SHIFT 16 - -#ifdef MPC_FIXED_POINT -# define MPC_FIXED_POINT_FRACTPART 14 -# define MPC_FIXED_POINT_SCALE_SHIFT (MPC_FIXED_POINT_SHIFT + MPC_FIXED_POINT_FRACTPART) -# define MPC_FIXED_POINT_SCALE (1 << (MPC_FIXED_POINT_SCALE_SHIFT - 1)) -typedef mpc_int32_t MPC_SAMPLE_FORMAT; -#else -typedef float MPC_SAMPLE_FORMAT; -#endif - -enum { - MPC_FALSE = 0, - MPC_TRUE = !MPC_FALSE -}; - -//// 'Cdecl' forces the use of standard C/C++ calling convention /////// -#if defined _WIN32 -# define mpc_cdecl __cdecl -#elif defined __ZTC__ -# define mpc_cdecl _cdecl -#elif defined __TURBOC__ -# define mpc_cdecl cdecl -#else -# define mpc_cdecl -#endif - -/* DLL building support on win32 hosts */ -#ifndef MPC_API -# ifdef DLL_EXPORT /* defined by libtool (if required) */ -# define MPC_API __declspec(dllexport) -# endif -# ifdef MPC_DLL_IMPORT /* define if linking with this dll */ -# define MPC_API __declspec(dllimport) -# endif -# ifndef MPC_API /* static linking or !_WIN32 */ -# if defined(__GNUC__) && (__GNUC__ >= 4) -# define MPC_API __attribute__ ((visibility("default"))) -# else -# define MPC_API -# endif -# endif -#endif - -#ifdef __cplusplus -} -#endif -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/musepack/include/mpc/mpcdec.h b/sources/LabSound/third_party/libnyquist/third_party/musepack/include/mpc/mpcdec.h deleted file mode 100644 index c7235951..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/musepack/include/mpc/mpcdec.h +++ /dev/null @@ -1,148 +0,0 @@ -/* - Copyright (c) 2005-2009, The Musepack Development Team - 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 the The Musepack Development Team nor the - names of its 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. -*/ -/// \file mpcdec.h -/// Top level include file for libmpcdec. -#ifndef _MPCDEC_H_ -#define _MPCDEC_H_ -#ifdef WIN32 -#pragma once -#endif - -#include "reader.h" -#include "streaminfo.h" - -#ifdef __cplusplus -extern "C" { -#endif - -enum { - MPC_FRAME_LENGTH = (36 * 32), ///< Samples per mpc frame - MPC_DECODER_BUFFER_LENGTH = (MPC_FRAME_LENGTH * 4), ///< Required buffer size for decoder - MPC_DECODER_SYNTH_DELAY = 481 -}; - -typedef struct mpc_decoder_t mpc_decoder; -typedef struct mpc_demux_t mpc_demux; - -typedef struct mpc_bits_reader_t { - unsigned char * buff; /// pointer on current byte - unsigned int count; /// unread bits in current byte -} mpc_bits_reader; - -typedef struct mpc_frame_info_t { - mpc_uint32_t samples; /// number of samples in the frame (counting once for multiple channels) - mpc_int32_t bits; /// number of bits consumed by this frame (-1) if end of stream - MPC_SAMPLE_FORMAT * buffer; /// frame samples buffer (size = samples * channels * sizeof(MPC_SAMPLE_FORMAT)) - mpc_bool_t is_key_frame; /// 1 if this frame is a key frame (first in block) 0 else. Set by the demuxer. -} mpc_frame_info; - -typedef struct mpc_chap_info_t { - mpc_uint64_t sample; /// sample where the chapter starts - mpc_uint16_t gain; /// replaygain chapter value - mpc_uint16_t peak; /// peak chapter loudness level - mpc_uint_t tag_size; /// size of the tag element (0 if no tag is present for this chapter) - char * tag; /// pointer to an APEv2 tag without the preamble -} mpc_chap_info; - -/// Initializes mpc decoder with the supplied stream info parameters. -/// \param si streaminfo structure indicating format of source stream -/// \return pointer on the initialized decoder structure if successful, 0 if not -MPC_API mpc_decoder * mpc_decoder_init(mpc_streaminfo *si); - -/// Releases input mpc decoder -MPC_API void mpc_decoder_exit(mpc_decoder *p_dec); - -/** - * Sets decoder sample scaling factor. All decoded samples will be multiplied - * by this factor. Useful for applying replay gain. - * @param scale_factor multiplicative scaling factor - */ -MPC_API void mpc_decoder_scale_output(mpc_decoder *p_dec, double scale_factor); - -MPC_API void mpc_decoder_decode_frame(mpc_decoder * d, mpc_bits_reader * r, mpc_frame_info * i); - -// This is the gain reference used in old replaygain -#define MPC_OLD_GAIN_REF 64.82 - -/** - * init demuxer - * @param p_reader initialized mpc_reader pointer - * @return an initialized mpc_demux pointer - */ -MPC_API mpc_demux * mpc_demux_init(mpc_reader * p_reader); -/// free demuxer -MPC_API void mpc_demux_exit(mpc_demux * d); -/** - * Calls mpc_decoder_scale_output to set the scaling factor according to the - * replay gain stream information and the supplied ouput level - * @param d pointer to a musepack demuxer - * @param level the desired ouput level (in db). Must be MPC_OLD_GAIN_REF (64.82 db) if you want to get the old replaygain behavior - * @param use_gain set it to MPC_TRUE if you want to set the scaling factor according to the stream gain - * @param use_title MPC_TRUE : uses the title gain, MPC_FALSE : uses the album gain - * @param clip_prevention MPC_TRUE : uses cliping prevention - */ -MPC_API void mpc_set_replay_level(mpc_demux * d, float level, mpc_bool_t use_gain, - mpc_bool_t use_title, mpc_bool_t clip_prevention); -/// decode frame -MPC_API mpc_status mpc_demux_decode(mpc_demux * d, mpc_frame_info * i); -/// get streaminfo -MPC_API void mpc_demux_get_info(mpc_demux * d, mpc_streaminfo * i); -/// seeks to a given sample -MPC_API mpc_status mpc_demux_seek_sample(mpc_demux * d, mpc_uint64_t destsample); -/// seeks to a given second -MPC_API mpc_status mpc_demux_seek_second(mpc_demux * d, double seconds); - -/// \return the current position in the stream (in bits) from the beginning of the file -MPC_API mpc_seek_t mpc_demux_pos(mpc_demux * d); - -/// chapters : only for sv8 streams -/** - * Gets the number of chapters in the stream - * @param d pointer to a musepack demuxer - * @return the number of chapters found in the stream - */ -MPC_API mpc_int_t mpc_demux_chap_nb(mpc_demux * d); -/** - * Gets datas associated to a given chapter - * The chapter tag is an APEv2 tag without the preamble - * @param d pointer to a musepack demuxer - * @param chap_nb chapter number you want datas (from 0 to mpc_demux_chap_nb(d) - 1) - * @return the chapter information structure - */ -MPC_API mpc_chap_info const * mpc_demux_chap(mpc_demux * d, int chap_nb); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/musepack/include/mpc/mpcmath.h b/sources/LabSound/third_party/libnyquist/third_party/musepack/include/mpc/mpcmath.h deleted file mode 100644 index 3b42a458..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/musepack/include/mpc/mpcmath.h +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Musepack audio compression - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include - -#include - -typedef union mpc_floatint -{ - float f; - mpc_int32_t n; -} mpc_floatint; - -typedef union mpc_doubleint -{ - double d; - mpc_int32_t n[2]; -} mpc_doubleint; - -static mpc_inline mpc_int32_t mpc_lrintf(float fVal) -{ - mpc_floatint tmp; - tmp.f = fVal + 0x00FF8000; - return tmp.n - 0x4B7F8000; -} - -#define mpc_round32 mpc_lrintf -#define mpc_nearbyintf mpc_lrintf - - -#ifndef M_PI -# define M_PI 3.1415926535897932384626433832795029 // 4*atan(1) -# define M_PIl 3.1415926535897932384626433832795029L -# define M_LN2 0.6931471805599453094172321214581766 // ln(2) -# define M_LN2l 0.6931471805599453094172321214581766L -# define M_LN10 2.3025850929940456840179914546843642 // ln 10 */ -# define M_LN10l 2.3025850929940456840179914546843642L -#endif - -// fast but maybe more inaccurate, use if you need speed -#if defined(__GNUC__) && !defined(__APPLE__) -# define SIN(x) sinf ((float)(x)) -# define COS(x) cosf ((float)(x)) -# define ATAN2(x,y) atan2f ((float)(x), (float)(y)) -# define SQRT(x) sqrtf ((float)(x)) -# define LOG(x) logf ((float)(x)) -# define LOG10(x) log10f ((float)(x)) -# define POW(x,y) expf (logf(x) * (y)) -# define POW10(x) expf (M_LN10 * (x)) -# define FLOOR(x) floorf ((float)(x)) -# define IFLOOR(x) (int) floorf ((float)(x)) -# define FABS(x) fabsf ((float)(x)) -#else -# define SIN(x) (float) sin (x) -# define COS(x) (float) cos (x) -# define ATAN2(x,y) (float) atan2 (x, y) -# define SQRT(x) (float) sqrt (x) -# define LOG(x) (float) log (x) -# define LOG10(x) (float) log10 (x) -# define POW(x,y) (float) pow (x,y) -# define POW10(x) (float) pow (10., (x)) -# define FLOOR(x) (float) floor (x) -# define IFLOOR(x) (int) floor (x) -# define FABS(x) (float) fabs (x) -#endif - -#define SQRTF(x) SQRT (x) -#ifdef FAST_MATH -# define TABSTEP 64 -# define COSF(x) my_cos ((float)(x)) -# define ATAN2F(x,y) my_atan2 ((float)(x), (float)(y)) -# define IFLOORF(x) my_ifloor ((float)(x)) - -void Init_FastMath ( void ); -extern const float tabatan2 [] [2]; -extern const float tabcos [] [2]; -extern const float tabsqrt_ex []; -extern const float tabsqrt_m [] [2]; - -static mpc_inline float my_atan2 ( float x, float y ) -{ - float t, ret; int i; mpc_floatint mx, my; - - mx.f = x; - my.f = y; - if ( (mx.n & 0x7FFFFFFF) < (my.n & 0x7FFFFFFF) ) { - i = mpc_round32 (t = TABSTEP * (mx.f / my.f)); - ret = tabatan2 [1*TABSTEP+i][0] + tabatan2 [1*TABSTEP+i][1] * (t-i); - if ( my.n < 0 ) - ret = (float)(ret - M_PI); - } - else if ( mx.n < 0 ) { - i = mpc_round32 (t = TABSTEP * (my.f / mx.f)); - ret = - M_PI/2 - tabatan2 [1*TABSTEP+i][0] + tabatan2 [1*TABSTEP+i][1] * (i-t); - } - else if ( mx.n > 0 ) { - i = mpc_round32 (t = TABSTEP * (my.f / mx.f)); - ret = + M_PI/2 - tabatan2 [1*TABSTEP+i][0] + tabatan2 [1*TABSTEP+i][1] * (i-t); - } - else { - ret = 0.; - } - return ret; -} - - -static mpc_inline float my_cos ( float x ) -{ - float t, ret; int i; - i = mpc_round32 (t = TABSTEP * x); - ret = tabcos [13*TABSTEP+i][0] + tabcos [13*TABSTEP+i][1] * (t-i); - return ret; -} - - -static mpc_inline int my_ifloor ( float x ) -{ - mpc_floatint mx; - mx.f = (float) (x + (0x0C00000L + 0.500000001)); - return mx.n - 1262485505; -} - - -static mpc_inline float my_sqrt ( float x ) -{ - float ret; int i, ex; mpc_floatint mx; - mx.f = x; - ex = mx.n >> 23; // get the exponent - mx.n = (mx.n & 0x7FFFFF) | 0x42800000; // delete the exponent - i = mpc_round32 (mx.f); // Integer-part of the mantissa (round ????????????) - ret = tabsqrt_m [i-TABSTEP][0] + tabsqrt_m [i-TABSTEP][1] * (mx.f-i); // calculate value - ret *= tabsqrt_ex [ex]; - return ret; -} -#else -# define COSF(x) COS (x) -# define ATAN2F(x,y) ATAN2 (x,y) -# define IFLOORF(x) IFLOOR (x) -#endif - diff --git a/sources/LabSound/third_party/libnyquist/third_party/musepack/include/mpc/reader.h b/sources/LabSound/third_party/libnyquist/third_party/musepack/include/mpc/reader.h deleted file mode 100644 index 1a93e067..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/musepack/include/mpc/reader.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - Copyright (c) 2005-2009, The Musepack Development Team - 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 the The Musepack Development Team nor the - names of its 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. -*/ -/// \file reader.h -#ifndef _MPCDEC_READER_H_ -#define _MPCDEC_READER_H_ -#ifdef WIN32 -#pragma once -#endif - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -/// \brief Stream reader interface structure. -/// -/// This is the structure you must supply to the musepack decoding library -/// to feed it with raw data. Implement the five member functions to provide -/// a functional reader. -typedef struct mpc_reader_t mpc_reader; -struct mpc_reader_t { - /// Reads size bytes of data into buffer at ptr. - mpc_int32_t (*read)(mpc_reader *p_reader, void *ptr, mpc_int32_t size); - - /// Seeks to byte position offset. - mpc_bool_t (*seek)(mpc_reader *p_reader, mpc_int32_t offset); - - /// Returns the current byte offset in the stream. - mpc_int32_t (*tell)(mpc_reader *p_reader); - - /// Returns the total length of the source stream, in bytes. - mpc_int32_t (*get_size)(mpc_reader *p_reader); - - /// True if the stream is a seekable stream. - mpc_bool_t (*canseek)(mpc_reader *p_reader); - - /// Field that can be used to identify a particular instance of - /// reader or carry along data associated with that reader. - void *data; -}; - -/// Initializes reader with default stdio file reader implementation. Use -/// this if you're just reading from a plain file. -/// -/// \param r p_reader handle to initialize -/// \param filename input filename to attach to the reader -MPC_API mpc_status mpc_reader_init_stdio(mpc_reader *p_reader, const char *filename); - -/// Initializes reader with default stdio file reader implementation. Use -/// this if you prefer to open the file yourself. -/// -/// \param r p_reader handle to initialize -/// \param p_file input file handle (already open) -MPC_API mpc_status mpc_reader_init_stdio_stream(mpc_reader * p_reader, FILE * p_file); - -/// Release reader with default stdio file reader implementation. -/// -/// \param r reader handle to release -MPC_API void mpc_reader_exit_stdio(mpc_reader *p_reader); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/musepack/include/mpc/streaminfo.h b/sources/LabSound/third_party/libnyquist/third_party/musepack/include/mpc/streaminfo.h deleted file mode 100644 index a0a9470b..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/musepack/include/mpc/streaminfo.h +++ /dev/null @@ -1,109 +0,0 @@ -/* - Copyright (c) 2005-2009, The Musepack Development Team - 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 the The Musepack Development Team nor the - names of its 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. -*/ -/// \file streaminfo.h -#ifndef _MPCDEC_STREAMINFO_H_ -#define _MPCDEC_STREAMINFO_H_ -#ifdef WIN32 -#pragma once -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -typedef mpc_int32_t mpc_streaminfo_off_t; - -/// \brief mpc stream properties structure -/// -/// Structure containing all the properties of an mpc stream. Populated -/// by the streaminfo_read function. -typedef struct mpc_streaminfo { - /// @name Core mpc stream properties - //@{ - mpc_uint32_t sample_freq; ///< Sample frequency of stream - mpc_uint32_t channels; ///< Number of channels in stream - mpc_uint32_t stream_version; ///< Streamversion of stream - mpc_uint32_t bitrate; ///< Bitrate of stream file (in bps) - double average_bitrate; ///< Average bitrate of stream (in bits/sec) - mpc_uint32_t max_band; ///< Maximum band-index used in stream (0...31) - mpc_uint32_t ms; ///< Mid/side stereo (0: off, 1: on) - mpc_uint32_t fast_seek; ///< True if stream supports fast-seeking (sv7) - mpc_uint32_t block_pwr; ///< Number of frames in a block = 2^block_pwr (sv8) - //@} - - /// @name Replaygain properties - //@{ - mpc_uint16_t gain_title; ///< Replaygain title value - mpc_uint16_t gain_album; ///< Replaygain album value - mpc_uint16_t peak_album; ///< Peak album loudness level - mpc_uint16_t peak_title; ///< Peak title loudness level - //@} - - /// @name True gapless properties - //@{ - mpc_uint32_t is_true_gapless; ///< True gapless? (0: no, 1: yes) - mpc_uint64_t samples; ///< Number of samples in the stream - mpc_uint64_t beg_silence; ///< Number of samples that must not be played at the beginning of the stream - //@} - - /// @name Encoder informations - //@{ - mpc_uint32_t encoder_version; ///< Version of encoder used - char encoder[256]; ///< Encoder name - mpc_bool_t pns; ///< pns used - float profile; ///< Quality profile of stream - const char* profile_name; ///< Name of profile used by stream - //@} - - - mpc_streaminfo_off_t header_position; ///< Byte offset of position of header in stream - mpc_streaminfo_off_t tag_offset; ///< Offset to file tags - mpc_streaminfo_off_t total_file_length; ///< Total length of underlying file -} mpc_streaminfo; - -/// Gets length of stream si, in seconds. -/// \return length of stream in seconds -MPC_API double mpc_streaminfo_get_length(mpc_streaminfo *si); - -/// Returns length of stream si, in samples. -/// \return length of stream in samples -MPC_API mpc_int64_t mpc_streaminfo_get_length_samples(mpc_streaminfo *si); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/crc32.c b/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/crc32.c deleted file mode 100644 index 2e9cc119..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/crc32.c +++ /dev/null @@ -1,56 +0,0 @@ -/* -* C Implementation: crc32 -* -* code from http://www.w3.org/TR/PNG/#D-CRCAppendix -* -*/ - -/* Table of CRCs of all 8-bit messages. */ -static unsigned long crc_table[256]; - -/* Flag: has the table been computed? Initially false. */ -static int crc_table_computed = 0; - -/* Make the table for a fast CRC. */ -static void make_crc_table(void) -{ - unsigned long c; - int n, k; - - for (n = 0; n < 256; n++) { - c = (unsigned long) n; - for (k = 0; k < 8; k++) { - if (c & 1) - c = 0xedb88320L ^ (c >> 1); - else - c = c >> 1; - } - crc_table[n] = c; - } - crc_table_computed = 1; -} - - -/* Update a running CRC with the bytes buf[0..len-1]--the CRC - should be initialized to all 1's, and the transmitted value - is the 1's complement of the final running CRC (see the - crc() routine below). */ - -static unsigned long update_crc(unsigned long crc, unsigned char *buf, int len) -{ - unsigned long c = crc; - int n; - - if (!crc_table_computed) - make_crc_table(); - for (n = 0; n < len; n++) { - c = crc_table[(c ^ buf[n]) & 0xff] ^ (c >> 8); - } - return c; -} - -/* Return the CRC of the bytes buf[0..len-1]. */ -unsigned long mpc_crc32(unsigned char *buf, int len) -{ - return update_crc(0xffffffffL, buf, len) ^ 0xffffffffL; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/decoder.h b/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/decoder.h deleted file mode 100644 index 3813fc02..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/decoder.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - Copyright (c) 2005-2009, The Musepack Development Team - 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 the The Musepack Development Team nor the - names of its 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. -*/ -/// \file decoder.h -#ifndef _MPCDEC_DECODER_H_ -#define _MPCDEC_DECODER_H_ -#ifdef WIN32 -#pragma once -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#define SEEKING_TABLE_SIZE 256u -// set it to SLOW_SEEKING_WINDOW to not use fast seeking -#define FAST_SEEKING_WINDOW 32 -// set it to FAST_SEEKING_WINDOW to only use fast seeking -#define SLOW_SEEKING_WINDOW 0x80000000 - -enum { - MPC_V_MEM = 2304, - MPC_DECODER_MEMSIZE = 16384, // overall buffer size -}; - -struct mpc_decoder_t { - /// @name internal state variables - //@{ - mpc_uint32_t stream_version; ///< Streamversion of stream - mpc_int32_t max_band; ///< Maximum band-index used in stream (0...31) - mpc_uint32_t ms; ///< Mid/side stereo (0: off, 1: on) - mpc_uint32_t channels; ///< Number of channels in stream - - mpc_uint64_t samples; ///< Number of samples in stream - - mpc_uint64_t decoded_samples; ///< Number of samples decoded from file begining - mpc_uint32_t samples_to_skip; ///< Number samples to skip (used for seeking) - mpc_int32_t last_max_band; ///< number of bands used in the last frame - - // randomizer state variables - mpc_uint32_t __r1; - mpc_uint32_t __r2; - - mpc_int32_t SCF_Index_L [32] [3]; - mpc_int32_t SCF_Index_R [32] [3]; // holds scalefactor-indices - mpc_quantizer Q [32]; // holds quantized samples - mpc_int32_t Res_L [32]; - mpc_int32_t Res_R [32]; // holds the chosen quantizer for each subband - mpc_bool_t DSCF_Flag_L [32]; - mpc_bool_t DSCF_Flag_R [32]; // differential SCF used? - mpc_int32_t SCFI_L [32]; - mpc_int32_t SCFI_R [32]; // describes order of transmitted SCF - mpc_bool_t MS_Flag[32]; // MS used? -#ifdef MPC_FIXED_POINT - mpc_uint8_t SCF_shift[256]; -#endif - - MPC_SAMPLE_FORMAT V_L[MPC_V_MEM + 960]; - MPC_SAMPLE_FORMAT V_R[MPC_V_MEM + 960]; - MPC_SAMPLE_FORMAT Y_L[36][32]; - MPC_SAMPLE_FORMAT Y_R[36][32]; - MPC_SAMPLE_FORMAT SCF[256]; ///< holds adapted scalefactors (for clipping prevention) - //@} -}; - -#ifdef __cplusplus -} -#endif -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/huffman.c b/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/huffman.c deleted file mode 100644 index 52cdfd92..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/huffman.c +++ /dev/null @@ -1,358 +0,0 @@ -/* - Copyright (c) 2005-2009, The Musepack Development Team - 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 the The Musepack Development Team nor the - names of its 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. -*/ -/// \file huffman.c -/// Implementations of sv7/sv8 huffman decoding functions. -#include "huffman.h" - - -// sv7 huffman tables -static const mpc_huffman mpc_table_HuffHdr [10] = { -{0x8000, 1, 0}, {0x6000, 3, 1}, {0x5e00, 7, -4}, {0x5d80, 9, 3}, {0x5d00, 9, 4}, {0x5c00, 8, -5}, {0x5800, 6, 2}, {0x5000, 5, -3}, {0x4000, 4, -2}, {0x0, 2, -1} -}; -mpc_lut_data mpc_HuffHdr = {mpc_table_HuffHdr}; - -const mpc_huffman mpc_table_HuffSCFI [4] = { - {0x8000, 1, 1}, {0x6000, 3, 2}, {0x4000, 3, 0}, {0x0, 2, 3} -}; - -static const mpc_huffman mpc_table_HuffDSCF [16] = { - {0xf800, 5, 5}, {0xf000, 5, -4}, {0xe000, 4, 3}, {0xd000, 4, -3}, {0xc000, 4, 8}, {0xa000, 3, 1}, {0x9000, 4, 0}, {0x8800, 5, -5}, {0x8400, 6, 7}, {0x8000, 6, -7}, {0x6000, 3, -1}, {0x4000, 3, 2}, {0x3000, 4, 4}, {0x2800, 5, 6}, {0x2000, 5, -6}, {0x0, 3, -2} -}; -mpc_lut_data mpc_HuffDSCF = {mpc_table_HuffDSCF}; - -static const mpc_huffman mpc_table_HuffQ1 [2] [27] = { - { - {0xe000, 3, 13}, {0xdc00, 6, 26}, {0xd800, 6, 0}, {0xd400, 6, 20}, {0xd000, 6, 6}, {0xc000, 4, 14}, {0xb000, 4, 12}, {0xa000, 4, 4}, {0x9000, 4, 22}, {0x8c00, 6, 8}, {0x8800, 6, 18}, {0x8400, 6, 24}, {0x8000, 6, 2}, {0x7000, 4, 16}, {0x6000, 4, 10}, {0x5800, 5, 17}, {0x5000, 5, 9}, {0x4800, 5, 1}, {0x4000, 5, 25}, {0x3800, 5, 5}, {0x3000, 5, 21}, {0x2800, 5, 3}, {0x2000, 5, 11}, {0x1800, 5, 15}, {0x1000, 5, 23}, {0x800, 5, 19}, {0x0, 5, 7} - }, { - {0x8000, 1, 13}, {0x7e00, 7, 15}, {0x7c00, 7, 1}, {0x7a00, 7, 11}, {0x7800, 7, 7}, {0x7600, 7, 17}, {0x7400, 7, 25}, {0x7200, 7, 19}, {0x7180, 9, 8}, {0x7100, 9, 18}, {0x7080, 9, 2}, {0x7000, 9, 24}, {0x6e00, 7, 3}, {0x6c00, 7, 23}, {0x6a00, 7, 21}, {0x6800, 7, 5}, {0x6700, 8, 0}, {0x6600, 8, 26}, {0x6500, 8, 6}, {0x6400, 8, 20}, {0x6000, 6, 9}, {0x5000, 4, 14}, {0x4000, 4, 12}, {0x3000, 4, 4}, {0x2000, 4, 22}, {0x1000, 4, 16}, {0x0, 4, 10} - } -}; - -static const mpc_huffman mpc_table_HuffQ2 [2] [25] = { - { - {0xf000, 4, 13}, {0xe000, 4, 17}, {0xd000, 4, 7}, {0xc000, 4, 11}, {0xbc00, 6, 1}, {0xb800, 6, 23}, {0xb600, 7, 4}, {0xb400, 7, 20}, {0xb200, 7, 0}, {0xb000, 7, 24}, {0xa800, 5, 22}, {0xa000, 5, 10}, {0x8000, 3, 12}, {0x7800, 5, 2}, {0x7000, 5, 14}, {0x6000, 4, 6}, {0x5000, 4, 18}, {0x4000, 4, 8}, {0x3000, 4, 16}, {0x2800, 5, 9}, {0x2000, 5, 5}, {0x1800, 5, 15}, {0x1000, 5, 21}, {0x800, 5, 19}, {0x0, 5, 3} - }, { - {0xf800, 5, 18}, {0xf000, 5, 6}, {0xe800, 5, 8}, {0xe700, 8, 3}, {0xe6c0, 10, 24}, {0xe680, 10, 4}, {0xe640, 10, 0}, {0xe600, 10, 20}, {0xe400, 7, 23}, {0xe200, 7, 1}, {0xe000, 7, 19}, {0xd800, 5, 16}, {0xd600, 7, 15}, {0xd400, 7, 21}, {0xd200, 7, 9}, {0xd000, 7, 5}, {0xcc00, 6, 2}, {0xc800, 6, 10}, {0xc400, 6, 14}, {0xc000, 6, 22}, {0x8000, 2, 12}, {0x6000, 3, 13}, {0x4000, 3, 17}, {0x2000, 3, 11}, {0x0, 3, 7} - } -}; - -static const mpc_huffman mpc_table_HuffQ3 [2] [7] = { - { - {0xe000, 3, 1}, {0xd000, 4, 3}, {0xc000, 4, -3}, {0xa000, 3, 2}, {0x8000, 3, -2}, {0x4000, 2, 0}, {0x0, 2, -1} - }, { - {0xc000, 2, 0}, {0x8000, 2, -1}, {0x4000, 2, 1}, {0x3000, 4, -2}, {0x2800, 5, 3}, {0x2000, 5, -3}, {0x0, 3, 2} - } -}; - -static const mpc_huffman mpc_table_HuffQ4 [2] [9] = { - { - {0xe000, 3, 0}, {0xc000, 3, -1}, {0xa000, 3, 1}, {0x8000, 3, -2}, {0x6000, 3, 2}, {0x5000, 4, -4}, {0x4000, 4, 4}, {0x2000, 3, 3}, {0x0, 3, -3} - }, { - {0xe000, 3, 1}, {0xd000, 4, 2}, {0xc000, 4, -3}, {0x8000, 2, 0}, {0x6000, 3, -2}, {0x5000, 4, 3}, {0x4800, 5, -4}, {0x4000, 5, 4}, {0x0, 2, -1} - } -}; - -static const mpc_huffman mpc_table_HuffQ5 [2] [15] = { - { - {0xf000, 4, 2}, {0xe800, 5, 5}, {0xe400, 6, -7}, {0xe000, 6, 7}, {0xd000, 4, -3}, {0xc000, 4, 3}, {0xb800, 5, -6}, {0xb000, 5, 6}, {0xa000, 4, -4}, {0x9000, 4, 4}, {0x8000, 4, -5}, {0x6000, 3, 0}, {0x4000, 3, -1}, {0x2000, 3, 1}, {0x0, 3, -2} - }, { - {0xf000, 4, 3}, {0xe800, 5, 4}, {0xe600, 7, 6}, {0xe500, 8, -7}, {0xe400, 8, 7}, {0xe000, 6, -6}, {0xc000, 3, 0}, {0xa000, 3, -1}, {0x8000, 3, 1}, {0x6000, 3, -2}, {0x4000, 3, 2}, {0x3800, 5, -5}, {0x3000, 5, 5}, {0x2000, 4, -4}, {0x0, 3, -3} - } -}; - -static const mpc_huffman mpc_table_HuffQ6 [2] [31] = { - { - {0xf800, 5, 3}, {0xf000, 5, -4}, {0xec00, 6, -11}, {0xe800, 6, 12}, {0xe000, 5, 4}, {0xd800, 5, 6}, {0xd000, 5, -5}, {0xc800, 5, 5}, {0xc000, 5, 7}, {0xb800, 5, -7}, {0xb400, 6, -12}, {0xb000, 6, -13}, {0xa800, 5, -6}, {0xa000, 5, 8}, {0x9800, 5, -8}, {0x9000, 5, 9}, {0x8800, 5, -9}, {0x8400, 6, 13}, {0x8200, 7, -15}, {0x8000, 7, 15}, {0x7000, 4, 0}, {0x6800, 5, -10}, {0x6000, 5, 10}, {0x5000, 4, -1}, {0x4000, 4, 2}, {0x3000, 4, 1}, {0x2000, 4, -2}, {0x1c00, 6, 14}, {0x1800, 6, -14}, {0x1000, 5, 11}, {0x0, 4, -3} - }, { - {0xf800, 5, -6}, {0xf000, 5, 6}, {0xe000, 4, 1}, {0xd000, 4, -1}, {0xce00, 7, 10}, {0xcc00, 7, -10}, {0xcb00, 8, -11}, {0xca80, 9, -12}, {0xca60, 11, 13}, {0xca58, 13, 15}, {0xca50, 13, -14}, {0xca48, 13, 14}, {0xca40, 13, -15}, {0xca00, 10, -13}, {0xc900, 8, 11}, {0xc800, 8, 12}, {0xc400, 6, -9}, {0xc000, 6, 9}, {0xb000, 4, -2}, {0xa000, 4, 2}, {0x9000, 4, 3}, {0x8000, 4, -3}, {0x7800, 5, -7}, {0x7000, 5, 7}, {0x6000, 4, -4}, {0x5000, 4, 4}, {0x4800, 5, -8}, {0x4000, 5, 8}, {0x3000, 4, 5}, {0x2000, 4, -5}, {0x0, 3, 0} - } -}; - -static const mpc_huffman mpc_table_HuffQ7 [2] [63] = { - { - {0xfc00, 6, 7}, {0xf800, 6, 8}, {0xf400, 6, 9}, {0xf000, 6, -8}, {0xec00, 6, 11}, {0xea00, 7, 21}, {0xe900, 8, -28}, {0xe800, 8, 28}, {0xe400, 6, -9}, {0xe200, 7, -22}, {0xe000, 7, -21}, {0xdc00, 6, -10}, {0xd800, 6, -11}, {0xd400, 6, 10}, {0xd000, 6, 12}, {0xcc00, 6, -13}, {0xca00, 7, 22}, {0xc800, 7, 23}, {0xc400, 6, -12}, {0xc000, 6, 13}, {0xbc00, 6, 14}, {0xb800, 6, -14}, {0xb600, 7, -23}, {0xb500, 8, -29}, {0xb400, 8, 29}, {0xb000, 6, -15}, {0xac00, 6, 15}, {0xa800, 6, 16}, {0xa400, 6, -16}, {0xa200, 7, -24}, {0xa000, 7, 24}, {0x9c00, 6, 17}, {0x9a00, 7, -25}, {0x9900, 8, -30}, {0x9800, 8, 30}, {0x9400, 6, -17}, {0x9000, 6, 18}, {0x8c00, 6, -18}, {0x8a00, 7, 25}, {0x8800, 7, 26}, {0x8400, 6, 19}, {0x8200, 7, -26}, {0x8000, 7, -27}, {0x7800, 5, 2}, {0x7400, 6, -19}, {0x7000, 6, 20}, {0x6800, 5, -1}, {0x6700, 8, -31}, {0x6600, 8, 31}, {0x6400, 7, 27}, {0x6000, 6, -20}, {0x5800, 5, 1}, {0x5000, 5, -5}, {0x4800, 5, -3}, {0x4000, 5, 3}, {0x3800, 5, 0}, {0x3000, 5, -2}, {0x2800, 5, -4}, {0x2000, 5, 4}, {0x1800, 5, 5}, {0x1000, 5, -6}, {0x800, 5, 6}, {0x0, 5, -7} - }, { - {0xf800, 5, -1}, {0xf000, 5, 2}, {0xe800, 5, -2}, {0xe000, 5, 3}, {0xdf00, 8, -20}, {0xdec0, 10, 24}, {0xdebc, 14, 28}, {0xdeb8, 14, -28}, {0xdeb4, 14, -30}, {0xdeb0, 14, 30}, {0xdea0, 12, -27}, {0xde9c, 14, 29}, {0xde98, 14, -29}, {0xde94, 14, 31}, {0xde90, 14, -31}, {0xde80, 12, 27}, {0xde00, 9, -22}, {0xdc00, 7, -17}, {0xd800, 6, -11}, {0xd000, 5, -3}, {0xc800, 5, 4}, {0xc000, 5, -4}, {0xbe00, 7, 17}, {0xbd00, 8, 20}, {0xbc80, 9, 22}, {0xbc40, 10, -25}, {0xbc00, 10, -26}, {0xb800, 6, 12}, {0xb000, 5, 5}, {0xa800, 5, -5}, {0xa000, 5, 6}, {0x9800, 5, -6}, {0x9400, 6, -12}, {0x9200, 7, -18}, {0x9000, 7, 18}, {0x8c00, 6, 13}, {0x8800, 6, -13}, {0x8000, 5, -7}, {0x7c00, 6, 14}, {0x7b00, 8, 21}, {0x7a00, 8, -21}, {0x7800, 7, -19}, {0x7000, 5, 7}, {0x6800, 5, 8}, {0x6400, 6, -14}, {0x6000, 6, -15}, {0x5800, 5, -8}, {0x5400, 6, 15}, {0x5200, 7, 19}, {0x51c0, 10, 25}, {0x5180, 10, 26}, {0x5100, 9, -23}, {0x5080, 9, 23}, {0x5000, 9, -24}, {0x4800, 5, -9}, {0x4000, 5, 9}, {0x3c00, 6, 16}, {0x3800, 6, -16}, {0x3000, 5, 10}, {0x2000, 4, 0}, {0x1800, 5, -10}, {0x1000, 5, 11}, {0x0, 4, 1} - } -}; - -mpc_lut_data mpc_HuffQ [7] [2] = { - {{mpc_table_HuffQ1[0]}, {mpc_table_HuffQ1[1]}}, - {{mpc_table_HuffQ2[0]}, {mpc_table_HuffQ2[1]}}, - {{mpc_table_HuffQ3[0]}, {mpc_table_HuffQ3[1]}}, - {{mpc_table_HuffQ4[0]}, {mpc_table_HuffQ4[1]}}, - {{mpc_table_HuffQ5[0]}, {mpc_table_HuffQ5[1]}}, - {{mpc_table_HuffQ6[0]}, {mpc_table_HuffQ6[1]}}, - {{mpc_table_HuffQ7[0]}, {mpc_table_HuffQ7[1]}} -}; - - -// sv8 huffman tables -static const mpc_huffman mpc_huff_SCFI_1 [3] = { - {0x8000, 1, 1}, {0x4000, 2, 2}, {0x0, 3, 3} -}; // 3 -static const mpc_int8_t mpc_sym_SCFI_1 [4] = { - 2, 3, 1, 0 -}; -static const mpc_huffman mpc_huff_SCFI_2 [5] = { - {0x8000, 2, 3}, {0x4000, 3, 5}, {0x1800, 5, 11}, {0x400, 6, 14}, {0x0, 7, 15} -}; // 5 -static const mpc_int8_t mpc_sym_SCFI_2 [16] = { - 15, 10, 14, 11, 13, 9, 7, 6, 5, 12, 8, 3, 2, 0, 4, 1 -}; -mpc_can_data mpc_can_SCFI[2] = {{mpc_huff_SCFI_1, mpc_sym_SCFI_1}, {mpc_huff_SCFI_2, mpc_sym_SCFI_2}}; - -static const mpc_huffman mpc_huff_DSCF_1 [12] = { - {0xa000, 3, 7}, {0x4000, 4, 12}, {0x2800, 5, 16}, {0x1800, 6, 21}, {0xe00, 7, 27}, {0x700, 8, 34}, {0x380, 9, 41}, {0x140, 10, 48}, {0x80, 11, 53}, {0x30, 12, 57}, {0x18, 13, 60}, {0x0, 14, 63} -}; // 12 -static const mpc_int8_t mpc_sym_DSCF_1 [64] = { - 35, 34, 33, 36, 32, 30, 29, 27, 26, 37, 28, 25, 39, 38, 24, 23, 40, 22, 21, 20, 19, 43, 42, 41, 18, 17, 16, 15, 46, 45, 44, 14, 13, 12, 11, 49, 48, 47, 31, 10, 9, 8, 7, 6, 52, 51, 50, 5, 4, 3, 54, 53, 2, 1, 0, 57, 56, 55, 63, 62, 61, 60, 59, 58 -}; -static const mpc_huffman mpc_huff_DSCF_2 [13] = { - {0x6000, 3, 7}, {0x3000, 4, 10}, {0x1800, 5, 13}, {0x1000, 6, 16}, {0xa00, 7, 20}, {0x600, 8, 25}, {0x380, 9, 31}, {0x1c0, 10, 38}, {0xe0, 11, 45}, {0x50, 12, 52}, {0x20, 13, 57}, {0xc, 14, 61}, {0x0, 15, 64} -}; // 13 -static const mpc_int8_t mpc_sym_DSCF_2 [65] = { - 33, 32, 31, 30, 29, 34, 28, 27, 36, 35, 26, 37, 25, 38, 24, 23, 40, 39, 22, 21, 42, 41, 20, 19, 18, 45, 44, 43, 17, 16, 15, 14, 48, 47, 46, 13, 12, 11, 10, 64, 52, 51, 50, 49, 9, 8, 7, 6, 55, 54, 53, 5, 4, 3, 58, 57, 56, 2, 1, 63, 62, 61, 60, 59, 0 -}; -mpc_can_data mpc_can_DSCF[2] = {{mpc_huff_DSCF_1, mpc_sym_DSCF_1}, {mpc_huff_DSCF_2, mpc_sym_DSCF_2}}; - -static const mpc_huffman mpc_huff_Bands [12] = { - {0x8000, 1, 1}, {0x4000, 2, 2}, {0x2000, 3, 3}, {0x1000, 5, 6}, {0x800, 6, 8}, {0x600, 7, 10}, {0x300, 8, 13}, {0x200, 9, 16}, {0x140, 10, 20}, {0xc0, 11, 25}, {0x10, 12, 31}, {0x0, 13, 32} -}; // 12 -static const mpc_int8_t mpc_sym_Bands [33] = { - 0, 32, 1, 31, 2, 30, 3, 4, 29, 6, 5, 28, 7, 27, 26, 8, 25, 24, 23, 9, 22, 21, 20, 18, 17, 16, 15, 14, 12, 11, 10, 19, 13 -}; -mpc_can_data mpc_can_Bands = {mpc_huff_Bands, mpc_sym_Bands}; - -static const mpc_huffman mpc_huff_Res_1 [16] = { - {0x8000, 1, 1}, {0x4000, 2, 2}, {0x2000, 3, 3}, {0x1000, 4, 4}, {0x800, 5, 5}, {0x400, 6, 6}, {0x200, 7, 7}, {0x100, 8, 8}, {0x80, 9, 9}, {0x40, 10, 10}, {0x20, 11, 11}, {0x10, 12, 12}, {0x8, 13, 13}, {0x4, 14, 14}, {0x2, 15, 15}, {0x0, 16, 16} -}; // 16 -static const mpc_int8_t mpc_sym_Res_1 [17] = { - 0, 1, 16, 2, 3, 4, 5, 15, 6, 7, 8, 9, 10, 11, 12, 14, 13 -}; -static const mpc_huffman mpc_huff_Res_2 [12] = { - {0x4000, 2, 3}, {0x2000, 3, 4}, {0x1000, 4, 5}, {0x800, 5, 6}, {0x400, 6, 7}, {0x200, 7, 8}, {0x100, 8, 9}, {0x80, 9, 10}, {0x40, 10, 11}, {0x20, 11, 12}, {0x10, 12, 13}, {0x0, 14, 16} -}; // 12 -static const mpc_int8_t mpc_sym_Res_2 [17] = { - 16, 1, 0, 2, 15, 3, 14, 4, 5, 13, 6, 12, 7, 11, 10, 9, 8 -}; -mpc_can_data mpc_can_Res[2] = {{mpc_huff_Res_1, mpc_sym_Res_1}, {mpc_huff_Res_2, mpc_sym_Res_2}}; - -static const mpc_huffman mpc_huff_Q1 [10] = { - {0x6000, 3, 7}, {0x1000, 4, 10}, {0x800, 5, 11}, {0x400, 6, 12}, {0x200, 7, 13}, {0x100, 8, 14}, {0x80, 9, 15}, {0x40, 10, 16}, {0x20, 11, 17}, {0x0, 12, 18} -}; // 10 -static const mpc_int8_t mpc_sym_Q1 [19] = { - 7, 6, 5, 4, 3, 10, 9, 8, 2, 1, 11, 0, 12, 13, 14, 15, 16, 18, 17 -}; -mpc_can_data mpc_can_Q1 = {mpc_huff_Q1, mpc_sym_Q1}; - -static const mpc_huffman mpc_huff_Q2_1 [10] = { - {0xe000, 3, 7}, {0x8000, 4, 14}, {0x3c00, 6, 38}, {0x2a00, 7, 53}, {0x1200, 8, 74}, {0x600, 9, 92}, {0x3c0, 10, 104}, {0x60, 11, 119}, {0x20, 12, 122}, {0x0, 13, 124} -}; // 10 -static const mpc_int8_t mpc_sym_Q2_1 [125] = { - 62, 87, 67, 63, 61, 57, 37, 93, 92, 88, 86, 83, 82, 81, 68, 66, 58, 56, 42, 41, 38, 36, 32, 31, 112, 91, 72, 64, 60, 52, 43, 33, 12, 117, 113, 111, 107, 97, 89, 85, 77, 73, 71, 69, 65, 59, 55, 53, 51, 47, 39, 35, 27, 17, 13, 11, 7, 118, 116, 108, 106, 98, 96, 94, 90, 84, 80, 78, 76, 48, 46, 44, 40, 34, 30, 28, 26, 18, 16, 8, 6, 122, 110, 102, 74, 70, 54, 50, 22, 2, 123, 121, 119, 115, 114, 109, 105, 103, 101, 99, 95, 79, 75, 49, 45, 29, 25, 23, 21, 19, 15, 14, 10, 9, 5, 3, 1, 124, 104, 20, 0, 120, 100, 24, 4 -}; -static const mpc_huffman mpc_huff_Q2_2 [9] = { - {0xf000, 4, 15}, {0x7000, 5, 30}, {0x4800, 6, 44}, {0x3c00, 7, 62}, {0xc00, 8, 92}, {0x780, 9, 104}, {0xc0, 10, 119}, {0x40, 11, 122}, {0x0, 12, 124} -}; // 9 -static const mpc_int8_t mpc_sym_Q2_2 [125] = { - 62, 92, 87, 86, 82, 68, 67, 66, 63, 61, 58, 57, 56, 42, 38, 37, 32, 93, 91, 88, 83, 81, 43, 41, 36, 33, 31, 112, 72, 64, 60, 52, 12, 118, 117, 116, 113, 111, 108, 107, 106, 98, 97, 96, 94, 90, 89, 85, 84, 80, 78, 77, 76, 73, 71, 69, 65, 59, 55, 53, 51, 48, 47, 46, 44, 40, 39, 35, 34, 30, 28, 27, 26, 18, 17, 16, 13, 11, 8, 7, 6, 122, 110, 74, 70, 54, 50, 22, 14, 2, 123, 121, 119, 115, 114, 109, 105, 103, 102, 101, 99, 95, 79, 75, 49, 45, 29, 25, 23, 21, 19, 15, 10, 9, 5, 3, 1, 124, 104, 20, 0, 120, 100, 24, 4 -}; - -static const mpc_huffman mpc_huff_Q3 [7] = { - {0xe000, 3, 7}, {0x8000, 4, 14}, {0x5000, 5, 22}, {0x2400, 6, 32}, {0xa00, 7, 41}, {0x200, 8, 46}, {0x0, 9, 48} -}; // 7 -static const mpc_int8_t mpc_sym_Q3 [49] = { - 0, 17, 16, 1, 15, -16, -1, 32, 31, 2, 14, -15, -32, 34, 33, 47, 46, 18, 30, -14, -2, -31, -17, -18, 49, 48, 63, 19, 29, 3, 13, -13, -3, -30, -47, -48, -33, 50, 62, 35, 45, -29, -19, -46, -34, 51, 61, -45, -35 -}; - -static const mpc_huffman mpc_huff_Q4 [8] = { - {0xf000, 4, 15}, {0x9000, 5, 30}, {0x3400, 6, 48}, {0x1800, 7, 61}, {0x500, 8, 73}, {0x100, 9, 78}, {0x0, 10, 80}, {0x0, 0, 90} -}; // 8 -static const mpc_int8_t mpc_sym_Q4 [91] = { - 0, 32, 17, 16, 31, 2, 1, 15, 14, -15, -16, -1, -32, 49, 48, 34, 33, 47, 46, 19, 18, 30, 29, 3, 13, -13, -14, -2, -3, -30, -31, -17, -18, -47, -48, -33, 64, 50, 63, 62, 35, 45, 4, 12, -29, -19, -46, -34, -64, -49, 66, 65, 79, 78, 51, 61, 36, 44, 20, 28, -12, -4, -28, -20, -45, -35, -62, -63, -50, 67, 77, 52, 60, -44, -36, -61, -51, 68, 76, -60, -52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -static const mpc_huffman mpc_huff_Q5_1 [6] = { - {0xc000, 2, 3}, {0x4000, 3, 6}, {0x2000, 4, 8}, {0x1000, 5, 10}, {0x800, 6, 12}, {0x0, 7, 14} -}; // 6 -static const mpc_int8_t mpc_sym_Q5_1 [15] = { - 0, 2, 1, -1, -2, 3, -3, 4, -4, 5, -5, 7, 6, -6, -7 -}; -static const mpc_huffman mpc_huff_Q5_2 [4] = { - {0x6000, 3, 7}, {0x2000, 4, 10}, {0x1000, 5, 12}, {0x0, 6, 14} -}; // 4 -static const mpc_int8_t mpc_sym_Q5_2 [15] = { - 2, 1, 0, -1, -2, 4, 3, -3, -4, 5, -5, 7, 6, -6, -7 -}; - -static const mpc_huffman mpc_huff_Q6_1 [8] = { - {0xc000, 2, 3}, {0x8000, 3, 6}, {0x4000, 4, 10}, {0x2800, 5, 14}, {0xc00, 6, 19}, {0x800, 7, 22}, {0x400, 8, 26}, {0x0, 9, 30} -}; // 8 -static const mpc_int8_t mpc_sym_Q6_1 [31] = { - 0, 1, -1, 3, 2, -2, -3, 4, -4, -5, 8, 7, 6, 5, -6, -7, -8, 9, -9, 11, 10, -10, -11, 15, 14, 13, 12, -12, -13, -14, -15 -}; -static const mpc_huffman mpc_huff_Q6_2 [5] = { - {0x5000, 4, 15}, {0x2000, 5, 20}, {0x1000, 6, 24}, {0x400, 7, 28}, {0x0, 8, 30} -}; // 5 -static const mpc_int8_t mpc_sym_Q6_2 [31] = { - 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, 8, 7, 6, -6, -7, -8, 10, 9, -9, -10, 13, 12, 11, -11, -12, -13, 15, 14, -14, -15 -}; - -static const mpc_huffman mpc_huff_Q7_1 [9] = { - {0xc000, 2, 3}, {0x8000, 3, 6}, {0x6000, 4, 10}, {0x4000, 5, 16}, {0x2800, 6, 24}, {0x1400, 7, 34}, {0xa00, 8, 44}, {0x400, 9, 54}, {0x0, 10, 62} -}; // 9 -static const mpc_int8_t mpc_sym_Q7_1 [63] = { - 0, 1, -1, 2, -2, 4, 3, -3, -4, 7, 6, 5, -5, -6, -7, 13, 11, 10, 9, 8, -8, -9, -10, -11, -12, 17, 16, 15, 14, 12, -13, -14, -15, -16, -17, 28, 27, 21, 20, 19, 18, -18, -19, -20, -21, -27, -28, 31, 30, 29, 26, 25, 24, 23, 22, -22, -23, -24, -25, -26, -29, -30, -31 -}; -static const mpc_huffman mpc_huff_Q7_2 [5] = { - {0x6000, 5, 31}, {0x2400, 6, 43}, {0x1000, 7, 52}, {0x200, 8, 60}, {0x0, 9, 62} -}; // 5 -static const mpc_int8_t mpc_sym_Q7_2 [63] = { - 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, 17, 16, 15, 14, 13, 12, 11, -10, -11, -12, -13, -14, -15, -16, -17, 22, 21, 20, 19, 18, -18, -19, -20, -21, -22, 29, 28, 27, 26, 25, 24, 23, -23, -24, -25, -26, -27, -28, -29, 31, 30, -30, -31 -}; - -static const mpc_huffman mpc_huff_Q8_1 [11] = { - {0xc000, 2, 3}, {0x8000, 3, 6}, {0x7000, 4, 10}, {0x5800, 5, 17}, {0x3800, 6, 28}, {0x2800, 7, 42}, {0x1900, 8, 62}, {0xd00, 9, 87}, {0x280, 10, 113}, {0x60, 11, 123}, {0x0, 12, 126} -}; // 11 -static const mpc_int8_t mpc_sym_Q8_1 [127] = { - 0, 1, -1, -2, 3, 2, -3, 7, 6, 5, 4, -4, -5, -6, -7, 11, 10, 9, 8, -8, -9, -10, -11, 19, 18, 17, 16, 15, 14, 13, 12, -12, -13, -14, -15, -16, -17, -19, 56, 55, 31, 28, 27, 26, 25, 24, 23, 22, 21, 20, -18, -20, -21, -22, -23, -24, -25, -26, -27, -33, -54, -56, 63, 62, 61, 60, 59, 58, 57, 54, 53, 43, 40, 39, 38, 37, 36, 35, 34, 33, 32, 30, 29, -28, -29, -30, -31, -32, -34, -35, -36, -37, -38, -39, -40, -41, -43, -53, -55, -57, -58, -59, -60, -61, 49, 47, 46, 45, 44, 42, 41, -42, -44, -45, -46, -47, -48, -49, -50, -62, -63, 52, 51, 50, 48, -51, -52 -}; -static const mpc_huffman mpc_huff_Q8_2 [4] = { - {0x9800, 6, 63}, {0x2a00, 7, 101}, {0x400, 8, 122}, {0x0, 9, 126} -}; // 4 -static const mpc_int8_t mpc_sym_Q8_2 [127] = { - 13, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 12, -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, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, -42, -43, -44, -45, -46, -47, -48, -49, -50, -51, -52, -53, -54, -55, -56, -57, -58, -59, 63, 62, 61, 60, -60, -61, -62, -63 -}; - -static const mpc_huffman mpc_huff_Q9up [6] = { - {0xf800, 6, 63}, {0xac00, 7, 125}, {0x2600, 8, -45}, {0x280, 9, -7}, {0x40, 10, -2}, {0x0, 11, -1} -}; // 6 -static const mpc_int8_t mpc_sym_Q9up [256] = { - -128, 127, -108, -110, -111, -112, -113, -114, -115, -116, -117, -118, -119, -120, -121, -122, -123, -124, -125, -126, -127, 126, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116, 115, 114, 113, 112, 111, 110, 109, 108, -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, -109, 107, 106, 105, 104, 103, 102, 101, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 40, 20, 19, -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, 41, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, -3, -4, -5, -6, 4, 3, 2, 1, 0, -1, -2 -}; -mpc_can_data mpc_can_Q9up = {mpc_huff_Q9up, mpc_sym_Q9up}; - - -mpc_can_data mpc_can_Q [6][2] = { - {{mpc_huff_Q2_1, mpc_sym_Q2_1}, {mpc_huff_Q2_2, mpc_sym_Q2_2}}, - {{mpc_huff_Q3, mpc_sym_Q3}, {mpc_huff_Q4, mpc_sym_Q4}}, - {{mpc_huff_Q5_1, mpc_sym_Q5_1}, {mpc_huff_Q5_2, mpc_sym_Q5_2}}, - {{mpc_huff_Q6_1, mpc_sym_Q6_1}, {mpc_huff_Q6_2, mpc_sym_Q6_2}}, - {{mpc_huff_Q7_1, mpc_sym_Q7_1}, {mpc_huff_Q7_2, mpc_sym_Q7_2}}, - {{mpc_huff_Q8_1, mpc_sym_Q8_1}, {mpc_huff_Q8_2, mpc_sym_Q8_2}} -}; - -static void huff_fill_lut(const mpc_huffman * table, mpc_huff_lut * lut, const int bits) -{ - int i, idx = 0; - const int shift = 16 - bits; - for (i = (1 << bits) - 1; i >= 0 ; i--) { - if ((table[idx].Code >> shift) < i) { - lut[i].Length = table[idx].Length; - lut[i].Value = table[idx].Value; - } else { - if (table[idx].Length <= bits) { - lut[i].Length = table[idx].Length; - lut[i].Value = table[idx].Value; - } else { - lut[i].Length = 0; - lut[i].Value = idx; - } - if (i != 0) - do { - idx++; - } while ((table[idx].Code >> shift) == i); - } - } -} - -static void can_fill_lut(mpc_can_data * data, const int bits) -{ - int i, idx = 0; - const int shift = 16 - bits; - const mpc_huffman * table = data->table; - const mpc_int8_t * sym = data->sym; - mpc_huff_lut * lut = data->lut; - for (i = (1 << bits) - 1; i >= 0 ; i--) { - if ((table[idx].Code >> shift) < i) { - if (table[idx].Length <= bits) { - lut[i].Length = table[idx].Length; - lut[i].Value = sym[(table[idx].Value - (i >> (bits - table[idx].Length))) & 0xFF]; - } else { - lut[i].Length = 0; - lut[i].Value = idx; - } - } else { - if (table[idx].Length <= bits) { - lut[i].Length = table[idx].Length; - lut[i].Value = sym[(table[idx].Value - (i >> (bits - table[idx].Length))) & 0xFF]; - } else { - lut[i].Length = 0; - lut[i].Value = idx; - } - if (i != 0) - do { - idx++; - } while ((table[idx].Code >> shift) == i); - } - } -} - -void huff_init_lut(const int bits) -{ - int i, j; - - huff_fill_lut(mpc_HuffDSCF.table, mpc_HuffDSCF.lut, bits); - huff_fill_lut(mpc_HuffHdr.table, mpc_HuffHdr.lut, bits); - - can_fill_lut(&mpc_can_SCFI[0], bits); - can_fill_lut(&mpc_can_SCFI[1], bits); - can_fill_lut(&mpc_can_DSCF[0], bits); - can_fill_lut(&mpc_can_DSCF[1], bits); - can_fill_lut(&mpc_can_Res[0], bits); - can_fill_lut(&mpc_can_Res[1], bits); - can_fill_lut(&mpc_can_Q1, bits); - can_fill_lut(&mpc_can_Q9up, bits); - - - for( i = 0; i < 7; i++){ - for( j = 0; j < 2; j++){ - if (i != 6) can_fill_lut(&mpc_can_Q[i][j], bits); - huff_fill_lut(mpc_HuffQ[i][j].table, mpc_HuffQ[i][j].lut, bits); - } - } -} - - diff --git a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/huffman.h b/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/huffman.h deleted file mode 100644 index 5b12bff9..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/huffman.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - Copyright (c) 2005-2009, The Musepack Development Team - 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 the The Musepack Development Team nor the - names of its 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. -*/ -/// \file huffman.h -/// Data structures and functions for huffman coding. - -#ifndef _MPCDEC_HUFFMAN_H_ -#define _MPCDEC_HUFFMAN_H_ -#ifdef WIN32 -#pragma once -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -// LUT size parameter, LUT size is 1 << LUT_DEPTH -#define LUT_DEPTH 6 - -/// Huffman table entry. -typedef struct mpc_huffman_t { - mpc_uint16_t Code; - mpc_uint8_t Length; - mpc_int8_t Value; -} mpc_huffman; - -/// Huffman LUT entry. -typedef struct mpc_huff_lut_t { - mpc_uint8_t Length; - mpc_int8_t Value; -} mpc_huff_lut; - -/// Type used for huffman LUT decoding -typedef struct mpc_lut_data_t { - mpc_huffman const * const table; - mpc_huff_lut lut[1 << LUT_DEPTH]; -} mpc_lut_data; - -/// Type used for canonical huffman decoding -typedef struct mpc_can_data_t { - mpc_huffman const * const table; - mpc_int8_t const * const sym; - mpc_huff_lut lut[1 << LUT_DEPTH]; -} mpc_can_data; - -void huff_init_lut(const int bits); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/internal.h b/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/internal.h deleted file mode 100644 index 48d78c1c..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/internal.h +++ /dev/null @@ -1,110 +0,0 @@ -/* - Copyright (c) 2005-2009, The Musepack Development Team - 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 the The Musepack Development Team nor the - names of its 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. -*/ -/// \file internal.h -/// Definitions and structures used only internally by the libmpcdec. -#ifndef _MPCDEC_INTERNAL_H_ -#define _MPCDEC_INTERNAL_H_ -#ifdef WIN32 -#pragma once -#endif -#ifdef __cplusplus -extern "C" { -#endif - -#include - -/// Big/little endian 32 bit byte swapping routine. -static mpc_inline -mpc_uint32_t mpc_swap32(mpc_uint32_t val) { - return (((val & 0xFF000000) >> 24) | ((val & 0x00FF0000) >> 8) - | ((val & 0x0000FF00) << 8) | ((val & 0x000000FF) << 24)); -} - -typedef struct mpc_block_t { - char key[2]; // block key - mpc_uint64_t size; // block size minus the block header size -} mpc_block; - -#define MAX_FRAME_SIZE 4352 -#define DEMUX_BUFFER_SIZE (65536 - MAX_FRAME_SIZE) // need some space as sand box - -struct mpc_demux_t { - mpc_reader * r; - mpc_decoder * d; - mpc_streaminfo si; - - // buffer - mpc_uint8_t buffer[DEMUX_BUFFER_SIZE + MAX_FRAME_SIZE]; - mpc_size_t bytes_total; - mpc_bits_reader bits_reader; - mpc_int32_t block_bits; /// bits remaining in current audio block - mpc_uint_t block_frames; /// frames remaining in current audio block - - // seeking - mpc_seek_t * seek_table; - mpc_uint_t seek_pwr; /// distance between 2 frames in seek_table = 2^seek_pwr - mpc_uint32_t seek_table_size; /// used size in seek_table - - // chapters - mpc_seek_t chap_pos; /// supposed position of the first chapter block - mpc_int_t chap_nb; /// number of chapters (-1 if unknown, 0 if no chapter) - mpc_chap_info * chap; /// chapters position and tag - -}; - -/** - * checks if a block key is valid - * @param key the two caracters key to check - * @return MPC_STATUS_FAIL if the key is invalid, MPC_STATUS_OK else - */ -static mpc_inline mpc_status mpc_check_key(char * key) -{ - if (key[0] < 65 || key[0] > 90 || key[1] < 65 || key[1] > 90) - return MPC_STATUS_FAIL; - return MPC_STATUS_OK; -} - -/// helper functions used by multiple files -mpc_uint32_t mpc_random_int(mpc_decoder *d); // in synth_filter.c -void mpc_decoder_init_quant(mpc_decoder *d, double scale_factor); -void mpc_decoder_synthese_filter_float(mpc_decoder *d, MPC_SAMPLE_FORMAT* OutData, mpc_int_t channels); - -#define MPC_IS_FAILURE(X) ((int)(X) < (int)MPC_STATUS_OK) -#define MPC_AUTO_FAIL(X) { mpc_status s = (X); if (MPC_IS_FAILURE(s)) return s; } - - -#ifdef __cplusplus -} -#endif -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/mpc_bits_reader.c b/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/mpc_bits_reader.c deleted file mode 100644 index babcc275..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/mpc_bits_reader.c +++ /dev/null @@ -1,181 +0,0 @@ -/* - Copyright (c) 2007-2009, The Musepack Development Team - 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 the The Musepack Development Team nor the - names of its 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. -*/ - -#include -#include "internal.h" -#include "huffman.h" -#include "mpc_bits_reader.h" - -const mpc_uint32_t Cnk[MAX_ENUM / 2][MAX_ENUM] = -{ - {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}, - {0, 0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91, 105, 120, 136, 153, 171, 190, 210, 231, 253, 276, 300, 325, 351, 378, 406, 435, 465}, - {0, 0, 0, 1, 4, 10, 20, 35, 56, 84, 120, 165, 220, 286, 364, 455, 560, 680, 816, 969, 1140, 1330, 1540, 1771, 2024, 2300, 2600, 2925, 3276, 3654, 4060, 4495}, - {0, 0, 0, 0, 1, 5, 15, 35, 70, 126, 210, 330, 495, 715, 1001, 1365, 1820, 2380, 3060, 3876, 4845, 5985, 7315, 8855, 10626, 12650, 14950, 17550, 20475, 23751, 27405, 31465}, - {0, 0, 0, 0, 0, 1, 6, 21, 56, 126, 252, 462, 792, 1287, 2002, 3003, 4368, 6188, 8568, 11628, 15504, 20349, 26334, 33649, 42504, 53130, 65780, 80730, 98280, 118755, 142506, 169911}, - {0, 0, 0, 0, 0, 0, 1, 7, 28, 84, 210, 462, 924, 1716, 3003, 5005, 8008, 12376, 18564, 27132, 38760, 54264, 74613, 100947, 134596, 177100, 230230, 296010, 376740, 475020, 593775, 736281}, - {0, 0, 0, 0, 0, 0, 0, 1, 8, 36, 120, 330, 792, 1716, 3432, 6435, 11440, 19448, 31824, 50388, 77520, 116280, 170544, 245157, 346104, 480700, 657800, 888030, 1184040, 1560780, 2035800, 2629575}, - {0, 0, 0, 0, 0, 0, 0, 0, 1, 9, 45, 165, 495, 1287, 3003, 6435, 12870, 24310, 43758, 75582, 125970, 203490, 319770, 490314, 735471, 1081575, 1562275, 2220075, 3108105, 4292145, 5852925, 7888725}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 10, 55, 220, 715, 2002, 5005, 11440, 24310, 48620, 92378, 167960, 293930, 497420, 817190, 1307504, 2042975, 3124550, 4686825, 6906900, 10015005, 14307150, 20160075}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 11, 66, 286, 1001, 3003, 8008, 19448, 43758, 92378, 184756, 352716, 646646, 1144066, 1961256, 3268760, 5311735, 8436285, 13123110, 20030010, 30045015, 44352165}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 12, 78, 364, 1365, 4368, 12376, 31824, 75582, 167960, 352716, 705432, 1352078, 2496144, 4457400, 7726160, 13037895, 21474180, 34597290, 54627300, 84672315}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 13, 91, 455, 1820, 6188, 18564, 50388, 125970, 293930, 646646, 1352078, 2704156, 5200300, 9657700, 17383860, 30421755, 51895935, 86493225, 141120525}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 14, 105, 560, 2380, 8568, 27132, 77520, 203490, 497420, 1144066, 2496144, 5200300, 10400600, 20058300, 37442160, 67863915, 119759850, 206253075}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 15, 120, 680, 3060, 11628, 38760, 116280, 319770, 817190, 1961256, 4457400, 9657700, 20058300, 40116600, 77558760, 145422675, 265182525}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 16, 136, 816, 3876, 15504, 54264, 170544, 490314, 1307504, 3268760, 7726160, 17383860, 37442160, 77558760, 155117520, 300540195}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 153, 969, 4845, 20349, 74613, 245157, 735471, 2042975, 5311735, 13037895, 30421755, 67863915, 145422675, 300540195} -}; - -const mpc_uint8_t Cnk_len[MAX_ENUM / 2][MAX_ENUM] = -{ - {0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5}, - {0, 0, 2, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9}, - {0, 0, 0, 2, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 13, 13}, - {0, 0, 0, 0, 3, 4, 6, 7, 7, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 15, 16}, - {0, 0, 0, 0, 0, 3, 5, 6, 7, 8, 9, 10, 11, 11, 12, 13, 13, 14, 14, 14, 15, 15, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18}, - {0, 0, 0, 0, 0, 0, 3, 5, 7, 8, 9, 10, 11, 12, 13, 13, 14, 15, 15, 16, 16, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20}, - {0, 0, 0, 0, 0, 0, 0, 3, 6, 7, 9, 10, 11, 12, 13, 14, 15, 15, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 21, 22, 22}, - {0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 8, 9, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 19, 20, 21, 21, 22, 22, 23, 23, 23, 24}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 8, 10, 11, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 21, 22, 23, 23, 24, 24, 25, 25}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 7, 9, 10, 12, 13, 15, 16, 17, 18, 19, 20, 21, 21, 22, 23, 24, 24, 25, 25, 26, 26}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 7, 9, 11, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 26, 27, 27}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 7, 9, 11, 13, 15, 16, 17, 19, 20, 21, 22, 23, 24, 25, 25, 26, 27, 28, 28}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 7, 10, 12, 14, 15, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 27, 28, 29}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 7, 10, 12, 14, 16, 17, 19, 20, 21, 23, 24, 25, 26, 27, 28, 28, 29}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 8, 10, 12, 14, 16, 18, 19, 21, 22, 23, 25, 26, 27, 28, 29, 30}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 10, 13, 15, 17, 18, 20, 21, 23, 24, 25, 27, 28, 29, 30} - -}; - -const mpc_uint32_t Cnk_lost[MAX_ENUM / 2][MAX_ENUM] = -{ - {0, 0, 1, 0, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, - {0, 0, 1, 2, 6, 1, 11, 4, 28, 19, 9, 62, 50, 37, 23, 8, 120, 103, 85, 66, 46, 25, 3, 236, 212, 187, 161, 134, 106, 77, 47, 16}, - {0, 0, 0, 0, 6, 12, 29, 8, 44, 8, 91, 36, 226, 148, 57, 464, 344, 208, 55, 908, 718, 508, 277, 24, 1796, 1496, 1171, 820, 442, 36, 3697, 3232}, - {0, 0, 0, 0, 3, 1, 29, 58, 2, 46, 182, 17, 309, 23, 683, 228, 1716, 1036, 220, 3347, 2207, 877, 7529, 5758, 3734, 1434, 15218, 12293, 9017, 5363, 1303, 29576}, - {0, 0, 0, 0, 0, 2, 11, 8, 2, 4, 50, 232, 761, 46, 1093, 3824, 2004, 7816, 4756, 880, 12419, 6434, 31887, 23032, 12406, 65292, 50342, 32792, 12317, 119638, 92233, 60768}, - {0, 0, 0, 0, 0, 0, 1, 4, 44, 46, 50, 100, 332, 1093, 3187, 184, 4008, 14204, 5636, 26776, 11272, 56459, 30125, 127548, 85044, 31914, 228278, 147548, 49268, 454801, 312295, 142384}, - {0, 0, 0, 0, 0, 0, 0, 0, 28, 8, 182, 232, 332, 664, 1757, 4944, 13320, 944, 15148, 53552, 14792, 91600, 16987, 178184, 43588, 390776, 160546, 913112, 536372, 61352, 1564729, 828448}, - {0, 0, 0, 0, 0, 0, 0, 0, 7, 19, 91, 17, 761, 1093, 1757, 3514, 8458, 21778, 55490, 5102, 58654, 204518, 33974, 313105, 1015577, 534877, 1974229, 1086199, 4096463, 2535683, 499883, 6258916}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 9, 36, 309, 46, 3187, 4944, 8458, 16916, 38694, 94184, 230358, 26868, 231386, 789648, 54177, 1069754, 3701783, 1481708, 6762211, 2470066, 13394357, 5505632}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 62, 226, 23, 1093, 184, 13320, 21778, 38694, 77388, 171572, 401930, 953086, 135896, 925544, 3076873, 8340931, 3654106, 13524422, 3509417, 22756699, 2596624}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 50, 148, 683, 3824, 4008, 944, 55490, 94184, 171572, 343144, 745074, 1698160, 3931208, 662448, 3739321, 12080252, 32511574, 12481564, 49545413, 5193248}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 37, 57, 228, 2004, 14204, 15148, 5102, 230358, 401930, 745074, 1490148, 3188308, 7119516, 16170572, 3132677, 15212929, 47724503, 127314931, 42642616}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 23, 464, 1716, 7816, 5636, 53552, 58654, 26868, 953086, 1698160, 3188308, 6376616, 13496132, 29666704, 66353813, 14457878, 62182381, 189497312}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 8, 344, 1036, 4756, 26776, 14792, 204518, 231386, 135896, 3931208, 7119516, 13496132, 26992264, 56658968, 123012781, 3252931, 65435312}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 208, 220, 880, 11272, 91600, 33974, 789648, 925544, 662448, 16170572, 29666704, 56658968, 113317936, 236330717, 508019104}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 103, 55, 3347, 12419, 56459, 16987, 313105, 54177, 3076873, 3739321, 3132677, 66353813, 123012781, 236330717} -}; - -static const mpc_uint8_t log2_mpc[32] = -{ 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6}; - -static const mpc_uint8_t log2_lost[32] = -{ 0, 1, 0, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 31}; - -mpc_int32_t mpc_bits_golomb_dec(mpc_bits_reader * r, const mpc_uint_t k) -{ - unsigned int l = 0; - unsigned int code = r->buff[0] & ((1 << r->count) - 1); - - while( code == 0 ) { - l += r->count; - r->buff++; - code = r->buff[0]; - r->count = 8; - } - - while( ((1 << (r->count - 1)) & code) == 0 ) { - l++; - r->count--; - } - r->count--; - - while( r->count < k ) { - r->buff++; - r->count += 8; - code = (code << 8) | r->buff[0]; - } - - r->count -= k; - - return (l << k) | ((code >> r->count) & ((1 << k) - 1)); -} - -mpc_uint32_t mpc_bits_log_dec(mpc_bits_reader * r, mpc_uint_t max) -{ - mpc_uint32_t value = 0; - if (max == 0) - return 0; - if (log2_mpc[max - 1] > 1) - value = mpc_bits_read(r, log2_mpc[max - 1] - 1); - if (value >= log2_lost[max - 1]) - value = ((value << 1) | mpc_bits_read(r, 1)) - log2_lost[max - 1]; - return value; -} - -unsigned int mpc_bits_get_size(mpc_bits_reader * r, mpc_uint64_t * p_size) -{ - unsigned char tmp; - mpc_uint64_t size = 0; - unsigned int ret = 0; - - do { - tmp = mpc_bits_read(r, 8); - size = (size << 7) | (tmp & 0x7F); - ret++; - } while((tmp & 0x80)); - - *p_size = size; - return ret; -} - -int mpc_bits_get_block(mpc_bits_reader * r, mpc_block * p_block) -{ - int size = 2; - - p_block->size = 0; - p_block->key[0] = mpc_bits_read(r, 8); - p_block->key[1] = mpc_bits_read(r, 8); - - size += mpc_bits_get_size(r, &(p_block->size)); - - if (p_block->size >= size) // check if the block size doesn't conflict with the header size - p_block->size -= size; - - return size; -} - - - diff --git a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/mpc_bits_reader.h b/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/mpc_bits_reader.h deleted file mode 100644 index 0b00738c..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/mpc_bits_reader.h +++ /dev/null @@ -1,150 +0,0 @@ -/* - Copyright (c) 2007-2009, The Musepack Development Team - 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 the The Musepack Development Team nor the - names of its 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. -*/ - -#pragma once -#define MAX_ENUM 32 - -MPC_API int mpc_bits_get_block(mpc_bits_reader * r, mpc_block * p_block); -mpc_int32_t mpc_bits_golomb_dec(mpc_bits_reader * r, const mpc_uint_t k); -MPC_API unsigned int mpc_bits_get_size(mpc_bits_reader * r, mpc_uint64_t * p_size); -mpc_uint32_t mpc_bits_log_dec(mpc_bits_reader * r, mpc_uint_t max); - -extern const mpc_uint32_t Cnk[MAX_ENUM / 2][MAX_ENUM]; -extern const mpc_uint8_t Cnk_len[MAX_ENUM / 2][MAX_ENUM]; -extern const mpc_uint32_t Cnk_lost[MAX_ENUM / 2][MAX_ENUM]; - -// can read up to 31 bits -static mpc_inline mpc_uint32_t mpc_bits_read(mpc_bits_reader * r, const unsigned int nb_bits) -{ - mpc_uint32_t ret; - - r->buff -= (int)(r->count - nb_bits) >> 3; - r->count = (r->count - nb_bits) & 0x07; - - ret = (r->buff[0] | (r->buff[-1] << 8)) >> r->count; - if (nb_bits > (16 - r->count)) { - ret |= (mpc_uint32_t)((r->buff[-2] << 16) | (r->buff[-3] << 24)) >> r->count; - if (nb_bits > 24 && r->count != 0) - ret |= r->buff[-4] << (32 - r->count); - } - - return ret & ((1 << nb_bits) - 1); -} - -// basic huffman decoding routine -// works with maximum lengths up to 16 -static mpc_inline mpc_int32_t mpc_bits_huff_dec(mpc_bits_reader * r, const mpc_huffman *Table) -{ - mpc_uint16_t code; - code = (mpc_uint16_t)((((r->buff[0] << 16) | (r->buff[1] << 8) | r->buff[2]) >> r->count) & 0xFFFF); - - while (code < Table->Code) Table++; - - r->buff -= (int)(r->count - Table->Length) >> 3; - r->count = (r->count - Table->Length) & 0x07; - - return Table->Value; -} - -static mpc_inline mpc_int32_t mpc_bits_can_dec(mpc_bits_reader * r, const mpc_can_data *can) -{ - mpc_uint16_t code; - mpc_huff_lut tmp; - const mpc_huffman * Table; - code = (mpc_uint16_t)((((r->buff[0] << 16) | (r->buff[1] << 8) | r->buff[2]) >> r->count) & 0xFFFF); - - tmp = can->lut[code >> (16 - LUT_DEPTH)]; - if (tmp.Length != 0) { - r->buff -= (int)(r->count - tmp.Length) >> 3; - r->count = (r->count - tmp.Length) & 0x07; - return tmp.Value; - } - - Table = can->table + (unsigned char)tmp.Value; - while (code < Table->Code) Table++; - - r->buff -= (int)(r->count - Table->Length) >> 3; - r->count = (r->count - Table->Length) & 0x07; - - return can->sym[(Table->Value - (code >> (16 - Table->Length))) & 0xFF] ; -} - -// LUT-based huffman decoding routine -// works with maximum lengths up to 16 -static mpc_inline mpc_int32_t mpc_bits_huff_lut(mpc_bits_reader * r, const mpc_lut_data *lut) -{ - mpc_uint16_t code; - mpc_huff_lut tmp; - const mpc_huffman * Table; - code = (mpc_uint16_t)((((r->buff[0] << 16) | (r->buff[1] << 8) | r->buff[2]) >> r->count) & 0xFFFF); - - tmp = lut->lut[code >> (16 - LUT_DEPTH)]; - if (tmp.Length != 0) { - r->buff -= (int)(r->count - tmp.Length) >> 3; - r->count = (r->count - tmp.Length) & 0x07; - return tmp.Value; - } - - Table = lut->table + (unsigned char)tmp.Value; - while (code < Table->Code) Table++; - - r->buff -= (int)(r->count - Table->Length) >> 3; - r->count = (r->count - Table->Length) & 0x07; - - return Table->Value; -} - -static mpc_inline mpc_uint32_t mpc_bits_enum_dec(mpc_bits_reader * r, mpc_uint_t k, mpc_uint_t n) -{ - mpc_uint32_t bits = 0; - mpc_uint32_t code; - const mpc_uint32_t * C = Cnk[k-1]; - - code = mpc_bits_read(r, Cnk_len[k-1][n-1] - 1); - - if (code >= Cnk_lost[k-1][n-1]) - code = ((code << 1) | mpc_bits_read(r, 1)) - Cnk_lost[k-1][n-1]; - - do { - n--; - if (code >= C[n]) { - bits |= 1 << n; - code -= C[n]; - C -= MAX_ENUM; - k--; - } - } while(k > 0); - - return bits; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/mpc_decoder.c b/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/mpc_decoder.c deleted file mode 100644 index 21a9de4f..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/mpc_decoder.c +++ /dev/null @@ -1,681 +0,0 @@ -/* - Copyright (c) 2005-2009, The Musepack Development Team - 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 the The Musepack Development Team nor the - names of its 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. -*/ -/// \file mpc_decoder.c -/// Core decoding routines and logic. - -#include -#include -#include -#include "decoder.h" -#include "huffman.h" -#include "internal.h" -#include "mpcdec_math.h" -#include "requant.h" -#include "mpc_bits_reader.h" - -//SV7 tables -extern /*const*/ mpc_lut_data mpc_HuffQ [7] [2]; -extern /*const*/ mpc_lut_data mpc_HuffHdr; -extern const mpc_huffman mpc_table_HuffSCFI [ 4]; -extern /*const*/ mpc_lut_data mpc_HuffDSCF; - -//SV8 tables -extern /*const*/ mpc_can_data mpc_can_Bands; -extern /*const*/ mpc_can_data mpc_can_SCFI[2]; -extern /*const*/ mpc_can_data mpc_can_DSCF[2]; -extern /*const*/ mpc_can_data mpc_can_Res [2]; -extern /*const*/ mpc_can_data mpc_can_Q [6/*8*/][2]; -extern /*const*/ mpc_can_data mpc_can_Q1; -extern /*const*/ mpc_can_data mpc_can_Q9up; - -//------------------------------------------------------------------------------ -// types -//------------------------------------------------------------------------------ -enum -{ - MEMSIZE = MPC_DECODER_MEMSIZE, // overall buffer size - MEMSIZE2 = (MEMSIZE/2), // size of one buffer - MEMMASK = (MEMSIZE-1) -}; - -//------------------------------------------------------------------------------ -// forward declarations -//------------------------------------------------------------------------------ -void mpc_decoder_read_bitstream_sv7(mpc_decoder * d, mpc_bits_reader * r); -void mpc_decoder_read_bitstream_sv8(mpc_decoder * d, mpc_bits_reader * r, - mpc_bool_t is_key_frame); -static void mpc_decoder_requantisierung(mpc_decoder *d); - -/** - * set the scf indexes for seeking use - * needed only for sv7 seeking - * @param d - */ -void mpc_decoder_reset_scf(mpc_decoder * d, int value) -{ - memset(d->SCF_Index_L, value, sizeof d->SCF_Index_L ); - memset(d->SCF_Index_R, value, sizeof d->SCF_Index_R ); -} - - -void mpc_decoder_setup(mpc_decoder *d) -{ - memset(d, 0, sizeof *d); - - d->__r1 = 1; - d->__r2 = 1; - - mpc_decoder_init_quant(d, 1.0f); -} - -void mpc_decoder_set_streaminfo(mpc_decoder *d, mpc_streaminfo *si) -{ - d->stream_version = si->stream_version; - d->ms = si->ms; - d->max_band = si->max_band; - d->channels = si->channels; - d->samples_to_skip = MPC_DECODER_SYNTH_DELAY + si->beg_silence; - - if (si->stream_version == 7 && si->is_true_gapless) - d->samples = ((si->samples + MPC_FRAME_LENGTH - 1) / MPC_FRAME_LENGTH) * MPC_FRAME_LENGTH; - else - d->samples = si->samples; -} - -mpc_decoder * mpc_decoder_init(mpc_streaminfo *si) -{ - mpc_decoder* p_tmp = malloc(sizeof(mpc_decoder)); - - if (p_tmp != 0) { - mpc_decoder_setup(p_tmp); - mpc_decoder_set_streaminfo(p_tmp, si); - huff_init_lut(LUT_DEPTH); // FIXME : this needs to be called only once when the library is loaded - } - - return p_tmp; -} - -void mpc_decoder_exit(mpc_decoder *d) -{ - free(d); -} - -void mpc_decoder_decode_frame(mpc_decoder * d, - mpc_bits_reader * r, - mpc_frame_info * i) -{ - mpc_bits_reader r_sav = *r; - mpc_int64_t samples_left; - - samples_left = d->samples - d->decoded_samples + MPC_DECODER_SYNTH_DELAY; - - if (samples_left <= 0 && d->samples != 0) { - i->samples = 0; - i->bits = -1; - return; - } - - if (d->stream_version == 8) - mpc_decoder_read_bitstream_sv8(d, r, i->is_key_frame); - else - mpc_decoder_read_bitstream_sv7(d, r); - - if (d->samples_to_skip < MPC_FRAME_LENGTH + MPC_DECODER_SYNTH_DELAY) { - mpc_decoder_requantisierung(d); - mpc_decoder_synthese_filter_float(d, i->buffer, d->channels); - } - - d->decoded_samples += MPC_FRAME_LENGTH; - - // reconstruct exact filelength - if (d->decoded_samples - d->samples < MPC_FRAME_LENGTH && d->stream_version == 7) { - int last_frame_samples = mpc_bits_read(r, 11); - if (d->decoded_samples == d->samples) { - if (last_frame_samples == 0) last_frame_samples = MPC_FRAME_LENGTH; - d->samples += last_frame_samples - MPC_FRAME_LENGTH; - samples_left += last_frame_samples - MPC_FRAME_LENGTH; - } - } - - i->samples = samples_left > MPC_FRAME_LENGTH ? MPC_FRAME_LENGTH : samples_left < 0 ? 0 : (mpc_uint32_t) samples_left; - i->bits = (mpc_uint32_t) (((r->buff - r_sav.buff) << 3) + r_sav.count - r->count); - - if (d->samples_to_skip) { - if (i->samples <= d->samples_to_skip) { - d->samples_to_skip -= i->samples; - i->samples = 0; - } else { - i->samples -= d->samples_to_skip; - memmove(i->buffer, i->buffer + d->samples_to_skip * d->channels, - i->samples * d->channels * sizeof (MPC_SAMPLE_FORMAT)); - d->samples_to_skip = 0; - } - } -} - -void -mpc_decoder_requantisierung(mpc_decoder *d) -{ - mpc_int32_t Band; - mpc_int32_t n; - MPC_SAMPLE_FORMAT facL; - MPC_SAMPLE_FORMAT facR; - MPC_SAMPLE_FORMAT templ; - MPC_SAMPLE_FORMAT tempr; - MPC_SAMPLE_FORMAT* YL; - MPC_SAMPLE_FORMAT* YR; - mpc_int16_t* L; - mpc_int16_t* R; - const mpc_int32_t Last_Band = d->max_band; - -#ifdef MPC_FIXED_POINT -#if MPC_FIXED_POINT_FRACTPART == 14 -#define MPC_MULTIPLY_SCF(CcVal, SCF_idx) \ - MPC_MULTIPLY_EX(CcVal, d->SCF[SCF_idx], d->SCF_shift[SCF_idx]) -#else - -#error FIXME, Cc table is in 18.14 format - -#endif -#else -#define MPC_MULTIPLY_SCF(CcVal, SCF_idx) \ - MPC_MULTIPLY(CcVal, d->SCF[SCF_idx]) -#endif - // requantization and scaling of subband-samples - for ( Band = 0; Band <= Last_Band; Band++ ) { // setting pointers - YL = d->Y_L[0] + Band; - YR = d->Y_R[0] + Band; - L = d->Q[Band].L; - R = d->Q[Band].R; - /************************** MS-coded **************************/ - if ( d->MS_Flag [Band] ) { - if ( d->Res_L [Band] ) { - if ( d->Res_R [Band] ) { // M!=0, S!=0 - facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][0] & 0xFF); - facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][0] & 0xFF); - for ( n = 0; n < 12; n++, YL += 32, YR += 32 ) { - *YL = (templ = MPC_MULTIPLY_FLOAT_INT(facL,*L++))+(tempr = MPC_MULTIPLY_FLOAT_INT(facR,*R++)); - *YR = templ - tempr; - } - facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][1] & 0xFF); - facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][1] & 0xFF); - for ( ; n < 24; n++, YL += 32, YR += 32 ) { - *YL = (templ = MPC_MULTIPLY_FLOAT_INT(facL,*L++))+(tempr = MPC_MULTIPLY_FLOAT_INT(facR,*R++)); - *YR = templ - tempr; - } - facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][2] & 0xFF); - facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][2] & 0xFF); - for ( ; n < 36; n++, YL += 32, YR += 32 ) { - *YL = (templ = MPC_MULTIPLY_FLOAT_INT(facL,*L++))+(tempr = MPC_MULTIPLY_FLOAT_INT(facR,*R++)); - *YR = templ - tempr; - } - } else { // M!=0, S==0 - facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][0] & 0xFF); - for ( n = 0; n < 12; n++, YL += 32, YR += 32 ) { - *YR = *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++); - } - facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][1] & 0xFF); - for ( ; n < 24; n++, YL += 32, YR += 32 ) { - *YR = *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++); - } - facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][2] & 0xFF); - for ( ; n < 36; n++, YL += 32, YR += 32 ) { - *YR = *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++); - } - } - } else { - if (d->Res_R[Band]) // M==0, S!=0 - { - facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][0] & 0xFF); - for ( n = 0; n < 12; n++, YL += 32, YR += 32 ) { - *YR = - (*YL = MPC_MULTIPLY_FLOAT_INT(facR,*(R++))); - } - facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][1] & 0xFF); - for ( ; n < 24; n++, YL += 32, YR += 32 ) { - *YR = - (*YL = MPC_MULTIPLY_FLOAT_INT(facR,*(R++))); - } - facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][2] & 0xFF); - for ( ; n < 36; n++, YL += 32, YR += 32 ) { - *YR = - (*YL = MPC_MULTIPLY_FLOAT_INT(facR,*(R++))); - } - } else { // M==0, S==0 - for ( n = 0; n < 36; n++, YL += 32, YR += 32 ) { - *YR = *YL = 0; - } - } - } - } - /************************** LR-coded **************************/ - else { - if ( d->Res_L [Band] ) { - if ( d->Res_R [Band] ) { // L!=0, R!=0 - facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][0] & 0xFF); - facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][0] & 0xFF); - for (n = 0; n < 12; n++, YL += 32, YR += 32 ) { - *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++); - *YR = MPC_MULTIPLY_FLOAT_INT(facR,*R++); - } - facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][1] & 0xFF); - facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][1] & 0xFF); - for (; n < 24; n++, YL += 32, YR += 32 ) { - *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++); - *YR = MPC_MULTIPLY_FLOAT_INT(facR,*R++); - } - facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][2] & 0xFF); - facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][2] & 0xFF); - for (; n < 36; n++, YL += 32, YR += 32 ) { - *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++); - *YR = MPC_MULTIPLY_FLOAT_INT(facR,*R++); - } - } else { // L!=0, R==0 - facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][0] & 0xFF); - for ( n = 0; n < 12; n++, YL += 32, YR += 32 ) { - *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++); - *YR = 0; - } - facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][1] & 0xFF); - for ( ; n < 24; n++, YL += 32, YR += 32 ) { - *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++); - *YR = 0; - } - facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][2] & 0xFF); - for ( ; n < 36; n++, YL += 32, YR += 32 ) { - *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++); - *YR = 0; - } - } - } - else { - if ( d->Res_R [Band] ) { // L==0, R!=0 - facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][0] & 0xFF); - for ( n = 0; n < 12; n++, YL += 32, YR += 32 ) { - *YL = 0; - *YR = MPC_MULTIPLY_FLOAT_INT(facR,*R++); - } - facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][1] & 0xFF); - for ( ; n < 24; n++, YL += 32, YR += 32 ) { - *YL = 0; - *YR = MPC_MULTIPLY_FLOAT_INT(facR,*R++); - } - facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][2] & 0xFF); - for ( ; n < 36; n++, YL += 32, YR += 32 ) { - *YL = 0; - *YR = MPC_MULTIPLY_FLOAT_INT(facR,*R++); - } - } else { // L==0, R==0 - for ( n = 0; n < 36; n++, YL += 32, YR += 32 ) { - *YR = *YL = 0; - } - } - } - } - } -} - -void mpc_decoder_read_bitstream_sv7(mpc_decoder * d, mpc_bits_reader * r) -{ - // these arrays hold decoding results for bundled quantizers (3- and 5-step) - static const mpc_int32_t idx30[] = { -1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1}; - static const mpc_int32_t idx31[] = { -1,-1,-1, 0, 0, 0, 1, 1, 1,-1,-1,-1, 0, 0, 0, 1, 1, 1,-1,-1,-1, 0, 0, 0, 1, 1, 1}; - static const mpc_int32_t idx32[] = { -1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1}; - static const mpc_int32_t idx50[] = { -2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2}; - static const mpc_int32_t idx51[] = { -2,-2,-2,-2,-2,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2}; - - mpc_int32_t n, idx, Max_used_Band = 0; - - /***************************** Header *****************************/ - - // first subband - d->Res_L[0] = mpc_bits_read(r, 4); - d->Res_R[0] = mpc_bits_read(r, 4); - if (!(d->Res_L[0] == 0 && d->Res_R[0] == 0)) { - if (d->ms) - d->MS_Flag[0] = mpc_bits_read(r, 1); - Max_used_Band = 1; - } - - // consecutive subbands - for ( n = 1; n <= d->max_band; n++ ) { - idx = mpc_bits_huff_lut(r, & mpc_HuffHdr); - d->Res_L[n] = (idx!=4) ? d->Res_L[n - 1] + idx : (int) mpc_bits_read(r, 4); - - idx = mpc_bits_huff_lut(r, & mpc_HuffHdr); - d->Res_R[n] = (idx!=4) ? d->Res_R[n - 1] + idx : (int) mpc_bits_read(r, 4); - - if (!(d->Res_L[n] == 0 && d->Res_R[n] == 0)) { - if (d->ms) - d->MS_Flag[n] = mpc_bits_read(r, 1); - Max_used_Band = n + 1; - } - } - - /****************************** SCFI ******************************/ - for ( n = 0; n < Max_used_Band; n++ ) { - if (d->Res_L[n]) - d->SCFI_L[n] = mpc_bits_huff_dec(r, mpc_table_HuffSCFI); - if (d->Res_R[n]) - d->SCFI_R[n] = mpc_bits_huff_dec(r, mpc_table_HuffSCFI); - } - - /**************************** SCF/DSCF ****************************/ - for ( n = 0; n < Max_used_Band; n++ ) { - mpc_int32_t * SCF = d->SCF_Index_L[n]; - mpc_uint32_t Res = d->Res_L[n], SCFI = d->SCFI_L[n]; - do { - if (Res) { - switch (SCFI) { - case 1: - idx = mpc_bits_huff_lut(r, & mpc_HuffDSCF); - SCF[0] = (idx!=8) ? SCF[2] + idx : (int) mpc_bits_read(r, 6); - idx = mpc_bits_huff_lut(r, & mpc_HuffDSCF); - SCF[1] = (idx!=8) ? SCF[0] + idx : (int) mpc_bits_read(r, 6); - SCF[2] = SCF[1]; - break; - case 3: - idx = mpc_bits_huff_lut(r, & mpc_HuffDSCF); - SCF[0] = (idx!=8) ? SCF[2] + idx : (int) mpc_bits_read(r, 6); - SCF[1] = SCF[0]; - SCF[2] = SCF[1]; - break; - case 2: - idx = mpc_bits_huff_lut(r, & mpc_HuffDSCF); - SCF[0] = (idx!=8) ? SCF[2] + idx : (int) mpc_bits_read(r, 6); - SCF[1] = SCF[0]; - idx = mpc_bits_huff_lut(r, & mpc_HuffDSCF); - SCF[2] = (idx!=8) ? SCF[1] + idx : (int) mpc_bits_read(r, 6); - break; - case 0: - idx = mpc_bits_huff_lut(r, & mpc_HuffDSCF); - SCF[0] = (idx!=8) ? SCF[2] + idx : (int) mpc_bits_read(r, 6); - idx = mpc_bits_huff_lut(r, & mpc_HuffDSCF); - SCF[1] = (idx!=8) ? SCF[0] + idx : (int) mpc_bits_read(r, 6); - idx = mpc_bits_huff_lut(r, & mpc_HuffDSCF); - SCF[2] = (idx!=8) ? SCF[1] + idx : (int) mpc_bits_read(r, 6); - break; - default: - return; - } - if (SCF[0] > 1024) - SCF[0] = 0x8080; - if (SCF[1] > 1024) - SCF[1] = 0x8080; - if (SCF[2] > 1024) - SCF[2] = 0x8080; - } - Res = d->Res_R[n]; - SCFI = d->SCFI_R[n]; - } while ( SCF == d->SCF_Index_L[n] && (SCF = d->SCF_Index_R[n])); - } - -// if (d->seeking == TRUE) -// return; - - /***************************** Samples ****************************/ - for ( n = 0; n < Max_used_Band; n++ ) { - mpc_int16_t *q = d->Q[n].L, Res = d->Res_L[n]; - do { - mpc_int32_t k; - const mpc_lut_data *Table; - switch (Res) { - case -2: case -3: case -4: case -5: case -6: case -7: case -8: case -9: - case -10: case -11: case -12: case -13: case -14: case -15: case -16: case -17: case 0: - break; - case -1: - for (k=0; k<36; k++ ) { - mpc_uint32_t tmp = mpc_random_int(d); - q[k] = ((tmp >> 24) & 0xFF) + ((tmp >> 16) & 0xFF) + ((tmp >> 8) & 0xFF) + ((tmp >> 0) & 0xFF) - 510; - } - break; - case 1: - Table = & mpc_HuffQ[0][mpc_bits_read(r, 1)]; - for ( k = 0; k < 36; k += 3) { - idx = mpc_bits_huff_lut(r, Table); - q[k] = idx30[idx]; - q[k + 1] = idx31[idx]; - q[k + 2] = idx32[idx]; - } - break; - case 2: - Table = & mpc_HuffQ[1][mpc_bits_read(r, 1)]; - for ( k = 0; k < 36; k += 2) { - idx = mpc_bits_huff_lut(r, Table); - q[k] = idx50[idx]; - q[k + 1] = idx51[idx]; - } - break; - case 3: - case 4: - case 5: - case 6: - case 7: - Table = & mpc_HuffQ[Res - 1][mpc_bits_read(r, 1)]; - for ( k = 0; k < 36; k++ ) - q[k] = mpc_bits_huff_lut(r, Table); - break; - case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17: - for ( k = 0; k < 36; k++ ) - q[k] = (mpc_int32_t)mpc_bits_read(r, Res_bit[Res]) - Dc[Res]; - break; - default: - return; - } - - Res = d->Res_R[n]; - } while (q == d->Q[n].L && (q = d->Q[n].R)); - } -} - -void mpc_decoder_read_bitstream_sv8(mpc_decoder * d, mpc_bits_reader * r, mpc_bool_t is_key_frame) -{ - // these arrays hold decoding results for bundled quantizers (3- and 5-step) - static const mpc_int8_t idx50[125] = {-2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2}; - static const mpc_int8_t idx51[125] = {-2, -2, -2, -2, -2, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2}; - static const mpc_int8_t idx52[125] = {-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}; - - mpc_int32_t n, Max_used_Band; - const mpc_can_data * Table, * Tables[2]; - - /***************************** Header *****************************/ - - if (is_key_frame == MPC_TRUE) { - Max_used_Band = mpc_bits_log_dec(r, d->max_band + 1); - } else { - Max_used_Band = d->last_max_band + mpc_bits_can_dec(r, & mpc_can_Bands); - if (Max_used_Band > 32) Max_used_Band -= 33; - } - d->last_max_band = Max_used_Band; - - if (Max_used_Band) { - d->Res_L[Max_used_Band-1] = mpc_bits_can_dec(r, & mpc_can_Res[0]); - d->Res_R[Max_used_Band-1] = mpc_bits_can_dec(r, & mpc_can_Res[0]); - if (d->Res_L[Max_used_Band-1] > 15) d->Res_L[Max_used_Band-1] -= 17; - if (d->Res_R[Max_used_Band-1] > 15) d->Res_R[Max_used_Band-1] -= 17; - for ( n = Max_used_Band - 2; n >= 0; n--) { - d->Res_L[n] = mpc_bits_can_dec(r, & mpc_can_Res[d->Res_L[n + 1] > 2]) + d->Res_L[n + 1]; - if (d->Res_L[n] > 15) d->Res_L[n] -= 17; - d->Res_R[n] = mpc_bits_can_dec(r, & mpc_can_Res[d->Res_R[n + 1] > 2]) + d->Res_R[n + 1]; - if (d->Res_R[n] > 15) d->Res_R[n] -= 17; - } - - if (d->ms) { - mpc_uint_t cnt = 0, tot = 0; - mpc_uint32_t tmp = 0; - for( n = 0; n < Max_used_Band; n++) - if ( d->Res_L[n] != 0 || d->Res_R[n] != 0 ) - tot++; - cnt = mpc_bits_log_dec(r, tot); - if (cnt != 0 && cnt != tot) - tmp = mpc_bits_enum_dec(r, mini(cnt, tot-cnt), tot); - if (cnt * 2 > tot) tmp = ~tmp; - for( n = Max_used_Band - 1; n >= 0; n--) - if ( d->Res_L[n] != 0 || d->Res_R[n] != 0 ) { - d->MS_Flag[n] = tmp & 1; - tmp >>= 1; - } - } - } - - for( n = Max_used_Band; n <= d->max_band; n++) - d->Res_L[n] = d->Res_R[n] = 0; - - /****************************** SCFI ******************************/ - if (is_key_frame == MPC_TRUE){ - for( n = 0; n < 32; n++) - d->DSCF_Flag_L[n] = d->DSCF_Flag_R[n] = 1; // new block -> force key frame - } - - Tables[0] = & mpc_can_SCFI[0]; - Tables[1] = & mpc_can_SCFI[1]; - for ( n = 0; n < Max_used_Band; n++ ) { - int tmp = 0, cnt = -1; - if (d->Res_L[n]) cnt++; - if (d->Res_R[n]) cnt++; - if (cnt >= 0) { - tmp = mpc_bits_can_dec(r, Tables[cnt]); - if (d->Res_L[n]) d->SCFI_L[n] = tmp >> (2 * cnt); - if (d->Res_R[n]) d->SCFI_R[n] = tmp & 3; - } - } - - /**************************** SCF/DSCF ****************************/ - - for ( n = 0; n < Max_used_Band; n++ ) { - mpc_int32_t * SCF = d->SCF_Index_L[n]; - mpc_uint32_t Res = d->Res_L[n], SCFI = d->SCFI_L[n]; - mpc_bool_t * DSCF_Flag = &d->DSCF_Flag_L[n]; - - do { - if ( Res ) { - int m; - if (*DSCF_Flag == 1) { - SCF[0] = (mpc_int32_t)mpc_bits_read(r, 7) - 6; - *DSCF_Flag = 0; - } else { - mpc_uint_t tmp = mpc_bits_can_dec(r, & mpc_can_DSCF[1]); - if (tmp == 64) - tmp += mpc_bits_read(r, 6); - SCF[0] = ((SCF[2] - 25 + tmp) & 127) - 6; - } - for( m = 0; m < 2; m++){ - if (((SCFI << m) & 2) == 0) { - mpc_uint_t tmp = mpc_bits_can_dec(r, & mpc_can_DSCF[0]); - if (tmp == 31) - tmp = 64 + mpc_bits_read(r, 6); - SCF[m + 1] = ((SCF[m] - 25 + tmp) & 127) - 6; - } else - SCF[m + 1] = SCF[m]; - } - } - Res = d->Res_R[n]; - SCFI = d->SCFI_R[n]; - DSCF_Flag = &d->DSCF_Flag_R[n]; - } while ( SCF == d->SCF_Index_L[n] && (SCF = d->SCF_Index_R[n])); - } - - /***************************** Samples ****************************/ - for ( n = 0; n < Max_used_Band; n++ ) { - mpc_int16_t *q = d->Q[n].L, Res = d->Res_L[n]; - static const unsigned int thres[] = {0, 0, 3, 0, 0, 1, 3, 4, 8}; - static const mpc_int8_t HuffQ2_var[5*5*5] = - {6, 5, 4, 5, 6, 5, 4, 3, 4, 5, 4, 3, 2, 3, 4, 5, 4, 3, 4, 5, 6, 5, 4, 5, 6, 5, 4, 3, 4, 5, 4, 3, 2, 3, 4, 3, 2, 1, 2, 3, 4, 3, 2, 3, 4, 5, 4, 3, 4, 5, 4, 3, 2, 3, 4, 3, 2, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 2, 3, 4, 3, 2, 3, 4, 5, 4, 3, 4, 5, 4, 3, 2, 3, 4, 3, 2, 1, 2, 3, 4, 3, 2, 3, 4, 5, 4, 3, 4, 5, 6, 5, 4, 5, 6, 5, 4, 3, 4, 5, 4, 3, 2, 3, 4, 5, 4, 3, 4, 5, 6, 5, 4, 5, 6}; - - do { - mpc_uint32_t k = 0, idx = 1; - if (Res != 0) { - if (Res == 2) { - Tables[0] = & mpc_can_Q [0][0]; - Tables[1] = & mpc_can_Q [0][1]; - idx = 2 * thres[Res]; - for ( ; k < 36; k += 3) { - int tmp = mpc_bits_can_dec(r, Tables[idx > thres[Res]]); - q[k] = idx50[tmp]; - q[k + 1] = idx51[tmp]; - q[k + 2] = idx52[tmp]; - idx = (idx >> 1) + HuffQ2_var[tmp]; - } - } else if (Res == 1) { - Table = & mpc_can_Q1; - for( ; k < 36; ){ - mpc_uint32_t kmax = k + 18; - mpc_uint_t cnt = mpc_bits_can_dec(r, Table); - idx = 0; - if (cnt > 0 && cnt < 18) - idx = mpc_bits_enum_dec(r, cnt <= 9 ? cnt : 18 - cnt, 18); - if (cnt > 9) idx = ~idx; - for ( ; k < kmax; k++) { - q[k] = 0; - if ( idx & (1 << 17) ) - q[k] = (mpc_bits_read(r, 1) << 1) - 1; - idx <<= 1; - } - } - } else if (Res == -1) { - for ( ; k<36; k++ ) { - mpc_uint32_t tmp = mpc_random_int(d); - q[k] = ((tmp >> 24) & 0xFF) + ((tmp >> 16) & 0xFF) + ((tmp >> 8) & 0xFF) + ((tmp >> 0) & 0xFF) - 510; - } - } else if (Res <= 4) { - Table = & mpc_can_Q[1][Res - 3]; - for ( ; k < 36; k += 2 ) { - union { - mpc_int8_t sym; - struct { mpc_int8_t s1:4, s2:4; }; - } tmp; - tmp.sym = mpc_bits_can_dec(r, Table); - q[k] = tmp.s1; - q[k + 1] = tmp.s2; - } - } else if (Res <= 8) { - Tables[0] = & mpc_can_Q [Res - 3][0]; - Tables[1] = & mpc_can_Q [Res - 3][1]; - idx = 2 * thres[Res]; - for ( ; k < 36; k++ ) { - q[k] = mpc_bits_can_dec(r, Tables[idx > thres[Res]]); - idx = (idx >> 1) + absi(q[k]); - } - } else { - for ( ; k < 36; k++ ) { - q[k] = (unsigned char) mpc_bits_can_dec(r, & mpc_can_Q9up); - if (Res != 9) - q[k] = (q[k] << (Res - 9)) | mpc_bits_read(r, Res - 9); - q[k] -= Dc[Res]; - } - } - } - - Res = d->Res_R[n]; - } while (q == d->Q[n].L && (q = d->Q[n].R)); - } -} - diff --git a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/mpc_demux.c b/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/mpc_demux.c deleted file mode 100644 index 63e58e6d..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/mpc_demux.c +++ /dev/null @@ -1,738 +0,0 @@ -/* - Copyright (c) 2005-2009, The Musepack Development Team - 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 the The Musepack Development Team nor the - names of its 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. -*/ - -#include -#include -#include -#include -#include -#include "internal.h" -#include "decoder.h" -#include "huffman.h" -#include "mpc_bits_reader.h" - -/// maximum number of seek points in the table. The distance between points will -/// be adapted so this value is never exceeded. -#define MAX_SEEK_TABLE_SIZE 65536 - -// streaminfo.c -mpc_status streaminfo_read_header_sv8(mpc_streaminfo* si, - const mpc_bits_reader * r_in, - mpc_size_t block_size); -mpc_status streaminfo_read_header_sv7(mpc_streaminfo* si, mpc_bits_reader * r_in); -void streaminfo_encoder_info(mpc_streaminfo* si, const mpc_bits_reader * r_in); -void streaminfo_gain(mpc_streaminfo* si, const mpc_bits_reader * r_in); - -// mpc_decoder.c -void mpc_decoder_reset_scf(mpc_decoder * d, int value); - -enum { - MPC_BUFFER_SWAP = 1, - MPC_BUFFER_FULL = 2, -}; - -static void mpc_demux_clear_buff(mpc_demux * d) -{ - d->bytes_total = 0; - d->bits_reader.buff = d->buffer; - d->bits_reader.count = 8; - d->block_bits = 0; - d->block_frames = 0; -} - -// Returns the amount of unread bytes in the demux buffer. -// Unchecked version - may return a negative value when we've been reading -// past the end of the valid data as a result of some problem with the file. -static mpc_int32_t mpc_unread_bytes_unchecked(mpc_demux * d) { - return d->bytes_total + d->buffer - d->bits_reader.buff - ((8 - d->bits_reader.count) >> 3); -} - -// Returns the amount of unread bytes in the demux buffer. -static mpc_uint32_t mpc_unread_bytes(mpc_demux * d) { - mpc_int32_t unread_bytes = mpc_unread_bytes_unchecked(d); - - if (unread_bytes < 0) return 0; - - return (mpc_uint32_t) unread_bytes; -} - - - -// Returns the number of bytes available in the buffer. -static mpc_uint32_t -mpc_demux_fill(mpc_demux * d, mpc_uint32_t min_bytes, int flags) -{ - mpc_uint32_t unread_bytes = (mpc_uint32_t) mpc_unread_bytes_unchecked(d); - int offset = 0; - - if ((mpc_int32_t) - unread_bytes < 0) return 0; // Error - we've been reading past the end of the buffer - abort - - if (min_bytes == 0 || min_bytes > DEMUX_BUFFER_SIZE || - (unread_bytes < min_bytes && (flags & MPC_BUFFER_FULL) != 0 )) - min_bytes = DEMUX_BUFFER_SIZE; - - if (unread_bytes < min_bytes) { - mpc_uint32_t bytes2read = min_bytes - unread_bytes; - mpc_uint32_t bytes_free = DEMUX_BUFFER_SIZE - d->bytes_total; - mpc_uint32_t bytesread; - - if (flags & MPC_BUFFER_SWAP) { - bytes2read &= -1 << 2; - offset = (unread_bytes + 3) & ( -1 << 2); - offset -= unread_bytes; - } - - if (bytes2read > bytes_free) { - if (d->bits_reader.count == 0) { - d->bits_reader.count = 8; - d->bits_reader.buff++; - } - memmove(d->buffer + offset, d->bits_reader.buff, unread_bytes); - d->bits_reader.buff = d->buffer + offset; - d->bytes_total = unread_bytes + offset; - } - bytesread = d->r->read(d->r, d->buffer + d->bytes_total, bytes2read); - if (bytesread < bytes2read) { - memset(d->buffer + d->bytes_total + bytesread, 0, bytes2read - bytesread); // FIXME : why ? - } - if (flags & MPC_BUFFER_SWAP) { - unsigned int i, * tmp = (unsigned int *) (d->buffer + d->bytes_total); - for(i = 0 ;i < (bytes2read >> 2); i++) - tmp[i] = mpc_swap32(tmp[i]); - } - d->bytes_total += bytesread; - unread_bytes += bytesread; - } - - return unread_bytes; -} - -/** - * seek to a bit position in the stream - * @param d demuxer context - * @param fpos position in the stream in bits from the beginning of mpc datas - * @param min_bytes number of bytes to load after seeking - */ -static mpc_status -mpc_demux_seek(mpc_demux * d, mpc_seek_t fpos, mpc_uint32_t min_bytes) { - mpc_seek_t start_pos, end_pos; - mpc_int_t bit_offset; - - // get current buffer position - end_pos = ((mpc_seek_t)(d->r->tell(d->r))) << 3; - start_pos = end_pos - (d->bytes_total << 3); - - if (fpos >= start_pos && fpos < end_pos) { - d->bits_reader.buff = d->buffer + ((fpos - start_pos) >> 3); - bit_offset = fpos & 7; - d->block_bits = 0; - d->block_frames = 0; - } else { - mpc_seek_t next_pos = fpos >> 3; - if (d->si.stream_version == 7) - next_pos = ((next_pos - d->si.header_position) & (-1 << 2)) + d->si.header_position; - bit_offset = (int) (fpos - (next_pos << 3)); - - mpc_demux_clear_buff(d); - if (!d->r->seek(d->r, (mpc_int32_t) next_pos)) - return MPC_STATUS_FAIL; - } - - if (d->si.stream_version == 7) - mpc_demux_fill(d, (min_bytes + ((bit_offset + 7) >> 3) + 3) & (~3), MPC_BUFFER_SWAP); - else - mpc_demux_fill(d, min_bytes + ((bit_offset + 7) >> 3), 0); - d->bits_reader.buff += bit_offset >> 3; - d->bits_reader.count = 8 - (bit_offset & 7); - - return MPC_STATUS_OK; -} - -/** - * return the current position in the stream (in bits) from the beginning - * of the file - * @param d demuxer context - * @return current stream position in bits - */ -mpc_seek_t mpc_demux_pos(mpc_demux * d) -{ - return (((mpc_seek_t)(d->r->tell(d->r)) - d->bytes_total + - d->bits_reader.buff - d->buffer) << 3) + 8 - d->bits_reader.count; -} - -/** - * Searches for a ID3v2-tag and reads the length (in bytes) of it. - * - * @param d demuxer context - * @return size of tag, in bytes - * @return MPC_STATUS_FAIL on errors of any kind - */ -static mpc_int32_t mpc_demux_skip_id3v2(mpc_demux * d) -{ - mpc_uint8_t tmp [4]; - mpc_bool_t footerPresent; // ID3v2.4-flag - mpc_int32_t size; - - // we must be at the beginning of the stream - mpc_demux_fill(d, 3, 0); - - // check id3-tag - if ( 0 != memcmp( d->bits_reader.buff, "ID3", 3 ) ) - return 0; - - mpc_demux_fill(d, 10, 0); - - mpc_bits_read(&d->bits_reader, 24); // read ID3 - mpc_bits_read(&d->bits_reader, 16); // read tag version - - tmp[0] = mpc_bits_read(&d->bits_reader, 8); // read flags - footerPresent = tmp[0] & 0x10; - if ( tmp[0] & 0x0F ) - return MPC_STATUS_FAIL; // not (yet???) allowed - - tmp[0] = mpc_bits_read(&d->bits_reader, 8); // read size - tmp[1] = mpc_bits_read(&d->bits_reader, 8); // read size - tmp[2] = mpc_bits_read(&d->bits_reader, 8); // read size - tmp[3] = mpc_bits_read(&d->bits_reader, 8); // read size - - if ( (tmp[0] | tmp[1] | tmp[2] | tmp[3]) & 0x80 ) - return MPC_STATUS_FAIL; // not allowed - - // read headerSize (syncsave: 4 * $0xxxxxxx = 28 significant bits) - size = tmp[0] << 21; - size |= tmp[1] << 14; - size |= tmp[2] << 7; - size |= tmp[3]; - - size += 10; //header - - if ( footerPresent ) size += 10; - - // This is called before file headers get read, streamversion etc isn't yet known, demuxing isn't properly initialized and we can't call mpc_demux_seek() from here. - mpc_demux_clear_buff(d); - if (!d->r->seek(d->r, size)) - return MPC_STATUS_FAIL; - - return size; -} - -static mpc_status mpc_demux_seek_init(mpc_demux * d) -{ - size_t seek_table_size; - if (d->seek_table != 0) - return MPC_STATUS_OK; - - d->seek_pwr = 6; - if (d->si.block_pwr > d->seek_pwr) - d->seek_pwr = d->si.block_pwr; - seek_table_size = (2 + d->si.samples / (MPC_FRAME_LENGTH << d->seek_pwr)); - while (seek_table_size > MAX_SEEK_TABLE_SIZE) { - d->seek_pwr++; - seek_table_size = (2 + d->si.samples / (MPC_FRAME_LENGTH << d->seek_pwr)); - } - d->seek_table = malloc((size_t)(seek_table_size * sizeof(mpc_seek_t))); - if (d->seek_table == 0) - return MPC_STATUS_FAIL; - d->seek_table[0] = (mpc_seek_t)mpc_demux_pos(d); - d->seek_table_size = 1; - - return MPC_STATUS_OK; -} - -static mpc_status mpc_demux_ST(mpc_demux * d) -{ - mpc_uint64_t tmp; - mpc_seek_t * table, last[2]; - mpc_bits_reader r = d->bits_reader; - mpc_uint_t i, diff_pwr = 0, mask; - mpc_uint32_t file_table_size; - - if (d->seek_table != 0) - return MPC_STATUS_OK; - - mpc_bits_get_size(&r, &tmp); - file_table_size = (mpc_seek_t) tmp; - d->seek_pwr = d->si.block_pwr + mpc_bits_read(&r, 4); - - tmp = 2 + d->si.samples / (MPC_FRAME_LENGTH << d->seek_pwr); - while (tmp > MAX_SEEK_TABLE_SIZE) { - d->seek_pwr++; - diff_pwr++; - tmp = 2 + d->si.samples / (MPC_FRAME_LENGTH << d->seek_pwr); - } - if ((file_table_size >> diff_pwr) > tmp) - file_table_size = tmp << diff_pwr; - d->seek_table = malloc((size_t) (tmp * sizeof(mpc_seek_t))); - d->seek_table_size = (file_table_size + ((1 << diff_pwr) - 1)) >> diff_pwr; - - table = d->seek_table; - mpc_bits_get_size(&r, &tmp); - table[0] = last[0] = (mpc_seek_t) (tmp + d->si.header_position) * 8; - - if (d->seek_table_size == 1) - return MPC_STATUS_OK; - - mpc_bits_get_size(&r, &tmp); - last[1] = (mpc_seek_t) (tmp + d->si.header_position) * 8; - if (diff_pwr == 0) table[1] = last[1]; - - mask = (1 << diff_pwr) - 1; - for (i = 2; i < file_table_size; i++) { - int code = mpc_bits_golomb_dec(&r, 12); - if (code & 1) - code = -(code & (-1 << 1)); - code <<= 2; - last[i & 1] = code + 2 * last[(i-1) & 1] - last[i & 1]; - if ((i & mask) == 0) - table[i >> diff_pwr] = last[i & 1]; - } - return MPC_STATUS_OK; -} - -static mpc_status mpc_demux_SP(mpc_demux * d, int size, int block_size) -{ - mpc_seek_t cur; - mpc_uint64_t ptr; - mpc_block b; - int st_head_size; - - cur = mpc_demux_pos(d); - mpc_bits_get_size(&d->bits_reader, &ptr); - MPC_AUTO_FAIL( mpc_demux_seek(d, (ptr - size) * 8 + cur, 11) ); - st_head_size = mpc_bits_get_block(&d->bits_reader, &b); - if (memcmp(b.key, "ST", 2) == 0) { - d->chap_pos = (ptr - size + b.size + st_head_size) * 8 + cur; - d->chap_nb = -1; - if (mpc_demux_fill(d, (mpc_uint32_t) b.size, 0) < b.size) - return MPC_STATUS_FAIL; - MPC_AUTO_FAIL( mpc_demux_ST(d) ); - } - return mpc_demux_seek(d, cur, 11 + block_size); -} - -static void mpc_demux_chap_empty(mpc_demux * d) { - free(d->chap); d->chap = 0; - d->chap_nb = 0; // -1 for undefined, 0 for no chapters - d->chap_pos = 0; -} - -static mpc_status mpc_demux_chap_find_inner(mpc_demux * d) -{ - mpc_block b; - int tag_size = 0, chap_size = 0, size, i = 0; - - d->chap_nb = 0; - - if (d->si.stream_version < 8) - return MPC_STATUS_OK; - - if (d->chap_pos == 0) { - mpc_uint64_t cur_pos = (d->si.header_position + 4) * 8; - MPC_AUTO_FAIL( mpc_demux_seek(d, cur_pos, 11) ); // seek to the beginning of the stream - size = mpc_bits_get_block(&d->bits_reader, &b); - while (memcmp(b.key, "SE", 2) != 0) { - mpc_uint64_t new_pos = cur_pos + (size + b.size) * 8; - MPC_AUTO_FAIL(mpc_check_key(b.key)); - - if (memcmp(b.key, "CT", 2) == 0) { - if (d->chap_pos == 0) d->chap_pos = cur_pos; - } else { - d->chap_pos = 0; - } - if (new_pos <= cur_pos) - return MPC_STATUS_FAIL; - cur_pos = new_pos; - - MPC_AUTO_FAIL( mpc_demux_seek(d, cur_pos, 11) ); - size = mpc_bits_get_block(&d->bits_reader, &b); - } - if (d->chap_pos == 0) - d->chap_pos = cur_pos; - } - - mpc_demux_seek(d, d->chap_pos, 20); - size = mpc_bits_get_block(&d->bits_reader, &b); - while (memcmp(b.key, "CT", 2) == 0) { - mpc_uint64_t chap_sample; - d->chap_nb++; - chap_size += size; - size = mpc_bits_get_size(&d->bits_reader, &chap_sample) + 4; - chap_size += size; - tag_size += b.size - size; - MPC_AUTO_FAIL( mpc_demux_seek(d, d->chap_pos + (chap_size + tag_size) * 8, 20) ); - size = mpc_bits_get_block(&d->bits_reader, &b); - } - - if (d->chap_nb > 0) { - char * ptag; - d->chap = malloc(sizeof(mpc_chap_info) * d->chap_nb + tag_size); - if (d->chap == 0) - return MPC_STATUS_FAIL; - - ptag = (char*)(d->chap + d->chap_nb); - - MPC_AUTO_FAIL( mpc_demux_seek(d, d->chap_pos, 11) ); - size = mpc_bits_get_block(&d->bits_reader, &b); - while (memcmp(b.key, "CT", 2) == 0) { - mpc_uint_t tmp_size; - char * tmp_ptag = ptag; - if (mpc_demux_fill(d, 11 + (mpc_uint32_t) b.size, 0) < b.size) - return MPC_STATUS_FAIL; - size = mpc_bits_get_size(&d->bits_reader, &d->chap[i].sample) + 4; - d->chap[i].gain = (mpc_uint16_t) mpc_bits_read(&d->bits_reader, 16); - d->chap[i].peak = (mpc_uint16_t) mpc_bits_read(&d->bits_reader, 16); - - tmp_size = b.size - size; - do { - mpc_uint_t rd_size = tmp_size; - mpc_uint8_t * tmp_buff = d->bits_reader.buff + ((8 - d->bits_reader.count) >> 3); - mpc_uint32_t avail_bytes = d->bytes_total + d->buffer - tmp_buff; - rd_size = mini(rd_size, avail_bytes); - memcpy(tmp_ptag, tmp_buff, rd_size); - tmp_size -= rd_size; - tmp_ptag += rd_size; - d->bits_reader.buff += rd_size; - mpc_demux_fill(d, tmp_size, 0); - } while (tmp_size > 0); - - d->chap[i].tag_size = b.size - size; - d->chap[i].tag = ptag; - ptag += b.size - size; - i++; - size = mpc_bits_get_block(&d->bits_reader, &b); - } - } - - d->bits_reader.buff -= size; - return MPC_STATUS_OK; -} - -static mpc_status mpc_demux_chap_find(mpc_demux * d) { - mpc_status s = mpc_demux_chap_find_inner(d); - if (MPC_IS_FAILURE(s)) - mpc_demux_chap_empty(d); - return s; -} - -/** - * Gets the number of chapters in the stream - * @param d pointer to a musepack demuxer - * @return the number of chapters found in the stream - */ -mpc_int_t mpc_demux_chap_nb(mpc_demux * d) -{ - if (d->chap_nb == -1) - mpc_demux_chap_find(d); - return d->chap_nb; -} - -/** - * Gets datas associated to a given chapter - * The chapter tag is an APEv2 tag without the preamble - * @param d pointer to a musepack demuxer - * @param chap_nb chapter number you want datas (from 0 to mpc_demux_chap_nb(d) - 1) - * @return the chapter information structure - */ -mpc_chap_info const * mpc_demux_chap(mpc_demux * d, int chap_nb) -{ - if (d->chap_nb == -1) - mpc_demux_chap_find(d); - if (chap_nb >= d->chap_nb || chap_nb < 0) - return 0; - return &d->chap[chap_nb]; -} - -static mpc_status mpc_demux_header(mpc_demux * d) -{ - char magic[4]; - - d->si.pns = 0xFF; - d->si.profile_name = "n.a."; - - // get header position - d->si.header_position = mpc_demux_skip_id3v2(d); - if(d->si.header_position < 0) - return MPC_STATUS_FAIL; - - d->si.tag_offset = d->si.total_file_length = d->r->get_size(d->r); - - mpc_demux_fill(d, 4, 0); - magic[0] = mpc_bits_read(&d->bits_reader, 8); - magic[1] = mpc_bits_read(&d->bits_reader, 8); - magic[2] = mpc_bits_read(&d->bits_reader, 8); - magic[3] = mpc_bits_read(&d->bits_reader, 8); - - if (memcmp(magic, "MP+", 3) == 0) { - d->si.stream_version = magic[3] & 15; - d->si.pns = magic[3] >> 4; - if (d->si.stream_version != 7) - return MPC_STATUS_FAIL; - if (mpc_demux_fill(d, 6 * 4, MPC_BUFFER_SWAP) < 6 * 4) // header block size + endian convertion - return MPC_STATUS_FAIL; - MPC_AUTO_FAIL( streaminfo_read_header_sv7(&d->si, &d->bits_reader) ); - } else if (memcmp(magic, "MPCK", 4) == 0) { - mpc_block b; - int size; - mpc_demux_fill(d, 11, 0); // max header block size - size = mpc_bits_get_block(&d->bits_reader, &b); - while( memcmp(b.key, "AP", 2) != 0 ){ // scan all blocks until audio - if (mpc_check_key(b.key) != MPC_STATUS_OK) - return MPC_STATUS_FAIL; - if (b.size > (mpc_uint64_t) DEMUX_BUFFER_SIZE - 11) - return MPC_STATUS_FAIL; - - if (mpc_demux_fill(d, 11 + (mpc_uint32_t) b.size, 0) <= b.size) - return MPC_STATUS_FAIL; - - if (memcmp(b.key, "SH", 2) == 0) { - MPC_AUTO_FAIL( streaminfo_read_header_sv8(&d->si, &d->bits_reader, (mpc_uint32_t) b.size) ); - } else if (memcmp(b.key, "RG", 2) == 0) { - streaminfo_gain(&d->si, &d->bits_reader); - } else if (memcmp(b.key, "EI", 2) == 0) { - streaminfo_encoder_info(&d->si, &d->bits_reader); - } else if (memcmp(b.key, "SO", 2) == 0) { - MPC_AUTO_FAIL( mpc_demux_SP(d, size, (mpc_uint32_t) b.size) ); - } else if (memcmp(b.key, "ST", 2) == 0) { - MPC_AUTO_FAIL( mpc_demux_ST(d) ); - } - d->bits_reader.buff += b.size; - size = mpc_bits_get_block(&d->bits_reader, &b); - } - d->bits_reader.buff -= size; - if (d->si.stream_version == 0) // si not initialized !!! - return MPC_STATUS_FAIL; - } else { - return MPC_STATUS_FAIL; - } - - return MPC_STATUS_OK; -} - -mpc_demux * mpc_demux_init(mpc_reader * p_reader) -{ - mpc_demux* p_tmp = malloc(sizeof(mpc_demux)); - - if (p_tmp != 0) { - memset(p_tmp, 0, sizeof(mpc_demux)); - p_tmp->r = p_reader; - p_tmp->chap_nb = -1; - mpc_demux_clear_buff(p_tmp); - if (mpc_demux_header(p_tmp) == MPC_STATUS_OK && - mpc_demux_seek_init(p_tmp) == MPC_STATUS_OK) { - p_tmp->d = mpc_decoder_init(&p_tmp->si); - } else { - if (p_tmp->seek_table) - free(p_tmp->seek_table); - free(p_tmp); - p_tmp = 0; - } - } - - return p_tmp; -} - -void mpc_demux_exit(mpc_demux * d) -{ - mpc_decoder_exit(d->d); - free(d->seek_table); - free(d->chap); - free(d); -} - -void mpc_demux_get_info(mpc_demux * d, mpc_streaminfo * i) -{ - memcpy(i, &d->si, sizeof d->si); -} - -static mpc_status mpc_demux_decode_inner(mpc_demux * d, mpc_frame_info * i) -{ - mpc_bits_reader r; - if (d->si.stream_version >= 8) { - i->is_key_frame = MPC_FALSE; - - if (d->block_frames == 0) { - mpc_block b = {{0,0},0}; - d->bits_reader.count &= -8; - if (d->d->decoded_samples == (d->seek_table_size << d->seek_pwr) * MPC_FRAME_LENGTH) { - d->seek_table[d->seek_table_size] = (mpc_seek_t) mpc_demux_pos(d); - d->seek_table_size ++; - } - mpc_demux_fill(d, 11, MPC_BUFFER_FULL); // max header block size - mpc_bits_get_block(&d->bits_reader, &b); - while( memcmp(b.key, "AP", 2) != 0 ) { // scan all blocks until audio - MPC_AUTO_FAIL( mpc_check_key(b.key) ); - - if (memcmp(b.key, "SE", 2) == 0) { // end block - i->bits = -1; - return MPC_STATUS_OK; - } - - if (mpc_demux_fill(d, 11 + (mpc_uint32_t) b.size, MPC_BUFFER_FULL) < b.size) - return MPC_STATUS_FAIL; - - d->bits_reader.buff += b.size; - mpc_bits_get_block(&d->bits_reader, &b); - } - d->block_bits = (mpc_uint32_t) b.size * 8; - d->block_frames = 1 << d->si.block_pwr; - i->is_key_frame = MPC_TRUE; - } - if (d->buffer + d->bytes_total - d->bits_reader.buff <= MAX_FRAME_SIZE) - mpc_demux_fill(d, (d->block_bits >> 3) + 1, MPC_BUFFER_FULL); - r = d->bits_reader; - mpc_decoder_decode_frame(d->d, &d->bits_reader, i); - d->block_bits -= ((d->bits_reader.buff - r.buff) << 3) + r.count - d->bits_reader.count; - d->block_frames--; - if (d->block_bits < 0 || (d->block_frames == 0 && d->block_bits > 7)) - return MPC_STATUS_FAIL; - } else { - if (d->d->decoded_samples == (d->seek_table_size << d->seek_pwr) * MPC_FRAME_LENGTH) { - d->seek_table[d->seek_table_size] = (mpc_seek_t) mpc_demux_pos(d); - d->seek_table_size ++; - } - mpc_demux_fill(d, MAX_FRAME_SIZE, MPC_BUFFER_FULL | MPC_BUFFER_SWAP); - d->block_bits = (mpc_int_t) mpc_bits_read(&d->bits_reader, 20); // read frame size - if (MPC_FRAME_LENGTH > d->d->samples - d->d->decoded_samples - 1) d->block_bits += 11; // we will read last frame size - r = d->bits_reader; - mpc_decoder_decode_frame(d->d, &d->bits_reader, i); - if (i->bits != -1 && d->block_bits != ((d->bits_reader.buff - r.buff) << 3) + r.count - d->bits_reader.count) - return MPC_STATUS_FAIL; - } - if (i->bits != -1 && d->buffer + d->bytes_total < d->bits_reader.buff + ((8 - d->bits_reader.count) >> 3)) - return MPC_STATUS_FAIL; - - return MPC_STATUS_OK; -} - -mpc_status mpc_demux_decode(mpc_demux * d, mpc_frame_info * i) { - mpc_status s = mpc_demux_decode_inner(d, i); - if (MPC_IS_FAILURE(s)) - i->bits = -1; // we pretend it's end of file - return s; -} - -mpc_status mpc_demux_seek_second(mpc_demux * d, double seconds) -{ - return mpc_demux_seek_sample(d, (mpc_int64_t)(seconds * (double)d->si.sample_freq + 0.5)); -} - -mpc_status mpc_demux_seek_sample(mpc_demux * d, mpc_uint64_t destsample) -{ - mpc_uint32_t fwd, samples_to_skip, i; - mpc_uint32_t block_samples = MPC_FRAME_LENGTH << d->si.block_pwr; - mpc_seek_t fpos; - - destsample += d->si.beg_silence; - if (destsample > d->si.samples) destsample = d->si.samples; - fwd = (mpc_uint32_t) (destsample / block_samples); - samples_to_skip = MPC_DECODER_SYNTH_DELAY + - (mpc_uint32_t) (destsample % block_samples); - if (d->si.stream_version == 7) { - if (fwd > 32) { - fwd -= 32; - samples_to_skip += MPC_FRAME_LENGTH * 32; - } else { - samples_to_skip += MPC_FRAME_LENGTH * fwd; - fwd = 0; - } - } - - i = fwd >> (d->seek_pwr - d->si.block_pwr); - if (i >= d->seek_table_size) - i = d->seek_table_size - 1; - fpos = d->seek_table[i]; - i <<= d->seek_pwr - d->si.block_pwr; - d->d->decoded_samples = i * block_samples; - - if (d->si.stream_version >= 8) { - mpc_block b; - int size; - mpc_demux_seek(d, fpos, 11); - size = mpc_bits_get_block(&d->bits_reader, &b); - while(i < fwd) { - if (memcmp(b.key, "AP", 2) == 0) { - if (d->d->decoded_samples == (d->seek_table_size << d->seek_pwr) * MPC_FRAME_LENGTH) { - d->seek_table[d->seek_table_size] = (mpc_seek_t) mpc_demux_pos(d) - 8 * size; - d->seek_table_size ++; - } - d->d->decoded_samples += block_samples; - i++; - } - fpos += ((mpc_uint32_t)b.size + size) * 8; - mpc_demux_seek(d, fpos, 11); - size = mpc_bits_get_block(&d->bits_reader, &b); - } - d->bits_reader.buff -= size; - } else { - mpc_decoder_reset_scf(d->d, fwd != 0); - mpc_demux_seek(d, fpos, 4); - for( ; i < fwd; i++){ - if (d->d->decoded_samples == (d->seek_table_size << d->seek_pwr) * MPC_FRAME_LENGTH) { - d->seek_table[d->seek_table_size] = (mpc_seek_t) mpc_demux_pos(d); - d->seek_table_size ++; - } - d->d->decoded_samples += block_samples; - fpos += mpc_bits_read(&d->bits_reader, 20) + 20; - mpc_demux_seek(d, fpos, 4); - } - } - d->d->samples_to_skip = samples_to_skip; - return MPC_STATUS_OK; -} - -void mpc_set_replay_level(mpc_demux * d, float level, mpc_bool_t use_gain, - mpc_bool_t use_title, mpc_bool_t clip_prevention) -{ - float peak = (float) ( use_title ? d->si.peak_title : d->si.peak_album ); - float gain = (float) ( use_title ? d->si.gain_title : d->si.gain_album ); - - if(!use_gain && !clip_prevention) - return; - - if(!peak) - peak = 1.; - else - peak = (float) ( (1 << 15) / pow(10, peak / (20 * 256)) ); - - if(!gain) - gain = 1.; - else - gain = (float) pow(10, (level - gain / 256) / 20); - - if(clip_prevention && (peak < gain || !use_gain)) - gain = peak; - - mpc_decoder_scale_output(d->d, gain); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/mpc_reader.c b/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/mpc_reader.c deleted file mode 100644 index 06aa49ed..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/mpc_reader.c +++ /dev/null @@ -1,144 +0,0 @@ -/* - Copyright (c) 2005-2009, The Musepack Development Team - 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 the The Musepack Development Team nor the - names of its 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. -*/ -/// \file mpc_reader.c -/// Contains implementations for simple file-based mpc_reader -#include -#include "internal.h" -#include - -#define STDIO_MAGIC 0xF34B963C ///< Just a random safe-check value... -typedef struct mpc_reader_stdio_t { - FILE *p_file; - int file_size; - mpc_bool_t is_seekable; - mpc_int32_t magic; -} mpc_reader_stdio; - -/// mpc_reader callback implementations -static mpc_int32_t -read_stdio(mpc_reader *p_reader, void *ptr, mpc_int32_t size) -{ - mpc_reader_stdio *p_stdio = (mpc_reader_stdio*) p_reader->data; - if(p_stdio->magic != STDIO_MAGIC) return MPC_STATUS_FAIL; - return (mpc_int32_t) fread(ptr, 1, size, p_stdio->p_file); -} - -static mpc_bool_t -seek_stdio(mpc_reader *p_reader, mpc_int32_t offset) -{ - mpc_reader_stdio *p_stdio = (mpc_reader_stdio*) p_reader->data; - if(p_stdio->magic != STDIO_MAGIC) return MPC_FALSE; - return p_stdio->is_seekable ? fseek(p_stdio->p_file, offset, SEEK_SET) == 0 : MPC_FALSE; -} - -static mpc_int32_t -tell_stdio(mpc_reader *p_reader) -{ - mpc_reader_stdio *p_stdio = (mpc_reader_stdio*) p_reader->data; - if(p_stdio->magic != STDIO_MAGIC) return MPC_STATUS_FAIL; - return ftell(p_stdio->p_file); -} - -static mpc_int32_t -get_size_stdio(mpc_reader *p_reader) -{ - mpc_reader_stdio *p_stdio = (mpc_reader_stdio*) p_reader->data; - if(p_stdio->magic != STDIO_MAGIC) return MPC_STATUS_FAIL; - return p_stdio->file_size; -} - -static mpc_bool_t -canseek_stdio(mpc_reader *p_reader) -{ - mpc_reader_stdio *p_stdio = (mpc_reader_stdio*) p_reader->data; - if(p_stdio->magic != STDIO_MAGIC) return MPC_FALSE; - return p_stdio->is_seekable; -} - -mpc_status -mpc_reader_init_stdio_stream(mpc_reader * p_reader, FILE * p_file) -{ - mpc_reader tmp_reader; mpc_reader_stdio *p_stdio; int err; - - p_stdio = NULL; - memset(&tmp_reader, 0, sizeof tmp_reader); - p_stdio = malloc(sizeof *p_stdio); - if(!p_stdio) return MPC_STATUS_FAIL; - memset(p_stdio, 0, sizeof *p_stdio); - - p_stdio->magic = STDIO_MAGIC; - p_stdio->p_file = p_file; - p_stdio->is_seekable = MPC_TRUE; - err = fseek(p_stdio->p_file, 0, SEEK_END); - if(err < 0) goto clean; - err = ftell(p_stdio->p_file); - if(err < 0) goto clean; - p_stdio->file_size = err; - err = fseek(p_stdio->p_file, 0, SEEK_SET); - if(err < 0) goto clean; - - tmp_reader.data = p_stdio; - tmp_reader.canseek = canseek_stdio; - tmp_reader.get_size = get_size_stdio; - tmp_reader.read = read_stdio; - tmp_reader.seek = seek_stdio; - tmp_reader.tell = tell_stdio; - - *p_reader = tmp_reader; - return MPC_STATUS_OK; -clean: - if(p_stdio && p_stdio->p_file) - fclose(p_stdio->p_file); - free(p_stdio); - return MPC_STATUS_FAIL; -} - -mpc_status -mpc_reader_init_stdio(mpc_reader *p_reader, const char *filename) -{ - FILE * stream = fopen(filename, "rb"); - if (stream == NULL) return MPC_STATUS_FAIL; - return mpc_reader_init_stdio_stream(p_reader,stream); -} - -void -mpc_reader_exit_stdio(mpc_reader *p_reader) -{ - mpc_reader_stdio *p_stdio = (mpc_reader_stdio*) p_reader->data; - if(p_stdio->magic != STDIO_MAGIC) return; - fclose(p_stdio->p_file); - free(p_stdio); - p_reader->data = NULL; -} - diff --git a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/mpcdec_math.h b/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/mpcdec_math.h deleted file mode 100644 index 59a77a48..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/mpcdec_math.h +++ /dev/null @@ -1,135 +0,0 @@ -/* - Copyright (c) 2005-2009, The Musepack Development Team - 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 the The Musepack Development Team nor the - names of its 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. -*/ -/// \file mpcdec_math.h -/// Libmpcdec internal math routines. -#ifndef _MPCDEC_MATH_H_ -#define _MPCDEC_MATH_H_ -#ifdef WIN32 -#pragma once -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef MPC_FIXED_POINT - -#ifdef _WIN32_WCE -#include -#define MPC_HAVE_MULHIGH -#endif - -//in fixedpoint mode, results in decode output buffer are in -MPC_FIXED_POINT_SCALE ... MPC_FIXED_POINT_SCALE range - -typedef mpc_int64_t MPC_SAMPLE_FORMAT_MULTIPLY; - -#define MAKE_MPC_SAMPLE(X) (MPC_SAMPLE_FORMAT)((double)(X) * (double)(((mpc_int64_t)1)<> MPC_FIXED_POINT_FRACTPART) - -#define MPC_MULTIPLY_EX_NOTRUNCATE(X,Y,Z) \ - (((MPC_SAMPLE_FORMAT_MULTIPLY)(X) * (MPC_SAMPLE_FORMAT_MULTIPLY)(Y)) >> (Z)) - -#ifdef _DEBUG -static mpc_inline MPC_SAMPLE_FORMAT MPC_MULTIPLY(MPC_SAMPLE_FORMAT item1,MPC_SAMPLE_FORMAT item2) -{ - MPC_SAMPLE_FORMAT_MULTIPLY temp = MPC_MULTIPLY_NOTRUNCATE(item1,item2); - assert(temp == (MPC_SAMPLE_FORMAT_MULTIPLY)(MPC_SAMPLE_FORMAT)temp); - return (MPC_SAMPLE_FORMAT)temp; -} - -static mpc_inline MPC_SAMPLE_FORMAT MPC_MULTIPLY_EX(MPC_SAMPLE_FORMAT item1,MPC_SAMPLE_FORMAT item2,unsigned shift) -{ - MPC_SAMPLE_FORMAT_MULTIPLY temp = MPC_MULTIPLY_EX_NOTRUNCATE(item1,item2,shift); - assert(temp == (MPC_SAMPLE_FORMAT_MULTIPLY)(MPC_SAMPLE_FORMAT)temp); - return (MPC_SAMPLE_FORMAT)temp; -} - -#else - -#define MPC_MULTIPLY(X,Y) ((MPC_SAMPLE_FORMAT)MPC_MULTIPLY_NOTRUNCATE(X,Y)) -#define MPC_MULTIPLY_EX(X,Y,Z) ((MPC_SAMPLE_FORMAT)MPC_MULTIPLY_EX_NOTRUNCATE(X,Y,Z)) - -#endif - -#ifdef MPC_HAVE_MULHIGH -#define MPC_MULTIPLY_FRACT(X,Y) _MulHigh(X,Y) -#else -#define MPC_MULTIPLY_FRACT(X,Y) MPC_MULTIPLY_EX(X,Y,32) -#endif - -#define MPC_MAKE_FRACT_CONST(X) (MPC_SAMPLE_FORMAT)((X) * (double)(((mpc_int64_t)1)<<32) ) -#define MPC_MULTIPLY_FRACT_CONST(X,Y) MPC_MULTIPLY_FRACT(X,MPC_MAKE_FRACT_CONST(Y)) -#define MPC_MULTIPLY_FRACT_CONST_FIX(X,Y,Z) ( MPC_MULTIPLY_FRACT(X,MPC_MAKE_FRACT_CONST( Y / (1<<(Z)) )) << (Z) ) -#define MPC_MULTIPLY_FRACT_CONST_SHR(X,Y,Z) MPC_MULTIPLY_FRACT(X,MPC_MAKE_FRACT_CONST( Y / (1<<(Z)) )) - -#define MPC_MULTIPLY_FLOAT_INT(X,Y) ((X)*(Y)) -#define MPC_SCALE_CONST(X,Y,Z) MPC_MULTIPLY_EX(X,MAKE_MPC_SAMPLE_EX(Y,Z),(Z)) -#define MPC_SCALE_CONST_SHL(X,Y,Z,S) MPC_MULTIPLY_EX(X,MAKE_MPC_SAMPLE_EX(Y,Z),(Z)-(S)) -#define MPC_SCALE_CONST_SHR(X,Y,Z,S) MPC_MULTIPLY_EX(X,MAKE_MPC_SAMPLE_EX(Y,Z),(Z)+(S)) -#define MPC_SHR(X,Y) ((X)>>(Y)) -#define MPC_SHL(X,Y) ((X)<<(Y)) - -#else - -//in floating-point mode, decoded samples are in -1...1 range - -#define MAKE_MPC_SAMPLE(X) ((MPC_SAMPLE_FORMAT)(X)) -#define MAKE_MPC_SAMPLE_EX(X,Y) ((MPC_SAMPLE_FORMAT)(X)) - -#define MPC_MULTIPLY_FRACT(X,Y) ((X)*(Y)) -#define MPC_MAKE_FRACT_CONST(X) (X) -#define MPC_MULTIPLY_FRACT_CONST(X,Y) MPC_MULTPLY_FRACT(X,MPC_MAKE_FRACT_CONST(Y)) -#define MPC_MULTIPLY_FRACT_CONST_SHR(X,Y,Z) MPC_MULTIPLY_FRACT(X,MPC_MAKE_FRACT_CONST( Y )) -#define MPC_MULTIPLY_FRACT_CONST_FIX(X,Y,Z) MPC_MULTIPLY_FRACT(X,MPC_MAKE_FRACT_CONST( Y )) - -#define MPC_MULTIPLY_FLOAT_INT(X,Y) ((X)*(Y)) -#define MPC_MULTIPLY(X,Y) ((X)*(Y)) -#define MPC_MULTIPLY_EX(X,Y,Z) ((X)*(Y)) -#define MPC_SCALE_CONST(X,Y,Z) ((X)*(Y)) -#define MPC_SCALE_CONST_SHL(X,Y,Z,S) ((X)*(Y)) -#define MPC_SCALE_CONST_SHR(X,Y,Z,S) ((X)*(Y)) -#define MPC_SHR(X,Y) (X) -#define MPC_SHL(X,Y) (X) - -#endif - -#ifdef __cplusplus -} -#endif -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/requant.c b/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/requant.c deleted file mode 100644 index c74d145b..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/requant.c +++ /dev/null @@ -1,124 +0,0 @@ -/* - Copyright (c) 2005-2009, The Musepack Development Team - 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 the The Musepack Development Team nor the - names of its 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. -*/ -/// \file requant.c -/// Requantization function implementations. -/// \todo document me -#include - -#include "requant.h" -#include "mpcdec_math.h" -#include "decoder.h" - -/* C O N S T A N T S */ -// Bits per sample for chosen quantizer -const mpc_uint8_t Res_bit [18] = { - 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 -}; - -// Requantization coefficients -// 65536/step bzw. 65536/(2*D+1) - -#define _(X) MAKE_MPC_SAMPLE_EX(X,14) - -const MPC_SAMPLE_FORMAT __Cc [1 + 18] = { - _(111.285962475327f), // 32768/2/255*sqrt(3) - _(65536.000000000000f), _(21845.333333333332f), _(13107.200000000001f), _(9362.285714285713f), - _(7281.777777777777f), _(4369.066666666666f), _(2114.064516129032f), _(1040.253968253968f), - _(516.031496062992f), _(257.003921568627f), _(128.250489236790f), _(64.062561094819f), - _(32.015632633121f), _(16.003907203907f), _(8.000976681723f), _(4.000244155527f), - _(2.000061037018f), _(1.000015259021f) -}; - -#undef _ - -// Requantization offset -// 2*D+1 = steps of quantizer -const mpc_int16_t __Dc [1 + 18] = { - 2, - 0, 1, 2, 3, 4, 7, 15, 31, 63, - 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767 -}; - -#ifdef MPC_FIXED_POINT -static mpc_uint32_t find_shift(double fval) -{ - mpc_int64_t val = (mpc_int64_t) fval; - mpc_uint32_t ptr = 0; - if(val<0) - val = -val; - while(val) - { - val >>= 1; - ptr++; - } - return ptr > 31 ? 0 : 31 - ptr; -} -#endif - -/* F U N C T I O N S */ - -#define SET_SCF(N,X) d->SCF[N] = MAKE_MPC_SAMPLE_EX(X,d->SCF_shift[N] = (mpc_uint8_t) find_shift(X)); - -void -mpc_decoder_scale_output(mpc_decoder *d, double factor) -{ - mpc_int32_t n; double f1, f2; - -#ifndef MPC_FIXED_POINT - factor *= 1.0 / (double) (1<<(MPC_FIXED_POINT_SHIFT-1)); -#else - factor *= 1.0 / (double) (1<<(16-MPC_FIXED_POINT_SHIFT)); -#endif - f1 = f2 = factor; - - // handles +1.58...-98.41 dB, where's scf[n] / scf[n-1] = 1.20050805774840750476 - - SET_SCF(1,factor); - - f1 *= 0.83298066476582673961; - f2 *= 1/0.83298066476582673961; - - for ( n = 1; n <= 128; n++ ) { - SET_SCF((mpc_uint8_t)(1+n),f1); - SET_SCF((mpc_uint8_t)(1-n),f2); - f1 *= 0.83298066476582673961; - f2 *= 1/0.83298066476582673961; - } -} - -void -mpc_decoder_init_quant(mpc_decoder *d, double scale_factor) -{ - mpc_decoder_scale_output(d, scale_factor); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/requant.h b/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/requant.h deleted file mode 100644 index eb3124db..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/requant.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - Copyright (c) 2005-2009, The Musepack Development Team - 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 the The Musepack Development Team nor the - names of its 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. -*/ -/// \file requant.h -/// Requantization function definitions. -#ifndef _MPCDEC_REQUANT_H_ -#define _MPCDEC_REQUANT_H_ -#ifdef WIN32 -#pragma once -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -/* C O N S T A N T S */ -const mpc_uint8_t Res_bit [18]; ///< Bits per sample for chosen quantizer -const MPC_SAMPLE_FORMAT __Cc [1 + 18]; ///< Requantization coefficients -const mpc_int16_t __Dc [1 + 18]; ///< Requantization offset - -#define Cc (__Cc + 1) -#define Dc (__Dc + 1) - - -#ifdef __cplusplus -} -#endif -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/streaminfo.c b/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/streaminfo.c deleted file mode 100644 index 0e2e844f..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/streaminfo.c +++ /dev/null @@ -1,245 +0,0 @@ -/* - Copyright (c) 2005-2009, The Musepack Development Team - 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 the The Musepack Development Team nor the - names of its 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. -*/ -/// \file streaminfo.c -/// Implementation of streaminfo reading functions. - -#include -#include -#include -#include -#include "internal.h" -#include "huffman.h" -#include "mpc_bits_reader.h" - -unsigned long mpc_crc32(unsigned char *buf, int len); - -static const char na[] = "n.a."; -static char const * const versionNames[] = { - na, "'Unstable/Experimental'", na, na, na, "'quality 0'", "'quality 1'", - "'Telephone'", "'Thumb'", "'Radio'", "'Standard'", "'Extreme'", "'Insane'", - "'BrainDead'", "'quality 9'", "'quality 10'" -}; -static const mpc_int32_t samplefreqs[8] = { 44100, 48000, 37800, 32000 }; - -static const char * -mpc_get_version_string(float profile) // profile is 0...15, where 7...13 is used -{ - return profile >= sizeof versionNames / sizeof *versionNames ? na : versionNames[(int)profile]; -} - -static void -mpc_get_encoder_string(mpc_streaminfo* si) -{ - int ver = si->encoder_version; - if (si->stream_version >= 8) - ver = (si->encoder_version >> 24) * 100 + ((si->encoder_version >> 16) & 0xFF); - if (ver <= 116) { - if (ver == 0) { - sprintf(si->encoder, "Buschmann 1.7.0...9, Klemm 0.90...1.05"); - } else { - switch (ver % 10) { - case 0: - sprintf(si->encoder, "Release %u.%u", ver / 100, - ver / 10 % 10); - break; - case 2: case 4: case 6: case 8: - sprintf(si->encoder, "Beta %u.%02u", ver / 100, - ver % 100); - break; - default: - sprintf(si->encoder, "--Alpha-- %u.%02u", - ver / 100, ver % 100); - break; - } - } - } else { - int major = si->encoder_version >> 24; - int minor = (si->encoder_version >> 16) & 0xFF; - int build = (si->encoder_version >> 8) & 0xFF; - char * tmp = "--Stable--"; - - if (minor & 1) - tmp = "--Unstable--"; - - sprintf(si->encoder, "%s %u.%u.%u", tmp, major, minor, build); - } -} - -static mpc_status check_streaminfo(mpc_streaminfo * si) -{ - if (si->max_band == 0 || si->max_band >= 32 - || si->channels > 2 || si->channels == 0 || si->sample_freq == 0) - return MPC_STATUS_FAIL; - return MPC_STATUS_OK; -} - -/// Reads streaminfo from SV7 header. -mpc_status -streaminfo_read_header_sv7(mpc_streaminfo* si, mpc_bits_reader * r) -{ - mpc_uint16_t Estimatedpeak_title = 0; - mpc_uint32_t frames, last_frame_samples; - - si->bitrate = 0; - frames = (mpc_bits_read(r, 16) << 16) | mpc_bits_read(r, 16); - mpc_bits_read(r, 1); // intensity stereo : should be 0 - si->ms = mpc_bits_read(r, 1); - si->max_band = mpc_bits_read(r, 6); - si->profile = mpc_bits_read(r, 4); - si->profile_name = mpc_get_version_string(si->profile); - mpc_bits_read(r, 2); // Link ? - si->sample_freq = samplefreqs[mpc_bits_read(r, 2)]; - Estimatedpeak_title = (mpc_uint16_t) mpc_bits_read(r, 16); // read the ReplayGain data - si->gain_title = (mpc_uint16_t) mpc_bits_read(r, 16); - si->peak_title = (mpc_uint16_t) mpc_bits_read(r, 16); - si->gain_album = (mpc_uint16_t) mpc_bits_read(r, 16); - si->peak_album = (mpc_uint16_t) mpc_bits_read(r, 16); - si->is_true_gapless = mpc_bits_read(r, 1); // true gapless: used? - last_frame_samples = mpc_bits_read(r, 11); // true gapless: valid samples for last frame - si->fast_seek = mpc_bits_read(r, 1); // fast seeking - mpc_bits_read(r, 19); // unused - si->encoder_version = mpc_bits_read(r, 8); - si->channels = 2; - si->block_pwr = 0; - - // convert gain info - if (si->gain_title != 0) { - int tmp = (int)((MPC_OLD_GAIN_REF - (mpc_int16_t)si->gain_title / 100.) * 256. + .5); - if (tmp >= (1 << 16) || tmp < 0) tmp = 0; - si->gain_title = (mpc_int16_t) tmp; - } - - if (si->gain_album != 0) { - int tmp = (int)((MPC_OLD_GAIN_REF - (mpc_int16_t)si->gain_album / 100.) * 256. + .5); - if (tmp >= (1 << 16) || tmp < 0) tmp = 0; - si->gain_album = (mpc_int16_t) tmp; - } - - if (si->peak_title != 0) - si->peak_title = (mpc_uint16_t) (log10(si->peak_title) * 20 * 256 + .5); - - if (si->peak_album != 0) - si->peak_album = (mpc_uint16_t) (log10(si->peak_album) * 20 * 256 + .5); - - mpc_get_encoder_string(si); - - if (last_frame_samples == 0) last_frame_samples = MPC_FRAME_LENGTH; - else if (last_frame_samples > MPC_FRAME_LENGTH) return MPC_STATUS_FAIL; - si->samples = (mpc_int64_t) frames * MPC_FRAME_LENGTH; - if (si->is_true_gapless) - si->samples -= (MPC_FRAME_LENGTH - last_frame_samples); - else - si->samples -= MPC_DECODER_SYNTH_DELAY; - - si->average_bitrate = (si->tag_offset - si->header_position) * 8.0 - * si->sample_freq / si->samples; - - return check_streaminfo(si); -} - -/// Reads replay gain datas -void streaminfo_gain(mpc_streaminfo* si, const mpc_bits_reader * r_in) -{ - mpc_bits_reader r = *r_in; - - int version = mpc_bits_read(&r, 8); // gain version - if (version != 1) // we only know ver 1 - return; - si->gain_title = (mpc_uint16_t) mpc_bits_read(&r, 16); - si->peak_title = (mpc_uint16_t) mpc_bits_read(&r, 16); - si->gain_album = (mpc_uint16_t) mpc_bits_read(&r, 16); - si->peak_album = (mpc_uint16_t) mpc_bits_read(&r, 16); -} - -/// Reads streaminfo from SV8 header. -mpc_status -streaminfo_read_header_sv8(mpc_streaminfo* si, const mpc_bits_reader * r_in, - mpc_size_t block_size) -{ - mpc_uint32_t CRC; - mpc_bits_reader r = *r_in; - - CRC = (mpc_bits_read(&r, 16) << 16) | mpc_bits_read(&r, 16); - if (CRC != mpc_crc32(r.buff + 1 - (r.count >> 3), (int)block_size - 4)) - return MPC_STATUS_FAIL; - - si->stream_version = mpc_bits_read(&r, 8); - if (si->stream_version != 8) - return MPC_STATUS_FAIL; - - mpc_bits_get_size(&r, &si->samples); - mpc_bits_get_size(&r, &si->beg_silence); - - si->is_true_gapless = 1; - si->sample_freq = samplefreqs[mpc_bits_read(&r, 3)]; - si->max_band = mpc_bits_read(&r, 5) + 1; - si->channels = mpc_bits_read(&r, 4) + 1; - si->ms = mpc_bits_read(&r, 1); - si->block_pwr = mpc_bits_read(&r, 3) * 2; - - si->bitrate = 0; - - if ((si->samples - si->beg_silence) != 0) - si->average_bitrate = (si->tag_offset - si->header_position) * 8.0 - * si->sample_freq / (si->samples - si->beg_silence); - - return check_streaminfo(si); -} - -/// Reads encoder informations -void streaminfo_encoder_info(mpc_streaminfo* si, const mpc_bits_reader * r_in) -{ - mpc_bits_reader r = *r_in; - - si->profile = mpc_bits_read(&r, 7) / 8.; - si->profile_name = mpc_get_version_string(si->profile); - si->pns = mpc_bits_read(&r, 1); - si->encoder_version = mpc_bits_read(&r, 8) << 24; // major - si->encoder_version |= mpc_bits_read(&r, 8) << 16; // minor - si->encoder_version |= mpc_bits_read(&r, 8) << 8; // build - - - mpc_get_encoder_string(si); -} - -double -mpc_streaminfo_get_length(mpc_streaminfo * si) -{ - return (double) (si->samples - si->beg_silence) / si->sample_freq; -} - -mpc_int64_t mpc_streaminfo_get_length_samples(mpc_streaminfo *si) -{ - return si->samples - si->beg_silence; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/synth_filter.c b/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/synth_filter.c deleted file mode 100644 index 0d0c3453..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcdec/synth_filter.c +++ /dev/null @@ -1,430 +0,0 @@ -/* - Copyright (c) 2005-2009, The Musepack Development Team - 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 the The Musepack Development Team nor the - names of its 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. -*/ -/// \file synth_filter.c -/// Synthesis functions. -/// \todo document me -#include -#include -#include "decoder.h" -#include "mpcdec_math.h" - -/* C O N S T A N T S */ -#define MPC_FIXED_POINT_SYNTH_FIX 2 - -#undef _ -#ifdef MPC_FIXED_POINT -#define _(value) MPC_MAKE_FRACT_CONST((double)value/(double)(0x40000)) -#else -#define _(value) MAKE_MPC_SAMPLE((double)value/(double)(0x10000)) -#endif - - -static const MPC_SAMPLE_FORMAT Di_opt [32] [16] = { - { _( 0), _( -29), _( 213), _( -459), _( 2037), _(-5153), _( 6574), _(-37489), _(75038), _(37489), _(6574), _( 5153), _(2037), _( 459), _(213), _(29) }, - { _( -1), _( -31), _( 218), _( -519), _( 2000), _(-5517), _( 5959), _(-39336), _(74992), _(35640), _(7134), _( 4788), _(2063), _( 401), _(208), _(26) }, - { _( -1), _( -35), _( 222), _( -581), _( 1952), _(-5879), _( 5288), _(-41176), _(74856), _(33791), _(7640), _( 4425), _(2080), _( 347), _(202), _(24) }, - { _( -1), _( -38), _( 225), _( -645), _( 1893), _(-6237), _( 4561), _(-43006), _(74630), _(31947), _(8092), _( 4063), _(2087), _( 294), _(196), _(21) }, - { _( -1), _( -41), _( 227), _( -711), _( 1822), _(-6589), _( 3776), _(-44821), _(74313), _(30112), _(8492), _( 3705), _(2085), _( 244), _(190), _(19) }, - { _( -1), _( -45), _( 228), _( -779), _( 1739), _(-6935), _( 2935), _(-46617), _(73908), _(28289), _(8840), _( 3351), _(2075), _( 197), _(183), _(17) }, - { _( -1), _( -49), _( 228), _( -848), _( 1644), _(-7271), _( 2037), _(-48390), _(73415), _(26482), _(9139), _( 3004), _(2057), _( 153), _(176), _(16) }, - { _( -2), _( -53), _( 227), _( -919), _( 1535), _(-7597), _( 1082), _(-50137), _(72835), _(24694), _(9389), _( 2663), _(2032), _( 111), _(169), _(14) }, - { _( -2), _( -58), _( 224), _( -991), _( 1414), _(-7910), _( 70), _(-51853), _(72169), _(22929), _(9592), _( 2330), _(2001), _( 72), _(161), _(13) }, - { _( -2), _( -63), _( 221), _(-1064), _( 1280), _(-8209), _( -998), _(-53534), _(71420), _(21189), _(9750), _( 2006), _(1962), _( 36), _(154), _(11) }, - { _( -2), _( -68), _( 215), _(-1137), _( 1131), _(-8491), _( -2122), _(-55178), _(70590), _(19478), _(9863), _( 1692), _(1919), _( 2), _(147), _(10) }, - { _( -3), _( -73), _( 208), _(-1210), _( 970), _(-8755), _( -3300), _(-56778), _(69679), _(17799), _(9935), _( 1388), _(1870), _( -29), _(139), _( 9) }, - { _( -3), _( -79), _( 200), _(-1283), _( 794), _(-8998), _( -4533), _(-58333), _(68692), _(16155), _(9966), _( 1095), _(1817), _( -57), _(132), _( 8) }, - { _( -4), _( -85), _( 189), _(-1356), _( 605), _(-9219), _( -5818), _(-59838), _(67629), _(14548), _(9959), _( 814), _(1759), _( -83), _(125), _( 7) }, - { _( -4), _( -91), _( 177), _(-1428), _( 402), _(-9416), _( -7154), _(-61289), _(66494), _(12980), _(9916), _( 545), _(1698), _(-106), _(117), _( 7) }, - { _( -5), _( -97), _( 163), _(-1498), _( 185), _(-9585), _( -8540), _(-62684), _(65290), _(11455), _(9838), _( 288), _(1634), _(-127), _(111), _( 6) }, - { _( -5), _(-104), _( 146), _(-1567), _( -45), _(-9727), _( -9975), _(-64019), _(64019), _( 9975), _(9727), _( 45), _(1567), _(-146), _(104), _( 5) }, - { _( -6), _(-111), _( 127), _(-1634), _( -288), _(-9838), _(-11455), _(-65290), _(62684), _( 8540), _(9585), _( -185), _(1498), _(-163), _( 97), _( 5) }, - { _( -7), _(-117), _( 106), _(-1698), _( -545), _(-9916), _(-12980), _(-66494), _(61289), _( 7154), _(9416), _( -402), _(1428), _(-177), _( 91), _( 4) }, - { _( -7), _(-125), _( 83), _(-1759), _( -814), _(-9959), _(-14548), _(-67629), _(59838), _( 5818), _(9219), _( -605), _(1356), _(-189), _( 85), _( 4) }, - { _( -8), _(-132), _( 57), _(-1817), _(-1095), _(-9966), _(-16155), _(-68692), _(58333), _( 4533), _(8998), _( -794), _(1283), _(-200), _( 79), _( 3) }, - { _( -9), _(-139), _( 29), _(-1870), _(-1388), _(-9935), _(-17799), _(-69679), _(56778), _( 3300), _(8755), _( -970), _(1210), _(-208), _( 73), _( 3) }, - { _(-10), _(-147), _( -2), _(-1919), _(-1692), _(-9863), _(-19478), _(-70590), _(55178), _( 2122), _(8491), _(-1131), _(1137), _(-215), _( 68), _( 2) }, - { _(-11), _(-154), _( -36), _(-1962), _(-2006), _(-9750), _(-21189), _(-71420), _(53534), _( 998), _(8209), _(-1280), _(1064), _(-221), _( 63), _( 2) }, - { _(-13), _(-161), _( -72), _(-2001), _(-2330), _(-9592), _(-22929), _(-72169), _(51853), _( -70), _(7910), _(-1414), _( 991), _(-224), _( 58), _( 2) }, - { _(-14), _(-169), _(-111), _(-2032), _(-2663), _(-9389), _(-24694), _(-72835), _(50137), _(-1082), _(7597), _(-1535), _( 919), _(-227), _( 53), _( 2) }, - { _(-16), _(-176), _(-153), _(-2057), _(-3004), _(-9139), _(-26482), _(-73415), _(48390), _(-2037), _(7271), _(-1644), _( 848), _(-228), _( 49), _( 1) }, - { _(-17), _(-183), _(-197), _(-2075), _(-3351), _(-8840), _(-28289), _(-73908), _(46617), _(-2935), _(6935), _(-1739), _( 779), _(-228), _( 45), _( 1) }, - { _(-19), _(-190), _(-244), _(-2085), _(-3705), _(-8492), _(-30112), _(-74313), _(44821), _(-3776), _(6589), _(-1822), _( 711), _(-227), _( 41), _( 1) }, - { _(-21), _(-196), _(-294), _(-2087), _(-4063), _(-8092), _(-31947), _(-74630), _(43006), _(-4561), _(6237), _(-1893), _( 645), _(-225), _( 38), _( 1) }, - { _(-24), _(-202), _(-347), _(-2080), _(-4425), _(-7640), _(-33791), _(-74856), _(41176), _(-5288), _(5879), _(-1952), _( 581), _(-222), _( 35), _( 1) }, - { _(-26), _(-208), _(-401), _(-2063), _(-4788), _(-7134), _(-35640), _(-74992), _(39336), _(-5959), _(5517), _(-2000), _( 519), _(-218), _( 31), _( 1) } -}; - -#undef _ - -static void -mpc_compute_new_V(const MPC_SAMPLE_FORMAT* p_sample, MPC_SAMPLE_FORMAT* pV) -{ - // Calculating new V-buffer values for left channel - // calculate new V-values (ISO-11172-3, p. 39) - // based upon fast-MDCT algorithm by Byeong Gi Lee - MPC_SAMPLE_FORMAT A00, A01, A02, A03, A04, A05, A06, A07, A08, A09, A10, A11, A12, A13, A14, A15; - MPC_SAMPLE_FORMAT B00, B01, B02, B03, B04, B05, B06, B07, B08, B09, B10, B11, B12, B13, B14, B15; - MPC_SAMPLE_FORMAT tmp; - - A00 = p_sample[ 0] + p_sample[31]; - A01 = p_sample[ 1] + p_sample[30]; - A02 = p_sample[ 2] + p_sample[29]; - A03 = p_sample[ 3] + p_sample[28]; - A04 = p_sample[ 4] + p_sample[27]; - A05 = p_sample[ 5] + p_sample[26]; - A06 = p_sample[ 6] + p_sample[25]; - A07 = p_sample[ 7] + p_sample[24]; - A08 = p_sample[ 8] + p_sample[23]; - A09 = p_sample[ 9] + p_sample[22]; - A10 = p_sample[10] + p_sample[21]; - A11 = p_sample[11] + p_sample[20]; - A12 = p_sample[12] + p_sample[19]; - A13 = p_sample[13] + p_sample[18]; - A14 = p_sample[14] + p_sample[17]; - A15 = p_sample[15] + p_sample[16]; - - B00 = A00 + A15; - B01 = A01 + A14; - B02 = A02 + A13; - B03 = A03 + A12; - B04 = A04 + A11; - B05 = A05 + A10; - B06 = A06 + A09; - B07 = A07 + A08;; - B08 = MPC_SCALE_CONST((A00 - A15) , 0.5024192929f , 31); - B09 = MPC_SCALE_CONST((A01 - A14) , 0.5224986076f , 31); - B10 = MPC_SCALE_CONST((A02 - A13) , 0.5669440627f , 31); - B11 = MPC_SCALE_CONST((A03 - A12) , 0.6468217969f , 31); - B12 = MPC_SCALE_CONST((A04 - A11) , 0.7881546021f , 31); - B13 = MPC_SCALE_CONST((A05 - A10) , 1.0606776476f , 30); - B14 = MPC_SCALE_CONST((A06 - A09) , 1.7224471569f , 30); - B15 = MPC_SCALE_CONST((A07 - A08) , 5.1011486053f , 28); - - A00 = B00 + B07; - A01 = B01 + B06; - A02 = B02 + B05; - A03 = B03 + B04; - A04 = MPC_SCALE_CONST((B00 - B07) , 0.5097956061f , 31); - A05 = MPC_SCALE_CONST((B01 - B06) , 0.6013448834f , 31); - A06 = MPC_SCALE_CONST((B02 - B05) , 0.8999761939f , 31); - A07 = MPC_SCALE_CONST((B03 - B04) , 2.5629155636f , 29); - A08 = B08 + B15; - A09 = B09 + B14; - A10 = B10 + B13; - A11 = B11 + B12; - A12 = MPC_SCALE_CONST((B08 - B15) , 0.5097956061f , 31); - A13 = MPC_SCALE_CONST((B09 - B14) , 0.6013448834f , 31); - A14 = MPC_SCALE_CONST((B10 - B13) , 0.8999761939f , 31); - A15 = MPC_SCALE_CONST((B11 - B12) , 2.5629155636f , 29); - - B00 = A00 + A03; - B01 = A01 + A02; - B02 = MPC_MULTIPLY_FRACT_CONST_FIX((A00 - A03) , 0.5411961079f , 1); - B03 = MPC_MULTIPLY_FRACT_CONST_FIX((A01 - A02) , 1.3065630198f , 2); - B04 = A04 + A07; - B05 = A05 + A06; - B06 = MPC_MULTIPLY_FRACT_CONST_FIX((A04 - A07) , 0.5411961079f , 1); - B07 = MPC_MULTIPLY_FRACT_CONST_FIX((A05 - A06) , 1.3065630198f , 2); - B08 = A08 + A11; - B09 = A09 + A10; - B10 = MPC_MULTIPLY_FRACT_CONST_FIX((A08 - A11) , 0.5411961079f , 1); - B11 = MPC_MULTIPLY_FRACT_CONST_FIX((A09 - A10) , 1.3065630198f , 2); - B12 = A12 + A15; - B13 = A13 + A14; - B14 = MPC_MULTIPLY_FRACT_CONST_FIX((A12 - A15) , 0.5411961079f , 1); - B15 = MPC_MULTIPLY_FRACT_CONST_FIX((A13 - A14) , 1.3065630198f , 2); - - A00 = B00 + B01; - A01 = MPC_MULTIPLY_FRACT_CONST_FIX((B00 - B01) , 0.7071067691f , 1); - A02 = B02 + B03; - A03 = MPC_MULTIPLY_FRACT_CONST_FIX((B02 - B03) , 0.7071067691f , 1); - A04 = B04 + B05; - A05 = MPC_MULTIPLY_FRACT_CONST_FIX((B04 - B05) , 0.7071067691f , 1); - A06 = B06 + B07; - A07 = MPC_MULTIPLY_FRACT_CONST_FIX((B06 - B07) , 0.7071067691f , 1); - A08 = B08 + B09; - A09 = MPC_MULTIPLY_FRACT_CONST_FIX((B08 - B09) , 0.7071067691f , 1); - A10 = B10 + B11; - A11 = MPC_MULTIPLY_FRACT_CONST_FIX((B10 - B11) , 0.7071067691f , 1); - A12 = B12 + B13; - A13 = MPC_MULTIPLY_FRACT_CONST_FIX((B12 - B13) , 0.7071067691f , 1); - A14 = B14 + B15; - A15 = MPC_MULTIPLY_FRACT_CONST_FIX((B14 - B15) , 0.7071067691f , 1); - - pV[48] = -A00; - pV[ 0] = A01; - pV[40] = -A02 - (pV[ 8] = A03); - pV[36] = -((pV[ 4] = A05 + (pV[12] = A07)) + A06); - pV[44] = - A04 - A06 - A07; - pV[ 6] = (pV[10] = A11 + (pV[14] = A15)) + A13; - pV[38] = (pV[34] = -(pV[ 2] = A09 + A13 + A15) - A14) + A09 - A10 - A11; - pV[46] = (tmp = -(A12 + A14 + A15)) - A08; - pV[42] = tmp - A10 - A11; - - A00 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 0] - p_sample[31]) , 0.5006030202f , MPC_FIXED_POINT_SYNTH_FIX); - A01 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 1] - p_sample[30]) , 0.5054709315f , MPC_FIXED_POINT_SYNTH_FIX); - A02 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 2] - p_sample[29]) , 0.5154473186f , MPC_FIXED_POINT_SYNTH_FIX); - A03 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 3] - p_sample[28]) , 0.5310425758f , MPC_FIXED_POINT_SYNTH_FIX); - A04 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 4] - p_sample[27]) , 0.5531039238f , MPC_FIXED_POINT_SYNTH_FIX); - A05 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 5] - p_sample[26]) , 0.5829349756f , MPC_FIXED_POINT_SYNTH_FIX); - A06 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 6] - p_sample[25]) , 0.6225041151f , MPC_FIXED_POINT_SYNTH_FIX); - A07 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 7] - p_sample[24]) , 0.6748083234f , MPC_FIXED_POINT_SYNTH_FIX); - A08 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 8] - p_sample[23]) , 0.7445362806f , MPC_FIXED_POINT_SYNTH_FIX); - A09 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 9] - p_sample[22]) , 0.8393496275f , MPC_FIXED_POINT_SYNTH_FIX); - A10 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[10] - p_sample[21]) , 0.9725682139f , MPC_FIXED_POINT_SYNTH_FIX); -#if MPC_FIXED_POINT_SYNTH_FIX>=2 - A11 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[11] - p_sample[20]) , 1.1694399118f , MPC_FIXED_POINT_SYNTH_FIX); - A12 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[12] - p_sample[19]) , 1.4841645956f , MPC_FIXED_POINT_SYNTH_FIX); -#else - A11 = MPC_SCALE_CONST_SHR ((p_sample[11] - p_sample[20]) , 1.1694399118f , 30, MPC_FIXED_POINT_SYNTH_FIX); - A12 = MPC_SCALE_CONST_SHR ((p_sample[12] - p_sample[19]) , 1.4841645956f , 30, MPC_FIXED_POINT_SYNTH_FIX); -#endif - A13 = MPC_SCALE_CONST_SHR ((p_sample[13] - p_sample[18]) , 2.0577809811f , 29, MPC_FIXED_POINT_SYNTH_FIX); - A14 = MPC_SCALE_CONST_SHR ((p_sample[14] - p_sample[17]) , 3.4076085091f , 29, MPC_FIXED_POINT_SYNTH_FIX); - A15 = MPC_SCALE_CONST_SHR ((p_sample[15] - p_sample[16]) , 10.1900081635f, 27 ,MPC_FIXED_POINT_SYNTH_FIX); - - B00 = A00 + A15; - B01 = A01 + A14; - B02 = A02 + A13; - B03 = A03 + A12; - B04 = A04 + A11; - B05 = A05 + A10; - B06 = A06 + A09; - B07 = A07 + A08; - B08 = MPC_SCALE_CONST((A00 - A15) , 0.5024192929f , 31); - B09 = MPC_SCALE_CONST((A01 - A14) , 0.5224986076f , 31); - B10 = MPC_SCALE_CONST((A02 - A13) , 0.5669440627f , 31); - B11 = MPC_SCALE_CONST((A03 - A12) , 0.6468217969f , 31); - B12 = MPC_SCALE_CONST((A04 - A11) , 0.7881546021f , 31); - B13 = MPC_SCALE_CONST((A05 - A10) , 1.0606776476f , 30); - B14 = MPC_SCALE_CONST((A06 - A09) , 1.7224471569f , 30); - B15 = MPC_SCALE_CONST((A07 - A08) , 5.1011486053f , 28); - - A00 = B00 + B07; - A01 = B01 + B06; - A02 = B02 + B05; - A03 = B03 + B04; - A04 = MPC_SCALE_CONST((B00 - B07) , 0.5097956061f , 31); - A05 = MPC_SCALE_CONST((B01 - B06) , 0.6013448834f , 31); - A06 = MPC_SCALE_CONST((B02 - B05) , 0.8999761939f , 31); - A07 = MPC_SCALE_CONST((B03 - B04) , 2.5629155636f , 29); - A08 = B08 + B15; - A09 = B09 + B14; - A10 = B10 + B13; - A11 = B11 + B12; - A12 = MPC_SCALE_CONST((B08 - B15) , 0.5097956061f , 31); - A13 = MPC_SCALE_CONST((B09 - B14) , 0.6013448834f , 31); - A14 = MPC_SCALE_CONST((B10 - B13) , 0.8999761939f , 31); - A15 = MPC_SCALE_CONST((B11 - B12) , 2.5629155636f , 29); - - B00 = A00 + A03; - B01 = A01 + A02; - B02 = MPC_SCALE_CONST((A00 - A03) , 0.5411961079f , 31); - B03 = MPC_SCALE_CONST((A01 - A02) , 1.3065630198f , 30); - B04 = A04 + A07; - B05 = A05 + A06; - B06 = MPC_SCALE_CONST((A04 - A07) , 0.5411961079f , 31); - B07 = MPC_SCALE_CONST((A05 - A06) , 1.3065630198f , 30); - B08 = A08 + A11; - B09 = A09 + A10; - B10 = MPC_SCALE_CONST((A08 - A11) , 0.5411961079f , 31); - B11 = MPC_SCALE_CONST((A09 - A10) , 1.3065630198f , 30); - B12 = A12 + A15; - B13 = A13 + A14; - B14 = MPC_SCALE_CONST((A12 - A15) , 0.5411961079f , 31); - B15 = MPC_SCALE_CONST((A13 - A14) , 1.3065630198f , 30); - - A00 = MPC_SHL(B00 + B01, MPC_FIXED_POINT_SYNTH_FIX); - A01 = MPC_SCALE_CONST_SHL((B00 - B01) , 0.7071067691f , 31, MPC_FIXED_POINT_SYNTH_FIX); - A02 = MPC_SHL(B02 + B03, MPC_FIXED_POINT_SYNTH_FIX); - A03 = MPC_SCALE_CONST_SHL((B02 - B03) , 0.7071067691f , 31, MPC_FIXED_POINT_SYNTH_FIX); - A04 = MPC_SHL(B04 + B05, MPC_FIXED_POINT_SYNTH_FIX); - A05 = MPC_SCALE_CONST_SHL((B04 - B05) , 0.7071067691f , 31, MPC_FIXED_POINT_SYNTH_FIX); - A06 = MPC_SHL(B06 + B07, MPC_FIXED_POINT_SYNTH_FIX); - A07 = MPC_SCALE_CONST_SHL((B06 - B07) , 0.7071067691f , 31, MPC_FIXED_POINT_SYNTH_FIX); - A08 = MPC_SHL(B08 + B09, MPC_FIXED_POINT_SYNTH_FIX); - A09 = MPC_SCALE_CONST_SHL((B08 - B09) , 0.7071067691f , 31, MPC_FIXED_POINT_SYNTH_FIX); - A10 = MPC_SHL(B10 + B11, MPC_FIXED_POINT_SYNTH_FIX); - A11 = MPC_SCALE_CONST_SHL((B10 - B11) , 0.7071067691f , 31, MPC_FIXED_POINT_SYNTH_FIX); - A12 = MPC_SHL(B12 + B13, MPC_FIXED_POINT_SYNTH_FIX); - A13 = MPC_SCALE_CONST_SHL((B12 - B13) , 0.7071067691f , 31, MPC_FIXED_POINT_SYNTH_FIX); - A14 = MPC_SHL(B14 + B15, MPC_FIXED_POINT_SYNTH_FIX); - A15 = MPC_SCALE_CONST_SHL((B14 - B15) , 0.7071067691f , 31, MPC_FIXED_POINT_SYNTH_FIX); - - // mehrfach verwendete Ausdrcke: A04+A06+A07, A09+A13+A15 - pV[ 5] = (pV[11] = (pV[13] = A07 + (pV[15] = A15)) + A11) + A05 + A13; - pV[ 7] = (pV[ 9] = A03 + A11 + A15) + A13; - pV[33] = -(pV[ 1] = A01 + A09 + A13 + A15) - A14; - pV[35] = -(pV[ 3] = A05 + A07 + A09 + A13 + A15) - A06 - A14; - pV[37] = (tmp = -(A10 + A11 + A13 + A14 + A15)) - A05 - A06 - A07; - pV[39] = tmp - A02 - A03; // abh�gig vom Befehl drber - pV[41] = (tmp += A13 - A12) - A02 - A03; // abh�gig vom Befehl 2 drber - pV[43] = tmp - A04 - A06 - A07; // abh�gig von Befehlen 1 und 3 drber - pV[47] = (tmp = -(A08 + A12 + A14 + A15)) - A00; - pV[45] = tmp - A04 - A06 - A07; // abh�gig vom Befehl drber - - pV[32] = -pV[ 0]; - pV[31] = -pV[ 1]; - pV[30] = -pV[ 2]; - pV[29] = -pV[ 3]; - pV[28] = -pV[ 4]; - pV[27] = -pV[ 5]; - pV[26] = -pV[ 6]; - pV[25] = -pV[ 7]; - pV[24] = -pV[ 8]; - pV[23] = -pV[ 9]; - pV[22] = -pV[10]; - pV[21] = -pV[11]; - pV[20] = -pV[12]; - pV[19] = -pV[13]; - pV[18] = -pV[14]; - pV[17] = -pV[15]; - - pV[63] = pV[33]; - pV[62] = pV[34]; - pV[61] = pV[35]; - pV[60] = pV[36]; - pV[59] = pV[37]; - pV[58] = pV[38]; - pV[57] = pV[39]; - pV[56] = pV[40]; - pV[55] = pV[41]; - pV[54] = pV[42]; - pV[53] = pV[43]; - pV[52] = pV[44]; - pV[51] = pV[45]; - pV[50] = pV[46]; - pV[49] = pV[47]; -} - -static void -mpc_synthese_filter_float_internal(MPC_SAMPLE_FORMAT* p_out, MPC_SAMPLE_FORMAT* pV, const MPC_SAMPLE_FORMAT* pY, mpc_int_t channels) -{ - mpc_uint32_t n; - for ( n = 0; n < 36; n++, pY += 32 ) - { - MPC_SAMPLE_FORMAT* pData = p_out; - const MPC_SAMPLE_FORMAT* pD = (const MPC_SAMPLE_FORMAT*) &Di_opt; - mpc_int32_t k; - pV -= 64; - mpc_compute_new_V( pY, pV ); - for ( k = 0; k < 32; k++, pD += 16, pV++ ) - { - *pData = MPC_SHL( - MPC_MULTIPLY_FRACT(pV[ 0], pD[ 0]) + MPC_MULTIPLY_FRACT(pV[ 96], pD[ 1]) + MPC_MULTIPLY_FRACT(pV[128], pD[ 2]) + MPC_MULTIPLY_FRACT(pV[224], pD[ 3]) - + MPC_MULTIPLY_FRACT(pV[256], pD[ 4]) + MPC_MULTIPLY_FRACT(pV[352], pD[ 5]) + MPC_MULTIPLY_FRACT(pV[384], pD[ 6]) + MPC_MULTIPLY_FRACT(pV[480], pD[ 7]) - + MPC_MULTIPLY_FRACT(pV[512], pD[ 8]) + MPC_MULTIPLY_FRACT(pV[608], pD[ 9]) + MPC_MULTIPLY_FRACT(pV[640], pD[10]) + MPC_MULTIPLY_FRACT(pV[736], pD[11]) - + MPC_MULTIPLY_FRACT(pV[768], pD[12]) + MPC_MULTIPLY_FRACT(pV[864], pD[13]) + MPC_MULTIPLY_FRACT(pV[896], pD[14]) + MPC_MULTIPLY_FRACT(pV[992], pD[15]) - , 2); - pData += channels; - } - pV -= 32; //bleh - p_out += 32 * channels; - } -} - -void -mpc_decoder_synthese_filter_float(mpc_decoder* p_dec, MPC_SAMPLE_FORMAT* p_out, mpc_int_t channels) -{ - /********* left channel ********/ - memmove(&p_dec->V_L[MPC_V_MEM], p_dec->V_L, 960 * sizeof *p_dec->V_L); - mpc_synthese_filter_float_internal(p_out, &p_dec->V_L[MPC_V_MEM], p_dec->Y_L[0], channels); - - /******** right channel ********/ - if (channels > 1) { - memmove(&p_dec->V_R[MPC_V_MEM], p_dec->V_R, 960 * sizeof *p_dec->V_R); - mpc_synthese_filter_float_internal(p_out + 1, &p_dec->V_R[MPC_V_MEM], p_dec->Y_R[0], channels); - } -} - -/*******************************************/ -/* */ -/* dithered synthesis */ -/* */ -/*******************************************/ - -static const mpc_uint8_t Parity [256] = { // parity - 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1, - 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0, - 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0, - 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1, - 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0, - 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1, - 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1, - 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0 -}; - -/* - * This is a simple random number generator with good quality for audio purposes. - * It consists of two polycounters with opposite rotation direction and different - * periods. The periods are coprime, so the total period is the product of both. - * - * ------------------------------------------------------------------------------------------------- - * +-> |31:30:29:28:27:26:25:24:23:22:21:20:19:18:17:16:15:14:13:12:11:10: 9: 8: 7: 6: 5: 4: 3: 2: 1: 0| - * | ------------------------------------------------------------------------------------------------- - * | | | | | | | - * | +--+--+--+-XOR-+--------+ - * | | - * +--------------------------------------------------------------------------------------+ - * - * ------------------------------------------------------------------------------------------------- - * |31:30:29:28:27:26:25:24:23:22:21:20:19:18:17:16:15:14:13:12:11:10: 9: 8: 7: 6: 5: 4: 3: 2: 1: 0| <-+ - * ------------------------------------------------------------------------------------------------- | - * | | | | | - * +--+----XOR----+--+ | - * | | - * +----------------------------------------------------------------------------------------+ - * - * - * The first has an period of 3*5*17*257*65537, the second of 7*47*73*178481, - * which gives a period of 18.410.713.077.675.721.215. The result is the - * XORed values of both generators. - */ -mpc_uint32_t -mpc_random_int(mpc_decoder* p_dec) -{ -#if 1 - mpc_uint32_t t1, t2, t3, t4; - - t3 = t1 = p_dec->__r1; t4 = t2 = p_dec->__r2; // Parity calculation is done via table lookup, this is also available - t1 &= 0xF5; t2 >>= 25; // on CPUs without parity, can be implemented in C and avoid unpredictable - t1 = Parity[t1]; t2 &= 0x63; // jumps and slow rotate through the carry flag operations. - t1 <<= 31; t2 = Parity[t2]; - - return (p_dec->__r1 = (t3 >> 1) | t1 ) ^ (p_dec->__r2 = (t4 + t4) | t2 ); -#else - return (p_dec->__r1 = (p_dec->__r1 >> 1) | ((mpc_uint32_t) Parity[ p_dec->__r1 & 0xF5] << 31)) - ^ (p_dec->__r2 = (p_dec->__r2 << 1) | (mpc_uint32_t) Parity[(p_dec->__r2 >> 25) & 0x63]); -#endif -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcenc/analy_filter.c b/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcenc/analy_filter.c deleted file mode 100644 index fa8e0ff3..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcenc/analy_filter.c +++ /dev/null @@ -1,344 +0,0 @@ -/* - * Musepack audio compression - * Copyright (c) 2005-2009, The Musepack Development Team - * Copyright (C) 1999-2004 Buschmann/Klemm/Piecha/Wolf - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include - -#include -#include - -#define FASTER - -/* C O N S T A N T S */ - -#undef _ -#define _(value) (float)(value##.##L / 0x200000) - -static float Ci_opt [512] = { - _( 0), _( 213), _( 2037), _( 6574), _(75038), _( 6574), _(2037), _(213), - _( -1), _( 218), _( 2000), _( 5959), _(74992), _( 7134), _(2063), _(208), - _( -1), _( 222), _( 1952), _( 5288), _(74856), _( 7640), _(2080), _(202), - _( -1), _( 225), _( 1893), _( 4561), _(74630), _( 8092), _(2087), _(196), - _( -1), _( 227), _( 1822), _( 3776), _(74313), _( 8492), _(2085), _(190), - _( -1), _( 228), _( 1739), _( 2935), _(73908), _( 8840), _(2075), _(183), - _( -1), _( 228), _( 1644), _( 2037), _(73415), _( 9139), _(2057), _(176), - _( -2), _( 227), _( 1535), _( 1082), _(72835), _( 9389), _(2032), _(169), - _( -2), _( 224), _( 1414), _( 70), _(72169), _( 9592), _(2001), _(161), - _( -2), _( 221), _( 1280), _( -998), _(71420), _( 9750), _(1962), _(154), - _( -2), _( 215), _( 1131), _( -2122), _(70590), _( 9863), _(1919), _(147), - _( -3), _( 208), _( 970), _( -3300), _(69679), _( 9935), _(1870), _(139), - _( -3), _( 200), _( 794), _( -4533), _(68692), _( 9966), _(1817), _(132), - _( -4), _( 189), _( 605), _( -5818), _(67629), _( 9959), _(1759), _(125), - _( -4), _( 177), _( 402), _( -7154), _(66494), _( 9916), _(1698), _(117), - _( -5), _( 163), _( 185), _( -8540), _(65290), _( 9838), _(1634), _(111), - _( -5), _( 146), _( -45), _( -9975), _(64019), _( 9727), _(1567), _(104), - _( -6), _( 127), _( -288), _(-11455), _(62684), _( 9585), _(1498), _( 97), - _( -7), _( 106), _( -545), _(-12980), _(61289), _( 9416), _(1428), _( 91), - _( -7), _( 83), _( -814), _(-14548), _(59838), _( 9219), _(1356), _( 85), - _( -8), _( 57), _(-1095), _(-16155), _(58333), _( 8998), _(1283), _( 79), - _( -9), _( 29), _(-1388), _(-17799), _(56778), _( 8755), _(1210), _( 73), - _( -10), _( -2), _(-1692), _(-19478), _(55178), _( 8491), _(1137), _( 68), - _( -11), _( -36), _(-2006), _(-21189), _(53534), _( 8209), _(1064), _( 63), - _( -13), _( -72), _(-2330), _(-22929), _(51853), _( 7910), _( 991), _( 58), - _( -14), _( -111), _(-2663), _(-24694), _(50137), _( 7597), _( 919), _( 53), - _( -16), _( -153), _(-3004), _(-26482), _(48390), _( 7271), _( 848), _( 49), - _( -17), _( -197), _(-3351), _(-28289), _(46617), _( 6935), _( 779), _( 45), - _( -19), _( -244), _(-3705), _(-30112), _(44821), _( 6589), _( 711), _( 41), - _( -21), _( -294), _(-4063), _(-31947), _(43006), _( 6237), _( 645), _( 38), - _( -24), _( -347), _(-4425), _(-33791), _(41176), _( 5879), _( 581), _( 35), - _( -26), _( -401), _(-4788), _(-35640), _(39336), _( 5517), _( 519), _( 31), - _( -29), _( -459), _(-5153), _(-37489), _(37489), _( 5153), _( 459), _( 29), - _( -31), _( -519), _(-5517), _(-39336), _(35640), _( 4788), _( 401), _( 26), - _( -35), _( -581), _(-5879), _(-41176), _(33791), _( 4425), _( 347), _( 24), - _( -38), _( -645), _(-6237), _(-43006), _(31947), _( 4063), _( 294), _( 21), - _( -41), _( -711), _(-6589), _(-44821), _(30112), _( 3705), _( 244), _( 19), - _( -45), _( -779), _(-6935), _(-46617), _(28289), _( 3351), _( 197), _( 17), - _( -49), _( -848), _(-7271), _(-48390), _(26482), _( 3004), _( 153), _( 16), - _( -53), _( -919), _(-7597), _(-50137), _(24694), _( 2663), _( 111), _( 14), - _( -58), _( -991), _(-7910), _(-51853), _(22929), _( 2330), _( 72), _( 13), - _( -63), _(-1064), _(-8209), _(-53534), _(21189), _( 2006), _( 36), _( 11), - _( -68), _(-1137), _(-8491), _(-55178), _(19478), _( 1692), _( 2), _( 10), - _( -73), _(-1210), _(-8755), _(-56778), _(17799), _( 1388), _( -29), _( 9), - _( -79), _(-1283), _(-8998), _(-58333), _(16155), _( 1095), _( -57), _( 8), - _( -85), _(-1356), _(-9219), _(-59838), _(14548), _( 814), _( -83), _( 7), - _( -91), _(-1428), _(-9416), _(-61289), _(12980), _( 545), _(-106), _( 7), - _( -97), _(-1498), _(-9585), _(-62684), _(11455), _( 288), _(-127), _( 6), - _(-104), _(-1567), _(-9727), _(-64019), _( 9975), _( 45), _(-146), _( 5), - _(-111), _(-1634), _(-9838), _(-65290), _( 8540), _( -185), _(-163), _( 5), - _(-117), _(-1698), _(-9916), _(-66494), _( 7154), _( -402), _(-177), _( 4), - _(-125), _(-1759), _(-9959), _(-67629), _( 5818), _( -605), _(-189), _( 4), - _(-132), _(-1817), _(-9966), _(-68692), _( 4533), _( -794), _(-200), _( 3), - _(-139), _(-1870), _(-9935), _(-69679), _( 3300), _( -970), _(-208), _( 3), - _(-147), _(-1919), _(-9863), _(-70590), _( 2122), _(-1131), _(-215), _( 2), - _(-154), _(-1962), _(-9750), _(-71420), _( 998), _(-1280), _(-221), _( 2), - _(-161), _(-2001), _(-9592), _(-72169), _( -70), _(-1414), _(-224), _( 2), - _(-169), _(-2032), _(-9389), _(-72835), _(-1082), _(-1535), _(-227), _( 2), - _(-176), _(-2057), _(-9139), _(-73415), _(-2037), _(-1644), _(-228), _( 1), - _(-183), _(-2075), _(-8840), _(-73908), _(-2935), _(-1739), _(-228), _( 1), - _(-190), _(-2085), _(-8492), _(-74313), _(-3776), _(-1822), _(-227), _( 1), - _(-196), _(-2087), _(-8092), _(-74630), _(-4561), _(-1893), _(-225), _( 1), - _(-202), _(-2080), _(-7640), _(-74856), _(-5288), _(-1952), _(-222), _( 1), - _(-208), _(-2063), _(-7134), _(-74992), _(-5959), _(-2000), _(-218), _( 1), -}; -#undef _ - - -static float M [1024]; - -void -Klemm ( void ) -{ - int i; - int k; - float S [512]; - - for ( i=0; i<32; i++ ) { - for ( k=0; k<32; k++ ) { - M [i*32 + k] = (float) cos ( ((2*i+1)*k & 127) * M_PI/64 ); - } - } - -#ifdef FASTER - for ( i = 0; i < 384; i++ ) - S[i] = Ci_opt[i]; - for ( i = 384; i < 392; i++ ) - S[i] = 0; - for ( i = 392; i < 512; i++ ) - S[i] = -Ci_opt[i]; - for ( i = 0; i < 512; i++ ) - Ci_opt[i] = S[i]; - for ( i = 0; i < 128; i++ ) - Ci_opt[i] = S[(i&7) + 120 - (i&120)]; - for ( i = 128; i < 384; i++ ) - Ci_opt[i] = S[i]; - for ( i = 384; i < 512; i++ ) - Ci_opt[i] = S[ 384 + (i&7) + 120 - (i&120)]; -#endif -} - - /* D E F I N E S */ -#define X_MEM 1152 - -/* V A R I A B L E S */ -float X_L [ X_MEM + 480 ]; -float X_R [ X_MEM + 480 ]; - - -/* F U N C T I O N S */ -// vectoring & partial calculation - -static void -Vectoring ( const float* x, float* y ) -{ -#ifdef FASTER - int i = 0; - const float* c1; - const float* c2; - const float* x1; - const float* x2; - -# define EXPR(c,x) (c[0]*x[0] + c[1]*x[64] + c[2]*x[128] + c[3]*x[192] + c[4]*x[256] + c[5]*x[320] + c[6]*x[384] + c[7]*x[448]) - - i++; - *y++ = EXPR ((Ci_opt+128),(x+31)); - - c1 = Ci_opt - 8; - c2 = Ci_opt + 128; - x1 = x + 16; - x2 = x + 31; - do { - x1--, x2--, i++; - c1 += 8, c2 += 8; - *y++ = EXPR (c1,x1) + EXPR (c2,x2); - } while ( i < 16 ); - - i++; - *y++ = EXPR ((Ci_opt+120),(x+0)) + EXPR ((Ci_opt+256),(x+32)); - - c1 = Ci_opt + 384 - 8; - c2 = Ci_opt + 256; - x1 = x + 47; - x2 = x + 32; - - do { - x1++, x2++, i++; - c1 += 8, c2 += 8; - *y++ = EXPR (c1,x1) + EXPR (c2,x2); - } while ( i < 32 ); -#else - int i; - const float* c = Ci_opt; - - for ( i = 0; i < 16; i++, c += 32, x += 4, y += 4 ) { - y[0] = c[ 0] * x[ 0] + c[ 1] * x[ 64] + c[ 2] * x[128] + c[ 3] * x[192] + c[ 4] * x[256] + c[ 5] * x[320] + c[ 6] * x[384] + c[ 7] * x[448]; - y[1] = c[ 8] * x[ 1] + c[ 9] * x[ 65] + c[10] * x[129] + c[11] * x[193] + c[12] * x[257] + c[13] * x[321] + c[14] * x[385] + c[15] * x[449]; - y[2] = c[16] * x[ 2] + c[17] * x[ 66] + c[18] * x[130] + c[19] * x[194] + c[20] * x[258] + c[21] * x[322] + c[22] * x[386] + c[23] * x[450]; - y[3] = c[24] * x[ 3] + c[25] * x[ 67] + c[26] * x[131] + c[27] * x[195] + c[28] * x[259] + c[29] * x[323] + c[30] * x[387] + c[31] * x[451]; - } -#endif -} - -// matrixing with Mi[32][32] = Mi[1024] - -static void -Matrixing ( const int MaxBand, const float* mi, const float* y, float* samples ) -{ - int i; -#ifdef FASTER - for ( i = 0; i <= MaxBand; i++, mi += 32, samples += 72 ) { // 144 = sizeof(SubbandFloatTyp)/sizeof(float) - samples[0] = y[ 0] + mi[ 1] * y[ 1] + mi[ 2] * y[ 2] + mi[ 3] * y[ 3] - + mi[ 4] * y[ 4] + mi[ 5] * y[ 5] + mi[ 6] * y[ 6] + mi[ 7] * y[ 7] - + mi[ 8] * y[ 8] + mi[ 9] * y[ 9] + mi[10] * y[10] + mi[11] * y[11] - + mi[12] * y[12] + mi[13] * y[13] + mi[14] * y[14] + mi[15] * y[15] - + mi[16] * y[16] + mi[17] * y[17] + mi[18] * y[18] + mi[19] * y[19] - + mi[20] * y[20] + mi[21] * y[21] + mi[22] * y[22] + mi[23] * y[23] - + mi[24] * y[24] + mi[25] * y[25] + mi[26] * y[26] + mi[27] * y[27] - + mi[28] * y[28] + mi[29] * y[29] + mi[30] * y[30] + mi[31] * y[31]; - } -#else - for ( i = 0; i <= MaxBand; i++, mi += 32, samples += 72 ) { // 144 = sizeof(SubbandFloatTyp)/sizeof(float) - samples[0] = y[16] + mi[ 1] * (y[15]+y[17]) - + mi[ 2] * (y[14]+y[18]) + mi[ 3] * (y[13]+y[19]) - + mi[ 4] * (y[12]+y[20]) + mi[ 5] * (y[11]+y[21]) - + mi[ 6] * (y[10]+y[22]) + mi[ 7] * (y[ 9]+y[23]) - + mi[ 8] * (y[ 8]+y[24]) + mi[ 9] * (y[ 7]+y[25]) - + mi[10] * (y[ 6]+y[26]) + mi[11] * (y[ 5]+y[27]) - + mi[12] * (y[ 4]+y[28]) + mi[13] * (y[ 3]+y[29]) - + mi[14] * (y[ 2]+y[30]) + mi[15] * (y[ 1]+y[31]) - + mi[16] * (y[ 0]+y[32]) - + mi[31] * (y[47]-y[49]) + mi[30] * (y[46]-y[50]) - + mi[29] * (y[45]-y[51]) + mi[28] * (y[44]-y[52]) - + mi[27] * (y[43]-y[53]) + mi[26] * (y[42]-y[54]) - + mi[25] * (y[41]-y[55]) + mi[24] * (y[40]-y[56]) - + mi[23] * (y[39]-y[57]) + mi[22] * (y[38]-y[58]) - + mi[21] * (y[37]-y[59]) + mi[20] * (y[36]-y[60]) - + mi[19] * (y[35]-y[61]) + mi[18] * (y[34]-y[62]) - + mi[17] * (y[33]-y[63]); - } -#endif -} - -// Analysis-Filterbank -void -Analyse_Filter ( const PCMDataTyp* in, SubbandFloatTyp* out, const int MaxBand ) -{ -#ifdef FASTER - float Y_L [32]; - float Y_R [32]; -#else - float Y_L [64]; - float Y_R [64]; -#endif - float* x; - const float* pcm; - int n; - int i; - - /************************* calculate L-signal ***************************/ - memcpy ( X_L + X_MEM, X_L, 480*sizeof(*X_L) ); - x = X_L + X_MEM; - pcm = in->L + 479; // 479 = CENTER + 31 - for ( n = 0; n < 36; n++, pcm += 64 ) { - x -= 32; // updating vector x -#ifdef FASTER - for ( i = 0; i < 16; i++ ) - x[i] = *pcm--; - for ( i = 31; i >= 16; i-- ) - x[i] = *pcm--; -#else - for ( i = 0; i < 32; i++ ) - x[i] = *pcm--; -#endif - Vectoring ( x, Y_L ); // vectoring & partial calculation - Matrixing ( MaxBand, M, Y_L, &out[0].L[n] ); // matrixing - } - - /************************* calculate R-signal ***************************/ - memcpy ( X_R + X_MEM, X_R, 480*sizeof(*X_R) ); - x = X_R + X_MEM; - pcm = in->R + 479; // 479 = CENTER + 31 - for ( n = 0; n < 36; n++, pcm += 64 ) { - x -= 32; // updating vector x -#ifdef FASTER - for ( i = 0; i < 16; i++ ) - x[i] = *pcm--; - for ( i = 31; i >= 16; i-- ) - x[i] = *pcm--; -#else - for ( i = 0; i < 32; i++ ) - x[i] = *pcm--; -#endif - Vectoring ( x, Y_R ); // vectoring & partial calculation - Matrixing ( MaxBand, M, Y_R, &out[0].R[n] ); // matrixing - } -} - -void -Analyse_Init ( float Left, float Right, SubbandFloatTyp* out, const int MaxBand ) -{ -#ifdef FASTER - float Y_L [32]; - float Y_R [32]; -#else - float Y_L [64]; - float Y_R [64]; -#endif - float* x; - int n; - int i; - - /************************* calculate L-signal ***************************/ - memcpy ( X_L + X_MEM, X_L, 480*sizeof(*X_L) ); - x = X_L + X_MEM; - - for ( n = 0; n < 36; n++ ) { - x -= 32; // updating vector x -#ifdef FASTER - for ( i = 0; i < 16; i++ ) - x[i] = Left; - for ( i = 31; i >= 16; i-- ) - x[i] = Left; -#else - for ( i = 0; i < 32; i++ ) - x[i] = Left; -#endif - Vectoring ( x, Y_L ); // vectoring & partial calculation - Matrixing ( MaxBand, M, Y_L, &out[0].L[n] ); // matrixing - } - - /************************* calculate R-signal ***************************/ - memcpy ( X_R + X_MEM, X_R, 480*sizeof(*X_R) ); - x = X_R + X_MEM; - for ( n = 0; n < 36; n++ ) { - x -= 32; // updating vector x -#ifdef FASTER - for ( i = 0; i < 16; i++ ) - x[i] = Right; - for ( i = 31; i >= 16; i-- ) - x[i] = Right; -#else - for ( i = 0; i < 32; i++ ) - x[i] = Right; -#endif - Vectoring ( x, Y_R ); // vectoring & partial calculation - Matrixing ( MaxBand, M, Y_R, &out[0].R[n] ); // matrixing - } -} - -/* end of analy_filter.c */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcenc/bitstream.c b/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcenc/bitstream.c deleted file mode 100644 index 0650ee2e..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcenc/bitstream.c +++ /dev/null @@ -1,271 +0,0 @@ -/* - * Musepack audio compression - * Copyright (c) 2005-2009, The Musepack Development Team - * Copyright (C) 1999-2004 Buschmann/Klemm/Piecha/Wolf - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifdef _WIN32 -#include -#define sleep(t) Sleep((t) * 1000) -#else -#include -#endif - -#include "libmpcenc.h" -#include "stdio.h" - -unsigned long mpc_crc32(unsigned char *buf, int len); - -#define MAX_ENUM 32 - -static const mpc_uint32_t Cnk[MAX_ENUM / 2][MAX_ENUM] = -{ - {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}, - {0, 0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91, 105, 120, 136, 153, 171, 190, 210, 231, 253, 276, 300, 325, 351, 378, 406, 435, 465}, - {0, 0, 0, 1, 4, 10, 20, 35, 56, 84, 120, 165, 220, 286, 364, 455, 560, 680, 816, 969, 1140, 1330, 1540, 1771, 2024, 2300, 2600, 2925, 3276, 3654, 4060, 4495}, - {0, 0, 0, 0, 1, 5, 15, 35, 70, 126, 210, 330, 495, 715, 1001, 1365, 1820, 2380, 3060, 3876, 4845, 5985, 7315, 8855, 10626, 12650, 14950, 17550, 20475, 23751, 27405, 31465}, - {0, 0, 0, 0, 0, 1, 6, 21, 56, 126, 252, 462, 792, 1287, 2002, 3003, 4368, 6188, 8568, 11628, 15504, 20349, 26334, 33649, 42504, 53130, 65780, 80730, 98280, 118755, 142506, 169911}, - {0, 0, 0, 0, 0, 0, 1, 7, 28, 84, 210, 462, 924, 1716, 3003, 5005, 8008, 12376, 18564, 27132, 38760, 54264, 74613, 100947, 134596, 177100, 230230, 296010, 376740, 475020, 593775, 736281}, - {0, 0, 0, 0, 0, 0, 0, 1, 8, 36, 120, 330, 792, 1716, 3432, 6435, 11440, 19448, 31824, 50388, 77520, 116280, 170544, 245157, 346104, 480700, 657800, 888030, 1184040, 1560780, 2035800, 2629575}, - {0, 0, 0, 0, 0, 0, 0, 0, 1, 9, 45, 165, 495, 1287, 3003, 6435, 12870, 24310, 43758, 75582, 125970, 203490, 319770, 490314, 735471, 1081575, 1562275, 2220075, 3108105, 4292145, 5852925, 7888725}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 10, 55, 220, 715, 2002, 5005, 11440, 24310, 48620, 92378, 167960, 293930, 497420, 817190, 1307504, 2042975, 3124550, 4686825, 6906900, 10015005, 14307150, 20160075}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 11, 66, 286, 1001, 3003, 8008, 19448, 43758, 92378, 184756, 352716, 646646, 1144066, 1961256, 3268760, 5311735, 8436285, 13123110, 20030010, 30045015, 44352165}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 12, 78, 364, 1365, 4368, 12376, 31824, 75582, 167960, 352716, 705432, 1352078, 2496144, 4457400, 7726160, 13037895, 21474180, 34597290, 54627300, 84672315}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 13, 91, 455, 1820, 6188, 18564, 50388, 125970, 293930, 646646, 1352078, 2704156, 5200300, 9657700, 17383860, 30421755, 51895935, 86493225, 141120525}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 14, 105, 560, 2380, 8568, 27132, 77520, 203490, 497420, 1144066, 2496144, 5200300, 10400600, 20058300, 37442160, 67863915, 119759850, 206253075}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 15, 120, 680, 3060, 11628, 38760, 116280, 319770, 817190, 1961256, 4457400, 9657700, 20058300, 40116600, 77558760, 145422675, 265182525}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 16, 136, 816, 3876, 15504, 54264, 170544, 490314, 1307504, 3268760, 7726160, 17383860, 37442160, 77558760, 155117520, 300540195}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 153, 969, 4845, 20349, 74613, 245157, 735471, 2042975, 5311735, 13037895, 30421755, 67863915, 145422675, 300540195} -}; - -static const mpc_uint8_t Cnk_len[MAX_ENUM / 2][MAX_ENUM] = -{ - {0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5}, - {0, 0, 2, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9}, - {0, 0, 0, 2, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 13, 13}, - {0, 0, 0, 0, 3, 4, 6, 7, 7, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 15, 16}, - {0, 0, 0, 0, 0, 3, 5, 6, 7, 8, 9, 10, 11, 11, 12, 13, 13, 14, 14, 14, 15, 15, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18}, - {0, 0, 0, 0, 0, 0, 3, 5, 7, 8, 9, 10, 11, 12, 13, 13, 14, 15, 15, 16, 16, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20}, - {0, 0, 0, 0, 0, 0, 0, 3, 6, 7, 9, 10, 11, 12, 13, 14, 15, 15, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 21, 22, 22}, - {0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 8, 9, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 19, 20, 21, 21, 22, 22, 23, 23, 23, 24}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 8, 10, 11, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 21, 22, 23, 23, 24, 24, 25, 25}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 7, 9, 10, 12, 13, 15, 16, 17, 18, 19, 20, 21, 21, 22, 23, 24, 24, 25, 25, 26, 26}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 7, 9, 11, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 26, 27, 27}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 7, 9, 11, 13, 15, 16, 17, 19, 20, 21, 22, 23, 24, 25, 25, 26, 27, 28, 28}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 7, 10, 12, 14, 15, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 27, 28, 29}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 7, 10, 12, 14, 16, 17, 19, 20, 21, 23, 24, 25, 26, 27, 28, 28, 29}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 8, 10, 12, 14, 16, 18, 19, 21, 22, 23, 25, 26, 27, 28, 29, 30}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 10, 13, 15, 17, 18, 20, 21, 23, 24, 25, 27, 28, 29, 30} - -}; - -static const mpc_uint32_t Cnk_lost[MAX_ENUM / 2][MAX_ENUM] = -{ - {0, 0, 1, 0, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, - {0, 0, 1, 2, 6, 1, 11, 4, 28, 19, 9, 62, 50, 37, 23, 8, 120, 103, 85, 66, 46, 25, 3, 236, 212, 187, 161, 134, 106, 77, 47, 16}, - {0, 0, 0, 0, 6, 12, 29, 8, 44, 8, 91, 36, 226, 148, 57, 464, 344, 208, 55, 908, 718, 508, 277, 24, 1796, 1496, 1171, 820, 442, 36, 3697, 3232}, - {0, 0, 0, 0, 3, 1, 29, 58, 2, 46, 182, 17, 309, 23, 683, 228, 1716, 1036, 220, 3347, 2207, 877, 7529, 5758, 3734, 1434, 15218, 12293, 9017, 5363, 1303, 29576}, - {0, 0, 0, 0, 0, 2, 11, 8, 2, 4, 50, 232, 761, 46, 1093, 3824, 2004, 7816, 4756, 880, 12419, 6434, 31887, 23032, 12406, 65292, 50342, 32792, 12317, 119638, 92233, 60768}, - {0, 0, 0, 0, 0, 0, 1, 4, 44, 46, 50, 100, 332, 1093, 3187, 184, 4008, 14204, 5636, 26776, 11272, 56459, 30125, 127548, 85044, 31914, 228278, 147548, 49268, 454801, 312295, 142384}, - {0, 0, 0, 0, 0, 0, 0, 0, 28, 8, 182, 232, 332, 664, 1757, 4944, 13320, 944, 15148, 53552, 14792, 91600, 16987, 178184, 43588, 390776, 160546, 913112, 536372, 61352, 1564729, 828448}, - {0, 0, 0, 0, 0, 0, 0, 0, 7, 19, 91, 17, 761, 1093, 1757, 3514, 8458, 21778, 55490, 5102, 58654, 204518, 33974, 313105, 1015577, 534877, 1974229, 1086199, 4096463, 2535683, 499883, 6258916}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 9, 36, 309, 46, 3187, 4944, 8458, 16916, 38694, 94184, 230358, 26868, 231386, 789648, 54177, 1069754, 3701783, 1481708, 6762211, 2470066, 13394357, 5505632}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 62, 226, 23, 1093, 184, 13320, 21778, 38694, 77388, 171572, 401930, 953086, 135896, 925544, 3076873, 8340931, 3654106, 13524422, 3509417, 22756699, 2596624}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 50, 148, 683, 3824, 4008, 944, 55490, 94184, 171572, 343144, 745074, 1698160, 3931208, 662448, 3739321, 12080252, 32511574, 12481564, 49545413, 5193248}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 37, 57, 228, 2004, 14204, 15148, 5102, 230358, 401930, 745074, 1490148, 3188308, 7119516, 16170572, 3132677, 15212929, 47724503, 127314931, 42642616}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 23, 464, 1716, 7816, 5636, 53552, 58654, 26868, 953086, 1698160, 3188308, 6376616, 13496132, 29666704, 66353813, 14457878, 62182381, 189497312}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 8, 344, 1036, 4756, 26776, 14792, 204518, 231386, 135896, 3931208, 7119516, 13496132, 26992264, 56658968, 123012781, 3252931, 65435312}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 208, 220, 880, 11272, 91600, 33974, 789648, 925544, 662448, 16170572, 29666704, 56658968, 113317936, 236330717, 508019104}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 103, 55, 3347, 12419, 56459, 16987, 313105, 54177, 3076873, 3739321, 3132677, 66353813, 123012781, 236330717} -}; - -static const mpc_uint8_t log2[32] = -{ 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6}; - -static const mpc_uint8_t log2_lost[32] = -{ 0, 1, 0, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 31}; - -void emptyBits(mpc_encoder_t * e) -{ - while( e->bitsCount >= 8 ){ - e->bitsCount -= 8; - e->buffer[e->pos] = (mpc_uint8_t) (e->bitsBuff >> e->bitsCount); - e->pos++; - } -} - -unsigned int encodeSize(mpc_uint64_t size, char * buff, mpc_bool_t addCodeSize) -{ - unsigned int i = 1; - int j; - - if (addCodeSize) { - while ((1ull << (7 * i)) - i <= size) i++; - size += i; - } else - while ((1ull << (7 * i)) <= size) i++; - - for( j = i - 1; j >= 0; j--){ - buff[j] = (char) (size | 0x80); - size >>= 7; - } - buff[i - 1] &= 0x7F; - - return i; -} - -static void encodeGolomb(mpc_encoder_t * e, mpc_uint32_t nb, mpc_uint_t k) -{ - unsigned int l = (nb >> k) + 1; - nb &= (1 << k) - 1; - - while( l > 31 ){ - writeBits(e, 0, 31); - l -= 31; - } - writeBits(e, 1, l); - writeBits(e, nb, k); -} - -void encodeEnum(mpc_encoder_t * e, const mpc_uint32_t bits, const mpc_uint_t N) -{ - mpc_uint32_t code = 0; - const mpc_uint32_t * C = Cnk[0]; - unsigned int n = 0, k = 0; - - for( ; n < N; n++){ - if ((bits >> n) & 1) { - code += C[n]; - C += MAX_ENUM; - k++; - } - } - - if (k == 0) return; - - if (code < Cnk_lost[k-1][n-1]) - writeBits(e, code, Cnk_len[k-1][n-1] - 1); - else - writeBits(e, code + Cnk_lost[k-1][n-1], Cnk_len[k-1][n-1]); -} - -void encodeLog(mpc_encoder_t * e, mpc_uint32_t value, mpc_uint32_t max) -{ - if (value < log2_lost[max - 1]) - writeBits(e, value, log2[max - 1] - 1); - else - writeBits(e, value + log2_lost[max - 1], log2[max - 1]); -} - -void writeMagic(mpc_encoder_t * e) -{ - fwrite("MPCK", sizeof(char), 4, e->outputFile); - e->outputBits += 32; - e->framesInBlock = 0; -} - -mpc_uint32_t writeBlock ( mpc_encoder_t * e, const char * key, const mpc_bool_t addCRC, mpc_uint32_t min_size) -{ - FILE * fp = e->outputFile; - mpc_uint32_t written = 0; - mpc_uint8_t * datas = e->buffer; - char blockSize[10]; - mpc_uint32_t len; - - writeBits(e, 0, (8 - e->bitsCount) % 8); - emptyBits(e); - - // write block header (key / length) - len = e->pos + (addCRC > 0) * 4; - if (min_size <= len) - min_size = len; - else { - mpc_uint32_t pad = min_size - len, i; - for(i = 0; i < pad; i++) - writeBits(e, 0, 8); - emptyBits(e); - } - len = encodeSize(min_size + 2, blockSize, MPC_TRUE); - fwrite(key, sizeof(char), 2, fp); - fwrite(blockSize, sizeof(char), len, fp); - e->outputBits += (len + 2) * 8; - - if (addCRC) { - char tmp[4]; - unsigned long CRC32 = mpc_crc32((unsigned char *) e->buffer, e->pos); - tmp[0] = (char) (CRC32 >> 24); - tmp[1] = (char) (CRC32 >> 16); - tmp[2] = (char) (CRC32 >> 8); - tmp[3] = (char) CRC32; - fwrite(tmp, sizeof(char), 4, fp); - e->outputBits += 32; - } - - // write datas - while ( e->pos != 0 ) { - written = fwrite ( datas, sizeof(*e->buffer), e->pos, fp ); - if ( written == 0 ) { - fprintf(stderr, "\b\n WARNING: Disk full?, retry after 10 sec ...\a"); - sleep (10); - } - if ( written > 0 ) { - datas += written; - e->pos -= written; - } - } - e->framesInBlock = 0; - - return min_size; -} - -void writeSeekTable (mpc_encoder_t * e) -{ - mpc_uint32_t i, len; - mpc_uint32_t * table = e->seek_table; - mpc_uint8_t tmp[10]; - - // write the position to header - i = ftell(e->outputFile); // get the seek table position - len = encodeSize(i - e->seek_ptr, (char*)tmp, MPC_FALSE); - fseek(e->outputFile, e->seek_ptr + 3, SEEK_SET); - fwrite(tmp, sizeof(mpc_uint8_t), len, e->outputFile); - fseek(e->outputFile, i, SEEK_SET); - - // write the seek table datas - len = encodeSize(e->seek_pos, (char*)tmp, MPC_FALSE); - for( i = 0; i < len; i++) - writeBits ( e, tmp[i], 8 ); - writeBits ( e, e->seek_pwr, 4 ); - - len = encodeSize(table[0] - e->seek_ref, (char*)tmp, MPC_FALSE); - for( i = 0; i < len; i++) - writeBits ( e, tmp[i], 8 ); - if (e->seek_pos > 1) { - len = encodeSize(table[1] - e->seek_ref, (char*)tmp, MPC_FALSE); - for( i = 0; i < len; i++) - writeBits ( e, tmp[i], 8 ); - } - - for( i = 2; i < e->seek_pos; i++){ - int code = (table[i] - 2 * table[i-1] + table[i-2]) << 1; - if (code < 0) - code = -code | 1; - encodeGolomb(e, code, 12); - } -} - -/* end of bitstream.c */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcenc/encode_sv7.c b/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcenc/encode_sv7.c deleted file mode 100644 index 68de5ae0..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcenc/encode_sv7.c +++ /dev/null @@ -1,492 +0,0 @@ -/* - * Musepack audio compression - * Copyright (c) 2005-2009, The Musepack Development Team - * Copyright (C) 1999-2004 Buschmann/Klemm/Piecha/Wolf - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include -#include - -#include "libmpcenc.h" -#include - -void Klemm ( void ); -void Init_Skalenfaktoren ( void ); - -// huffsv7.c -extern Huffman_t const HuffBands [33]; -extern Huffman_t const HuffRes [2][17]; -extern Huffman_t const HuffSCFI_1 [4]; // contains tables for SV7-scalefactor select -extern Huffman_t const HuffSCFI_2 [16]; // contains tables for SV7-scalefactor select -extern Huffman_t const HuffDSCF_1 [64]; // contains tables for SV7-scalefactor coding -extern Huffman_t const HuffDSCF_2 [65]; // contains tables for SV7-scalefactor coding -extern Huffman_t const * const HuffQ [2][8]; // points to tables for SV7-sample coding -extern Huffman_t const HuffQ9up [256]; - -/* - * SV1: DATE 13.12.1998 - * SV2: DATE 12.06.1999 - * SV3: DATE 19.10.1999 - * SV4: DATE 20.10.1999 - * SV5: DATE 18.06.2000 - * SV6: DATE 10.08.2000 - * SV7: DATE 23.08.2000 - * SV7.f: DATE 20.07.2002 - */ - -// initialize SV8 -void -mpc_encoder_init ( mpc_encoder_t * e, - mpc_uint64_t SamplesInWAVE, - unsigned int FramesBlockPwr, - unsigned int SeekDistance ) -{ - Init_Skalenfaktoren (); - Klemm (); - - memset(e, 0, sizeof(*e)); - - if (SeekDistance > 15) - SeekDistance = 1; - if (FramesBlockPwr > 14) - FramesBlockPwr = 6; - - e->seek_pwr = SeekDistance; - e->frames_per_block_pwr = FramesBlockPwr; - - if (SamplesInWAVE == 0) - e->seek_table = malloc((1 << 16) * sizeof(mpc_uint32_t)); - else - e->seek_table = malloc((size_t)(2 + SamplesInWAVE / (MPC_FRAME_LENGTH << (e->seek_pwr + e->frames_per_block_pwr))) * sizeof(mpc_uint32_t)); - - e->buffer = malloc(MAX_FRAME_SIZE * (1 << e->frames_per_block_pwr) * sizeof(mpc_uint8_t)); -} - -void -mpc_encoder_exit ( mpc_encoder_t * e ) -{ - free(e->seek_table); - free(e->buffer); -} - -// writes replay gain info -void writeGainInfo ( mpc_encoder_t * e, - unsigned short t_gain, - unsigned short t_peak, - unsigned short a_gain, - unsigned short a_peak) -{ - writeBits ( e, 1, 8 ); // version - writeBits ( e, t_gain, 16 ); // Title gain - writeBits ( e, t_peak, 16 ); // Title peak - writeBits ( e, a_gain, 16 ); // Album gain - writeBits ( e, a_peak, 16 ); // Album peak -} - -// writes SV8-header -void -writeStreamInfo ( mpc_encoder_t*e, - const unsigned int MaxBand, - const unsigned int MS_on, - const unsigned int SamplesCount, - const unsigned int SamplesSkip, - const unsigned int SampleFreq, - const unsigned int ChannelCount) -{ - unsigned char tmp[10]; - int i, len; - - writeBits ( e, 8, 8 ); // StreamVersion - - len = encodeSize(SamplesCount, (char *)tmp, MPC_FALSE); - for( i = 0; i < len; i++) // nb of samples - writeBits ( e, tmp[i], 8 ); - len = encodeSize(SamplesSkip, (char *)tmp, MPC_FALSE); - for( i = 0; i < len; i++) // nb of samples to skip at beginning - writeBits ( e, tmp[i], 8 ); - - switch ( SampleFreq ) { - case 44100: writeBits ( e, 0, 3 ); break; - case 48000: writeBits ( e, 1, 3 ); break; - case 37800: writeBits ( e, 2, 3 ); break; - case 32000: writeBits ( e, 3, 3 ); break; - default : fprintf(stderr, "Internal error\n");// FIXME : stderr_printf ( "Internal error\n"); - exit (1); - } - - writeBits ( e, MaxBand - 1 , 5 ); // Bandwidth - writeBits ( e, ChannelCount - 1 , 4 ); // Channels - writeBits ( e, MS_on , 1 ); // MS-Coding Flag - writeBits ( e, e->frames_per_block_pwr >> 1, 3 ); // frames per block (log4 unit) -} - -// writes encoder signature -void writeEncoderInfo ( mpc_encoder_t * e, - const float profile, - const int PNS_on, - const int version_major, - const int version_minor, - const int version_build ) -{ - writeBits ( e, (mpc_uint32_t)(profile * 8 + .5), 7 ); - writeBits ( e, PNS_on, 1 ); - writeBits ( e, version_major, 8 ); - writeBits ( e, version_minor, 8 ); - writeBits ( e, version_build, 8 ); -} - -// formatting and writing SV8-bitstream for one frame -void -writeBitstream_SV8 ( mpc_encoder_t* e, int MaxBand) -{ - int n; - const Huffman_t * Table, * Tables[2]; - mpc_int32_t * Res_L = e->Res_L; - mpc_int32_t * Res_R = e->Res_R; - mpc_bool_t * DSCF_Flag_L = e->DSCF_Flag_L; - mpc_bool_t * DSCF_Flag_R = e->DSCF_Flag_R; - mpc_int32_t * SCF_Last_L = e->SCF_Last_L; - mpc_int32_t * SCF_Last_R = e->SCF_Last_R; - - for( n = MaxBand; n >= 0; n--) - if (Res_L[n] != 0 || Res_R[n] != 0) break; - - n++; - if (e->framesInBlock == 0) { - encodeLog(e, n, MaxBand + 1); - MaxBand = e->MaxBand = n; - } else { - n = n - e->MaxBand; - MaxBand = e->MaxBand = n + e->MaxBand; - if (n < 0) n += 33; - writeBits(e, HuffBands[n].Code, HuffBands[n].Length); - } - - /************************************ Resolution *********************************/ - - if (MaxBand) { - { - int tmp = Res_L[MaxBand - 1]; - if (tmp < 0) tmp += 17; - writeBits(e, HuffRes[0][tmp].Code, HuffRes[0][tmp].Length); - tmp = Res_R[MaxBand - 1]; - if (tmp < 0) tmp += 17; - writeBits(e, HuffRes[0][tmp].Code, HuffRes[0][tmp].Length); - } - for ( n = MaxBand - 2; n >= 0; n--) { - int tmp = Res_L[n] - Res_L[n + 1]; - if (tmp < 0) tmp += 17; - writeBits(e, HuffRes[Res_L[n + 1] > 2][tmp].Code, HuffRes[Res_L[n + 1] > 2][tmp].Length); - - tmp = Res_R[n] - Res_R[n + 1]; - if (tmp < 0) tmp += 17; - writeBits(e, HuffRes[Res_R[n + 1] > 2][tmp].Code, HuffRes[Res_R[n + 1] > 2][tmp].Length); - } - - if (e->MS_Channelmode > 0) { - mpc_uint32_t tmp = 0; - int cnt = 0, tot = 0; - mpc_bool_t * MS_Flag = e->MS_Flag; - for( n = 0; n < MaxBand; n++) { - if ( Res_L[n] != 0 || Res_R[n] != 0 ) { - tmp = (tmp << 1) | MS_Flag[n]; - cnt += MS_Flag[n]; - tot++; - } - } - encodeLog(e, cnt, tot); - if (cnt * 2 > tot) tmp = ~tmp; - encodeEnum(e, tmp, tot); - } - } - - /************************************ SCF encoding type ***********************************/ - - if (e->framesInBlock == 0){ - for( n = 0; n < 32; n++) - DSCF_Flag_L[n] = DSCF_Flag_R[n] = 1; // new block -> force key frame - } - - Tables[0] = HuffSCFI_1; - Tables[1] = HuffSCFI_2; - for ( n = 0; n < MaxBand; n++ ) { - int tmp = 0, cnt = -1; - if (Res_L[n]) { - tmp = (e->SCF_Index_L[n][1] == e->SCF_Index_L[n][0]) * 2 + (e->SCF_Index_L[n][2] == e->SCF_Index_L[n][1]); - cnt++; - } - if (Res_R[n]) { - tmp = (tmp << 2) | ((e->SCF_Index_R[n][1] == e->SCF_Index_R[n][0]) * 2 + (e->SCF_Index_R[n][2] == e->SCF_Index_R[n][1])); - cnt++; - } - if (cnt >= 0) - writeBits(e, Tables[cnt][tmp].Code, Tables[cnt][tmp].Length); - } - - /************************************* SCF **********************************/ - - for ( n = 0; n < MaxBand; n++ ) { - if ( Res_L[n] ) { - int m; - mpc_int32_t * SCFI_L_n = e->SCF_Index_L[n]; - if (DSCF_Flag_L[n] == 1) { - writeBits(e, SCFI_L_n[0] + 6, 7); - DSCF_Flag_L[n] = 0; - } else { - unsigned int tmp = (SCFI_L_n[0] - SCF_Last_L[n] + 31) & 127; - if (tmp < 64) - writeBits(e, HuffDSCF_2[tmp].Code, HuffDSCF_2[tmp].Length); - else { - writeBits(e, HuffDSCF_2[64].Code, HuffDSCF_2[64].Length); - writeBits(e, tmp - 64, 6); - } - } - for( m = 0; m < 2; m++){ - if (SCFI_L_n[m+1] != SCFI_L_n[m]) { - unsigned int tmp = (SCFI_L_n[m+1] - SCFI_L_n[m] + 31) & 127; - if (tmp < 64) - writeBits(e, HuffDSCF_1[tmp].Code, HuffDSCF_1[tmp].Length); - else { - writeBits(e, HuffDSCF_1[31].Code, HuffDSCF_1[31].Length); - writeBits(e, tmp - 64, 6); - } - } - } - SCF_Last_L[n] = SCFI_L_n[2]; - } - if ( Res_R[n] ) { - int m; - mpc_int32_t * SCFI_R_n = e->SCF_Index_R[n]; - if (DSCF_Flag_R[n] == 1) { - writeBits(e, SCFI_R_n[0] + 6, 7); - DSCF_Flag_R[n] = 0; - } else { - unsigned int tmp = (SCFI_R_n[0] - SCF_Last_R[n] + 31) & 127; - if (tmp < 64) - writeBits(e, HuffDSCF_2[tmp].Code, HuffDSCF_2[tmp].Length); - else { - writeBits(e, HuffDSCF_2[64].Code, HuffDSCF_2[64].Length); - writeBits(e, tmp - 64, 6); - } - } - for( m = 0; m < 2; m++){ - if (SCFI_R_n[m+1] != SCFI_R_n[m]) { - unsigned int tmp = (SCFI_R_n[m+1] - SCFI_R_n[m] + 31) & 127; - if (tmp < 64) - writeBits(e, HuffDSCF_1[tmp].Code, HuffDSCF_1[tmp].Length); - else { - writeBits(e, HuffDSCF_1[31].Code, HuffDSCF_1[31].Length); - writeBits(e, tmp - 64, 6); - } - } - } - SCF_Last_R[n] = SCFI_R_n[2]; - } - } - - /*********************************** Samples *********************************/ - for ( n = 0; n < MaxBand; n++ ) { - int Res = Res_L[n]; - const mpc_int16_t * q = e->Q[n].L; - static const unsigned int thres[] = {0, 0, 3, 7, 9, 1, 3, 4, 8}; - static const int HuffQ2_var[5*5*5] = - {6, 5, 4, 5, 6, 5, 4, 3, 4, 5, 4, 3, 2, 3, 4, 5, 4, 3, 4, 5, 6, 5, 4, 5, 6, 5, 4, 3, 4, 5, 4, 3, 2, 3, 4, 3, 2, 1, 2, 3, 4, 3, 2, 3, 4, 5, 4, 3, 4, 5, 4, 3, 2, 3, 4, 3, 2, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 2, 3, 4, 3, 2, 3, 4, 5, 4, 3, 4, 5, 4, 3, 2, 3, 4, 3, 2, 1, 2, 3, 4, 3, 2, 3, 4, 5, 4, 3, 4, 5, 6, 5, 4, 5, 6, 5, 4, 3, 4, 5, 4, 3, 2, 3, 4, 5, 4, 3, 4, 5, 6, 5, 4, 5, 6}; - - do { - int k = 0, idx = 1, cnt = 0, sng; - switch ( Res ) { - case -1: - case 0: - break; - case 1: - Table = HuffQ [0][0]; - for( ; k < 36; ){ - int kmax = k + 18; - cnt = 0, sng = 0; - for ( ; k < kmax; k++) { - idx <<= 1; - if (q[k] != 1) { - cnt++; - idx |= 1; - sng = (sng << 1) | (q[k] >> 1); - } - } - writeBits(e, Table[cnt].Code, Table[cnt].Length); - if (cnt > 0) { - if (cnt > 9) idx = ~idx; - encodeEnum(e, idx, 18); - writeBits(e, sng, cnt); - } - } - break; - case 2: - Tables[0] = HuffQ [0][1]; - Tables[1] = HuffQ [1][1]; - idx = 2 * thres[Res]; - for ( ; k < 36; k += 3) { - int tmp = q[k] + 5*q[k+1] + 25*q[k+2]; - writeBits ( e, Tables[idx > thres[Res]][tmp].Code, - Tables[idx > thres[Res]][tmp].Length ); - idx = (idx >> 1) + HuffQ2_var[tmp]; - } - break; - case 3: - case 4: - Table = HuffQ [0][Res - 1]; - for ( ; k < 36; k += 2 ) { - int tmp = q[k] + thres[Res]*q[k+1]; - writeBits ( e, Table[tmp].Code, Table[tmp].Length ); - } - break; - case 5: - case 6: - case 7: - case 8: - Tables[0] = HuffQ [0][Res - 1]; - Tables[1] = HuffQ [1][Res - 1]; - idx = 2 * thres[Res]; - for ( ; k < 36; k++ ) { - int tmp = q[k] - (1 << (Res - 2)) + 1; - writeBits ( e, Tables[idx > thres[Res]][q[k]].Code, - Tables[idx > thres[Res]][q[k]].Length ); - if (tmp < 0) tmp = -tmp; - idx = (idx >> 1) + tmp; - } - break; - default: - for ( ; k < 36; k++ ) { - writeBits ( e, HuffQ9up[q[k] >> (Res - 9)].Code, - HuffQ9up[q[k] >> (Res - 9)].Length ); - if (Res != 9) - writeBits ( e, q[k] & ((1 << (Res - 9)) - 1), Res - 9); - } - break; - } - - Res = Res_R[n]; - } while (q == e->Q[n].L && (q = e->Q[n].R)); - } - - e->framesInBlock++; - if (e->framesInBlock == (1 << e->frames_per_block_pwr)) { - if ((e->block_cnt & ((1 << e->seek_pwr) - 1)) == 0) { - e->seek_table[e->seek_pos] = ftell(e->outputFile); - e->seek_pos++; - } - e->block_cnt++; - writeBlock(e, "AP", MPC_FALSE, 0); - } -} - -#if 0 - -typedef struct { - int Symbol; - unsigned int Count; - unsigned int Code; - unsigned int Bits; -} huff_sym_t; - -void _Huffman_MakeTree( huff_sym_t *sym, unsigned int num_symbols); -void _Huffman_PrintCodes(huff_sym_t * sym, unsigned int num_symbols, int print_type, int offset); - -void print_histo(void) -{ - int i, j; - huff_sym_t sym[HISTO_NB][HISTO_LEN]; - unsigned int dist[HISTO_NB]; - unsigned int size[HISTO_NB]; - unsigned int cnt[HISTO_NB]; - unsigned int total_cnt, total_size, full_count = 0, full_size = 0; - double optim_size, full_optim = 0; - - return; - - memset(dist, 1, sizeof dist); - memset(sym, 0, sizeof(huff_sym_t) * HISTO_LEN * HISTO_NB); - - for(j = 0 ; j < HISTO_NB ; j++) { - for(i = 0 ; i < HISTO_LEN; i++) { - sym[j][i].Symbol = i; - sym[j][i].Count = histo[j][i]; - if (sym[j][i].Count == 0) - sym[j][i].Count = 1; - } - _Huffman_MakeTree(sym[j], HISTO_LEN); - _Huffman_PrintCodes(sym[j], HISTO_LEN, 3, 0); - _Huffman_PrintCodes(sym[j], HISTO_LEN, 0, 0); - _Huffman_PrintCodes(sym[j], HISTO_LEN, 1, 0); - total_cnt = 0; - total_size = 0; - optim_size = 0; - for( i = 0; i < HISTO_LEN; i++) { - total_cnt += sym[j][i].Count; - total_size += sym[j][i].Count * sym[j][i].Bits; - if (sym[j][i].Count != 0) - optim_size += sym[j][i].Count * __builtin_log2(sym[j][i].Count); - } - full_count += total_cnt; - full_size += total_size; - optim_size = total_cnt * __builtin_log2(total_cnt) - optim_size; - full_optim += optim_size; - size[j] = total_size; - cnt[j] = total_cnt; - printf("%u count : %u huff : %f bps ", j, total_cnt, (float)total_size / total_cnt); - printf("opt : %f bps ", (float)optim_size / total_cnt); - printf("loss : %f bps (%f %%)\n", (float)(total_size - optim_size) / total_cnt, (float)(total_size - optim_size) * 100 / optim_size); - for( i = 0; i < HISTO_LEN; i++){ - printf("%u ", sym[j][i].Bits); - } - - printf("\n\n"); - } - printf("cnt : %u size %f optim %f\n", full_count, (float)full_size / full_count, (float)full_optim / full_count); - printf("loss : %f bps (%f %%)\n", (float)(full_size - full_optim) / full_count, (float)(full_size - full_optim) * 100 / full_optim); - - - printf("\n"); -} - -void -Dump ( const unsigned int* q, const int Res ) -{ - switch ( Res ) { - case 1: - for ( k = 0; k < 36; k++, q++ ) - printf ("%2d%c", *q-1, k==35?'\n':' '); - break; - case 2: - for ( k = 0; k < 36; k++, q++ ) - printf ("%2d%c", *q-2, k==35?'\n':' '); - break; - case 3: case 4: case 5: case 6: case 7: - if ( Res == 5 ) - for ( k = 0; k < 36; k++, q++ ) - printf ("%2d%c", *q-7, k==35?'\n':' '); - break; - case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17: - printf ("%2u: ", Res-1 ); - for ( k = 0; k < 36; k++, q++ ) { - printf ("%6d", *q - (1 << (Res-2)) ); - } - printf ("\n"); - break; - } -} -#endif - -/* end of encode_sv7.c */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcenc/huffsv7.c b/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcenc/huffsv7.c deleted file mode 100644 index dd13f8e0..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcenc/huffsv7.c +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Musepack audio compression - * Copyright (c) 2005-2009, The Musepack Development Team - * Copyright (C) 1999-2004 Buschmann/Klemm/Piecha/Wolf - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "libmpcenc.h" - -const Huffman_t HuffBands [33] = { - {1, 1}, {1, 3}, {2, 5}, {2, 6}, {3, 7}, {3, 8}, {4, 8}, {4, 9}, {5, 10}, {6, 11}, {1, 12}, {2, 12}, {3, 12}, {0, 13}, {4, 12}, {5, 12}, {6, 12}, {7, 12}, {8, 12}, {1, 13}, {9, 12}, {10, 12}, {11, 12}, {7, 11}, {8, 11}, {9, 11}, {6, 10}, {7, 10}, {5, 9}, {5, 8}, {3, 6}, {3, 5}, {1, 2} -}; - -const Huffman_t HuffRes [2] [17] = { - { - {1, 1}, {1, 2}, {1, 4}, {1, 5}, {1, 6}, {1, 7}, {1, 9}, {1, 10}, {1, 11}, {1, 12}, {1, 13}, {1, 14}, {1, 15}, {0, 16}, {1, 16}, {1, 8}, {1, 3} - }, { - {1, 2}, {2, 2}, {1, 3}, {1, 5}, {1, 7}, {1, 8}, {1, 10}, {1, 12}, {0, 14}, {1, 14}, {2, 14}, {3, 14}, {1, 11}, {1, 9}, {1, 6}, {1, 4}, {3, 2} - } -}; - -const Huffman_t HuffSCFI_1 [4] = { - {0, 3}, {1, 3}, {1, 1}, {1, 2} -}; - -const Huffman_t HuffSCFI_2 [16] = { - {1, 6}, {0, 7}, {2, 6}, {3, 6}, {1, 7}, {3, 5}, {4, 5}, {5, 5}, {4, 6}, {6, 5}, {2, 2}, {2, 3}, {5, 6}, {7, 5}, {3, 3}, {3, 2} -}; - -const Huffman_t HuffDSCF_1 [64] = { - {3, 12}, {4, 12}, {5, 12}, {4, 11}, {5, 11}, {6, 11}, {5, 10}, {6, 10}, {7, 10}, {8, 10}, {9, 10}, {7, 9}, {8, 9}, {9, 9}, {10, 9}, {7, 8}, {8, 8}, {9, 8}, {10, 8}, {7, 7}, {8, 7}, {9, 7}, {10, 7}, {6, 6}, {7, 6}, {5, 5}, {4, 4}, {5, 4}, {6, 5}, {6, 4}, {7, 4}, {10, 10}, {8, 4}, {5, 3}, {6, 3}, {7, 3}, {9, 4}, {7, 5}, {8, 6}, {9, 6}, {11, 7}, {11, 8}, {12, 8}, {13, 8}, {11, 9}, {12, 9}, {13, 9}, {11, 10}, {12, 10}, {13, 10}, {7, 11}, {8, 11}, {9, 11}, {6, 12}, {7, 12}, {3, 13}, {4, 13}, {5, 13}, {0, 14}, {1, 14}, {2, 14}, {3, 14}, {4, 14}, {5, 14} -}; - -const Huffman_t HuffDSCF_2 [65] = { - {0, 15}, {3, 14}, {4, 14}, {4, 13}, {5, 13}, {6, 13}, {5, 12}, {6, 12}, {7, 12}, {8, 12}, {7, 11}, {8, 11}, {9, 11}, {10, 11}, {7, 10}, {8, 10}, {9, 10}, {10, 10}, {7, 9}, {8, 9}, {9, 9}, {6, 8}, {7, 8}, {5, 7}, {6, 7}, {4, 6}, {3, 5}, {3, 4}, {4, 4}, {3, 3}, {4, 3}, {5, 3}, {6, 3}, {7, 3}, {5, 4}, {4, 5}, {5, 5}, {5, 6}, {7, 7}, {8, 8}, {9, 8}, {10, 9}, {11, 9}, {11, 10}, {12, 10}, {13, 10}, {11, 11}, {12, 11}, {13, 11}, {9, 12}, {10, 12}, {11, 12}, {12, 12}, {7, 13}, {8, 13}, {9, 13}, {5, 14}, {6, 14}, {7, 14}, {1, 15}, {2, 15}, {3, 15}, {4, 15}, {5, 15}, {13, 12} -}; - -static const Huffman_t HuffQ1 [19] = { - {1, 6}, {1, 4}, {2, 4}, {3, 3}, {4, 3}, {5, 3}, {6, 3}, {7, 3}, {3, 4}, {4, 4}, {5, 4}, {1, 5}, {1, 7}, {1, 8}, {1, 9}, {1, 10}, {1, 11}, {0, 12}, {1, 12} -}; - -static const Huffman_t HuffQ2 [2] [5*5*5] = { - { - {2, 12}, {3, 11}, {15, 10}, {4, 11}, {0, 13}, {5, 11}, {12, 9}, {18, 8}, {13, 9}, {6, 11}, {7, 11}, {19, 8}, {21, 7}, {20, 8}, {8, 11}, {9, 11}, {14, 9}, {21, 8}, {15, 9}, {10, 11}, {3, 12}, {11, 11}, {16, 10}, {12, 11}, {1, 13}, {13, 11}, {16, 9}, {22, 8}, {17, 9}, {14, 11}, {18, 9}, {15, 6}, {16, 6}, {22, 7}, {19, 9}, {23, 8}, {17, 6}, {8, 4}, {18, 6}, {24, 8}, {20, 9}, {19, 6}, {20, 6}, {23, 7}, {21, 9}, {15, 11}, {22, 9}, {25, 8}, {23, 9}, {16, 11}, {17, 10}, {26, 8}, {24, 7}, {27, 8}, {18, 10}, {28, 8}, {21, 6}, {9, 4}, {22, 6}, {29, 8}, {25, 7}, {10, 4}, {7, 3}, {11, 4}, {26, 7}, {30, 8}, {23, 6}, {12, 4}, {24, 6}, {31, 8}, {19, 10}, {32, 8}, {27, 7}, {33, 8}, {20, 10}, {17, 11}, {24, 9}, {34, 8}, {25, 9}, {18, 11}, {26, 9}, {25, 6}, {26, 6}, {27, 6}, {27, 9}, {35, 8}, {28, 6}, {13, 4}, {29, 6}, {36, 8}, {28, 9}, {28, 7}, {30, 6}, {31, 6}, {29, 9}, {19, 11}, {30, 9}, {37, 8}, {31, 9}, {20, 11}, {2, 13}, {21, 11}, {21, 10}, {22, 11}, {4, 12}, {23, 11}, {32, 9}, {38, 8}, {33, 9}, {24, 11}, {22, 10}, {39, 8}, {29, 7}, {40, 8}, {25, 11}, {26, 11}, {34, 9}, {41, 8}, {35, 9}, {27, 11}, {3, 13}, {28, 11}, {23, 10}, {29, 11}, {5, 12} - }, { - {2, 11}, {3, 10}, {15, 9}, {4, 10}, {0, 12}, {5, 10}, {12, 8}, {13, 8}, {14, 8}, {6, 10}, {7, 10}, {15, 8}, {30, 7}, {16, 8}, {16, 9}, {8, 10}, {17, 8}, {18, 8}, {19, 8}, {9, 10}, {3, 11}, {10, 10}, {17, 9}, {11, 10}, {1, 12}, {12, 10}, {20, 8}, {21, 8}, {22, 8}, {13, 10}, {23, 8}, {18, 6}, {14, 5}, {19, 6}, {24, 8}, {25, 8}, {20, 6}, {15, 5}, {16, 5}, {26, 8}, {27, 8}, {21, 6}, {17, 5}, {22, 6}, {28, 8}, {14, 10}, {29, 8}, {30, 8}, {31, 8}, {15, 10}, {18, 9}, {32, 8}, {31, 7}, {33, 8}, {19, 9}, {34, 8}, {18, 5}, {19, 5}, {20, 5}, {35, 8}, {32, 7}, {21, 5}, {15, 4}, {22, 5}, {33, 7}, {36, 8}, {23, 5}, {24, 5}, {25, 5}, {37, 8}, {20, 9}, {38, 8}, {34, 7}, {39, 8}, {21, 9}, {16, 10}, {40, 8}, {41, 8}, {42, 8}, {17, 10}, {43, 8}, {23, 6}, {26, 5}, {24, 6}, {44, 8}, {45, 8}, {27, 5}, {28, 5}, {25, 6}, {46, 8}, {47, 8}, {26, 6}, {29, 5}, {27, 6}, {48, 8}, {18, 10}, {49, 8}, {50, 8}, {51, 8}, {19, 10}, {2, 12}, {20, 10}, {21, 10}, {22, 10}, {4, 11}, {23, 10}, {52, 8}, {53, 8}, {54, 8}, {24, 10}, {22, 9}, {55, 8}, {35, 7}, {56, 8}, {25, 10}, {26, 10}, {57, 8}, {58, 8}, {59, 8}, {27, 10}, {3, 12}, {28, 10}, {23, 9}, {29, 10}, {5, 11} - } -}; - -static const Huffman_t HuffQ3 [49] = { - {0, 9}, {2, 8}, {5, 7}, {6, 7}, {7, 7}, {3, 8}, {1, 9}, {4, 8}, {9, 6}, {10, 6}, {10, 5}, {11, 6}, {8, 7}, {5, 8}, {9, 7}, {12, 6}, {8, 4}, {9, 4}, {11, 5}, {13, 6}, {10, 7}, {11, 7}, {12, 5}, {10, 4}, {7, 3}, {11, 4}, {13, 5}, {12, 7}, {13, 7}, {14, 6}, {14, 5}, {12, 4}, {13, 4}, {15, 6}, {14, 7}, {6, 8}, {16, 6}, {17, 6}, {15, 5}, {18, 6}, {19, 6}, {7, 8}, {2, 9}, {8, 8}, {15, 7}, {16, 7}, {17, 7}, {9, 8}, {3, 9} -}; - -static const Huffman_t HuffQ4 [81] = { - {0, 10}, {2, 9}, {5, 8}, {12, 7}, {13, 7}, {6, 8}, {7, 8}, {3, 9}, {1, 10}, {4, 9}, {8, 8}, {14, 7}, {13, 6}, {14, 6}, {15, 6}, {15, 7}, {9, 8}, {5, 9}, {10, 8}, {16, 7}, {16, 6}, {17, 6}, {18, 5}, {18, 6}, {19, 6}, {17, 7}, {11, 8}, {12, 8}, {20, 6}, {21, 6}, {19, 5}, {20, 5}, {21, 5}, {22, 6}, {23, 6}, {13, 8}, {18, 7}, {24, 6}, {22, 5}, {23, 5}, {15, 4}, {24, 5}, {25, 5}, {25, 6}, {19, 7}, {14, 8}, {26, 6}, {27, 6}, {26, 5}, {27, 5}, {28, 5}, {28, 6}, {29, 6}, {15, 8}, {16, 8}, {20, 7}, {30, 6}, {31, 6}, {29, 5}, {32, 6}, {33, 6}, {21, 7}, {17, 8}, {6, 9}, {18, 8}, {22, 7}, {23, 7}, {34, 6}, {35, 6}, {24, 7}, {19, 8}, {7, 9}, {2, 10}, {8, 9}, {20, 8}, {21, 8}, {25, 7}, {22, 8}, {23, 8}, {9, 9}, {3, 10} -}; - -static const Huffman_t HuffQ5 [2] [15] = { - { - {0, 7}, {1, 7}, {2, 6}, {2, 5}, {2, 4}, {2, 3}, {3, 3}, {3, 2}, {4, 3}, {5, 3}, {3, 4}, {3, 5}, {3, 6}, {2, 7}, {3, 7} - }, { - {0, 6}, {1, 6}, {2, 5}, {2, 4}, {3, 4}, {3, 3}, {4, 3}, {5, 3}, {6, 3}, {7, 3}, {4, 4}, {5, 4}, {3, 5}, {2, 6}, {3, 6} - } -}; - -static const Huffman_t HuffQ6 [2] [31] = { - { - {0, 9}, {1, 9}, {2, 9}, {3, 9}, {4, 8}, {5, 8}, {4, 7}, {3, 6}, {4, 6}, {5, 6}, {5, 5}, {6, 5}, {4, 4}, {5, 4}, {4, 3}, {3, 2}, {5, 3}, {6, 4}, {7, 4}, {7, 5}, {6, 6}, {7, 6}, {8, 6}, {9, 6}, {5, 7}, {6, 8}, {7, 8}, {4, 9}, {5, 9}, {6, 9}, {7, 9} - }, { - {0, 8}, {1, 8}, {2, 7}, {3, 7}, {4, 7}, {4, 6}, {5, 6}, {4, 5}, {5, 5}, {6, 5}, {5, 4}, {6, 4}, {7, 4}, {8, 4}, {9, 4}, {10, 4}, {11, 4}, {12, 4}, {13, 4}, {14, 4}, {15, 4}, {7, 5}, {8, 5}, {9, 5}, {6, 6}, {7, 6}, {5, 7}, {6, 7}, {7, 7}, {2, 8}, {3, 8} - } -}; - -static const Huffman_t HuffQ7 [2] [63] = { - { - {0, 10}, {1, 10}, {2, 10}, {8, 9}, {9, 9}, {3, 10}, {4, 10}, {5, 10}, {6, 10}, {7, 10}, {10, 9}, {11, 9}, {12, 9}, {13, 9}, {10, 8}, {11, 8}, {12, 8}, {13, 8}, {14, 8}, {10, 7}, {11, 7}, {12, 7}, {13, 7}, {14, 7}, {10, 6}, {11, 6}, {12, 6}, {8, 5}, {9, 5}, {6, 4}, {4, 3}, {3, 2}, {5, 3}, {7, 4}, {10, 5}, {11, 5}, {13, 6}, {14, 6}, {15, 6}, {15, 7}, {16, 7}, {17, 7}, {18, 7}, {15, 8}, {19, 7}, {16, 8}, {17, 8}, {18, 8}, {19, 8}, {14, 9}, {15, 9}, {16, 9}, {17, 9}, {8, 10}, {9, 10}, {10, 10}, {11, 10}, {12, 10}, {18, 9}, {19, 9}, {13, 10}, {14, 10}, {15, 10} - }, { - {0, 9}, {1, 9}, {2, 8}, {3, 8}, {4, 8}, {5, 8}, {6, 8}, {7, 8}, {8, 8}, {8, 7}, {9, 7}, {10, 7}, {11, 7}, {12, 7}, {9, 6}, {10, 6}, {11, 6}, {12, 6}, {13, 6}, {14, 6}, {15, 6}, {16, 6}, {12, 5}, {13, 5}, {14, 5}, {15, 5}, {16, 5}, {17, 5}, {18, 5}, {19, 5}, {20, 5}, {21, 5}, {22, 5}, {23, 5}, {24, 5}, {25, 5}, {26, 5}, {27, 5}, {28, 5}, {29, 5}, {30, 5}, {31, 5}, {17, 6}, {18, 6}, {19, 6}, {20, 6}, {21, 6}, {22, 6}, {23, 6}, {13, 7}, {14, 7}, {15, 7}, {16, 7}, {17, 7}, {9, 8}, {10, 8}, {11, 8}, {12, 8}, {13, 8}, {14, 8}, {15, 8}, {2, 9}, {3, 9} - } -}; - -static const Huffman_t HuffQ8 [2] [127] = { - { - {3, 11}, {4, 11}, {10, 10}, {11, 10}, {12, 10}, {13, 10}, {14, 10}, {26, 9}, {15, 10}, {27, 9}, {16, 10}, {0, 12}, {1, 12}, {5, 11}, {6, 11}, {7, 11}, {8, 11}, {9, 11}, {10, 11}, {11, 11}, {17, 10}, {12, 11}, {18, 10}, {19, 10}, {20, 10}, {21, 10}, {22, 10}, {23, 10}, {24, 10}, {25, 10}, {28, 9}, {26, 10}, {27, 10}, {28, 10}, {29, 10}, {30, 10}, {29, 9}, {30, 9}, {31, 9}, {32, 9}, {33, 9}, {34, 9}, {35, 9}, {36, 9}, {25, 8}, {37, 9}, {26, 8}, {27, 8}, {28, 8}, {29, 8}, {30, 8}, {31, 8}, {20, 7}, {21, 7}, {22, 7}, {23, 7}, {14, 6}, {15, 6}, {16, 6}, {17, 6}, {11, 5}, {7, 4}, {4, 3}, {3, 2}, {5, 3}, {12, 5}, {13, 5}, {18, 6}, {19, 6}, {20, 6}, {21, 6}, {24, 7}, {25, 7}, {26, 7}, {27, 7}, {32, 8}, {33, 8}, {34, 8}, {35, 8}, {36, 8}, {37, 8}, {38, 8}, {39, 8}, {38, 9}, {39, 9}, {40, 9}, {41, 9}, {42, 9}, {43, 9}, {44, 9}, {45, 9}, {46, 9}, {31, 10}, {32, 10}, {47, 9}, {33, 10}, {34, 10}, {35, 10}, {36, 10}, {37, 10}, {38, 10}, {39, 10}, {40, 10}, {41, 10}, {13, 11}, {14, 11}, {42, 10}, {15, 11}, {16, 11}, {17, 11}, {18, 11}, {2, 12}, {19, 11}, {3, 12}, {4, 12}, {5, 12}, {43, 10}, {44, 10}, {48, 9}, {49, 9}, {45, 10}, {46, 10}, {47, 10}, {48, 10}, {49, 10}, {50, 10}, {51, 10} - }, { - {0, 9}, {1, 9}, {2, 9}, {3, 9}, {4, 8}, {5, 8}, {6, 8}, {7, 8}, {8, 8}, {9, 8}, {10, 8}, {11, 8}, {12, 8}, {13, 8}, {14, 8}, {15, 8}, {16, 8}, {17, 8}, {18, 8}, {19, 8}, {20, 8}, {21, 8}, {21, 7}, {22, 7}, {23, 7}, {24, 7}, {25, 7}, {26, 7}, {27, 7}, {28, 7}, {29, 7}, {30, 7}, {31, 7}, {32, 7}, {33, 7}, {34, 7}, {35, 7}, {36, 7}, {37, 7}, {38, 7}, {39, 7}, {40, 7}, {41, 7}, {42, 7}, {43, 7}, {44, 7}, {45, 7}, {46, 7}, {47, 7}, {48, 7}, {38, 6}, {39, 6}, {40, 6}, {41, 6}, {42, 6}, {43, 6}, {44, 6}, {45, 6}, {46, 6}, {47, 6}, {48, 6}, {49, 6}, {50, 6}, {51, 6}, {52, 6}, {53, 6}, {54, 6}, {55, 6}, {56, 6}, {57, 6}, {58, 6}, {59, 6}, {60, 6}, {61, 6}, {62, 6}, {49, 7}, {63, 6}, {50, 7}, {51, 7}, {52, 7}, {53, 7}, {54, 7}, {55, 7}, {56, 7}, {57, 7}, {58, 7}, {59, 7}, {60, 7}, {61, 7}, {62, 7}, {63, 7}, {64, 7}, {65, 7}, {66, 7}, {67, 7}, {68, 7}, {69, 7}, {70, 7}, {71, 7}, {72, 7}, {73, 7}, {74, 7}, {75, 7}, {22, 8}, {23, 8}, {24, 8}, {25, 8}, {26, 8}, {27, 8}, {28, 8}, {29, 8}, {30, 8}, {31, 8}, {32, 8}, {33, 8}, {34, 8}, {35, 8}, {36, 8}, {37, 8}, {38, 8}, {39, 8}, {40, 8}, {41, 8}, {4, 9}, {5, 9}, {6, 9}, {7, 9} - } -}; - -const Huffman_t HuffQ9up [256] = { - {1, 10}, {2, 10}, {3, 10}, {4, 10}, {5, 10}, {5, 9}, {6, 9}, {7, 9}, {8, 9}, {9, 9}, {10, 9}, {11, 9}, {12, 9}, {13, 9}, {14, 9}, {15, 9}, {16, 9}, {17, 9}, {18, 9}, {38, 8}, {39, 8}, {19, 9}, {20, 9}, {21, 9}, {22, 9}, {23, 9}, {24, 9}, {25, 9}, {26, 9}, {27, 9}, {28, 9}, {29, 9}, {30, 9}, {31, 9}, {32, 9}, {33, 9}, {34, 9}, {35, 9}, {36, 9}, {37, 9}, {40, 8}, {38, 9}, {41, 8}, {42, 8}, {43, 8}, {44, 8}, {45, 8}, {46, 8}, {47, 8}, {48, 8}, {49, 8}, {50, 8}, {51, 8}, {52, 8}, {53, 8}, {54, 8}, {55, 8}, {56, 8}, {57, 8}, {58, 8}, {59, 8}, {60, 8}, {61, 8}, {62, 8}, {63, 8}, {64, 8}, {65, 8}, {66, 8}, {67, 8}, {68, 8}, {69, 8}, {70, 8}, {71, 8}, {72, 8}, {73, 8}, {74, 8}, {75, 8}, {76, 8}, {77, 8}, {78, 8}, {79, 8}, {80, 8}, {81, 8}, {82, 8}, {83, 8}, {84, 8}, {85, 8}, {86, 8}, {87, 8}, {88, 8}, {89, 8}, {90, 8}, {91, 8}, {92, 8}, {93, 8}, {94, 8}, {95, 8}, {96, 8}, {97, 8}, {98, 8}, {99, 8}, {100, 8}, {101, 8}, {102, 8}, {103, 8}, {104, 8}, {105, 8}, {106, 8}, {86, 7}, {87, 7}, {88, 7}, {89, 7}, {90, 7}, {91, 7}, {92, 7}, {93, 7}, {94, 7}, {95, 7}, {96, 7}, {97, 7}, {98, 7}, {99, 7}, {100, 7}, {101, 7}, {102, 7}, {103, 7}, {104, 7}, {62, 6}, {63, 6}, {105, 7}, {106, 7}, {107, 7}, {108, 7}, {109, 7}, {110, 7}, {111, 7}, {112, 7}, {113, 7}, {114, 7}, {115, 7}, {116, 7}, {117, 7}, {118, 7}, {119, 7}, {120, 7}, {121, 7}, {122, 7}, {107, 8}, {123, 7}, {108, 8}, {109, 8}, {110, 8}, {111, 8}, {112, 8}, {113, 8}, {114, 8}, {115, 8}, {116, 8}, {117, 8}, {118, 8}, {119, 8}, {120, 8}, {121, 8}, {122, 8}, {123, 8}, {124, 8}, {125, 8}, {126, 8}, {127, 8}, {128, 8}, {129, 8}, {130, 8}, {131, 8}, {132, 8}, {133, 8}, {134, 8}, {135, 8}, {136, 8}, {137, 8}, {138, 8}, {139, 8}, {140, 8}, {141, 8}, {142, 8}, {143, 8}, {144, 8}, {145, 8}, {146, 8}, {147, 8}, {148, 8}, {149, 8}, {150, 8}, {151, 8}, {152, 8}, {153, 8}, {154, 8}, {155, 8}, {156, 8}, {157, 8}, {158, 8}, {159, 8}, {160, 8}, {161, 8}, {162, 8}, {163, 8}, {164, 8}, {165, 8}, {166, 8}, {167, 8}, {168, 8}, {169, 8}, {170, 8}, {171, 8}, {39, 9}, {40, 9}, {41, 9}, {42, 9}, {43, 9}, {44, 9}, {45, 9}, {46, 9}, {47, 9}, {48, 9}, {49, 9}, {50, 9}, {51, 9}, {52, 9}, {53, 9}, {54, 9}, {55, 9}, {56, 9}, {57, 9}, {58, 9}, {59, 9}, {60, 9}, {61, 9}, {62, 9}, {63, 9}, {64, 9}, {65, 9}, {66, 9}, {67, 9}, {68, 9}, {69, 9}, {70, 9}, {71, 9}, {72, 9}, {73, 9}, {74, 9}, {75, 9}, {6, 10}, {7, 10}, {8, 10}, {9, 10}, {0, 11}, {1, 11} -}; - -Huffman_t const * const HuffQ [2] [8] = { - { HuffQ1, HuffQ2[0], HuffQ3, HuffQ4, HuffQ5[0], HuffQ6[0], HuffQ7[0], HuffQ8[0] }, - { HuffQ1, HuffQ2[1], HuffQ3, HuffQ4, HuffQ5[1], HuffQ6[1], HuffQ7[1], HuffQ8[1] } -}; - -/* end of huffsv7.c */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcenc/libmpcenc.h b/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcenc/libmpcenc.h deleted file mode 100644 index e9d5f194..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcenc/libmpcenc.h +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Musepack audio compression - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#pragma once - -#include -#include - -// FIXME : define this somewhere else -#ifndef NULL -#define NULL 0 -#endif - -#define MPC_FRAME_LENGTH (36 * 32) -#define MAX_FRAME_SIZE 4352 - -typedef struct { - mpc_uint16_t Code; // >= 14 bit - mpc_uint16_t Length; // >= 4 bit -} Huffman_t; - -typedef struct { - mpc_uint_t pos; // next free byte position in the buffer - mpc_uint_t bitsCount; // number of used bits in bitsBuff - mpc_uint64_t outputBits; // Counter for the number of written bits in the bitstream - mpc_uint32_t bitsBuff; // bits buffer - mpc_uint8_t * buffer; // Buffer for bitstream-file - mpc_uint_t framesInBlock; // Number of frames in current block - mpc_uint_t frames_per_block_pwr; // Number of frame in a block = 1 << frames_per_block_pwr - - // seeking - mpc_uint32_t * seek_table; - mpc_uint32_t seek_pos; /// current position in the seek table - mpc_uint32_t seek_ref; /// reference position for the seek information - mpc_uint32_t seek_ptr; /// position of the seek pointer block - mpc_uint32_t seek_pwr; /// keep a seek table entry every 2^seek_pwr block - mpc_uint32_t block_cnt; /// number of encoded blocks - - FILE * outputFile; // ouput file - - mpc_uint32_t MS_Channelmode; - mpc_uint32_t Overflows; // = 0; // number of internal (filterbank) clippings - mpc_uint32_t MaxBand; /// number of non zero bands in last frame - - mpc_int32_t SCF_Index_L [32] [3]; - mpc_int32_t SCF_Index_R [32] [3]; // holds scalefactor-indices - mpc_int32_t SCF_Last_L [32]; - mpc_int32_t SCF_Last_R [32]; // Last coded SCF value - mpc_quantizer Q [32]; // holds quantized samples - mpc_int32_t Res_L [32]; - mpc_int32_t Res_R [32]; // holds the chosen quantizer for each subband - mpc_bool_t DSCF_Flag_L [32]; - mpc_bool_t DSCF_Flag_R [32]; // differential SCF used? - mpc_bool_t MS_Flag[32]; // MS used? - } mpc_encoder_t; - - void mpc_encoder_init ( mpc_encoder_t * e, - mpc_uint64_t SamplesInWAVE, - unsigned int FramesBlockPwr, - unsigned int SeekDistance ); - void mpc_encoder_exit ( mpc_encoder_t * e ); - void writeStreamInfo ( mpc_encoder_t*e, - const unsigned int MaxBand, - const unsigned int MS_on, - const unsigned int SamplesCount, - const unsigned int SamplesSkip, - const unsigned int SampleFreq, - const unsigned int ChannelCount); - void writeGainInfo ( mpc_encoder_t * e, - unsigned short t_gain, - unsigned short t_peak, - unsigned short a_gain, - unsigned short a_peak); - void writeEncoderInfo ( mpc_encoder_t * e, - const float profile, - const int PNS_on, - const int version_major, - const int version_minor, - const int version_build ); - mpc_uint32_t writeBlock ( mpc_encoder_t *, const char *, const mpc_bool_t, mpc_uint32_t); - void writeMagic (mpc_encoder_t * e); - void emptyBits(mpc_encoder_t * e); - - /// maximum number of output bits is 31 ! - static mpc_inline void writeBits (mpc_encoder_t * e, mpc_uint32_t input, unsigned int bits ) - { - e->outputBits += bits; - - if (e->bitsCount + bits > sizeof(e->bitsBuff) * 8) { - int tmp = (sizeof(e->bitsBuff) * 8 - e->bitsCount); - bits -= tmp; - e->bitsBuff = (e->bitsBuff << tmp) | (input >> bits); - e->bitsCount = sizeof(e->bitsBuff) * 8; - emptyBits(e); - input &= (1 << bits) - 1; - } - e->bitsBuff = (e->bitsBuff << bits) | input; - e->bitsCount += bits; - } - void writeSeekTable (mpc_encoder_t * e); - void writeBitstream_SV8 ( mpc_encoder_t*, int); - - unsigned int encodeSize(mpc_uint64_t, char *, mpc_bool_t); - void encodeEnum(mpc_encoder_t * e, const mpc_uint32_t bits, const mpc_uint_t N); - void encodeLog(mpc_encoder_t * e, mpc_uint32_t value, mpc_uint32_t max); - - diff --git a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcenc/quant.c b/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcenc/quant.c deleted file mode 100644 index 4cad8899..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/musepack/libmpcenc/quant.c +++ /dev/null @@ -1,309 +0,0 @@ -/* - * Musepack audio compression - * Copyright (c) 2005-2009, The Musepack Development Team - * Copyright (C) 1999-2004 Buschmann/Klemm/Piecha/Wolf - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "libmpcenc.h" -#include -#include - -/* V A R I A B L E S */ -float __SCF [128 + 6]; // tabulated scalefactors -#define SCF ( __SCF + 6 ) -float __invSCF [128 + 6]; // inverted scalefactors -#define invSCF (__invSCF + 6) - - -// Quantization-coefficients: step/65536 bzw. (2*D[Res]+1)/65536 -static const float __A [1 + 18] = { - 0.0000762939453125f, - 0.0000000000000000f, 0.0000457763671875f, 0.0000762939453125f, 0.0001068115234375f, - 0.0001373291015625f, 0.0002288818359375f, 0.0004730224609375f, 0.0009613037109375f, - 0.0019378662109375f, 0.0038909912109375f, 0.0077972412109375f, 0.0156097412109375f, - 0.0312347412109375f, 0.0624847412109375f, 0.1249847412109375f, 0.2499847412109375f, - 0.4999847412109375f -}; - - -// Requantization-coefficients: 65536/step bzw. 1/A[Res] -static const float __C [1 + 18] = { - 13107.200000000001f, - 65535.000000000000f, 21845.333333333332f, 13107.200000000001f, 9362.285714285713f, - 7281.777777777777f, 4369.066666666666f, 2114.064516129032f, 1040.253968253968f, - 516.031496062992f, 257.003921568627f, 128.250489236790f, 64.062561094819f, - 32.015632633121f, 16.003907203907f, 8.000976681723f, 4.000244155527f, - 2.000061037018f, 1.000015259022f -}; - - -// Requantization-Offset: 2*D+1 = steps of quantizer -static const int __D [1 + 18] = { - 2, - 0, 1, 2, 3, 4, 7, 15, 31, 63, - 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767 -}; - -#define A (__A + 1) -#define C (__C + 1) -#define D (__D + 1) - -// Generation of the scalefactors and their inverses -void -Init_Skalenfaktoren ( void ) -{ - int n; - - for ( n = -6; n < 128; n++ ) { - SCF[n] = (float) ( pow(10.,-0.1*(n-1)/1.26) ); - invSCF[n] = (float) ( pow(10., 0.1*(n-1)/1.26) ); - } -} - -#ifdef WIN32 -#pragma warning ( disable : 4305 ) -#endif - -static float NoiseInjectionCompensation1D [18] = { -#if 1 - 1.f, - 0.884621, - 0.935711, - 0.970829, - 0.987941, - 0.994315, - 0.997826, - 0.999744, - 1., 1., 1., 1., 1., 1., 1., 1., 1., 1. -#else - 1., - 0.907073, // -1...+1 - 0.946334, // -2...+2 - 0.974793, // -3...+3 - 0.987647, // -4...+4 - 0.994330, // -7...+7 - 0.997846, // -15...+15 - 1., // -31...+31 - 1., - 1., - 1., - 1., - 1., - 1., - 1., - 1., - 1., - 1., -#endif -} ; - -#if 0 -static float NoiseInjectionCompensation2D [18] [32] = { - { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, }, - { 0.931595, 0.891390, 0.852494, 0.872420, 0.904053, 0.933716, 0.958976, 0.977719, 0.993979, 1.009011, 1.020961, 1.029564, 1.026582, 1.026753, 1.035573, 1.053251, 1.073429, 1.096344, 1.096344, 1.096344, 1.096344, 1.096344, 1.096344, 1.096344, 1.096344, 1.096344, 1.096344, 1.096344, 1.096344, 1.096344, 1.096344, 1.096344, }, - { 0.878264, 0.882351, 0.904261, 0.930843, 0.949243, 0.966741, 0.980500, 0.988182, 0.993361, 0.997112, 0.998918, 0.999501, 1.003179, 1.007445, 1.008678, 0.995890, 0.991015, 0.988019, 0.985479, 0.987646, 1.003605, 1.029301, 1.040511, 1.061531, 1.083302, 1.083302, 1.083302, 1.083302, 1.083302, 1.083302, 1.083302, 1.083302, }, - { 0.866977, 0.943500, 0.941561, 0.953049, 0.967274, 0.980476, 0.988678, 0.993240, 0.996376, 0.998513, 0.999545, 0.999775, 1.000898, 1.003954, 1.006308, 1.004932, 1.002867, 1.002922, 1.003624, 1.005487, 1.003919, 1.008022, 0.987693, 1.000358, 1.017461, 1.039166, 1.056053, 1.068191, 1.068191, 1.068191, 1.068191, 1.068191, }, - { 0.880390, 0.976713, 0.976180, 0.976596, 0.982011, 0.988786, 0.993619, 0.996641, 0.998824, 1.000297, 1.001195, 1.001718, 1.002395, 1.003503, 1.005617, 1.005072, 1.002409, 1.003703, 1.003412, 1.003318, 1.005290, 1.007112, 1.014370, 1.010040, 1.000780, 1.005700, 1.020505, 1.030123, 1.030123, 1.030123, 1.030123, 1.030123, }, - { 0.916894, 0.987164, 0.988734, 0.992318, 0.995268, 0.996932, 0.998141, 0.999072, 0.999674, 1.000104, 1.000292, 1.000386, 1.000399, 1.000222, 1.000671, 1.002127, 1.000137, 1.000046, 0.999644, 0.999156, 1.000568, 1.000098, 0.993764, 0.993954, 0.998971, 1.002835, 1.002972, 0.995376, 1.001643, 1.001643, 1.001643, 1.001643, }, - { 0.982771, 0.995034, 0.997118, 0.998294, 0.998652, 0.999016, 0.999382, 0.999598, 0.999746, 0.999851, 0.999837, 0.999881, 0.999847, 1.000154, 0.999885, 1.000222, 0.999963, 1.000934, 0.999804, 0.999927, 1.000379, 0.997574, 0.997943, 0.998748, 0.998151, 0.997458, 1.000319, 1.001091, 0.998461, 0.996151, 1.005969, 1.005969, }, - { 0.997150, 0.999903, 0.999424, 0.999537, 0.999661, 0.999753, 0.999851, 0.999903, 0.999928, 0.999963, 0.999969, 0.999941, 0.999974, 0.999967, 0.999996, 0.999975, 0.999966, 0.999704, 0.999946, 0.999894, 0.999905, 1.000840, 1.000716, 1.000799, 1.000406, 0.999912, 1.000153, 0.999789, 1.000495, 1.000495, 1.001167, 1.001347, }, - { 0.995524, 0.999983, 1.000044, 0.999965, 0.999970, 0.999974, 0.999986, 0.999995, 0.999996, 1.000011, 0.999997, 1.000010, 1.000010, 1.000026, 1.000006, 1.000148, 1.000048, 0.999999, 1.000161, 1.000193, 0.999797, 1.000145, 0.999974, 1.000039, 0.999731, 0.999985, 1.000563, 1.000256, 1.000637, 1.000050, 1.002013, 1.001053, }, - { 0.994796, 0.999833, 1.000003, 1.000012, 0.999986, 0.999991, 0.999991, 1.000000, 1.000004, 0.999999, 1.000005, 1.000004, 1.000008, 0.999996, 1.000027, 1.000097, 0.999951, 0.999938, 0.999989, 1.000001, 1.000048, 0.999935, 1.000068, 1.000134, 0.999961, 1.000198, 0.999956, 0.999957, 0.999844, 1.000087, 0.999708, 1.000198, }, - { 0.996046, 0.999902, 1.000019, 1.000017, 0.999983, 0.999997, 1.000002, 0.999993, 0.999999, 1.000003, 1.000001, 1.000015, 1.000004, 1.000006, 0.999987, 0.999993, 0.999992, 1.000029, 1.000064, 0.999997, 1.000044, 1.000044, 0.999919, 0.999875, 1.000011, 0.999897, 0.999905, 0.999996, 0.999934, 0.999968, 1.000008, 0.999902, }, - { 0.998703, 0.999963, 1.000021, 1.000006, 1.000008, 1.000000, 1.000003, 0.999994, 0.999990, 0.999990, 1.000003, 1.000009, 1.000001, 0.999999, 1.000001, 1.000009, 0.999999, 0.999988, 1.000003, 0.999971, 1.000005, 1.000042, 0.999924, 0.999995, 0.999998, 0.999988, 0.999961, 0.999942, 1.000046, 1.000061, 1.000112, 1.000052, }, - { 0.999872, 1.000001, 1.000004, 0.999998, 0.999999, 0.999998, 0.999992, 0.999990, 0.999991, 1.000000, 1.000000, 1.000000, 1.000002, 0.999996, 1.000004, 1.000011, 0.999963, 1.000016, 1.000050, 0.999996, 0.999998, 1.000006, 0.999990, 0.999948, 0.999974, 1.000060, 1.000014, 0.999987, 0.999986, 0.999917, 0.999973, 1.000035, }, - { 1.000366, 1.000006, 0.999996, 0.999995, 0.999998, 0.999996, 0.999991, 1.000001, 0.999990, 0.999996, 1.000010, 0.999999, 1.000002, 1.000000, 0.999996, 0.999990, 1.000014, 0.999978, 1.000011, 0.999983, 0.999988, 0.999971, 0.999997, 0.999989, 0.999986, 0.999958, 1.000005, 0.999992, 0.999975, 0.999975, 0.999975, 0.999975, }, - { 0.999736, 0.999995, 1.000002, 1.000004, 0.999999, 1.000000, 1.000003, 1.000000, 1.000007, 0.999992, 0.999997, 0.999998, 0.999998, 0.999997, 1.000007, 1.000012, 1.000004, 0.999995, 0.999996, 1.000009, 1.000003, 1.000008, 1.000001, 1.000003, 1.000011, 1.000019, 0.999991, 0.999970, 0.999970, 0.999970, 0.999970, 0.999965, }, - { 0.999970, 1.000000, 1.000000, 1.000000, 1.000001, 1.000000, 1.000000, 0.999999, 1.000001, 1.000000, 0.999999, 0.999999, 0.999999, 1.000007, 1.000005, 1.000002, 0.999999, 0.999999, 1.000000, 0.999997, 0.999999, 1.000001, 1.000001, 0.999988, 0.999988, 0.999984, 0.999995, 0.999986, 0.999986, 0.999986, 0.999986, 0.999986, }, - { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, }, - { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, }, -}; -#endif - -#ifdef WIN32 -#pragma warning ( default : 4305 ) -#endif - -void -NoiseInjectionComp ( void ) -{ - int i; - - for ( i = 0; i < sizeof(NoiseInjectionCompensation1D)/sizeof(*NoiseInjectionCompensation1D); i++ ) - NoiseInjectionCompensation1D [i] = 1.f; -#if 0 - for ( i = 0; i < sizeof(NoiseInjectionCompensation2D)/sizeof(**NoiseInjectionCompensation2D); i++ ) - NoiseInjectionCompensation2D [0][i] = 1.f; -#endif -} - - -// Quantizes a subband and calculates iSNR -float -ISNR_Schaetzer ( const float* input, const float SNRcomp, const int res ) -{ - const float fac = A [res] * NoiseInjectionCompensation1D [res]; - const float invfac = C [res] / NoiseInjectionCompensation1D [res]; - float signal = 1.e-30f; - float error = 1.e-30f; - const float * in_end = input + 36; - - // Summation of the absolute power and the quadratic error - do { - float err; - err = mpc_nearbyintf(input[0] * fac) * invfac - input[0]; - error += err * err; - signal += input[0] * input[0]; - - err = mpc_nearbyintf(input[1] * fac) * invfac - input[1]; - error += err * err; - signal += input[1] * input[1]; - - err = mpc_nearbyintf(input[2] * fac) * invfac - input[2]; - error += err * err; - signal += input[2] * input[2]; - - err = mpc_nearbyintf(input[3] * fac) * invfac - input[3]; - error += err * err; - signal += input[3] * input[3]; - - input += 4; - - } while (input < in_end); - - error *= NoiseInjectionCompensation1D [res] * NoiseInjectionCompensation1D [res]; - signal *= NoiseInjectionCompensation1D [res] * NoiseInjectionCompensation1D [res]; - - // Utilization of SNRcomp only if SNR > 1 !!! - return signal > error ? error / (SNRcomp * signal) : error / signal; -} - - -float -ISNR_Schaetzer_Trans ( const float* input, const float SNRcomp, const int res ) -{ - int k; - float fac = A [res]; - float invfac = C [res]; - float signal, error, ret, err, sig; - - // Summation of the absolute power and the quadratic error - k = 0; - signal = error = 1.e-30f; - for ( ; k < 12; k++ ) { - sig = input[k] * NoiseInjectionCompensation1D [res]; - err = mpc_nearbyintf(sig * fac) * invfac - sig; - - error += err * err; - signal += sig * sig; - } - err = signal > error ? error / (SNRcomp * signal) : error / signal; - ret = err; - signal = error = 1.e-30f; - for ( ; k < 24; k++ ) { - sig = input[k] * NoiseInjectionCompensation1D [res]; - err = mpc_nearbyintf(sig * fac) * invfac - sig; - - error += err * err; - signal += sig * sig; - } - err = signal > error ? error / (SNRcomp * signal) : error / signal; - ret = maxf(ret, err); - - signal = error = 1.e-30f; - for ( ; k < 36; k++ ) { - sig = input[k] * NoiseInjectionCompensation1D [res]; - err = mpc_nearbyintf(sig * fac) * invfac - sig; - - error += err * err; - signal += sig * sig; - } - err = signal > error ? error / (SNRcomp * signal) : error / signal; - ret = maxf(ret, err); - - return ret; -} - - -// Linear quantizer for a subband -void -QuantizeSubband ( mpc_int16_t* qu_output, const float* input, const int res, float* errors, const int maxNsOrder ) -{ - int n, quant; - int offset = D [res]; - float mult = A [res] * NoiseInjectionCompensation1D [res]; - float invmult = C [res]; - float signal; - - for ( n = 0; n < 36 - maxNsOrder; n++) { - quant = (unsigned int)(mpc_lrintf(input[n] * mult) + offset); - - // limitation to 0...2D - if ((unsigned int)quant > (unsigned int)offset * 2 ) { - quant = mini ( quant, offset * 2 ); - quant = maxi ( quant, 0 ); - } - qu_output[n] = quant; - } - - for ( ; n < 36; n++) { - signal = input[n] * mult; - quant = (unsigned int)(mpc_lrintf(signal) + offset); - - // calculate the current error and save it for error refeeding - errors [n + 6] = invmult * (quant - offset) - signal * NoiseInjectionCompensation1D [res]; - - // limitation to 0...2D - if ((unsigned int)quant > (unsigned int)offset * 2 ) { - quant = mini ( quant, offset * 2 ); - quant = maxi ( quant, 0 ); - } - qu_output[n] = quant; - } -} - - -// NoiseShaper for a subband -void -QuantizeSubbandWithNoiseShaping ( mpc_int16_t* qu_output, const float* input, const int res, float* errors, const float* FIR ) -{ - float signal; - float mult = A [res]; - float invmult = C [res]; - int offset = D [res]; - int n, quant; - - memset(errors, 0, 6 * sizeof *errors); // arghh, it produces pops on each frame boundary! - - for ( n = 0; n < 36; n++) { - signal = input[n] * NoiseInjectionCompensation1D [res] - (FIR[5]*errors[n+0] + FIR[4]*errors[n+1] + FIR[3]*errors[n+2] + FIR[2]*errors[n+3] + FIR[1]*errors[n+4] + FIR[0]*errors[n+5]); - quant = mpc_lrintf(signal * mult); - - // calculate the current error and save it for error refeeding - errors [n + 6] = invmult * quant - signal * NoiseInjectionCompensation1D [res]; - - // limitation to +/-D - quant = minf ( quant, +offset ); - quant = maxf ( quant, -offset ); - - qu_output[n] = (unsigned int)(quant + offset); - } -} - -/* end of quant.c */ - -// pfk@schnecke.offl.uni-jena.de@EMAIL, Andree.Buschmann@web.de@EMAIL, BuschmannA@becker.de@EMAIL, miyaguch@eskimo.com@EMAIL, r3mix@irc.openprojects.net@EMAIL, dibrom@users.sourceforge.net@EMAIL, m.p.bakker-10@student.utwente.nl@EMAIL, djmrob@essex.ac.uk@EMAIL, dim@psytel-research.co.yu@EMAIL, lerch@zplane.de@EMAIL, takehiro@users.sourceforge.net@EMAIL, aleidinger@users.sourceforge.net@EMAIL, Robert.Hegemann@gmx.de@EMAIL, bouvigne@mp3-tech.org@EMAIL, monty@xiph.org@EMAIL, Pumpkinz99@aol.com@EMAIL, spase@outerspase.net@EMAIL, mt@wildpuppy.com@EMAIL, juha.laaksonheimo@tut.fi@EMAIL, speek@myrealbox.com@EMAIL, w.speek@12move.nl@EMAIL, martin@spueler.de@EMAIL, nicolaus.berglmeir@t-online.de@EMAIL, thomas.a.juerges@ruhr-uni-bochum.de@EMAIL, HelH@mpex.net@EMAIL, garf@roadum.demon.co.uk@EMAIL, gcp@sjeng.org@EMAIL, mike@naivesoftware.com@EMAIL, case@mobiili.net@EMAIL, steve.lhomme@free.fr@EMAIL, walter@binity.com@EMAIL diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/_kiss_fft_guts.h b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/_kiss_fft_guts.h deleted file mode 100644 index aefe490e..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/_kiss_fft_guts.h +++ /dev/null @@ -1,183 +0,0 @@ -/*Copyright (c) 2003-2004, Mark Borgerding - - 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_GUTS_H -#define KISS_FFT_GUTS_H - -#define MIN(a,b) ((a)<(b) ? (a):(b)) -#define MAX(a,b) ((a)>(b) ? (a):(b)) - -/* kiss_fft.h - defines kiss_fft_scalar as either short or a float type - and defines - typedef struct { kiss_fft_scalar r; kiss_fft_scalar i; }kiss_fft_cpx; */ -#include "kiss_fft.h" - -/* - Explanation of macros dealing with complex math: - - C_MUL(m,a,b) : m = a*b - C_FIXDIV( c , div ) : if a fixed point impl., c /= div. noop otherwise - C_SUB( res, a,b) : res = a - b - C_SUBFROM( res , a) : res -= a - C_ADDTO( res , a) : res += a - * */ -#ifdef FIXED_POINT -#include "arch.h" - - -#define SAMP_MAX 2147483647 -#define TWID_MAX 32767 -#define TRIG_UPSCALE 1 - -#define SAMP_MIN -SAMP_MAX - - -# 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) - -# 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) - -# define C_MULBYSCALAR( c, s ) \ - do{ (c).r = S_MUL( (c).r , s ) ;\ - (c).i = S_MUL( (c).i , s ) ; }while(0) - -# define DIVSCALAR(x,k) \ - (x) = S_MUL( x, (TWID_MAX-((k)>>1))/(k)+1 ) - -# define C_FIXDIV(c,div) \ - do { DIVSCALAR( (c).r , div); \ - 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); \ - }while(0) -#define C_SUB( res, a,b)\ - do {(res).r=SUB32((a).r,(b).r); (res).i=SUB32((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);\ - }while(0) - -#define C_SUBFROM( res , a)\ - do {(res).r = ADD32((res).r,(a).r); (res).i = SUB32((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 - -#else /* not FIXED_POINT*/ - -# define S_MUL(a,b) ( (a)*(b) ) -#define C_MUL(m,a,b) \ - do{ (m).r = (a).r*(b).r - (a).i*(b).i;\ - (m).i = (a).r*(b).i + (a).i*(b).r; }while(0) -#define C_MULC(m,a,b) \ - do{ (m).r = (a).r*(b).r + (a).i*(b).i;\ - (m).i = (a).i*(b).r - (a).r*(b).i; }while(0) - -#define C_MUL4(m,a,b) C_MUL(m,a,b) - -# define C_FIXDIV(c,div) /* NOOP */ -# define C_MULBYSCALAR( c, s ) \ - do{ (c).r *= (s);\ - (c).i *= (s); }while(0) -#endif - -#ifndef CHECK_OVERFLOW_OP -# define CHECK_OVERFLOW_OP(a,op,b) /* noop */ -#endif - -#ifndef C_ADD -#define C_ADD( res, a,b)\ - do { \ - CHECK_OVERFLOW_OP((a).r,+,(b).r)\ - CHECK_OVERFLOW_OP((a).i,+,(b).i)\ - (res).r=(a).r+(b).r; (res).i=(a).i+(b).i; \ - }while(0) -#define C_SUB( res, a,b)\ - do { \ - CHECK_OVERFLOW_OP((a).r,-,(b).r)\ - CHECK_OVERFLOW_OP((a).i,-,(b).i)\ - (res).r=(a).r-(b).r; (res).i=(a).i-(b).i; \ - }while(0) -#define C_ADDTO( res , a)\ - do { \ - CHECK_OVERFLOW_OP((res).r,+,(a).r)\ - CHECK_OVERFLOW_OP((res).i,+,(a).i)\ - (res).r += (a).r; (res).i += (a).i;\ - }while(0) - -#define C_SUBFROM( res , a)\ - do {\ - CHECK_OVERFLOW_OP((res).r,-,(a).r)\ - CHECK_OVERFLOW_OP((res).i,-,(a).i)\ - (res).r -= (a).r; (res).i -= (a).i; \ - }while(0) -#endif /* C_ADD defined */ - -#ifdef FIXED_POINT -/*# define KISS_FFT_COS(phase) TRIG_UPSCALE*floor(MIN(32767,MAX(-32767,.5+32768 * cos (phase)))) -# define KISS_FFT_SIN(phase) TRIG_UPSCALE*floor(MIN(32767,MAX(-32767,.5+32768 * sin (phase))))*/ -# define KISS_FFT_COS(phase) floor(.5+TWID_MAX*cos (phase)) -# define KISS_FFT_SIN(phase) floor(.5+TWID_MAX*sin (phase)) -# define HALF_OF(x) ((x)>>1) -#elif defined(USE_SIMD) -# define KISS_FFT_COS(phase) _mm_set1_ps( cos(phase) ) -# define KISS_FFT_SIN(phase) _mm_set1_ps( sin(phase) ) -# define HALF_OF(x) ((x)*_mm_set1_ps(.5f)) -#else -# define KISS_FFT_COS(phase) (kiss_fft_scalar) cos(phase) -# define KISS_FFT_SIN(phase) (kiss_fft_scalar) sin(phase) -# define HALF_OF(x) ((x)*.5f) -#endif - -#define kf_cexp(x,phase) \ - do{ \ - (x)->r = KISS_FFT_COS(phase);\ - (x)->i = KISS_FFT_SIN(phase);\ - }while(0) - -#define kf_cexp2(x,phase) \ - do{ \ - (x)->r = TRIG_UPSCALE*celt_cos_norm((phase));\ - (x)->i = TRIG_UPSCALE*celt_cos_norm((phase)-32768);\ -}while(0) - -#endif /* KISS_FFT_GUTS_H */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arch.h b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arch.h deleted file mode 100644 index 3bbcd366..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arch.h +++ /dev/null @@ -1,214 +0,0 @@ -/* Copyright (c) 2003-2008 Jean-Marc Valin - Copyright (c) 2007-2008 CSIRO - Copyright (c) 2007-2009 Xiph.Org Foundation - Written by Jean-Marc Valin */ -/** - @file arch.h - @brief Various architecture definitions 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. -*/ - -#ifndef ARCH_H -#define ARCH_H - -#include "opus_types.h" -#include "opus_defines.h" - -# if !defined(__GNUC_PREREQ) -# if defined(__GNUC__)&&defined(__GNUC_MINOR__) -# define __GNUC_PREREQ(_maj,_min) \ - ((__GNUC__<<16)+__GNUC_MINOR__>=((_maj)<<16)+(_min)) -# else -# define __GNUC_PREREQ(_maj,_min) 0 -# endif -# endif - -#define CELT_SIG_SCALE 32768.f - -#define celt_fatal(str) _celt_fatal(str, __FILE__, __LINE__); -#ifdef ENABLE_ASSERTIONS -#include -#include -#ifdef __GNUC__ -__attribute__((noreturn)) -#endif -static OPUS_INLINE 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);}} -#else -#define celt_assert(cond) -#define celt_assert2(cond, message) -#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. */ -#define IMAX(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum int value. */ -#define UADD32(a,b) ((a)+(b)) -#define USUB32(a,b) ((a)-(b)) - -#define PRINT_MIPS(file) - -#ifdef FIXED_POINT - -typedef opus_int16 opus_val16; -typedef opus_int32 opus_val32; - -typedef opus_val32 celt_sig; -typedef opus_val16 celt_norm; -typedef opus_val32 celt_ener; - -#define Q15ONE 32767 - -#define SIG_SHIFT 12 - -#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) - -#ifdef FIXED_DEBUG -#include "fixed_debug.h" -#else - -#include "fixed_generic.h" - -#ifdef 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) -#include "fixed_c5x.h" -#elif defined (TI_C6X_ASM) -#include "fixed_c6x.h" -#endif - -#endif - -#else /* FIXED_POINT */ - -typedef float opus_val16; -typedef float opus_val32; - -typedef float celt_sig; -typedef float celt_norm; -typedef float celt_ener; - -#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) - -#define QCONST16(x,bits) (x) -#define QCONST32(x,bits) (x) - -#define NEG16(x) (-(x)) -#define NEG32(x) (-(x)) -#define EXTRACT16(x) (x) -#define EXTEND32(x) (x) -#define SHR16(a,shift) (a) -#define SHL16(a,shift) (a) -#define SHR32(a,shift) (a) -#define SHL32(a,shift) (a) -#define PSHR32(a,shift) (a) -#define VSHR32(a,shift) (a) - -#define PSHR(a,shift) (a) -#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 HALF16(x) (.5f*(x)) -#define HALF32(x) (.5f*(x)) - -#define ADD16(a,b) ((a)+(b)) -#define SUB16(a,b) ((a)-(b)) -#define ADD32(a,b) ((a)+(b)) -#define SUB32(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)) - -#define MULT16_32_Q15(a,b) ((a)*(b)) -#define MULT16_32_Q16(a,b) ((a)*(b)) - -#define MULT32_32_Q31(a,b) ((a)*(b)) - -#define MAC16_32_Q15(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)) -#define MULT16_16_P15(a,b) ((a)*(b)) -#define MULT16_16_P13(a,b) ((a)*(b)) -#define MULT16_16_P14(a,b) ((a)*(b)) -#define MULT16_32_P16(a,b) ((a)*(b)) - -#define DIV32_16(a,b) (((opus_val32)(a))/(opus_val16)(b)) -#define DIV32(a,b) (((opus_val32)(a))/(opus_val32)(b)) - -#define SCALEIN(a) ((a)*CELT_SIG_SCALE) -#define SCALEOUT(a) ((a)*(1/CELT_SIG_SCALE)) - -#endif /* !FIXED_POINT */ - -#ifndef GLOBAL_STACK_SIZE -#ifdef FIXED_POINT -#define GLOBAL_STACK_SIZE 100000 -#else -#define GLOBAL_STACK_SIZE 100000 -#endif -#endif - -#endif /* ARCH_H */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/arm2gnu.pl b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/arm2gnu.pl deleted file mode 100644 index eab42efa..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/arm2gnu.pl +++ /dev/null @@ -1,316 +0,0 @@ -#!/usr/bin/perl - -my $bigend; # little/big endian -my $nxstack; - -$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; - } - 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 = (); - -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/.global/; - 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/; - } - } - - 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); - push(@proc_stack, $proc); - s/^[A-Za-z_\.]\w+/$&:/; - } - $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); - } - 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) { - printf (" .section\t.note.GNU-stack,\"\",\%\%progbits\n"); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/arm_celt_map.c b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/arm_celt_map.c deleted file mode 100644 index 547a84d1..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/arm_celt_map.c +++ /dev/null @@ -1,49 +0,0 @@ -/* 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" - -#if defined(OPUS_HAVE_RTCD) - -# if defined(FIXED_POINT) -opus_val32 (*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *, - const opus_val16 *, opus_val32 *, 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 */ -}; -# else -# error "Floating-point implementation is not supported by ARM asm yet." \ - "Reconfigure with --disable-rtcd or send patches." -# endif - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/armcpu.c b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/armcpu.c deleted file mode 100644 index 17685258..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/armcpu.c +++ /dev/null @@ -1,174 +0,0 @@ -/* 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" - -#define OPUS_CPU_ARM_V4 (1) -#define OPUS_CPU_ARM_EDSP (1<<1) -#define OPUS_CPU_ARM_MEDIA (1<<2) -#define OPUS_CPU_ARM_NEON (1<<3) - -#if defined(_MSC_VER) -/*For GetExceptionCode() and EXCEPTION_ILLEGAL_INSTRUCTION.*/ -# define WIN32_LEAN_AND_MEAN -# define WIN32_EXTRA_LEAN -# include - -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) - __try{ - /*PLD [r13]*/ - __emit(0xF5DDF000); - flags|=OPUS_CPU_ARM_EDSP; - } - __except(GetExceptionCode()==EXCEPTION_ILLEGAL_INSTRUCTION){ - /*Ignore exception.*/ - } -# if defined(OPUS_ARM_MAY_HAVE_MEDIA) - __try{ - /*SHADD8 r3,r3,r3*/ - __emit(0xE6333F93); - flags|=OPUS_CPU_ARM_MEDIA; - } - __except(GetExceptionCode()==EXCEPTION_ILLEGAL_INSTRUCTION){ - /*Ignore exception.*/ - } -# if defined(OPUS_ARM_MAY_HAVE_NEON) - __try{ - /*VORR q0,q0,q0*/ - __emit(0xF2200150); - flags|=OPUS_CPU_ARM_NEON; - } - __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_NEON) - /* Search for edsp and neon flag */ - if(memcmp(buf, "Features", 8) == 0) - { - char *p; -# if defined(OPUS_ARM_MAY_HAVE_EDSP) - p = strstr(buf, " edsp"); - if(p != NULL && (p[5] == ' ' || p[5] == '\n')) - flags |= OPUS_CPU_ARM_EDSP; -# endif - -# if defined(OPUS_ARM_MAY_HAVE_NEON) - p = strstr(buf, " neon"); - if(p != NULL && (p[5] == ' ' || p[5] == '\n')) - flags |= OPUS_CPU_ARM_NEON; -# endif - } -# endif - -# if defined(OPUS_ARM_MAY_HAVE_MEDIA) - /* 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; - } -# 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)) - return arch; - arch++; - - if(!(flags & OPUS_CPU_ARM_MEDIA)) - return arch; - arch++; - - if(!(flags & OPUS_CPU_ARM_NEON)) - return arch; - arch++; - - return arch; -} - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/armcpu.h b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/armcpu.h deleted file mode 100644 index ac574460..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/armcpu.h +++ /dev/null @@ -1,71 +0,0 @@ -/* 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); -# endif - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/armopts.s.in b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/armopts.s.in deleted file mode 100644 index 3d8aaf27..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/armopts.s.in +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (C) 2013 Mozilla Corporation */ -/* - 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. -*/ - -; 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@ - -; Set the following to 1 if we have ARMv6 media instructions. -OPUS_ARM_MAY_HAVE_MEDIA * @OPUS_ARM_MAY_HAVE_MEDIA@ - -; Set the following to 1 if we have NEON (some ARMv7) -OPUS_ARM_MAY_HAVE_NEON * @OPUS_ARM_MAY_HAVE_NEON@ - -END diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/celt_pitch_xcorr_arm.s b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/celt_pitch_xcorr_arm.s deleted file mode 100644 index 09917b16..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/celt_pitch_xcorr_arm.s +++ /dev/null @@ -1,545 +0,0 @@ -; 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 - ; 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) -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()) - 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 - 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 - ; 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) - LDRGTH 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) - LDRGTH 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) - LDRGTH 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 - 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 - LDRGEH r6, [r4], #2 - ; Stall - SMLABBGE r14, r6, r8, r14 ; sum = MAC16_16(sum, *x, *y) - SUBGES r12, r12, #1 - LDRGTH 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 ; 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) - LDRGTH 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 - LDRGEH r6, [r4], #2 - LDRGEH 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/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/fixed_armv4.h b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/fixed_armv4.h deleted file mode 100644 index b690bc8c..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/fixed_armv4.h +++ /dev/null @@ -1,76 +0,0 @@ -/* 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"(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"(a<<16) - ); - /*We intentionally don't OR in the high bit of rd_lo for speed.*/ - return 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)) - - -/** 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/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/fixed_armv5e.h b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/fixed_armv5e.h deleted file mode 100644 index 1194a7d3..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/fixed_armv5e.h +++ /dev/null @@ -1,116 +0,0 @@ -/* 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 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"(b<<1), "r"(a), "r"(c) - ); - return res; -} -#define MAC16_32_Q15(c, a, b) (MAC16_32_Q15_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)) - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/kiss_fft_armv4.h b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/kiss_fft_armv4.h deleted file mode 100644 index e4faad6f..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/kiss_fft_armv4.h +++ /dev/null @@ -1,121 +0,0 @@ -/*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/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/kiss_fft_armv5e.h b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/kiss_fft_armv5e.h deleted file mode 100644 index 9eca183d..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/kiss_fft_armv5e.h +++ /dev/null @@ -1,118 +0,0 @@ -/*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/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/pitch_arm.h b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/pitch_arm.h deleted file mode 100644 index a07f8ac2..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/arm/pitch_arm.h +++ /dev/null @@ -1,57 +0,0 @@ -/* 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(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); -# 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); -# endif - -# if !defined(OPUS_HAVE_RTCD) -# define OVERRIDE_PITCH_XCORR (1) -# define celt_pitch_xcorr(_x, _y, xcorr, len, max_pitch, arch) \ - ((void)(arch),PRESUME_NEON(celt_pitch_xcorr)(_x, _y, xcorr, len, max_pitch)) -# endif - -# endif - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/bands.c b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/bands.c deleted file mode 100644 index cce56e2f..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/bands.c +++ /dev/null @@ -1,1518 +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" -#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 */ -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+M*eBands[start]; - for (i=0;inbEBands], SHL16((opus_val16)eMeans[i],6)); -#ifndef FIXED_POINT - g = celt_exp2(lg); -#else - /* Handle the integer part of the log energy */ - shift = 16-(lg>>DB_SHIFT); - if (shift>31) - { - shift=0; - g=0; - } else { - /* Handle the fractional part. */ - g = celt_exp2_frac(lg&((1<eBands[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); /* end has to be non-zero */ - 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; -} - -/* 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; - 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; -}; - -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); - } - tell = ec_tell_frac(ec); - if (qn!=1) - { - if (encode) - itheta = (itheta*qn+8192)>>14; - - /* 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); - } - } - itheta = (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; - if (inv) - { - int j; - for (j=0;j2<remaining_bits > 2<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) -{ -#ifdef RESYNTH - int resynth = 1; -#else - int resynth = !ctx->encode; -#endif - 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<encode; -#endif - 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 -#ifdef RESYNTH - , gain -#endif - ); - } else { - 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<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); - } - } - } - } - - 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; -#ifdef RESYNTH - int resynth = 1; -#else - int resynth = !ctx->encode; -#endif - int k; - int encode; - int tf_change; - - encode = ctx->encode; - tf_change = ctx->tf_change; - - longBlocks = B0==1; - - 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)) - { - 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) - { - 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<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; -#endif - int mbits, sbits, delta; - int itheta; - int qalloc; - struct split_ctx sctx; - int orig_fill; - int encode; - ec_ctx *ec; - - encode = ctx->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 (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<eBands; - celt_norm * OPUS_RESTRICT norm, * OPUS_RESTRICT norm2; - VARDECL(celt_norm, _norm); - celt_norm *lowband_scratch; - int B; - int M; - int lowband_offset; - int update_lowband = 1; - int C = Y_ != NULL ? 2 : 1; - int norm_offset; -#ifdef RESYNTH - int resynth = 1; -#else - int resynth = !encode; -#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; - /* We can use the last band as scratch space because we don't need that - scratch space for the last band. */ - lowband_scratch = X_+M*eBands[m->nbEBands-1]; - - lowband_offset = 0; - ctx.bandE = bandE; - ctx.ec = ec; - ctx.encode = encode; - ctx.intensity = intensity; - ctx.m = m; - ctx.seed = *seed; - ctx.spread = spread; - for (i=start;i= M*eBands[start] && (update_lowband || lowband_offset==0)) - lowband_offset = i; - - 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 (i==end-1) - 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; - while(M*eBands[++fold_end] < effective_lowband+norm_offset+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 - - -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; -} - -#ifndef OVERRIDE_COMB_FILTER_CONST -static void comb_filter_const(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 = x[-T-2]; - x3 = x[-T-1]; - x2 = x[-T]; - x1 = x[-T+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 -#ifdef FIXED_POINT - "-fixed" -#endif -#ifdef FUZZING - "-fuzzing" -#endif - ; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/celt.h b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/celt.h deleted file mode 100644 index ffa2d7a5..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/celt.h +++ /dev/null @@ -1,214 +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 - -typedef struct { - int valid; - float tonality; - float tonality_slope; - float noisiness; - float activity; - float music_prob; - int bandwidth; -}AnalysisInfo; - -#define __celt_check_mode_ptr_ptr(ptr) ((ptr) + ((ptr) - (const CELTMode**)(ptr))) - -#define __celt_check_analysis_ptr(ptr) ((ptr) + ((ptr) - (const AnalysisInfo*)(ptr))) - -/* Encoder/decoder Requests */ - -/* Expose this option again when variable framesize actually works */ -#define OPUS_FRAMESIZE_VARIABLE 5010 /**< Optimize the frame size dynamically */ - - -#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) - -/* 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); - -#define celt_encoder_ctl opus_custom_encoder_ctl -#define celt_decoder_ctl opus_custom_decoder_ctl - -// libnyquist changed -#define OPUS_CUSTOM_NOSTATIC - -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]; - -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); - -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, celt_sig * OPUS_RESTRICT scratch); - -void compute_inv_mdcts(const CELTMode *mode, int shortBlocks, celt_sig *X, - celt_sig * OPUS_RESTRICT out_mem[], int C, int LM); -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* CELT_H */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/celt_decoder.c b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/celt_decoder.c deleted file mode 100644 index 7fc79612..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/celt_decoder.c +++ /dev/null @@ -1,1197 +0,0 @@ -/* 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" - -/**********************************************************************/ -/* */ -/* 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 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 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 */ -}; - -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; -} - -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); -} - -#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 */ - - -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->arch = opus_select_arch(); - - st->loss_count = 0; - - opus_custom_decoder_ctl(st, OPUS_RESET_STATE); - - return OPUS_OK; -} - - -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; -} - -#ifdef CUSTOM_MODES -void opus_custom_decoder_destroy(CELTDecoder *st) -{ - opus_free(st); -} -#endif /* CUSTOM_MODES */ - -static OPUS_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 -} - -#ifndef RESYNTH -static -#endif -void deemphasis(celt_sig *in[], opus_val16 *pcm, int N, int C, int downsample, const opus_val16 *coef, celt_sig *mem, celt_sig * OPUS_RESTRICT scratch) -{ - int c; - int Nd; - int apply_downsampling=0; - opus_val16 coef0; - - coef0 = coef[0]; - Nd = N/downsample; - c=0; do { - int j; - celt_sig * OPUS_RESTRICT x; - opus_val16 * OPUS_RESTRICT y; - celt_sig m = mem[c]; - x =in[c]; - y = pcm+c; -#ifdef CUSTOM_MODES - if (coef[1] != 0) - { - opus_val16 coef1 = coef[1]; - opus_val16 coef3 = coef[3]; - for (j=0;j1) - { - /* Shortcut for the standard (non-custom modes) case */ - for (j=0;jshortMdctSize; - shift = mode->maxLM; - } else { - B = 1; - N = mode->shortMdctSize<maxLM-LM; - } - c=0; do { - /* IMDCT on the interleaved the sub-frames, overlap-add is performed by the IMDCT */ - for (b=0;bmdct, &X[b+c*N*B], out_mem[c]+N*b, mode->window, overlap, shift, B); - } 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;ichannels; - 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 downsample; - int loss_count; - int noise_based; - const opus_int16 *eBands; - VARDECL(celt_sig, scratch); - 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; - downsample = st->downsample; - noise_based = loss_count >= 5 || start != 0; - ALLOC(scratch, noise_based?N*C:N, celt_sig); - if (noise_based) - { - /* Noise-based PLC/CNG */ - celt_sig *freq; - VARDECL(celt_norm, X); - opus_uint32 seed; - opus_val16 *plcLogE; - int end; - int effEnd; - - end = st->end; - effEnd = IMAX(start, IMIN(end, mode->effEBands)); - - /* Share the interleaved signal MDCT coefficient buffer with the - deemphasis scratch buffer. */ - freq = scratch; - ALLOC(X, C*N, celt_norm); /**< Interleaved normalised MDCTs */ - - if (loss_count >= 5) - plcLogE = backgroundLogE; - else { - /* Energy decay */ - opus_val16 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->rng = seed; - - denormalise_bands(mode, X, freq, plcLogE, start, effEnd, C, 1<>1)); - } while (++c>1, opus_val16 ); - pitch_downsample(decode_mem, lp_pitch_buf, - DECODE_BUFFER_SIZE, C, st->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, st->arch); - pitch_index = PLC_PITCH_LAG_MAX-pitch_index; - st->last_pitch_index = pitch_index; - } else { - pitch_index = st->last_pitch_index; - fade = QCONST16(.8f,15); - } - - ALLOC(etmp, overlap, opus_val32); - ALLOC(exc, MAX_PERIOD, opus_val16); - 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 exc_length; - 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); - } - /* 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); - /* Initialize the LPC history with the samples just before the start - of the region for which we're computing the excitation. */ - { - opus_val16 lpc_mem[LPC_ORDER]; - for (i=0;i>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), 8); - } - - { - 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;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); - - /* Simulate TDAC on the concealed audio so that it blends with the - MDCT of the next frame. */ - for (i=0;ipreemph, st->preemph_memD, scratch); - - st->loss_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 c, i, N; - int spread_decision; - opus_int32 bits; - ec_dec _dec; - VARDECL(celt_sig, freq); - VARDECL(celt_norm, X); - 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 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; - - mode = st->mode; - nbEBands = mode->nbEBands; - overlap = mode->overlap; - eBands = mode->eBands; - frame_size *= st->downsample; - - c=0; do { - decode_mem[c] = st->_decode_mem + c*(DECODE_BUFFER_SIZE+overlap); - } while (++c_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 = 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; - - effEnd = st->end; - if (effEnd > mode->effEBands) - effEnd = mode->effEBands; - - if (data == NULL || len<=1) - { - celt_decode_lost(st, pcm, N, LM); - RESTORE_STACK; - return frame_size/st->downsample; - } - - 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 (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(mode, st->start, st->end, oldBandE, - intra_ener, dec, C, LM); - - ALLOC(tf_res, 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(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=st->start;iend;i++) - { - int width, quanta; - int dynalloc_loop_logp; - int boost; - width = C*(eBands[i+1]-eBands[i])<0) - dynalloc_logp = IMAX(2, dynalloc_logp-1); - } - - ALLOC(fine_quant, nbEBands, int); - alloc_trim = tell+(6<=2&&bits>=((LM+2)<start, st->end, offsets, cap, - alloc_trim, &intensity, &dual_stereo, bits, &balance, pulses, - fine_quant, fine_priority, C, LM, dec, 0, 0, 0); - - unquant_fine_energy(mode, st->start, st->end, oldBandE, fine_quant, dec, C); - - /* Decode fixed codebook */ - ALLOC(collapse_masks, C*nbEBands, unsigned char); - ALLOC(X, C*N, celt_norm); /**< Interleaved normalised MDCTs */ - - quant_all_bands(0, 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(mode, st->start, st->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, - st->start, st->end, oldBandE, oldLogE, oldLogE2, pulses, st->rng); - - ALLOC(freq, IMAX(CC,C)*N, celt_sig); /**< Interleaved signal MDCTs */ - - if (silence) - { - for (i=0;istart, effEnd, C, M); - } - c=0; do { - OPUS_MOVE(decode_mem[c], decode_mem[c]+N, DECODE_BUFFER_SIZE-N+overlap/2); - } while (++cdownsample!=1) - bound = IMIN(bound, N/st->downsample); - for (i=bound;ipostfilter_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); - 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); - - } 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;istart;i++) - { - oldBandE[c*nbEBands+i]=0; - oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-QCONST16(28.f,DB_SHIFT); - } - for (i=st->end;irng = dec->rng; - - /* We reuse freq[] as scratch space for the de-emphasis */ - deemphasis(out_syn, pcm, N, CC, st->downsample, mode->preemph, st->preemph_memD, freq); - 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; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/celt_encoder.c b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/celt_encoder.c deleted file mode 100644 index f4525c1b..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/celt_encoder.c +++ /dev/null @@ -1,2353 +0,0 @@ -/* 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 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; - int variable_duration; - int lfe; - 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; - - 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_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]; */ - return size; -} - -int celt_encoder_get_size(int channels) -{ - CELTMode *mode = opus_custom_mode_create(48000, 960, NULL); - return opus_custom_encoder_get_size(mode, channels); -} - -#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->overlap = mode->overlap; - 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 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; - /* 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); - - len2=len/2; - for (c=0;c=0;i--) - { -#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; - for (i=12;imask_metric) - { - *tf_chan = c; - mask_metric = unmask; - } - } - is_transient = mask_metric>200; - - /* 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(MAX16(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 */ -int patch_transient_decision(opus_val16 *newE, opus_val16 *oldE, int nbEBands, - 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[0] = oldE[0]; - for (i=1;i=0;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=2;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) -{ - const int overlap = OVERLAP(mode); - 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); - } - } 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; - for (j=0;jeBands[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;ieBands[i]<eBands[i+1]<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; - /* mid-side savings estimations based on the LF average*/ - logXC = celt_log2(QCONST32(1.001f, 20)-MULT16_16(sum, sum)); - /* mid-side savings estimations based on min correlation */ - logXC2 = MAX16(HALF16(logXC), celt_log2(QCONST32(1.001f, 20)-MULT16_16(minXC, minXC))); -#ifdef FIXED_POINT - /* Compensate for Q20 vs Q14 input and convert output to Q8 */ - logXC = PSHR32(logXC-QCONST16(6.f, DB_SHIFT),DB_SHIFT-8); - logXC2 = PSHR32(logXC2-QCONST16(6.f, DB_SHIFT),DB_SHIFT-8); -#endif - - trim += MAX16(-QCONST16(4.f, 8), MULT16_16_Q15(QCONST16(.75f,15),logXC)); - *stereo_saving = MIN16(*stereo_saving + QCONST16(0.25f, 8), -HALF16(logXC2)); - } - - /* Estimate spectral tilt */ - c=0; do { - for (i=0;inbEBands]*(opus_int32)(2+2*i-end); - } - } 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++; - trim -= MAX16(-QCONST16(2.f, 8), MIN16(QCONST16(2.f, 8), SHR16(diff+QCONST16(1.f, DB_SHIFT),DB_SHIFT-8)/6 )); - trim -= SHR16(surround_trim, DB_SHIFT-8); - trim -= 2*SHR16(tf_estimate, 14-8); -#ifndef DISABLE_FLOAT_API - if (analysis->valid) - { - trim -= MAX16(-QCONST16(2.f, 8), MIN16(QCONST16(2.f, 8), - (opus_val16)(QCONST16(2.f, 8)*(analysis->tonality_slope+.05f)))); - } -#endif - -#ifdef FIXED_POINT - trim_index = PSHR32(trim, 8); -#else - trim_index = (int)floor(.5f+trim); -#endif - if (trim_index<0) - trim_index = 0; - if (trim_index>10) - trim_index = 10; - /*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); -} - -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) -{ - 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); - for (i=0;i 50 && LM>=1 && !lfe) - { - int last=0; - c=0;do - { - follower[c*nbEBands] = bandLogE2[c*nbEBands]; - for (i=1;i bandLogE2[c*nbEBands+i-1]+QCONST16(.5f,DB_SHIFT)) - last=i; - follower[c*nbEBands+i] = MIN16(follower[c*nbEBands+i-1]+QCONST16(1.5f,DB_SHIFT), bandLogE2[c*nbEBands+i]); - } - for (i=last-1;i>=0;i--) - follower[c*nbEBands+i] = MIN16(follower[c*nbEBands+i], MIN16(follower[c*nbEBands+i+1]+QCONST16(2.f,DB_SHIFT), bandLogE2[c*nbEBands+i])); - for (i=0;i=12) - follower[i] = HALF16(follower[i]); - follower[i] = MIN16(follower[i], QCONST16(4, DB_SHIFT)); - - width = C*(eBands[i+1]-eBands[i])< 48) { - boost = (int)SHR32(EXTEND32(follower[i])*8,DB_SHIFT); - boost_bits = (boost*width<>BITRES>>3 > effectiveBytes/4) - { - opus_int32 cap = ((effectiveBytes/4)<mode; - 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+st->overlap)+st->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); - 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; - } - - /* 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-st->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, mode->window, st->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 (++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.09f; - tonal_target = target + (opus_int32)((coded_bins<tonality, tonal);*/ - target = tonal_target; - } -#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);*/ - } - - if ((!has_surround_mask||lfe) && (constrained_vbr || bitrate<64000)) - { - opus_val16 rate_factor; -#ifdef FIXED_POINT - rate_factor = MAX16(0,(bitrate-32000)); -#else - rate_factor = MAX16(0,(1.f/32768)*(bitrate-32000)); -#endif - if (constrained_vbr) - rate_factor = MIN16(rate_factor, QCONST16(0.67f, 15)); - target = base_target + (opus_int32)MULT16_32_Q15(rate_factor, 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, 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 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; - 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 = 510000; - VARDECL(opus_val16, surround_dynalloc); - ALLOC_STACK; - - mode = st->mode; - nbEBands = mode->nbEBands; - overlap = mode->overlap; - eBands = mode->eBands; - 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*(st->overlap); - oldBandE = (opus_val16*)(st->in_mem+CC*(st->overlap+COMBFILTER_MAXPERIOD)); - oldLogE = oldBandE + CC*nbEBands; - oldLogE2 = oldLogE + CC*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 = (mode->effEBands-st->end)>>1; - 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; - } - if (st->bitrate != OPUS_BITRATE_MAX) - 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 = st->end; - if (effEnd > mode->effEBands) - effEnd = mode->effEBands; - - ALLOC(in, CC*(N+st->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 { - celt_preemphasis(pcm+c, in+c*(N+st->overlap)+st->overlap, N, CC, st->upsample, - mode->preemph, st->preemph_memE+c, st->clip); - } while (++clfe&&nbAvailableBytes>3) || nbAvailableBytes>12*C) && st->start==0 && !silence && !st->disable_pf - && st->complexity >= 5 && !(st->consec_transient && LM!=3 && st->variable_duration==OPUS_FRAMESIZE_VARIABLE); - - prefilter_tapset = st->tapset_decision; - pf_on = run_prefilter(st, in, prefilter_mem, CC, N, prefilter_tapset, &pitch_index, &gain1, &qg, enabled, nbAvailableBytes); - 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(st->start==0 && 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) - { - isTransient = transient_analysis(in, N+st->overlap, CC, - &tf_estimate, &tf_chan); - } - 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); - compute_band_energies(mode, freq, bandE, effEnd, C, M); - amp2Log2(mode, effEnd, st->end, bandE, bandLogE2, C); - for (i=0;iupsample); - if (CC==2&&C==1) - tf_chan = 0; - compute_band_energies(mode, freq, bandE, effEnd, C, M); - - if (st->lfe) - { - for (i=2;iend;i++) - { - bandE[i] = IMIN(bandE[i], MULT16_32_Q15(QCONST16(1e-4f,15),bandE[0])); - bandE[i] = MAX32(bandE[i], EPSILON); - } - } - amp2Log2(mode, effEnd, st->end, bandE, bandLogE, C); - - ALLOC(surround_dynalloc, C*nbEBands, opus_val16); - for(i=0;iend;i++) - surround_dynalloc[i] = 0; - /* This computes how much masking takes place between surround channels */ - if (st->start==0&&st->energy_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); - } - } - 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; - 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=st->start;iend;i++) - { - follow = MAX16(follow-QCONST16(1.f, DB_SHIFT), bandLogE[i]-offset); - if (C==2) - follow = MAX16(follow, bandLogE[i+nbEBands]-offset); - frame_avg += follow; - } - frame_avg /= (st->end-st->start); - temporal_vbr = SUB16(frame_avg,st->spec_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) - { - for (i=0;i0 && ec_tell(enc)+3<=total_bits && !isTransient && st->complexity>=5 && !st->lfe) - { - if (patch_transient_decision(bandLogE, oldBandE, nbEBands, st->end, C)) - { - isTransient = 1; - shortBlocks = M; - compute_mdcts(mode, shortBlocks, in, freq, C, CC, LM, st->upsample); - compute_band_energies(mode, freq, bandE, effEnd, C, M); - amp2Log2(mode, effEnd, st->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); - - ALLOC(tf_res, nbEBands, int); - /* Disable variable tf resolution for hybrid and at very low bitrate */ - if (effectiveBytes>=15*C && st->start==0 && st->complexity>=2 && !st->lfe) - { - int lambda; - if (effectiveBytes<40) - lambda = 12; - else if (effectiveBytes<60) - lambda = 6; - else if (effectiveBytes<100) - lambda = 4; - else - lambda = 3; - lambda*=2; - tf_select = tf_analysis(mode, effEnd, isTransient, tf_res, lambda, X, N, LM, &tf_sum, tf_estimate, tf_chan); - for (i=effEnd;iend;i++) - tf_res[i] = tf_res[effEnd-1]; - } else { - tf_sum = 0; - for (i=0;iend;i++) - tf_res[i] = isTransient; - tf_select=0; - } - - ALLOC(error, C*nbEBands, opus_val16); - quant_coarse_energy(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, st->lfe); - - tf_encode(st->start, st->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 (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 { - /* 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); - } - /*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); - } - - ALLOC(offsets, nbEBands, int); - - maxDepth = dynalloc_analysis(bandLogE, bandLogE2, nbEBands, st->start, st->end, C, offsets, - st->lsb_depth, mode->logN, isTransient, st->vbr, st->constrained_vbr, - eBands, LM, effectiveBytes, &tot_boost, st->lfe, surround_dynalloc); - /* 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=st->start;iend;i++) - { - int width, quanta; - int dynalloc_loop_logp; - int boost; - int j; - width = C*(eBands[i+1]-eBands[i])<intensity = hysteresis_decision((opus_val16)(equiv_rate/1000), - intensity_thresholds, intensity_histeresis, 21, st->intensity); - st->intensity = IMIN(st->end,IMAX(st->start, st->intensity)); - } - - alloc_trim = 5; - if (tell+(6<lfe) - alloc_trim = 5; - else - alloc_trim = alloc_trim_analysis(mode, X, bandLogE, - st->end, LM, C, N, &st->analysis, &st->stereo_saving, tf_estimate, st->intensity, surround_trim); - 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)); - base_target = vbr_rate - ((40*C+20)<constrained_vbr) - base_target += (st->vbr_offset>>lm_diff); - - 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->variable_duration, st->lfe, st->energy_mask!=NULL, surround_masking, - temporal_vbr); - - /* 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 */ - 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+nbFilledBytes); - /*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)<end-1; -#ifndef DISABLE_FLOAT_API - if (st->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 = compute_allocation(mode, st->start, st->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, st->start, st->end, oldBandE, error, fine_quant, enc, C); - - /* Residual quantisation */ - ALLOC(collapse_masks, C*nbEBands, unsigned char); - quant_all_bands(1, mode, st->start, st->end, X, C==2 ? X+N : NULL, collapse_masks, - bandE, pulses, shortBlocks, st->spread_decision, dual_stereo, st->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(mode, st->start, st->end, oldBandE, error, fine_quant, fine_priority, nbCompressedBytes*8-ec_tell(enc), enc, C); - - if (silence) - { - for (i=0;istart, st->end, oldBandE, oldLogE, oldLogE2, pulses, st->rng); - } - - if (silence) - { - for (i=0;istart, effEnd, C, M); - } - - 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 (++cprefilter_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, st->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, freq); - 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;istart;i++) - { - oldBandE[c*nbEBands+i]=0; - oldLogE[c*nbEBands+i]=oldLogE2[c*nbEBands+i]=-QCONST16(28.f,DB_SHIFT); - } - for (i=st->end;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_EXPERT_FRAME_DURATION_REQUEST: - { - opus_int32 value = va_arg(ap, opus_int32); - st->variable_duration = value; - } - 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_SET_ANALYSIS_REQUEST: - { - AnalysisInfo *info = va_arg(ap, AnalysisInfo *); - if (info) - OPUS_COPY(&st->analysis, 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/sources/LabSound/third_party/libnyquist/third_party/opus/celt/celt_lpc.c b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/celt_lpc.c deleted file mode 100644 index fa29d626..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/celt_lpc.c +++ /dev/null @@ -1,309 +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" -#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 - - 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] = ROUND16(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/sources/LabSound/third_party/libnyquist/third_party/opus/celt/celt_lpc.h b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/celt_lpc.h deleted file mode 100644 index dc2a0a3d..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/celt_lpc.h +++ /dev/null @@ -1,54 +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. -*/ - -#ifndef PLC_H -#define PLC_H - -#include "arch.h" - -#define LPC_ORDER 24 - -void _celt_lpc(opus_val16 *_lpc, const opus_val32 *ac, int p); - -void celt_fir(const opus_val16 *x, - const opus_val16 *num, - opus_val16 *y, - int N, - int ord, - opus_val16 *mem); - -void celt_iir(const opus_val32 *x, - const opus_val16 *den, - opus_val32 *y, - int N, - int ord, - opus_val16 *mem); - -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/sources/LabSound/third_party/libnyquist/third_party/opus/celt/cpu_support.h b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/cpu_support.h deleted file mode 100644 index d68dbe62..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/cpu_support.h +++ /dev/null @@ -1,54 +0,0 @@ -/* 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) -#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 - -#else -#define OPUS_ARCHMASK 0 - -static OPUS_INLINE int opus_select_arch(void) -{ - return 0; -} -#endif - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/cwrs.c b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/cwrs.c deleted file mode 100644 index ad980cc7..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/cwrs.c +++ /dev/null @@ -1,697 +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 ? 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 void cwrsi(int _n,int _k,opus_uint32 _i,int *_y){ - opus_uint32 p; - int s; - int k0; - 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_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; - *_y++=(k0-_k+s)^s; - } - /*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; - *_y++=(k0-_k+s)^s; - } - } - _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; - *_y++=(k0-_k+s)^s; - /*_n==1*/ - s=-(int)_i; - *_y=(_k+s)^s; -} - -void decode_pulses(int *_y,int _n,int _k,ec_dec *_dec){ - 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; - _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 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; -} - -void decode_pulses(int *_y,int _n,int _k,ec_dec *_dec){ - VARDECL(opus_uint32,u); - SAVE_STACK; - celt_assert(_k>0); - ALLOC(u,_k+2U,opus_uint32); - cwrsi(_n,_k,ec_dec_uint(_dec,ncwrs_urow(_n,_k,u)),_y,u); - RESTORE_STACK; -} - -#endif /* SMALL_FOOTPRINT */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/cwrs.h b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/cwrs.h deleted file mode 100644 index 7dfbd076..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/cwrs.h +++ /dev/null @@ -1,48 +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. -*/ - -#ifndef CWRS_H -#define CWRS_H - -#include "arch.h" -#include "stack_alloc.h" -#include "entenc.h" -#include "entdec.h" - -#ifdef CUSTOM_MODES -int log2_frac(opus_uint32 val, int frac); -#endif - -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); - -#endif /* CWRS_H */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/ecintrin.h b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/ecintrin.h deleted file mode 100644 index 2263cff6..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/ecintrin.h +++ /dev/null @@ -1,87 +0,0 @@ -/* Copyright (c) 2003-2008 Timothy B. Terriberry - Copyright (c) 2008 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. -*/ - -/*Some common macros for potential platform-specific optimization.*/ -#include "opus_types.h" -#include -#include -#include "arch.h" -#if !defined(_ecintrin_H) -# define _ecintrin_H (1) - -/*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.*/ - -/*Modern gcc (4.x) can compile the naive versions of min and max with cmov if - given an appropriate architecture, but the branchless bit-twiddling versions - are just as fast, and do not require any special target architecture. - Earlier gcc versions (3.x) compiled both code to the same assembly - instructions, because of the way they represented ((_b)>(_a)) internally.*/ -# define EC_MINI(_a,_b) ((_a)+(((_b)-(_a))&-((_b)<(_a)))) - -/*Count leading zeros. - This macro should only be used for implementing ec_ilog(), if it is defined. - All other code should use EC_ILOG() instead.*/ -#if defined(_MSC_VER) && (_MSC_VER >= 1400) -# include -/*In _DEBUG mode this is not an intrinsic by default.*/ -# pragma intrinsic(_BitScanReverse) - -static __inline int ec_bsr(unsigned long _x){ - unsigned long ret; - _BitScanReverse(&ret,_x); - return (int)ret; -} -# define EC_CLZ0 (1) -# define EC_CLZ(_x) (-ec_bsr(_x)) -#elif defined(ENABLE_TI_DSPLIB) -# include "dsplib.h" -# define EC_CLZ0 (31) -# define EC_CLZ(_x) (_lnorm(_x)) -#elif __GNUC_PREREQ(3,4) -# if INT_MAX>=2147483647 -# define EC_CLZ0 ((int)sizeof(unsigned)*CHAR_BIT) -# define EC_CLZ(_x) (__builtin_clz(_x)) -# elif LONG_MAX>=2147483647L -# define EC_CLZ0 ((int)sizeof(unsigned long)*CHAR_BIT) -# define EC_CLZ(_x) (__builtin_clzl(_x)) -# endif -#endif - -#if defined(EC_CLZ) -/*Note that __builtin_clz is not defined when _x==0, according to the gcc - documentation (and that of the BSR instruction that implements it on x86). - The majority of the time we can never pass it zero. - When we need to, it can be special cased.*/ -# define EC_ILOG(_x) (EC_CLZ0-EC_CLZ(_x)) -#else -int ec_ilog(opus_uint32 _v); -# define EC_ILOG(_x) (ec_ilog(_x)) -#endif -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/entcode.c b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/entcode.c deleted file mode 100644 index fa5d7c7c..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/entcode.c +++ /dev/null @@ -1,93 +0,0 @@ -/* Copyright (c) 2001-2011 Timothy B. Terriberry -*/ -/* - 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 "entcode.h" -#include "arch.h" - -#if !defined(EC_CLZ) -/*This is a fallback for systems where we don't know how to access - a BSR or CLZ instruction (see ecintrin.h). - If you are optimizing Opus on a new platform and it has a native CLZ or - BZR (e.g. cell, MIPS, x86, etc) then making it available to Opus will be - an easy performance win.*/ -int ec_ilog(opus_uint32 _v){ - /*On a Pentium M, this branchless version tested as the fastest on - 1,000,000,000 random 32-bit integers, edging out a similar version with - branches, and a 256-entry LUT version.*/ - int ret; - int m; - ret=!!_v; - m=!!(_v&0xFFFF0000)<<4; - _v>>=m; - ret|=m; - m=!!(_v&0xFF00)<<3; - _v>>=m; - ret|=m; - m=!!(_v&0xF0)<<2; - _v>>=m; - ret|=m; - m=!!(_v&0xC)<<1; - _v>>=m; - ret|=m; - ret+=!!(_v&0x2); - return ret; -} -#endif - -opus_uint32 ec_tell_frac(ec_ctx *_this){ - opus_uint32 nbits; - opus_uint32 r; - int l; - int i; - /*To handle the non-integral number of bits still left in the encoder/decoder - state, we compute the worst-case number of bits of val that must be - encoded to ensure that the value is inside the range for any possible - subsequent bits. - The computation here is independent of val itself (the decoder does not - even track that value), even though the real number of bits used after - ec_enc_done() may be 1 smaller if rng is a power of two and the - corresponding trailing bits of val are all zeros. - If we did try to track that special case, then coding a value with a - probability of 1/(1<nbits_total<rng); - r=_this->rng>>(l-16); - for(i=BITRES;i-->0;){ - int b; - r=r*r>>15; - b=(int)(r>>16); - l=l<<1|b; - r>>=b; - } - return nbits-l; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/entcode.h b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/entcode.h deleted file mode 100644 index dd13e49e..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/entcode.h +++ /dev/null @@ -1,117 +0,0 @@ -/* Copyright (c) 2001-2011 Timothy B. Terriberry - Copyright (c) 2008-2009 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. -*/ - -#include "opus_types.h" -#include "opus_defines.h" - -#if !defined(_entcode_H) -# define _entcode_H (1) -# include -# include -# include "ecintrin.h" - -/*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; -typedef struct ec_ctx ec_ctx; -typedef struct ec_ctx ec_enc; -typedef struct ec_ctx ec_dec; - -# define EC_WINDOW_SIZE ((int)sizeof(ec_window)*CHAR_BIT) - -/*The number of bits to use for the range-coded part of unsigned integers.*/ -# define EC_UINT_BITS (8) - -/*The resolution of fractional-precision bit usage measurements, i.e., - 3 => 1/8th bits.*/ -# define BITRES 3 - -/*The entropy encoder/decoder context. - We use the same structure for both, so that common functions like ec_tell() - can be used on either one.*/ -struct ec_ctx{ - /*Buffered input/output.*/ - unsigned char *buf; - /*The size of the buffer.*/ - opus_uint32 storage; - /*The offset at which the last byte containing raw bits was read/written.*/ - opus_uint32 end_offs; - /*Bits that will be read from/written at the end.*/ - ec_window end_window; - /*Number of valid bits in end_window.*/ - int nend_bits; - /*The total number of whole bits read/written. - This does not include partial bits currently in the range coder.*/ - int nbits_total; - /*The offset at which the next range coder byte will be read/written.*/ - opus_uint32 offs; - /*The number of values in the current range.*/ - opus_uint32 rng; - /*In the decoder: the difference between the top of the current range and - the input value, minus one. - In the encoder: the low end of the current range.*/ - opus_uint32 val; - /*In the decoder: the saved normalization factor from ec_decode(). - In the encoder: the number of oustanding carry propagating symbols.*/ - opus_uint32 ext; - /*A buffered input/output symbol, awaiting carry propagation.*/ - int rem; - /*Nonzero if an error occurred.*/ - int error; -}; - -static OPUS_INLINE opus_uint32 ec_range_bytes(ec_ctx *_this){ - return _this->offs; -} - -static OPUS_INLINE unsigned char *ec_get_buffer(ec_ctx *_this){ - return _this->buf; -} - -static OPUS_INLINE int ec_get_error(ec_ctx *_this){ - return _this->error; -} - -/*Returns the number of bits "used" by the encoded or decoded symbols so far. - This same number can be computed in either the encoder or the decoder, and is - suitable for making coding decisions. - 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 OPUS_INLINE int ec_tell(ec_ctx *_this){ - return _this->nbits_total-EC_ILOG(_this->rng); -} - -/*Returns the number of bits "used" by the encoded or decoded symbols so far. - This same number can be computed in either the encoder or the decoder, and is - suitable for making coding decisions. - Return: The number of bits scaled by 2**BITRES. - This will always be slightly larger than the exact value (e.g., all - rounding error is in the positive direction).*/ -opus_uint32 ec_tell_frac(ec_ctx *_this); - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/entdec.c b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/entdec.c deleted file mode 100644 index 3c264685..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/entdec.c +++ /dev/null @@ -1,245 +0,0 @@ -/* Copyright (c) 2001-2011 Timothy B. Terriberry - Copyright (c) 2008-2009 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. -*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include "os_support.h" -#include "arch.h" -#include "entdec.h" -#include "mfrngcod.h" - -/*A range decoder. - This is an entropy decoder based upon \cite{Mar79}, which is itself a - rediscovery of the FIFO arithmetic code introduced by \cite{Pas76}. - It is very similar to arithmetic encoding, except that encoding is done with - digits in any base, instead of with bits, and so it is faster when using - larger bases (i.e.: a byte). - The author claims an average waste of $\frac{1}{2}\log_b(2b)$ bits, where $b$ - is the base, longer than the theoretical optimum, but to my knowledge there - is no published justification for this claim. - This only seems true when using near-infinite precision arithmetic so that - the process is carried out with no rounding errors. - - An excellent description of implementation details is available at - http://www.arturocampos.com/ac_range.html - A recent work \cite{MNW98} which proposes several changes to arithmetic - encoding for efficiency actually re-discovers many of the principles - behind range encoding, and presents a good theoretical analysis of them. - - End of stream is handled by writing out the smallest number of bits that - ensures that the stream will be correctly decoded regardless of the value of - any subsequent bits. - ec_tell() can be used to determine how many bits were needed to decode - all the symbols thus far; other data can be packed in the remaining bits of - the input buffer. - @PHDTHESIS{Pas76, - author="Richard Clark Pasco", - title="Source coding algorithms for fast data compression", - school="Dept. of Electrical Engineering, Stanford University", - address="Stanford, CA", - month=May, - year=1976 - } - @INPROCEEDINGS{Mar79, - author="Martin, G.N.N.", - title="Range encoding: an algorithm for removing redundancy from a digitised - message", - booktitle="Video & Data Recording Conference", - year=1979, - address="Southampton", - month=Jul - } - @ARTICLE{MNW98, - author="Alistair Moffat and Radford Neal and Ian H. Witten", - title="Arithmetic Coding Revisited", - journal="{ACM} Transactions on Information Systems", - year=1998, - volume=16, - number=3, - pages="256--294", - month=Jul, - URL="http://www.stanford.edu/class/ee398a/handouts/papers/Moffat98ArithmCoding.pdf" - }*/ - -static int ec_read_byte(ec_dec *_this){ - return _this->offs<_this->storage?_this->buf[_this->offs++]:0; -} - -static int ec_read_byte_from_end(ec_dec *_this){ - return _this->end_offs<_this->storage? - _this->buf[_this->storage-++(_this->end_offs)]:0; -} - -/*Normalizes the contents of val and rng so that rng lies entirely in the - high-order symbol.*/ -static void ec_dec_normalize(ec_dec *_this){ - /*If the range is too small, rescale it and input some bits.*/ - while(_this->rng<=EC_CODE_BOT){ - int sym; - _this->nbits_total+=EC_SYM_BITS; - _this->rng<<=EC_SYM_BITS; - /*Use up the remaining bits from our last symbol.*/ - sym=_this->rem; - /*Read the next value from the input.*/ - _this->rem=ec_read_byte(_this); - /*Take the rest of the bits we need from this new symbol.*/ - sym=(sym<rem)>>(EC_SYM_BITS-EC_CODE_EXTRA); - /*And subtract them from val, capped to be less than EC_CODE_TOP.*/ - _this->val=((_this->val<buf=_buf; - _this->storage=_storage; - _this->end_offs=0; - _this->end_window=0; - _this->nend_bits=0; - /*This is the offset from which ec_tell() will subtract partial bits. - The final value after the ec_dec_normalize() call will be the same as in - the encoder, but we have to compensate for the bits that are added there.*/ - _this->nbits_total=EC_CODE_BITS+1 - -((EC_CODE_BITS-EC_CODE_EXTRA)/EC_SYM_BITS)*EC_SYM_BITS; - _this->offs=0; - _this->rng=1U<rem=ec_read_byte(_this); - _this->val=_this->rng-1-(_this->rem>>(EC_SYM_BITS-EC_CODE_EXTRA)); - _this->error=0; - /*Normalize the interval.*/ - ec_dec_normalize(_this); -} - -unsigned ec_decode(ec_dec *_this,unsigned _ft){ - unsigned s; - _this->ext=_this->rng/_ft; - s=(unsigned)(_this->val/_this->ext); - return _ft-EC_MINI(s+1,_ft); -} - -unsigned ec_decode_bin(ec_dec *_this,unsigned _bits){ - unsigned s; - _this->ext=_this->rng>>_bits; - s=(unsigned)(_this->val/_this->ext); - return (1U<<_bits)-EC_MINI(s+1U,1U<<_bits); -} - -void ec_dec_update(ec_dec *_this,unsigned _fl,unsigned _fh,unsigned _ft){ - opus_uint32 s; - s=IMUL32(_this->ext,_ft-_fh); - _this->val-=s; - _this->rng=_fl>0?IMUL32(_this->ext,_fh-_fl):_this->rng-s; - ec_dec_normalize(_this); -} - -/*The probability of having a "one" is 1/(1<<_logp).*/ -int ec_dec_bit_logp(ec_dec *_this,unsigned _logp){ - opus_uint32 r; - opus_uint32 d; - opus_uint32 s; - int ret; - r=_this->rng; - d=_this->val; - s=r>>_logp; - ret=dval=d-s; - _this->rng=ret?s:r-s; - ec_dec_normalize(_this); - return ret; -} - -int ec_dec_icdf(ec_dec *_this,const unsigned char *_icdf,unsigned _ftb){ - opus_uint32 r; - opus_uint32 d; - opus_uint32 s; - opus_uint32 t; - int ret; - s=_this->rng; - d=_this->val; - r=s>>_ftb; - ret=-1; - do{ - t=s; - s=IMUL32(r,_icdf[++ret]); - } - while(dval=d-s; - _this->rng=t-s; - ec_dec_normalize(_this); - return ret; -} - -opus_uint32 ec_dec_uint(ec_dec *_this,opus_uint32 _ft){ - unsigned ft; - unsigned s; - int ftb; - /*In order to optimize EC_ILOG(), it is undefined for the value 0.*/ - celt_assert(_ft>1); - _ft--; - ftb=EC_ILOG(_ft); - if(ftb>EC_UINT_BITS){ - opus_uint32 t; - ftb-=EC_UINT_BITS; - ft=(unsigned)(_ft>>ftb)+1; - s=ec_decode(_this,ft); - ec_dec_update(_this,s,s+1,ft); - t=(opus_uint32)s<error=1; - return _ft; - } - else{ - _ft++; - s=ec_decode(_this,(unsigned)_ft); - ec_dec_update(_this,s,s+1,(unsigned)_ft); - return s; - } -} - -opus_uint32 ec_dec_bits(ec_dec *_this,unsigned _bits){ - ec_window window; - int available; - opus_uint32 ret; - window=_this->end_window; - available=_this->nend_bits; - if((unsigned)available<_bits){ - do{ - window|=(ec_window)ec_read_byte_from_end(_this)<>=_bits; - available-=_bits; - _this->end_window=window; - _this->nend_bits=available; - _this->nbits_total+=_bits; - return ret; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/entdec.h b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/entdec.h deleted file mode 100644 index d8ab3187..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/entdec.h +++ /dev/null @@ -1,100 +0,0 @@ -/* Copyright (c) 2001-2011 Timothy B. Terriberry - Copyright (c) 2008-2009 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. -*/ - -#if !defined(_entdec_H) -# define _entdec_H (1) -# include -# include "entcode.h" - -/*Initializes the decoder. - _buf: The input buffer to use. - Return: 0 on success, or a negative value on error.*/ -void ec_dec_init(ec_dec *_this,unsigned char *_buf,opus_uint32 _storage); - -/*Calculates the cumulative frequency for the next symbol. - This can then be fed into the probability model to determine what that - symbol is, and the additional frequency information required to advance to - the next symbol. - This function cannot be called more than once without a corresponding call to - ec_dec_update(), or decoding will not proceed correctly. - _ft: The total frequency of the symbols in the alphabet the next symbol was - encoded with. - Return: A cumulative frequency representing the encoded symbol. - If the cumulative frequency of all the symbols before the one that - was encoded was fl, and the cumulative frequency of all the symbols - up to and including the one encoded is fh, then the returned value - will fall in the range [fl,fh).*/ -unsigned ec_decode(ec_dec *_this,unsigned _ft); - -/*Equivalent to ec_decode() with _ft==1<<_bits.*/ -unsigned ec_decode_bin(ec_dec *_this,unsigned _bits); - -/*Advance the decoder past the next symbol using the frequency information the - symbol was encoded with. - Exactly one call to ec_decode() must have been made so that all necessary - intermediate calculations are performed. - _fl: The cumulative frequency of all symbols that come before the symbol - decoded. - _fh: The cumulative frequency of all symbols up to and including the symbol - decoded. - Together with _fl, this defines the range [_fl,_fh) in which the value - returned above must fall. - _ft: The total frequency of the symbols in the alphabet the symbol decoded - was encoded in. - This must be the same as passed to the preceding call to ec_decode().*/ -void ec_dec_update(ec_dec *_this,unsigned _fl,unsigned _fh,unsigned _ft); - -/* Decode a bit that has a 1/(1<<_logp) probability of being a one */ -int ec_dec_bit_logp(ec_dec *_this,unsigned _logp); - -/*Decodes a symbol given an "inverse" CDF table. - No call to ec_dec_update() is necessary after this call. - _icdf: The "inverse" CDF, such that symbol s falls in the range - [s>0?ft-_icdf[s-1]:0,ft-_icdf[s]), where ft=1<<_ftb. - The values must be monotonically non-increasing, and the last value - must be 0. - _ftb: The number of bits of precision in the cumulative distribution. - Return: The decoded symbol s.*/ -int ec_dec_icdf(ec_dec *_this,const unsigned char *_icdf,unsigned _ftb); - -/*Extracts a raw unsigned integer with a non-power-of-2 range from the stream. - 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. - Return: The decoded bits.*/ -opus_uint32 ec_dec_uint(ec_dec *_this,opus_uint32 _ft); - -/*Extracts a sequence of raw bits from the stream. - The bits must have been encoded with ec_enc_bits(). - No call to ec_dec_update() is necessary after this call. - _ftb: The number of bits to extract. - This must be between 0 and 25, inclusive. - Return: The decoded bits.*/ -opus_uint32 ec_dec_bits(ec_dec *_this,unsigned _ftb); - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/entenc.c b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/entenc.c deleted file mode 100644 index a7e34ece..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/entenc.c +++ /dev/null @@ -1,294 +0,0 @@ -/* Copyright (c) 2001-2011 Timothy B. Terriberry - Copyright (c) 2008-2009 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. -*/ - -#if defined(HAVE_CONFIG_H) -# include "config.h" -#endif -#include "os_support.h" -#include "arch.h" -#include "entenc.h" -#include "mfrngcod.h" - -/*A range encoder. - See entdec.c and the references for implementation details \cite{Mar79,MNW98}. - - @INPROCEEDINGS{Mar79, - author="Martin, G.N.N.", - title="Range encoding: an algorithm for removing redundancy from a digitised - message", - booktitle="Video \& Data Recording Conference", - year=1979, - address="Southampton", - month=Jul - } - @ARTICLE{MNW98, - author="Alistair Moffat and Radford Neal and Ian H. Witten", - title="Arithmetic Coding Revisited", - journal="{ACM} Transactions on Information Systems", - year=1998, - volume=16, - number=3, - pages="256--294", - month=Jul, - URL="http://www.stanford.edu/class/ee398/handouts/papers/Moffat98ArithmCoding.pdf" - }*/ - -static int ec_write_byte(ec_enc *_this,unsigned _value){ - if(_this->offs+_this->end_offs>=_this->storage)return -1; - _this->buf[_this->offs++]=(unsigned char)_value; - return 0; -} - -static int ec_write_byte_at_end(ec_enc *_this,unsigned _value){ - if(_this->offs+_this->end_offs>=_this->storage)return -1; - _this->buf[_this->storage-++(_this->end_offs)]=(unsigned char)_value; - return 0; -} - -/*Outputs a symbol, with a carry bit. - If there is a potential to propagate a carry over several symbols, they are - buffered until it can be determined whether or not an actual carry will - occur. - If the counter for the buffered symbols overflows, then the stream becomes - undecodable. - This gives a theoretical limit of a few billion symbols in a single packet on - 32-bit systems. - The alternative is to truncate the range in order to force a carry, but - requires similar carry tracking in the decoder, needlessly slowing it down.*/ -static void ec_enc_carry_out(ec_enc *_this,int _c){ - if(_c!=EC_SYM_MAX){ - /*No further carry propagation possible, flush buffer.*/ - int carry; - carry=_c>>EC_SYM_BITS; - /*Don't output a byte on the first write. - This compare should be taken care of by branch-prediction thereafter.*/ - if(_this->rem>=0)_this->error|=ec_write_byte(_this,_this->rem+carry); - if(_this->ext>0){ - unsigned sym; - sym=(EC_SYM_MAX+carry)&EC_SYM_MAX; - do _this->error|=ec_write_byte(_this,sym); - while(--(_this->ext)>0); - } - _this->rem=_c&EC_SYM_MAX; - } - else _this->ext++; -} - -static 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)); - /*Move the next-to-high-order symbol into the high-order position.*/ - _this->val=(_this->val<rng<<=EC_SYM_BITS; - _this->nbits_total+=EC_SYM_BITS; - } -} - -void ec_enc_init(ec_enc *_this,unsigned char *_buf,opus_uint32 _size){ - _this->buf=_buf; - _this->end_offs=0; - _this->end_window=0; - _this->nend_bits=0; - /*This is the offset from which ec_tell() will subtract partial bits.*/ - _this->nbits_total=EC_CODE_BITS+1; - _this->offs=0; - _this->rng=EC_CODE_TOP; - _this->rem=-1; - _this->val=0; - _this->ext=0; - _this->storage=_size; - _this->error=0; -} - -void ec_encode(ec_enc *_this,unsigned _fl,unsigned _fh,unsigned _ft){ - opus_uint32 r; - r=_this->rng/_ft; - if(_fl>0){ - _this->val+=_this->rng-IMUL32(r,(_ft-_fl)); - _this->rng=IMUL32(r,(_fh-_fl)); - } - else _this->rng-=IMUL32(r,(_ft-_fh)); - ec_enc_normalize(_this); -} - -void ec_encode_bin(ec_enc *_this,unsigned _fl,unsigned _fh,unsigned _bits){ - opus_uint32 r; - r=_this->rng>>_bits; - if(_fl>0){ - _this->val+=_this->rng-IMUL32(r,((1U<<_bits)-_fl)); - _this->rng=IMUL32(r,(_fh-_fl)); - } - else _this->rng-=IMUL32(r,((1U<<_bits)-_fh)); - ec_enc_normalize(_this); -} - -/*The probability of having a "one" is 1/(1<<_logp).*/ -void ec_enc_bit_logp(ec_enc *_this,int _val,unsigned _logp){ - opus_uint32 r; - opus_uint32 s; - opus_uint32 l; - r=_this->rng; - l=_this->val; - s=r>>_logp; - r-=s; - if(_val)_this->val=l+r; - _this->rng=_val?s:r; - ec_enc_normalize(_this); -} - -void ec_enc_icdf(ec_enc *_this,int _s,const unsigned char *_icdf,unsigned _ftb){ - opus_uint32 r; - r=_this->rng>>_ftb; - if(_s>0){ - _this->val+=_this->rng-IMUL32(r,_icdf[_s-1]); - _this->rng=IMUL32(r,_icdf[_s-1]-_icdf[_s]); - } - else _this->rng-=IMUL32(r,_icdf[_s]); - ec_enc_normalize(_this); -} - -void ec_enc_uint(ec_enc *_this,opus_uint32 _fl,opus_uint32 _ft){ - unsigned ft; - unsigned fl; - int ftb; - /*In order to optimize EC_ILOG(), it is undefined for the value 0.*/ - celt_assert(_ft>1); - _ft--; - ftb=EC_ILOG(_ft); - if(ftb>EC_UINT_BITS){ - ftb-=EC_UINT_BITS; - ft=(_ft>>ftb)+1; - fl=(unsigned)(_fl>>ftb); - ec_encode(_this,fl,fl+1,ft); - ec_enc_bits(_this,_fl&(((opus_uint32)1<end_window; - used=_this->nend_bits; - celt_assert(_bits>0); - if(used+_bits>EC_WINDOW_SIZE){ - do{ - _this->error|=ec_write_byte_at_end(_this,(unsigned)window&EC_SYM_MAX); - window>>=EC_SYM_BITS; - used-=EC_SYM_BITS; - } - while(used>=EC_SYM_BITS); - } - window|=(ec_window)_fl<end_window=window; - _this->nend_bits=used; - _this->nbits_total+=_bits; -} - -void ec_enc_patch_initial_bits(ec_enc *_this,unsigned _val,unsigned _nbits){ - int shift; - unsigned mask; - celt_assert(_nbits<=EC_SYM_BITS); - shift=EC_SYM_BITS-_nbits; - mask=((1<<_nbits)-1)<offs>0){ - /*The first byte has been finalized.*/ - _this->buf[0]=(unsigned char)((_this->buf[0]&~mask)|_val<rem>=0){ - /*The first byte is still awaiting carry propagation.*/ - _this->rem=(_this->rem&~mask)|_val<rng<=(EC_CODE_TOP>>_nbits)){ - /*The renormalization loop has never been run.*/ - _this->val=(_this->val&~((opus_uint32)mask<error=-1; -} - -void ec_enc_shrink(ec_enc *_this,opus_uint32 _size){ - celt_assert(_this->offs+_this->end_offs<=_size); - OPUS_MOVE(_this->buf+_size-_this->end_offs, - _this->buf+_this->storage-_this->end_offs,_this->end_offs); - _this->storage=_size; -} - -void ec_enc_done(ec_enc *_this){ - ec_window window; - int used; - opus_uint32 msk; - opus_uint32 end; - int l; - /*We output the minimum number of bits that ensures that the symbols encoded - thus far will be decoded correctly regardless of the bits that follow.*/ - l=EC_CODE_BITS-EC_ILOG(_this->rng); - msk=(EC_CODE_TOP-1)>>l; - end=(_this->val+msk)&~msk; - if((end|msk)>=_this->val+_this->rng){ - l++; - msk>>=1; - end=(_this->val+msk)&~msk; - } - while(l>0){ - ec_enc_carry_out(_this,(int)(end>>EC_CODE_SHIFT)); - end=(end<rem>=0||_this->ext>0)ec_enc_carry_out(_this,0); - /*If we have buffered extra bits, flush them as well.*/ - window=_this->end_window; - used=_this->nend_bits; - while(used>=EC_SYM_BITS){ - _this->error|=ec_write_byte_at_end(_this,(unsigned)window&EC_SYM_MAX); - window>>=EC_SYM_BITS; - used-=EC_SYM_BITS; - } - /*Clear any excess space and add any remaining extra bits to the last byte.*/ - if(!_this->error){ - OPUS_CLEAR(_this->buf+_this->offs, - _this->storage-_this->offs-_this->end_offs); - if(used>0){ - /*If there's no range coder data at all, give up.*/ - if(_this->end_offs>=_this->storage)_this->error=-1; - else{ - l=-l; - /*If we've busted, don't add too many extra bits to the last byte; it - would corrupt the range coder data, and that's more important.*/ - if(_this->offs+_this->end_offs>=_this->storage&&lerror=-1; - } - _this->buf[_this->storage-_this->end_offs-1]|=(unsigned char)window; - } - } - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/entenc.h b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/entenc.h deleted file mode 100644 index 796bc4d5..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/entenc.h +++ /dev/null @@ -1,110 +0,0 @@ -/* Copyright (c) 2001-2011 Timothy B. Terriberry - Copyright (c) 2008-2009 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. -*/ - -#if !defined(_entenc_H) -# define _entenc_H (1) -# include -# include "entcode.h" - -/*Initializes the encoder. - _buf: The buffer to store output bytes in. - _size: The size of the buffer, in chars.*/ -void ec_enc_init(ec_enc *_this,unsigned char *_buf,opus_uint32 _size); -/*Encodes a symbol given its frequency information. - The frequency information must be discernable by the decoder, assuming it - has read only the previous symbols from the stream. - It is allowable to change the frequency information, or even the entire - source alphabet, so long as the decoder can tell from the context of the - previously encoded information that it is supposed to do so as well. - _fl: The cumulative frequency of all symbols that come before the one to be - encoded. - _fh: The cumulative frequency of all symbols up to and including the one to - be encoded. - Together with _fl, this defines the range [_fl,_fh) in which the - decoded value will fall. - _ft: The sum of the frequencies of all the symbols*/ -void ec_encode(ec_enc *_this,unsigned _fl,unsigned _fh,unsigned _ft); - -/*Equivalent to ec_encode() with _ft==1<<_bits.*/ -void ec_encode_bin(ec_enc *_this,unsigned _fl,unsigned _fh,unsigned _bits); - -/* Encode a bit that has a 1/(1<<_logp) probability of being a one */ -void ec_enc_bit_logp(ec_enc *_this,int _val,unsigned _logp); - -/*Encodes a symbol given an "inverse" CDF table. - _s: The index of the symbol to encode. - _icdf: The "inverse" CDF, such that symbol _s falls in the range - [_s>0?ft-_icdf[_s-1]:0,ft-_icdf[_s]), where ft=1<<_ftb. - The values must be monotonically non-increasing, and the last value - must be 0. - _ftb: The number of bits of precision in the cumulative distribution.*/ -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.*/ -void ec_enc_uint(ec_enc *_this,opus_uint32 _fl,opus_uint32 _ft); - -/*Encodes a sequence of raw bits in the stream. - _fl: The bits to encode. - _ftb: The number of bits to encode. - This must be between 1 and 25, inclusive.*/ -void ec_enc_bits(ec_enc *_this,opus_uint32 _fl,unsigned _ftb); - -/*Overwrites a few bits at the very start of an existing stream, after they - have already been encoded. - This makes it possible to have a few flags up front, where it is easy for - decoders to access them without parsing the whole stream, even if their - values are not determined until late in the encoding process, without having - to buffer all the intermediate symbols in the encoder. - In order for this to work, at least _nbits bits must have already been - encoded using probabilities that are an exact power of two. - The encoder can verify the number of encoded bits is sufficient, but cannot - check this latter condition. - _val: The bits to encode (in the least _nbits significant bits). - They will be decoded in order from most-significant to least. - _nbits: The number of bits to overwrite. - This must be no more than 8.*/ -void ec_enc_patch_initial_bits(ec_enc *_this,unsigned _val,unsigned _nbits); - -/*Compacts the data to fit in the target size. - This moves up the raw bits at the end of the current buffer so they are at - the end of the new buffer size. - The caller must ensure that the amount of data that's already been written - will fit in the new size. - _size: The number of bytes in the new buffer. - This must be large enough to contain the bits already written, and - must be no larger than the existing size.*/ -void ec_enc_shrink(ec_enc *_this,opus_uint32 _size); - -/*Indicates that there are no more symbols to encode. - All reamining output bytes are flushed to the output buffer. - ec_enc_init() must be called before the encoder can be used again.*/ -void ec_enc_done(ec_enc *_this); - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/fixed_debug.h b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/fixed_debug.h deleted file mode 100644 index 80bc9491..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/fixed_debug.h +++ /dev/null @@ -1,773 +0,0 @@ -/* Copyright (C) 2003-2008 Jean-Marc Valin - Copyright (C) 2007-2012 Xiph.Org Foundation */ -/** - @file fixed_debug.h - @brief Fixed-point operations with debugging -*/ -/* - 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_DEBUG_H -#define FIXED_DEBUG_H - -#include -#include "opus_defines.h" - -#ifdef CELT_C -OPUS_EXPORT opus_int64 celt_mips=0; -#else -extern opus_int64 celt_mips; -#endif - -#define MULT16_16SU(a,b) ((opus_val32)(opus_val16)(a)*(opus_val32)(opus_uint16)(b)) -#define MULT32_32_Q31(a,b) ADD32(ADD32(SHL32(MULT16_16(SHR32((a),16),SHR((b),16)),1), SHR32(MULT16_16SU(SHR32((a),16),((b)&0x0000ffff)),15)), SHR32(MULT16_16SU(SHR32((b),16),((a)&0x0000ffff)),15)) - -/** 16x32 multiplication, followed by a 16-bit shift right. Results fits in 32 bits */ -#define MULT16_32_Q16(a,b) ADD32(MULT16_16((a),SHR32((b),16)), SHR32(MULT16_16SU((a),((b)&0x0000ffff)),16)) - -#define MULT16_32_P16(a,b) MULT16_32_PX(a,b,16) - -#define QCONST16(x,bits) ((opus_val16)(.5+(x)*(((opus_val32)1)<<(bits)))) -#define QCONST32(x,bits) ((opus_val32)(.5+(x)*(((opus_val32)1)<<(bits)))) - -#define VERIFY_SHORT(x) ((x)<=32767&&(x)>=-32768) -#define VERIFY_INT(x) ((x)<=2147483647LL&&(x)>=-2147483648LL) -#define VERIFY_UINT(x) ((x)<=(2147483647LLU<<1)) - -#define SHR(a,b) SHR32(a,b) -#define PSHR(a,b) PSHR32(a,b) - -static OPUS_INLINE short NEG16(int x) -{ - int res; - if (!VERIFY_SHORT(x)) - { - fprintf (stderr, "NEG16: input is not short: %d\n", (int)x); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - res = -x; - if (!VERIFY_SHORT(res)) - { - fprintf (stderr, "NEG16: output is not short: %d\n", (int)res); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - celt_mips++; - return res; -} -static OPUS_INLINE int NEG32(opus_int64 x) -{ - opus_int64 res; - if (!VERIFY_INT(x)) - { - fprintf (stderr, "NEG16: input is not int: %d\n", (int)x); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - res = -x; - if (!VERIFY_INT(res)) - { - fprintf (stderr, "NEG16: output is not int: %d\n", (int)res); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - celt_mips+=2; - return res; -} - -#define EXTRACT16(x) EXTRACT16_(x, __FILE__, __LINE__) -static OPUS_INLINE short EXTRACT16_(int x, char *file, int line) -{ - int res; - if (!VERIFY_SHORT(x)) - { - fprintf (stderr, "EXTRACT16: input is not short: %d in %s: line %d\n", x, file, line); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - res = x; - celt_mips++; - return res; -} - -#define EXTEND32(x) EXTEND32_(x, __FILE__, __LINE__) -static OPUS_INLINE int EXTEND32_(int x, char *file, int line) -{ - int res; - if (!VERIFY_SHORT(x)) - { - fprintf (stderr, "EXTEND32: input is not short: %d in %s: line %d\n", x, file, line); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - res = x; - celt_mips++; - return res; -} - -#define SHR16(a, shift) SHR16_(a, shift, __FILE__, __LINE__) -static OPUS_INLINE short SHR16_(int a, int shift, char *file, int line) -{ - int res; - if (!VERIFY_SHORT(a) || !VERIFY_SHORT(shift)) - { - fprintf (stderr, "SHR16: inputs are not short: %d >> %d in %s: line %d\n", a, shift, file, line); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - res = a>>shift; - if (!VERIFY_SHORT(res)) - { - fprintf (stderr, "SHR16: output is not short: %d in %s: line %d\n", res, file, line); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - celt_mips++; - return res; -} -#define SHL16(a, shift) SHL16_(a, shift, __FILE__, __LINE__) -static OPUS_INLINE short SHL16_(int a, int shift, char *file, int line) -{ - int res; - if (!VERIFY_SHORT(a) || !VERIFY_SHORT(shift)) - { - fprintf (stderr, "SHL16: inputs are not short: %d %d in %s: line %d\n", a, shift, file, line); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - res = a<>shift; - if (!VERIFY_INT(res)) - { - fprintf (stderr, "SHR32: output is not int: %d\n", (int)res); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - celt_mips+=2; - return res; -} -#define SHL32(a, shift) SHL32_(a, shift, __FILE__, __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)) - { - fprintf (stderr, "SHL32: inputs are not int: %lld %d in %s: line %d\n", a, shift, file, line); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - res = a<>1))),shift)) -#define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift))) - -#define ROUND16(x,a) (celt_mips--,EXTRACT16(PSHR32((x),(a)))) -#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 OPUS_INLINE short ADD16_(int a, int b, char *file, int line) -{ - int res; - if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) - { - fprintf (stderr, "ADD16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - res = a+b; - if (!VERIFY_SHORT(res)) - { - fprintf (stderr, "ADD16: output is not short: %d+%d=%d in %s: line %d\n", a,b,res, file, line); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - celt_mips++; - return res; -} - -#define SUB16(a, b) SUB16_(a, b, __FILE__, __LINE__) -static OPUS_INLINE short SUB16_(int a, int b, char *file, int line) -{ - int res; - if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) - { - fprintf (stderr, "SUB16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - res = a-b; - if (!VERIFY_SHORT(res)) - { - fprintf (stderr, "SUB16: output is not short: %d in %s: line %d\n", res, file, line); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - celt_mips++; - return res; -} - -#define ADD32(a, b) ADD32_(a, b, __FILE__, __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)) - { - fprintf (stderr, "ADD32: inputs are not int: %d %d in %s: line %d\n", (int)a, (int)b, file, line); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - res = a+b; - if (!VERIFY_INT(res)) - { - fprintf (stderr, "ADD32: output is not int: %d in %s: line %d\n", (int)res, file, line); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - celt_mips+=2; - return res; -} - -#define SUB32(a, b) SUB32_(a, b, __FILE__, __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)) - { - fprintf (stderr, "SUB32: inputs are not int: %d %d in %s: line %d\n", (int)a, (int)b, file, line); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - res = a-b; - if (!VERIFY_INT(res)) - { - fprintf (stderr, "SUB32: output is not int: %d in %s: line %d\n", (int)res, file, line); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - celt_mips+=2; - return res; -} - -#undef UADD32 -#define UADD32(a, b) UADD32_(a, b, __FILE__, __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)) - { - fprintf (stderr, "UADD32: inputs are not uint32: %llu %llu in %s: line %d\n", a, b, file, line); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - res = a+b; - if (!VERIFY_UINT(res)) - { - fprintf (stderr, "UADD32: output is not uint32: %llu in %s: line %d\n", res, file, line); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - celt_mips+=2; - return res; -} - -#undef USUB32 -#define USUB32(a, b) USUB32_(a, b, __FILE__, __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)) - { - fprintf (stderr, "USUB32: inputs are not uint32: %llu %llu in %s: line %d\n", a, b, file, line); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - if (a=((opus_val32)(1)<<(15+Q))) - { - fprintf (stderr, "MULT16_32_Q%d: second operand too large: %d %d in %s: line %d\n", Q, (int)a, (int)b, file, line); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - res = (((opus_int64)a)*(opus_int64)b) >> Q; - if (!VERIFY_INT(res)) - { - fprintf (stderr, "MULT16_32_Q%d: output is not int: %d*%d=%d in %s: line %d\n", Q, (int)a, (int)b,(int)res, file, line); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - if (Q==15) - celt_mips+=3; - else - celt_mips+=4; - return res; -} - -#define MULT16_32_PX(a, b, Q) MULT16_32_PX_(a, b, Q, __FILE__, __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)) - { - fprintf (stderr, "MULT16_32_P%d: inputs are not short+int: %d %d in %s: line %d\n\n", Q, (int)a, (int)b, file, line); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - if (ABS32(b)>=((opus_int64)(1)<<(15+Q))) - { - fprintf (stderr, "MULT16_32_Q%d: second operand too large: %d %d in %s: line %d\n\n", Q, (int)a, (int)b,file, line); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - res = ((((opus_int64)a)*(opus_int64)b) + (((opus_val32)(1)<>1))>> Q; - if (!VERIFY_INT(res)) - { - fprintf (stderr, "MULT16_32_P%d: output is not int: %d*%d=%d in %s: line %d\n\n", Q, (int)a, (int)b,(int)res, file, line); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - if (Q==15) - celt_mips+=4; - else - celt_mips+=5; - return res; -} - -#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)))) - -static OPUS_INLINE int SATURATE(int a, int b) -{ - if (a>b) - a=b; - if (a<-b) - a = -b; - celt_mips+=3; - return a; -} - -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)) - { - fprintf (stderr, "MULT16_16_Q11: inputs are not short: %d %d\n", a, b); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - res = ((opus_int64)a)*b; - res >>= 11; - if (!VERIFY_INT(res)) - { - fprintf (stderr, "MULT16_16_Q11: output is not short: %d*%d=%d\n", (int)a, (int)b, (int)res); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - celt_mips+=3; - return res; -} -static OPUS_INLINE short MULT16_16_Q13(int a, int b) -{ - opus_int64 res; - if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) - { - fprintf (stderr, "MULT16_16_Q13: inputs are not short: %d %d\n", a, b); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - res = ((opus_int64)a)*b; - res >>= 13; - if (!VERIFY_SHORT(res)) - { - fprintf (stderr, "MULT16_16_Q13: output is not short: %d*%d=%d\n", a, b, (int)res); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - celt_mips+=3; - return res; -} -static OPUS_INLINE short MULT16_16_Q14(int a, int b) -{ - opus_int64 res; - if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) - { - fprintf (stderr, "MULT16_16_Q14: inputs are not short: %d %d\n", a, b); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - res = ((opus_int64)a)*b; - res >>= 14; - if (!VERIFY_SHORT(res)) - { - fprintf (stderr, "MULT16_16_Q14: output is not short: %d\n", (int)res); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - celt_mips+=3; - return res; -} - -#define MULT16_16_Q15(a, b) MULT16_16_Q15_(a, b, __FILE__, __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)) - { - fprintf (stderr, "MULT16_16_Q15: inputs are not short: %d %d in %s: line %d\n", a, b, file, line); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - res = ((opus_int64)a)*b; - res >>= 15; - if (!VERIFY_SHORT(res)) - { - fprintf (stderr, "MULT16_16_Q15: output is not short: %d in %s: line %d\n", (int)res, file, line); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - celt_mips+=1; - return res; -} - -static OPUS_INLINE short MULT16_16_P13(int a, int b) -{ - opus_int64 res; - if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) - { - fprintf (stderr, "MULT16_16_P13: inputs are not short: %d %d\n", a, b); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - res = ((opus_int64)a)*b; - res += 4096; - if (!VERIFY_INT(res)) - { - fprintf (stderr, "MULT16_16_P13: overflow: %d*%d=%d\n", a, b, (int)res); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - res >>= 13; - if (!VERIFY_SHORT(res)) - { - fprintf (stderr, "MULT16_16_P13: output is not short: %d*%d=%d\n", a, b, (int)res); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - celt_mips+=4; - return res; -} -static OPUS_INLINE short MULT16_16_P14(int a, int b) -{ - opus_int64 res; - if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) - { - fprintf (stderr, "MULT16_16_P14: inputs are not short: %d %d\n", a, b); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - res = ((opus_int64)a)*b; - res += 8192; - if (!VERIFY_INT(res)) - { - fprintf (stderr, "MULT16_16_P14: overflow: %d*%d=%d\n", a, b, (int)res); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - res >>= 14; - if (!VERIFY_SHORT(res)) - { - fprintf (stderr, "MULT16_16_P14: output is not short: %d*%d=%d\n", a, b, (int)res); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - celt_mips+=4; - return res; -} -static OPUS_INLINE short MULT16_16_P15(int a, int b) -{ - opus_int64 res; - if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) - { - fprintf (stderr, "MULT16_16_P15: inputs are not short: %d %d\n", a, b); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - res = ((opus_int64)a)*b; - res += 16384; - if (!VERIFY_INT(res)) - { - fprintf (stderr, "MULT16_16_P15: overflow: %d*%d=%d\n", a, b, (int)res); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - res >>= 15; - if (!VERIFY_SHORT(res)) - { - fprintf (stderr, "MULT16_16_P15: output is not short: %d*%d=%d\n", a, b, (int)res); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - celt_mips+=2; - return res; -} - -#define DIV32_16(a, b) DIV32_16_(a, b, __FILE__, __LINE__) - -static OPUS_INLINE int DIV32_16_(opus_int64 a, opus_int64 b, char *file, int line) -{ - opus_int64 res; - if (b==0) - { - fprintf(stderr, "DIV32_16: divide by zero: %d/%d in %s: line %d\n", (int)a, (int)b, file, line); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - return 0; - } - if (!VERIFY_INT(a) || !VERIFY_SHORT(b)) - { - fprintf (stderr, "DIV32_16: inputs are not int/short: %d %d in %s: line %d\n", (int)a, (int)b, file, line); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - res = a/b; - if (!VERIFY_SHORT(res)) - { - fprintf (stderr, "DIV32_16: output is not short: %d / %d = %d in %s: line %d\n", (int)a,(int)b,(int)res, file, line); - if (res>32767) - res = 32767; - if (res<-32768) - res = -32768; -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - celt_mips+=35; - return res; -} - -#define DIV32(a, b) DIV32_(a, b, __FILE__, __LINE__) -static OPUS_INLINE int DIV32_(opus_int64 a, opus_int64 b, char *file, int line) -{ - opus_int64 res; - if (b==0) - { - fprintf(stderr, "DIV32: divide by zero: %d/%d in %s: line %d\n", (int)a, (int)b, file, line); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - return 0; - } - - if (!VERIFY_INT(a) || !VERIFY_INT(b)) - { - fprintf (stderr, "DIV32: inputs are not int/short: %d %d in %s: line %d\n", (int)a, (int)b, file, line); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - res = a/b; - if (!VERIFY_INT(res)) - { - fprintf (stderr, "DIV32: output is not int: %d in %s: line %d\n", (int)res, file, line); -#ifdef FIXED_DEBUG_ASSERT - celt_assert(0); -#endif - } - celt_mips+=70; - return res; -} - -#undef PRINT_MIPS -#define PRINT_MIPS(file) do {fprintf (file, "total complexity = %llu MIPS\n", celt_mips);} while (0); - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/fixed_generic.h b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/fixed_generic.h deleted file mode 100644 index ecf018a2..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/fixed_generic.h +++ /dev/null @@ -1,134 +0,0 @@ -/* Copyright (C) 2007-2009 Xiph.Org Foundation - Copyright (C) 2003-2008 Jean-Marc Valin - Copyright (C) 2007-2008 CSIRO */ -/** - @file fixed_generic.h - @brief Generic fixed-point operations -*/ -/* - 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_GENERIC_H -#define FIXED_GENERIC_H - -/** Multiply a 16-bit signed value by a 16-bit unsigned value. The result is a 32-bit signed value */ -#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 */ -#define MULT16_32_Q16(a,b) ADD32(MULT16_16((a),SHR((b),16)), SHR(MULT16_16SU((a),((b)&0x0000ffff)),16)) - -/** 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_16SU((a),((b)&0x0000ffff)),16)) - -/** 16x32 multiplication, followed by a 15-bit shift right. Results fits in 32 bits */ -#define MULT16_32_Q15(a,b) ADD32(SHL(MULT16_16((a),SHR((b),16)),1), SHR(MULT16_16SU((a),((b)&0x0000ffff)),15)) - -/** 32x32 multiplication, followed by a 31-bit shift right. Results fits in 32 bits */ -#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)) - -/** Compile-time conversion of float constant to 16-bit value */ -#define QCONST16(x,bits) ((opus_val16)(.5+(x)*(((opus_val32)1)<<(bits)))) - -/** Compile-time conversion of float constant to 32-bit value */ -#define QCONST32(x,bits) ((opus_val32)(.5+(x)*(((opus_val32)1)<<(bits)))) - -/** Negate a 16-bit value */ -#define NEG16(x) (-(x)) -/** Negate a 32-bit value */ -#define NEG32(x) (-(x)) - -/** Change a 32-bit value into a 16-bit value. The value is assumed to fit in 16-bit, otherwise the result is undefined */ -#define EXTRACT16(x) ((opus_val16)(x)) -/** Change a 16-bit value into a 32-bit value */ -#define EXTEND32(x) ((opus_val32)(x)) - -/** Arithmetic shift-right of a 16-bit value */ -#define SHR16(a,shift) ((a) >> (shift)) -/** Arithmetic shift-left of a 16-bit value */ -#define SHL16(a,shift) ((opus_int16)((opus_uint16)(a)<<(shift))) -/** Arithmetic shift-right of a 32-bit value */ -#define SHR32(a,shift) ((a) >> (shift)) -/** Arithmetic shift-left of a 32-bit value */ -#define SHL32(a,shift) ((opus_int32)((opus_uint32)(a)<<(shift))) - -/** 32-bit arithmetic shift right with rounding-to-nearest instead of rounding down */ -#define PSHR32(a,shift) (SHR32((a)+((EXTEND32(1)<<((shift))>>1)),shift)) -/** 32-bit arithmetic shift right where the argument can be negative */ -#define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift))) - -/** "RAW" macros, should not be used outside of this header file */ -#define SHR(a,shift) ((a) >> (shift)) -#define SHL(a,shift) SHL32(a,shift) -#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)))) -/** Divide by two */ -#define HALF16(x) (SHR16(x,1)) -#define HALF32(x) (SHR32(x,1)) - -/** Add two 16-bit values */ -#define ADD16(a,b) ((opus_val16)((opus_val16)(a)+(opus_val16)(b))) -/** Subtract two 16-bit values */ -#define SUB16(a,b) ((opus_val16)(a)-(opus_val16)(b)) -/** Add two 32-bit values */ -#define ADD32(a,b) ((opus_val32)(a)+(opus_val32)(b)) -/** Subtract two 32-bit values */ -#define SUB32(a,b) ((opus_val32)(a)-(opus_val32)(b)) - -/** 16x16 multiplication where the result fits in 16 bits */ -#define MULT16_16_16(a,b) ((((opus_val16)(a))*((opus_val16)(b)))) - -/* (opus_val32)(opus_val16) gives TI compiler a hint that it's 16x16->32 multiply */ -/** 16x16 multiplication where the result fits in 32 bits */ -#define MULT16_16(a,b) (((opus_val32)(opus_val16)(a))*((opus_val32)(opus_val16)(b))) - -/** 16x16 multiply-add where the result fits in 32 bits */ -#define MAC16_16(c,a,b) (ADD32((c),MULT16_16((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. */ -#define MAC16_32_Q15(c,a,b) ADD32(c,ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15))) - -#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)) - -#define MULT16_16_P13(a,b) (SHR(ADD32(4096,MULT16_16((a),(b))),13)) -#define MULT16_16_P14(a,b) (SHR(ADD32(8192,MULT16_16((a),(b))),14)) -#define MULT16_16_P15(a,b) (SHR(ADD32(16384,MULT16_16((a),(b))),15)) - -/** Divide a 32-bit value by a 16-bit value. Result fits in 16 bits */ -#define DIV32_16(a,b) ((opus_val16)(((opus_val32)(a))/((opus_val16)(b)))) - -/** 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))) - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/float_cast.h b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/float_cast.h deleted file mode 100644 index ede65748..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/float_cast.h +++ /dev/null @@ -1,140 +0,0 @@ -/* Copyright (C) 2001 Erik de Castro Lopo */ -/* - 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. -*/ - -/* Version 1.1 */ - -#ifndef FLOAT_CAST_H -#define FLOAT_CAST_H - - -#include "arch.h" - -/*============================================================================ -** On Intel Pentium processors (especially PIII and probably P4), converting -** from float to int is very slow. To meet the C specs, the code produced by -** most C compilers targeting Pentium needs to change the FPU rounding mode -** before the float to int conversion is performed. -** -** Changing the FPU rounding mode causes the FPU pipeline to be flushed. It -** is this flushing of the pipeline which is so slow. -** -** Fortunately the ISO C99 specifications define the functions lrint, lrintf, -** llrint and llrintf which fix this problem as a side effect. -** -** On Unix-like systems, the configure process should have detected the -** presence of these functions. If they weren't found we have to replace them -** here with a standard C cast. -*/ - -/* -** The C99 prototypes for lrint and lrintf are as follows: -** -** long int lrintf (float x) ; -** long int lrint (double x) ; -*/ - -/* The presence of the required functions are detected during the configure -** process and the values HAVE_LRINT and HAVE_LRINTF are set accordingly in -** the config.h file. -*/ - -#if (HAVE_LRINTF) - -/* These defines enable functionality introduced with the 1999 ISO C -** standard. They must be defined before the inclusion of math.h to -** engage them. If optimisation is enabled, these functions will be -** inlined. With optimisation switched off, you have to link in the -** maths library using -lm. -*/ - -#define _ISOC9X_SOURCE 1 -#define _ISOC99_SOURCE 1 - -#define __USE_ISOC9X 1 -#define __USE_ISOC99 1 - -#include -#define float2int(x) lrintf(x) - -#elif (defined(HAVE_LRINT)) - -#define _ISOC9X_SOURCE 1 -#define _ISOC99_SOURCE 1 - -#define __USE_ISOC9X 1 -#define __USE_ISOC99 1 - -#include -#define float2int(x) lrint(x) - -#elif (defined(_MSC_VER) && _MSC_VER >= 1400) && (defined (WIN64) || defined (_WIN64)) - #include - - __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)) - #include - - /* Win32 doesn't seem to have these functions. - ** Therefore implement OPUS_INLINE versions of these functions here. - */ - - __inline long int - float2int (float flt) - { int intgr; - - _asm - { fld flt - fistp intgr - } ; - - return intgr ; - } - -#else - -#if (defined(__GNUC__) && defined(__STDC__) && __STDC__ && __STDC_VERSION__ >= 199901L) - /* supported by gcc in C99 mode, but not by all other compilers */ - #warning "Don't have the functions lrint() and lrintf ()." - #warning "Replacing these functions with a standard C cast." -#endif /* __STDC_VERSION__ >= 199901L */ - #include - #define float2int(flt) ((int)(floor(.5+flt))) -#endif - -#ifndef DISABLE_FLOAT_API -static OPUS_INLINE opus_int16 FLOAT2INT16(float x) -{ - x = x*CELT_SIG_SCALE; - x = MAX32(x, -32768); - x = MIN32(x, 32767); - return (opus_int16)float2int(x); -} -#endif /* DISABLE_FLOAT_API */ - -#endif /* FLOAT_CAST_H */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/kiss_fft.c b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/kiss_fft.c deleted file mode 100644 index ad706c73..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/kiss_fft.c +++ /dev/null @@ -1,719 +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" - -/* 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] ); - 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]< -#include -#include "arch.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef USE_SIMD -# include -# define kiss_fft_scalar __m128 -#define KISS_FFT_MALLOC(nbytes) memalign(16,nbytes) -#else -#define KISS_FFT_MALLOC opus_alloc -#endif - -#ifdef FIXED_POINT -#include "arch.h" - -# define kiss_fft_scalar opus_int32 -# define kiss_twiddle_scalar opus_int16 - - -#else -# ifndef kiss_fft_scalar -/* default is float */ -# define kiss_fft_scalar float -# define kiss_twiddle_scalar float -# define KF_SUFFIX _celt_single -# endif -#endif - -typedef struct { - kiss_fft_scalar r; - kiss_fft_scalar i; -}kiss_fft_cpx; - -typedef struct { - kiss_twiddle_scalar r; - kiss_twiddle_scalar i; -}kiss_twiddle_cpx; - -#define MAXFACTORS 8 -/* e.g. an fft of length 128 has 4 factors - as far as kissfft is concerned - 4*4*4*2 - */ - -typedef struct kiss_fft_state{ - int nfft; -#ifndef FIXED_POINT - kiss_fft_scalar scale; -#endif - int shift; - opus_int16 factors[2*MAXFACTORS]; - const opus_int16 *bitrev; - const kiss_twiddle_cpx *twiddles; -} kiss_fft_state; - -/*typedef struct kiss_fft_state* kiss_fft_cfg;*/ - -/** - * opus_fft_alloc - * - * Initialize a FFT (or IFFT) algorithm's cfg/state buffer. - * - * typical usage: kiss_fft_cfg mycfg=opus_fft_alloc(1024,0,NULL,NULL); - * - * The return value from fft_alloc is a cfg buffer used internally - * by the fft routine or NULL. - * - * If lenmem is NULL, then opus_fft_alloc will allocate a cfg buffer using malloc. - * The returned value should be free()d when done to avoid memory leaks. - * - * The state can be placed in a user supplied buffer 'mem': - * If lenmem is not NULL and mem is not NULL and *lenmem is large enough, - * then the function places the cfg in mem and the size used in *lenmem - * and returns mem. - * - * If lenmem is not NULL and ( mem is NULL or *lenmem is not large enough), - * then the function returns NULL and places the minimum cfg - * 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(int nfft,void * mem,size_t * lenmem); - -/** - * opus_fft(cfg,in_out_buf) - * - * Perform an FFT on a complex input buffer. - * for a forward FFT, - * fin should be f[0] , f[1] , ... ,f[nfft-1] - * fout will be F[0] , F[1] , ... ,F[nfft-1] - * 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_free(const kiss_fft_state *cfg); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/laplace.c b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/laplace.c deleted file mode 100644 index a7bca874..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/laplace.c +++ /dev/null @@ -1,134 +0,0 @@ -/* Copyright (c) 2007 CSIRO - Copyright (c) 2007-2009 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 "laplace.h" -#include "mathops.h" - -/* The minimum probability of an energy delta (out of 32768). */ -#define LAPLACE_LOG_MINP (0) -#define LAPLACE_MINP (1<>15; -} - -void ec_laplace_encode(ec_enc *enc, int *value, unsigned fs, int decay) -{ - unsigned fl; - int val = *value; - fl = 0; - if (val) - { - int s; - int i; - s = -(val<0); - val = (val+s)^s; - fl = fs; - fs = ec_laplace_get_freq1(fs, decay); - /* Search the decaying part of the PDF.*/ - for (i=1; fs > 0 && i < val; i++) - { - fs *= 2; - fl += fs+2*LAPLACE_MINP; - fs = (fs*(opus_int32)decay)>>15; - } - /* Everything beyond that has probability LAPLACE_MINP. */ - if (!fs) - { - int di; - int ndi_max; - ndi_max = (32768-fl+LAPLACE_MINP-1)>>LAPLACE_LOG_MINP; - ndi_max = (ndi_max-s)>>1; - di = IMIN(val - i, ndi_max - 1); - fl += (2*di+1+s)*LAPLACE_MINP; - fs = IMIN(LAPLACE_MINP, 32768-fl); - *value = (i+di+s)^s; - } - else - { - fs += LAPLACE_MINP; - fl += fs&~s; - } - celt_assert(fl+fs<=32768); - celt_assert(fs>0); - } - ec_encode_bin(enc, fl, fl+fs, 15); -} - -int ec_laplace_decode(ec_dec *dec, unsigned fs, int decay) -{ - int val=0; - unsigned fl; - unsigned fm; - fm = ec_decode_bin(dec, 15); - fl = 0; - if (fm >= fs) - { - val++; - fl = fs; - fs = ec_laplace_get_freq1(fs, decay)+LAPLACE_MINP; - /* Search the decaying part of the PDF.*/ - while(fs > LAPLACE_MINP && fm >= fl+2*fs) - { - fs *= 2; - fl += fs; - fs = ((fs-2*LAPLACE_MINP)*(opus_int32)decay)>>15; - fs += LAPLACE_MINP; - val++; - } - /* Everything beyond that has probability LAPLACE_MINP. */ - if (fs <= LAPLACE_MINP) - { - int di; - di = (fm-fl)>>(LAPLACE_LOG_MINP+1); - val += di; - fl += 2*di*LAPLACE_MINP; - } - if (fm < fl+fs) - val = -val; - else - fl += fs; - } - celt_assert(fl<32768); - celt_assert(fs>0); - celt_assert(fl<=fm); - celt_assert(fm>1; - b=1U<>=1; - bshift--; - } - while(bshift>=0); - return g; -} - -#ifdef FIXED_POINT - -opus_val32 frac_div32(opus_val32 a, opus_val32 b) -{ - opus_val16 rcp; - opus_val32 result, rem; - int shift = celt_ilog2(b)-29; - a = VSHR32(a,shift); - b = VSHR32(b,shift); - /* 16-bit reciprocal */ - rcp = ROUND16(celt_rcp(ROUND16(b,16)),3); - result = MULT16_32_Q15(rcp, a); - rem = PSHR32(a,2)-MULT32_32_Q31(result, b); - result = ADD32(result, SHL32(MULT16_32_Q15(rcp, rem),2)); - if (result >= 536870912) /* 2^29 */ - return 2147483647; /* 2^31 - 1 */ - else if (result <= -536870912) /* -2^29 */ - return -2147483647; /* -2^31 */ - else - return SHL32(result, 2); -} - -/** Reciprocal sqrt approximation in the range [0.25,1) (Q16 in, Q14 out) */ -opus_val16 celt_rsqrt_norm(opus_val32 x) -{ - opus_val16 n; - opus_val16 r; - opus_val16 r2; - opus_val16 y; - /* Range of n is [-16384,32767] ([-0.5,1) in Q15). */ - n = x-32768; - /* Get a rough initial guess for the root. - The optimal minimax quadratic approximation (using relative error) is - r = 1.437799046117536+n*(-0.823394375837328+n*0.4096419668459485). - Coefficients here, and the final result r, are Q14.*/ - r = ADD16(23557, MULT16_16_Q15(n, ADD16(-13490, MULT16_16_Q15(n, 6713)))); - /* We want y = x*r*r-1 in Q15, but x is 32-bit Q16 and r is Q14. - We can compute the result from n and r using Q15 multiplies with some - adjustment, carefully done to avoid overflow. - Range of y is [-1564,1594]. */ - r2 = MULT16_16_Q15(r, r); - y = SHL16(SUB16(ADD16(MULT16_16_Q15(r2, n), r2), 16384), 1); - /* Apply a 2nd-order Householder iteration: r += r*y*(y*0.375-0.5). - This yields the Q14 reciprocal square root of the Q16 x, with a maximum - relative error of 1.04956E-4, a (relative) RMSE of 2.80979E-5, and a - peak absolute error of 2.26591/16384. */ - return ADD16(r, MULT16_16_Q15(r, MULT16_16_Q15(y, - SUB16(MULT16_16_Q15(y, 12288), 16384)))); -} - -/** Sqrt approximation (QX input, QX/2 output) */ -opus_val32 celt_sqrt(opus_val32 x) -{ - int k; - opus_val16 n; - opus_val32 rt; - 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; - rt = ADD16(C[0], MULT16_16_Q15(n, ADD16(C[1], MULT16_16_Q15(n, ADD16(C[2], - MULT16_16_Q15(n, ADD16(C[3], MULT16_16_Q15(n, (C[4]))))))))); - rt = VSHR32(rt,7-k); - return rt; -} - -#define L1 32767 -#define L2 -7651 -#define L3 8277 -#define L4 -626 - -static OPUS_INLINE opus_val16 _celt_cos_pi_2(opus_val16 x) -{ - opus_val16 x2; - - x2 = MULT16_16_P15(x,x); - return ADD16(1,MIN16(32766,ADD32(SUB16(L1,x2), MULT16_16_P15(x2, ADD32(L2, MULT16_16_P15(x2, ADD32(L3, MULT16_16_P15(L4, x2 - )))))))); -} - -#undef L1 -#undef L2 -#undef L3 -#undef L4 - -opus_val16 celt_cos_norm(opus_val32 x) -{ - x = x&0x0001ffff; - if (x>SHL32(EXTEND32(1), 16)) - x = SUB32(SHL32(EXTEND32(1), 17),x); - if (x&0x00007fff) - { - if (x0, "celt_rcp() only defined for positive values"); - i = celt_ilog2(x); - /* n is Q15 with range [0,1). */ - n = VSHR32(x,i-15)-32768; - /* Start with a linear approximation: - r = 1.8823529411764706-0.9411764705882353*n. - The coefficients and the result are Q14 in the range [15420,30840].*/ - r = ADD16(30840, MULT16_16_Q15(-15420, n)); - /* Perform two Newton iterations: - r -= r*((r*n)-1.Q15) - = r*((r*n)+(r-1.Q15)). */ - r = SUB16(r, MULT16_16_Q15(r, - ADD16(MULT16_16_Q15(r, n), ADD16(r, -32768)))); - /* We subtract an extra 1 in the second iteration to avoid overflow; it also - neatly compensates for truncation error in the rest of the process. */ - r = SUB16(r, ADD16(1, MULT16_16_Q15(r, - ADD16(MULT16_16_Q15(r, n), ADD16(r, -32768))))); - /* r is now the Q15 solution to 2/(n+1), with a maximum relative error - of 7.05346E-5, a (relative) RMSE of 2.14418E-5, and a peak absolute - error of 1.24665/32768. */ - return VSHR32(EXTEND32(r),i-16); -} - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/mathops.h b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/mathops.h deleted file mode 100644 index a0525a96..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/mathops.h +++ /dev/null @@ -1,258 +0,0 @@ -/* Copyright (c) 2002-2008 Jean-Marc Valin - Copyright (c) 2007-2008 CSIRO - Copyright (c) 2007-2009 Xiph.Org Foundation - Written by Jean-Marc Valin */ -/** - @file mathops.h - @brief Various math functions -*/ -/* - 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 MATHOPS_H -#define MATHOPS_H - -#include "arch.h" -#include "entcode.h" -#include "os_support.h" - -/* 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); - -#ifndef OVERRIDE_CELT_MAXABS16 -static OPUS_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>23)-127; - in.i -= integer<<23; - frac = in.f - 1.5f; - frac = -0.41445418f + frac*(0.95909232f - + frac*(-0.33951290f + frac*0.16541097f)); - return 1+integer+frac; -} - -/** Base-2 exponential approximation (2^x). */ -static OPUS_INLINE float celt_exp2(float x) -{ - int integer; - float frac; - union { - float f; - opus_uint32 i; - } res; - integer = floor(x); - if (integer < -50) - return 0; - frac = x-integer; - /* K0 = 1, K1 = log(2), K2 = 3-4*log(2), K3 = 3*log(2) - 2 */ - res.f = 0.99992522f + frac * (0.69583354f - + frac * (0.22606716f + 0.078024523f*frac)); - res.i = (res.i + (integer<<23)) & 0x7fffffff; - return res.f; -} - -#else -#define celt_log2(x) ((float)(1.442695040888963387*log(x))) -#define celt_exp2(x) ((float)exp(0.6931471805599453094*(x))) -#endif - -#endif - -#ifdef FIXED_POINT - -#include "os_support.h" - -#ifndef OVERRIDE_CELT_ILOG2 -/** Integer log in base2. Undefined for zero and negative numbers */ -static OPUS_INLINE opus_int16 celt_ilog2(opus_int32 x) -{ - celt_assert2(x>0, "celt_ilog2() only defined for strictly positive numbers"); - return EC_ILOG(x)-1; -} -#endif - - -/** Integer log in base2. Defined for zero, but not for negative numbers */ -static OPUS_INLINE opus_int16 celt_zlog2(opus_val32 x) -{ - return x <= 0 ? 0 : celt_ilog2(x); -} - -opus_val16 celt_rsqrt_norm(opus_val32 x); - -opus_val32 celt_sqrt(opus_val32 x); - -opus_val16 celt_cos_norm(opus_val32 x); - -/** Base-2 logarithm approximation (log2(x)). (Q14 input, Q10 output) */ -static OPUS_INLINE opus_val16 celt_log2(opus_val32 x) -{ - int i; - opus_val16 n, frac; - /* -0.41509302963303146, 0.9609890551383969, -0.31836011537636605, - 0.15530808010959576, -0.08556153059057618 */ - static const opus_val16 C[5] = {-6801+(1<<(13-DB_SHIFT)), 15746, -5217, 2545, -1401}; - if (x==0) - return -32767; - i = celt_ilog2(x); - n = VSHR32(x,i-15)-32768-16384; - frac = ADD16(C[0], MULT16_16_Q15(n, ADD16(C[1], MULT16_16_Q15(n, ADD16(C[2], MULT16_16_Q15(n, ADD16(C[3], MULT16_16_Q15(n, C[4])))))))); - return SHL16(i-13,DB_SHIFT)+SHR16(frac,14-DB_SHIFT); -} - -/* - K0 = 1 - K1 = log(2) - K2 = 3-4*log(2) - K3 = 3*log(2) - 2 -*/ -#define D0 16383 -#define D1 22804 -#define D2 14819 -#define D3 10204 - -static OPUS_INLINE opus_val32 celt_exp2_frac(opus_val16 x) -{ - opus_val16 frac; - frac = SHL16(x, 4); - return ADD16(D0, MULT16_16_Q15(frac, ADD16(D1, MULT16_16_Q15(frac, ADD16(D2 , MULT16_16_Q15(D3,frac)))))); -} -/** Base-2 exponential approximation (2^x). (Q10 input, Q16 output) */ -static OPUS_INLINE opus_val32 celt_exp2(opus_val16 x) -{ - int integer; - opus_val16 frac; - integer = SHR16(x,10); - if (integer>14) - return 0x7f000000; - else if (integer < -15) - return 0; - frac = celt_exp2_frac(x-SHL16(integer,10)); - return VSHR32(EXTEND32(frac), -integer-2); -} - -opus_val32 celt_rcp(opus_val32 x); - -#define celt_div(a,b) MULT32_32_Q31((opus_val32)(a),celt_rcp(b)) - -opus_val32 frac_div32(opus_val32 a, opus_val32 b); - -#define M1 32767 -#define M2 -21 -#define M3 -11943 -#define M4 4936 - -/* Atan approximation using a 4th order polynomial. Input is in Q15 format - and normalized by pi/4. Output is in Q15 format */ -static OPUS_INLINE opus_val16 celt_atan01(opus_val16 x) -{ - return MULT16_16_P15(x, ADD32(M1, MULT16_16_P15(x, ADD32(M2, MULT16_16_P15(x, ADD32(M3, MULT16_16_P15(M4, x))))))); -} - -#undef M1 -#undef M2 -#undef M3 -#undef M4 - -/* atan2() approximation valid for positive input values */ -static OPUS_INLINE opus_val16 celt_atan2p(opus_val16 y, opus_val16 x) -{ - if (y < x) - { - opus_val32 arg; - arg = celt_div(SHL32(EXTEND32(y),15),x); - if (arg >= 32767) - arg = 32767; - return SHR16(celt_atan01(EXTRACT16(arg)),1); - } else { - opus_val32 arg; - arg = celt_div(SHL32(EXTEND32(x),15),y); - if (arg >= 32767) - arg = 32767; - return 25736-SHR16(celt_atan01(EXTRACT16(arg)),1); - } -} - -#endif /* FIXED_POINT */ -#endif /* MATHOPS_H */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/mdct.c b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/mdct.c deleted file mode 100644 index 90a214ad..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/mdct.c +++ /dev/null @@ -1,311 +0,0 @@ -/* 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 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" - -#ifdef CUSTOM_MODES - -int clt_mdct_init(mdct_lookup *l,int N, int maxshift) -{ - int i; - int N4; - kiss_twiddle_scalar *trig; -#if defined(FIXED_POINT) - int N2=N>>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); - else - l->kfft[i] = opus_fft_alloc_twiddles(N>>2>>i, 0, 0, l->kfft[0]); -#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)); - if (l->trig==NULL) - return 0; - /* 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)); -#else - for (i=0;i<=N4;i++) - trig[i] = (kiss_twiddle_scalar)cos(2*PI*i/N); -#endif - return 1; -} - -void clt_mdct_clear(mdct_lookup *l) -{ - int i; - for (i=0;i<=l->maxshift;i++) - opus_fft_free(l->kfft[i]); - 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) -{ - int i; - int N, N2, N4; - kiss_twiddle_scalar sine; - VARDECL(kiss_fft_scalar, f); - VARDECL(kiss_fft_scalar, f2); - SAVE_STACK; - N = l->n; - N >>= shift; - 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 - - /* 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(;itrig[0]; - for(i=0;ikfft[shift], (kiss_fft_cpx *)f, (kiss_fft_cpx *)f2); - - /* Post-rotate */ - { - /* Temp pointers to make it really clear to the compiler what we're doing */ - const kiss_fft_scalar * 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]; - /* Temp pointers to make it really clear to the compiler what we're doing */ - for(i=0;in; - N >>= shift; - N2 = N>>1; - N4 = N>>2; - 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]; - for(i=0;ikfft[shift], (kiss_fft_cpx *)f2, (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 = &l->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<>EC_SYM_BITS) -/*The number of bits available for the last, partial symbol in the code field.*/ -# define EC_CODE_EXTRA ((EC_CODE_BITS-2)%EC_SYM_BITS+1) -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/modes.c b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/modes.c deleted file mode 100644 index 42e68e1c..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/modes.c +++ /dev/null @@ -1,438 +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 */ -/* - 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.h" -#include "modes.h" -#include "rate.h" -#include "os_support.h" -#include "stack_alloc.h" -#include "quant_bands.h" - -static const opus_int16 eband5ms[] = { -/*0 200 400 600 800 1k 1.2 1.4 1.6 2k 2.4 2.8 3.2 4k 4.8 5.6 6.8 8k 9.6 12k 15.6 */ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 34, 40, 48, 60, 78, 100 -}; - -/* Alternate tuning (partially derived from Vorbis) */ -#define BITALLOC_SIZE 11 -/* Bit allocation table in units of 1/32 bit/sample (0.1875 dB SNR) */ -static const unsigned char band_allocation[] = { -/*0 200 400 600 800 1k 1.2 1.4 1.6 2k 2.4 2.8 3.2 4k 4.8 5.6 6.8 8k 9.6 12k 15.6 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 90, 80, 75, 69, 63, 56, 49, 40, 34, 29, 20, 18, 10, 0, 0, 0, 0, 0, 0, 0, 0, -110,100, 90, 84, 78, 71, 65, 58, 51, 45, 39, 32, 26, 20, 12, 0, 0, 0, 0, 0, 0, -118,110,103, 93, 86, 80, 75, 70, 65, 59, 53, 47, 40, 31, 23, 15, 4, 0, 0, 0, 0, -126,119,112,104, 95, 89, 83, 78, 72, 66, 60, 54, 47, 39, 32, 25, 17, 12, 1, 0, 0, -134,127,120,114,103, 97, 91, 85, 78, 72, 66, 60, 54, 47, 41, 35, 29, 23, 16, 10, 1, -144,137,130,124,113,107,101, 95, 88, 82, 76, 70, 64, 57, 51, 45, 39, 33, 26, 15, 1, -152,145,138,132,123,117,111,105, 98, 92, 86, 80, 74, 67, 61, 55, 49, 43, 36, 20, 1, -162,155,148,142,133,127,121,115,108,102, 96, 90, 84, 77, 71, 65, 59, 53, 46, 30, 1, -172,165,158,152,143,137,131,125,118,112,106,100, 94, 87, 81, 75, 69, 63, 56, 45, 20, -200,200,200,200,200,200,200,200,198,193,188,183,178,173,168,163,158,153,148,129,104, -}; - -#ifndef CUSTOM_MODES_ONLY - #ifdef FIXED_POINT - #include "static_modes_fixed.h" - #else - #include "static_modes_float.h" - #endif -#endif /* CUSTOM_MODES_ONLY */ - -#ifndef M_PI -#define M_PI 3.141592653 -#endif - -#ifdef CUSTOM_MODES - -/* Defining 25 critical bands for the full 0-20 kHz audio bandwidth - Taken from http://ccrma.stanford.edu/~jos/bbt/Bark_Frequency_Scale.html */ -#define BARK_BANDS 25 -static const opus_int16 bark_freq[BARK_BANDS+1] = { - 0, 100, 200, 300, 400, - 510, 630, 770, 920, 1080, - 1270, 1480, 1720, 2000, 2320, - 2700, 3150, 3700, 4400, 5300, - 6400, 7700, 9500, 12000, 15500, - 20000}; - -static opus_int16 *compute_ebands(opus_int32 Fs, int frame_size, int res, int *nbEBands) -{ - opus_int16 *eBands; - int i, j, lin, low, high, nBark, offset=0; - - /* All modes that have 2.5 ms short blocks use the same definition */ - if (Fs == 400*(opus_int32)frame_size) - { - *nbEBands = sizeof(eband5ms)/sizeof(eband5ms[0])-1; - eBands = opus_alloc(sizeof(opus_int16)*(*nbEBands+1)); - for (i=0;i<*nbEBands+1;i++) - eBands[i] = eband5ms[i]; - return eBands; - } - /* Find the number of critical bands supported by our sampling rate */ - for (nBark=1;nBark= Fs) - break; - - /* Find where the linear part ends (i.e. where the spacing is more than min_width */ - for (lin=0;lin= res) - break; - - low = (bark_freq[lin]+res/2)/res; - high = nBark-lin; - *nbEBands = low+high; - eBands = opus_alloc(sizeof(opus_int16)*(*nbEBands+2)); - - if (eBands==NULL) - return NULL; - - /* Linear spacing (min_width) */ - for (i=0;i0) - offset = eBands[low-1]*res - bark_freq[lin-1]; - /* Spacing follows critical bands */ - for (i=0;i frame_size) - eBands[*nbEBands] = frame_size; - for (i=1;i<*nbEBands-1;i++) - { - if (eBands[i+1]-eBands[i] < eBands[i]-eBands[i-1]) - { - eBands[i] -= (2*eBands[i]-eBands[i-1]-eBands[i+1])/2; - } - } - /* Remove any empty bands. */ - for (i=j=0;i<*nbEBands;i++) - if(eBands[i+1]>eBands[j]) - eBands[++j]=eBands[i+1]; - *nbEBands=j; - - for (i=1;i<*nbEBands;i++) - { - /* Every band must be smaller than the last band. */ - celt_assert(eBands[i]-eBands[i-1]<=eBands[*nbEBands]-eBands[*nbEBands-1]); - /* Each band must be no larger than twice the size of the previous one. */ - celt_assert(eBands[i+1]-eBands[i]<=2*(eBands[i]-eBands[i-1])); - } - - return eBands; -} - -static void compute_allocation_table(CELTMode *mode) -{ - int i, j; - unsigned char *allocVectors; - int maxBands = sizeof(eband5ms)/sizeof(eband5ms[0])-1; - - mode->nbAllocVectors = BITALLOC_SIZE; - allocVectors = opus_alloc(sizeof(unsigned char)*(BITALLOC_SIZE*mode->nbEBands)); - if (allocVectors==NULL) - return; - - /* Check for standard mode */ - if (mode->Fs == 400*(opus_int32)mode->shortMdctSize) - { - for (i=0;inbEBands;i++) - allocVectors[i] = band_allocation[i]; - mode->allocVectors = allocVectors; - return; - } - /* If not the standard mode, interpolate */ - /* Compute per-codec-band allocation from per-critical-band matrix */ - for (i=0;inbEBands;j++) - { - int k; - for (k=0;k mode->eBands[j]*(opus_int32)mode->Fs/mode->shortMdctSize) - break; - } - if (k>maxBands-1) - allocVectors[i*mode->nbEBands+j] = band_allocation[i*maxBands + maxBands-1]; - else { - opus_int32 a0, a1; - a1 = mode->eBands[j]*(opus_int32)mode->Fs/mode->shortMdctSize - 400*(opus_int32)eband5ms[k-1]; - a0 = 400*(opus_int32)eband5ms[k] - mode->eBands[j]*(opus_int32)mode->Fs/mode->shortMdctSize; - allocVectors[i*mode->nbEBands+j] = (a0*band_allocation[i*maxBands+k-1] - + a1*band_allocation[i*maxBands+k])/(a0+a1); - } - } - } - - /*printf ("\n"); - for (i=0;inbEBands;j++) - printf ("%d ", allocVectors[i*mode->nbEBands+j]); - printf ("\n"); - } - exit(0);*/ - - mode->allocVectors = allocVectors; -} - -#endif /* CUSTOM_MODES */ - -CELTMode *opus_custom_mode_create(opus_int32 Fs, int frame_size, int *error) -{ - int i; -#ifdef CUSTOM_MODES - CELTMode *mode=NULL; - int res; - opus_val16 *window; - opus_int16 *logN; - int LM; - ALLOC_STACK; -#if !defined(VAR_ARRAYS) && !defined(USE_ALLOCA) - if (global_stack==NULL) - goto failure; -#endif -#endif - -#ifndef CUSTOM_MODES_ONLY - for (i=0;iFs && - (frame_size<shortMdctSize*static_mode_list[i]->nbShortMdcts) - { - if (error) - *error = OPUS_OK; - return (CELTMode*)static_mode_list[i]; - } - } - } -#endif /* CUSTOM_MODES_ONLY */ - -#ifndef CUSTOM_MODES - if (error) - *error = OPUS_BAD_ARG; - return NULL; -#else - - /* The good thing here is that permutation of the arguments will automatically be invalid */ - - if (Fs < 8000 || Fs > 96000) - { - if (error) - *error = OPUS_BAD_ARG; - return NULL; - } - if (frame_size < 40 || frame_size > 1024 || frame_size%2!=0) - { - if (error) - *error = OPUS_BAD_ARG; - return NULL; - } - /* Frames of less than 1ms are not supported. */ - if ((opus_int32)frame_size*1000 < Fs) - { - if (error) - *error = OPUS_BAD_ARG; - return NULL; - } - - if ((opus_int32)frame_size*75 >= Fs && (frame_size%16)==0) - { - LM = 3; - } else if ((opus_int32)frame_size*150 >= Fs && (frame_size%8)==0) - { - LM = 2; - } else if ((opus_int32)frame_size*300 >= Fs && (frame_size%4)==0) - { - LM = 1; - } else - { - LM = 0; - } - - /* Shorts longer than 3.3ms are not supported. */ - if ((opus_int32)(frame_size>>LM)*300 > Fs) - { - if (error) - *error = OPUS_BAD_ARG; - return NULL; - } - - mode = opus_alloc(sizeof(CELTMode)); - if (mode==NULL) - goto failure; - mode->Fs = Fs; - - /* Pre/de-emphasis depends on sampling rate. The "standard" pre-emphasis - is defined as A(z) = 1 - 0.85*z^-1 at 48 kHz. Other rates should - approximate that. */ - if(Fs < 12000) /* 8 kHz */ - { - mode->preemph[0] = QCONST16(0.3500061035f, 15); - mode->preemph[1] = -QCONST16(0.1799926758f, 15); - mode->preemph[2] = QCONST16(0.2719968125f, SIG_SHIFT); /* exact 1/preemph[3] */ - mode->preemph[3] = QCONST16(3.6765136719f, 13); - } else if(Fs < 24000) /* 16 kHz */ - { - mode->preemph[0] = QCONST16(0.6000061035f, 15); - mode->preemph[1] = -QCONST16(0.1799926758f, 15); - mode->preemph[2] = QCONST16(0.4424998650f, SIG_SHIFT); /* exact 1/preemph[3] */ - mode->preemph[3] = QCONST16(2.2598876953f, 13); - } else if(Fs < 40000) /* 32 kHz */ - { - mode->preemph[0] = QCONST16(0.7799987793f, 15); - mode->preemph[1] = -QCONST16(0.1000061035f, 15); - mode->preemph[2] = QCONST16(0.7499771125f, SIG_SHIFT); /* exact 1/preemph[3] */ - mode->preemph[3] = QCONST16(1.3333740234f, 13); - } else /* 48 kHz */ - { - mode->preemph[0] = QCONST16(0.8500061035f, 15); - mode->preemph[1] = QCONST16(0.0f, 15); - mode->preemph[2] = QCONST16(1.f, SIG_SHIFT); - mode->preemph[3] = QCONST16(1.f, 13); - } - - mode->maxLM = LM; - mode->nbShortMdcts = 1<shortMdctSize = frame_size/mode->nbShortMdcts; - res = (mode->Fs+mode->shortMdctSize)/(2*mode->shortMdctSize); - - mode->eBands = 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) - mode->effEBands--; - - /* Overlap must be divisible by 4 */ - mode->overlap = ((mode->shortMdctSize>>2)<<2); - - compute_allocation_table(mode); - if (mode->allocVectors==NULL) - goto failure; - - window = (opus_val16*)opus_alloc(mode->overlap*sizeof(opus_val16)); - if (window==NULL) - goto failure; - -#ifndef FIXED_POINT - for (i=0;ioverlap;i++) - window[i] = Q15ONE*sin(.5*M_PI* sin(.5*M_PI*(i+.5)/mode->overlap) * sin(.5*M_PI*(i+.5)/mode->overlap)); -#else - for (i=0;ioverlap;i++) - window[i] = MIN32(32767,floor(.5+32768.*sin(.5*M_PI* sin(.5*M_PI*(i+.5)/mode->overlap) * sin(.5*M_PI*(i+.5)/mode->overlap)))); -#endif - mode->window = window; - - logN = (opus_int16*)opus_alloc(mode->nbEBands*sizeof(opus_int16)); - if (logN==NULL) - goto failure; - - for (i=0;inbEBands;i++) - logN[i] = log2_frac(mode->eBands[i+1]-mode->eBands[i], BITRES); - mode->logN = logN; - - compute_pulse_cache(mode, mode->maxLM); - - if (clt_mdct_init(&mode->mdct, 2*mode->shortMdctSize*mode->nbShortMdcts, - mode->maxLM) == 0) - goto failure; - - if (error) - *error = OPUS_OK; - - return mode; -failure: - if (error) - *error = OPUS_ALLOC_FAIL; - if (mode!=NULL) - opus_custom_mode_destroy(mode); - return NULL; -#endif /* !CUSTOM_MODES */ -} - -#ifdef CUSTOM_MODES -void opus_custom_mode_destroy(CELTMode *mode) -{ - if (mode == NULL) - return; -#ifndef CUSTOM_MODES_ONLY - { - int i; - for (i=0;ieBands); - opus_free((opus_int16*)mode->allocVectors); - - opus_free((opus_val16*)mode->window); - opus_free((opus_int16*)mode->logN); - - 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); - - opus_free((CELTMode *)mode); -} -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/modes.h b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/modes.h deleted file mode 100644 index c8340f98..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/modes.h +++ /dev/null @@ -1,83 +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 */ -/* - 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 MODES_H -#define MODES_H - -#include "opus_types.h" -#include "celt.h" -#include "arch.h" -#include "mdct.h" -#include "entenc.h" -#include "entdec.h" - -#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; - const unsigned char *bits; - const unsigned char *caps; -} PulseCache; - -/** Mode definition (opaque) - @brief Mode definition - */ -struct OpusCustomMode { - opus_int32 Fs; - int overlap; - - int nbEBands; - int effEBands; - opus_val16 preemph[4]; - const opus_int16 *eBands; /**< Definition for each "pseudo-critical band" */ - - int maxLM; - int nbShortMdcts; - int shortMdctSize; - - int nbAllocVectors; /**< Number of lines in the matrix below */ - const unsigned char *allocVectors; /**< Number of bits in each band for several rates */ - const opus_int16 *logN; - - const opus_val16 *window; - mdct_lookup mdct; - PulseCache cache; -}; - - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/opus_custom_demo.c b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/opus_custom_demo.c deleted file mode 100644 index ae41c0de..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/opus_custom_demo.c +++ /dev/null @@ -1,210 +0,0 @@ -/* Copyright (c) 2007-2008 CSIRO - Copyright (c) 2007-2009 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_custom.h" -#include "arch.h" -#include -#include -#include -#include - -#define MAX_PACKET 1275 - -int main(int argc, char *argv[]) -{ - int err; - char *inFile, *outFile; - FILE *fin, *fout; - OpusCustomMode *mode=NULL; - OpusCustomEncoder *enc; - OpusCustomDecoder *dec; - int len; - opus_int32 frame_size, channels, rate; - int bytes_per_packet; - unsigned char data[MAX_PACKET]; - int complexity; -#if !(defined (FIXED_POINT) && !defined(CUSTOM_MODES)) && defined(RESYNTH) - int i; - double rmsd = 0; -#endif - int count = 0; - opus_int32 skip; - opus_int16 *in, *out; - if (argc != 9 && argc != 8 && argc != 7) - { - fprintf (stderr, "Usage: test_opus_custom " - " [ [packet loss rate]] " - " \n"); - return 1; - } - - rate = (opus_int32)atol(argv[1]); - channels = atoi(argv[2]); - frame_size = atoi(argv[3]); - mode = opus_custom_mode_create(rate, frame_size, NULL); - if (mode == NULL) - { - fprintf(stderr, "failed to create a mode\n"); - return 1; - } - - bytes_per_packet = atoi(argv[4]); - if (bytes_per_packet < 0 || bytes_per_packet > MAX_PACKET) - { - fprintf (stderr, "bytes per packet must be between 0 and %d\n", - MAX_PACKET); - return 1; - } - - inFile = argv[argc-2]; - fin = fopen(inFile, "rb"); - if (!fin) - { - fprintf (stderr, "Could not open input file %s\n", argv[argc-2]); - return 1; - } - outFile = argv[argc-1]; - fout = fopen(outFile, "wb+"); - if (!fout) - { - fprintf (stderr, "Could not open output file %s\n", argv[argc-1]); - fclose(fin); - return 1; - } - - enc = opus_custom_encoder_create(mode, channels, &err); - if (err != 0) - { - fprintf(stderr, "Failed to create the encoder: %s\n", opus_strerror(err)); - fclose(fin); - fclose(fout); - return 1; - } - dec = opus_custom_decoder_create(mode, channels, &err); - if (err != 0) - { - fprintf(stderr, "Failed to create the decoder: %s\n", opus_strerror(err)); - fclose(fin); - fclose(fout); - return 1; - } - opus_custom_decoder_ctl(dec, OPUS_GET_LOOKAHEAD(&skip)); - - if (argc>7) - { - complexity=atoi(argv[5]); - opus_custom_encoder_ctl(enc,OPUS_SET_COMPLEXITY(complexity)); - } - - in = (opus_int16*)malloc(frame_size*channels*sizeof(opus_int16)); - out = (opus_int16*)malloc(frame_size*channels*sizeof(opus_int16)); - - while (!feof(fin)) - { - int ret; - err = fread(in, sizeof(short), frame_size*channels, fin); - if (feof(fin)) - break; - len = opus_custom_encode(enc, in, frame_size, data, bytes_per_packet); - if (len <= 0) - fprintf (stderr, "opus_custom_encode() failed: %s\n", opus_strerror(len)); - - /* This is for simulating bit errors */ -#if 0 - int errors = 0; - int eid = 0; - /* This simulates random bit error */ - for (i=0;i 0) - { - rmsd = sqrt(rmsd/(1.0*frame_size*channels*count)); - fprintf (stderr, "Error: encoder doesn't match decoder\n"); - fprintf (stderr, "RMS mismatch is %f\n", rmsd); - return 1; - } else { - fprintf (stderr, "Encoder matches decoder!!\n"); - } -#endif - return 0; -} - diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/os_support.h b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/os_support.h deleted file mode 100644 index 5e47e3cf..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/os_support.h +++ /dev/null @@ -1,92 +0,0 @@ -/* Copyright (C) 2007 Jean-Marc Valin - - File: os_support.h - This is the (tiny) OS abstraction layer. Aside from math.h, this is the - only place where system headers are allowed. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. 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 AUTHOR ``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 AUTHOR 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 OS_SUPPORT_H -#define OS_SUPPORT_H - -#ifdef CUSTOM_SUPPORT -# 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 OPUS_INLINE void *opus_alloc (size_t size) -{ - return malloc(size); -} -#endif - -/** 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 OPUS_INLINE void *opus_alloc_scratch (size_t size) -{ - /* Scratch space doesn't need to be cleared */ - return opus_alloc(size); -} -#endif - -/** 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 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 */ -#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 - 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 */ -#ifndef OVERRIDE_OPUS_CLEAR -#define OPUS_CLEAR(dst, n) (memset((dst), 0, (n)*sizeof(*(dst)))) -#endif - -/*#ifdef __GNUC__ -#pragma GCC poison printf sprintf -#pragma GCC poison malloc free realloc calloc -#endif*/ - -#endif /* OS_SUPPORT_H */ - diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/pitch.c b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/pitch.c deleted file mode 100644 index d2b30544..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/pitch.c +++ /dev/null @@ -1,537 +0,0 @@ -/* Copyright (c) 2007-2008 CSIRO - Copyright (c) 2007-2009 Xiph.Org Foundation - Written by Jean-Marc Valin */ -/** - @file pitch.c - @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. -*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "pitch.h" -#include "os_support.h" -#include "modes.h" -#include "stack_alloc.h" -#include "mathops.h" -#include "celt_lpc.h" - -static void find_best_pitch(opus_val32 *xcorr, opus_val16 *y, int len, - int max_pitch, int *best_pitch -#ifdef FIXED_POINT - , int yshift, opus_val32 maxcorr -#endif - ) -{ - int i, j; - opus_val32 Syy=1; - opus_val16 best_num[2]; - opus_val32 best_den[2]; -#ifdef FIXED_POINT - int xshift; - - xshift = celt_ilog2(maxcorr)-14; -#endif - - best_num[0] = -1; - best_num[1] = -1; - best_den[0] = 0; - best_den[1] = 0; - best_pitch[0] = 0; - best_pitch[1] = 1; - for (j=0;j0) - { - opus_val16 num; - opus_val32 xcorr16; - xcorr16 = EXTRACT16(VSHR32(xcorr[i], xshift)); -#ifndef FIXED_POINT - /* Considering the range of xcorr16, this should avoid both underflows - and overflows (inf) when squaring xcorr16 */ - xcorr16 *= 1e-12f; -#endif - num = MULT16_16_Q15(xcorr16,xcorr16); - if (MULT16_32_Q15(num,best_den[1]) > MULT16_32_Q15(best_num[1],Syy)) - { - if (MULT16_32_Q15(num,best_den[0]) > MULT16_32_Q15(best_num[0],Syy)) - { - best_num[1] = best_num[0]; - best_den[1] = best_den[0]; - best_pitch[1] = best_pitch[0]; - best_num[0] = num; - best_den[0] = Syy; - best_pitch[0] = i; - } else { - best_num[1] = num; - best_den[1] = Syy; - best_pitch[1] = i; - } - } - } - Syy += SHR32(MULT16_16(y[i+len],y[i+len]),yshift) - SHR32(MULT16_16(y[i],y[i]),yshift); - Syy = MAX32(1, Syy); - } -} - -static void celt_fir5(const opus_val16 *x, - const opus_val16 *num, - opus_val16 *y, - int N, - opus_val16 *mem) -{ - 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=mem[0]; - mem1=mem[1]; - mem2=mem[2]; - mem3=mem[3]; - mem4=mem[4]; - for (i=0;i>1;i++) - x_lp[i] = SHR32(HALF32(HALF32(x[0][(2*i-1)]+x[0][(2*i+1)])+x[0][2*i]), shift); - x_lp[0] = SHR32(HALF32(HALF32(x[0][1])+x[0][0]), shift); - if (C==2) - { - for (i=1;i>1;i++) - x_lp[i] += SHR32(HALF32(HALF32(x[1][(2*i-1)]+x[1][(2*i+1)])+x[1][2*i]), shift); - x_lp[0] += SHR32(HALF32(HALF32(x[1][1])+x[1][0]), shift); - } - - _celt_autocorr(x_lp, ac, NULL, 0, - 4, len>>1, arch); - - /* 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<=4;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, ac, 4); - for (i=0;i<4;i++) - { - tmp = MULT16_16_Q15(QCONST16(.9f,15), tmp); - lpc[i] = MULT16_16_Q15(lpc[i], tmp); - } - /* 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, x_lp, len>>1, mem); -} - -#if 0 /* This is a simple version of the pitch correlation that should work - well on DSPs like Blackfin and TI C5x/C6x */ - -#ifdef FIXED_POINT -opus_val32 -#else -void -#endif -celt_pitch_xcorr(opus_val16 *x, opus_val16 *y, opus_val32 *xcorr, int len, int max_pitch) -{ - int i, j; -#ifdef FIXED_POINT - opus_val32 maxcorr=1; -#endif - for (i=0;i0); - celt_assert((((unsigned char *)_x-(unsigned char *)NULL)&3)==0); -#ifdef FIXED_POINT - opus_val32 maxcorr=1; -#endif - for (i=0;i0); - celt_assert(max_pitch>0); - lag = len+max_pitch; - - ALLOC(x_lp4, len>>2, opus_val16); - ALLOC(y_lp4, lag>>2, opus_val16); - ALLOC(xcorr, max_pitch>>1, opus_val32); - - /* Downsample by 2 again */ - for (j=0;j>2;j++) - x_lp4[j] = x_lp[2*j]; - for (j=0;j>2;j++) - y_lp4[j] = y[2*j]; - -#ifdef FIXED_POINT - xmax = celt_maxabs16(x_lp4, len>>2); - ymax = celt_maxabs16(y_lp4, lag>>2); - shift = celt_ilog2(MAX32(1, MAX32(xmax, ymax)))-11; - if (shift>0) - { - for (j=0;j>2;j++) - x_lp4[j] = SHR16(x_lp4[j], shift); - for (j=0;j>2;j++) - y_lp4[j] = SHR16(y_lp4[j], shift); - /* Use double the shift for a MAC */ - shift *= 2; - } else { - shift = 0; - } -#endif - - /* Coarse search with 4x decimation */ - -#ifdef FIXED_POINT - 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 -#endif - ); - - /* Finer search with 2x decimation */ -#ifdef FIXED_POINT - maxcorr=1; -#endif - for (i=0;i>1;i++) - { - opus_val32 sum=0; - xcorr[i] = 0; - if (abs(i-2*best_pitch[0])>2 && abs(i-2*best_pitch[1])>2) - continue; - for (j=0;j>1;j++) - sum += SHR32(MULT16_16(x_lp[j],y[i+j]), shift); - xcorr[i] = MAX32(-1, sum); -#ifdef FIXED_POINT - maxcorr = MAX32(maxcorr, sum); -#endif - } - find_best_pitch(xcorr, y, len>>1, max_pitch>>1, best_pitch -#ifdef FIXED_POINT - , shift+1, maxcorr -#endif - ); - - /* Refine by pseudo-interpolation */ - if (best_pitch[0]>0 && best_pitch[0]<(max_pitch>>1)-1) - { - opus_val32 a, b, c; - a = xcorr[best_pitch[0]-1]; - b = xcorr[best_pitch[0]]; - c = xcorr[best_pitch[0]+1]; - if ((c-a) > MULT16_32_Q15(QCONST16(.7f,15),b-a)) - offset = 1; - else if ((a-c) > MULT16_32_Q15(QCONST16(.7f,15),b-c)) - offset = -1; - else - offset = 0; - } else { - offset = 0; - } - *pitch = 2*best_pitch[0]-offset; - - RESTORE_STACK; -} - -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 k, i, T, T0; - opus_val16 g, g0; - opus_val16 pg; - 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; - minperiod /= 2; - *T0_ /= 2; - prev_period /= 2; - N /= 2; - x += maxperiod; - if (*T0_>=maxperiod) - *T0_=maxperiod-1; - - T = T0 = *T0_; - ALLOC(yy_lookup, maxperiod+1, opus_val32); - dual_inner_prod(x, x, x-T0, N, &xx, &xy); - yy_lookup[0] = xx; - yy=xx; - for (i=1;i<=maxperiod;i++) - { - yy = yy+MULT16_16(x[-i],x[-i])-MULT16_16(x[N-i],x[N-i]); - yy_lookup[i] = MAX32(0, yy); - } - yy = yy_lookup[T0]; - best_xy = xy; - best_yy = yy; -#ifdef FIXED_POINT - { - opus_val32 x2y2; - int sh, t; - x2y2 = 1+HALF32(MULT32_32_Q31(xx,yy)); - sh = celt_ilog2(x2y2)>>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 - /* Look for any pitch at T/k */ - for (k=2;k<=15;k++) - { - int T1, T1b; - opus_val16 g1; - opus_val16 cont=0; - opus_val16 thresh; - T1 = (2*T0+k)/(2*k); - if (T1 < minperiod) - break; - /* Look for another strong correlation at T1b */ - if (k==2) - { - if (T1+T0>maxperiod) - T1b = T0; - else - T1b = T0+T1; - } else - { - T1b = (2*second_check[k]*T0+k)/(2*k); - } - dual_inner_prod(x, &x[-T1], &x[-T1b], N, &xy, &xy2); - xy += xy2; - yy = yy_lookup[T1] + yy_lookup[T1b]; -#ifdef FIXED_POINT - { - opus_val32 x2y2; - int sh, t; - x2y2 = 1+MULT32_32_Q31(xx,yy); - sh = celt_ilog2(x2y2)>>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 - if (abs(T1-prev_period)<=1) - cont = prev_gain; - else if (abs(T1-prev_period)<=2 && 5*k*k < T0) - cont = HALF32(prev_gain); - else - cont = 0; - 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; - T = T1; - g = g1; - } - } - best_xy = MAX32(0, best_xy); - if (best_yy <= best_xy) - pg = Q15ONE; - else - 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])) - offset = -1; - else - offset = 0; - if (pg > g) - pg = g; - *T0_ = 2*T+offset; - - 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 -#include "os_support.h" -#include "arch.h" -#include "mathops.h" -#include "stack_alloc.h" -#include "rate.h" - -#ifdef FIXED_POINT -/* Mean energy in each band quantized in Q4 */ -const signed char eMeans[25] = { - 103,100, 92, 85, 81, - 77, 72, 70, 78, 75, - 73, 71, 78, 74, 69, - 72, 70, 74, 76, 71, - 60, 60, 60, 60, 60 -}; -#else -/* Mean energy in each band quantized in Q4 and converted back to float */ -const opus_val16 eMeans[25] = { - 6.437500f, 6.250000f, 5.750000f, 5.312500f, 5.062500f, - 4.812500f, 4.500000f, 4.375000f, 4.875000f, 4.687500f, - 4.562500f, 4.437500f, 4.875000f, 4.625000f, 4.312500f, - 4.500000f, 4.375000f, 4.625000f, 4.750000f, 4.437500f, - 3.750000f, 3.750000f, 3.750000f, 3.750000f, 3.750000f -}; -#endif -/* prediction coefficients: 0.9, 0.8, 0.65, 0.5 */ -#ifdef FIXED_POINT -static const opus_val16 pred_coef[4] = {29440, 26112, 21248, 16384}; -static const opus_val16 beta_coef[4] = {30147, 22282, 12124, 6554}; -static const opus_val16 beta_intra = 4915; -#else -static const opus_val16 pred_coef[4] = {29440/32768., 26112/32768., 21248/32768., 16384/32768.}; -static const opus_val16 beta_coef[4] = {30147/32768., 22282/32768., 12124/32768., 6554/32768.}; -static const opus_val16 beta_intra = 4915/32768.; -#endif - -/*Parameters of the Laplace-like probability models used for the coarse energy. - There is one pair of parameters for each frame size, prediction type - (inter/intra), and band number. - The first number of each pair is the probability of 0, and the second is the - decay rate, both in Q8 precision.*/ -static const unsigned char e_prob_model[4][2][42] = { - /*120 sample frames.*/ - { - /*Inter*/ - { - 72, 127, 65, 129, 66, 128, 65, 128, 64, 128, 62, 128, 64, 128, - 64, 128, 92, 78, 92, 79, 92, 78, 90, 79, 116, 41, 115, 40, - 114, 40, 132, 26, 132, 26, 145, 17, 161, 12, 176, 10, 177, 11 - }, - /*Intra*/ - { - 24, 179, 48, 138, 54, 135, 54, 132, 53, 134, 56, 133, 55, 132, - 55, 132, 61, 114, 70, 96, 74, 88, 75, 88, 87, 74, 89, 66, - 91, 67, 100, 59, 108, 50, 120, 40, 122, 37, 97, 43, 78, 50 - } - }, - /*240 sample frames.*/ - { - /*Inter*/ - { - 83, 78, 84, 81, 88, 75, 86, 74, 87, 71, 90, 73, 93, 74, - 93, 74, 109, 40, 114, 36, 117, 34, 117, 34, 143, 17, 145, 18, - 146, 19, 162, 12, 165, 10, 178, 7, 189, 6, 190, 8, 177, 9 - }, - /*Intra*/ - { - 23, 178, 54, 115, 63, 102, 66, 98, 69, 99, 74, 89, 71, 91, - 73, 91, 78, 89, 86, 80, 92, 66, 93, 64, 102, 59, 103, 60, - 104, 60, 117, 52, 123, 44, 138, 35, 133, 31, 97, 38, 77, 45 - } - }, - /*480 sample frames.*/ - { - /*Inter*/ - { - 61, 90, 93, 60, 105, 42, 107, 41, 110, 45, 116, 38, 113, 38, - 112, 38, 124, 26, 132, 27, 136, 19, 140, 20, 155, 14, 159, 16, - 158, 18, 170, 13, 177, 10, 187, 8, 192, 6, 175, 9, 159, 10 - }, - /*Intra*/ - { - 21, 178, 59, 110, 71, 86, 75, 85, 84, 83, 91, 66, 88, 73, - 87, 72, 92, 75, 98, 72, 105, 58, 107, 54, 115, 52, 114, 55, - 112, 56, 129, 51, 132, 40, 150, 33, 140, 29, 98, 35, 77, 42 - } - }, - /*960 sample frames.*/ - { - /*Inter*/ - { - 42, 121, 96, 66, 108, 43, 111, 40, 117, 44, 123, 32, 120, 36, - 119, 33, 127, 33, 134, 34, 139, 21, 147, 23, 152, 20, 158, 25, - 154, 26, 166, 21, 173, 16, 184, 13, 184, 10, 150, 13, 139, 15 - }, - /*Intra*/ - { - 22, 178, 63, 114, 74, 82, 84, 83, 92, 82, 103, 62, 96, 72, - 96, 67, 101, 73, 107, 72, 113, 55, 118, 52, 125, 52, 118, 52, - 117, 55, 135, 49, 137, 39, 157, 32, 145, 29, 97, 33, 77, 40 - } - } -}; - -static const unsigned char small_energy_icdf[3]={2,1,0}; - -static opus_val32 loss_distortion(const opus_val16 *eBands, opus_val16 *oldEBands, int start, int end, int len, int C) -{ - int c, i; - opus_val32 dist = 0; - c=0; do { - for (i=start;inbEBands]; - oldE = MAX16(-QCONST16(9.f,DB_SHIFT), oldEBands[i+c*m->nbEBands]); -#ifdef FIXED_POINT - f = SHL32(EXTEND32(x),7) - PSHR32(MULT16_16(coef,oldE), 8) - prev[c]; - /* Rounding to nearest integer here is really important! */ - qi = (f+QCONST32(.5f,DB_SHIFT+7))>>(DB_SHIFT+7); - decay_bound = EXTRACT16(MAX32(-QCONST16(28.f,DB_SHIFT), - SUB32((opus_val32)oldEBands[i+c*m->nbEBands],max_decay))); -#else - f = x-coef*oldE-prev[c]; - /* Rounding to nearest integer here is really important! */ - qi = (int)floor(.5f+f); - decay_bound = MAX16(-QCONST16(28.f,DB_SHIFT), oldEBands[i+c*m->nbEBands]) - max_decay; -#endif - /* Prevent the energy from going down too quickly (e.g. for bands - that have just one bin) */ - if (qi < 0 && x < decay_bound) - { - qi += (int)SHR16(SUB16(decay_bound,x), DB_SHIFT); - if (qi > 0) - qi = 0; - } - qi0 = qi; - /* If we don't have enough bits to encode all the energy, just assume - something safe. */ - tell = ec_tell(enc); - bits_left = budget-tell-3*C*(end-i); - if (i!=start && bits_left < 30) - { - if (bits_left < 24) - qi = IMIN(1, qi); - if (bits_left < 16) - qi = IMAX(-1, qi); - } - if (lfe && i>=2) - qi = IMIN(qi, 0); - if (budget-tell >= 15) - { - int pi; - pi = 2*IMIN(i,20); - ec_laplace_encode(enc, &qi, - prob_model[pi]<<7, prob_model[pi+1]<<6); - } - else if(budget-tell >= 2) - { - qi = IMAX(-1, IMIN(qi, 1)); - ec_enc_icdf(enc, 2*qi^-(qi<0), small_energy_icdf, 2); - } - else if(budget-tell >= 1) - { - qi = IMIN(0, qi); - ec_enc_bit_logp(enc, -qi, 1); - } - else - qi = -1; - error[i+c*m->nbEBands] = PSHR32(f,7) - SHL16(qi,DB_SHIFT); - badness += abs(qi0-qi); - q = (opus_val32)SHL32(EXTEND32(qi),DB_SHIFT); - - tmp = PSHR32(MULT16_16(coef,oldE),8) + prev[c] + SHL32(q,7); -#ifdef FIXED_POINT - tmp = MAX32(-QCONST32(28.f, DB_SHIFT+7), tmp); -#endif - oldEBands[i+c*m->nbEBands] = PSHR32(tmp, 7); - prev[c] = prev[c] + SHL32(q,7) - MULT16_16(beta,PSHR32(q,8)); - } while (++c < C); - } - 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 lfe) -{ - int intra; - opus_val16 max_decay; - VARDECL(opus_val16, oldEBands_intra); - VARDECL(opus_val16, error_intra); - ec_enc enc_start_state; - opus_uint32 tell; - int badness1=0; - opus_int32 intra_bias; - opus_val32 new_distortion; - SAVE_STACK; - - intra = force_intra || (!two_pass && *delayedIntra>2*C*(end-start) && nbAvailableBytes > (end-start)*C); - intra_bias = (opus_int32)((budget**delayedIntra*loss_rate)/(C*512)); - new_distortion = loss_distortion(eBands, oldEBands, start, effEnd, m->nbEBands, C); - - tell = ec_tell(enc); - if (tell+3 > budget) - two_pass = intra = 0; - - max_decay = QCONST16(16.f,DB_SHIFT); - if (end-start>10) - { -#ifdef FIXED_POINT - max_decay = MIN32(max_decay, SHL32(EXTEND32(nbAvailableBytes),DB_SHIFT-3)); -#else - max_decay = MIN32(max_decay, .125f*nbAvailableBytes); -#endif - } - if (lfe) - max_decay=3; - enc_start_state = *enc; - - ALLOC(oldEBands_intra, C*m->nbEBands, opus_val16); - ALLOC(error_intra, C*m->nbEBands, opus_val16); - OPUS_COPY(oldEBands_intra, oldEBands, C*m->nbEBands); - - 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, lfe); - } - - if (!intra) - { - unsigned char *intra_buf; - ec_enc enc_intra_state; - opus_int32 tell_intra; - opus_uint32 nstart_bytes; - opus_uint32 nintra_bytes; - opus_uint32 save_bytes; - int badness2; - VARDECL(unsigned char, intra_bits); - - tell_intra = ec_tell_frac(enc); - - enc_intra_state = *enc; - - 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; - 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, lfe); - - if (two_pass && (badness1 < badness2 || (badness1 == badness2 && ((opus_int32)ec_tell_frac(enc))+intra_bias > tell_intra))) - { - *enc = enc_intra_state; - /* Copy intra bits to bit-stream */ - OPUS_COPY(intra_buf, intra_bits, nintra_bytes - nstart_bytes); - OPUS_COPY(oldEBands, oldEBands_intra, C*m->nbEBands); - OPUS_COPY(error, error_intra, C*m->nbEBands); - intra = 1; - } - } else { - OPUS_COPY(oldEBands, oldEBands_intra, C*m->nbEBands); - OPUS_COPY(error, error_intra, C*m->nbEBands); - } - - if (intra) - *delayedIntra = new_distortion; - else - *delayedIntra = ADD32(MULT16_32_Q15(MULT16_16_Q15(pred_coef[LM], pred_coef[LM]),*delayedIntra), - new_distortion); - - RESTORE_STACK; -} - -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) -{ - int i, c; - - /* Encode finer resolution */ - for (i=start;inbEBands]+QCONST16(.5f,DB_SHIFT))>>(DB_SHIFT-fine_quant[i]); -#else - q2 = (int)floor((error[i+c*m->nbEBands]+.5f)*frac); -#endif - if (q2 > frac-1) - q2 = frac-1; - if (q2<0) - q2 = 0; - ec_enc_bits(enc, q2, fine_quant[i]); -#ifdef FIXED_POINT - offset = SUB16(SHR32(SHL32(EXTEND32(q2),DB_SHIFT)+QCONST16(.5f,DB_SHIFT),fine_quant[i]),QCONST16(.5f,DB_SHIFT)); -#else - offset = (q2+.5f)*(1<<(14-fine_quant[i]))*(1.f/16384) - .5f; -#endif - oldEBands[i+c*m->nbEBands] += offset; - error[i+c*m->nbEBands] -= offset; - /*printf ("%f ", error[i] - offset);*/ - } while (++c < C); - } -} - -void quant_energy_finalise(const CELTMode *m, int start, int end, opus_val16 *oldEBands, opus_val16 *error, int *fine_quant, int *fine_priority, int bits_left, ec_enc *enc, int C) -{ - int i, prio, c; - - /* Use up the remaining bits */ - for (prio=0;prio<2;prio++) - { - for (i=start;i=C ;i++) - { - if (fine_quant[i] >= MAX_FINE_BITS || fine_priority[i]!=prio) - continue; - c=0; - do { - int q2; - opus_val16 offset; - q2 = error[i+c*m->nbEBands]<0 ? 0 : 1; - ec_enc_bits(enc, q2, 1); -#ifdef FIXED_POINT - offset = SHR16(SHL16(q2,DB_SHIFT)-QCONST16(.5f,DB_SHIFT),fine_quant[i]+1); -#else - offset = (q2-.5f)*(1<<(14-fine_quant[i]-1))*(1.f/16384); -#endif - oldEBands[i+c*m->nbEBands] += offset; - bits_left--; - } while (++c < C); - } - } -} - -void unquant_coarse_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int intra, ec_dec *dec, int C, int LM) -{ - const unsigned char *prob_model = e_prob_model[LM][intra]; - int i, c; - opus_val32 prev[2] = {0, 0}; - opus_val16 coef; - opus_val16 beta; - opus_int32 budget; - opus_int32 tell; - - if (intra) - { - coef = 0; - beta = beta_intra; - } else { - beta = beta_coef[LM]; - coef = pred_coef[LM]; - } - - budget = dec->storage*8; - - /* Decode at a fixed coarse resolution */ - for (i=start;i=15) - { - int pi; - pi = 2*IMIN(i,20); - qi = ec_laplace_decode(dec, - prob_model[pi]<<7, prob_model[pi+1]<<6); - } - else if(budget-tell>=2) - { - qi = ec_dec_icdf(dec, small_energy_icdf, 2); - qi = (qi>>1)^-(qi&1); - } - else if(budget-tell>=1) - { - qi = -ec_dec_bit_logp(dec, 1); - } - else - qi = -1; - q = (opus_val32)SHL32(EXTEND32(qi),DB_SHIFT); - - oldEBands[i+c*m->nbEBands] = MAX16(-QCONST16(9.f,DB_SHIFT), oldEBands[i+c*m->nbEBands]); - tmp = PSHR32(MULT16_16(coef,oldEBands[i+c*m->nbEBands]),8) + prev[c] + SHL32(q,7); -#ifdef FIXED_POINT - tmp = MAX32(-QCONST32(28.f, DB_SHIFT+7), tmp); -#endif - oldEBands[i+c*m->nbEBands] = PSHR32(tmp, 7); - prev[c] = prev[c] + SHL32(q,7) - MULT16_16(beta,PSHR32(q,8)); - } while (++c < C); - } -} - -void unquant_fine_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int *fine_quant, ec_dec *dec, int C) -{ - int i, c; - /* Decode finer resolution */ - for (i=start;inbEBands] += offset; - } while (++c < C); - } -} - -void unquant_energy_finalise(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int *fine_quant, int *fine_priority, int bits_left, ec_dec *dec, int C) -{ - int i, prio, c; - - /* Use up the remaining bits */ - for (prio=0;prio<2;prio++) - { - for (i=start;i=C ;i++) - { - if (fine_quant[i] >= MAX_FINE_BITS || fine_priority[i]!=prio) - continue; - c=0; - do { - int q2; - opus_val16 offset; - q2 = ec_dec_bits(dec, 1); -#ifdef FIXED_POINT - offset = SHR16(SHL16(q2,DB_SHIFT)-QCONST16(.5f,DB_SHIFT),fine_quant[i]+1); -#else - offset = (q2-.5f)*(1<<(14-fine_quant[i]-1))*(1.f/16384); -#endif - oldEBands[i+c*m->nbEBands] += offset; - bits_left--; - } while (++c < C); - } - } -} - -void amp2Log2(const CELTMode *m, int effEnd, int end, - celt_ener *bandE, opus_val16 *bandLogE, int C) -{ - int c, i; - c=0; - do { - for (i=0;inbEBands] = - celt_log2(SHL32(bandE[i+c*m->nbEBands],2)) - - SHL16((opus_val16)eMeans[i],6); - for (i=effEnd;inbEBands+i] = -QCONST16(14.f,DB_SHIFT); - } while (++c < C); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/quant_bands.h b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/quant_bands.h deleted file mode 100644 index 0490bca4..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/quant_bands.h +++ /dev/null @@ -1,66 +0,0 @@ -/* Copyright (c) 2007-2008 CSIRO - Copyright (c) 2007-2009 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 QUANT_BANDS -#define QUANT_BANDS - -#include "arch.h" -#include "modes.h" -#include "entenc.h" -#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); - -void log2Amp(const CELTMode *m, int start, int end, - celt_ener *eBands, const opus_val16 *oldEBands, int C); - -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 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); - -void quant_energy_finalise(const CELTMode *m, int start, int end, opus_val16 *oldEBands, opus_val16 *error, int *fine_quant, int *fine_priority, int bits_left, ec_enc *enc, int C); - -void unquant_coarse_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int intra, ec_dec *dec, int C, int LM); - -void unquant_fine_energy(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int *fine_quant, ec_dec *dec, int C); - -void unquant_energy_finalise(const CELTMode *m, int start, int end, opus_val16 *oldEBands, int *fine_quant, int *fine_priority, int bits_left, ec_dec *dec, int C); - -#endif /* QUANT_BANDS */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/rate.c b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/rate.c deleted file mode 100644 index e13d839d..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/rate.c +++ /dev/null @@ -1,638 +0,0 @@ -/* Copyright (c) 2007-2008 CSIRO - Copyright (c) 2007-2009 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 -#include "modes.h" -#include "cwrs.h" -#include "arch.h" -#include "os_support.h" - -#include "entcode.h" -#include "rate.h" - -static const unsigned char LOG2_FRAC_TABLE[24]={ - 0, - 8,13, - 16,19,21,23, - 24,26,27,28,29,30,31,32, - 32,33,34,34,35,36,36,37,37 -}; - -#ifdef CUSTOM_MODES - -/*Determines if V(N,K) fits in a 32-bit unsigned integer. - N and K are themselves limited to 15 bits.*/ -static int fits_in32(int _n, int _k) -{ - static const opus_int16 maxN[15] = { - 32767, 32767, 32767, 1476, 283, 109, 60, 40, - 29, 24, 20, 18, 16, 14, 13}; - static const opus_int16 maxK[15] = { - 32767, 32767, 32767, 32767, 1172, 238, 95, 53, - 36, 27, 22, 18, 16, 15, 13}; - if (_n>=14) - { - if (_k>=14) - return 0; - else - return _n <= maxN[_k]; - } else { - return _k <= maxK[_n]; - } -} - -void compute_pulse_cache(CELTMode *m, int LM) -{ - int C; - int i; - int j; - int curr=0; - int nbEntries=0; - int entryN[100], entryK[100], entryI[100]; - const opus_int16 *eBands = m->eBands; - PulseCache *cache = &m->cache; - opus_int16 *cindex; - unsigned char *bits; - unsigned char *cap; - - cindex = (opus_int16 *)opus_alloc(sizeof(cache->index[0])*m->nbEBands*(LM+2)); - cache->index = cindex; - - /* Scan for all unique band sizes */ - for (i=0;i<=LM+1;i++) - { - for (j=0;jnbEBands;j++) - { - int k; - int N = (eBands[j+1]-eBands[j])<>1; - cindex[i*m->nbEBands+j] = -1; - /* Find other bands that have the same size */ - for (k=0;k<=i;k++) - { - int n; - for (n=0;nnbEBands && (k!=i || n>1) - { - cindex[i*m->nbEBands+j] = cindex[k*m->nbEBands+n]; - break; - } - } - } - if (cache->index[i*m->nbEBands+j] == -1 && N!=0) - { - int K; - entryN[nbEntries] = N; - K = 0; - while (fits_in32(N,get_pulses(K+1)) && KnbEBands+j] = curr; - entryI[nbEntries] = curr; - - curr += K+1; - nbEntries++; - } - } - } - bits = (unsigned char *)opus_alloc(sizeof(unsigned char)*curr); - cache->bits = bits; - cache->size = curr; - /* Compute the cache for all unique sizes */ - for (i=0;icaps = cap = (unsigned char *)opus_alloc(sizeof(cache->caps[0])*(LM+1)*2*m->nbEBands); - for (i=0;i<=LM;i++) - { - for (C=1;C<=2;C++) - { - for (j=0;jnbEBands;j++) - { - int N0; - int max_bits; - N0 = m->eBands[j+1]-m->eBands[j]; - /* N=1 bands only have a sign bit and fine bits. */ - if (N0<1 are even, including custom modes.*/ - if (N0 > 2) - { - N0>>=1; - LM0--; - } - /* N0=1 bands can't be split down to N<2. */ - else if (N0 <= 1) - { - LM0=IMIN(i,1); - N0<<=LM0; - } - /* Compute the cost for the lowest-level PVQ of a fully split - band. */ - pcache = bits + cindex[(LM0+1)*m->nbEBands+j]; - max_bits = pcache[pcache[0]]+1; - /* Add in the cost of coding regular splits. */ - N = N0; - for(k=0;klogN[j]+((LM0+k)<>1)-QTHETA_OFFSET; - /* The number of qtheta bits we'll allocate if the remainder - is to be max_bits. - The average measured cost for theta is 0.89701 times qb, - approximated here as 459/512. */ - num=459*(opus_int32)((2*N-1)*offset+max_bits); - den=((opus_int32)(2*N-1)<<9)-459; - qb = IMIN((num+(den>>1))/den, 57); - celt_assert(qb >= 0); - max_bits += qb; - N <<= 1; - } - /* Add in the cost of a stereo split, if necessary. */ - if (C==2) - { - max_bits <<= 1; - offset = ((m->logN[j]+(i<>1)-(N==2?QTHETA_OFFSET_TWOPHASE:QTHETA_OFFSET); - ndof = 2*N-1-(N==2); - /* The average measured cost for theta with the step PDF is - 0.95164 times qb, approximated here as 487/512. */ - num = (N==2?512:487)*(opus_int32)(max_bits+ndof*offset); - den = ((opus_int32)ndof<<9)-(N==2?512:487); - qb = IMIN((num+(den>>1))/den, (N==2?64:61)); - celt_assert(qb >= 0); - max_bits += qb; - } - /* Add the fine bits we'll use. */ - /* Compensate for the extra DoF in stereo */ - ndof = C*N + ((C==2 && N>2) ? 1 : 0); - /* Offset the number of fine bits by log2(N)/2 + FINE_OFFSET - compared to their "fair share" of total/N */ - offset = ((m->logN[j] + (i<>1)-FINE_OFFSET; - /* N=2 is the only point that doesn't match the curve */ - if (N==2) - offset += 1<>2; - /* The number of fine bits we'll allocate if the remainder is - to be max_bits. */ - num = max_bits+ndof*offset; - den = (ndof-1)<>1))/den, MAX_FINE_BITS); - celt_assert(qb >= 0); - max_bits += C*qb<eBands[j+1]-m->eBands[j])<= 0); - celt_assert(max_bits < 256); - *cap++ = (unsigned char)max_bits; - } - } - } -} - -#endif /* CUSTOM_MODES */ - -#define ALLOC_STEPS 6 - -static OPUS_INLINE int interp_bits2pulses(const CELTMode *m, int start, int end, int skip_start, - const int *bits1, const int *bits2, const int *thresh, const int *cap, opus_int32 total, opus_int32 *_balance, - int skip_rsv, int *intensity, int intensity_rsv, int *dual_stereo, int dual_stereo_rsv, int *bits, - int *ebits, int *fine_priority, int C, int LM, ec_ctx *ec, int encode, int prev, int signalBandwidth) -{ - opus_int32 psum; - int lo, hi; - int i, j; - int logM; - int stereo; - int codedBands=-1; - int alloc_floor; - opus_int32 left, percoeff; - int done; - opus_int32 balance; - SAVE_STACK; - - alloc_floor = C<1; - - logM = LM<>1; - psum = 0; - done = 0; - for (j=end;j-->start;) - { - int tmp = bits1[j] + (mid*(opus_int32)bits2[j]>>ALLOC_STEPS); - if (tmp >= thresh[j] || done) - { - done = 1; - /* Don't allocate more than we can actually use */ - psum += IMIN(tmp, cap[j]); - } else { - if (tmp >= alloc_floor) - psum += alloc_floor; - } - } - if (psum > total) - hi = mid; - else - lo = mid; - } - psum = 0; - /*printf ("interp bisection gave %d\n", lo);*/ - done = 0; - for (j=end;j-->start;) - { - int tmp = bits1[j] + (lo*bits2[j]>>ALLOC_STEPS); - if (tmp < thresh[j] && !done) - { - if (tmp >= alloc_floor) - tmp = alloc_floor; - else - tmp = 0; - } else - done = 1; - /* Don't allocate more than we can actually use */ - tmp = IMIN(tmp, cap[j]); - bits[j] = tmp; - psum += tmp; - } - - /* Decide which bands to skip, working backwards from the end. */ - for (codedBands=end;;codedBands--) - { - int band_width; - int band_bits; - int rem; - j = codedBands-1; - /* Never skip the first band, nor a band that has been boosted by - dynalloc. - In the first case, we'd be coding a bit to signal we're going to waste - all the other bits. - In the second case, we'd be coding a bit to redistribute all the bits - we just signaled should be cocentrated in this band. */ - if (j<=skip_start) - { - /* Give the bit we reserved to end skipping back. */ - total += skip_rsv; - break; - } - /*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]); - 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]; - band_bits = (int)(bits[j] + percoeff*band_width + rem); - /*Only code a skip decision if we're above the threshold for this band. - Otherwise it is force-skipped. - This ensures that we have enough bits to code the skip flag.*/ - if (band_bits >= IMAX(thresh[j], alloc_floor+(1< ((j>4 && j<=signalBandwidth)) -#endif - { - ec_enc_bit_logp(ec, 1, 1); - break; - } - ec_enc_bit_logp(ec, 0, 1); - } else if (ec_dec_bit_logp(ec, 1)) { - break; - } - /*We used a bit to skip this band.*/ - psum += 1< 0) - intensity_rsv = LOG2_FRAC_TABLE[j-start]; - psum += intensity_rsv; - if (band_bits >= alloc_floor) - { - /*If we have enough for a fine energy bit per channel, use it.*/ - psum += alloc_floor; - bits[j] = alloc_floor; - } else { - /*Otherwise this band gets nothing at all.*/ - bits[j] = 0; - } - } - - celt_assert(codedBands > start); - /* Code the intensity and dual stereo parameters. */ - if (intensity_rsv > 0) - { - if (encode) - { - *intensity = IMIN(*intensity, codedBands); - ec_enc_uint(ec, *intensity-start, codedBands+1-start); - } - else - *intensity = start+ec_dec_uint(ec, codedBands+1-start); - } - else - *intensity = 0; - if (*intensity <= start) - { - total += dual_stereo_rsv; - dual_stereo_rsv = 0; - } - if (dual_stereo_rsv > 0) - { - if (encode) - ec_enc_bit_logp(ec, *dual_stereo, 1); - else - *dual_stereo = ec_dec_bit_logp(ec, 1); - } - else - *dual_stereo = 0; - - /* Allocate the remaining bits */ - left = total-psum; - percoeff = left/(m->eBands[codedBands]-m->eBands[start]); - left -= (m->eBands[codedBands]-m->eBands[start])*percoeff; - for (j=start;jeBands[j+1]-m->eBands[j])); - for (j=start;jeBands[j+1]-m->eBands[j]); - bits[j] += tmp; - left -= tmp; - } - /*for (j=0;j= 0); - N0 = m->eBands[j+1]-m->eBands[j]; - N=N0<1) - { - excess = MAX32(bit-cap[j],0); - bits[j] = bit-excess; - - /* Compensate for the extra DoF in stereo */ - den=(C*N+ ((C==2 && N>2 && !*dual_stereo && j<*intensity) ? 1 : 0)); - - NClogN = den*(m->logN[j] + logM); - - /* Offset for the number of fine bits by log2(N)/2 + FINE_OFFSET - compared to their "fair share" of total/N */ - offset = (NClogN>>1)-den*FINE_OFFSET; - - /* N=2 is the only point that doesn't match the curve */ - if (N==2) - offset += den<>2; - - /* Changing the offset for allocating the second and third - fine energy bit */ - if (bits[j] + offset < den*2<>2; - else if (bits[j] + offset < den*3<>3; - - /* Divide with rounding */ - ebits[j] = IMAX(0, (bits[j] + offset + (den<<(BITRES-1))) / (den< (bits[j]>>BITRES)) - ebits[j] = bits[j] >> stereo >> BITRES; - - /* More than that is useless because that's about as far as PVQ can go */ - ebits[j] = IMIN(ebits[j], MAX_FINE_BITS); - - /* If we rounded down or capped this band, make it a candidate for the - final fine energy pass */ - fine_priority[j] = ebits[j]*(den<= bits[j]+offset; - - /* Remove the allocated fine bits; the rest are assigned to PVQ */ - bits[j] -= C*ebits[j]< 0) - { - int extra_fine; - int extra_bits; - extra_fine = IMIN(excess>>(stereo+BITRES),MAX_FINE_BITS-ebits[j]); - ebits[j] += extra_fine; - extra_bits = extra_fine*C<= excess-balance; - excess -= extra_bits; - } - balance = excess; - - celt_assert(bits[j] >= 0); - celt_assert(ebits[j] >= 0); - } - /* Save any remaining bits over the cap for the rebalancing in - quant_all_bands(). */ - *_balance = balance; - - /* The skipped bands use all their bits for fine energy. */ - for (;j> stereo >> BITRES; - celt_assert(C*ebits[j]<nbEBands; - skip_start = start; - /* Reserve a bit to signal the end of manually skipped bands. */ - skip_rsv = total >= 1<total) - intensity_rsv = 0; - else - { - total -= intensity_rsv; - dual_stereo_rsv = total>=1<eBands[j+1]-m->eBands[j])<>4); - /* Tilt of the allocation curve */ - trim_offset[j] = C*(m->eBands[j+1]-m->eBands[j])*(alloc_trim-5-LM)*(end-j-1) - *(1<<(LM+BITRES))>>6; - /* Giving less resolution to single-coefficient bands because they get - more benefit from having one coarse value per coefficient*/ - if ((m->eBands[j+1]-m->eBands[j])<nbAllocVectors - 1; - do - { - int done = 0; - int psum = 0; - int mid = (lo+hi) >> 1; - for (j=end;j-->start;) - { - int bitsj; - int N = m->eBands[j+1]-m->eBands[j]; - bitsj = C*N*m->allocVectors[mid*len+j]<>2; - if (bitsj > 0) - bitsj = IMAX(0, bitsj + trim_offset[j]); - bitsj += offsets[j]; - if (bitsj >= thresh[j] || done) - { - done = 1; - /* Don't allocate more than we can actually use */ - psum += IMIN(bitsj, cap[j]); - } else { - if (bitsj >= C< total) - hi = mid - 1; - else - lo = mid + 1; - /*printf ("lo = %d, hi = %d\n", lo, hi);*/ - } - while (lo <= hi); - hi = lo--; - /*printf ("interp between %d and %d\n", lo, hi);*/ - for (j=start;jeBands[j+1]-m->eBands[j]; - bits1j = C*N*m->allocVectors[lo*len+j]<>2; - bits2j = hi>=m->nbAllocVectors ? - cap[j] : C*N*m->allocVectors[hi*len+j]<>2; - if (bits1j > 0) - bits1j = IMAX(0, bits1j + trim_offset[j]); - if (bits2j > 0) - bits2j = IMAX(0, bits2j + trim_offset[j]); - if (lo > 0) - bits1j += offsets[j]; - bits2j += offsets[j]; - if (offsets[j]>0) - skip_start = j; - bits2j = IMAX(0,bits2j-bits1j); - bits1[j] = bits1j; - bits2[j] = bits2j; - } - 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, signalBandwidth); - RESTORE_STACK; - return codedBands; -} - diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/rate.h b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/rate.h deleted file mode 100644 index f1e06611..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/rate.h +++ /dev/null @@ -1,101 +0,0 @@ -/* Copyright (c) 2007-2008 CSIRO - Copyright (c) 2007-2009 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 RATE_H -#define RATE_H - -#define MAX_PSEUDO 40 -#define LOG_MAX_PSEUDO 6 - -#define MAX_PULSES 128 - -#define MAX_FINE_BITS 8 - -#define FINE_OFFSET 21 -#define QTHETA_OFFSET 4 -#define QTHETA_OFFSET_TWOPHASE 16 - -#include "cwrs.h" -#include "modes.h" - -void compute_pulse_cache(CELTMode *m, int LM); - -static OPUS_INLINE int get_pulses(int i) -{ - return i<8 ? i : (8 + (i&7)) << ((i>>3)-1); -} - -static OPUS_INLINE int bits2pulses(const CELTMode *m, int band, int LM, int bits) -{ - int i; - int lo, hi; - const unsigned char *cache; - - LM++; - cache = m->cache.bits + m->cache.index[LM*m->nbEBands+band]; - - lo = 0; - hi = cache[0]; - bits--; - for (i=0;i>1; - /* OPT: Make sure this is implemented with a conditional move */ - if ((int)cache[mid] >= bits) - hi = mid; - else - lo = mid; - } - if (bits- (lo == 0 ? -1 : (int)cache[lo]) <= (int)cache[hi]-bits) - return lo; - else - return hi; -} - -static OPUS_INLINE int pulses2bits(const CELTMode *m, int band, int LM, int pulses) -{ - const unsigned char *cache; - - LM++; - cache = m->cache.bits + m->cache.index[LM*m->nbEBands+band]; - return pulses == 0 ? 0 : cache[pulses]+1; -} - -/** Compute the pulse allocation, i.e. how many pulses will go in each - * band. - @param m mode - @param offsets Requested increase or decrease in the number of bits for - each band - @param total Number of bands - @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 signalBandwidth); - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/stack_alloc.h b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/stack_alloc.h deleted file mode 100644 index 316a6ce1..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/stack_alloc.h +++ /dev/null @@ -1,178 +0,0 @@ -/* Copyright (C) 2002-2003 Jean-Marc Valin - Copyright (C) 2007-2009 Xiph.Org Foundation */ -/** - @file stack_alloc.h - @brief Temporary memory allocation on stack -*/ -/* - 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 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 -# include -# else -# ifdef HAVE_ALLOCA_H -# include -# else -# include -# endif -# endif -#endif - -/** - * @def ALIGN(stack, size) - * - * Aligns the stack to a 'size' boundary - * - * @param stack Stack - * @param size New size boundary - */ - -/** - * @def PUSH(stack, size, type) - * - * Allocates 'size' elements of type 'type' on the stack - * - * @param stack Stack - * @param size Number of elements - * @param type Type of element - */ - -/** - * @def VARDECL(var) - * - * Declare variable on stack - * - * @param var Variable to declare - */ - -/** - * @def ALLOC(var, size, type) - * - * Allocate 'size' elements of 'type' on stack - * - * @param var Name of variable to allocate - * @param size Number of elements - * @param type Type of element - */ - -#if defined(VAR_ARRAYS) - -#define VARDECL(type, var) -#define ALLOC(var, size, type) type var[size] -#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 -# define ALLOC(var, size, type) var = ((type*)_alloca(sizeof(type)*(size))) -# else -# define ALLOC(var, size, type) var = ((type*)alloca(sizeof(type)*(size))) -# endif - -#define SAVE_STACK -#define RESTORE_STACK -#define ALLOC_STACK -#define ALLOC_NONE 0 - -#else - -#ifdef CELT_C -char *global_stack=0; -#else -extern char *global_stack; -#endif /* CELT_C */ - -#ifdef ENABLE_VALGRIND - -#include - -#ifdef CELT_C -char *global_stack_top=0; -#else -extern char *global_stack_top; -#endif /* CELT_C */ - -#define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size) - 1)) -#define PUSH(stack, size, type) (VALGRIND_MAKE_MEM_NOACCESS(stack, global_stack_top-stack),ALIGN((stack),sizeof(type)/sizeof(char)),VALGRIND_MAKE_MEM_UNDEFINED(stack, ((size)*sizeof(type)/sizeof(char))),(stack)+=(2*(size)*sizeof(type)/sizeof(char)),(type*)((stack)-(2*(size)*sizeof(type)/sizeof(char)))) -#define RESTORE_STACK ((global_stack = _saved_stack),VALGRIND_MAKE_MEM_NOACCESS(global_stack, global_stack_top-global_stack)) -#define ALLOC_STACK char *_saved_stack; ((global_stack = (global_stack==0) ? ((global_stack_top=opus_alloc_scratch(GLOBAL_STACK_SIZE*2)+(GLOBAL_STACK_SIZE*2))-(GLOBAL_STACK_SIZE*2)) : global_stack),VALGRIND_MAKE_MEM_NOACCESS(global_stack, global_stack_top-global_stack)); _saved_stack = global_stack; - -#else - -#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)))) -#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 /* ENABLE_VALGRIND */ - -#include "os_support.h" -#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/sources/LabSound/third_party/libnyquist/third_party/opus/celt/static_modes_fixed.h b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/static_modes_fixed.h deleted file mode 100644 index 216df9e6..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/static_modes_fixed.h +++ /dev/null @@ -1,595 +0,0 @@ -/* 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" - -#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, 120, 240, 360, 30, 150, 270, 390, 60, 180, 300, 420, 90, 210, 330, -450, 15, 135, 255, 375, 45, 165, 285, 405, 75, 195, 315, 435, 105, 225, -345, 465, 5, 125, 245, 365, 35, 155, 275, 395, 65, 185, 305, 425, 95, -215, 335, 455, 20, 140, 260, 380, 50, 170, 290, 410, 80, 200, 320, 440, -110, 230, 350, 470, 10, 130, 250, 370, 40, 160, 280, 400, 70, 190, 310, -430, 100, 220, 340, 460, 25, 145, 265, 385, 55, 175, 295, 415, 85, 205, -325, 445, 115, 235, 355, 475, 1, 121, 241, 361, 31, 151, 271, 391, 61, -181, 301, 421, 91, 211, 331, 451, 16, 136, 256, 376, 46, 166, 286, 406, -76, 196, 316, 436, 106, 226, 346, 466, 6, 126, 246, 366, 36, 156, 276, -396, 66, 186, 306, 426, 96, 216, 336, 456, 21, 141, 261, 381, 51, 171, -291, 411, 81, 201, 321, 441, 111, 231, 351, 471, 11, 131, 251, 371, 41, -161, 281, 401, 71, 191, 311, 431, 101, 221, 341, 461, 26, 146, 266, 386, -56, 176, 296, 416, 86, 206, 326, 446, 116, 236, 356, 476, 2, 122, 242, -362, 32, 152, 272, 392, 62, 182, 302, 422, 92, 212, 332, 452, 17, 137, -257, 377, 47, 167, 287, 407, 77, 197, 317, 437, 107, 227, 347, 467, 7, -127, 247, 367, 37, 157, 277, 397, 67, 187, 307, 427, 97, 217, 337, 457, -22, 142, 262, 382, 52, 172, 292, 412, 82, 202, 322, 442, 112, 232, 352, -472, 12, 132, 252, 372, 42, 162, 282, 402, 72, 192, 312, 432, 102, 222, -342, 462, 27, 147, 267, 387, 57, 177, 297, 417, 87, 207, 327, 447, 117, -237, 357, 477, 3, 123, 243, 363, 33, 153, 273, 393, 63, 183, 303, 423, -93, 213, 333, 453, 18, 138, 258, 378, 48, 168, 288, 408, 78, 198, 318, -438, 108, 228, 348, 468, 8, 128, 248, 368, 38, 158, 278, 398, 68, 188, -308, 428, 98, 218, 338, 458, 23, 143, 263, 383, 53, 173, 293, 413, 83, -203, 323, 443, 113, 233, 353, 473, 13, 133, 253, 373, 43, 163, 283, 403, -73, 193, 313, 433, 103, 223, 343, 463, 28, 148, 268, 388, 58, 178, 298, -418, 88, 208, 328, 448, 118, 238, 358, 478, 4, 124, 244, 364, 34, 154, -274, 394, 64, 184, 304, 424, 94, 214, 334, 454, 19, 139, 259, 379, 49, -169, 289, 409, 79, 199, 319, 439, 109, 229, 349, 469, 9, 129, 249, 369, -39, 159, 279, 399, 69, 189, 309, 429, 99, 219, 339, 459, 24, 144, 264, -384, 54, 174, 294, 414, 84, 204, 324, 444, 114, 234, 354, 474, 14, 134, -254, 374, 44, 164, 284, 404, 74, 194, 314, 434, 104, 224, 344, 464, 29, -149, 269, 389, 59, 179, 299, 419, 89, 209, 329, 449, 119, 239, 359, 479, -}; -#endif - -#ifndef FFT_BITREV240 -#define FFT_BITREV240 -static const opus_int16 fft_bitrev240[240] = { -0, 60, 120, 180, 15, 75, 135, 195, 30, 90, 150, 210, 45, 105, 165, -225, 5, 65, 125, 185, 20, 80, 140, 200, 35, 95, 155, 215, 50, 110, -170, 230, 10, 70, 130, 190, 25, 85, 145, 205, 40, 100, 160, 220, 55, -115, 175, 235, 1, 61, 121, 181, 16, 76, 136, 196, 31, 91, 151, 211, -46, 106, 166, 226, 6, 66, 126, 186, 21, 81, 141, 201, 36, 96, 156, -216, 51, 111, 171, 231, 11, 71, 131, 191, 26, 86, 146, 206, 41, 101, -161, 221, 56, 116, 176, 236, 2, 62, 122, 182, 17, 77, 137, 197, 32, -92, 152, 212, 47, 107, 167, 227, 7, 67, 127, 187, 22, 82, 142, 202, -37, 97, 157, 217, 52, 112, 172, 232, 12, 72, 132, 192, 27, 87, 147, -207, 42, 102, 162, 222, 57, 117, 177, 237, 3, 63, 123, 183, 18, 78, -138, 198, 33, 93, 153, 213, 48, 108, 168, 228, 8, 68, 128, 188, 23, -83, 143, 203, 38, 98, 158, 218, 53, 113, 173, 233, 13, 73, 133, 193, -28, 88, 148, 208, 43, 103, 163, 223, 58, 118, 178, 238, 4, 64, 124, -184, 19, 79, 139, 199, 34, 94, 154, 214, 49, 109, 169, 229, 9, 69, -129, 189, 24, 84, 144, 204, 39, 99, 159, 219, 54, 114, 174, 234, 14, -74, 134, 194, 29, 89, 149, 209, 44, 104, 164, 224, 59, 119, 179, 239, -}; -#endif - -#ifndef FFT_BITREV120 -#define FFT_BITREV120 -static const opus_int16 fft_bitrev120[120] = { -0, 30, 60, 90, 15, 45, 75, 105, 5, 35, 65, 95, 20, 50, 80, -110, 10, 40, 70, 100, 25, 55, 85, 115, 1, 31, 61, 91, 16, 46, -76, 106, 6, 36, 66, 96, 21, 51, 81, 111, 11, 41, 71, 101, 26, -56, 86, 116, 2, 32, 62, 92, 17, 47, 77, 107, 7, 37, 67, 97, -22, 52, 82, 112, 12, 42, 72, 102, 27, 57, 87, 117, 3, 33, 63, -93, 18, 48, 78, 108, 8, 38, 68, 98, 23, 53, 83, 113, 13, 43, -73, 103, 28, 58, 88, 118, 4, 34, 64, 94, 19, 49, 79, 109, 9, -39, 69, 99, 24, 54, 84, 114, 14, 44, 74, 104, 29, 59, 89, 119, -}; -#endif - -#ifndef FFT_BITREV60 -#define FFT_BITREV60 -static const opus_int16 fft_bitrev60[60] = { -0, 15, 30, 45, 5, 20, 35, 50, 10, 25, 40, 55, 1, 16, 31, -46, 6, 21, 36, 51, 11, 26, 41, 56, 2, 17, 32, 47, 7, 22, -37, 52, 12, 27, 42, 57, 3, 18, 33, 48, 8, 23, 38, 53, 13, -28, 43, 58, 4, 19, 34, 49, 9, 24, 39, 54, 14, 29, 44, 59, -}; -#endif - -#ifndef FFT_STATE48000_960_0 -#define FFT_STATE48000_960_0 -static const kiss_fft_state fft_state48000_960_0 = { -480, /* nfft */ --1, /* shift */ -{4, 120, 4, 30, 2, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, }, /* factors */ -fft_bitrev480, /* bitrev */ -fft_twiddles48000_960, /* bitrev */ -}; -#endif - -#ifndef FFT_STATE48000_960_1 -#define FFT_STATE48000_960_1 -static const kiss_fft_state fft_state48000_960_1 = { -240, /* nfft */ -1, /* shift */ -{4, 60, 4, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */ -fft_bitrev240, /* bitrev */ -fft_twiddles48000_960, /* bitrev */ -}; -#endif - -#ifndef FFT_STATE48000_960_2 -#define FFT_STATE48000_960_2 -static const kiss_fft_state fft_state48000_960_2 = { -120, /* nfft */ -2, /* shift */ -{4, 30, 2, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */ -fft_bitrev120, /* bitrev */ -fft_twiddles48000_960, /* bitrev */ -}; -#endif - -#ifndef FFT_STATE48000_960_3 -#define FFT_STATE48000_960_3 -static const kiss_fft_state fft_state48000_960_3 = { -60, /* nfft */ -3, /* shift */ -{4, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */ -fft_bitrev60, /* bitrev */ -fft_twiddles48000_960, /* bitrev */ -}; -#endif - -#endif - -#ifndef MDCT_TWIDDLES960 -#define MDCT_TWIDDLES960 -static const opus_val16 mdct_twiddles960[481] = { -32767, 32767, 32767, 32767, 32766, -32763, 32762, 32759, 32757, 32753, -32751, 32747, 32743, 32738, 32733, -32729, 32724, 32717, 32711, 32705, -32698, 32690, 32683, 32676, 32667, -32658, 32650, 32640, 32631, 32620, -32610, 32599, 32588, 32577, 32566, -32554, 32541, 32528, 32515, 32502, -32487, 32474, 32459, 32444, 32429, -32413, 32397, 32381, 32364, 32348, -32331, 32313, 32294, 32277, 32257, -32239, 32219, 32200, 32180, 32159, -32138, 32118, 32096, 32074, 32051, -32029, 32006, 31984, 31960, 31936, -31912, 31888, 31863, 31837, 31812, -31786, 31760, 31734, 31707, 31679, -31652, 31624, 31596, 31567, 31539, -31508, 31479, 31450, 31419, 31388, -31357, 31326, 31294, 31262, 31230, -31198, 31164, 31131, 31097, 31063, -31030, 30994, 30959, 30924, 30889, -30853, 30816, 30779, 30743, 30705, -30668, 30629, 30592, 30553, 30515, -30475, 30435, 30396, 30356, 30315, -30274, 30233, 30191, 30149, 30107, -30065, 30022, 29979, 29936, 29891, -29847, 29803, 29758, 29713, 29668, -29622, 29577, 29529, 29483, 29436, -29390, 29341, 29293, 29246, 29197, -29148, 29098, 29050, 29000, 28949, -28899, 28848, 28797, 28746, 28694, -28642, 28590, 28537, 28485, 28432, -28378, 28324, 28271, 28217, 28162, -28106, 28051, 27995, 27940, 27884, -27827, 27770, 27713, 27657, 27598, -27540, 27481, 27423, 27365, 27305, -27246, 27187, 27126, 27066, 27006, -26945, 26883, 26822, 26760, 26698, -26636, 26574, 26510, 26448, 26383, -26320, 26257, 26191, 26127, 26062, -25997, 25931, 25866, 25800, 25734, -25667, 25601, 25533, 25466, 25398, -25330, 25262, 25194, 25125, 25056, -24987, 24917, 24848, 24778, 24707, -24636, 24566, 24495, 24424, 24352, -24280, 24208, 24135, 24063, 23990, -23917, 23842, 23769, 23695, 23622, -23546, 23472, 23398, 23322, 23246, -23171, 23095, 23018, 22942, 22866, -22788, 22711, 22634, 22557, 22478, -22400, 22322, 22244, 22165, 22085, -22006, 21927, 21846, 21766, 21687, -21606, 21524, 21443, 21363, 21282, -21199, 21118, 21035, 20954, 20870, -20788, 20705, 20621, 20538, 20455, -20371, 20286, 20202, 20118, 20034, -19947, 19863, 19777, 19692, 19606, -19520, 19434, 19347, 19260, 19174, -19088, 18999, 18911, 18825, 18737, -18648, 18560, 18472, 18384, 18294, -18205, 18116, 18025, 17936, 17846, -17757, 17666, 17576, 17485, 17395, -17303, 17212, 17122, 17030, 16937, -16846, 16755, 16662, 16569, 16477, -16385, 16291, 16198, 16105, 16012, -15917, 15824, 15730, 15636, 15541, -15447, 15352, 15257, 15162, 15067, -14973, 14875, 14781, 14685, 14589, -14493, 14396, 14300, 14204, 14107, -14010, 13914, 13815, 13718, 13621, -13524, 13425, 13328, 13230, 13133, -13033, 12935, 12836, 12738, 12638, -12540, 12441, 12341, 12241, 12142, -12044, 11943, 11843, 11744, 11643, -11542, 11442, 11342, 11241, 11139, -11039, 10939, 10836, 10736, 10635, -10534, 10431, 10330, 10228, 10127, -10024, 9921, 9820, 9718, 9614, -9512, 9410, 9306, 9204, 9101, -8998, 8895, 8791, 8689, 8585, -8481, 8377, 8274, 8171, 8067, -7962, 7858, 7753, 7650, 7545, -7441, 7336, 7231, 7129, 7023, -6917, 6813, 6709, 6604, 6498, -6393, 6288, 6182, 6077, 5973, -5867, 5760, 5656, 5549, 5445, -5339, 5232, 5127, 5022, 4914, -4809, 4703, 4596, 4490, 4384, -4278, 4171, 4065, 3958, 3852, -3745, 3640, 3532, 3426, 3318, -3212, 3106, 2998, 2891, 2786, -2679, 2570, 2465, 2358, 2251, -2143, 2037, 1929, 1823, 1715, -1609, 1501, 1393, 1287, 1180, -1073, 964, 858, 751, 644, -535, 429, 322, 214, 107, -0, }; -#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/sources/LabSound/third_party/libnyquist/third_party/opus/celt/static_modes_float.h b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/static_modes_float.h deleted file mode 100644 index 5d7e7b8e..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/static_modes_float.h +++ /dev/null @@ -1,599 +0,0 @@ -/* 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" - -#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, 120, 240, 360, 30, 150, 270, 390, 60, 180, 300, 420, 90, 210, 330, -450, 15, 135, 255, 375, 45, 165, 285, 405, 75, 195, 315, 435, 105, 225, -345, 465, 5, 125, 245, 365, 35, 155, 275, 395, 65, 185, 305, 425, 95, -215, 335, 455, 20, 140, 260, 380, 50, 170, 290, 410, 80, 200, 320, 440, -110, 230, 350, 470, 10, 130, 250, 370, 40, 160, 280, 400, 70, 190, 310, -430, 100, 220, 340, 460, 25, 145, 265, 385, 55, 175, 295, 415, 85, 205, -325, 445, 115, 235, 355, 475, 1, 121, 241, 361, 31, 151, 271, 391, 61, -181, 301, 421, 91, 211, 331, 451, 16, 136, 256, 376, 46, 166, 286, 406, -76, 196, 316, 436, 106, 226, 346, 466, 6, 126, 246, 366, 36, 156, 276, -396, 66, 186, 306, 426, 96, 216, 336, 456, 21, 141, 261, 381, 51, 171, -291, 411, 81, 201, 321, 441, 111, 231, 351, 471, 11, 131, 251, 371, 41, -161, 281, 401, 71, 191, 311, 431, 101, 221, 341, 461, 26, 146, 266, 386, -56, 176, 296, 416, 86, 206, 326, 446, 116, 236, 356, 476, 2, 122, 242, -362, 32, 152, 272, 392, 62, 182, 302, 422, 92, 212, 332, 452, 17, 137, -257, 377, 47, 167, 287, 407, 77, 197, 317, 437, 107, 227, 347, 467, 7, -127, 247, 367, 37, 157, 277, 397, 67, 187, 307, 427, 97, 217, 337, 457, -22, 142, 262, 382, 52, 172, 292, 412, 82, 202, 322, 442, 112, 232, 352, -472, 12, 132, 252, 372, 42, 162, 282, 402, 72, 192, 312, 432, 102, 222, -342, 462, 27, 147, 267, 387, 57, 177, 297, 417, 87, 207, 327, 447, 117, -237, 357, 477, 3, 123, 243, 363, 33, 153, 273, 393, 63, 183, 303, 423, -93, 213, 333, 453, 18, 138, 258, 378, 48, 168, 288, 408, 78, 198, 318, -438, 108, 228, 348, 468, 8, 128, 248, 368, 38, 158, 278, 398, 68, 188, -308, 428, 98, 218, 338, 458, 23, 143, 263, 383, 53, 173, 293, 413, 83, -203, 323, 443, 113, 233, 353, 473, 13, 133, 253, 373, 43, 163, 283, 403, -73, 193, 313, 433, 103, 223, 343, 463, 28, 148, 268, 388, 58, 178, 298, -418, 88, 208, 328, 448, 118, 238, 358, 478, 4, 124, 244, 364, 34, 154, -274, 394, 64, 184, 304, 424, 94, 214, 334, 454, 19, 139, 259, 379, 49, -169, 289, 409, 79, 199, 319, 439, 109, 229, 349, 469, 9, 129, 249, 369, -39, 159, 279, 399, 69, 189, 309, 429, 99, 219, 339, 459, 24, 144, 264, -384, 54, 174, 294, 414, 84, 204, 324, 444, 114, 234, 354, 474, 14, 134, -254, 374, 44, 164, 284, 404, 74, 194, 314, 434, 104, 224, 344, 464, 29, -149, 269, 389, 59, 179, 299, 419, 89, 209, 329, 449, 119, 239, 359, 479, -}; -#endif - -#ifndef FFT_BITREV240 -#define FFT_BITREV240 -static const opus_int16 fft_bitrev240[240] = { -0, 60, 120, 180, 15, 75, 135, 195, 30, 90, 150, 210, 45, 105, 165, -225, 5, 65, 125, 185, 20, 80, 140, 200, 35, 95, 155, 215, 50, 110, -170, 230, 10, 70, 130, 190, 25, 85, 145, 205, 40, 100, 160, 220, 55, -115, 175, 235, 1, 61, 121, 181, 16, 76, 136, 196, 31, 91, 151, 211, -46, 106, 166, 226, 6, 66, 126, 186, 21, 81, 141, 201, 36, 96, 156, -216, 51, 111, 171, 231, 11, 71, 131, 191, 26, 86, 146, 206, 41, 101, -161, 221, 56, 116, 176, 236, 2, 62, 122, 182, 17, 77, 137, 197, 32, -92, 152, 212, 47, 107, 167, 227, 7, 67, 127, 187, 22, 82, 142, 202, -37, 97, 157, 217, 52, 112, 172, 232, 12, 72, 132, 192, 27, 87, 147, -207, 42, 102, 162, 222, 57, 117, 177, 237, 3, 63, 123, 183, 18, 78, -138, 198, 33, 93, 153, 213, 48, 108, 168, 228, 8, 68, 128, 188, 23, -83, 143, 203, 38, 98, 158, 218, 53, 113, 173, 233, 13, 73, 133, 193, -28, 88, 148, 208, 43, 103, 163, 223, 58, 118, 178, 238, 4, 64, 124, -184, 19, 79, 139, 199, 34, 94, 154, 214, 49, 109, 169, 229, 9, 69, -129, 189, 24, 84, 144, 204, 39, 99, 159, 219, 54, 114, 174, 234, 14, -74, 134, 194, 29, 89, 149, 209, 44, 104, 164, 224, 59, 119, 179, 239, -}; -#endif - -#ifndef FFT_BITREV120 -#define FFT_BITREV120 -static const opus_int16 fft_bitrev120[120] = { -0, 30, 60, 90, 15, 45, 75, 105, 5, 35, 65, 95, 20, 50, 80, -110, 10, 40, 70, 100, 25, 55, 85, 115, 1, 31, 61, 91, 16, 46, -76, 106, 6, 36, 66, 96, 21, 51, 81, 111, 11, 41, 71, 101, 26, -56, 86, 116, 2, 32, 62, 92, 17, 47, 77, 107, 7, 37, 67, 97, -22, 52, 82, 112, 12, 42, 72, 102, 27, 57, 87, 117, 3, 33, 63, -93, 18, 48, 78, 108, 8, 38, 68, 98, 23, 53, 83, 113, 13, 43, -73, 103, 28, 58, 88, 118, 4, 34, 64, 94, 19, 49, 79, 109, 9, -39, 69, 99, 24, 54, 84, 114, 14, 44, 74, 104, 29, 59, 89, 119, -}; -#endif - -#ifndef FFT_BITREV60 -#define FFT_BITREV60 -static const opus_int16 fft_bitrev60[60] = { -0, 15, 30, 45, 5, 20, 35, 50, 10, 25, 40, 55, 1, 16, 31, -46, 6, 21, 36, 51, 11, 26, 41, 56, 2, 17, 32, 47, 7, 22, -37, 52, 12, 27, 42, 57, 3, 18, 33, 48, 8, 23, 38, 53, 13, -28, 43, 58, 4, 19, 34, 49, 9, 24, 39, 54, 14, 29, 44, 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 */ -{4, 120, 4, 30, 2, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, }, /* factors */ -fft_bitrev480, /* bitrev */ -fft_twiddles48000_960, /* bitrev */ -}; -#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 */ -{4, 60, 4, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */ -fft_bitrev240, /* bitrev */ -fft_twiddles48000_960, /* bitrev */ -}; -#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 */ -{4, 30, 2, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */ -fft_bitrev120, /* bitrev */ -fft_twiddles48000_960, /* bitrev */ -}; -#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 */ -{4, 15, 3, 5, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, /* factors */ -fft_bitrev60, /* bitrev */ -fft_twiddles48000_960, /* bitrev */ -}; -#endif - -#endif - -#ifndef MDCT_TWIDDLES960 -#define MDCT_TWIDDLES960 -static const opus_val16 mdct_twiddles960[481] = { -1.0000000f, 0.99999465f, 0.99997858f, 0.99995181f, 0.99991433f, -0.99986614f, 0.99980724f, 0.99973764f, 0.99965732f, 0.99956631f, -0.99946459f, 0.99935216f, 0.99922904f, 0.99909521f, 0.99895068f, -0.99879546f, 0.99862953f, 0.99845292f, 0.99826561f, 0.99806761f, -0.99785892f, 0.99763955f, 0.99740949f, 0.99716875f, 0.99691733f, -0.99665524f, 0.99638247f, 0.99609903f, 0.99580493f, 0.99550016f, -0.99518473f, 0.99485864f, 0.99452190f, 0.99417450f, 0.99381646f, -0.99344778f, 0.99306846f, 0.99267850f, 0.99227791f, 0.99186670f, -0.99144486f, 0.99101241f, 0.99056934f, 0.99011566f, 0.98965139f, -0.98917651f, 0.98869104f, 0.98819498f, 0.98768834f, 0.98717112f, -0.98664333f, 0.98610497f, 0.98555606f, 0.98499659f, 0.98442657f, -0.98384600f, 0.98325491f, 0.98265328f, 0.98204113f, 0.98141846f, -0.98078528f, 0.98014159f, 0.97948742f, 0.97882275f, 0.97814760f, -0.97746197f, 0.97676588f, 0.97605933f, 0.97534232f, 0.97461487f, -0.97387698f, 0.97312866f, 0.97236992f, 0.97160077f, 0.97082121f, -0.97003125f, 0.96923091f, 0.96842019f, 0.96759909f, 0.96676764f, -0.96592582f, 0.96507367f, 0.96421118f, 0.96333837f, 0.96245523f, -0.96156180f, 0.96065806f, 0.95974403f, 0.95881973f, 0.95788517f, -0.95694034f, 0.95598526f, 0.95501995f, 0.95404440f, 0.95305864f, -0.95206267f, 0.95105651f, 0.95004016f, 0.94901364f, 0.94797697f, -0.94693013f, 0.94587315f, 0.94480604f, 0.94372882f, 0.94264149f, -0.94154406f, 0.94043656f, 0.93931897f, 0.93819133f, 0.93705365f, -0.93590592f, 0.93474818f, 0.93358042f, 0.93240268f, 0.93121493f, -0.93001722f, 0.92880955f, 0.92759193f, 0.92636438f, 0.92512690f, -0.92387953f, 0.92262225f, 0.92135509f, 0.92007809f, 0.91879121f, -0.91749449f, 0.91618795f, 0.91487161f, 0.91354545f, 0.91220952f, -0.91086382f, 0.90950836f, 0.90814316f, 0.90676824f, 0.90538363f, -0.90398929f, 0.90258528f, 0.90117161f, 0.89974828f, 0.89831532f, -0.89687273f, 0.89542055f, 0.89395877f, 0.89248742f, 0.89100652f, -0.88951606f, 0.88801610f, 0.88650661f, 0.88498764f, 0.88345918f, -0.88192125f, 0.88037390f, 0.87881711f, 0.87725090f, 0.87567531f, -0.87409035f, 0.87249599f, 0.87089232f, 0.86927933f, 0.86765699f, -0.86602540f, 0.86438453f, 0.86273437f, 0.86107503f, 0.85940641f, -0.85772862f, 0.85604161f, 0.85434547f, 0.85264014f, 0.85092572f, -0.84920218f, 0.84746955f, 0.84572781f, 0.84397704f, 0.84221721f, -0.84044838f, 0.83867056f, 0.83688375f, 0.83508799f, 0.83328325f, -0.83146961f, 0.82964704f, 0.82781562f, 0.82597530f, 0.82412620f, -0.82226820f, 0.82040144f, 0.81852589f, 0.81664154f, 0.81474847f, -0.81284665f, 0.81093620f, 0.80901698f, 0.80708914f, 0.80515262f, -0.80320752f, 0.80125378f, 0.79929149f, 0.79732067f, 0.79534125f, -0.79335335f, 0.79135691f, 0.78935204f, 0.78733867f, 0.78531691f, -0.78328674f, 0.78124818f, 0.77920122f, 0.77714595f, 0.77508232f, -0.77301043f, 0.77093026f, 0.76884183f, 0.76674517f, 0.76464026f, -0.76252720f, 0.76040593f, 0.75827656f, 0.75613907f, 0.75399349f, -0.75183978f, 0.74967807f, 0.74750833f, 0.74533054f, 0.74314481f, -0.74095112f, 0.73874950f, 0.73653993f, 0.73432251f, 0.73209718f, -0.72986405f, 0.72762307f, 0.72537438f, 0.72311787f, 0.72085359f, -0.71858162f, 0.71630192f, 0.71401459f, 0.71171956f, 0.70941701f, -0.70710677f, 0.70478900f, 0.70246363f, 0.70013079f, 0.69779041f, -0.69544260f, 0.69308738f, 0.69072466f, 0.68835458f, 0.68597709f, -0.68359229f, 0.68120013f, 0.67880072f, 0.67639404f, 0.67398011f, -0.67155892f, 0.66913059f, 0.66669509f, 0.66425240f, 0.66180265f, -0.65934581f, 0.65688191f, 0.65441092f, 0.65193298f, 0.64944801f, -0.64695613f, 0.64445727f, 0.64195160f, 0.63943902f, 0.63691954f, -0.63439328f, 0.63186019f, 0.62932037f, 0.62677377f, 0.62422055f, -0.62166055f, 0.61909394f, 0.61652065f, 0.61394081f, 0.61135435f, -0.60876139f, 0.60616195f, 0.60355593f, 0.60094349f, 0.59832457f, -0.59569929f, 0.59306758f, 0.59042957f, 0.58778523f, 0.58513460f, -0.58247766f, 0.57981452f, 0.57714518f, 0.57446961f, 0.57178793f, -0.56910013f, 0.56640624f, 0.56370623f, 0.56100023f, 0.55828818f, -0.55557020f, 0.55284627f, 0.55011641f, 0.54738067f, 0.54463901f, -0.54189157f, 0.53913828f, 0.53637921f, 0.53361450f, 0.53084398f, -0.52806787f, 0.52528601f, 0.52249852f, 0.51970543f, 0.51690688f, -0.51410279f, 0.51129310f, 0.50847793f, 0.50565732f, 0.50283139f, -0.49999997f, 0.49716321f, 0.49432122f, 0.49147383f, 0.48862118f, -0.48576340f, 0.48290042f, 0.48003216f, 0.47715876f, 0.47428025f, -0.47139677f, 0.46850813f, 0.46561448f, 0.46271584f, 0.45981235f, -0.45690383f, 0.45399042f, 0.45107214f, 0.44814915f, 0.44522124f, -0.44228868f, 0.43935137f, 0.43640926f, 0.43346247f, 0.43051104f, -0.42755511f, 0.42459449f, 0.42162932f, 0.41865964f, 0.41568558f, -0.41270697f, 0.40972393f, 0.40673661f, 0.40374494f, 0.40074884f, -0.39774844f, 0.39474390f, 0.39173501f, 0.38872193f, 0.38570469f, -0.38268343f, 0.37965796f, 0.37662842f, 0.37359496f, 0.37055739f, -0.36751585f, 0.36447038f, 0.36142122f, 0.35836797f, 0.35531089f, -0.35225000f, 0.34918544f, 0.34611704f, 0.34304493f, 0.33996926f, -0.33688983f, 0.33380680f, 0.33072019f, 0.32763015f, 0.32453650f, -0.32143936f, 0.31833890f, 0.31523503f, 0.31212767f, 0.30901696f, -0.30590306f, 0.30278577f, 0.29966524f, 0.29654150f, 0.29341470f, -0.29028464f, 0.28715147f, 0.28401522f, 0.28087605f, 0.27773376f, -0.27458861f, 0.27144052f, 0.26828940f, 0.26513541f, 0.26197859f, -0.25881907f, 0.25565666f, 0.25249152f, 0.24932367f, 0.24615327f, -0.24298012f, 0.23980436f, 0.23662604f, 0.23344530f, 0.23026206f, -0.22707623f, 0.22388809f, 0.22069744f, 0.21750443f, 0.21430908f, -0.21111156f, 0.20791165f, 0.20470953f, 0.20150520f, 0.19829884f, -0.19509024f, 0.19187955f, 0.18866692f, 0.18545227f, 0.18223552f, -0.17901681f, 0.17579631f, 0.17257380f, 0.16934945f, 0.16612328f, -0.16289546f, 0.15966577f, 0.15643437f, 0.15320141f, 0.14996669f, -0.14673037f, 0.14349260f, 0.14025329f, 0.13701235f, 0.13376995f, -0.13052612f, 0.12728101f, 0.12403442f, 0.12078650f, 0.11753740f, -0.11428693f, 0.11103523f, 0.10778234f, 0.10452842f, 0.10127326f, -0.098017137f, 0.094759842f, 0.091501652f, 0.088242363f, 0.084982129f, -0.081721103f, 0.078459084f, 0.075196224f, 0.071932560f, 0.068668243f, -0.065403073f, 0.062137201f, 0.058870665f, 0.055603617f, 0.052335974f, -0.049067651f, 0.045798921f, 0.042529582f, 0.039259788f, 0.035989573f, -0.032719092f, 0.029448142f, 0.026176876f, 0.022905329f, 0.019633657f, -0.016361655f, 0.013089478f, 0.0098171604f, 0.0065449764f, 0.0032724839f, --4.3711390e-08f, }; -#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/sources/LabSound/third_party/libnyquist/third_party/opus/celt/vq.c b/sources/LabSound/third_party/libnyquist/third_party/opus/celt/vq.c deleted file mode 100644 index 98a0f36c..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/celt/vq.c +++ /dev/null @@ -1,415 +0,0 @@ -/* Copyright (c) 2007-2008 CSIRO - Copyright (c) 2007-2009 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 "mathops.h" -#include "cwrs.h" -#include "vq.h" -#include "arch.h" -#include "os_support.h" -#include "bands.h" -#include "rate.h" - -static void exp_rotation1(celt_norm *X, int len, int stride, opus_val16 c, opus_val16 s) -{ - int i; - celt_norm *Xptr; - Xptr = X; - for (i=0;i=0;i--) - { - 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)); - } -} - -static 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; - opus_val16 c, s; - opus_val16 gain, theta; - int stride2=0; - int factor; - - if (2*K>=len || spread==SPREAD_NONE) - return; - factor = SPREAD_FACTOR[spread-1]; - - gain = celt_div((opus_val32)MULT16_16(Q15_ONE,len),(opus_val32)(len+factor*K)); - theta = HALF16(MULT16_16_Q15(gain,gain)); - - c = celt_cos_norm(EXTEND32(theta)); - s = celt_cos_norm(EXTEND32(SUB16(Q15ONE,theta))); /* sin(theta) */ - - if (len>=8*stride) - { - stride2 = 1; - /* This is just a simple (equivalent) way of computing sqrt(len/stride) with rounding. - It's basically incrementing long as (stride2+0.5)^2 < len/stride. */ - while ((stride2*stride2+stride2)*stride + (stride>>2) < len) - stride2++; - } - /*NOTE: As a minor optimization, we could be passing around log2(B), not B, for both this and for - extract_collapse_mask().*/ - len /= stride; - for (i=0;i>1; -#endif - t = VSHR32(Ryy, 2*(k-7)); - g = MULT16_16_P15(celt_rsqrt_norm(t),gain); - - i=0; - do - X[i] = EXTRACT16(PSHR32(MULT16_16(g, iy[i]), k+1)); - while (++i < N); -} - -static unsigned extract_collapse_mask(int *iy, int N, int B) -{ - unsigned collapse_mask; - int N0; - int i; - if (B<=1) - return 1; - /*NOTE: As a minor optimization, we could be passing around log2(B), not B, for both this and for - exp_rotation().*/ - N0 = N/B; - collapse_mask = 0; - i=0; do { - int j; - j=0; do { - collapse_mask |= (iy[i*N0+j]!=0)<0, "alg_quant() needs at least one pulse"); - celt_assert2(N>1, "alg_quant() needs at least two dimensions"); - - ALLOC(y, N, celt_norm); - ALLOC(iy, N, int); - ALLOC(signx, N, opus_val16); - - exp_rotation(X, N, 1, B, K, spread); - - /* 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]; - } - iy[j] = 0; - y[j] = 0; - } while (++j (N>>1)) - { - opus_val16 rcp; - j=0; do { - sum += X[j]; - } while (++j EPSILON && sum < 64)) -#endif - { - X[0] = QCONST16(1.f,14); - j=1; do - X[j]=0; - while (++j=1, "Allocated too many pulses in the quick pass"); - - /* 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"); -#endif - 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; - } - - 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)) - { - best_den = Ryy; - best_num = Rxy; - best_id = j; - } - } while (++j0, "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); - normalise_residual(iy, X, N, Ryy, gain); - exp_rotation(X, N, -1, B, K, spread); - collapse_mask = extract_collapse_mask(iy, N, B); - RESTORE_STACK; - return collapse_mask; -} - -void renormalise_vector(celt_norm *X, int N, opus_val16 gain) -{ - int i; -#ifdef FIXED_POINT - int k; -#endif - opus_val32 E = EPSILON; - opus_val16 g; - opus_val32 t; - celt_norm *xptr = X; - 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;i -#include "arch.h" - -#define OVERRIDE_XCORR_KERNEL -static OPUS_INLINE void xcorr_kernel(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)); -} - -#define OVERRIDE_DUAL_INNER_PROD -static OPUS_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 i; - __m128 xsum1, xsum2; - xsum1 = _mm_setzero_ps(); - xsum2 = _mm_setzero_ps(); - for (i=0;i - *
  • audio_frame is the audio data in opus_int16 (or float for opus_encode_float())
  • - *
  • frame_size is the duration of the frame in samples (per channel)
  • - *
  • packet is the byte array to which the compressed data is written
  • - *
  • max_packet is the maximum number of bytes that can be written in the packet (4000 bytes is recommended). - * Do not use max_packet to control VBR target bitrate, instead use the #OPUS_SET_BITRATE CTL.
  • - * - * - * 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). - * - * Once the encoder state if no longer needed, it can be destroyed with - * - * @code - * opus_encoder_destroy(enc); - * @endcode - * - * If the encoder was created with opus_encoder_init() rather than opus_encoder_create(), - * then no action is required aside from potentially freeing the memory that was manually - * allocated for it (calling free(enc) for the example above) - * - */ - -/** Opus encoder state. - * This contains the complete state of an Opus encoder. - * It is position independent and can be freely copied. - * @see opus_encoder_create,opus_encoder_init - */ -typedef struct OpusEncoder OpusEncoder; - -/** Gets the size of an OpusEncoder structure. - * @param[in] channels int: Number of channels. - * This must be 1 or 2. - * @returns The size in bytes. - */ -OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_encoder_get_size(int channels); - -/** - */ - -/** Allocates and initializes an encoder state. - * There are three coding modes: - * - * @ref OPUS_APPLICATION_VOIP gives best quality at a given bitrate for voice - * signals. It enhances the input signal by high-pass filtering and - * emphasizing formants and harmonics. Optionally it includes in-band - * forward error correction to protect against packet loss. Use this - * mode for typical VoIP applications. Because of the enhancement, - * even at high bitrates the output may sound different from the input. - * - * @ref OPUS_APPLICATION_AUDIO gives best quality at a given bitrate for most - * non-voice signals like music. Use this mode for music and mixed - * (music/voice) content, broadcast, and applications requiring less - * than 15 ms of coding delay. - * - * @ref OPUS_APPLICATION_RESTRICTED_LOWDELAY configures low-delay mode that - * disables the speech-optimized mode in exchange for slightly reduced delay. - * This mode can only be set on an newly initialized or freshly reset encoder - * because it changes the codec delay. - * - * This is useful when the caller knows that the speech-optimized modes will not be needed (use with caution). - * @param [in] Fs opus_int32: Sampling rate of input signal (Hz) - * This must be one of 8000, 12000, 16000, - * 24000, or 48000. - * @param [in] channels int: Number of channels (1 or 2) in input signal - * @param [in] application int: Coding mode (@ref OPUS_APPLICATION_VOIP/@ref OPUS_APPLICATION_AUDIO/@ref OPUS_APPLICATION_RESTRICTED_LOWDELAY) - * @param [out] error int*: @ref opus_errorcodes - * @note Regardless of the sampling rate and number channels selected, the Opus encoder - * can switch to a lower audio bandwidth or number of channels if the bitrate - * selected is too low. This also means that it is safe to always use 48 kHz stereo input - * and let the encoder optimize the encoding. - */ -OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusEncoder *opus_encoder_create( - opus_int32 Fs, - int channels, - int application, - int *error -); - -/** Initializes a previously allocated encoder state - * The memory pointed to by st must be at least the size returned by opus_encoder_get_size(). - * This is intended for applications which use their own allocator instead of malloc. - * @see opus_encoder_create(),opus_encoder_get_size() - * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL. - * @param [in] st OpusEncoder*: Encoder state - * @param [in] Fs opus_int32: Sampling rate of input signal (Hz) - * This must be one of 8000, 12000, 16000, - * 24000, or 48000. - * @param [in] channels int: Number of channels (1 or 2) in input signal - * @param [in] application int: Coding mode (OPUS_APPLICATION_VOIP/OPUS_APPLICATION_AUDIO/OPUS_APPLICATION_RESTRICTED_LOWDELAY) - * @retval #OPUS_OK Success or @ref opus_errorcodes - */ -OPUS_EXPORT int opus_encoder_init( - OpusEncoder *st, - opus_int32 Fs, - int channels, - int application -) OPUS_ARG_NONNULL(1); - -/** Encodes an Opus frame. - * @param [in] st OpusEncoder*: Encoder state - * @param [in] pcm opus_int16*: Input signal (interleaved if 2 channels). length is frame_size*channels*sizeof(opus_int16) - * @param [in] 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 opus_int32 opus_encode( - OpusEncoder *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 an Opus frame from floating point input. - * @param [in] st OpusEncoder*: Encoder state - * @param [in] pcm float*: Input in float format (interleaved if 2 channels), 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. - * length is frame_size*channels*sizeof(float) - * @param [in] 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 opus_int32 opus_encode_float( - OpusEncoder *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 OpusEncoder allocated by opus_encoder_create(). - * @param[in] st OpusEncoder*: State to be freed. - */ -OPUS_EXPORT void opus_encoder_destroy(OpusEncoder *st); - -/** Perform a CTL function on an Opus encoder. - * - * Generally the request and subsequent arguments are generated - * by a convenience macro. - * @param st OpusEncoder*: Encoder state. - * @param request This and all remaining parameters should be replaced by one - * of the convenience macros in @ref opus_genericctls or - * @ref opus_encoderctls. - * @see opus_genericctls - * @see opus_encoderctls - */ -OPUS_EXPORT int opus_encoder_ctl(OpusEncoder *st, int request, ...) OPUS_ARG_NONNULL(1); -/**@}*/ - -/** @defgroup opus_decoder Opus Decoder - * @{ - * - * @brief This page describes the process and functions used to decode Opus. - * - * The decoding process also starts with creating a decoder - * state. This can be done with: - * @code - * int error; - * OpusDecoder *dec; - * dec = opus_decoder_create(Fs, channels, &error); - * @endcode - * where - * @li Fs is the sampling rate and must be 8000, 12000, 16000, 24000, or 48000 - * @li channels is the number of channels (1 or 2) - * @li error will hold the error code in case of failure (or #OPUS_OK on success) - * @li the return value is a newly created decoder state to be used for decoding - * - * While opus_decoder_create() allocates memory for the state, it's also possible - * to initialize pre-allocated memory: - * @code - * int size; - * int error; - * OpusDecoder *dec; - * size = opus_decoder_get_size(channels); - * dec = malloc(size); - * error = opus_decoder_init(dec, Fs, channels); - * @endcode - * where opus_decoder_get_size() returns the required size for the decoder state. Note that - * future versions of this code may change the size, so no assuptions should be made about it. - * - * The decoder state is always continuous in memory and only a shallow copy is sufficient - * to copy it (e.g. memcpy()) - * - * To decode a frame, opus_decode() or opus_decode_float() must be called with a packet of compressed audio data: - * @code - * frame_size = opus_decode(dec, packet, len, decoded, max_size, 0); - * @endcode - * where - * - * @li packet is the byte array containing the compressed data - * @li len is the exact number of bytes contained in the packet - * @li decoded is the decoded audio data in opus_int16 (or float for opus_decode_float()) - * @li max_size is the max duration of the frame in samples (per channel) that can fit into the decoded_frame array - * - * opus_decode() and opus_decode_float() return the number of samples (per channel) decoded from the packet. - * If that value is negative, then an error has occurred. This can occur if the packet is corrupted or if the audio - * buffer is too small to hold the decoded audio. - * - * Opus is a stateful codec with overlapping blocks and as a result Opus - * packets are not coded independently of each other. Packets must be - * passed into the decoder serially and in the correct order for a correct - * decode. Lost packets can be replaced with loss concealment by calling - * the decoder with a null pointer and zero length for the missing packet. - * - * A single codec state may only be accessed from a single thread at - * a time and any required locking must be performed by the caller. Separate - * streams must be decoded with separate decoder states and can be decoded - * in parallel unless the library was compiled with NONTHREADSAFE_PSEUDOSTACK - * defined. - * - */ - -/** Opus decoder state. - * This contains the complete state of an Opus decoder. - * It is position independent and can be freely copied. - * @see opus_decoder_create,opus_decoder_init - */ -typedef struct OpusDecoder OpusDecoder; - -/** Gets the size of an OpusDecoder structure. - * @param [in] channels int: Number of channels. - * This must be 1 or 2. - * @returns The size in bytes. - */ -OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decoder_get_size(int channels); - -/** Allocates and initializes a decoder state. - * @param [in] Fs opus_int32: Sample rate to decode at (Hz). - * This must be one of 8000, 12000, 16000, - * 24000, or 48000. - * @param [in] channels int: Number of channels (1 or 2) to decode - * @param [out] error int*: #OPUS_OK Success or @ref opus_errorcodes - * - * Internally Opus stores data at 48000 Hz, so that should be the default - * value for Fs. However, the decoder can efficiently decode to buffers - * at 8, 12, 16, and 24 kHz so if for some reason the caller cannot use - * data at the full sample rate, or knows the compressed data doesn't - * use the full frequency range, it can request decoding at a reduced - * rate. Likewise, the decoder is capable of filling in either mono or - * interleaved stereo pcm buffers, at the caller's request. - */ -OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusDecoder *opus_decoder_create( - opus_int32 Fs, - int channels, - int *error -); - -/** Initializes a previously allocated decoder state. - * The state must be at least the size returned by opus_decoder_get_size(). - * This is intended for applications which use their own allocator instead of malloc. @see opus_decoder_create,opus_decoder_get_size - * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL. - * @param [in] st OpusDecoder*: Decoder state. - * @param [in] Fs opus_int32: Sampling rate to decode to (Hz). - * This must be one of 8000, 12000, 16000, - * 24000, or 48000. - * @param [in] channels int: Number of channels (1 or 2) to decode - * @retval #OPUS_OK Success or @ref opus_errorcodes - */ -OPUS_EXPORT int opus_decoder_init( - OpusDecoder *st, - opus_int32 Fs, - int channels -) OPUS_ARG_NONNULL(1); - -/** Decode an Opus packet. - * @param [in] st OpusDecoder*: Decoder state - * @param [in] data char*: Input payload. Use a NULL pointer to indicate packet loss - * @param [in] len opus_int32: Number of bytes in payload* - * @param [out] pcm opus_int16*: Output signal (interleaved if 2 channels). length - * is frame_size*channels*sizeof(opus_int16) - * @param [in] frame_size Number of samples per channel of available space in \a pcm. - * If this is less than the maximum packet duration (120ms; 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 [in] 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 decoded samples or @ref opus_errorcodes - */ -OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decode( - OpusDecoder *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 an Opus packet with floating point output. - * @param [in] st OpusDecoder*: Decoder state - * @param [in] data char*: Input payload. Use a NULL pointer to indicate packet loss - * @param [in] len opus_int32: Number of bytes in payload - * @param [out] pcm float*: Output signal (interleaved if 2 channels). length - * is frame_size*channels*sizeof(float) - * @param [in] frame_size Number of samples per channel of available space in \a pcm. - * If this is less than the maximum packet duration (120ms; 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 [in] 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 decoded samples or @ref opus_errorcodes - */ -OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decode_float( - OpusDecoder *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 an Opus decoder. - * - * Generally the request and subsequent arguments are generated - * by a convenience macro. - * @param st OpusDecoder*: Decoder state. - * @param request This and all remaining parameters should be replaced by one - * of the convenience macros in @ref opus_genericctls or - * @ref opus_decoderctls. - * @see opus_genericctls - * @see opus_decoderctls - */ -OPUS_EXPORT int opus_decoder_ctl(OpusDecoder *st, int request, ...) OPUS_ARG_NONNULL(1); - -/** Frees an OpusDecoder allocated by opus_decoder_create(). - * @param[in] st OpusDecoder*: State to be freed. - */ -OPUS_EXPORT void opus_decoder_destroy(OpusDecoder *st); - -/** Parse an opus packet into one or more frames. - * Opus_decode will perform this operation internally so most applications do - * not need to use this function. - * This function does not copy the frames, the returned pointers are pointers into - * the input packet. - * @param [in] data char*: Opus packet to be parsed - * @param [in] len opus_int32: size of data - * @param [out] out_toc char*: TOC pointer - * @param [out] frames char*[48] encapsulated frames - * @param [out] size opus_int16[48] sizes of the encapsulated frames - * @param [out] payload_offset int*: returns the position of the payload within the packet (in bytes) - * @returns number of frames - */ -OPUS_EXPORT int opus_packet_parse( - const unsigned char *data, - opus_int32 len, - unsigned char *out_toc, - const unsigned char *frames[48], - opus_int16 size[48], - int *payload_offset -) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); - -/** Gets the bandwidth of an Opus packet. - * @param [in] data char*: Opus packet - * @retval OPUS_BANDWIDTH_NARROWBAND Narrowband (4kHz bandpass) - * @retval OPUS_BANDWIDTH_MEDIUMBAND Mediumband (6kHz bandpass) - * @retval OPUS_BANDWIDTH_WIDEBAND Wideband (8kHz bandpass) - * @retval OPUS_BANDWIDTH_SUPERWIDEBAND Superwideband (12kHz bandpass) - * @retval OPUS_BANDWIDTH_FULLBAND Fullband (20kHz bandpass) - * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type - */ -OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_bandwidth(const unsigned char *data) OPUS_ARG_NONNULL(1); - -/** Gets the number of samples per frame from an Opus packet. - * @param [in] data char*: Opus packet. - * This must contain at least one byte of - * data. - * @param [in] Fs opus_int32: Sampling rate in Hz. - * This must be a multiple of 400, or - * inaccurate results will be returned. - * @returns Number of samples per frame. - */ -OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_samples_per_frame(const unsigned char *data, opus_int32 Fs) OPUS_ARG_NONNULL(1); - -/** Gets the number of channels from an Opus packet. - * @param [in] data char*: Opus packet - * @returns Number of channels - * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type - */ -OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_nb_channels(const unsigned char *data) OPUS_ARG_NONNULL(1); - -/** Gets the number of frames in an Opus packet. - * @param [in] packet char*: Opus packet - * @param [in] len opus_int32: Length of packet - * @returns Number of frames - * @retval OPUS_BAD_ARG Insufficient data was passed to the function - * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type - */ -OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_nb_frames(const unsigned char packet[], opus_int32 len) OPUS_ARG_NONNULL(1); - -/** Gets the number of samples of an Opus packet. - * @param [in] packet char*: Opus packet - * @param [in] len opus_int32: Length of packet - * @param [in] Fs opus_int32: Sampling rate in Hz. - * This must be a multiple of 400, or - * inaccurate results will be returned. - * @returns Number of samples - * @retval OPUS_BAD_ARG Insufficient data was passed to the function - * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type - */ -OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_nb_samples(const unsigned char packet[], opus_int32 len, opus_int32 Fs) OPUS_ARG_NONNULL(1); - -/** Gets the number of samples of an Opus packet. - * @param [in] dec OpusDecoder*: Decoder state - * @param [in] packet char*: Opus packet - * @param [in] len opus_int32: Length of packet - * @returns Number of samples - * @retval OPUS_BAD_ARG Insufficient data was passed to the function - * @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 - * @{ - * - * The repacketizer can be used to merge multiple Opus packets into a single - * packet or alternatively to split Opus packets that have previously been - * 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. - * 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. - * - * The repacketizing process starts with creating a repacketizer state, either - * by calling opus_repacketizer_create() or by allocating the memory yourself, - * e.g., - * @code - * OpusRepacketizer *rp; - * rp = (OpusRepacketizer*)malloc(opus_repacketizer_get_size()); - * if (rp != NULL) - * opus_repacketizer_init(rp); - * @endcode - * - * Then the application should submit packets with opus_repacketizer_cat(), - * extract new packets with opus_repacketizer_out() or - * opus_repacketizer_out_range(), and then reset the state for the next set of - * input packets via opus_repacketizer_init(). - * - * For example, to split a sequence of packets into individual frames: - * @code - * unsigned char *data; - * int len; - * while (get_next_packet(&data, &len)) - * { - * unsigned char out[1276]; - * opus_int32 out_len; - * int nb_frames; - * int err; - * int i; - * err = opus_repacketizer_cat(rp, data, len); - * if (err != OPUS_OK) - * { - * release_packet(data); - * return err; - * } - * nb_frames = opus_repacketizer_get_nb_frames(rp); - * for (i = 0; i < nb_frames; i++) - * { - * out_len = opus_repacketizer_out_range(rp, i, i+1, out, sizeof(out)); - * if (out_len < 0) - * { - * release_packet(data); - * return (int)out_len; - * } - * output_next_packet(out, out_len); - * } - * opus_repacketizer_init(rp); - * release_packet(data); - * } - * @endcode - * - * Alternatively, to combine a sequence of frames into packets that each - * contain up to TARGET_DURATION_MS milliseconds of data: - * @code - * // The maximum number of packets with duration TARGET_DURATION_MS occurs - * // when the frame size is 2.5 ms, for a total of (TARGET_DURATION_MS*2/5) - * // packets. - * unsigned char *data[(TARGET_DURATION_MS*2/5)+1]; - * opus_int32 len[(TARGET_DURATION_MS*2/5)+1]; - * int nb_packets; - * unsigned char out[1277*(TARGET_DURATION_MS*2/2)]; - * opus_int32 out_len; - * int prev_toc; - * nb_packets = 0; - * while (get_next_packet(data+nb_packets, len+nb_packets)) - * { - * int nb_frames; - * int err; - * nb_frames = opus_packet_get_nb_frames(data[nb_packets], len[nb_packets]); - * if (nb_frames < 1) - * { - * release_packets(data, nb_packets+1); - * return nb_frames; - * } - * nb_frames += opus_repacketizer_get_nb_frames(rp); - * // If adding the next packet would exceed our target, or it has an - * // incompatible TOC sequence, output the packets we already have before - * // submitting it. - * // N.B., The nb_packets > 0 check ensures we've submitted at least one - * // packet since the last call to opus_repacketizer_init(). Otherwise a - * // single packet longer than TARGET_DURATION_MS would cause us to try to - * // output an (invalid) empty packet. It also ensures that prev_toc has - * // been set to a valid value. Additionally, len[nb_packets] > 0 is - * // guaranteed by the call to opus_packet_get_nb_frames() above, so the - * // reference to data[nb_packets][0] should be valid. - * if (nb_packets > 0 && ( - * ((prev_toc & 0xFC) != (data[nb_packets][0] & 0xFC)) || - * opus_packet_get_samples_per_frame(data[nb_packets], 48000)*nb_frames > - * TARGET_DURATION_MS*48)) - * { - * out_len = opus_repacketizer_out(rp, out, sizeof(out)); - * if (out_len < 0) - * { - * release_packets(data, nb_packets+1); - * return (int)out_len; - * } - * output_next_packet(out, out_len); - * opus_repacketizer_init(rp); - * release_packets(data, nb_packets); - * data[0] = data[nb_packets]; - * len[0] = len[nb_packets]; - * nb_packets = 0; - * } - * err = opus_repacketizer_cat(rp, data[nb_packets], len[nb_packets]); - * if (err != OPUS_OK) - * { - * release_packets(data, nb_packets+1); - * return err; - * } - * prev_toc = data[nb_packets][0]; - * nb_packets++; - * } - * // Output the final, partial packet. - * if (nb_packets > 0) - * { - * out_len = opus_repacketizer_out(rp, out, sizeof(out)); - * release_packets(data, nb_packets); - * if (out_len < 0) - * return (int)out_len; - * output_next_packet(out, out_len); - * } - * @endcode - * - * An alternate way of merging packets is to simply call opus_repacketizer_cat() - * unconditionally until it fails. At that point, the merged packet can be - * obtained with opus_repacketizer_out() and the input packet for which - * opus_repacketizer_cat() needs to be re-added to a newly reinitialized - * repacketizer state. - */ - -typedef struct OpusRepacketizer OpusRepacketizer; - -/** Gets the size of an OpusRepacketizer structure. - * @returns The size in bytes. - */ -OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_repacketizer_get_size(void); - -/** (Re)initializes a previously allocated repacketizer state. - * The state must be at least the size returned by opus_repacketizer_get_size(). - * This can be used for applications which use their own allocator instead of - * malloc(). - * It must also be called to reset the queue of packets waiting to be - * repacketized, which is necessary if the maximum packet duration of 120 ms - * is reached or if you wish to submit packets with a different Opus - * configuration (coding mode, audio bandwidth, frame size, or channel count). - * Failure to do so will prevent a new packet from being added with - * opus_repacketizer_cat(). - * @see opus_repacketizer_create - * @see opus_repacketizer_get_size - * @see opus_repacketizer_cat - * @param rp OpusRepacketizer*: The repacketizer state to - * (re)initialize. - * @returns A pointer to the same repacketizer state that was passed in. - */ -OPUS_EXPORT OpusRepacketizer *opus_repacketizer_init(OpusRepacketizer *rp) OPUS_ARG_NONNULL(1); - -/** Allocates memory and initializes the new repacketizer with - * opus_repacketizer_init(). - */ -OPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusRepacketizer *opus_repacketizer_create(void); - -/** Frees an OpusRepacketizer allocated by - * opus_repacketizer_create(). - * @param[in] rp OpusRepacketizer*: State to be freed. - */ -OPUS_EXPORT void opus_repacketizer_destroy(OpusRepacketizer *rp); - -/** Add a packet to the current repacketizer state. - * This packet must match the configuration of any packets already submitted - * for repacketization since the last call to opus_repacketizer_init(). - * This means that it must have the same coding mode, audio bandwidth, frame - * size, and channel count. - * This can be checked in advance by examining the top 6 bits of the first - * byte of the packet, and ensuring they match the top 6 bits of the first - * byte of any previously submitted packet. - * The total duration of audio in the repacketizer state also must not exceed - * 120 ms, the maximum duration of a single packet, after adding this packet. - * - * The contents of the current repacketizer state can be extracted into new - * packets using opus_repacketizer_out() or opus_repacketizer_out_range(). - * - * In order to add a packet with a different configuration or to add more - * audio beyond 120 ms, you must clear the repacketizer state by calling - * opus_repacketizer_init(). - * If a packet is too large to add to the current repacketizer state, no part - * of it is added, even if it contains multiple frames, some of which might - * fit. - * If you wish to be able to add parts of such packets, you should first use - * another repacketizer to split the packet into pieces and add them - * individually. - * @see opus_repacketizer_out_range - * @see opus_repacketizer_out - * @see opus_repacketizer_init - * @param rp OpusRepacketizer*: The repacketizer state to which to - * add the packet. - * @param[in] data const unsigned char*: The packet data. - * The application must ensure - * this pointer remains valid - * until the next call to - * opus_repacketizer_init() or - * opus_repacketizer_destroy(). - * @param len opus_int32: The number of bytes in the packet data. - * @returns An error code indicating whether or not the operation succeeded. - * @retval #OPUS_OK The packet's contents have been added to the repacketizer - * state. - * @retval #OPUS_INVALID_PACKET The packet did not have a valid TOC sequence, - * the packet's TOC sequence was not compatible - * with previously submitted packets (because - * the coding mode, audio bandwidth, frame size, - * or channel count did not match), or adding - * this packet would increase the total amount of - * audio stored in the repacketizer state to more - * than 120 ms. - */ -OPUS_EXPORT int opus_repacketizer_cat(OpusRepacketizer *rp, const unsigned char *data, opus_int32 len) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2); - - -/** Construct a new packet from data previously submitted to the repacketizer - * state via opus_repacketizer_cat(). - * @param rp OpusRepacketizer*: The repacketizer state from which to - * construct the new packet. - * @param begin int: The index of the first frame in the current - * repacketizer state to include in the output. - * @param end int: One past the index of the last frame in the - * current repacketizer state to include in the - * output. - * @param[out] data const unsigned char*: The buffer in which to - * store the output packet. - * @param maxlen opus_int32: The maximum number of bytes to store in - * the output buffer. In order to guarantee - * success, this should be at least - * 1276 for a single frame, - * or for multiple frames, - * 1277*(end-begin). - * However, 1*(end-begin) plus - * the size of all packet data submitted to - * the repacketizer since the last call to - * opus_repacketizer_init() or - * opus_repacketizer_create() is also - * sufficient, and possibly much smaller. - * @returns The total size of the output packet on success, or an error code - * on failure. - * @retval #OPUS_BAD_ARG [begin,end) was an invalid range of - * frames (begin < 0, begin >= end, or end > - * opus_repacketizer_get_nb_frames()). - * @retval #OPUS_BUFFER_TOO_SMALL \a maxlen was insufficient to contain the - * complete output packet. - */ -OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_repacketizer_out_range(OpusRepacketizer *rp, int begin, int end, unsigned char *data, opus_int32 maxlen) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); - -/** Return the total number of frames contained in packet data submitted to - * the repacketizer state so far via opus_repacketizer_cat() since the last - * call to opus_repacketizer_init() or opus_repacketizer_create(). - * This defines the valid range of packets that can be extracted with - * opus_repacketizer_out_range() or opus_repacketizer_out(). - * @param rp OpusRepacketizer*: The repacketizer state containing the - * frames. - * @returns The total number of frames contained in the packet data submitted - * to the repacketizer state. - */ -OPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_repacketizer_get_nb_frames(OpusRepacketizer *rp) OPUS_ARG_NONNULL(1); - -/** Construct a new packet from data previously submitted to the repacketizer - * state via opus_repacketizer_cat(). - * This is a convenience routine that returns all the data submitted so far - * in a single packet. - * It is equivalent to calling - * @code - * opus_repacketizer_out_range(rp, 0, opus_repacketizer_get_nb_frames(rp), - * data, maxlen) - * @endcode - * @param rp OpusRepacketizer*: The repacketizer state from which to - * construct the new packet. - * @param[out] data const unsigned char*: The buffer in which to - * store the output packet. - * @param maxlen opus_int32: The maximum number of bytes to store in - * the output buffer. In order to guarantee - * success, this should be at least - * 1277*opus_repacketizer_get_nb_frames(rp). - * However, - * 1*opus_repacketizer_get_nb_frames(rp) - * plus the size of all packet data - * submitted to the repacketizer since the - * last call to opus_repacketizer_init() or - * opus_repacketizer_create() is also - * sufficient, and possibly much smaller. - * @returns The total size of the output packet on success, or an error code - * on failure. - * @retval #OPUS_BUFFER_TOO_SMALL \a maxlen was insufficient to contain the - * complete output packet. - */ -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 -} -#endif - -#endif /* OPUS_H */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/include/opus_custom.h b/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/include/opus_custom.h deleted file mode 100644 index 41f36bf2..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/include/opus_custom.h +++ /dev/null @@ -1,342 +0,0 @@ -/* Copyright (c) 2007-2008 CSIRO - Copyright (c) 2007-2009 Xiph.Org Foundation - Copyright (c) 2008-2012 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. -*/ - -/** - @file opus_custom.h - @brief Opus-Custom reference implementation API - */ - -#ifndef OPUS_CUSTOM_H -#define OPUS_CUSTOM_H - -#include "opus_defines.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef CUSTOM_MODES -# define OPUS_CUSTOM_EXPORT OPUS_EXPORT -# define OPUS_CUSTOM_EXPORT_STATIC OPUS_EXPORT -#else -# 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 - * @{ - * Opus Custom is an optional part of the Opus specification and - * reference implementation which uses a distinct API from the regular - * API and supports frame sizes that are not normally supported.\ Use - * of Opus Custom is discouraged for all but very special applications - * for which a frame size different from 2.5, 5, 10, or 20 ms is needed - * (for either complexity or latency reasons) and where interoperability - * is less important. - * - * In addition to the interoperability limitations the use of Opus custom - * disables a substantial chunk of the codec and generally lowers the - * quality available at a given bitrate. Normally when an application needs - * a different frame size from the codec it should buffer to match the - * sizes but this adds a small amount of delay which may be important - * in some very low latency applications. Some transports (especially - * constant rate RF transports) may also work best with frames of - * particular durations. - * - * Libopus only supports custom modes if they are enabled at compile time. - * - * The Opus Custom API is similar to the regular API but the - * @ref opus_encoder_create and @ref opus_decoder_create calls take - * an additional mode parameter which is a structure produced by - * a call to @ref opus_custom_mode_create. Both the encoder and decoder - * must create a mode using the same sample rate (fs) and frame size - * (frame size) so these parameters must either be signaled out of band - * or fixed in a particular implementation. - * - * Similar to regular Opus the custom modes support on the fly frame size - * switching, but the sizes available depend on the particular frame size in - * use. For some initial frame sizes on a single on the fly size is available. - */ - -/** Contains the state of an encoder. One encoder state is needed - for each stream. It is initialized once at the beginning of the - stream. Do *not* re-initialize the state for every frame. - @brief Encoder state - */ -typedef struct OpusCustomEncoder OpusCustomEncoder; - -/** State of the decoder. One decoder state is needed for each stream. - It is initialized once at the beginning of the stream. Do *not* - re-initialize the state for every frame. - @brief Decoder state - */ -typedef struct OpusCustomDecoder OpusCustomDecoder; - -/** The mode contains all the information necessary to create an - encoder. Both the encoder and decoder need to be initialized - with exactly the same mode, otherwise the output will be - corrupted. - @brief Mode configuration - */ -typedef struct OpusCustomMode OpusCustomMode; - -/** Creates a new mode struct. This will be passed to an encoder or - * decoder. The mode MUST NOT BE DESTROYED until the encoders and - * decoders that use it are destroyed as well. - * @param [in] Fs int: Sampling rate (8000 to 96000 Hz) - * @param [in] frame_size int: Number of samples (per channel) to encode in each - * packet (64 - 1024, prime factorization must contain zero or more 2s, 3s, or 5s and no other primes) - * @param [out] error int*: Returned error code (if NULL, no error will be returned) - * @return A newly created mode - */ -OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT OpusCustomMode *opus_custom_mode_create(opus_int32 Fs, int frame_size, int *error); - -/** Destroys a mode struct. Only call this after all encoders and - * decoders using this mode are destroyed as well. - * @param [in] mode OpusCustomMode*: Mode to be freed. - */ -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 - * @param [in] channels int: Number of channels - * @returns size - */ -OPUS_CUSTOM_EXPORT_STATIC OPUS_WARN_UNUSED_RESULT int opus_custom_encoder_get_size( - const OpusCustomMode *mode, - int channels -) 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. - * @see opus_custom_encoder_create(),opus_custom_encoder_get_size() - * To reset a previously initialized state use the OPUS_RESET_STATE CTL. - * @param [in] st OpusCustomEncoder*: Encoder state - * @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 - * @return OPUS_OK Success or @ref opus_errorcodes - */ -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. - */ -OPUS_CUSTOM_EXPORT void opus_custom_encoder_destroy(OpusCustomEncoder *st); - -/** Encodes a frame of audio. - * @param [in] st OpusCustomEncoder*: Encoder state - * @param [in] pcm float*: PCM audio in float format, 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. There must be exactly - * frame_size samples per channel. - * @param [in] frame_size int: Number of samples per frame of input signal - * @param [out] compressed char *: The compressed data is written here. This may not alias pcm and must be at least maxCompressedBytes long. - * @param [in] maxCompressedBytes int: Maximum number of bytes to use for compressing the frame - * (can change from one frame to another) - * @return Number of bytes written to "compressed". - * If negative, an error has occurred (see error codes). It is IMPORTANT that - * the length returned be somehow transmitted to the decoder. Otherwise, no - * decoding is possible. - */ -OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT int opus_custom_encode_float( - OpusCustomEncoder *st, - const float *pcm, - int frame_size, - unsigned char *compressed, - int maxCompressedBytes -) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4); - -/** Encodes a frame of audio. - * @param [in] st OpusCustomEncoder*: Encoder state - * @param [in] pcm opus_int16*: PCM audio in signed 16-bit format (native endian). - * There must be exactly frame_size samples per channel. - * @param [in] frame_size int: Number of samples per frame of input signal - * @param [out] compressed char *: The compressed data is written here. This may not alias pcm and must be at least maxCompressedBytes long. - * @param [in] maxCompressedBytes int: Maximum number of bytes to use for compressing the frame - * (can change from one frame to another) - * @return Number of bytes written to "compressed". - * If negative, an error has occurred (see error codes). It is IMPORTANT that - * the length returned be somehow transmitted to the decoder. Otherwise, no - * decoding is possible. - */ -OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT int opus_custom_encode( - OpusCustomEncoder *st, - const opus_int16 *pcm, - int frame_size, - unsigned char *compressed, - int maxCompressedBytes -) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4); - -/** Perform a CTL function on an Opus custom encoder. - * - * Generally the request and subsequent arguments are generated - * by a convenience macro. - * @see opus_encoderctls - */ -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. - * @param [in] mode OpusCustomMode *: Mode configuration - * @param [in] channels int: Number of channels - * @returns size - */ -OPUS_CUSTOM_EXPORT_STATIC OPUS_WARN_UNUSED_RESULT int opus_custom_decoder_get_size( - const OpusCustomMode *mode, - int channels -) 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. - * @see opus_custom_decoder_create(),opus_custom_decoder_get_size() - * To reset a previously initialized state use the OPUS_RESET_STATE CTL. - * @param [in] st OpusCustomDecoder*: Decoder state - * @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 - * @return OPUS_OK Success or @ref opus_errorcodes - */ -OPUS_CUSTOM_EXPORT_STATIC int opus_custom_decoder_init( - OpusCustomDecoder *st, - const OpusCustomMode *mode, - 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. - */ -OPUS_CUSTOM_EXPORT void opus_custom_decoder_destroy(OpusCustomDecoder *st); - -/** Decode an opus custom frame with floating point output - * @param [in] st OpusCustomDecoder*: Decoder state - * @param [in] data char*: Input payload. Use a NULL pointer to indicate packet loss - * @param [in] len int: Number of bytes in payload - * @param [out] pcm float*: Output signal (interleaved if 2 channels). length - * is frame_size*channels*sizeof(float) - * @param [in] frame_size Number of samples per channel of available space in *pcm. - * @returns Number of decoded samples or @ref opus_errorcodes - */ -OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT int opus_custom_decode_float( - OpusCustomDecoder *st, - const unsigned char *data, - int len, - float *pcm, - int frame_size -) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); - -/** Decode an opus custom frame - * @param [in] st OpusCustomDecoder*: Decoder state - * @param [in] data char*: Input payload. Use a NULL pointer to indicate packet loss - * @param [in] len int: Number of bytes in payload - * @param [out] pcm opus_int16*: Output signal (interleaved if 2 channels). length - * is frame_size*channels*sizeof(opus_int16) - * @param [in] frame_size Number of samples per channel of available space in *pcm. - * @returns Number of decoded samples or @ref opus_errorcodes - */ -OPUS_CUSTOM_EXPORT OPUS_WARN_UNUSED_RESULT int opus_custom_decode( - OpusCustomDecoder *st, - const unsigned char *data, - int len, - opus_int16 *pcm, - int frame_size -) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4); - -/** Perform a CTL function on an Opus custom decoder. - * - * Generally the request and subsequent arguments are generated - * by a convenience macro. - * @see opus_genericctls - */ -OPUS_CUSTOM_EXPORT int opus_custom_decoder_ctl(OpusCustomDecoder * OPUS_RESTRICT st, int request, ...) OPUS_ARG_NONNULL(1); - -/**@}*/ - -#ifdef __cplusplus -} -#endif - -#endif /* OPUS_CUSTOM_H */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/include/opus_defines.h b/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/include/opus_defines.h deleted file mode 100644 index 265089f6..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/include/opus_defines.h +++ /dev/null @@ -1,726 +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. -*/ - -/** - * @file opus_defines.h - * @brief Opus reference implementation constants - */ - -#ifndef OPUS_DEFINES_H -#define OPUS_DEFINES_H - -#include "opus_types.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** @defgroup opus_errorcodes Error codes - * @{ - */ -/** No error @hideinitializer*/ -#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*/ -#define OPUS_BUFFER_TOO_SMALL -2 -/** An internal error was detected @hideinitializer*/ -#define OPUS_INTERNAL_ERROR -3 -/** The compressed data passed is corrupted @hideinitializer*/ -#define OPUS_INVALID_PACKET -4 -/** Invalid/unsupported request number @hideinitializer*/ -#define OPUS_UNIMPLEMENTED -5 -/** An encoder or decoder structure is invalid or already freed @hideinitializer*/ -#define OPUS_INVALID_STATE -6 -/** Memory allocation has failed @hideinitializer*/ -#define OPUS_ALLOC_FAIL -7 -/**@}*/ - -/** @cond OPUS_INTERNAL_DOC */ -/**Export control for opus functions */ - -#ifndef OPUS_EXPORT -# if defined(WIN32) -# ifdef OPUS_BUILD -# define OPUS_EXPORT __declspec(dllexport) -# else -# define OPUS_EXPORT -# endif -# elif defined(__GNUC__) && defined(OPUS_BUILD) -# define OPUS_EXPORT __attribute__ ((visibility ("default"))) -# else -# define OPUS_EXPORT -# endif -#endif - -# if !defined(OPUS_GNUC_PREREQ) -# if defined(__GNUC__)&&defined(__GNUC_MINOR__) -# define OPUS_GNUC_PREREQ(_maj,_min) \ - ((__GNUC__<<16)+__GNUC_MINOR__>=((_maj)<<16)+(_min)) -# else -# define OPUS_GNUC_PREREQ(_maj,_min) 0 -# endif -# endif - -#if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) ) -# if OPUS_GNUC_PREREQ(3,0) -# define OPUS_RESTRICT __restrict__ -# elif (defined(_MSC_VER) && _MSC_VER >= 1400) -# define OPUS_RESTRICT __restrict -# else -# define OPUS_RESTRICT -# endif -#else -# 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. */ -#if defined(__GNUC__) && OPUS_GNUC_PREREQ(3, 4) -# define OPUS_WARN_UNUSED_RESULT __attribute__ ((__warn_unused_result__)) -#else -# define OPUS_WARN_UNUSED_RESULT -#endif -#if !defined(OPUS_BUILD) && defined(__GNUC__) && OPUS_GNUC_PREREQ(3, 4) -# define OPUS_ARG_NONNULL(_x) __attribute__ ((__nonnull__(_x))) -#else -# define OPUS_ARG_NONNULL(_x) -#endif - -/** These are the actual Encoder CTL ID numbers. - * They should not be used directly by applications. - * In general, SETs should be even and GETs should be odd.*/ -#define OPUS_SET_APPLICATION_REQUEST 4000 -#define OPUS_GET_APPLICATION_REQUEST 4001 -#define OPUS_SET_BITRATE_REQUEST 4002 -#define OPUS_GET_BITRATE_REQUEST 4003 -#define OPUS_SET_MAX_BANDWIDTH_REQUEST 4004 -#define OPUS_GET_MAX_BANDWIDTH_REQUEST 4005 -#define OPUS_SET_VBR_REQUEST 4006 -#define OPUS_GET_VBR_REQUEST 4007 -#define OPUS_SET_BANDWIDTH_REQUEST 4008 -#define OPUS_GET_BANDWIDTH_REQUEST 4009 -#define OPUS_SET_COMPLEXITY_REQUEST 4010 -#define OPUS_GET_COMPLEXITY_REQUEST 4011 -#define OPUS_SET_INBAND_FEC_REQUEST 4012 -#define OPUS_GET_INBAND_FEC_REQUEST 4013 -#define OPUS_SET_PACKET_LOSS_PERC_REQUEST 4014 -#define OPUS_GET_PACKET_LOSS_PERC_REQUEST 4015 -#define OPUS_SET_DTX_REQUEST 4016 -#define OPUS_GET_DTX_REQUEST 4017 -#define OPUS_SET_VBR_CONSTRAINT_REQUEST 4020 -#define OPUS_GET_VBR_CONSTRAINT_REQUEST 4021 -#define OPUS_SET_FORCE_CHANNELS_REQUEST 4022 -#define OPUS_GET_FORCE_CHANNELS_REQUEST 4023 -#define OPUS_SET_SIGNAL_REQUEST 4024 -#define OPUS_GET_SIGNAL_REQUEST 4025 -#define OPUS_GET_LOOKAHEAD_REQUEST 4027 -/* #define OPUS_RESET_STATE 4028 */ -#define OPUS_GET_SAMPLE_RATE_REQUEST 4029 -#define OPUS_GET_FINAL_RANGE_REQUEST 4031 -#define OPUS_GET_PITCH_REQUEST 4033 -#define OPUS_SET_GAIN_REQUEST 4034 -#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 */ - -/* 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 - * @see opus_genericctls, opus_encoderctls - * @{ - */ -/* Values for the various encoder CTLs */ -#define OPUS_AUTO -1000 /**opus_int32: Allowed values: 0-10, inclusive. - * - * @hideinitializer */ -#define OPUS_SET_COMPLEXITY(x) OPUS_SET_COMPLEXITY_REQUEST, __opus_check_int(x) -/** Gets the encoder's complexity configuration. - * @see OPUS_SET_COMPLEXITY - * @param[out] x opus_int32 *: Returns a value in the range 0-10, - * inclusive. - * @hideinitializer */ -#define OPUS_GET_COMPLEXITY(x) OPUS_GET_COMPLEXITY_REQUEST, __opus_check_int_ptr(x) - -/** Configures the bitrate in the encoder. - * Rates from 500 to 512000 bits per second are meaningful, as well as the - * special values #OPUS_AUTO and #OPUS_BITRATE_MAX. - * The value #OPUS_BITRATE_MAX can be used to cause the codec to use as much - * rate as it can, which is useful for controlling the rate by adjusting the - * output buffer size. - * @see OPUS_GET_BITRATE - * @param[in] x opus_int32: Bitrate in bits per second. The default - * is determined based on the number of - * channels and the input sampling rate. - * @hideinitializer */ -#define OPUS_SET_BITRATE(x) OPUS_SET_BITRATE_REQUEST, __opus_check_int(x) -/** Gets the encoder's bitrate configuration. - * @see OPUS_SET_BITRATE - * @param[out] x opus_int32 *: Returns the bitrate in bits per second. - * The default is determined based on the - * number of channels and the input - * sampling rate. - * @hideinitializer */ -#define OPUS_GET_BITRATE(x) OPUS_GET_BITRATE_REQUEST, __opus_check_int_ptr(x) - -/** 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: - *
    - *
    0
    Hard CBR. For LPC/hybrid modes at very low bit-rate, this can - * cause noticeable quality degradation.
    - *
    1
    VBR (default). The exact type of VBR is controlled by - * #OPUS_SET_VBR_CONSTRAINT.
    - *
    - * @hideinitializer */ -#define OPUS_SET_VBR(x) OPUS_SET_VBR_REQUEST, __opus_check_int(x) -/** Determine if variable bitrate (VBR) is enabled in the encoder. - * @see OPUS_SET_VBR - * @see OPUS_GET_VBR_CONSTRAINT - * @param[out] x opus_int32 *: Returns one of the following values: - *
    - *
    0
    Hard CBR.
    - *
    1
    VBR (default). The exact type of VBR may be retrieved via - * #OPUS_GET_VBR_CONSTRAINT.
    - *
    - * @hideinitializer */ -#define OPUS_GET_VBR(x) OPUS_GET_VBR_REQUEST, __opus_check_int_ptr(x) - -/** Enables or disables constrained VBR in the encoder. - * This setting is ignored when the encoder is in CBR mode. - * @warning Only the MDCT mode of Opus currently heeds the constraint. - * Speech mode ignores it completely, hybrid mode may fail to obey it - * if the LPC layer uses more bitrate than the constraint would have - * permitted. - * @see OPUS_GET_VBR_CONSTRAINT - * @see OPUS_SET_VBR - * @param[in] x opus_int32: Allowed values: - *
    - *
    0
    Unconstrained VBR.
    - *
    1
    Constrained VBR (default). This creates a maximum of one - * frame of buffering delay assuming a transport with a - * serialization speed of the nominal bitrate.
    - *
    - * @hideinitializer */ -#define OPUS_SET_VBR_CONSTRAINT(x) OPUS_SET_VBR_CONSTRAINT_REQUEST, __opus_check_int(x) -/** Determine if constrained VBR is enabled in the encoder. - * @see OPUS_SET_VBR_CONSTRAINT - * @see OPUS_GET_VBR - * @param[out] x opus_int32 *: Returns one of the following values: - *
    - *
    0
    Unconstrained VBR.
    - *
    1
    Constrained VBR (default).
    - *
    - * @hideinitializer */ -#define OPUS_GET_VBR_CONSTRAINT(x) OPUS_GET_VBR_CONSTRAINT_REQUEST, __opus_check_int_ptr(x) - -/** Configures mono/stereo forcing in the encoder. - * This can force the encoder to produce packets encoded as either mono or - * stereo, regardless of the format of the input audio. This is useful when - * the caller knows that the input signal is currently a mono source embedded - * in a stereo stream. - * @see OPUS_GET_FORCE_CHANNELS - * @param[in] x opus_int32: Allowed values: - *
    - *
    #OPUS_AUTO
    Not forced (default)
    - *
    1
    Forced mono
    - *
    2
    Forced stereo
    - *
    - * @hideinitializer */ -#define OPUS_SET_FORCE_CHANNELS(x) OPUS_SET_FORCE_CHANNELS_REQUEST, __opus_check_int(x) -/** Gets the encoder's forced channel configuration. - * @see OPUS_SET_FORCE_CHANNELS - * @param[out] x opus_int32 *: - *
    - *
    #OPUS_AUTO
    Not forced (default)
    - *
    1
    Forced mono
    - *
    2
    Forced stereo
    - *
    - * @hideinitializer */ -#define OPUS_GET_FORCE_CHANNELS(x) OPUS_GET_FORCE_CHANNELS_REQUEST, __opus_check_int_ptr(x) - -/** Configures the maximum bandpass that the encoder will select automatically. - * Applications should normally use this instead of #OPUS_SET_BANDWIDTH - * (leaving that set to the default, #OPUS_AUTO). This allows the - * application to set an upper bound based on the type of input it is - * providing, but still gives the encoder the freedom to reduce the bandpass - * when the bitrate becomes too low, for better overall quality. - * @see OPUS_GET_MAX_BANDWIDTH - * @param[in] x opus_int32: Allowed values: - *
    - *
    OPUS_BANDWIDTH_NARROWBAND
    4 kHz passband
    - *
    OPUS_BANDWIDTH_MEDIUMBAND
    6 kHz passband
    - *
    OPUS_BANDWIDTH_WIDEBAND
    8 kHz passband
    - *
    OPUS_BANDWIDTH_SUPERWIDEBAND
    12 kHz passband
    - *
    OPUS_BANDWIDTH_FULLBAND
    20 kHz passband (default)
    - *
    - * @hideinitializer */ -#define OPUS_SET_MAX_BANDWIDTH(x) OPUS_SET_MAX_BANDWIDTH_REQUEST, __opus_check_int(x) - -/** Gets the encoder's configured maximum allowed bandpass. - * @see OPUS_SET_MAX_BANDWIDTH - * @param[out] x opus_int32 *: Allowed values: - *
    - *
    #OPUS_BANDWIDTH_NARROWBAND
    4 kHz passband
    - *
    #OPUS_BANDWIDTH_MEDIUMBAND
    6 kHz passband
    - *
    #OPUS_BANDWIDTH_WIDEBAND
    8 kHz passband
    - *
    #OPUS_BANDWIDTH_SUPERWIDEBAND
    12 kHz passband
    - *
    #OPUS_BANDWIDTH_FULLBAND
    20 kHz passband (default)
    - *
    - * @hideinitializer */ -#define OPUS_GET_MAX_BANDWIDTH(x) OPUS_GET_MAX_BANDWIDTH_REQUEST, __opus_check_int_ptr(x) - -/** Sets the encoder's bandpass to a specific value. - * This prevents the encoder from automatically selecting the bandpass based - * on the available bitrate. If an application knows the bandpass of the input - * audio it is providing, it should normally use #OPUS_SET_MAX_BANDWIDTH - * instead, which still gives the encoder the freedom to reduce the bandpass - * when the bitrate becomes too low, for better overall quality. - * @see OPUS_GET_BANDWIDTH - * @param[in] x opus_int32: Allowed values: - *
    - *
    #OPUS_AUTO
    (default)
    - *
    #OPUS_BANDWIDTH_NARROWBAND
    4 kHz passband
    - *
    #OPUS_BANDWIDTH_MEDIUMBAND
    6 kHz passband
    - *
    #OPUS_BANDWIDTH_WIDEBAND
    8 kHz passband
    - *
    #OPUS_BANDWIDTH_SUPERWIDEBAND
    12 kHz passband
    - *
    #OPUS_BANDWIDTH_FULLBAND
    20 kHz passband
    - *
    - * @hideinitializer */ -#define OPUS_SET_BANDWIDTH(x) OPUS_SET_BANDWIDTH_REQUEST, __opus_check_int(x) - -/** Configures the type of signal being encoded. - * This is a hint which helps the encoder's mode selection. - * @see OPUS_GET_SIGNAL - * @param[in] x opus_int32: Allowed values: - *
    - *
    #OPUS_AUTO
    (default)
    - *
    #OPUS_SIGNAL_VOICE
    Bias thresholds towards choosing LPC or Hybrid modes.
    - *
    #OPUS_SIGNAL_MUSIC
    Bias thresholds towards choosing MDCT modes.
    - *
    - * @hideinitializer */ -#define OPUS_SET_SIGNAL(x) OPUS_SET_SIGNAL_REQUEST, __opus_check_int(x) -/** Gets the encoder's configured signal type. - * @see OPUS_SET_SIGNAL - * @param[out] x opus_int32 *: Returns one of the following values: - *
    - *
    #OPUS_AUTO
    (default)
    - *
    #OPUS_SIGNAL_VOICE
    Bias thresholds towards choosing LPC or Hybrid modes.
    - *
    #OPUS_SIGNAL_MUSIC
    Bias thresholds towards choosing MDCT modes.
    - *
    - * @hideinitializer */ -#define OPUS_GET_SIGNAL(x) OPUS_GET_SIGNAL_REQUEST, __opus_check_int_ptr(x) - - -/** Configures the encoder's intended application. - * The initial value is a mandatory argument to the encoder_create function. - * @see OPUS_GET_APPLICATION - * @param[in] x opus_int32: Returns one of the following values: - *
    - *
    #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.
    - *
    - * @hideinitializer */ -#define OPUS_SET_APPLICATION(x) OPUS_SET_APPLICATION_REQUEST, __opus_check_int(x) -/** Gets the encoder's configured application. - * @see OPUS_SET_APPLICATION - * @param[out] x opus_int32 *: Returns one of the following values: - *
    - *
    #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.
    - *
    - * @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 - * and output. From the perspective of a decoding application the real data begins this many - * samples late. - * - * The decoder contribution to this delay is identical for all decoders, but the - * encoder portion of the delay may vary from implementation to implementation, - * version to version, or even depend on the encoder's initial configuration. - * Applications needing delay compensation should call this CTL rather than - * hard-coding a value. - * @param[out] x opus_int32 *: Number of lookahead samples - * @hideinitializer */ -#define OPUS_GET_LOOKAHEAD(x) OPUS_GET_LOOKAHEAD_REQUEST, __opus_check_int_ptr(x) - -/** Configures the encoder's use of inband forward error correction (FEC). - * @note This is only applicable to the LPC layer - * @see OPUS_GET_INBAND_FEC - * @param[in] x opus_int32: Allowed values: - *
    - *
    0
    Disable inband FEC (default).
    - *
    1
    Enable inband FEC.
    - *
    - * @hideinitializer */ -#define OPUS_SET_INBAND_FEC(x) OPUS_SET_INBAND_FEC_REQUEST, __opus_check_int(x) -/** Gets encoder's configured use of inband forward error correction. - * @see OPUS_SET_INBAND_FEC - * @param[out] x opus_int32 *: Returns one of the following values: - *
    - *
    0
    Inband FEC disabled (default).
    - *
    1
    Inband FEC enabled.
    - *
    - * @hideinitializer */ -#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. - * @see OPUS_GET_PACKET_LOSS_PERC - * @param[in] x opus_int32: Loss percentage in the range 0-100, inclusive (default: 0). - * @hideinitializer */ -#define OPUS_SET_PACKET_LOSS_PERC(x) OPUS_SET_PACKET_LOSS_PERC_REQUEST, __opus_check_int(x) -/** Gets the encoder's configured packet loss percentage. - * @see OPUS_SET_PACKET_LOSS_PERC - * @param[out] x opus_int32 *: Returns the configured loss percentage - * in the range 0-100, inclusive (default: 0). - * @hideinitializer */ -#define OPUS_GET_PACKET_LOSS_PERC(x) OPUS_GET_PACKET_LOSS_PERC_REQUEST, __opus_check_int_ptr(x) - -/** Configures the encoder's use of discontinuous transmission (DTX). - * @note This is only applicable to the LPC layer - * @see OPUS_GET_DTX - * @param[in] x opus_int32: Allowed values: - *
    - *
    0
    Disable DTX (default).
    - *
    1
    Enabled DTX.
    - *
    - * @hideinitializer */ -#define OPUS_SET_DTX(x) OPUS_SET_DTX_REQUEST, __opus_check_int(x) -/** Gets encoder's configured use of discontinuous transmission. - * @see OPUS_SET_DTX - * @param[out] x opus_int32 *: Returns one of the following values: - *
    - *
    0
    DTX disabled (default).
    - *
    1
    DTX enabled.
    - *
    - * @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. - * @see OPUS_GET_LSB_DEPTH - * @param[in] x opus_int32: Input precision in bits, between 8 and 24 - * (default: 24). - * @hideinitializer */ -#define OPUS_SET_LSB_DEPTH(x) OPUS_SET_LSB_DEPTH_REQUEST, __opus_check_int(x) -/** Gets the encoder's configured signal depth. - * @see OPUS_SET_LSB_DEPTH - * @param[out] x opus_int32 *: Input precision in bits, between 8 and - * 24 (default: 24). - * @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). - * @hideinitializer */ -#define OPUS_GET_LAST_PACKET_DURATION(x) OPUS_GET_LAST_PACKET_DURATION_REQUEST, __opus_check_int_ptr(x) - -/** 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_VARIABLE_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 2.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_VARIABLE
    Optimize the frame size dynamically.
    - *
    - * @hideinitializer */ -#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_VARIABLE_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 2.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_VARIABLE
    Optimize the frame size dynamically.
    - *
    - * @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. (default : 0) - * @hideinitializer */ -#define OPUS_SET_PREDICTION_DISABLED(x) OPUS_SET_PREDICTION_DISABLED_REQUEST, __opus_check_int(x) -/** Gets the encoder's configured prediction status. - * @hideinitializer */ -#define OPUS_GET_PREDICTION_DISABLED(x) OPUS_GET_PREDICTION_DISABLED_REQUEST, __opus_check_int_ptr(x) - -/**@}*/ - -/** @defgroup opus_genericctls Generic CTLs - * - * These macros are used with the \c opus_decoder_ctl and - * \c opus_encoder_ctl calls to generate a particular - * request. - * - * When called on an \c OpusDecoder they apply to that - * particular decoder instance. When called on an - * \c OpusEncoder they apply to the corresponding setting - * on that encoder instance, if present. - * - * Some usage examples: - * - * @code - * int ret; - * opus_int32 pitch; - * ret = opus_decoder_ctl(dec_ctx, OPUS_GET_PITCH(&pitch)); - * if (ret == OPUS_OK) return ret; - * - * opus_encoder_ctl(enc_ctx, OPUS_RESET_STATE); - * opus_decoder_ctl(dec_ctx, OPUS_RESET_STATE); - * - * opus_int32 enc_bw, dec_bw; - * opus_encoder_ctl(enc_ctx, OPUS_GET_BANDWIDTH(&enc_bw)); - * opus_decoder_ctl(dec_ctx, OPUS_GET_BANDWIDTH(&dec_bw)); - * if (enc_bw != dec_bw) { - * printf("packet bandwidth mismatch!\n"); - * } - * @endcode - * - * @see opus_encoder, opus_decoder_ctl, opus_encoder_ctl, opus_decoderctls, opus_encoderctls - * @{ - */ - -/** Resets the codec state to be equivalent to a freshly initialized state. - * This should be called when switching streams in order to prevent - * the back to back decoding from giving different results from - * one at a time decoding. - * @hideinitializer */ -#define OPUS_RESET_STATE 4028 - -/** Gets the final state of the codec's entropy coder. - * This is used for testing purposes, - * The encoder and decoder state should be identical after coding a payload - * (assuming no data corruption or software bugs) - * - * @param[out] x opus_uint32 *: Entropy coder state - * - * @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: - *
    - *
    #OPUS_AUTO
    (default)
    - *
    #OPUS_BANDWIDTH_NARROWBAND
    4 kHz passband
    - *
    #OPUS_BANDWIDTH_MEDIUMBAND
    6 kHz passband
    - *
    #OPUS_BANDWIDTH_WIDEBAND
    8 kHz passband
    - *
    #OPUS_BANDWIDTH_SUPERWIDEBAND
    12 kHz passband
    - *
    #OPUS_BANDWIDTH_FULLBAND
    20 kHz passband
    - *
    - * @hideinitializer */ -#define OPUS_GET_BANDWIDTH(x) OPUS_GET_BANDWIDTH_REQUEST, __opus_check_int_ptr(x) - -/**@}*/ - -/** @defgroup opus_decoderctls Decoder related CTLs - * @see opus_genericctls, opus_encoderctls, opus_decoder - * @{ - */ - -/** Configures decoder gain adjustment. - * Scales the decoded output by a factor specified in Q8 dB units. - * This has a maximum range of -32768 to 32767 inclusive, and returns - * OPUS_BAD_ARG otherwise. The default is zero indicating no adjustment. - * This setting survives decoder reset. - * - * gain = pow(10, x/(20.0*256)) - * - * @param[in] x opus_int32: Amount to scale PCM signal by in Q8 dB units. - * @hideinitializer */ -#define OPUS_SET_GAIN(x) OPUS_SET_GAIN_REQUEST, __opus_check_int(x) -/** Gets the decoder's configured gain adjustment. @see OPUS_SET_GAIN - * - * @param[out] x opus_int32 *: Amount to scale PCM signal by in Q8 dB units. - * @hideinitializer */ -#define OPUS_GET_GAIN(x) OPUS_GET_GAIN_REQUEST, __opus_check_int_ptr(x) - -/**@}*/ - -/** @defgroup opus_libinfo Opus library information functions - * @{ - */ - -/** Converts an opus error code into a human readable string. - * - * @param[in] error int: Error number - * @returns Error string - */ -OPUS_EXPORT const char *opus_strerror(int error); - -/** Gets the libopus version string. - * - * @returns Version string - */ -OPUS_EXPORT const char *opus_get_version_string(void); -/**@}*/ - -#ifdef __cplusplus -} -#endif - -#endif /* OPUS_DEFINES_H */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/include/opus_multistream.h b/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/include/opus_multistream.h deleted file mode 100644 index ae599793..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/include/opus_multistream.h +++ /dev/null @@ -1,660 +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. -*/ - -/** - * @file opus_multistream.h - * @brief Opus reference implementation multistream API - */ - -#ifndef OPUS_MULTISTREAM_H -#define OPUS_MULTISTREAM_H - -#include "opus.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** @cond OPUS_INTERNAL_DOC */ - -/** Macros to trigger compilation errors when the wrong types are provided to a - * CTL. */ -/**@{*/ -#define __opus_check_encstate_ptr(ptr) ((ptr) + ((ptr) - (OpusEncoder**)(ptr))) -#define __opus_check_decstate_ptr(ptr) ((ptr) + ((ptr) - (OpusDecoder**)(ptr))) -/**@}*/ - -/** These are the actual encoder and decoder CTL ID numbers. - * They should not be used directly by applications. - * In general, SETs should be even and GETs should be odd.*/ -/**@{*/ -#define OPUS_MULTISTREAM_GET_ENCODER_STATE_REQUEST 5120 -#define OPUS_MULTISTREAM_GET_DECODER_STATE_REQUEST 5122 -/**@}*/ - -/** @endcond */ - -/** @defgroup opus_multistream_ctls Multistream specific encoder and decoder CTLs - * - * These are convenience macros that are specific to the - * opus_multistream_encoder_ctl() and opus_multistream_decoder_ctl() - * interface. - * The CTLs from @ref opus_genericctls, @ref opus_encoderctls, and - * @ref opus_decoderctls may be applied to a multistream encoder or decoder as - * well. - * In addition, you may retrieve the encoder or decoder state for an specific - * stream via #OPUS_MULTISTREAM_GET_ENCODER_STATE or - * #OPUS_MULTISTREAM_GET_DECODER_STATE and apply CTLs to it individually. - */ -/**@{*/ - -/** Gets the encoder state for an individual stream of a multistream encoder. - * @param[in] x opus_int32: The index of the stream whose encoder you - * wish to retrieve. - * This must be non-negative and less than - * the streams parameter used - * to initialize the encoder. - * @param[out] y OpusEncoder**: Returns a pointer to the given - * encoder state. - * @retval OPUS_BAD_ARG The index of the requested stream was out of range. - * @hideinitializer - */ -#define OPUS_MULTISTREAM_GET_ENCODER_STATE(x,y) OPUS_MULTISTREAM_GET_ENCODER_STATE_REQUEST, __opus_check_int(x), __opus_check_encstate_ptr(y) - -/** Gets the decoder state for an individual stream of a multistream decoder. - * @param[in] x opus_int32: The index of the stream whose decoder you - * wish to retrieve. - * This must be non-negative and less than - * the streams parameter used - * to initialize the decoder. - * @param[out] y OpusDecoder**: Returns a pointer to the given - * decoder state. - * @retval OPUS_BAD_ARG The index of the requested stream was out of range. - * @hideinitializer - */ -#define OPUS_MULTISTREAM_GET_DECODER_STATE(x,y) OPUS_MULTISTREAM_GET_DECODER_STATE_REQUEST, __opus_check_int(x), __opus_check_decstate_ptr(y) - -/**@}*/ - -/** @defgroup opus_multistream Opus Multistream API - * @{ - * - * The multistream API allows individual Opus streams to be combined into a - * single packet, enabling support for up to 255 channels. Unlike an - * elementary Opus stream, the encoder and decoder must negotiate the channel - * configuration before the decoder can successfully interpret the data in the - * 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. - * 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 - * decoder. - * - * Multistream Opus streams can contain up to 255 elementary Opus streams. - * These may be either "uncoupled" or "coupled", indicating that the decoder - * is configured to decode them to either 1 or 2 channels, respectively. - * The streams are ordered so that all coupled streams appear at the - * beginning. - * - * A mapping table defines which decoded channel i - * should be used for each input/output (I/O) channel j. This table is - * typically provided as an unsigned char array. - * Let i = mapping[j] be the index for I/O channel j. - * If i < 2*coupled_streams, then I/O channel j is - * encoded as the left channel of stream (i/2) if i - * is even, or as the right channel of stream (i/2) if - * i is odd. Otherwise, I/O channel j is encoded as - * mono in stream (i - coupled_streams), unless it has the special - * value 255, in which case it is omitted from the encoding entirely (the - * decoder will reproduce it as silence). Each value i must either - * be the special value 255 or be less than streams + coupled_streams. - * - * The output channels specified by the encoder - * should use the - * 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). - * - * Each multistream packet contains an Opus packet for each stream, and all of - * the Opus packets in a single multistream packet must have the same - * duration. Therefore the duration of a multistream packet can be extracted - * from the TOC sequence of the first stream, which is located at the - * beginning of the packet, just like an elementary Opus stream: - * - * @code - * int nb_samples; - * int nb_frames; - * nb_frames = opus_packet_get_nb_frames(data, len); - * if (nb_frames < 1) - * return nb_frames; - * nb_samples = opus_packet_get_samples_per_frame(data, 48000) * nb_frames; - * @endcode - * - * The general encoding and decoding process proceeds exactly the same as in - * the normal @ref opus_encoder and @ref opus_decoder APIs. - * See their documentation for an overview of how to use the corresponding - * multistream functions. - */ - -/** Opus multistream encoder state. - * This contains the complete state of a multistream Opus encoder. - * It is position independent and can be freely copied. - * @see opus_multistream_encoder_create - * @see opus_multistream_encoder_init - */ -typedef struct OpusMSEncoder OpusMSEncoder; - -/** Opus multistream decoder state. - * This contains the complete state of a multistream Opus decoder. - * It is position independent and can be freely copied. - * @see opus_multistream_decoder_create - * @see opus_multistream_decoder_init - */ -typedef struct OpusMSDecoder OpusMSDecoder; - -/**\name Multistream encoder functions */ -/**@{*/ - -/** Gets the size of an OpusMSEncoder structure. - * @param streams int: The total number of streams to encode from the - * input. - * This must be no more than 255. - * @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 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_multistream_encoder_get_size( - int streams, - int coupled_streams -); - -OPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_multistream_surround_encoder_get_size( - int channels, - int mapping_family -); - - -/** Allocates and initializes a multistream encoder state. - * Call opus_multistream_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 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[in] mapping const unsigned char[channels]: Mapping from - * encoded channels to input channels, as described in - * @ref opus_multistream. As an extra constraint, the - * multistream encoder does not allow encoding coupled - * streams for which one channel is unused since this - * is never a good idea. - * @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 OpusMSEncoder *opus_multistream_encoder_create( - opus_int32 Fs, - int channels, - int streams, - int coupled_streams, - const unsigned char *mapping, - int application, - int *error -) OPUS_ARG_NONNULL(5); - -OPUS_EXPORT OPUS_WARN_UNUSED_RESULT 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 -) OPUS_ARG_NONNULL(5); - -/** Initialize a previously allocated multistream encoder state. - * The memory pointed to by \a st must be at least the size returned by - * opus_multistream_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_multistream_encoder_create - * @see opus_multistream_encoder_get_size - * @param st OpusMSEncoder*: Multistream 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[in] mapping const unsigned char[channels]: Mapping from - * encoded channels to input channels, as described in - * @ref opus_multistream. As an extra constraint, the - * multistream encoder does not allow encoding coupled - * streams for which one channel is unused since this - * is never a good idea. - * @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_multistream_encoder_init( - OpusMSEncoder *st, - opus_int32 Fs, - int channels, - int streams, - int coupled_streams, - const unsigned char *mapping, - int application -) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6); - -OPUS_EXPORT 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 -) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6); - -/** Encodes a multistream Opus frame. - * @param st OpusMSEncoder*: Multistream 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_multistream_encode( - OpusMSEncoder *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 multistream Opus frame from floating point input. - * @param st OpusMSEncoder*: Multistream 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_multistream_encode_float( - OpusMSEncoder *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 OpusMSEncoder allocated by - * opus_multistream_encoder_create(). - * @param st OpusMSEncoder*: Multistream encoder state to be freed. - */ -OPUS_EXPORT void opus_multistream_encoder_destroy(OpusMSEncoder *st); - -/** Perform a CTL function on a multistream Opus encoder. - * - * Generally the request and subsequent arguments are generated by a - * convenience macro. - * @param st OpusMSEncoder*: Multistream 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, or @ref opus_multistream_ctls. - * @see opus_genericctls - * @see opus_encoderctls - * @see opus_multistream_ctls - */ -OPUS_EXPORT int opus_multistream_encoder_ctl(OpusMSEncoder *st, int request, ...) OPUS_ARG_NONNULL(1); - -/**@}*/ - -/**\name Multistream decoder functions */ -/**@{*/ - -/** Gets the size of an OpusMSDecoder structure. - * @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_multistream_decoder_get_size( - int streams, - int coupled_streams -); - -/** Allocates and initializes a multistream decoder state. - * Call opus_multistream_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] mapping const unsigned char[channels]: Mapping from - * coded channels to output channels, as described in - * @ref opus_multistream. - * @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 OpusMSDecoder *opus_multistream_decoder_create( - opus_int32 Fs, - int channels, - int streams, - int coupled_streams, - const unsigned char *mapping, - int *error -) OPUS_ARG_NONNULL(5); - -/** Intialize a previously allocated decoder state object. - * The memory pointed to by \a st must be at least the size returned by - * opus_multistream_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_multistream_decoder_create - * @see opus_multistream_deocder_get_size - * @param st OpusMSEncoder*: Multistream 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] mapping const unsigned char[channels]: Mapping from - * coded channels to output channels, as described in - * @ref opus_multistream. - * @returns #OPUS_OK on success, or an error code (see @ref opus_errorcodes) - * on failure. - */ -OPUS_EXPORT int opus_multistream_decoder_init( - OpusMSDecoder *st, - opus_int32 Fs, - int channels, - int streams, - int coupled_streams, - const unsigned char *mapping -) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6); - -/** Decode a multistream Opus packet. - * @param st OpusMSDecoder*: Multistream 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_multistream_decode( - OpusMSDecoder *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 multistream Opus packet with floating point output. - * @param st OpusMSDecoder*: Multistream 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_multistream_decode_float( - OpusMSDecoder *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 multistream Opus decoder. - * - * Generally the request and subsequent arguments are generated by a - * convenience macro. - * @param st OpusMSDecoder*: Multistream 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, or @ref opus_multistream_ctls. - * @see opus_genericctls - * @see opus_decoderctls - * @see opus_multistream_ctls - */ -OPUS_EXPORT int opus_multistream_decoder_ctl(OpusMSDecoder *st, int request, ...) OPUS_ARG_NONNULL(1); - -/** Frees an OpusMSDecoder allocated by - * opus_multistream_decoder_create(). - * @param st OpusMSDecoder: Multistream decoder state to be freed. - */ -OPUS_EXPORT void opus_multistream_decoder_destroy(OpusMSDecoder *st); - -/**@}*/ - -/**@}*/ - -#ifdef __cplusplus -} -#endif - -#endif /* OPUS_MULTISTREAM_H */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/include/opus_types.h b/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/include/opus_types.h deleted file mode 100644 index b28e03ae..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/include/opus_types.h +++ /dev/null @@ -1,159 +0,0 @@ -/* (C) COPYRIGHT 1994-2002 Xiph.Org Foundation */ -/* Modified 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. -*/ -/* opus_types.h based on ogg_types.h from libogg */ - -/** - @file opus_types.h - @brief Opus reference implementation types -*/ -#ifndef OPUS_TYPES_H -#define OPUS_TYPES_H - -/* 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)) -#include - - typedef int16_t opus_int16; - typedef uint16_t opus_uint16; - typedef int32_t opus_int32; - typedef uint32_t opus_uint32; -#elif defined(_WIN32) - -# if defined(__CYGWIN__) -# include <_G_config.h> - typedef _G_int32_t opus_int32; - typedef _G_uint32_t opus_uint32; - typedef _G_int16 opus_int16; - typedef _G_uint16 opus_uint16; -# elif defined(__MINGW32__) - typedef short opus_int16; - typedef unsigned short opus_uint16; - typedef int opus_int32; - typedef unsigned int opus_uint32; -# elif defined(__MWERKS__) - typedef int opus_int32; - typedef unsigned int opus_uint32; - typedef short opus_int16; - typedef unsigned short opus_uint16; -# else - /* MSVC/Borland */ - typedef __int32 opus_int32; - typedef unsigned __int32 opus_uint32; - typedef __int16 opus_int16; - typedef unsigned __int16 opus_uint16; -# endif - -#elif defined(__MACOS__) - -# include - typedef SInt16 opus_int16; - typedef UInt16 opus_uint16; - typedef SInt32 opus_int32; - typedef UInt32 opus_uint32; - -#elif (defined(__APPLE__) && defined(__MACH__)) /* MacOS X Framework build */ - -# include - typedef int16_t opus_int16; - typedef u_int16_t opus_uint16; - typedef int32_t opus_int32; - typedef u_int32_t opus_uint32; - -#elif defined(__BEOS__) - - /* Be */ -# include - typedef int16 opus_int16; - typedef u_int16 opus_uint16; - typedef int32_t opus_int32; - typedef u_int32_t opus_uint32; - -#elif defined (__EMX__) - - /* OS/2 GCC */ - typedef short opus_int16; - typedef unsigned short opus_uint16; - typedef int opus_int32; - typedef unsigned int opus_uint32; - -#elif defined (DJGPP) - - /* DJGPP */ - typedef short opus_int16; - typedef unsigned short opus_uint16; - typedef int opus_int32; - typedef unsigned int opus_uint32; - -#elif defined(R5900) - - /* PS2 EE */ - typedef int opus_int32; - typedef unsigned opus_uint32; - typedef short opus_int16; - typedef unsigned short opus_uint16; - -#elif defined(__SYMBIAN32__) - - /* Symbian GCC */ - typedef signed short opus_int16; - typedef unsigned short opus_uint16; - typedef signed int opus_int32; - typedef unsigned int opus_uint32; - -#elif defined(CONFIG_TI_C54X) || defined (CONFIG_TI_C55X) - - typedef short opus_int16; - typedef unsigned short opus_uint16; - typedef long opus_int32; - typedef unsigned long opus_uint32; - -#elif defined(CONFIG_TI_C6X) - - typedef short opus_int16; - typedef unsigned short opus_uint16; - typedef int opus_int32; - typedef unsigned int opus_uint32; - -#else - - /* Give up, take a reasonable guess */ - typedef short opus_int16; - typedef unsigned short opus_uint16; - typedef int opus_int32; - typedef unsigned int opus_uint32; - -#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/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/analysis.c b/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/analysis.c deleted file mode 100644 index 778a62aa..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/analysis.c +++ /dev/null @@ -1,645 +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 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 "kiss_fft.h" -#include "celt.h" -#include "modes.h" -#include "arch.h" -#include "quant_bands.h" -#include -#include "analysis.h" -#include "mlp.h" -#include "stack_alloc.h" - -extern const MLP net; - -#ifndef M_PI -#define M_PI 3.141592653 -#endif - -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] = { - 2, 4, 6, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, 68, 80, 96, 120 -}; - -static const int extra_bands[NB_TOT_BANDS+1] = { - 1, 2, 4, 6, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, 68, 80, 96, 120, 160, 200 -}; - -/*static const float tweight[NB_TBANDS+1] = { - .3, .4, .5, .6, .7, .8, .9, 1., 1., 1., 1., 1., 1., 1., .8, .7, .6, .5 -};*/ - -#define NB_TONAL_SKIP_BANDS 9 - -#define cA 0.43157974f -#define cB 0.67848403f -#define cC 0.08595542f -#define cE ((float)M_PI/2) -static OPUS_INLINE float fast_atan2f(float y, float x) { - float x2, y2; - /* Should avoid underflow on the values we'll get */ - if (ABS16(x)+ABS16(y)<1e-9f) - { - x*=1e12f; - y*=1e12f; - } - x2 = x*x; - y2 = y*y; - if(x2read_pos; - curr_lookahead = tonal->write_pos-tonal->read_pos; - if (curr_lookahead<0) - curr_lookahead += DETECT_SIZE; - - if (len > 480 && pos != tonal->write_pos) - { - pos++; - if (pos==DETECT_SIZE) - pos=0; - } - if (pos == tonal->write_pos) - pos--; - if (pos<0) - pos = DETECT_SIZE-1; - OPUS_COPY(info_out, &tonal->info[pos], 1); - tonal->read_subframe += len/120; - while (tonal->read_subframe>=4) - { - tonal->read_subframe -= 4; - tonal->read_pos++; - } - if (tonal->read_pos>=DETECT_SIZE) - tonal->read_pos-=DETECT_SIZE; - - /* Compensate for the delay in the features themselves. - FIXME: Need a better estimate the 10 I just made up */ - curr_lookahead = IMAX(curr_lookahead-10, 0); - - psum=0; - /* Summing the probability of transition patterns that involve music at - time (DETECT_SIZE-curr_lookahead-1) */ - for (i=0;ipmusic[i]; - for (;ipspeech[i]; - psum = psum*tonal->music_confidence + (1-psum)*tonal->speech_confidence; - /*printf("%f %f %f\n", psum, info_out->music_prob, info_out->tonality);*/ - - info_out->music_prob = psum; -} - -void tonality_analysis(TonalityAnalysisState *tonal, AnalysisInfo *info_out, 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 bandwidth=0; - float maxE = 0; - float noise_floor; - int remaining; - AnalysisInfo *info; - SAVE_STACK; - - tonal->last_transition++; - alpha = 1.f/IMIN(20, 1+tonal->count); - alphaE = 1.f/IMIN(50, 1+tonal->count); - alphaE2 = 1.f/IMIN(1000, 1+tonal->count); - - if (tonal->count<4) - tonal->music_prob = .5; - kfft = celt_mode->mdct.kfft[0]; - if (tonal->count==0) - tonal->mem_fill = 240; - downmix(x, &tonal->inmem[tonal->mem_fill], IMIN(len, ANALYSIS_BUF_SIZE-tonal->mem_fill), offset, c1, c2, C); - if (tonal->mem_fill+len < ANALYSIS_BUF_SIZE) - { - tonal->mem_fill += len; - /* Don't have enough to update the analysis */ - RESTORE_STACK; - return; - } - info = &tonal->info[tonal->write_pos++]; - if (tonal->write_pos>=DETECT_SIZE) - tonal->write_pos-=DETECT_SIZE; - - 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); - downmix(x, &tonal->inmem[240], remaining, offset+ANALYSIS_BUF_SIZE-tonal->mem_fill, c1, c2, C); - tonal->mem_fill = 240 + remaining; - opus_fft(kfft, in, out); - - 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; - for (b=0;bE[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); - tonal->lowE[b] = MIN32(logE[b], tonal->lowE[b]+.01f); - tonal->highE[b] = MAX32(logE[b], tonal->highE[b]-.1f); - if (tonal->highE[b] < tonal->lowE[b]+1.f) - { - tonal->highE[b]+=.5f; - tonal->lowE[b]-=.5f; - } - relativeE += (logE[b]-tonal->lowE[b])/(1e-15f+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]; - } - - bandwidth_mask = 0; - bandwidth = 0; - maxE = 0; - noise_floor = 5.7e-4f/(1<<(IMAX(0,lsb_depth-8))); -#ifdef FIXED_POINT - noise_floor *= 1<<(15+SIG_SHIFT); -#endif - noise_floor *= noise_floor; - for (b=0;bmeanE[b] = MAX32((1-alphaE2)*tonal->meanE[b], E); - E = MAX32(E, tonal->meanE[b]); - /* Use a simple follower with 13 dB/Bark slope for spreading function */ - bandwidth_mask = MAX32(.05f*bandwidth_mask, E); - /* Consider the band "active" only if all these conditions are met: - 1) less than 10 dB below the simple follower - 2) less than 90 dB below the peak band (maximal masking possible considering - both the ATH and the loudness-dependent slope of the spreading function) - 3) above the PCM quantization noise floor - */ - if (E>.1*bandwidth_mask && E*1e9f > maxE && E > noise_floor*(band_end-band_start)) - bandwidth = b; - } - if (tonal->count<=2) - bandwidth = 20; - frame_loudness = 20*(float)log10(frame_loudness); - tonal->Etracker = MAX32(tonal->Etracker-.03f, 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; - } - - frame_stationarity /= NB_TBANDS; - relativeE /= NB_TBANDS; - if (tonal->count<10) - relativeE = .5; - 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++; - 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<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]); - features[20] = info->tonality; - features[21] = info->activity; - features[22] = frame_stationarity; - features[23] = info->tonality_slope; - features[24] = tonal->lowECount; - -#ifndef DISABLE_FLOAT_API - mlp_process(&net, features, frame_probs); - frame_probs[0] = .5f*(frame_probs[0]+1); - /* Curve fitting between the MLP probability and the actual probability */ - frame_probs[0] = .01f + 1.21f*frame_probs[0]*frame_probs[0] - .23f*(float)pow(frame_probs[0], 10); - /* Probability of active audio (as opposed to silence) */ - frame_probs[1] = .5f*frame_probs[1]+.5f; - /* Consider that silence has a 50-50 probability. */ - frame_probs[0] = frame_probs[1]*frame_probs[0] + (1-frame_probs[1])*.5f; - - /*printf("%f %f ", frame_probs[0], frame_probs[1]);*/ - { - /* Probability of state transition */ - float tau; - /* Represents independence of the MLP probabilities, where - beta=1 means fully independent. */ - float beta; - /* Denormalized probability of speech (p0) and music (p1) after update */ - float p0, p1; - /* Probabilities for "all speech" and "all music" */ - float s0, m0; - /* Probability sum for renormalisation */ - float psum; - /* Instantaneous probability of speech and music, with beta pre-applied. */ - float speech0; - float music0; - - /* One transition every 3 minutes of active audio */ - tau = .00005f*frame_probs[1]; - beta = .05f; - if (1) { - /* Adapt beta based on how "unexpected" the new prob is */ - float p, q; - p = MAX16(.05f,MIN16(.95f,frame_probs[0])); - q = MAX16(.05f,MIN16(.95f,tonal->music_prob)); - beta = .01f+.05f*ABS16(p-q)/(p*(1-q)+q*(1-p)); - } - /* p0 and p1 are the probabilities of speech and music at this frame - using only information from previous frame and applying the - state transition model */ - p0 = (1-tonal->music_prob)*(1-tau) + tonal->music_prob *tau; - p1 = tonal->music_prob *(1-tau) + (1-tonal->music_prob)*tau; - /* We apply the current probability with exponent beta to work around - the fact that the probability estimates aren't independent. */ - p0 *= (float)pow(1-frame_probs[0], beta); - p1 *= (float)pow(frame_probs[0], beta); - /* Normalise the probabilities to get the Marokv probability of music. */ - tonal->music_prob = p1/(p0+p1); - info->music_prob = tonal->music_prob; - - /* This chunk of code deals with delayed decision. */ - psum=1e-20f; - /* Instantaneous probability of speech and music, with beta pre-applied. */ - speech0 = (float)pow(1-frame_probs[0], beta); - music0 = (float)pow(frame_probs[0], beta); - if (tonal->count==1) - { - tonal->pspeech[0]=.5; - tonal->pmusic [0]=.5; - } - /* Updated probability of having only speech (s0) or only music (m0), - before considering the new observation. */ - s0 = tonal->pspeech[0] + tonal->pspeech[1]; - m0 = tonal->pmusic [0] + tonal->pmusic [1]; - /* Updates s0 and m0 with instantaneous probability. */ - tonal->pspeech[0] = s0*(1-tau)*speech0; - tonal->pmusic [0] = m0*(1-tau)*music0; - /* Propagate the transition probabilities */ - for (i=1;ipspeech[i] = tonal->pspeech[i+1]*speech0; - tonal->pmusic [i] = tonal->pmusic [i+1]*music0; - } - /* Probability that the latest frame is speech, when all the previous ones were music. */ - tonal->pspeech[DETECT_SIZE-1] = m0*tau*speech0; - /* Probability that the latest frame is music, when all the previous ones were speech. */ - tonal->pmusic [DETECT_SIZE-1] = s0*tau*music0; - - /* Renormalise probabilities to 1 */ - for (i=0;ipspeech[i] + tonal->pmusic[i]; - psum = 1.f/psum; - for (i=0;ipspeech[i] *= psum; - tonal->pmusic [i] *= psum; - } - psum = tonal->pmusic[0]; - for (i=1;ipspeech[i]; - - /* Estimate our confidence in the speech/music decisions */ - if (frame_probs[1]>.75) - { - if (tonal->music_prob>.9) - { - float adapt; - adapt = 1.f/(++tonal->music_confidence_count); - tonal->music_confidence_count = IMIN(tonal->music_confidence_count, 500); - tonal->music_confidence += adapt*MAX16(-.2f,frame_probs[0]-tonal->music_confidence); - } - if (tonal->music_prob<.1) - { - float adapt; - adapt = 1.f/(++tonal->speech_confidence_count); - tonal->speech_confidence_count = IMIN(tonal->speech_confidence_count, 500); - tonal->speech_confidence += adapt*MIN16(.2f,frame_probs[0]-tonal->speech_confidence); - } - } else { - if (tonal->music_confidence_count==0) - tonal->music_confidence = .9f; - if (tonal->speech_confidence_count==0) - tonal->speech_confidence = .1f; - } - } - if (tonal->last_music != (tonal->music_prob>.5f)) - tonal->last_transition=0; - tonal->last_music = tonal->music_prob>.5f; -#else - info->music_prob = 0; -#endif - /*for (i=0;i<25;i++) - printf("%f ", features[i]); - printf("\n");*/ - - info->bandwidth = bandwidth; - /*printf("%d %d\n", info->bandwidth, info->opus_bandwidth);*/ - info->noisiness = frame_noisiness; - info->valid = 1; - if (info_out!=NULL) - OPUS_COPY(info_out, info, 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; - - if (analysis_pcm != NULL) - { - /* Avoid overflow/wrap-around of the analysis buffer */ - analysis_frame_size = IMIN((DETECT_SIZE-5)*Fs/100, analysis_frame_size); - - pcm_len = analysis_frame_size - analysis->analysis_offset; - offset = analysis->analysis_offset; - do { - tonality_analysis(analysis, NULL, celt_mode, analysis_pcm, IMIN(480, pcm_len), offset, c1, c2, C, lsb_depth, downmix); - offset += 480; - pcm_len -= 480; - } while (pcm_len>0); - analysis->analysis_offset = analysis_frame_size; - - analysis->analysis_offset -= frame_size; - } - - analysis_info->valid = 0; - tonality_get_info(analysis, analysis_info, frame_size); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/analysis.h b/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/analysis.h deleted file mode 100644 index be0388fa..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/analysis.h +++ /dev/null @@ -1,90 +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 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" - -#define NB_FRAMES 8 -#define NB_TBANDS 18 -#define NB_TOT_BANDS 21 -#define ANALYSIS_BUF_SIZE 720 /* 15 ms at 48 kHz */ - -#define DETECT_SIZE 200 - -typedef struct { - 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; - float E[NB_FRAMES][NB_TBANDS]; - float lowE[NB_TBANDS]; - float highE[NB_TBANDS]; - float meanE[NB_TOT_BANDS]; - float mem[32]; - float cmean[8]; - float std[9]; - float music_prob; - float Etracker; - float lowECount; - int E_count; - int last_music; - int last_transition; - int count; - float subframe_mem[3]; - int analysis_offset; - /** Probability of having speech for time i to DETECT_SIZE-1 (and music before). - pspeech[0] is the probability that all frames in the window are speech. */ - float pspeech[DETECT_SIZE]; - /** Probability of having music for time i to DETECT_SIZE-1 (and speech before). - pmusic[0] is the probability that all frames in the window are music. */ - float pmusic[DETECT_SIZE]; - float speech_confidence; - float music_confidence; - int speech_confidence_count; - int music_confidence_count; - int write_pos; - int read_pos; - int read_subframe; - AnalysisInfo info[DETECT_SIZE]; -} TonalityAnalysisState; - -void tonality_analysis(TonalityAnalysisState *tonal, AnalysisInfo *info, - const CELTMode *celt_mode, const void *x, int len, int offset, int c1, int c2, int C, int lsb_depth, downmix_func downmix); - -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/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/mlp.c b/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/mlp.c deleted file mode 100644 index 46386026..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/mlp.c +++ /dev/null @@ -1,140 +0,0 @@ -/* Copyright (c) 2008-2011 Octasic Inc. - 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 - -#include "opus_types.h" -#include "opus_defines.h" - -#include -#include "mlp.h" -#include "arch.h" -#include "tansig_table.h" -#define MAX_NEURONS 100 - -#if 0 -static OPUS_INLINE opus_val16 tansig_approx(opus_val32 _x) /* Q19 */ -{ - int i; - opus_val16 xx; /* Q11 */ - /*double x, y;*/ - opus_val16 dy, yy; /* Q14 */ - /*x = 1.9073e-06*_x;*/ - if (_x>=QCONST32(8,19)) - return QCONST32(1.,14); - if (_x<=-QCONST32(8,19)) - return -QCONST32(1.,14); - xx = EXTRACT16(SHR32(_x, 8)); - /*i = lrint(25*x);*/ - i = SHR32(ADD32(1024,MULT16_16(25, xx)),11); - /*x -= .04*i;*/ - xx -= EXTRACT16(SHR32(MULT16_16(20972,i),8)); - /*x = xx*(1./2048);*/ - /*y = tansig_table[250+i];*/ - yy = tansig_table[250+i]; - /*y = yy*(1./16384);*/ - dy = 16384-MULT16_16_Q14(yy,yy); - yy = yy + MULT16_16_Q14(MULT16_16_Q11(xx,dy),(16384 - MULT16_16_Q11(yy,xx))); - return yy; -} -#else -/*extern const float tansig_table[501];*/ -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; - 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; -} -#endif - -#if 0 -void mlp_process(const MLP *m, const opus_val16 *in, opus_val16 *out) -{ - int j; - opus_val16 hidden[MAX_NEURONS]; - const opus_val16 *W = m->weights; - /* Copy to tmp_in */ - for (j=0;jtopo[1];j++) - { - int k; - opus_val32 sum = SHL32(EXTEND32(*W++),8); - for (k=0;ktopo[0];k++) - sum = MAC16_16(sum, in[k],*W++); - hidden[j] = tansig_approx(sum); - } - for (j=0;jtopo[2];j++) - { - int k; - opus_val32 sum = SHL32(EXTEND32(*W++),14); - for (k=0;ktopo[1];k++) - sum = MAC16_16(sum, hidden[k], *W++); - out[j] = tansig_approx(EXTRACT16(PSHR32(sum,17))); - } -} -#else -void mlp_process(const MLP *m, const float *in, float *out) -{ - int j; - float hidden[MAX_NEURONS]; - const float *W = m->weights; - /* Copy to tmp_in */ - for (j=0;jtopo[1];j++) - { - int k; - float sum = *W++; - for (k=0;ktopo[0];k++) - sum = sum + in[k]**W++; - hidden[j] = tansig_approx(sum); - } - for (j=0;jtopo[2];j++) - { - int k; - float sum = *W++; - for (k=0;ktopo[1];k++) - sum = sum + hidden[k]**W++; - out[j] = tansig_approx(sum); - } -} -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/mlp.h b/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/mlp.h deleted file mode 100644 index 86c8e061..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/mlp.h +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (c) 2008-2011 Octasic Inc. - 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 _MLP_H_ -#define _MLP_H_ - -#include "arch.h" - -typedef struct { - int layers; - const int *topo; - const float *weights; -} MLP; - -void mlp_process(const MLP *m, const float *in, float *out); - -#endif /* _MLP_H_ */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/mlp_data.c b/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/mlp_data.c deleted file mode 100644 index 401c4c02..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/mlp_data.c +++ /dev/null @@ -1,105 +0,0 @@ -/* The contents of this file was automatically generated by mlp_train.c - It contains multi-layer perceptron (MLP) weights. */ - -#include "mlp.h" - -/* RMS error was 0.138320, seed was 1361535663 */ - -static const float weights[422] = { - -/* hidden layer */ --0.0941125f, -0.302976f, -0.603555f, -0.19393f, -0.185983f, --0.601617f, -0.0465317f, -0.114563f, -0.103599f, -0.618938f, --0.317859f, -0.169949f, -0.0702885f, 0.148065f, 0.409524f, -0.548432f, 0.367649f, -0.494393f, 0.764306f, -1.83957f, -0.170849f, 12.786f, -1.08848f, -1.27284f, -16.2606f, -24.1773f, -5.57454f, -0.17276f, -0.163388f, -0.224421f, --0.0948944f, -0.0728695f, -0.26557f, -0.100283f, -0.0515459f, --0.146142f, -0.120674f, -0.180655f, 0.12857f, 0.442138f, --0.493735f, 0.167767f, 0.206699f, -0.197567f, 0.417999f, -1.50364f, -0.773341f, -10.0401f, 0.401872f, 2.97966f, -15.2165f, -1.88905f, -1.19254f, 0.0285397f, -0.00405139f, -0.0707565f, 0.00825699f, -0.0927269f, -0.010393f, -0.00428882f, --0.00489743f, -0.0709731f, -0.00255992f, 0.0395619f, 0.226424f, -0.0325231f, 0.162175f, -0.100118f, 0.485789f, 0.12697f, -0.285937f, 0.0155637f, 0.10546f, 3.05558f, 1.15059f, --1.00904f, -1.83088f, 3.31766f, -3.42516f, -0.119135f, --0.0405654f, 0.00690068f, 0.0179877f, -0.0382487f, 0.00597941f, --0.0183611f, 0.00190395f, -0.144322f, -0.0435671f, 0.000990594f, -0.221087f, 0.142405f, 0.484066f, 0.404395f, 0.511955f, --0.237255f, 0.241742f, 0.35045f, -0.699428f, 10.3993f, -2.6507f, -2.43459f, -4.18838f, 1.05928f, 1.71067f, -0.00667811f, -0.0721335f, -0.0397346f, 0.0362704f, -0.11496f, --0.0235776f, 0.0082161f, -0.0141741f, -0.0329699f, -0.0354253f, -0.00277404f, -0.290654f, -1.14767f, -0.319157f, -0.686544f, -0.36897f, 0.478899f, 0.182579f, -0.411069f, 0.881104f, --4.60683f, 1.4697f, 0.335845f, -1.81905f, -30.1699f, -5.55225f, 0.0019508f, -0.123576f, -0.0727332f, -0.0641597f, --0.0534458f, -0.108166f, -0.0937368f, -0.0697883f, -0.0275475f, --0.192309f, -0.110074f, 0.285375f, -0.405597f, 0.0926724f, --0.287881f, -0.851193f, -0.099493f, -0.233764f, -1.2852f, -1.13611f, 3.12168f, -0.0699f, -1.86216f, 2.65292f, --7.31036f, 2.44776f, -0.00111802f, -0.0632786f, -0.0376296f, --0.149851f, 0.142963f, 0.184368f, 0.123433f, 0.0756158f, -0.117312f, 0.0933395f, 0.0692163f, 0.0842592f, 0.0704683f, -0.0589963f, 0.0942205f, -0.448862f, 0.0262677f, 0.270352f, --0.262317f, 0.172586f, 2.00227f, -0.159216f, 0.038422f, -10.2073f, 4.15536f, -2.3407f, -0.0550265f, 0.00964792f, --0.141336f, 0.0274501f, 0.0343921f, -0.0487428f, 0.0950172f, --0.00775017f, -0.0372492f, -0.00548121f, -0.0663695f, 0.0960506f, --0.200008f, -0.0412827f, 0.58728f, 0.0515787f, 0.337254f, -0.855024f, 0.668371f, -0.114904f, -3.62962f, -0.467477f, --0.215472f, 2.61537f, 0.406117f, -1.36373f, 0.0425394f, -0.12208f, 0.0934502f, 0.123055f, 0.0340935f, -0.142466f, -0.035037f, -0.0490666f, 0.0733208f, 0.0576672f, 0.123984f, --0.0517194f, -0.253018f, 0.590565f, 0.145849f, 0.315185f, -0.221534f, -0.149081f, 0.216161f, -0.349575f, 24.5664f, --0.994196f, 0.614289f, -18.7905f, -2.83277f, -0.716801f, --0.347201f, 0.479515f, -0.246027f, 0.0758683f, 0.137293f, --0.17781f, 0.118751f, -0.00108329f, -0.237334f, 0.355732f, --0.12991f, -0.0547627f, -0.318576f, -0.325524f, 0.180494f, --0.0625604f, 0.141219f, 0.344064f, 0.37658f, -0.591772f, -5.8427f, -0.38075f, 0.221894f, -1.41934f, -1.87943e+06f, -1.34114f, 0.0283355f, -0.0447856f, -0.0211466f, -0.0256927f, -0.0139618f, 0.0207934f, -0.0107666f, 0.0110969f, 0.0586069f, --0.0253545f, -0.0328433f, 0.11872f, -0.216943f, 0.145748f, -0.119808f, -0.0915211f, -0.120647f, -0.0787719f, -0.143644f, --0.595116f, -1.152f, -1.25335f, -1.17092f, 4.34023f, --975268.f, -1.37033f, -0.0401123f, 0.210602f, -0.136656f, -0.135962f, -0.0523293f, 0.0444604f, 0.0143928f, 0.00412666f, --0.0193003f, 0.218452f, -0.110204f, -2.02563f, 0.918238f, --2.45362f, 1.19542f, -0.061362f, -1.92243f, 0.308111f, -0.49764f, 0.912356f, 0.209272f, -2.34525f, 2.19326f, --6.47121f, 1.69771f, -0.725123f, 0.0118929f, 0.0377944f, -0.0554003f, 0.0226452f, -0.0704421f, -0.0300309f, 0.0122978f, --0.0041782f, -0.0686612f, 0.0313115f, 0.039111f, 0.364111f, --0.0945548f, 0.0229876f, -0.17414f, 0.329795f, 0.114714f, -0.30022f, 0.106997f, 0.132355f, 5.79932f, 0.908058f, --0.905324f, -3.3561f, 0.190647f, 0.184211f, -0.673648f, -0.231807f, -0.0586222f, 0.230752f, -0.438277f, 0.245857f, --0.17215f, 0.0876383f, -0.720512f, 0.162515f, 0.0170571f, -0.101781f, 0.388477f, 1.32931f, 1.08548f, -0.936301f, --2.36958f, -6.71988f, -3.44376f, 2.13818f, 14.2318f, -4.91459f, -3.09052f, -9.69191f, -0.768234f, 1.79604f, -0.0549653f, 0.163399f, 0.0797025f, 0.0343933f, -0.0555876f, --0.00505673f, 0.0187258f, 0.0326628f, 0.0231486f, 0.15573f, -0.0476223f, -0.254824f, 1.60155f, -0.801221f, 2.55496f, -0.737629f, -1.36249f, -0.695463f, -2.44301f, -1.73188f, -3.95279f, 1.89068f, 0.486087f, -11.3343f, 3.9416e+06f, - -/* output layer */ --0.381439f, 0.12115f, -0.906927f, 2.93878f, 1.6388f, -0.882811f, 0.874344f, 1.21726f, -0.874545f, 0.321706f, -0.785055f, 0.946558f, -0.575066f, -3.46553f, 0.884905f, -0.0924047f, -9.90712f, 0.391338f, 0.160103f, -2.04954f, -4.1455f, 0.0684029f, -0.144761f, -0.285282f, 0.379244f, --1.1584f, -0.0277241f, -9.85f, -4.82386f, 3.71333f, -3.87308f, 3.52558f}; - -static const int topo[3] = {25, 15, 2}; - -const MLP net = { - 3, - topo, - weights -}; diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/opus.c b/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/opus.c deleted file mode 100644 index 30890b9c..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/opus.c +++ /dev/null @@ -1,329 +0,0 @@ -/* Copyright (c) 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 "opus.h" -#include "opus_private.h" - -#ifndef DISABLE_FLOAT_API -OPUS_EXPORT void opus_pcm_soft_clip(float *_x, int N, int C, float *declip_mem) -{ - int c; - int i; - float *x; - - if (C<1 || N<1 || !_x || !declip_mem) return; - - /* First thing: saturate everything to +/- 2 which is the highest level our - non-linearity can handle. At the point where the signal reaches +/-2, - the derivative will be zero anyway, so this doesn't introduce any - discontinuity in the derivative. */ - 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); - 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_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) -{ - int i, bytes; - int count; - int cbr; - unsigned char ch, toc; - int framesize; - opus_int32 last_size; - opus_int32 pad = 0; - 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 { - 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 -#include -#include -#include - -#define OPUS_PI (3.14159265F) - -#define OPUS_COSF(_x) ((float)cos(_x)) -#define OPUS_SINF(_x) ((float)sin(_x)) - -static void *check_alloc(void *_ptr){ - if(_ptr==NULL){ - fprintf(stderr,"Out of memory.\n"); - exit(EXIT_FAILURE); - } - return _ptr; -} - -static void *opus_malloc(size_t _size){ - return check_alloc(malloc(_size)); -} - -static void *opus_realloc(void *_ptr,size_t _size){ - return check_alloc(realloc(_ptr,_size)); -} - -static size_t read_pcm16(float **_samples,FILE *_fin,int _nchannels){ - unsigned char buf[1024]; - float *samples; - size_t nsamples; - size_t csamples; - size_t xi; - size_t nread; - samples=NULL; - nsamples=csamples=0; - for(;;){ - nread=fread(buf,2*_nchannels,1024/(2*_nchannels),_fin); - if(nread<=0)break; - if(nsamples+nread>csamples){ - do csamples=csamples<<1|1; - while(nsamples+nread>csamples); - samples=(float *)opus_realloc(samples, - _nchannels*csamples*sizeof(*samples)); - } - for(xi=0;xi=_window_sz)ti-=_window_sz; - } - re*=_downsample; - im*=_downsample; - _ps[(xi*ps_sz+xj)*_nchannels+ci]=re*re+im*im+100000; - p[ci]+=_ps[(xi*ps_sz+xj)*_nchannels+ci]; - } - } - if(_out){ - _out[(xi*_nbands+bi)*_nchannels]=p[0]/(_bands[bi+1]-_bands[bi]); - if(_nchannels==2){ - _out[(xi*_nbands+bi)*_nchannels+1]=p[1]/(_bands[bi+1]-_bands[bi]); - } - } - } - } - free(window); -} - -#define NBANDS (21) -#define NFREQS (240) - -/*Bands on which we compute the pseudo-NMR (Bark-derived - CELT bands).*/ -static const int BANDS[NBANDS+1]={ - 0,2,4,6,8,10,12,14,16,20,24,28,32,40,48,56,68,80,96,120,156,200 -}; - -#define TEST_WIN_SIZE (480) -#define TEST_WIN_STEP (120) - -int main(int _argc,const char **_argv){ - FILE *fin1; - FILE *fin2; - float *x; - float *y; - float *xb; - float *X; - float *Y; - double err; - float Q; - size_t xlength; - size_t ylength; - size_t nframes; - size_t xi; - int ci; - int xj; - int bi; - int nchannels; - unsigned rate; - int downsample; - int ybands; - int yfreqs; - int max_compare; - if(_argc<3||_argc>6){ - fprintf(stderr,"Usage: %s [-s] [-r rate2] \n", - _argv[0]); - return EXIT_FAILURE; - } - nchannels=1; - if(strcmp(_argv[1],"-s")==0){ - nchannels=2; - _argv++; - } - rate=48000; - ybands=NBANDS; - yfreqs=NFREQS; - downsample=1; - if(strcmp(_argv[1],"-r")==0){ - rate=atoi(_argv[2]); - if(rate!=8000&&rate!=12000&&rate!=16000&&rate!=24000&&rate!=48000){ - fprintf(stderr, - "Sampling rate must be 8000, 12000, 16000, 24000, or 48000\n"); - return EXIT_FAILURE; - } - downsample=48000/rate; - switch(rate){ - case 8000:ybands=13;break; - case 12000:ybands=15;break; - case 16000:ybands=17;break; - case 24000:ybands=19;break; - } - yfreqs=NFREQS/downsample; - _argv+=2; - } - fin1=fopen(_argv[1],"rb"); - if(fin1==NULL){ - fprintf(stderr,"Error opening '%s'.\n",_argv[1]); - return EXIT_FAILURE; - } - fin2=fopen(_argv[2],"rb"); - if(fin2==NULL){ - fprintf(stderr,"Error opening '%s'.\n",_argv[2]); - fclose(fin1); - return EXIT_FAILURE; - } - /*Read in the data and allocate scratch space.*/ - xlength=read_pcm16(&x,fin1,2); - if(nchannels==1){ - for(xi=0;xi0;){ - for(ci=0;ci0){ - /*Temporal masking: -3 dB/2.5ms slope.*/ - for(bi=0;bi=79&&xj<=81)im*=0.1F; - if(xj==80)im*=0.1F; - Eb+=im; - } - } - Eb /= (BANDS[bi+1]-BANDS[bi])*nchannels; - Ef += Eb*Eb; - } - /*Using a fixed normalization value means we're willing to accept slightly - lower quality for lower sampling rates.*/ - Ef/=NBANDS; - Ef*=Ef; - err+=Ef*Ef; - } - err=pow(err/nframes,1.0/16); - Q=100*(1-0.5*log(1+err)/log(1.13)); - if(Q<0){ - fprintf(stderr,"Test vector FAILS\n"); - fprintf(stderr,"Internal weighted error is %f\n",err); - return EXIT_FAILURE; - } - else{ - fprintf(stderr,"Test vector PASSES\n"); - fprintf(stderr, - "Opus quality metric: %.1f %% (internal weighted error is %f)\n",Q,err); - return EXIT_SUCCESS; - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/opus_decoder.c b/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/opus_decoder.c deleted file mode 100644 index 919ba521..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/opus_decoder.c +++ /dev/null @@ -1,970 +0,0 @@ -/* Copyright (c) 2010 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 - -#ifndef OPUS_BUILD -# error "OPUS_BUILD _MUST_ be defined to build Opus. This probably means you need other defines as well, as in a config.h. See the included build files for details." -#endif - -#if defined(__GNUC__) && (__GNUC__ >= 2) && !defined(__OPTIMIZE__) -# pragma message "You appear to be compiling without optimization, if so opus will be very slow." -#endif - -#include -#include "celt.h" -#include "opus.h" -#include "entdec.h" -#include "modes.h" -#include "API.h" -#include "stack_alloc.h" -#include "float_cast.h" -#include "opus_private.h" -#include "os_support.h" -#include "structs.h" -#include "define.h" -#include "mathops.h" -#include "cpu_support.h" - -struct OpusDecoder { - int celt_dec_offset; - int silk_dec_offset; - int channels; - opus_int32 Fs; /** Sampling rate (at the API level) */ - silk_DecControlStruct DecControl; - int decode_gain; - - /* Everything beyond this point gets cleared on a reset */ -#define OPUS_DECODER_RESET_START stream_channels - int stream_channels; - - int bandwidth; - int mode; - int prev_mode; - 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 OPUS_INLINE opus_int16 SAT16(opus_int32 x) { - return x > 32767 ? 32767 : x < -32768 ? -32768 : (opus_int16)x; -} -#endif - - -int opus_decoder_get_size(int channels) -{ - int silkDecSizeBytes, celtDecSizeBytes; - int ret; - if (channels<1 || channels > 2) - return 0; - ret = silk_Get_Decoder_Size( &silkDecSizeBytes ); - if(ret) - return 0; - silkDecSizeBytes = align(silkDecSizeBytes); - celtDecSizeBytes = celt_decoder_get_size(channels); - return align(sizeof(OpusDecoder))+silkDecSizeBytes+celtDecSizeBytes; -} - -int opus_decoder_init(OpusDecoder *st, opus_int32 Fs, int channels) -{ - void *silk_dec; - CELTDecoder *celt_dec; - int ret, silkDecSizeBytes; - - if ((Fs!=48000&&Fs!=24000&&Fs!=16000&&Fs!=12000&&Fs!=8000) - || (channels!=1&&channels!=2)) - return OPUS_BAD_ARG; - - OPUS_CLEAR((char*)st, opus_decoder_get_size(channels)); - /* Initialize SILK encoder */ - ret = silk_Get_Decoder_Size(&silkDecSizeBytes); - if (ret) - return OPUS_INTERNAL_ERROR; - - silkDecSizeBytes = align(silkDecSizeBytes); - st->silk_dec_offset = align(sizeof(OpusDecoder)); - st->celt_dec_offset = st->silk_dec_offset+silkDecSizeBytes; - silk_dec = (char*)st+st->silk_dec_offset; - celt_dec = (CELTDecoder*)((char*)st+st->celt_dec_offset); - st->stream_channels = st->channels = channels; - - st->Fs = Fs; - st->DecControl.API_sampleRate = st->Fs; - st->DecControl.nChannelsAPI = st->channels; - - /* Reset decoder */ - ret = silk_InitDecoder( silk_dec ); - if(ret)return OPUS_INTERNAL_ERROR; - - /* Initialize CELT decoder */ - ret = celt_decoder_init(celt_dec, Fs, channels); - if(ret!=OPUS_OK)return OPUS_INTERNAL_ERROR; - - celt_decoder_ctl(celt_dec, CELT_SET_SIGNALLING(0)); - - st->prev_mode = 0; - st->frame_size = Fs/400; - return OPUS_OK; -} - -OpusDecoder *opus_decoder_create(opus_int32 Fs, int channels, int *error) -{ - int ret; - OpusDecoder *st; - if ((Fs!=48000&&Fs!=24000&&Fs!=16000&&Fs!=12000&&Fs!=8000) - || (channels!=1&&channels!=2)) - { - if (error) - *error = OPUS_BAD_ARG; - return NULL; - } - st = (OpusDecoder *)opus_alloc(opus_decoder_get_size(channels)); - if (st == NULL) - { - if (error) - *error = OPUS_ALLOC_FAIL; - return NULL; - } - ret = opus_decoder_init(st, Fs, channels); - if (error) - *error = ret; - if (ret != OPUS_OK) - { - opus_free(st); - st = NULL; - } - return st; -} - -static void smooth_fade(const opus_val16 *in1, const opus_val16 *in2, - opus_val16 *out, int overlap, int channels, - const opus_val16 *window, opus_int32 Fs) -{ - int i, c; - int inc = 48000/Fs; - for (c=0;csilk_dec_offset; - celt_dec = (CELTDecoder*)((char*)st+st->celt_dec_offset); - F20 = st->Fs/50; - F10 = F20>>1; - F5 = F10>>1; - F2_5 = F5>>1; - if (frame_size < F2_5) - { - RESTORE_STACK; - return OPUS_BUFFER_TOO_SMALL; - } - /* Limit frame_size to avoid excessive stack allocations. */ - frame_size = IMIN(frame_size, st->Fs/25*3); - /* Payloads of 1 (2 including ToC) or 0 trigger the PLC/DTX */ - if (len<=1) - { - data = NULL; - /* In that case, don't conceal more than what the ToC says */ - frame_size = IMIN(frame_size, st->frame_size); - } - if (data != NULL) - { - audiosize = st->frame_size; - mode = st->mode; - ec_dec_init(&dec,(unsigned char*)data,len); - } else { - audiosize = frame_size; - mode = st->prev_mode; - - 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; - } - - /* 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; - } - } - - 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) - 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) - { - /*fprintf(stderr, "PCM buffer too small: %d vs %d (mode = %d)\n", audiosize, frame_size, mode);*/ - RESTORE_STACK; - return OPUS_BAD_ARG; - } else { - frame_size = audiosize; - } - - /* Don't allocate any memory when in CELT-only mode */ - pcm_silk_size = (mode != MODE_CELT_ONLY) ? 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; - - if (st->prev_mode==MODE_CELT_ONLY) - silk_InitDecoder( silk_dec ); - - /* The SILK PLC cannot produce frames of less than 10 ms */ - st->DecControl.payloadSize_ms = IMAX(10, 1000 * audiosize / st->Fs); - - if (data != NULL) - { - st->DecControl.nChannelsInternal = st->stream_channels; - if( mode == MODE_SILK_ONLY ) { - if( st->bandwidth == OPUS_BANDWIDTH_NARROWBAND ) { - st->DecControl.internalSampleRate = 8000; - } else if( st->bandwidth == OPUS_BANDWIDTH_MEDIUMBAND ) { - st->DecControl.internalSampleRate = 12000; - } else if( st->bandwidth == OPUS_BANDWIDTH_WIDEBAND ) { - st->DecControl.internalSampleRate = 16000; - } else { - st->DecControl.internalSampleRate = 16000; - silk_assert( 0 ); - } - } else { - /* Hybrid mode */ - st->DecControl.internalSampleRate = 16000; - } - } - - lost_flag = data == NULL ? 1 : 2 * decode_fec; - decoded_samples = 0; - do { - /* 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 ); - if( silk_ret ) { - if (lost_flag) { - /* PLC failure should not be fatal */ - silk_frame_size = frame_size; - for (i=0;ichannels;i++) - pcm_ptr[i] = 0; - } else { - RESTORE_STACK; - return OPUS_INTERNAL_ERROR; - } - } - pcm_ptr += silk_frame_size * st->channels; - decoded_samples += silk_frame_size; - } while( decoded_samples < frame_size ); - } - - start_band = 0; - if (!decode_fec && mode != MODE_CELT_ONLY && data != NULL - && ec_tell(&dec)+17+20*(st->mode == MODE_HYBRID) <= 8*len) - { - /* Check if we have a redundant 0-8 kHz band */ - if (mode == MODE_HYBRID) - redundancy = ec_dec_bit_logp(&dec, 12); - else - redundancy = 1; - if (redundancy) - { - celt_to_silk = ec_dec_bit_logp(&dec, 1); - /* redundancy_bytes will be at least two, in the non-hybrid - case due to the ec_tell() check above */ - redundancy_bytes = mode==MODE_HYBRID ? - (opus_int32)ec_dec_uint(&dec, 256)+2 : - len-((ec_tell(&dec)+7)>>3); - len -= redundancy_bytes; - /* This is a sanity check. It should never happen for a valid - packet, so the exact behaviour is not normative. */ - if (len*8 < ec_tell(&dec)) - { - len = 0; - redundancy_bytes = 0; - redundancy = 0; - } - /* Shrink decoder because of raw bits */ - dec.storage -= redundancy_bytes; - } - } - if (mode != MODE_CELT_ONLY) - start_band = 17; - - { - int endband=21; - - switch(st->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_decoder_ctl(celt_dec, CELT_SET_END_BAND(endband)); - celt_decoder_ctl(celt_dec, CELT_SET_CHANNELS(st->stream_channels)); - } - - 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); - } - - /* 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)); - 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)); - } - - /* MUST be after PLC */ - 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); - /* Decode CELT */ - celt_ret = celt_decode_with_ec(celt_dec, decode_fec ? NULL : data, - len, pcm, celt_frame_size, &dec); - } else { - unsigned char silence[2] = {0xFF, 0xFF}; - 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); - } - } - - if (mode != MODE_CELT_ONLY) - { -#ifdef FIXED_POINT - for (i=0;ichannels;i++) - pcm[i] = SAT16(pcm[i] + pcm_silk[i]); -#else - for (i=0;ichannels;i++) - pcm[i] = pcm[i] + (opus_val16)((1.f/32768.f)*pcm_silk[i]); -#endif - } - - { - const CELTMode *celt_mode; - 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)); - - 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)); - 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); - } - if (redundancy && celt_to_silk) - { - for (c=0;cchannels;c++) - { - for (i=0;ichannels*i+c] = redundant_audio[st->channels*i+c]; - } - smooth_fade(redundant_audio+st->channels*F2_5, pcm+st->channels*F2_5, - pcm+st->channels*F2_5, F2_5, st->channels, window, st->Fs); - } - if (transition) - { - if (audiosize >= F5) - { - for (i=0;ichannels*F2_5;i++) - pcm[i] = pcm_transition[i]; - smooth_fade(pcm_transition+st->channels*F2_5, pcm+st->channels*F2_5, - pcm+st->channels*F2_5, F2_5, - st->channels, window, st->Fs); - } else { - /* Not enough time to do a clean transition, but we do it anyway - This will not preserve amplitude perfectly and may introduce - a bit of temporal aliasing, but it shouldn't be too bad and - that's pretty much the best we can do. In any case, generating this - transition it pretty silly in the first place */ - smooth_fade(pcm_transition, pcm, - pcm, F2_5, - st->channels, window, st->Fs); - } - } - - if(st->decode_gain) - { - opus_val32 gain; - gain = celt_exp2(MULT16_16_P15(QCONST16(6.48814081e-4f, 25), st->decode_gain)); - for (i=0;ichannels;i++) - { - opus_val32 x; - x = MULT16_32_P16(pcm[i],gain); - pcm[i] = SATURATE(x, 32767); - } - } - - if (len <= 1) - st->rangeFinal = 0; - else - st->rangeFinal = dec.rng ^ redundant_rng; - - st->prev_mode = mode; - st->prev_redundancy = redundancy && !celt_to_silk; - - if (celt_ret>=0) - { - if (OPUS_CHECK_ARRAY(pcm, audiosize*st->channels)) - OPUS_PRINT_INT(audiosize); - } - - RESTORE_STACK; - return celt_ret < 0 ? celt_ret : audiosize; - -} - -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) -{ - int i, nb_samples; - int count, offset; - unsigned char toc; - int packet_frame_size, packet_bandwidth, packet_mode, packet_stream_channels; - /* 48 x 2.5 ms = 120 ms */ - opus_int16 size[48]; - if (decode_fec<0 || decode_fec>1) - return OPUS_BAD_ARG; - /* For FEC/PLC, frame_size has to be to have a multiple of 2.5 ms */ - if ((decode_fec || len==0 || data==NULL) && frame_size%(st->Fs/400)!=0) - return OPUS_BAD_ARG; - if (len==0 || data==NULL) - { - int pcm_count=0; - do { - int ret; - ret = opus_decode_frame(st, NULL, 0, pcm+pcm_count*st->channels, frame_size-pcm_count, 0); - if (ret<0) - return 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) - return OPUS_BAD_ARG; - - packet_mode = opus_packet_get_mode(data); - packet_bandwidth = opus_packet_get_bandwidth(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, packet_offset); - if (count<0) - return count; - - data += offset; - - if (decode_fec) - { - int duration_copy; - 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, 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, soft_clip); - if (ret<0) - { - st->last_packet_duration = duration_copy; - return ret; - } - celt_assert(ret==frame_size-packet_frame_size); - } - /* Complete with FEC */ - st->mode = packet_mode; - st->bandwidth = packet_bandwidth; - st->frame_size = packet_frame_size; - st->stream_channels = packet_stream_channels; - ret = opus_decode_frame(st, data, size[0], pcm+st->channels*(frame_size-packet_frame_size), - packet_frame_size, 1); - if (ret<0) - return ret; - else { - if (OPUS_CHECK_ARRAY(pcm, frame_size*st->channels)) - OPUS_PRINT_INT(frame_size); - st->last_packet_duration = frame_size; - return frame_size; - } - } - - if (count*packet_frame_size > frame_size) - return OPUS_BUFFER_TOO_SMALL; - - /* Update the state as the last step to avoid updating it on an invalid packet */ - st->mode = packet_mode; - st->bandwidth = packet_bandwidth; - st->frame_size = packet_frame_size; - st->stream_channels = packet_stream_channels; - - nb_samples=0; - for (i=0;ichannels, frame_size-nb_samples, 0); - if (ret<0) - return ret; - celt_assert(ret==packet_frame_size); - data += size[i]; - nb_samples += ret; - } - 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; -} - -#ifdef FIXED_POINT - -int opus_decode(OpusDecoder *st, const unsigned char *data, - opus_int32 len, opus_val16 *pcm, int frame_size, int decode_fec) -{ - 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 -int opus_decode_float(OpusDecoder *st, const unsigned char *data, - opus_int32 len, float *pcm, int frame_size, int decode_fec) -{ - VARDECL(opus_int16, out); - int ret, i; - ALLOC_STACK; - - if(frame_size<=0) - { - RESTORE_STACK; - return OPUS_BAD_ARG; - } - ALLOC(out, frame_size*st->channels, opus_int16); - - ret = opus_decode_native(st, data, len, out, frame_size, decode_fec, 0, NULL, 0); - if (ret > 0) - { - for (i=0;ichannels;i++) - pcm[i] = (1.f/32768.f)*(out[i]); - } - RESTORE_STACK; - return ret; -} -#endif - - -#else -int opus_decode(OpusDecoder *st, const unsigned char *data, - opus_int32 len, opus_int16 *pcm, int frame_size, int decode_fec) -{ - VARDECL(float, out); - int ret, i; - ALLOC_STACK; - - if(frame_size<=0) - { - RESTORE_STACK; - return OPUS_BAD_ARG; - } - - ALLOC(out, frame_size*st->channels, float); - - ret = opus_decode_native(st, data, len, out, frame_size, decode_fec, 0, NULL, 1); - if (ret > 0) - { - for (i=0;ichannels;i++) - pcm[i] = FLOAT2INT16(out[i]); - } - RESTORE_STACK; - return ret; -} - -int opus_decode_float(OpusDecoder *st, const unsigned char *data, - opus_int32 len, opus_val16 *pcm, int frame_size, int decode_fec) -{ - if(frame_size<=0) - return OPUS_BAD_ARG; - return opus_decode_native(st, data, len, pcm, frame_size, decode_fec, 0, NULL, 0); -} - -#endif - -int opus_decoder_ctl(OpusDecoder *st, int request, ...) -{ - int ret = OPUS_OK; - va_list ap; - void *silk_dec; - CELTDecoder *celt_dec; - - silk_dec = (char*)st+st->silk_dec_offset; - celt_dec = (CELTDecoder*)((char*)st+st->celt_dec_offset); - - - va_start(ap, request); - - switch (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; - case OPUS_RESET_STATE: - { - OPUS_CLEAR((char*)&st->OPUS_DECODER_RESET_START, - sizeof(OpusDecoder)- - ((char*)&st->OPUS_DECODER_RESET_START - (char*)st)); - - celt_decoder_ctl(celt_dec, OPUS_RESET_STATE); - silk_InitDecoder( silk_dec ); - st->stream_channels = st->channels; - st->frame_size = st->Fs/400; - } - 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_PITCH_REQUEST: - { - opus_int32 *value = va_arg(ap, opus_int32*); - if (!value) - { - goto bad_arg; - } - if (st->prev_mode == MODE_CELT_ONLY) - celt_decoder_ctl(celt_dec, OPUS_GET_PITCH(value)); - else - *value = st->DecControl.prevPitchLag; - } - break; - case OPUS_GET_GAIN_REQUEST: - { - opus_int32 *value = va_arg(ap, opus_int32*); - if (!value) - { - goto bad_arg; - } - *value = st->decode_gain; - } - break; - case OPUS_SET_GAIN_REQUEST: - { - opus_int32 value = va_arg(ap, opus_int32); - if (value<-32768 || value>32767) - { - goto bad_arg; - } - st->decode_gain = value; - } - break; - case OPUS_GET_LAST_PACKET_DURATION_REQUEST: - { - opus_uint32 *value = va_arg(ap, opus_uint32*); - if (!value) - { - goto bad_arg; - } - *value = st->last_packet_duration; - } - break; - default: - /*fprintf(stderr, "unknown opus_decoder_ctl() request: %d", request);*/ - ret = OPUS_UNIMPLEMENTED; - break; - } - - va_end(ap); - return ret; -bad_arg: - va_end(ap); - return OPUS_BAD_ARG; -} - -void opus_decoder_destroy(OpusDecoder *st) -{ - opus_free(st); -} - - -int opus_packet_get_bandwidth(const unsigned char *data) -{ - int bandwidth; - if (data[0]&0x80) - { - bandwidth = OPUS_BANDWIDTH_MEDIUMBAND + ((data[0]>>5)&0x3); - if (bandwidth == OPUS_BANDWIDTH_MEDIUMBAND) - bandwidth = OPUS_BANDWIDTH_NARROWBAND; - } else if ((data[0]&0x60) == 0x60) - { - bandwidth = (data[0]&0x10) ? OPUS_BANDWIDTH_FULLBAND : - OPUS_BANDWIDTH_SUPERWIDEBAND; - } else { - bandwidth = OPUS_BANDWIDTH_NARROWBAND + ((data[0]>>5)&0x3); - } - 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< Fs*3) - return OPUS_INVALID_PACKET; - else - return samples; -} - -int opus_decoder_get_nb_samples(const OpusDecoder *dec, - const unsigned char packet[], opus_int32 len) -{ - return opus_packet_get_nb_samples(packet, len, dec->Fs); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/opus_demo.c b/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/opus_demo.c deleted file mode 100644 index f8cdf031..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/opus_demo.c +++ /dev/null @@ -1,885 +0,0 @@ -/* Copyright (c) 2007-2008 CSIRO - Copyright (c) 2007-2009 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 -#include -#include -#include -#include "opus.h" -#include "debug.h" -#include "opus_types.h" -#include "opus_private.h" -#include "opus_multistream.h" - -#define MAX_PACKET 1500 - -void print_usage( char* argv[] ) -{ - fprintf(stderr, "Usage: %s [-e] " - " [options] \n", argv[0]); - fprintf(stderr, " %s -d " - "[options] \n\n", argv[0]); - fprintf(stderr, "mode: 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, "-variable-duration : enable frames of variable duration (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, "-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" ); - fprintf(stderr, "-forcemono : force mono encoding, even for stereo input\n" ); - fprintf(stderr, "-dtx : enable SILK DTX\n" ); - fprintf(stderr, "-loss : simulate packet loss, in percent (0-100); default: 0\n" ); -} - -static void int_to_char(opus_uint32 i, unsigned char ch[4]) -{ - ch[0] = i>>24; - ch[1] = (i>>16)&0xFF; - ch[2] = (i>>8)&0xFF; - ch[3] = i&0xFF; -} - -static opus_uint32 char_to_int(unsigned char ch[4]) -{ - return ((opus_uint32)ch[0]<<24) | ((opus_uint32)ch[1]<<16) - | ((opus_uint32)ch[2]<< 8) | (opus_uint32)ch[3]; -} - -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); - } -} - -static const int silk8_test[][4] = { - {MODE_SILK_ONLY, OPUS_BANDWIDTH_NARROWBAND, 960*3, 1}, - {MODE_SILK_ONLY, OPUS_BANDWIDTH_NARROWBAND, 960*2, 1}, - {MODE_SILK_ONLY, OPUS_BANDWIDTH_NARROWBAND, 960, 1}, - {MODE_SILK_ONLY, OPUS_BANDWIDTH_NARROWBAND, 480, 1}, - {MODE_SILK_ONLY, OPUS_BANDWIDTH_NARROWBAND, 960*3, 2}, - {MODE_SILK_ONLY, OPUS_BANDWIDTH_NARROWBAND, 960*2, 2}, - {MODE_SILK_ONLY, OPUS_BANDWIDTH_NARROWBAND, 960, 2}, - {MODE_SILK_ONLY, OPUS_BANDWIDTH_NARROWBAND, 480, 2} -}; - -static const int silk12_test[][4] = { - {MODE_SILK_ONLY, OPUS_BANDWIDTH_MEDIUMBAND, 960*3, 1}, - {MODE_SILK_ONLY, OPUS_BANDWIDTH_MEDIUMBAND, 960*2, 1}, - {MODE_SILK_ONLY, OPUS_BANDWIDTH_MEDIUMBAND, 960, 1}, - {MODE_SILK_ONLY, OPUS_BANDWIDTH_MEDIUMBAND, 480, 1}, - {MODE_SILK_ONLY, OPUS_BANDWIDTH_MEDIUMBAND, 960*3, 2}, - {MODE_SILK_ONLY, OPUS_BANDWIDTH_MEDIUMBAND, 960*2, 2}, - {MODE_SILK_ONLY, OPUS_BANDWIDTH_MEDIUMBAND, 960, 2}, - {MODE_SILK_ONLY, OPUS_BANDWIDTH_MEDIUMBAND, 480, 2} -}; - -static const int silk16_test[][4] = { - {MODE_SILK_ONLY, OPUS_BANDWIDTH_WIDEBAND, 960*3, 1}, - {MODE_SILK_ONLY, OPUS_BANDWIDTH_WIDEBAND, 960*2, 1}, - {MODE_SILK_ONLY, OPUS_BANDWIDTH_WIDEBAND, 960, 1}, - {MODE_SILK_ONLY, OPUS_BANDWIDTH_WIDEBAND, 480, 1}, - {MODE_SILK_ONLY, OPUS_BANDWIDTH_WIDEBAND, 960*3, 2}, - {MODE_SILK_ONLY, OPUS_BANDWIDTH_WIDEBAND, 960*2, 2}, - {MODE_SILK_ONLY, OPUS_BANDWIDTH_WIDEBAND, 960, 2}, - {MODE_SILK_ONLY, OPUS_BANDWIDTH_WIDEBAND, 480, 2} -}; - -static const int hybrid24_test[][4] = { - {MODE_SILK_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 960, 1}, - {MODE_SILK_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 480, 1}, - {MODE_SILK_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 960, 2}, - {MODE_SILK_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 480, 2} -}; - -static const int hybrid48_test[][4] = { - {MODE_SILK_ONLY, OPUS_BANDWIDTH_FULLBAND, 960, 1}, - {MODE_SILK_ONLY, OPUS_BANDWIDTH_FULLBAND, 480, 1}, - {MODE_SILK_ONLY, OPUS_BANDWIDTH_FULLBAND, 960, 2}, - {MODE_SILK_ONLY, OPUS_BANDWIDTH_FULLBAND, 480, 2} -}; - -static const int celt_test[][4] = { - {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 960, 1}, - {MODE_CELT_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 960, 1}, - {MODE_CELT_ONLY, OPUS_BANDWIDTH_WIDEBAND, 960, 1}, - {MODE_CELT_ONLY, OPUS_BANDWIDTH_NARROWBAND, 960, 1}, - - {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 480, 1}, - {MODE_CELT_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 480, 1}, - {MODE_CELT_ONLY, OPUS_BANDWIDTH_WIDEBAND, 480, 1}, - {MODE_CELT_ONLY, OPUS_BANDWIDTH_NARROWBAND, 480, 1}, - - {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 240, 1}, - {MODE_CELT_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 240, 1}, - {MODE_CELT_ONLY, OPUS_BANDWIDTH_WIDEBAND, 240, 1}, - {MODE_CELT_ONLY, OPUS_BANDWIDTH_NARROWBAND, 240, 1}, - - {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 120, 1}, - {MODE_CELT_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 120, 1}, - {MODE_CELT_ONLY, OPUS_BANDWIDTH_WIDEBAND, 120, 1}, - {MODE_CELT_ONLY, OPUS_BANDWIDTH_NARROWBAND, 120, 1}, - - {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 960, 2}, - {MODE_CELT_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 960, 2}, - {MODE_CELT_ONLY, OPUS_BANDWIDTH_WIDEBAND, 960, 2}, - {MODE_CELT_ONLY, OPUS_BANDWIDTH_NARROWBAND, 960, 2}, - - {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 480, 2}, - {MODE_CELT_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 480, 2}, - {MODE_CELT_ONLY, OPUS_BANDWIDTH_WIDEBAND, 480, 2}, - {MODE_CELT_ONLY, OPUS_BANDWIDTH_NARROWBAND, 480, 2}, - - {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 240, 2}, - {MODE_CELT_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 240, 2}, - {MODE_CELT_ONLY, OPUS_BANDWIDTH_WIDEBAND, 240, 2}, - {MODE_CELT_ONLY, OPUS_BANDWIDTH_NARROWBAND, 240, 2}, - - {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 120, 2}, - {MODE_CELT_ONLY, OPUS_BANDWIDTH_SUPERWIDEBAND, 120, 2}, - {MODE_CELT_ONLY, OPUS_BANDWIDTH_WIDEBAND, 120, 2}, - {MODE_CELT_ONLY, OPUS_BANDWIDTH_NARROWBAND, 120, 2}, - -}; - -static const int celt_hq_test[][4] = { - {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 960, 2}, - {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 480, 2}, - {MODE_CELT_ONLY, OPUS_BANDWIDTH_FULLBAND, 240, 2}, - {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; - 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; - opus_int32 sampling_rate; - int use_vbr; - int max_payload_bytes; - int complexity; - int use_inbandfec; - int use_dtx; - int forcechannels; - int cvbr = 0; - int packet_loss_perc; - opus_int32 count=0, count_act=0; - int k; - opus_int32 skip=0; - int stop=0; - short *in, *out; - int application=OPUS_APPLICATION_AUDIO; - double bits=0.0, bits_max=0.0, bits_act=0.0, bits2=0.0, nrg; - double tot_samples=0; - opus_uint64 tot_in, tot_out; - int bandwidth=-1; - 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 curr_read=0; - int sweep_bps = 0; - int random_framesize=0, newsize=0, delayed_celt=0; - int sweep_max=0, sweep_min=0; - int random_fec=0; - const int (*mode_list)[4]=NULL; - int nb_modes_in_list=0; - 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; - - if (argc < 5 ) - { - print_usage( argv ); - return EXIT_FAILURE; - } - - tot_in=tot_out=0; - fprintf(stderr, "%s\n", opus_get_version_string()); - - args = 1; - if (strcmp(argv[args], "-e")==0) - { - encode_only = 1; - args++; - } else if (strcmp(argv[args], "-d")==0) - { - decode_only = 1; - args++; - } - if (!decode_only && argc < 7 ) - { - print_usage( argv ); - return EXIT_FAILURE; - } - - if (!decode_only) - { - if (strcmp(argv[args], "voip")==0) - application = OPUS_APPLICATION_VOIP; - else if (strcmp(argv[args], "restricted-lowdelay")==0) - application = OPUS_APPLICATION_RESTRICTED_LOWDELAY; - else if (strcmp(argv[args], "audio")!=0) { - fprintf(stderr, "unknown application: %s\n", argv[args]); - print_usage(argv); - return EXIT_FAILURE; - } - args++; - } - sampling_rate = (opus_int32)atol(argv[args]); - args++; - - if (sampling_rate != 8000 && sampling_rate != 12000 - && sampling_rate != 16000 && sampling_rate != 24000 - && sampling_rate != 48000) - { - fprintf(stderr, "Supported sampling rates are 8000, 12000, " - "16000, 24000 and 48000.\n"); - return EXIT_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"); - return EXIT_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 = 2*48000; - curr_read=0; - - while( args < argc - 2 ) { - /* process command line options */ - if( strcmp( argv[ args ], "-cbr" ) == 0 ) { - check_encoder_option(decode_only, "-cbr"); - use_vbr = 0; - args++; - } else if( strcmp( argv[ args ], "-bandwidth" ) == 0 ) { - check_encoder_option(decode_only, "-bandwidth"); - if (strcmp(argv[ args + 1 ], "NB")==0) - bandwidth = OPUS_BANDWIDTH_NARROWBAND; - else if (strcmp(argv[ args + 1 ], "MB")==0) - bandwidth = OPUS_BANDWIDTH_MEDIUMBAND; - else if (strcmp(argv[ args + 1 ], "WB")==0) - bandwidth = OPUS_BANDWIDTH_WIDEBAND; - else if (strcmp(argv[ args + 1 ], "SWB")==0) - bandwidth = OPUS_BANDWIDTH_SUPERWIDEBAND; - else if (strcmp(argv[ args + 1 ], "FB")==0) - bandwidth = OPUS_BANDWIDTH_FULLBAND; - else { - fprintf(stderr, "Unknown bandwidth %s. " - "Supported are NB, MB, WB, SWB, FB.\n", - argv[ args + 1 ]); - return EXIT_FAILURE; - } - args += 2; - } else if( strcmp( argv[ args ], "-framesize" ) == 0 ) { - check_encoder_option(decode_only, "-framesize"); - if (strcmp(argv[ args + 1 ], "2.5")==0) - frame_size = sampling_rate/400; - else if (strcmp(argv[ args + 1 ], "5")==0) - frame_size = sampling_rate/200; - else if (strcmp(argv[ args + 1 ], "10")==0) - frame_size = sampling_rate/100; - else if (strcmp(argv[ args + 1 ], "20")==0) - frame_size = sampling_rate/50; - else if (strcmp(argv[ args + 1 ], "40")==0) - frame_size = sampling_rate/25; - else if (strcmp(argv[ args + 1 ], "60")==0) - frame_size = 3*sampling_rate/50; - else { - fprintf(stderr, "Unsupported frame size: %s ms. " - "Supported are 2.5, 5, 10, 20, 40, 60.\n", - argv[ args + 1 ]); - return EXIT_FAILURE; - } - args += 2; - } else if( strcmp( argv[ args ], "-max_payload" ) == 0 ) { - check_encoder_option(decode_only, "-max_payload"); - max_payload_bytes = atoi( argv[ args + 1 ] ); - args += 2; - } else if( strcmp( argv[ args ], "-complexity" ) == 0 ) { - check_encoder_option(decode_only, "-complexity"); - complexity = atoi( argv[ args + 1 ] ); - args += 2; - } else if( strcmp( argv[ args ], "-inbandfec" ) == 0 ) { - use_inbandfec = 1; - args++; - } else if( strcmp( argv[ args ], "-forcemono" ) == 0 ) { - check_encoder_option(decode_only, "-forcemono"); - forcechannels = 1; - args++; - } else if( strcmp( argv[ args ], "-cvbr" ) == 0 ) { - check_encoder_option(decode_only, "-cvbr"); - cvbr = 1; - args++; - } else if( strcmp( argv[ args ], "-variable-duration" ) == 0 ) { - check_encoder_option(decode_only, "-variable-duration"); - variable_duration = OPUS_FRAMESIZE_VARIABLE; - 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 ) { - packet_loss_perc = atoi( argv[ args + 1 ] ); - args += 2; - } else if( strcmp( argv[ args ], "-sweep" ) == 0 ) { - check_encoder_option(decode_only, "-sweep"); - sweep_bps = atoi( argv[ args + 1 ] ); - args += 2; - } else if( strcmp( argv[ args ], "-random_framesize" ) == 0 ) { - check_encoder_option(decode_only, "-random_framesize"); - random_framesize = 1; - args++; - } else if( strcmp( argv[ args ], "-sweep_max" ) == 0 ) { - check_encoder_option(decode_only, "-sweep_max"); - sweep_max = atoi( argv[ args + 1 ] ); - args += 2; - } else if( strcmp( argv[ args ], "-random_fec" ) == 0 ) { - check_encoder_option(decode_only, "-random_fec"); - random_fec = 1; - args++; - } else if( strcmp( argv[ args ], "-silk8k_test" ) == 0 ) { - check_encoder_option(decode_only, "-silk8k_test"); - mode_list = silk8_test; - nb_modes_in_list = 8; - args++; - } else if( strcmp( argv[ args ], "-silk12k_test" ) == 0 ) { - check_encoder_option(decode_only, "-silk12k_test"); - mode_list = silk12_test; - nb_modes_in_list = 8; - args++; - } else if( strcmp( argv[ args ], "-silk16k_test" ) == 0 ) { - check_encoder_option(decode_only, "-silk16k_test"); - mode_list = silk16_test; - nb_modes_in_list = 8; - args++; - } else if( strcmp( argv[ args ], "-hybrid24k_test" ) == 0 ) { - check_encoder_option(decode_only, "-hybrid24k_test"); - mode_list = hybrid24_test; - nb_modes_in_list = 4; - args++; - } else if( strcmp( argv[ args ], "-hybrid48k_test" ) == 0 ) { - check_encoder_option(decode_only, "-hybrid48k_test"); - mode_list = hybrid48_test; - nb_modes_in_list = 4; - args++; - } else if( strcmp( argv[ args ], "-celt_test" ) == 0 ) { - check_encoder_option(decode_only, "-celt_test"); - mode_list = celt_test; - nb_modes_in_list = 32; - args++; - } else if( strcmp( argv[ args ], "-celt_hq_test" ) == 0 ) { - check_encoder_option(decode_only, "-celt_hq_test"); - mode_list = celt_hq_test; - nb_modes_in_list = 4; - args++; - } else { - printf( "Error: unrecognized setting: %s\n\n", argv[ args ] ); - print_usage( argv ); - return EXIT_FAILURE; - } - } - - if (sweep_max) - sweep_min = bitrate_bps; - - if (max_payload_bytes < 0 || max_payload_bytes > MAX_PACKET) - { - fprintf (stderr, "max_payload_bytes must be between 0 and %d\n", - MAX_PACKET); - return EXIT_FAILURE; - } - - inFile = argv[argc-2]; - fin = fopen(inFile, "rb"); - if (!fin) - { - fprintf (stderr, "Could not open input file %s\n", argv[argc-2]); - return EXIT_FAILURE; - } - if (mode_list) - { - int size; - fseek(fin, 0, SEEK_END); - size = ftell(fin); - fprintf(stderr, "File size is %d bytes\n", size); - fseek(fin, 0, SEEK_SET); - mode_switch_time = size/sizeof(short)/channels/nb_modes_in_list; - fprintf(stderr, "Switching mode every %d samples\n", mode_switch_time); - } - - outFile = argv[argc-1]; - fout = fopen(outFile, "wb+"); - if (!fout) - { - fprintf (stderr, "Could not open output file %s\n", argv[argc-1]); - fclose(fin); - return EXIT_FAILURE; - } - - if (!decode_only) - { - enc = opus_encoder_create(sampling_rate, channels, application, &err); - if (err != OPUS_OK) - { - fprintf(stderr, "Cannot create encoder: %s\n", opus_strerror(err)); - fclose(fin); - fclose(fout); - return EXIT_FAILURE; - } - opus_encoder_ctl(enc, OPUS_SET_BITRATE(bitrate_bps)); - opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(bandwidth)); - opus_encoder_ctl(enc, OPUS_SET_VBR(use_vbr)); - opus_encoder_ctl(enc, OPUS_SET_VBR_CONSTRAINT(cvbr)); - opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY(complexity)); - opus_encoder_ctl(enc, OPUS_SET_INBAND_FEC(use_inbandfec)); - opus_encoder_ctl(enc, OPUS_SET_FORCE_CHANNELS(forcechannels)); - opus_encoder_ctl(enc, OPUS_SET_DTX(use_dtx)); - opus_encoder_ctl(enc, OPUS_SET_PACKET_LOSS_PERC(packet_loss_perc)); - - 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) - { - dec = opus_decoder_create(sampling_rate, channels, &err); - if (err != OPUS_OK) - { - fprintf(stderr, "Cannot create decoder: %s\n", opus_strerror(err)); - fclose(fin); - fclose(fout); - return EXIT_FAILURE; - } - } - - - switch(bandwidth) - { - case OPUS_BANDWIDTH_NARROWBAND: - bandwidth_string = "narrowband"; - break; - case OPUS_BANDWIDTH_MEDIUMBAND: - bandwidth_string = "mediumband"; - break; - case OPUS_BANDWIDTH_WIDEBAND: - bandwidth_string = "wideband"; - break; - case OPUS_BANDWIDTH_SUPERWIDEBAND: - bandwidth_string = "superwideband"; - break; - case OPUS_BANDWIDTH_FULLBAND: - bandwidth_string = "fullband"; - break; - case OPUS_AUTO: - bandwidth_string = "auto"; - break; - default: - bandwidth_string = "unknown"; - break; - } - - if (decode_only) - fprintf(stderr, "Decoding with %ld Hz output (%d channels)\n", - (long)sampling_rate, channels); - else - fprintf(stderr, "Encoding %ld Hz input at %.3f kb/s " - "in %s mode 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)); - fbytes = (unsigned char*)malloc(max_frame_size*channels*sizeof(short)); - data[0] = (unsigned char*)calloc(max_payload_bytes,sizeof(char)); - if ( use_inbandfec ) { - data[1] = (unsigned char*)calloc(max_payload_bytes,sizeof(char)); - } - if(delayed_decision) - { - if (variable_duration!=OPUS_FRAMESIZE_VARIABLE) - { - 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 - variable_duration = OPUS_FRAMESIZE_60_MS; - opus_encoder_ctl(enc, OPUS_SET_EXPERT_FRAME_DURATION(variable_duration)); - } - frame_size = 2*48000; - } - while (!stop) - { - if (delayed_celt) - { - frame_size = newsize; - delayed_celt = 0; - } else if (random_framesize && rand()%20==0) - { - newsize = rand()%6; - switch(newsize) - { - case 0: newsize=sampling_rate/400; break; - case 1: newsize=sampling_rate/200; break; - case 2: newsize=sampling_rate/100; break; - case 3: newsize=sampling_rate/50; break; - 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) - newsize*=2; - if (newsize < sampling_rate/100 && frame_size >= sampling_rate/100) - { - opus_encoder_ctl(enc, OPUS_SET_FORCE_MODE(MODE_CELT_ONLY)); - delayed_celt=1; - } else { - frame_size = newsize; - } - } - if (random_fec && rand()%30==0) - { - opus_encoder_ctl(enc, OPUS_SET_INBAND_FEC(rand()%4==0)); - } - if (decode_only) - { - unsigned char ch[4]; - err = fread(ch, 1, 4, fin); - if (feof(fin)) - break; - len[toggle] = char_to_int(ch); - if (len[toggle]>max_payload_bytes || len[toggle]<0) - { - fprintf(stderr, "Invalid payload length: %d\n",len[toggle]); - break; - } - err = fread(ch, 1, 4, fin); - enc_final_range[toggle] = char_to_int(ch); - err = fread(data[toggle], 1, len[toggle], fin); - if (err sweep_max) - sweep_bps = -sweep_bps; - else if (bitrate_bps < sweep_min) - sweep_bps = -sweep_bps; - } - /* safety */ - if (bitrate_bps<1000) - bitrate_bps = 1000; - opus_encoder_ctl(enc, OPUS_SET_BITRATE(bitrate_bps)); - } - opus_encoder_ctl(enc, OPUS_GET_FINAL_RANGE(&enc_final_range[toggle])); - if (len[toggle] < 0) - { - fprintf (stderr, "opus_encode() returned %d\n", len[toggle]); - fclose(fin); - fclose(fout); - return EXIT_FAILURE; - } - curr_mode_count += frame_size; - if (curr_mode_count > mode_switch_time && curr_mode < nb_modes_in_list-1) - { - curr_mode++; - curr_mode_count = 0; - } - } - -#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)); - return EXIT_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; - } - 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; - } - if (fwrite(data[toggle], 1, len[toggle], fout) != (unsigned)len[toggle]) { - fprintf(stderr, "Error writing.\n"); - return EXIT_FAILURE; - } - tot_samples += nb_encoded; - } else { - int 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)); - else - output_samples = max_frame_size; - if( count >= use_inbandfec ) { - /* delay by one packet when using in-band FEC */ - if( use_inbandfec ) { - if( lost_prev ) { - /* attempt to decode with in-band FEC from next packet */ - opus_decoder_ctl(dec, OPUS_GET_LAST_PACKET_DURATION(&output_samples)); - output_samples = opus_decode(dec, lost ? NULL : data[toggle], len[toggle], out, output_samples, 1); - } else { - /* regular decode */ - output_samples = max_frame_size; - output_samples = opus_decode(dec, data[1-toggle], len[1-toggle], out, output_samples, 0); - } - } else { - output_samples = opus_decode(dec, lost ? NULL : data[toggle], len[toggle], out, output_samples, 0); - } - if (output_samples>0) - { - if (!decode_only && tot_out + output_samples > tot_in) - { - stop=1; - output_samples = tot_in-tot_out; - } - if (output_samples>skip) { - int i; - for(i=0;i<(output_samples-skip)*channels;i++) - { - short s; - s=out[i+(skip*channels)]; - fbytes[2*i]=s&0xFF; - fbytes[2*i+1]=(s>>8)&0xFF; - } - if (fwrite(fbytes, sizeof(short)*channels, output_samples-skip, fout) != (unsigned)(output_samples-skip)){ - fprintf(stderr, "Error writing.\n"); - return EXIT_FAILURE; - } - tot_out += output_samples-skip; - } - if (output_samples bits_max ) ? len[toggle]*8 : bits_max; - if( count >= use_inbandfec ) { - nrg = 0.0; - if (!decode_only) - { - for ( k = 0; k < frame_size * channels; k++ ) { - nrg += in[ k ] * (double)in[ k ]; - } - } - 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/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/(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 - silk_TimerSave("opus_timing.txt"); - opus_encoder_destroy(enc); - opus_decoder_destroy(dec); - free(data[0]); - if (use_inbandfec) - free(data[1]); - fclose(fin); - fclose(fout); - free(in); - free(out); - free(fbytes); - return EXIT_SUCCESS; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/opus_encoder.c b/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/opus_encoder.c deleted file mode 100644 index fbd3de63..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/opus_encoder.c +++ /dev/null @@ -1,2488 +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 "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 - -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; - -#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; - 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 - TonalityAnalysisState analysis; - int detected_bandwidth; - int analysis_offset; -#endif - opus_uint32 rangeFinal; - int arch; -}; - -/* 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 */ - 17000, 1000, /* WB<->SWB */ - 21000, 2000, /* SWB<->FB */ -}; -static const opus_int32 mono_music_bandwidth_thresholds[8] = { - 12000, 1000, /* NB<->MB */ - 15000, 1000, /* MB<->WB */ - 18000, 2000, /* WB<->SWB */ - 22000, 2000, /* SWB<->FB */ -}; -static const opus_int32 stereo_voice_bandwidth_thresholds[8] = { - 11000, 1000, /* NB<->MB */ - 14000, 1000, /* MB<->WB */ - 21000, 2000, /* WB<->SWB */ - 28000, 2000, /* SWB<->FB */ -}; -static const opus_int32 stereo_music_bandwidth_thresholds[8] = { - 12000, 1000, /* NB<->MB */ - 18000, 2000, /* MB<->WB */ - 21000, 2000, /* WB<->SWB */ - 30000, 2000, /* SWB<->FB */ -}; -/* Threshold bit-rates for switching between mono and stereo */ -static const opus_int32 stereo_voice_threshold = 30000; -static const opus_int32 stereo_music_threshold = 30000; - -/* Threshold bit-rate for switching between SILK/hybrid and CELT-only */ -static const opus_int32 mode_thresholds[2][2] = { - /* voice */ /* music */ - { 64000, 16000}, /* mono */ - { 36000, 16000}, /* 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; - - 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; - - 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) -{ - 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 -} - -#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(4.*cutoff_Hz/Fs)) */ - shift=celt_ilog2(Fs/(cutoff_Hz*3)); - 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 -/* Don't use more than 60 ms for the frame size analysis */ -#define MAX_DYNAMIC_FRAMESIZE 24 -/* Estimates how much the bitrate will be boosted based on the sub-frame energy */ -static float transient_boost(const float *E, const float *E_1, int LM, int maxM) -{ - int i; - int M; - float sumE=0, sumE_1=0; - float metric; - - M = IMIN(maxM, (1<10 ? 1 : 0;*/ - /*return MAX16(0,1-exp(-.25*(metric-2.)));*/ - return MIN16(1,(float)sqrt(MAX16(0,.05f*(metric-2)))); -} - -/* Viterbi decoding trying to find the best frame size combination using look-ahead - - State numbering: - 0: unused - 1: 2.5 ms - 2: 5 ms (#1) - 3: 5 ms (#2) - 4: 10 ms (#1) - 5: 10 ms (#2) - 6: 10 ms (#3) - 7: 10 ms (#4) - 8: 20 ms (#1) - 9: 20 ms (#2) - 10: 20 ms (#3) - 11: 20 ms (#4) - 12: 20 ms (#5) - 13: 20 ms (#6) - 14: 20 ms (#7) - 15: 20 ms (#8) -*/ -static int transient_viterbi(const float *E, const float *E_1, int N, int frame_cost, int rate) -{ - int i; - float cost[MAX_DYNAMIC_FRAMESIZE][16]; - int states[MAX_DYNAMIC_FRAMESIZE][16]; - float best_cost; - int best_state; - float factor; - /* Take into account that we damp VBR in the 32 kb/s to 64 kb/s range. */ - if (rate<80) - factor=0; - else if (rate>160) - factor=1; - else - factor = (rate-80.f)/80.f; - /* Makes variable framesize less aggressive at lower bitrates, but I can't - find any valid theoretical justification for this (other than it seems - to help) */ - for (i=0;i<16;i++) - { - /* Impossible state */ - states[0][i] = -1; - cost[0][i] = 1e10; - } - for (i=0;i<4;i++) - { - cost[0][1<=0;i--) - { - /*printf("%d ", best_state);*/ - best_state = states[i][best_state]; - } - /*printf("%d\n", best_state);*/ - return best_state; -} - -int optimize_framesize(const opus_val16 *x, int len, int C, opus_int32 Fs, - int bitrate, opus_val16 tonality, float *mem, int buffering, - downmix_func downmix) -{ - int N; - int i; - float e[MAX_DYNAMIC_FRAMESIZE+4]; - float e_1[MAX_DYNAMIC_FRAMESIZE+3]; - opus_val32 memx; - int bestLM=0; - int subframe; - int pos; - VARDECL(opus_val32, sub); - - subframe = Fs/400; - ALLOC(sub, subframe, opus_val32); - e[0]=mem[0]; - e_1[0]=1.f/(EPSILON+mem[0]); - if (buffering) - { - /* Consider the CELT delay when not in restricted-lowdelay */ - /* We assume the buffering is between 2.5 and 5 ms */ - int offset = 2*subframe - buffering; - celt_assert(offset>=0 && offset <= subframe); - x += C*offset; - len -= offset; - e[1]=mem[1]; - e_1[1]=1.f/(EPSILON+mem[1]); - e[2]=mem[2]; - e_1[2]=1.f/(EPSILON+mem[2]); - pos = 3; - } else { - pos=1; - } - N=IMIN(len/subframe, MAX_DYNAMIC_FRAMESIZE); - /* Just silencing a warning, it's really initialized later */ - memx = 0; - for (i=0;i-1) - { - for (j=0;j-1) - { - for (j=0;j= OPUS_FRAMESIZE_2_5_MS && variable_duration <= OPUS_FRAMESIZE_60_MS) - new_size = IMIN(3*Fs/50, (Fs/400)<<(variable_duration-OPUS_FRAMESIZE_2_5_MS)); - 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) - return -1; - return new_size; -} - -opus_int32 compute_frame_size(const void *analysis_pcm, int frame_size, - int variable_duration, int C, opus_int32 Fs, int bitrate_bps, - int delay_compensation, downmix_func downmix -#ifndef DISABLE_FLOAT_API - , float *subframe_mem -#endif - ) -{ -#ifndef DISABLE_FLOAT_API - if (variable_duration == OPUS_FRAMESIZE_VARIABLE && frame_size >= Fs/200) - { - int LM = 3; - LM = optimize_framesize(analysis_pcm, frame_size, C, Fs, bitrate_bps, - 0, subframe_mem, delay_compensation, downmix); - while ((Fs/400<frame_size) - LM--; - frame_size = (Fs/400<XX += 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)) - { - 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 = 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); - } else { - width = 0; - corr=Q15ONE; - ldiff=0; - } - /*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,20*mem->max_follower)); -} - -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) -{ - 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; - AnalysisInfo analysis_info; - int analysis_read_pos_bak=-1; - int analysis_read_subframe_bak=-1; - VARDECL(opus_val16, tmp_prefill); - - ALLOC_STACK; - - max_data_bytes = IMIN(1276, out_data_bytes); - - st->rangeFinal = 0; - if ((!st->variable_duration && 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) - || (400*frame_size < st->Fs) - || 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; - - lsb_depth = IMIN(lsb_depth, st->lsb_depth); - - analysis_info.valid = 0; - celt_encoder_ctl(celt_enc, CELT_GET_MODE(&celt_mode)); -#ifndef DISABLE_FLOAT_API -#ifdef FIXED_POINT - if (st->silk_mode.complexity >= 10 && st->Fs==48000) -#else - if (st->silk_mode.complexity >= 7 && st->Fs==48000) -#endif - { - 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); - } -#endif - - st->voice_ratio = -1; - -#ifndef DISABLE_FLOAT_API - st->detected_bandwidth = 0; - if (analysis_info.valid) - { - int analysis_bandwidth; - if (st->signal_type == OPUS_AUTO) - st->voice_ratio = (int)floor(.5+100*(1-analysis_info.music_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; - } -#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 (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 - (40*st->channels+20)*(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; - /* 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 - } - equiv_rate = st->bitrate_bps - (40*st->stream_channels+20)*(st->Fs/frame_size - 50); - - /* 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, 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->lfe) - st->mode = MODE_CELT_ONLY; - /* 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; - - 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, 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; - 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; -#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 - 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; - - /* 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; - VARDECL(OpusRepacketizer, rp); - opus_int32 bytes_per_frame; - opus_int32 repacketize_len; - -#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 - - 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); - - 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; - /* 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, lsb_depth, - NULL, 0, c1, c2, analysis_channels, downmix); - 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; - } - } - if (st->use_vbr) - repacketize_len = out_data_bytes; - else - repacketize_len = IMIN(3*st->bitrate_bps/(3*8*50/nb_frames), out_data_bytes); - 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; - } - 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, (total_buffer+frame_size)*st->channels, opus_val16); - for (i=0;ichannels;i++) - pcm_buf[i] = st->delay_buffer[(st->encoder_buffer-total_buffer)*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[total_buffer*st->channels], st->hp_mem, frame_size, st->channels, st->Fs); - } else { - dc_reject(pcm, 3, &pcm_buf[total_buffer*st->channels], st->hp_mem, frame_size, st->channels, st->Fs); - } - - - - /* SILK processing */ - HB_gain = Q15ONE; - if (st->mode != MODE_CELT_ONLY) - { - opus_int32 total_bitRate, celt_rate; -#ifdef FIXED_POINT - const opus_int16 *pcm_silk; -#else - VARDECL(opus_int16, pcm_silk); - ALLOC(pcm_silk, st->channels*frame_size, opus_int16); -#endif - - /* Distribute bits between SILK and CELT */ - total_bitRate = 8 * bytes_target * frame_rate; - if( st->mode == MODE_HYBRID ) { - int HB_gain_ref; - /* Base rate for SILK */ - st->silk_mode.bitRate = st->stream_channels * ( 5000 + 1000 * ( st->Fs == 100 * frame_size ) ); - if( curr_bandwidth == OPUS_BANDWIDTH_SUPERWIDEBAND ) { - /* SILK gets 2/3 of the remaining bits */ - st->silk_mode.bitRate += ( total_bitRate - st->silk_mode.bitRate ) * 2 / 3; - } else { /* FULLBAND */ - /* SILK gets 3/5 of the remaining bits */ - st->silk_mode.bitRate += ( total_bitRate - st->silk_mode.bitRate ) * 3 / 5; - } - /* Don't let SILK use more than 80% */ - if( st->silk_mode.bitRate > total_bitRate * 4/5 ) { - st->silk_mode.bitRate = total_bitRate * 4/5; - } - if (!st->energy_masking) - { - /* Increasingly attenuate high band when it gets allocated fewer bits */ - celt_rate = total_bitRate - st->silk_mode.bitRate; - HB_gain_ref = (curr_bandwidth == OPUS_BANDWIDTH_SUPERWIDEBAND) ? 3000 : 3600; - HB_gain = SHL32((opus_val32)celt_rate, 9) / SHR32((opus_val32)celt_rate + st->stream_channels * HB_gain_ref, 6); - HB_gain = HB_gain < Q15ONE*6/7 ? HB_gain + Q15ONE/7 : Q15ONE; - } - } 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; - bytes_target += rate_offset * frame_size / (8 * st->Fs); - } - - 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; - 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); - for(i=0;idelay_buffer[i]=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+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 ); - 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) - { - 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) - { - 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) - { - opus_int32 bonus=0; -#ifndef DISABLE_FLOAT_API - if (st->variable_duration==OPUS_FRAMESIZE_VARIABLE && frame_size != st->Fs/50) - { - bonus = (60*st->stream_channels+40)*(st->Fs/frame_size-50); - if (analysis_info.valid) - bonus = (opus_int32)(bonus*(1.f+.5f*analysis_info.tonality)); - } -#endif - 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+bonus)); - 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-total_buffer-st->Fs/400)*st->channels + i]; - } - - for (i=0;ichannels*(st->encoder_buffer-(frame_size+total_buffer));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+total_buffer-st->encoder_buffer)*st->channels+i]; - - /* 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) - st->silk_mode.stereoWidth_Q14 = IMIN((1<<14),2*IMAX(0,equiv_rate-30000)); - 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 && (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; - 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); - } - -#ifndef DISABLE_FLOAT_API - if (redundancy || st->mode != MODE_SILK_ONLY) - celt_encoder_ctl(celt_enc, CELT_SET_ANALYSIS(&analysis_info)); -#endif - - /* 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) - { - 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; - int delay_compensation; - VARDECL(opus_int16, in); - ALLOC_STACK; - - if (st->application == OPUS_APPLICATION_RESTRICTED_LOWDELAY) - delay_compensation = 0; - else - delay_compensation = st->delay_compensation; - frame_size = compute_frame_size(pcm, analysis_frame_size, - st->variable_duration, st->channels, st->Fs, st->bitrate_bps, - delay_compensation, downmix_float, st->analysis.subframe_mem); - - 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); - 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; - int delay_compensation; - if (st->application == OPUS_APPLICATION_RESTRICTED_LOWDELAY) - delay_compensation = 0; - else - delay_compensation = st->delay_compensation; - frame_size = compute_frame_size(pcm, analysis_frame_size, - st->variable_duration, st->channels, st->Fs, st->bitrate_bps, - delay_compensation, downmix_int -#ifndef DISABLE_FLOAT_API - , st->analysis.subframe_mem -#endif - ); - return opus_encode_native(st, pcm, frame_size, data, out_data_bytes, 16, pcm, analysis_frame_size, 0, -2, st->channels, downmix_int); -} - -#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; - int delay_compensation; - VARDECL(float, in); - ALLOC_STACK; - - if (st->application == OPUS_APPLICATION_RESTRICTED_LOWDELAY) - delay_compensation = 0; - else - delay_compensation = st->delay_compensation; - frame_size = compute_frame_size(pcm, analysis_frame_size, - st->variable_duration, st->channels, st->Fs, st->bitrate_bps, - delay_compensation, downmix_int, st->analysis.subframe_mem); - - 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); - 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; - int delay_compensation; - if (st->application == OPUS_APPLICATION_RESTRICTED_LOWDELAY) - delay_compensation = 0; - else - delay_compensation = st->delay_compensation; - frame_size = compute_frame_size(pcm, analysis_frame_size, - st->variable_duration, st->channels, st->Fs, st->bitrate_bps, - delay_compensation, downmix_float, st->analysis.subframe_mem); - return opus_encode_native(st, pcm, frame_size, data, out_data_bytes, 24, - pcm, analysis_frame_size, 0, -2, st->channels, downmix_float); -} -#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*); - 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->silk_mode.useDTX = value; - } - break; - case OPUS_GET_DTX_REQUEST: - { - opus_int32 *value = va_arg(ap, opus_int32*); - if (!value) - { - goto bad_arg; - } - *value = st->silk_mode.useDTX; - } - 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_VARIABLE) - { - goto bad_arg; - } - st->variable_duration = value; - celt_encoder_ctl(celt_enc, OPUS_SET_EXPERT_FRAME_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_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, 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 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/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/opus_multistream.c b/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/opus_multistream.c deleted file mode 100644 index 09c3639b..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/opus_multistream.c +++ /dev/null @@ -1,92 +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" - - -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/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/opus_multistream_decoder.c b/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/opus_multistream_decoder.c deleted file mode 100644 index a05fa1e7..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/opus_multistream_decoder.c +++ /dev/null @@ -1,537 +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" - -struct OpusMSDecoder { - ChannelLayout layout; - /* Decoder states go here */ -}; - - - - -/* 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) || - (coupled_streams+streams>255) || (streams<1) || (coupled_streams<0)) - 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) || - (coupled_streams+streams>255) || (streams<1) || (coupled_streams<0)) - { - 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_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; - 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_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); - 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; - opus_int32 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**); - 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: - { - 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; -bad_arg: - va_end(ap); - return OPUS_BAD_ARG; -} - - -void opus_multistream_decoder_destroy(OpusMSDecoder *st) -{ - opus_free(st); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/opus_multistream_encoder.c b/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/opus_multistream_encoder.c deleted file mode 100644 index 49e27913..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/opus_multistream_encoder.c +++ /dev/null @@ -1,1174 +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" -#include "mathops.h" -#include "mdct.h" -#include "modes.h" -#include "bands.h" -#include "quant_bands.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 */ -}; - -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 -); - -struct OpusMSEncoder { - ChannelLayout layout; - int lfe_stream; - int application; - int variable_duration; - int surround; - opus_int32 bitrate_bps; - float subframe_mem[3]; - /* Encoder states go here */ - /* then opus_val32 window_mem[channels*120]; */ - /* then opus_val32 preemph_mem[channels]; */ -}; - -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); - } - return (opus_val32*)(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); - } - return (opus_val32*)ptr; -} - -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)) - 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 c; - int i; - int LM; - int pos[8] = {0}; - int upsample; - int frame_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; - - for (LM=0;LMmaxLM;LM++) - if (celt_mode->shortMdctSize<preemph, preemph_mem+c, 0); - clt_mdct_forward(&celt_mode->mdct, in, freq, celt_mode->window, overlap, celt_mode->maxLM-LM, 1); - if (upsample != 1) - { - int bound = len; - 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 - 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, - int surround -) -{ - int coupled_size; - int mono_size; - int i, ret; - char *ptr; - - if ((channels>255) || (channels<1) || (coupled_streams>streams) || - (coupled_streams+streams>255) || (streams<1) || (coupled_streams<0)) - return OPUS_BAD_ARG; - - st->layout.nb_channels = channels; - st->layout.nb_streams = streams; - st->layout.nb_coupled_streams = coupled_streams; - st->subframe_mem[0]=st->subframe_mem[1]=st->subframe_mem[2]=0; - if (!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) || !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; - 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 (surround) - { - OPUS_CLEAR(ms_get_preemph_mem(st), channels); - OPUS_CLEAR(ms_get_window_mem(st), channels*120); - } - 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) || - (coupled_streams+streams>255) || (streams<1) || (coupled_streams<0)) - { - 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; - OpusMSEncoder *st; - if ((channels>255) || (channels<1)) - { - if (error) - *error = OPUS_BAD_ARG; - return NULL; - } - st = (OpusMSEncoder *)opus_alloc(opus_multistream_surround_encoder_get_size(channels, mapping_family)); - 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 - ) -{ - 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)); - - if (st->bitrate_bps > st->layout.nb_channels*40000) - stream_offset = 20000; - else - stream_offset = st->bitrate_bps/st->layout.nb_channels/2; - stream_offset += 60*(Fs/frame_size-50); - /* We start by giving each stream (coupled or uncoupled) the same bitrate. - This models the main saving of coupled channels over uncoupled. */ - /* The LFE stream is an exception to the above and gets fewer bits. */ - lfe_offset = 3500 + 60*(Fs/frame_size-50); - /* 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 1/8 the bits of mono */ - lfe_ratio = 32; - - /* 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; - } -#ifndef FIXED_POINT - if (st->variable_duration==OPUS_FRAMESIZE_VARIABLE && frame_size != Fs/50) - { - opus_int32 bonus; - bonus = 60*(Fs/frame_size-50); - channel_rate += bonus; - } -#endif - - 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 analysis_frame_size, - unsigned char *data, - opus_int32 max_data_bytes, - int lsb_depth, - downmix_func downmix -) -{ - 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; - ALLOC_STACK; - - if (st->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)); - - { - opus_int32 delay_compensation; - int channels; - - channels = st->layout.nb_streams + st->layout.nb_coupled_streams; - opus_encoder_ctl((OpusEncoder*)ptr, OPUS_GET_LOOKAHEAD(&delay_compensation)); - delay_compensation -= Fs/400; - frame_size = compute_frame_size(pcm, analysis_frame_size, - st->variable_duration, channels, Fs, st->bitrate_bps, - delay_compensation, downmix -#ifndef DISABLE_FLOAT_API - , st->subframe_mem -#endif - ); - } - - 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); - - ALLOC(bandSMR, 21*st->layout.nb_channels, opus_val16); - if (st->surround) - { - surround_analysis(celt_mode, pcm, bandSMR, mem, preemph_mem, frame_size, 120, st->layout.nb_channels, Fs, copy_channel_in); - } - - 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); - - if (!vbr) - max_data_bytes = IMIN(max_data_bytes, 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->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)); - } - } - } - - 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; - - 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); - (*copy_channel_in)(buf+1, 2, - pcm, st->layout.nb_channels, right, frame_size); - ptr += align(coupled_size); - if (st->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); - ptr += align(mono_size); - if (st->surround) - { - for (i=0;i<21;i++) - bandLogE[i] = bandSMR[21*chan+i]; - } - c1 = chan; - c2 = -1; - } - if (st->surround) - opus_encoder_ctl(enc, OPUS_SET_ENERGY_MASK(bandLogE)); - /* 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); - 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); - 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, !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 -) -{ - const float *float_src; - opus_int32 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*); - 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: - { - 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: - { - 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**); - 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; - st->subframe_mem[0] = st->subframe_mem[1] = st->subframe_mem[2] = 0; - if (st->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; - } - - va_end(ap); - return ret; -bad_arg: - va_end(ap); - return OPUS_BAD_ARG; -} - -void opus_multistream_encoder_destroy(OpusMSEncoder *st) -{ - opus_free(st); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/opus_private.h b/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/opus_private.h deleted file mode 100644 index 83225f2b..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/opus_private.h +++ /dev/null @@ -1,129 +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" -#include "celt.h" - -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; - -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); - - - -#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 optimize_framesize(const opus_val16 *x, int len, int C, opus_int32 Fs, - int bitrate, opus_val16 tonality, float *mem, int buffering, - downmix_func downmix); - -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 compute_frame_size(const void *analysis_pcm, int frame_size, - int variable_duration, int C, opus_int32 Fs, int bitrate_bps, - int delay_compensation, downmix_func downmix -#ifndef DISABLE_FLOAT_API - , float *subframe_mem -#endif - ); - -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 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's aligned to sizeof(void *) bytes */ -static OPUS_INLINE int align(int i) -{ - return (i+(int)sizeof(void *)-1)&-(int)sizeof(void *); -} - -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); - -#endif /* OPUS_PRIVATE_H */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/repacketizer.c b/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/repacketizer.c deleted file mode 100644 index a62675ce..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/repacketizer.c +++ /dev/null @@ -1,345 +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); -} - -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); - opus_repacketizer_cat(&rp, data+new_len-len, len); - 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;s -#include -#include - -#define MAX_PACKETOUT 32000 - -void usage(char *argv0) -{ - fprintf(stderr, "usage: %s [options] input_file output_file\n", argv0); -} - -static void int_to_char(opus_uint32 i, unsigned char ch[4]) -{ - ch[0] = i>>24; - ch[1] = (i>>16)&0xFF; - ch[2] = (i>>8)&0xFF; - ch[3] = i&0xFF; -} - -static opus_uint32 char_to_int(unsigned char ch[4]) -{ - return ((opus_uint32)ch[0]<<24) | ((opus_uint32)ch[1]<<16) - | ((opus_uint32)ch[2]<< 8) | (opus_uint32)ch[3]; -} - -int main(int argc, char *argv[]) -{ - int i, eof=0; - FILE *fin, *fout; - unsigned char packets[48][1500]; - int len[48]; - int rng[48]; - OpusRepacketizer *rp; - unsigned char output_packet[MAX_PACKETOUT]; - int merge = 1, split=0; - - if (argc < 3) - { - usage(argv[0]); - return EXIT_FAILURE; - } - for (i=1;i48) - { - fprintf(stderr, "-merge parameter must be less than 48.\n"); - return EXIT_FAILURE; - } - i++; - } else if (strcmp(argv[i], "-split")==0) - split = 1; - else - { - fprintf(stderr, "Unknown option: %s\n", argv[i]); - usage(argv[0]); - return EXIT_FAILURE; - } - } - fin = fopen(argv[argc-2], "r"); - if(fin==NULL) - { - fprintf(stderr, "Error opening input file: %s\n", argv[argc-2]); - return EXIT_FAILURE; - } - fout = fopen(argv[argc-1], "w"); - if(fout==NULL) - { - fprintf(stderr, "Error opening output file: %s\n", argv[argc-1]); - fclose(fin); - return EXIT_FAILURE; - } - - rp = opus_repacketizer_create(); - while (!eof) - { - int err; - int nb_packets=merge; - opus_repacketizer_init(rp); - for (i=0;i1500 || len[i]<0) - { - if (feof(fin)) - { - eof = 1; - } else { - fprintf(stderr, "Invalid payload length\n"); - fclose(fin); - fclose(fout); - return EXIT_FAILURE; - } - break; - } - err = fread(ch, 1, 4, fin); - rng[i] = char_to_int(ch); - err = fread(packets[i], 1, len[i], fin); - if (feof(fin)) - { - eof = 1; - break; - } - err = opus_repacketizer_cat(rp, packets[i], len[i]); - if (err!=OPUS_OK) - { - fprintf(stderr, "opus_repacketizer_cat() failed: %s\n", opus_strerror(err)); - break; - } - } - nb_packets = i; - - if (eof) - break; - - if (!split) - { - err = opus_repacketizer_out(rp, output_packet, MAX_PACKETOUT); - if (err>0) { - unsigned char int_field[4]; - int_to_char(err, int_field); - if(fwrite(int_field, 1, 4, fout)!=4){ - fprintf(stderr, "Error writing.\n"); - return EXIT_FAILURE; - } - int_to_char(rng[nb_packets-1], int_field); - if (fwrite(int_field, 1, 4, fout)!=4) { - fprintf(stderr, "Error writing.\n"); - return EXIT_FAILURE; - } - if (fwrite(output_packet, 1, err, fout)!=(unsigned)err) { - fprintf(stderr, "Error writing.\n"); - return EXIT_FAILURE; - } - /*fprintf(stderr, "out len = %d\n", err);*/ - } else { - fprintf(stderr, "opus_repacketizer_out() failed: %s\n", opus_strerror(err)); - } - } else { - int nb_frames = opus_repacketizer_get_nb_frames(rp); - for (i=0;i0) { - unsigned char int_field[4]; - int_to_char(err, int_field); - if (fwrite(int_field, 1, 4, fout)!=4) { - fprintf(stderr, "Error writing.\n"); - return EXIT_FAILURE; - } - if (i==nb_frames-1) - int_to_char(rng[nb_packets-1], int_field); - else - int_to_char(0, int_field); - if (fwrite(int_field, 1, 4, fout)!=4) { - fprintf(stderr, "Error writing.\n"); - return EXIT_FAILURE; - } - if (fwrite(output_packet, 1, err, fout)!=(unsigned)err) { - fprintf(stderr, "Error writing.\n"); - return EXIT_FAILURE; - } - /*fprintf(stderr, "out len = %d\n", err);*/ - } else { - fprintf(stderr, "opus_repacketizer_out() failed: %s\n", opus_strerror(err)); - } - - } - } - } - - fclose(fin); - fclose(fout); - return EXIT_SUCCESS; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/tansig_table.h b/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/tansig_table.h deleted file mode 100644 index c76f844a..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/libopus/src/tansig_table.h +++ /dev/null @@ -1,45 +0,0 @@ -/* 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/sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/include/opusfile.h b/sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/include/opusfile.h deleted file mode 100644 index a31b6c47..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/include/opusfile.h +++ /dev/null @@ -1,2102 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE libopusfile SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE libopusfile SOURCE CODE IS (C) COPYRIGHT 1994-2012 * - * by the Xiph.Org Foundation and contributors http://www.xiph.org/ * - * * - ******************************************************************** - - function: stdio-based convenience library for opening/seeking/decoding - last mod: $Id: vorbisfile.h 17182 2010-04-29 03:48:32Z xiphmont $ - - ********************************************************************/ -#if !defined(_opusfile_h) -# define _opusfile_h (1) - -/**\mainpage - \section Introduction - - This is the documentation for the libopusfile C API. - - The libopusfile package provides a convenient high-level API for - decoding and basic manipulation of all Ogg Opus audio streams. - libopusfile is implemented as a layer on top of Xiph.Org's - reference - libogg - and - libopus - libraries. - - libopusfile provides several sets of built-in routines for - file/stream access, and may also use custom stream I/O routines provided by - the embedded environment. - There are built-in I/O routines provided for ANSI-compliant - stdio (FILE *), memory buffers, and URLs - (including URLs, plus optionally and URLs). - - \section Organization - - The main API is divided into several sections: - - \ref stream_open_close - - \ref stream_info - - \ref stream_decoding - - \ref stream_seeking - - Several additional sections are not tied to the main API. - - \ref stream_callbacks - - \ref header_info - - \ref error_codes - - \section Overview - - The libopusfile API always decodes files to 48 kHz. - The original sample rate is not preserved by the lossy compression, though - it is stored in the header to allow you to resample to it after decoding - (the libopusfile API does not currently provide a resampler, - but the - the - Speex resampler is a good choice if you need one). - In general, if you are playing back the audio, you should leave it at - 48 kHz, provided your audio hardware supports it. - When decoding to a file, it may be worth resampling back to the original - sample rate, so as not to surprise users who might not expect the sample - rate to change after encoding to Opus and decoding. - - Opus files can contain anywhere from 1 to 255 channels of audio. - The channel mappings for up to 8 channels are the same as the - Vorbis - mappings. - A special stereo API can convert everything to 2 channels, making it simple - to support multichannel files in an application which only has stereo - output. - Although the libopusfile ABI provides support for the theoretical - maximum number of channels, the current implementation does not support - files with more than 8 channels, as they do not have well-defined channel - mappings. - - Like all Ogg files, Opus files may be "chained". - That is, multiple Opus files may be combined into a single, longer file just - by concatenating the original files. - This is commonly done in internet radio streaming, as it allows the title - and artist to be updated each time the song changes, since each link in the - chain includes its own set of metadata. - - libopusfile fully supports chained files. - It will decode the first Opus stream found in each link of a chained file - (ignoring any other streams that might be concurrently multiplexed with it, - such as a video stream). - - The channel count can also change between links. - If your application is not prepared to deal with this, it can use the stereo - API to ensure the audio from all links will always get decoded into a - common format. - Since libopusfile always decodes to 48 kHz, you do not have to - worry about the sample rate changing between links (as was possible with - Vorbis). - This makes application support for chained files with libopusfile - very easy.*/ - -# if defined(__cplusplus) -extern "C" { -# endif - -# include -# include -# include -# include - -/**@cond PRIVATE*/ - -/*Enable special features for gcc and gcc-compatible compilers.*/ -# if !defined(OP_GNUC_PREREQ) -# if defined(__GNUC__)&&defined(__GNUC_MINOR__) -# define OP_GNUC_PREREQ(_maj,_min) \ - ((__GNUC__<<16)+__GNUC_MINOR__>=((_maj)<<16)+(_min)) -# else -# define OP_GNUC_PREREQ(_maj,_min) 0 -# endif -# endif - -# if OP_GNUC_PREREQ(4,0) -# pragma GCC visibility push(default) -# endif - -typedef struct OpusHead OpusHead; -typedef struct OpusTags OpusTags; -typedef struct OpusPictureTag OpusPictureTag; -typedef struct OpusServerInfo OpusServerInfo; -typedef struct OpusFileCallbacks OpusFileCallbacks; -typedef struct OggOpusFile OggOpusFile; - -/*Warning attributes for libopusfile functions.*/ -# if OP_GNUC_PREREQ(3,4) -# define OP_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__)) -# else -# define OP_WARN_UNUSED_RESULT -# endif -# if OP_GNUC_PREREQ(3,4) -# define OP_ARG_NONNULL(_x) __attribute__((__nonnull__(_x))) -# else -# define OP_ARG_NONNULL(_x) -# endif - -/**@endcond*/ - -/**\defgroup error_codes Error Codes*/ -/*@{*/ -/**\name List of possible error codes - Many of the functions in this library return a negative error code when a - function fails. - This list provides a brief explanation of the common errors. - See each individual function for more details on what a specific error code - means in that context.*/ -/*@{*/ - -/**A request did not succeed.*/ -#define OP_FALSE (-1) -/*Currently not used externally.*/ -#define OP_EOF (-2) -/**There was a hole in the page sequence numbers (e.g., a page was corrupt or - missing).*/ -#define OP_HOLE (-3) -/**An underlying read, seek, or tell operation failed when it should have - succeeded.*/ -#define OP_EREAD (-128) -/**A NULL pointer was passed where one was unexpected, or an - internal memory allocation failed, or an internal library error was - encountered.*/ -#define OP_EFAULT (-129) -/**The stream used a feature that is not implemented, such as an unsupported - channel family.*/ -#define OP_EIMPL (-130) -/**One or more parameters to a function were invalid.*/ -#define OP_EINVAL (-131) -/**A purported Ogg Opus stream did not begin with an Ogg page, a purported - header packet did not start with one of the required strings, "OpusHead" or - "OpusTags", or a link in a chained file was encountered that did not - contain any logical Opus streams.*/ -#define OP_ENOTFORMAT (-132) -/**A required header packet was not properly formatted, contained illegal - values, or was missing altogether.*/ -#define OP_EBADHEADER (-133) -/**The ID header contained an unrecognized version number.*/ -#define OP_EVERSION (-134) -/*Currently not used at all.*/ -#define OP_ENOTAUDIO (-135) -/**An audio packet failed to decode properly. - This is usually caused by a multistream Ogg packet where the durations of - the individual Opus packets contained in it are not all the same.*/ -#define OP_EBADPACKET (-136) -/**We failed to find data we had seen before, or the bitstream structure was - sufficiently malformed that seeking to the target destination was - impossible.*/ -#define OP_EBADLINK (-137) -/**An operation that requires seeking was requested on an unseekable stream.*/ -#define OP_ENOSEEK (-138) -/**The first or last granule position of a link failed basic validity checks.*/ -#define OP_EBADTIMESTAMP (-139) - -/*@}*/ -/*@}*/ - -/**\defgroup header_info Header Information*/ -/*@{*/ - -/**The maximum number of channels in an Ogg Opus stream.*/ -#define OPUS_CHANNEL_COUNT_MAX (255) - -/**Ogg Opus bitstream information. - This contains the basic playback parameters for a stream, and corresponds to - the initial ID header packet of an Ogg Opus stream.*/ -struct OpusHead{ - /**The Ogg Opus format version, in the range 0...255. - The top 4 bits represent a "major" version, and the bottom four bits - represent backwards-compatible "minor" revisions. - The current specification describes version 1. - This library will recognize versions up through 15 as backwards compatible - with the current specification. - An earlier draft of the specification described a version 0, but the only - difference between version 1 and version 0 is that version 0 did - not specify the semantics for handling the version field.*/ - int version; - /**The number of channels, in the range 1...255.*/ - int channel_count; - /**The number of samples that should be discarded from the beginning of the - stream.*/ - unsigned pre_skip; - /**The sampling rate of the original input. - All Opus audio is coded at 48 kHz, and should also be decoded at 48 kHz - for playback (unless the target hardware does not support this sampling - rate). - However, this field may be used to resample the audio back to the original - sampling rate, for example, when saving the output to a file.*/ - opus_uint32 input_sample_rate; - /**The gain to apply to the decoded output, in dB, as a Q8 value in the range - -32768...32767. - The libopusfile API will automatically apply this gain to the - decoded output before returning it, scaling it by - pow(10,output_gain/(20.0*256)).*/ - int output_gain; - /**The channel mapping family, in the range 0...255. - Channel mapping family 0 covers mono or stereo in a single stream. - Channel mapping family 1 covers 1 to 8 channels in one or more streams, - using the Vorbis speaker assignments. - Channel mapping family 255 covers 1 to 255 channels in one or more - streams, but without any defined speaker assignment.*/ - int mapping_family; - /**The number of Opus streams in each Ogg packet, in the range 1...255.*/ - int stream_count; - /**The number of coupled Opus streams in each Ogg packet, in the range - 0...127. - This must satisfy 0 <= coupled_count <= stream_count and - coupled_count + stream_count <= 255. - The coupled streams appear first, before all uncoupled streams, in an Ogg - Opus packet.*/ - int coupled_count; - /**The mapping from coded stream channels to output channels. - Let index=mapping[k] be the value for channel k. - If index<2*coupled_count, then it refers to the left channel - from stream (index/2) if even, and the right channel from - stream (index/2) if odd. - Otherwise, it refers to the output of the uncoupled stream - (index-coupled_count).*/ - unsigned char mapping[OPUS_CHANNEL_COUNT_MAX]; -}; - -/**The metadata from an Ogg Opus stream. - - This structure holds the in-stream metadata corresponding to the 'comment' - header packet of an Ogg Opus stream. - The comment header is meant to be used much like someone jotting a quick - note on the label of a CD. - It should be a short, to the point text note that can be more than a couple - words, but not more than a short paragraph. - - The metadata is stored as a series of (tag, value) pairs, in length-encoded - string vectors, using the same format as Vorbis (without the final "framing - bit"), Theora, and Speex, except for the packet header. - The first occurrence of the '=' character delimits the tag and value. - A particular tag may occur more than once, and order is significant. - The character set encoding for the strings is always UTF-8, but the tag - names are limited to ASCII, and treated as case-insensitive. - See the Vorbis - comment header specification for details. - - In filling in this structure, libopusfile will null-terminate the - #user_comments strings for safety. - However, the bitstream format itself treats them as 8-bit clean vectors, - possibly containing NUL characters, so the #comment_lengths array should be - treated as their authoritative length. - - This structure is binary and source-compatible with a - vorbis_comment, and pointers to it may be freely cast to - vorbis_comment pointers, and vice versa. - It is provided as a separate type to avoid introducing a compile-time - dependency on the libvorbis headers.*/ -struct OpusTags{ - /**The array of comment string vectors.*/ - char **user_comments; - /**An array of the corresponding length of each vector, in bytes.*/ - int *comment_lengths; - /**The total number of comment streams.*/ - int comments; - /**The null-terminated vendor string. - This identifies the software used to encode the stream.*/ - char *vendor; -}; - -/**\name Picture tag image formats*/ -/*@{*/ - -/**The MIME type was not recognized, or the image data did not match the - declared MIME type.*/ -#define OP_PIC_FORMAT_UNKNOWN (-1) -/**The MIME type indicates the image data is really a URL.*/ -#define OP_PIC_FORMAT_URL (0) -/**The image is a JPEG.*/ -#define OP_PIC_FORMAT_JPEG (1) -/**The image is a PNG.*/ -#define OP_PIC_FORMAT_PNG (2) -/**The image is a GIF.*/ -#define OP_PIC_FORMAT_GIF (3) - -/*@}*/ - -/**The contents of a METADATA_BLOCK_PICTURE tag.*/ -struct OpusPictureTag{ - /**The picture type according to the ID3v2 APIC frame: -
      -
    1. Other
    2. -
    3. 32x32 pixels 'file icon' (PNG only)
    4. -
    5. Other file icon
    6. -
    7. Cover (front)
    8. -
    9. Cover (back)
    10. -
    11. Leaflet page
    12. -
    13. Media (e.g. label side of CD)
    14. -
    15. Lead artist/lead performer/soloist
    16. -
    17. Artist/performer
    18. -
    19. Conductor
    20. -
    21. Band/Orchestra
    22. -
    23. Composer
    24. -
    25. Lyricist/text writer
    26. -
    27. Recording Location
    28. -
    29. During recording
    30. -
    31. During performance
    32. -
    33. Movie/video screen capture
    34. -
    35. A bright colored fish
    36. -
    37. Illustration
    38. -
    39. Band/artist logotype
    40. -
    41. Publisher/Studio logotype
    42. -
    - Others are reserved and should not be used. - There may only be one each of picture type 1 and 2 in a file.*/ - opus_int32 type; - /**The MIME type of the picture, in printable ASCII characters 0x20-0x7E. - The MIME type may also be "-->" to signify that the data part - is a URL pointing to the picture instead of the picture data itself. - In this case, a terminating NUL is appended to the URL string in #data, - but #data_length is set to the length of the string excluding that - terminating NUL.*/ - char *mime_type; - /**The description of the picture, in UTF-8.*/ - char *description; - /**The width of the picture in pixels.*/ - opus_uint32 width; - /**The height of the picture in pixels.*/ - opus_uint32 height; - /**The color depth of the picture in bits-per-pixel (not - bits-per-channel).*/ - opus_uint32 depth; - /**For indexed-color pictures (e.g., GIF), the number of colors used, or 0 - for non-indexed pictures.*/ - opus_uint32 colors; - /**The length of the picture data in bytes.*/ - opus_uint32 data_length; - /**The binary picture data.*/ - unsigned char *data; - /**The format of the picture data, if known. - One of -
      -
    • #OP_PIC_FORMAT_UNKNOWN,
    • -
    • #OP_PIC_FORMAT_URL,
    • -
    • #OP_PIC_FORMAT_JPEG,
    • -
    • #OP_PIC_FORMAT_PNG, or
    • -
    • #OP_PIC_FORMAT_GIF.
    • -
    */ - int format; -}; - -/**\name Functions for manipulating header data - - These functions manipulate the #OpusHead and #OpusTags structures, - which describe the audio parameters and tag-value metadata, respectively. - These can be used to query the headers returned by libopusfile, or - to parse Opus headers from sources other than an Ogg Opus stream, provided - they use the same format.*/ -/*@{*/ - -/**Parses the contents of the ID header packet of an Ogg Opus stream. - \param[out] _head Returns the contents of the parsed packet. - The contents of this structure are untouched on error. - This may be NULL to merely test the header - for validity. - \param[in] _data The contents of the ID header packet. - \param _len The number of bytes of data in the ID header packet. - \return 0 on success or a negative value on error. - \retval #OP_ENOTFORMAT If the data does not start with the "OpusHead" - string. - \retval #OP_EVERSION If the version field signaled a version this library - does not know how to parse. - \retval #OP_EIMPL If the channel mapping family was 255, which general - purpose players should not attempt to play. - \retval #OP_EBADHEADER If the contents of the packet otherwise violate the - Ogg Opus specification: -
      -
    • Insufficient data,
    • -
    • Too much data for the known minor versions,
    • -
    • An unrecognized channel mapping family,
    • -
    • Zero channels or too many channels,
    • -
    • Zero coded streams,
    • -
    • Too many coupled streams, or
    • -
    • An invalid channel mapping index.
    • -
    */ -OP_WARN_UNUSED_RESULT int opus_head_parse(OpusHead *_head, - const unsigned char *_data,size_t _len) OP_ARG_NONNULL(2); - -/**Converts a granule position to a sample offset for a given Ogg Opus stream. - The sample offset is simply _gp-_head->pre_skip. - Granule position values smaller than OpusHead#pre_skip correspond to audio - that should never be played, and thus have no associated sample offset. - This function returns -1 for such values. - This function also correctly handles extremely large granule positions, - which may have wrapped around to a negative number when stored in a signed - ogg_int64_t value. - \param _head The #OpusHead information from the ID header of the stream. - \param _gp The granule position to convert. - \return The sample offset associated with the given granule position - (counting at a 48 kHz sampling rate), or the special value -1 on - error (i.e., the granule position was smaller than the pre-skip - amount).*/ -ogg_int64_t opus_granule_sample(const OpusHead *_head,ogg_int64_t _gp) - OP_ARG_NONNULL(1); - -/**Parses the contents of the 'comment' header packet of an Ogg Opus stream. - \param[out] _tags An uninitialized #OpusTags structure. - This returns the contents of the parsed packet. - The contents of this structure are untouched on error. - This may be NULL to merely test the header - for validity. - \param[in] _data The contents of the 'comment' header packet. - \param _len The number of bytes of data in the 'info' header packet. - \retval 0 Success. - \retval #OP_ENOTFORMAT If the data does not start with the "OpusTags" - string. - \retval #OP_EBADHEADER If the contents of the packet otherwise violate the - Ogg Opus specification. - \retval #OP_EFAULT If there wasn't enough memory to store the tags.*/ -OP_WARN_UNUSED_RESULT int opus_tags_parse(OpusTags *_tags, - const unsigned char *_data,size_t _len) OP_ARG_NONNULL(2); - -/**Performs a deep copy of an #OpusTags structure. - \param _dst The #OpusTags structure to copy into. - If this function fails, the contents of this structure remain - untouched. - \param _src The #OpusTags structure to copy from. - \retval 0 Success. - \retval #OP_EFAULT If there wasn't enough memory to copy the tags.*/ -int opus_tags_copy(OpusTags *_dst,const OpusTags *_src) OP_ARG_NONNULL(1); - -/**Initializes an #OpusTags structure. - This should be called on a freshly allocated #OpusTags structure before - attempting to use it. - \param _tags The #OpusTags structure to initialize.*/ -void opus_tags_init(OpusTags *_tags) OP_ARG_NONNULL(1); - -/**Add a (tag, value) pair to an initialized #OpusTags structure. - \note Neither opus_tags_add() nor opus_tags_add_comment() support values - containing embedded NULs, although the bitstream format does support them. - To add such tags, you will need to manipulate the #OpusTags structure - directly. - \param _tags The #OpusTags structure to add the (tag, value) pair to. - \param _tag A NUL-terminated, case-insensitive, ASCII string containing - the tag to add (without an '=' character). - \param _value A NUL-terminated UTF-8 containing the corresponding value. - \return 0 on success, or a negative value on failure. - \retval #OP_EFAULT An internal memory allocation failed.*/ -int opus_tags_add(OpusTags *_tags,const char *_tag,const char *_value) - OP_ARG_NONNULL(1) OP_ARG_NONNULL(2) OP_ARG_NONNULL(3); - -/**Add a comment to an initialized #OpusTags structure. - \note Neither opus_tags_add_comment() nor opus_tags_add() support comments - containing embedded NULs, although the bitstream format does support them. - To add such tags, you will need to manipulate the #OpusTags structure - directly. - \param _tags The #OpusTags structure to add the comment to. - \param _comment A NUL-terminated UTF-8 string containing the comment in - "TAG=value" form. - \return 0 on success, or a negative value on failure. - \retval #OP_EFAULT An internal memory allocation failed.*/ -int opus_tags_add_comment(OpusTags *_tags,const char *_comment) - OP_ARG_NONNULL(1) OP_ARG_NONNULL(2); - -/**Look up a comment value by its tag. - \param _tags An initialized #OpusTags structure. - \param _tag The tag to look up. - \param _count The instance of the tag. - The same tag can appear multiple times, each with a distinct - value, so an index is required to retrieve them all. - The order in which these values appear is significant and - should be preserved. - Use opus_tags_query_count() to get the legal range for the - \a _count parameter. - \return A pointer to the queried tag's value. - This points directly to data in the #OpusTags structure. - It should not be modified or freed by the application, and - modifications to the structure may invalidate the pointer. - \retval NULL If no matching tag is found.*/ -const char *opus_tags_query(const OpusTags *_tags,const char *_tag,int _count) - OP_ARG_NONNULL(1) OP_ARG_NONNULL(2); - -/**Look up the number of instances of a tag. - Call this first when querying for a specific tag and then iterate over the - number of instances with separate calls to opus_tags_query() to retrieve - all the values for that tag in order. - \param _tags An initialized #OpusTags structure. - \param _tag The tag to look up. - \return The number of instances of this particular tag.*/ -int opus_tags_query_count(const OpusTags *_tags,const char *_tag) - OP_ARG_NONNULL(1) OP_ARG_NONNULL(2); - -/**Get the track gain from an R128_TRACK_GAIN tag, if one was specified. - This searches for the first R128_TRACK_GAIN tag with a valid signed, - 16-bit decimal integer value and returns the value. - This routine is exposed merely for convenience for applications which wish - to do something special with the track gain (i.e., display it). - If you simply wish to apply the track gain instead of the header gain, you - can use op_set_gain_offset() with an #OP_TRACK_GAIN type and no offset. - \param _tags An initialized #OpusTags structure. - \param[out] _gain_q8 The track gain, in 1/256ths of a dB. - This will lie in the range [-32768,32767], and should - be applied in addition to the header gain. - On error, no value is returned, and the previous - contents remain unchanged. - \return 0 on success, or a negative value on error. - \retval #OP_FALSE There was no track gain available in the given tags.*/ -int opus_tags_get_track_gain(const OpusTags *_tags,int *_gain_q8) - OP_ARG_NONNULL(1) OP_ARG_NONNULL(2); - -/**Clears the #OpusTags structure. - This should be called on an #OpusTags structure after it is no longer - needed. - It will free all memory used by the structure members. - \param _tags The #OpusTags structure to clear.*/ -void opus_tags_clear(OpusTags *_tags) OP_ARG_NONNULL(1); - -/**Check if \a _comment is an instance of a \a _tag_name tag. - \see opus_tagncompare - \param _tag_name A NUL-terminated, case-insensitive, ASCII string containing - the name of the tag to check for (without the terminating - '=' character). - \param _comment The comment string to check. - \return An integer less than, equal to, or greater than zero if \a _comment - is found respectively, to be less than, to match, or be greater - than a "tag=value" string whose tag matches \a _tag_name.*/ -int opus_tagcompare(const char *_tag_name,const char *_comment); - -/**Check if \a _comment is an instance of a \a _tag_name tag. - This version is slightly more efficient than opus_tagcompare() if the length - of the tag name is already known (e.g., because it is a constant). - \see opus_tagcompare - \param _tag_name A case-insensitive ASCII string containing the name of the - tag to check for (without the terminating '=' character). - \param _tag_len The number of characters in the tag name. - This must be non-negative. - \param _comment The comment string to check. - \return An integer less than, equal to, or greater than zero if \a _comment - is found respectively, to be less than, to match, or be greater - than a "tag=value" string whose tag matches the first \a _tag_len - characters of \a _tag_name.*/ -int opus_tagncompare(const char *_tag_name,int _tag_len,const char *_comment); - -/**Parse a single METADATA_BLOCK_PICTURE tag. - This decodes the BASE64-encoded content of the tag and returns a structure - with the MIME type, description, image parameters (if known), and the - compressed image data. - If the MIME type indicates the presence of an image format we recognize - (JPEG, PNG, or GIF) and the actual image data contains the magic signature - associated with that format, then the OpusPictureTag::format field will be - set to the corresponding format. - This is provided as a convenience to avoid requiring applications to parse - the MIME type and/or do their own format detection for the commonly used - formats. - In this case, we also attempt to extract the image parameters directly from - the image data (overriding any that were present in the tag, which the - specification says applications are not meant to rely on). - The application must still provide its own support for actually decoding the - image data and, if applicable, retrieving that data from URLs. - \param[out] _pic Returns the parsed picture data. - No sanitation is done on the type, MIME type, or - description fields, so these might return invalid values. - The contents of this structure are left unmodified on - failure. - \param _tag The METADATA_BLOCK_PICTURE tag contents. - The leading "METADATA_BLOCK_PICTURE=" portion is optional, - to allow the function to be used on either directly on the - values in OpusTags::user_comments or on the return value - of opus_tags_query(). - \return 0 on success or a negative value on error. - \retval #OP_ENOTFORMAT The METADATA_BLOCK_PICTURE contents were not valid. - \retval #OP_EFAULT There was not enough memory to store the picture tag - contents.*/ -OP_WARN_UNUSED_RESULT int opus_picture_tag_parse(OpusPictureTag *_pic, - const char *_tag) OP_ARG_NONNULL(1) OP_ARG_NONNULL(2); - -/**Initializes an #OpusPictureTag structure. - This should be called on a freshly allocated #OpusPictureTag structure - before attempting to use it. - \param _pic The #OpusPictureTag structure to initialize.*/ -void opus_picture_tag_init(OpusPictureTag *_pic) OP_ARG_NONNULL(1); - -/**Clears the #OpusPictureTag structure. - This should be called on an #OpusPictureTag structure after it is no longer - needed. - It will free all memory used by the structure members. - \param _pic The #OpusPictureTag structure to clear.*/ -void opus_picture_tag_clear(OpusPictureTag *_pic) OP_ARG_NONNULL(1); - -/*@}*/ - -/*@}*/ - -/**\defgroup url_options URL Reading Options*/ -/*@{*/ -/**\name URL reading options - Options for op_url_stream_create() and associated functions. - These allow you to provide proxy configuration parameters, skip SSL - certificate checks, etc. - Options are processed in order, and if the same option is passed multiple - times, only the value specified by the last occurrence has an effect - (unless otherwise specified). - They may be expanded in the future.*/ -/*@{*/ - -/**@cond PRIVATE*/ - -/*These are the raw numbers used to define the request codes. - They should not be used directly.*/ -#define OP_SSL_SKIP_CERTIFICATE_CHECK_REQUEST (6464) -#define OP_HTTP_PROXY_HOST_REQUEST (6528) -#define OP_HTTP_PROXY_PORT_REQUEST (6592) -#define OP_HTTP_PROXY_USER_REQUEST (6656) -#define OP_HTTP_PROXY_PASS_REQUEST (6720) -#define OP_GET_SERVER_INFO_REQUEST (6784) - -#define OP_URL_OPT(_request) ((_request)+(char *)0) - -/*These macros trigger compilation errors or warnings if the wrong types are - provided to one of the URL options.*/ -#define OP_CHECK_INT(_x) ((void)((_x)==(opus_int32)0),(opus_int32)(_x)) -#define OP_CHECK_CONST_CHAR_PTR(_x) ((_x)+((_x)-(const char *)(_x))) -#define OP_CHECK_SERVER_INFO_PTR(_x) ((_x)+((_x)-(OpusServerInfo *)(_x))) - -/**@endcond*/ - -/**HTTP/Shoutcast/Icecast server information associated with a URL.*/ -struct OpusServerInfo{ - /**The name of the server (icy-name/ice-name). - This is NULL if there was no icy-name or - ice-name header.*/ - char *name; - /**A short description of the server (icy-description/ice-description). - This is NULL if there was no icy-description or - ice-description header.*/ - char *description; - /**The genre the server falls under (icy-genre/ice-genre). - This is NULL if there was no icy-genre or - ice-genre header.*/ - char *genre; - /**The homepage for the server (icy-url/ice-url). - This is NULL if there was no icy-url or - ice-url header.*/ - char *url; - /**The software used by the origin server (Server). - This is NULL if there was no Server header.*/ - char *server; - /**The media type of the entity sent to the recepient (Content-Type). - This is NULL if there was no Content-Type - header.*/ - char *content_type; - /**The nominal stream bitrate in kbps (icy-br/ice-bitrate). - This is -1 if there was no icy-br or - ice-bitrate header.*/ - opus_int32 bitrate_kbps; - /**Flag indicating whether the server is public (1) or not - (0) (icy-pub/ice-public). - This is -1 if there was no icy-pub or - ice-public header.*/ - int is_public; - /**Flag indicating whether the server is using HTTPS instead of HTTP. - This is 0 unless HTTPS is being used. - This may not match the protocol used in the original URL if there were - redirections.*/ - int is_ssl; -}; - -/**Initializes an #OpusServerInfo structure. - All fields are set as if the corresponding header was not available. - \param _info The #OpusServerInfo structure to initialize. - \note If you use this function, you must link against libopusurl.*/ -void opus_server_info_init(OpusServerInfo *_info) OP_ARG_NONNULL(1); - -/**Clears the #OpusServerInfo structure. - This should be called on an #OpusServerInfo structure after it is no longer - needed. - It will free all memory used by the structure members. - \param _info The #OpusServerInfo structure to clear. - \note If you use this function, you must link against libopusurl.*/ -void opus_server_info_clear(OpusServerInfo *_info) OP_ARG_NONNULL(1); - -/**Skip the certificate check when connecting via TLS/SSL (https). - \param _b opus_int32: Whether or not to skip the certificate - check. - The check will be skipped if \a _b is non-zero, and will not be - skipped if \a _b is zero. - \hideinitializer*/ -#define OP_SSL_SKIP_CERTIFICATE_CHECK(_b) \ - OP_URL_OPT(OP_SSL_SKIP_CERTIFICATE_CHECK_REQUEST),OP_CHECK_INT(_b) - -/**Proxy connections through the given host. - If no port is specified via #OP_HTTP_PROXY_PORT, the port number defaults - to 8080 (http-alt). - All proxy parameters are ignored for non-http and non-https URLs. - \param _host const char *: The proxy server hostname. - This may be NULL to disable the use of a proxy - server. - \hideinitializer*/ -#define OP_HTTP_PROXY_HOST(_host) \ - OP_URL_OPT(OP_HTTP_PROXY_HOST_REQUEST),OP_CHECK_CONST_CHAR_PTR(_host) - -/**Use the given port when proxying connections. - This option only has an effect if #OP_HTTP_PROXY_HOST is specified with a - non-NULL \a _host. - If this option is not provided, the proxy port number defaults to 8080 - (http-alt). - All proxy parameters are ignored for non-http and non-https URLs. - \param _port opus_int32: The proxy server port. - This must be in the range 0...65535 (inclusive), or the - URL function this is passed to will fail. - \hideinitializer*/ -#define OP_HTTP_PROXY_PORT(_port) \ - OP_URL_OPT(OP_HTTP_PROXY_PORT_REQUEST),OP_CHECK_INT(_port) - -/**Use the given user name for authentication when proxying connections. - All proxy parameters are ignored for non-http and non-https URLs. - \param _user const char *: The proxy server user name. - This may be NULL to disable proxy - authentication. - A non-NULL value only has an effect - if #OP_HTTP_PROXY_HOST and #OP_HTTP_PROXY_PASS - are also specified with non-NULL - arguments. - \hideinitializer*/ -#define OP_HTTP_PROXY_USER(_user) \ - OP_URL_OPT(OP_HTTP_PROXY_USER_REQUEST),OP_CHECK_CONST_CHAR_PTR(_user) - -/**Use the given password for authentication when proxying connections. - All proxy parameters are ignored for non-http and non-https URLs. - \param _pass const char *: The proxy server password. - This may be NULL to disable proxy - authentication. - A non-NULL value only has an effect - if #OP_HTTP_PROXY_HOST and #OP_HTTP_PROXY_USER - are also specified with non-NULL - arguments. - \hideinitializer*/ -#define OP_HTTP_PROXY_PASS(_pass) \ - OP_URL_OPT(OP_HTTP_PROXY_PASS_REQUEST),OP_CHECK_CONST_CHAR_PTR(_pass) - -/**Parse information about the streaming server (if any) and return it. - Very little validation is done. - In particular, OpusServerInfo::url may not be a valid URL, - OpusServerInfo::bitrate_kbps may not really be in kbps, and - OpusServerInfo::content_type may not be a valid MIME type. - The character set of the string fields is not specified anywhere, and should - not be assumed to be valid UTF-8. - \param _info OpusServerInfo *: Returns information about the server. - If there is any error opening the stream, the - contents of this structure remain - unmodified. - On success, fills in the structure with the - server information that was available, if - any. - After a successful return, the contents of - this structure should be freed by calling - opus_server_info_clear(). - \hideinitializer*/ -#define OP_GET_SERVER_INFO(_info) \ - OP_URL_OPT(OP_GET_SERVER_INFO_REQUEST),OP_CHECK_SERVER_INFO_PTR(_info) - -/*@}*/ -/*@}*/ - -/**\defgroup stream_callbacks Abstract Stream Reading Interface*/ -/*@{*/ -/**\name Functions for reading from streams - These functions define the interface used to read from and seek in a stream - of data. - A stream does not need to implement seeking, but the decoder will not be - able to seek if it does not do so. - These functions also include some convenience routines for working with - standard FILE pointers, complete streams stored in a single - block of memory, or URLs.*/ -/*@{*/ - -/**Reads up to \a _nbytes bytes of data from \a _stream. - \param _stream The stream to read from. - \param[out] _ptr The buffer to store the data in. - \param _nbytes The maximum number of bytes to read. - This function may return fewer, though it will not - return zero unless it reaches end-of-file. - \return The number of bytes successfully read, or a negative value on - error.*/ -typedef int (*op_read_func)(void *_stream,unsigned char *_ptr,int _nbytes); - -/**Sets the position indicator for \a _stream. - The new position, measured in bytes, is obtained by adding \a _offset - bytes to the position specified by \a _whence. - If \a _whence is set to SEEK_SET, SEEK_CUR, or - SEEK_END, the offset is relative to the start of the stream, - the current position indicator, or end-of-file, respectively. - \retval 0 Success. - \retval -1 Seeking is not supported or an error occurred. - errno need not be set.*/ -typedef int (*op_seek_func)(void *_stream,opus_int64 _offset,int _whence); - -/**Obtains the current value of the position indicator for \a _stream. - \return The current position indicator.*/ -typedef opus_int64 (*op_tell_func)(void *_stream); - -/**Closes the underlying stream. - \retval 0 Success. - \retval EOF An error occurred. - errno need not be set.*/ -typedef int (*op_close_func)(void *_stream); - -/**The callbacks used to access non-FILE stream resources. - The function prototypes are basically the same as for the stdio functions - fread(), fseek(), ftell(), and - fclose(). - The differences are that the FILE * arguments have been - replaced with a void *, which is to be used as a pointer to - whatever internal data these functions might need, that #seek and #tell - take and return 64-bit offsets, and that #seek must return -1 if - the stream is unseekable.*/ -struct OpusFileCallbacks{ - /**Used to read data from the stream. - This must not be NULL.*/ - op_read_func read; - /**Used to seek in the stream. - This may be NULL if seeking is not implemented.*/ - op_seek_func seek; - /**Used to return the current read position in the stream. - This may be NULL if seeking is not implemented.*/ - op_tell_func tell; - /**Used to close the stream when the decoder is freed. - This may be NULL to leave the stream open.*/ - op_close_func close; -}; - -/**Opens a stream with fopen() and fills in a set of callbacks - that can be used to access it. - This is useful to avoid writing your own portable 64-bit seeking wrappers, - and also avoids cross-module linking issues on Windows, where a - FILE * must be accessed by routines defined in the same module - that opened it. - \param[out] _cb The callbacks to use for this file. - If there is an error opening the file, nothing will be - filled in here. - \param _path The path to the file to open. - On Windows, this string must be UTF-8 (to allow access to - files whose names cannot be represented in the current - MBCS code page). - All other systems use the native character encoding. - \param _mode The mode to open the file in. - \return A stream handle to use with the callbacks, or NULL on - error.*/ -OP_WARN_UNUSED_RESULT void *op_fopen(OpusFileCallbacks *_cb, - const char *_path,const char *_mode) OP_ARG_NONNULL(1) OP_ARG_NONNULL(2) - OP_ARG_NONNULL(3); - -/**Opens a stream with fdopen() and fills in a set of callbacks - that can be used to access it. - This is useful to avoid writing your own portable 64-bit seeking wrappers, - and also avoids cross-module linking issues on Windows, where a - FILE * must be accessed by routines defined in the same module - that opened it. - \param[out] _cb The callbacks to use for this file. - If there is an error opening the file, nothing will be - filled in here. - \param _fd The file descriptor to open. - \param _mode The mode to open the file in. - \return A stream handle to use with the callbacks, or NULL on - error.*/ -OP_WARN_UNUSED_RESULT void *op_fdopen(OpusFileCallbacks *_cb, - int _fd,const char *_mode) OP_ARG_NONNULL(1) OP_ARG_NONNULL(3); - -/**Opens a stream with freopen() and fills in a set of callbacks - that can be used to access it. - This is useful to avoid writing your own portable 64-bit seeking wrappers, - and also avoids cross-module linking issues on Windows, where a - FILE * must be accessed by routines defined in the same module - that opened it. - \param[out] _cb The callbacks to use for this file. - If there is an error opening the file, nothing will be - filled in here. - \param _path The path to the file to open. - On Windows, this string must be UTF-8 (to allow access - to files whose names cannot be represented in the - current MBCS code page). - All other systems use the native character encoding. - \param _mode The mode to open the file in. - \param _stream A stream previously returned by op_fopen(), op_fdopen(), - or op_freopen(). - \return A stream handle to use with the callbacks, or NULL on - error.*/ -OP_WARN_UNUSED_RESULT void *op_freopen(OpusFileCallbacks *_cb, - const char *_path,const char *_mode,void *_stream) OP_ARG_NONNULL(1) - OP_ARG_NONNULL(2) OP_ARG_NONNULL(3) OP_ARG_NONNULL(4); - -/**Creates a stream that reads from the given block of memory. - This block of memory must contain the complete stream to decode. - This is useful for caching small streams (e.g., sound effects) in RAM. - \param[out] _cb The callbacks to use for this stream. - If there is an error creating the stream, nothing will be - filled in here. - \param _data The block of memory to read from. - \param _size The size of the block of memory. - \return A stream handle to use with the callbacks, or NULL on - error.*/ -OP_WARN_UNUSED_RESULT void *op_mem_stream_create(OpusFileCallbacks *_cb, - const unsigned char *_data,size_t _size) OP_ARG_NONNULL(1); - -/**Creates a stream that reads from the given URL. - This function behaves identically to op_url_stream_create(), except that it - takes a va_list instead of a variable number of arguments. - It does not call the va_end macro, and because it invokes the - va_arg macro, the value of \a _ap is undefined after the call. - \note If you use this function, you must link against libopusurl. - \param[out] _cb The callbacks to use for this stream. - If there is an error creating the stream, nothing will - be filled in here. - \param _url The URL to read from. - Currently only the , , and - schemes are supported. - Both and may be disabled at compile - time, in which case opening such URLs will always fail. - Currently this only supports URIs. - IRIs should be converted to UTF-8 and URL-escaped, with - internationalized domain names encoded in punycode, - before passing them to this function. - \param[in,out] _ap A list of the \ref url_options "optional flags" to use. - This is a variable-length list of options terminated - with NULL. - \return A stream handle to use with the callbacks, or NULL on - error.*/ -OP_WARN_UNUSED_RESULT void *op_url_stream_vcreate(OpusFileCallbacks *_cb, - const char *_url,va_list _ap) OP_ARG_NONNULL(1) OP_ARG_NONNULL(2); - -/**Creates a stream that reads from the given URL. - \note If you use this function, you must link against libopusurl. - \param[out] _cb The callbacks to use for this stream. - If there is an error creating the stream, nothing will be - filled in here. - \param _url The URL to read from. - Currently only the , , and schemes - are supported. - Both and may be disabled at compile time, - in which case opening such URLs will always fail. - Currently this only supports URIs. - IRIs should be converted to UTF-8 and URL-escaped, with - internationalized domain names encoded in punycode, before - passing them to this function. - \param ... The \ref url_options "optional flags" to use. - This is a variable-length list of options terminated with - NULL. - \return A stream handle to use with the callbacks, or NULL on - error.*/ -OP_WARN_UNUSED_RESULT void *op_url_stream_create(OpusFileCallbacks *_cb, - const char *_url,...) OP_ARG_NONNULL(1) OP_ARG_NONNULL(2); - -/*@}*/ -/*@}*/ - -/**\defgroup stream_open_close Opening and Closing*/ -/*@{*/ -/**\name Functions for opening and closing streams - - These functions allow you to test a stream to see if it is Opus, open it, - and close it. - Several flavors are provided for each of the built-in stream types, plus a - more general version which takes a set of application-provided callbacks.*/ -/*@{*/ - -/**Test to see if this is an Opus stream. - For good results, you will need at least 57 bytes (for a pure Opus-only - stream). - Something like 512 bytes will give more reliable results for multiplexed - streams. - This function is meant to be a quick-rejection filter. - Its purpose is not to guarantee that a stream is a valid Opus stream, but to - ensure that it looks enough like Opus that it isn't going to be recognized - as some other format (except possibly an Opus stream that is also - multiplexed with other codecs, such as video). - \param[out] _head The parsed ID header contents. - You may pass NULL if you do not need - this information. - If the function fails, the contents of this structure - remain untouched. - \param _initial_data An initial buffer of data from the start of the - stream. - \param _initial_bytes The number of bytes in \a _initial_data. - \return 0 if the data appears to be Opus, or a negative value on error. - \retval #OP_FALSE There was not enough data to tell if this was an Opus - stream or not. - \retval #OP_EFAULT An internal memory allocation failed. - \retval #OP_EIMPL The stream used a feature that is not implemented, - such as an unsupported channel family. - \retval #OP_ENOTFORMAT If the data did not contain a recognizable ID - header for an Opus stream. - \retval #OP_EVERSION If the version field signaled a version this library - does not know how to parse. - \retval #OP_EBADHEADER The ID header was not properly formatted or contained - illegal values.*/ -int op_test(OpusHead *_head, - const unsigned char *_initial_data,size_t _initial_bytes); - -/**Open a stream from the given file path. - \param _path The path to the file to open. - \param[out] _error Returns 0 on success, or a failure code on error. - You may pass in NULL if you don't want the - failure code. - The failure code will be #OP_EFAULT if the file could not - be opened, or one of the other failure codes from - op_open_callbacks() otherwise. - \return A freshly opened \c OggOpusFile, or NULL on error.*/ -OP_WARN_UNUSED_RESULT OggOpusFile *op_open_file(const char *_path,int *_error) - OP_ARG_NONNULL(1); - -/**Open a stream from a memory buffer. - \param _data The memory buffer to open. - \param _size The number of bytes in the buffer. - \param[out] _error Returns 0 on success, or a failure code on error. - You may pass in NULL if you don't want the - failure code. - See op_open_callbacks() for a full list of failure codes. - \return A freshly opened \c OggOpusFile, or NULL on error.*/ -OP_WARN_UNUSED_RESULT OggOpusFile *op_open_memory(const unsigned char *_data, - size_t _size,int *_error); - -/**Open a stream from a URL. - This function behaves identically to op_open_url(), except that it - takes a va_list instead of a variable number of arguments. - It does not call the va_end macro, and because it invokes the - va_arg macro, the value of \a _ap is undefined after the call. - \note If you use this function, you must link against libopusurl. - \param _url The URL to open. - Currently only the , , and - schemes are supported. - Both and may be disabled at compile - time, in which case opening such URLs will always - fail. - Currently this only supports URIs. - IRIs should be converted to UTF-8 and URL-escaped, - with internationalized domain names encoded in - punycode, before passing them to this function. - \param[out] _error Returns 0 on success, or a failure code on error. - You may pass in NULL if you don't want - the failure code. - See op_open_callbacks() for a full list of failure - codes. - \param[in,out] _ap A list of the \ref url_options "optional flags" to - use. - This is a variable-length list of options terminated - with NULL. - \return A freshly opened \c OggOpusFile, or NULL on error.*/ -OP_WARN_UNUSED_RESULT OggOpusFile *op_vopen_url(const char *_url, - int *_error,va_list _ap) OP_ARG_NONNULL(1); - -/**Open a stream from a URL. - \note If you use this function, you must link against libopusurl. - \param _url The URL to open. - Currently only the , , and schemes - are supported. - Both and may be disabled at compile - time, in which case opening such URLs will always fail. - Currently this only supports URIs. - IRIs should be converted to UTF-8 and URL-escaped, with - internationalized domain names encoded in punycode, - before passing them to this function. - \param[out] _error Returns 0 on success, or a failure code on error. - You may pass in NULL if you don't want the - failure code. - See op_open_callbacks() for a full list of failure codes. - \param ... The \ref url_options "optional flags" to use. - This is a variable-length list of options terminated with - NULL. - \return A freshly opened \c OggOpusFile, or NULL on error.*/ -OP_WARN_UNUSED_RESULT OggOpusFile *op_open_url(const char *_url, - int *_error,...) OP_ARG_NONNULL(1); - -/**Open a stream using the given set of callbacks to access it. - \param _source The stream to read from (e.g., a FILE *). - \param _cb The callbacks with which to access the stream. - read() must - be implemented. - seek() and - tell() may - be NULL, or may always return -1 to - indicate a source is unseekable, but if - seek() is - implemented and succeeds on a particular source, then - tell() must - also. - close() may - be NULL, but if it is not, it will be - called when the \c OggOpusFile is destroyed by - op_free(). - It will not be called if op_open_callbacks() fails - with an error. - \param _initial_data An initial buffer of data from the start of the - stream. - Applications can read some number of bytes from the - start of the stream to help identify this as an Opus - stream, and then provide them here to allow the - stream to be opened, even if it is unseekable. - \param _initial_bytes The number of bytes in \a _initial_data. - If the stream is seekable, its current position (as - reported by - tell() - at the start of this function) must be equal to - \a _initial_bytes. - Otherwise, seeking to absolute positions will - generate inconsistent results. - \param[out] _error Returns 0 on success, or a failure code on error. - You may pass in NULL if you don't want - the failure code. - The failure code will be one of -
    -
    #OP_EREAD
    -
    An underlying read, seek, or tell operation - failed when it should have succeeded, or we failed - to find data in the stream we had seen before.
    -
    #OP_EFAULT
    -
    There was a memory allocation failure, or an - internal library error.
    -
    #OP_EIMPL
    -
    The stream used a feature that is not - implemented, such as an unsupported channel - family.
    -
    #OP_EINVAL
    -
    seek() - was implemented and succeeded on this source, but - tell() - did not, or the starting position indicator was - not equal to \a _initial_bytes.
    -
    #OP_ENOTFORMAT
    -
    The stream contained a link that did not have - any logical Opus streams in it.
    -
    #OP_EBADHEADER
    -
    A required header packet was not properly - formatted, contained illegal values, or was missing - altogether.
    -
    #OP_EVERSION
    -
    An ID header contained an unrecognized version - number.
    -
    #OP_EBADLINK
    -
    We failed to find data we had seen before after - seeking.
    -
    #OP_EBADTIMESTAMP
    -
    The first or last timestamp in a link failed - basic validity checks.
    -
    - \return A freshly opened \c OggOpusFile, or NULL on error. - libopusfile does not take ownership of the source - if the call fails. - The calling application is responsible for closing the source if - this call returns an error.*/ -OP_WARN_UNUSED_RESULT OggOpusFile *op_open_callbacks(void *_source, - const OpusFileCallbacks *_cb,const unsigned char *_initial_data, - size_t _initial_bytes,int *_error) OP_ARG_NONNULL(2); - -/**Partially open a stream from the given file path. - \see op_test_callbacks - \param _path The path to the file to open. - \param[out] _error Returns 0 on success, or a failure code on error. - You may pass in NULL if you don't want the - failure code. - The failure code will be #OP_EFAULT if the file could not - be opened, or one of the other failure codes from - op_open_callbacks() otherwise. - \return A partially opened \c OggOpusFile, or NULL on error.*/ -OP_WARN_UNUSED_RESULT OggOpusFile *op_test_file(const char *_path,int *_error) - OP_ARG_NONNULL(1); - -/**Partially open a stream from a memory buffer. - \see op_test_callbacks - \param _data The memory buffer to open. - \param _size The number of bytes in the buffer. - \param[out] _error Returns 0 on success, or a failure code on error. - You may pass in NULL if you don't want the - failure code. - See op_open_callbacks() for a full list of failure codes. - \return A partially opened \c OggOpusFile, or NULL on error.*/ -OP_WARN_UNUSED_RESULT OggOpusFile *op_test_memory(const unsigned char *_data, - size_t _size,int *_error); - -/**Partially open a stream from a URL. - This function behaves identically to op_test_url(), except that it - takes a va_list instead of a variable number of arguments. - It does not call the va_end macro, and because it invokes the - va_arg macro, the value of \a _ap is undefined after the call. - \note If you use this function, you must link against libopusurl. - \see op_test_url - \see op_test_callbacks - \param _url The URL to open. - Currently only the , , and - schemes are supported. - Both and may be disabled at compile - time, in which case opening such URLs will always - fail. - Currently this only supports URIs. - IRIs should be converted to UTF-8 and URL-escaped, - with internationalized domain names encoded in - punycode, before passing them to this function. - \param[out] _error Returns 0 on success, or a failure code on error. - You may pass in NULL if you don't want - the failure code. - See op_open_callbacks() for a full list of failure - codes. - \param[in,out] _ap A list of the \ref url_options "optional flags" to - use. - This is a variable-length list of options terminated - with NULL. - \return A partially opened \c OggOpusFile, or NULL on error.*/ -OP_WARN_UNUSED_RESULT OggOpusFile *op_vtest_url(const char *_url, - int *_error,va_list _ap) OP_ARG_NONNULL(1); - -/**Partially open a stream from a URL. - \note If you use this function, you must link against libopusurl. - \see op_test_callbacks - \param _url The URL to open. - Currently only the , , and - schemes are supported. - Both and may be disabled at compile - time, in which case opening such URLs will always fail. - Currently this only supports URIs. - IRIs should be converted to UTF-8 and URL-escaped, with - internationalized domain names encoded in punycode, - before passing them to this function. - \param[out] _error Returns 0 on success, or a failure code on error. - You may pass in NULL if you don't want the - failure code. - See op_open_callbacks() for a full list of failure - codes. - \param ... The \ref url_options "optional flags" to use. - This is a variable-length list of options terminated - with NULL. - \return A partially opened \c OggOpusFile, or NULL on error.*/ -OP_WARN_UNUSED_RESULT OggOpusFile *op_test_url(const char *_url, - int *_error,...) OP_ARG_NONNULL(1); - -/**Partially open a stream using the given set of callbacks to access it. - This tests for Opusness and loads the headers for the first link. - It does not seek (although it tests for seekability). - You can query a partially open stream for the few pieces of basic - information returned by op_serialno(), op_channel_count(), op_head(), and - op_tags() (but only for the first link). - You may also determine if it is seekable via a call to op_seekable(). - You cannot read audio from the stream, seek, get the size or duration, - get information from links other than the first one, or even get the total - number of links until you finish opening the stream with op_test_open(). - If you do not need to do any of these things, you can dispose of it with - op_free() instead. - - This function is provided mostly to simplify porting existing code that used - libvorbisfile. - For new code, you are likely better off using op_test() instead, which - is less resource-intensive, requires less data to succeed, and imposes a - hard limit on the amount of data it examines (important for unseekable - sources, where all such data must be buffered until you are sure of the - stream type). - \param _source The stream to read from (e.g., a FILE *). - \param _cb The callbacks with which to access the stream. - read() must - be implemented. - seek() and - tell() may - be NULL, or may always return -1 to - indicate a source is unseekable, but if - seek() is - implemented and succeeds on a particular source, then - tell() must - also. - close() may - be NULL, but if it is not, it will be - called when the \c OggOpusFile is destroyed by - op_free(). - It will not be called if op_open_callbacks() fails - with an error. - \param _initial_data An initial buffer of data from the start of the - stream. - Applications can read some number of bytes from the - start of the stream to help identify this as an Opus - stream, and then provide them here to allow the - stream to be tested more thoroughly, even if it is - unseekable. - \param _initial_bytes The number of bytes in \a _initial_data. - If the stream is seekable, its current position (as - reported by - tell() - at the start of this function) must be equal to - \a _initial_bytes. - Otherwise, seeking to absolute positions will - generate inconsistent results. - \param[out] _error Returns 0 on success, or a failure code on error. - You may pass in NULL if you don't want - the failure code. - See op_open_callbacks() for a full list of failure - codes. - \return A partially opened \c OggOpusFile, or NULL on error. - libopusfile does not take ownership of the source - if the call fails. - The calling application is responsible for closing the source if - this call returns an error.*/ -OP_WARN_UNUSED_RESULT OggOpusFile *op_test_callbacks(void *_source, - const OpusFileCallbacks *_cb,const unsigned char *_initial_data, - size_t _initial_bytes,int *_error) OP_ARG_NONNULL(2); - -/**Finish opening a stream partially opened with op_test_callbacks() or one of - the associated convenience functions. - If this function fails, you are still responsible for freeing the - \c OggOpusFile with op_free(). - \param _of The \c OggOpusFile to finish opening. - \return 0 on success, or a negative value on error. - \retval #OP_EREAD An underlying read, seek, or tell operation failed - when it should have succeeded. - \retval #OP_EFAULT There was a memory allocation failure, or an - internal library error. - \retval #OP_EIMPL The stream used a feature that is not implemented, - such as an unsupported channel family. - \retval #OP_EINVAL The stream was not partially opened with - op_test_callbacks() or one of the associated - convenience functions. - \retval #OP_ENOTFORMAT The stream contained a link that did not have any - logical Opus streams in it. - \retval #OP_EBADHEADER A required header packet was not properly - formatted, contained illegal values, or was - missing altogether. - \retval #OP_EVERSION An ID header contained an unrecognized version - number. - \retval #OP_EBADLINK We failed to find data we had seen before after - seeking. - \retval #OP_EBADTIMESTAMP The first or last timestamp in a link failed basic - validity checks.*/ -int op_test_open(OggOpusFile *_of) OP_ARG_NONNULL(1); - -/**Release all memory used by an \c OggOpusFile. - \param _of The \c OggOpusFile to free.*/ -void op_free(OggOpusFile *_of); - -/*@}*/ -/*@}*/ - -/**\defgroup stream_info Stream Information*/ -/*@{*/ -/**\name Functions for obtaining information about streams - - These functions allow you to get basic information about a stream, including - seekability, the number of links (for chained streams), plus the size, - duration, bitrate, header parameters, and meta information for each link - (or, where available, the stream as a whole). - Some of these (size, duration) are only available for seekable streams. - You can also query the current stream position, link, and playback time, - and instantaneous bitrate during playback. - - Some of these functions may be used successfully on the partially open - streams returned by op_test_callbacks() or one of the associated - convenience functions. - Their documention will indicate so explicitly.*/ -/*@{*/ - -/**Returns whether or not the data source being read is seekable. - This is true if -
      -
    1. The seek() and - tell() callbacks are both - non-NULL,
    2. -
    3. The seek() callback was - successfully executed at least once, and
    4. -
    5. The tell() callback was - successfully able to report the position indicator afterwards.
    6. -
    - This function may be called on partially-opened streams. - \param _of The \c OggOpusFile whose seekable status is to be returned. - \return A non-zero value if seekable, and 0 if unseekable.*/ -int op_seekable(const OggOpusFile *_of) OP_ARG_NONNULL(1); - -/**Returns the number of links in this chained stream. - This function may be called on partially-opened streams, but it will always - return 1. - The actual number of links is not known until the stream is fully opened. - \param _of The \c OggOpusFile from which to retrieve the link count. - \return For fully-open seekable sources, this returns the total number of - links in the whole stream, which will be at least 1. - For partially-open or unseekable sources, this always returns 1.*/ -int op_link_count(const OggOpusFile *_of) OP_ARG_NONNULL(1); - -/**Get the serial number of the given link in a (possibly-chained) Ogg Opus - stream. - This function may be called on partially-opened streams, but it will always - return the serial number of the Opus stream in the first link. - \param _of The \c OggOpusFile from which to retrieve the serial number. - \param _li The index of the link whose serial number should be retrieved. - Use a negative number to get the serial number of the current - link. - \return The serial number of the given link. - If \a _li is greater than the total number of links, this returns - the serial number of the last link. - If the source is not seekable, this always returns the serial number - of the current link.*/ -opus_uint32 op_serialno(const OggOpusFile *_of,int _li) OP_ARG_NONNULL(1); - -/**Get the channel count of the given link in a (possibly-chained) Ogg Opus - stream. - This is equivalent to op_head(_of,_li)->channel_count, but - is provided for convenience. - This function may be called on partially-opened streams, but it will always - return the channel count of the Opus stream in the first link. - \param _of The \c OggOpusFile from which to retrieve the channel count. - \param _li The index of the link whose channel count should be retrieved. - Use a negative number to get the channel count of the current - link. - \return The channel count of the given link. - If \a _li is greater than the total number of links, this returns - the channel count of the last link. - If the source is not seekable, this always returns the channel count - of the current link.*/ -int op_channel_count(const OggOpusFile *_of,int _li) OP_ARG_NONNULL(1); - -/**Get the total (compressed) size of the stream, or of an individual link in - a (possibly-chained) Ogg Opus stream, including all headers and Ogg muxing - overhead. - \warning If the Opus stream (or link) is concurrently multiplexed with other - logical streams (e.g., video), this returns the size of the entire stream - (or link), not just the number of bytes in the first logical Opus stream. - Returning the latter would require scanning the entire file. - \param _of The \c OggOpusFile from which to retrieve the compressed size. - \param _li The index of the link whose compressed size should be computed. - Use a negative number to get the compressed size of the entire - stream. - \return The compressed size of the entire stream if \a _li is negative, the - compressed size of link \a _li if it is non-negative, or a negative - value on error. - The compressed size of the entire stream may be smaller than that - of the underlying source if trailing garbage was detected in the - file. - \retval #OP_EINVAL The source is not seekable (so we can't know the length), - \a _li wasn't less than the total number of links in - the stream, or the stream was only partially open.*/ -opus_int64 op_raw_total(const OggOpusFile *_of,int _li) OP_ARG_NONNULL(1); - -/**Get the total PCM length (number of samples at 48 kHz) of the stream, or of - an individual link in a (possibly-chained) Ogg Opus stream. - Users looking for op_time_total() should use op_pcm_total() - instead. - Because timestamps in Opus are fixed at 48 kHz, there is no need for a - separate function to convert this to seconds (and leaving it out avoids - introducing floating point to the API, for those that wish to avoid it). - \param _of The \c OggOpusFile from which to retrieve the PCM offset. - \param _li The index of the link whose PCM length should be computed. - Use a negative number to get the PCM length of the entire stream. - \return The PCM length of the entire stream if \a _li is negative, the PCM - length of link \a _li if it is non-negative, or a negative value on - error. - \retval #OP_EINVAL The source is not seekable (so we can't know the length), - \a _li wasn't less than the total number of links in - the stream, or the stream was only partially open.*/ -ogg_int64_t op_pcm_total(const OggOpusFile *_of,int _li) OP_ARG_NONNULL(1); - -/**Get the ID header information for the given link in a (possibly chained) Ogg - Opus stream. - This function may be called on partially-opened streams, but it will always - return the ID header information of the Opus stream in the first link. - \param _of The \c OggOpusFile from which to retrieve the ID header - information. - \param _li The index of the link whose ID header information should be - retrieved. - Use a negative number to get the ID header information of the - current link. - For an unseekable stream, \a _li is ignored, and the ID header - information for the current link is always returned, if - available. - \return The contents of the ID header for the given link.*/ -const OpusHead *op_head(const OggOpusFile *_of,int _li) OP_ARG_NONNULL(1); - -/**Get the comment header information for the given link in a (possibly - chained) Ogg Opus stream. - This function may be called on partially-opened streams, but it will always - return the tags from the Opus stream in the first link. - \param _of The \c OggOpusFile from which to retrieve the comment header - information. - \param _li The index of the link whose comment header information should be - retrieved. - Use a negative number to get the comment header information of - the current link. - For an unseekable stream, \a _li is ignored, and the comment - header information for the current link is always returned, if - available. - \return The contents of the comment header for the given link, or - NULL if this is an unseekable stream that encountered - an invalid link.*/ -const OpusTags *op_tags(const OggOpusFile *_of,int _li) OP_ARG_NONNULL(1); - -/**Retrieve the index of the current link. - This is the link that produced the data most recently read by - op_read_float() or its associated functions, or, after a seek, the link - that the seek target landed in. - Reading more data may advance the link index (even on the first read after a - seek). - \param _of The \c OggOpusFile from which to retrieve the current link index. - \return The index of the current link on success, or a negative value on - failure. - For seekable streams, this is a number between 0 and the value - returned by op_link_count(). - For unseekable streams, this value starts at 0 and increments by one - each time a new link is encountered (even though op_link_count() - always returns 1). - \retval #OP_EINVAL The stream was only partially open.*/ -int op_current_link(const OggOpusFile *_of) OP_ARG_NONNULL(1); - -/**Computes the bitrate of the stream, or of an individual link in a - (possibly-chained) Ogg Opus stream. - The stream must be seekable to compute the bitrate. - For unseekable streams, use op_bitrate_instant() to get periodic estimates. - \warning If the Opus stream (or link) is concurrently multiplexed with other - logical streams (e.g., video), this uses the size of the entire stream (or - link) to compute the bitrate, not just the number of bytes in the first - logical Opus stream. - Returning the latter requires scanning the entire file, but this may be done - by decoding the whole file and calling op_bitrate_instant() once at the - end. - Install a trivial decoding callback with op_set_decode_callback() if you - wish to skip actual decoding during this process. - \param _of The \c OggOpusFile from which to retrieve the bitrate. - \param _li The index of the link whose bitrate should be computed. - Use a negative number to get the bitrate of the whole stream. - \return The bitrate on success, or a negative value on error. - \retval #OP_EINVAL The stream was only partially open, the stream was not - seekable, or \a _li was larger than the number of - links.*/ -opus_int32 op_bitrate(const OggOpusFile *_of,int _li) OP_ARG_NONNULL(1); - -/**Compute the instantaneous bitrate, measured as the ratio of bits to playable - samples decoded since a) the last call to op_bitrate_instant(), b) the last - seek, or c) the start of playback, whichever was most recent. - This will spike somewhat after a seek or at the start/end of a chain - boundary, as pre-skip, pre-roll, and end-trimming causes samples to be - decoded but not played. - \param _of The \c OggOpusFile from which to retrieve the bitrate. - \return The bitrate, in bits per second, or a negative value on error. - \retval #OP_FALSE No data has been decoded since any of the events - described above. - \retval #OP_EINVAL The stream was only partially open.*/ -opus_int32 op_bitrate_instant(OggOpusFile *_of) OP_ARG_NONNULL(1); - -/**Obtain the current value of the position indicator for \a _of. - \param _of The \c OggOpusFile from which to retrieve the position indicator. - \return The byte position that is currently being read from. - \retval #OP_EINVAL The stream was only partially open.*/ -opus_int64 op_raw_tell(const OggOpusFile *_of) OP_ARG_NONNULL(1); - -/**Obtain the PCM offset of the next sample to be read. - If the stream is not properly timestamped, this might not increment by the - proper amount between reads, or even return monotonically increasing - values. - \param _of The \c OggOpusFile from which to retrieve the PCM offset. - \return The PCM offset of the next sample to be read. - \retval #OP_EINVAL The stream was only partially open.*/ -ogg_int64_t op_pcm_tell(const OggOpusFile *_of) OP_ARG_NONNULL(1); - -/*@}*/ -/*@}*/ - -/**\defgroup stream_seeking Seeking*/ -/*@{*/ -/**\name Functions for seeking in Opus streams - - These functions let you seek in Opus streams, if the underlying source - support it. - Seeking is implemented for all built-in stream I/O routines, though some - individual sources may not be seekable (pipes, live HTTP streams, or HTTP - streams from a server that does not support Range requests). - - op_raw_seek() is the fastest: it is guaranteed to perform at most one - physical seek, but, since the target is a byte position, makes no guarantee - how close to a given time it will come. - op_pcm_seek() provides sample-accurate seeking. - The number of physical seeks it requires is still quite small (often 1 or - 2, even in highly variable bitrate streams). - - Seeking in Opus requires decoding some pre-roll amount before playback to - allow the internal state to converge (as if recovering from packet loss). - This is handled internally by libopusfile, but means there is - little extra overhead for decoding up to the exact position requested - (since it must decode some amount of audio anyway). - It also means that decoding after seeking may not return exactly the same - values as would be obtained by decoding the stream straight through. - However, such differences are expected to be smaller than the loss - introduced by Opus's lossy compression.*/ -/*@{*/ - -/**Seek to a byte offset relative to the compressed data. - This also scans packets to update the PCM cursor. - It will cross a logical bitstream boundary, but only if it can't get any - packets out of the tail of the link to which it seeks. - \param _of The \c OggOpusFile in which to seek. - \param _byte_offset The byte position to seek to. - \return 0 on success, or a negative error code on failure. - \retval #OP_EREAD The underlying seek operation failed. - \retval #OP_EINVAL The stream was only partially open, or the target was - outside the valid range for the stream. - \retval #OP_ENOSEEK This stream is not seekable. - \retval #OP_EBADLINK Failed to initialize a decoder for a stream for an - unknown reason.*/ -int op_raw_seek(OggOpusFile *_of,opus_int64 _byte_offset) OP_ARG_NONNULL(1); - -/**Seek to the specified PCM offset, such that decoding will begin at exactly - the requested position. - \param _of The \c OggOpusFile in which to seek. - \param _pcm_offset The PCM offset to seek to. - This is in samples at 48 kHz relative to the start of the - stream. - \return 0 on success, or a negative value on error. - \retval #OP_EREAD An underlying read or seek operation failed. - \retval #OP_EINVAL The stream was only partially open, or the target was - outside the valid range for the stream. - \retval #OP_ENOSEEK This stream is not seekable. - \retval #OP_EBADLINK We failed to find data we had seen before, or the - bitstream structure was sufficiently malformed that - seeking to the target destination was impossible.*/ -int op_pcm_seek(OggOpusFile *_of,ogg_int64_t _pcm_offset) OP_ARG_NONNULL(1); - -/*@}*/ -/*@}*/ - -/**\defgroup stream_decoding Decoding*/ -/*@{*/ -/**\name Functions for decoding audio data - - These functions retrieve actual decoded audio data from the stream. - The general functions, op_read() and op_read_float() return 16-bit or - floating-point output, both using native endian ordering. - The number of channels returned can change from link to link in a chained - stream. - There are special functions, op_read_stereo() and op_read_float_stereo(), - which always output two channels, to simplify applications which do not - wish to handle multichannel audio. - These downmix multichannel files to two channels, so they can always return - samples in the same format for every link in a chained file. - - If the rest of your audio processing chain can handle floating point, those - routines should be preferred, as floating point output avoids introducing - clipping and other issues which might be avoided entirely if, e.g., you - scale down the volume at some other stage. - However, if you intend to direct consume 16-bit samples, the conversion in - libopusfile provides noise-shaping dithering and, if compiled - against libopus 1.1 or later, soft-clipping prevention. - - libopusfile can also be configured at compile time to use the - fixed-point libopus API. - If so, libopusfile's floating-point API may also be disabled. - In that configuration, nothing in libopusfile will use any - floating-point operations, to simplify support on devices without an - adequate FPU. - - \warning HTTPS streams may be be vulnerable to truncation attacks if you do - not check the error return code from op_read_float() or its associated - functions. - If the remote peer does not close the connection gracefully (with a TLS - "close notify" message), these functions will return #OP_EREAD instead of 0 - when they reach the end of the file. - If you are reading from an URL (particularly if seeking is not - supported), you should make sure to check for this error and warn the user - appropriately.*/ -/*@{*/ - -/**Indicates that the decoding callback should produce signed 16-bit - native-endian output samples.*/ -#define OP_DEC_FORMAT_SHORT (7008) -/**Indicates that the decoding callback should produce 32-bit native-endian - float samples.*/ -#define OP_DEC_FORMAT_FLOAT (7040) - -/**Indicates that the decoding callback did not decode anything, and that - libopusfile should decode normally instead.*/ -#define OP_DEC_USE_DEFAULT (6720) - -/**Called to decode an Opus packet. - This should invoke the functional equivalent of opus_multistream_decode() or - opus_multistream_decode_float(), except that it returns 0 on success - instead of the number of decoded samples (which is known a priori). - \param _ctx The application-provided callback context. - \param _decoder The decoder to use to decode the packet. - \param[out] _pcm The buffer to decode into. - This will always have enough room for \a _nchannels of - \a _nsamples samples, which should be placed into this - buffer interleaved. - \param _op The packet to decode. - This will always have its granule position set to a valid - value. - \param _nsamples The number of samples expected from the packet. - \param _nchannels The number of channels expected from the packet. - \param _format The desired sample output format. - This is either #OP_DEC_FORMAT_SHORT or - #OP_DEC_FORMAT_FLOAT. - \param _li The index of the link from which this packet was decoded. - \return A non-negative value on success, or a negative value on error. - The error codes should be the same as those returned by - opus_multistream_decode() or opus_multistream_decode_float(). - \retval 0 Decoding was successful. - The application has filled the buffer with - exactly \a _nsamples*\a - _nchannels samples in the requested - format. - \retval #OP_DEC_USE_DEFAULT No decoding was done. - libopusfile should decode normally - instead.*/ -typedef int (*op_decode_cb_func)(void *_ctx,OpusMSDecoder *_decoder,void *_pcm, - const ogg_packet *_op,int _nsamples,int _nchannels,int _format,int _li); - -/**Sets the packet decode callback function. - This is called once for each packet that needs to be decoded. - A call to this function is no guarantee that the audio will eventually be - delivered to the application. - Some or all of the data from the packet may be discarded (i.e., at the - beginning or end of a link, or after a seek), however the callback is - required to provide all of it. - \param _of The \c OggOpusFile on which to set the decode callback. - \param _decode_cb The callback function to call. - This may be NULL to disable calling the - callback. - \param _ctx The application-provided context pointer to pass to the - callback on each call.*/ -void op_set_decode_callback(OggOpusFile *_of, - op_decode_cb_func _decode_cb,void *_ctx) OP_ARG_NONNULL(1); - -/**Gain offset type that indicates that the provided offset is relative to the - header gain. - This is the default.*/ -#define OP_HEADER_GAIN (0) - -/**Gain offset type that indicates that the provided offset is relative to the - R128_TRACK_GAIN value (if any), in addition to the header gain.*/ -#define OP_TRACK_GAIN (3008) - -/**Gain offset type that indicates that the provided offset should be used as - the gain directly, without applying any the header or track gains.*/ -#define OP_ABSOLUTE_GAIN (3009) - -/**Sets the gain to be used for decoded output. - By default, the gain in the header is applied with no additional offset. - The total gain (including header gain and/or track gain, if applicable, and - this offset), will be clamped to [-32768,32767]/256 dB. - This is more than enough to saturate or underflow 16-bit PCM. - \note The new gain will not be applied to any already buffered, decoded - output. - This means you cannot change it sample-by-sample, as at best it will be - updated packet-by-packet. - It is meant for setting a target volume level, rather than applying smooth - fades, etc. - \param _of The \c OggOpusFile on which to set the gain offset. - \param _gain_type One of #OP_HEADER_GAIN, #OP_TRACK_GAIN, or - #OP_ABSOLUTE_GAIN. - \param _gain_offset_q8 The gain offset to apply, in 1/256ths of a dB. - \return 0 on success or a negative value on error. - \retval #OP_EINVAL The \a _gain_type was unrecognized.*/ -int op_set_gain_offset(OggOpusFile *_of, - int _gain_type,opus_int32 _gain_offset_q8) OP_ARG_NONNULL(1); - -/**Sets whether or not dithering is enabled for 16-bit decoding. - By default, when libopusfile is compiled to use floating-point - internally, calling op_read() or op_read_stereo() will first decode to - float, and then convert to fixed-point using noise-shaping dithering. - This flag can be used to disable that dithering. - When the application uses op_read_float() or op_read_float_stereo(), or when - the library has been compiled to decode directly to fixed point, this flag - has no effect. - \param _of The \c OggOpusFile on which to enable or disable dithering. - \param _enabled A non-zero value to enable dithering, or 0 to disable it.*/ -void op_set_dither_enabled(OggOpusFile *_of,int _enabled) OP_ARG_NONNULL(1); - -/**Reads more samples from the stream. - \note Although \a _buf_size must indicate the total number of values that - can be stored in \a _pcm, the return value is the number of samples - per channel. - This is done because -
      -
    1. The channel count cannot be known a priori (reading more samples might - advance us into the next link, with a different channel count), so - \a _buf_size cannot also be in units of samples per channel,
    2. -
    3. Returning the samples per channel matches the libopus API - as closely as we're able,
    4. -
    5. Returning the total number of values instead of samples per channel - would mean the caller would need a division to compute the samples per - channel, and might worry about the possibility of getting back samples - for some channels and not others, and
    6. -
    7. This approach is relatively fool-proof: if an application passes too - small a value to \a _buf_size, they will simply get fewer samples back, - and if they assume the return value is the total number of values, then - they will simply read too few (rather than reading too many and going - off the end of the buffer).
    8. -
    - \param _of The \c OggOpusFile from which to read. - \param[out] _pcm A buffer in which to store the output PCM samples, as - signed native-endian 16-bit values at 48 kHz - with a nominal range of [-32768,32767). - Multiple channels are interleaved using the - Vorbis - channel ordering. - This must have room for at least \a _buf_size values. - \param _buf_size The number of values that can be stored in \a _pcm. - It is recommended that this be large enough for at - least 120 ms of data at 48 kHz per channel (5760 - values per channel). - Smaller buffers will simply return less data, possibly - consuming more memory to buffer the data internally. - libopusfile may return less data than - requested. - If so, there is no guarantee that the remaining data - in \a _pcm will be unmodified. - \param[out] _li The index of the link this data was decoded from. - You may pass NULL if you do not need this - information. - If this function fails (returning a negative value), - this parameter is left unset. - \return The number of samples read per channel on success, or a negative - value on failure. - The channel count can be retrieved on success by calling - op_head(_of,*_li). - The number of samples returned may be 0 if the buffer was too small - to store even a single sample for all channels, or if end-of-file - was reached. - The list of possible failure codes follows. - Most of them can only be returned by unseekable, chained streams - that encounter a new link. - \retval #OP_HOLE There was a hole in the data, and some samples - may have been skipped. - Call this function again to continue decoding - past the hole. - \retval #OP_EREAD An underlying read operation failed. - This may signal a truncation attack from an - source. - \retval #OP_EFAULT An internal memory allocation failed. - \retval #OP_EIMPL An unseekable stream encountered a new link that - used a feature that is not implemented, such as - an unsupported channel family. - \retval #OP_EINVAL The stream was only partially open. - \retval #OP_ENOTFORMAT An unseekable stream encountered a new link that - did not have any logical Opus streams in it. - \retval #OP_EBADHEADER An unseekable stream encountered a new link with a - required header packet that was not properly - formatted, contained illegal values, or was - missing altogether. - \retval #OP_EVERSION An unseekable stream encountered a new link with - an ID header that contained an unrecognized - version number. - \retval #OP_EBADPACKET Failed to properly decode the next packet. - \retval #OP_EBADLINK We failed to find data we had seen before. - \retval #OP_EBADTIMESTAMP An unseekable stream encountered a new link with - a starting timestamp that failed basic validity - checks.*/ -OP_WARN_UNUSED_RESULT int op_read(OggOpusFile *_of, - opus_int16 *_pcm,int _buf_size,int *_li) OP_ARG_NONNULL(1); - -/**Reads more samples from the stream. - \note Although \a _buf_size must indicate the total number of values that - can be stored in \a _pcm, the return value is the number of samples - per channel. -
      -
    1. The channel count cannot be known a priori (reading more samples might - advance us into the next link, with a different channel count), so - \a _buf_size cannot also be in units of samples per channel,
    2. -
    3. Returning the samples per channel matches the libopus API - as closely as we're able,
    4. -
    5. Returning the total number of values instead of samples per channel - would mean the caller would need a division to compute the samples per - channel, and might worry about the possibility of getting back samples - for some channels and not others, and
    6. -
    7. This approach is relatively fool-proof: if an application passes too - small a value to \a _buf_size, they will simply get fewer samples back, - and if they assume the return value is the total number of values, then - they will simply read too few (rather than reading too many and going - off the end of the buffer).
    8. -
    - \param _of The \c OggOpusFile from which to read. - \param[out] _pcm A buffer in which to store the output PCM samples as - signed floats at 48 kHz with a nominal range of - [-1.0,1.0]. - Multiple channels are interleaved using the - Vorbis - channel ordering. - This must have room for at least \a _buf_size floats. - \param _buf_size The number of floats that can be stored in \a _pcm. - It is recommended that this be large enough for at - least 120 ms of data at 48 kHz per channel (5760 - samples per channel). - Smaller buffers will simply return less data, possibly - consuming more memory to buffer the data internally. - If less than \a _buf_size values are returned, - libopusfile makes no guarantee that the - remaining data in \a _pcm will be unmodified. - \param[out] _li The index of the link this data was decoded from. - You may pass NULL if you do not need this - information. - If this function fails (returning a negative value), - this parameter is left unset. - \return The number of samples read per channel on success, or a negative - value on failure. - The channel count can be retrieved on success by calling - op_head(_of,*_li). - The number of samples returned may be 0 if the buffer was too small - to store even a single sample for all channels, or if end-of-file - was reached. - The list of possible failure codes follows. - Most of them can only be returned by unseekable, chained streams - that encounter a new link. - \retval #OP_HOLE There was a hole in the data, and some samples - may have been skipped. - Call this function again to continue decoding - past the hole. - \retval #OP_EREAD An underlying read operation failed. - This may signal a truncation attack from an - source. - \retval #OP_EFAULT An internal memory allocation failed. - \retval #OP_EIMPL An unseekable stream encountered a new link that - used a feature that is not implemented, such as - an unsupported channel family. - \retval #OP_EINVAL The stream was only partially open. - \retval #OP_ENOTFORMAT An unseekable stream encountered a new link that - did not have any logical Opus streams in it. - \retval #OP_EBADHEADER An unseekable stream encountered a new link with a - required header packet that was not properly - formatted, contained illegal values, or was - missing altogether. - \retval #OP_EVERSION An unseekable stream encountered a new link with - an ID header that contained an unrecognized - version number. - \retval #OP_EBADPACKET Failed to properly decode the next packet. - \retval #OP_EBADLINK We failed to find data we had seen before. - \retval #OP_EBADTIMESTAMP An unseekable stream encountered a new link with - a starting timestamp that failed basic validity - checks.*/ -OP_WARN_UNUSED_RESULT int op_read_float(OggOpusFile *_of, - float *_pcm,int _buf_size,int *_li) OP_ARG_NONNULL(1); - -/**Reads more samples from the stream and downmixes to stereo, if necessary. - This function is intended for simple players that want a uniform output - format, even if the channel count changes between links in a chained - stream. - \note \a _buf_size indicates the total number of values that can be stored - in \a _pcm, while the return value is the number of samples per - channel, even though the channel count is known, for consistency with - op_read(). - \param _of The \c OggOpusFile from which to read. - \param[out] _pcm A buffer in which to store the output PCM samples, as - signed native-endian 16-bit values at 48 kHz - with a nominal range of [-32768,32767). - The left and right channels are interleaved in the - buffer. - This must have room for at least \a _buf_size values. - \param _buf_size The number of values that can be stored in \a _pcm. - It is recommended that this be large enough for at - least 120 ms of data at 48 kHz per channel (11520 - values total). - Smaller buffers will simply return less data, possibly - consuming more memory to buffer the data internally. - If less than \a _buf_size values are returned, - libopusfile makes no guarantee that the - remaining data in \a _pcm will be unmodified. - \return The number of samples read per channel on success, or a negative - value on failure. - The number of samples returned may be 0 if the buffer was too small - to store even a single sample for both channels, or if end-of-file - was reached. - The list of possible failure codes follows. - Most of them can only be returned by unseekable, chained streams - that encounter a new link. - \retval #OP_HOLE There was a hole in the data, and some samples - may have been skipped. - Call this function again to continue decoding - past the hole. - \retval #OP_EREAD An underlying read operation failed. - This may signal a truncation attack from an - source. - \retval #OP_EFAULT An internal memory allocation failed. - \retval #OP_EIMPL An unseekable stream encountered a new link that - used a feature that is not implemented, such as - an unsupported channel family. - \retval #OP_EINVAL The stream was only partially open. - \retval #OP_ENOTFORMAT An unseekable stream encountered a new link that - did not have any logical Opus streams in it. - \retval #OP_EBADHEADER An unseekable stream encountered a new link with a - required header packet that was not properly - formatted, contained illegal values, or was - missing altogether. - \retval #OP_EVERSION An unseekable stream encountered a new link with - an ID header that contained an unrecognized - version number. - \retval #OP_EBADPACKET Failed to properly decode the next packet. - \retval #OP_EBADLINK We failed to find data we had seen before. - \retval #OP_EBADTIMESTAMP An unseekable stream encountered a new link with - a starting timestamp that failed basic validity - checks.*/ -OP_WARN_UNUSED_RESULT int op_read_stereo(OggOpusFile *_of, - opus_int16 *_pcm,int _buf_size) OP_ARG_NONNULL(1); - -/**Reads more samples from the stream and downmixes to stereo, if necessary. - This function is intended for simple players that want a uniform output - format, even if the channel count changes between links in a chained - stream. - \note \a _buf_size indicates the total number of values that can be stored - in \a _pcm, while the return value is the number of samples per - channel, even though the channel count is known, for consistency with - op_read_float(). - \param _of The \c OggOpusFile from which to read. - \param[out] _pcm A buffer in which to store the output PCM samples, as - signed floats at 48 kHz with a nominal range of - [-1.0,1.0]. - The left and right channels are interleaved in the - buffer. - This must have room for at least \a _buf_size values. - \param _buf_size The number of values that can be stored in \a _pcm. - It is recommended that this be large enough for at - least 120 ms of data at 48 kHz per channel (11520 - values total). - Smaller buffers will simply return less data, possibly - consuming more memory to buffer the data internally. - If less than \a _buf_size values are returned, - libopusfile makes no guarantee that the - remaining data in \a _pcm will be unmodified. - \return The number of samples read per channel on success, or a negative - value on failure. - The number of samples returned may be 0 if the buffer was too small - to store even a single sample for both channels, or if end-of-file - was reached. - The list of possible failure codes follows. - Most of them can only be returned by unseekable, chained streams - that encounter a new link. - \retval #OP_HOLE There was a hole in the data, and some samples - may have been skipped. - Call this function again to continue decoding - past the hole. - \retval #OP_EREAD An underlying read operation failed. - This may signal a truncation attack from an - source. - \retval #OP_EFAULT An internal memory allocation failed. - \retval #OP_EIMPL An unseekable stream encountered a new link that - used a feature that is not implemented, such as - an unsupported channel family. - \retval #OP_EINVAL The stream was only partially open. - \retval #OP_ENOTFORMAT An unseekable stream encountered a new link that - that did not have any logical Opus streams in it. - \retval #OP_EBADHEADER An unseekable stream encountered a new link with a - required header packet that was not properly - formatted, contained illegal values, or was - missing altogether. - \retval #OP_EVERSION An unseekable stream encountered a new link with - an ID header that contained an unrecognized - version number. - \retval #OP_EBADPACKET Failed to properly decode the next packet. - \retval #OP_EBADLINK We failed to find data we had seen before. - \retval #OP_EBADTIMESTAMP An unseekable stream encountered a new link with - a starting timestamp that failed basic validity - checks.*/ -OP_WARN_UNUSED_RESULT int op_read_float_stereo(OggOpusFile *_of, - float *_pcm,int _buf_size) OP_ARG_NONNULL(1); - -/*@}*/ -/*@}*/ - -# if OP_GNUC_PREREQ(4,0) -# pragma GCC visibility pop -# endif - -# if defined(__cplusplus) -} -# endif - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/src/http.c b/sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/src/http.c deleted file mode 100644 index 4a9eaf59..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/src/http.c +++ /dev/null @@ -1,3391 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE libopusfile SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE libopusfile SOURCE CODE IS (C) COPYRIGHT 2012 * - * by the Xiph.Org Foundation and contributors http://www.xiph.org/ * - * * - ********************************************************************/ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "internal.h" -#include -#include -#include -#include - -/*RFCs referenced in this file: - RFC 761: DOD Standard Transmission Control Protocol - RFC 1535: A Security Problem and Proposed Correction With Widely Deployed DNS - Software - RFC 1738: Uniform Resource Locators (URL) - RFC 1945: Hypertext Transfer Protocol -- HTTP/1.0 - RFC 2068: Hypertext Transfer Protocol -- HTTP/1.1 - RFC 2145: Use and Interpretation of HTTP Version Numbers - RFC 2246: The TLS Protocol Version 1.0 - RFC 2459: Internet X.509 Public Key Infrastructure Certificate and - Certificate Revocation List (CRL) Profile - RFC 2616: Hypertext Transfer Protocol -- HTTP/1.1 - RFC 2617: HTTP Authentication: Basic and Digest Access Authentication - RFC 2817: Upgrading to TLS Within HTTP/1.1 - RFC 2818: HTTP Over TLS - RFC 3492: Punycode: A Bootstring encoding of Unicode for Internationalized - Domain Names in Applications (IDNA) - RFC 3986: Uniform Resource Identifier (URI): Generic Syntax - RFC 3987: Internationalized Resource Identifiers (IRIs) - RFC 4343: Domain Name System (DNS) Case Insensitivity Clarification - RFC 5894: Internationalized Domain Names for Applications (IDNA): - Background, Explanation, and Rationale - RFC 6066: Transport Layer Security (TLS) Extensions: Extension Definitions - RFC 6125: Representation and Verification of Domain-Based Application Service - Identity within Internet Public Key Infrastructure Using X.509 (PKIX) - Certificates in the Context of Transport Layer Security (TLS) - RFC 6555: Happy Eyeballs: Success with Dual-Stack Hosts*/ - -typedef struct OpusParsedURL OpusParsedURL; -typedef struct OpusStringBuf OpusStringBuf; -typedef struct OpusHTTPConn OpusHTTPConn; -typedef struct OpusHTTPStream OpusHTTPStream; - -static char *op_string_range_dup(const char *_start,const char *_end){ - size_t len; - char *ret; - OP_ASSERT(_start<=_end); - len=_end-_start; - /*This is to help avoid overflow elsewhere, later.*/ - if(OP_UNLIKELY(len>=INT_MAX))return NULL; - ret=(char *)_ogg_malloc(sizeof(*ret)*(len+1)); - if(OP_LIKELY(ret!=NULL)){ - ret=(char *)memcpy(ret,_start,sizeof(*ret)*(len)); - ret[len]='\0'; - } - return ret; -} - -static char *op_string_dup(const char *_s){ - return op_string_range_dup(_s,_s+strlen(_s)); -} - -static char *op_string_tolower(char *_s){ - int i; - for(i=0;_s[i]!='\0';i++){ - int c; - c=_s[i]; - if(c>='A'&&c<='Z')c+='a'-'A'; - _s[i]=(char)c; - } - return _s; -} - -/*URI character classes (from RFC 3986).*/ -#define OP_URL_ALPHA \ - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" -#define OP_URL_DIGIT "0123456789" -#define OP_URL_HEXDIGIT "0123456789ABCDEFabcdef" -/*Not a character class, but the characters allowed in .*/ -#define OP_URL_SCHEME OP_URL_ALPHA OP_URL_DIGIT "+-." -#define OP_URL_GEN_DELIMS "#/:?@[]" -#define OP_URL_SUB_DELIMS "!$&'()*+,;=" -#define OP_URL_RESERVED OP_URL_GEN_DELIMS OP_URL_SUB_DELIMS -#define OP_URL_UNRESERVED OP_URL_ALPHA OP_URL_DIGIT "-._~" -/*Not a character class, but the characters allowed in .*/ -#define OP_URL_PCT_ENCODED "%" -/*Not a character class or production rule, but for convenience.*/ -#define OP_URL_PCHAR_BASE \ - OP_URL_UNRESERVED OP_URL_PCT_ENCODED OP_URL_SUB_DELIMS -#define OP_URL_PCHAR OP_URL_PCHAR_BASE ":@" -/*Not a character class, but the characters allowed in and - .*/ -#define OP_URL_PCHAR_NA OP_URL_PCHAR_BASE ":" -/*Not a character class, but the characters allowed in .*/ -#define OP_URL_PCHAR_NC OP_URL_PCHAR_BASE "@" -/*Not a character clsss, but the characters allowed in .*/ -#define OP_URL_PATH OP_URL_PCHAR "/" -/*Not a character class, but the characters allowed in / .*/ -#define OP_URL_QUERY_FRAG OP_URL_PCHAR "/?" - -/*Check the <% HEXDIG HEXDIG> escapes of a URL for validity. - Return: 0 if valid, or a negative value on failure.*/ -static int op_validate_url_escapes(const char *_s){ - int i; - for(i=0;_s[i];i++){ - if(_s[i]=='%'){ - if(OP_UNLIKELY(!isxdigit(_s[i+1])) - ||OP_UNLIKELY(!isxdigit(_s[i+2])) - /*RFC 3986 says %00 "should be rejected if the application is not - expecting to receive raw data within a component."*/ - ||OP_UNLIKELY(_s[i+1]=='0'&&_s[i+2]=='0')){ - return OP_FALSE; - } - i+=2; - } - } - return 0; -} - -/*Convert a hex digit to its actual value. - _c: The hex digit to convert. - Presumed to be valid ('0'...'9', 'A'...'F', or 'a'...'f'). - Return: The value of the digit, in the range [0,15].*/ -static int op_hex_value(int _c){ - return _c>='a'?_c-'a'+10:_c>='A'?_c-'A'+10:_c-'0'; -} - -/*Unescape all the <% HEXDIG HEXDIG> sequences in a string in-place. - This does no validity checking.*/ -static char *op_unescape_url_component(char *_s){ - int i; - int j; - for(i=j=0;_s[i];i++,j++){ - if(_s[i]=='%'){ - _s[i]=(char)(op_hex_value(_s[i+1])<<4|op_hex_value(_s[i+2])); - i+=2; - } - } - return _s; -} - -/*Parse a file: URL. - This code is not meant to be fast: strspn() with large sets is likely to be - slow, but it is very convenient. - It is meant to be RFC 1738-compliant (as updated by RFC 3986).*/ -static const char *op_parse_file_url(const char *_src){ - const char *scheme_end; - const char *path; - const char *path_end; - scheme_end=_src+strspn(_src,OP_URL_SCHEME); - if(OP_UNLIKELY(*scheme_end!=':') - ||scheme_end-_src!=4||op_strncasecmp(_src,"file",4)!=0){ - /*Unsupported protocol.*/ - return NULL; - } - /*Make sure all escape sequences are valid to simplify unescaping later.*/ - if(OP_UNLIKELY(op_validate_url_escapes(scheme_end+1)<0))return NULL; - if(scheme_end[1]=='/'&&scheme_end[2]=='/'){ - const char *host; - /*file: URLs can have a host! - Yeah, I was surprised, too, but that's what RFC 1738 says. - It also says, "The file URL scheme is unusual in that it does not specify - an Internet protocol or access method for such files; as such, its - utility in network protocols between hosts is limited," which is a mild - understatement.*/ - host=scheme_end+3; - /*The empty host is what we expect.*/ - if(OP_LIKELY(*host=='/'))path=host; - else{ - const char *host_end; - char host_buf[28]; - /*RFC 1738 says localhost "is interpreted as `the machine from which the - URL is being interpreted,'" so let's check for it.*/ - host_end=host+strspn(host,OP_URL_PCHAR_BASE); - /*No allowed. - This also rejects IP-Literals.*/ - if(*host_end!='/')return NULL; - /*An escaped "localhost" can take at most 27 characters.*/ - if(OP_UNLIKELY(host_end-host>27))return NULL; - memcpy(host_buf,host,sizeof(*host_buf)*(host_end-host)); - host_buf[host_end-host]='\0'; - op_unescape_url_component(host_buf); - op_string_tolower(host_buf); - /*Some other host: give up.*/ - if(OP_UNLIKELY(strcmp(host_buf,"localhost")!=0))return NULL; - path=host_end; - } - } - else path=scheme_end+1; - path_end=path+strspn(path,OP_URL_PATH); - /*This will reject a or component, too. - I don't know what to do with queries, but a temporal fragment would at - least make sense. - RFC 1738 pretty clearly defines a that's equivalent to the - RFC 3986 component for other schemes, but not the file: scheme, - so I'm going to just reject it.*/ - if(*path_end!='\0')return NULL; - return path; -} - -#if defined(OP_ENABLE_HTTP) -# if defined(_WIN32) -# include -# include -# include -# include "winerrno.h" - -typedef SOCKET op_sock; - -# define OP_INVALID_SOCKET (INVALID_SOCKET) - -/*Vista and later support WSAPoll(), but we don't want to rely on that. - Instead we re-implement it badly using select(). - Unfortunately, they define a conflicting struct pollfd, so we only define our - own if it looks like that one has not already been defined.*/ -# if !defined(POLLIN) -/*Equivalent to POLLIN.*/ -# define POLLRDNORM (0x0100) -/*Priority band data can be read.*/ -# define POLLRDBAND (0x0200) -/*There is data to read.*/ -# define POLLIN (POLLRDNORM|POLLRDBAND) -/* There is urgent data to read.*/ -# define POLLPRI (0x0400) -/*Equivalent to POLLOUT.*/ -# define POLLWRNORM (0x0010) -/*Writing now will not block.*/ -# define POLLOUT (POLLWRNORM) -/*Priority data may be written.*/ -# define POLLWRBAND (0x0020) -/*Error condition (output only).*/ -# define POLLERR (0x0001) -/*Hang up (output only).*/ -# define POLLHUP (0x0002) -/*Invalid request: fd not open (output only).*/ -# define POLLNVAL (0x0004) - -struct pollfd{ - /*File descriptor.*/ - op_sock fd; - /*Requested events.*/ - short events; - /*Returned events.*/ - short revents; -}; -# endif - -/*But Winsock never defines nfds_t (it's simply hard-coded to ULONG).*/ -typedef unsigned long nfds_t; - -/*The usage of FD_SET() below is O(N^2). - This is okay because select() is limited to 64 sockets in Winsock, anyway. - In practice, we only ever call it with one or two sockets.*/ -static int op_poll_win32(struct pollfd *_fds,nfds_t _nfds,int _timeout){ - struct timeval tv; - fd_set ifds; - fd_set ofds; - fd_set efds; - nfds_t i; - int ret; - FD_ZERO(&ifds); - FD_ZERO(&ofds); - FD_ZERO(&efds); - for(i=0;i<_nfds;i++){ - _fds[i].revents=0; - if(_fds[i].events&POLLIN)FD_SET(_fds[i].fd,&ifds); - if(_fds[i].events&POLLOUT)FD_SET(_fds[i].fd,&ofds); - FD_SET(_fds[i].fd,&efds); - } - if(_timeout>=0){ - tv.tv_sec=_timeout/1000; - tv.tv_usec=(_timeout%1000)*1000; - } - ret=select(-1,&ifds,&ofds,&efds,_timeout<0?NULL:&tv); - if(ret>0){ - for(i=0;i<_nfds;i++){ - if(FD_ISSET(_fds[i].fd,&ifds))_fds[i].revents|=POLLIN; - if(FD_ISSET(_fds[i].fd,&ofds))_fds[i].revents|=POLLOUT; - /*This isn't correct: there are several different things that might have - happened to a fd in efds, but I don't know a good way to distinguish - them without more context from the caller. - It's okay, because we don't actually check any of these bits, we just - need _some_ bit set.*/ - if(FD_ISSET(_fds[i].fd,&efds))_fds[i].revents|=POLLHUP; - } - } - return ret; -} - -/*We define op_errno() to make it clear that it's not an l-value like normal - errno is.*/ -# define op_errno() (WSAGetLastError()?WSAGetLastError()-WSABASEERR:0) -# define op_reset_errno() (WSASetLastError(0)) - -/*The remaining functions don't get an op_ prefix even though they only - operate on sockets, because we don't use non-socket I/O here, and this - minimizes the changes needed to deal with Winsock.*/ -# define close(_fd) closesocket(_fd) -/*This relies on sizeof(u_long)==sizeof(int), which is always true on both - Win32 and Win64.*/ -# define ioctl(_fd,_req,_arg) ioctlsocket(_fd,_req,(u_long *)(_arg)) -# define getsockopt(_fd,_level,_name,_val,_len) \ - getsockopt(_fd,_level,_name,(char *)(_val),_len) -# define setsockopt(_fd,_level,_name,_val,_len) \ - setsockopt(_fd,_level,_name,(const char *)(_val),_len) -# define poll(_fds,_nfds,_timeout) op_poll_win32(_fds,_nfds,_timeout) - -# if defined(_MSC_VER) -typedef ptrdiff_t ssize_t; -# endif - -/*Load certificates from the built-in certificate store.*/ -int SSL_CTX_set_default_verify_paths_win32(SSL_CTX *_ssl_ctx); -# define SSL_CTX_set_default_verify_paths \ - SSL_CTX_set_default_verify_paths_win32 - -# else -/*Normal Berkeley sockets.*/ -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include - -typedef int op_sock; - -# define OP_INVALID_SOCKET (-1) - -# define op_errno() (errno) -# define op_reset_errno() (errno=0) - -# endif -# include -# include - -/*The maximum number of simultaneous connections. - RFC 2616 says this SHOULD NOT be more than 2, but everyone on the modern web - ignores that (e.g., IE 8 bumped theirs up from 2 to 6, Firefox uses 15). - If it makes you feel better, we'll only ever actively read from one of these - at a time. - The others are kept around mainly to avoid slow-starting a new connection - when seeking, and time out rapidly.*/ -# define OP_NCONNS_MAX (4) - -/*The amount of time before we attempt to re-resolve the host. - This is 10 minutes, as recommended in RFC 6555 for expiring cached connection - results for dual-stack hosts.*/ -# define OP_RESOLVE_CACHE_TIMEOUT_MS (10*60*(opus_int32)1000) - -/*The number of redirections at which we give up. - The value here is the current default in Firefox. - RFC 2068 mandated a maximum of 5, but RFC 2616 relaxed that to "a client - SHOULD detect infinite redirection loops." - Fortunately, 20 is less than infinity.*/ -# define OP_REDIRECT_LIMIT (20) - -/*The initial size of the buffer used to read a response message (before the - body).*/ -# define OP_RESPONSE_SIZE_MIN (510) -/*The maximum size of a response message (before the body). - Responses larger than this will be discarded. - I've seen a real server return 20 kB of data for a 302 Found response. - Increasing this beyond 32kB will cause problems on platforms with a 16-bit - int.*/ -# define OP_RESPONSE_SIZE_MAX (32766) - -/*The number of milliseconds we will allow a connection to sit idle before we - refuse to resurrect it. - Apache as of 2.2 has reduced its default timeout to 5 seconds (from 15), so - that's what we'll use here.*/ -# define OP_CONNECTION_IDLE_TIMEOUT_MS (5*1000) - -/*The number of milliseconds we will wait to send or receive data before giving - up.*/ -# define OP_POLL_TIMEOUT_MS (30*1000) - -/*We will always attempt to read ahead at least this much in preference to - opening a new connection.*/ -# define OP_READAHEAD_THRESH_MIN (32*(opus_int32)1024) - -/*The amount of data to request after a seek. - This is a trade-off between read throughput after a seek vs. the the ability - to quickly perform another seek with the same connection.*/ -# define OP_PIPELINE_CHUNK_SIZE (32*(opus_int32)1024) -/*Subsequent chunks are requested with larger and larger sizes until they pass - this threshold, after which we just ask for the rest of the resource.*/ -# define OP_PIPELINE_CHUNK_SIZE_MAX (1024*(opus_int32)1024) -/*This is the maximum number of requests we'll make with a single connection. - Many servers will simply disconnect after we attempt some number of requests, - possibly without sending a Connection: close header, meaning we won't - discover it until we try to read beyond the end of the current chunk. - We can reconnect when that happens, but this is slow. - Instead, we impose a limit ourselves (set to the default for Apache - installations and thus likely the most common value in use).*/ -# define OP_PIPELINE_MAX_REQUESTS (100) -/*This should be the number of requests, starting from a chunk size of - OP_PIPELINE_CHUNK_SIZE and doubling each time, until we exceed - OP_PIPELINE_CHUNK_SIZE_MAX and just request the rest of the file. - We won't reuse a connection when seeking unless it has at least this many - requests left, to reduce the chances we'll have to open a new connection - while reading forward afterwards.*/ -# define OP_PIPELINE_MIN_REQUESTS (7) - -/*Is this an https URL? - For now we can simply check the last letter of the scheme.*/ -# define OP_URL_IS_SSL(_url) ((_url)->scheme[4]=='s') - -/*Does this URL use the default port for its scheme?*/ -# define OP_URL_IS_DEFAULT_PORT(_url) \ - (!OP_URL_IS_SSL(_url)&&(_url)->port==80 \ - ||OP_URL_IS_SSL(_url)&&(_url)->port==443) - -struct OpusParsedURL{ - /*Either "http" or "https".*/ - char *scheme; - /*The user name from the component, or NULL.*/ - char *user; - /*The password from the component, or NULL.*/ - char *pass; - /*The component. - This may not be NULL.*/ - char *host; - /*The and components. - This may not be NULL.*/ - char *path; - /*The component. - This is set to the default port if the URL did not contain one.*/ - unsigned port; -}; - -/*Parse a URL. - This code is not meant to be fast: strspn() with large sets is likely to be - slow, but it is very convenient. - It is meant to be RFC 3986-compliant. - We currently do not support IRIs (Internationalized Resource Identifiers, - RFC 3987). - Callers should translate them to URIs first.*/ -static int op_parse_url_impl(OpusParsedURL *_dst,const char *_src){ - const char *scheme_end; - const char *authority; - const char *userinfo_end; - const char *user; - const char *user_end; - const char *pass; - const char *hostport; - const char *hostport_end; - const char *host_end; - const char *port; - opus_int32 port_num; - const char *port_end; - const char *path; - const char *path_end; - const char *uri_end; - scheme_end=_src+strspn(_src,OP_URL_SCHEME); - if(OP_UNLIKELY(*scheme_end!=':') - ||OP_UNLIKELY(scheme_end-_src<4)||OP_UNLIKELY(scheme_end-_src>5) - ||OP_UNLIKELY(op_strncasecmp(_src,"https",scheme_end-_src)!=0)){ - /*Unsupported protocol.*/ - return OP_EIMPL; - } - if(OP_UNLIKELY(scheme_end[1]!='/')||OP_UNLIKELY(scheme_end[2]!='/')){ - /*We require an component.*/ - return OP_EINVAL; - } - authority=scheme_end+3; - /*Make sure all escape sequences are valid to simplify unescaping later.*/ - if(OP_UNLIKELY(op_validate_url_escapes(authority)<0))return OP_EINVAL; - /*Look for a component.*/ - userinfo_end=authority+strspn(authority,OP_URL_PCHAR_NA); - if(*userinfo_end=='@'){ - /*Found one.*/ - user=authority; - /*Look for a password (yes, clear-text passwords are deprecated, I know, - but what else are people supposed to use? use SSL if you care).*/ - user_end=authority+strspn(authority,OP_URL_PCHAR_BASE); - if(*user_end==':')pass=user_end+1; - else pass=NULL; - hostport=userinfo_end+1; - } - else{ - /*We shouldn't have to initialize user_end, but gcc is too dumb to figure - out that user!=NULL below means we didn't take this else branch.*/ - user=user_end=NULL; - pass=NULL; - hostport=authority; - } - /*Try to figure out where the component ends.*/ - if(hostport[0]=='['){ - hostport++; - /*We have an , which can contain colons.*/ - hostport_end=host_end=hostport+strspn(hostport,OP_URL_PCHAR_NA); - if(OP_UNLIKELY(*hostport_end++!=']'))return OP_EINVAL; - } - /*Currently we don't support IDNA (RFC 5894), because I don't want to deal - with the policy about which domains should not be internationalized to - avoid confusing similarities. - Give this API Punycode (RFC 3492) domain names instead.*/ - else hostport_end=host_end=hostport+strspn(hostport,OP_URL_PCHAR_BASE); - /*TODO: Validate host.*/ - /*Is there a port number?*/ - port_num=-1; - if(*hostport_end==':'){ - int i; - port=hostport_end+1; - port_end=port+strspn(port,OP_URL_DIGIT); - path=port_end; - /*Not part of RFC 3986, but require port numbers in the range 0...65535.*/ - if(OP_LIKELY(port_end-port>0)){ - while(*port=='0')port++; - if(OP_UNLIKELY(port_end-port>5))return OP_EINVAL; - port_num=0; - for(i=0;i65535))return OP_EINVAL; - } - } - else path=hostport_end; - path_end=path+strspn(path,OP_URL_PATH); - /*If the path is not empty, it must begin with a '/'.*/ - if(OP_LIKELY(path_end>path)&&OP_UNLIKELY(path[0]!='/'))return OP_EINVAL; - /*Consume the component, if any (right now we don't split this out - from the component).*/ - if(*path_end=='?')path_end=path_end+strspn(path_end,OP_URL_QUERY_FRAG); - /*Discard the component, if any. - This doesn't get sent to the server. - Some day we should add support for Media Fragment URIs - .*/ - if(*path_end=='#')uri_end=path_end+1+strspn(path_end+1,OP_URL_QUERY_FRAG); - else uri_end=path_end; - /*If there's anything left, this was not a valid URL.*/ - if(OP_UNLIKELY(*uri_end!='\0'))return OP_EINVAL; - _dst->scheme=op_string_range_dup(_src,scheme_end); - if(OP_UNLIKELY(_dst->scheme==NULL))return OP_EFAULT; - op_string_tolower(_dst->scheme); - if(user!=NULL){ - _dst->user=op_string_range_dup(user,user_end); - if(OP_UNLIKELY(_dst->user==NULL))return OP_EFAULT; - op_unescape_url_component(_dst->user); - /*Unescaping might have created a ':' in the username. - That's not allowed by RFC 2617's Basic Authentication Scheme.*/ - if(OP_UNLIKELY(strchr(_dst->user,':')!=NULL))return OP_EINVAL; - } - else _dst->user=NULL; - if(pass!=NULL){ - _dst->pass=op_string_range_dup(pass,userinfo_end); - if(OP_UNLIKELY(_dst->pass==NULL))return OP_EFAULT; - op_unescape_url_component(_dst->pass); - } - else _dst->pass=NULL; - _dst->host=op_string_range_dup(hostport,host_end); - if(OP_UNLIKELY(_dst->host==NULL))return OP_EFAULT; - if(port_num<0){ - if(_src[4]=='s')port_num=443; - else port_num=80; - } - _dst->port=(unsigned)port_num; - /*RFC 2616 says an empty component is equivalent to "/", and we - MUST use the latter in the Request-URI. - Reserve space for the slash here.*/ - if(path==path_end||path[0]=='?')path--; - _dst->path=op_string_range_dup(path,path_end); - if(OP_UNLIKELY(_dst->path==NULL))return OP_EFAULT; - /*And force-set it here.*/ - _dst->path[0]='/'; - return 0; -} - -static void op_parsed_url_init(OpusParsedURL *_url){ - memset(_url,0,sizeof(*_url)); -} - -static void op_parsed_url_clear(OpusParsedURL *_url){ - _ogg_free(_url->scheme); - _ogg_free(_url->user); - _ogg_free(_url->pass); - _ogg_free(_url->host); - _ogg_free(_url->path); -} - -static int op_parse_url(OpusParsedURL *_dst,const char *_src){ - OpusParsedURL url; - int ret; - op_parsed_url_init(&url); - ret=op_parse_url_impl(&url,_src); - if(OP_UNLIKELY(ret<0))op_parsed_url_clear(&url); - else *_dst=*&url; - return ret; -} - -/*A buffer to hold growing strings. - The main purpose of this is to consolidate allocation checks and simplify - cleanup on a failed allocation.*/ -struct OpusStringBuf{ - char *buf; - int nbuf; - int cbuf; -}; - -static void op_sb_init(OpusStringBuf *_sb){ - _sb->buf=NULL; - _sb->nbuf=0; - _sb->cbuf=0; -} - -static void op_sb_clear(OpusStringBuf *_sb){ - _ogg_free(_sb->buf); -} - -/*Make sure we have room for at least _capacity characters (plus 1 more for the - terminating NUL).*/ -static int op_sb_ensure_capacity(OpusStringBuf *_sb,int _capacity){ - char *buf; - int cbuf; - buf=_sb->buf; - cbuf=_sb->cbuf; - if(_capacity>=cbuf-1){ - if(OP_UNLIKELY(cbuf>INT_MAX-1>>1))return OP_EFAULT; - if(OP_UNLIKELY(_capacity>=INT_MAX-1))return OP_EFAULT; - cbuf=OP_MAX(2*cbuf+1,_capacity+1); - buf=_ogg_realloc(buf,sizeof(*buf)*cbuf); - if(OP_UNLIKELY(buf==NULL))return OP_EFAULT; - _sb->buf=buf; - _sb->cbuf=cbuf; - } - return 0; -} - -/*Increase the capacity of the buffer, but not to more than _max_size - characters (plus 1 more for the terminating NUL).*/ -static int op_sb_grow(OpusStringBuf *_sb,int _max_size){ - char *buf; - int cbuf; - buf=_sb->buf; - cbuf=_sb->cbuf; - OP_ASSERT(_max_size<=INT_MAX-1); - cbuf=cbuf<=_max_size-1>>1?2*cbuf+1:_max_size+1; - buf=_ogg_realloc(buf,sizeof(*buf)*cbuf); - if(OP_UNLIKELY(buf==NULL))return OP_EFAULT; - _sb->buf=buf; - _sb->cbuf=cbuf; - return 0; -} - -static int op_sb_append(OpusStringBuf *_sb,const char *_s,int _len){ - char *buf; - int nbuf; - int ret; - nbuf=_sb->nbuf; - if(OP_UNLIKELY(nbuf>INT_MAX-_len))return OP_EFAULT; - ret=op_sb_ensure_capacity(_sb,nbuf+_len); - if(OP_UNLIKELY(ret<0))return ret; - buf=_sb->buf; - memcpy(buf+nbuf,_s,sizeof(*buf)*_len); - nbuf+=_len; - buf[nbuf]='\0'; - _sb->nbuf=nbuf; - return 0; -} - -static int op_sb_append_string(OpusStringBuf *_sb,const char *_s){ - return op_sb_append(_sb,_s,strlen(_s)); -} - -static int op_sb_append_port(OpusStringBuf *_sb,unsigned _port){ - char port_buf[7]; - OP_ASSERT(_port<=65535U); - sprintf(port_buf,":%u",_port); - return op_sb_append_string(_sb,port_buf); -} - -static int op_sb_append_nonnegative_int64(OpusStringBuf *_sb,opus_int64 _i){ - char digit; - int nbuf_start; - int ret; - OP_ASSERT(_i>=0); - nbuf_start=_sb->nbuf; - ret=0; - do{ - digit='0'+_i%10; - ret|=op_sb_append(_sb,&digit,1); - _i/=10; - } - while(_i>0); - if(OP_LIKELY(ret>=0)){ - char *buf; - int nbuf_end; - buf=_sb->buf; - nbuf_end=_sb->nbuf-1; - /*We've added the digits backwards. - Reverse them.*/ - while(nbuf_startnext_pos=-1; - _conn->ssl_conn=NULL; - _conn->next=NULL; - _conn->fd=OP_INVALID_SOCKET; -} - -static void op_http_conn_clear(OpusHTTPConn *_conn){ - if(_conn->ssl_conn!=NULL)SSL_free(_conn->ssl_conn); - /*SSL frees the BIO for us.*/ - if(_conn->fd!=OP_INVALID_SOCKET)close(_conn->fd); -} - -/*The global stream state.*/ -struct OpusHTTPStream{ - /*The list of connections.*/ - OpusHTTPConn conns[OP_NCONNS_MAX]; - /*The context object used as a framework for TLS/SSL functions.*/ - SSL_CTX *ssl_ctx; - /*The cached session to reuse for future connections.*/ - SSL_SESSION *ssl_session; - /*The LRU list (ordered from MRU to LRU) of currently connected - connections.*/ - OpusHTTPConn *lru_head; - /*The free list.*/ - OpusHTTPConn *free_head; - /*The URL to connect to.*/ - OpusParsedURL url; - /*Information about the address we connected to.*/ - struct addrinfo addr_info; - /*The address we connected to.*/ - union{ - struct sockaddr s; - struct sockaddr_in v4; - struct sockaddr_in6 v6; - } addr; - /*The last time we re-resolved the host.*/ - struct timeb resolve_time; - /*A buffer used to build HTTP requests.*/ - OpusStringBuf request; - /*A buffer used to build proxy CONNECT requests.*/ - OpusStringBuf proxy_connect; - /*A buffer used to receive the response headers.*/ - OpusStringBuf response; - /*The Content-Length, if specified, or -1 otherwise. - This will always be specified for seekable streams.*/ - opus_int64 content_length; - /*The position indicator used when no connection is active.*/ - opus_int64 pos; - /*The host we actually connected to.*/ - char *connect_host; - /*The port we actually connected to.*/ - unsigned connect_port; - /*The connection we're currently reading from. - This can be -1 if no connection is active.*/ - int cur_conni; - /*Whether or not the server supports range requests.*/ - int seekable; - /*Whether or not the server supports HTTP/1.1 with persistent connections.*/ - int pipeline; - /*Whether or not we should skip certificate checks.*/ - int skip_certificate_check; - /*The offset of the tail of the request. - Only the offset in the Range: header appears after this, allowing us to - quickly edit the request to ask for a new range.*/ - int request_tail; - /*The estimated time required to open a new connection, in milliseconds.*/ - opus_int32 connect_rate; -}; - -static void op_http_stream_init(OpusHTTPStream *_stream){ - OpusHTTPConn **pnext; - int ci; - pnext=&_stream->free_head; - for(ci=0;ciconns+ci); - *pnext=_stream->conns+ci; - pnext=&_stream->conns[ci].next; - } - _stream->ssl_ctx=NULL; - _stream->ssl_session=NULL; - _stream->lru_head=NULL; - op_parsed_url_init(&_stream->url); - op_sb_init(&_stream->request); - op_sb_init(&_stream->proxy_connect); - op_sb_init(&_stream->response); - _stream->connect_host=NULL; - _stream->seekable=0; -} - -/*Close the connection and move it to the free list. - _stream: The stream containing the free list. - _conn: The connection to close. - _penxt: The linked-list pointer currently pointing to this connection. - _gracefully: Whether or not to shut down cleanly.*/ -static void op_http_conn_close(OpusHTTPStream *_stream,OpusHTTPConn *_conn, - OpusHTTPConn **_pnext,int _gracefully){ - /*If we don't shut down gracefully, the server MUST NOT re-use our session - according to RFC 2246, because it can't tell the difference between an - abrupt close and a truncation attack. - So we shut down gracefully if we can. - However, we will not wait if this would block (it's not worth the savings - from session resumption to do so). - Clients (that's us) MAY resume a TLS session that ended with an incomplete - close, according to RFC 2818, so there's no reason to make sure the server - shut things down gracefully.*/ - if(_gracefully&&_conn->ssl_conn!=NULL)SSL_shutdown(_conn->ssl_conn); - op_http_conn_clear(_conn); - _conn->next_pos=-1; - _conn->ssl_conn=NULL; - _conn->fd=OP_INVALID_SOCKET; - OP_ASSERT(*_pnext==_conn); - *_pnext=_conn->next; - _conn->next=_stream->free_head; - _stream->free_head=_conn; -} - -static void op_http_stream_clear(OpusHTTPStream *_stream){ - while(_stream->lru_head!=NULL){ - op_http_conn_close(_stream,_stream->lru_head,&_stream->lru_head,0); - } - if(_stream->ssl_session!=NULL)SSL_SESSION_free(_stream->ssl_session); - if(_stream->ssl_ctx!=NULL)SSL_CTX_free(_stream->ssl_ctx); - op_sb_clear(&_stream->response); - op_sb_clear(&_stream->proxy_connect); - op_sb_clear(&_stream->request); - if(_stream->connect_host!=_stream->url.host)_ogg_free(_stream->connect_host); - op_parsed_url_clear(&_stream->url); -} - -static int op_http_conn_write_fully(OpusHTTPConn *_conn, - const char *_buf,int _buf_size){ - struct pollfd fd; - SSL *ssl_conn; - fd.fd=_conn->fd; - ssl_conn=_conn->ssl_conn; - while(_buf_size>0){ - int err; - if(ssl_conn!=NULL){ - int ret; - ret=SSL_write(ssl_conn,_buf,_buf_size); - if(ret>0){ - /*Wrote some data.*/ - _buf+=ret; - _buf_size-=ret; - continue; - } - /*Connection closed.*/ - else if(ret==0)return OP_FALSE; - err=SSL_get_error(ssl_conn,ret); - /*Yes, renegotiations can cause SSL_write() to block for reading.*/ - if(err==SSL_ERROR_WANT_READ)fd.events=POLLIN; - else if(err==SSL_ERROR_WANT_WRITE)fd.events=POLLOUT; - else return OP_FALSE; - } - else{ - ssize_t ret; - op_reset_errno(); - ret=send(fd.fd,_buf,_buf_size,0); - if(ret>0){ - _buf+=ret; - _buf_size-=ret; - continue; - } - err=op_errno(); - if(err!=EAGAIN&&err!=EWOULDBLOCK)return OP_FALSE; - fd.events=POLLOUT; - } - if(poll(&fd,1,OP_POLL_TIMEOUT_MS)<=0)return OP_FALSE; - } - return 0; -} - -static int op_http_conn_estimate_available(OpusHTTPConn *_conn){ - int available; - int ret; - ret=ioctl(_conn->fd,FIONREAD,&available); - if(ret<0)available=0; - /*This requires the SSL read_ahead flag to be unset to work. - We ignore partial records as well as the protocol overhead for any pending - bytes. - This means we might return somewhat less than can truly be read without - blocking (if there's a partial record). - This is okay, because we're using this value to estimate network transfer - time, and we _have_ already received those bytes. - We also might return slightly more (due to protocol overhead), but that's - small enough that it probably doesn't matter.*/ - if(_conn->ssl_conn!=NULL)available+=SSL_pending(_conn->ssl_conn); - return available; -} - -static opus_int32 op_time_diff_ms(const struct timeb *_end, - const struct timeb *_start){ - opus_int64 dtime; - dtime=_end->time-(opus_int64)_start->time; - OP_ASSERT(_end->millitm<1000); - OP_ASSERT(_start->millitm<1000); - if(OP_UNLIKELY(dtime>(OP_INT32_MAX-1000)/1000))return OP_INT32_MAX; - if(OP_UNLIKELY(dtime<(OP_INT32_MIN+1000)/1000))return OP_INT32_MIN; - return (opus_int32)dtime*1000+_end->millitm-_start->millitm; -} - -/*Update the read rate estimate for this connection.*/ -static void op_http_conn_read_rate_update(OpusHTTPConn *_conn){ - struct timeb read_time; - opus_int32 read_delta_ms; - opus_int64 read_delta_bytes; - opus_int64 read_rate; - read_delta_bytes=_conn->read_bytes; - if(read_delta_bytes<=0)return; - ftime(&read_time); - read_delta_ms=op_time_diff_ms(&read_time,&_conn->read_time); - read_rate=_conn->read_rate; - read_delta_ms=OP_MAX(read_delta_ms,1); - read_rate+=read_delta_bytes*1000/read_delta_ms-read_rate+4>>3; - *&_conn->read_time=*&read_time; - _conn->read_bytes=0; - _conn->read_rate=read_rate; -} - -/*Tries to read from the given connection. - [out] _buf: Returns the data read. - _buf_size: The size of the buffer. - _blocking: Whether or not to block until some data is retrieved. - Return: A positive number of bytes read on success. - 0: The read would block, or the connection was closed. - OP_EREAD: There was a fatal read error.*/ -static int op_http_conn_read(OpusHTTPConn *_conn, - char *_buf,int _buf_size,int _blocking){ - struct pollfd fd; - SSL *ssl_conn; - int nread; - int nread_unblocked; - fd.fd=_conn->fd; - ssl_conn=_conn->ssl_conn; - nread=nread_unblocked=0; - /*RFC 2818 says "client implementations MUST treat any premature closes as - errors and the data received as potentially truncated," so we make very - sure to report read errors upwards.*/ - do{ - int err; - if(ssl_conn!=NULL){ - int ret; - ret=SSL_read(ssl_conn,_buf+nread,_buf_size-nread); - OP_ASSERT(ret<=_buf_size-nread); - if(ret>0){ - /*Read some data. - Keep going to see if there's more.*/ - nread+=ret; - nread_unblocked+=ret; - continue; - } - /*If we already read some data, return it right now.*/ - if(nread>0)break; - err=SSL_get_error(ssl_conn,ret); - if(ret==0){ - /*Connection close. - Check for a clean shutdown to prevent truncation attacks. - This check always succeeds for SSLv2, as it has no "close notify" - message and thus can't verify an orderly shutdown.*/ - return err==SSL_ERROR_ZERO_RETURN?0:OP_EREAD; - } - if(err==SSL_ERROR_WANT_READ)fd.events=POLLIN; - /*Yes, renegotiations can cause SSL_read() to block for writing.*/ - else if(err==SSL_ERROR_WANT_WRITE)fd.events=POLLOUT; - /*Some other error.*/ - else return OP_EREAD; - } - else{ - ssize_t ret; - op_reset_errno(); - ret=recv(fd.fd,_buf+nread,_buf_size-nread,0); - OP_ASSERT(ret<=_buf_size-nread); - if(ret>0){ - /*Read some data. - Keep going to see if there's more.*/ - nread+=ret; - nread_unblocked+=ret; - continue; - } - /*If we already read some data or the connection was closed, return - right now.*/ - if(ret==0||nread>0)break; - err=op_errno(); - if(err!=EAGAIN&&err!=EWOULDBLOCK)return OP_EREAD; - fd.events=POLLIN; - } - _conn->read_bytes+=nread_unblocked; - op_http_conn_read_rate_update(_conn); - nread_unblocked=0; - if(!_blocking)break; - /*Need to wait to get any data at all.*/ - if(poll(&fd,1,OP_POLL_TIMEOUT_MS)<=0)return OP_EREAD; - } - while(nread<_buf_size); - _conn->read_bytes+=nread_unblocked; - return nread; -} - -/*Tries to look at the pending data for a connection without consuming it. - [out] _buf: Returns the data at which we're peeking. - _buf_size: The size of the buffer.*/ -static int op_http_conn_peek(OpusHTTPConn *_conn,char *_buf,int _buf_size){ - struct pollfd fd; - SSL *ssl_conn; - int ret; - fd.fd=_conn->fd; - ssl_conn=_conn->ssl_conn; - for(;;){ - int err; - if(ssl_conn!=NULL){ - ret=SSL_peek(ssl_conn,_buf,_buf_size); - /*Either saw some data or the connection was closed.*/ - if(ret>=0)return ret; - err=SSL_get_error(ssl_conn,ret); - if(err==SSL_ERROR_WANT_READ)fd.events=POLLIN; - /*Yes, renegotiations can cause SSL_peek() to block for writing.*/ - else if(err==SSL_ERROR_WANT_WRITE)fd.events=POLLOUT; - else return 0; - } - else{ - op_reset_errno(); - ret=(int)recv(fd.fd,_buf,_buf_size,MSG_PEEK); - /*Either saw some data or the connection was closed.*/ - if(ret>=0)return ret; - err=op_errno(); - if(err!=EAGAIN&&err!=EWOULDBLOCK)return 0; - fd.events=POLLIN; - } - /*Need to wait to get any data at all.*/ - if(poll(&fd,1,OP_POLL_TIMEOUT_MS)<=0)return 0; - } -} - -/*When parsing response headers, RFC 2616 mandates that all lines end in CR LF. - However, even in the year 2012, I have seen broken servers use just a LF. - This is the evil that Postel's advice from RFC 761 breeds.*/ - -/*Reads the entirety of a response to an HTTP request into the response buffer. - Actual parsing and validation is done later. - Return: The number of bytes in the response on success, OP_EREAD if the - connection was closed before reading any data, or another negative - value on any other error.*/ -static int op_http_conn_read_response(OpusHTTPConn *_conn, - OpusStringBuf *_response){ - int ret; - _response->nbuf=0; - ret=op_sb_ensure_capacity(_response,OP_RESPONSE_SIZE_MIN); - if(OP_UNLIKELY(ret<0))return ret; - for(;;){ - char *buf; - int size; - int capacity; - int read_limit; - int terminated; - size=_response->nbuf; - capacity=_response->cbuf-1; - if(OP_UNLIKELY(size>=capacity)){ - ret=op_sb_grow(_response,OP_RESPONSE_SIZE_MAX); - if(OP_UNLIKELY(ret<0))return ret; - capacity=_response->cbuf-1; - /*The response was too large. - This prevents a bad server from running us out of memory.*/ - if(OP_UNLIKELY(size>=capacity))return OP_EIMPL; - } - buf=_response->buf; - ret=op_http_conn_peek(_conn,buf+size,capacity-size); - if(OP_UNLIKELY(ret<=0))return size<=0?OP_EREAD:OP_FALSE; - /*We read some data.*/ - /*Make sure the starting characters are "HTTP". - Otherwise we could wind up waiting forever for a response from - something that is not an HTTP server.*/ - if(size<4&&op_strncasecmp(buf,"HTTP",OP_MIN(size+ret,4))!=0){ - return OP_FALSE; - } - /*How far can we read without passing the "\r\n\r\n" terminator?*/ - buf[size+ret]='\0'; - terminated=0; - for(read_limit=OP_MAX(size-3,0);read_limitnbuf=size; - /*We found the terminator and read all the data up to and including it.*/ - if(terminated&&OP_LIKELY(size>=read_limit))return size; - } - return OP_EIMPL; -} - -# define OP_HTTP_DIGIT "0123456789" - -/*The Reason-Phrase is not allowed to contain control characters, except - horizontal tab (HT: \011).*/ -# define OP_HTTP_CREASON_PHRASE \ - "\001\002\003\004\005\006\007\010\012\013\014\015\016\017\020\021" \ - "\022\023\024\025\026\027\030\031\032\033\034\035\036\037\177" - -# define OP_HTTP_CTLS \ - "\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020" \ - "\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\177" - -/*This also includes '\t', but we get that from OP_HTTP_CTLS.*/ -# define OP_HTTP_SEPARATORS " \"(),/:;<=>?@[\\]{}" - -/*TEXT can also include LWS, but that has structure, so we parse it - separately.*/ -# define OP_HTTP_CTOKEN OP_HTTP_CTLS OP_HTTP_SEPARATORS - -/*Return: The amount of linear white space (LWS) at the start of _s.*/ -static int op_http_lwsspn(const char *_s){ - int i; - for(i=0;;){ - if(_s[0]=='\r'&&_s[1]=='\n'&&(_s[2]=='\t'||_s[2]==' '))i+=3; - /*This case is for broken servers.*/ - else if(_s[0]=='\n'&&(_s[1]=='\t'||_s[1]==' '))i+=2; - else if(_s[i]=='\t'||_s[i]==' ')i++; - else return i; - } -} - -static char *op_http_parse_status_line(int *_v1_1_compat, - char **_status_code,char *_response){ - char *next; - char *status_code; - int v1_1_compat; - size_t d; - /*RFC 2616 Section 6.1 does not say that the tokens in the Status-Line cannot - be separated by optional LWS, but since it specifically calls out where - spaces are to be placed and that CR and LF are not allowed except at the - end, I am assuming this to be true.*/ - /*We already validated that this starts with "HTTP"*/ - OP_ASSERT(op_strncasecmp(_response,"HTTP",4)==0); - next=_response+4; - if(OP_UNLIKELY(*next++!='/'))return NULL; - d=strspn(next,OP_HTTP_DIGIT); - /*"Leading zeros MUST be ignored by recipients."*/ - while(*next=='0'){ - next++; - OP_ASSERT(d>0); - d--; - } - /*We only support version 1.x*/ - if(OP_UNLIKELY(d!=1)||OP_UNLIKELY(*next++!='1'))return NULL; - if(OP_UNLIKELY(*next++!='.'))return NULL; - d=strspn(next,OP_HTTP_DIGIT); - if(OP_UNLIKELY(d<=0))return NULL; - /*"Leading zeros MUST be ignored by recipients."*/ - while(*next=='0'){ - next++; - OP_ASSERT(d>0); - d--; - } - /*We don't need to parse the version number. - Any non-zero digit means it's greater than 1.*/ - v1_1_compat=d>0; - next+=d; - if(OP_UNLIKELY(*next++!=' '))return NULL; - status_code=next; - d=strspn(next,OP_HTTP_DIGIT); - if(OP_UNLIKELY(d!=3))return NULL; - next+=d; - /*The Reason-Phrase can be empty, but the space must be here.*/ - if(OP_UNLIKELY(*next++!=' '))return NULL; - next+=strcspn(next,OP_HTTP_CREASON_PHRASE); - /*We are not mandating this be present thanks to broken servers.*/ - if(OP_LIKELY(*next=='\r'))next++; - if(OP_UNLIKELY(*next++!='\n'))return NULL; - if(_v1_1_compat!=NULL)*_v1_1_compat=v1_1_compat; - *_status_code=status_code; - return next; -} - -/*Get the next response header. - [out] _header: The header token, NUL-terminated, with leading and trailing - whitespace stripped, and converted to lower case (to simplify - case-insensitive comparisons), or NULL if there are no more - response headers. - [out] _cdr: The remaining contents of the header, excluding the initial - colon (':') and the terminating CRLF ("\r\n"), - NUL-terminated, and with leading and trailing whitespace - stripped, or NULL if there are no more response headers. - [inout] _s: On input, this points to the start of the current line of the - response headers. - On output, it points to the start of the first line following - this header, or NULL if there are no more response headers. - Return: 0 on success, or a negative value on failure.*/ -static int op_http_get_next_header(char **_header,char **_cdr,char **_s){ - char *header; - char *header_end; - char *cdr; - char *cdr_end; - char *next; - size_t d; - next=*_s; - /*The second case is for broken servers.*/ - if(next[0]=='\r'&&next[1]=='\n'||OP_UNLIKELY(next[0]=='\n')){ - /*No more headers.*/ - *_header=NULL; - *_cdr=NULL; - *_s=NULL; - return 0; - } - header=next+op_http_lwsspn(next); - d=strcspn(header,OP_HTTP_CTOKEN); - if(OP_UNLIKELY(d<=0))return OP_FALSE; - header_end=header+d; - next=header_end+op_http_lwsspn(header_end); - if(OP_UNLIKELY(*next++!=':'))return OP_FALSE; - next+=op_http_lwsspn(next); - cdr=next; - do{ - cdr_end=next+strcspn(next,OP_HTTP_CTLS); - next=cdr_end+op_http_lwsspn(cdr_end); - } - while(next>cdr_end); - /*We are not mandating this be present thanks to broken servers.*/ - if(OP_LIKELY(*next=='\r'))next++; - if(OP_UNLIKELY(*next++!='\n'))return OP_FALSE; - *header_end='\0'; - *cdr_end='\0'; - /*Field names are case-insensitive.*/ - op_string_tolower(header); - *_header=header; - *_cdr=cdr; - *_s=next; - return 0; -} - -static opus_int64 op_http_parse_nonnegative_int64(const char **_next, - const char *_cdr){ - const char *next; - opus_int64 ret; - int i; - next=_cdr+strspn(_cdr,OP_HTTP_DIGIT); - *_next=next; - if(OP_UNLIKELY(next<=_cdr))return OP_FALSE; - while(*_cdr=='0')_cdr++; - if(OP_UNLIKELY(next-_cdr>19))return OP_EIMPL; - ret=0; - for(i=0;i(OP_INT64_MAX-9)/10+(digit<=7)))return OP_EIMPL; - ret=ret*10+digit; - } - return ret; -} - -static opus_int64 op_http_parse_content_length(const char *_cdr){ - const char *next; - opus_int64 content_length; - content_length=op_http_parse_nonnegative_int64(&next,_cdr); - if(OP_UNLIKELY(*next!='\0'))return OP_FALSE; - return content_length; -} - -static int op_http_parse_content_range(opus_int64 *_first,opus_int64 *_last, - opus_int64 *_length,const char *_cdr){ - opus_int64 first; - opus_int64 last; - opus_int64 length; - size_t d; - if(OP_UNLIKELY(op_strncasecmp(_cdr,"bytes",5)!=0))return OP_FALSE; - _cdr+=5; - d=op_http_lwsspn(_cdr); - if(OP_UNLIKELY(d<=0))return OP_FALSE; - _cdr+=d; - if(*_cdr!='*'){ - first=op_http_parse_nonnegative_int64(&_cdr,_cdr); - if(OP_UNLIKELY(first<0))return (int)first; - _cdr+=op_http_lwsspn(_cdr); - if(*_cdr++!='-')return OP_FALSE; - _cdr+=op_http_lwsspn(_cdr); - last=op_http_parse_nonnegative_int64(&_cdr,_cdr); - if(OP_UNLIKELY(last<0))return (int)last; - _cdr+=op_http_lwsspn(_cdr); - } - else{ - /*This is for a 416 response (Requested range not satisfiable).*/ - first=last=-1; - _cdr++; - } - if(OP_UNLIKELY(*_cdr++!='/'))return OP_FALSE; - if(*_cdr!='*'){ - length=op_http_parse_nonnegative_int64(&_cdr,_cdr); - if(OP_UNLIKELY(length<0))return (int)length; - } - else{ - /*The total length is unspecified.*/ - _cdr++; - length=-1; - } - if(OP_UNLIKELY(*_cdr!='\0'))return OP_FALSE; - if(OP_UNLIKELY(last=0&&OP_UNLIKELY(last>=length))return OP_FALSE; - *_first=first; - *_last=last; - *_length=length; - return 0; -} - -/*Parse the Connection response header and look for a "close" token. - Return: 1 if a "close" token is found, 0 if it's not found, and a negative - value on error.*/ -static int op_http_parse_connection(char *_cdr){ - size_t d; - int ret; - ret=0; - for(;;){ - d=strcspn(_cdr,OP_HTTP_CTOKEN); - if(OP_UNLIKELY(d<=0))return OP_FALSE; - if(op_strncasecmp(_cdr,"close",(int)d)==0)ret=1; - /*We're supposed to strip and ignore any headers mentioned in the - Connection header if this response is from an HTTP/1.0 server (to - work around forwarding of hop-by-hop headers by old proxies), but the - only hop-by-hop header we look at is Connection itself. - Everything else is a well-defined end-to-end header, and going back and - undoing the things we did based on already-examined headers would be - hard (since we only scan them once, in a destructive manner). - Therefore we just ignore all the other tokens.*/ - _cdr+=d; - d=op_http_lwsspn(_cdr); - if(d<=0)break; - _cdr+=d; - } - return OP_UNLIKELY(*_cdr!='\0')?OP_FALSE:ret; -} - -typedef int (*op_ssl_step_func)(SSL *_ssl_conn); - -/*Try to run an SSL function to completion (blocking if necessary).*/ -static int op_do_ssl_step(SSL *_ssl_conn,op_sock _fd,op_ssl_step_func _step){ - struct pollfd fd; - fd.fd=_fd; - for(;;){ - int ret; - int err; - ret=(*_step)(_ssl_conn); - if(ret>=0)return ret; - err=SSL_get_error(_ssl_conn,ret); - if(err==SSL_ERROR_WANT_READ)fd.events=POLLIN; - else if(err==SSL_ERROR_WANT_WRITE)fd.events=POLLOUT; - else return OP_FALSE; - if(poll(&fd,1,OP_POLL_TIMEOUT_MS)<=0)return OP_FALSE; - } -} - -/*Implement a BIO type that just indicates every operation should be retried. - We use this when initializing an SSL connection via a proxy to allow the - initial handshake to proceed all the way up to the first read attempt, and - then return. - This allows the TLS client hello message to be pipelined with the HTTP - CONNECT request.*/ - -static int op_bio_retry_write(BIO *_b,const char *_buf,int _num){ - (void)_buf; - (void)_num; - BIO_clear_retry_flags(_b); - BIO_set_retry_write(_b); - return -1; -} - -static int op_bio_retry_read(BIO *_b,char *_buf,int _num){ - (void)_buf; - (void)_num; - BIO_clear_retry_flags(_b); - BIO_set_retry_read(_b); - return -1; -} - -static int op_bio_retry_puts(BIO *_b,const char *_str){ - return op_bio_retry_write(_b,_str,0); -} - -static long op_bio_retry_ctrl(BIO *_b,int _cmd,long _num,void *_ptr){ - long ret; - (void)_b; - (void)_num; - (void)_ptr; - ret=0; - switch(_cmd){ - case BIO_CTRL_RESET: - case BIO_C_RESET_READ_REQUEST:{ - BIO_clear_retry_flags(_b); - /*Fall through.*/ - } - case BIO_CTRL_EOF: - case BIO_CTRL_SET: - case BIO_CTRL_SET_CLOSE: - case BIO_CTRL_FLUSH: - case BIO_CTRL_DUP:{ - ret=1; - }break; - } - return ret; -} - -static int op_bio_retry_new(BIO *_b){ - _b->init=1; - _b->num=0; - _b->ptr=NULL; - return 1; -} - -static int op_bio_retry_free(BIO *_b){ - return _b!=NULL; -} - -/*This is not const because OpenSSL doesn't allow it, even though it won't - write to it.*/ -static BIO_METHOD op_bio_retry_method={ - BIO_TYPE_NULL, - "retry", - op_bio_retry_write, - op_bio_retry_read, - op_bio_retry_puts, - NULL, - op_bio_retry_ctrl, - op_bio_retry_new, - op_bio_retry_free, - NULL -}; - -/*Establish a CONNECT tunnel and pipeline the start of the TLS handshake for - proxying https URL requests.*/ -static int op_http_conn_establish_tunnel(OpusHTTPStream *_stream, - OpusHTTPConn *_conn,op_sock _fd,SSL *_ssl_conn,BIO *_ssl_bio){ - BIO *retry_bio; - char *status_code; - char *next; - int ret; - _conn->ssl_conn=NULL; - _conn->fd=_fd; - OP_ASSERT(_stream->proxy_connect.nbuf>0); - ret=op_http_conn_write_fully(_conn, - _stream->proxy_connect.buf,_stream->proxy_connect.nbuf); - if(OP_UNLIKELY(ret<0))return ret; - retry_bio=BIO_new(&op_bio_retry_method); - if(OP_UNLIKELY(retry_bio==NULL))return OP_EFAULT; - SSL_set_bio(_ssl_conn,retry_bio,_ssl_bio); - SSL_set_connect_state(_ssl_conn); - /*This shouldn't succeed, since we can't read yet.*/ - OP_ALWAYS_TRUE(SSL_connect(_ssl_conn)<0); - SSL_set_bio(_ssl_conn,_ssl_bio,_ssl_bio); - /*Only now do we disable write coalescing, to allow the CONNECT - request and the start of the TLS handshake to be combined.*/ - op_sock_set_tcp_nodelay(_fd,1); - ret=op_http_conn_read_response(_conn,&_stream->response); - if(OP_UNLIKELY(ret<0))return ret; - next=op_http_parse_status_line(NULL,&status_code,_stream->response.buf); - /*According to RFC 2817, "Any successful (2xx) response to a - CONNECT request indicates that the proxy has established a - connection to the requested host and port.*/ - if(OP_UNLIKELY(next==NULL)||OP_UNLIKELY(status_code[0]!='2'))return OP_FALSE; - return 0; -} - -/*Match a host name against a host with a possible wildcard pattern according - to the rules of RFC 6125 Section 6.4.3. - Return: 0 if the pattern doesn't match, and a non-zero value if it does.*/ -static int op_http_hostname_match(const char *_host,size_t _host_len, - ASN1_STRING *_pattern){ - const char *pattern; - size_t host_label_len; - size_t host_suffix_len; - size_t pattern_len; - size_t pattern_label_len; - size_t pattern_prefix_len; - size_t pattern_suffix_len; - pattern=(const char *)ASN1_STRING_data(_pattern); - pattern_len=strlen(pattern); - /*Check the pattern for embedded NULs.*/ - if(OP_UNLIKELY(pattern_len!=(size_t)ASN1_STRING_length(_pattern)))return 0; - pattern_label_len=strcspn(pattern,"."); - OP_ASSERT(pattern_label_len<=pattern_len); - pattern_prefix_len=strcspn(pattern,"*"); - if(pattern_prefix_len>=pattern_label_len){ - /*"The client SHOULD NOT attempt to match a presented identifier in which - the wildcard character comprises a label other than the left-most label - (e.g., do not match bar.*.example.net)." [RFC 6125 Section 6.4.3]*/ - if(pattern_prefix_lenurl.host; - host_len=strlen(host); - peer_cert=SSL_get_peer_certificate(_ssl_conn); - /*We set VERIFY_PEER, so we shouldn't get here without a certificate.*/ - if(OP_UNLIKELY(peer_cert==NULL))return 0; - ret=0; - OP_ASSERT(host_lenai_family){ - case AF_INET:{ - struct sockaddr_in *s; - s=(struct sockaddr_in *)addr->ai_addr; - OP_ASSERT(addr->ai_addrlen>=sizeof(*s)); - ip=(unsigned char *)&s->sin_addr; - ip_len=sizeof(s->sin_addr); - }break; - case AF_INET6:{ - struct sockaddr_in6 *s; - s=(struct sockaddr_in6 *)addr->ai_addr; - OP_ASSERT(addr->ai_addrlen>=sizeof(*s)); - ip=(unsigned char *)&s->sin6_addr; - ip_len=sizeof(s->sin6_addr); - }break; - } - } - /*We can only verify fully-qualified domain names. - To quote RFC 6125: "The extracted data MUST include only information that - can be securely parsed out of the inputs (e.g., parsing the fully - qualified DNS domain name out of the "host" component (or its - equivalent) of a URI or deriving the application service type from the - scheme of a URI) ..." - We don't have a way to check (without relying on DNS records, which might - be subverted) if this address is fully-qualified. - This is particularly problematic when using a CONNECT tunnel, as it is - the server that does DNS lookup, not us. - However, we are certain that if the hostname has no '.', it is definitely - not a fully-qualified domain name (with the exception of crazy TLDs that - actually resolve, like "uz", but I am willing to ignore those). - RFC 1535 says "...in any event where a '.' exists in a specified name it - should be assumed to be a fully qualified domain name (FQDN) and SHOULD - be tried as a rooted name first." - That doesn't give us any security guarantees, of course (a subverted DNS - could fail the original query and our resolver might still retry with a - local domain appended). - If we don't have a FQDN, just set the number of names to 0, so we'll fail - and clean up any resources we allocated.*/ - if(ip==NULL&&strchr(host,'.')==NULL)nsan_names=0; - /*RFC 2459 says there MUST be at least one, but we don't depend on it.*/ - else nsan_names=sk_GENERAL_NAME_num(san_names); - for(sni=0;snitype==GEN_DNS - &&op_http_hostname_match(host,host_len,name->d.dNSName)){ - ret=1; - break; - } - } - else if(name->type==GEN_IPADD){ - unsigned char *cert_ip; - /*If we do have an IP address, compare it directly. - RFC 6125: "When the reference identity is an IP address, the identity - MUST be converted to the 'network byte order' octet string - representation. - For IP Version 4, as specified in RFC 791, the octet string will - contain exactly four octets. - For IP Version 6, as specified in RFC 2460, the octet string will - contain exactly sixteen octets. - This octet string is then compared against subjectAltName values of - type iPAddress. - A match occurs if the reference identity octet string and the value - octet strings are identical."*/ - cert_ip=ASN1_STRING_data(name->d.iPAddress); - if(ip_len==ASN1_STRING_length(name->d.iPAddress) - &&memcmp(ip,cert_ip,ip_len)==0){ - ret=1; - break; - } - } - } - sk_GENERAL_NAME_pop_free(san_names,GENERAL_NAME_free); - if(addr!=NULL)freeaddrinfo(addr); - } - /*Do the same FQDN check we did above. - We don't do this once in advance for both cases, because in the - subjectAltName case we might have an IPv6 address without a dot.*/ - else if(strchr(host,'.')!=NULL){ - int last_cn_loc; - int cn_loc; - /*If there is no subjectAltName, match against commonName. - RFC 6125 says that at least one significant CA is known to issue certs - with multiple CNs, although it SHOULD NOT. - It also says: "The server's identity may also be verified by comparing - the reference identity to the Common Name (CN) value in the last - Relative Distinguished Name (RDN) of the subject field of the server's - certificate (where "last" refers to the DER-encoded order...)." - So find the last one and check it.*/ - cn_loc=-1; - do{ - last_cn_loc=cn_loc; - cn_loc=X509_NAME_get_index_by_NID(X509_get_subject_name(peer_cert), - NID_commonName,last_cn_loc); - } - while(cn_loc>=0); - ret=last_cn_loc>=0 - &&op_http_hostname_match(host,host_len, - X509_NAME_ENTRY_get_data( - X509_NAME_get_entry(X509_get_subject_name(peer_cert),last_cn_loc))); - } - X509_free(peer_cert); - return ret; -} - -/*Perform the TLS handshake on a new connection.*/ -static int op_http_conn_start_tls(OpusHTTPStream *_stream,OpusHTTPConn *_conn, - op_sock _fd,SSL *_ssl_conn){ - SSL_SESSION *ssl_session; - BIO *ssl_bio; - int skip_certificate_check; - int ret; - ssl_bio=BIO_new_socket(_fd,BIO_NOCLOSE); - if(OP_LIKELY(ssl_bio==NULL))return OP_FALSE; -# if !defined(OPENSSL_NO_TLSEXT) - /*Support for RFC 6066 Server Name Indication.*/ - SSL_set_tlsext_host_name(_ssl_conn,_stream->url.host); -# endif - /*Resume a previous session if available.*/ - if(_stream->ssl_session!=NULL){ - SSL_set_session(_ssl_conn,_stream->ssl_session); - } - /*If we're proxying, establish the CONNECT tunnel.*/ - if(_stream->proxy_connect.nbuf>0){ - ret=op_http_conn_establish_tunnel(_stream,_conn, - _fd,_ssl_conn,ssl_bio); - if(OP_UNLIKELY(ret<0))return ret; - } - else{ - /*Otherwise, just use this socket directly.*/ - op_sock_set_tcp_nodelay(_fd,1); - SSL_set_bio(_ssl_conn,ssl_bio,ssl_bio); - SSL_set_connect_state(_ssl_conn); - } - ret=op_do_ssl_step(_ssl_conn,_fd,SSL_connect); - if(OP_UNLIKELY(ret<=0))return OP_FALSE; - ssl_session=_stream->ssl_session; - skip_certificate_check=_stream->skip_certificate_check; - if(ssl_session==NULL||!skip_certificate_check){ - ret=op_do_ssl_step(_ssl_conn,_fd,SSL_do_handshake); - if(OP_UNLIKELY(ret<=0))return OP_FALSE; - /*OpenSSL does not do hostname verification, despite the fact that we just - passed it the hostname above in the call to SSL_set_tlsext_host_name(), - because they are morons. - Do it for them.*/ - if(!skip_certificate_check&&!op_http_verify_hostname(_stream,_ssl_conn)){ - return OP_FALSE; - } - if(ssl_session==NULL){ - /*Save the session for later resumption.*/ - _stream->ssl_session=SSL_get1_session(_ssl_conn); - } - } - _conn->ssl_conn=_ssl_conn; - _conn->fd=_fd; - _conn->nrequests_left=OP_PIPELINE_MAX_REQUESTS; - return 0; -} - -/*Try to start a connection to the next address in the given list of a given - type. - _fd: The socket to connect with. - [inout] _addr: A pointer to the list of addresses. - This will be advanced to the first one that matches the given - address family (possibly the current one). - _ai_family: The address family to connect to. - Return: 1 If the connection was successful. - 0 If the connection is in progress. - OP_FALSE If the connection failed and there were no more addresses - left to try. - *_addr will be set to NULL in this case.*/ -static int op_sock_connect_next(op_sock _fd, - const struct addrinfo **_addr,int _ai_family){ - const struct addrinfo *addr; - int err; - addr=*_addr; - for(;;){ - /*Move to the next address of the requested type.*/ - for(;addr!=NULL&&addr->ai_family!=_ai_family;addr=addr->ai_next); - *_addr=addr; - /*No more: failure.*/ - if(addr==NULL)return OP_FALSE; - if(connect(_fd,addr->ai_addr,addr->ai_addrlen)>=0)return 1; - err=op_errno(); - /*Winsock will set WSAEWOULDBLOCK.*/ - if(OP_LIKELY(err==EINPROGRESS||err==EWOULDBLOCK))return 0; - addr=addr->ai_next; - } -} - -/*The number of address families to try connecting to simultaneously.*/ -# define OP_NPROTOS (2) - -static int op_http_connect_impl(OpusHTTPStream *_stream,OpusHTTPConn *_conn, - const struct addrinfo *_addrs,struct timeb *_start_time){ - const struct addrinfo *addr; - const struct addrinfo *addrs[OP_NPROTOS]; - struct pollfd fds[OP_NPROTOS]; - int ai_family; - int nprotos; - int ret; - int pi; - int pj; - for(pi=0;piai_next){ - if(addr->ai_family==AF_INET6||addr->ai_family==AF_INET){ - OP_ASSERT(addr->ai_addrlen<=sizeof(struct sockaddr_in6)); - OP_ASSERT(addr->ai_addrlen<=sizeof(struct sockaddr_in)); - /*If we've seen this address family before, skip this address for now.*/ - for(pi=0;piai_family==addr->ai_family)break; - if(pifree_head==_conn); - _stream->free_head=_conn->next; - _conn->next=_stream->lru_head; - _stream->lru_head=_conn; - ftime(_start_time); - *&_conn->read_time=*_start_time; - _conn->read_bytes=0; - _conn->read_rate=0; - /*Try to start a connection to each protocol. - RFC 6555 says it is RECOMMENDED that connection attempts be paced - 150...250 ms apart "to balance human factors against network load", but - that "stateful algorithms" (that's us) "are expected to be more - aggressive". - We are definitely more aggressive: we don't pace at all.*/ - for(pi=0;piai_family; - fds[pi].fd=socket(ai_family,SOCK_STREAM,addrs[pi]->ai_protocol); - fds[pi].events=POLLOUT; - if(OP_LIKELY(fds[pi].fd!=OP_INVALID_SOCKET)){ - if(OP_LIKELY(op_sock_set_nonblocking(fds[pi].fd,1)>=0)){ - ret=op_sock_connect_next(fds[pi].fd,addrs+pi,ai_family); - if(OP_UNLIKELY(ret>0)){ - /*It succeeded right away (technically possible), so stop.*/ - nprotos=pi+1; - break; - } - /*Otherwise go on to the next protocol, and skip the clean-up below.*/ - else if(ret==0)continue; - /*Tried all the addresses for this protocol.*/ - } - /*Clean up the socket.*/ - close(fds[pi].fd); - } - /*Remove this protocol from the list.*/ - memmove(addrs+pi,addrs+pi+1,sizeof(*addrs)*(nprotos-pi-1)); - nprotos--; - pi--; - } - /*Wait for one of the connections to finish.*/ - while(pi>=nprotos&&nprotos>0&&poll(fds,nprotos,OP_POLL_TIMEOUT_MS)>0){ - for(pi=0;piai_family; - addrs[pi]=addrs[pi]->ai_next; - ret=op_sock_connect_next(fds[pi].fd,addrs+pi,ai_family); - /*It succeeded right away, so stop.*/ - if(ret>0)break; - /*Otherwise go on to the next protocol, and skip the clean-up below.*/ - else if(ret==0)continue; - /*Tried all the addresses for this protocol. - Remove it from the list.*/ - close(fds[pi].fd); - memmove(fds+pi,fds+pi+1,sizeof(*fds)*(nprotos-pi-1)); - memmove(addrs+pi,addrs+pi+1,sizeof(*addrs)*(nprotos-pi-1)); - nprotos--; - pi--; - } - } - /*Close all the other sockets.*/ - for(pj=0;pj=nprotos)return OP_FALSE; - /*Save this address for future connection attempts.*/ - if(addrs[pi]!=&_stream->addr_info){ - memcpy(&_stream->addr_info,addrs[pi],sizeof(_stream->addr_info)); - _stream->addr_info.ai_addr=&_stream->addr.s; - _stream->addr_info.ai_next=NULL; - memcpy(&_stream->addr,addrs[pi]->ai_addr,addrs[pi]->ai_addrlen); - } - if(OP_URL_IS_SSL(&_stream->url)){ - SSL *ssl_conn; - /*Start the SSL connection.*/ - OP_ASSERT(_stream->ssl_ctx!=NULL); - ssl_conn=SSL_new(_stream->ssl_ctx); - if(OP_LIKELY(ssl_conn!=NULL)){ - ret=op_http_conn_start_tls(_stream,_conn,fds[pi].fd,ssl_conn); - if(OP_LIKELY(ret>=0))return ret; - SSL_free(ssl_conn); - } - close(fds[pi].fd); - _conn->fd=OP_INVALID_SOCKET; - return OP_FALSE; - } - /*Just a normal non-SSL connection.*/ - _conn->ssl_conn=NULL; - _conn->fd=fds[pi].fd; - _conn->nrequests_left=OP_PIPELINE_MAX_REQUESTS; - /*Disable write coalescing. - We always send whole requests at once and always parse the response headers - before sending another one.*/ - op_sock_set_tcp_nodelay(fds[pi].fd,1); - return 0; -} - -static int op_http_connect(OpusHTTPStream *_stream,OpusHTTPConn *_conn, - const struct addrinfo *_addrs,struct timeb *_start_time){ - struct timeb resolve_time; - struct addrinfo *new_addrs; - int ret; - /*Re-resolve the host if we need to (RFC 6555 says we MUST do so - occasionally).*/ - new_addrs=NULL; - ftime(&resolve_time); - if(_addrs!=&_stream->addr_info||op_time_diff_ms(&resolve_time, - &_stream->resolve_time)>=OP_RESOLVE_CACHE_TIMEOUT_MS){ - new_addrs=op_resolve(_stream->connect_host,_stream->connect_port); - if(OP_LIKELY(new_addrs!=NULL)){ - _addrs=new_addrs; - *&_stream->resolve_time=*&resolve_time; - } - else if(OP_LIKELY(_addrs==NULL))return OP_FALSE; - } - ret=op_http_connect_impl(_stream,_conn,_addrs,_start_time); - if(new_addrs!=NULL)freeaddrinfo(new_addrs); - return ret; -} - -# define OP_BASE64_LENGTH(_len) (((_len)+2)/3*4) - -static const char BASE64_TABLE[64]={ - 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P', - 'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f', - 'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v', - 'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/' -}; - -static char *op_base64_encode(char *_dst,const char *_src,int _len){ - unsigned s0; - unsigned s1; - unsigned s2; - int ngroups; - int i; - ngroups=_len/3; - for(i=0;i>2]; - _dst[4*i+1]=BASE64_TABLE[(s0&3)<<4|s1>>4]; - _dst[4*i+2]=BASE64_TABLE[(s1&15)<<2|s2>>6]; - _dst[4*i+3]=BASE64_TABLE[s2&63]; - } - _len-=3*i; - if(_len==1){ - s0=_src[3*i+0]; - _dst[4*i+0]=BASE64_TABLE[s0>>2]; - _dst[4*i+1]=BASE64_TABLE[(s0&3)<<4]; - _dst[4*i+2]='='; - _dst[4*i+3]='='; - i++; - } - else if(_len==2){ - s0=_src[3*i+0]; - s1=_src[3*i+1]; - _dst[4*i+0]=BASE64_TABLE[s0>>2]; - _dst[4*i+1]=BASE64_TABLE[(s0&3)<<4|s1>>4]; - _dst[4*i+2]=BASE64_TABLE[(s1&15)<<2]; - _dst[4*i+3]='='; - i++; - } - _dst[4*i]='\0'; - return _dst+4*i; -} - -/*Construct an HTTP authorization header using RFC 2617's Basic Authentication - Scheme and append it to the given string buffer.*/ -static int op_sb_append_basic_auth_header(OpusStringBuf *_sb, - const char *_header,const char *_user,const char *_pass){ - int user_len; - int pass_len; - int user_pass_len; - int base64_len; - int nbuf_total; - int ret; - ret=op_sb_append_string(_sb,_header); - ret|=op_sb_append(_sb,": Basic ",8); - user_len=strlen(_user); - pass_len=strlen(_pass); - if(OP_UNLIKELY(pass_len>INT_MAX-user_len))return OP_EFAULT; - if(OP_UNLIKELY(user_len+pass_len>(INT_MAX>>2)*3-3))return OP_EFAULT; - user_pass_len=user_len+1+pass_len; - base64_len=OP_BASE64_LENGTH(user_pass_len); - /*Stick "user:pass" at the end of the buffer so we can Base64 encode it - in-place.*/ - nbuf_total=_sb->nbuf; - if(OP_UNLIKELY(base64_len>INT_MAX-nbuf_total))return OP_EFAULT; - nbuf_total+=base64_len; - ret|=op_sb_ensure_capacity(_sb,nbuf_total); - if(OP_UNLIKELY(ret<0))return ret; - _sb->nbuf=nbuf_total-user_pass_len; - OP_ALWAYS_TRUE(!op_sb_append(_sb,_user,user_len)); - OP_ALWAYS_TRUE(!op_sb_append(_sb,":",1)); - OP_ALWAYS_TRUE(!op_sb_append(_sb,_pass,pass_len)); - op_base64_encode(_sb->buf+nbuf_total-base64_len, - _sb->buf+nbuf_total-user_pass_len,user_pass_len); - return op_sb_append(_sb,"\r\n",2); -} - -static int op_http_allow_pipelining(const char *_server){ - /*Servers known to do bad things with pipelined requests. - This list is taken from Gecko's nsHttpConnection::SupportsPipelining() (in - netwerk/protocol/http/nsHttpConnection.cpp).*/ - static const char *BAD_SERVERS[]={ - "EFAServer/", - "Microsoft-IIS/4.", - "Microsoft-IIS/5.", - "Netscape-Enterprise/3.", - "Netscape-Enterprise/4.", - "Netscape-Enterprise/5.", - "Netscape-Enterprise/6.", - "WebLogic 3.", - "WebLogic 4.", - "WebLogic 5.", - "WebLogic 6.", - "Winstone Servlet Engine v0." - }; -# define NBAD_SERVERS ((int)(sizeof(BAD_SERVERS)/sizeof(*BAD_SERVERS))) - if(*_server>='E'&&*_server<='W'){ - int si; - for(si=0;siurl,_url); - if(OP_UNLIKELY(ret<0))return ret; - if(_proxy_host!=NULL){ - if(OP_UNLIKELY(_proxy_port>65535U))return OP_EINVAL; - _stream->connect_host=op_string_dup(_proxy_host); - _stream->connect_port=_proxy_port; - } - else{ - _stream->connect_host=_stream->url.host; - _stream->connect_port=_stream->url.port; - } - addrs=NULL; - for(nredirs=0;nredirsurl)&&_stream->ssl_ctx==NULL){ - SSL_CTX *ssl_ctx; -# if !defined(OPENSSL_NO_LOCKING) - /*The documentation says SSL_library_init() is not reentrant. - We don't want to add our own depenencies on a threading library, and it - appears that it's safe to call OpenSSL's locking functions before the - library is initialized, so that's what we'll do (really OpenSSL should - do this for us). - This doesn't guarantee that _other_ threads in the application aren't - calling SSL_library_init() at the same time, but there's not much we - can do about that.*/ - CRYPTO_w_lock(CRYPTO_LOCK_SSL); -# endif - SSL_library_init(); - /*Needed to get SHA2 algorithms with old OpenSSL versions.*/ - OpenSSL_add_ssl_algorithms(); -# if !defined(OPENSSL_NO_LOCKING) - CRYPTO_w_unlock(CRYPTO_LOCK_SSL); -# endif - ssl_ctx=SSL_CTX_new(SSLv23_client_method()); - if(ssl_ctx==NULL)return OP_EFAULT; - if(!_skip_certificate_check){ - /*We don't do anything if this fails, since it just means we won't load - any certificates (and thus all checks will fail). - However, as that is probably the result of a system - mis-configuration, assert here to make it easier to identify.*/ - OP_ALWAYS_TRUE(SSL_CTX_set_default_verify_paths(ssl_ctx)); - SSL_CTX_set_verify(ssl_ctx,SSL_VERIFY_PEER,NULL); - } - _stream->ssl_ctx=ssl_ctx; - _stream->skip_certificate_check=_skip_certificate_check; - if(_proxy_host!=NULL){ - /*We need to establish a CONNECT tunnel to handle https proxying. - Build the request we'll send to do so.*/ - _stream->proxy_connect.nbuf=0; - ret=op_sb_append(&_stream->proxy_connect,"CONNECT ",8); - ret|=op_sb_append_string(&_stream->proxy_connect,_stream->url.host); - ret|=op_sb_append_port(&_stream->proxy_connect,_stream->url.port); - /*CONNECT requires at least HTTP 1.1.*/ - ret|=op_sb_append(&_stream->proxy_connect," HTTP/1.1\r\n",11); - ret|=op_sb_append(&_stream->proxy_connect,"Host: ",6); - ret|=op_sb_append_string(&_stream->proxy_connect,_stream->url.host); - /*The example in RFC 2817 Section 5.2 specifies an explicit port even - when connecting to the default port. - Given that the proxy doesn't know whether we're trying to connect to - an http or an https URL except by the port number, this seems like a - good idea.*/ - ret|=op_sb_append_port(&_stream->proxy_connect,_stream->url.port); - ret|=op_sb_append(&_stream->proxy_connect,"\r\n",2); - ret|=op_sb_append(&_stream->proxy_connect,"User-Agent: .\r\n",15); - if(_proxy_user!=NULL&&_proxy_pass!=NULL){ - ret|=op_sb_append_basic_auth_header(&_stream->proxy_connect, - "Proxy-Authorization",_proxy_user,_proxy_pass); - } - /*For backwards compatibility.*/ - ret|=op_sb_append(&_stream->proxy_connect, - "Proxy-Connection: keep-alive\r\n",30); - ret|=op_sb_append(&_stream->proxy_connect,"\r\n",2); - if(OP_UNLIKELY(ret<0))return ret; - } - } - /*Actually make the connection.*/ - ret=op_http_connect(_stream,_stream->conns+0,addrs,&start_time); - if(OP_UNLIKELY(ret<0))return ret; - /*Build the request to send.*/ - _stream->request.nbuf=0; - ret=op_sb_append(&_stream->request,"GET ",4); - ret|=op_sb_append_string(&_stream->request, - _proxy_host!=NULL?_url:_stream->url.path); - /*Send HTTP/1.0 by default for maximum compatibility (so we don't have to - re-try if HTTP/1.1 fails, though it shouldn't, even for a 1.0 server). - This means we aren't conditionally compliant with RFC 2145, because we - violate the requirement that "An HTTP client SHOULD send a request - version equal to the highest version for which the client is at least - conditionally compliant...". - According to RFC 2145, that means we can't claim any compliance with any - IETF HTTP specification.*/ - ret|=op_sb_append(&_stream->request," HTTP/1.0\r\n",11); - /*Remember where this is so we can upgrade to HTTP/1.1 if the server - supports it.*/ - minor_version_pos=_stream->request.nbuf-3; - ret|=op_sb_append(&_stream->request,"Host: ",6); - ret|=op_sb_append_string(&_stream->request,_stream->url.host); - if(!OP_URL_IS_DEFAULT_PORT(&_stream->url)){ - ret|=op_sb_append_port(&_stream->request,_stream->url.port); - } - ret|=op_sb_append(&_stream->request,"\r\n",2); - /*User-Agents have been a bad idea, so send as little as possible. - RFC 2616 requires at least one token in the User-Agent, which must have - at least one character.*/ - ret|=op_sb_append(&_stream->request,"User-Agent: .\r\n",15); - if(_proxy_host!=NULL&&!OP_URL_IS_SSL(&_stream->url) - &&_proxy_user!=NULL&&_proxy_pass!=NULL){ - ret|=op_sb_append_basic_auth_header(&_stream->request, - "Proxy-Authorization",_proxy_user,_proxy_pass); - } - if(_stream->url.user!=NULL&&_stream->url.pass!=NULL){ - ret|=op_sb_append_basic_auth_header(&_stream->request, - "Authorization",_stream->url.user,_stream->url.pass); - } - /*Always send a Referer [sic] header. - It's common to refuse to serve a resource unless one is present. - We just use the relative "/" URI to suggest we came from the same domain, - as this is the most common check. - This might violate RFC 2616's mandate that the field "MUST NOT be sent if - the Request-URI was obtained from a source that does not have its own - URI, such as input from the user keyboard," but we don't really have any - way to know.*/ - /*TODO: Should we update this on redirects?*/ - ret|=op_sb_append(&_stream->request,"Referer: /\r\n",12); - /*Always send a Range request header to find out if we're seekable. - This requires an HTTP/1.1 server to succeed, but we'll still get what we - want with an HTTP/1.0 server that ignores this request header.*/ - ret|=op_sb_append(&_stream->request,"Range: bytes=0-\r\n",17); - /*Remember where this is so we can append offsets to it later.*/ - _stream->request_tail=_stream->request.nbuf-4; - ret|=op_sb_append(&_stream->request,"\r\n",2); - if(OP_UNLIKELY(ret<0))return ret; - ret=op_http_conn_write_fully(_stream->conns+0, - _stream->request.buf,_stream->request.nbuf); - if(OP_UNLIKELY(ret<0))return ret; - ret=op_http_conn_read_response(_stream->conns+0,&_stream->response); - if(OP_UNLIKELY(ret<0))return ret; - ftime(&end_time); - next=op_http_parse_status_line(&v1_1_compat,&status_code, - _stream->response.buf); - if(OP_UNLIKELY(next==NULL))return OP_FALSE; - if(status_code[0]=='2'){ - opus_int64 content_length; - opus_int64 range_length; - int pipeline_supported; - int pipeline_disabled; - /*We only understand 20x codes.*/ - if(status_code[1]!='0')return OP_FALSE; - content_length=-1; - range_length=-1; - /*Pipelining must be explicitly enabled.*/ - pipeline_supported=0; - pipeline_disabled=0; - for(;;){ - char *header; - char *cdr; - ret=op_http_get_next_header(&header,&cdr,&next); - if(OP_UNLIKELY(ret<0))return ret; - if(header==NULL)break; - if(strcmp(header,"content-length")==0){ - /*Two Content-Length headers?*/ - if(OP_UNLIKELY(content_length>=0))return OP_FALSE; - content_length=op_http_parse_content_length(cdr); - if(OP_UNLIKELY(content_length<0))return (int)content_length; - /*Make sure the Content-Length and Content-Range headers match.*/ - if(range_length>=0&&OP_UNLIKELY(content_length!=range_length)){ - return OP_FALSE; - } - } - else if(strcmp(header,"content-range")==0){ - opus_int64 range_first; - opus_int64 range_last; - /*Two Content-Range headers?*/ - if(OP_UNLIKELY(range_length>=0))return OP_FALSE; - ret=op_http_parse_content_range(&range_first,&range_last, - &range_length,cdr); - if(OP_UNLIKELY(ret<0))return ret; - /*"A response with satus code 206 (Partial Content) MUST NOT - include a Content-Range field with a byte-range-resp-spec of - '*'."*/ - if(status_code[2]=='6' - &&(OP_UNLIKELY(range_first<0)||OP_UNLIKELY(range_last<0))){ - return OP_FALSE; - } - /*We asked for the entire resource.*/ - if(range_length>=0){ - /*Quit if we didn't get it.*/ - if(range_last>=0&&OP_UNLIKELY(range_last!=range_length-1)){ - return OP_FALSE; - } - } - /*If there was no length, use the end of the range.*/ - else if(range_last>=0)range_length=range_last+1; - /*Make sure the Content-Length and Content-Range headers match.*/ - if(content_length>=0&&OP_UNLIKELY(content_length!=range_length)){ - return OP_FALSE; - } - } - else if(strcmp(header,"connection")==0){ - /*According to RFC 2616, if an HTTP/1.1 application does not support - pipelining, it "MUST include the 'close' connection option in - every message." - Therefore, if we receive one in the initial response, disable - pipelining entirely. - The server still might support it (e.g., we might just have hit the - request limit for a temporary child process), but if it doesn't - and we assume it does, every time we cross a chunk boundary we'll - error out and reconnect, adding lots of latency.*/ - ret=op_http_parse_connection(cdr); - if(OP_UNLIKELY(ret<0))return ret; - pipeline_disabled|=ret; - } - else if(strcmp(header,"server")==0){ - /*If we got a Server response header, and it wasn't from a known-bad - server, enable pipelining, as long as it's at least HTTP/1.1. - According to RFC 2145, the server is supposed to respond with the - highest minor version number it supports unless it is known or - suspected that we incorrectly implement the HTTP specification. - So it should send back at least HTTP/1.1, despite our HTTP/1.0 - request.*/ - pipeline_supported=v1_1_compat; - if(v1_1_compat)pipeline_disabled|=!op_http_allow_pipelining(cdr); - if(_info!=NULL&&_info->server==NULL)_info->server=op_string_dup(cdr); - } - /*Collect station information headers if the caller requested it. - If there's more than one copy of a header, the first one wins.*/ - else if(_info!=NULL){ - if(strcmp(header,"content-type")==0){ - if(_info->content_type==NULL){ - _info->content_type=op_string_dup(cdr); - } - } - else if(header[0]=='i'&&header[1]=='c' - &&(header[2]=='e'||header[2]=='y')&&header[3]=='-'){ - if(strcmp(header+4,"name")==0){ - if(_info->name==NULL)_info->name=op_string_dup(cdr); - } - else if(strcmp(header+4,"description")==0){ - if(_info->description==NULL)_info->description=op_string_dup(cdr); - } - else if(strcmp(header+4,"genre")==0){ - if(_info->genre==NULL)_info->genre=op_string_dup(cdr); - } - else if(strcmp(header+4,"url")==0){ - if(_info->url==NULL)_info->url=op_string_dup(cdr); - } - else if(strcmp(header,"icy-br")==0 - ||strcmp(header,"ice-bitrate")==0){ - if(_info->bitrate_kbps<0){ - opus_int64 bitrate_kbps; - /*Just re-using this function to parse a random unsigned - integer field.*/ - bitrate_kbps=op_http_parse_content_length(cdr); - if(bitrate_kbps>=0&&bitrate_kbps<=OP_INT32_MAX){ - _info->bitrate_kbps=(opus_int32)bitrate_kbps; - } - } - } - else if(strcmp(header,"icy-pub")==0 - ||strcmp(header,"ice-public")==0){ - if(_info->is_public<0&&(cdr[0]=='0'||cdr[0]=='1')&&cdr[1]=='\0'){ - _info->is_public=cdr[0]-'0'; - } - } - } - } - } - switch(status_code[2]){ - /*200 OK*/ - case '0':break; - /*203 Non-Authoritative Information*/ - case '3':break; - /*204 No Content*/ - case '4':{ - if(content_length>=0&&OP_UNLIKELY(content_length!=0)){ - return OP_FALSE; - } - }break; - /*206 Partial Content*/ - case '6':{ - /*No Content-Range header.*/ - if(OP_UNLIKELY(range_length<0))return OP_FALSE; - content_length=range_length; - /*The server supports range requests for this resource. - We can seek.*/ - _stream->seekable=1; - }break; - /*201 Created: the response "SHOULD include an entity containing a list - of resource characteristics and location(s)," but not an Opus file. - 202 Accepted: the response "SHOULD include an indication of request's - current status and either a pointer to a status monitor or some - estimate of when the user can expect the request to be fulfilled," - but not an Opus file. - 205 Reset Content: this "MUST NOT include an entity," meaning no Opus - file. - 207...209 are not yet defined, so we don't know how to handle them.*/ - default:return OP_FALSE; - } - _stream->content_length=content_length; - _stream->pipeline=pipeline_supported&&!pipeline_disabled; - /*Pipelining requires HTTP/1.1 persistent connections.*/ - if(_stream->pipeline)_stream->request.buf[minor_version_pos]='1'; - _stream->conns[0].pos=0; - _stream->conns[0].end_pos=_stream->seekable?content_length:-1; - _stream->conns[0].chunk_size=-1; - _stream->cur_conni=0; - _stream->connect_rate=op_time_diff_ms(&end_time,&start_time); - _stream->connect_rate=OP_MAX(_stream->connect_rate,1); - if(_info!=NULL)_info->is_ssl=OP_URL_IS_SSL(&_stream->url); - /*The URL has been successfully opened.*/ - return 0; - } - /*Shouldn't get 1xx; 4xx and 5xx are both failures (and we don't retry). - Everything else is undefined.*/ - else if(status_code[0]!='3')return OP_FALSE; - /*We have some form of redirect request.*/ - /*We only understand 30x codes.*/ - if(status_code[1]!='0')return OP_FALSE; - switch(status_code[2]){ - /*300 Multiple Choices: "If the server has a preferred choice of - representation, it SHOULD include the specific URI for that - representation in the Location field," otherwise we'll fail.*/ - case '0': - /*301 Moved Permanently*/ - case '1': - /*302 Found*/ - case '2': - /*307 Temporary Redirect*/ - case '7': - /*308 Permanent Redirect (defined by draft-reschke-http-status-308-07).*/ - case '8':break; - /*305 Use Proxy: "The Location field gives the URI of the proxy." - TODO: This shouldn't actually be that hard to do.*/ - case '5':return OP_EIMPL; - /*303 See Other: "The new URI is not a substitute reference for the - originally requested resource." - 304 Not Modified: "The 304 response MUST NOT contain a message-body." - 306 (Unused) - 309 is not yet defined, so we don't know how to handle it.*/ - default:return OP_FALSE; - } - _url=NULL; - for(;;){ - char *header; - char *cdr; - ret=op_http_get_next_header(&header,&cdr,&next); - if(OP_UNLIKELY(ret<0))return ret; - if(header==NULL)break; - if(strcmp(header,"location")==0&&OP_LIKELY(_url==NULL))_url=cdr; - } - if(OP_UNLIKELY(_url==NULL))return OP_FALSE; - ret=op_parse_url(&next_url,_url); - if(OP_UNLIKELY(ret<0))return ret; - if(_proxy_host==NULL||_stream->ssl_session!=NULL){ - if(strcmp(_stream->url.host,next_url.host)==0 - &&_stream->url.port==next_url.port){ - /*Try to skip re-resolve when connecting to the same host.*/ - addrs=&_stream->addr_info; - } - else{ - if(_stream->ssl_session!=NULL){ - /*Forget any cached SSL session from the last host.*/ - SSL_SESSION_free(_stream->ssl_session); - _stream->ssl_session=NULL; - } - } - } - if(_proxy_host==NULL){ - OP_ASSERT(_stream->connect_host==_stream->url.host); - _stream->connect_host=next_url.host; - _stream->connect_port=next_url.port; - } - /*Always try to skip re-resolve for proxy connections.*/ - else addrs=&_stream->addr_info; - op_parsed_url_clear(&_stream->url); - *&_stream->url=*&next_url; - /*TODO: On servers/proxies that support pipelining, we might be able to - re-use this connection.*/ - op_http_conn_close(_stream,_stream->conns+0,&_stream->lru_head,1); - } - /*Redirection limit reached.*/ - return OP_FALSE; -} - -static int op_http_conn_send_request(OpusHTTPStream *_stream, - OpusHTTPConn *_conn,opus_int64 _pos,opus_int32 _chunk_size, - int _try_not_to_block){ - opus_int64 next_end; - int ret; - /*We shouldn't have another request outstanding.*/ - OP_ASSERT(_conn->next_pos<0); - /*Build the request to send.*/ - OP_ASSERT(_stream->request.nbuf>=_stream->request_tail); - _stream->request.nbuf=_stream->request_tail; - ret=op_sb_append_nonnegative_int64(&_stream->request,_pos); - ret|=op_sb_append(&_stream->request,"-",1); - if(_chunk_size>0&&OP_ADV_OFFSET(_pos,2*_chunk_size)<_stream->content_length){ - /*We shouldn't be pipelining requests with non-HTTP/1.1 servers.*/ - OP_ASSERT(_stream->pipeline); - next_end=_pos+_chunk_size; - ret|=op_sb_append_nonnegative_int64(&_stream->request,next_end-1); - /*Use a larger chunk size for our next request.*/ - _chunk_size<<=1; - /*But after a while, just request the rest of the resource.*/ - if(_chunk_size>OP_PIPELINE_CHUNK_SIZE_MAX)_chunk_size=-1; - } - else{ - /*Either this was a non-pipelined request or we were close enough to the - end to just ask for the rest.*/ - next_end=-1; - _chunk_size=-1; - } - ret|=op_sb_append(&_stream->request,"\r\n\r\n",4); - if(OP_UNLIKELY(ret<0))return ret; - /*If we don't want to block, check to see if there's enough space in the send - queue. - There's still a chance we might block, even if there is enough space, but - it's a much slimmer one. - Blocking at all is pretty unlikely, as we won't have any requests queued - when _try_not_to_block is set, so if FIONSPACE isn't available (e.g., on - Linux), just skip the test.*/ - if(_try_not_to_block){ -# if defined(FIONSPACE) - int available; - ret=ioctl(_conn->fd,FIONSPACE,&available); - if(ret<0||available<_stream->request.nbuf)return 1; -# endif - } - ret=op_http_conn_write_fully(_conn, - _stream->request.buf,_stream->request.nbuf); - if(OP_UNLIKELY(ret<0))return ret; - _conn->next_pos=_pos; - _conn->next_end=next_end; - /*Save the chunk size to use for the next request.*/ - _conn->chunk_size=_chunk_size; - _conn->nrequests_left--; - return ret; -} - -/*Handles the response to all requests after the first one. - Return: 1 if the connection was closed or timed out, 0 on success, or a - negative value on any other error.*/ -static int op_http_conn_handle_response(OpusHTTPStream *_stream, - OpusHTTPConn *_conn){ - char *next; - char *status_code; - opus_int64 range_length; - opus_int64 next_pos; - opus_int64 next_end; - int ret; - ret=op_http_conn_read_response(_conn,&_stream->response); - /*If the server just closed the connection on us, we may have just hit a - connection re-use limit, so we might want to retry.*/ - if(OP_UNLIKELY(ret<0))return ret==OP_EREAD?1:ret; - next=op_http_parse_status_line(NULL,&status_code,_stream->response.buf); - if(OP_UNLIKELY(next==NULL))return OP_FALSE; - /*We _need_ a 206 Partial Content response. - Nothing else will do.*/ - if(strncmp(status_code,"206",3)!=0){ - /*But on a 408 Request Timeout, we might want to re-try.*/ - return strncmp(status_code,"408",3)==0?1:OP_FALSE; - } - next_pos=_conn->next_pos; - next_end=_conn->next_end; - range_length=-1; - for(;;){ - char *header; - char *cdr; - ret=op_http_get_next_header(&header,&cdr,&next); - if(OP_UNLIKELY(ret<0))return ret; - if(header==NULL)break; - if(strcmp(header,"content-range")==0){ - opus_int64 range_first; - opus_int64 range_last; - /*Two Content-Range headers?*/ - if(OP_UNLIKELY(range_length>=0))return OP_FALSE; - ret=op_http_parse_content_range(&range_first,&range_last, - &range_length,cdr); - if(OP_UNLIKELY(ret<0))return ret; - /*"A response with satus code 206 (Partial Content) MUST NOT - include a Content-Range field with a byte-range-resp-spec of - '*'."*/ - if(OP_UNLIKELY(range_first<0)||OP_UNLIKELY(range_last<0))return OP_FALSE; - /*We also don't want range_last to overflow.*/ - if(OP_UNLIKELY(range_last>=OP_INT64_MAX))return OP_FALSE; - range_last++; - /*Quit if we didn't get the offset we asked for.*/ - if(range_first!=next_pos)return OP_FALSE; - if(next_end<0){ - /*We asked for the rest of the resource.*/ - if(range_length>=0){ - /*Quit if we didn't get it.*/ - if(OP_UNLIKELY(range_last!=range_length))return OP_FALSE; - } - /*If there was no length, use the end of the range.*/ - else range_length=range_last; - next_end=range_last; - } - else{ - if(range_last!=next_end)return OP_FALSE; - /*If there was no length, use the larger of the content length or the - end of this chunk.*/ - if(range_length<0){ - range_length=OP_MAX(range_last,_stream->content_length); - } - } - } - else if(strcmp(header,"content-length")==0){ - opus_int64 content_length; - /*Validate the Content-Length header, if present, against the request we - made.*/ - content_length=op_http_parse_content_length(cdr); - if(OP_UNLIKELY(content_length<0))return (int)content_length; - if(next_end<0){ - /*If we haven't seen the Content-Range header yet and we asked for the - rest of the resource, set next_end, so we can make sure they match - when we do find the Content-Range header.*/ - if(OP_UNLIKELY(next_pos>OP_INT64_MAX-content_length))return OP_FALSE; - next_end=next_pos+content_length; - } - /*Otherwise, make sure they match now.*/ - else if(OP_UNLIKELY(next_end-next_pos!=content_length))return OP_FALSE; - } - else if(strcmp(header,"connection")==0){ - ret=op_http_parse_connection(cdr); - if(OP_UNLIKELY(ret<0))return ret; - /*If the server told us it was going to close the connection, don't make - any more requests.*/ - if(OP_UNLIKELY(ret>0))_conn->nrequests_left=0; - } - } - /*No Content-Range header.*/ - if(OP_UNLIKELY(range_length<0))return OP_FALSE; - /*Update the content_length if necessary.*/ - _stream->content_length=range_length; - _conn->pos=next_pos; - _conn->end_pos=next_end; - _conn->next_pos=-1; - return 0; -} - -/*Open a new connection that will start reading at byte offset _pos. - _pos: The byte offset to start reading from. - _chunk_size: The number of bytes to ask for in the initial request, or -1 to - request the rest of the resource. - This may be more bytes than remain, in which case it will be - converted into a request for the rest.*/ -static int op_http_conn_open_pos(OpusHTTPStream *_stream, - OpusHTTPConn *_conn,opus_int64 _pos,opus_int32 _chunk_size){ - struct timeb start_time; - struct timeb end_time; - opus_int32 connect_rate; - opus_int32 connect_time; - int ret; - ret=op_http_connect(_stream,_conn,&_stream->addr_info,&start_time); - if(OP_UNLIKELY(ret<0))return ret; - ret=op_http_conn_send_request(_stream,_conn,_pos,_chunk_size,0); - if(OP_UNLIKELY(ret<0))return ret; - ret=op_http_conn_handle_response(_stream,_conn); - if(OP_UNLIKELY(ret!=0))return OP_FALSE; - ftime(&end_time); - _stream->cur_conni=_conn-_stream->conns; - OP_ASSERT(_stream->cur_conni>=0&&_stream->cur_conniconnect_rate; - connect_rate+=OP_MAX(connect_time,1)-connect_rate+8>>4; - _stream->connect_rate=connect_rate; - return 0; -} - -/*Read data from the current response body. - If we're pipelining and we get close to the end of this response, queue - another request. - If we've reached the end of this response body, parse the next response and - keep going. - [out] _buf: Returns the data read. - _buf_size: The size of the buffer. - Return: A positive number of bytes read on success. - 0: The connection was closed. - OP_EREAD: There was a fatal read error.*/ -static int op_http_conn_read_body(OpusHTTPStream *_stream, - OpusHTTPConn *_conn,unsigned char *_buf,int _buf_size){ - opus_int64 pos; - opus_int64 end_pos; - opus_int64 next_pos; - opus_int64 content_length; - int nread; - int pipeline; - int ret; - /*Currently this function can only be called on the LRU head. - Otherwise, we'd need a _pnext pointer if we needed to close the connection, - and re-opening it would re-organize the lists.*/ - OP_ASSERT(_stream->lru_head==_conn); - /*We should have filterd out empty reads by this point.*/ - OP_ASSERT(_buf_size>0); - pos=_conn->pos; - end_pos=_conn->end_pos; - next_pos=_conn->next_pos; - pipeline=_stream->pipeline; - content_length=_stream->content_length; - if(end_pos>=0){ - /*Have we reached the end of the current response body?*/ - if(pos>=end_pos){ - OP_ASSERT(content_length>=0); - /*If this was the end of the stream, we're done. - Also return early if a non-blocking read was requested (regardless of - whether we might be able to parse the next response without - blocking).*/ - if(content_length<=end_pos)return 0; - /*Otherwise, start on the next response.*/ - if(next_pos<0){ - /*We haven't issued another request yet.*/ - if(!pipeline||_conn->nrequests_left<=0){ - /*There are two ways to get here: either the server told us it was - going to close the connection after the last request, or we - thought we were reading the whole resource, but it grew while we - were reading it. - The only way the latter could have happened is if content_length - changed while seeking. - Open a new request to read the rest.*/ - OP_ASSERT(_stream->seekable); - /*Try to open a new connection to read another chunk.*/ - op_http_conn_close(_stream,_conn,&_stream->lru_head,1); - /*If we're not pipelining, we should be requesting the rest.*/ - OP_ASSERT(pipeline||_conn->chunk_size==-1); - ret=op_http_conn_open_pos(_stream,_conn,end_pos,_conn->chunk_size); - if(OP_UNLIKELY(ret<0))return OP_EREAD; - } - else{ - /*Issue the request now (better late than never).*/ - ret=op_http_conn_send_request(_stream,_conn,pos,_conn->chunk_size,0); - if(OP_UNLIKELY(ret<0))return OP_EREAD; - next_pos=_conn->next_pos; - OP_ASSERT(next_pos>=0); - } - } - if(next_pos>=0){ - /*We shouldn't be trying to read past the current request body if we're - seeking somewhere else.*/ - OP_ASSERT(next_pos==end_pos); - ret=op_http_conn_handle_response(_stream,_conn); - if(OP_UNLIKELY(ret<0))return OP_EREAD; - if(OP_UNLIKELY(ret>0)&&pipeline){ - opus_int64 next_end; - next_end=_conn->next_end; - /*Our request timed out or the server closed the connection. - Try re-connecting.*/ - op_http_conn_close(_stream,_conn,&_stream->lru_head,1); - /*Unless there's a bug, we should be able to convert - (next_pos,next_end) into valid (_pos,_chunk_size) parameters.*/ - OP_ASSERT(next_end<0 - ||next_end-next_pos>=0&&next_end-next_pos<=OP_INT32_MAX); - ret=op_http_conn_open_pos(_stream,_conn,next_pos, - next_end<0?-1:(opus_int32)(next_end-next_pos)); - if(OP_UNLIKELY(ret<0))return OP_EREAD; - } - else if(OP_UNLIKELY(ret!=0))return OP_EREAD; - } - pos=_conn->pos; - end_pos=_conn->end_pos; - content_length=_stream->content_length; - } - OP_ASSERT(end_pos>pos); - _buf_size=OP_MIN(_buf_size,end_pos-pos); - } - nread=op_http_conn_read(_conn,(char *)_buf,_buf_size,1); - if(OP_UNLIKELY(nread<0))return nread; - pos+=nread; - _conn->pos=pos; - OP_ASSERT(end_pos<0||content_length>=0); - /*TODO: If nrequests_left<=0, we can't make a new request, and there will be - a big pause after we hit the end of the chunk while we open a new - connection. - It would be nice to be able to start that process now, but we have no way - to do it in the background without blocking (even if we could start it, we - have no guarantee the application will return control to us in a - sufficiently timely manner to allow us to complete it, and this is - uncommon enough that it's not worth using threads just for this).*/ - if(end_pos>=0&&end_posnrequests_left>0)){ - opus_int64 request_thresh; - opus_int32 chunk_size; - /*Are we getting close to the end of the current response body? - If so, we should request more data.*/ - request_thresh=_stream->connect_rate*_conn->read_rate>>12; - /*But don't commit ourselves too quickly.*/ - chunk_size=_conn->chunk_size; - if(chunk_size>=0)request_thresh=OP_MIN(chunk_size>>2,request_thresh); - if(end_pos-poschunk_size,1); - if(OP_UNLIKELY(ret<0))return OP_EREAD; - } - } - return nread; -} - -static int op_http_stream_read(void *_stream, - unsigned char *_ptr,int _buf_size){ - OpusHTTPStream *stream; - ptrdiff_t nread; - opus_int64 size; - opus_int64 pos; - int ci; - stream=(OpusHTTPStream *)_stream; - /*Check for an empty read.*/ - if(_buf_size<=0)return 0; - ci=stream->cur_conni; - /*No current connection => EOF.*/ - if(ci<0)return 0; - pos=stream->conns[ci].pos; - size=stream->content_length; - /*Check for EOF.*/ - if(size>=0){ - if(pos>=size)return 0; - /*Check for a short read.*/ - if(_buf_size>size-pos)_buf_size=(int)(size-pos); - } - nread=op_http_conn_read_body(stream,stream->conns+ci,_ptr,_buf_size); - if(OP_UNLIKELY(nread<=0)){ - /*We hit an error or EOF. - Either way, we're done with this connection.*/ - op_http_conn_close(stream,stream->conns+ci,&stream->lru_head,1); - stream->cur_conni=-1; - stream->pos=pos; - } - return nread; -} - -/*Discard data until we reach the _target position. - This destroys the contents of _stream->response.buf, as we need somewhere to - read this data, and that is a convenient place. - _just_read_ahead: Whether or not this is a plain fast-forward. - If 0, we need to issue a new request for a chunk at _target - and discard all the data from our current request(s). - Otherwise, we should be able to reach _target without - issuing any new requests. - _target: The stream position to which to read ahead.*/ -static int op_http_conn_read_ahead(OpusHTTPStream *_stream, - OpusHTTPConn *_conn,int _just_read_ahead,opus_int64 _target){ - opus_int64 pos; - opus_int64 end_pos; - opus_int64 next_pos; - opus_int64 next_end; - ptrdiff_t nread; - int ret; - pos=_conn->pos; - end_pos=_conn->end_pos; - next_pos=_conn->next_pos; - next_end=_conn->next_end; - if(!_just_read_ahead){ - /*We need to issue a new pipelined request. - This is the only case where we allow more than one outstanding request - at a time, so we need to reset next_pos (we'll restore it below if we - did have an outstanding request).*/ - OP_ASSERT(_stream->pipeline); - _conn->next_pos=-1; - ret=op_http_conn_send_request(_stream,_conn,_target, - OP_PIPELINE_CHUNK_SIZE,0); - if(OP_UNLIKELY(ret<0))return ret; - } - /*We can reach the target position by reading forward in the current chunk.*/ - if(_just_read_ahead&&(end_pos<0||_target=0){ - opus_int64 next_next_pos; - opus_int64 next_next_end; - /*We already have a request outstanding. - Finish off the current chunk.*/ - while(posresponse.buf, - (int)OP_MIN(end_pos-pos,_stream->response.cbuf),1); - /*We failed to read ahead.*/ - if(nread<=0)return OP_FALSE; - pos+=nread; - } - OP_ASSERT(pos==end_pos); - if(_just_read_ahead){ - next_next_pos=next_next_end=-1; - end_pos=_target; - } - else{ - OP_ASSERT(_conn->next_pos==_target); - next_next_pos=_target; - next_next_end=_conn->next_end; - _conn->next_pos=next_pos; - _conn->next_end=next_end; - end_pos=next_end; - } - ret=op_http_conn_handle_response(_stream,_conn); - if(OP_UNLIKELY(ret!=0))return OP_FALSE; - _conn->next_pos=next_next_pos; - _conn->next_end=next_next_end; - } - while(posresponse.buf, - (int)OP_MIN(end_pos-pos,_stream->response.cbuf),1); - /*We failed to read ahead.*/ - if(nread<=0)return OP_FALSE; - pos+=nread; - } - OP_ASSERT(pos==end_pos); - if(!_just_read_ahead){ - ret=op_http_conn_handle_response(_stream,_conn); - if(OP_UNLIKELY(ret!=0))return OP_FALSE; - } - else _conn->pos=end_pos; - OP_ASSERT(_conn->pos==_target); - return 0; -} - -static int op_http_stream_seek(void *_stream,opus_int64 _offset,int _whence){ - struct timeb seek_time; - OpusHTTPStream *stream; - OpusHTTPConn *conn; - OpusHTTPConn **pnext; - OpusHTTPConn *close_conn; - OpusHTTPConn **close_pnext; - opus_int64 content_length; - opus_int64 pos; - int pipeline; - int ci; - int ret; - stream=(OpusHTTPStream *)_stream; - if(!stream->seekable)return -1; - content_length=stream->content_length; - /*If we're seekable, we should have gotten a Content-Length.*/ - OP_ASSERT(content_length>=0); - ci=stream->cur_conni; - pos=ci<0?content_length:stream->conns[ci].pos; - switch(_whence){ - case SEEK_SET:{ - /*Check for overflow:*/ - if(_offset<0)return -1; - pos=_offset; - }break; - case SEEK_CUR:{ - /*Check for overflow:*/ - if(_offset<-pos||_offset>OP_INT64_MAX-pos)return -1; - pos+=_offset; - }break; - case SEEK_END:{ - /*Check for overflow:*/ - if(_offset>content_length||_offset=0){ - op_http_conn_read_rate_update(stream->conns+ci); - *&seek_time=*&stream->conns[ci].read_time; - } - else ftime(&seek_time); - /*If we seeked past the end of the stream, just disable the active - connection.*/ - if(pos>=content_length){ - stream->cur_conni=-1; - stream->pos=pos; - return 0; - } - /*First try to find a connection we can use without waiting.*/ - pnext=&stream->lru_head; - conn=stream->lru_head; - while(conn!=NULL){ - opus_int64 conn_pos; - opus_int64 end_pos; - int available; - /*If this connection has been dormant too long or has made too many - requests, close it. - This is to prevent us from hitting server limits/firewall timeouts.*/ - if(op_time_diff_ms(&seek_time,&conn->read_time)> - OP_CONNECTION_IDLE_TIMEOUT_MS - ||conn->nrequests_leftpos; - end_pos=conn->end_pos; - if(conn->next_pos>=0){ - OP_ASSERT(end_pos>=0); - OP_ASSERT(conn->next_pos==end_pos); - end_pos=conn->next_end; - } - OP_ASSERT(end_pos<0||conn_pos<=end_pos); - /*Can we quickly read ahead without issuing a new request or waiting for - any more data? - If we have an oustanding request, we'll over-estimate the amount of data - it has available (because we'll count the response headers, too), but - that probably doesn't matter.*/ - if(conn_pos<=pos&&pos-conn_pos<=available&&(end_pos<0||posnext; - conn->next=stream->lru_head; - stream->lru_head=conn; - stream->cur_conni=conn-stream->conns; - return 0; - } - pnext=&conn->next; - conn=conn->next; - } - /*Chances are that didn't work, so now try to find one we can use by reading - ahead a reasonable amount and/or by issuing a new request.*/ - close_pnext=NULL; - close_conn=NULL; - pnext=&stream->lru_head; - conn=stream->lru_head; - pipeline=stream->pipeline; - while(conn!=NULL){ - opus_int64 conn_pos; - opus_int64 end_pos; - opus_int64 read_ahead_thresh; - int available; - int just_read_ahead; - /*Dividing by 2048 instead of 1000 scales this by nearly 1/2, biasing away - from connection re-use (and roughly compensating for the lag required to - reopen the TCP window of a connection that's been idle). - There's no overflow checking here, because it's vanishingly unlikely, and - all it would do is cause us to make poor decisions.*/ - read_ahead_thresh=OP_MAX(OP_READAHEAD_THRESH_MIN, - stream->connect_rate*conn->read_rate>>11); - available=op_http_conn_estimate_available(conn); - conn_pos=conn->pos; - end_pos=conn->end_pos; - if(conn->next_pos>=0){ - OP_ASSERT(end_pos>=0); - OP_ASSERT(conn->next_pos==end_pos); - end_pos=conn->next_end; - } - OP_ASSERT(end_pos<0||conn_pos<=end_pos); - /*Can we quickly read ahead without issuing a new request?*/ - just_read_ahead=conn_pos<=pos&&pos-conn_pos-available<=read_ahead_thresh - &&(end_pos<0||pos=0 - &&end_pos-conn_pos-available<=read_ahead_thresh){ - /*Found a suitable connection to re-use.*/ - ret=op_http_conn_read_ahead(stream,conn,just_read_ahead,pos); - if(OP_UNLIKELY(ret<0)){ - /*The connection might have become stale, so close it and keep going.*/ - op_http_conn_close(stream,conn,pnext,1); - conn=*pnext; - continue; - } - /*Sucessfully resurrected this connection.*/ - *pnext=conn->next; - conn->next=stream->lru_head; - stream->lru_head=conn; - stream->cur_conni=conn-stream->conns; - return 0; - } - close_pnext=pnext; - close_conn=conn; - pnext=&conn->next; - conn=conn->next; - } - /*No suitable connections. - Open a new one.*/ - if(stream->free_head==NULL){ - /*All connections in use. - Expire one of them (we should have already picked which one when scanning - the list).*/ - OP_ASSERT(close_conn!=NULL); - OP_ASSERT(close_pnext!=NULL); - op_http_conn_close(stream,close_conn,close_pnext,1); - } - OP_ASSERT(stream->free_head!=NULL); - conn=stream->free_head; - /*If we can pipeline, only request a chunk of data. - If we're seeking now, there's a good chance we will want to seek again - soon, and this avoids committing this connection to reading the rest of - the stream. - Particularly with SSL or proxies, issuing a new request on the same - connection can be substantially faster than opening a new one. - This also limits the amount of data the server will blast at us on this - connection if we later seek elsewhere and start reading from a different - connection.*/ - ret=op_http_conn_open_pos(stream,conn,pos, - pipeline?OP_PIPELINE_CHUNK_SIZE:-1); - if(OP_UNLIKELY(ret<0)){ - op_http_conn_close(stream,conn,&stream->lru_head,1); - return -1; - } - return 0; -} - -static opus_int64 op_http_stream_tell(void *_stream){ - OpusHTTPStream *stream; - int ci; - stream=(OpusHTTPStream *)_stream; - ci=stream->cur_conni; - return ci<0?stream->pos:stream->conns[ci].pos; -} - -static int op_http_stream_close(void *_stream){ - OpusHTTPStream *stream; - stream=(OpusHTTPStream *)_stream; - if(OP_LIKELY(stream!=NULL)){ - op_http_stream_clear(stream); - _ogg_free(stream); - } - return 0; -} - -static const OpusFileCallbacks OP_HTTP_CALLBACKS={ - op_http_stream_read, - op_http_stream_seek, - op_http_stream_tell, - op_http_stream_close -}; -#endif - -void opus_server_info_init(OpusServerInfo *_info){ - _info->name=NULL; - _info->description=NULL; - _info->genre=NULL; - _info->url=NULL; - _info->server=NULL; - _info->content_type=NULL; - _info->bitrate_kbps=-1; - _info->is_public=-1; - _info->is_ssl=0; -} - -void opus_server_info_clear(OpusServerInfo *_info){ - _ogg_free(_info->content_type); - _ogg_free(_info->server); - _ogg_free(_info->url); - _ogg_free(_info->genre); - _ogg_free(_info->description); - _ogg_free(_info->name); -} - -/*The actual URL stream creation function. - This one isn't extensible like the application-level interface, but because - it isn't public, we're free to change it in the future.*/ -static void *op_url_stream_create_impl(OpusFileCallbacks *_cb,const char *_url, - int _skip_certificate_check,const char *_proxy_host,unsigned _proxy_port, - const char *_proxy_user,const char *_proxy_pass,OpusServerInfo *_info){ - const char *path; - /*Check to see if this is a valid file: URL.*/ - path=op_parse_file_url(_url); - if(path!=NULL){ - char *unescaped_path; - void *ret; - unescaped_path=op_string_dup(path); - if(OP_UNLIKELY(unescaped_path==NULL))return NULL; - ret=op_fopen(_cb,op_unescape_url_component(unescaped_path),"rb"); - _ogg_free(unescaped_path); - return ret; - } -#if defined(OP_ENABLE_HTTP) - /*If not, try http/https.*/ - else{ - OpusHTTPStream *stream; - int ret; - stream=(OpusHTTPStream *)_ogg_malloc(sizeof(*stream)); - if(OP_UNLIKELY(stream==NULL))return NULL; - op_http_stream_init(stream); - ret=op_http_stream_open(stream,_url,_skip_certificate_check, - _proxy_host,_proxy_port,_proxy_user,_proxy_pass,_info); - if(OP_UNLIKELY(ret<0)){ - op_http_stream_clear(stream); - _ogg_free(stream); - return NULL; - } - *_cb=*&OP_HTTP_CALLBACKS; - return stream; - } -#else - (void)_skip_certificate_check; - (void)_proxy_host; - (void)_proxy_port; - (void)_proxy_user; - (void)_proxy_pass; - (void)_info; - return NULL; -#endif -} - -void *op_url_stream_vcreate(OpusFileCallbacks *_cb, - const char *_url,va_list _ap){ - int skip_certificate_check; - const char *proxy_host; - opus_int32 proxy_port; - const char *proxy_user; - const char *proxy_pass; - OpusServerInfo *pinfo; - skip_certificate_check=0; - proxy_host=NULL; - proxy_port=8080; - proxy_user=NULL; - proxy_pass=NULL; - pinfo=NULL; - for(;;){ - ptrdiff_t request; - request=va_arg(_ap,char *)-(char *)NULL; - /*If we hit NULL, we're done processing options.*/ - if(!request)break; - switch(request){ - case OP_SSL_SKIP_CERTIFICATE_CHECK_REQUEST:{ - skip_certificate_check=!!va_arg(_ap,opus_int32); - }break; - case OP_HTTP_PROXY_HOST_REQUEST:{ - proxy_host=va_arg(_ap,const char *); - }break; - case OP_HTTP_PROXY_PORT_REQUEST:{ - proxy_port=va_arg(_ap,opus_int32); - if(proxy_port<0||proxy_port>(opus_int32)65535)return NULL; - }break; - case OP_HTTP_PROXY_USER_REQUEST:{ - proxy_user=va_arg(_ap,const char *); - }break; - case OP_HTTP_PROXY_PASS_REQUEST:{ - proxy_pass=va_arg(_ap,const char *); - }break; - case OP_GET_SERVER_INFO_REQUEST:{ - pinfo=va_arg(_ap,OpusServerInfo *); - }break; - /*Some unknown option.*/ - default:return NULL; - } - } - /*If the caller has requested server information, proxy it to a local copy to - simplify error handling.*/ - if(pinfo!=NULL){ - OpusServerInfo info; - void *ret; - opus_server_info_init(&info); - ret=op_url_stream_create_impl(_cb,_url,skip_certificate_check, - proxy_host,proxy_port,proxy_user,proxy_pass,&info); - if(ret!=NULL)*pinfo=*&info; - else opus_server_info_clear(&info); - return ret; - } - return op_url_stream_create_impl(_cb,_url,skip_certificate_check, - proxy_host,proxy_port,proxy_user,proxy_pass,NULL); -} - -void *op_url_stream_create(OpusFileCallbacks *_cb, - const char *_url,...){ - va_list ap; - void *ret; - va_start(ap,_url); - ret=op_url_stream_vcreate(_cb,_url,ap); - va_end(ap); - return ret; -} - -/*Convenience routines to open/test URLs in a single step.*/ - -OggOpusFile *op_vopen_url(const char *_url,int *_error,va_list _ap){ - OpusFileCallbacks cb; - OggOpusFile *of; - void *source; - source=op_url_stream_vcreate(&cb,_url,_ap); - if(OP_UNLIKELY(source==NULL)){ - if(_error!=NULL)*_error=OP_EFAULT; - return NULL; - } - of=op_open_callbacks(source,&cb,NULL,0,_error); - if(OP_UNLIKELY(of==NULL))(*cb.close)(source); - return of; -} - -OggOpusFile *op_open_url(const char *_url,int *_error,...){ - OggOpusFile *ret; - va_list ap; - va_start(ap,_error); - ret=op_vopen_url(_url,_error,ap); - va_end(ap); - return ret; -} - -OggOpusFile *op_vtest_url(const char *_url,int *_error,va_list _ap){ - OpusFileCallbacks cb; - OggOpusFile *of; - void *source; - source=op_url_stream_vcreate(&cb,_url,_ap); - if(OP_UNLIKELY(source==NULL)){ - if(_error!=NULL)*_error=OP_EFAULT; - return NULL; - } - of=op_test_callbacks(source,&cb,NULL,0,_error); - if(OP_UNLIKELY(of==NULL))(*cb.close)(source); - return of; -} - -OggOpusFile *op_test_url(const char *_url,int *_error,...){ - OggOpusFile *ret; - va_list ap; - va_start(ap,_error); - ret=op_vtest_url(_url,_error,ap); - va_end(ap); - return ret; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/src/include/internal.h b/sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/src/include/internal.h deleted file mode 100644 index 08114919..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/src/include/internal.h +++ /dev/null @@ -1,249 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE libopusfile SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE libopusfile SOURCE CODE IS (C) COPYRIGHT 2012 * - * by the Xiph.Org Foundation and contributors http://www.xiph.org/ * - * * - ********************************************************************/ -#if !defined(_opusfile_internal_h) -# define _opusfile_internal_h (1) - -# if !defined(_REENTRANT) -# define _REENTRANT -# endif -# if !defined(_GNU_SOURCE) -# define _GNU_SOURCE -# endif -# if !defined(_LARGEFILE_SOURCE) -# define _LARGEFILE_SOURCE -# endif -# if !defined(_LARGEFILE64_SOURCE) -# define _LARGEFILE64_SOURCE -# endif -# if !defined(_FILE_OFFSET_BITS) -# define _FILE_OFFSET_BITS 64 -# endif - -# include -# include - -typedef struct OggOpusLink OggOpusLink; - -# if defined(OP_FIXED_POINT) - -typedef opus_int16 op_sample; - -# else - -typedef float op_sample; - -/*We're using this define to test for libopus 1.1 or later until libopus - provides a better mechanism.*/ -# if defined(OPUS_GET_EXPERT_FRAME_DURATION_REQUEST) -/*Enable soft clipping prevention in 16-bit decodes.*/ -# define OP_SOFT_CLIP (1) -# endif - -# endif - -# if OP_GNUC_PREREQ(4,2) -/*Disable excessive warnings about the order of operations.*/ -# pragma GCC diagnostic ignored "-Wparentheses" -# elif defined(_MSC_VER) -/*Disable excessive warnings about the order of operations.*/ -# pragma warning(disable:4554) -/*Disable warnings about "deprecated" POSIX functions.*/ -# pragma warning(disable:4996) -# endif - -# if OP_GNUC_PREREQ(3,0) -/*Another alternative is - (__builtin_constant_p(_x)?!!(_x):__builtin_expect(!!(_x),1)) - but that evaluates _x multiple times, which may be bad.*/ -# define OP_LIKELY(_x) (__builtin_expect(!!(_x),1)) -# define OP_UNLIKELY(_x) (__builtin_expect(!!(_x),0)) -# else -# define OP_LIKELY(_x) (!!(_x)) -# define OP_UNLIKELY(_x) (!!(_x)) -# endif - -# if defined(OP_ENABLE_ASSERTIONS) -# if OP_GNUC_PREREQ(2,5)||__SUNPRO_C>=0x590 -__attribute__((noreturn)) -# endif -void op_fatal_impl(const char *_str,const char *_file,int _line); - -# define OP_FATAL(_str) (op_fatal_impl(_str,__FILE__,__LINE__)) - -# define OP_ASSERT(_cond) \ - do{ \ - if(OP_UNLIKELY(!(_cond)))OP_FATAL("assertion failed: " #_cond); \ - } \ - while(0) -# define OP_ALWAYS_TRUE(_cond) OP_ASSERT(_cond) - -# else -# define OP_FATAL(_str) abort() -# define OP_ASSERT(_cond) -# define OP_ALWAYS_TRUE(_cond) ((void)(_cond)) -# endif - -# define OP_INT64_MAX (2*(((ogg_int64_t)1<<62)-1)|1) -# define OP_INT64_MIN (-OP_INT64_MAX-1) -# define OP_INT32_MAX (2*(((ogg_int32_t)1<<30)-1)|1) -# define OP_INT32_MIN (-OP_INT32_MAX-1) - -# define OP_MIN(_a,_b) ((_a)<(_b)?(_a):(_b)) -# define OP_MAX(_a,_b) ((_a)>(_b)?(_a):(_b)) -# define OP_CLAMP(_lo,_x,_hi) (OP_MAX(_lo,OP_MIN(_x,_hi))) - -/*Advance a file offset by the given amount, clamping against OP_INT64_MAX. - This is used to advance a known offset by things like OP_CHUNK_SIZE or - OP_PAGE_SIZE_MAX, while making sure to avoid signed overflow. - It assumes that both _offset and _amount are non-negative.*/ -#define OP_ADV_OFFSET(_offset,_amount) \ - (OP_MIN(_offset,OP_INT64_MAX-(_amount))+(_amount)) - -/*The maximum channel count for any mapping we'll actually decode.*/ -# define OP_NCHANNELS_MAX (8) - -/*Initial state.*/ -# define OP_NOTOPEN (0) -/*We've found the first Opus stream in the first link.*/ -# define OP_PARTOPEN (1) -# define OP_OPENED (2) -/*We've found the first Opus stream in the current link.*/ -# define OP_STREAMSET (3) -/*We've initialized the decoder for the chosen Opus stream in the current - link.*/ -# define OP_INITSET (4) - -/*Information cached for a single link in a chained Ogg Opus file. - We choose the first Opus stream encountered in each link to play back (and - require at least one).*/ -struct OggOpusLink{ - /*The byte offset of the first header page in this link.*/ - opus_int64 offset; - /*The byte offset of the first data page from the chosen Opus stream in this - link (after the headers).*/ - opus_int64 data_offset; - /*The byte offset of the last page from the chosen Opus stream in this link. - This is used when seeking to ensure we find a page before the last one, so - that end-trimming calculations work properly. - This is only valid for seekable sources.*/ - opus_int64 end_offset; - /*The granule position of the last sample. - This is only valid for seekable sources.*/ - ogg_int64_t pcm_end; - /*The granule position before the first sample.*/ - ogg_int64_t pcm_start; - /*The serial number.*/ - ogg_uint32_t serialno; - /*The contents of the info header.*/ - OpusHead head; - /*The contents of the comment header.*/ - OpusTags tags; -}; - -struct OggOpusFile{ - /*The callbacks used to access the data source.*/ - OpusFileCallbacks callbacks; - /*A FILE *, memory bufer, etc.*/ - void *source; - /*Whether or not we can seek with this data source.*/ - int seekable; - /*The number of links in this chained Ogg Opus file.*/ - int nlinks; - /*The cached information from each link in a chained Ogg Opus file. - If source isn't seekable (e.g., it's a pipe), only the current link - appears.*/ - OggOpusLink *links; - /*The number of serial numbers from a single link.*/ - int nserialnos; - /*The capacity of the list of serial numbers from a single link.*/ - int cserialnos; - /*Storage for the list of serial numbers from a single link.*/ - ogg_uint32_t *serialnos; - /*This is the current offset of the data processed by the ogg_sync_state. - After a seek, this should be set to the target offset so that we can track - the byte offsets of subsequent pages. - After a call to op_get_next_page(), this will point to the first byte after - that page.*/ - opus_int64 offset; - /*The total size of this data source, or -1 if it's unseekable.*/ - opus_int64 end; - /*Used to locate pages in the data source.*/ - ogg_sync_state oy; - /*One of OP_NOTOPEN, OP_PARTOPEN, OP_OPENED, OP_STREAMSET, OP_INITSET.*/ - int ready_state; - /*The current link being played back.*/ - int cur_link; - /*The number of decoded samples to discard from the start of decoding.*/ - opus_int32 cur_discard_count; - /*The granule position of the previous packet (current packet start time).*/ - ogg_int64_t prev_packet_gp; - /*The number of bytes read since the last bitrate query, including framing.*/ - opus_int64 bytes_tracked; - /*The number of samples decoded since the last bitrate query.*/ - ogg_int64_t samples_tracked; - /*Takes physical pages and welds them into a logical stream of packets.*/ - ogg_stream_state os; - /*Re-timestamped packets from a single page. - Buffering these relies on the undocumented libogg behavior that ogg_packet - pointers remain valid until the next page is submitted to the - ogg_stream_state they came from.*/ - ogg_packet op[255]; - /*The index of the next packet to return.*/ - int op_pos; - /*The total number of packets available.*/ - int op_count; - /*Central working state for the packet-to-PCM decoder.*/ - OpusMSDecoder *od; - /*The application-provided packet decode callback.*/ - op_decode_cb_func decode_cb; - /*The application-provided packet decode callback context.*/ - void *decode_cb_ctx; - /*The stream count used to initialize the decoder.*/ - int od_stream_count; - /*The coupled stream count used to initialize the decoder.*/ - int od_coupled_count; - /*The channel count used to initialize the decoder.*/ - int od_channel_count; - /*The channel mapping used to initialize the decoder.*/ - unsigned char od_mapping[OP_NCHANNELS_MAX]; - /*The buffered data for one decoded packet.*/ - op_sample *od_buffer; - /*The current position in the decoded buffer.*/ - int od_buffer_pos; - /*The number of valid samples in the decoded buffer.*/ - int od_buffer_size; - /*The type of gain offset to apply. - One of OP_HEADER_GAIN, OP_TRACK_GAIN, or OP_ABSOLUTE_GAIN.*/ - int gain_type; - /*The offset to apply to the gain.*/ - opus_int32 gain_offset_q8; - /*Internal state for soft clipping and dithering float->short output.*/ -#if !defined(OP_FIXED_POINT) -# if defined(OP_SOFT_CLIP) - float clip_state[OP_NCHANNELS_MAX]; -# endif - float dither_a[OP_NCHANNELS_MAX*4]; - float dither_b[OP_NCHANNELS_MAX*4]; - opus_uint32 dither_seed; - int dither_mute; - int dither_disabled; - /*The number of channels represented by the internal state. - This gets set to 0 whenever anything that would prevent state propagation - occurs (switching between the float/short APIs, or between the - stereo/multistream APIs).*/ - int state_channel_count; -#endif -}; - -int op_strncasecmp(const char *_a,const char *_b,int _n); - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/src/include/winerrno.h b/sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/src/include/winerrno.h deleted file mode 100644 index 32a90b4e..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/src/include/winerrno.h +++ /dev/null @@ -1,90 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE libopusfile SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE libopusfile SOURCE CODE IS (C) COPYRIGHT 2012 * - * by the Xiph.Org Foundation and contributors http://www.xiph.org/ * - * * - ********************************************************************/ -#if !defined(_opusfile_winerrno_h) -# define _opusfile_winerrno_h (1) - -# include -# include - -/*These conflict with the MSVC errno.h definitions, but we don't need to use - the original ones in any file that deals with sockets. - We could map the WSA errors to the errno.h ones (most of which are only - available on sufficiently new versions of MSVC), but they aren't ordered the - same, and given how rarely we actually look at the values, I don't think - it's worth a lookup table.*/ -# undef EWOULDBLOCK -# undef EINPROGRESS -# undef EALREADY -# undef ENOTSOCK -# undef EDESTADDRREQ -# undef EMSGSIZE -# undef EPROTOTYPE -# undef ENOPROTOOPT -# undef EPROTONOSUPPORT -# undef EOPNOTSUPP -# undef EAFNOSUPPORT -# undef EADDRINUSE -# undef EADDRNOTAVAIL -# undef ENETDOWN -# undef ENETUNREACH -# undef ENETRESET -# undef ECONNABORTED -# undef ECONNRESET -# undef ENOBUFS -# undef EISCONN -# undef ENOTCONN -# undef ETIMEDOUT -# undef ECONNREFUSED -# undef ELOOP -# undef ENAMETOOLONG -# undef EHOSTUNREACH -# undef ENOTEMPTY - -# define EWOULDBLOCK (WSAEWOULDBLOCK-WSABASEERR) -# define EINPROGRESS (WSAEINPROGRESS-WSABASEERR) -# define EALREADY (WSAEALREADY-WSABASEERR) -# define ENOTSOCK (WSAENOTSOCK-WSABASEERR) -# define EDESTADDRREQ (WSAEDESTADDRREQ-WSABASEERR) -# define EMSGSIZE (WSAEMSGSIZE-WSABASEERR) -# define EPROTOTYPE (WSAEPROTOTYPE-WSABASEERR) -# define ENOPROTOOPT (WSAENOPROTOOPT-WSABASEERR) -# define EPROTONOSUPPORT (WSAEPROTONOSUPPORT-WSABASEERR) -# define ESOCKTNOSUPPORT (WSAESOCKTNOSUPPORT-WSABASEERR) -# define EOPNOTSUPP (WSAEOPNOTSUPP-WSABASEERR) -# define EPFNOSUPPORT (WSAEPFNOSUPPORT-WSABASEERR) -# define EAFNOSUPPORT (WSAEAFNOSUPPORT-WSABASEERR) -# define EADDRINUSE (WSAEADDRINUSE-WSABASEERR) -# define EADDRNOTAVAIL (WSAEADDRNOTAVAIL-WSABASEERR) -# define ENETDOWN (WSAENETDOWN-WSABASEERR) -# define ENETUNREACH (WSAENETUNREACH-WSABASEERR) -# define ENETRESET (WSAENETRESET-WSABASEERR) -# define ECONNABORTED (WSAECONNABORTED-WSABASEERR) -# define ECONNRESET (WSAECONNRESET-WSABASEERR) -# define ENOBUFS (WSAENOBUFS-WSABASEERR) -# define EISCONN (WSAEISCONN-WSABASEERR) -# define ENOTCONN (WSAENOTCONN-WSABASEERR) -# define ESHUTDOWN (WSAESHUTDOWN-WSABASEERR) -# define ETOOMANYREFS (WSAETOOMANYREFS-WSABASEERR) -# define ETIMEDOUT (WSAETIMEDOUT-WSABASEERR) -# define ECONNREFUSED (WSAECONNREFUSED-WSABASEERR) -# define ELOOP (WSAELOOP-WSABASEERR) -# define ENAMETOOLONG (WSAENAMETOOLONG-WSABASEERR) -# define EHOSTDOWN (WSAEHOSTDOWN-WSABASEERR) -# define EHOSTUNREACH (WSAEHOSTUNREACH-WSABASEERR) -# define ENOTEMPTY (WSAENOTEMPTY-WSABASEERR) -# define EPROCLIM (WSAEPROCLIM-WSABASEERR) -# define EUSERS (WSAEUSERS-WSABASEERR) -# define EDQUOT (WSAEDQUOT-WSABASEERR) -# define ESTALE (WSAESTALE-WSABASEERR) -# define EREMOTE (WSAEREMOTE-WSABASEERR) - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/src/info.c b/sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/src/info.c deleted file mode 100644 index 3134927b..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/src/info.c +++ /dev/null @@ -1,687 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE libopusfile SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE libopusfile SOURCE CODE IS (C) COPYRIGHT 2012 * - * by the Xiph.Org Foundation and contributors http://www.xiph.org/ * - * * - ********************************************************************/ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "internal.h" -#include -#include - -static unsigned op_parse_uint16le(const unsigned char *_data){ - return _data[0]|_data[1]<<8; -} - -static int op_parse_int16le(const unsigned char *_data){ - int ret; - ret=_data[0]|_data[1]<<8; - return (ret^0x8000)-0x8000; -} - -static opus_uint32 op_parse_uint32le(const unsigned char *_data){ - return _data[0]|(opus_uint32)_data[1]<<8| - (opus_uint32)_data[2]<<16|(opus_uint32)_data[3]<<24; -} - -static opus_uint32 op_parse_uint32be(const unsigned char *_data){ - return _data[3]|(opus_uint32)_data[2]<<8| - (opus_uint32)_data[1]<<16|(opus_uint32)_data[0]<<24; -} - -int opus_head_parse(OpusHead *_head,const unsigned char *_data,size_t _len){ - OpusHead head; - if(_len<8)return OP_ENOTFORMAT; - if(memcmp(_data,"OpusHead",8)!=0)return OP_ENOTFORMAT; - if(_len<9)return OP_EBADHEADER; - head.version=_data[8]; - if(head.version>15)return OP_EVERSION; - if(_len<19)return OP_EBADHEADER; - head.channel_count=_data[9]; - head.pre_skip=op_parse_uint16le(_data+10); - head.input_sample_rate=op_parse_uint32le(_data+12); - head.output_gain=op_parse_int16le(_data+16); - head.mapping_family=_data[18]; - if(head.mapping_family==0){ - if(head.channel_count<1||head.channel_count>2)return OP_EBADHEADER; - if(head.version<=1&&_len>19)return OP_EBADHEADER; - head.stream_count=1; - head.coupled_count=head.channel_count-1; - if(_head!=NULL){ - _head->mapping[0]=0; - _head->mapping[1]=1; - } - } - else if(head.mapping_family==1){ - size_t size; - int ci; - if(head.channel_count<1||head.channel_count>8)return OP_EBADHEADER; - size=21+head.channel_count; - if(_lensize)return OP_EBADHEADER; - head.stream_count=_data[19]; - if(head.stream_count<1)return OP_EBADHEADER; - head.coupled_count=_data[20]; - if(head.coupled_count>head.stream_count)return OP_EBADHEADER; - for(ci=0;ci=head.stream_count+head.coupled_count - &&_data[21+ci]!=255){ - return OP_EBADHEADER; - } - } - if(_head!=NULL)memcpy(_head->mapping,_data+21,head.channel_count); - } - /*General purpose players should not attempt to play back content with - channel mapping family 255.*/ - else if(head.mapping_family==255)return OP_EIMPL; - /*No other channel mapping families are currently defined.*/ - else return OP_EBADHEADER; - if(_head!=NULL)memcpy(_head,&head,head.mapping-(unsigned char *)&head); - return 0; -} - -void opus_tags_init(OpusTags *_tags){ - memset(_tags,0,sizeof(*_tags)); -} - -void opus_tags_clear(OpusTags *_tags){ - int ci; - for(ci=_tags->comments;ci-->0;)_ogg_free(_tags->user_comments[ci]); - _ogg_free(_tags->user_comments); - _ogg_free(_tags->comment_lengths); - _ogg_free(_tags->vendor); -} - -/*Ensure there's room for up to _ncomments comments.*/ -static int op_tags_ensure_capacity(OpusTags *_tags,size_t _ncomments){ - char **user_comments; - int *comment_lengths; - size_t size; - if(OP_UNLIKELY(_ncomments>=(size_t)INT_MAX))return OP_EFAULT; - size=sizeof(*_tags->comment_lengths)*(_ncomments+1); - if(size/sizeof(*_tags->comment_lengths)!=_ncomments+1)return OP_EFAULT; - comment_lengths=(int *)_ogg_realloc(_tags->comment_lengths,size); - if(OP_UNLIKELY(comment_lengths==NULL))return OP_EFAULT; - comment_lengths[_ncomments]=0; - _tags->comment_lengths=comment_lengths; - size=sizeof(*_tags->user_comments)*(_ncomments+1); - if(size/sizeof(*_tags->user_comments)!=_ncomments+1)return OP_EFAULT; - user_comments=(char **)_ogg_realloc(_tags->user_comments,size); - if(OP_UNLIKELY(user_comments==NULL))return OP_EFAULT; - user_comments[_ncomments]=NULL; - _tags->user_comments=user_comments; - return 0; -} - -/*Duplicate a (possibly non-NUL terminated) string with a known length.*/ -static char *op_strdup_with_len(const char *_s,size_t _len){ - size_t size; - char *ret; - size=sizeof(*ret)*(_len+1); - if(OP_UNLIKELY(size<_len))return NULL; - ret=(char *)_ogg_malloc(size); - if(OP_LIKELY(ret!=NULL)){ - ret=(char *)memcpy(ret,_s,sizeof(*ret)*_len); - ret[_len]='\0'; - } - return ret; -} - -/*The actual implementation of opus_tags_parse(). - Unlike the public API, this function requires _tags to already be - initialized, modifies its contents before success is guaranteed, and assumes - the caller will clear it on error.*/ -static int opus_tags_parse_impl(OpusTags *_tags, - const unsigned char *_data,size_t _len){ - opus_uint32 count; - size_t len; - int ncomments; - int ci; - len=_len; - if(len<8)return OP_ENOTFORMAT; - if(memcmp(_data,"OpusTags",8)!=0)return OP_ENOTFORMAT; - if(len<16)return OP_EBADHEADER; - _data+=8; - len-=8; - count=op_parse_uint32le(_data); - _data+=4; - len-=4; - if(count>len)return OP_EBADHEADER; - if(_tags!=NULL){ - _tags->vendor=op_strdup_with_len((char *)_data,count); - if(_tags->vendor==NULL)return OP_EFAULT; - } - _data+=count; - len-=count; - if(len<4)return OP_EBADHEADER; - count=op_parse_uint32le(_data); - _data+=4; - len-=4; - /*Check to make sure there's minimally sufficient data left in the packet.*/ - if(count>len>>2)return OP_EBADHEADER; - /*Check for overflow (the API limits this to an int).*/ - if(count>(opus_uint32)INT_MAX-1)return OP_EFAULT; - if(_tags!=NULL){ - int ret; - ret=op_tags_ensure_capacity(_tags,count); - if(ret<0)return ret; - } - ncomments=(int)count; - for(ci=0;cilen>>2)return OP_EBADHEADER; - count=op_parse_uint32le(_data); - _data+=4; - len-=4; - if(count>len)return OP_EBADHEADER; - /*Check for overflow (the API limits this to an int).*/ - if(count>(opus_uint32)INT_MAX)return OP_EFAULT; - if(_tags!=NULL){ - _tags->user_comments[ci]=op_strdup_with_len((char *)_data,count); - if(_tags->user_comments[ci]==NULL)return OP_EFAULT; - _tags->comment_lengths[ci]=(int)count; - _tags->comments=ci+1; - } - _data+=count; - len-=count; - } - return 0; -} - -int opus_tags_parse(OpusTags *_tags,const unsigned char *_data,size_t _len){ - if(_tags!=NULL){ - OpusTags tags; - int ret; - opus_tags_init(&tags); - ret=opus_tags_parse_impl(&tags,_data,_len); - if(ret<0)opus_tags_clear(&tags); - else *_tags=*&tags; - return ret; - } - else return opus_tags_parse_impl(NULL,_data,_len); -} - -/*The actual implementation of opus_tags_copy(). - Unlike the public API, this function requires _dst to already be - initialized, modifies its contents before success is guaranteed, and assumes - the caller will clear it on error.*/ -static int opus_tags_copy_impl(OpusTags *_dst,const OpusTags *_src){ - char *vendor; - int ncomments; - int ret; - int ci; - vendor=_src->vendor; - _dst->vendor=op_strdup_with_len(vendor,strlen(vendor)); - if(OP_UNLIKELY(_dst->vendor==NULL))return OP_EFAULT; - ncomments=_src->comments; - ret=op_tags_ensure_capacity(_dst,ncomments); - if(OP_UNLIKELY(ret<0))return ret; - for(ci=0;cicomment_lengths[ci]; - OP_ASSERT(len>=0); - _dst->user_comments[ci]=op_strdup_with_len(_src->user_comments[ci],len); - if(OP_UNLIKELY(_dst->user_comments[ci]==NULL))return OP_EFAULT; - _dst->comment_lengths[ci]=len; - _dst->comments=ci+1; - } - return 0; -} - -int opus_tags_copy(OpusTags *_dst,const OpusTags *_src){ - OpusTags dst; - int ret; - opus_tags_init(&dst); - ret=opus_tags_copy_impl(&dst,_src); - if(OP_UNLIKELY(ret<0))opus_tags_clear(&dst); - else *_dst=*&dst; - return 0; -} - -int opus_tags_add(OpusTags *_tags,const char *_tag,const char *_value){ - char *comment; - int tag_len; - int value_len; - int ncomments; - int ret; - ncomments=_tags->comments; - ret=op_tags_ensure_capacity(_tags,ncomments+1); - if(OP_UNLIKELY(ret<0))return ret; - tag_len=strlen(_tag); - value_len=strlen(_value); - /*+2 for '=' and '\0'.*/ - _tags->comment_lengths[ncomments]=0; - _tags->user_comments[ncomments]=comment= - (char *)_ogg_malloc(sizeof(*comment)*(tag_len+value_len+2)); - if(OP_UNLIKELY(comment==NULL))return OP_EFAULT; - memcpy(comment,_tag,sizeof(*comment)*tag_len); - comment[tag_len]='='; - memcpy(comment+tag_len+1,_value,sizeof(*comment)*(value_len+1)); - _tags->comment_lengths[ncomments]=tag_len+value_len+1; - _tags->comments=ncomments+1; - return 0; -} - -int opus_tags_add_comment(OpusTags *_tags,const char *_comment){ - int comment_len; - int ncomments; - int ret; - ncomments=_tags->comments; - ret=op_tags_ensure_capacity(_tags,ncomments+1); - if(OP_UNLIKELY(ret<0))return ret; - comment_len=(int)strlen(_comment); - _tags->comment_lengths[ncomments]=0; - _tags->user_comments[ncomments]=op_strdup_with_len(_comment,comment_len); - if(OP_UNLIKELY(_tags->user_comments[ncomments]==NULL))return OP_EFAULT; - _tags->comment_lengths[ncomments]=comment_len; - _tags->comments=ncomments+1; - return 0; -} - -int opus_tagcompare(const char *_tag_name,const char *_comment){ - return opus_tagncompare(_tag_name,strlen(_tag_name),_comment); -} - -int opus_tagncompare(const char *_tag_name,int _tag_len,const char *_comment){ - int ret; - OP_ASSERT(_tag_len>=0); - ret=op_strncasecmp(_tag_name,_comment,_tag_len); - return ret?ret:'='-_comment[_tag_len]; -} - -const char *opus_tags_query(const OpusTags *_tags,const char *_tag,int _count){ - char **user_comments; - int tag_len; - int found; - int ncomments; - int ci; - tag_len=strlen(_tag); - ncomments=_tags->comments; - user_comments=_tags->user_comments; - found=0; - for(ci=0;cicomments; - user_comments=_tags->user_comments; - found=0; - for(ci=0;ciuser_comments; - ncomments=_tags->comments; - /*Look for the first valid R128_TRACK_GAIN tag and use that.*/ - for(ci=0;ci='0'&&*p<='9'){ - gain_q8=10*gain_q8+*p-'0'; - if(gain_q8>32767-negative)break; - p++; - } - /*This didn't look like a signed 16-bit decimal integer. - Not a valid R128_TRACK_GAIN tag.*/ - if(*p!='\0')continue; - *_gain_q8=(int)(gain_q8+negative^negative); - return 0; - } - } - return OP_FALSE; -} - -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; -} - -/*Tries to extract the width, height, bits per pixel, and palette size of a - JPEG. - On failure, simply leaves its outputs unmodified.*/ -static void op_extract_jpeg_params(const unsigned char *_buf,size_t _buf_sz, - opus_uint32 *_width,opus_uint32 *_height, - opus_uint32 *_depth,opus_uint32 *_colors,int *_has_palette){ - if(op_is_jpeg(_buf,_buf_sz)){ - size_t offs; - offs=2; - for(;;){ - size_t segment_len; - int marker; - while(offs<_buf_sz&&_buf[offs]!=0xFF)offs++; - while(offs<_buf_sz&&_buf[offs]==0xFF)offs++; - marker=_buf[offs]; - offs++; - /*If we hit EOI* (end of image), or another SOI* (start of image), - or SOS (start of scan), then stop now.*/ - if(offs>=_buf_sz||(marker>=0xD8&&marker<=0xDA))break; - /*RST* (restart markers): skip (no segment length).*/ - else if(marker>=0xD0&&marker<=0xD7)continue; - /*Read the length of the marker segment.*/ - if(_buf_sz-offs<2)break; - segment_len=_buf[offs]<<8|_buf[offs+1]; - if(segment_len<2||_buf_sz-offs0xC0&&marker<0xD0&&(marker&3)!=0)){ - /*Found a SOFn (start of frame) marker segment:*/ - if(segment_len>=8){ - *_height=_buf[offs+3]<<8|_buf[offs+4]; - *_width=_buf[offs+5]<<8|_buf[offs+6]; - *_depth=_buf[offs+2]*_buf[offs+7]; - *_colors=0; - *_has_palette=0; - } - break; - } - /*Other markers: skip the whole marker segment.*/ - offs+=segment_len; - } - } -} - -static int op_is_png(const unsigned char *_buf,size_t _buf_sz){ - return _buf_sz>=8&&memcmp(_buf,"\x89PNG\x0D\x0A\x1A\x0A",8)==0; -} - -/*Tries to extract the width, height, bits per pixel, and palette size of a - PNG. - On failure, simply leaves its outputs unmodified.*/ -static void op_extract_png_params(const unsigned char *_buf,size_t _buf_sz, - opus_uint32 *_width,opus_uint32 *_height, - opus_uint32 *_depth,opus_uint32 *_colors,int *_has_palette){ - if(op_is_png(_buf,_buf_sz)){ - size_t offs; - offs=8; - while(_buf_sz-offs>=12){ - ogg_uint32_t chunk_len; - chunk_len=op_parse_uint32be(_buf+offs); - if(chunk_len>_buf_sz-(offs+12))break; - else if(chunk_len==13&&memcmp(_buf+offs+4,"IHDR",4)==0){ - int color_type; - *_width=op_parse_uint32be(_buf+offs+8); - *_height=op_parse_uint32be(_buf+offs+12); - color_type=_buf[offs+17]; - if(color_type==3){ - *_depth=24; - *_has_palette=1; - } - else{ - int sample_depth; - sample_depth=_buf[offs+16]; - if(color_type==0)*_depth=sample_depth; - else if(color_type==2)*_depth=sample_depth*3; - else if(color_type==4)*_depth=sample_depth*2; - else if(color_type==6)*_depth=sample_depth*4; - *_colors=0; - *_has_palette=0; - break; - } - } - else if(*_has_palette>0&&memcmp(_buf+offs+4,"PLTE",4)==0){ - *_colors=chunk_len/3; - break; - } - offs+=12+chunk_len; - } - } -} - -static int op_is_gif(const unsigned char *_buf,size_t _buf_sz){ - return _buf_sz>=6&&(memcmp(_buf,"GIF87a",6)==0||memcmp(_buf,"GIF89a",6)==0); -} - -/*Tries to extract the width, height, bits per pixel, and palette size of a - GIF. - On failure, simply leaves its outputs unmodified.*/ -static void op_extract_gif_params(const unsigned char *_buf,size_t _buf_sz, - opus_uint32 *_width,opus_uint32 *_height, - opus_uint32 *_depth,opus_uint32 *_colors,int *_has_palette){ - if(op_is_gif(_buf,_buf_sz)&&_buf_sz>=14){ - *_width=_buf[6]|_buf[7]<<8; - *_height=_buf[8]|_buf[9]<<8; - /*libFLAC hard-codes the depth to 24.*/ - *_depth=24; - *_colors=1<<((_buf[10]&7)+1); - *_has_palette=1; - } -} - -/*The actual implementation of opus_picture_tag_parse(). - Unlike the public API, this function requires _pic to already be - initialized, modifies its contents before success is guaranteed, and assumes - the caller will clear it on error.*/ -static int opus_picture_tag_parse_impl(OpusPictureTag *_pic,const char *_tag, - unsigned char *_buf,size_t _buf_sz,size_t _base64_sz){ - opus_int32 picture_type; - opus_uint32 mime_type_length; - char *mime_type; - opus_uint32 description_length; - char *description; - opus_uint32 width; - opus_uint32 height; - opus_uint32 depth; - opus_uint32 colors; - opus_uint32 data_length; - opus_uint32 file_width; - opus_uint32 file_height; - opus_uint32 file_depth; - opus_uint32 file_colors; - int format; - int has_palette; - int colors_set; - size_t i; - /*Decode the BASE64 data.*/ - for(i=0;i<_base64_sz;i++){ - opus_uint32 value; - int j; - value=0; - for(j=0;j<4;j++){ - unsigned c; - unsigned d; - c=(unsigned char)_tag[4*i+j]; - if(c=='+')d=62; - else if(c=='/')d=63; - else if(c>='0'&&c<='9')d=52+c-'0'; - else if(c>='a'&&c<='z')d=26+c-'a'; - else if(c>='A'&&c<='Z')d=c-'A'; - else if(c=='='&&3*i+j>_buf_sz)d=0; - else return OP_ENOTFORMAT; - value=value<<6|d; - } - _buf[3*i]=(unsigned char)(value>>16); - if(3*i+1<_buf_sz){ - _buf[3*i+1]=(unsigned char)(value>>8); - if(3*i+2<_buf_sz)_buf[3*i+2]=(unsigned char)value; - } - } - i=0; - picture_type=op_parse_uint32be(_buf+i); - i+=4; - /*Extract the MIME type.*/ - mime_type_length=op_parse_uint32be(_buf+i); - i+=4; - if(mime_type_length>_buf_sz-32)return OP_ENOTFORMAT; - mime_type=(char *)_ogg_malloc(sizeof(*_pic->mime_type)*(mime_type_length+1)); - if(mime_type==NULL)return OP_EFAULT; - memcpy(mime_type,_buf+i,sizeof(*mime_type)*mime_type_length); - mime_type[mime_type_length]='\0'; - _pic->mime_type=mime_type; - i+=mime_type_length; - /*Extract the description string.*/ - description_length=op_parse_uint32be(_buf+i); - i+=4; - if(description_length>_buf_sz-mime_type_length-32)return OP_ENOTFORMAT; - description= - (char *)_ogg_malloc(sizeof(*_pic->mime_type)*(description_length+1)); - if(description==NULL)return OP_EFAULT; - memcpy(description,_buf+i,sizeof(*description)*description_length); - description[description_length]='\0'; - _pic->description=description; - i+=description_length; - /*Extract the remaining fields.*/ - width=op_parse_uint32be(_buf+i); - i+=4; - height=op_parse_uint32be(_buf+i); - i+=4; - depth=op_parse_uint32be(_buf+i); - i+=4; - colors=op_parse_uint32be(_buf+i); - i+=4; - /*If one of these is set, they all must be, but colors==0 is a valid value.*/ - colors_set=width!=0||height!=0||depth!=0||colors!=0; - if((width==0||height==0||depth==0)&&colors_set)return OP_ENOTFORMAT; - data_length=op_parse_uint32be(_buf+i); - i+=4; - if(data_length>_buf_sz-i)return OP_ENOTFORMAT; - /*Trim extraneous data so we don't copy it below.*/ - _buf_sz=i+data_length; - /*Attempt to determine the image format.*/ - format=OP_PIC_FORMAT_UNKNOWN; - if(mime_type_length==3&&strcmp(mime_type,"-->")==0){ - format=OP_PIC_FORMAT_URL; - /*Picture type 1 must be a 32x32 PNG.*/ - if(picture_type==1&&(width!=0||height!=0)&&(width!=32||height!=32)){ - return OP_ENOTFORMAT; - } - /*Append a terminating NUL for the convenience of our callers.*/ - _buf[_buf_sz++]='\0'; - } - else{ - if(mime_type_length==10 - &&op_strncasecmp(mime_type,"image/jpeg",mime_type_length)==0){ - if(op_is_jpeg(_buf+i,data_length))format=OP_PIC_FORMAT_JPEG; - } - else if(mime_type_length==9 - &&op_strncasecmp(mime_type,"image/png",mime_type_length)==0){ - if(op_is_png(_buf+i,data_length))format=OP_PIC_FORMAT_PNG; - } - else if(mime_type_length==9 - &&op_strncasecmp(mime_type,"image/gif",mime_type_length)==0){ - if(op_is_gif(_buf+i,data_length))format=OP_PIC_FORMAT_GIF; - } - else if(mime_type_length==0||(mime_type_length==6 - &&op_strncasecmp(mime_type,"image/",mime_type_length)==0)){ - if(op_is_jpeg(_buf+i,data_length))format=OP_PIC_FORMAT_JPEG; - else if(op_is_png(_buf+i,data_length))format=OP_PIC_FORMAT_PNG; - else if(op_is_gif(_buf+i,data_length))format=OP_PIC_FORMAT_GIF; - } - file_width=file_height=file_depth=file_colors=0; - has_palette=-1; - switch(format){ - case OP_PIC_FORMAT_JPEG:{ - op_extract_jpeg_params(_buf+i,data_length, - &file_width,&file_height,&file_depth,&file_colors,&has_palette); - }break; - case OP_PIC_FORMAT_PNG:{ - op_extract_png_params(_buf+i,data_length, - &file_width,&file_height,&file_depth,&file_colors,&has_palette); - }break; - case OP_PIC_FORMAT_GIF:{ - op_extract_gif_params(_buf+i,data_length, - &file_width,&file_height,&file_depth,&file_colors,&has_palette); - }break; - } - if(has_palette>=0){ - /*If we successfully extracted these parameters from the image, override - any declared values.*/ - width=file_width; - height=file_height; - depth=file_depth; - colors=file_colors; - } - /*Picture type 1 must be a 32x32 PNG.*/ - if(picture_type==1&&(format!=OP_PIC_FORMAT_PNG||width!=32||height!=32)){ - return OP_ENOTFORMAT; - } - } - /*Adjust _buf_sz instead of using data_length to capture the terminating NUL - for URLs.*/ - _buf_sz-=i; - memmove(_buf,_buf+i,sizeof(*_buf)*_buf_sz); - _buf=(unsigned char *)_ogg_realloc(_buf,_buf_sz); - if(_buf_sz>0&&_buf==NULL)return OP_EFAULT; - _pic->type=picture_type; - _pic->width=width; - _pic->height=height; - _pic->depth=depth; - _pic->colors=colors; - _pic->data_length=data_length; - _pic->data=_buf; - _pic->format=format; - return 0; -} - -int opus_picture_tag_parse(OpusPictureTag *_pic,const char *_tag){ - OpusPictureTag pic; - unsigned char *buf; - size_t base64_sz; - size_t buf_sz; - size_t tag_length; - int ret; - if(opus_tagncompare("METADATA_BLOCK_PICTURE",22,_tag)==0)_tag+=23; - /*Figure out how much BASE64-encoded data we have.*/ - tag_length=strlen(_tag); - if(tag_length&3)return OP_ENOTFORMAT; - base64_sz=tag_length>>2; - buf_sz=3*base64_sz; - if(buf_sz<32)return OP_ENOTFORMAT; - if(_tag[tag_length-1]=='=')buf_sz--; - if(_tag[tag_length-2]=='=')buf_sz--; - if(buf_sz<32)return OP_ENOTFORMAT; - /*Allocate an extra byte to allow appending a terminating NUL to URL data.*/ - buf=(unsigned char *)_ogg_malloc(sizeof(*buf)*(buf_sz+1)); - if(buf==NULL)return OP_EFAULT; - opus_picture_tag_init(&pic); - ret=opus_picture_tag_parse_impl(&pic,_tag,buf,buf_sz,base64_sz); - if(ret<0){ - opus_picture_tag_clear(&pic); - _ogg_free(buf); - } - else *_pic=*&pic; - return ret; -} - -void opus_picture_tag_init(OpusPictureTag *_pic){ - memset(_pic,0,sizeof(*_pic)); -} - -void opus_picture_tag_clear(OpusPictureTag *_pic){ - _ogg_free(_pic->description); - _ogg_free(_pic->mime_type); - _ogg_free(_pic->data); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/src/internal.c b/sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/src/internal.c deleted file mode 100644 index 96c80def..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/src/internal.c +++ /dev/null @@ -1,42 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE libopusfile SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE libopusfile SOURCE CODE IS (C) COPYRIGHT 2012 * - * by the Xiph.Org Foundation and contributors http://www.xiph.org/ * - * * - ********************************************************************/ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "internal.h" - -#if defined(OP_ENABLE_ASSERTIONS) -void op_fatal_impl(const char *_str,const char *_file,int _line){ - fprintf(stderr,"Fatal (internal) error in %s, line %i: %s\n", - _file,_line,_str); - abort(); -} -#endif - -/*A version of strncasecmp() that is guaranteed to only ignore the case of - ASCII characters.*/ -int op_strncasecmp(const char *_a,const char *_b,int _n){ - int i; - for(i=0;i<_n;i++){ - int a; - int b; - int d; - a=_a[i]; - b=_b[i]; - if(a>='a'&&a<='z')a-='a'-'A'; - if(b>='a'&&b<='z')b-='a'-'A'; - d=a-b; - if(d)return d; - } - return 0; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/src/opusfile.c b/sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/src/opusfile.c deleted file mode 100644 index 1441b97f..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/src/opusfile.c +++ /dev/null @@ -1,3158 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE libopusfile SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE libopusfile SOURCE CODE IS (C) COPYRIGHT 1994-2012 * - * by the Xiph.Org Foundation and contributors http://www.xiph.org/ * - * * - ******************************************************************** - - function: stdio-based convenience library for opening/seeking/decoding - last mod: $Id: vorbisfile.c 17573 2010-10-27 14:53:59Z xiphmont $ - - ********************************************************************/ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "internal.h" -#include -#include -#include -#include -#include -#include - -#include "opusfile.h" - -/*This implementation is largely based off of libvorbisfile. - All of the Ogg bits work roughly the same, though I have made some - "improvements" that have not been folded back there, yet.*/ - -/*A 'chained bitstream' is an Ogg Opus bitstream that contains more than one - logical bitstream arranged end to end (the only form of Ogg multiplexing - supported by this library. - Grouping (parallel multiplexing) is not supported, except to the extent that - if there are multiple logical Ogg streams in a single link of the chain, we - will ignore all but the first Opus stream we find.*/ - -/*An Ogg Opus file can be played beginning to end (streamed) without worrying - ahead of time about chaining (see opusdec from the opus-tools package). - If we have the whole file, however, and want random access - (seeking/scrubbing) or desire to know the total length/time of a file, we - need to account for the possibility of chaining.*/ - -/*We can handle things a number of ways. - We can determine the entire bitstream structure right off the bat, or find - pieces on demand. - This library determines and caches structure for the entire bitstream, but - builds a virtual decoder on the fly when moving between links in the chain.*/ - -/*There are also different ways to implement seeking. - Enough information exists in an Ogg bitstream to seek to sample-granularity - positions in the output. - Or, one can seek by picking some portion of the stream roughly in the desired - area if we only want coarse navigation through the stream. - We implement and expose both strategies.*/ - -/*The maximum number of bytes in a page (including the page headers).*/ -#define OP_PAGE_SIZE_MAX (65307) -/*The default amount to seek backwards per step when trying to find the - previous page. - This must be at least as large as the maximum size of a page.*/ -#define OP_CHUNK_SIZE (65536) -/*The maximum amount to seek backwards per step when trying to find the - previous page.*/ -#define OP_CHUNK_SIZE_MAX (1024*(opus_int32)1024) -/*A smaller read size is needed for low-rate streaming.*/ -#define OP_READ_SIZE (2048) - -int op_test(OpusHead *_head, - const unsigned char *_initial_data,size_t _initial_bytes){ - ogg_sync_state oy; - char *data; - int err; - /*The first page of a normal Opus file will be at most 57 bytes (27 Ogg - page header bytes + 1 lacing value + 21 Opus header bytes + 8 channel - mapping bytes). - It will be at least 47 bytes (27 Ogg page header bytes + 1 lacing value + - 19 Opus header bytes using channel mapping family 0). - If we don't have at least that much data, give up now.*/ - if(_initial_bytes<47)return OP_FALSE; - /*Only proceed if we start with the magic OggS string. - This is to prevent us spending a lot of time allocating memory and looking - for Ogg pages in non-Ogg files.*/ - if(memcmp(_initial_data,"OggS",4)!=0)return OP_ENOTFORMAT; - ogg_sync_init(&oy); - data=ogg_sync_buffer(&oy,_initial_bytes); - if(data!=NULL){ - ogg_stream_state os; - ogg_page og; - int ret; - memcpy(data,_initial_data,_initial_bytes); - ogg_sync_wrote(&oy,_initial_bytes); - ogg_stream_init(&os,-1); - err=OP_FALSE; - do{ - ogg_packet op; - ret=ogg_sync_pageout(&oy,&og); - /*Ignore holes.*/ - if(ret<0)continue; - /*Stop if we run out of data.*/ - if(!ret)break; - ogg_stream_reset_serialno(&os,ogg_page_serialno(&og)); - ogg_stream_pagein(&os,&og); - /*Only process the first packet on this page (if it's a BOS packet, - it's required to be the only one).*/ - if(ogg_stream_packetout(&os,&op)==1){ - if(op.b_o_s){ - ret=opus_head_parse(_head,op.packet,op.bytes); - /*If this didn't look like Opus, keep going.*/ - if(ret==OP_ENOTFORMAT)continue; - /*Otherwise we're done, one way or another.*/ - err=ret; - } - /*We finished parsing the headers. - There is no Opus to be found.*/ - else err=OP_ENOTFORMAT; - } - } - while(err==OP_FALSE); - ogg_stream_clear(&os); - } - else err=OP_EFAULT; - ogg_sync_clear(&oy); - return err; -} - -/*Many, many internal helpers. - The intention is not to be confusing. - Rampant duplication and monolithic function implementation (though we do have - some large, omnibus functions still) would be harder to understand anyway. - The high level functions are last. - Begin grokking near the end of the file if you prefer to read things - top-down.*/ - -/*The read/seek functions track absolute position within the stream.*/ - -/*Read a little more data from the file/pipe into the ogg_sync framer. - _nbytes: The maximum number of bytes to read. - Return: A positive number of bytes read on success, 0 on end-of-file, or a - negative value on failure.*/ -static int op_get_data(OggOpusFile *_of,int _nbytes){ - unsigned char *buffer; - int nbytes; - OP_ASSERT(_nbytes>0); - buffer=(unsigned char *)ogg_sync_buffer(&_of->oy,_nbytes); - nbytes=(int)(*_of->callbacks.read)(_of->source,buffer,_nbytes); - OP_ASSERT(nbytes<=_nbytes); - if(OP_LIKELY(nbytes>0))ogg_sync_wrote(&_of->oy,nbytes); - return nbytes; -} - -/*Save a tiny smidge of verbosity to make the code more readable.*/ -static int op_seek_helper(OggOpusFile *_of,opus_int64 _offset){ - if(_offset==_of->offset)return 0; - if(_of->callbacks.seek==NULL - ||(*_of->callbacks.seek)(_of->source,_offset,SEEK_SET)){ - return OP_EREAD; - } - _of->offset=_offset; - ogg_sync_reset(&_of->oy); - return 0; -} - -/*Get the current position indicator of the underlying source. - This should be the same as the value reported by tell().*/ -static opus_int64 op_position(const OggOpusFile *_of){ - /*The current position indicator is _not_ simply offset. - We may also have unprocessed, buffered data in the sync state.*/ - return _of->offset+_of->oy.fill-_of->oy.returned; -} - -/*From the head of the stream, get the next page. - _boundary specifies if the function is allowed to fetch more data from the - stream (and how much) or only use internally buffered data. - _boundary: -1: Unbounded search. - 0: Read no additional data. - Use only cached data. - n: Search for the start of a new page up to file position n. - Return: n>=0: Found a page at absolute offset n. - OP_FALSE: Hit the _boundary limit. - OP_EREAD: An underlying read operation failed. - OP_BADLINK: We hit end-of-file before reaching _boundary.*/ -static opus_int64 op_get_next_page(OggOpusFile *_of,ogg_page *_og, - opus_int64 _boundary){ - while(_boundary<=0||_of->offset<_boundary){ - int more; - more=ogg_sync_pageseek(&_of->oy,_og); - /*Skipped (-more) bytes.*/ - if(OP_UNLIKELY(more<0))_of->offset-=more; - else if(more==0){ - int read_nbytes; - int ret; - /*Send more paramedics.*/ - if(!_boundary)return OP_FALSE; - if(_boundary<0)read_nbytes=OP_READ_SIZE; - else{ - opus_int64 position; - position=op_position(_of); - if(position>=_boundary)return OP_FALSE; - read_nbytes=(int)OP_MIN(_boundary-position,OP_READ_SIZE); - } - ret=op_get_data(_of,read_nbytes); - if(OP_UNLIKELY(ret<0))return OP_EREAD; - if(OP_UNLIKELY(ret==0)){ - /*Only fail cleanly on EOF if we didn't have a known boundary. - Otherwise, we should have been able to reach that boundary, and this - is a fatal error.*/ - return OP_UNLIKELY(_boundary<0)?OP_FALSE:OP_EBADLINK; - } - } - else{ - /*Got a page. - Return the page start offset and advance the internal offset past the - page end.*/ - opus_int64 page_offset; - page_offset=_of->offset; - _of->offset+=more; - OP_ASSERT(page_offset>=0); - return page_offset; - } - } - return OP_FALSE; -} - -static int op_add_serialno(const ogg_page *_og, - ogg_uint32_t **_serialnos,int *_nserialnos,int *_cserialnos){ - ogg_uint32_t *serialnos; - int nserialnos; - int cserialnos; - ogg_uint32_t s; - s=ogg_page_serialno(_og); - serialnos=*_serialnos; - nserialnos=*_nserialnos; - cserialnos=*_cserialnos; - if(OP_UNLIKELY(nserialnos>=cserialnos)){ - if(OP_UNLIKELY(cserialnos>INT_MAX-1>>1))return OP_EFAULT; - cserialnos=2*cserialnos+1; - OP_ASSERT(nserialnos=OP_PAGE_SIZE_MAX); - begin=OP_MAX(begin-chunk_size,0); - ret=op_seek_helper(_of,begin); - if(OP_UNLIKELY(ret<0))return ret; - search_start=begin; - while(_of->offsetsearch_start=search_start; - _sr->offset=_offset=llret; - _sr->serialno=serialno; - OP_ASSERT(_of->offset-_offset>=0); - OP_ASSERT(_of->offset-_offset<=OP_PAGE_SIZE_MAX); - _sr->size=(opus_int32)(_of->offset-_offset); - _sr->gp=ogg_page_granulepos(&og); - /*If this page is from the stream we're looking for, remember it.*/ - if(serialno==_serialno){ - preferred_found=1; - *&preferred_sr=*_sr; - } - if(!op_lookup_serialno(serialno,_serialnos,_nserialnos)){ - /*We fell off the end of the link, which means we seeked back too far - and shouldn't have been looking in that link to begin with. - If we found the preferred serial number, forget that we saw it.*/ - preferred_found=0; - } - search_start=llret+1; - } - /*We started from the beginning of the stream and found nothing. - This should be impossible unless the contents of the source changed out - from under us after we read from it.*/ - if(OP_UNLIKELY(!begin)&&OP_UNLIKELY(_offset<0))return OP_EBADLINK; - /*Bump up the chunk size. - This is mildly helpful when seeks are very expensive (http).*/ - chunk_size=OP_MIN(2*chunk_size,OP_CHUNK_SIZE_MAX); - /*Avoid quadratic complexity if we hit an invalid patch of the file.*/ - end=OP_MIN(begin+OP_PAGE_SIZE_MAX-1,original_end); - } - while(_offset<0); - if(preferred_found)*_sr=*&preferred_sr; - return 0; -} - -/*Find the last page beginning before _offset with the given serial number and - a valid granule position. - Unlike the above search, this continues until it finds such a page, but does - not stray outside the current link. - We could implement it (inefficiently) by calling op_get_prev_page_serial() - repeatedly until it returned a page that had both our preferred serial - number and a valid granule position, but doing it with a separate function - allows us to avoid repeatedly re-scanning valid pages from other streams as - we seek-back-and-read-forward. - [out] _gp: Returns the granule position of the page that was found on - success. - _offset: The _offset before which to find a page. - Any page returned will consist of data entirely before _offset. - _serialno: The target serial number. - _serialnos: The list of serial numbers in the link that contains the - preferred serial number. - _nserialnos: The number of serial numbers in the current link. - Return: The offset of the page on success, or a negative value on failure. - OP_EREAD: Failed to read more data (error or EOF). - OP_EBADLINK: We couldn't find a page even after seeking back past the - beginning of the link.*/ -static opus_int64 op_get_last_page(OggOpusFile *_of,ogg_int64_t *_gp, - opus_int64 _offset,ogg_uint32_t _serialno, - const ogg_uint32_t *_serialnos,int _nserialnos){ - ogg_page og; - ogg_int64_t gp; - opus_int64 begin; - opus_int64 end; - opus_int64 original_end; - opus_int32 chunk_size; - /*The target serial number must belong to the current link.*/ - OP_ASSERT(op_lookup_serialno(_serialno,_serialnos,_nserialnos)); - original_end=end=begin=_offset; - _offset=-1; - /*We shouldn't have to initialize gp, but gcc is too dumb to figure out that - ret>=0 implies we entered the if(page_gp!=-1) block at least once.*/ - gp=-1; - chunk_size=OP_CHUNK_SIZE; - do{ - int left_link; - int ret; - OP_ASSERT(chunk_size>=OP_PAGE_SIZE_MAX); - begin=OP_MAX(begin-chunk_size,0); - ret=op_seek_helper(_of,begin); - if(OP_UNLIKELY(ret<0))return ret; - left_link=0; - while(_of->offsetready_stateos,ogg_page_serialno(_og)); - ogg_stream_pagein(&_of->os,_og); - if(OP_LIKELY(ogg_stream_packetout(&_of->os,&op)>0)){ - ret=opus_head_parse(_head,op.packet,op.bytes); - /*Found a valid Opus header. - Continue setup.*/ - if(OP_LIKELY(ret>=0))_of->ready_state=OP_STREAMSET; - /*If it's just a stream type we don't recognize, ignore it. - Everything else is fatal.*/ - else if(ret!=OP_ENOTFORMAT)return ret; - } - } - /*Get the next page. - No need to clamp the boundary offset against _of->end, as all errors - become OP_ENOTFORMAT or OP_EBADHEADER.*/ - if(OP_UNLIKELY(op_get_next_page(_of,_og, - OP_ADV_OFFSET(_of->offset,OP_CHUNK_SIZE))<0)){ - return _of->ready_stateready_state!=OP_STREAMSET))return OP_ENOTFORMAT; - /*If the first non-header page belonged to our Opus stream, submit it.*/ - if(_of->os.serialno==ogg_page_serialno(_og))ogg_stream_pagein(&_of->os,_og); - /*Loop getting packets.*/ - for(;;){ - switch(ogg_stream_packetout(&_of->os,&op)){ - case 0:{ - /*Loop getting pages.*/ - for(;;){ - /*No need to clamp the boundary offset against _of->end, as all - errors become OP_EBADHEADER.*/ - if(OP_UNLIKELY(op_get_next_page(_of,_og, - OP_ADV_OFFSET(_of->offset,OP_CHUNK_SIZE))<0)){ - return OP_EBADHEADER; - } - /*If this page belongs to the correct stream, go parse it.*/ - if(_of->os.serialno==ogg_page_serialno(_og)){ - ogg_stream_pagein(&_of->os,_og); - break; - } - /*If the link ends before we see the Opus comment header, abort.*/ - if(OP_UNLIKELY(ogg_page_bos(_og)))return OP_EBADHEADER; - /*Otherwise, keep looking.*/ - } - }break; - /*We shouldn't get a hole in the headers!*/ - case -1:return OP_EBADHEADER; - default:{ - /*Got a packet. - It should be the comment header.*/ - ret=opus_tags_parse(_tags,op.packet,op.bytes); - if(OP_UNLIKELY(ret<0))return ret; - /*Make sure the page terminated at the end of the comment header. - If there is another packet on the page, or part of a packet, then - reject the stream. - Otherwise seekable sources won't be able to seek back to the start - properly.*/ - ret=ogg_stream_packetout(&_of->os,&op); - if(OP_UNLIKELY(ret!=0) - ||OP_UNLIKELY(_og->header[_og->header_len-1]==255)){ - /*If we fail, the caller assumes our tags are uninitialized.*/ - opus_tags_clear(_tags); - return OP_EBADHEADER; - } - return 0; - } - } - } -} - -static int op_fetch_headers(OggOpusFile *_of,OpusHead *_head, - OpusTags *_tags,ogg_uint32_t **_serialnos,int *_nserialnos, - int *_cserialnos,ogg_page *_og){ - ogg_page og; - int ret; - if(!_og){ - /*No need to clamp the boundary offset against _of->end, as all errors - become OP_ENOTFORMAT.*/ - if(OP_UNLIKELY(op_get_next_page(_of,&og, - OP_ADV_OFFSET(_of->offset,OP_CHUNK_SIZE))<0)){ - return OP_ENOTFORMAT; - } - _og=&og; - } - _of->ready_state=OP_OPENED; - ret=op_fetch_headers_impl(_of,_head,_tags,_serialnos,_nserialnos, - _cserialnos,_og); - /*Revert back from OP_STREAMSET to OP_OPENED on failure, to prevent - double-free of the tags in an unseekable stream.*/ - if(OP_UNLIKELY(ret<0))_of->ready_state=OP_OPENED; - return ret; -} - -/*Granule position manipulation routines. - A granule position is defined to be an unsigned 64-bit integer, with the - special value -1 in two's complement indicating an unset or invalid granule - position. - We are not guaranteed to have an unsigned 64-bit type, so we construct the - following routines that - a) Properly order negative numbers as larger than positive numbers, and - b) Check for underflow or overflow past the special -1 value. - This lets us operate on the full, valid range of granule positions in a - consistent and safe manner. - This full range is organized into distinct regions: - [ -1 (invalid) ][ 0 ... OP_INT64_MAX ][ OP_INT64_MIN ... -2 ][-1 (invalid) ] - - No one should actually use granule positions so large that they're negative, - even if they are technically valid, as very little software handles them - correctly (including most of Xiph.Org's). - This library also refuses to support durations so large they won't fit in a - signed 64-bit integer (to avoid exposing this mess to the application, and - to simplify a good deal of internal arithmetic), so the only way to use them - successfully is if pcm_start is very large. - This means there isn't anything you can do with negative granule positions - that you couldn't have done with purely non-negative ones. - The main purpose of these routines is to allow us to think very explicitly - about the possible failure cases of all granule position manipulations.*/ - -/*Safely adds a small signed integer to a valid (not -1) granule position. - The result can use the full 64-bit range of values (both positive and - negative), but will fail on overflow (wrapping past -1; wrapping past - OP_INT64_MAX is explicitly okay). - [out] _dst_gp: The resulting granule position. - Only modified on success. - _src_gp: The granule position to add to. - This must not be -1. - _delta: The amount to add. - This is allowed to be up to 32 bits to support the maximum - duration of a single Ogg page (255 packets * 120 ms per - packet == 1,468,800 samples at 48 kHz). - Return: 0 on success, or OP_EINVAL if the result would wrap around past -1.*/ -static int op_granpos_add(ogg_int64_t *_dst_gp,ogg_int64_t _src_gp, - opus_int32 _delta){ - /*The code below handles this case correctly, but there's no reason we - should ever be called with these values, so make sure we aren't.*/ - OP_ASSERT(_src_gp!=-1); - if(_delta>0){ - /*Adding this amount to the granule position would overflow its 64-bit - range.*/ - if(OP_UNLIKELY(_src_gp<0)&&OP_UNLIKELY(_src_gp>=-1-_delta))return OP_EINVAL; - if(OP_UNLIKELY(_src_gp>OP_INT64_MAX-_delta)){ - /*Adding this amount to the granule position would overflow the positive - half of its 64-bit range. - Since signed overflow is undefined in C, do it in a way the compiler - isn't allowed to screw up.*/ - _delta-=(opus_int32)(OP_INT64_MAX-_src_gp)+1; - _src_gp=OP_INT64_MIN; - } - } - else if(_delta<0){ - /*Subtracting this amount from the granule position would underflow its - 64-bit range.*/ - if(_src_gp>=0&&OP_UNLIKELY(_src_gp<-_delta))return OP_EINVAL; - if(OP_UNLIKELY(_src_gp da < 0.*/ - da=(OP_INT64_MIN-_gp_a)-1; - /*_gp_b >= 0 => db >= 0.*/ - db=OP_INT64_MAX-_gp_b; - /*Step 2: Check for overflow.*/ - if(OP_UNLIKELY(OP_INT64_MAX+da= 0 => da <= 0*/ - da=_gp_a+OP_INT64_MIN; - /*_gp_b < 0 => db <= 0*/ - db=OP_INT64_MIN-_gp_b; - /*Step 2: Check for overflow.*/ - if(OP_UNLIKELY(da=0)return 1; - /*Else fall through.*/ - } - else if(OP_UNLIKELY(_gp_b<0))return -1; - /*No wrapping case.*/ - return (_gp_a>_gp_b)-(_gp_b>_gp_a); -} - -/*Returns the duration of the packet (in samples at 48 kHz), or a negative - value on error.*/ -static int op_get_packet_duration(const unsigned char *_data,int _len){ - int nframes; - int frame_size; - int nsamples; - nframes=opus_packet_get_nb_frames(_data,_len); - if(OP_UNLIKELY(nframes<0))return OP_EBADPACKET; - frame_size=opus_packet_get_samples_per_frame(_data,48000); - nsamples=nframes*frame_size; - if(OP_UNLIKELY(nsamples>120*48))return OP_EBADPACKET; - return nsamples; -} - -/*This function more properly belongs in info.c, but we define it here to allow - the static granule position manipulation functions to remain static.*/ -ogg_int64_t opus_granule_sample(const OpusHead *_head,ogg_int64_t _gp){ - opus_int32 pre_skip; - pre_skip=_head->pre_skip; - if(_gp!=-1&&op_granpos_add(&_gp,_gp,-pre_skip))_gp=-1; - return _gp; -} - -/*Grab all the packets currently in the stream state, and compute their - durations. - _of->op_count is set to the number of packets collected. - [out] _durations: Returns the durations of the individual packets. - Return: The total duration of all packets, or OP_HOLE if there was a hole.*/ -static opus_int32 op_collect_audio_packets(OggOpusFile *_of, - int _durations[255]){ - opus_int32 total_duration; - int op_count; - /*Count the durations of all packets in the page.*/ - op_count=0; - total_duration=0; - for(;;){ - int ret; - /*This takes advantage of undocumented libogg behavior that returned - ogg_packet buffers are valid at least until the next page is - submitted. - Relying on this is not too terrible, as _none_ of the Ogg memory - ownership/lifetime rules are well-documented. - But I can read its code and know this will work.*/ - ret=ogg_stream_packetout(&_of->os,_of->op+op_count); - if(!ret)break; - if(OP_UNLIKELY(ret<0)){ - /*We shouldn't get holes in the middle of pages.*/ - OP_ASSERT(op_count==0); - /*Set the return value and break out of the loop. - We want to make sure op_count gets set to 0, because we've ingested a - page, so any previously loaded packets are now invalid.*/ - total_duration=OP_HOLE; - break; - } - /*Unless libogg is broken, we can't get more than 255 packets from a - single page.*/ - OP_ASSERT(op_count<255); - _durations[op_count]=op_get_packet_duration(_of->op[op_count].packet, - _of->op[op_count].bytes); - if(OP_LIKELY(_durations[op_count]>0)){ - /*With at most 255 packets on a page, this can't overflow.*/ - total_duration+=_durations[op_count++]; - } - /*Ignore packets with an invalid TOC sequence.*/ - else if(op_count>0){ - /*But save the granule position, if there was one.*/ - _of->op[op_count-1].granulepos=_of->op[op_count].granulepos; - } - } - _of->op_pos=0; - _of->op_count=op_count; - return total_duration; -} - -/*Starting from current cursor position, get the initial PCM offset of the next - page. - This also validates the granule position on the first page with a completed - audio data packet, as required by the spec. - If this link is completely empty (no pages with completed packets), then this - function sets pcm_start=pcm_end=0 and returns the BOS page of the next link - (if any). - In the seekable case, we initialize pcm_end=-1 before calling this function, - so that later we can detect that the link was empty before calling - op_find_final_pcm_offset(). - [inout] _link: The link for which to find pcm_start. - [out] _og: Returns the BOS page of the next link if this link was empty. - In the unseekable case, we can then feed this to - op_fetch_headers() to start the next link. - The caller may pass NULL (e.g., for seekable streams), in - which case this page will be discarded. - Return: 0 on success, 1 if there is a buffered BOS page available, or a - negative value on unrecoverable error.*/ -static int op_find_initial_pcm_offset(OggOpusFile *_of, - OggOpusLink *_link,ogg_page *_og){ - ogg_page og; - ogg_int64_t pcm_start; - ogg_int64_t prev_packet_gp; - ogg_int64_t cur_page_gp; - ogg_uint32_t serialno; - opus_int32 total_duration; - int durations[255]; - int cur_page_eos; - int op_count; - int pi; - if(_og==NULL)_og=&og; - serialno=_of->os.serialno; - op_count=0; - /*We shouldn't have to initialize total_duration, but gcc is too dumb to - figure out that op_count>0 implies we've been through the whole loop at - least once.*/ - total_duration=0; - do{ - opus_int64 llret; - llret=op_get_next_page(_of,_og,_of->end); - /*We should get a page unless the file is truncated or mangled. - Otherwise there are no audio data packets in the whole logical stream.*/ - if(OP_UNLIKELY(llret<0)){ - /*Fail if there was a read error.*/ - if(llrethead.pre_skip>0)return OP_EBADTIMESTAMP; - /*Set pcm_end and end_offset so we can skip the call to - op_find_final_pcm_offset().*/ - _link->pcm_start=_link->pcm_end=0; - _link->end_offset=_link->data_offset; - return 0; - } - /*Similarly, if we hit the next link in the chain, we've gone too far.*/ - if(OP_UNLIKELY(ogg_page_bos(_og))){ - if(_link->head.pre_skip>0)return OP_EBADTIMESTAMP; - /*Set pcm_end and end_offset so we can skip the call to - op_find_final_pcm_offset().*/ - _link->pcm_end=_link->pcm_start=0; - _link->end_offset=_link->data_offset; - /*Tell the caller we've got a buffered page for them.*/ - return 1; - } - /*Ignore pages from other streams (not strictly necessary, because of the - checks in ogg_stream_pagein(), but saves some work).*/ - if(serialno!=(ogg_uint32_t)ogg_page_serialno(_og))continue; - ogg_stream_pagein(&_of->os,_og); - /*Bitrate tracking: add the header's bytes here. - The body bytes are counted when we consume the packets.*/ - _of->bytes_tracked+=_og->header_len; - /*Count the durations of all packets in the page.*/ - do total_duration=op_collect_audio_packets(_of,durations); - /*Ignore holes.*/ - while(OP_UNLIKELY(total_duration<0)); - op_count=_of->op_count; - } - while(op_count<=0); - /*We found the first page with a completed audio data packet: actually look - at the granule position. - RFC 3533 says, "A special value of -1 (in two's complement) indicates that - no packets finish on this page," which does not say that a granule - position that is NOT -1 indicates that some packets DO finish on that page - (even though this was the intention, libogg itself violated this intention - for years before we fixed it). - The Ogg Opus specification only imposes its start-time requirements - on the granule position of the first page with completed packets, - so we ignore any set granule positions until then.*/ - cur_page_gp=_of->op[op_count-1].granulepos; - /*But getting a packet without a valid granule position on the page is not - okay.*/ - if(cur_page_gp==-1)return OP_EBADTIMESTAMP; - cur_page_eos=_of->op[op_count-1].e_o_s; - if(OP_LIKELY(!cur_page_eos)){ - /*The EOS flag wasn't set. - Work backwards from the provided granule position to get the starting PCM - offset.*/ - if(OP_UNLIKELY(op_granpos_add(&pcm_start,cur_page_gp,-total_duration)<0)){ - /*The starting granule position MUST not be smaller than the amount of - audio on the first page with completed packets.*/ - return OP_EBADTIMESTAMP; - } - } - else{ - /*The first page with completed packets was also the last.*/ - if(OP_LIKELY(op_granpos_add(&pcm_start,cur_page_gp,-total_duration)<0)){ - /*If there's less audio on the page than indicated by the granule - position, then we're doing end-trimming, and the starting PCM offset - is zero by spec mandate.*/ - pcm_start=0; - /*However, the end-trimming MUST not ask us to trim more samples than - exist after applying the pre-skip.*/ - if(OP_UNLIKELY(op_granpos_cmp(cur_page_gp,_link->head.pre_skip)<0)){ - return OP_EBADTIMESTAMP; - } - } - } - /*Timestamp the individual packets.*/ - prev_packet_gp=pcm_start; - for(pi=0;pi0){ - /*If we trimmed the entire packet, stop (the spec says encoders - shouldn't do this, but we support it anyway).*/ - if(OP_UNLIKELY(diff>durations[pi]))break; - _of->op[pi].granulepos=prev_packet_gp=cur_page_gp; - /*Move the EOS flag to this packet, if necessary, so we'll trim the - samples.*/ - _of->op[pi].e_o_s=1; - continue; - } - } - /*Update the granule position as normal.*/ - OP_ALWAYS_TRUE(!op_granpos_add(&_of->op[pi].granulepos, - prev_packet_gp,durations[pi])); - prev_packet_gp=_of->op[pi].granulepos; - } - /*Update the packet count after end-trimming.*/ - _of->op_count=pi; - _of->cur_discard_count=_link->head.pre_skip; - _of->prev_packet_gp=_link->pcm_start=pcm_start; - return 0; -} - -/*Starting from current cursor position, get the final PCM offset of the - previous page. - This also validates the duration of the link, which, while not strictly - required by the spec, we need to ensure duration calculations don't - overflow. - This is only done for seekable sources. - We must validate that op_find_initial_pcm_offset() succeeded for this link - before calling this function, otherwise it will scan the entire stream - backwards until it reaches the start, and then fail.*/ -static int op_find_final_pcm_offset(OggOpusFile *_of, - const ogg_uint32_t *_serialnos,int _nserialnos,OggOpusLink *_link, - opus_int64 _offset,ogg_uint32_t _end_serialno,ogg_int64_t _end_gp, - ogg_int64_t *_total_duration){ - ogg_int64_t total_duration; - ogg_int64_t duration; - ogg_uint32_t cur_serialno; - /*For the time being, fetch end PCM offset the simple way.*/ - cur_serialno=_link->serialno; - if(_end_serialno!=cur_serialno||_end_gp==-1){ - _offset=op_get_last_page(_of,&_end_gp,_offset, - cur_serialno,_serialnos,_nserialnos); - if(OP_UNLIKELY(_offset<0))return (int)_offset; - } - /*At worst we should have found the first page with completed packets.*/ - if(OP_UNLIKELY(_offset<_link->data_offset))return OP_EBADLINK; - /*This implementation requires that the difference between the first and last - granule positions in each link be representable in a signed, 64-bit - number, and that each link also have at least as many samples as the - pre-skip requires.*/ - if(OP_UNLIKELY(op_granpos_diff(&duration,_end_gp,_link->pcm_start)<0) - ||OP_UNLIKELY(duration<_link->head.pre_skip)){ - return OP_EBADTIMESTAMP; - } - /*We also require that the total duration be representable in a signed, - 64-bit number.*/ - duration-=_link->head.pre_skip; - total_duration=*_total_duration; - if(OP_UNLIKELY(OP_INT64_MAX-durationpcm_end=_end_gp; - _link->end_offset=_offset; - return 0; -} - -/*Rescale the number _x from the range [0,_from] to [0,_to]. - _from and _to must be positive.*/ -static opus_int64 op_rescale64(opus_int64 _x,opus_int64 _from,opus_int64 _to){ - opus_int64 frac; - opus_int64 ret; - int i; - if(_x>=_from)return _to; - if(_x<=0)return 0; - frac=0; - for(i=0;i<63;i++){ - frac<<=1; - OP_ASSERT(_x<=_from); - if(_x>=_from>>1){ - _x-=_from-_x; - frac|=1; - } - else _x<<=1; - } - ret=0; - for(i=0;i<63;i++){ - if(frac&1)ret=(ret&_to&1)+(ret>>1)+(_to>>1); - else ret>>=1; - frac>>=1; - } - return ret; -} - -/*The minimum granule position spacing allowed for making predictions. - This corresponds to about 1 second of audio at 48 kHz for both Opus and - Vorbis, or one keyframe interval in Theora with the default keyframe spacing - of 256.*/ -#define OP_GP_SPACING_MIN (48000) - -/*Try to estimate the location of the next link using the current seek - records, assuming the initial granule position of any streams we've found is - 0.*/ -static opus_int64 op_predict_link_start(const OpusSeekRecord *_sr,int _nsr, - opus_int64 _searched,opus_int64 _end_searched,opus_int32 _bias){ - opus_int64 bisect; - int sri; - int srj; - /*Require that we be at least OP_CHUNK_SIZE from the end. - We don't require that we be at least OP_CHUNK_SIZE from the beginning, - because if we are we'll just scan forward without seeking.*/ - _end_searched-=OP_CHUNK_SIZE; - if(_searched>=_end_searched)return -1; - bisect=_end_searched; - for(sri=0;sri<_nsr;sri++){ - ogg_int64_t gp1; - ogg_int64_t gp2_min; - ogg_uint32_t serialno1; - opus_int64 offset1; - /*If the granule position is negative, either it's invalid or we'd cause - overflow.*/ - gp1=_sr[sri].gp; - if(gp1<0)continue; - /*We require some minimum distance between granule positions to make an - estimate. - We don't actually know what granule position scheme is being used, - because we have no idea what kind of stream these came from. - Therefore we require a minimum spacing between them, with the - expectation that while bitrates and granule position increments might - vary locally in quite complex ways, they are globally smooth.*/ - if(OP_UNLIKELY(op_granpos_add(&gp2_min,gp1,OP_GP_SPACING_MIN)<0)){ - /*No granule position would satisfy us.*/ - continue; - } - offset1=_sr[sri].offset; - serialno1=_sr[sri].serialno; - for(srj=sri;srj-->0;){ - ogg_int64_t gp2; - opus_int64 offset2; - opus_int64 num; - ogg_int64_t den; - ogg_int64_t ipart; - gp2=_sr[srj].gp; - if(gp20); - if(ipart>0&&(offset2-_searched)/ipart=_end_searched?-1:bisect; -} - -/*Finds each bitstream link, one at a time, using a bisection search. - This has to begin by knowing the offset of the first link's initial page.*/ -static int op_bisect_forward_serialno(OggOpusFile *_of, - opus_int64 _searched,OpusSeekRecord *_sr,int _csr, - ogg_uint32_t **_serialnos,int *_nserialnos,int *_cserialnos){ - ogg_page og; - OggOpusLink *links; - int nlinks; - int clinks; - ogg_uint32_t *serialnos; - int nserialnos; - ogg_int64_t total_duration; - int nsr; - int ret; - links=_of->links; - nlinks=clinks=_of->nlinks; - total_duration=0; - /*We start with one seek record, for the last page in the file. - We build up a list of records for places we seek to during link - enumeration. - This list is kept sorted in reverse order. - We only care about seek locations that were _not_ in the current link, - therefore we can add them one at a time to the end of the list as we - improve the lower bound on the location where the next link starts.*/ - nsr=1; - for(;;){ - opus_int64 end_searched; - opus_int64 bisect; - opus_int64 next; - opus_int64 last; - ogg_int64_t end_offset; - ogg_int64_t end_gp; - int sri; - serialnos=*_serialnos; - nserialnos=*_nserialnos; - if(OP_UNLIKELY(nlinks>=clinks)){ - if(OP_UNLIKELY(clinks>INT_MAX-1>>1))return OP_EFAULT; - clinks=2*clinks+1; - OP_ASSERT(nlinkslinks=links; - } - /*Invariants: - We have the headers and serial numbers for the link beginning at 'begin'. - We have the offset and granule position of the last page in the file - (potentially not a page we care about).*/ - /*Scan the seek records we already have to save us some bisection.*/ - for(sri=0;sri1){ - opus_int64 last_offset; - opus_int64 avg_link_size; - opus_int64 upper_limit; - last_offset=links[nlinks-1].offset; - avg_link_size=last_offset/(nlinks-1); - upper_limit=end_searched-OP_CHUNK_SIZE-avg_link_size; - if(OP_LIKELY(last_offset>_searched-avg_link_size) - &&OP_LIKELY(last_offset>1); - /*If we're within OP_CHUNK_SIZE of the start, scan forward.*/ - if(bisect-_searchedoffset-last>=0); - OP_ASSERT(_of->offset-last<=OP_PAGE_SIZE_MAX); - _sr[nsr].size=(opus_int32)(_of->offset-last); - _sr[nsr].serialno=serialno; - _sr[nsr].gp=gp; - nsr++; - } - } - else{ - _searched=_of->offset; - next_bias=OP_CHUNK_SIZE; - if(serialno==links[nlinks-1].serialno){ - /*This page was from the stream we want, remember it. - If it's the last such page in the link, we won't have to go back - looking for it later.*/ - end_gp=gp; - end_offset=last; - } - } - } - bisect=op_predict_link_start(_sr,nsr,_searched,end_searched,next_bias); - } - /*Bisection point found. - Get the final granule position of the previous link, assuming - op_find_initial_pcm_offset() didn't already determine the link was - empty.*/ - if(OP_LIKELY(links[nlinks-1].pcm_end==-1)){ - if(end_gp==-1){ - /*If we don't know where the end page is, we'll have to seek back and - look for it, starting from the end of the link.*/ - end_offset=next; - /*Also forget the last page we read. - It won't be available after the seek.*/ - last=-1; - } - ret=op_find_final_pcm_offset(_of,serialnos,nserialnos, - links+nlinks-1,end_offset,links[nlinks-1].serialno,end_gp, - &total_duration); - if(OP_UNLIKELY(ret<0))return ret; - } - if(last!=next){ - /*The last page we read was not the first page the next link. - Move the cursor position to the offset of that first page. - This only performs an actual seek if the first page of the next link - does not start at the end of the last page from the current Opus - stream with a valid granule position.*/ - ret=op_seek_helper(_of,next); - if(OP_UNLIKELY(ret<0))return ret; - } - ret=op_fetch_headers(_of,&links[nlinks].head,&links[nlinks].tags, - _serialnos,_nserialnos,_cserialnos,last!=next?NULL:&og); - if(OP_UNLIKELY(ret<0))return ret; - links[nlinks].offset=next; - links[nlinks].data_offset=_of->offset; - links[nlinks].serialno=_of->os.serialno; - links[nlinks].pcm_end=-1; - /*This might consume a page from the next link, however the next bisection - always starts with a seek.*/ - ret=op_find_initial_pcm_offset(_of,links+nlinks,NULL); - if(OP_UNLIKELY(ret<0))return ret; - _searched=_of->offset; - /*Mark the current link count so it can be cleaned up on error.*/ - _of->nlinks=++nlinks; - } - /*Last page is in the starting serialno list, so we've reached the last link. - Now find the last granule position for it (if we didn't the first time we - looked at the end of the stream, and if op_find_initial_pcm_offset() - didn't already determine the link was empty).*/ - if(OP_LIKELY(links[nlinks-1].pcm_end==-1)){ - ret=op_find_final_pcm_offset(_of,serialnos,nserialnos, - links+nlinks-1,_sr[0].offset,_sr[0].serialno,_sr[0].gp,&total_duration); - if(OP_UNLIKELY(ret<0))return ret; - } - /*Trim back the links array if necessary.*/ - links=(OggOpusLink *)_ogg_realloc(links,sizeof(*links)*nlinks); - if(OP_LIKELY(links!=NULL))_of->links=links; - /*We also don't need these anymore.*/ - _ogg_free(*_serialnos); - *_serialnos=NULL; - *_cserialnos=*_nserialnos=0; - return 0; -} - -static void op_update_gain(OggOpusFile *_of){ - OpusHead *head; - opus_int32 gain_q8; - int li; - /*If decode isn't ready, then we'll apply the gain when we initialize the - decoder.*/ - if(_of->ready_stategain_offset_q8; - li=_of->seekable?_of->cur_link:0; - head=&_of->links[li].head; - /*We don't have to worry about overflow here because the header gain and - track gain must lie in the range [-32768,32767], and the user-supplied - offset has been pre-clamped to [-98302,98303].*/ - switch(_of->gain_type){ - case OP_TRACK_GAIN:{ - int track_gain_q8; - track_gain_q8=0; - opus_tags_get_track_gain(&_of->links[li].tags,&track_gain_q8); - gain_q8+=track_gain_q8; - } - /*Fall through.*/ - case OP_HEADER_GAIN:gain_q8+=head->output_gain;break; - case OP_ABSOLUTE_GAIN:break; - default:OP_ASSERT(0); - } - gain_q8=OP_CLAMP(-32768,gain_q8,32767); - OP_ASSERT(_of->od!=NULL); -#if defined(OPUS_SET_GAIN) - opus_multistream_decoder_ctl(_of->od,OPUS_SET_GAIN(gain_q8)); -#else -/*A fallback that works with both float and fixed-point is a bunch of work, - so just force people to use a sufficiently new version. - This is deployed well enough at this point that this shouldn't be a burden.*/ -# error "libopus 1.0.1 or later required" -#endif -} - -static int op_make_decode_ready(OggOpusFile *_of){ - const OpusHead *head; - int li; - int stream_count; - int coupled_count; - int channel_count; - if(_of->ready_state>OP_STREAMSET)return 0; - if(OP_UNLIKELY(_of->ready_stateseekable?_of->cur_link:0; - head=&_of->links[li].head; - stream_count=head->stream_count; - coupled_count=head->coupled_count; - channel_count=head->channel_count; - /*Check to see if the current decoder is compatible with the current link.*/ - if(_of->od!=NULL&&_of->od_stream_count==stream_count - &&_of->od_coupled_count==coupled_count&&_of->od_channel_count==channel_count - &&memcmp(_of->od_mapping,head->mapping, - sizeof(*head->mapping)*channel_count)==0){ - opus_multistream_decoder_ctl(_of->od,OPUS_RESET_STATE); - } - else{ - int err; - opus_multistream_decoder_destroy(_of->od); - _of->od=opus_multistream_decoder_create(48000,channel_count, - stream_count,coupled_count,head->mapping,&err); - if(_of->od==NULL)return OP_EFAULT; - _of->od_stream_count=stream_count; - _of->od_coupled_count=coupled_count; - _of->od_channel_count=channel_count; - memcpy(_of->od_mapping,head->mapping,sizeof(*head->mapping)*channel_count); - } - _of->ready_state=OP_INITSET; - _of->bytes_tracked=0; - _of->samples_tracked=0; -#if !defined(OP_FIXED_POINT) - _of->state_channel_count=0; - /*Use the serial number for the PRNG seed to get repeatable output for - straight play-throughs.*/ - _of->dither_seed=_of->links[li].serialno; -#endif - op_update_gain(_of); - return 0; -} - -static int op_open_seekable2_impl(OggOpusFile *_of){ - /*64 seek records should be enough for anybody. - Actually, with a bisection search in a 63-bit range down to OP_CHUNK_SIZE - granularity, much more than enough.*/ - OpusSeekRecord sr[64]; - opus_int64 data_offset; - int ret; - /*We can seek, so set out learning all about this file.*/ - (*_of->callbacks.seek)(_of->source,0,SEEK_END); - _of->offset=_of->end=(*_of->callbacks.tell)(_of->source); - if(OP_UNLIKELY(_of->end<0))return OP_EREAD; - data_offset=_of->links[0].data_offset; - if(OP_UNLIKELY(_of->endend, - _of->links[0].serialno,_of->serialnos,_of->nserialnos); - if(OP_UNLIKELY(ret<0))return ret; - /*If there's any trailing junk, forget about it.*/ - _of->end=sr[0].offset+sr[0].size; - if(OP_UNLIKELY(_of->endserialnos,&_of->nserialnos,&_of->cserialnos); -} - -static int op_open_seekable2(OggOpusFile *_of){ - ogg_sync_state oy_start; - ogg_stream_state os_start; - ogg_packet *op_start; - opus_int64 start_offset; - int start_op_count; - int ret; - /*We're partially open and have a first link header state in storage in _of. - Save off that stream state so we can come back to it. - It would be simpler to just dump all this state and seek back to - links[0].data_offset when we're done. - But we do the extra work to allow us to seek back to _exactly_ the same - stream position we're at now. - This allows, e.g., the HTTP backend to continue reading from the original - connection (if it's still available), instead of opening a new one. - This means we can open and start playing a normal Opus file with a single - link and reasonable packet sizes using only two HTTP requests.*/ - start_op_count=_of->op_count; - /*This is a bit too large to put on the stack unconditionally.*/ - op_start=(ogg_packet *)_ogg_malloc(sizeof(*op_start)*start_op_count); - if(op_start==NULL)return OP_EFAULT; - *&oy_start=_of->oy; - *&os_start=_of->os; - start_offset=_of->offset; - memcpy(op_start,_of->op,sizeof(*op_start)*start_op_count); - OP_ASSERT((*_of->callbacks.tell)(_of->source)==op_position(_of)); - ogg_sync_init(&_of->oy); - ogg_stream_init(&_of->os,-1); - ret=op_open_seekable2_impl(_of); - /*Restore the old stream state.*/ - ogg_stream_clear(&_of->os); - ogg_sync_clear(&_of->oy); - *&_of->oy=*&oy_start; - *&_of->os=*&os_start; - _of->offset=start_offset; - _of->op_count=start_op_count; - memcpy(_of->op,op_start,sizeof(*_of->op)*start_op_count); - _ogg_free(op_start); - _of->prev_packet_gp=_of->links[0].pcm_start; - _of->cur_discard_count=_of->links[0].head.pre_skip; - if(OP_UNLIKELY(ret<0))return ret; - /*And restore the position indicator.*/ - ret=(*_of->callbacks.seek)(_of->source,op_position(_of),SEEK_SET); - return OP_UNLIKELY(ret<0)?OP_EREAD:0; -} - -/*Clear out the current logical bitstream decoder.*/ -static void op_decode_clear(OggOpusFile *_of){ - /*We don't actually free the decoder. - We might be able to re-use it for the next link.*/ - _of->op_count=0; - _of->od_buffer_size=0; - _of->prev_packet_gp=-1; - if(!_of->seekable){ - OP_ASSERT(_of->ready_state>=OP_INITSET); - opus_tags_clear(&_of->links[0].tags); - } - _of->ready_state=OP_OPENED; -} - -static void op_clear(OggOpusFile *_of){ - OggOpusLink *links; - _ogg_free(_of->od_buffer); - if(_of->od!=NULL)opus_multistream_decoder_destroy(_of->od); - links=_of->links; - if(!_of->seekable){ - if(_of->ready_state>OP_OPENED||_of->ready_state==OP_PARTOPEN){ - opus_tags_clear(&links[0].tags); - } - } - else if(OP_LIKELY(links!=NULL)){ - int nlinks; - int link; - nlinks=_of->nlinks; - for(link=0;linkserialnos); - ogg_stream_clear(&_of->os); - ogg_sync_clear(&_of->oy); - if(_of->callbacks.close!=NULL)(*_of->callbacks.close)(_of->source); -} - -static int op_open1(OggOpusFile *_of, - void *_source,const OpusFileCallbacks *_cb, - const unsigned char *_initial_data,size_t _initial_bytes){ - ogg_page og; - ogg_page *pog; - int seekable; - int ret; - memset(_of,0,sizeof(*_of)); - _of->end=-1; - _of->source=_source; - *&_of->callbacks=*_cb; - /*At a minimum, we need to be able to read data.*/ - if(OP_UNLIKELY(_of->callbacks.read==NULL))return OP_EREAD; - /*Initialize the framing state.*/ - ogg_sync_init(&_of->oy); - /*Perhaps some data was previously read into a buffer for testing against - other stream types. - Allow initialization from this previously read data (especially as we may - be reading from a non-seekable stream). - This requires copying it into a buffer allocated by ogg_sync_buffer() and - doesn't support seeking, so this is not a good mechanism to use for - decoding entire files from RAM.*/ - if(_initial_bytes>0){ - char *buffer; - buffer=ogg_sync_buffer(&_of->oy,_initial_bytes); - memcpy(buffer,_initial_data,_initial_bytes*sizeof(*buffer)); - ogg_sync_wrote(&_of->oy,_initial_bytes); - } - /*Can we seek? - Stevens suggests the seek test is portable.*/ - seekable=_cb->seek!=NULL&&(*_cb->seek)(_source,0,SEEK_CUR)!=-1; - /*If seek is implemented, tell must also be implemented.*/ - if(seekable){ - opus_int64 pos; - if(OP_UNLIKELY(_of->callbacks.tell==NULL))return OP_EINVAL; - pos=(*_of->callbacks.tell)(_of->source); - /*If the current position is not equal to the initial bytes consumed, - absolute seeking will not work.*/ - if(OP_UNLIKELY(pos!=(opus_int64)_initial_bytes))return OP_EINVAL; - } - _of->seekable=seekable; - /*Don't seek yet. - Set up a 'single' (current) logical bitstream entry for partial open.*/ - _of->links=(OggOpusLink *)_ogg_malloc(sizeof(*_of->links)); - /*The serialno gets filled in later by op_fetch_headers().*/ - ogg_stream_init(&_of->os,-1); - pog=NULL; - for(;;){ - /*Fetch all BOS pages, store the Opus header and all seen serial numbers, - and load subsequent Opus setup headers.*/ - ret=op_fetch_headers(_of,&_of->links[0].head,&_of->links[0].tags, - &_of->serialnos,&_of->nserialnos,&_of->cserialnos,pog); - if(OP_UNLIKELY(ret<0))break; - _of->nlinks=1; - _of->links[0].offset=0; - _of->links[0].data_offset=_of->offset; - _of->links[0].pcm_end=-1; - _of->links[0].serialno=_of->os.serialno; - /*Fetch the initial PCM offset.*/ - ret=op_find_initial_pcm_offset(_of,_of->links,&og); - if(seekable||OP_LIKELY(ret<=0))break; - /*This link was empty, but we already have the BOS page for the next one in - og. - We can't seek, so start processing the next link right now.*/ - opus_tags_clear(&_of->links[0].tags); - _of->nlinks=0; - if(!seekable)_of->cur_link++; - pog=&og; - } - if(OP_LIKELY(ret>=0))_of->ready_state=OP_PARTOPEN; - return ret; -} - -static int op_open2(OggOpusFile *_of){ - int ret; - OP_ASSERT(_of->ready_state==OP_PARTOPEN); - if(_of->seekable){ - _of->ready_state=OP_OPENED; - ret=op_open_seekable2(_of); - } - else ret=0; - if(OP_LIKELY(ret>=0)){ - /*We have buffered packets from op_find_initial_pcm_offset(). - Move to OP_INITSET so we can use them.*/ - _of->ready_state=OP_STREAMSET; - ret=op_make_decode_ready(_of); - if(OP_LIKELY(ret>=0))return 0; - } - /*Don't auto-close the stream on failure.*/ - _of->callbacks.close=NULL; - op_clear(_of); - return ret; -} - -OggOpusFile *op_test_callbacks(void *_source,const OpusFileCallbacks *_cb, - const unsigned char *_initial_data,size_t _initial_bytes,int *_error){ - OggOpusFile *of; - int ret; - of=(OggOpusFile *)_ogg_malloc(sizeof(*of)); - ret=OP_EFAULT; - if(OP_LIKELY(of!=NULL)){ - ret=op_open1(of,_source,_cb,_initial_data,_initial_bytes); - if(OP_LIKELY(ret>=0)){ - if(_error!=NULL)*_error=0; - return of; - } - /*Don't auto-close the stream on failure.*/ - of->callbacks.close=NULL; - op_clear(of); - _ogg_free(of); - } - if(_error!=NULL)*_error=ret; - return NULL; -} - -OggOpusFile *op_open_callbacks(void *_source,const OpusFileCallbacks *_cb, - const unsigned char *_initial_data,size_t _initial_bytes,int *_error){ - OggOpusFile *of; - of=op_test_callbacks(_source,_cb,_initial_data,_initial_bytes,_error); - if(OP_LIKELY(of!=NULL)){ - int ret; - ret=op_open2(of); - if(OP_LIKELY(ret>=0))return of; - if(_error!=NULL)*_error=ret; - _ogg_free(of); - } - return NULL; -} - -/*Convenience routine to clean up from failure for the open functions that - create their own streams.*/ -static OggOpusFile *op_open_close_on_failure(void *_source, - const OpusFileCallbacks *_cb,int *_error){ - OggOpusFile *of; - if(OP_UNLIKELY(_source==NULL)){ - if(_error!=NULL)*_error=OP_EFAULT; - return NULL; - } - of=op_open_callbacks(_source,_cb,NULL,0,_error); - if(OP_UNLIKELY(of==NULL))(*_cb->close)(_source); - return of; -} - -OggOpusFile *op_open_file(const char *_path,int *_error){ - OpusFileCallbacks cb; - return op_open_close_on_failure(op_fopen(&cb,_path,"rb"),&cb,_error); -} - -OggOpusFile *op_open_memory(const unsigned char *_data,size_t _size, - int *_error){ - OpusFileCallbacks cb; - return op_open_close_on_failure(op_mem_stream_create(&cb,_data,_size),&cb, - _error); -} - -/*Convenience routine to clean up from failure for the open functions that - create their own streams.*/ -static OggOpusFile *op_test_close_on_failure(void *_source, - const OpusFileCallbacks *_cb,int *_error){ - OggOpusFile *of; - if(OP_UNLIKELY(_source==NULL)){ - if(_error!=NULL)*_error=OP_EFAULT; - return NULL; - } - of=op_test_callbacks(_source,_cb,NULL,0,_error); - if(OP_UNLIKELY(of==NULL))(*_cb->close)(_source); - return of; -} - -OggOpusFile *op_test_file(const char *_path,int *_error){ - OpusFileCallbacks cb; - return op_test_close_on_failure(op_fopen(&cb,_path,"rb"),&cb,_error); -} - -OggOpusFile *op_test_memory(const unsigned char *_data,size_t _size, - int *_error){ - OpusFileCallbacks cb; - return op_test_close_on_failure(op_mem_stream_create(&cb,_data,_size),&cb, - _error); -} - -int op_test_open(OggOpusFile *_of){ - int ret; - if(OP_UNLIKELY(_of->ready_state!=OP_PARTOPEN))return OP_EINVAL; - ret=op_open2(_of); - /*op_open2() will clear this structure on failure. - Reset its contents to prevent double-frees in op_free().*/ - if(OP_UNLIKELY(ret<0))memset(_of,0,sizeof(*_of)); - return ret; -} - -void op_free(OggOpusFile *_of){ - if(OP_LIKELY(_of!=NULL)){ - op_clear(_of); - _ogg_free(_of); - } -} - -int op_seekable(const OggOpusFile *_of){ - return _of->seekable; -} - -int op_link_count(const OggOpusFile *_of){ - return _of->nlinks; -} - -ogg_uint32_t op_serialno(const OggOpusFile *_of,int _li){ - if(OP_UNLIKELY(_li>=_of->nlinks))_li=_of->nlinks-1; - if(!_of->seekable)_li=0; - return _of->links[_li<0?_of->cur_link:_li].serialno; -} - -int op_channel_count(const OggOpusFile *_of,int _li){ - return op_head(_of,_li)->channel_count; -} - -opus_int64 op_raw_total(const OggOpusFile *_of,int _li){ - if(OP_UNLIKELY(_of->ready_stateseekable) - ||OP_UNLIKELY(_li>=_of->nlinks)){ - return OP_EINVAL; - } - if(_li<0)return _of->end-_of->links[0].offset; - return (_li+1>=_of->nlinks?_of->end:_of->links[_li+1].offset) - -_of->links[_li].offset; -} - -ogg_int64_t op_pcm_total(const OggOpusFile *_of,int _li){ - OggOpusLink *links; - ogg_int64_t diff; - int nlinks; - nlinks=_of->nlinks; - if(OP_UNLIKELY(_of->ready_stateseekable) - ||OP_UNLIKELY(_li>=nlinks)){ - return OP_EINVAL; - } - links=_of->links; - /*We verify that the granule position differences are larger than the - pre-skip and that the total duration does not overflow during link - enumeration, so we don't have to check here.*/ - if(_li<0){ - ogg_int64_t pcm_total; - int li; - pcm_total=0; - for(li=0;li=_of->nlinks))_li=_of->nlinks-1; - if(!_of->seekable)_li=0; - return &_of->links[_li<0?_of->cur_link:_li].head; -} - -const OpusTags *op_tags(const OggOpusFile *_of,int _li){ - if(OP_UNLIKELY(_li>=_of->nlinks))_li=_of->nlinks-1; - if(!_of->seekable){ - if(_of->ready_stateready_state!=OP_PARTOPEN){ - return NULL; - } - _li=0; - } - else if(_li<0)_li=_of->ready_state>=OP_STREAMSET?_of->cur_link:0; - return &_of->links[_li].tags; -} - -int op_current_link(const OggOpusFile *_of){ - if(OP_UNLIKELY(_of->ready_statecur_link; -} - -/*Compute an average bitrate given a byte and sample count. - Return: The bitrate in bits per second.*/ -static opus_int32 op_calc_bitrate(opus_int64 _bytes,ogg_int64_t _samples){ - /*These rates are absurd, but let's handle them anyway.*/ - if(OP_UNLIKELY(_bytes>(OP_INT64_MAX-(_samples>>1))/(48000*8))){ - ogg_int64_t den; - if(OP_UNLIKELY(_bytes/(OP_INT32_MAX/(48000*8))>=_samples)){ - return OP_INT32_MAX; - } - den=_samples/(48000*8); - return (opus_int32)((_bytes+(den>>1))/den); - } - if(OP_UNLIKELY(_samples<=0))return OP_INT32_MAX; - /*This can't actually overflow in normal operation: even with a pre-skip of - 545 2.5 ms frames with 8 streams running at 1282*8+1 bytes per packet - (1275 byte frames + Opus framing overhead + Ogg lacing values), that all - produce a single sample of decoded output, we still don't top 45 Mbps. - The only way to get bitrates larger than that is with excessive Opus - padding, more encoded streams than output channels, or lots and lots of - Ogg pages with no packets on them.*/ - return (opus_int32)OP_MIN((_bytes*48000*8+(_samples>>1))/_samples, - OP_INT32_MAX); -} - -opus_int32 op_bitrate(const OggOpusFile *_of,int _li){ - if(OP_UNLIKELY(_of->ready_stateseekable) - ||OP_UNLIKELY(_li>=_of->nlinks)){ - return OP_EINVAL; - } - return op_calc_bitrate(op_raw_total(_of,_li),op_pcm_total(_of,_li)); -} - -opus_int32 op_bitrate_instant(OggOpusFile *_of){ - ogg_int64_t samples_tracked; - opus_int32 ret; - if(OP_UNLIKELY(_of->ready_statesamples_tracked; - if(OP_UNLIKELY(samples_tracked==0))return OP_FALSE; - ret=op_calc_bitrate(_of->bytes_tracked,samples_tracked); - _of->bytes_tracked=0; - _of->samples_tracked=0; - return ret; -} - -/*Fetch and process a page. - This handles the case where we're at a bitstream boundary and dumps the - decoding machine. - If the decoding machine is unloaded, it loads it. - It also keeps prev_packet_gp up to date (seek and read both use this; seek - uses a special hack with _readp). - Return: <0) Error, OP_HOLE (lost packet), or OP_EOF. - 0) Need more data (only if _readp==0). - 1) Got at least one audio data packet.*/ -static int op_fetch_and_process_page(OggOpusFile *_of, - ogg_page *_og,opus_int64 _page_pos,int _readp,int _spanp,int _ignore_holes){ - OggOpusLink *links; - ogg_uint32_t cur_serialno; - int seekable; - int cur_link; - int ret; - /*We shouldn't get here if we have unprocessed packets.*/ - OP_ASSERT(_of->ready_stateop_pos>=_of->op_count); - if(!_readp)return 0; - seekable=_of->seekable; - links=_of->links; - cur_link=seekable?_of->cur_link:0; - cur_serialno=links[cur_link].serialno; - /*Handle one page.*/ - for(;;){ - ogg_page og; - OP_ASSERT(_of->ready_state>=OP_OPENED); - /*This loop is not strictly necessary, but there's no sense in doing the - extra checks of the larger loop for the common case in a multiplexed - bistream where the page is simply part of a different logical - bitstream.*/ - do{ - /*If we were given a page to use, use it.*/ - if(_og!=NULL){ - *&og=*_og; - _og=NULL; - } - /*Keep reading until we get a page with the correct serialno.*/ - else _page_pos=op_get_next_page(_of,&og,_of->end); - /*EOF: Leave uninitialized.*/ - if(_page_pos<0)return _page_posready_state>=OP_STREAMSET)){ - if(cur_serialno!=(ogg_uint32_t)ogg_page_serialno(&og)){ - /*Two possibilities: - 1) Another stream is multiplexed into this logical section, or*/ - if(OP_LIKELY(!ogg_page_bos(&og)))continue; - /* 2) Our decoding just traversed a bitstream boundary.*/ - if(!_spanp)return OP_EOF; - if(OP_LIKELY(_of->ready_state>=OP_INITSET))op_decode_clear(_of); - break; - } - } - /*Bitrate tracking: add the header's bytes here. - The body bytes are counted when we consume the packets.*/ - _of->bytes_tracked+=og.header_len; - } - while(0); - /*Do we need to load a new machine before submitting the page? - This is different in the seekable and non-seekable cases. - In the seekable case, we already have all the header information loaded - and cached. - We just initialize the machine with it and continue on our merry way. - In the non-seekable (streaming) case, we'll only be at a boundary if we - just left the previous logical bitstream, and we're now nominally at the - header of the next bitstream.*/ - if(OP_UNLIKELY(_of->ready_statenlinks; - for(li=0;li=nlinks)continue; - cur_serialno=serialno; - _of->cur_link=cur_link=li; - ogg_stream_reset_serialno(&_of->os,serialno); - _of->ready_state=OP_STREAMSET; - /*If we're at the start of this link, initialize the granule position - and pre-skip tracking.*/ - if(_page_pos<=links[cur_link].data_offset){ - _of->prev_packet_gp=links[cur_link].pcm_start; - _of->cur_discard_count=links[cur_link].head.pre_skip; - /*Ignore a hole at the start of a new link (this is common for - streams joined in the middle) or after seeking.*/ - _ignore_holes=1; - } - } - else{ - do{ - /*We're streaming. - Fetch the two header packets, build the info struct.*/ - ret=op_fetch_headers(_of,&links[0].head,&links[0].tags, - NULL,NULL,NULL,&og); - if(OP_UNLIKELY(ret<0))return ret; - /*op_find_initial_pcm_offset() will suppress any initial hole for us, - so no need to set _ignore_holes.*/ - ret=op_find_initial_pcm_offset(_of,links,&og); - if(OP_UNLIKELY(ret<0))return ret; - _of->links[0].serialno=cur_serialno=_of->os.serialno; - _of->cur_link++; - } - /*If the link was empty, keep going, because we already have the - BOS page of the next one in og.*/ - while(OP_UNLIKELY(ret>0)); - /*If we didn't get any packets out of op_find_initial_pcm_offset(), - keep going (this is possible if end-trimming trimmed them all).*/ - if(_of->op_count<=0)continue; - /*Otherwise, we're done.*/ - ret=op_make_decode_ready(_of); - if(OP_UNLIKELY(ret<0))return ret; - return 1; - } - } - /*The buffered page is the data we want, and we're ready for it. - Add it to the stream state.*/ - if(OP_UNLIKELY(_of->ready_state==OP_STREAMSET)){ - ret=op_make_decode_ready(_of); - if(OP_UNLIKELY(ret<0))return ret; - } - /*Extract all the packets from the current page.*/ - ogg_stream_pagein(&_of->os,&og); - if(OP_LIKELY(_of->ready_state>=OP_INITSET)){ - opus_int32 total_duration; - int durations[255]; - int op_count; - total_duration=op_collect_audio_packets(_of,durations); - if(OP_UNLIKELY(total_duration<0)){ - /*Drain the packets from the page anyway.*/ - total_duration=op_collect_audio_packets(_of,durations); - OP_ASSERT(total_duration>=0); - /*Report holes to the caller.*/ - if(!_ignore_holes)return OP_HOLE; - } - op_count=_of->op_count; - /*If we found at least one audio data packet, compute per-packet granule - positions for them.*/ - if(op_count>0){ - ogg_int64_t diff; - ogg_int64_t prev_packet_gp; - ogg_int64_t cur_packet_gp; - ogg_int64_t cur_page_gp; - int cur_page_eos; - int pi; - cur_page_gp=_of->op[op_count-1].granulepos; - cur_page_eos=_of->op[op_count-1].e_o_s; - prev_packet_gp=_of->prev_packet_gp; - if(OP_UNLIKELY(prev_packet_gp==-1)){ - opus_int32 cur_discard_count; - /*This is the first call after a raw seek. - Try to reconstruct prev_packet_gp from scratch.*/ - OP_ASSERT(seekable); - if(OP_UNLIKELY(cur_page_eos)){ - /*If the first page we hit after our seek was the EOS page, and - we didn't start from data_offset or before, we don't have - enough information to do end-trimming. - Proceed to the next link, rather than risk playing back some - samples that shouldn't have been played.*/ - _of->op_count=0; - continue; - } - /*By default discard 80 ms of data after a seek, unless we seek - into the pre-skip region.*/ - cur_discard_count=80*48; - cur_page_gp=_of->op[op_count-1].granulepos; - /*Try to initialize prev_packet_gp. - If the current page had packets but didn't have a granule - position, or the granule position it had was too small (both - illegal), just use the starting granule position for the link.*/ - prev_packet_gp=links[cur_link].pcm_start; - if(OP_LIKELY(cur_page_gp!=-1)){ - op_granpos_add(&prev_packet_gp,cur_page_gp,-total_duration); - } - if(OP_LIKELY(!op_granpos_diff(&diff, - prev_packet_gp,links[cur_link].pcm_start))){ - opus_int32 pre_skip; - /*If we start at the beginning of the pre-skip region, or we're - at least 80 ms from the end of the pre-skip region, we discard - to the end of the pre-skip region. - Otherwise, we still use the 80 ms default, which will discard - past the end of the pre-skip region.*/ - pre_skip=links[cur_link].head.pre_skip; - if(diff>=0&&diff<=OP_MAX(0,pre_skip-80*48)){ - cur_discard_count=pre_skip-(int)diff; - } - } - _of->cur_discard_count=cur_discard_count; - } - if(OP_UNLIKELY(cur_page_gp==-1)){ - /*This page had completed packets but didn't have a valid granule - position. - This is illegal, but we'll try to handle it by continuing to count - forwards from the previous page.*/ - if(op_granpos_add(&cur_page_gp,prev_packet_gp,total_duration)<0){ - /*The timestamp for this page overflowed.*/ - cur_page_gp=links[cur_link].pcm_end; - } - } - /*If we hit the last page, handle end-trimming.*/ - if(OP_UNLIKELY(cur_page_eos) - &&OP_LIKELY(!op_granpos_diff(&diff,cur_page_gp,prev_packet_gp)) - &&OP_LIKELY(diff0){ - /*If we trimmed the entire packet, stop (the spec says encoders - shouldn't do this, but we support it anyway).*/ - if(OP_UNLIKELY(diff>durations[pi]))break; - cur_packet_gp=cur_page_gp; - /*Move the EOS flag to this packet, if necessary, so we'll trim - the samples during decode.*/ - _of->op[pi].e_o_s=1; - } - else{ - /*Update the granule position as normal.*/ - OP_ALWAYS_TRUE(!op_granpos_add(&cur_packet_gp, - cur_packet_gp,durations[pi])); - } - _of->op[pi].granulepos=cur_packet_gp; - OP_ALWAYS_TRUE(!op_granpos_diff(&diff,cur_page_gp,cur_packet_gp)); - } - } - else{ - /*Propagate timestamps to earlier packets. - op_granpos_add(&prev_packet_gp,prev_packet_gp,total_duration) - should succeed and give prev_packet_gp==cur_page_gp. - But we don't bother to check that, as there isn't much we can do - if it's not true. - The only thing we guarantee is that the start and end granule - positions of the packets are valid, and that they are monotonic - within a page. - They might be completely out of range for this link (we'll check - that elsewhere), or non-monotonic between pages.*/ - if(OP_UNLIKELY(op_granpos_add(&prev_packet_gp, - cur_page_gp,-total_duration)<0)){ - /*The starting timestamp for the first packet on this page - underflowed. - This is illegal, but we ignore it.*/ - prev_packet_gp=0; - } - for(pi=0;pi=0); - OP_ALWAYS_TRUE(!op_granpos_add(&cur_packet_gp, - cur_packet_gp,durations[pi])); - _of->op[pi].granulepos=cur_packet_gp; - } - OP_ASSERT(total_duration==0); - } - _of->prev_packet_gp=prev_packet_gp; - _of->op_count=pi; - /*If end-trimming didn't trim all the packets, we're done.*/ - if(OP_LIKELY(pi>0))return 1; - } - } - } -} - -int op_raw_seek(OggOpusFile *_of,opus_int64 _pos){ - int ret; - if(OP_UNLIKELY(_of->ready_stateseekable))return OP_ENOSEEK; - if(OP_UNLIKELY(_pos<0)||OP_UNLIKELY(_pos>_of->end))return OP_EINVAL; - /*Clear out any buffered, decoded data.*/ - op_decode_clear(_of); - _of->bytes_tracked=0; - _of->samples_tracked=0; - ret=op_seek_helper(_of,_pos); - if(OP_UNLIKELY(ret<0))return OP_EREAD; - ret=op_fetch_and_process_page(_of,NULL,-1,1,1,1); - /*If we hit EOF, op_fetch_and_process_page() leaves us uninitialized. - Instead, jump to the end.*/ - if(ret==OP_EOF){ - int cur_link; - op_decode_clear(_of); - cur_link=_of->nlinks-1; - _of->cur_link=cur_link; - _of->prev_packet_gp=_of->links[cur_link].pcm_end; - _of->cur_discard_count=0; - ret=0; - } - else if(ret>0)ret=0; - return ret; -} - -/*Convert a PCM offset relative to the start of the whole stream to a granule - position in an individual link.*/ -static ogg_int64_t op_get_granulepos(const OggOpusFile *_of, - ogg_int64_t _pcm_offset,int *_li){ - const OggOpusLink *links; - ogg_int64_t duration; - int nlinks; - int li; - OP_ASSERT(_pcm_offset>=0); - nlinks=_of->nlinks; - links=_of->links; - for(li=0;OP_LIKELY(liOP_INT64_MAX-_pcm_offset)){ - /*Adding this amount to the granule position would overflow the positive - half of its 64-bit range. - Since signed overflow is undefined in C, do it in a way the compiler - isn't allowed to screw up.*/ - _pcm_offset-=OP_INT64_MAX-pcm_start+1; - pcm_start=OP_INT64_MIN; - } - pcm_start+=_pcm_offset; - *_li=li; - return pcm_start; - } - _pcm_offset-=duration; - } - return -1; -} - -/*This controls how close the target has to be to use the current stream - position to subdivide the initial range. - Two minutes seems to be a good default.*/ -#define OP_CUR_TIME_THRESH (120*48*(opus_int32)1000) - -/*Note: The OP_SMALL_FOOTPRINT #define doesn't (currently) save much code size, - but it's meant to serve as documentation for portions of the seeking - algorithm that are purely optional, to aid others learning from/porting this - code to other contexts.*/ -/*#define OP_SMALL_FOOTPRINT (1)*/ - -/*Search within link _li for the page with the highest granule position - preceding (or equal to) _target_gp. - There is a danger here: missing pages or incorrect frame number information - in the bitstream could make our task impossible. - Account for that (and report it as an error condition).*/ -static int op_pcm_seek_page(OggOpusFile *_of, - ogg_int64_t _target_gp,int _li){ - const OggOpusLink *link; - ogg_page og; - ogg_int64_t pcm_pre_skip; - ogg_int64_t pcm_start; - ogg_int64_t pcm_end; - ogg_int64_t best_gp; - ogg_int64_t diff; - ogg_uint32_t serialno; - opus_int32 pre_skip; - opus_int64 begin; - opus_int64 end; - opus_int64 boundary; - opus_int64 best; - opus_int64 page_offset; - opus_int64 d0; - opus_int64 d1; - opus_int64 d2; - int force_bisect; - int ret; - _of->bytes_tracked=0; - _of->samples_tracked=0; - link=_of->links+_li; - best_gp=pcm_start=link->pcm_start; - pcm_end=link->pcm_end; - serialno=link->serialno; - best=begin=link->data_offset; - page_offset=-1; - /*We discard the first 80 ms of data after a seek, so seek back that much - farther. - If we can't, simply seek to the beginning of the link.*/ - if(OP_UNLIKELY(op_granpos_add(&_target_gp,_target_gp,-80*48)<0) - ||OP_UNLIKELY(op_granpos_cmp(_target_gp,pcm_start)<0)){ - _target_gp=pcm_start; - } - /*Special case seeking to the start of the link.*/ - pre_skip=link->head.pre_skip; - OP_ALWAYS_TRUE(!op_granpos_add(&pcm_pre_skip,pcm_start,pre_skip)); - if(op_granpos_cmp(_target_gp,pcm_pre_skip)<0)end=boundary=begin; - else{ - end=boundary=link->end_offset; -#if !defined(OP_SMALL_FOOTPRINT) - /*If we were decoding from this link, we can narrow the range a bit.*/ - if(_li==_of->cur_link&&_of->ready_state>=OP_INITSET){ - opus_int64 offset; - int op_count; - op_count=_of->op_count; - /*The only way the offset can be invalid _and_ we can fail the granule - position checks below is if someone changed the contents of the last - page since we read it. - We'd be within our rights to just return OP_EBADLINK in that case, but - we'll simply ignore the current position instead.*/ - offset=_of->offset; - if(op_count>0&&OP_LIKELY(offset<=end)){ - ogg_int64_t gp; - /*Make sure the timestamp is valid. - The granule position might be -1 if we collected the packets from a - page without a granule position after reporting a hole.*/ - gp=_of->op[op_count-1].granulepos; - if(OP_LIKELY(gp!=-1)&&OP_LIKELY(op_granpos_cmp(pcm_start,gp)<0) - &&OP_LIKELY(op_granpos_cmp(pcm_end,gp)>0)){ - OP_ALWAYS_TRUE(!op_granpos_diff(&diff,gp,_target_gp)); - /*We only actually use the current time if either - a) We can cut off at least half the range, or - b) We're seeking sufficiently close to the current position that - it's likely to be informative. - Otherwise it appears using the whole link range to estimate the - first seek location gives better results, on average.*/ - if(diff<0){ - OP_ASSERT(offset>=begin); - if(offset-begin>=end-begin>>1||diff>-OP_CUR_TIME_THRESH){ - best=begin=offset; - best_gp=pcm_start=gp; - } - } - else{ - ogg_int64_t prev_page_gp; - /*We might get lucky and already have the packet with the target - buffered. - Worth checking. - For very small files (with all of the data in a single page, - generally 1 second or less), we can loop them continuously - without seeking at all.*/ - OP_ALWAYS_TRUE(!op_granpos_add(&prev_page_gp,_of->op[0].granulepos, - op_get_packet_duration(_of->op[0].packet,_of->op[0].bytes))); - if(op_granpos_cmp(prev_page_gp,_target_gp)<=0){ - /*Don't call op_decode_clear(), because it will dump our - packets.*/ - _of->op_pos=0; - _of->od_buffer_size=0; - _of->prev_packet_gp=prev_page_gp; - _of->ready_state=OP_STREAMSET; - return op_make_decode_ready(_of); - } - /*No such luck. - Check if we can cut off at least half the range, though.*/ - if(offset-begin<=end-begin>>1||diff>1; - d1=d2>>1; - d2=end-begin>>1; - if(force_bisect)bisect=begin+(end-begin>>1); - else{ - ogg_int64_t diff2; - OP_ALWAYS_TRUE(!op_granpos_diff(&diff,_target_gp,pcm_start)); - OP_ALWAYS_TRUE(!op_granpos_diff(&diff2,pcm_end,pcm_start)); - /*Take a (pretty decent) guess.*/ - bisect=begin+op_rescale64(diff,diff2,end-begin)-OP_CHUNK_SIZE; - } - if(bisect-OP_CHUNK_SIZEoffset){ - page_offset=-1; - ret=op_seek_helper(_of,bisect); - if(OP_UNLIKELY(ret<0))return ret; - } - chunk_size=OP_CHUNK_SIZE; - next_boundary=boundary; - while(beginoffset; - if(OP_UNLIKELY(op_granpos_cmp(pcm_start,gp)>0) - ||OP_UNLIKELY(op_granpos_cmp(pcm_end,gp)<0)){ - /*Don't let pcm_start get out of range! - That could happen with an invalid timestamp.*/ - break; - } - /*Save the byte offset of the end of the page with this granule - position.*/ - best=begin; - best_gp=pcm_start=gp; - OP_ALWAYS_TRUE(!op_granpos_diff(&diff,_target_gp,pcm_start)); - /*If we're more than a second away from our target, break out and - do another bisection.*/ - if(diff>48000)break; - /*Otherwise, keep scanning forward (do NOT use begin+1).*/ - bisect=begin; - } - else{ - /*We found a page that ends after our target.*/ - /*If we scanned the whole interval before we found it, we're done.*/ - if(bisect<=begin+1)end=begin; - else{ - end=bisect; - /*In later iterations, don't read past the first page we found.*/ - boundary=next_boundary; - /*If we're not making much progress shrinking the interval size, - start forcing straight bisection to limit the worst case.*/ - force_bisect=end-begin>d0*2; - /*Don't let pcm_end get out of range! - That could happen with an invalid timestamp.*/ - if(OP_LIKELY(op_granpos_cmp(pcm_end,gp)>0) - &&OP_LIKELY(op_granpos_cmp(pcm_start,gp)<=0)){ - pcm_end=gp; - } - break; - } - } - } - } - } - /*Found our page. - Seek to the end of it and update prev_packet_gp. - Our caller will set cur_discard_count. - This is an easier case than op_raw_seek(), as we don't need to keep any - packets from the page we found.*/ - /*Seek, if necessary.*/ - if(best!=page_offset){ - page_offset=-1; - ret=op_seek_helper(_of,best); - if(OP_UNLIKELY(ret<0))return ret; - } - OP_ASSERT(op_granpos_cmp(best_gp,pcm_start)>=0); - _of->cur_link=_li; - _of->ready_state=OP_STREAMSET; - _of->prev_packet_gp=best_gp; - ogg_stream_reset_serialno(&_of->os,serialno); - ret=op_fetch_and_process_page(_of,page_offset<0?NULL:&og,page_offset,1,0,1); - if(OP_UNLIKELY(ret<=0))return OP_EBADLINK; - /*Verify result.*/ - if(OP_UNLIKELY(op_granpos_cmp(_of->prev_packet_gp,_target_gp)>0)){ - return OP_EBADLINK; - } - return 0; -} - -int op_pcm_seek(OggOpusFile *_of,ogg_int64_t _pcm_offset){ - const OggOpusLink *link; - ogg_int64_t pcm_start; - ogg_int64_t target_gp; - ogg_int64_t prev_packet_gp; - ogg_int64_t skip; - ogg_int64_t diff; - int op_count; - int op_pos; - int ret; - int li; - if(OP_UNLIKELY(_of->ready_stateseekable))return OP_ENOSEEK; - if(OP_UNLIKELY(_pcm_offset<0))return OP_EINVAL; - target_gp=op_get_granulepos(_of,_pcm_offset,&li); - if(OP_UNLIKELY(target_gp==-1))return OP_EINVAL; - link=_of->links+li; - pcm_start=link->pcm_start; - OP_ALWAYS_TRUE(!op_granpos_diff(&_pcm_offset,target_gp,pcm_start)); -#if !defined(OP_SMALL_FOOTPRINT) - /*For small (90 ms or less) forward seeks within the same link, just decode - forward. - This also optimizes the case of seeking to the current position.*/ - if(li==_of->cur_link&&_of->ready_state>=OP_INITSET){ - ogg_int64_t gp; - gp=_of->prev_packet_gp; - if(OP_LIKELY(gp!=-1)){ - 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; - /*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.*/ - if(discard_count>=0&&OP_UNLIKELY(discard_count<90*48)){ - _of->cur_discard_count=(opus_int32)discard_count; - return 0; - } - } - } - } -#endif - ret=op_pcm_seek_page(_of,target_gp,li); - if(OP_UNLIKELY(ret<0))return ret; - /*Now skip samples until we actually get to our target.*/ - /*Figure out where we should skip to.*/ - if(_pcm_offset<=link->head.pre_skip)skip=0; - else skip=OP_MAX(_pcm_offset-80*48,0); - OP_ASSERT(_pcm_offset-skip>=0); - OP_ASSERT(_pcm_offset-skipop_count; - prev_packet_gp=_of->prev_packet_gp; - for(op_pos=_of->op_pos;op_posop[op_pos].granulepos; - if(OP_LIKELY(!op_granpos_diff(&diff,cur_packet_gp,pcm_start)) - &&diff>skip){ - break; - } - prev_packet_gp=cur_packet_gp; - } - _of->prev_packet_gp=prev_packet_gp; - _of->op_pos=op_pos; - if(op_posskip)return OP_EBADLINK; - OP_ASSERT(_pcm_offset-diffcur_discard_count=(opus_int32)(_pcm_offset-diff); - return 0; -} - -opus_int64 op_raw_tell(const OggOpusFile *_of){ - if(OP_UNLIKELY(_of->ready_stateoffset; -} - -/*Convert a granule position from a given link to a PCM offset relative to the - start of the whole stream. - For unseekable sources, this gets reset to 0 at the beginning of each link.*/ -static ogg_int64_t op_get_pcm_offset(const OggOpusFile *_of, - ogg_int64_t _gp,int _li){ - const OggOpusLink *links; - ogg_int64_t pcm_offset; - ogg_int64_t delta; - int li; - links=_of->links; - pcm_offset=0; - OP_ASSERT(_li<_of->nlinks); - for(li=0;li<_li;li++){ - OP_ALWAYS_TRUE(!op_granpos_diff(&delta, - links[li].pcm_end,links[li].pcm_start)); - delta-=links[li].head.pre_skip; - pcm_offset+=delta; - } - OP_ASSERT(_li>=0); - if(_of->seekable&&OP_UNLIKELY(op_granpos_cmp(_gp,links[_li].pcm_end)>0)){ - _gp=links[_li].pcm_end; - } - if(OP_LIKELY(op_granpos_cmp(_gp,links[_li].pcm_start)>0)){ - if(OP_UNLIKELY(op_granpos_diff(&delta,_gp,links[_li].pcm_start)<0)){ - /*This means an unseekable stream claimed to have a page from more than - 2 billion days after we joined.*/ - OP_ASSERT(!_of->seekable); - return OP_INT64_MAX; - } - if(deltaready_stateprev_packet_gp; - if(gp==-1)return 0; - nbuffered=OP_MAX(_of->od_buffer_size-_of->od_buffer_pos,0); - OP_ALWAYS_TRUE(!op_granpos_add(&gp,gp,-nbuffered)); - li=_of->seekable?_of->cur_link:0; - if(op_granpos_add(&gp,gp,_of->cur_discard_count)<0){ - gp=_of->links[li].pcm_end; - } - return op_get_pcm_offset(_of,gp,li); -} - -void op_set_decode_callback(OggOpusFile *_of, - op_decode_cb_func _decode_cb,void *_ctx){ - _of->decode_cb=_decode_cb; - _of->decode_cb_ctx=_ctx; -} - -int op_set_gain_offset(OggOpusFile *_of, - int _gain_type,opus_int32 _gain_offset_q8){ - if(_gain_type!=OP_HEADER_GAIN&&_gain_type!=OP_TRACK_GAIN - &&_gain_type!=OP_ABSOLUTE_GAIN){ - return OP_EINVAL; - } - _of->gain_type=_gain_type; - /*The sum of header gain and track gain lies in the range [-65536,65534]. - These bounds allow the offset to set the final value to anywhere in the - range [-32768,32767], which is what we'll clamp it to before applying.*/ - _of->gain_offset_q8=OP_CLAMP(-98302,_gain_offset_q8,98303); - op_update_gain(_of); - return 0; -} - -void op_set_dither_enabled(OggOpusFile *_of,int _enabled){ -#if !defined(OP_FIXED_POINT) - _of->dither_disabled=!_enabled; - if(!_enabled)_of->dither_mute=65; -#endif -} - -/*Allocate the decoder scratch buffer. - This is done lazily, since if the user provides large enough buffers, we'll - never need it.*/ -static int op_init_buffer(OggOpusFile *_of){ - int nchannels_max; - if(_of->seekable){ - const OggOpusLink *links; - int nlinks; - int li; - links=_of->links; - nlinks=_of->nlinks; - nchannels_max=1; - for(li=0;liod_buffer=(op_sample *)_ogg_malloc( - sizeof(*_of->od_buffer)*nchannels_max*120*48); - if(_of->od_buffer==NULL)return OP_EFAULT; - return 0; -} - -/*Decode a single packet into the target buffer.*/ -static int op_decode(OggOpusFile *_of,op_sample *_pcm, - const ogg_packet *_op,int _nsamples,int _nchannels){ - int ret; - /*First we try using the application-provided decode callback.*/ - if(_of->decode_cb!=NULL){ -#if defined(OP_FIXED_POINT) - ret=(*_of->decode_cb)(_of->decode_cb_ctx,_of->od,_pcm,_op, - _nsamples,_nchannels,OP_DEC_FORMAT_SHORT,_of->cur_link); -#else - ret=(*_of->decode_cb)(_of->decode_cb_ctx,_of->od,_pcm,_op, - _nsamples,_nchannels,OP_DEC_FORMAT_FLOAT,_of->cur_link); -#endif - } - else ret=OP_DEC_USE_DEFAULT; - /*If the application didn't want to handle decoding, do it ourselves.*/ - if(ret==OP_DEC_USE_DEFAULT){ -#if defined(OP_FIXED_POINT) - ret=opus_multistream_decode(_of->od, - _op->packet,_op->bytes,_pcm,_nsamples,0); -#else - ret=opus_multistream_decode_float(_of->od, - _op->packet,_op->bytes,_pcm,_nsamples,0); -#endif - OP_ASSERT(ret<0||ret==_nsamples); - } - /*If the application returned a positive value other than 0 or - OP_DEC_USE_DEFAULT, fail.*/ - else if(OP_UNLIKELY(ret>0))return OP_EBADPACKET; - if(OP_UNLIKELY(ret<0))return OP_EBADPACKET; - return ret; -} - -/*Read more samples from the stream, using the same API as op_read() or - op_read_float().*/ -static int op_read_native(OggOpusFile *_of, - op_sample *_pcm,int _buf_size,int *_li){ - if(OP_UNLIKELY(_of->ready_stateready_state>=OP_INITSET)){ - int nchannels; - int od_buffer_pos; - int nsamples; - int op_pos; - nchannels=_of->links[_of->seekable?_of->cur_link:0].head.channel_count; - od_buffer_pos=_of->od_buffer_pos; - nsamples=_of->od_buffer_size-od_buffer_pos; - /*If we have buffered samples, return them.*/ - if(nsamples>0){ - if(nsamples*nchannels>_buf_size)nsamples=_buf_size/nchannels; - memcpy(_pcm,_of->od_buffer+nchannels*od_buffer_pos, - sizeof(*_pcm)*nchannels*nsamples); - od_buffer_pos+=nsamples; - _of->od_buffer_pos=od_buffer_pos; - if(_li!=NULL)*_li=_of->cur_link; - return nsamples; - } - /*If we have buffered packets, decode one.*/ - op_pos=_of->op_pos; - if(OP_LIKELY(op_pos<_of->op_count)){ - const ogg_packet *pop; - ogg_int64_t diff; - opus_int32 cur_discard_count; - int duration; - int trimmed_duration; - pop=_of->op+op_pos++; - _of->op_pos=op_pos; - cur_discard_count=_of->cur_discard_count; - duration=op_get_packet_duration(pop->packet,pop->bytes); - /*We don't buffer packets with an invalid TOC sequence.*/ - OP_ASSERT(duration>0); - trimmed_duration=duration; - /*Perform end-trimming.*/ - if(OP_UNLIKELY(pop->e_o_s)){ - if(OP_UNLIKELY(op_granpos_cmp(pop->granulepos, - _of->prev_packet_gp)<=0)){ - trimmed_duration=0; - } - else if(OP_LIKELY(!op_granpos_diff(&diff, - pop->granulepos,_of->prev_packet_gp))){ - trimmed_duration=(int)OP_MIN(diff,trimmed_duration); - } - } - _of->prev_packet_gp=pop->granulepos; - if(OP_UNLIKELY(duration*nchannels>_buf_size)){ - op_sample *buf; - /*If the user's buffer is too small, decode into a scratch buffer.*/ - buf=_of->od_buffer; - if(OP_UNLIKELY(buf==NULL)){ - ret=op_init_buffer(_of); - if(OP_UNLIKELY(ret<0))return ret; - buf=_of->od_buffer; - } - ret=op_decode(_of,buf,pop,duration,nchannels); - if(OP_UNLIKELY(ret<0))return ret; - /*Perform pre-skip/pre-roll.*/ - od_buffer_pos=(int)OP_MIN(trimmed_duration,cur_discard_count); - cur_discard_count-=od_buffer_pos; - _of->cur_discard_count=cur_discard_count; - _of->od_buffer_pos=od_buffer_pos; - _of->od_buffer_size=trimmed_duration; - /*Update bitrate tracking based on the actual samples we used from - what was decoded.*/ - _of->bytes_tracked+=pop->bytes; - _of->samples_tracked+=trimmed_duration-od_buffer_pos; - } - else{ - /*Otherwise decode directly into the user's buffer.*/ - ret=op_decode(_of,_pcm,pop,duration,nchannels); - if(OP_UNLIKELY(ret<0))return ret; - if(OP_LIKELY(trimmed_duration>0)){ - /*Perform pre-skip/pre-roll.*/ - od_buffer_pos=(int)OP_MIN(trimmed_duration,cur_discard_count); - cur_discard_count-=od_buffer_pos; - _of->cur_discard_count=cur_discard_count; - trimmed_duration-=od_buffer_pos; - if(OP_LIKELY(trimmed_duration>0) - &&OP_UNLIKELY(od_buffer_pos>0)){ - memmove(_pcm,_pcm+od_buffer_pos*nchannels, - sizeof(*_pcm)*trimmed_duration*nchannels); - } - /*Update bitrate tracking based on the actual samples we used from - what was decoded.*/ - _of->bytes_tracked+=pop->bytes; - _of->samples_tracked+=trimmed_duration; - if(OP_LIKELY(trimmed_duration>0)){ - if(_li!=NULL)*_li=_of->cur_link; - return trimmed_duration; - } - } - } - /*Don't grab another page yet. - This one might have more packets, or might have buffered data now.*/ - continue; - } - } - /*Suck in another page.*/ - ret=op_fetch_and_process_page(_of,NULL,-1,1,1,0); - if(OP_UNLIKELY(ret==OP_EOF)){ - if(_li!=NULL)*_li=_of->cur_link; - return 0; - } - if(OP_UNLIKELY(ret<0))return ret; - } -} - -/*A generic filter to apply to the decoded audio data. - _src is non-const because we will destructively modify the contents of the - source buffer that we consume in some cases.*/ -typedef int (*op_read_filter_func)(OggOpusFile *_of,void *_dst,int _dst_sz, - op_sample *_src,int _nsamples,int _nchannels); - -/*Decode some samples and then apply a custom filter to them. - This is used to convert to different output formats.*/ -static int op_filter_read_native(OggOpusFile *_of,void *_dst,int _dst_sz, - op_read_filter_func _filter,int *_li){ - int ret; - /*Ensure we have some decoded samples in our buffer.*/ - ret=op_read_native(_of,NULL,0,_li); - /*Now apply the filter to them.*/ - if(OP_LIKELY(ret>=0)&&OP_LIKELY(_of->ready_state>=OP_INITSET)){ - int od_buffer_pos; - od_buffer_pos=_of->od_buffer_pos; - ret=_of->od_buffer_size-od_buffer_pos; - if(OP_LIKELY(ret>0)){ - int nchannels; - nchannels=_of->links[_of->seekable?_of->cur_link:0].head.channel_count; - ret=(*_filter)(_of,_dst,_dst_sz, - _of->od_buffer+nchannels*od_buffer_pos,ret,nchannels); - OP_ASSERT(ret>=0); - OP_ASSERT(ret<=_of->od_buffer_size-od_buffer_pos); - od_buffer_pos+=ret; - _of->od_buffer_pos=od_buffer_pos; - } - } - return ret; -} - -#if !defined(OP_FIXED_POINT)||!defined(OP_DISABLE_FLOAT_API) - -/*Matrices for downmixing from the supported channel counts to stereo. - The matrices with 5 or more channels are normalized to a total volume of 2.0, - since most mixes sound too quiet if normalized to 1.0 (as there is generally - little volume in the side/rear channels).*/ -static const float OP_STEREO_DOWNMIX[OP_NCHANNELS_MAX-2][OP_NCHANNELS_MAX][2]={ - /*3.0*/ - { - {0.5858F,0.0F},{0.4142F,0.4142F},{0.0F,0.5858F} - }, - /*quadrophonic*/ - { - {0.4226F,0.0F},{0.0F,0.4226F},{0.366F,0.2114F},{0.2114F,0.336F} - }, - /*5.0*/ - { - {0.651F,0.0F},{0.46F,0.46F},{0.0F,0.651F},{0.5636F,0.3254F}, - {0.3254F,0.5636F} - }, - /*5.1*/ - { - {0.529F,0.0F},{0.3741F,0.3741F},{0.0F,0.529F},{0.4582F,0.2645F}, - {0.2645F,0.4582F},{0.3741F,0.3741F} - }, - /*6.1*/ - { - {0.4553F,0.0F},{0.322F,0.322F},{0.0F,0.4553F},{0.3943F,0.2277F}, - {0.2277F,0.3943F},{0.2788F,0.2788F},{0.322F,0.322F} - }, - /*7.1*/ - { - {0.3886F,0.0F},{0.2748F,0.2748F},{0.0F,0.3886F},{0.3366F,0.1943F}, - {0.1943F,0.3366F},{0.3366F,0.1943F},{0.1943F,0.3366F},{0.2748F,0.2748F} - } -}; - -#endif - -#if defined(OP_FIXED_POINT) - -/*Matrices for downmixing from the supported channel counts to stereo. - The matrices with 5 or more channels are normalized to a total volume of 2.0, - since most mixes sound too quiet if normalized to 1.0 (as there is generally - little volume in the side/rear channels). - Hence we keep the coefficients in Q14, so the downmix values won't overflow a - 32-bit number.*/ -static const opus_int16 OP_STEREO_DOWNMIX_Q14 - [OP_NCHANNELS_MAX-2][OP_NCHANNELS_MAX][2]={ - /*3.0*/ - { - {9598,0},{6786,6786},{0,9598} - }, - /*quadrophonic*/ - { - {6924,0},{0,6924},{5996,3464},{3464,5996} - }, - /*5.0*/ - { - {10666,0},{7537,7537},{0,10666},{9234,5331},{5331,9234} - }, - /*5.1*/ - { - {8668,0},{6129,6129},{0,8668},{7507,4335},{4335,7507},{6129,6129} - }, - /*6.1*/ - { - {7459,0},{5275,5275},{0,7459},{6460,3731},{3731,6460},{4568,4568}, - {5275,5275} - }, - /*7.1*/ - { - {6368,0},{4502,4502},{0,6368},{5515,3183},{3183,5515},{5515,3183}, - {3183,5515},{4502,4502} - } -}; - -int op_read(OggOpusFile *_of,opus_int16 *_pcm,int _buf_size,int *_li){ - return op_read_native(_of,_pcm,_buf_size,_li); -} - -static int op_stereo_filter(OggOpusFile *_of,void *_dst,int _dst_sz, - op_sample *_src,int _nsamples,int _nchannels){ - (void)_of; - _nsamples=OP_MIN(_nsamples,_dst_sz>>1); - if(_nchannels==2)memcpy(_dst,_src,_nsamples*2*sizeof(*_src)); - else{ - opus_int16 *dst; - int i; - dst=(opus_int16 *)_dst; - if(_nchannels==1){ - for(i=0;i<_nsamples;i++)dst[2*i+0]=dst[2*i+1]=_src[i]; - } - else{ - for(i=0;i<_nsamples;i++){ - opus_int32 l; - opus_int32 r; - int ci; - l=r=0; - for(ci=0;ci<_nchannels;ci++){ - opus_int32 s; - s=_src[_nchannels*i+ci]; - l+=OP_STEREO_DOWNMIX_Q14[_nchannels-3][ci][0]*s; - r+=OP_STEREO_DOWNMIX_Q14[_nchannels-3][ci][1]*s; - } - /*TODO: For 5 or more channels, we should do soft clipping here.*/ - dst[2*i+0]=(opus_int16)OP_CLAMP(-32768,l+8192>>14,32767); - dst[2*i+1]=(opus_int16)OP_CLAMP(-32768,r+8192>>14,32767); - } - } - } - return _nsamples; -} - -int op_read_stereo(OggOpusFile *_of,opus_int16 *_pcm,int _buf_size){ - return op_filter_read_native(_of,_pcm,_buf_size,op_stereo_filter,NULL); -} - -# if !defined(OP_DISABLE_FLOAT_API) - -static int op_short2float_filter(OggOpusFile *_of,void *_dst,int _dst_sz, - op_sample *_src,int _nsamples,int _nchannels){ - float *dst; - int i; - (void)_of; - dst=(float *)_dst; - if(OP_UNLIKELY(_nsamples*_nchannels>_dst_sz))_nsamples=_dst_sz/_nchannels; - _dst_sz=_nsamples*_nchannels; - for(i=0;i<_dst_sz;i++)dst[i]=(1.0F/32768)*_src[i]; - return _nsamples; -} - -int op_read_float(OggOpusFile *_of,float *_pcm,int _buf_size,int *_li){ - return op_filter_read_native(_of,_pcm,_buf_size,op_short2float_filter,_li); -} - -static int op_short2float_stereo_filter(OggOpusFile *_of, - void *_dst,int _dst_sz,op_sample *_src,int _nsamples,int _nchannels){ - float *dst; - int i; - dst=(float *)_dst; - _nsamples=OP_MIN(_nsamples,_dst_sz>>1); - if(_nchannels==1){ - _nsamples=op_short2float_filter(_of,dst,_nsamples,_src,_nsamples,1); - for(i=_nsamples;i-->0;)dst[2*i+0]=dst[2*i+1]=dst[i]; - } - else if(_nchannels<5){ - /*For 3 or 4 channels, we can downmix in fixed point without risk of - clipping.*/ - if(_nchannels>2){ - _nsamples=op_stereo_filter(_of,_src,_nsamples*2, - _src,_nsamples,_nchannels); - } - return op_short2float_filter(_of,dst,_dst_sz,_src,_nsamples,2); - } - else{ - /*For 5 or more channels, we convert to floats and then downmix (so that we - don't risk clipping).*/ - for(i=0;i<_nsamples;i++){ - float l; - float r; - int ci; - l=r=0; - for(ci=0;ci<_nchannels;ci++){ - float s; - s=(1.0F/32768)*_src[_nchannels*i+ci]; - l+=OP_STEREO_DOWNMIX[_nchannels-3][ci][0]*s; - r+=OP_STEREO_DOWNMIX[_nchannels-3][ci][1]*s; - } - dst[2*i+0]=l; - dst[2*i+1]=r; - } - } - return _nsamples; -} - -int op_read_float_stereo(OggOpusFile *_of,float *_pcm,int _buf_size){ - return op_filter_read_native(_of,_pcm,_buf_size, - op_short2float_stereo_filter,NULL); -} - -# endif - -#else - -# if defined(OP_HAVE_LRINTF) -# include -# define op_float2int(_x) (lrintf(_x)) -# else -# define op_float2int(_x) ((int)((_x)+((_x)<0?-0.5F:0.5F))) -# endif - -/*The dithering code here is adapted from opusdec, part of opus-tools. - It was originally written by Greg Maxwell.*/ - -static opus_uint32 op_rand(opus_uint32 _seed){ - return _seed*96314165+907633515&0xFFFFFFFFU; -} - -/*This implements 16-bit quantization with full triangular dither and IIR noise - shaping. - The noise shaping filters were designed by Sebastian Gesemann, and are based - on the LAME ATH curves with flattening to limit their peak gain to 20 dB. - Everyone else's noise shaping filters are mildly crazy. - The 48 kHz version of this filter is just a warped version of the 44.1 kHz - filter and probably could be improved by shifting the HF shelf up in - frequency a little bit, since 48 kHz has a bit more room and being more - conservative against bat-ears is probably more important than more noise - suppression. - This process can increase the peak level of the signal (in theory by the peak - error of 1.5 +20 dB, though that is unobservably rare). - To avoid clipping, the signal is attenuated by a couple thousandths of a dB. - Initially, the approach taken here was to only attenuate by the 99.9th - percentile, making clipping rare but not impossible (like SoX), but the - limited gain of the filter means that the worst case was only two - thousandths of a dB more, so this just uses the worst case. - The attenuation is probably also helpful to prevent clipping in the DAC - reconstruction filters or downstream resampling, in any case.*/ - -# define OP_GAIN (32753.0F) - -# define OP_PRNG_GAIN (1.0F/0xFFFFFFFF) - -/*48 kHz noise shaping filter, sd=2.34.*/ - -static const float OP_FCOEF_B[4]={ - 2.2374F,-0.7339F,-0.1251F,-0.6033F -}; - -static const float OP_FCOEF_A[4]={ - 0.9030F,0.0116F,-0.5853F,-0.2571F -}; - -static int op_float2short_filter(OggOpusFile *_of,void *_dst,int _dst_sz, - float *_src,int _nsamples,int _nchannels){ - opus_int16 *dst; - int ci; - int i; - dst=(opus_int16 *)_dst; - if(OP_UNLIKELY(_nsamples*_nchannels>_dst_sz))_nsamples=_dst_sz/_nchannels; -# if defined(OP_SOFT_CLIP) - if(_of->state_channel_count!=_nchannels){ - for(ci=0;ci<_nchannels;ci++)_of->clip_state[ci]=0; - } - opus_pcm_soft_clip(_src,_nsamples,_nchannels,_of->clip_state); -# endif - if(_of->dither_disabled){ - for(i=0;i<_nchannels*_nsamples;i++){ - dst[i]=op_float2int(OP_CLAMP(-32768,32768.0F*_src[i],32767)); - } - } - else{ - opus_uint32 seed; - int mute; - seed=_of->dither_seed; - mute=_of->dither_mute; - if(_of->state_channel_count!=_nchannels)mute=65; - /*In order to avoid replacing digital silence with quiet dither noise, we - mute if the output has been silent for a while.*/ - if(mute>64)memset(_of->dither_a,0,sizeof(*_of->dither_a)*4*_nchannels); - for(i=0;i<_nsamples;i++){ - int silent; - silent=1; - for(ci=0;ci<_nchannels;ci++){ - float r; - float s; - float err; - int si; - int j; - s=_src[_nchannels*i+ci]; - silent&=s==0; - s*=OP_GAIN; - err=0; - for(j=0;j<4;j++){ - err+=OP_FCOEF_B[j]*_of->dither_b[ci*4+j] - -OP_FCOEF_A[j]*_of->dither_a[ci*4+j]; - } - for(j=3;j-->0;)_of->dither_a[ci*4+j+1]=_of->dither_a[ci*4+j]; - for(j=3;j-->0;)_of->dither_b[ci*4+j+1]=_of->dither_b[ci*4+j]; - _of->dither_a[ci*4]=err; - s-=err; - if(mute>16)r=0; - else{ - seed=op_rand(seed); - r=seed*OP_PRNG_GAIN; - seed=op_rand(seed); - r-=seed*OP_PRNG_GAIN; - } - /*Clamp in float out of paranoia that the input will be > 96 dBFS and - wrap if the integer is clamped.*/ - si=op_float2int(OP_CLAMP(-32768,s+r,32767)); - dst[_nchannels*i+ci]=(opus_int16)si; - /*Including clipping in the noise shaping is generally disastrous: the - futile effort to restore the clipped energy results in more clipping. - However, small amounts---at the level which could normally be created - by dither and rounding---are harmless and can even reduce clipping - somewhat due to the clipping sometimes reducing the dither + rounding - error.*/ - _of->dither_b[ci*4]=mute>16?0:OP_CLAMP(-1.5F,si-s,1.5F); - } - mute++; - if(!silent)mute=0; - } - _of->dither_mute=OP_MIN(mute,65); - _of->dither_seed=seed; - } - _of->state_channel_count=_nchannels; - return _nsamples; -} - -int op_read(OggOpusFile *_of,opus_int16 *_pcm,int _buf_size,int *_li){ - return op_filter_read_native(_of,_pcm,_buf_size,op_float2short_filter,_li); -} - -int op_read_float(OggOpusFile *_of,float *_pcm,int _buf_size,int *_li){ - _of->state_channel_count=0; - return op_read_native(_of,_pcm,_buf_size,_li); -} - -static int op_stereo_filter(OggOpusFile *_of,void *_dst,int _dst_sz, - op_sample *_src,int _nsamples,int _nchannels){ - (void)_of; - _nsamples=OP_MIN(_nsamples,_dst_sz>>1); - if(_nchannels==2)memcpy(_dst,_src,_nsamples*2*sizeof(*_src)); - else{ - float *dst; - int i; - dst=(float *)_dst; - if(_nchannels==1){ - for(i=0;i<_nsamples;i++)dst[2*i+0]=dst[2*i+1]=_src[i]; - } - else{ - for(i=0;i<_nsamples;i++){ - float l; - float r; - int ci; - l=r=0; - for(ci=0;ci<_nchannels;ci++){ - l+=OP_STEREO_DOWNMIX[_nchannels-3][ci][0]*_src[_nchannels*i+ci]; - r+=OP_STEREO_DOWNMIX[_nchannels-3][ci][1]*_src[_nchannels*i+ci]; - } - dst[2*i+0]=l; - dst[2*i+1]=r; - } - } - } - return _nsamples; -} - -static int op_float2short_stereo_filter(OggOpusFile *_of, - void *_dst,int _dst_sz,op_sample *_src,int _nsamples,int _nchannels){ - opus_int16 *dst; - dst=(opus_int16 *)_dst; - if(_nchannels==1){ - int i; - _nsamples=op_float2short_filter(_of,dst,_dst_sz>>1,_src,_nsamples,1); - for(i=_nsamples;i-->0;)dst[2*i+0]=dst[2*i+1]=dst[i]; - } - else{ - if(_nchannels>2){ - _nsamples=OP_MIN(_nsamples,_dst_sz>>1); - _nsamples=op_stereo_filter(_of,_src,_nsamples*2, - _src,_nsamples,_nchannels); - } - _nsamples=op_float2short_filter(_of,dst,_dst_sz,_src,_nsamples,2); - } - return _nsamples; -} - -int op_read_stereo(OggOpusFile *_of,opus_int16 *_pcm,int _buf_size){ - return op_filter_read_native(_of,_pcm,_buf_size, - op_float2short_stereo_filter,NULL); -} - -int op_read_float_stereo(OggOpusFile *_of,float *_pcm,int _buf_size){ - _of->state_channel_count=0; - return op_filter_read_native(_of,_pcm,_buf_size,op_stereo_filter,NULL); -} - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/src/stream.c b/sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/src/stream.c deleted file mode 100644 index 0238a6b3..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/src/stream.c +++ /dev/null @@ -1,366 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE libopusfile SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE libopusfile SOURCE CODE IS (C) COPYRIGHT 1994-2012 * - * by the Xiph.Org Foundation and contributors http://www.xiph.org/ * - * * - ******************************************************************** - - function: stdio-based convenience library for opening/seeking/decoding - last mod: $Id: vorbisfile.c 17573 2010-10-27 14:53:59Z xiphmont $ - - ********************************************************************/ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "internal.h" -#include -#include -#include -#include -#include -#if defined(_WIN32) -# include -#endif - -typedef struct OpusMemStream OpusMemStream; - -#define OP_MEM_SIZE_MAX (~(size_t)0>>1) -#define OP_MEM_DIFF_MAX ((ptrdiff_t)OP_MEM_SIZE_MAX) - -/*The context information needed to read from a block of memory as if it were a - file.*/ -struct OpusMemStream{ - /*The block of memory to read from.*/ - const unsigned char *data; - /*The total size of the block. - This must be at most OP_MEM_SIZE_MAX to prevent signed overflow while - seeking.*/ - ptrdiff_t size; - /*The current file position. - This is allowed to be set arbitrarily greater than size (i.e., past the end - of the block, though we will not read data past the end of the block), but - is not allowed to be negative (i.e., before the beginning of the block).*/ - ptrdiff_t pos; -}; - -static int op_fread(void *_stream,unsigned char *_ptr,int _buf_size){ - FILE *stream; - size_t ret; - /*Check for empty read.*/ - if(_buf_size<=0)return 0; - stream=(FILE *)_stream; - ret=fread(_ptr,1,_buf_size,stream); - OP_ASSERT(ret<=(size_t)_buf_size); - /*If ret==0 and !feof(stream), there was a read error.*/ - return ret>0||feof(stream)?(int)ret:OP_EREAD; -} - -static int op_fseek(void *_stream,opus_int64 _offset,int _whence){ -#if defined(_WIN32) - /*_fseeki64() is not exposed until MSCVCRT80. - This is the default starting with MSVC 2005 (_MSC_VER>=1400), but we want - to allow linking against older MSVCRT versions for compatibility back to - XP without installing extra runtime libraries. - i686-pc-mingw32 does not have fseeko() and requires - __MSVCRT_VERSION__>=0x800 for _fseeki64(), which screws up linking with - other libraries (that don't use MSVCRT80 from MSVC 2005 by default). - i686-w64-mingw32 does have fseeko() and respects _FILE_OFFSET_BITS, but I - don't know how to detect that at compile time. - We could just use fseeko64() (which is available in both), but its - implemented using fgetpos()/fsetpos() just like this code, except without - the overflow checking, so we prefer our version.*/ - opus_int64 pos; - /*We don't use fpos_t directly because it might be a struct if __STDC__ is - non-zero or _INTEGRAL_MAX_BITS < 64. - I'm not certain when the latter is true, but someone could in theory set - the former. - Either way, it should be binary compatible with a normal 64-bit int (this - assumption is not portable, but I believe it is true for MSVCRT).*/ - OP_ASSERT(sizeof(pos)==sizeof(fpos_t)); - /*Translate the seek to an absolute one.*/ - if(_whence==SEEK_CUR){ - int ret; - ret=fgetpos((FILE *)_stream,(fpos_t *)&pos); - if(ret)return ret; - } - else if(_whence==SEEK_END)pos=_filelengthi64(_fileno((FILE *)_stream)); - else if(_whence==SEEK_SET)pos=0; - else return -1; - /*Check for errors or overflow.*/ - if(pos<0||_offset<-pos||_offset>OP_INT64_MAX-pos)return -1; - pos+=_offset; - return fsetpos((FILE *)_stream,(fpos_t *)&pos); -#else - /*This function actually conforms to the SUSv2 and POSIX.1-2001, so we prefer - it except on Windows.*/ - return fseeko((FILE *)_stream,(off_t)_offset,_whence); -#endif -} - -static opus_int64 op_ftell(void *_stream){ -#if defined(_WIN32) - /*_ftelli64() is not exposed until MSCVCRT80, and ftello()/ftello64() have - the same problems as fseeko()/fseeko64() in MingW. - See above for a more detailed explanation.*/ - opus_int64 pos; - OP_ASSERT(sizeof(pos)==sizeof(fpos_t)); - return fgetpos((FILE *)_stream,(fpos_t *)&pos)?-1:pos; -#else - /*This function actually conforms to the SUSv2 and POSIX.1-2001, so we prefer - it except on Windows.*/ - return ftello((FILE *)_stream); -#endif -} - -static const OpusFileCallbacks OP_FILE_CALLBACKS={ - op_fread, - op_fseek, - op_ftell, - (op_close_func)fclose -}; - -#if defined(_WIN32) -# include -# include - -/*Windows doesn't accept UTF-8 by default, and we don't have a wchar_t API, - so if we just pass the path to fopen(), then there'd be no way for a user - of our API to open a Unicode filename. - Instead, we translate from UTF-8 to UTF-16 and use Windows' wchar_t API. - This makes this API more consistent with platforms where the character set - used by fopen is the same as used on disk, which is generally UTF-8, and - with our metadata API, which always uses UTF-8.*/ -static wchar_t *op_utf8_to_utf16(const char *_src){ - wchar_t *dst; - size_t len; - len=strlen(_src); - /*Worst-case output is 1 wide character per 1 input character.*/ - dst=(wchar_t *)_ogg_malloc(sizeof(*dst)*(len+1)); - if(dst!=NULL){ - size_t si; - size_t di; - for(di=si=0;si=0x80U){ - /*This is a 2-byte sequence that is not overlong.*/ - dst[di++]=w; - si++; - continue; - } - } - else{ - int c2; - /*This is safe, because c1 was not 0 and _src is NUL-terminated.*/ - c2=(unsigned char)_src[si+2]; - if((c2&0xC0)==0x80){ - /*Found at least two continuation bytes.*/ - if((c0&0xF0)==0xE0){ - wchar_t w; - /*Start byte says this is a 3-byte sequence.*/ - w=(c0&0xF)<<12|(c1&0x3F)<<6|c2&0x3F; - if(w>=0x800U&&(w<0xD800||w>=0xE000)&&w<0xFFFE){ - /*This is a 3-byte sequence that is not overlong, not a - UTF-16 surrogate pair value, and not a 'not a character' - value.*/ - dst[di++]=w; - si+=2; - continue; - } - } - else{ - int c3; - /*This is safe, because c2 was not 0 and _src is - NUL-terminated.*/ - c3=(unsigned char)_src[si+3]; - if((c3&0xC0)==0x80){ - /*Found at least three continuation bytes.*/ - if((c0&0xF8)==0xF0){ - opus_uint32 w; - /*Start byte says this is a 4-byte sequence.*/ - w=(c0&7)<<18|(c1&0x3F)<<12|(c2&0x3F)<<6&(c3&0x3F); - if(w>=0x10000U&&w<0x110000U){ - /*This is a 4-byte sequence that is not overlong and not - greater than the largest valid Unicode code point. - Convert it to a surrogate pair.*/ - w-=0x10000; - dst[di++]=(wchar_t)(0xD800+(w>>10)); - dst[di++]=(wchar_t)(0xDC00+(w&0x3FF)); - si+=3; - continue; - } - } - } - } - } - } - } - } - /*If we got here, we encountered an illegal UTF-8 sequence.*/ - _ogg_free(dst); - return NULL; - } - OP_ASSERT(di<=len); - dst[di]='\0'; - } - return dst; -} - -#endif - -void *op_fopen(OpusFileCallbacks *_cb,const char *_path,const char *_mode){ - FILE *fp; -#if !defined(_WIN32) - fp=fopen(_path,_mode); -#else - fp=NULL; - if(_path==NULL||_mode==NULL)errno=EINVAL; - else{ - wchar_t *wpath; - wchar_t *wmode; - wpath=op_utf8_to_utf16(_path); - wmode=op_utf8_to_utf16(_mode); - if(wmode==NULL)errno=EINVAL; - else if(wpath==NULL)errno=ENOENT; - else fp=_wfopen(wpath,wmode); - _ogg_free(wmode); - _ogg_free(wpath); - } -#endif - if(fp!=NULL)*_cb=*&OP_FILE_CALLBACKS; - return fp; -} - -void *op_fdopen(OpusFileCallbacks *_cb,int _fd,const char *_mode){ - FILE *fp; - fp=fdopen(_fd,_mode); - if(fp!=NULL)*_cb=*&OP_FILE_CALLBACKS; - return fp; -} - -void *op_freopen(OpusFileCallbacks *_cb,const char *_path,const char *_mode, - void *_stream){ - FILE *fp; -#if !defined(_WIN32) - fp=freopen(_path,_mode,(FILE *)_stream); -#else - fp=NULL; - if(_path==NULL||_mode==NULL)errno=EINVAL; - else{ - wchar_t *wpath; - wchar_t *wmode; - wpath=op_utf8_to_utf16(_path); - wmode=op_utf8_to_utf16(_mode); - if(wmode==NULL)errno=EINVAL; - else if(wpath==NULL)errno=ENOENT; - else fp=_wfreopen(wpath,wmode,(FILE *)_stream); - _ogg_free(wmode); - _ogg_free(wpath); - } -#endif - if(fp!=NULL)*_cb=*&OP_FILE_CALLBACKS; - return fp; -} - -static int op_mem_read(void *_stream,unsigned char *_ptr,int _buf_size){ - OpusMemStream *stream; - ptrdiff_t size; - ptrdiff_t pos; - stream=(OpusMemStream *)_stream; - /*Check for empty read.*/ - if(_buf_size<=0)return 0; - size=stream->size; - pos=stream->pos; - /*Check for EOF.*/ - if(pos>=size)return 0; - /*Check for a short read.*/ - _buf_size=(int)OP_MIN(size-pos,_buf_size); - memcpy(_ptr,stream->data+pos,_buf_size); - pos+=_buf_size; - stream->pos=pos; - return _buf_size; -} - -static int op_mem_seek(void *_stream,opus_int64 _offset,int _whence){ - OpusMemStream *stream; - ptrdiff_t pos; - stream=(OpusMemStream *)_stream; - pos=stream->pos; - OP_ASSERT(pos>=0); - switch(_whence){ - case SEEK_SET:{ - /*Check for overflow:*/ - if(_offset<0||_offset>OP_MEM_DIFF_MAX)return -1; - pos=(ptrdiff_t)_offset; - }break; - case SEEK_CUR:{ - /*Check for overflow:*/ - if(_offset<-pos||_offset>OP_MEM_DIFF_MAX-pos)return -1; - pos=(ptrdiff_t)(pos+_offset); - }break; - case SEEK_END:{ - ptrdiff_t size; - size=stream->size; - OP_ASSERT(size>=0); - /*Check for overflow:*/ - if(_offset>size||_offsetpos=pos; - return 0; -} - -static opus_int64 op_mem_tell(void *_stream){ - OpusMemStream *stream; - stream=(OpusMemStream *)_stream; - return (ogg_int64_t)stream->pos; -} - -static int op_mem_close(void *_stream){ - _ogg_free(_stream); - return 0; -} - -static const OpusFileCallbacks OP_MEM_CALLBACKS={ - op_mem_read, - op_mem_seek, - op_mem_tell, - op_mem_close -}; - -void *op_mem_stream_create(OpusFileCallbacks *_cb, - const unsigned char *_data,size_t _size){ - OpusMemStream *stream; - if(_size>OP_MEM_SIZE_MAX)return NULL; - stream=(OpusMemStream *)_ogg_malloc(sizeof(*stream)); - if(stream!=NULL){ - *_cb=*&OP_MEM_CALLBACKS; - stream->data=_data; - stream->size=_size; - stream->pos=0; - } - return stream; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/src/wincerts.c b/sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/src/wincerts.c deleted file mode 100644 index b0e35aa3..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/opusfile/src/wincerts.c +++ /dev/null @@ -1,171 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE libopusfile SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE libopusfile SOURCE CODE IS (C) COPYRIGHT 2013 * - * by the Xiph.Org Foundation and contributors http://www.xiph.org/ * - * * - ********************************************************************/ - -/*This should really be part of OpenSSL, but there's been a patch [1] sitting - in their bugtracker for over two years that implements this, without any - action, so I'm giving up and re-implementing it locally. - - [1] */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "internal.h" -#if defined(OP_ENABLE_HTTP)&&defined(_WIN32) -/*You must include windows.h before wincrypt.h and x509.h.*/ -# define WIN32_LEAN_AND_MEAN -# define WIN32_EXTRA_LEAN -# include -/*You must include wincrypt.h before x509.h, too, or X509_NAME doesn't get - defined properly.*/ -# include -# include -# include -# include - -static int op_capi_new(X509_LOOKUP *_lu){ - HCERTSTORE h_store; - h_store=CertOpenStore(CERT_STORE_PROV_SYSTEM_A,0,0, - CERT_STORE_OPEN_EXISTING_FLAG|CERT_STORE_READONLY_FLAG| - CERT_SYSTEM_STORE_CURRENT_USER|CERT_STORE_SHARE_CONTEXT_FLAG,"ROOT"); - if(h_store!=NULL){ - _lu->method_data=(char *)h_store; - return 1; - } - return 0; -} - -static void op_capi_free(X509_LOOKUP *_lu){ - HCERTSTORE h_store; - h_store=(HCERTSTORE)_lu->method_data; -# if defined(OP_ENABLE_ASSERTIONS) - OP_ALWAYS_TRUE(CertCloseStore(h_store,CERT_CLOSE_STORE_CHECK_FLAG)); -# else - CertCloseStore(h_store,0); -# endif -} - -static int op_capi_retrieve_by_subject(X509_LOOKUP *_lu,int _type, - X509_NAME *_name,X509_OBJECT *_ret){ - X509_OBJECT *obj; - CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); - obj=X509_OBJECT_retrieve_by_subject(_lu->store_ctx->objs,_type,_name); - CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); - if(obj!=NULL){ - _ret->type=obj->type; - memcpy(&_ret->data,&obj->data,sizeof(_ret->data)); - return 1; - } - return 0; -} - -static int op_capi_get_by_subject(X509_LOOKUP *_lu,int _type,X509_NAME *_name, - X509_OBJECT *_ret){ - HCERTSTORE h_store; - if(_name==NULL)return 0; - if(_name->bytes==NULL||_name->bytes->length<=0||_name->modified){ - if(i2d_X509_NAME(_name,NULL)<0)return 0; - OP_ASSERT(_name->bytes->length>0); - } - h_store=(HCERTSTORE)_lu->method_data; - switch(_type){ - case X509_LU_X509:{ - CERT_NAME_BLOB find_para; - PCCERT_CONTEXT cert; - X509 *x; - int ret; - /*Although X509_NAME contains a canon_enc field, that "canonical" [1] - encoding was just made up by OpenSSL. - It doesn't correspond to any actual standard, and since it drops the - initial sequence header, won't be recognized by the Crypto API. - The assumption here is that CertFindCertificateInStore() will allow any - appropriate variations in the encoding when it does its comparison. - This is, however, emphatically not true under Wine, which just compares - the encodings with memcmp(). - Most of the time things work anyway, though, and there isn't really - anything we can do to make the situation better. - - [1] A "canonical form" is defined as the one where, if you locked 10 - mathematicians in a room and asked them to come up with a - representation for something, it's the answer that 9 of them would - give you back. - I don't think OpenSSL's encoding qualifies.*/ - find_para.cbData=_name->bytes->length; - find_para.pbData=(unsigned char *)_name->bytes->data; - cert=CertFindCertificateInStore(h_store,X509_ASN_ENCODING,0, - CERT_FIND_SUBJECT_NAME,&find_para,NULL); - if(cert==NULL)return 0; - x=d2i_X509(NULL,(const unsigned char **)&cert->pbCertEncoded, - cert->cbCertEncoded); - CertFreeCertificateContext(cert); - if(x==NULL)return 0; - ret=X509_STORE_add_cert(_lu->store_ctx,x); - X509_free(x); - if(ret)return op_capi_retrieve_by_subject(_lu,_type,_name,_ret); - }break; - case X509_LU_CRL:{ - CERT_INFO cert_info; - CERT_CONTEXT find_para; - PCCRL_CONTEXT crl; - X509_CRL *x; - int ret; - ret=op_capi_retrieve_by_subject(_lu,_type,_name,_ret); - if(ret>0)return ret; - memset(&cert_info,0,sizeof(cert_info)); - cert_info.Issuer.cbData=_name->bytes->length; - cert_info.Issuer.pbData=(unsigned char *)_name->bytes->data; - memset(&find_para,0,sizeof(find_para)); - find_para.pCertInfo=&cert_info; - crl=CertFindCRLInStore(h_store,0,0,CRL_FIND_ISSUED_BY,&find_para,NULL); - if(crl==NULL)return 0; - x=d2i_X509_CRL(NULL,(const unsigned char **)&crl->pbCrlEncoded, - crl->cbCrlEncoded); - CertFreeCRLContext(crl); - if(x==NULL)return 0; - ret=X509_STORE_add_crl(_lu->store_ctx,x); - X509_CRL_free(x); - if(ret)return op_capi_retrieve_by_subject(_lu,_type,_name,_ret); - }break; - } - return 0; -} - -/*This is not const because OpenSSL doesn't allow it, even though it won't - write to it.*/ -static X509_LOOKUP_METHOD X509_LOOKUP_CAPI={ - "Load Crypto API store into cache", - op_capi_new, - op_capi_free, - NULL, - NULL, - NULL, - op_capi_get_by_subject, - NULL, - NULL, - NULL -}; - -int SSL_CTX_set_default_verify_paths_win32(SSL_CTX *_ssl_ctx){ - X509_STORE *store; - X509_LOOKUP *lu; - /*We intentionally do not add the normal default paths, as they are usually - wrong, and are just asking to be used as an exploit vector.*/ - store=SSL_CTX_get_cert_store(_ssl_ctx); - OP_ASSERT(store!=NULL); - lu=X509_STORE_add_lookup(store,&X509_LOOKUP_CAPI); - if(lu==NULL)return 0; - ERR_clear_error(); - return 1; -} - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/A2NLSF.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/A2NLSF.c deleted file mode 100644 index 74b1b95d..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/A2NLSF.c +++ /dev/null @@ -1,252 +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. -***********************************************************************/ - -/* Conversion between prediction filter coefficients and NLSFs */ -/* Requires the order to be an even number */ -/* A piecewise linear approximation maps LSF <-> cos(LSF) */ -/* Therefore the result is not accurate NLSFs, but the two */ -/* functions are accurate inverses of each other */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "SigProc_FIX.h" -#include "tables.h" - -/* 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 - -/* Helper function for A2NLSF(..) */ -/* Transforms polynomials from cos(n*f) to cos(f)^n */ -static OPUS_INLINE void silk_A2NLSF_trans_poly( - opus_int32 *p, /* I/O Polynomial */ - const opus_int dd /* I Polynomial order (= filter order / 2 ) */ -) -{ - opus_int k, n; - - for( k = 2; k <= dd; k++ ) { - for( n = dd; n > k; n-- ) { - p[ n - 2 ] -= p[ n ]; - } - p[ k - 2 ] -= silk_LSHIFT( p[ k ], 1 ); - } -} -/* Helper function for A2NLSF(..) */ -/* Polynomial evaluation */ -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 */ -) -{ - opus_int n; - opus_int32 x_Q16, y32; - - 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 */ - } - return y32; -} - -static OPUS_INLINE void silk_A2NLSF_init( - const opus_int32 *a_Q16, - opus_int32 *P, - opus_int32 *Q, - const opus_int dd -) -{ - opus_int k; - - /* Convert filter coefs to even and odd polynomials */ - P[dd] = silk_LSHIFT( 1, 16 ); - Q[dd] = silk_LSHIFT( 1, 16 ); - for( k = 0; k < dd; k++ ) { - P[ k ] = -a_Q16[ dd - k - 1 ] - a_Q16[ dd + k ]; /* Q16 */ - Q[ k ] = -a_Q16[ dd - k - 1 ] + a_Q16[ dd + k ]; /* Q16 */ - } - - /* Divide out zeros as we have that for even filter orders, */ - /* z = 1 is always a root in Q, and */ - /* z = -1 is always a root in P */ - for( k = dd; k > 0; k-- ) { - P[ k - 1 ] -= P[ k ]; - Q[ k - 1 ] += Q[ k ]; - } - - /* Transform polynomials from cos(n*f) to cos(f)^n */ - silk_A2NLSF_trans_poly( P, dd ); - silk_A2NLSF_trans_poly( Q, dd ); -} - -/* Compute Normalized Line Spectral Frequencies (NLSFs) from whitening filter coefficients */ -/* If not all roots are found, the a_Q16 coefficients are bandwidth expanded until convergence. */ -void silk_A2NLSF( - opus_int16 *NLSF, /* O Normalized Line Spectral Frequencies in Q15 (0..2^15-1) [d] */ - opus_int32 *a_Q16, /* I/O Monic whitening filter coefficients in Q16 [d] */ - const opus_int d /* I Filter order (must be even) */ -) -{ - opus_int i, k, m, dd, root_ix, ffrac; - opus_int32 xlo, xhi, xmid; - opus_int32 ylo, yhi, ymid, thr; - opus_int32 nom, den; - opus_int32 P[ SILK_MAX_ORDER_LPC / 2 + 1 ]; - opus_int32 Q[ SILK_MAX_ORDER_LPC / 2 + 1 ]; - opus_int32 *PQ[ 2 ]; - opus_int32 *p; - - /* Store pointers to array */ - PQ[ 0 ] = P; - PQ[ 1 ] = Q; - - dd = silk_RSHIFT( d, 1 ); - - silk_A2NLSF_init( a_Q16, P, Q, dd ); - - /* Find roots, alternating between P and Q */ - p = P; /* Pointer to polynomial */ - - xlo = silk_LSFCosTab_FIX_Q12[ 0 ]; /* Q12*/ - ylo = silk_A2NLSF_eval_poly( p, xlo, dd ); - - if( ylo < 0 ) { - /* Set the first NLSF to zero and move on to the next */ - NLSF[ 0 ] = 0; - p = Q; /* Pointer to polynomial */ - ylo = silk_A2NLSF_eval_poly( p, xlo, dd ); - root_ix = 1; /* Index of current root */ - } else { - root_ix = 0; /* Index of current root */ - } - k = 1; /* Loop counter */ - i = 0; /* Counter for bandwidth expansions applied */ - thr = 0; - while( 1 ) { - /* Evaluate polynomial */ - xhi = silk_LSFCosTab_FIX_Q12[ k ]; /* Q12 */ - yhi = silk_A2NLSF_eval_poly( p, xhi, dd ); - - /* Detect zero crossing */ - if( ( ylo <= 0 && yhi >= thr ) || ( ylo >= 0 && yhi <= -thr ) ) { - if( yhi == 0 ) { - /* If the root lies exactly at the end of the current */ - /* interval, look for the next root in the next interval */ - thr = 1; - } else { - thr = 0; - } - /* Binary division */ - ffrac = -256; - for( m = 0; m < BIN_DIV_STEPS_A2NLSF_FIX; m++ ) { - /* Evaluate polynomial */ - xmid = silk_RSHIFT_ROUND( xlo + xhi, 1 ); - ymid = silk_A2NLSF_eval_poly( p, xmid, dd ); - - /* Detect zero crossing */ - if( ( ylo <= 0 && ymid >= 0 ) || ( ylo >= 0 && ymid <= 0 ) ) { - /* Reduce frequency */ - xhi = xmid; - yhi = ymid; - } else { - /* Increase frequency */ - xlo = xmid; - ylo = ymid; - ffrac = silk_ADD_RSHIFT( ffrac, 128, m ); - } - } - - /* Interpolate */ - if( silk_abs( ylo ) < 65536 ) { - /* Avoid dividing by zero */ - den = ylo - yhi; - nom = silk_LSHIFT( ylo, 8 - BIN_DIV_STEPS_A2NLSF_FIX ) + silk_RSHIFT( den, 1 ); - if( den != 0 ) { - ffrac += silk_DIV32( nom, den ); - } - } else { - /* No risk of dividing by zero because abs(ylo - yhi) >= abs(ylo) >= 65536 */ - ffrac += silk_DIV32( ylo, silk_RSHIFT( ylo - yhi, 8 - BIN_DIV_STEPS_A2NLSF_FIX ) ); - } - NLSF[ root_ix ] = (opus_int16)silk_min_32( silk_LSHIFT( (opus_int32)k, 8 ) + ffrac, silk_int16_MAX ); - - silk_assert( NLSF[ root_ix ] >= 0 ); - - root_ix++; /* Next root */ - if( root_ix >= d ) { - /* Found all roots */ - break; - } - /* Alternate pointer to polynomial */ - p = PQ[ root_ix & 1 ]; - - /* Evaluate polynomial */ - xlo = silk_LSFCosTab_FIX_Q12[ k - 1 ]; /* Q12*/ - ylo = silk_LSHIFT( 1 - ( root_ix & 2 ), 12 ); - } else { - /* Increment loop counter */ - k++; - xlo = xhi; - ylo = yhi; - thr = 0; - - if( k > LSF_COS_TAB_SZ_FIX ) { - i++; - if( i > MAX_ITERATIONS_A2NLSF_FIX ) { - /* 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 ] ); - } - 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_A2NLSF_init( a_Q16, P, Q, dd ); - p = P; /* Pointer to polynomial */ - xlo = silk_LSFCosTab_FIX_Q12[ 0 ]; /* Q12*/ - ylo = silk_A2NLSF_eval_poly( p, xlo, dd ); - if( ylo < 0 ) { - /* Set the first NLSF to zero and move on to the next */ - NLSF[ 0 ] = 0; - p = Q; /* Pointer to polynomial */ - ylo = silk_A2NLSF_eval_poly( p, xlo, dd ); - root_ix = 1; /* Index of current root */ - } else { - root_ix = 0; /* Index of current root */ - } - k = 1; /* Reset loop counter */ - } - } - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/API.h b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/API.h deleted file mode 100644 index f0601bcf..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/API.h +++ /dev/null @@ -1,133 +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. -***********************************************************************/ - -#ifndef SILK_API_H -#define SILK_API_H - -#include "control.h" -#include "typedef.h" -#include "errors.h" -#include "entenc.h" -#include "entdec.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -#define SILK_MAX_FRAMES_PER_PACKET 3 - -/* Struct for TOC (Table of Contents) */ -typedef struct { - opus_int VADFlag; /* Voice activity for packet */ - opus_int VADFlags[ SILK_MAX_FRAMES_PER_PACKET ]; /* Voice activity for each frame in packet */ - opus_int inbandFECFlag; /* Flag indicating if packet contains in-band FEC */ -} silk_TOC_struct; - -/****************************************/ -/* Encoder functions */ -/****************************************/ - -/***********************************************/ -/* Get size in bytes of the Silk encoder state */ -/***********************************************/ -opus_int silk_Get_Encoder_Size( /* O Returns error code */ - opus_int *encSizeBytes /* O Number of bytes in SILK encoder state */ -); - -/*************************/ -/* Init or reset encoder */ -/*************************/ -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 */ -); - -/**************************/ -/* Encode frame with Silk */ -/**************************/ -/* Note: if prefillFlag is set, the input must contain 10 ms of audio, irrespective of what */ -/* encControl->payloadSize_ms is set to */ -opus_int silk_Encode( /* O Returns error code */ - void *encState, /* I/O State */ - silk_EncControlStruct *encControl, /* I Control status */ - const opus_int16 *samplesIn, /* I Speech sample input vector */ - 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 */ -); - -/****************************************/ -/* Decoder functions */ -/****************************************/ - -/***********************************************/ -/* Get size in bytes of the Silk decoder state */ -/***********************************************/ -opus_int silk_Get_Decoder_Size( /* O Returns error code */ - opus_int *decSizeBytes /* O Number of bytes in SILK decoder state */ -); - -/*************************/ -/* Init or Reset decoder */ -/*************************/ -opus_int silk_InitDecoder( /* O Returns error code */ - void *decState /* I/O State */ -); - -/******************/ -/* Decode a frame */ -/******************/ -opus_int silk_Decode( /* O Returns error code */ - void* decState, /* I/O State */ - silk_DecControlStruct* decControl, /* I/O Control Structure */ - opus_int lostFlag, /* I 0: no loss, 1 loss, 2 decode fec */ - 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 */ -); - -#if 0 -/**************************************/ -/* Get table of contents for a packet */ -/**************************************/ -opus_int silk_get_TOC( - const opus_uint8 *payload, /* I Payload data */ - const opus_int nBytesIn, /* I Number of input bytes */ - const opus_int nFramesPerPayload, /* I Number of SILK frames per payload */ - silk_TOC_struct *Silk_TOC /* O Type of content */ -); -#endif - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/CNG.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/CNG.c deleted file mode 100644 index 8481d95d..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/CNG.c +++ /dev/null @@ -1,172 +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 "stack_alloc.h" - -/* Generates excitation for CNG LPC synthesis */ -static OPUS_INLINE void silk_CNG_exc( - opus_int32 residual_Q10[], /* O CNG residual 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 */ -) -{ - opus_int32 seed; - opus_int i, idx, exc_mask; - - exc_mask = CNG_BUF_MASK_MAX; - while( exc_mask > length ) { - exc_mask = silk_RSHIFT( exc_mask, 1 ); - } - - seed = *rand_seed; - for( i = 0; i < length; i++ ) { - seed = silk_RAND( seed ); - 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 ) ); - } - *rand_seed = seed; -} - -void silk_CNG_Reset( - silk_decoder_state *psDec /* I/O Decoder state */ -) -{ - opus_int i, NLSF_step_Q15, NLSF_acc_Q15; - - NLSF_step_Q15 = silk_DIV32_16( silk_int16_MAX, psDec->LPC_order + 1 ); - NLSF_acc_Q15 = 0; - for( i = 0; i < psDec->LPC_order; i++ ) { - NLSF_acc_Q15 += NLSF_step_Q15; - psDec->sCNG.CNG_smth_NLSF_Q15[ i ] = NLSF_acc_Q15; - } - psDec->sCNG.CNG_smth_Gain_Q16 = 0; - psDec->sCNG.rand_seed = 3176576; -} - -/* Updates CNG estimate, and applies the CNG when packet was lost */ -void silk_CNG( - silk_decoder_state *psDec, /* I/O Decoder state */ - silk_decoder_control *psDecCtrl, /* I/O Decoder control */ - opus_int16 frame[], /* I/O Signal */ - opus_int length /* I Length of residual */ -) -{ - opus_int i, subfr; - opus_int32 sum_Q6, max_Gain_Q16; - opus_int16 A_Q12[ MAX_LPC_ORDER ]; - silk_CNG_struct *psCNG = &psDec->sCNG; - SAVE_STACK; - - if( psDec->fs_kHz != psCNG->fs_kHz ) { - /* Reset state */ - silk_CNG_Reset( psDec ); - - psCNG->fs_kHz = psDec->fs_kHz; - } - if( psDec->lossCnt == 0 && psDec->prevSignalType == TYPE_NO_VOICE_ACTIVITY ) { - /* Update CNG parameters */ - - /* Smoothing of LSF's */ - for( i = 0; i < psDec->LPC_order; i++ ) { - psCNG->CNG_smth_NLSF_Q15[ i ] += silk_SMULWB( (opus_int32)psDec->prevNLSF_Q15[ i ] - (opus_int32)psCNG->CNG_smth_NLSF_Q15[ i ], CNG_NLSF_SMTH_Q16 ); - } - /* Find the subframe with the highest gain */ - max_Gain_Q16 = 0; - subfr = 0; - for( i = 0; i < psDec->nb_subfr; i++ ) { - if( psDecCtrl->Gains_Q16[ i ] > max_Gain_Q16 ) { - max_Gain_Q16 = psDecCtrl->Gains_Q16[ i ]; - subfr = i; - } - } - /* Update CNG excitation buffer with excitation from this subframe */ - silk_memmove( &psCNG->CNG_exc_buf_Q14[ psDec->subfr_length ], psCNG->CNG_exc_buf_Q14, ( psDec->nb_subfr - 1 ) * psDec->subfr_length * sizeof( opus_int32 ) ); - silk_memcpy( psCNG->CNG_exc_buf_Q14, &psDec->exc_Q14[ subfr * psDec->subfr_length ], psDec->subfr_length * sizeof( opus_int32 ) ); - - /* Smooth gains */ - for( i = 0; i < psDec->nb_subfr; i++ ) { - psCNG->CNG_smth_Gain_Q16 += silk_SMULWB( psDecCtrl->Gains_Q16[ i ] - psCNG->CNG_smth_Gain_Q16, CNG_GAIN_SMTH_Q16 ); - } - } - - /* Add CNG when packet is lost or during DTX */ - if( psDec->lossCnt ) { - VARDECL( opus_int32, CNG_sig_Q10 ); - - ALLOC( CNG_sig_Q10, length + MAX_LPC_ORDER, opus_int32 ); - - /* 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 ); - - /* Convert CNG NLSF to filter representation */ - silk_NLSF2A( A_Q12, psCNG->CNG_smth_NLSF_Q15, psDec->LPC_order ); - - /* Generate CNG signal, by synthesis filtering */ - silk_memcpy( CNG_sig_Q10, psCNG->CNG_synth_state, MAX_LPC_ORDER * sizeof( opus_int32 ) ); - 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 ] ); - 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 ] ); - } - - /* 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 ) ); - } - silk_memcpy( psCNG->CNG_synth_state, &CNG_sig_Q10[ 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/sources/LabSound/third_party/libnyquist/third_party/opus/silk/HP_variable_cutoff.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/HP_variable_cutoff.c deleted file mode 100644 index bbe10f04..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/HP_variable_cutoff.c +++ /dev/null @@ -1,77 +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 -#ifdef FIXED_POINT -#include "main_FIX.h" -#else -#include "main_FLP.h" -#endif -#include "tuning_parameters.h" - -/* High-pass filter with cutoff frequency adaptation based on pitch lag statistics */ -void silk_HP_variable_cutoff( - silk_encoder_state_Fxx state_Fxx[] /* I/O Encoder states */ -) -{ - opus_int quality_Q15; - opus_int32 pitch_freq_Hz_Q16, pitch_freq_log_Q7, delta_freq_Q7; - silk_encoder_state *psEncC1 = &state_Fxx[ 0 ].sCmn; - - /* Adaptive cutoff frequency: estimate low end of pitch frequency range */ - if( psEncC1->prevSignalType == TYPE_VOICED ) { - /* difference, in log domain */ - pitch_freq_Hz_Q16 = silk_DIV32_16( silk_LSHIFT( silk_MUL( psEncC1->fs_kHz, 1000 ), 16 ), psEncC1->prevLag ); - pitch_freq_log_Q7 = silk_lin2log( pitch_freq_Hz_Q16 ) - ( 16 << 7 ); - - /* adjustment based on quality */ - quality_Q15 = psEncC1->input_quality_bands_Q15[ 0 ]; - pitch_freq_log_Q7 = silk_SMLAWB( pitch_freq_log_Q7, silk_SMULWB( silk_LSHIFT( -quality_Q15, 2 ), quality_Q15 ), - pitch_freq_log_Q7 - ( silk_lin2log( SILK_FIX_CONST( VARIABLE_HP_MIN_CUTOFF_HZ, 16 ) ) - ( 16 << 7 ) ) ); - - /* delta_freq = pitch_freq_log - psEnc->variable_HP_smth1; */ - delta_freq_Q7 = pitch_freq_log_Q7 - silk_RSHIFT( psEncC1->variable_HP_smth1_Q15, 8 ); - if( delta_freq_Q7 < 0 ) { - /* less smoothing for decreasing pitch frequency, to track something close to the minimum */ - delta_freq_Q7 = silk_MUL( delta_freq_Q7, 3 ); - } - - /* limit delta, to reduce impact of outliers in pitch estimation */ - delta_freq_Q7 = silk_LIMIT_32( delta_freq_Q7, -SILK_FIX_CONST( VARIABLE_HP_MAX_DELTA_FREQ, 7 ), SILK_FIX_CONST( VARIABLE_HP_MAX_DELTA_FREQ, 7 ) ); - - /* update smoother */ - psEncC1->variable_HP_smth1_Q15 = silk_SMLAWB( psEncC1->variable_HP_smth1_Q15, - silk_SMULBB( psEncC1->speech_activity_Q8, delta_freq_Q7 ), SILK_FIX_CONST( VARIABLE_HP_SMTH_COEF1, 16 ) ); - - /* limit frequency range */ - psEncC1->variable_HP_smth1_Q15 = silk_LIMIT_32( psEncC1->variable_HP_smth1_Q15, - silk_LSHIFT( silk_lin2log( VARIABLE_HP_MIN_CUTOFF_HZ ), 8 ), - silk_LSHIFT( silk_lin2log( VARIABLE_HP_MAX_CUTOFF_HZ ), 8 ) ); - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/Inlines.h b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/Inlines.h deleted file mode 100644 index ec986cdf..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/Inlines.h +++ /dev/null @@ -1,188 +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. -***********************************************************************/ - -/*! \file silk_Inlines.h - * \brief silk_Inlines.h defines OPUS_INLINE signal processing functions. - */ - -#ifndef SILK_FIX_INLINES_H -#define SILK_FIX_INLINES_H - -#ifdef __cplusplus -extern "C" -{ -#endif - -/* count leading zeros of opus_int64 */ -static OPUS_INLINE opus_int32 silk_CLZ64( opus_int64 in ) -{ - opus_int32 in_upper; - - in_upper = (opus_int32)silk_RSHIFT64(in, 32); - if (in_upper == 0) { - /* Search in the lower 32 bits */ - return 32 + silk_CLZ32( (opus_int32) in ); - } else { - /* Search in the upper 32 bits */ - return silk_CLZ32( in_upper ); - } -} - -/* get number of leading zeros and fractional part (the bits right after the leading one */ -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 */ -) -{ - opus_int32 lzeros = silk_CLZ32(in); - - * lz = lzeros; - * frac_Q7 = silk_ROR32(in, 24 - lzeros) & 0x7f; -} - -/* Approximation of square root */ -/* Accuracy: < +/- 10% for output values > 15 */ -/* < +/- 2.5% for output values > 120 */ -static OPUS_INLINE opus_int32 silk_SQRT_APPROX( opus_int32 x ) -{ - opus_int32 y, lz, frac_Q7; - - if( x <= 0 ) { - return 0; - } - - silk_CLZ_FRAC(x, &lz, &frac_Q7); - - if( lz & 1 ) { - y = 32768; - } else { - y = 46214; /* 46214 = sqrt(2) * 32768 */ - } - - /* get scaling right */ - y >>= silk_RSHIFT(lz, 1); - - /* increment using fractional part of input */ - y = silk_SMLAWB(y, y, silk_SMULBB(213, frac_Q7)); - - return y; -} - -/* Divide two int32 values and return result as int32 in a given Q-domain */ -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) */ -) -{ - opus_int a_headrm, b_headrm, lshift; - opus_int32 b32_inv, a32_nrm, b32_nrm, result; - - silk_assert( b32 != 0 ); - silk_assert( Qres >= 0 ); - - /* Compute number of bits head room and normalize inputs */ - a_headrm = silk_CLZ32( silk_abs(a32) ) - 1; - a32_nrm = silk_LSHIFT(a32, a_headrm); /* Q: a_headrm */ - b_headrm = silk_CLZ32( silk_abs(b32) ) - 1; - b32_nrm = silk_LSHIFT(b32, b_headrm); /* Q: b_headrm */ - - /* Inverse of b32, with 14 bits of precision */ - b32_inv = silk_DIV32_16( silk_int32_MAX >> 2, silk_RSHIFT(b32_nrm, 16) ); /* Q: 29 + 16 - b_headrm */ - - /* First approximation */ - result = silk_SMULWB(a32_nrm, b32_inv); /* Q: 29 + a_headrm - b_headrm */ - - /* Compute residual by subtracting product of denominator and first approximation */ - /* It's OK to overflow because the final value of a32_nrm should always be small */ - a32_nrm = silk_SUB32_ovflw(a32_nrm, silk_LSHIFT_ovflw( silk_SMMUL(b32_nrm, result), 3 )); /* Q: a_headrm */ - - /* Refinement */ - result = silk_SMLAWB(result, a32_nrm, b32_inv); /* Q: 29 + a_headrm - b_headrm */ - - /* Convert to Qres domain */ - lshift = 29 + a_headrm - b_headrm - Qres; - if( lshift < 0 ) { - return silk_LSHIFT_SAT32(result, -lshift); - } else { - if( lshift < 32){ - return silk_RSHIFT(result, lshift); - } else { - /* Avoid undefined result */ - return 0; - } - } -} - -/* Invert int32 value and return result as int32 in a given Q-domain */ -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) */ -) -{ - opus_int b_headrm, lshift; - opus_int32 b32_inv, b32_nrm, err_Q32, result; - - silk_assert( b32 != 0 ); - silk_assert( Qres > 0 ); - - /* Compute number of bits head room and normalize input */ - b_headrm = silk_CLZ32( silk_abs(b32) ) - 1; - b32_nrm = silk_LSHIFT(b32, b_headrm); /* Q: b_headrm */ - - /* Inverse of b32, with 14 bits of precision */ - b32_inv = silk_DIV32_16( silk_int32_MAX >> 2, silk_RSHIFT(b32_nrm, 16) ); /* Q: 29 + 16 - b_headrm */ - - /* First approximation */ - result = silk_LSHIFT(b32_inv, 16); /* Q: 61 - b_headrm */ - - /* Compute residual by subtracting product of denominator and first approximation from one */ - err_Q32 = silk_LSHIFT( ((opus_int32)1<<29) - silk_SMULWB(b32_nrm, b32_inv), 3 ); /* Q32 */ - - /* Refinement */ - result = silk_SMLAWW(result, err_Q32, b32_inv); /* Q: 61 - b_headrm */ - - /* Convert to Qres domain */ - lshift = 61 - b_headrm - Qres; - if( lshift <= 0 ) { - return silk_LSHIFT_SAT32(result, -lshift); - } else { - if( lshift < 32){ - return silk_RSHIFT(result, lshift); - }else{ - /* Avoid undefined result */ - return 0; - } - } -} - -#ifdef __cplusplus -} -#endif - -#endif /* SILK_FIX_INLINES_H */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/LPC_analysis_filter.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/LPC_analysis_filter.c deleted file mode 100644 index 9d1f16cb..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/LPC_analysis_filter.c +++ /dev/null @@ -1,106 +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 "SigProc_FIX.h" -#include "celt_lpc.h" - -/*******************************************/ -/* LPC analysis filter */ -/* NB! State is kept internally and the */ -/* filter always starts with zero state */ -/* first d output samples are set to zero */ -/*******************************************/ - -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 */ -) -{ - opus_int j; -#ifdef FIXED_POINT - opus_int16 mem[SILK_MAX_ORDER_LPC]; - 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 ); - -#ifdef FIXED_POINT - silk_assert( d <= SILK_MAX_ORDER_LPC ); - for ( j = 0; j < d; j++ ) { - num[ j ] = -B[ j ]; - } - for (j=0;j 0; k-- ) { - /* Check for stability */ - if( ( Anew_QA[ k ] > A_LIMIT ) || ( Anew_QA[ k ] < -A_LIMIT ) ) { - return 0; - } - - /* Set RC equal to negated AR coef */ - rc_Q31 = -silk_LSHIFT( Anew_QA[ k ], 31 - QA ); - - /* rc_mult1_Q30 range: [ 1 : 2^30 ] */ - rc_mult1_Q30 = ( (opus_int32)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 ) ); - - /* Swap pointers */ - Aold_QA = Anew_QA; - Anew_QA = A_QA[ k & 1 ]; - - /* 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 ); - } - } - - /* Check for stability */ - if( ( Anew_QA[ 0 ] > A_LIMIT ) || ( Anew_QA[ 0 ] < -A_LIMIT ) ) { - return 0; - } - - /* Set RC equal to negated AR coef */ - rc_Q31 = -silk_LSHIFT( Anew_QA[ 0 ], 31 - QA ); - - /* Range: [ 1 : 2^30 ] */ - rc_mult1_Q30 = ( (opus_int32)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 ); - - return invGain_Q30; -} - -/* For input in Q12 domain */ -opus_int32 silk_LPC_inverse_pred_gain( /* 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 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 ); - } - /* 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 ); -} - -#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/sources/LabSound/third_party/libnyquist/third_party/opus/silk/LP_variable_cutoff.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/LP_variable_cutoff.c deleted file mode 100644 index f639e1f8..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/LP_variable_cutoff.c +++ /dev/null @@ -1,135 +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 - -/* - Elliptic/Cauer filters designed with 0.1 dB passband ripple, - 80 dB minimum stopband attenuation, and - [0.95 : 0.15 : 0.35] normalized cut off frequencies. -*/ - -#include "main.h" - -/* Helper function, interpolates the 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, - const opus_int32 fac_Q16 -) -{ - opus_int nb, na; - - if( ind < TRANSITION_INT_NUM - 1 ) { - if( fac_Q16 > 0 ) { - if( fac_Q16 < 32768 ) { /* fac_Q16 is in range of a 16-bit int */ - /* Piece-wise linear interpolation of B and A */ - for( nb = 0; nb < TRANSITION_NB; nb++ ) { - B_Q28[ nb ] = silk_SMLAWB( - silk_Transition_LP_B_Q28[ ind ][ nb ], - silk_Transition_LP_B_Q28[ ind + 1 ][ nb ] - - silk_Transition_LP_B_Q28[ ind ][ nb ], - fac_Q16 ); - } - for( na = 0; na < TRANSITION_NA; na++ ) { - A_Q28[ na ] = silk_SMLAWB( - silk_Transition_LP_A_Q28[ ind ][ na ], - silk_Transition_LP_A_Q28[ ind + 1 ][ na ] - - silk_Transition_LP_A_Q28[ ind ][ na ], - fac_Q16 ); - } - } else { /* ( fac_Q16 - ( 1 << 16 ) ) is in range of a 16-bit int */ - silk_assert( fac_Q16 - ( 1 << 16 ) == silk_SAT16( fac_Q16 - ( 1 << 16 ) ) ); - /* Piece-wise linear interpolation of B and A */ - for( nb = 0; nb < TRANSITION_NB; nb++ ) { - B_Q28[ nb ] = silk_SMLAWB( - silk_Transition_LP_B_Q28[ ind + 1 ][ nb ], - silk_Transition_LP_B_Q28[ ind + 1 ][ nb ] - - silk_Transition_LP_B_Q28[ ind ][ nb ], - fac_Q16 - ( (opus_int32)1 << 16 ) ); - } - for( na = 0; na < TRANSITION_NA; na++ ) { - A_Q28[ na ] = silk_SMLAWB( - silk_Transition_LP_A_Q28[ ind + 1 ][ na ], - silk_Transition_LP_A_Q28[ ind + 1 ][ na ] - - silk_Transition_LP_A_Q28[ ind ][ na ], - fac_Q16 - ( (opus_int32)1 << 16 ) ); - } - } - } else { - silk_memcpy( B_Q28, silk_Transition_LP_B_Q28[ ind ], TRANSITION_NB * sizeof( opus_int32 ) ); - silk_memcpy( A_Q28, silk_Transition_LP_A_Q28[ ind ], TRANSITION_NA * sizeof( opus_int32 ) ); - } - } else { - silk_memcpy( B_Q28, silk_Transition_LP_B_Q28[ TRANSITION_INT_NUM - 1 ], TRANSITION_NB * sizeof( opus_int32 ) ); - silk_memcpy( A_Q28, silk_Transition_LP_A_Q28[ TRANSITION_INT_NUM - 1 ], TRANSITION_NA * sizeof( opus_int32 ) ); - } -} - -/* Low-pass filter with variable cutoff frequency based on */ -/* piece-wise linear interpolation between elliptic filters */ -/* Start by setting psEncC->mode <> 0; */ -/* Deactivate by setting psEncC->mode = 0; */ -void silk_LP_variable_cutoff( - silk_LP_state *psLP, /* I/O LP filter state */ - opus_int16 *frame, /* I/O Low-pass filtered output signal */ - const opus_int frame_length /* I Frame length */ -) -{ - opus_int32 B_Q28[ TRANSITION_NB ], A_Q28[ TRANSITION_NA ], fac_Q16 = 0; - opus_int ind = 0; - - silk_assert( psLP->transition_frame_no >= 0 && psLP->transition_frame_no <= TRANSITION_FRAMES ); - - /* Run filter if needed */ - if( psLP->mode != 0 ) { - /* Calculate index and interpolation factor for interpolation */ -#if( TRANSITION_INT_STEPS == 64 ) - fac_Q16 = silk_LSHIFT( TRANSITION_FRAMES - psLP->transition_frame_no, 16 - 6 ); -#else - fac_Q16 = silk_DIV32_16( silk_LSHIFT( TRANSITION_FRAMES - psLP->transition_frame_no, 16 ), TRANSITION_FRAMES ); -#endif - ind = silk_RSHIFT( fac_Q16, 16 ); - fac_Q16 -= silk_LSHIFT( ind, 16 ); - - silk_assert( ind >= 0 ); - silk_assert( ind < TRANSITION_INT_NUM ); - - /* Interpolate filter coefficients */ - silk_LP_interpolate_filter_taps( B_Q28, A_Q28, ind, fac_Q16 ); - - /* Update transition frame number for next frame */ - psLP->transition_frame_no = silk_LIMIT( psLP->transition_frame_no + psLP->mode, 0, TRANSITION_FRAMES ); - - /* 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); - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/MacroCount.h b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/MacroCount.h deleted file mode 100644 index 834817d0..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/MacroCount.h +++ /dev/null @@ -1,718 +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. -***********************************************************************/ - -#ifndef SIGPROCFIX_API_MACROCOUNT_H -#define SIGPROCFIX_API_MACROCOUNT_H -#include - -#ifdef silk_MACRO_COUNT -#define varDefine opus_int64 ops_count = 0; - -extern opus_int64 ops_count; - -static OPUS_INLINE opus_int64 silk_SaveCount(){ - return(ops_count); -} - -static OPUS_INLINE opus_int64 silk_SaveResetCount(){ - opus_int64 ret; - - ret = ops_count; - ops_count = 0; - return(ret); -} - -static OPUS_INLINE silk_PrintCount(){ - printf("ops_count = %d \n ", (opus_int32)ops_count); -} - -#undef silk_MUL -static OPUS_INLINE opus_int32 silk_MUL(opus_int32 a32, opus_int32 b32){ - opus_int32 ret; - ops_count += 4; - ret = a32 * b32; - return ret; -} - -#undef silk_MUL_uint -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 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; - return ret; -} - -#undef silk_MLA_uint -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; - return ret; -} - -#undef silk_SMULWB -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 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))); - return ret; -} - -#undef silk_SMULWT -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 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)); - return ret; -} - -#undef silk_SMULBB -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 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); - return ret; -} - -#undef silk_SMULBT -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); - return ret; -} - -#undef silk_SMLABT -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); - return ret; -} - -#undef silk_SMULTT -static OPUS_INLINE opus_int32 silk_SMULTT(opus_int32 a32, opus_int32 b32){ - opus_int32 ret; - ops_count += 1; - ret = (a32 >> 16) * (b32 >> 16); - return ret; -} - -#undef silk_SMLATT -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); - return ret; -} - - -/* multiply-accumulate macros that allow overflow in the addition (ie, no asserts in debug mode)*/ -#undef silk_MLA_ovflw -#define silk_MLA_ovflw silk_MLA - -#undef silk_SMLABB_ovflw -#define silk_SMLABB_ovflw silk_SMLABB - -#undef silk_SMLABT_ovflw -#define silk_SMLABT_ovflw silk_SMLABT - -#undef silk_SMLATT_ovflw -#define silk_SMLATT_ovflw silk_SMLATT - -#undef silk_SMLAWB_ovflw -#define silk_SMLAWB_ovflw silk_SMLAWB - -#undef silk_SMLAWT_ovflw -#define silk_SMLAWT_ovflw silk_SMLAWT - -#undef silk_SMULL -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)); - return ret; -} - -#undef silk_SMLAL -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 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)); - return ret; -} - -#undef SigProcFIX_CLZ16 -static OPUS_INLINE opus_int32 SigProcFIX_CLZ16(opus_int16 in16) -{ - opus_int32 out32 = 0; - ops_count += 10; - 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; - } -} - -#undef SigProcFIX_CLZ32 -static OPUS_INLINE opus_int32 SigProcFIX_CLZ32(opus_int32 in32) -{ - /* test highest 16 bits and convert to opus_int16 */ - ops_count += 2; - if( in32 & 0xFFFF0000 ) { - return SigProcFIX_CLZ16((opus_int16)(in32 >> 16)); - } else { - return SigProcFIX_CLZ16((opus_int16)in32) + 16; - } -} - -#undef silk_DIV32 -static OPUS_INLINE opus_int32 silk_DIV32(opus_int32 a32, opus_int32 b32){ - ops_count += 64; - return a32 / b32; -} - -#undef silk_DIV32_16 -static OPUS_INLINE opus_int32 silk_DIV32_16(opus_int32 a32, opus_int32 b32){ - ops_count += 32; - return a32 / b32; -} - -#undef silk_SAT8 -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 : \ - ((a) < silk_int8_MIN ? silk_int8_MIN : (a))); - return(tmp); -} - -#undef silk_SAT16 -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 : \ - ((a) < silk_int16_MIN ? silk_int16_MIN : (a))); - return(tmp); -} -#undef silk_SAT32 -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 : \ - ((a) < silk_int32_MIN ? silk_int32_MIN : (a))); - return(tmp); -} -#undef silk_POS_SAT32 -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)); - return(tmp); -} - -#undef silk_ADD_POS_SAT8 -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 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))); - return(tmp); -} - -#undef silk_ADD_POS_SAT32 -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 OPUS_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 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 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 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 OPUS_INLINE opus_int64 silk_LSHIFT64(opus_int64 a, opus_int shift){ - ops_count += 1; - return a << shift; -} - -#undef silk_LSHIFT_ovflw -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 OPUS_INLINE opus_uint32 silk_LSHIFT_uint(opus_uint32 a, opus_int32 shift){ - opus_uint32 ret; - ops_count += 1; - ret = a << shift; - return ret; -} - -#undef silk_RSHIFT8 -static OPUS_INLINE opus_int8 silk_RSHIFT8(opus_int8 a, opus_int32 shift){ - ops_count += 1; - return a >> shift; -} -#undef silk_RSHIFT16 -static OPUS_INLINE opus_int16 silk_RSHIFT16(opus_int16 a, opus_int32 shift){ - ops_count += 1; - return a >> shift; -} -#undef silk_RSHIFT32 -static OPUS_INLINE opus_int32 silk_RSHIFT32(opus_int32 a, opus_int32 shift){ - ops_count += 1; - return a >> shift; -} -#undef silk_RSHIFT64 -static OPUS_INLINE opus_int64 silk_RSHIFT64(opus_int64 a, opus_int64 shift){ - ops_count += 1; - return a >> shift; -} - -#undef silk_RSHIFT_uint -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 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 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 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 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 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 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 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 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); - return ret; /* shift > 0*/ -} - -#undef silk_RSHIFT_ROUND -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; - return ret; -} - -#undef silk_RSHIFT_ROUND64 -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; - return ret; -} - -#undef silk_abs_int64 -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 OPUS_INLINE opus_int32 silk_abs_int32(opus_int32 a){ - ops_count += 1; - return silk_abs(a); -} - - -#undef silk_min -static silk_min(a, b){ - ops_count += 1; - return (((a) < (b)) ? (a) : (b)); -} -#undef silk_max -static silk_max(a, b){ - ops_count += 1; - return (((a) > (b)) ? (a) : (b)); -} -#undef silk_sign -static silk_sign(a){ - ops_count += 1; - return ((a) > 0 ? 1 : ( (a) < 0 ? -1 : 0 )); -} - -#undef silk_ADD16 -static OPUS_INLINE opus_int16 silk_ADD16(opus_int16 a, opus_int16 b){ - opus_int16 ret; - ops_count += 1; - ret = a + b; - return ret; -} - -#undef silk_ADD32 -static OPUS_INLINE opus_int32 silk_ADD32(opus_int32 a, opus_int32 b){ - opus_int32 ret; - ops_count += 1; - ret = a + b; - return ret; -} - -#undef silk_ADD64 -static OPUS_INLINE opus_int64 silk_ADD64(opus_int64 a, opus_int64 b){ - opus_int64 ret; - ops_count += 2; - ret = a + b; - return ret; -} - -#undef silk_SUB16 -static OPUS_INLINE opus_int16 silk_SUB16(opus_int16 a, opus_int16 b){ - opus_int16 ret; - ops_count += 1; - ret = a - b; - return ret; -} - -#undef silk_SUB32 -static OPUS_INLINE opus_int32 silk_SUB32(opus_int32 a, opus_int32 b){ - opus_int32 ret; - ops_count += 1; - ret = a - b; - return ret; -} - -#undef silk_SUB64 -static OPUS_INLINE opus_int64 silk_SUB64(opus_int64 a, opus_int64 b){ - opus_int64 ret; - ops_count += 2; - ret = a - b; - return ret; -} - -#undef silk_ADD_SAT16 -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) ) ); - return res; -} - -#undef silk_ADD_SAT32 -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 ? \ - ((((a32) & (b32)) & 0x80000000) != 0 ? silk_int32_MIN : (a32)+(b32)) : \ - ((((a32) | (b32)) & 0x80000000) == 0 ? silk_int32_MAX : (a32)+(b32)) ); - return res; -} - -#undef silk_ADD_SAT64 -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 ? \ - ((((a64) & (b64)) & 0x8000000000000000LL) != 0 ? silk_int64_MIN : (a64)+(b64)) : \ - ((((a64) | (b64)) & 0x8000000000000000LL) == 0 ? silk_int64_MAX : (a64)+(b64)) ); - return res; -} - -#undef silk_SUB_SAT16 -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*/ - res = (opus_int16)silk_SAT16( silk_SUB32( (opus_int32)(a16), (b16) ) ); - return res; -} - -#undef silk_SUB_SAT32 -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 ? \ - (( (a32) & ((b32)^0x80000000) & 0x80000000) ? silk_int32_MIN : (a32)-(b32)) : \ - ((((a32)^0x80000000) & (b32) & 0x80000000) ? silk_int32_MAX : (a32)-(b32)) ); - return res; -} - -#undef silk_SUB_SAT64 -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 ? \ - (( (a64) & ((b64)^0x8000000000000000LL) & 0x8000000000000000LL) ? silk_int64_MIN : (a64)-(b64)) : \ - ((((a64)^0x8000000000000000LL) & (b64) & 0x8000000000000000LL) ? silk_int64_MAX : (a64)-(b64)) ); - - return res; -} - -#undef silk_SMULWW -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)); - return ret; -} - -#undef silk_SMLAWW -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)); - return ret; -} - -#undef silk_min_int -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 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 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 OPUS_INLINE opus_int64 silk_min_64(opus_int64 a, opus_int64 b) -{ - ops_count += 1; - return (((a) < (b)) ? (a) : (b)); -} - -/* silk_min() versions with typecast in the function call */ -#undef silk_max_int -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 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 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 OPUS_INLINE opus_int64 silk_max_64(opus_int64 a, opus_int64 b) -{ - ops_count += 1; - return (((a) > (b)) ? (a) : (b)); -} - - -#undef silk_LIMIT_int -static OPUS_INLINE opus_int silk_LIMIT_int(opus_int a, opus_int limit1, opus_int limit2) -{ - opus_int ret; - ops_count += 6; - - ret = ((limit1) > (limit2) ? ((a) > (limit1) ? (limit1) : ((a) < (limit2) ? (limit2) : (a))) \ - : ((a) > (limit2) ? (limit2) : ((a) < (limit1) ? (limit1) : (a)))); - - return(ret); -} - -#undef silk_LIMIT_16 -static OPUS_INLINE opus_int16 silk_LIMIT_16(opus_int16 a, opus_int16 limit1, opus_int16 limit2) -{ - opus_int16 ret; - ops_count += 6; - - ret = ((limit1) > (limit2) ? ((a) > (limit1) ? (limit1) : ((a) < (limit2) ? (limit2) : (a))) \ - : ((a) > (limit2) ? (limit2) : ((a) < (limit1) ? (limit1) : (a)))); - -return(ret); -} - - -#undef silk_LIMIT_32 -static OPUS_INLINE opus_int silk_LIMIT_32(opus_int32 a, opus_int32 limit1, opus_int32 limit2) -{ - opus_int32 ret; - ops_count += 6; - - ret = ((limit1) > (limit2) ? ((a) > (limit1) ? (limit1) : ((a) < (limit2) ? (limit2) : (a))) \ - : ((a) > (limit2) ? (limit2) : ((a) < (limit1) ? (limit1) : (a)))); - return(ret); -} - -#else -#define varDefine -#define silk_SaveCount() - -#endif -#endif - diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/MacroDebug.h b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/MacroDebug.h deleted file mode 100644 index 35aedc5c..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/MacroDebug.h +++ /dev/null @@ -1,952 +0,0 @@ -/*********************************************************************** -Copyright (c) 2006-2011, Skype Limited. All rights reserved. -Copyright (C) 2012 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. -- 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 MACRO_DEBUG_H -#define MACRO_DEBUG_H - -/* Redefine macro functions with extensive assertion in DEBUG mode. - As functions can't be undefined, this file can't work with SigProcFIX_MacroCount.h */ - -#if ( defined (FIXED_DEBUG) || ( 0 && defined (_DEBUG) ) ) && !defined (silk_MACRO_COUNT) - -#undef silk_ADD16 -#define silk_ADD16(a,b) silk_ADD16_((a), (b), __FILE__, __LINE__) -static OPUS_INLINE opus_int16 silk_ADD16_(opus_int16 a, opus_int16 b, char *file, int line){ - opus_int16 ret; - - ret = a + b; - if ( ret != silk_ADD_SAT16( a, b ) ) - { - fprintf (stderr, "silk_ADD16(%d, %d) in %s: line %d\n", a, b, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return ret; -} - -#undef silk_ADD32 -#define silk_ADD32(a,b) silk_ADD32_((a), (b), __FILE__, __LINE__) -static OPUS_INLINE opus_int32 silk_ADD32_(opus_int32 a, opus_int32 b, char *file, int line){ - opus_int32 ret; - - ret = a + b; - if ( ret != silk_ADD_SAT32( a, b ) ) - { - fprintf (stderr, "silk_ADD32(%d, %d) in %s: line %d\n", a, b, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return ret; -} - -#undef silk_ADD64 -#define silk_ADD64(a,b) silk_ADD64_((a), (b), __FILE__, __LINE__) -static OPUS_INLINE opus_int64 silk_ADD64_(opus_int64 a, opus_int64 b, char *file, int line){ - opus_int64 ret; - - ret = a + b; - if ( ret != silk_ADD_SAT64( a, b ) ) - { - fprintf (stderr, "silk_ADD64(%lld, %lld) in %s: line %d\n", (long long)a, (long long)b, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return ret; -} - -#undef silk_SUB16 -#define silk_SUB16(a,b) silk_SUB16_((a), (b), __FILE__, __LINE__) -static OPUS_INLINE opus_int16 silk_SUB16_(opus_int16 a, opus_int16 b, char *file, int line){ - opus_int16 ret; - - ret = a - b; - if ( ret != silk_SUB_SAT16( a, b ) ) - { - fprintf (stderr, "silk_SUB16(%d, %d) in %s: line %d\n", a, b, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return ret; -} - -#undef silk_SUB32 -#define silk_SUB32(a,b) silk_SUB32_((a), (b), __FILE__, __LINE__) -static OPUS_INLINE opus_int32 silk_SUB32_(opus_int32 a, opus_int32 b, char *file, int line){ - opus_int32 ret; - - ret = a - b; - if ( ret != silk_SUB_SAT32( a, b ) ) - { - fprintf (stderr, "silk_SUB32(%d, %d) in %s: line %d\n", a, b, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return ret; -} - -#undef silk_SUB64 -#define silk_SUB64(a,b) silk_SUB64_((a), (b), __FILE__, __LINE__) -static OPUS_INLINE opus_int64 silk_SUB64_(opus_int64 a, opus_int64 b, char *file, int line){ - opus_int64 ret; - - ret = a - b; - if ( ret != silk_SUB_SAT64( a, b ) ) - { - fprintf (stderr, "silk_SUB64(%lld, %lld) in %s: line %d\n", (long long)a, (long long)b, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return ret; -} - -#undef silk_ADD_SAT16 -#define silk_ADD_SAT16(a,b) silk_ADD_SAT16_((a), (b), __FILE__, __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 ) ) - { - fprintf (stderr, "silk_ADD_SAT16(%d, %d) in %s: line %d\n", a16, b16, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return res; -} - -#undef silk_ADD_SAT32 -#define silk_ADD_SAT32(a,b) silk_ADD_SAT32_((a), (b), __FILE__, __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)) : \ - ((((a32) | (b32)) & 0x80000000) == 0 ? silk_int32_MAX : (a32)+(b32)) ); - if ( res != silk_SAT32( (opus_int64)a32 + (opus_int64)b32 ) ) - { - fprintf (stderr, "silk_ADD_SAT32(%d, %d) in %s: line %d\n", a32, b32, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return res; -} - -#undef silk_ADD_SAT64 -#define silk_ADD_SAT64(a,b) silk_ADD_SAT64_((a), (b), __FILE__, __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 ? \ - ((((a64) & (b64)) & 0x8000000000000000LL) != 0 ? silk_int64_MIN : (a64)+(b64)) : \ - ((((a64) | (b64)) & 0x8000000000000000LL) == 0 ? silk_int64_MAX : (a64)+(b64)) ); - if( res != a64 + b64 ) { - /* Check that we saturated to the correct extreme value */ - if ( !(( res == silk_int64_MAX && ( ( a64 >> 1 ) + ( b64 >> 1 ) > ( silk_int64_MAX >> 3 ) ) ) || - ( res == silk_int64_MIN && ( ( a64 >> 1 ) + ( b64 >> 1 ) < ( silk_int64_MIN >> 3 ) ) ) ) ) - { - fail = 1; - } - } else { - /* Saturation not necessary */ - fail = res != a64 + b64; - } - if ( fail ) - { - fprintf (stderr, "silk_ADD_SAT64(%lld, %lld) in %s: line %d\n", (long long)a64, (long long)b64, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return res; -} - -#undef silk_SUB_SAT16 -#define silk_SUB_SAT16(a,b) silk_SUB_SAT16_((a), (b), __FILE__, __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 ) ) - { - fprintf (stderr, "silk_SUB_SAT16(%d, %d) in %s: line %d\n", a16, b16, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return res; -} - -#undef silk_SUB_SAT32 -#define silk_SUB_SAT32(a,b) silk_SUB_SAT32_((a), (b), __FILE__, __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)) : \ - ((((a32)^0x80000000) & (b32) & 0x80000000) ? silk_int32_MAX : (a32)-(b32)) ); - if ( res != silk_SAT32( (opus_int64)a32 - (opus_int64)b32 ) ) - { - fprintf (stderr, "silk_SUB_SAT32(%d, %d) in %s: line %d\n", a32, b32, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return res; -} - -#undef silk_SUB_SAT64 -#define silk_SUB_SAT64(a,b) silk_SUB_SAT64_((a), (b), __FILE__, __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 ? \ - (( (a64) & ((b64)^0x8000000000000000LL) & 0x8000000000000000LL) ? silk_int64_MIN : (a64)-(b64)) : \ - ((((a64)^0x8000000000000000LL) & (b64) & 0x8000000000000000LL) ? silk_int64_MAX : (a64)-(b64)) ); - if( res != a64 - b64 ) { - /* Check that we saturated to the correct extreme value */ - if( !(( res == silk_int64_MAX && ( ( a64 >> 1 ) + ( b64 >> 1 ) > ( silk_int64_MAX >> 3 ) ) ) || - ( res == silk_int64_MIN && ( ( a64 >> 1 ) + ( b64 >> 1 ) < ( silk_int64_MIN >> 3 ) ) ) )) - { - fail = 1; - } - } else { - /* Saturation not necessary */ - fail = res != a64 - b64; - } - if ( fail ) - { - fprintf (stderr, "silk_SUB_SAT64(%lld, %lld) in %s: line %d\n", (long long)a64, (long long)b64, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return res; -} - -#undef silk_MUL -#define silk_MUL(a,b) silk_MUL_((a), (b), __FILE__, __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; - ret64 = (opus_int64)a32 * (opus_int64)b32; - if ( (opus_int64)ret != ret64 ) - { - fprintf (stderr, "silk_MUL(%d, %d) in %s: line %d\n", a32, b32, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return ret; -} - -#undef silk_MUL_uint -#define silk_MUL_uint(a,b) silk_MUL_uint_((a), (b), __FILE__, __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 ) - { - fprintf (stderr, "silk_MUL_uint(%u, %u) in %s: line %d\n", a32, b32, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return ret; -} - -#undef silk_MLA -#define silk_MLA(a,b,c) silk_MLA_((a), (b), (c), __FILE__, __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 ) - { - fprintf (stderr, "silk_MLA(%d, %d, %d) in %s: line %d\n", a32, b32, c32, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return ret; -} - -#undef silk_MLA_uint -#define silk_MLA_uint(a,b,c) silk_MLA_uint_((a), (b), (c), __FILE__, __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 ) - { - fprintf (stderr, "silk_MLA_uint(%d, %d, %d) in %s: line %d\n", a32, b32, c32, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return ret; -} - -#undef silk_SMULWB -#define silk_SMULWB(a,b) silk_SMULWB_((a), (b), __FILE__, __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 ) - { - fprintf (stderr, "silk_SMULWB(%d, %d) in %s: line %d\n", a32, b32, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return ret; -} - -#undef silk_SMLAWB -#define silk_SMLAWB(a,b,c) silk_SMLAWB_((a), (b), (c), __FILE__, __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 ) ) ) - { - fprintf (stderr, "silk_SMLAWB(%d, %d, %d) in %s: line %d\n", a32, b32, c32, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return ret; -} - -#undef silk_SMULWT -#define silk_SMULWT(a,b) silk_SMULWT_((a), (b), __FILE__, __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 ) - { - fprintf (stderr, "silk_SMULWT(%d, %d) in %s: line %d\n", a32, b32, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return ret; -} - -#undef silk_SMLAWT -#define silk_SMLAWT(a,b,c) silk_SMLAWT_((a), (b), (c), __FILE__, __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) ) - { - fprintf (stderr, "silk_SMLAWT(%d, %d, %d) in %s: line %d\n", a32, b32, c32, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return ret; -} - -#undef silk_SMULL -#define silk_SMULL(a,b) silk_SMULL_((a), (b), __FILE__, __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; - if( b64 != 0 ) { - fail = a64 != (ret64 / b64); - } else if( a64 != 0 ) { - fail = b64 != (ret64 / a64); - } - if ( fail ) - { - fprintf (stderr, "silk_SMULL(%lld, %lld) in %s: line %d\n", (long long)a64, (long long)b64, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return ret64; -} - -/* no checking needed for silk_SMULBB */ -#undef silk_SMLABB -#define silk_SMLABB(a,b,c) silk_SMLABB_((a), (b), (c), __FILE__, __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 ) - { - fprintf (stderr, "silk_SMLABB(%d, %d, %d) in %s: line %d\n", a32, b32, c32, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return ret; -} - -/* no checking needed for silk_SMULBT */ -#undef silk_SMLABT -#define silk_SMLABT(a,b,c) silk_SMLABT_((a), (b), (c), __FILE__, __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) ) - { - fprintf (stderr, "silk_SMLABT(%d, %d, %d) in %s: line %d\n", a32, b32, c32, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return ret; -} - -/* no checking needed for silk_SMULTT */ -#undef silk_SMLATT -#define silk_SMLATT(a,b,c) silk_SMLATT_((a), (b), (c), __FILE__, __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) ) - { - fprintf (stderr, "silk_SMLATT(%d, %d, %d) in %s: line %d\n", a32, b32, c32, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return ret; -} - -#undef silk_SMULWW -#define silk_SMULWW(a,b) silk_SMULWW_((a), (b), __FILE__, __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; - - ret = silk_SMULWB( a32, b32 ); - tmp1 = silk_RSHIFT_ROUND( b32, 16 ); - tmp2 = silk_MUL( a32, tmp1 ); - - fail |= (opus_int64)tmp2 != (opus_int64) a32 * (opus_int64) tmp1; - - tmp1 = ret; - ret = silk_ADD32( tmp1, tmp2 ); - fail |= silk_ADD32( tmp1, tmp2 ) != silk_ADD_SAT32( tmp1, tmp2 ); - - ret64 = silk_RSHIFT64( silk_SMULL( a32, b32 ), 16 ); - fail |= (opus_int64)ret != ret64; - - if ( fail ) - { - fprintf (stderr, "silk_SMULWT(%d, %d) in %s: line %d\n", a32, b32, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - - return ret; -} - -#undef silk_SMLAWW -#define silk_SMLAWW(a,b,c) silk_SMLAWW_((a), (b), (c), __FILE__, __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 ); - ret = silk_ADD32( a32, tmp ); - if ( ret != silk_ADD_SAT32( a32, tmp ) ) - { - fprintf (stderr, "silk_SMLAWW(%d, %d, %d) in %s: line %d\n", a32, b32, c32, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return ret; -} - -/* Multiply-accumulate macros that allow overflow in the addition (ie, no asserts in debug mode) */ -#undef silk_MLA_ovflw -#define silk_MLA_ovflw(a32, b32, c32) ((a32) + ((b32) * (c32))) -#undef silk_SMLABB_ovflw -#define silk_SMLABB_ovflw(a32, b32, c32) ((a32) + ((opus_int32)((opus_int16)(b32))) * (opus_int32)((opus_int16)(c32))) - -/* no checking needed for silk_SMULL - no checking needed for silk_SMLAL - no checking needed for silk_SMLALBB - no checking needed for SigProcFIX_CLZ16 - no checking needed for SigProcFIX_CLZ32*/ - -#undef silk_DIV32 -#define silk_DIV32(a,b) silk_DIV32_((a), (b), __FILE__, __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); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return a32 / b32; -} - -#undef silk_DIV32_16 -#define silk_DIV32_16(a,b) silk_DIV32_16_((a), (b), __FILE__, __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; - fail |= b32 < silk_int16_MIN; - if ( fail ) - { - fprintf (stderr, "silk_DIV32_16(%d, %d) in %s: line %d\n", a32, b32, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return a32 / b32; -} - -/* no checking needed for silk_SAT8 - no checking needed for silk_SAT16 - no checking needed for silk_SAT32 - 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 */ - -#undef silk_LSHIFT8 -#define silk_LSHIFT8(a,b) silk_LSHIFT8_((a), (b), __FILE__, __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; - fail |= shift < 0; - fail |= shift >= 8; - fail |= (opus_int64)ret != ((opus_int64)a) << shift; - if ( fail ) - { - fprintf (stderr, "silk_LSHIFT8(%d, %d) in %s: line %d\n", a, shift, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return ret; -} - -#undef silk_LSHIFT16 -#define silk_LSHIFT16(a,b) silk_LSHIFT16_((a), (b), __FILE__, __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; - fail |= shift < 0; - fail |= shift >= 16; - fail |= (opus_int64)ret != ((opus_int64)a) << shift; - if ( fail ) - { - fprintf (stderr, "silk_LSHIFT16(%d, %d) in %s: line %d\n", a, shift, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return ret; -} - -#undef silk_LSHIFT32 -#define silk_LSHIFT32(a,b) silk_LSHIFT32_((a), (b), __FILE__, __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; - fail |= shift < 0; - fail |= shift >= 32; - fail |= (opus_int64)ret != ((opus_int64)a) << shift; - if ( fail ) - { - fprintf (stderr, "silk_LSHIFT32(%d, %d) in %s: line %d\n", a, shift, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return ret; -} - -#undef silk_LSHIFT64 -#define silk_LSHIFT64(a,b) silk_LSHIFT64_((a), (b), __FILE__, __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; - fail |= shift < 0; - fail |= shift >= 64; - fail |= (ret>>shift) != ((opus_int64)a); - if ( fail ) - { - fprintf (stderr, "silk_LSHIFT64(%lld, %d) in %s: line %d\n", (long long)a, shift, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return ret; -} - -#undef silk_LSHIFT_ovflw -#define silk_LSHIFT_ovflw(a,b) silk_LSHIFT_ovflw_((a), (b), __FILE__, __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); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return a << shift; -} - -#undef silk_LSHIFT_uint -#define silk_LSHIFT_uint(a,b) silk_LSHIFT_uint_((a), (b), __FILE__, __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)) - { - fprintf (stderr, "silk_LSHIFT_uint(%u, %d) in %s: line %d\n", a, shift, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return ret; -} - -#undef silk_RSHIFT8 -#define silk_RSHITF8(a,b) silk_RSHIFT8_((a), (b), __FILE__, __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); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return a >> shift; -} - -#undef silk_RSHIFT16 -#define silk_RSHITF16(a,b) silk_RSHIFT16_((a), (b), __FILE__, __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); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return a >> shift; -} - -#undef silk_RSHIFT32 -#define silk_RSHIFT32(a,b) silk_RSHIFT32_((a), (b), __FILE__, __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); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return a >> shift; -} - -#undef silk_RSHIFT64 -#define silk_RSHIFT64(a,b) silk_RSHIFT64_((a), (b), __FILE__, __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); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return a >> shift; -} - -#undef silk_RSHIFT_uint -#define silk_RSHIFT_uint(a,b) silk_RSHIFT_uint_((a), (b), __FILE__, __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); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return a >> shift; -} - -#undef silk_ADD_LSHIFT -#define silk_ADD_LSHIFT(a,b,c) silk_ADD_LSHIFT_((a), (b), (c), __FILE__, __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)) ) - { - fprintf (stderr, "silk_ADD_LSHIFT(%d, %d, %d) in %s: line %d\n", a, b, shift, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return ret; /* shift >= 0 */ -} - -#undef silk_ADD_LSHIFT32 -#define silk_ADD_LSHIFT32(a,b,c) silk_ADD_LSHIFT32_((a), (b), (c), __FILE__, __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)) ) - { - fprintf (stderr, "silk_ADD_LSHIFT32(%d, %d, %d) in %s: line %d\n", a, b, shift, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return ret; /* shift >= 0 */ -} - -#undef silk_ADD_LSHIFT_uint -#define silk_ADD_LSHIFT_uint(a,b,c) silk_ADD_LSHIFT_uint_((a), (b), (c), __FILE__, __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)) ) - { - fprintf (stderr, "silk_ADD_LSHIFT_uint(%u, %u, %d) in %s: line %d\n", a, b, shift, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return ret; /* shift >= 0 */ -} - -#undef silk_ADD_RSHIFT -#define silk_ADD_RSHIFT(a,b,c) silk_ADD_RSHIFT_((a), (b), (c), __FILE__, __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)) ) - { - fprintf (stderr, "silk_ADD_RSHIFT(%d, %d, %d) in %s: line %d\n", a, b, shift, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return ret; /* shift > 0 */ -} - -#undef silk_ADD_RSHIFT32 -#define silk_ADD_RSHIFT32(a,b,c) silk_ADD_RSHIFT32_((a), (b), (c), __FILE__, __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)) ) - { - fprintf (stderr, "silk_ADD_RSHIFT32(%d, %d, %d) in %s: line %d\n", a, b, shift, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return ret; /* shift > 0 */ -} - -#undef silk_ADD_RSHIFT_uint -#define silk_ADD_RSHIFT_uint(a,b,c) silk_ADD_RSHIFT_uint_((a), (b), (c), __FILE__, __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)) ) - { - fprintf (stderr, "silk_ADD_RSHIFT_uint(%u, %u, %d) in %s: line %d\n", a, b, shift, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return ret; /* shift > 0 */ -} - -#undef silk_SUB_LSHIFT32 -#define silk_SUB_LSHIFT32(a,b,c) silk_SUB_LSHIFT32_((a), (b), (c), __FILE__, __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)) ) - { - fprintf (stderr, "silk_SUB_LSHIFT32(%d, %d, %d) in %s: line %d\n", a, b, shift, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return ret; /* shift >= 0 */ -} - -#undef silk_SUB_RSHIFT32 -#define silk_SUB_RSHIFT32(a,b,c) silk_SUB_RSHIFT32_((a), (b), (c), __FILE__, __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)) ) - { - fprintf (stderr, "silk_SUB_RSHIFT32(%d, %d, %d) in %s: line %d\n", a, b, shift, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return ret; /* shift > 0 */ -} - -#undef silk_RSHIFT_ROUND -#define silk_RSHIFT_ROUND(a,b) silk_RSHIFT_ROUND_((a), (b), __FILE__, __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 */ - if ( (shift <= 0) || (shift>31) || ((opus_int64)ret != ((opus_int64)a + ((opus_int64)1 << (shift - 1))) >> shift) ) - { - fprintf (stderr, "silk_RSHIFT_ROUND(%d, %d) in %s: line %d\n", a, shift, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return ret; -} - -#undef silk_RSHIFT_ROUND64 -#define silk_RSHIFT_ROUND64(a,b) silk_RSHIFT_ROUND64_((a), (b), __FILE__, __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) ) - { - fprintf (stderr, "silk_RSHIFT_ROUND64(%lld, %d) in %s: line %d\n", (long long)a, shift, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - ret = shift == 1 ? (a >> 1) + (a & 1) : ((a >> (shift - 1)) + 1) >> 1; - return ret; -} - -/* silk_abs is used on floats also, so doesn't work... */ -/*#undef silk_abs -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 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); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return (((a) > 0) ? (a) : -(a)); /* Be careful, silk_abs returns wrong when input equals to silk_intXX_MIN */ -} - -#undef silk_abs_int32 -#define silk_abs_int32(a) silk_abs_int32_((a), __FILE__, __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); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return silk_abs(a); -} - -#undef silk_CHECK_FIT8 -#define silk_CHECK_FIT8(a) silk_CHECK_FIT8_((a), __FILE__, __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 ) - { - fprintf (stderr, "silk_CHECK_FIT8(%lld) in %s: line %d\n", (long long)a, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return( ret ); -} - -#undef silk_CHECK_FIT16 -#define silk_CHECK_FIT16(a) silk_CHECK_FIT16_((a), __FILE__, __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 ) - { - fprintf (stderr, "silk_CHECK_FIT16(%lld) in %s: line %d\n", (long long)a, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return( ret ); -} - -#undef silk_CHECK_FIT32 -#define silk_CHECK_FIT32(a) silk_CHECK_FIT32_((a), __FILE__, __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 ) - { - fprintf (stderr, "silk_CHECK_FIT32(%lld) in %s: line %d\n", (long long)a, file, line); -#ifdef FIXED_DEBUG_ASSERT - silk_assert( 0 ); -#endif - } - return( ret ); -} - -/* no checking for silk_NSHIFT_MUL_32_32 - no checking for silk_NSHIFT_MUL_16_16 - no checking needed for silk_min - no checking needed for silk_max - no checking needed for silk_sign -*/ - -#endif -#endif /* MACRO_DEBUG_H */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/NLSF2A.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/NLSF2A.c deleted file mode 100644 index b1c559ea..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/NLSF2A.c +++ /dev/null @@ -1,178 +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 - -/* conversion between prediction filter coefficients and LSFs */ -/* order should be even */ -/* a piecewise linear approximation maps LSF <-> cos(LSF) */ -/* therefore the result is not accurate LSFs, but the two */ -/* functions are accurate inverses of each other */ - -#include "SigProc_FIX.h" -#include "tables.h" - -#define QA 16 - -/* helper function for NLSF2A(..) */ -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) */ -) -{ - opus_int k, n; - opus_int32 ftmp; - - out[0] = silk_LSHIFT( 1, QA ); - out[1] = -cLSF[0]; - for( k = 1; k < dd; k++ ) { - ftmp = cLSF[2*k]; /* QA*/ - out[k+1] = silk_LSHIFT( out[k-1], 1 ) - (opus_int32)silk_RSHIFT_ROUND64( silk_SMULL( ftmp, out[k] ), QA ); - for( n = k; n > 1; n-- ) { - out[n] += out[n-2] - (opus_int32)silk_RSHIFT_ROUND64( silk_SMULL( ftmp, out[n-1] ), QA ); - } - out[1] -= ftmp; - } -} - -/* compute whitening filter coefficients from normalized line spectral frequencies */ -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) */ -) -{ - /* This ordering was found to maximize quality. It improves numerical accuracy of - silk_NLSF2A_find_poly() compared to "standard" ordering. */ - static const unsigned char ordering16[16] = { - 0, 15, 8, 7, 4, 11, 12, 3, 2, 13, 10, 5, 6, 9, 14, 1 - }; - static const unsigned char ordering10[10] = { - 0, 9, 6, 3, 4, 5, 8, 1, 2, 7 - }; - const unsigned char *ordering; - opus_int k, i, dd; - opus_int32 cos_LSF_QA[ SILK_MAX_ORDER_LPC ]; - 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 ); - - /* 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 ); - - /* f_int on a scale 0-127 (rounded down) */ - f_int = silk_RSHIFT( NLSF[k], 15 - 7 ); - - /* f_frac, range: 0..255 */ - f_frac = NLSF[k] - silk_LSHIFT( f_int, 15 - 7 ); - - silk_assert(f_int >= 0); - silk_assert(f_int < LSF_COS_TAB_SZ_FIX ); - - /* Read start and end value from table */ - cos_val = silk_LSFCosTab_FIX_Q12[ f_int ]; /* Q12 */ - delta = silk_LSFCosTab_FIX_Q12[ f_int + 1 ] - cos_val; /* Q12, with a range of 0..200 */ - - /* Linear interpolation */ - cos_LSF_QA[ordering[k]] = silk_RSHIFT_ROUND( silk_LSHIFT( cos_val, 8 ) + silk_MUL( delta, f_frac ), 20 - QA ); /* QA */ - } - - dd = silk_RSHIFT( d, 1 ); - - /* generate even and odd polynomials using convolution */ - silk_NLSF2A_find_poly( P, &cos_LSF_QA[ 0 ], dd ); - silk_NLSF2A_find_poly( Q, &cos_LSF_QA[ 1 ], dd ); - - /* convert even and odd polynomials to opus_int32 Q12 filter coefs */ - for( k = 0; k < dd; k++ ) { - Ptmp = P[ k+1 ] + P[ k ]; - Qtmp = Q[ k+1 ] - Q[ k ]; - - /* the Ptmp and Qtmp values at this stage need to fit in int32 */ - a32_QA1[ k ] = -Qtmp - Ptmp; /* QA+1 */ - 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; - } - } - - if( i == 10 ) { - /* Reached the last iteration, clip the coefficients */ - 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; - } - } -} - diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/NLSF_VQ.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/NLSF_VQ.c deleted file mode 100644 index 69b6e22e..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/NLSF_VQ.c +++ /dev/null @@ -1,68 +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" - -/* 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] */ - 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_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; - - silk_assert( LPC_order <= 16 ); - silk_assert( ( LPC_order & 1 ) == 0 ); - - /* Loop over codebook */ - 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 ); - - /* 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 ); - - 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 ); - } - err_Q26[ i ] = sum_error_Q26; - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/NLSF_VQ_weights_laroia.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/NLSF_VQ_weights_laroia.c deleted file mode 100644 index 04894c59..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/NLSF_VQ_weights_laroia.c +++ /dev/null @@ -1,80 +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 "define.h" -#include "SigProc_FIX.h" - -/* -R. Laroia, N. Phamdo and N. Farvardin, "Robust and Efficient Quantization of Speech LSP -Parameters Using Structured Vector Quantization", Proc. IEEE Int. Conf. Acoust., Speech, -Signal Processing, pp. 641-644, 1991. -*/ - -/* Laroia low complexity NLSF weights */ -void silk_NLSF_VQ_weights_laroia( - opus_int16 *pNLSFW_Q_OUT, /* O Pointer to input vector weights [D] */ - const opus_int16 *pNLSF_Q15, /* I Pointer to input vector [D] */ - const opus_int D /* I Input vector dimension (even) */ -) -{ - opus_int k; - opus_int32 tmp1_int, tmp2_int; - - silk_assert( D > 0 ); - silk_assert( ( D & 1 ) == 0 ); - - /* First value */ - tmp1_int = silk_max_int( pNLSF_Q15[ 0 ], 1 ); - tmp1_int = silk_DIV32_16( (opus_int32)1 << ( 15 + NLSF_W_Q ), tmp1_int ); - tmp2_int = silk_max_int( pNLSF_Q15[ 1 ] - pNLSF_Q15[ 0 ], 1 ); - tmp2_int = silk_DIV32_16( (opus_int32)1 << ( 15 + NLSF_W_Q ), tmp2_int ); - pNLSFW_Q_OUT[ 0 ] = (opus_int16)silk_min_int( tmp1_int + tmp2_int, silk_int16_MAX ); - silk_assert( pNLSFW_Q_OUT[ 0 ] > 0 ); - - /* Main loop */ - for( k = 1; k < D - 1; k += 2 ) { - tmp1_int = silk_max_int( pNLSF_Q15[ k + 1 ] - pNLSF_Q15[ k ], 1 ); - tmp1_int = silk_DIV32_16( (opus_int32)1 << ( 15 + NLSF_W_Q ), tmp1_int ); - pNLSFW_Q_OUT[ k ] = (opus_int16)silk_min_int( tmp1_int + tmp2_int, silk_int16_MAX ); - silk_assert( pNLSFW_Q_OUT[ k ] > 0 ); - - tmp2_int = silk_max_int( pNLSF_Q15[ k + 2 ] - pNLSF_Q15[ k + 1 ], 1 ); - tmp2_int = silk_DIV32_16( (opus_int32)1 << ( 15 + NLSF_W_Q ), tmp2_int ); - pNLSFW_Q_OUT[ k + 1 ] = (opus_int16)silk_min_int( tmp1_int + tmp2_int, silk_int16_MAX ); - silk_assert( pNLSFW_Q_OUT[ k + 1 ] > 0 ); - } - - /* Last value */ - tmp1_int = silk_max_int( ( 1 << 15 ) - pNLSF_Q15[ D - 1 ], 1 ); - tmp1_int = silk_DIV32_16( (opus_int32)1 << ( 15 + NLSF_W_Q ), tmp1_int ); - pNLSFW_Q_OUT[ D - 1 ] = (opus_int16)silk_min_int( tmp1_int + tmp2_int, silk_int16_MAX ); - silk_assert( pNLSFW_Q_OUT[ D - 1 ] > 0 ); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/NLSF_decode.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/NLSF_decode.c deleted file mode 100644 index 9f715060..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/NLSF_decode.c +++ /dev/null @@ -1,101 +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" - -/* Predictive dequantizer for NLSF residuals */ -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 ] */ - const opus_int quant_step_size_Q16, /* I Quantization step size */ - const opus_int16 order /* I Number of input values */ -) -{ - opus_int i, out_Q10, pred_Q10; - - out_Q10 = 0; - for( i = order-1; i >= 0; i-- ) { - pred_Q10 = silk_RSHIFT( silk_SMULBB( out_Q10, (opus_int16)pred_coef_Q8[ i ] ), 8 ); - out_Q10 = silk_LSHIFT( indices[ i ], 10 ); - if( out_Q10 > 0 ) { - out_Q10 = silk_SUB16( out_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); - } else if( out_Q10 < 0 ) { - out_Q10 = silk_ADD16( out_Q10, SILK_FIX_CONST( NLSF_QUANT_LEVEL_ADJ, 10 ) ); - } - out_Q10 = silk_SMLAWB( pred_Q10, (opus_int32)out_Q10, quant_step_size_Q16 ); - x_Q10[ i ] = out_Q10; - } -} - - -/***********************/ -/* NLSF vector decoder */ -/***********************/ -void silk_NLSF_decode( - opus_int16 *pNLSF_Q15, /* O Quantized NLSF vector [ LPC_ORDER ] */ - opus_int8 *NLSFIndices, /* I Codebook path vector [ LPC_ORDER + 1 ] */ - const silk_NLSF_CB_struct *psNLSF_CB /* I Codebook object */ -) -{ - opus_int i; - 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; - 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 ); - } - - /* Unpack entropy table indices and predictor for current CB1 index */ - silk_NLSF_unpack( ec_ix, pred_Q8, psNLSF_CB, NLSFIndices[ 0 ] ); - - /* 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 */ - 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 ) ); - pNLSF_Q15[ i ] = (opus_int16)silk_LIMIT( NLSF_Q15_tmp, 0, 32767 ); - } - - /* NLSF stabilization */ - silk_NLSF_stabilize( pNLSF_Q15, psNLSF_CB->deltaMin_Q15, psNLSF_CB->order ); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/NLSF_del_dec_quant.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/NLSF_del_dec_quant.c deleted file mode 100644 index 504dbbd0..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/NLSF_del_dec_quant.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.h" - -/* Delayed-decision quantizer for NLSF residuals */ -opus_int32 silk_NLSF_del_dec_quant( /* O Returns RD value in Q25 */ - opus_int8 indices[], /* O Quantization indices [ order ] */ - const opus_int16 x_Q10[], /* I Input [ order ] */ - const opus_int16 w_Q5[], /* I Weights [ order ] */ - const opus_uint8 pred_coef_Q8[], /* I Backward predictor coefs [ order ] */ - const opus_int16 ec_ix[], /* I Indices to entropy coding tables [ order ] */ - const opus_uint8 ec_rates_Q5[], /* I Rates [] */ - const opus_int quant_step_size_Q16, /* I Quantization step size */ - const opus_int16 inv_quant_step_size_Q6, /* I Inverse quantization step size */ - const opus_int32 mu_Q20, /* I R/D tradeoff */ - const opus_int16 order /* I Number of input values */ -) -{ - 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 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 ]; - opus_int32 RD_Q25[ 2 * NLSF_QUANT_DEL_DEC_STATES ]; - opus_int32 RD_min_Q25[ NLSF_QUANT_DEL_DEC_STATES ]; - opus_int32 RD_max_Q25[ NLSF_QUANT_DEL_DEC_STATES ]; - const opus_uint8 *rates_Q5; - - 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-- ) { - 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 ] ); - res_Q10 = silk_SUB16( in_Q10, pred_Q10 ); - ind_tmp = silk_SMULWB( (opus_int32)inv_quant_step_size_Q6, res_Q10 ); - 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 = silk_ADD16( out0_Q10, pred_Q10 ); - out1_Q10 = silk_ADD16( out1_Q10, pred_Q10 ); - prev_out_Q10[ j ] = out0_Q10; - prev_out_Q10[ j + nStates ] = out1_Q10; - - /* compute RD for ind_tmp and ind_tmp + 1 */ - if( ind_tmp + 1 >= NLSF_QUANT_MAX_AMPLITUDE ) { - if( ind_tmp + 1 == NLSF_QUANT_MAX_AMPLITUDE ) { - rate0_Q5 = rates_Q5[ ind_tmp + NLSF_QUANT_MAX_AMPLITUDE ]; - rate1_Q5 = 280; - } else { - rate0_Q5 = silk_SMLABB( 280 - 43 * NLSF_QUANT_MAX_AMPLITUDE, 43, ind_tmp ); - rate1_Q5 = silk_ADD16( rate0_Q5, 43 ); - } - } else if( ind_tmp <= -NLSF_QUANT_MAX_AMPLITUDE ) { - if( ind_tmp == -NLSF_QUANT_MAX_AMPLITUDE ) { - rate0_Q5 = 280; - rate1_Q5 = rates_Q5[ ind_tmp + 1 + NLSF_QUANT_MAX_AMPLITUDE ]; - } else { - rate0_Q5 = silk_SMLABB( 280 - 43 * NLSF_QUANT_MAX_AMPLITUDE, -43, ind_tmp ); - rate1_Q5 = silk_SUB16( rate0_Q5, 43 ); - } - } else { - rate0_Q5 = rates_Q5[ ind_tmp + NLSF_QUANT_MAX_AMPLITUDE ]; - rate1_Q5 = rates_Q5[ ind_tmp + 1 + NLSF_QUANT_MAX_AMPLITUDE ]; - } - RD_tmp_Q25 = RD_Q25[ j ]; - diff_Q10 = silk_SUB16( in_Q10, out0_Q10 ); - RD_Q25[ j ] = silk_SMLABB( silk_MLA( RD_tmp_Q25, silk_SMULBB( diff_Q10, diff_Q10 ), w_Q5[ i ] ), mu_Q20, rate0_Q5 ); - diff_Q10 = silk_SUB16( in_Q10, out1_Q10 ); - 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 >> 1 ) ) { - /* double number of states and copy */ - for( j = 0; j < nStates; j++ ) { - ind[ j + nStates ][ i ] = ind[ j ][ i ] + 1; - } - nStates = silk_LSHIFT( nStates, 1 ); - for( j = nStates; j < NLSF_QUANT_DEL_DEC_STATES; j++ ) { - ind[ j ][ i ] = ind[ j - nStates ][ i ]; - } - } else if( i > 0 ) { - /* 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 ] ) { - RD_max_Q25[ j ] = RD_Q25[ j ]; - RD_min_Q25[ j ] = RD_Q25[ j + NLSF_QUANT_DEL_DEC_STATES ]; - RD_Q25[ j ] = RD_min_Q25[ j ]; - RD_Q25[ j + NLSF_QUANT_DEL_DEC_STATES ] = RD_max_Q25[ j ]; - /* swap prev_out values */ - out0_Q10 = prev_out_Q10[ j ]; - prev_out_Q10[ j ] = prev_out_Q10[ j + NLSF_QUANT_DEL_DEC_STATES ]; - prev_out_Q10[ j + NLSF_QUANT_DEL_DEC_STATES ] = out0_Q10; - ind_sort[ j ] = j + NLSF_QUANT_DEL_DEC_STATES; - } else { - RD_min_Q25[ j ] = RD_Q25[ j ]; - RD_max_Q25[ j ] = RD_Q25[ j + NLSF_QUANT_DEL_DEC_STATES ]; - ind_sort[ j ] = j; - } - } - /* compare the highest RD values of the winning half with the lowest one in the losing half, and copy if necessary */ - /* afterwards ind_sort[] will contain the indices of the NLSF_QUANT_DEL_DEC_STATES winning RD values */ - while( 1 ) { - min_max_Q25 = silk_int32_MAX; - max_min_Q25 = 0; - ind_min_max = 0; - ind_max_min = 0; - for( j = 0; j < NLSF_QUANT_DEL_DEC_STATES; j++ ) { - if( min_max_Q25 > RD_max_Q25[ j ] ) { - min_max_Q25 = RD_max_Q25[ j ]; - ind_min_max = j; - } - if( max_min_Q25 < RD_min_Q25[ j ] ) { - max_min_Q25 = RD_min_Q25[ j ]; - ind_max_min = j; - } - } - if( min_max_Q25 >= max_min_Q25 ) { - break; - } - /* copy ind_min_max to ind_max_min */ - ind_sort[ ind_max_min ] = ind_sort[ ind_min_max ] ^ NLSF_QUANT_DEL_DEC_STATES; - RD_Q25[ ind_max_min ] = RD_Q25[ ind_min_max + NLSF_QUANT_DEL_DEC_STATES ]; - prev_out_Q10[ ind_max_min ] = prev_out_Q10[ ind_min_max + NLSF_QUANT_DEL_DEC_STATES ]; - RD_min_Q25[ ind_max_min ] = 0; - RD_max_Q25[ ind_min_max ] = silk_int32_MAX; - silk_memcpy( ind[ ind_max_min ], ind[ ind_min_max ], MAX_LPC_ORDER * sizeof( opus_int8 ) ); - } - /* increment index if it comes from the upper half */ - 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; - } - } - - /* last sample: find winner, copy indices and return RD value */ - ind_tmp = 0; - min_Q25 = silk_int32_MAX; - for( j = 0; j < 2 * NLSF_QUANT_DEL_DEC_STATES; j++ ) { - if( min_Q25 > RD_Q25[ j ] ) { - min_Q25 = RD_Q25[ j ]; - ind_tmp = j; - } - } - for( j = 0; j < order; j++ ) { - indices[ j ] = ind[ ind_tmp & ( NLSF_QUANT_DEL_DEC_STATES - 1 ) ][ j ]; - silk_assert( indices[ j ] >= -NLSF_QUANT_MAX_AMPLITUDE_EXT ); - silk_assert( indices[ j ] <= NLSF_QUANT_MAX_AMPLITUDE_EXT ); - } - indices[ 0 ] += silk_RSHIFT( ind_tmp, NLSF_QUANT_DEL_DEC_STATES_LOG2 ); - silk_assert( indices[ 0 ] <= NLSF_QUANT_MAX_AMPLITUDE_EXT ); - silk_assert( min_Q25 >= 0 ); - return min_Q25; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/NLSF_encode.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/NLSF_encode.c deleted file mode 100644 index 03a036fd..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/NLSF_encode.c +++ /dev/null @@ -1,136 +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 "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 ] */ - const silk_NLSF_CB_struct *psNLSF_CB, /* I Codebook object */ - const opus_int16 *pW_QW, /* 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; - VARDECL( opus_int32, err_Q26 ); - VARDECL( opus_int32, RD_Q25 ); - VARDECL( opus_int, tempIndices1 ); - VARDECL( opus_int8, tempIndices2 ); - opus_int16 res_Q15[ MAX_LPC_ORDER ]; - 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; - SAVE_STACK; - - silk_assert( nSurvivors <= NLSF_VQ_MAX_SURVIVORS ); - silk_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 */ - ALLOC( err_Q26, psNLSF_CB->nVectors, opus_int32 ); - silk_NLSF_VQ( err_Q26, pNLSF_Q15, psNLSF_CB->CB1_NLSF_Q8, psNLSF_CB->nVectors, psNLSF_CB->order ); - - /* Sort the quantization errors */ - ALLOC( tempIndices1, nSurvivors, opus_int ); - silk_insertion_sort_increasing( err_Q26, 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++ ) { - ind1 = tempIndices1[ s ]; - - /* Residual after first stage */ - pCB_element = &psNLSF_CB->CB1_NLSF_Q8[ 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 ] ); - } - - /* Unpack entropy table indices and predictor for current CB1 index */ - silk_NLSF_unpack( ec_ix, pred_Q8, psNLSF_CB, ind1 ); - - /* Trellis quantizer */ - RD_Q25[ s ] = silk_NLSF_del_dec_quant( &tempIndices2[ s * MAX_LPC_ORDER ], res_Q10, W_adj_Q5, pred_Q8, ec_ix, - psNLSF_CB->ec_Rates_Q5, psNLSF_CB->quantStepSize_Q16, psNLSF_CB->invQuantStepSize_Q6, NLSF_mu_Q20, psNLSF_CB->order ); - - /* Add rate for first stage */ - iCDF_ptr = &psNLSF_CB->CB1_iCDF[ ( signalType >> 1 ) * psNLSF_CB->nVectors ]; - if( ind1 == 0 ) { - prob_Q8 = 256 - iCDF_ptr[ ind1 ]; - } else { - prob_Q8 = iCDF_ptr[ ind1 - 1 ] - iCDF_ptr[ ind1 ]; - } - bits_q7 = ( 8 << 7 ) - silk_lin2log( prob_Q8 ); - RD_Q25[ s ] = silk_SMLABB( RD_Q25[ s ], bits_q7, silk_RSHIFT( NLSF_mu_Q20, 2 ) ); - } - - /* Find the lowest rate-distortion error */ - silk_insertion_sort_increasing( RD_Q25, &bestIndex, nSurvivors, 1 ); - - NLSFIndices[ 0 ] = (opus_int8)tempIndices1[ bestIndex ]; - silk_memcpy( &NLSFIndices[ 1 ], &tempIndices2[ bestIndex * MAX_LPC_ORDER ], psNLSF_CB->order * sizeof( opus_int8 ) ); - - /* Decode */ - silk_NLSF_decode( pNLSF_Q15, NLSFIndices, psNLSF_CB ); - - RESTORE_STACK; - return RD_Q25[ 0 ]; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/NLSF_stabilize.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/NLSF_stabilize.c deleted file mode 100644 index 1fa1ea37..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/NLSF_stabilize.c +++ /dev/null @@ -1,142 +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 - -/* NLSF stabilizer: */ -/* */ -/* - Moves NLSFs further apart if they are too close */ -/* - Moves NLSFs away from borders if they are too close */ -/* - High effort to achieve a modification with minimum */ -/* Euclidean distance to input vector */ -/* - Output are sorted NLSF coefficients */ -/* */ - -#include "SigProc_FIX.h" - -/* Constant Definitions */ -#define MAX_LOOPS 20 - -/* NLSF stabilizer, for a single input data vector */ -void silk_NLSF_stabilize( - opus_int16 *NLSF_Q15, /* I/O Unstable/stabilized normalized LSF vector in Q15 [L] */ - const opus_int16 *NDeltaMin_Q15, /* I Min distance vector, NDeltaMin_Q15[L] must be >= 1 [L+1] */ - const opus_int L /* I Number of NLSF parameters in the input vector */ -) -{ - opus_int i, I=0, k, loops; - opus_int16 center_freq_Q15; - opus_int32 diff_Q15, min_diff_Q15, min_center_Q15, max_center_Q15; - - /* This is necessary to ensure an output within range of a opus_int16 */ - silk_assert( NDeltaMin_Q15[L] >= 1 ); - - for( loops = 0; loops < MAX_LOOPS; loops++ ) { - /**************************/ - /* Find smallest distance */ - /**************************/ - /* First element */ - min_diff_Q15 = NLSF_Q15[0] - NDeltaMin_Q15[0]; - I = 0; - /* Middle elements */ - for( i = 1; i <= L-1; i++ ) { - diff_Q15 = NLSF_Q15[i] - ( NLSF_Q15[i-1] + NDeltaMin_Q15[i] ); - if( diff_Q15 < min_diff_Q15 ) { - min_diff_Q15 = diff_Q15; - I = i; - } - } - /* Last element */ - diff_Q15 = ( 1 << 15 ) - ( NLSF_Q15[L-1] + NDeltaMin_Q15[L] ); - if( diff_Q15 < min_diff_Q15 ) { - min_diff_Q15 = diff_Q15; - I = L; - } - - /***************************************************/ - /* Now check if the smallest distance non-negative */ - /***************************************************/ - if( min_diff_Q15 >= 0 ) { - return; - } - - if( I == 0 ) { - /* Move away from lower limit */ - NLSF_Q15[0] = NDeltaMin_Q15[0]; - - } else if( I == L) { - /* Move away from higher limit */ - NLSF_Q15[L-1] = ( 1 << 15 ) - NDeltaMin_Q15[L]; - - } else { - /* Find the lower extreme for the location of the current center frequency */ - min_center_Q15 = 0; - for( k = 0; k < I; k++ ) { - min_center_Q15 += NDeltaMin_Q15[k]; - } - min_center_Q15 += silk_RSHIFT( NDeltaMin_Q15[I], 1 ); - - /* Find the upper extreme for the location of the current center frequency */ - max_center_Q15 = 1 << 15; - for( k = L; k > I; k-- ) { - max_center_Q15 -= NDeltaMin_Q15[k]; - } - max_center_Q15 -= silk_RSHIFT( NDeltaMin_Q15[I], 1 ); - - /* Move apart, sorted by value, keeping the same center frequency */ - center_freq_Q15 = (opus_int16)silk_LIMIT_32( silk_RSHIFT_ROUND( (opus_int32)NLSF_Q15[I-1] + (opus_int32)NLSF_Q15[I], 1 ), - min_center_Q15, max_center_Q15 ); - NLSF_Q15[I-1] = center_freq_Q15 - silk_RSHIFT( NDeltaMin_Q15[I], 1 ); - NLSF_Q15[I] = NLSF_Q15[I-1] + NDeltaMin_Q15[I]; - } - } - - /* Safe and simple fall back method, which is less ideal than the above */ - if( loops == MAX_LOOPS ) - { - /* Insertion sort (fast for already almost sorted arrays): */ - /* Best case: O(n) for an already sorted array */ - /* Worst case: O(n^2) for an inversely sorted array */ - silk_insertion_sort_increasing_all_values_int16( &NLSF_Q15[0], L ); - - /* First NLSF should be no less than NDeltaMin[0] */ - NLSF_Q15[0] = silk_max_int( NLSF_Q15[0], NDeltaMin_Q15[0] ); - - /* 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] ); - - /* 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] ); - - /* Keep NDeltaMin distance between the NLSFs */ - for( i = L-2; i >= 0; i-- ) - NLSF_Q15[i] = silk_min_int( NLSF_Q15[i], NLSF_Q15[i+1] - NDeltaMin_Q15[i+1] ); - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/NLSF_unpack.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/NLSF_unpack.c deleted file mode 100644 index 17bd23f7..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/NLSF_unpack.c +++ /dev/null @@ -1,55 +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" - -/* Unpack predictor values and indices for entropy coding tables */ -void silk_NLSF_unpack( - opus_int16 ec_ix[], /* O Indices to entropy tables [ LPC_ORDER ] */ - opus_uint8 pred_Q8[], /* O LSF predictor [ LPC_ORDER ] */ - const silk_NLSF_CB_struct *psNLSF_CB, /* I Codebook object */ - const opus_int CB1_index /* I Index of vector in first LSF codebook */ -) -{ - opus_int i; - opus_uint8 entry; - const opus_uint8 *ec_sel_ptr; - - ec_sel_ptr = &psNLSF_CB->ec_sel[ CB1_index * psNLSF_CB->order / 2 ]; - for( i = 0; i < psNLSF_CB->order; i += 2 ) { - entry = *ec_sel_ptr++; - ec_ix [ i ] = silk_SMULBB( silk_RSHIFT( entry, 1 ) & 7, 2 * NLSF_QUANT_MAX_AMPLITUDE + 1 ); - pred_Q8[ i ] = psNLSF_CB->pred_Q8[ i + ( entry & 1 ) * ( psNLSF_CB->order - 1 ) ]; - ec_ix [ i + 1 ] = silk_SMULBB( silk_RSHIFT( entry, 5 ) & 7, 2 * NLSF_QUANT_MAX_AMPLITUDE + 1 ); - pred_Q8[ i + 1 ] = psNLSF_CB->pred_Q8[ i + ( silk_RSHIFT( entry, 4 ) & 1 ) * ( psNLSF_CB->order - 1 ) + 1 ]; - } -} - diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/NSQ.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/NSQ.c deleted file mode 100644 index cf5b3fd5..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/NSQ.c +++ /dev/null @@ -1,446 +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 "stack_alloc.h" - -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 */ - 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( - 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 */ -); - -void silk_NSQ( - const silk_encoder_state *psEncC, /* I/O 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 ); - 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 ]; - - 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; - 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 ); - - 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_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 ); - - 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 */ - /* 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 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 */ - 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 */ -) -{ - opus_int i, j; - 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; - - 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 ]; - - 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 ] ); - } - - /* Long-term prediction */ - if( signalType == TYPE_VOICED ) { - /* Unrolled loop */ - /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ - LTP_pred_Q13 = 2; - LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ 0 ], b_Q14[ 0 ] ); - LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -1 ], b_Q14[ 1 ] ); - LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -2 ], b_Q14[ 2 ] ); - LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -3 ], b_Q14[ 3 ] ); - LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -4 ], b_Q14[ 4 ] ); - pred_lag_ptr++; - } else { - LTP_pred_Q13 = 0; - } - - /* 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 ] ); - - 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 ); - - /* 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 */ - - /* Flip sign depending on dither */ - 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( 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_Q20 = silk_SMULBB( q1_Q10, Lambda_Q10 ); - rd2_Q20 = 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_Q20 = silk_SMULBB( q1_Q10, Lambda_Q10 ); - rd2_Q20 = 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_Q20 = silk_SMULBB( -q1_Q10, Lambda_Q10 ); - rd2_Q20 = 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_Q20 = silk_SMULBB( -q1_Q10, Lambda_Q10 ); - rd2_Q20 = silk_SMULBB( -q2_Q10, Lambda_Q10 ); - } - rr_Q10 = silk_SUB32( r_Q10, q1_Q10 ); - rd1_Q20 = silk_SMLABB( rd1_Q20, rr_Q10, rr_Q10 ); - rr_Q10 = silk_SUB32( r_Q10, q2_Q10 ); - rd2_Q20 = silk_SMLABB( rd2_Q20, rr_Q10, rr_Q10 ); - - if( rd2_Q20 < rd1_Q20 ) { - q1_Q10 = q2_Q10; - } - - pulses[ i ] = (opus_int8)silk_RSHIFT_ROUND( q1_Q10, 10 ); - - /* Excitation */ - exc_Q14 = silk_LSHIFT( q1_Q10, 4 ); - if ( NSQ->rand_seed < 0 ) { - exc_Q14 = -exc_Q14; - } - - /* 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 ); - - /* Scale XQ back to normal level before saving */ - xq[ i ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( xq_Q14, Gain_Q10 ), 8 ) ); - - /* Update states */ - psLPC_Q14++; - *psLPC_Q14 = xq_Q14; - sLF_AR_shp_Q14 = silk_SUB_LSHIFT32( xq_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 ); - 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 ] ); - } - - /* 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( - 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; - - 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 ); - for( i = 0; 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 */ - 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 ] ); - } - - /* 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/sources/LabSound/third_party/libnyquist/third_party/opus/silk/NSQ_del_dec.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/NSQ_del_dec.c deleted file mode 100644 index 522be406..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/NSQ_del_dec.c +++ /dev/null @@ -1,719 +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 "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( - 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( - 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 Index to newest samples in buffers */ - opus_int decisionDelay /* I */ -); - -void silk_NSQ_del_dec( - const silk_encoder_state *psEncC, /* I/O 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_MASK; - 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; - 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 ); - - 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, - 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 ); - - 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_MASK; - 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 */ - /* 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 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 */ - 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 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; - SAVE_STACK; - - silk_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 ); - - 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; - 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; - } - - 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 ); - 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_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_MASK; /* Index to newest samples */ - last_smple_idx = ( *smpl_buf_idx + decisionDelay ) & DECISION_DELAY_MASK; /* Index to decisionDelay old samples */ - - /* 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( - 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; - - 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 ); - for( i = 0; 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 */ - 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 ] ); - } - - /* 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/sources/LabSound/third_party/libnyquist/third_party/opus/silk/PLC.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/PLC.c deleted file mode 100644 index 01f40014..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/PLC.c +++ /dev/null @@ -1,423 +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 "stack_alloc.h" -#include "PLC.h" - -#define NB_ATT 2 -static const opus_int16 HARM_ATT_Q15[NB_ATT] = { 32440, 31130 }; /* 0.99, 0.95 */ -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 OPUS_INLINE void silk_PLC_update( - silk_decoder_state *psDec, /* I/O Decoder state */ - silk_decoder_control *psDecCtrl /* I/O Decoder control */ -); - -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 */ -); - - -void silk_PLC_Reset( - silk_decoder_state *psDec /* I/O Decoder state */ -) -{ - psDec->sPLC.pitchL_Q8 = silk_LSHIFT( psDec->frame_length, 8 - 1 ); - psDec->sPLC.prevGain_Q16[ 0 ] = SILK_FIX_CONST( 1, 16 ); - psDec->sPLC.prevGain_Q16[ 1 ] = SILK_FIX_CONST( 1, 16 ); - psDec->sPLC.subfr_length = 20; - psDec->sPLC.nb_subfr = 2; -} - -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 */ -) -{ - /* PLC control function */ - if( psDec->fs_kHz != psDec->sPLC.fs_kHz ) { - silk_PLC_Reset( psDec ); - psDec->sPLC.fs_kHz = psDec->fs_kHz; - } - - if( lost ) { - /****************************/ - /* Generate Signal */ - /****************************/ - silk_PLC_conceal( psDec, psDecCtrl, frame ); - - psDec->lossCnt++; - } else { - /****************************/ - /* Update state */ - /****************************/ - silk_PLC_update( psDec, psDecCtrl ); - } -} - -/**************************************************/ -/* Update state of PLC */ -/**************************************************/ -static OPUS_INLINE void silk_PLC_update( - silk_decoder_state *psDec, /* I/O Decoder state */ - silk_decoder_control *psDecCtrl /* I/O Decoder control */ -) -{ - opus_int32 LTP_Gain_Q14, temp_LTP_Gain_Q14; - opus_int i, j; - silk_PLC_struct *psPLC; - - psPLC = &psDec->sPLC; - - /* Update parameters used in case of packet loss */ - psDec->prevSignalType = psDec->indices.signalType; - LTP_Gain_Q14 = 0; - if( psDec->indices.signalType == TYPE_VOICED ) { - /* Find the parameters for the last subframe which contains a pitch pulse */ - for( j = 0; j * psDec->subfr_length < psDecCtrl->pitchL[ psDec->nb_subfr - 1 ]; j++ ) { - if( j == psDec->nb_subfr ) { - break; - } - temp_LTP_Gain_Q14 = 0; - for( i = 0; i < LTP_ORDER; i++ ) { - temp_LTP_Gain_Q14 += psDecCtrl->LTPCoef_Q14[ ( psDec->nb_subfr - 1 - j ) * LTP_ORDER + i ]; - } - if( temp_LTP_Gain_Q14 > LTP_Gain_Q14 ) { - LTP_Gain_Q14 = temp_LTP_Gain_Q14; - silk_memcpy( psPLC->LTPCoef_Q14, - &psDecCtrl->LTPCoef_Q14[ silk_SMULBB( psDec->nb_subfr - 1 - j, LTP_ORDER ) ], - LTP_ORDER * sizeof( opus_int16 ) ); - - psPLC->pitchL_Q8 = silk_LSHIFT( psDecCtrl->pitchL[ psDec->nb_subfr - 1 - j ], 8 ); - } - } - - silk_memset( psPLC->LTPCoef_Q14, 0, LTP_ORDER * sizeof( opus_int16 ) ); - psPLC->LTPCoef_Q14[ LTP_ORDER / 2 ] = LTP_Gain_Q14; - - /* Limit LT coefs */ - if( LTP_Gain_Q14 < V_PITCH_GAIN_START_MIN_Q14 ) { - opus_int scale_Q10; - opus_int32 tmp; - - tmp = silk_LSHIFT( V_PITCH_GAIN_START_MIN_Q14, 10 ); - scale_Q10 = silk_DIV32( tmp, silk_max( LTP_Gain_Q14, 1 ) ); - for( i = 0; i < LTP_ORDER; i++ ) { - psPLC->LTPCoef_Q14[ i ] = silk_RSHIFT( silk_SMULBB( psPLC->LTPCoef_Q14[ i ], scale_Q10 ), 10 ); - } - } else if( LTP_Gain_Q14 > V_PITCH_GAIN_START_MAX_Q14 ) { - opus_int scale_Q14; - opus_int32 tmp; - - tmp = silk_LSHIFT( V_PITCH_GAIN_START_MAX_Q14, 14 ); - scale_Q14 = silk_DIV32( tmp, silk_max( LTP_Gain_Q14, 1 ) ); - for( i = 0; i < LTP_ORDER; i++ ) { - psPLC->LTPCoef_Q14[ i ] = silk_RSHIFT( silk_SMULBB( psPLC->LTPCoef_Q14[ i ], scale_Q14 ), 14 ); - } - } - } else { - psPLC->pitchL_Q8 = silk_LSHIFT( silk_SMULBB( psDec->fs_kHz, 18 ), 8 ); - silk_memset( psPLC->LTPCoef_Q14, 0, LTP_ORDER * sizeof( opus_int16 )); - } - - /* Save LPC coeficients */ - silk_memcpy( psPLC->prevLPC_Q12, psDecCtrl->PredCoef_Q12[ 1 ], psDec->LPC_order * sizeof( opus_int16 ) ); - psPLC->prevLTP_scale_Q14 = psDecCtrl->LTP_scale_Q14; - - /* Save last two gains */ - silk_memcpy( psPLC->prevGain_Q16, &psDecCtrl->Gains_Q16[ psDec->nb_subfr - 2 ], 2 * sizeof( opus_int32 ) ); - - psPLC->subfr_length = psDec->subfr_length; - psPLC->nb_subfr = psDec->nb_subfr; -} - -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_int i, j, k; - opus_int lag, idx, sLTP_buf_idx, shift1, shift2; - opus_int32 rand_seed, harm_Gain_Q15, rand_Gain_Q15, inv_gain_Q30; - 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_int32 *sLPC_Q14_ptr; - VARDECL( opus_int16, exc_buf ); - opus_int16 A_Q12[ MAX_LPC_ORDER ]; - VARDECL( opus_int16, sLTP ); - 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 ); - - prevGain_Q10[0] = silk_RSHIFT( psPLC->prevGain_Q16[ 0 ], 6); - prevGain_Q10[1] = silk_RSHIFT( psPLC->prevGain_Q16[ 1 ], 6); - - if( psDec->first_frame_after_reset ) { - 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 ); - - if( silk_RSHIFT( energy1, shift2 ) < silk_RSHIFT( energy2, shift1 ) ) { - /* First sub-frame has lowest energy */ - rand_ptr = &psDec->exc_Q14[ silk_max_int( 0, ( psPLC->nb_subfr - 1 ) * psPLC->subfr_length - RAND_BUF_SIZE ) ]; - } else { - /* Second sub-frame has lowest energy */ - rand_ptr = &psDec->exc_Q14[ silk_max_int( 0, psPLC->nb_subfr * psPLC->subfr_length - RAND_BUF_SIZE ) ]; - } - - /* Set up Gain to random noise component */ - B_Q14 = psPLC->LTPCoef_Q14; - rand_scale_Q14 = psPLC->randScale_Q14; - - /* Set up attenuation gains */ - harm_Gain_Q15 = HARM_ATT_Q15[ silk_min_int( NB_ATT - 1, psDec->lossCnt ) ]; - if( psDec->prevSignalType == TYPE_VOICED ) { - rand_Gain_Q15 = PLC_RAND_ATTENUATE_V_Q15[ silk_min_int( NB_ATT - 1, psDec->lossCnt ) ]; - } else { - rand_Gain_Q15 = PLC_RAND_ATTENUATE_UV_Q15[ silk_min_int( NB_ATT - 1, psDec->lossCnt ) ]; - } - - /* LPC concealment. Apply BWE to previous LPC */ - silk_bwexpander( psPLC->prevLPC_Q12, psDec->LPC_order, SILK_FIX_CONST( BWE_COEF, 16 ) ); - - /* Preload LPC coeficients to array on stack. Gives small performance gain */ - silk_memcpy( A_Q12, psPLC->prevLPC_Q12, psDec->LPC_order * sizeof( opus_int16 ) ); - - /* First Lost frame */ - if( psDec->lossCnt == 0 ) { - rand_scale_Q14 = 1 << 14; - - /* Reduce random noise Gain for voiced frames */ - if( psDec->prevSignalType == TYPE_VOICED ) { - for( i = 0; i < LTP_ORDER; i++ ) { - rand_scale_Q14 -= B_Q14[ i ]; - } - rand_scale_Q14 = silk_max_16( 3277, rand_scale_Q14 ); /* 0.2 */ - rand_scale_Q14 = (opus_int16)silk_RSHIFT( silk_SMULBB( rand_scale_Q14, psPLC->prevLTP_scale_Q14 ), 14 ); - } else { - /* 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 ); - - 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 ); - down_scale_Q30 = silk_LSHIFT( down_scale_Q30, LOG2_INV_LPC_GAIN_HIGH_THRES ); - - rand_Gain_Q15 = silk_RSHIFT( silk_SMULWB( down_scale_Q30, rand_Gain_Q15 ), 14 ); - } - } - - rand_seed = psPLC->rand_seed; - lag = silk_RSHIFT_ROUND( psPLC->pitchL_Q8, 8 ); - sLTP_buf_idx = psDec->ltp_mem_length; - - /* 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 ); - /* 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 ); - for( i = idx + psDec->LPC_order; i < psDec->ltp_mem_length; i++ ) { - sLTP_Q14[ i ] = silk_SMULWB( inv_gain_Q30, sLTP[ i ] ); - } - - /***************************/ - /* LTP synthesis filtering */ - /***************************/ - for( k = 0; k < psDec->nb_subfr; k++ ) { - /* Set up pointer */ - pred_lag_ptr = &sLTP_Q14[ sLTP_buf_idx - lag + LTP_ORDER / 2 ]; - for( i = 0; i < psDec->subfr_length; i++ ) { - /* Unrolled loop */ - /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ - LTP_pred_Q12 = 2; - LTP_pred_Q12 = silk_SMLAWB( LTP_pred_Q12, pred_lag_ptr[ 0 ], B_Q14[ 0 ] ); - LTP_pred_Q12 = silk_SMLAWB( LTP_pred_Q12, pred_lag_ptr[ -1 ], B_Q14[ 1 ] ); - LTP_pred_Q12 = silk_SMLAWB( LTP_pred_Q12, pred_lag_ptr[ -2 ], B_Q14[ 2 ] ); - LTP_pred_Q12 = silk_SMLAWB( LTP_pred_Q12, pred_lag_ptr[ -3 ], B_Q14[ 3 ] ); - LTP_pred_Q12 = silk_SMLAWB( LTP_pred_Q12, pred_lag_ptr[ -4 ], B_Q14[ 4 ] ); - pred_lag_ptr++; - - /* Generate LPC excitation */ - rand_seed = silk_RAND( rand_seed ); - idx = silk_RSHIFT( rand_seed, 25 ) & RAND_BUF_MASK; - sLTP_Q14[ sLTP_buf_idx ] = silk_LSHIFT32( silk_SMLAWB( LTP_pred_Q12, rand_ptr[ idx ], rand_scale_Q14 ), 2 ); - sLTP_buf_idx++; - } - - /* Gradually reduce LTP gain */ - 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 ); - - /* Slowly increase pitch lag */ - psPLC->pitchL_Q8 = silk_SMLAWB( psPLC->pitchL_Q8, psPLC->pitchL_Q8, PITCH_DRIFT_FAC_Q16 ); - psPLC->pitchL_Q8 = silk_min_32( psPLC->pitchL_Q8, silk_LSHIFT( silk_SMULBB( MAX_PITCH_LAG_MS, psDec->fs_kHz ), 8 ) ); - lag = silk_RSHIFT_ROUND( psPLC->pitchL_Q8, 8 ); - } - - /***************************/ - /* LPC synthesis filtering */ - /***************************/ - sLPC_Q14_ptr = &sLTP_Q14[ psDec->ltp_mem_length - MAX_LPC_ORDER ]; - - /* 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 */ - for( i = 0; i < psDec->frame_length; i++ ) { - /* partly unrolled */ - /* 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_ptr[ MAX_LPC_ORDER + i - 1 ], A_Q12[ 0 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14_ptr[ MAX_LPC_ORDER + i - 2 ], A_Q12[ 1 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14_ptr[ MAX_LPC_ORDER + i - 3 ], A_Q12[ 2 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14_ptr[ MAX_LPC_ORDER + i - 4 ], A_Q12[ 3 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14_ptr[ MAX_LPC_ORDER + i - 5 ], A_Q12[ 4 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14_ptr[ MAX_LPC_ORDER + i - 6 ], A_Q12[ 5 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14_ptr[ MAX_LPC_ORDER + i - 7 ], A_Q12[ 6 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14_ptr[ MAX_LPC_ORDER + i - 8 ], A_Q12[ 7 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14_ptr[ MAX_LPC_ORDER + i - 9 ], A_Q12[ 8 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14_ptr[ MAX_LPC_ORDER + i - 10 ], A_Q12[ 9 ] ); - for( j = 10; j < psDec->LPC_order; j++ ) { - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14_ptr[ MAX_LPC_ORDER + i - j - 1 ], A_Q12[ j ] ); - } - - /* 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 ); - - /* 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 ) ) ); - } - - /* Save LPC state */ - silk_memcpy( psDec->sLPC_Q14_buf, &sLPC_Q14_ptr[ psDec->frame_length ], MAX_LPC_ORDER * sizeof( opus_int32 ) ); - - /**************************************/ - /* Update states */ - /**************************************/ - psPLC->rand_seed = rand_seed; - psPLC->randScale_Q14 = rand_scale_Q14; - for( i = 0; i < MAX_NB_SUBFR; i++ ) { - psDecCtrl->pitchL[ i ] = lag; - } - RESTORE_STACK; -} - -/* Glues concealed frames with new good received frames */ -void silk_PLC_glue_frames( - silk_decoder_state *psDec, /* I/O decoder state */ - opus_int16 frame[], /* I/O signal */ - opus_int length /* I length of signal */ -) -{ - opus_int i, energy_shift; - opus_int32 energy; - silk_PLC_struct *psPLC; - psPLC = &psDec->sPLC; - - if( psDec->lossCnt ) { - /* Calculate energy in concealed residual */ - silk_sum_sqr_shift( &psPLC->conc_energy, &psPLC->conc_energy_shift, frame, length ); - - psPLC->last_frame_lost = 1; - } else { - if( psDec->sPLC.last_frame_lost ) { - /* Calculate residual in decoded signal if last frame was lost */ - silk_sum_sqr_shift( &energy, &energy_shift, frame, length ); - - /* Normalize energies */ - if( energy_shift > psPLC->conc_energy_shift ) { - psPLC->conc_energy = silk_RSHIFT( psPLC->conc_energy, energy_shift - psPLC->conc_energy_shift ); - } else if( energy_shift < psPLC->conc_energy_shift ) { - energy = silk_RSHIFT( energy, psPLC->conc_energy_shift - energy_shift ); - } - - /* Fade in the energy difference */ - if( energy > psPLC->conc_energy ) { - opus_int32 frac_Q24, LZ; - opus_int32 gain_Q16, slope_Q16; - - LZ = silk_CLZ32( psPLC->conc_energy ); - LZ = LZ - 1; - psPLC->conc_energy = silk_LSHIFT( psPLC->conc_energy, LZ ); - energy = silk_RSHIFT( energy, silk_max_32( 24 - LZ, 0 ) ); - - frac_Q24 = silk_DIV32( psPLC->conc_energy, silk_max( energy, 1 ) ); - - gain_Q16 = silk_LSHIFT( silk_SQRT_APPROX( frac_Q24 ), 4 ); - slope_Q16 = silk_DIV32_16( ( (opus_int32)1 << 16 ) - gain_Q16, length ); - /* Make slope 4x steeper to avoid missing onsets after DTX */ - slope_Q16 = silk_LSHIFT( slope_Q16, 2 ); - - for( i = 0; i < length; i++ ) { - frame[ i ] = silk_SMULWB( gain_Q16, frame[ i ] ); - gain_Q16 += slope_Q16; - if( gain_Q16 > (opus_int32)1 << 16 ) { - break; - } - } - } - } - psPLC->last_frame_lost = 0; - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/PLC.h b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/PLC.h deleted file mode 100644 index f1e2eccc..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/PLC.h +++ /dev/null @@ -1,61 +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. -***********************************************************************/ - -#ifndef SILK_PLC_H -#define SILK_PLC_H - -#include "main.h" - -#define BWE_COEF 0.99 -#define V_PITCH_GAIN_START_MIN_Q14 11469 /* 0.7 in Q14 */ -#define V_PITCH_GAIN_START_MAX_Q14 15565 /* 0.95 in Q14 */ -#define MAX_PITCH_LAG_MS 18 -#define RAND_BUF_SIZE 128 -#define RAND_BUF_MASK ( RAND_BUF_SIZE - 1 ) -#define LOG2_INV_LPC_GAIN_HIGH_THRES 3 /* 2^3 = 8 dB LPC gain */ -#define LOG2_INV_LPC_GAIN_LOW_THRES 8 /* 2^8 = 24 dB LPC gain */ -#define PITCH_DRIFT_FAC_Q16 655 /* 0.01 in Q16 */ - -void silk_PLC_Reset( - silk_decoder_state *psDec /* I/O Decoder state */ -); - -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 */ -); - -void silk_PLC_glue_frames( - silk_decoder_state *psDec, /* I/O decoder state */ - opus_int16 frame[], /* I/O signal */ - opus_int length /* I length of signal */ -); - -#endif - diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/SigProc_FIX.h b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/SigProc_FIX.h deleted file mode 100644 index 1b580579..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/SigProc_FIX.h +++ /dev/null @@ -1,594 +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. -***********************************************************************/ - -#ifndef SILK_SIGPROC_FIX_H -#define SILK_SIGPROC_FIX_H - -#ifdef __cplusplus -extern "C" -{ -#endif - -/*#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() */ - -#include /* for memset(), memcpy(), memmove() */ -#include "typedef.h" -#include "resampler_structs.h" -#include "macros.h" - - -/********************************************************************/ -/* SIGNAL PROCESSING FUNCTIONS */ -/********************************************************************/ - -/*! - * Initialize/reset the resampler state for a given pair of input/output sampling rates -*/ -opus_int silk_resampler_init( - silk_resampler_state_struct *S, /* I/O Resampler state */ - opus_int32 Fs_Hz_in, /* I Input sampling rate (Hz) */ - opus_int32 Fs_Hz_out, /* I Output sampling rate (Hz) */ - opus_int forEnc /* I If 1: encoder; if 0: decoder */ -); - -/*! - * Resampler: convert from one sampling rate to another - */ -opus_int silk_resampler( - silk_resampler_state_struct *S, /* I/O Resampler state */ - opus_int16 out[], /* O Output signal */ - const opus_int16 in[], /* I Input signal */ - opus_int32 inLen /* I Number of input samples */ -); - -/*! -* Downsample 2x, mediocre quality -*/ -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_int32 inLen /* I Number of input samples */ -); - -/*! - * Downsample by a factor 2/3, low quality -*/ -void silk_resampler_down2_3( - opus_int32 *S, /* I/O State vector [ 6 ] */ - opus_int16 *out, /* O Output signal [ floor(2*inLen/3) ] */ - const opus_int16 *in, /* I Input signal [ inLen ] */ - opus_int32 inLen /* I Number of input samples */ -); - -/*! - * second order ARMA filter; - * slower than biquad() but uses more precise coefficients - * can handle (slowly) varying coefficients - */ -void silk_biquad_alt( - 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 */ -); - -/* Variable order MA prediction error filter. */ -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 */ -); - -/* Chirp (bandwidth expand) LP AR filter */ -void silk_bwexpander( - opus_int16 *ar, /* I/O AR filter to be expanded (without leading 1) */ - const opus_int d, /* I Length of ar */ - opus_int32 chirp_Q16 /* I Chirp factor (typically in the range 0 to 1) */ -); - -/* Chirp (bandwidth expand) LP AR filter */ -void silk_bwexpander_32( - opus_int32 *ar, /* I/O AR filter to be expanded (without leading 1) */ - const opus_int d, /* I Length of ar */ - opus_int32 chirp_Q16 /* I Chirp factor in Q16 */ -); - -/* 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 */ - 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] */ - opus_int32 *S, /* I/O State vector [2] */ - opus_int16 *outL, /* O Low band [N/2] */ - opus_int16 *outH, /* O High band [N/2] */ - const opus_int32 N /* I Number of input samples */ -); - -/********************************************************************/ -/* SCALAR FUNCTIONS */ -/********************************************************************/ - -/* Approximation of 128 * log2() (exact inverse of approx 2^() below) */ -/* Convert input to a log scale */ -opus_int32 silk_lin2log( - const opus_int32 inLin /* I input in linear scale */ -); - -/* Approximation of a sigmoid function */ -opus_int silk_sigm_Q15( - opus_int in_Q5 /* I */ -); - -/* Approximation of 2^() (exact inverse of approx log2() above) */ -/* Convert input to a linear scale */ -opus_int32 silk_log2lin( - const opus_int32 inLog_Q7 /* I input on log scale */ -); - -/* 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( - opus_int32 *energy, /* O Energy of x, after shifting to the right */ - opus_int *shift, /* O Number of bits right shift applied to energy */ - const opus_int16 *x, /* I Input vector */ - opus_int len /* I Length of input vector */ -); - -/* Calculates the reflection coefficients from the correlation sequence */ -/* Faster than schur64(), but much less accurate. */ -/* uses SMLAWB(), requiring armv5E and higher. */ -opus_int32 silk_schur( /* O Returns residual energy */ - opus_int16 *rc_Q15, /* O reflection coefficients [order] Q15 */ - const opus_int32 *c, /* I correlations [order+1] */ - const opus_int32 order /* I prediction order */ -); - -/* Calculates the reflection coefficients from the correlation sequence */ -/* Slower than schur(), but more accurate. */ -/* Uses SMULL(), available on armv4 */ -opus_int32 silk_schur64( /* O returns residual energy */ - opus_int32 rc_Q16[], /* O Reflection coefficients [order] Q16 */ - const opus_int32 c[], /* I Correlations [order+1] */ - opus_int32 order /* I Prediction order */ -); - -/* Step up function, converts reflection coefficients to prediction coefficients */ -void silk_k2a( - opus_int32 *A_Q24, /* O Prediction coefficients [order] Q24 */ - const opus_int16 *rc_Q15, /* I Reflection coefficients [order] Q15 */ - const opus_int32 order /* I Prediction order */ -); - -/* Step up function, converts reflection coefficients to prediction coefficients */ -void silk_k2a_Q16( - opus_int32 *A_Q24, /* O Prediction coefficients [order] Q24 */ - const opus_int32 *rc_Q16, /* I Reflection coefficients [order] Q16 */ - const opus_int32 order /* I Prediction order */ -); - -/* Apply sine window to signal vector. */ -/* Window types: */ -/* 1 -> sine window from 0 to pi/2 */ -/* 2 -> sine window from pi/2 to pi */ -/* every other sample of window is linearly interpolated, for speed */ -void silk_apply_sine_window( - opus_int16 px_win[], /* O Pointer to windowed signal */ - const opus_int16 px[], /* I Pointer to input signal */ - const opus_int win_type, /* I Selects a window type */ - const opus_int length /* I Window length, multiple of 4 */ -); - -/* Compute autocorrelation */ -void silk_autocorr( - opus_int32 *results, /* O Result (length correlationCount) */ - 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 */ - int arch /* I Run-time architecture */ -); - -void silk_decode_pitch( - opus_int16 lagIndex, /* I */ - opus_int8 contourIndex, /* O */ - opus_int pitch_lags[], /* O 4 pitch values */ - const opus_int Fs_kHz, /* I sampling frequency (kHz) */ - const opus_int nb_subfr /* I number of sub frames */ -); - -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 */ - 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_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 */ - int arch /* I Run-time architecture */ -); - -/* Compute Normalized Line Spectral Frequencies (NLSFs) from whitening filter coefficients */ -/* If not all roots are found, the a_Q16 coefficients are bandwidth expanded until convergence. */ -void silk_A2NLSF( - opus_int16 *NLSF, /* O Normalized Line Spectral Frequencies in Q15 (0..2^15-1) [d] */ - opus_int32 *a_Q16, /* I/O Monic whitening filter coefficients in Q16 [d] */ - const opus_int d /* I Filter order (must be even) */ -); - -/* compute whitening filter coefficients from normalized line spectral frequencies */ -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) */ -); - -void silk_insertion_sort_increasing( - opus_int32 *a, /* I/O Unsorted / Sorted vector */ - opus_int *idx, /* O Index vector for the sorted elements */ - const opus_int L, /* I Vector length */ - const opus_int K /* I Number of correctly sorted positions */ -); - -void silk_insertion_sort_decreasing_int16( - opus_int16 *a, /* I/O Unsorted / Sorted vector */ - opus_int *idx, /* O Index vector for the sorted elements */ - const opus_int L, /* I Vector length */ - const opus_int K /* I Number of correctly sorted positions */ -); - -void silk_insertion_sort_increasing_all_values_int16( - opus_int16 *a, /* I/O Unsorted / Sorted vector */ - const opus_int L /* I Vector length */ -); - -/* NLSF stabilizer, for a single input data vector */ -void silk_NLSF_stabilize( - opus_int16 *NLSF_Q15, /* I/O Unstable/stabilized normalized LSF vector in Q15 [L] */ - const opus_int16 *NDeltaMin_Q15, /* I Min distance vector, NDeltaMin_Q15[L] must be >= 1 [L+1] */ - const opus_int L /* I Number of NLSF parameters in the input vector */ -); - -/* Laroia low complexity NLSF weights */ -void silk_NLSF_VQ_weights_laroia( - opus_int16 *pNLSFW_Q_OUT, /* O Pointer to input vector weights [D] */ - const opus_int16 *pNLSF_Q15, /* I Pointer to input vector [D] */ - const opus_int D /* I Input vector dimension (even) */ -); - -/* Compute reflection coefficients from input signal */ -void silk_burg_modified( - 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 */ -); - -/* Copy and multiply a vector by a constant */ -void silk_scale_copy_vector16( - opus_int16 *data_out, - const opus_int16 *data_in, - opus_int32 gain_Q16, /* I Gain in Q16 */ - const opus_int dataSize /* I Length */ -); - -/* Some for the LTP related function requires Q26 to work.*/ -void silk_scale_vector32_Q26_lshift_18( - opus_int32 *data1, /* I/O Q0/Q18 */ - opus_int32 gain_Q26, /* I Q26 */ - opus_int dataSize /* I length */ -); - -/********************************************************************/ -/* INLINE ARM MATH */ -/********************************************************************/ - -/* 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 */ -); - -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 */ - const opus_int scale, /* I number of bits to shift */ - const opus_int len /* I vector lengths */ -); - -opus_int64 silk_inner_prod16_aligned_64( - const opus_int16 *inVec1, /* I input vector 1 */ - const opus_int16 *inVec2, /* I input vector 2 */ - const opus_int len /* I vector lengths */ -); - -/********************************************************************/ -/* MACROS */ -/********************************************************************/ - -/* 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 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; - opus_uint32 m = (opus_uint32) -rot; - if( rot == 0 ) { - return a32; - } else if( rot < 0 ) { - return (opus_int32) ((x << m) | (x >> (32 - m))); - } else { - return (opus_int32) ((x << (32 - r)) | (x >> r)); - } -} - -/* Allocate opus_int16 aligned to 4-byte memory address */ -#if EMBEDDED_ARM -#define silk_DWORD_ALIGN __attribute__((aligned(4))) -#else -#define silk_DWORD_ALIGN -#endif - -/* Useful Macros that can be adjusted to other platforms */ -#define silk_memcpy(dest, src, size) memcpy((dest), (src), (size)) -#define silk_memset(dest, src, size) memset((dest), (src), (size)) -#define silk_memmove(dest, src, size) memmove((dest), (src), (size)) - -/* Fixed point macros */ - -/* (a32 * b32) output have to be 32bit int */ -#define silk_MUL(a32, b32) ((a32) * (b32)) - -/* (a32 * b32) output have to be 32bit uint */ -#define silk_MUL_uint(a32, b32) silk_MUL(a32, b32) - -/* a32 + (b32 * c32) output have to be 32bit int */ -#define silk_MLA(a32, b32, c32) silk_ADD32((a32),((b32) * (c32))) - -/* a32 + (b32 * c32) output have to be 32bit uint */ -#define silk_MLA_uint(a32, b32, c32) silk_MLA(a32, b32, c32) - -/* ((a32 >> 16) * (b32 >> 16)) output have to be 32bit int */ -#define silk_SMULTT(a32, b32) (((a32) >> 16) * ((b32) >> 16)) - -/* a32 + ((a32 >> 16) * (b32 >> 16)) output have to be 32bit int */ -#define silk_SMLATT(a32, b32, c32) silk_ADD32((a32),((b32) >> 16) * ((c32) >> 16)) - -#define silk_SMLALBB(a64, b16, c16) silk_ADD64((a64),(opus_int64)((opus_int32)(b16) * (opus_int32)(c16))) - -/* (a32 * b32) */ -#define silk_SMULL(a32, b32) ((opus_int64)(a32) * /*(opus_int64)*/(b32)) - -/* Adds two signed 32-bit values in a way that can overflow, while not relying on undefined behaviour - (just standard two's complement implementation-specific behaviour) */ -#define silk_ADD32_ovflw(a, b) ((opus_int32)((opus_uint32)(a) + (opus_uint32)(b))) -/* Subtractss two signed 32-bit values in a way that can overflow, while not relying on undefined behaviour - (just standard two's complement implementation-specific behaviour) */ -#define silk_SUB32_ovflw(a, b) ((opus_int32)((opus_uint32)(a) - (opus_uint32)(b))) - -/* Multiply-accumulate macros that allow overflow in the addition (ie, no asserts in debug mode) */ -#define silk_MLA_ovflw(a32, b32, c32) silk_ADD32_ovflw((a32), (opus_uint32)(b32) * (opus_uint32)(c32)) -#define silk_SMLABB_ovflw(a32, b32, c32) (silk_ADD32_ovflw((a32) , ((opus_int32)((opus_int16)(b32))) * (opus_int32)((opus_int16)(c32)))) - -#define silk_DIV32_16(a32, b16) ((opus_int32)((a32) / (b16))) -#define silk_DIV32(a32, b32) ((opus_int32)((a32) / (b32))) - -/* These macros enables checking for overflow in silk_API_Debug.h*/ -#define silk_ADD16(a, b) ((a) + (b)) -#define silk_ADD32(a, b) ((a) + (b)) -#define silk_ADD64(a, b) ((a) + (b)) - -#define silk_SUB16(a, b) ((a) - (b)) -#define silk_SUB32(a, b) ((a) - (b)) -#define silk_SUB64(a, b) ((a) - (b)) - -#define silk_SAT8(a) ((a) > silk_int8_MAX ? silk_int8_MAX : \ - ((a) < silk_int8_MIN ? silk_int8_MIN : (a))) -#define silk_SAT16(a) ((a) > silk_int16_MAX ? silk_int16_MAX : \ - ((a) < silk_int16_MIN ? silk_int16_MIN : (a))) -#define silk_SAT32(a) ((a) > silk_int32_MAX ? silk_int32_MAX : \ - ((a) < silk_int32_MIN ? silk_int32_MIN : (a))) - -#define silk_CHECK_FIT8(a) (a) -#define silk_CHECK_FIT16(a) (a) -#define silk_CHECK_FIT32(a) (a) - -#define silk_ADD_SAT16(a, b) (opus_int16)silk_SAT16( silk_ADD32( (opus_int32)(a), (b) ) ) -#define silk_ADD_SAT64(a, b) ((((a) + (b)) & 0x8000000000000000LL) == 0 ? \ - ((((a) & (b)) & 0x8000000000000000LL) != 0 ? silk_int64_MIN : (a)+(b)) : \ - ((((a) | (b)) & 0x8000000000000000LL) == 0 ? silk_int64_MAX : (a)+(b)) ) - -#define silk_SUB_SAT16(a, b) (opus_int16)silk_SAT16( silk_SUB32( (opus_int32)(a), (b) ) ) -#define silk_SUB_SAT64(a, b) ((((a)-(b)) & 0x8000000000000000LL) == 0 ? \ - (( (a) & ((b)^0x8000000000000000LL) & 0x8000000000000000LL) ? silk_int64_MIN : (a)-(b)) : \ - ((((a)^0x8000000000000000LL) & (b) & 0x8000000000000000LL) ? silk_int64_MAX : (a)-(b)) ) - -/* Saturation for positive input values */ -#define silk_POS_SAT32(a) ((a) > silk_int32_MAX ? silk_int32_MAX : (a)) - -/* 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_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 */ -#define silk_LSHIFT32(a, shift) ((opus_int32)((opus_uint32)(a)<<(shift))) /* shift >= 0, shift < 32 */ -#define silk_LSHIFT64(a, shift) ((opus_int64)((opus_uint64)(a)<<(shift))) /* shift >= 0, shift < 64 */ -#define silk_LSHIFT(a, shift) silk_LSHIFT32(a, shift) /* shift >= 0, shift < 32 */ - -#define silk_RSHIFT8(a, shift) ((a)>>(shift)) /* shift >= 0, shift < 8 */ -#define silk_RSHIFT16(a, shift) ((a)>>(shift)) /* shift >= 0, shift < 16 */ -#define silk_RSHIFT32(a, shift) ((a)>>(shift)) /* shift >= 0, shift < 32 */ -#define silk_RSHIFT64(a, shift) ((a)>>(shift)) /* shift >= 0, shift < 64 */ -#define silk_RSHIFT(a, shift) silk_RSHIFT32(a, shift) /* shift >= 0, shift < 32 */ - -/* saturates before shifting */ -#define silk_LSHIFT_SAT32(a, shift) (silk_LSHIFT32( silk_LIMIT( (a), silk_RSHIFT32( silk_int32_MIN, (shift) ), \ - silk_RSHIFT32( silk_int32_MAX, (shift) ) ), (shift) )) - -#define silk_LSHIFT_ovflw(a, shift) ((opus_int32)((opus_uint32)(a) << (shift))) /* shift >= 0, allowed to overflow */ -#define silk_LSHIFT_uint(a, shift) ((a) << (shift)) /* shift >= 0 */ -#define silk_RSHIFT_uint(a, shift) ((a) >> (shift)) /* shift >= 0 */ - -#define silk_ADD_LSHIFT(a, b, shift) ((a) + silk_LSHIFT((b), (shift))) /* shift >= 0 */ -#define silk_ADD_LSHIFT32(a, b, shift) silk_ADD32((a), silk_LSHIFT32((b), (shift))) /* shift >= 0 */ -#define silk_ADD_LSHIFT_uint(a, b, shift) ((a) + silk_LSHIFT_uint((b), (shift))) /* shift >= 0 */ -#define silk_ADD_RSHIFT(a, b, shift) ((a) + silk_RSHIFT((b), (shift))) /* shift >= 0 */ -#define silk_ADD_RSHIFT32(a, b, shift) silk_ADD32((a), silk_RSHIFT32((b), (shift))) /* shift >= 0 */ -#define silk_ADD_RSHIFT_uint(a, b, shift) ((a) + silk_RSHIFT_uint((b), (shift))) /* shift >= 0 */ -#define silk_SUB_LSHIFT32(a, b, shift) silk_SUB32((a), silk_LSHIFT32((b), (shift))) /* shift >= 0 */ -#define silk_SUB_RSHIFT32(a, b, shift) silk_SUB32((a), silk_RSHIFT32((b), (shift))) /* shift >= 0 */ - -/* Requires that shift > 0 */ -#define silk_RSHIFT_ROUND(a, shift) ((shift) == 1 ? ((a) >> 1) + ((a) & 1) : (((a) >> ((shift) - 1)) + 1) >> 1) -#define silk_RSHIFT_ROUND64(a, shift) ((shift) == 1 ? ((a) >> 1) + ((a) & 1) : (((a) >> ((shift) - 1)) + 1) >> 1) - -/* Number of rightshift required to fit the multiplication */ -#define silk_NSHIFT_MUL_32_32(a, b) ( -(31- (32-silk_CLZ32(silk_abs(a)) + (32-silk_CLZ32(silk_abs(b))))) ) -#define silk_NSHIFT_MUL_16_16(a, b) ( -(15- (16-silk_CLZ16(silk_abs(a)) + (16-silk_CLZ16(silk_abs(b))))) ) - - -#define silk_min(a, b) (((a) < (b)) ? (a) : (b)) -#define silk_max(a, b) (((a) > (b)) ? (a) : (b)) - -/* Macro to convert floating-point constants to fixed-point */ -#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 OPUS_INLINE opus_int silk_min_int(opus_int a, opus_int b) -{ - return (((a) < (b)) ? (a) : (b)); -} -static OPUS_INLINE opus_int16 silk_min_16(opus_int16 a, opus_int16 b) -{ - return (((a) < (b)) ? (a) : (b)); -} -static OPUS_INLINE opus_int32 silk_min_32(opus_int32 a, opus_int32 b) -{ - return (((a) < (b)) ? (a) : (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 OPUS_INLINE opus_int silk_max_int(opus_int a, opus_int b) -{ - return (((a) > (b)) ? (a) : (b)); -} -static OPUS_INLINE opus_int16 silk_max_16(opus_int16 a, opus_int16 b) -{ - return (((a) > (b)) ? (a) : (b)); -} -static OPUS_INLINE opus_int32 silk_max_32(opus_int32 a, opus_int32 b) -{ - return (((a) > (b)) ? (a) : (b)); -} -static OPUS_INLINE opus_int64 silk_max_64(opus_int64 a, opus_int64 b) -{ - return (((a) > (b)) ? (a) : (b)); -} - -#define silk_LIMIT( a, limit1, limit2) ((limit1) > (limit2) ? ((a) > (limit1) ? (limit1) : ((a) < (limit2) ? (limit2) : (a))) \ - : ((a) > (limit2) ? (limit2) : ((a) < (limit1) ? (limit1) : (a)))) - -#define silk_LIMIT_int silk_LIMIT -#define silk_LIMIT_16 silk_LIMIT -#define silk_LIMIT_32 silk_LIMIT - -#define silk_abs(a) (((a) > 0) ? (a) : -(a)) /* Be careful, silk_abs returns wrong when input equals to silk_intXX_MIN */ -#define silk_abs_int(a) (((a) ^ ((a) >> (8 * sizeof(a) - 1))) - ((a) >> (8 * sizeof(a) - 1))) -#define silk_abs_int32(a) (((a) ^ ((a) >> 31)) - ((a) >> 31)) -#define silk_abs_int64(a) (((a) > 0) ? (a) : -(a)) - -#define silk_sign(a) ((a) > 0 ? 1 : ( (a) < 0 ? -1 : 0 )) - -/* PSEUDO-RANDOM GENERATOR */ -/* 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)) - -/* Add some multiplication functions that can be easily mapped to ARM. */ - -/* silk_SMMUL: Signed top word multiply. - ARMv6 2 instruction cycles. - ARMv3M+ 3 instruction cycles. use SMULL and ignore LSB registers.(except xM)*/ -/*#define silk_SMMUL(a32, b32) (opus_int32)silk_RSHIFT(silk_SMLAL(silk_SMULWB((a32), (b32)), (a32), silk_RSHIFT_ROUND((b32), 16)), 16)*/ -/* the following seems faster on x86 */ -#define silk_SMMUL(a32, b32) (opus_int32)silk_RSHIFT64(silk_SMULL((a32), (b32)), 32) - -#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 - -#ifdef __cplusplus -} -#endif - -#endif /* SILK_SIGPROC_FIX_H */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/VAD.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/VAD.c deleted file mode 100644 index a8090981..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/VAD.c +++ /dev/null @@ -1,357 +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 "stack_alloc.h" - -/* Silk VAD noise level estimation */ -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 */ -); - -/**********************************/ -/* Initialization of the Silk VAD */ -/**********************************/ -opus_int silk_VAD_Init( /* O Return value, 0 if success */ - silk_VAD_state *psSilk_VAD /* I/O Pointer to Silk VAD state */ -) -{ - opus_int b, ret = 0; - - /* reset state memory */ - silk_memset( psSilk_VAD, 0, sizeof( silk_VAD_state ) ); - - /* init noise levels */ - /* Initialize array with approx pink noise levels (psd proportional to inverse of frequency) */ - for( b = 0; b < VAD_N_BANDS; b++ ) { - psSilk_VAD->NoiseLevelBias[ b ] = silk_max_32( silk_DIV32_16( VAD_NOISE_LEVELS_BIAS, b + 1 ), 1 ); - } - - /* Initialize state */ - for( b = 0; b < VAD_N_BANDS; b++ ) { - psSilk_VAD->NL[ b ] = silk_MUL( 100, psSilk_VAD->NoiseLevelBias[ b ] ); - psSilk_VAD->inv_NL[ b ] = silk_DIV32( silk_int32_MAX, psSilk_VAD->NL[ b ] ); - } - psSilk_VAD->counter = 15; - - /* init smoothed energy-to-noise ratio*/ - for( b = 0; b < VAD_N_BANDS; b++ ) { - psSilk_VAD->NrgRatioSmth_Q8[ b ] = 100 * 256; /* 100 * 256 --> 20 dB SNR */ - } - - return( ret ); -} - -/* 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( /* 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 ); - 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 ) ); - - /***********************/ - /* 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++ ) { - sumSquared = 0; - 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[ 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 ); -} - -/**************************/ -/* Noise level estimation */ -/**************************/ -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 */ -) -{ - opus_int k; - opus_int32 nl, nrg, inv_nrg; - opus_int coef, min_coef; - - /* 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 ); - } else { - min_coef = 0; - } - - for( k = 0; k < VAD_N_BANDS; k++ ) { - /* Get old noise level estimate for current band */ - nl = psSilk_VAD->NL[ k ]; - silk_assert( nl >= 0 ); - - /* Add bias */ - nrg = silk_ADD_POS_SAT32( pX[ k ], psSilk_VAD->NoiseLevelBias[ k ] ); - silk_assert( nrg > 0 ); - - /* Invert energies */ - inv_nrg = silk_DIV32( silk_int32_MAX, nrg ); - silk_assert( inv_nrg >= 0 ); - - /* Less update when subband energy is high */ - if( nrg > silk_LSHIFT( nl, 3 ) ) { - coef = VAD_NOISE_LEVEL_SMOOTH_COEF_Q16 >> 3; - } else if( nrg < nl ) { - coef = VAD_NOISE_LEVEL_SMOOTH_COEF_Q16; - } else { - coef = silk_SMULWB( silk_SMULWW( inv_nrg, nl ), VAD_NOISE_LEVEL_SMOOTH_COEF_Q16 << 1 ); - } - - /* Initially faster smoothing */ - coef = silk_max_int( coef, min_coef ); - - /* Smooth inverse energies */ - psSilk_VAD->inv_NL[ k ] = silk_SMLAWB( psSilk_VAD->inv_NL[ k ], inv_nrg - psSilk_VAD->inv_NL[ k ], coef ); - silk_assert( psSilk_VAD->inv_NL[ k ] >= 0 ); - - /* Compute noise level by inverting again */ - nl = silk_DIV32( silk_int32_MAX, psSilk_VAD->inv_NL[ k ] ); - silk_assert( nl >= 0 ); - - /* Limit noise levels (guarantee 7 bits of head room) */ - nl = silk_min( nl, 0x00FFFFFF ); - - /* Store as part of state */ - psSilk_VAD->NL[ k ] = nl; - } - - /* Increment frame counter */ - psSilk_VAD->counter++; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/VQ_WMat_EC.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/VQ_WMat_EC.c deleted file mode 100644 index 13d5d34e..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/VQ_WMat_EC.c +++ /dev/null @@ -1,120 +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 */ - 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; - - /* 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 ); - 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 ] ); - - /* 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 */ - 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; - *gain_Q7 = gain_tmp_Q7; - } - - /* Go to next cbk vector */ - cb_row_Q7 += LTP_ORDER; - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/ana_filt_bank_1.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/ana_filt_bank_1.c deleted file mode 100644 index 24cfb03f..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/ana_filt_bank_1.c +++ /dev/null @@ -1,74 +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 "SigProc_FIX.h" - -/* Coefficients for 2-band filter bank based on first-order allpass filters */ -static opus_int16 A_fb1_20 = 5394 << 1; -static opus_int16 A_fb1_21 = -24290; /* (opus_int16)(20623 << 1) */ - -/* Split signal into two decimated bands using first-order allpass filters */ -void silk_ana_filt_bank_1( - const opus_int16 *in, /* I Input signal [N] */ - opus_int32 *S, /* I/O State vector [2] */ - opus_int16 *outL, /* O Low band [N/2] */ - opus_int16 *outH, /* O High band [N/2] */ - const opus_int32 N /* I Number of input samples */ -) -{ - opus_int k, N2 = silk_RSHIFT( N, 1 ); - opus_int32 in32, X, Y, out_1, out_2; - - /* Internal variables and state are in Q10 format */ - for( k = 0; k < N2; k++ ) { - /* Convert to Q10 */ - in32 = silk_LSHIFT( (opus_int32)in[ 2 * k ], 10 ); - - /* All-pass section for even input sample */ - Y = silk_SUB32( in32, S[ 0 ] ); - X = silk_SMLAWB( Y, Y, A_fb1_21 ); - out_1 = silk_ADD32( S[ 0 ], X ); - S[ 0 ] = silk_ADD32( in32, X ); - - /* Convert to Q10 */ - in32 = silk_LSHIFT( (opus_int32)in[ 2 * k + 1 ], 10 ); - - /* All-pass section for odd input sample, and add to output of previous section */ - Y = silk_SUB32( in32, S[ 1 ] ); - X = silk_SMULWB( Y, A_fb1_20 ); - out_2 = silk_ADD32( S[ 1 ], X ); - S[ 1 ] = silk_ADD32( in32, X ); - - /* Add/subtract, convert back to int16 and store to output */ - outL[ k ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_ADD32( out_2, out_1 ), 11 ) ); - outH[ k ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SUB32( out_2, out_1 ), 11 ) ); - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/arm/SigProc_FIX_armv4.h b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/arm/SigProc_FIX_armv4.h deleted file mode 100644 index ff62b1e5..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/arm/SigProc_FIX_armv4.h +++ /dev/null @@ -1,47 +0,0 @@ -/*********************************************************************** -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: -- 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_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)) - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/arm/SigProc_FIX_armv5e.h b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/arm/SigProc_FIX_armv5e.h deleted file mode 100644 index 617a09ca..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/arm/SigProc_FIX_armv5e.h +++ /dev/null @@ -1,61 +0,0 @@ -/*********************************************************************** -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_SIGPROC_FIX_ARMv5E_H -#define SILK_SIGPROC_FIX_ARMv5E_H - -#undef silk_SMULTT -static OPUS_INLINE opus_int32 silk_SMULTT_armv5e(opus_int32 a, opus_int32 b) -{ - 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)) - -#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/sources/LabSound/third_party/libnyquist/third_party/opus/silk/arm/macros_armv4.h b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/arm/macros_armv4.h deleted file mode 100644 index 3f30e972..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/arm/macros_armv4.h +++ /dev/null @@ -1,103 +0,0 @@ -/*********************************************************************** -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 - -/* (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"(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 (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+(rd_hi<<16)+(rd_lo>>16); -} -#define silk_SMLAWW(a, b, c) (silk_SMLAWW_armv4(a, b, c)) - -#endif /* SILK_MACROS_ARMv4_H */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/arm/macros_armv5e.h b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/arm/macros_armv5e.h deleted file mode 100644 index aad4117e..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/arm/macros_armv5e.h +++ /dev/null @@ -1,213 +0,0 @@ -/*********************************************************************** -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 - -/* (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"(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)) - -#endif /* SILK_MACROS_ARMv5E_H */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/biquad_alt.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/biquad_alt.c deleted file mode 100644 index d55f5ee9..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/biquad_alt.c +++ /dev/null @@ -1,78 +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. -***********************************************************************/ - -/* * - * silk_biquad_alt.c * - * * - * Second order ARMA filter * - * Can handle slowly varying filter coefficients * - * */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "SigProc_FIX.h" - -/* Second order ARMA filter, alternative implementation */ -void silk_biquad_alt( - 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 */ -) -{ - /* DIRECT FORM II TRANSPOSED (uses 2 element state vector) */ - opus_int k; - opus_int32 inval, A0_U_Q28, A0_L_Q28, A1_U_Q28, A1_L_Q28, out32_Q14; - - /* 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 ]: Q12 */ - inval = in[ k * stride ]; - 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 ); - S[ 0 ] = silk_SMLAWB( S[ 0 ], out32_Q14, A0_U_Q28 ); - S[ 0 ] = silk_SMLAWB( S[ 0 ], B_Q28[ 1 ], inval); - - S[ 1 ] = silk_RSHIFT_ROUND( silk_SMULWB( out32_Q14, A1_L_Q28 ), 14 ); - S[ 1 ] = silk_SMLAWB( S[ 1 ], out32_Q14, A1_U_Q28 ); - 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 ) ); - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/bwexpander.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/bwexpander.c deleted file mode 100644 index 2eb44566..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/bwexpander.c +++ /dev/null @@ -1,51 +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 "SigProc_FIX.h" - -/* Chirp (bandwidth expand) LP AR filter */ -void silk_bwexpander( - opus_int16 *ar, /* I/O AR filter to be expanded (without leading 1) */ - const opus_int d, /* I Length of ar */ - opus_int32 chirp_Q16 /* I Chirp factor (typically in the range 0 to 1) */ -) -{ - opus_int i; - opus_int32 chirp_minus_one_Q16 = chirp_Q16 - 65536; - - /* NB: Dont use silk_SMULWB, instead of silk_RSHIFT_ROUND( silk_MUL(), 16 ), below. */ - /* 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 ); - } - ar[ d - 1 ] = (opus_int16)silk_RSHIFT_ROUND( silk_MUL( chirp_Q16, ar[ d - 1 ] ), 16 ); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/bwexpander_32.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/bwexpander_32.c deleted file mode 100644 index d0010f73..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/bwexpander_32.c +++ /dev/null @@ -1,50 +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 "SigProc_FIX.h" - -/* Chirp (bandwidth expand) LP AR filter */ -void silk_bwexpander_32( - opus_int32 *ar, /* I/O AR filter to be expanded (without leading 1) */ - const opus_int d, /* I Length of ar */ - opus_int32 chirp_Q16 /* I Chirp factor in Q16 */ -) -{ - opus_int i; - opus_int32 chirp_minus_one_Q16 = chirp_Q16 - 65536; - - for( i = 0; i < d - 1; i++ ) { - ar[ i ] = silk_SMULWW( chirp_Q16, ar[ i ] ); - chirp_Q16 += silk_RSHIFT_ROUND( silk_MUL( chirp_Q16, chirp_minus_one_Q16 ), 16 ); - } - ar[ d - 1 ] = silk_SMULWW( chirp_Q16, ar[ d - 1 ] ); -} - diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/check_control_input.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/check_control_input.c deleted file mode 100644 index b5de9ce4..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/check_control_input.c +++ /dev/null @@ -1,106 +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 "control.h" -#include "errors.h" - -/* Check encoder control struct */ -opus_int check_control_input( - silk_EncControlStruct *encControl /* I Control structure */ -) -{ - silk_assert( encControl != NULL ); - - if( ( ( encControl->API_sampleRate != 8000 ) && - ( encControl->API_sampleRate != 12000 ) && - ( encControl->API_sampleRate != 16000 ) && - ( encControl->API_sampleRate != 24000 ) && - ( encControl->API_sampleRate != 32000 ) && - ( encControl->API_sampleRate != 44100 ) && - ( encControl->API_sampleRate != 48000 ) ) || - ( ( encControl->desiredInternalSampleRate != 8000 ) && - ( encControl->desiredInternalSampleRate != 12000 ) && - ( encControl->desiredInternalSampleRate != 16000 ) ) || - ( ( encControl->maxInternalSampleRate != 8000 ) && - ( encControl->maxInternalSampleRate != 12000 ) && - ( encControl->maxInternalSampleRate != 16000 ) ) || - ( ( encControl->minInternalSampleRate != 8000 ) && - ( encControl->minInternalSampleRate != 12000 ) && - ( encControl->minInternalSampleRate != 16000 ) ) || - ( encControl->minInternalSampleRate > encControl->desiredInternalSampleRate ) || - ( encControl->maxInternalSampleRate < encControl->desiredInternalSampleRate ) || - ( encControl->minInternalSampleRate > encControl->maxInternalSampleRate ) ) { - silk_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 ); - return SILK_ENC_PACKET_SIZE_NOT_SUPPORTED; - } - if( encControl->packetLossPercentage < 0 || encControl->packetLossPercentage > 100 ) { - silk_assert( 0 ); - return SILK_ENC_INVALID_LOSS_RATE; - } - if( encControl->useDTX < 0 || encControl->useDTX > 1 ) { - silk_assert( 0 ); - return SILK_ENC_INVALID_DTX_SETTING; - } - if( encControl->useCBR < 0 || encControl->useCBR > 1 ) { - silk_assert( 0 ); - return SILK_ENC_INVALID_CBR_SETTING; - } - if( encControl->useInBandFEC < 0 || encControl->useInBandFEC > 1 ) { - silk_assert( 0 ); - return SILK_ENC_INVALID_INBAND_FEC_SETTING; - } - if( encControl->nChannelsAPI < 1 || encControl->nChannelsAPI > ENCODER_NUM_CHANNELS ) { - silk_assert( 0 ); - return SILK_ENC_INVALID_NUMBER_OF_CHANNELS_ERROR; - } - if( encControl->nChannelsInternal < 1 || encControl->nChannelsInternal > ENCODER_NUM_CHANNELS ) { - silk_assert( 0 ); - return SILK_ENC_INVALID_NUMBER_OF_CHANNELS_ERROR; - } - if( encControl->nChannelsInternal > encControl->nChannelsAPI ) { - silk_assert( 0 ); - return SILK_ENC_INVALID_NUMBER_OF_CHANNELS_ERROR; - } - if( encControl->complexity < 0 || encControl->complexity > 10 ) { - silk_assert( 0 ); - return SILK_ENC_INVALID_COMPLEXITY_SETTING; - } - - return SILK_NO_ERROR; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/code_signs.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/code_signs.c deleted file mode 100644 index 0419ea26..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/code_signs.c +++ /dev/null @@ -1,115 +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" - -/*#define silk_enc_map(a) ((a) > 0 ? 1 : 0)*/ -/*#define silk_dec_map(a) ((a) > 0 ? 1 : -1)*/ -/* shifting avoids if-statement */ -#define silk_enc_map(a) ( silk_RSHIFT( (a), 15 ) + 1 ) -#define silk_dec_map(a) ( silk_LSHIFT( (a), 1 ) - 1 ) - -/* 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 */ -) -{ - opus_int i, j, p; - opus_uint8 icdf[ 2 ]; - const opus_int8 *q_ptr; - const opus_uint8 *icdf_ptr; - - icdf[ 1 ] = 0; - q_ptr = pulses; - i = silk_SMULBB( 7, silk_ADD_LSHIFT( quantOffsetType, signalType, 1 ) ); - icdf_ptr = &silk_sign_iCDF[ i ]; - length = silk_RSHIFT( length + SHELL_CODEC_FRAME_LENGTH/2, LOG2_SHELL_CODEC_FRAME_LENGTH ); - for( i = 0; i < length; i++ ) { - p = sum_pulses[ i ]; - if( p > 0 ) { - icdf[ 0 ] = icdf_ptr[ silk_min( p & 0x1F, 6 ) ]; - for( j = 0; j < SHELL_CODEC_FRAME_LENGTH; j++ ) { - if( q_ptr[ j ] != 0 ) { - ec_enc_icdf( psRangeEnc, silk_enc_map( q_ptr[ j ]), icdf, 8 ); - } - } - } - q_ptr += SHELL_CODEC_FRAME_LENGTH; - } -} - -/* 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 */ -) -{ - opus_int i, j, p; - opus_uint8 icdf[ 2 ]; - opus_int *q_ptr; - const opus_uint8 *icdf_ptr; - - icdf[ 1 ] = 0; - q_ptr = pulses; - i = silk_SMULBB( 7, silk_ADD_LSHIFT( quantOffsetType, signalType, 1 ) ); - icdf_ptr = &silk_sign_iCDF[ i ]; - length = silk_RSHIFT( length + SHELL_CODEC_FRAME_LENGTH/2, LOG2_SHELL_CODEC_FRAME_LENGTH ); - for( i = 0; i < length; i++ ) { - p = sum_pulses[ i ]; - if( p > 0 ) { - icdf[ 0 ] = icdf_ptr[ silk_min( p & 0x1F, 6 ) ]; - for( j = 0; j < SHELL_CODEC_FRAME_LENGTH; j++ ) { - if( q_ptr[ j ] > 0 ) { - /* attach sign */ -#if 0 - /* conditional implementation */ - if( ec_dec_icdf( psRangeDec, icdf, 8 ) == 0 ) { - q_ptr[ j ] = -q_ptr[ j ]; - } -#else - /* implementation with shift, subtraction, multiplication */ - q_ptr[ j ] *= silk_dec_map( ec_dec_icdf( psRangeDec, icdf, 8 ) ); -#endif - } - } - } - q_ptr += SHELL_CODEC_FRAME_LENGTH; - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/control.h b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/control.h deleted file mode 100644 index 747e5426..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/control.h +++ /dev/null @@ -1,142 +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. -***********************************************************************/ - -#ifndef SILK_CONTROL_H -#define SILK_CONTROL_H - -#include "typedef.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -/* Decoder API flags */ -#define FLAG_DECODE_NORMAL 0 -#define FLAG_PACKET_LOST 1 -#define FLAG_DECODE_LBRR 2 - -/***********************************************/ -/* Structure for controlling encoder operation */ -/***********************************************/ -typedef struct { - /* I: Number of channels; 1/2 */ - opus_int32 nChannelsAPI; - - /* I: Number of channels; 1/2 */ - opus_int32 nChannelsInternal; - - /* I: Input signal sampling rate in Hertz; 8000/12000/16000/24000/32000/44100/48000 */ - opus_int32 API_sampleRate; - - /* I: Maximum internal sampling rate in Hertz; 8000/12000/16000 */ - opus_int32 maxInternalSampleRate; - - /* I: Minimum internal sampling rate in Hertz; 8000/12000/16000 */ - opus_int32 minInternalSampleRate; - - /* I: Soft request for internal sampling rate in Hertz; 8000/12000/16000 */ - opus_int32 desiredInternalSampleRate; - - /* I: Number of samples per packet in milliseconds; 10/20/40/60 */ - opus_int payloadSize_ms; - - /* I: Bitrate during active speech in bits/second; internally limited */ - opus_int32 bitRate; - - /* I: Uplink packet loss in percent (0-100) */ - opus_int packetLossPercentage; - - /* I: Complexity mode; 0 is lowest, 10 is highest complexity */ - opus_int complexity; - - /* I: Flag to enable in-band Forward Error Correction (FEC); 0/1 */ - opus_int useInBandFEC; - - /* I: Flag to enable discontinuous transmission (DTX); 0/1 */ - opus_int useDTX; - - /* I: Flag to use constant bitrate */ - opus_int useCBR; - - /* I: Maximum number of bits allowed for the frame */ - opus_int maxBits; - - /* I: Causes a smooth downmix to mono */ - opus_int toMono; - - /* 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; - - /* O: Flag that bandwidth switching is allowed (because low voice activity) */ - opus_int allowBandwidthSwitch; - - /* O: Flag that SILK runs in WB mode without variable LP filter (use for switching between WB/SWB/FB) */ - opus_int inWBmodeWithoutVariableLP; - - /* O: Stereo width */ - opus_int stereoWidth_Q14; - - /* O: Tells the Opus encoder we're ready to switch */ - opus_int switchReady; - -} silk_EncControlStruct; - -/**************************************************************************/ -/* Structure for controlling decoder operation and reading decoder status */ -/**************************************************************************/ -typedef struct { - /* I: Number of channels; 1/2 */ - opus_int32 nChannelsAPI; - - /* I: Number of channels; 1/2 */ - opus_int32 nChannelsInternal; - - /* I: Output signal sampling rate in Hertz; 8000/12000/16000/24000/32000/44100/48000 */ - opus_int32 API_sampleRate; - - /* I: Internal sampling rate used, in Hertz; 8000/12000/16000 */ - opus_int32 internalSampleRate; - - /* I: Number of samples per packet in milliseconds; 10/20/40/60 */ - opus_int payloadSize_ms; - - /* O: Pitch lag of previous frame (0 if unvoiced), measured in samples at 48 kHz */ - opus_int prevPitchLag; -} silk_DecControlStruct; - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/control_SNR.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/control_SNR.c deleted file mode 100644 index f04e69fc..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/control_SNR.c +++ /dev/null @@ -1,81 +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; - } - } - - /* 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/sources/LabSound/third_party/libnyquist/third_party/opus/silk/control_audio_bandwidth.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/control_audio_bandwidth.c deleted file mode 100644 index 4f9bc5cb..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/control_audio_bandwidth.c +++ /dev/null @@ -1,126 +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 internal sampling rate */ -opus_int silk_control_audio_bandwidth( - silk_encoder_state *psEncC, /* I/O Pointer to Silk encoder state */ - silk_EncControlStruct *encControl /* I Control structure */ -) -{ - opus_int fs_kHz; - opus_int32 fs_Hz; - - fs_kHz = psEncC->fs_kHz; - fs_Hz = silk_SMULBB( fs_kHz, 1000 ); - if( fs_Hz == 0 ) { - /* Encoder has just been initialized */ - fs_Hz = silk_min( psEncC->desiredInternal_fs_Hz, psEncC->API_fs_Hz ); - fs_kHz = silk_DIV32_16( fs_Hz, 1000 ); - } else if( fs_Hz > psEncC->API_fs_Hz || fs_Hz > psEncC->maxInternal_fs_Hz || fs_Hz < psEncC->minInternal_fs_Hz ) { - /* Make sure internal rate is not higher than external rate or maximum allowed, or lower than minimum allowed */ - fs_Hz = psEncC->API_fs_Hz; - fs_Hz = silk_min( fs_Hz, psEncC->maxInternal_fs_Hz ); - fs_Hz = silk_max( fs_Hz, psEncC->minInternal_fs_Hz ); - fs_kHz = silk_DIV32_16( fs_Hz, 1000 ); - } else { - /* State machine for the internal sampling rate switching */ - if( psEncC->sLP.transition_frame_no >= TRANSITION_FRAMES ) { - /* Stop transition phase */ - psEncC->sLP.mode = 0; - } - if( psEncC->allow_bandwidth_switch || encControl->opusCanSwitch ) { - /* Check if we should switch down */ - if( silk_SMULBB( psEncC->fs_kHz, 1000 ) > psEncC->desiredInternal_fs_Hz ) - { - /* Switch down */ - if( psEncC->sLP.mode == 0 ) { - /* New transition */ - psEncC->sLP.transition_frame_no = TRANSITION_FRAMES; - - /* Reset transition filter state */ - silk_memset( psEncC->sLP.In_LP_State, 0, sizeof( psEncC->sLP.In_LP_State ) ); - } - if( encControl->opusCanSwitch ) { - /* Stop transition phase */ - psEncC->sLP.mode = 0; - - /* Switch to a lower sample frequency */ - fs_kHz = psEncC->fs_kHz == 16 ? 12 : 8; - } else { - if( psEncC->sLP.transition_frame_no <= 0 ) { - encControl->switchReady = 1; - /* Make room for redundancy */ - encControl->maxBits -= encControl->maxBits * 5 / ( encControl->payloadSize_ms + 5 ); - } else { - /* Direction: down (at double speed) */ - psEncC->sLP.mode = -2; - } - } - } - else - /* Check if we should switch up */ - if( silk_SMULBB( psEncC->fs_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; - - /* New transition */ - psEncC->sLP.transition_frame_no = 0; - - /* Reset transition filter state */ - silk_memset( psEncC->sLP.In_LP_State, 0, sizeof( psEncC->sLP.In_LP_State ) ); - - /* Direction: up */ - psEncC->sLP.mode = 1; - } else { - if( psEncC->sLP.mode == 0 ) { - encControl->switchReady = 1; - /* Make room for redundancy */ - encControl->maxBits -= encControl->maxBits * 5 / ( encControl->payloadSize_ms + 5 ); - } else { - /* Direction: up */ - psEncC->sLP.mode = 1; - } - } - } else { - if (psEncC->sLP.mode<0) - psEncC->sLP.mode = 1; - } - } - } - - return fs_kHz; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/control_codec.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/control_codec.c deleted file mode 100644 index 1f674bdd..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/control_codec.c +++ /dev/null @@ -1,422 +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 -#ifdef FIXED_POINT -#include "main_FIX.h" -#define silk_encoder_state_Fxx silk_encoder_state_FIX -#else -#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" - -static opus_int silk_setup_resamplers( - silk_encoder_state_Fxx *psEnc, /* I/O */ - opus_int fs_kHz /* I */ -); - -static opus_int silk_setup_fs( - silk_encoder_state_Fxx *psEnc, /* I/O */ - opus_int fs_kHz, /* I */ - opus_int PacketSize_ms /* I */ -); - -static opus_int silk_setup_complexity( - silk_encoder_state *psEncC, /* I/O */ - opus_int Complexity /* I */ -); - -static OPUS_INLINE opus_int silk_setup_LBRR( - silk_encoder_state *psEncC, /* I/O */ - const opus_int32 TargetRate_bps /* I */ -); - - -/* Control 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 -) -{ - opus_int fs_kHz, ret = 0; - - psEnc->sCmn.useDTX = encControl->useDTX; - psEnc->sCmn.useCBR = encControl->useCBR; - psEnc->sCmn.API_fs_Hz = encControl->API_sampleRate; - psEnc->sCmn.maxInternal_fs_Hz = encControl->maxInternalSampleRate; - psEnc->sCmn.minInternal_fs_Hz = encControl->minInternalSampleRate; - psEnc->sCmn.desiredInternal_fs_Hz = encControl->desiredInternalSampleRate; - psEnc->sCmn.useInBandFEC = encControl->useInBandFEC; - psEnc->sCmn.nChannelsAPI = encControl->nChannelsAPI; - psEnc->sCmn.nChannelsInternal = encControl->nChannelsInternal; - psEnc->sCmn.allow_bandwidth_switch = allow_bw_switch; - psEnc->sCmn.channelNb = channelNb; - - if( psEnc->sCmn.controlled_since_last_payload != 0 && psEnc->sCmn.prefillFlag == 0 ) { - if( psEnc->sCmn.API_fs_Hz != psEnc->sCmn.prev_API_fs_Hz && psEnc->sCmn.fs_kHz > 0 ) { - /* Change in API sampling rate in the middle of encoding a packet */ - ret += silk_setup_resamplers( psEnc, psEnc->sCmn.fs_kHz ); - } - return ret; - } - - /* Beyond this point we know that there are no previously coded frames in the payload buffer */ - - /********************************************/ - /* Determine internal sampling rate */ - /********************************************/ - fs_kHz = silk_control_audio_bandwidth( &psEnc->sCmn, encControl ); - if( force_fs_kHz ) { - fs_kHz = force_fs_kHz; - } - /********************************************/ - /* Prepare resampler and buffered data */ - /********************************************/ - ret += silk_setup_resamplers( psEnc, fs_kHz ); - - /********************************************/ - /* Set internal sampling frequency */ - /********************************************/ - ret += silk_setup_fs( psEnc, fs_kHz, encControl->payloadSize_ms ); - - /********************************************/ - /* Set encoding complexity */ - /********************************************/ - ret += silk_setup_complexity( &psEnc->sCmn, encControl->complexity ); - - /********************************************/ - /* Set packet loss rate measured by farend */ - /********************************************/ - psEnc->sCmn.PacketLoss_perc = encControl->packetLossPercentage; - - /********************************************/ - /* Set LBRR usage */ - /********************************************/ - ret += silk_setup_LBRR( &psEnc->sCmn, TargetRate_bps ); - - psEnc->sCmn.controlled_since_last_payload = 1; - - return ret; -} - -static opus_int silk_setup_resamplers( - silk_encoder_state_Fxx *psEnc, /* I/O */ - opus_int fs_kHz /* I */ -) -{ - opus_int ret = SILK_NO_ERROR; - SAVE_STACK; - - if( psEnc->sCmn.fs_kHz != fs_kHz || psEnc->sCmn.prev_API_fs_Hz != psEnc->sCmn.API_fs_Hz ) - { - if( psEnc->sCmn.fs_kHz == 0 ) { - /* 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 { - 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 - 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; - - 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 - 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 */ - 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 ); - - /* Calculate number of samples to temporarily upsample */ - api_buf_samples = buf_length_ms * silk_DIV32_16( psEnc->sCmn.API_fs_Hz, 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, api_buf_samples ); - -#ifndef FIXED_POINT - 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; -} - -static opus_int silk_setup_fs( - silk_encoder_state_Fxx *psEnc, /* I/O */ - opus_int fs_kHz, /* I */ - opus_int PacketSize_ms /* I */ -) -{ - opus_int ret = SILK_NO_ERROR; - - /* Set packet size */ - if( PacketSize_ms != psEnc->sCmn.PacketSize_ms ) { - if( ( PacketSize_ms != 10 ) && - ( PacketSize_ms != 20 ) && - ( PacketSize_ms != 40 ) && - ( PacketSize_ms != 60 ) ) { - ret = SILK_ENC_PACKET_SIZE_NOT_SUPPORTED; - } - if( PacketSize_ms <= 10 ) { - psEnc->sCmn.nFramesPerPacket = 1; - psEnc->sCmn.nb_subfr = PacketSize_ms == 10 ? 2 : 1; - psEnc->sCmn.frame_length = silk_SMULBB( PacketSize_ms, fs_kHz ); - psEnc->sCmn.pitch_LPC_win_length = silk_SMULBB( FIND_PITCH_LPC_WIN_MS_2_SF, fs_kHz ); - if( psEnc->sCmn.fs_kHz == 8 ) { - psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_10_ms_NB_iCDF; - } else { - psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_10_ms_iCDF; - } - } else { - psEnc->sCmn.nFramesPerPacket = silk_DIV32_16( PacketSize_ms, MAX_FRAME_LENGTH_MS ); - psEnc->sCmn.nb_subfr = MAX_NB_SUBFR; - psEnc->sCmn.frame_length = silk_SMULBB( 20, fs_kHz ); - psEnc->sCmn.pitch_LPC_win_length = silk_SMULBB( FIND_PITCH_LPC_WIN_MS, fs_kHz ); - if( psEnc->sCmn.fs_kHz == 8 ) { - psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_NB_iCDF; - } else { - psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_iCDF; - } - } - psEnc->sCmn.PacketSize_ms = PacketSize_ms; - psEnc->sCmn.TargetRate_bps = 0; /* trigger new SNR computation */ - } - - /* 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 ); - 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 ) ); - psEnc->sCmn.inputBufIx = 0; - psEnc->sCmn.nFramesEncoded = 0; - psEnc->sCmn.TargetRate_bps = 0; /* trigger new SNR computation */ - - /* 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; - psEnc->sCmn.prevSignalType = TYPE_NO_VOICE_ACTIVITY; - - psEnc->sCmn.fs_kHz = fs_kHz; - if( psEnc->sCmn.fs_kHz == 8 ) { - if( psEnc->sCmn.nb_subfr == MAX_NB_SUBFR ) { - psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_NB_iCDF; - } else { - psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_10_ms_NB_iCDF; - } - } else { - if( psEnc->sCmn.nb_subfr == MAX_NB_SUBFR ) { - psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_iCDF; - } else { - psEnc->sCmn.pitch_contour_iCDF = silk_pitch_contour_10_ms_iCDF; - } - } - if( psEnc->sCmn.fs_kHz == 8 || psEnc->sCmn.fs_kHz == 12 ) { - psEnc->sCmn.predictLPCOrder = MIN_LPC_ORDER; - psEnc->sCmn.psNLSF_CB = &silk_NLSF_CB_NB_MB; - } else { - psEnc->sCmn.predictLPCOrder = MAX_LPC_ORDER; - psEnc->sCmn.psNLSF_CB = &silk_NLSF_CB_WB; - } - psEnc->sCmn.subfr_length = SUB_FRAME_LENGTH_MS * fs_kHz; - psEnc->sCmn.frame_length = silk_SMULBB( psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr ); - psEnc->sCmn.ltp_mem_length = silk_SMULBB( LTP_MEM_LENGTH_MS, fs_kHz ); - psEnc->sCmn.la_pitch = silk_SMULBB( LA_PITCH_MS, fs_kHz ); - psEnc->sCmn.max_pitch_lag = silk_SMULBB( 18, fs_kHz ); - if( psEnc->sCmn.nb_subfr == MAX_NB_SUBFR ) { - psEnc->sCmn.pitch_LPC_win_length = silk_SMULBB( FIND_PITCH_LPC_WIN_MS, fs_kHz ); - } else { - 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 ); - - return ret; -} - -static opus_int silk_setup_complexity( - silk_encoder_state *psEncC, /* I/O */ - opus_int Complexity /* I */ -) -{ - opus_int ret = 0; - - /* Set encoding complexity */ - silk_assert( Complexity >= 0 && Complexity <= 10 ); - if( Complexity < 2 ) { - psEncC->pitchEstimationComplexity = SILK_PE_MIN_COMPLEX; - psEncC->pitchEstimationThreshold_Q16 = SILK_FIX_CONST( 0.8, 16 ); - psEncC->pitchEstimationLPCOrder = 6; - psEncC->shapingLPCOrder = 8; - 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 ) { - psEncC->pitchEstimationComplexity = SILK_PE_MID_COMPLEX; - psEncC->pitchEstimationThreshold_Q16 = SILK_FIX_CONST( 0.76, 16 ); - psEncC->pitchEstimationLPCOrder = 8; - psEncC->shapingLPCOrder = 10; - psEncC->la_shape = 5 * psEncC->fs_kHz; - psEncC->nStatesDelayedDecision = 1; - psEncC->useInterpolatedNLSFs = 0; - psEncC->LTPQuantLowComplexity = 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->la_shape = 5 * psEncC->fs_kHz; - psEncC->nStatesDelayedDecision = 2; - psEncC->useInterpolatedNLSFs = 1; - psEncC->LTPQuantLowComplexity = 0; - psEncC->NLSF_MSVQ_Survivors = 8; - 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->la_shape = 5 * psEncC->fs_kHz; - psEncC->nStatesDelayedDecision = 3; - psEncC->useInterpolatedNLSFs = 1; - psEncC->LTPQuantLowComplexity = 0; - psEncC->NLSF_MSVQ_Survivors = 16; - 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->la_shape = 5 * psEncC->fs_kHz; - psEncC->nStatesDelayedDecision = MAX_DEL_DEC_STATES; - psEncC->useInterpolatedNLSFs = 1; - psEncC->LTPQuantLowComplexity = 0; - psEncC->NLSF_MSVQ_Survivors = 32; - psEncC->warping_Q16 = psEncC->fs_kHz * SILK_FIX_CONST( WARPING_MULTIPLIER, 16 ); - } - - /* Do not allow higher pitch estimation LPC order than predict LPC order */ - psEncC->pitchEstimationLPCOrder = silk_min_int( psEncC->pitchEstimationLPCOrder, psEncC->predictLPCOrder ); - 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 ); - - return ret; -} - -static OPUS_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_int32 LBRR_rate_thres_bps; - - 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 */ - 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/sources/LabSound/third_party/libnyquist/third_party/opus/silk/debug.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/debug.c deleted file mode 100644 index 9253faf7..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/debug.c +++ /dev/null @@ -1,170 +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 "debug.h" -#include "SigProc_FIX.h" - -#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 */ - /* the resolution is platform dependent */ - /* but is typically 1.62 us resolution */ - LARGE_INTEGER lpPerformanceCount; - LARGE_INTEGER lpFrequency; - QueryPerformanceCounter(&lpPerformanceCount); - QueryPerformanceFrequency(&lpFrequency); - return (unsigned long)((1000000*(lpPerformanceCount.QuadPart)) / lpFrequency.QuadPart); -} -#else /* Linux or Mac*/ -unsigned long GetHighResolutionTime(void) /* O time in usec*/ -{ - struct timeval tv; - gettimeofday(&tv, 0); - return((tv.tv_sec*1000000)+(tv.tv_usec)); -} -#endif - -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 -LARGE_INTEGER silk_Timer_start[silk_NUM_TIMERS_MAX]; -#else -unsigned long silk_Timer_start[silk_NUM_TIMERS_MAX]; -#endif -unsigned int silk_Timer_cnt[silk_NUM_TIMERS_MAX]; -opus_int64 silk_Timer_min[silk_NUM_TIMERS_MAX]; -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 -void silk_TimerSave(char *file_name) -{ - if( silk_Timer_nTimers > 0 ) - { - int k; - FILE *fp; - LARGE_INTEGER lpFrequency; - LARGE_INTEGER lpPerformanceCount1, lpPerformanceCount2; - int del = 0x7FFFFFFF; - double avg, sum_avg; - /* estimate overhead of calling performance counters */ - for( k = 0; k < 1000; k++ ) { - QueryPerformanceCounter(&lpPerformanceCount1); - QueryPerformanceCounter(&lpPerformanceCount2); - lpPerformanceCount2.QuadPart -= lpPerformanceCount1.QuadPart; - if( (int)lpPerformanceCount2.LowPart < del ) - del = lpPerformanceCount2.LowPart; - } - QueryPerformanceFrequency(&lpFrequency); - /* print results to file */ - sum_avg = 0.0f; - for( k = 0; k < silk_Timer_nTimers; k++ ) { - if (silk_Timer_depth[k] == 0) { - sum_avg += (1e6 * silk_Timer_sum[k] / silk_Timer_cnt[k] - del) / lpFrequency.QuadPart * silk_Timer_cnt[k]; - } - } - fp = fopen(file_name, "w"); - fprintf(fp, " min avg %% max count\n"); - for( k = 0; k < silk_Timer_nTimers; k++ ) { - if (silk_Timer_depth[k] == 0) { - fprintf(fp, "%-28s", silk_Timer_tags[k]); - } else if (silk_Timer_depth[k] == 1) { - fprintf(fp, " %-27s", silk_Timer_tags[k]); - } else if (silk_Timer_depth[k] == 2) { - fprintf(fp, " %-26s", silk_Timer_tags[k]); - } else if (silk_Timer_depth[k] == 3) { - fprintf(fp, " %-25s", silk_Timer_tags[k]); - } else { - fprintf(fp, " %-24s", silk_Timer_tags[k]); - } - avg = (1e6 * silk_Timer_sum[k] / silk_Timer_cnt[k] - del) / lpFrequency.QuadPart; - fprintf(fp, "%8.2f", (1e6 * (silk_max_64(silk_Timer_min[k] - del, 0))) / lpFrequency.QuadPart); - fprintf(fp, "%12.2f %6.2f", avg, 100.0 * avg / sum_avg * silk_Timer_cnt[k]); - fprintf(fp, "%12.2f", (1e6 * (silk_max_64(silk_Timer_max[k] - del, 0))) / lpFrequency.QuadPart); - fprintf(fp, "%10d\n", silk_Timer_cnt[k]); - } - fprintf(fp, " microseconds\n"); - fclose(fp); - } -} -#else -void silk_TimerSave(char *file_name) -{ - if( silk_Timer_nTimers > 0 ) - { - int k; - FILE *fp; - /* print results to file */ - fp = fopen(file_name, "w"); - fprintf(fp, " min avg max count\n"); - for( k = 0; k < silk_Timer_nTimers; k++ ) - { - if (silk_Timer_depth[k] == 0) { - fprintf(fp, "%-28s", silk_Timer_tags[k]); - } else if (silk_Timer_depth[k] == 1) { - fprintf(fp, " %-27s", silk_Timer_tags[k]); - } else if (silk_Timer_depth[k] == 2) { - fprintf(fp, " %-26s", silk_Timer_tags[k]); - } else if (silk_Timer_depth[k] == 3) { - fprintf(fp, " %-25s", silk_Timer_tags[k]); - } else { - fprintf(fp, " %-24s", silk_Timer_tags[k]); - } - fprintf(fp, "%d ", silk_Timer_min[k]); - fprintf(fp, "%f ", (double)silk_Timer_sum[k] / (double)silk_Timer_cnt[k]); - fprintf(fp, "%d ", silk_Timer_max[k]); - fprintf(fp, "%10d\n", silk_Timer_cnt[k]); - } - fprintf(fp, " microseconds\n"); - fclose(fp); - } -} -#endif - -#endif /* SILK_TIC_TOC */ - -#if SILK_DEBUG -FILE *silk_debug_store_fp[ silk_NUM_STORES_MAX ]; -int silk_debug_store_count = 0; -#endif /* SILK_DEBUG */ - diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/debug.h b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/debug.h deleted file mode 100644 index efb6d3e9..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/debug.h +++ /dev/null @@ -1,279 +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. -***********************************************************************/ - -#ifndef SILK_DEBUG_H -#define SILK_DEBUG_H - -#include "typedef.h" -#include /* file writing */ -#include /* strcpy, strcmp */ - -#ifdef __cplusplus -extern "C" -{ -#endif - -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 - -/* Flag for using timers */ -#define SILK_TIC_TOC 0 - - -#if SILK_TIC_TOC - -#if (defined(_WIN32) || defined(_WINCE)) -#include /* timer */ -#else /* Linux or Mac*/ -#include -#endif - -/*********************************/ -/* timer functions for profiling */ -/*********************************/ -/* example: */ -/* */ -/* TIC(LPC) */ -/* do_LPC(in_vec, order, acoef); // do LPC analysis */ -/* TOC(LPC) */ -/* */ -/* and call the following just before exiting (from main) */ -/* */ -/* silk_TimerSave("silk_TimingData.txt"); */ -/* */ -/* results are now in silk_TimingData.txt */ - -void silk_TimerSave(char *file_name); - -/* max number of timers (in different locations) */ -#define silk_NUM_TIMERS_MAX 50 -/* max length of name tags in TIC(..), TOC(..) */ -#define silk_NUM_TIMERS_MAX_TAG_LEN 30 - -extern int silk_Timer_nTimers; -extern int silk_Timer_depth_ctr; -extern char silk_Timer_tags[silk_NUM_TIMERS_MAX][silk_NUM_TIMERS_MAX_TAG_LEN]; -#ifdef _WIN32 -extern LARGE_INTEGER silk_Timer_start[silk_NUM_TIMERS_MAX]; -#else -extern unsigned long silk_Timer_start[silk_NUM_TIMERS_MAX]; -#endif -extern unsigned int silk_Timer_cnt[silk_NUM_TIMERS_MAX]; -extern opus_int64 silk_Timer_sum[silk_NUM_TIMERS_MAX]; -extern opus_int64 silk_Timer_max[silk_NUM_TIMERS_MAX]; -extern opus_int64 silk_Timer_min[silk_NUM_TIMERS_MAX]; -extern opus_int64 silk_Timer_depth[silk_NUM_TIMERS_MAX]; - -/* WARNING: TIC()/TOC can measure only up to 0.1 seconds at a time */ -#ifdef _WIN32 -#define TIC(TAG_NAME) { \ - static int init = 0; \ - static int ID = -1; \ - if( init == 0 ) \ - { \ - int k; \ - init = 1; \ - for( k = 0; k < silk_Timer_nTimers; k++ ) { \ - if( strcmp(silk_Timer_tags[k], #TAG_NAME) == 0 ) { \ - ID = k; \ - break; \ - } \ - } \ - if (ID == -1) { \ - ID = silk_Timer_nTimers; \ - silk_Timer_nTimers++; \ - silk_Timer_depth[ID] = silk_Timer_depth_ctr; \ - strcpy(silk_Timer_tags[ID], #TAG_NAME); \ - silk_Timer_cnt[ID] = 0; \ - silk_Timer_sum[ID] = 0; \ - silk_Timer_min[ID] = 0xFFFFFFFF; \ - silk_Timer_max[ID] = 0; \ - } \ - } \ - silk_Timer_depth_ctr++; \ - QueryPerformanceCounter(&silk_Timer_start[ID]); \ -} -#else -#define TIC(TAG_NAME) { \ - static int init = 0; \ - static int ID = -1; \ - if( init == 0 ) \ - { \ - int k; \ - init = 1; \ - for( k = 0; k < silk_Timer_nTimers; k++ ) { \ - if( strcmp(silk_Timer_tags[k], #TAG_NAME) == 0 ) { \ - ID = k; \ - break; \ - } \ - } \ - if (ID == -1) { \ - ID = silk_Timer_nTimers; \ - silk_Timer_nTimers++; \ - silk_Timer_depth[ID] = silk_Timer_depth_ctr; \ - strcpy(silk_Timer_tags[ID], #TAG_NAME); \ - silk_Timer_cnt[ID] = 0; \ - silk_Timer_sum[ID] = 0; \ - silk_Timer_min[ID] = 0xFFFFFFFF; \ - silk_Timer_max[ID] = 0; \ - } \ - } \ - silk_Timer_depth_ctr++; \ - silk_Timer_start[ID] = GetHighResolutionTime(); \ -} -#endif - -#ifdef _WIN32 -#define TOC(TAG_NAME) { \ - LARGE_INTEGER lpPerformanceCount; \ - static int init = 0; \ - static int ID = 0; \ - if( init == 0 ) \ - { \ - int k; \ - init = 1; \ - for( k = 0; k < silk_Timer_nTimers; k++ ) { \ - if( strcmp(silk_Timer_tags[k], #TAG_NAME) == 0 ) { \ - ID = k; \ - break; \ - } \ - } \ - } \ - QueryPerformanceCounter(&lpPerformanceCount); \ - lpPerformanceCount.QuadPart -= silk_Timer_start[ID].QuadPart; \ - if((lpPerformanceCount.QuadPart < 100000000) && \ - (lpPerformanceCount.QuadPart >= 0)) { \ - silk_Timer_cnt[ID]++; \ - silk_Timer_sum[ID] += lpPerformanceCount.QuadPart; \ - if( lpPerformanceCount.QuadPart > silk_Timer_max[ID] ) \ - silk_Timer_max[ID] = lpPerformanceCount.QuadPart; \ - if( lpPerformanceCount.QuadPart < silk_Timer_min[ID] ) \ - silk_Timer_min[ID] = lpPerformanceCount.QuadPart; \ - } \ - silk_Timer_depth_ctr--; \ -} -#else -#define TOC(TAG_NAME) { \ - unsigned long endTime; \ - static int init = 0; \ - static int ID = 0; \ - if( init == 0 ) \ - { \ - int k; \ - init = 1; \ - for( k = 0; k < silk_Timer_nTimers; k++ ) { \ - if( strcmp(silk_Timer_tags[k], #TAG_NAME) == 0 ) { \ - ID = k; \ - break; \ - } \ - } \ - } \ - endTime = GetHighResolutionTime(); \ - endTime -= silk_Timer_start[ID]; \ - if((endTime < 100000000) && \ - (endTime >= 0)) { \ - silk_Timer_cnt[ID]++; \ - silk_Timer_sum[ID] += endTime; \ - if( endTime > silk_Timer_max[ID] ) \ - silk_Timer_max[ID] = endTime; \ - if( endTime < silk_Timer_min[ID] ) \ - silk_Timer_min[ID] = endTime; \ - } \ - silk_Timer_depth_ctr--; \ -} -#endif - -#else /* SILK_TIC_TOC */ - -/* define macros as empty strings */ -#define TIC(TAG_NAME) -#define TOC(TAG_NAME) -#define silk_TimerSave(FILE_NAME) - -#endif /* SILK_TIC_TOC */ - - -#if SILK_DEBUG -/************************************/ -/* write data to file for debugging */ -/************************************/ -/* Example: DEBUG_STORE_DATA(testfile.pcm, &RIN[0], 160*sizeof(opus_int16)); */ - -#define silk_NUM_STORES_MAX 100 -extern FILE *silk_debug_store_fp[ silk_NUM_STORES_MAX ]; -extern int silk_debug_store_count; - -/* Faster way of storing the data */ -#define DEBUG_STORE_DATA( FILE_NAME, DATA_PTR, N_BYTES ) { \ - static opus_int init = 0, cnt = 0; \ - static FILE **fp; \ - if (init == 0) { \ - init = 1; \ - cnt = silk_debug_store_count++; \ - silk_debug_store_fp[ cnt ] = fopen(#FILE_NAME, "wb"); \ - } \ - fwrite((DATA_PTR), (N_BYTES), 1, silk_debug_store_fp[ cnt ]); \ -} - -/* Call this at the end of main() */ -#define SILK_DEBUG_STORE_CLOSE_FILES { \ - opus_int i; \ - for( i = 0; i < silk_debug_store_count; i++ ) { \ - fclose( silk_debug_store_fp[ i ] ); \ - } \ -} - -#else /* SILK_DEBUG */ - -/* define macros as empty strings */ -#define DEBUG_STORE_DATA(FILE_NAME, DATA_PTR, N_BYTES) -#define SILK_DEBUG_STORE_CLOSE_FILES - -#endif /* SILK_DEBUG */ - -#ifdef __cplusplus -} -#endif - -#endif /* SILK_DEBUG_H */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/dec_API.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/dec_API.c deleted file mode 100644 index 4cbcf715..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/dec_API.c +++ /dev/null @@ -1,397 +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 "API.h" -#include "main.h" -#include "stack_alloc.h" - -/************************/ -/* Decoder Super Struct */ -/************************/ -typedef struct { - silk_decoder_state channel_state[ DECODER_NUM_CHANNELS ]; - stereo_dec_state sStereo; - opus_int nChannelsAPI; - opus_int nChannelsInternal; - opus_int prev_decode_only_middle; -} silk_decoder; - -/*********************/ -/* Decoder functions */ -/*********************/ - -opus_int silk_Get_Decoder_Size( /* O Returns error code */ - opus_int *decSizeBytes /* O Number of bytes in SILK decoder state */ -) -{ - opus_int ret = SILK_NO_ERROR; - - *decSizeBytes = sizeof( silk_decoder ); - - return ret; -} - -/* Reset decoder state */ -opus_int silk_InitDecoder( /* O Returns error code */ - void *decState /* I/O State */ -) -{ - opus_int n, ret = SILK_NO_ERROR; - silk_decoder_state *channel_state = ((silk_decoder *)decState)->channel_state; - - for( n = 0; n < DECODER_NUM_CHANNELS; n++ ) { - ret = silk_init_decoder( &channel_state[ n ] ); - } - silk_memset(&((silk_decoder *)decState)->sStereo, 0, sizeof(((silk_decoder *)decState)->sStereo)); - /* Not strictly needed, but it's cleaner that way */ - ((silk_decoder *)decState)->prev_decode_only_middle = 0; - - return ret; -} - -/* Decode a frame */ -opus_int silk_Decode( /* O Returns error code */ - void* decState, /* I/O State */ - silk_DecControlStruct* decControl, /* I/O Control Structure */ - opus_int lostFlag, /* I 0: no loss, 1 loss, 2 decode fec */ - 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_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, samplesOut2_tmp ); - opus_int32 MS_pred_Q13[ 2 ] = { 0 }; - opus_int16 *resample_out_ptr; - silk_decoder *psDec = ( silk_decoder * )decState; - silk_decoder_state *channel_state = psDec->channel_state; - opus_int has_side; - opus_int stereo_to_mono; - SAVE_STACK; - - silk_assert( decControl->nChannelsInternal == 1 || decControl->nChannelsInternal == 2 ); - - /**********************************/ - /* Test if first frame in payload */ - /**********************************/ - if( newPacketFlag ) { - for( n = 0; n < decControl->nChannelsInternal; n++ ) { - channel_state[ n ].nFramesDecoded = 0; /* Used to count frames in packet */ - } - } - - /* If Mono -> Stereo transition in bitstream: init state of second channel */ - if( decControl->nChannelsInternal > psDec->nChannelsInternal ) { - ret += silk_init_decoder( &channel_state[ 1 ] ); - } - - stereo_to_mono = decControl->nChannelsInternal == 1 && psDec->nChannelsInternal == 2 && - ( decControl->internalSampleRate == 1000*channel_state[ 0 ].fs_kHz ); - - if( channel_state[ 0 ].nFramesDecoded == 0 ) { - for( n = 0; n < decControl->nChannelsInternal; n++ ) { - opus_int fs_kHz_dec; - if( decControl->payloadSize_ms == 0 ) { - /* Assuming packet loss, use 10 ms */ - channel_state[ n ].nFramesPerPacket = 1; - channel_state[ n ].nb_subfr = 2; - } else if( decControl->payloadSize_ms == 10 ) { - channel_state[ n ].nFramesPerPacket = 1; - channel_state[ n ].nb_subfr = 2; - } else if( decControl->payloadSize_ms == 20 ) { - channel_state[ n ].nFramesPerPacket = 1; - channel_state[ n ].nb_subfr = 4; - } else if( decControl->payloadSize_ms == 40 ) { - channel_state[ n ].nFramesPerPacket = 2; - channel_state[ n ].nb_subfr = 4; - } else if( decControl->payloadSize_ms == 60 ) { - channel_state[ n ].nFramesPerPacket = 3; - channel_state[ n ].nb_subfr = 4; - } else { - silk_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 ); - RESTORE_STACK; - return SILK_DEC_INVALID_SAMPLING_FREQUENCY; - } - ret += silk_decoder_set_fs( &channel_state[ n ], fs_kHz_dec, decControl->API_sampleRate ); - } - } - - if( decControl->nChannelsAPI == 2 && decControl->nChannelsInternal == 2 && ( psDec->nChannelsAPI == 1 || psDec->nChannelsInternal == 1 ) ) { - silk_memset( psDec->sStereo.pred_prev_Q13, 0, sizeof( psDec->sStereo.pred_prev_Q13 ) ); - silk_memset( psDec->sStereo.sSide, 0, sizeof( psDec->sStereo.sSide ) ); - silk_memcpy( &channel_state[ 1 ].resampler_state, &channel_state[ 0 ].resampler_state, sizeof( silk_resampler_state_struct ) ); - } - psDec->nChannelsAPI = decControl->nChannelsAPI; - psDec->nChannelsInternal = decControl->nChannelsInternal; - - if( decControl->API_sampleRate > (opus_int32)MAX_API_FS_KHZ * 1000 || decControl->API_sampleRate < 8000 ) { - ret = SILK_DEC_INVALID_SAMPLING_FREQUENCY; - RESTORE_STACK; - return( ret ); - } - - if( lostFlag != FLAG_PACKET_LOST && channel_state[ 0 ].nFramesDecoded == 0 ) { - /* First decoder call for this payload */ - /* Decode VAD flags and LBRR flag */ - for( n = 0; n < decControl->nChannelsInternal; n++ ) { - for( i = 0; i < channel_state[ n ].nFramesPerPacket; i++ ) { - channel_state[ n ].VAD_flags[ i ] = ec_dec_bit_logp(psRangeDec, 1); - } - channel_state[ n ].LBRR_flag = ec_dec_bit_logp(psRangeDec, 1); - } - /* Decode LBRR flags */ - for( n = 0; n < decControl->nChannelsInternal; n++ ) { - silk_memset( channel_state[ n ].LBRR_flags, 0, sizeof( channel_state[ n ].LBRR_flags ) ); - if( channel_state[ n ].LBRR_flag ) { - if( channel_state[ n ].nFramesPerPacket == 1 ) { - channel_state[ n ].LBRR_flags[ 0 ] = 1; - } else { - LBRR_symbol = ec_dec_icdf( psRangeDec, silk_LBRR_flags_iCDF_ptr[ channel_state[ n ].nFramesPerPacket - 2 ], 8 ) + 1; - for( i = 0; i < channel_state[ n ].nFramesPerPacket; i++ ) { - channel_state[ n ].LBRR_flags[ i ] = silk_RSHIFT( LBRR_symbol, i ) & 1; - } - } - } - } - - if( lostFlag == FLAG_DECODE_NORMAL ) { - /* Regular decoding: skip all LBRR data */ - 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_int condCoding; - - if( decControl->nChannelsInternal == 2 && n == 0 ) { - silk_stereo_decode_pred( psRangeDec, MS_pred_Q13 ); - if( channel_state[ 1 ].LBRR_flags[ i ] == 0 ) { - silk_stereo_decode_mid_only( psRangeDec, &decode_only_middle ); - } - } - /* Use conditional coding if previous frame available */ - if( i > 0 && channel_state[ n ].LBRR_flags[ i - 1 ] ) { - condCoding = CODE_CONDITIONALLY; - } else { - condCoding = CODE_INDEPENDENTLY; - } - silk_decode_indices( &channel_state[ n ], psRangeDec, i, 1, condCoding ); - silk_decode_pulses( psRangeDec, pulses, channel_state[ n ].indices.signalType, - channel_state[ n ].indices.quantOffsetType, channel_state[ n ].frame_length ); - } - } - } - } - } - - /* Get MS predictor index */ - if( decControl->nChannelsInternal == 2 ) { - if( lostFlag == FLAG_DECODE_NORMAL || - ( lostFlag == FLAG_DECODE_LBRR && channel_state[ 0 ].LBRR_flags[ channel_state[ 0 ].nFramesDecoded ] == 1 ) ) - { - silk_stereo_decode_pred( psRangeDec, MS_pred_Q13 ); - /* For LBRR data, decode mid-only flag only if side-channel's LBRR flag is false */ - if( ( lostFlag == FLAG_DECODE_NORMAL && channel_state[ 1 ].VAD_flags[ channel_state[ 0 ].nFramesDecoded ] == 0 ) || - ( lostFlag == FLAG_DECODE_LBRR && channel_state[ 1 ].LBRR_flags[ channel_state[ 0 ].nFramesDecoded ] == 0 ) ) - { - silk_stereo_decode_mid_only( psRangeDec, &decode_only_middle ); - } else { - decode_only_middle = 0; - } - } else { - for( n = 0; n < 2; n++ ) { - MS_pred_Q13[ n ] = psDec->sStereo.pred_prev_Q13[ n ]; - } - } - } - - /* Reset side channel decoder prediction memory for first frame with side coding */ - if( decControl->nChannelsInternal == 2 && decode_only_middle == 0 && psDec->prev_decode_only_middle == 1 ) { - silk_memset( psDec->channel_state[ 1 ].outBuf, 0, sizeof(psDec->channel_state[ 1 ].outBuf) ); - silk_memset( psDec->channel_state[ 1 ].sLPC_Q14_buf, 0, sizeof(psDec->channel_state[ 1 ].sLPC_Q14_buf) ); - psDec->channel_state[ 1 ].lagPrev = 100; - psDec->channel_state[ 1 ].LastGainIndex = 10; - psDec->channel_state[ 1 ].prevSignalType = TYPE_NO_VOICE_ACTIVITY; - psDec->channel_state[ 1 ].first_frame_after_reset = 1; - } - - ALLOC( samplesOut1_tmp_storage, - 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( lostFlag == FLAG_DECODE_NORMAL ) { - has_side = !decode_only_middle; - } else { - has_side = !psDec->prev_decode_only_middle - || (decControl->nChannelsInternal == 2 && lostFlag == FLAG_DECODE_LBRR && channel_state[1].LBRR_flags[ channel_state[1].nFramesDecoded ] == 1 ); - } - /* Call decoder for one frame */ - for( n = 0; n < decControl->nChannelsInternal; n++ ) { - if( n == 0 || has_side ) { - opus_int FrameIndex; - opus_int condCoding; - - FrameIndex = channel_state[ 0 ].nFramesDecoded - n; - /* Use independent coding if no previous frame available */ - if( FrameIndex <= 0 ) { - condCoding = CODE_INDEPENDENTLY; - } else if( lostFlag == FLAG_DECODE_LBRR ) { - condCoding = channel_state[ n ].LBRR_flags[ FrameIndex - 1 ] ? CODE_CONDITIONALLY : CODE_INDEPENDENTLY; - } else if( n > 0 && psDec->prev_decode_only_middle ) { - /* If we skipped a side frame in this packet, we don't - need LTP scaling; the LTP state is well-defined. */ - condCoding = CODE_INDEPENDENTLY_NO_LTP_SCALING; - } else { - condCoding = CODE_CONDITIONALLY; - } - ret += silk_decode_frame( &channel_state[ n ], psRangeDec, &samplesOut1_tmp[ n ][ 2 ], &nSamplesOutDec, lostFlag, condCoding); - } else { - silk_memset( &samplesOut1_tmp[ n ][ 2 ], 0, nSamplesOutDec * sizeof( opus_int16 ) ); - } - channel_state[ n ].nFramesDecoded++; - } - - if( decControl->nChannelsAPI == 2 && decControl->nChannelsInternal == 2 ) { - /* Convert Mid/Side to Left/Right */ - silk_stereo_MS_to_LR( &psDec->sStereo, samplesOut1_tmp[ 0 ], samplesOut1_tmp[ 1 ], MS_pred_Q13, channel_state[ 0 ].fs_kHz, nSamplesOutDec ); - } else { - /* Buffering */ - silk_memcpy( samplesOut1_tmp[ 0 ], psDec->sStereo.sMid, 2 * sizeof( opus_int16 ) ); - silk_memcpy( psDec->sStereo.sMid, &samplesOut1_tmp[ 0 ][ nSamplesOutDec ], 2 * sizeof( opus_int16 ) ); - } - - /* Number of output samples */ - *nSamplesOut = silk_DIV32( nSamplesOutDec * decControl->API_sampleRate, silk_SMULBB( channel_state[ 0 ].fs_kHz, 1000 ) ); - - /* Set up pointers to temp buffers */ - ALLOC( samplesOut2_tmp, - decControl->nChannelsAPI == 2 ? *nSamplesOut : ALLOC_NONE, opus_int16 ); - if( decControl->nChannelsAPI == 2 ) { - resample_out_ptr = samplesOut2_tmp; - } else { - resample_out_ptr = samplesOut; - } - - for( n = 0; n < silk_min( decControl->nChannelsAPI, decControl->nChannelsInternal ); n++ ) { - - /* Resample decoded signal to API_sampleRate */ - ret += silk_resampler( &channel_state[ n ].resampler_state, resample_out_ptr, &samplesOut1_tmp[ n ][ 1 ], nSamplesOutDec ); - - /* Interleave if stereo output and stereo stream */ - if( decControl->nChannelsAPI == 2 ) { - for( i = 0; i < *nSamplesOut; i++ ) { - samplesOut[ n + 2 * i ] = resample_out_ptr[ i ]; - } - } - } - - /* Create two channel output from mono stream */ - if( decControl->nChannelsAPI == 2 && decControl->nChannelsInternal == 1 ) { - if ( stereo_to_mono ){ - /* Resample right channel for newly collapsed stereo just in case - we weren't doing collapsing when switching to mono */ - ret += silk_resampler( &channel_state[ 1 ].resampler_state, resample_out_ptr, &samplesOut1_tmp[ 0 ][ 1 ], nSamplesOutDec ); - - for( i = 0; i < *nSamplesOut; i++ ) { - samplesOut[ 1 + 2 * i ] = resample_out_ptr[ i ]; - } - } else { - for( i = 0; i < *nSamplesOut; i++ ) { - samplesOut[ 1 + 2 * i ] = samplesOut[ 0 + 2 * i ]; - } - } - } - - /* Export pitch lag, measured at 48 kHz sampling rate */ - if( channel_state[ 0 ].prevSignalType == TYPE_VOICED ) { - int mult_tab[ 3 ] = { 6, 4, 3 }; - decControl->prevPitchLag = channel_state[ 0 ].lagPrev * mult_tab[ ( channel_state[ 0 ].fs_kHz - 8 ) >> 2 ]; - } else { - decControl->prevPitchLag = 0; - } - - if( lostFlag == FLAG_PACKET_LOST ) { - /* On packet loss, remove the gain clamping to prevent having the energy "bounce back" - if we lose packets when the energy is going down */ - for ( i = 0; i < psDec->nChannelsInternal; i++ ) - psDec->channel_state[ i ].LastGainIndex = 10; - } else { - psDec->prev_decode_only_middle = decode_only_middle; - } - RESTORE_STACK; - return ret; -} - -#if 0 -/* Getting table of contents for a packet */ -opus_int silk_get_TOC( - const opus_uint8 *payload, /* I Payload data */ - const opus_int nBytesIn, /* I Number of input bytes */ - const opus_int nFramesPerPayload, /* I Number of SILK frames per payload */ - silk_TOC_struct *Silk_TOC /* O Type of content */ -) -{ - opus_int i, flags, ret = SILK_NO_ERROR; - - if( nBytesIn < 1 ) { - return -1; - } - if( nFramesPerPayload < 0 || nFramesPerPayload > 3 ) { - return -1; - } - - silk_memset( Silk_TOC, 0, sizeof( *Silk_TOC ) ); - - /* For stereo, extract the flags for the mid channel */ - flags = silk_RSHIFT( payload[ 0 ], 7 - nFramesPerPayload ) & ( silk_LSHIFT( 1, nFramesPerPayload + 1 ) - 1 ); - - Silk_TOC->inbandFECFlag = flags & 1; - for( i = nFramesPerPayload - 1; i >= 0 ; i-- ) { - flags = silk_RSHIFT( flags, 1 ); - Silk_TOC->VADFlags[ i ] = flags & 1; - Silk_TOC->VADFlag |= flags & 1; - } - - return ret; -} -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/decode_core.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/decode_core.c deleted file mode 100644 index a820bf11..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/decode_core.c +++ /dev/null @@ -1,238 +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 "stack_alloc.h" - -/**********************************************************/ -/* Core decoder. Performs inverse NSQ operation LTP + LPC */ -/**********************************************************/ -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 */ -) -{ - opus_int i, k, lag = 0, start_idx, sLTP_buf_idx, NLSF_interpolation_flag, signalType; - opus_int16 *A_Q12, *B_Q14, *pxq, A_Q12_tmp[ MAX_LPC_ORDER ]; - VARDECL( opus_int16, sLTP ); - VARDECL( opus_int32, sLTP_Q15 ); - opus_int32 LTP_pred_Q13, LPC_pred_Q10, Gain_Q10, inv_gain_Q31, gain_adj_Q16, rand_seed, offset_Q10; - opus_int32 *pred_lag_ptr, *pexc_Q14, *pres_Q14; - VARDECL( opus_int32, res_Q14 ); - VARDECL( opus_int32, sLPC_Q14 ); - SAVE_STACK; - - silk_assert( psDec->prev_gain_Q16 != 0 ); - - ALLOC( sLTP, psDec->ltp_mem_length, opus_int16 ); - ALLOC( sLTP_Q15, psDec->ltp_mem_length + psDec->frame_length, opus_int32 ); - ALLOC( res_Q14, psDec->subfr_length, opus_int32 ); - ALLOC( sLPC_Q14, psDec->subfr_length + MAX_LPC_ORDER, opus_int32 ); - - offset_Q10 = silk_Quantization_Offsets_Q10[ psDec->indices.signalType >> 1 ][ psDec->indices.quantOffsetType ]; - - if( psDec->indices.NLSFInterpCoef_Q2 < 1 << 2 ) { - NLSF_interpolation_flag = 1; - } else { - NLSF_interpolation_flag = 0; - } - - /* Decode excitation */ - rand_seed = psDec->indices.Seed; - for( i = 0; i < psDec->frame_length; i++ ) { - rand_seed = silk_RAND( rand_seed ); - psDec->exc_Q14[ i ] = silk_LSHIFT( (opus_int32)pulses[ i ], 14 ); - if( psDec->exc_Q14[ i ] > 0 ) { - psDec->exc_Q14[ i ] -= QUANT_LEVEL_ADJUST_Q10 << 4; - } else - if( psDec->exc_Q14[ i ] < 0 ) { - psDec->exc_Q14[ i ] += QUANT_LEVEL_ADJUST_Q10 << 4; - } - psDec->exc_Q14[ i ] += offset_Q10 << 4; - if( rand_seed < 0 ) { - psDec->exc_Q14[ i ] = -psDec->exc_Q14[ i ]; - } - - rand_seed = silk_ADD32_ovflw( rand_seed, pulses[ i ] ); - } - - /* Copy LPC state */ - silk_memcpy( sLPC_Q14, psDec->sLPC_Q14_buf, MAX_LPC_ORDER * sizeof( opus_int32 ) ); - - pexc_Q14 = psDec->exc_Q14; - pxq = xq; - sLTP_buf_idx = psDec->ltp_mem_length; - /* Loop over subframes */ - for( k = 0; k < psDec->nb_subfr; k++ ) { - pres_Q14 = res_Q14; - A_Q12 = psDecCtrl->PredCoef_Q12[ k >> 1 ]; - - /* Preload LPC coeficients to array on stack. Gives small performance gain */ - silk_memcpy( A_Q12_tmp, A_Q12, psDec->LPC_order * sizeof( opus_int16 ) ); - B_Q14 = &psDecCtrl->LTPCoef_Q14[ k * LTP_ORDER ]; - signalType = psDec->indices.signalType; - - Gain_Q10 = silk_RSHIFT( psDecCtrl->Gains_Q16[ k ], 6 ); - inv_gain_Q31 = silk_INVERSE32_varQ( psDecCtrl->Gains_Q16[ k ], 47 ); - - /* Calculate gain adjustment factor */ - if( psDecCtrl->Gains_Q16[ k ] != psDec->prev_gain_Q16 ) { - gain_adj_Q16 = silk_DIV32_varQ( psDec->prev_gain_Q16, psDecCtrl->Gains_Q16[ k ], 16 ); - - /* Scale short term state */ - for( i = 0; i < MAX_LPC_ORDER; i++ ) { - sLPC_Q14[ i ] = silk_SMULWW( gain_adj_Q16, sLPC_Q14[ i ] ); - } - } else { - gain_adj_Q16 = (opus_int32)1 << 16; - } - - /* Save inv_gain */ - silk_assert( inv_gain_Q31 != 0 ); - psDec->prev_gain_Q16 = psDecCtrl->Gains_Q16[ k ]; - - /* Avoid abrupt transition from voiced PLC to unvoiced normal decoding */ - if( psDec->lossCnt && psDec->prevSignalType == TYPE_VOICED && - psDec->indices.signalType != TYPE_VOICED && k < MAX_NB_SUBFR/2 ) { - - silk_memset( B_Q14, 0, LTP_ORDER * sizeof( opus_int16 ) ); - B_Q14[ LTP_ORDER/2 ] = SILK_FIX_CONST( 0.25, 14 ); - - signalType = TYPE_VOICED; - psDecCtrl->pitchL[ k ] = psDec->lagPrev; - } - - if( signalType == TYPE_VOICED ) { - /* Voiced */ - lag = psDecCtrl->pitchL[ k ]; - - /* Re-whitening */ - 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 ); - - 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 ); - - /* After rewhitening the LTP state is unscaled */ - if( k == 0 ) { - /* Do LTP downscaling to reduce inter-packet dependency */ - inv_gain_Q31 = silk_LSHIFT( silk_SMULWB( inv_gain_Q31, psDecCtrl->LTP_scale_Q14 ), 2 ); - } - for( i = 0; i < lag + LTP_ORDER/2; i++ ) { - sLTP_Q15[ sLTP_buf_idx - i - 1 ] = silk_SMULWB( inv_gain_Q31, sLTP[ psDec->ltp_mem_length - i - 1 ] ); - } - } else { - /* Update LTP state when Gain changes */ - if( gain_adj_Q16 != (opus_int32)1 << 16 ) { - for( i = 0; i < lag + LTP_ORDER/2; i++ ) { - sLTP_Q15[ sLTP_buf_idx - i - 1 ] = silk_SMULWW( gain_adj_Q16, sLTP_Q15[ sLTP_buf_idx - i - 1 ] ); - } - } - } - } - - /* Long-term prediction */ - if( signalType == TYPE_VOICED ) { - /* Set up pointer */ - pred_lag_ptr = &sLTP_Q15[ sLTP_buf_idx - lag + LTP_ORDER / 2 ]; - for( i = 0; i < psDec->subfr_length; i++ ) { - /* Unrolled loop */ - /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ - LTP_pred_Q13 = 2; - LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ 0 ], B_Q14[ 0 ] ); - LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -1 ], B_Q14[ 1 ] ); - LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -2 ], B_Q14[ 2 ] ); - LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -3 ], B_Q14[ 3 ] ); - LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -4 ], B_Q14[ 4 ] ); - pred_lag_ptr++; - - /* Generate LPC excitation */ - pres_Q14[ i ] = silk_ADD_LSHIFT32( pexc_Q14[ i ], LTP_pred_Q13, 1 ); - - /* Update states */ - sLTP_Q15[ sLTP_buf_idx ] = silk_LSHIFT( pres_Q14[ i ], 1 ); - sLTP_buf_idx++; - } - } else { - pres_Q14 = pexc_Q14; - } - - for( i = 0; i < psDec->subfr_length; i++ ) { - /* Short-term prediction */ - silk_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 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 2 ], A_Q12_tmp[ 1 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 3 ], A_Q12_tmp[ 2 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 4 ], A_Q12_tmp[ 3 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 5 ], A_Q12_tmp[ 4 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 6 ], A_Q12_tmp[ 5 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 7 ], A_Q12_tmp[ 6 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 8 ], A_Q12_tmp[ 7 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 9 ], A_Q12_tmp[ 8 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 10 ], A_Q12_tmp[ 9 ] ); - if( psDec->LPC_order == 16 ) { - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 11 ], A_Q12_tmp[ 10 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 12 ], A_Q12_tmp[ 11 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 13 ], A_Q12_tmp[ 12 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 14 ], A_Q12_tmp[ 13 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 15 ], A_Q12_tmp[ 14 ] ); - LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, sLPC_Q14[ MAX_LPC_ORDER + i - 16 ], A_Q12_tmp[ 15 ] ); - } - - /* Add prediction to LPC excitation */ - sLPC_Q14[ MAX_LPC_ORDER + i ] = silk_ADD_LSHIFT32( pres_Q14[ i ], 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; - pxq += psDec->subfr_length; - } - - /* Save LPC state */ - silk_memcpy( psDec->sLPC_Q14_buf, sLPC_Q14, MAX_LPC_ORDER * sizeof( opus_int32 ) ); - RESTORE_STACK; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/decode_frame.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/decode_frame.c deleted file mode 100644 index abc00a3d..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/decode_frame.c +++ /dev/null @@ -1,128 +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 "stack_alloc.h" -#include "PLC.h" - -/****************/ -/* Decode frame */ -/****************/ -opus_int silk_decode_frame( - silk_decoder_state *psDec, /* I/O Pointer to Silk decoder state */ - ec_dec *psRangeDec, /* I/O Compressor data structure */ - 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 */ -) -{ - 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 ); - - if( lostFlag == FLAG_DECODE_NORMAL || - ( lostFlag == FLAG_DECODE_LBRR && psDec->LBRR_flags[ psDec->nFramesDecoded ] == 1 ) ) - { - /*********************************************/ - /* Decode quantization indices of side info */ - /*********************************************/ - silk_decode_indices( psDec, psRangeDec, psDec->nFramesDecoded, lostFlag, condCoding ); - - /*********************************************/ - /* Decode quantization indices of excitation */ - /*********************************************/ - silk_decode_pulses( psRangeDec, pulses, psDec->indices.signalType, - psDec->indices.quantOffsetType, psDec->frame_length ); - - /********************************************/ - /* Decode parameters and pulse signal */ - /********************************************/ - silk_decode_parameters( psDec, psDecCtrl, condCoding ); - - /********************************************************/ - /* Run inverse NSQ */ - /********************************************************/ - silk_decode_core( psDec, psDecCtrl, pOut, pulses ); - - /********************************************************/ - /* Update PLC state */ - /********************************************************/ - silk_PLC( psDec, psDecCtrl, pOut, 0 ); - - psDec->lossCnt = 0; - psDec->prevSignalType = psDec->indices.signalType; - silk_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 ); - } - - /*************************/ - /* Update output buffer. */ - /*************************/ - silk_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 ) ); - - /****************************************************************/ - /* 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 ); - - /* Update some decoder state variables */ - psDec->lagPrev = psDecCtrl->pitchL[ psDec->nb_subfr - 1 ]; - - /* Set output frame length */ - *pN = L; - - RESTORE_STACK; - return ret; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/decode_indices.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/decode_indices.c deleted file mode 100644 index 7afe5c26..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/decode_indices.c +++ /dev/null @@ -1,151 +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" - -/* Decode side-information parameters from payload */ -void silk_decode_indices( - silk_decoder_state *psDec, /* I/O State */ - ec_dec *psRangeDec, /* I/O Compressor data structure */ - opus_int FrameIndex, /* I Frame number */ - opus_int decode_LBRR, /* I Flag indicating LBRR data is being decoded */ - opus_int condCoding /* I The type of conditional coding to use */ -) -{ - opus_int i, k, Ix; - opus_int decode_absolute_lagIndex, delta_lagIndex; - opus_int16 ec_ix[ MAX_LPC_ORDER ]; - opus_uint8 pred_Q8[ MAX_LPC_ORDER ]; - - /*******************************************/ - /* Decode signal type and quantizer offset */ - /*******************************************/ - if( decode_LBRR || psDec->VAD_flags[ FrameIndex ] ) { - Ix = ec_dec_icdf( psRangeDec, silk_type_offset_VAD_iCDF, 8 ) + 2; - } else { - Ix = ec_dec_icdf( psRangeDec, silk_type_offset_no_VAD_iCDF, 8 ); - } - psDec->indices.signalType = (opus_int8)silk_RSHIFT( Ix, 1 ); - psDec->indices.quantOffsetType = (opus_int8)( Ix & 1 ); - - /****************/ - /* Decode gains */ - /****************/ - /* First subframe */ - if( condCoding == CODE_CONDITIONALLY ) { - /* Conditional coding */ - psDec->indices.GainsIndices[ 0 ] = (opus_int8)ec_dec_icdf( psRangeDec, silk_delta_gain_iCDF, 8 ); - } else { - /* Independent coding, in two stages: MSB bits followed by 3 LSBs */ - psDec->indices.GainsIndices[ 0 ] = (opus_int8)silk_LSHIFT( ec_dec_icdf( psRangeDec, silk_gain_iCDF[ psDec->indices.signalType ], 8 ), 3 ); - psDec->indices.GainsIndices[ 0 ] += (opus_int8)ec_dec_icdf( psRangeDec, silk_uniform8_iCDF, 8 ); - } - - /* Remaining subframes */ - for( i = 1; i < psDec->nb_subfr; i++ ) { - psDec->indices.GainsIndices[ i ] = (opus_int8)ec_dec_icdf( psRangeDec, silk_delta_gain_iCDF, 8 ); - } - - /**********************/ - /* Decode LSF 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 ); - 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 ) { - Ix -= ec_dec_icdf( psRangeDec, silk_NLSF_EXT_iCDF, 8 ); - } else if( Ix == 2 * NLSF_QUANT_MAX_AMPLITUDE ) { - Ix += ec_dec_icdf( psRangeDec, silk_NLSF_EXT_iCDF, 8 ); - } - psDec->indices.NLSFIndices[ i+1 ] = (opus_int8)( Ix - NLSF_QUANT_MAX_AMPLITUDE ); - } - - /* Decode LSF interpolation factor */ - if( psDec->nb_subfr == MAX_NB_SUBFR ) { - psDec->indices.NLSFInterpCoef_Q2 = (opus_int8)ec_dec_icdf( psRangeDec, silk_NLSF_interpolation_factor_iCDF, 8 ); - } else { - psDec->indices.NLSFInterpCoef_Q2 = 4; - } - - if( psDec->indices.signalType == TYPE_VOICED ) - { - /*********************/ - /* Decode pitch lags */ - /*********************/ - /* Get lag index */ - decode_absolute_lagIndex = 1; - if( condCoding == CODE_CONDITIONALLY && psDec->ec_prevSignalType == TYPE_VOICED ) { - /* Decode Delta index */ - delta_lagIndex = (opus_int16)ec_dec_icdf( psRangeDec, silk_pitch_delta_iCDF, 8 ); - if( delta_lagIndex > 0 ) { - delta_lagIndex = delta_lagIndex - 9; - psDec->indices.lagIndex = (opus_int16)( psDec->ec_prevLagIndex + delta_lagIndex ); - decode_absolute_lagIndex = 0; - } - } - if( decode_absolute_lagIndex ) { - /* Absolute decoding */ - psDec->indices.lagIndex = (opus_int16)ec_dec_icdf( psRangeDec, silk_pitch_lag_iCDF, 8 ) * silk_RSHIFT( psDec->fs_kHz, 1 ); - psDec->indices.lagIndex += (opus_int16)ec_dec_icdf( psRangeDec, psDec->pitch_lag_low_bits_iCDF, 8 ); - } - psDec->ec_prevLagIndex = psDec->indices.lagIndex; - - /* Get countour index */ - psDec->indices.contourIndex = (opus_int8)ec_dec_icdf( psRangeDec, psDec->pitch_contour_iCDF, 8 ); - - /********************/ - /* Decode LTP gains */ - /********************/ - /* Decode PERIndex value */ - psDec->indices.PERIndex = (opus_int8)ec_dec_icdf( psRangeDec, silk_LTP_per_index_iCDF, 8 ); - - for( k = 0; k < psDec->nb_subfr; k++ ) { - psDec->indices.LTPIndex[ k ] = (opus_int8)ec_dec_icdf( psRangeDec, silk_LTP_gain_iCDF_ptrs[ psDec->indices.PERIndex ], 8 ); - } - - /**********************/ - /* Decode LTP scaling */ - /**********************/ - if( condCoding == CODE_INDEPENDENTLY ) { - psDec->indices.LTP_scaleIndex = (opus_int8)ec_dec_icdf( psRangeDec, silk_LTPscale_iCDF, 8 ); - } else { - psDec->indices.LTP_scaleIndex = 0; - } - } - psDec->ec_prevSignalType = psDec->indices.signalType; - - /***************/ - /* Decode seed */ - /***************/ - psDec->indices.Seed = (opus_int8)ec_dec_icdf( psRangeDec, silk_uniform4_iCDF, 8 ); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/decode_parameters.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/decode_parameters.c deleted file mode 100644 index e345b1dc..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/decode_parameters.c +++ /dev/null @@ -1,115 +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" - -/* Decode parameters from payload */ -void silk_decode_parameters( - silk_decoder_state *psDec, /* I/O State */ - silk_decoder_control *psDecCtrl, /* I/O Decoder control */ - opus_int condCoding /* I The type of conditional coding to use */ -) -{ - opus_int i, k, Ix; - opus_int16 pNLSF_Q15[ MAX_LPC_ORDER ], pNLSF0_Q15[ MAX_LPC_ORDER ]; - const opus_int8 *cbk_ptr_Q7; - - /* Dequant Gains */ - silk_gains_dequant( psDecCtrl->Gains_Q16, psDec->indices.GainsIndices, - &psDec->LastGainIndex, condCoding == CODE_CONDITIONALLY, psDec->nb_subfr ); - - /****************/ - /* Decode NLSFs */ - /****************/ - 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 ); - - /* 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 */ - if( psDec->first_frame_after_reset == 1 ) { - psDec->indices.NLSFInterpCoef_Q2 = 4; - } - - if( psDec->indices.NLSFInterpCoef_Q2 < 4 ) { - /* Calculation of the interpolated NLSF0 vector from the interpolation factor, */ - /* the previous NLSF1, and the current NLSF1 */ - for( i = 0; i < psDec->LPC_order; i++ ) { - pNLSF0_Q15[ i ] = psDec->prevNLSF_Q15[ i ] + silk_RSHIFT( silk_MUL( psDec->indices.NLSFInterpCoef_Q2, - pNLSF_Q15[ i ] - psDec->prevNLSF_Q15[ i ] ), 2 ); - } - - /* Convert NLSF parameters to AR prediction filter coefficients */ - silk_NLSF2A( psDecCtrl->PredCoef_Q12[ 0 ], pNLSF0_Q15, psDec->LPC_order ); - } 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 ) ); - } - - silk_memcpy( psDec->prevNLSF_Q15, pNLSF_Q15, psDec->LPC_order * sizeof( opus_int16 ) ); - - /* After a packet loss do BWE of LPC coefs */ - if( psDec->lossCnt ) { - silk_bwexpander( psDecCtrl->PredCoef_Q12[ 0 ], psDec->LPC_order, BWE_AFTER_LOSS_Q16 ); - silk_bwexpander( psDecCtrl->PredCoef_Q12[ 1 ], psDec->LPC_order, BWE_AFTER_LOSS_Q16 ); - } - - if( psDec->indices.signalType == TYPE_VOICED ) { - /*********************/ - /* Decode pitch lags */ - /*********************/ - - /* Decode pitch values */ - silk_decode_pitch( psDec->indices.lagIndex, psDec->indices.contourIndex, psDecCtrl->pitchL, psDec->fs_kHz, psDec->nb_subfr ); - - /* Decode Codebook Index */ - cbk_ptr_Q7 = silk_LTP_vq_ptrs_Q7[ psDec->indices.PERIndex ]; /* set pointer to start of codebook */ - - for( k = 0; k < psDec->nb_subfr; k++ ) { - Ix = psDec->indices.LTPIndex[ k ]; - for( i = 0; i < LTP_ORDER; i++ ) { - psDecCtrl->LTPCoef_Q14[ k * LTP_ORDER + i ] = silk_LSHIFT( cbk_ptr_Q7[ Ix * LTP_ORDER + i ], 7 ); - } - } - - /**********************/ - /* Decode LTP scaling */ - /**********************/ - Ix = psDec->indices.LTP_scaleIndex; - psDecCtrl->LTP_scale_Q14 = silk_LTPScales_table_Q14[ Ix ]; - } else { - silk_memset( psDecCtrl->pitchL, 0, psDec->nb_subfr * sizeof( opus_int ) ); - silk_memset( psDecCtrl->LTPCoef_Q14, 0, LTP_ORDER * psDec->nb_subfr * sizeof( opus_int16 ) ); - psDec->indices.PERIndex = 0; - psDecCtrl->LTP_scale_Q14 = 0; - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/decode_pitch.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/decode_pitch.c deleted file mode 100644 index fedbc6a5..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/decode_pitch.c +++ /dev/null @@ -1,77 +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 - -/*********************************************************** -* Pitch analyser function -********************************************************** */ -#include "SigProc_FIX.h" -#include "pitch_est_defines.h" - -void silk_decode_pitch( - opus_int16 lagIndex, /* I */ - opus_int8 contourIndex, /* O */ - opus_int pitch_lags[], /* O 4 pitch values */ - const opus_int Fs_kHz, /* I sampling frequency (kHz) */ - const opus_int nb_subfr /* I number of sub frames */ -) -{ - opus_int lag, k, min_lag, max_lag, cbk_size; - const opus_int8 *Lag_CB_ptr; - - if( Fs_kHz == 8 ) { - if( nb_subfr == PE_MAX_NB_SUBFR ) { - 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 ); - Lag_CB_ptr = &silk_CB_lags_stage2_10_ms[ 0 ][ 0 ]; - cbk_size = PE_NB_CBKS_STAGE2_10MS; - } - } else { - if( nb_subfr == PE_MAX_NB_SUBFR ) { - 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 ); - Lag_CB_ptr = &silk_CB_lags_stage3_10_ms[ 0 ][ 0 ]; - cbk_size = PE_NB_CBKS_STAGE3_10MS; - } - } - - min_lag = silk_SMULBB( PE_MIN_LAG_MS, Fs_kHz ); - max_lag = silk_SMULBB( PE_MAX_LAG_MS, Fs_kHz ); - lag = min_lag + lagIndex; - - for( k = 0; k < nb_subfr; k++ ) { - pitch_lags[ k ] = lag + matrix_ptr( Lag_CB_ptr, k, contourIndex, cbk_size ); - pitch_lags[ k ] = silk_LIMIT( pitch_lags[ k ], min_lag, max_lag ); - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/decode_pulses.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/decode_pulses.c deleted file mode 100644 index e8a87c2a..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/decode_pulses.c +++ /dev/null @@ -1,115 +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" - -/*********************************************/ -/* Decode quantization indices of excitation */ -/*********************************************/ -void silk_decode_pulses( - ec_dec *psRangeDec, /* I/O Compressor data structure */ - opus_int pulses[], /* O Excitation signal */ - const opus_int signalType, /* I Sigtype */ - const opus_int quantOffsetType, /* I quantOffsetType */ - const opus_int frame_length /* I Frame length */ -) -{ - 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; - const opus_uint8 *cdf_ptr; - - /*********************/ - /* Decode rate level */ - /*********************/ - RateLevelIndex = ec_dec_icdf( psRangeDec, silk_rate_levels_iCDF[ signalType >> 1 ], 8 ); - - /* Calculate number of shell blocks */ - 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 */ - iter++; - } - - /***************************************************/ - /* Sum-Weighted-Pulses Decoding */ - /***************************************************/ - cdf_ptr = silk_pulses_per_block_iCDF[ RateLevelIndex ]; - for( i = 0; i < iter; i++ ) { - nLshifts[ i ] = 0; - sum_pulses[ i ] = ec_dec_icdf( psRangeDec, cdf_ptr, 8 ); - - /* LSB indication */ - while( sum_pulses[ i ] == MAX_PULSES + 1 ) { - nLshifts[ i ]++; - /* When we've already got 10 LSBs, we shift the table to not allow (MAX_PULSES + 1) */ - sum_pulses[ i ] = ec_dec_icdf( psRangeDec, - silk_pulses_per_block_iCDF[ N_RATE_LEVELS - 1] + ( nLshifts[ i ] == 10 ), 8 ); - } - } - - /***************************************************/ - /* Shell decoding */ - /***************************************************/ - for( i = 0; i < iter; i++ ) { - 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 ) ); - } - } - - /***************************************************/ - /* LSB Decoding */ - /***************************************************/ - for( i = 0; i < iter; i++ ) { - if( nLshifts[ i ] > 0 ) { - nLS = nLshifts[ i ]; - pulses_ptr = &pulses[ silk_SMULBB( i, SHELL_CODEC_FRAME_LENGTH ) ]; - for( k = 0; k < SHELL_CODEC_FRAME_LENGTH; k++ ) { - abs_q = pulses_ptr[ k ]; - for( j = 0; j < nLS; j++ ) { - abs_q = silk_LSHIFT( abs_q, 1 ); - abs_q += ec_dec_icdf( psRangeDec, silk_lsb_iCDF, 8 ); - } - pulses_ptr[ k ] = abs_q; - } - /* Mark the number of pulses non-zero for sign decoding. */ - sum_pulses[ i ] |= nLS << 5; - } - } - - /****************************************/ - /* Decode and add signs to pulse signal */ - /****************************************/ - silk_decode_signs( psRangeDec, pulses, frame_length, signalType, quantOffsetType, sum_pulses ); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/decoder_set_fs.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/decoder_set_fs.c deleted file mode 100644 index eef0fd25..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/decoder_set_fs.c +++ /dev/null @@ -1,108 +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" - -/* Set decoder sampling rate */ -opus_int silk_decoder_set_fs( - silk_decoder_state *psDec, /* I/O Decoder state pointer */ - opus_int fs_kHz, /* I Sampling frequency (kHz) */ - opus_int32 fs_API_Hz /* I API Sampling frequency (Hz) */ -) -{ - 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 ); - - /* New (sub)frame length */ - psDec->subfr_length = silk_SMULBB( SUB_FRAME_LENGTH_MS, fs_kHz ); - frame_length = silk_SMULBB( psDec->nb_subfr, psDec->subfr_length ); - - /* Initialize resampler when switching internal or external sampling frequency */ - if( psDec->fs_kHz != fs_kHz || psDec->fs_API_hz != fs_API_Hz ) { - /* Initialize the resampler for dec_API.c preparing resampling from fs_kHz to API_fs_Hz */ - ret += silk_resampler_init( &psDec->resampler_state, silk_SMULBB( fs_kHz, 1000 ), fs_API_Hz, 0 ); - - psDec->fs_API_hz = fs_API_Hz; - } - - if( psDec->fs_kHz != fs_kHz || frame_length != psDec->frame_length ) { - if( fs_kHz == 8 ) { - if( psDec->nb_subfr == MAX_NB_SUBFR ) { - psDec->pitch_contour_iCDF = silk_pitch_contour_NB_iCDF; - } else { - psDec->pitch_contour_iCDF = silk_pitch_contour_10_ms_NB_iCDF; - } - } else { - if( psDec->nb_subfr == MAX_NB_SUBFR ) { - psDec->pitch_contour_iCDF = silk_pitch_contour_iCDF; - } else { - psDec->pitch_contour_iCDF = silk_pitch_contour_10_ms_iCDF; - } - } - if( psDec->fs_kHz != fs_kHz ) { - psDec->ltp_mem_length = silk_SMULBB( LTP_MEM_LENGTH_MS, fs_kHz ); - if( fs_kHz == 8 || fs_kHz == 12 ) { - psDec->LPC_order = MIN_LPC_ORDER; - psDec->psNLSF_CB = &silk_NLSF_CB_NB_MB; - } else { - psDec->LPC_order = MAX_LPC_ORDER; - psDec->psNLSF_CB = &silk_NLSF_CB_WB; - } - if( fs_kHz == 16 ) { - psDec->pitch_lag_low_bits_iCDF = silk_uniform8_iCDF; - } else if( fs_kHz == 12 ) { - psDec->pitch_lag_low_bits_iCDF = silk_uniform6_iCDF; - } else if( fs_kHz == 8 ) { - psDec->pitch_lag_low_bits_iCDF = silk_uniform4_iCDF; - } else { - /* unsupported sampling rate */ - silk_assert( 0 ); - } - psDec->first_frame_after_reset = 1; - psDec->lagPrev = 100; - psDec->LastGainIndex = 10; - psDec->prevSignalType = TYPE_NO_VOICE_ACTIVITY; - silk_memset( psDec->outBuf, 0, sizeof(psDec->outBuf)); - silk_memset( psDec->sLPC_Q14_buf, 0, sizeof(psDec->sLPC_Q14_buf) ); - } - - psDec->fs_kHz = fs_kHz; - psDec->frame_length = frame_length; - } - - /* Check that settings are valid */ - silk_assert( psDec->frame_length > 0 && psDec->frame_length <= MAX_FRAME_LENGTH ); - - return ret; -} - diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/define.h b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/define.h deleted file mode 100644 index c47aca9f..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/define.h +++ /dev/null @@ -1,235 +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. -***********************************************************************/ - -#ifndef SILK_DEFINE_H -#define SILK_DEFINE_H - -#include "errors.h" -#include "typedef.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -/* Max number of encoder channels (1/2) */ -#define ENCODER_NUM_CHANNELS 2 -/* Number of decoder channels (1/2) */ -#define DECODER_NUM_CHANNELS 2 - -#define MAX_FRAMES_PER_PACKET 3 - -/* 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 -#define LBRR_MB_MIN_RATE_BPS 14000 -#define LBRR_WB_MIN_RATE_BPS 16000 - -/* DTX settings */ -#define NB_SPEECH_FRAMES_BEFORE_DTX 10 /* eq 200 ms */ -#define MAX_CONSECUTIVE_DTX 20 /* eq 400 ms */ - -/* Maximum sampling frequency */ -#define MAX_FS_KHZ 16 -#define MAX_API_FS_KHZ 48 - -/* Signal types */ -#define TYPE_NO_VOICE_ACTIVITY 0 -#define TYPE_UNVOICED 1 -#define TYPE_VOICED 2 - -/* Conditional coding types */ -#define CODE_INDEPENDENTLY 0 -#define CODE_INDEPENDENTLY_NO_LTP_SCALING 1 -#define CODE_CONDITIONALLY 2 - -/* Settings for stereo processing */ -#define STEREO_QUANT_TAB_SIZE 16 -#define STEREO_QUANT_SUB_STEPS 5 -#define STEREO_INTERP_LEN_MS 8 /* must be even */ -#define STEREO_RATIO_SMOOTH_COEF 0.01 /* smoothing coef for signal norms and stereo width */ - -/* Range of pitch lag estimates */ -#define PITCH_EST_MIN_LAG_MS 2 /* 2 ms -> 500 Hz */ -#define PITCH_EST_MAX_LAG_MS 18 /* 18 ms -> 56 Hz */ - -/* Maximum number of subframes */ -#define MAX_NB_SUBFR 4 - -/* Number of samples per frame */ -#define LTP_MEM_LENGTH_MS 20 -#define SUB_FRAME_LENGTH_MS 5 -#define MAX_SUB_FRAME_LENGTH ( SUB_FRAME_LENGTH_MS * MAX_FS_KHZ ) -#define MAX_FRAME_LENGTH_MS ( SUB_FRAME_LENGTH_MS * MAX_NB_SUBFR ) -#define MAX_FRAME_LENGTH ( MAX_FRAME_LENGTH_MS * MAX_FS_KHZ ) - -/* Milliseconds of lookahead for pitch analysis */ -#define LA_PITCH_MS 2 -#define LA_PITCH_MAX ( LA_PITCH_MS * MAX_FS_KHZ ) - -/* Order of LPC used in find pitch */ -#define MAX_FIND_PITCH_LPC_ORDER 16 - -/* Length of LPC window used in find pitch */ -#define FIND_PITCH_LPC_WIN_MS ( 20 + (LA_PITCH_MS << 1) ) -#define FIND_PITCH_LPC_WIN_MS_2_SF ( 10 + (LA_PITCH_MS << 1) ) -#define FIND_PITCH_LPC_WIN_MAX ( FIND_PITCH_LPC_WIN_MS * MAX_FS_KHZ ) - -/* Milliseconds of lookahead for noise shape analysis */ -#define LA_SHAPE_MS 5 -#define LA_SHAPE_MAX ( LA_SHAPE_MS * MAX_FS_KHZ ) - -/* Maximum length of LPC window used in noise shape analysis */ -#define SHAPE_LPC_WIN_MAX ( 15 * MAX_FS_KHZ ) - -/* dB level of lowest gain quantization level */ -#define MIN_QGAIN_DB 2 -/* dB level of highest gain quantization level */ -#define MAX_QGAIN_DB 88 -/* Number of gain quantization levels */ -#define N_LEVELS_QGAIN 64 -/* Max increase in gain quantization index */ -#define MAX_DELTA_GAIN_QUANT 36 -/* Max decrease in gain quantization index */ -#define MIN_DELTA_GAIN_QUANT -4 - -/* Quantization offsets (multiples of 4) */ -#define OFFSET_VL_Q10 32 -#define OFFSET_VH_Q10 100 -#define OFFSET_UVL_Q10 100 -#define OFFSET_UVH_Q10 240 - -#define QUANT_LEVEL_ADJUST_Q10 80 - -/* Maximum numbers of iterations used to stabilize an LPC vector */ -#define MAX_LPC_STABILIZE_ITERATIONS 16 -#define MAX_PREDICTION_POWER_GAIN 1e4f -#define MAX_PREDICTION_POWER_GAIN_AFTER_RESET 1e2f - -#define MAX_LPC_ORDER 16 -#define MIN_LPC_ORDER 10 - -/* Find Pred Coef defines */ -#define LTP_ORDER 5 - -/* LTP quantization settings */ -#define NB_LTP_CBKS 3 - -/* Flag to use harmonic noise shaping */ -#define USE_HARM_SHAPING 1 - -/* Max LPC order of noise shaping filters */ -#define MAX_SHAPE_LPC_ORDER 16 - -#define HARM_SHAPE_FIR_TAPS 3 - -/* Maximum number of delayed decision states */ -#define MAX_DEL_DEC_STATES 4 - -#define LTP_BUF_LENGTH 512 -#define LTP_MASK ( LTP_BUF_LENGTH - 1 ) - -#define DECISION_DELAY 32 -#define DECISION_DELAY_MASK ( DECISION_DELAY - 1 ) - -/* Number of subframes for excitation entropy coding */ -#define SHELL_CODEC_FRAME_LENGTH 16 -#define LOG2_SHELL_CODEC_FRAME_LENGTH 4 -#define MAX_NB_SHELL_BLOCKS ( MAX_FRAME_LENGTH / SHELL_CODEC_FRAME_LENGTH ) - -/* Number of rate levels, for entropy coding of excitation */ -#define N_RATE_LEVELS 10 - -/* Maximum sum of pulses per shell coding frame */ -#define 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 */ -/***************************/ -#define VAD_N_BANDS 4 - -#define VAD_INTERNAL_SUBFRAMES_LOG2 2 -#define VAD_INTERNAL_SUBFRAMES ( 1 << VAD_INTERNAL_SUBFRAMES_LOG2 ) - -#define VAD_NOISE_LEVEL_SMOOTH_COEF_Q16 1024 /* Must be < 4096 */ -#define VAD_NOISE_LEVELS_BIAS 50 - -/* Sigmoid settings */ -#define VAD_NEGATIVE_OFFSET_Q5 128 /* sigmoid is 0 at -128 */ -#define VAD_SNR_FACTOR_Q16 45000 - -/* smoothing for SNR measurement */ -#define VAD_SNR_SMOOTH_COEF_Q18 4096 - -/* Size of the piecewise linear cosine approximation table for the LSFs */ -#define LSF_COS_TAB_SZ_FIX 128 - -/******************/ -/* NLSF quantizer */ -/******************/ -#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 -#define NLSF_QUANT_DEL_DEC_STATES_LOG2 2 -#define NLSF_QUANT_DEL_DEC_STATES ( 1 << NLSF_QUANT_DEL_DEC_STATES_LOG2 ) - -/* Transition filtering for mode switching */ -#define TRANSITION_TIME_MS 5120 /* 5120 = 64 * FRAME_LENGTH_MS * ( TRANSITION_INT_NUM - 1 ) = 64*(20*4)*/ -#define TRANSITION_NB 3 /* Hardcoded in tables */ -#define TRANSITION_NA 2 /* Hardcoded in tables */ -#define TRANSITION_INT_NUM 5 /* Hardcoded in tables */ -#define TRANSITION_FRAMES ( TRANSITION_TIME_MS / MAX_FRAME_LENGTH_MS ) -#define TRANSITION_INT_STEPS ( TRANSITION_FRAMES / ( TRANSITION_INT_NUM - 1 ) ) - -/* BWE factors to apply after packet loss */ -#define BWE_AFTER_LOSS_Q16 63570 - -/* Defines for CN generation */ -#define CNG_BUF_MASK_MAX 255 /* 2^floor(log2(MAX_FRAME_LENGTH))-1 */ -#define CNG_GAIN_SMTH_Q16 4634 /* 0.25^(1/4) */ -#define CNG_NLSF_SMTH_Q16 16348 /* 0.25 */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/enc_API.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/enc_API.c deleted file mode 100644 index 43739efc..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/enc_API.c +++ /dev/null @@ -1,556 +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 "define.h" -#include "API.h" -#include "control.h" -#include "typedef.h" -#include "stack_alloc.h" -#include "structs.h" -#include "tuning_parameters.h" -#ifdef FIXED_POINT -#include "main_FIX.h" -#else -#include "main_FLP.h" -#endif - -/***************************************/ -/* Read control structure from encoder */ -/***************************************/ -static opus_int silk_QueryEncoder( /* O Returns error code */ - const void *encState, /* I State */ - silk_EncControlStruct *encStatus /* O Encoder Status */ -); - -/****************************************/ -/* Encoder functions */ -/****************************************/ - -opus_int silk_Get_Encoder_Size( /* O Returns error code */ - opus_int *encSizeBytes /* O Number of bytes in SILK encoder state */ -) -{ - opus_int ret = SILK_NO_ERROR; - - *encSizeBytes = sizeof( silk_encoder ); - - return ret; -} - -/*************************/ -/* Init or Reset encoder */ -/*************************/ -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 */ -) -{ - silk_encoder *psEnc; - opus_int n, ret = SILK_NO_ERROR; - - psEnc = (silk_encoder *)encState; - - /* 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 ], arch ) ) { - silk_assert( 0 ); - } - } - - psEnc->nChannelsAPI = 1; - psEnc->nChannelsInternal = 1; - - /* Read control structure */ - if( ret += silk_QueryEncoder( encState, encStatus ) ) { - silk_assert( 0 ); - } - - return ret; -} - -/***************************************/ -/* Read control structure from encoder */ -/***************************************/ -static opus_int silk_QueryEncoder( /* O Returns error code */ - const void *encState, /* I State */ - silk_EncControlStruct *encStatus /* O Encoder Status */ -) -{ - opus_int ret = SILK_NO_ERROR; - silk_encoder_state_Fxx *state_Fxx; - silk_encoder *psEnc = (silk_encoder *)encState; - - state_Fxx = psEnc->state_Fxx; - - encStatus->nChannelsAPI = psEnc->nChannelsAPI; - encStatus->nChannelsInternal = psEnc->nChannelsInternal; - encStatus->API_sampleRate = state_Fxx[ 0 ].sCmn.API_fs_Hz; - encStatus->maxInternalSampleRate = state_Fxx[ 0 ].sCmn.maxInternal_fs_Hz; - encStatus->minInternalSampleRate = state_Fxx[ 0 ].sCmn.minInternal_fs_Hz; - encStatus->desiredInternalSampleRate = state_Fxx[ 0 ].sCmn.desiredInternal_fs_Hz; - encStatus->payloadSize_ms = state_Fxx[ 0 ].sCmn.PacketSize_ms; - encStatus->bitRate = state_Fxx[ 0 ].sCmn.TargetRate_bps; - encStatus->packetLossPercentage = state_Fxx[ 0 ].sCmn.PacketLoss_perc; - encStatus->complexity = state_Fxx[ 0 ].sCmn.Complexity; - encStatus->useInBandFEC = state_Fxx[ 0 ].sCmn.useInBandFEC; - encStatus->useDTX = state_Fxx[ 0 ].sCmn.useDTX; - encStatus->useCBR = state_Fxx[ 0 ].sCmn.useCBR; - encStatus->internalSampleRate = silk_SMULBB( state_Fxx[ 0 ].sCmn.fs_kHz, 1000 ); - encStatus->allowBandwidthSwitch = state_Fxx[ 0 ].sCmn.allow_bandwidth_switch; - encStatus->inWBmodeWithoutVariableLP = state_Fxx[ 0 ].sCmn.fs_kHz == 16 && state_Fxx[ 0 ].sCmn.sLP.mode == 0; - - return ret; -} - - -/**************************/ -/* Encode frame with Silk */ -/**************************/ -/* Note: if prefillFlag is set, the input must contain 10 ms of audio, irrespective of what */ -/* encControl->payloadSize_ms is set to */ -opus_int silk_Encode( /* O Returns error code */ - void *encState, /* I/O State */ - silk_EncControlStruct *encControl, /* I Control status */ - const opus_int16 *samplesIn, /* I Speech sample input vector */ - 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 */ -) -{ - opus_int n, i, nBits, flags, tmp_payloadSize_ms = 0, tmp_complexity = 0, ret = 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; - 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 ); - RESTORE_STACK; - return ret; - } - - encControl->switchReady = 0; - - if( encControl->nChannelsInternal > psEnc->nChannelsInternal ) { - /* Mono -> Stereo transition: init state of second channel and stereo state */ - 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; - psEnc->sStereo.mid_side_amp_Q0[ 1 ] = 1; - psEnc->sStereo.mid_side_amp_Q0[ 2 ] = 0; - psEnc->sStereo.mid_side_amp_Q0[ 3 ] = 1; - psEnc->sStereo.width_prev_Q14 = 0; - psEnc->sStereo.smth_width_Q14 = SILK_FIX_CONST( 1, 14 ); - if( psEnc->nChannelsAPI == 2 ) { - silk_memcpy( &psEnc->state_Fxx[ 1 ].sCmn.resampler_state, &psEnc->state_Fxx[ 0 ].sCmn.resampler_state, sizeof( silk_resampler_state_struct ) ); - silk_memcpy( &psEnc->state_Fxx[ 1 ].sCmn.In_HP_State, &psEnc->state_Fxx[ 0 ].sCmn.In_HP_State, sizeof( psEnc->state_Fxx[ 1 ].sCmn.In_HP_State ) ); - } - } - - transition = (encControl->payloadSize_ms != psEnc->state_Fxx[ 0 ].sCmn.PacketSize_ms) || (psEnc->nChannelsInternal != encControl->nChannelsInternal); - - psEnc->nChannelsAPI = encControl->nChannelsAPI; - psEnc->nChannelsInternal = encControl->nChannelsInternal; - - nBlocksOf10ms = silk_DIV32( 100 * nSamplesIn, encControl->API_sampleRate ); - tot_blocks = ( nBlocksOf10ms > 1 ) ? nBlocksOf10ms >> 1 : 1; - curr_block = 0; - if( prefillFlag ) { - /* Only accept input length of 10 ms */ - if( nBlocksOf10ms != 1 ) { - silk_assert( 0 ); - RESTORE_STACK; - return SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES; - } - /* Reset Encoder */ - for( n = 0; n < encControl->nChannelsInternal; n++ ) { - ret = silk_init_encoder( &psEnc->state_Fxx[ n ], psEnc->state_Fxx[ n ].sCmn.arch ); - silk_assert( !ret ); - } - tmp_payloadSize_ms = encControl->payloadSize_ms; - encControl->payloadSize_ms = 10; - tmp_complexity = encControl->complexity; - encControl->complexity = 0; - for( n = 0; n < encControl->nChannelsInternal; n++ ) { - psEnc->state_Fxx[ n ].sCmn.controlled_since_last_payload = 0; - psEnc->state_Fxx[ n ].sCmn.prefillFlag = 1; - } - } else { - /* Only accept input lengths that are a multiple of 10 ms */ - if( nBlocksOf10ms * encControl->API_sampleRate != 100 * nSamplesIn || nSamplesIn < 0 ) { - silk_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 ) { - silk_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 ) { - silk_assert( 0 ); - RESTORE_STACK; - return ret; - } - if( psEnc->state_Fxx[n].sCmn.first_frame_after_reset || transition ) { - for( i = 0; i < psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket; i++ ) { - psEnc->state_Fxx[ n ].sCmn.LBRR_flags[ i ] = 0; - } - } - 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 ); - - /* 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, 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 ) { - opus_int id = psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded; - for( n = 0; n < nSamplesFromInput; n++ ) { - buf[ n ] = samplesIn[ 2 * n ]; - } - /* Making sure to start both resamplers from the same state when switching from mono to stereo */ - if( psEnc->nPrevChannelsInternal == 1 && id==0 ) { - silk_memcpy( &psEnc->state_Fxx[ 1 ].sCmn.resampler_state, &psEnc->state_Fxx[ 0 ].sCmn.resampler_state, sizeof(psEnc->state_Fxx[ 1 ].sCmn.resampler_state)); - } - - 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 ); - psEnc->state_Fxx[ 0 ].sCmn.inputBufIx += nSamplesToBuffer; - - nSamplesToBuffer = psEnc->state_Fxx[ 1 ].sCmn.frame_length - psEnc->state_Fxx[ 1 ].sCmn.inputBufIx; - nSamplesToBuffer = silk_min( nSamplesToBuffer, 10 * nBlocksOf10ms * psEnc->state_Fxx[ 1 ].sCmn.fs_kHz ); - for( n = 0; n < nSamplesFromInput; n++ ) { - buf[ n ] = samplesIn[ 2 * n + 1 ]; - } - ret += silk_resampler( &psEnc->state_Fxx[ 1 ].sCmn.resampler_state, - &psEnc->state_Fxx[ 1 ].sCmn.inputBuf[ psEnc->state_Fxx[ 1 ].sCmn.inputBufIx + 2 ], buf, nSamplesFromInput ); - - psEnc->state_Fxx[ 1 ].sCmn.inputBufIx += nSamplesToBuffer; - } else if( encControl->nChannelsAPI == 2 && encControl->nChannelsInternal == 1 ) { - /* Combine left and right channels before resampling */ - for( n = 0; n < nSamplesFromInput; n++ ) { - sum = samplesIn[ 2 * n ] + samplesIn[ 2 * n + 1 ]; - buf[ n ] = (opus_int16)silk_RSHIFT_ROUND( sum, 1 ); - } - 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 ); - /* On the first mono frame, average the results for the two resampler states */ - if( psEnc->nPrevChannelsInternal == 2 && psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded == 0 ) { - ret += silk_resampler( &psEnc->state_Fxx[ 1 ].sCmn.resampler_state, - &psEnc->state_Fxx[ 1 ].sCmn.inputBuf[ psEnc->state_Fxx[ 1 ].sCmn.inputBufIx + 2 ], buf, nSamplesFromInput ); - for( n = 0; n < psEnc->state_Fxx[ 0 ].sCmn.frame_length; n++ ) { - psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ psEnc->state_Fxx[ 0 ].sCmn.inputBufIx+n+2 ] = - silk_RSHIFT(psEnc->state_Fxx[ 0 ].sCmn.inputBuf[ psEnc->state_Fxx[ 0 ].sCmn.inputBufIx+n+2 ] - + psEnc->state_Fxx[ 1 ].sCmn.inputBuf[ psEnc->state_Fxx[ 1 ].sCmn.inputBufIx+n+2 ], 1); - } - } - psEnc->state_Fxx[ 0 ].sCmn.inputBufIx += nSamplesToBuffer; - } else { - silk_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 ); - psEnc->state_Fxx[ 0 ].sCmn.inputBufIx += nSamplesToBuffer; - } - - samplesIn += nSamplesFromInput * encControl->nChannelsAPI; - nSamplesIn -= nSamplesFromInput; - - /* Default */ - psEnc->allowBandwidthSwitch = 0; - - /* 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 ); - - /* Deal with LBRR data */ - if( psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded == 0 && !prefillFlag ) { - /* Create space at start of payload for VAD and FEC flags */ - opus_uint8 iCDF[ 2 ] = { 0, 0 }; - iCDF[ 0 ] = 256 - silk_RSHIFT( 256, ( psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket + 1 ) * encControl->nChannelsInternal ); - ec_enc_icdf( psRangeEnc, 0, iCDF, 8 ); - - /* Encode any LBRR data from previous packet */ - /* Encode LBRR flags */ - for( n = 0; n < encControl->nChannelsInternal; n++ ) { - LBRR_symbol = 0; - for( i = 0; i < psEnc->state_Fxx[ n ].sCmn.nFramesPerPacket; i++ ) { - LBRR_symbol |= silk_LSHIFT( psEnc->state_Fxx[ n ].sCmn.LBRR_flags[ i ], i ); - } - psEnc->state_Fxx[ n ].sCmn.LBRR_flag = LBRR_symbol > 0 ? 1 : 0; - if( LBRR_symbol && psEnc->state_Fxx[ n ].sCmn.nFramesPerPacket > 1 ) { - ec_enc_icdf( psRangeEnc, LBRR_symbol - 1, silk_LBRR_flags_iCDF_ptr[ psEnc->state_Fxx[ n ].sCmn.nFramesPerPacket - 2 ], 8 ); - } - } - - /* Code LBRR indices and excitation signals */ - for( i = 0; i < psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket; i++ ) { - for( n = 0; n < encControl->nChannelsInternal; n++ ) { - if( psEnc->state_Fxx[ n ].sCmn.LBRR_flags[ i ] ) { - opus_int condCoding; - - if( encControl->nChannelsInternal == 2 && n == 0 ) { - silk_stereo_encode_pred( psRangeEnc, psEnc->sStereo.predIx[ i ] ); - /* For LBRR data there's no need to code the mid-only flag if the side-channel LBRR flag is set */ - if( psEnc->state_Fxx[ 1 ].sCmn.LBRR_flags[ i ] == 0 ) { - silk_stereo_encode_mid_only( psRangeEnc, psEnc->sStereo.mid_only_flags[ i ] ); - } - } - /* Use conditional coding if previous frame available */ - if( i > 0 && psEnc->state_Fxx[ n ].sCmn.LBRR_flags[ i - 1 ] ) { - condCoding = CODE_CONDITIONALLY; - } else { - condCoding = CODE_INDEPENDENTLY; - } - silk_encode_indices( &psEnc->state_Fxx[ n ].sCmn, psRangeEnc, i, 1, condCoding ); - silk_encode_pulses( psRangeEnc, psEnc->state_Fxx[ n ].sCmn.indices_LBRR[i].signalType, psEnc->state_Fxx[ n ].sCmn.indices_LBRR[i].quantOffsetType, - psEnc->state_Fxx[ n ].sCmn.pulses_LBRR[ i ], psEnc->state_Fxx[ n ].sCmn.frame_length ); - } - } - } - - /* 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 ) ); - } - } - - 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 */ - if( !prefillFlag ) { - nBits -= ec_tell( psRangeEnc ) >> 1; - } - /* 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 ); - /* 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 */ - TargetRate_bps -= silk_DIV32_16( silk_MUL( psEnc->nBitsExceeded, 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 ], - MStargetRates_bps, TargetRate_bps, psEnc->state_Fxx[ 0 ].sCmn.speech_activity_Q8, encControl->toMono, - psEnc->state_Fxx[ 0 ].sCmn.fs_kHz, psEnc->state_Fxx[ 0 ].sCmn.frame_length ); - if( psEnc->sStereo.mid_only_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ] == 0 ) { - /* 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 ) ); - psEnc->state_Fxx[ 1 ].sCmn.prevLag = 100; - psEnc->state_Fxx[ 1 ].sCmn.sNSQ.lagPrev = 100; - psEnc->state_Fxx[ 1 ].sShape.LastGainIndex = 10; - psEnc->state_Fxx[ 1 ].sCmn.prevSignalType = TYPE_NO_VOICE_ACTIVITY; - 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 ] ); - } else { - psEnc->state_Fxx[ 1 ].sCmn.VAD_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ] = 0; - } - if( !prefillFlag ) { - silk_stereo_encode_pred( psRangeEnc, psEnc->sStereo.predIx[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ] ); - if( psEnc->state_Fxx[ 1 ].sCmn.VAD_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ] == 0 ) { - silk_stereo_encode_mid_only( psRangeEnc, psEnc->sStereo.mid_only_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ] ); - } - } - } else { - /* Buffering */ - 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 ] ); - - /* Encode */ - for( n = 0; n < encControl->nChannelsInternal; n++ ) { - opus_int maxBits, useCBR; - - /* Handling rate constraints */ - maxBits = encControl->maxBits; - if( tot_blocks == 2 && curr_block == 0 ) { - maxBits = maxBits * 3 / 5; - } else if( tot_blocks == 3 ) { - if( curr_block == 0 ) { - maxBits = maxBits * 2 / 5; - } else if( curr_block == 1 ) { - maxBits = maxBits * 3 / 4; - } - } - useCBR = encControl->useCBR && curr_block == tot_blocks - 1; - - if( encControl->nChannelsInternal == 1 ) { - channelRate_bps = TargetRate_bps; - } else { - channelRate_bps = MStargetRates_bps[ n ]; - if( n == 0 && MStargetRates_bps[ 1 ] > 0 ) { - useCBR = 0; - /* Give mid up to 1/2 of the max bits for that frame */ - maxBits -= encControl->maxBits / ( tot_blocks * 2 ); - } - } - - if( channelRate_bps > 0 ) { - opus_int condCoding; - - silk_control_SNR( &psEnc->state_Fxx[ n ].sCmn, channelRate_bps ); - - /* Use independent coding if no previous frame available */ - if( psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded - n <= 0 ) { - condCoding = CODE_INDEPENDENTLY; - } else if( n > 0 && psEnc->prev_decode_only_middle ) { - /* If we skipped a side frame in this packet, we don't - need LTP scaling; the LTP state is well-defined. */ - condCoding = CODE_INDEPENDENTLY_NO_LTP_SCALING; - } else { - condCoding = CODE_CONDITIONALLY; - } - if( ( ret = silk_encode_frame_Fxx( &psEnc->state_Fxx[ n ], nBytesOut, psRangeEnc, condCoding, maxBits, useCBR ) ) != 0 ) { - silk_assert( 0 ); - } - } - psEnc->state_Fxx[ n ].sCmn.controlled_since_last_payload = 0; - psEnc->state_Fxx[ n ].sCmn.inputBufIx = 0; - psEnc->state_Fxx[ n ].sCmn.nFramesEncoded++; - } - psEnc->prev_decode_only_middle = psEnc->sStereo.mid_only_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded - 1 ]; - - /* Insert VAD and FEC flags at beginning of bitstream */ - if( *nBytesOut > 0 && psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded == psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket) { - flags = 0; - for( n = 0; n < encControl->nChannelsInternal; n++ ) { - for( i = 0; i < psEnc->state_Fxx[ n ].sCmn.nFramesPerPacket; i++ ) { - flags = silk_LSHIFT( flags, 1 ); - flags |= psEnc->state_Fxx[ n ].sCmn.VAD_flags[ i ]; - } - flags = silk_LSHIFT( flags, 1 ); - flags |= psEnc->state_Fxx[ n ].sCmn.LBRR_flag; - } - if( !prefillFlag ) { - ec_enc_patch_initial_bits( psRangeEnc, flags, ( psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket + 1 ) * encControl->nChannelsInternal ); - } - - /* Return zero bytes if all channels DTXed */ - if( psEnc->state_Fxx[ 0 ].sCmn.inDTX && ( encControl->nChannelsInternal == 1 || psEnc->state_Fxx[ 1 ].sCmn.inDTX ) ) { - *nBytesOut = 0; - } - - psEnc->nBitsExceeded += *nBytesOut * 8; - psEnc->nBitsExceeded -= silk_DIV32_16( silk_MUL( encControl->bitRate, encControl->payloadSize_ms ), 1000 ); - psEnc->nBitsExceeded = silk_LIMIT( psEnc->nBitsExceeded, 0, 10000 ); - - /* Update flag indicating if bandwidth switching is allowed */ - speech_act_thr_for_switch_Q8 = silk_SMLAWB( SILK_FIX_CONST( SPEECH_ACTIVITY_DTX_THRES, 8 ), - SILK_FIX_CONST( ( 1 - SPEECH_ACTIVITY_DTX_THRES ) / MAX_BANDWIDTH_SWITCH_DELAY_MS, 16 + 8 ), psEnc->timeSinceSwitchAllowed_ms ); - if( psEnc->state_Fxx[ 0 ].sCmn.speech_activity_Q8 < speech_act_thr_for_switch_Q8 ) { - psEnc->allowBandwidthSwitch = 1; - psEnc->timeSinceSwitchAllowed_ms = 0; - } else { - psEnc->allowBandwidthSwitch = 0; - psEnc->timeSinceSwitchAllowed_ms += encControl->payloadSize_ms; - } - } - - if( nSamplesIn == 0 ) { - break; - } - } else { - break; - } - curr_block++; - } - - psEnc->nPrevChannelsInternal = encControl->nChannelsInternal; - - encControl->allowBandwidthSwitch = psEnc->allowBandwidthSwitch; - encControl->inWBmodeWithoutVariableLP = psEnc->state_Fxx[ 0 ].sCmn.fs_kHz == 16 && psEnc->state_Fxx[ 0 ].sCmn.sLP.mode == 0; - encControl->internalSampleRate = silk_SMULBB( psEnc->state_Fxx[ 0 ].sCmn.fs_kHz, 1000 ); - encControl->stereoWidth_Q14 = encControl->toMono ? 0 : psEnc->sStereo.smth_width_Q14; - if( prefillFlag ) { - encControl->payloadSize_ms = tmp_payloadSize_ms; - encControl->complexity = tmp_complexity; - for( n = 0; n < encControl->nChannelsInternal; n++ ) { - psEnc->state_Fxx[ n ].sCmn.controlled_since_last_payload = 0; - psEnc->state_Fxx[ n ].sCmn.prefillFlag = 0; - } - } - - RESTORE_STACK; - return ret; -} - diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/encode_indices.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/encode_indices.c deleted file mode 100644 index 666c8c0b..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/encode_indices.c +++ /dev/null @@ -1,181 +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" - -/* Encode side-information parameters to payload */ -void silk_encode_indices( - silk_encoder_state *psEncC, /* I/O Encoder state */ - ec_enc *psRangeEnc, /* I/O Compressor data structure */ - opus_int FrameIndex, /* I Frame number */ - opus_int encode_LBRR, /* I Flag indicating LBRR data is being encoded */ - opus_int condCoding /* I The type of conditional coding to use */ -) -{ - opus_int i, k, typeOffset; - opus_int encode_absolute_lagIndex, delta_lagIndex; - opus_int16 ec_ix[ MAX_LPC_ORDER ]; - opus_uint8 pred_Q8[ MAX_LPC_ORDER ]; - const SideInfoIndices *psIndices; - - if( encode_LBRR ) { - psIndices = &psEncC->indices_LBRR[ FrameIndex ]; - } else { - psIndices = &psEncC->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 ); - if( encode_LBRR || typeOffset >= 2 ) { - ec_enc_icdf( psRangeEnc, typeOffset - 2, silk_type_offset_VAD_iCDF, 8 ); - } else { - ec_enc_icdf( psRangeEnc, typeOffset, silk_type_offset_no_VAD_iCDF, 8 ); - } - - /****************/ - /* Encode gains */ - /****************/ - /* first subframe */ - if( condCoding == CODE_CONDITIONALLY ) { - /* conditional coding */ - silk_assert( psIndices->GainsIndices[ 0 ] >= 0 && psIndices->GainsIndices[ 0 ] < MAX_DELTA_GAIN_QUANT - MIN_DELTA_GAIN_QUANT + 1 ); - ec_enc_icdf( psRangeEnc, psIndices->GainsIndices[ 0 ], silk_delta_gain_iCDF, 8 ); - } else { - /* independent coding, in two stages: MSB bits followed by 3 LSBs */ - silk_assert( psIndices->GainsIndices[ 0 ] >= 0 && psIndices->GainsIndices[ 0 ] < N_LEVELS_QGAIN ); - ec_enc_icdf( psRangeEnc, silk_RSHIFT( psIndices->GainsIndices[ 0 ], 3 ), silk_gain_iCDF[ psIndices->signalType ], 8 ); - ec_enc_icdf( psRangeEnc, psIndices->GainsIndices[ 0 ] & 7, silk_uniform8_iCDF, 8 ); - } - - /* remaining subframes */ - for( i = 1; i < psEncC->nb_subfr; i++ ) { - silk_assert( psIndices->GainsIndices[ i ] >= 0 && psIndices->GainsIndices[ i ] < MAX_DELTA_GAIN_QUANT - MIN_DELTA_GAIN_QUANT + 1 ); - ec_enc_icdf( psRangeEnc, psIndices->GainsIndices[ i ], silk_delta_gain_iCDF, 8 ); - } - - /****************/ - /* Encode NLSFs */ - /****************/ - 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 ); - 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 ); - ec_enc_icdf( psRangeEnc, psIndices->NLSFIndices[ i+1 ] - NLSF_QUANT_MAX_AMPLITUDE, silk_NLSF_EXT_iCDF, 8 ); - } else if( psIndices->NLSFIndices[ i+1 ] <= -NLSF_QUANT_MAX_AMPLITUDE ) { - ec_enc_icdf( psRangeEnc, 0, &psEncC->psNLSF_CB->ec_iCDF[ ec_ix[ i ] ], 8 ); - ec_enc_icdf( psRangeEnc, -psIndices->NLSFIndices[ i+1 ] - NLSF_QUANT_MAX_AMPLITUDE, silk_NLSF_EXT_iCDF, 8 ); - } else { - ec_enc_icdf( psRangeEnc, psIndices->NLSFIndices[ i+1 ] + NLSF_QUANT_MAX_AMPLITUDE, &psEncC->psNLSF_CB->ec_iCDF[ ec_ix[ i ] ], 8 ); - } - } - - /* Encode NLSF interpolation factor */ - if( psEncC->nb_subfr == MAX_NB_SUBFR ) { - silk_assert( psIndices->NLSFInterpCoef_Q2 >= 0 && psIndices->NLSFInterpCoef_Q2 < 5 ); - ec_enc_icdf( psRangeEnc, psIndices->NLSFInterpCoef_Q2, silk_NLSF_interpolation_factor_iCDF, 8 ); - } - - if( psIndices->signalType == TYPE_VOICED ) - { - /*********************/ - /* Encode pitch lags */ - /*********************/ - /* lag index */ - encode_absolute_lagIndex = 1; - if( condCoding == CODE_CONDITIONALLY && psEncC->ec_prevSignalType == TYPE_VOICED ) { - /* Delta Encoding */ - delta_lagIndex = psIndices->lagIndex - psEncC->ec_prevLagIndex; - if( delta_lagIndex < -8 || delta_lagIndex > 11 ) { - delta_lagIndex = 0; - } else { - delta_lagIndex = delta_lagIndex + 9; - encode_absolute_lagIndex = 0; /* Only use delta */ - } - silk_assert( delta_lagIndex >= 0 && delta_lagIndex < 21 ); - ec_enc_icdf( psRangeEnc, delta_lagIndex, silk_pitch_delta_iCDF, 8 ); - } - if( encode_absolute_lagIndex ) { - /* Absolute encoding */ - opus_int32 pitch_high_bits, pitch_low_bits; - pitch_high_bits = silk_DIV32_16( psIndices->lagIndex, silk_RSHIFT( psEncC->fs_kHz, 1 ) ); - pitch_low_bits = psIndices->lagIndex - silk_SMULBB( pitch_high_bits, silk_RSHIFT( psEncC->fs_kHz, 1 ) ); - silk_assert( pitch_low_bits < psEncC->fs_kHz / 2 ); - silk_assert( pitch_high_bits < 32 ); - ec_enc_icdf( psRangeEnc, pitch_high_bits, silk_pitch_lag_iCDF, 8 ); - ec_enc_icdf( psRangeEnc, pitch_low_bits, psEncC->pitch_lag_low_bits_iCDF, 8 ); - } - psEncC->ec_prevLagIndex = psIndices->lagIndex; - - /* Countour index */ - silk_assert( psIndices->contourIndex >= 0 ); - silk_assert( ( psIndices->contourIndex < 34 && psEncC->fs_kHz > 8 && psEncC->nb_subfr == 4 ) || - ( psIndices->contourIndex < 11 && psEncC->fs_kHz == 8 && psEncC->nb_subfr == 4 ) || - ( psIndices->contourIndex < 12 && psEncC->fs_kHz > 8 && psEncC->nb_subfr == 2 ) || - ( psIndices->contourIndex < 3 && psEncC->fs_kHz == 8 && psEncC->nb_subfr == 2 ) ); - ec_enc_icdf( psRangeEnc, psIndices->contourIndex, psEncC->pitch_contour_iCDF, 8 ); - - /********************/ - /* Encode LTP gains */ - /********************/ - /* PERIndex value */ - silk_assert( psIndices->PERIndex >= 0 && psIndices->PERIndex < 3 ); - ec_enc_icdf( psRangeEnc, psIndices->PERIndex, silk_LTP_per_index_iCDF, 8 ); - - /* Codebook Indices */ - for( k = 0; k < psEncC->nb_subfr; k++ ) { - silk_assert( psIndices->LTPIndex[ k ] >= 0 && psIndices->LTPIndex[ k ] < ( 8 << psIndices->PERIndex ) ); - ec_enc_icdf( psRangeEnc, psIndices->LTPIndex[ k ], silk_LTP_gain_iCDF_ptrs[ psIndices->PERIndex ], 8 ); - } - - /**********************/ - /* Encode LTP scaling */ - /**********************/ - if( condCoding == CODE_INDEPENDENTLY ) { - silk_assert( psIndices->LTP_scaleIndex >= 0 && psIndices->LTP_scaleIndex < 3 ); - ec_enc_icdf( psRangeEnc, psIndices->LTP_scaleIndex, silk_LTPscale_iCDF, 8 ); - } - silk_assert( !condCoding || psIndices->LTP_scaleIndex == 0 ); - } - - psEncC->ec_prevSignalType = psIndices->signalType; - - /***************/ - /* Encode seed */ - /***************/ - silk_assert( psIndices->Seed >= 0 && psIndices->Seed < 4 ); - ec_enc_icdf( psRangeEnc, psIndices->Seed, silk_uniform4_iCDF, 8 ); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/encode_pulses.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/encode_pulses.c deleted file mode 100644 index a4501438..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/encode_pulses.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.h" -#include "stack_alloc.h" - -/*********************************************/ -/* Encode quantization indices of excitation */ -/*********************************************/ - -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 */ - opus_int len /* I number of output values */ -) -{ - opus_int k, sum; - - for( k = 0; k < len; k++ ) { - sum = pulses_in[ 2 * k ] + pulses_in[ 2 * k + 1 ]; - if( sum > max_pulses ) { - return 1; - } - pulses_comb[ k ] = sum; - } - - return 0; -} - -/* Encode quantization indices of excitation */ -void silk_encode_pulses( - ec_enc *psRangeEnc, /* I/O compressor data structure */ - const opus_int signalType, /* I Signal type */ - const opus_int quantOffsetType, /* I quantOffsetType */ - opus_int8 pulses[], /* I quantization indices */ - const opus_int frame_length /* I Frame length */ -) -{ - opus_int i, k, j, iter, bit, nLS, scale_down, RateLevelIndex = 0; - opus_int32 abs_q, minSumBits_Q5, sumBits_Q5; - 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*/ - - /****************************/ - /* Prepare for shell coding */ - /****************************/ - /* Calculate number of shell blocks */ - 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 */ - 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 ] ); - abs_pulses[i+2] = ( opus_int )silk_abs( pulses[ i + 2 ] ); - abs_pulses[i+3] = ( opus_int )silk_abs( pulses[ i + 3 ] ); - } - - /* 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; - - while( 1 ) { - /* 1+1 -> 2 */ - scale_down = combine_and_check( pulses_comb, abs_pulses_ptr, silk_max_pulses_table[ 0 ], 8 ); - /* 2+2 -> 4 */ - scale_down += combine_and_check( pulses_comb, pulses_comb, silk_max_pulses_table[ 1 ], 4 ); - /* 4+4 -> 8 */ - scale_down += combine_and_check( pulses_comb, pulses_comb, silk_max_pulses_table[ 2 ], 2 ); - /* 8+8 -> 16 */ - scale_down += combine_and_check( &sum_pulses[ i ], pulses_comb, silk_max_pulses_table[ 3 ], 1 ); - - if( scale_down ) { - /* We need to downscale the quantization signal */ - nRshifts[ i ]++; - for( k = 0; k < SHELL_CODEC_FRAME_LENGTH; k++ ) { - abs_pulses_ptr[ k ] = silk_RSHIFT( abs_pulses_ptr[ k ], 1 ); - } - } else { - /* Jump out of while(1) loop and go to next shell coding frame */ - break; - } - } - abs_pulses_ptr += SHELL_CODEC_FRAME_LENGTH; - } - - /**************/ - /* Rate level */ - /**************/ - /* find rate level that leads to fewest bits for coding of pulses per block info */ - minSumBits_Q5 = silk_int32_MAX; - for( k = 0; k < N_RATE_LEVELS - 1; k++ ) { - nBits_ptr = silk_pulses_per_block_BITS_Q5[ k ]; - 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 ]; - } else { - sumBits_Q5 += nBits_ptr[ sum_pulses[ i ] ]; - } - } - if( sumBits_Q5 < minSumBits_Q5 ) { - minSumBits_Q5 = sumBits_Q5; - RateLevelIndex = k; - } - } - ec_enc_icdf( psRangeEnc, RateLevelIndex, silk_rate_levels_iCDF[ signalType >> 1 ], 8 ); - - /***************************************************/ - /* Sum-Weighted-Pulses Encoding */ - /***************************************************/ - cdf_ptr = silk_pulses_per_block_iCDF[ RateLevelIndex ]; - for( i = 0; i < iter; i++ ) { - 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 ); - 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, sum_pulses[ i ], silk_pulses_per_block_iCDF[ N_RATE_LEVELS - 1 ], 8 ); - } - } - - /******************/ - /* Shell Encoding */ - /******************/ - for( i = 0; i < iter; i++ ) { - if( sum_pulses[ i ] > 0 ) { - silk_shell_encoder( psRangeEnc, &abs_pulses[ i * SHELL_CODEC_FRAME_LENGTH ] ); - } - } - - /****************/ - /* LSB Encoding */ - /****************/ - for( i = 0; i < iter; i++ ) { - if( nRshifts[ i ] > 0 ) { - pulses_ptr = &pulses[ i * SHELL_CODEC_FRAME_LENGTH ]; - nLS = nRshifts[ i ] - 1; - for( k = 0; k < SHELL_CODEC_FRAME_LENGTH; k++ ) { - abs_q = (opus_int8)silk_abs( pulses_ptr[ k ] ); - for( j = nLS; j > 0; j-- ) { - bit = silk_RSHIFT( abs_q, j ) & 1; - ec_enc_icdf( psRangeEnc, bit, silk_lsb_iCDF, 8 ); - } - bit = abs_q & 1; - ec_enc_icdf( psRangeEnc, bit, silk_lsb_iCDF, 8 ); - } - } - } - - /****************/ - /* Encode signs */ - /****************/ - silk_encode_signs( psRangeEnc, pulses, frame_length, signalType, quantOffsetType, sum_pulses ); - RESTORE_STACK; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/errors.h b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/errors.h deleted file mode 100644 index 45070800..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/errors.h +++ /dev/null @@ -1,98 +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. -***********************************************************************/ - -#ifndef SILK_ERRORS_H -#define SILK_ERRORS_H - -#ifdef __cplusplus -extern "C" -{ -#endif - -/******************/ -/* Error messages */ -/******************/ -#define SILK_NO_ERROR 0 - -/**************************/ -/* Encoder error messages */ -/**************************/ - -/* Input length is not a multiple of 10 ms, or length is longer than the packet length */ -#define SILK_ENC_INPUT_INVALID_NO_OF_SAMPLES -101 - -/* Sampling frequency not 8000, 12000 or 16000 Hertz */ -#define SILK_ENC_FS_NOT_SUPPORTED -102 - -/* Packet size not 10, 20, 40, or 60 ms */ -#define SILK_ENC_PACKET_SIZE_NOT_SUPPORTED -103 - -/* Allocated payload buffer too short */ -#define SILK_ENC_PAYLOAD_BUF_TOO_SHORT -104 - -/* Loss rate not between 0 and 100 percent */ -#define SILK_ENC_INVALID_LOSS_RATE -105 - -/* Complexity setting not valid, use 0...10 */ -#define SILK_ENC_INVALID_COMPLEXITY_SETTING -106 - -/* Inband FEC setting not valid, use 0 or 1 */ -#define SILK_ENC_INVALID_INBAND_FEC_SETTING -107 - -/* DTX setting not valid, use 0 or 1 */ -#define SILK_ENC_INVALID_DTX_SETTING -108 - -/* CBR setting not valid, use 0 or 1 */ -#define SILK_ENC_INVALID_CBR_SETTING -109 - -/* Internal encoder error */ -#define SILK_ENC_INTERNAL_ERROR -110 - -/* Internal encoder error */ -#define SILK_ENC_INVALID_NUMBER_OF_CHANNELS_ERROR -111 - -/**************************/ -/* Decoder error messages */ -/**************************/ - -/* Output sampling frequency lower than internal decoded sampling frequency */ -#define SILK_DEC_INVALID_SAMPLING_FREQUENCY -200 - -/* Payload size exceeded the maximum allowed 1024 bytes */ -#define SILK_DEC_PAYLOAD_TOO_LARGE -201 - -/* Payload has bit errors */ -#define SILK_DEC_PAYLOAD_ERROR -202 - -/* Payload has bit errors */ -#define SILK_DEC_INVALID_FRAME_SIZE -203 - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/LTP_analysis_filter_FIX.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/LTP_analysis_filter_FIX.c deleted file mode 100644 index a9419080..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/LTP_analysis_filter_FIX.c +++ /dev/null @@ -1,85 +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" - -void silk_LTP_analysis_filter_FIX( - opus_int16 *LTP_res, /* O LTP residual signal of length MAX_NB_SUBFR * ( pre_length + subfr_length ) */ - const opus_int16 *x, /* I Pointer to input signal with at least max( pitchL ) preceding samples */ - const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ],/* I LTP_ORDER LTP coefficients for each MAX_NB_SUBFR subframe */ - const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag, one for each subframe */ - const opus_int32 invGains_Q16[ MAX_NB_SUBFR ], /* I Inverse quantization gains, one for each subframe */ - const opus_int subfr_length, /* I Length of each subframe */ - const opus_int nb_subfr, /* I Number of subframes */ - const opus_int pre_length /* I Length of the preceding samples starting at &x[0] for each subframe */ -) -{ - 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_int32 LTP_est; - - x_ptr = x; - LTP_res_ptr = LTP_res; - 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 ]; - } - - /* LTP analysis FIR filter */ - for( i = 0; i < subfr_length + pre_length; i++ ) { - LTP_res_ptr[ i ] = x_ptr[ i ]; - - /* 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_RSHIFT_ROUND( LTP_est, 14 ); /* round and -> Q0*/ - - /* Subtract long-term prediction */ - LTP_res_ptr[ i ] = (opus_int16)silk_SAT16( (opus_int32)x_ptr[ i ] - LTP_est ); - - /* Scale residual */ - LTP_res_ptr[ i ] = silk_SMULWB( invGains_Q16[ k ], LTP_res_ptr[ i ] ); - - x_lag_ptr++; - } - - /* Update pointers */ - LTP_res_ptr += subfr_length + pre_length; - x_ptr += subfr_length; - } -} - diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/LTP_scale_ctrl_FIX.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/LTP_scale_ctrl_FIX.c deleted file mode 100644 index 3dcedef8..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/LTP_scale_ctrl_FIX.c +++ /dev/null @@ -1,53 +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" - -/* Calculation of LTP state scaling */ -void silk_LTP_scale_ctrl_FIX( - silk_encoder_state_FIX *psEnc, /* I/O encoder state */ - silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */ - opus_int condCoding /* I The type of conditional coding to use */ -) -{ - opus_int round_loss; - - if( condCoding == CODE_INDEPENDENTLY ) { - /* Only scale if first frame in packet */ - round_loss = psEnc->sCmn.PacketLoss_perc + psEnc->sCmn.nFramesPerPacket; - psEnc->sCmn.indices.LTP_scaleIndex = (opus_int8)silk_LIMIT( - silk_SMULWB( silk_SMULBB( round_loss, psEncCtrl->LTPredCodGain_Q7 ), SILK_FIX_CONST( 0.1, 9 ) ), 0, 2 ); - } else { - /* Default is minimum scaling */ - psEnc->sCmn.indices.LTP_scaleIndex = 0; - } - psEncCtrl->LTP_scale_Q14 = silk_LTPScales_table_Q14[ psEnc->sCmn.indices.LTP_scaleIndex ]; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/apply_sine_window_FIX.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/apply_sine_window_FIX.c deleted file mode 100644 index 4502b713..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/apply_sine_window_FIX.c +++ /dev/null @@ -1,101 +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 "SigProc_FIX.h" - -/* Apply sine window to signal vector. */ -/* Window types: */ -/* 1 -> sine window from 0 to pi/2 */ -/* 2 -> sine window from pi/2 to pi */ -/* Every other sample is linearly interpolated, for speed. */ -/* Window length must be between 16 and 120 (incl) and a multiple of 4. */ - -/* Matlab code for table: - for k=16:9*4:16+2*9*4, fprintf(' %7.d,', -round(65536*pi ./ (k:4:k+8*4))); fprintf('\n'); end -*/ -static const opus_int16 freq_table_Q16[ 27 ] = { - 12111, 9804, 8235, 7100, 6239, 5565, 5022, 4575, 4202, - 3885, 3612, 3375, 3167, 2984, 2820, 2674, 2542, 2422, - 2313, 2214, 2123, 2038, 1961, 1889, 1822, 1760, 1702, -}; - -void silk_apply_sine_window( - opus_int16 px_win[], /* O Pointer to windowed signal */ - const opus_int16 px[], /* I Pointer to input signal */ - const opus_int win_type, /* I Selects a window type */ - const opus_int length /* I Window length, multiple of 4 */ -) -{ - opus_int k, f_Q16, c_Q16; - opus_int32 S0_Q16, S1_Q16; - - silk_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 ); - - /* Frequency */ - k = ( length >> 2 ) - 4; - silk_assert( k >= 0 && k <= 26 ); - f_Q16 = (opus_int)freq_table_Q16[ k ]; - - /* Factor used for cosine approximation */ - c_Q16 = silk_SMULWB( (opus_int32)f_Q16, -f_Q16 ); - silk_assert( c_Q16 >= -32768 ); - - /* initialize state */ - if( win_type == 1 ) { - /* start from 0 */ - S0_Q16 = 0; - /* approximation of sin(f) */ - S1_Q16 = f_Q16 + silk_RSHIFT( length, 3 ); - } else { - /* start from 1 */ - S0_Q16 = ( (opus_int32)1 << 16 ); - /* approximation of cos(f) */ - S1_Q16 = ( (opus_int32)1 << 16 ) + silk_RSHIFT( c_Q16, 1 ) + silk_RSHIFT( length, 4 ); - } - - /* Uses the recursive equation: sin(n*f) = 2 * cos(f) * sin((n-1)*f) - sin((n-2)*f) */ - /* 4 samples at a time */ - for( k = 0; k < length; k += 4 ) { - px_win[ k ] = (opus_int16)silk_SMULWB( silk_RSHIFT( S0_Q16 + S1_Q16, 1 ), px[ k ] ); - px_win[ k + 1 ] = (opus_int16)silk_SMULWB( S1_Q16, px[ k + 1] ); - S0_Q16 = silk_SMULWB( S1_Q16, c_Q16 ) + silk_LSHIFT( S1_Q16, 1 ) - S0_Q16 + 1; - S0_Q16 = silk_min( S0_Q16, ( (opus_int32)1 << 16 ) ); - - px_win[ k + 2 ] = (opus_int16)silk_SMULWB( silk_RSHIFT( S0_Q16 + S1_Q16, 1 ), px[ k + 2] ); - px_win[ k + 3 ] = (opus_int16)silk_SMULWB( S0_Q16, px[ k + 3 ] ); - S1_Q16 = silk_SMULWB( S0_Q16, c_Q16 ) + silk_LSHIFT( S0_Q16, 1 ) - S1_Q16; - S1_Q16 = silk_min( S1_Q16, ( (opus_int32)1 << 16 ) ); - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/autocorr_FIX.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/autocorr_FIX.c deleted file mode 100644 index de95c986..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/autocorr_FIX.c +++ /dev/null @@ -1,48 +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 "SigProc_FIX.h" -#include "celt_lpc.h" - -/* Compute autocorrelation */ -void silk_autocorr( - opus_int32 *results, /* O Result (length correlationCount) */ - 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 */ - int arch /* I Run-time architecture */ -) -{ - opus_int corrCount; - corrCount = silk_min_int( inputDataSize, correlationCount ); - *scale = _celt_autocorr(inputData, results, NULL, 0, corrCount-1, inputDataSize, arch); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/burg_modified_FIX.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/burg_modified_FIX.c deleted file mode 100644 index db348295..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/burg_modified_FIX.c +++ /dev/null @@ -1,279 +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 "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 MIN_RSHIFTS -16 -#define MAX_RSHIFTS (32 - QA) - -/* Compute reflection coefficients from input signal */ -void silk_burg_modified( - 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 ]; - - silk_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 ), 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 */ - for( k = 0; 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 */ - for( k = 0; 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 */ - /* 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 ), 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 ); - } - } - /* 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/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/corrMatrix_FIX.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/corrMatrix_FIX.c deleted file mode 100644 index c6172705..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/corrMatrix_FIX.c +++ /dev/null @@ -1,156 +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 - -/********************************************************************** - * Correlation Matrix Computations for LS estimate. - **********************************************************************/ - -#include "main_FIX.h" - -/* Calculates correlation vector X'*t */ -void silk_corrVector_FIX( - const opus_int16 *x, /* I x vector [L + order - 1] used to form data matrix X */ - const opus_int16 *t, /* I Target vector [L] */ - 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 */ -) -{ - opus_int lag, i; - const opus_int16 *ptr1, *ptr2; - opus_int32 inner_prod; - - ptr1 = &x[ order - 1 ]; /* Points to first sample of column 0 of X: X[:,0] */ - ptr2 = t; - /* Calculate X'*t */ - if( rshifts > 0 ) { - /* Right shifting used */ - 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 ); - } - Xt[ lag ] = inner_prod; /* X[:,lag]'*t */ - ptr1--; /* Go to next column of X */ - } - } else { - silk_assert( rshifts == 0 ); - for( lag = 0; lag < order; lag++ ) { - Xt[ lag ] = silk_inner_prod_aligned( ptr1, ptr2, L ); /* X[:,lag]'*t */ - ptr1--; /* Go to next column of X */ - } - } -} - -/* Calculates correlation matrix X'*X */ -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_int i, j, lag, rshifts_local, head_room_rshifts; - 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; - - /* 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; - } - - /* 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; - 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 ) ); - matrix_ptr( XX, j, j, order ) = energy; - } - - ptr2 = &x[ order - 2 ]; /* First sample of column 1 of X */ - /* Calculate the remaining elements of the correlation matrix */ - if( rshifts_local > 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 ); - } - /* 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 ) ); - matrix_ptr( XX, lag + j, j, order ) = energy; - matrix_ptr( XX, j, lag + j, order ) = energy; - } - ptr2--; /* Update pointer to first sample of next column (lag) in X */ - } - } 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 ); - matrix_ptr( XX, lag, 0, order ) = energy; - matrix_ptr( XX, 0, lag, order ) = energy; - /* Calculate remaining off diagonal: X[:,j]'*X[:,j + lag] */ - for( j = 1; j < ( order - lag ); j++ ) { - energy = silk_SUB32( energy, silk_SMULBB( ptr1[ L - j ], ptr2[ L - j ] ) ); - energy = silk_SMLABB( energy, ptr1[ -j ], ptr2[ -j ] ); - matrix_ptr( XX, lag + j, j, order ) = energy; - matrix_ptr( XX, j, lag + j, order ) = energy; - } - ptr2--;/* Update pointer to first sample of next column (lag) in X */ - } - } - *rshifts = rshifts_local; -} - diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/encode_frame_FIX.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/encode_frame_FIX.c deleted file mode 100644 index b490986b..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/encode_frame_FIX.c +++ /dev/null @@ -1,385 +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 "stack_alloc.h" -#include "tuning_parameters.h" - -/* Low Bitrate Redundancy (LBRR) encoding. Reuse all parameters but encode with lower bitrate */ -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 */ - 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 */ -) -{ - /****************************/ - /* Voice Activity Detection */ - /****************************/ - silk_VAD_GetSA_Q8( &psEnc->sCmn, psEnc->sCmn.inputBuf + 1 ); - - /**************************************************/ - /* Convert speech activity into VAD and DTX flags */ - /**************************************************/ - if( psEnc->sCmn.speech_activity_Q8 < SILK_FIX_CONST( SPEECH_ACTIVITY_DTX_THRES, 8 ) ) { - psEnc->sCmn.indices.signalType = TYPE_NO_VOICE_ACTIVITY; - psEnc->sCmn.noSpeechCounter++; - 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; - psEnc->sCmn.inDTX = 0; - } - psEnc->sCmn.VAD_flags[ psEnc->sCmn.nFramesEncoded ] = 0; - } else { - psEnc->sCmn.noSpeechCounter = 0; - psEnc->sCmn.inDTX = 0; - psEnc->sCmn.indices.signalType = TYPE_UNVOICED; - psEnc->sCmn.VAD_flags[ psEnc->sCmn.nFramesEncoded ] = 1; - } -} - -/****************/ -/* Encode frame */ -/****************/ -opus_int silk_encode_frame_FIX( - silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk FIX encoder state */ - opus_int32 *pnBytesOut, /* O Pointer to number of payload bytes; */ - ec_enc *psRangeEnc, /* I/O compressor data structure */ - opus_int condCoding, /* I The type of conditional coding to use */ - opus_int maxBits, /* I If > 0: maximum number of output bits */ - opus_int useCBR /* I Flag to force constant-bitrate operation */ -) -{ - silk_encoder_control_FIX sEncCtrl; - opus_int i, iter, maxIter, found_upper, found_lower, ret = 0; - 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; - opus_int32 gainsID, gainsID_lower, gainsID_upper; - opus_int16 gainMult_Q8; - opus_int16 ec_prevLagIndex_copy; - opus_int ec_prevSignalType_copy; - opus_int8 LastGainIndex_copy2; - 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; - - psEnc->sCmn.indices.Seed = psEnc->sCmn.frameCounter++ & 3; - - /**************************************************************/ - /* Set up Input Pointers, and insert frame in input buffer */ - /*************************************************************/ - /* start of frame to encode */ - x_frame = psEnc->x_buf + psEnc->sCmn.ltp_mem_length; - - /***************************************/ - /* Ensure smooth bandwidth transitions */ - /***************************************/ - silk_LP_variable_cutoff( &psEnc->sCmn.sLP, psEnc->sCmn.inputBuf + 1, psEnc->sCmn.frame_length ); - - /*******************************************/ - /* Copy new frame to front of input buffer */ - /*******************************************/ - 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_int32, xfw_Q3 ); - 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, psEnc->sCmn.arch ); - - /************************/ - /* Noise shape analysis */ - /************************/ - 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 ); - - /****************************************/ - /* Process gains */ - /****************************************/ - silk_process_gains_FIX( psEnc, &sEncCtrl, condCoding ); - - /*****************************************/ - /* Prefiltering for noise shaper */ - /*****************************************/ - ALLOC( xfw_Q3, psEnc->sCmn.frame_length, opus_int32 ); - silk_prefilter_FIX( psEnc, &sEncCtrl, xfw_Q3, x_frame ); - - /****************************************/ - /* Low Bitrate Redundant Encoding */ - /****************************************/ - silk_LBRR_encode_FIX( psEnc, &sEncCtrl, xfw_Q3, condCoding ); - - /* Loop over quantizer and entropy coding to control bitrate */ - maxIter = 6; - gainMult_Q8 = SILK_FIX_CONST( 1, 8 ); - found_lower = 0; - found_upper = 0; - gainsID = silk_gains_ID( psEnc->sCmn.indices.GainsIndices, psEnc->sCmn.nb_subfr ); - gainsID_lower = -1; - gainsID_upper = -1; - /* Copy part of the input state */ - silk_memcpy( &sRangeEnc_copy, psRangeEnc, sizeof( ec_enc ) ); - silk_memcpy( &sNSQ_copy, &psEnc->sCmn.sNSQ, sizeof( silk_nsq_state ) ); - 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; - } else if( gainsID == gainsID_upper ) { - nBits = nBits_upper; - } else { - /* Restore part of the input state */ - if( iter > 0 ) { - silk_memcpy( psRangeEnc, &sRangeEnc_copy, sizeof( ec_enc ) ); - silk_memcpy( &psEnc->sCmn.sNSQ, &sNSQ_copy, sizeof( silk_nsq_state ) ); - psEnc->sCmn.indices.Seed = seed_copy; - psEnc->sCmn.ec_prevLagIndex = ec_prevLagIndex_copy; - psEnc->sCmn.ec_prevSignalType = ec_prevSignalType_copy; - } - - /*****************************************/ - /* 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 ); - } 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 ); - } - - /****************************************/ - /* Encode Parameters */ - /****************************************/ - silk_encode_indices( &psEnc->sCmn, psRangeEnc, psEnc->sCmn.nFramesEncoded, 0, condCoding ); - - /****************************************/ - /* Encode Excitation Signal */ - /****************************************/ - 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; - } - } - - if( iter == maxIter ) { - 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 ); - 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; - } - break; - } - - if( nBits > maxBits ) { - if( found_lower == 0 && iter >= 2 ) { - /* Adjust the quantizer's rate/distortion tradeoff and discard previous "upper" results */ - sEncCtrl.Lambda_Q10 = silk_ADD_RSHIFT32( sEncCtrl.Lambda_Q10, sEncCtrl.Lambda_Q10, 1 ); - found_upper = 0; - gainsID_upper = -1; - } else { - found_upper = 1; - nBits_upper = nBits; - gainMult_upper = gainMult_Q8; - gainsID_upper = gainsID; - } - } else if( nBits < maxBits - 5 ) { - found_lower = 1; - nBits_lower = nBits; - gainMult_lower = gainMult_Q8; - if( gainsID != gainsID_lower ) { - gainsID_lower = gainsID; - /* Copy part of the output state */ - silk_memcpy( &sRangeEnc_copy2, psRangeEnc, sizeof( ec_enc ) ); - silk_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; - } - } else { - /* Within 5 bits of budget: close enough */ - break; - } - - 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 ) ); - } - 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 ); - /* New gain multplier must be between 25% and 75% of old range (note that gainMult_upper < gainMult_lower) */ - if( gainMult_Q8 > silk_ADD_RSHIFT32( gainMult_lower, gainMult_upper - gainMult_lower, 2 ) ) { - gainMult_Q8 = silk_ADD_RSHIFT32( gainMult_lower, gainMult_upper - gainMult_lower, 2 ); - } else - if( gainMult_Q8 < silk_SUB_RSHIFT32( gainMult_upper, gainMult_upper - gainMult_lower, 2 ) ) { - gainMult_Q8 = silk_SUB_RSHIFT32( gainMult_upper, gainMult_upper - gainMult_lower, 2 ); - } - } - - 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 ); - } - - /* Quantize gains */ - psEnc->sShape.LastGainIndex = sEncCtrl.lastGainIndexPrev; - silk_gains_quant( psEnc->sCmn.indices.GainsIndices, sEncCtrl.Gains_Q16, - &psEnc->sShape.LastGainIndex, condCoding == CODE_CONDITIONALLY, psEnc->sCmn.nb_subfr ); - - /* Unique identifier of gains vector */ - gainsID = silk_gains_ID( psEnc->sCmn.indices.GainsIndices, psEnc->sCmn.nb_subfr ); - } - } - - /* Update input buffer */ - 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 ) ); - - /* 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 */ - /****************************************/ - psEnc->sCmn.first_frame_after_reset = 0; - /* 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 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 */ - opus_int condCoding /* I The type of conditional coding used so far for this frame */ -) -{ - opus_int32 TempGains_Q16[ MAX_NB_SUBFR ]; - SideInfoIndices *psIndices_LBRR = &psEnc->sCmn.indices_LBRR[ psEnc->sCmn.nFramesEncoded ]; - silk_nsq_state sNSQ_LBRR; - - /*******************************************/ - /* Control use of inband LBRR */ - /*******************************************/ - if( psEnc->sCmn.LBRR_enabled && psEnc->sCmn.speech_activity_Q8 > SILK_FIX_CONST( LBRR_SPEECH_ACTIVITY_THRES, 8 ) ) { - psEnc->sCmn.LBRR_flags[ psEnc->sCmn.nFramesEncoded ] = 1; - - /* Copy noise shaping quantizer state and quantization indices from regular encoding */ - silk_memcpy( &sNSQ_LBRR, &psEnc->sCmn.sNSQ, sizeof( silk_nsq_state ) ); - silk_memcpy( psIndices_LBRR, &psEnc->sCmn.indices, sizeof( SideInfoIndices ) ); - - /* Save original gains */ - silk_memcpy( TempGains_Q16, psEncCtrl->Gains_Q16, psEnc->sCmn.nb_subfr * sizeof( opus_int32 ) ); - - if( psEnc->sCmn.nFramesEncoded == 0 || psEnc->sCmn.LBRR_flags[ psEnc->sCmn.nFramesEncoded - 1 ] == 0 ) { - /* First frame in packet or previous frame not LBRR coded */ - psEnc->sCmn.LBRRprevLastGainIndex = psEnc->sShape.LastGainIndex; - - /* Increase Gains to get target LBRR rate */ - psIndices_LBRR->GainsIndices[ 0 ] = psIndices_LBRR->GainsIndices[ 0 ] + psEnc->sCmn.LBRR_GainIncreases; - psIndices_LBRR->GainsIndices[ 0 ] = silk_min_int( psIndices_LBRR->GainsIndices[ 0 ], N_LEVELS_QGAIN - 1 ); - } - - /* Decode to get gains in sync with decoder */ - /* Overwrite unquantized gains with quantized gains */ - silk_gains_dequant( psEncCtrl->Gains_Q16, psIndices_LBRR->GainsIndices, - &psEnc->sCmn.LBRRprevLastGainIndex, condCoding == CODE_CONDITIONALLY, psEnc->sCmn.nb_subfr ); - - /*****************************************/ - /* 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, - 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 ); - } else { - silk_NSQ( &psEnc->sCmn, &sNSQ_LBRR, psIndices_LBRR, xfw_Q3, - 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 ); - } - - /* Restore original gains */ - silk_memcpy( psEncCtrl->Gains_Q16, TempGains_Q16, psEnc->sCmn.nb_subfr * sizeof( opus_int32 ) ); - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/find_LPC_FIX.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/find_LPC_FIX.c deleted file mode 100644 index 783d32e2..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/find_LPC_FIX.c +++ /dev/null @@ -1,151 +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 "stack_alloc.h" -#include "tuning_parameters.h" - -/* Finds LPC vector from correlations, and converts to NLSF */ -void silk_find_LPC_FIX( - silk_encoder_state *psEncC, /* I/O Encoder state */ - opus_int16 NLSF_Q15[], /* O NLSFs */ - const opus_int16 x[], /* I Input signal */ - const opus_int32 minInvGain_Q30 /* I Inverse of max prediction gain */ -) -{ - opus_int k, subfr_length; - opus_int32 a_Q16[ MAX_LPC_ORDER ]; - opus_int isInterpLower, shift; - opus_int32 res_nrg0, res_nrg1; - opus_int rshift0, rshift1; - - /* Used only for LSF interpolation */ - opus_int32 a_tmp_Q16[ MAX_LPC_ORDER ], res_nrg_interp, res_nrg, res_tmp_nrg; - 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 ]; - SAVE_STACK; - - subfr_length = psEncC->subfr_length + psEncC->predictLPCOrder; - - /* Default: no interpolation */ - 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, 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, 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 */ - shift = res_tmp_nrg_Q - res_nrg_Q; - if( shift >= 0 ) { - if( shift < 32 ) { - res_nrg = res_nrg - silk_RSHIFT( res_tmp_nrg, shift ); - } - } else { - silk_assert( shift > -32 ); - res_nrg = silk_RSHIFT( res_nrg, -shift ) - res_tmp_nrg; - res_nrg_Q = res_tmp_nrg_Q; - } - - /* 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 ); - - /* Calculate residual energy with NLSF interpolation */ - silk_LPC_analysis_filter( LPC_res, x, a_tmp_Q12, 2 * subfr_length, psEncC->predictLPCOrder ); - - 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 ); - - /* Add subframe energies from first half frame */ - shift = rshift0 - rshift1; - if( shift >= 0 ) { - res_nrg1 = silk_RSHIFT( res_nrg1, shift ); - res_nrg_interp_Q = -rshift0; - } else { - res_nrg0 = silk_RSHIFT( res_nrg0, -shift ); - res_nrg_interp_Q = -rshift1; - } - res_nrg_interp = silk_ADD32( res_nrg0, res_nrg1 ); - - /* Compare with first half energy without NLSF interpolation, or best interpolated value so far */ - shift = res_nrg_interp_Q - res_nrg_Q; - if( shift >= 0 ) { - if( silk_RSHIFT( res_nrg_interp, shift ) < res_nrg ) { - isInterpLower = silk_TRUE; - } else { - isInterpLower = silk_FALSE; - } - } else { - if( -shift < 32 ) { - if( res_nrg_interp < silk_RSHIFT( res_nrg, -shift ) ) { - isInterpLower = silk_TRUE; - } else { - isInterpLower = silk_FALSE; - } - } else { - isInterpLower = silk_FALSE; - } - } - - /* Determine whether current interpolated NLSFs are best so far */ - if( isInterpLower == silk_TRUE ) { - /* Interpolation has lower residual energy */ - res_nrg = res_nrg_interp; - res_nrg_Q = res_nrg_interp_Q; - psEncC->indices.NLSFInterpCoef_Q2 = (opus_int8)k; - } - } - } - - if( psEncC->indices.NLSFInterpCoef_Q2 == 4 ) { - /* NLSF interpolation is currently inactive, calculate NLSFs from full frame AR coefficients */ - 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 ) ); - RESTORE_STACK; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/find_LTP_FIX.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/find_LTP_FIX.c deleted file mode 100644 index 8c4d7037..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/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/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/find_pitch_lags_FIX.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/find_pitch_lags_FIX.c deleted file mode 100644 index 620f8dcd..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/find_pitch_lags_FIX.c +++ /dev/null @@ -1,145 +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 "stack_alloc.h" -#include "tuning_parameters.h" - -/* Find pitch lags */ -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 */ - int arch /* I Run-time architecture */ -) -{ - opus_int buf_len, i, scale; - opus_int32 thrhld_Q13, res_nrg; - const opus_int16 *x_buf, *x_buf_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 */ - /******************************************/ - 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; - - /*************************************/ - /* Estimate LPC AR coefficients */ - /*************************************/ - - /* 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; - Wsig_ptr = Wsig; - silk_apply_sine_window( Wsig_ptr, x_buf_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 ) ); - - /* 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 ); - - /* Calculate autocorrelation sequence */ - 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; - - /* Calculate the reflection coefficients using schur */ - res_nrg = silk_schur( rc_Q15, auto_corr, psEnc->sCmn.pitchEstimationLPCOrder ); - - /* Prediction gain */ - psEncCtrl->predGain_Q16 = silk_DIV32_varQ( auto_corr[ 0 ], silk_max_int( res_nrg, 1 ), 16 ); - - /* Convert reflection coefficients to prediction coefficients */ - silk_k2a( A_Q24, rc_Q15, psEnc->sCmn.pitchEstimationLPCOrder ); - - /* Convert From 32 bit Q24 to 16 bit Q12 coefs */ - for( i = 0; i < psEnc->sCmn.pitchEstimationLPCOrder; i++ ) { - A_Q12[ i ] = (opus_int16)silk_SAT16( silk_RSHIFT( A_Q24[ i ], 12 ) ); - } - - /* Do BWE */ - silk_bwexpander( A_Q12, psEnc->sCmn.pitchEstimationLPCOrder, SILK_FIX_CONST( FIND_PITCH_BANDWIDTH_EXPANSION, 16 ) ); - - /*****************************************/ - /* LPC analysis filtering */ - /*****************************************/ - silk_LPC_analysis_filter( res, x_buf, A_Q12, buf_len, psEnc->sCmn.pitchEstimationLPCOrder ); - - if( psEnc->sCmn.indices.signalType != TYPE_NO_VOICE_ACTIVITY && psEnc->sCmn.first_frame_after_reset == 0 ) { - /* Threshold for pitch estimator */ - 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_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 { - psEnc->sCmn.indices.signalType = TYPE_UNVOICED; - } - } else { - silk_memset( psEncCtrl->pitchL, 0, sizeof( psEncCtrl->pitchL ) ); - psEnc->sCmn.indices.lagIndex = 0; - psEnc->sCmn.indices.contourIndex = 0; - psEnc->LTPCorr_Q15 = 0; - } - RESTORE_STACK; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/find_pred_coefs_FIX.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/find_pred_coefs_FIX.c deleted file mode 100644 index 5c22f828..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/find_pred_coefs_FIX.c +++ /dev/null @@ -1,147 +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 "stack_alloc.h" - -void silk_find_pred_coefs_FIX( - silk_encoder_state_FIX *psEnc, /* I/O encoder state */ - silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */ - const opus_int16 res_pitch[], /* I Residual from pitch analysis */ - const opus_int16 x[], /* I Speech signal */ - opus_int condCoding /* I The type of conditional coding to use */ -) -{ - opus_int i; - opus_int32 invGains_Q16[ MAX_NB_SUBFR ], local_gains[ MAX_NB_SUBFR ], Wght_Q15[ MAX_NB_SUBFR ]; - opus_int16 NLSF_Q15[ MAX_LPC_ORDER ]; - const opus_int16 *x_ptr; - opus_int16 *x_pre_ptr; - VARDECL( opus_int16, LPC_in_pre ); - opus_int32 tmp, min_gain_Q16, minInvGain_Q30; - opus_int LTP_corrs_rshift[ MAX_NB_SUBFR ]; - SAVE_STACK; - - /* weighting for weighted least squares */ - min_gain_Q16 = silk_int32_MAX >> 6; - for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { - min_gain_Q16 = silk_min( min_gain_Q16, psEncCtrl->Gains_Q16[ i ] ); - } - for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { - /* Divide to Q16 */ - silk_assert( psEncCtrl->Gains_Q16[ i ] > 0 ); - /* 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 ); - - /* 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, WLTP ); - - /**********/ - /* VOICED */ - /**********/ - silk_assert( psEnc->sCmn.ltp_mem_length - psEnc->sCmn.predictLPCOrder >= psEncCtrl->pitchL[ 0 ] + LTP_ORDER / 2 ); - - ALLOC( WLTP, 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 ); - - /* Quantize LTP gain parameters */ - silk_quant_LTP_gains( psEncCtrl->LTPCoef_Q14, psEnc->sCmn.indices.LTPIndex, &psEnc->sCmn.indices.PERIndex, - &psEnc->sCmn.sum_log_gain_Q7, WLTP, psEnc->sCmn.mu_LTP_Q9, psEnc->sCmn.LTPQuantLowComplexity, psEnc->sCmn.nb_subfr); - - /* Control LTP scaling */ - silk_LTP_scale_ctrl_FIX( psEnc, psEncCtrl, condCoding ); - - /* Create LTP residual */ - silk_LTP_analysis_filter_FIX( LPC_in_pre, x - psEnc->sCmn.predictLPCOrder, psEncCtrl->LTPCoef_Q14, - psEncCtrl->pitchL, invGains_Q16, psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.predictLPCOrder ); - - } else { - /************/ - /* UNVOICED */ - /************/ - /* Create signal with prepended subframes, scaled by inverse gains */ - x_ptr = x - psEnc->sCmn.predictLPCOrder; - x_pre_ptr = LPC_in_pre; - for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { - silk_scale_copy_vector16( x_pre_ptr, x_ptr, invGains_Q16[ i ], - psEnc->sCmn.subfr_length + psEnc->sCmn.predictLPCOrder ); - x_pre_ptr += psEnc->sCmn.subfr_length + psEnc->sCmn.predictLPCOrder; - x_ptr += psEnc->sCmn.subfr_length; - } - - 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 { - 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 ), - silk_SMLAWB( SILK_FIX_CONST( 0.25, 18 ), SILK_FIX_CONST( 0.75, 18 ), psEncCtrl->coding_quality_Q14 ) ), 14 ); - } - - /* LPC_in_pre contains the LTP-filtered input for voiced, and the unfiltered input for unvoiced */ - silk_find_LPC_FIX( &psEnc->sCmn, NLSF_Q15, LPC_in_pre, minInvGain_Q30 ); - - /* Quantize LSFs */ - silk_process_NLSFs( &psEnc->sCmn, psEncCtrl->PredCoef_Q12, NLSF_Q15, psEnc->sCmn.prev_NLSFq_Q15 ); - - /* 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 ); - - /* 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/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/k2a_FIX.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/k2a_FIX.c deleted file mode 100644 index 5fee599b..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/k2a_FIX.c +++ /dev/null @@ -1,53 +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 "SigProc_FIX.h" - -/* Step up function, converts reflection coefficients to prediction coefficients */ -void silk_k2a( - opus_int32 *A_Q24, /* O Prediction coefficients [order] Q24 */ - const opus_int16 *rc_Q15, /* I Reflection coefficients [order] Q15 */ - const opus_int32 order /* I Prediction order */ -) -{ - opus_int k, n; - opus_int32 Atmp[ SILK_MAX_ORDER_LPC ]; - - 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 ] ); - } - A_Q24[ k ] = -silk_LSHIFT( (opus_int32)rc_Q15[ k ], 9 ); - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/k2a_Q16_FIX.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/k2a_Q16_FIX.c deleted file mode 100644 index 3b039875..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/k2a_Q16_FIX.c +++ /dev/null @@ -1,53 +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 "SigProc_FIX.h" - -/* Step up function, converts reflection coefficients to prediction coefficients */ -void silk_k2a_Q16( - opus_int32 *A_Q24, /* O Prediction coefficients [order] Q24 */ - const opus_int32 *rc_Q16, /* I Reflection coefficients [order] Q16 */ - const opus_int32 order /* I Prediction order */ -) -{ - opus_int k, n; - opus_int32 Atmp[ SILK_MAX_ORDER_LPC ]; - - 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_SMLAWW( A_Q24[ n ], Atmp[ k - n - 1 ], rc_Q16[ k ] ); - } - A_Q24[ k ] = -silk_LSHIFT( rc_Q16[ k ], 8 ); - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/main_FIX.h b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/main_FIX.h deleted file mode 100644 index a56ca07a..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/main_FIX.h +++ /dev/null @@ -1,257 +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. -***********************************************************************/ - -#ifndef SILK_MAIN_FIX_H -#define SILK_MAIN_FIX_H - -#include "SigProc_FIX.h" -#include "structs_FIX.h" -#include "control.h" -#include "main.h" -#include "PLC.h" -#include "debug.h" -#include "entenc.h" - -#ifndef FORCE_CPP_BUILD -#ifdef __cplusplus -extern "C" -{ -#endif -#endif - -#define silk_encoder_state_Fxx silk_encoder_state_FIX -#define silk_encode_do_VAD_Fxx silk_encode_do_VAD_FIX -#define silk_encode_frame_Fxx silk_encode_frame_FIX - -/*********************/ -/* Encoder Functions */ -/*********************/ - -/* High-pass filter with cutoff frequency adaptation based on pitch lag statistics */ -void silk_HP_variable_cutoff( - silk_encoder_state_Fxx state_Fxx[] /* I/O Encoder states */ -); - -/* Encoder main function */ -void silk_encode_do_VAD_FIX( - silk_encoder_state_FIX *psEnc /* I/O Pointer to Silk FIX encoder state */ -); - -/* Encoder main function */ -opus_int silk_encode_frame_FIX( - silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk FIX encoder state */ - opus_int32 *pnBytesOut, /* O Pointer to number of payload bytes; */ - ec_enc *psRangeEnc, /* I/O compressor data structure */ - opus_int condCoding, /* I The type of conditional coding to use */ - opus_int maxBits, /* I If > 0: maximum number of output bits */ - opus_int useCBR /* I Flag to force constant-bitrate operation */ -); - -/* Initializes the Silk encoder state */ -opus_int silk_init_encoder( - 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 */ -/**************************/ -/* Compute noise shaping coefficients and initial gain values */ -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 */ -); - -/* Autocorrelations for a warped frequency axis */ -void silk_warped_autocorrelation_FIX( - 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) */ -); - -/* Calculation of LTP state scaling */ -void silk_LTP_scale_ctrl_FIX( - silk_encoder_state_FIX *psEnc, /* I/O encoder state */ - silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */ - opus_int condCoding /* I The type of conditional coding to use */ -); - -/**********************************************/ -/* Prediction Analysis */ -/**********************************************/ -/* Find pitch lags */ -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 */ - int arch /* I Run-time architecture */ -); - -/* Find LPC and LTP coefficients */ -void silk_find_pred_coefs_FIX( - silk_encoder_state_FIX *psEnc, /* I/O encoder state */ - silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */ - const opus_int16 res_pitch[], /* I Residual from pitch analysis */ - const opus_int16 x[], /* I Speech signal */ - opus_int condCoding /* I The type of conditional coding to use */ -); - -/* LPC analysis */ -void silk_find_LPC_FIX( - silk_encoder_state *psEncC, /* I/O Encoder state */ - opus_int16 NLSF_Q15[], /* O NLSFs */ - const opus_int16 x[], /* I Input signal */ - const opus_int32 minInvGain_Q30 /* I Inverse of max prediction gain */ -); - -/* 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 */ - 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 */ -); - -void silk_LTP_analysis_filter_FIX( - opus_int16 *LTP_res, /* O LTP residual signal of length MAX_NB_SUBFR * ( pre_length + subfr_length ) */ - const opus_int16 *x, /* I Pointer to input signal with at least max( pitchL ) preceding samples */ - const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ],/* I LTP_ORDER LTP coefficients for each MAX_NB_SUBFR subframe */ - const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag, one for each subframe */ - const opus_int32 invGains_Q16[ MAX_NB_SUBFR ], /* I Inverse quantization gains, one for each subframe */ - const opus_int subfr_length, /* I Length of each subframe */ - const opus_int nb_subfr, /* I Number of subframes */ - const opus_int pre_length /* I Length of the preceding samples starting at &x[0] for each subframe */ -); - -/* Calculates residual energies of input subframes where all subframes have LPC_order */ -/* of preceding samples */ -void silk_residual_energy_FIX( - opus_int32 nrgs[ MAX_NB_SUBFR ], /* O Residual energy per subframe */ - opus_int nrgsQ[ MAX_NB_SUBFR ], /* O Q value per subframe */ - const opus_int16 x[], /* I Input signal */ - opus_int16 a_Q12[ 2 ][ MAX_LPC_ORDER ], /* I AR coefs for each frame half */ - 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 */ -); - -/* Residual energy: nrg = wxx - 2 * wXx * c + c' * wXX * c */ -opus_int32 silk_residual_energy16_covar_FIX( - const opus_int16 *c, /* I Prediction vector */ - const opus_int32 *wXX, /* I Correlation matrix */ - const opus_int32 *wXx, /* I Correlation vector */ - opus_int32 wxx, /* I Signal energy */ - opus_int D, /* I Dimension */ - opus_int cQ /* I Q value for c vector 0 - 15 */ -); - -/* Processing of gains */ -void silk_process_gains_FIX( - silk_encoder_state_FIX *psEnc, /* I/O Encoder state */ - silk_encoder_control_FIX *psEncCtrl, /* I/O Encoder control */ - opus_int condCoding /* I The type of conditional coding to use */ -); - -/******************/ -/* Linear Algebra */ -/******************/ -/* Calculates correlation matrix X'*X */ -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 */ -); - -/* Calculates correlation vector X'*t */ -void silk_corrVector_FIX( - const opus_int16 *x, /* I x vector [L + order - 1] used to form data matrix X */ - const opus_int16 *t, /* I Target vector [L] */ - 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 */ -); - -#ifndef FORCE_CPP_BUILD -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif /* FORCE_CPP_BUILD */ -#endif /* SILK_MAIN_FIX_H */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/noise_shape_analysis_FIX.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/noise_shape_analysis_FIX.c deleted file mode 100644 index e24d2e9d..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/noise_shape_analysis_FIX.c +++ /dev/null @@ -1,445 +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 "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_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 */ -/**************************************************************/ -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, Qnrg, b_Q14, warping_Q16, scale = 0; - opus_int32 SNR_adj_dB_Q7, HarmBoost_Q16, HarmShapeGain_Q16, Tilt_Q16, tmp32; - opus_int32 nrg, pre_nrg_Q30, log_energy_Q7, log_energy_prev_Q7, energy_variation_Q7; - opus_int32 delta_Q16, BWExp1_Q16, BWExp2_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 AR1_Q24[ MAX_SHAPE_LPC_ORDER ]; - opus_int32 AR2_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; - psEncCtrl->sparseness_Q8 = 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; - for( k = 0; k < silk_SMULBB( SUB_FRAME_LENGTH_MS, psEnc->sCmn.nb_subfr ) / 2; 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; - } - - psEncCtrl->sparseness_Q8 = silk_RSHIFT( silk_sigm_Q15( silk_SMULWB( energy_variation_Q7 - - SILK_FIX_CONST( 5.0, 7 ), SILK_FIX_CONST( 0.1, 16 ) ) ), 7 ); - - /* Set quantization offset depending on sparseness measure */ - if( psEncCtrl->sparseness_Q8 > SILK_FIX_CONST( SPARSENESS_THRESHOLD_QNT_OFFSET, 8 ) ) { - psEnc->sCmn.indices.quantOffsetType = 0; - } else { - psEnc->sCmn.indices.quantOffsetType = 1; - } - - /* Increase coding SNR for sparse signals */ - SNR_adj_dB_Q7 = silk_SMLAWB( SNR_adj_dB_Q7, SILK_FIX_CONST( SPARSE_SNR_INCR_dB, 15 ), psEncCtrl->sparseness_Q8 - SILK_FIX_CONST( 0.5, 8 ) ); - } - - /*******************************/ - /* 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 ) ); - BWExp1_Q16 = BWExp2_Q16 = silk_DIV32_varQ( SILK_FIX_CONST( BANDWIDTH_EXPANSION, 16 ), - silk_SMLAWW( SILK_FIX_CONST( 1.0, 16 ), strength_Q16, strength_Q16 ), 16 ); - delta_Q16 = silk_SMULWB( SILK_FIX_CONST( 1.0, 16 ) - silk_SMULBB( 3, psEncCtrl->coding_quality_Q14 ), - SILK_FIX_CONST( LOW_RATE_BANDWIDTH_EXPANSION_DELTA, 16 ) ); - BWExp1_Q16 = silk_SUB32( BWExp1_Q16, delta_Q16 ); - BWExp2_Q16 = silk_ADD32( BWExp2_Q16, delta_Q16 ); - /* BWExp1 will be applied after BWExp2, so make it relative */ - BWExp1_Q16 = silk_DIV32_16( silk_LSHIFT( BWExp1_Q16, 14 ), silk_RSHIFT( BWExp2_Q16, 2 ) ); - - 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 ); - } 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( AR2_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( AR2_Q24, warping_Q16, psEnc->sCmn.shapingLPCOrder ); - silk_assert( psEncCtrl->Gains_Q16[ k ] >= 0 ); - if ( silk_SMULWW( silk_RSHIFT_ROUND( psEncCtrl->Gains_Q16[ k ], 1 ), gain_mult_Q16 ) >= ( silk_int32_MAX >> 1 ) ) { - psEncCtrl->Gains_Q16[ k ] = silk_int32_MAX; - } else { - psEncCtrl->Gains_Q16[ k ] = silk_SMULWW( psEncCtrl->Gains_Q16[ k ], gain_mult_Q16 ); - } - } - - /* Bandwidth expansion for synthesis filter shaping */ - silk_bwexpander_32( AR2_Q24, psEnc->sCmn.shapingLPCOrder, BWExp2_Q16 ); - - /* Compute noise shaping filter coefficients */ - silk_memcpy( AR1_Q24, AR2_Q24, psEnc->sCmn.shapingLPCOrder * sizeof( opus_int32 ) ); - - /* Bandwidth expansion for analysis filter shaping */ - silk_assert( BWExp1_Q16 <= SILK_FIX_CONST( 1.0, 16 ) ); - 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 ); - - /*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 ); - psEncCtrl->GainsPre_Q14[ k ] = ( opus_int ) SILK_FIX_CONST( 0.3, 14 ) + silk_DIV32_varQ( pre_nrg_Q30, nrg, 14 ); - - /* Convert to monic warped prediction coefficients and limit absolute values */ - limit_warped_coefs( AR2_Q24, AR1_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->AR1_Q13[ k * MAX_SHAPE_LPC_ORDER + i ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( AR1_Q24[ i ], 11 ) ); - psEncCtrl->AR2_Q13[ k * MAX_SHAPE_LPC_ORDER + i ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( AR2_Q24[ i ], 11 ) ); - } - } - - /*****************/ - /* 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 ); - } - - gain_mult_Q16 = SILK_FIX_CONST( 1.0, 16 ) + silk_RSHIFT_ROUND( silk_MLA( SILK_FIX_CONST( INPUT_TILT, 26 ), - psEncCtrl->coding_quality_Q14, SILK_FIX_CONST( HIGH_RATE_INPUT_TILT, 12 ) ), 10 ); - for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { - psEncCtrl->GainsPre_Q14[ k ] = silk_SMULWB( gain_mult_Q16, psEncCtrl->GainsPre_Q14[ k ] ); - } - - /************************************************/ - /* 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 */ - /****************************/ - /* Control boosting of harmonic frequencies */ - HarmBoost_Q16 = silk_SMULWB( silk_SMULWB( SILK_FIX_CONST( 1.0, 17 ) - silk_LSHIFT( psEncCtrl->coding_quality_Q14, 3 ), - psEnc->LTPCorr_Q15 ), SILK_FIX_CONST( LOW_RATE_HARMONIC_BOOST, 16 ) ); - - /* More harmonic boost for noisy input signals */ - HarmBoost_Q16 = silk_SMLAWB( HarmBoost_Q16, - SILK_FIX_CONST( 1.0, 16 ) - silk_LSHIFT( psEncCtrl->input_quality_Q14, 2 ), SILK_FIX_CONST( LOW_INPUT_QUALITY_HARMONIC_BOOST, 16 ) ); - - 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->HarmBoost_smth_Q16 = - silk_SMLAWB( psShapeSt->HarmBoost_smth_Q16, HarmBoost_Q16 - psShapeSt->HarmBoost_smth_Q16, SILK_FIX_CONST( SUBFR_SMTH_COEF, 16 ) ); - 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->HarmBoost_Q14[ k ] = ( opus_int )silk_RSHIFT_ROUND( psShapeSt->HarmBoost_smth_Q16, 2 ); - 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/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/pitch_analysis_core_FIX.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/pitch_analysis_core_FIX.c deleted file mode 100644 index 1641a0fb..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/pitch_analysis_core_FIX.c +++ /dev/null @@ -1,744 +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 - -/*********************************************************** -* Pitch analyser function -********************************************************** */ -#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 */ -/************************************************************/ -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 */ - int arch /* I Run-time architecture */ -); - -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 */ -); - -/*************************************************************/ -/* 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 */ - 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_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 */ - int arch /* I Run-time architecture */ -) -{ - VARDECL( opus_int16, frame_8kHz ); - VARDECL( opus_int16, frame_4kHz ); - opus_int32 filt_state[ 6 ]; - const opus_int16 *input_frame_ptr; - opus_int i, k, d, j; - 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; - 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; - 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_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 ); - - /* Check for valid complexity setting */ - silk_assert( complexity >= SILK_PE_MIN_COMPLEX ); - silk_assert( complexity <= SILK_PE_MAX_COMPLEX ); - - silk_assert( search_thres1_Q16 >= 0 && search_thres1_Q16 <= (1<<16) ); - 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; - min_lag = PE_MIN_LAG_MS * Fs_kHz; - max_lag = PE_MAX_LAG_MS * Fs_kHz - 1; - - /* Resample from input sampled at Fs_kHz to 8 kHz */ - ALLOC( frame_8kHz, frame_length_8kHz, opus_int16 ); - if( Fs_kHz == 16 ) { - silk_memset( filt_state, 0, 2 * sizeof( opus_int32 ) ); - silk_resampler_down2( filt_state, frame_8kHz, frame, frame_length ); - } 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 ); - } else { - silk_assert( Fs_kHz == 8 ); - silk_memcpy( frame_8kHz, frame, frame_length_8kHz * sizeof(opus_int16) ); - } - - /* 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 */ - for( i = frame_length_4kHz - 1; i > 0; i-- ) { - 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 */ - silk_sum_sqr_shift( &energy, &shift, frame_4kHz, frame_length_4kHz ); - if( shift > 0 ) { - shift = silk_RSHIFT( shift, 1 ); - for( i = 0; i < frame_length_4kHz; i++ ) { - frame_4kHz[ i ] = silk_RSHIFT( frame_4kHz[ i ], shift ); - } - } - - /****************************************************************************** - * FIRST STAGE, operating in 4 khz - ******************************************************************************/ - 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 ); - - 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_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 = xcorr32[ MAX_LAG_4KHZ - MIN_LAG_4KHZ ]; - normalizer = silk_inner_prod_aligned( target_ptr, target_ptr, SF_LENGTH_8KHZ ); - normalizer = silk_ADD32( normalizer, silk_inner_prod_aligned( basis_ptr, basis_ptr, SF_LENGTH_8KHZ ) ); - normalizer = silk_ADD32( normalizer, silk_SMULBB( SF_LENGTH_8KHZ, 4000 ) ); - - 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++ ) { - 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 = xcorr32[ MAX_LAG_4KHZ - d ]; - - /* Add contribution of new sample and remove contribution from oldest sample */ - normalizer = silk_ADD32( normalizer, - silk_SMULBB( basis_ptr[ 0 ], basis_ptr[ 0 ] ) - - silk_SMULBB( basis_ptr[ SF_LENGTH_8KHZ ], basis_ptr[ SF_LENGTH_8KHZ ] ) ); - - 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; - } - - /* 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)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 = 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, d_srch, CSTRIDE_4KHZ, - length_d_srch ); - - /* Escape if correlation is very low already here */ - 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[ 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 ); - - 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 ] - D_COMP_MIN ] = 1; - } - - /* Convolution */ - 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 - D_COMP_MIN ] > 0 ) { - d_srch[ length_d_srch ] = i; - length_d_srch++; - } - } - - /* Convolution */ - 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 < D_COMP_MAX; i++ ) { - if( d_comp[ i - D_COMP_MIN ] > 0 ) { - d_comp[ length_d_comp ] = i - 2; - length_d_comp++; - } - } - - /********************************************************************************** - ** 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 */ - silk_sum_sqr_shift( &energy, &shift, frame_8kHz, frame_length_8kHz ); - if( shift > 0 ) { - shift = silk_RSHIFT( shift, 1 ); - 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, 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 ); - - energy_target = silk_ADD32( silk_inner_prod_aligned( target_ptr, target_ptr, SF_LENGTH_8KHZ ), 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 ); - - cross_corr = silk_inner_prod_aligned( target_ptr, basis_ptr, SF_LENGTH_8KHZ ); - if( cross_corr > 0 ) { - energy_basis = silk_inner_prod_aligned( basis_ptr, basis_ptr, SF_LENGTH_8KHZ ); - 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 { - matrix_ptr( C, k, d - ( MIN_LAG_8KHZ - 2 ), CSTRIDE_8KHZ ) = 0; - } - } - target_ptr += SF_LENGTH_8KHZ; - } - - /* search over lag range and lags codebook */ - /* scale factor for lag codebook, as a function of center lag */ - - CCmax = silk_int32_MIN; - CCmax_b = silk_int32_MIN; - - CBimax = 0; /* To avoid returning undefined lag values */ - lag = -1; /* To check if lag with strong enough correlation has been found */ - - if( prevLag > 0 ) { - if( Fs_kHz == 12 ) { - prevLag = silk_DIV32_16( silk_LSHIFT( prevLag, 1 ), 3 ); - } else if( Fs_kHz == 16 ) { - prevLag = silk_RSHIFT( prevLag, 1 ); - } - prevLag_log2_Q7 = silk_lin2log( (opus_int32)prevLag ); - } else { - prevLag_log2_Q7 = 0; - } - 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; - Lag_CB_ptr = &silk_CB_lags_stage2[ 0 ][ 0 ]; - if( Fs_kHz == 8 && complexity > SILK_PE_MIN_COMPLEX ) { - /* If input is 8 khz use a larger codebook here because it is last stage */ - nb_cbk_search = PE_NB_CBKS_STAGE2_EXT; - } else { - nb_cbk_search = PE_NB_CBKS_STAGE2; - } - } 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; - } - - for( k = 0; k < length_d_srch; k++ ) { - d = d_srch[ k ]; - 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 */ - 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 */ - CCmax_new = silk_int32_MIN; - CBimax_new = 0; - for( i = 0; i < nb_cbk_search; i++ ) { - if( CC[ i ] > CCmax_new ) { - CCmax_new = CC[ i ]; - CBimax_new = i; - } - } - - /* Bias towards shorter lags */ - 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, 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, 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_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 > 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; - lag = d; - CBimax = CBimax_new; - } - } - - if( lag == -1 ) { - /* No suitable candidate found */ - silk_memset( pitch_out, 0, nb_subfr * sizeof( opus_int ) ); - *LTPCorr_Q15 = 0; - *lagIndex = 0; - *contourIndex = 0; - RESTORE_STACK; - return 1; - } - - /* 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 ) { - VARDECL( opus_int16, scratch_mem ); - /***************************************************************************/ - /* Scale input signal down to avoid correlations measures from overflowing */ - /***************************************************************************/ - /* find scaling as max scaling for each subframe */ - silk_sum_sqr_shift( &energy, &shift, frame, frame_length ); - ALLOC( scratch_mem, shift > 0 ? frame_length : ALLOC_NONE, opus_int16 ); - if( shift > 0 ) { - /* Move signal to scratch mem because the input signal should be unchanged */ - shift = silk_RSHIFT( shift, 1 ); - for( i = 0; i < frame_length; i++ ) { - scratch_mem[ i ] = silk_RSHIFT( frame[ i ], shift ); - } - input_frame_ptr = scratch_mem; - } else { - input_frame_ptr = frame; - } - - /* Search in original signal */ - - CBimax_old = CBimax; - /* Compensate for decimation */ - silk_assert( lag == silk_SAT16( lag ) ); - if( Fs_kHz == 12 ) { - lag = silk_RSHIFT( silk_SMULBB( lag, 3 ), 1 ); - } else if( Fs_kHz == 16 ) { - lag = silk_LSHIFT( lag, 1 ); - } else { - lag = silk_SMULBB( lag, 3 ); - } - - lag = silk_LIMIT_int( lag, min_lag, max_lag ); - 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 */ - - 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 ]; - } - - /* Set up codebook parameters according to complexity setting and frame length */ - if( nb_subfr == PE_MAX_NB_SUBFR ) { - nb_cbk_search = (opus_int)silk_nb_cbk_searchs_stage3[ complexity ]; - cbk_size = PE_NB_CBKS_STAGE3_MAX; - Lag_CB_ptr = &silk_CB_lags_stage3[ 0 ][ 0 ]; - } else { - nb_cbk_search = PE_NB_CBKS_STAGE3_10MS; - 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, input_frame_ptr, start_lag, sf_length, nb_subfr, complexity, arch ); - 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_Q15 = silk_DIV32_16( SILK_FIX_CONST( PE_FLATCONTOUR_BIAS, 15 ), lag ); - - target_ptr = &input_frame_ptr[ PE_LTP_MEM_LENGTH_MS * Fs_kHz ]; - energy_target = silk_ADD32( silk_inner_prod_aligned( target_ptr, target_ptr, nb_subfr * sf_length ), 1 ); - for( d = start_lag; d <= end_lag; d++ ) { - for( j = 0; j < nb_cbk_search; j++ ) { - cross_corr = 0; - energy = energy_target; - for( k = 0; k < nb_subfr; k++ ) { - 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 ); - } - if( cross_corr > 0 ) { - CCmax_new = silk_DIV32_varQ( cross_corr, energy, 13 + 1 ); /* Q13 */ - /* Reduce depending on flatness of contour */ - diff = silk_int16_MAX - silk_MUL( contour_bias_Q15, j ); /* Q15 */ - silk_assert( diff == silk_SAT16( diff ) ); - 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 ) { - CCmax = CCmax_new; - lag_new = d; - CBimax = j; - } - } - lag_counter++; - } - - for( k = 0; k < nb_subfr; k++ ) { - pitch_out[ k ] = lag_new + matrix_ptr( Lag_CB_ptr, k, CBimax, cbk_size ); - pitch_out[ k ] = silk_LIMIT( pitch_out[ k ], min_lag, PE_MAX_LAG_MS * Fs_kHz ); - } - *lagIndex = (opus_int16)( lag_new - min_lag); - *contourIndex = (opus_int8)CBimax; - } else { /* Fs_kHz == 8 */ - /* 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 * 8 ); - } - *lagIndex = (opus_int16)( lag - MIN_LAG_8KHZ ); - *contourIndex = (opus_int8)CBimax; - } - silk_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), - * 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 */ - int arch /* I Run-time architecture */ -) -{ - 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; - 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 ); - - if( nb_subfr == PE_MAX_NB_SUBFR ) { - Lag_range_ptr = &silk_Lag_range_stage3[ complexity ][ 0 ][ 0 ]; - Lag_CB_ptr = &silk_CB_lags_stage3[ 0 ][ 0 ]; - 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); - 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++ ) { - lag_counter = 0; - - /* 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, xcorr32, sf_length, lag_high - lag_low + 1, arch ); - for( j = lag_low; j <= lag_high; j++ ) { - silk_assert( lag_counter < SCRATCH_SIZE ); - scratch_mem[ lag_counter ] = xcorr32[ lag_high - j ]; - lag_counter++; - } - - delta = matrix_ptr( Lag_range_ptr, k, 0, 2 ); - for( i = 0; i < nb_cbk_search; i++ ) { - /* Fill out the 3 dim array that stores the correlations for */ - /* each code_book vector for each start lag */ - idx = matrix_ptr( Lag_CB_ptr, k, i, cbk_size ) - delta; - for( j = 0; j < PE_NB_STAGE3_LAGS; j++ ) { - silk_assert( idx + j < SCRATCH_SIZE ); - silk_assert( idx + j < lag_counter ); - 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. */ -/********************************************************************/ -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 */ -) -{ - 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; - 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 ); - - if( nb_subfr == PE_MAX_NB_SUBFR ) { - Lag_range_ptr = &silk_Lag_range_stage3[ complexity ][ 0 ][ 0 ]; - Lag_CB_ptr = &silk_CB_lags_stage3[ 0 ][ 0 ]; - 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); - 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 ); - silk_assert( energy >= 0 ); - scratch_mem[ lag_counter ] = energy; - lag_counter++; - - lag_diff = ( matrix_ptr( Lag_range_ptr, k, 1, 2 ) - matrix_ptr( Lag_range_ptr, k, 0, 2 ) + 1 ); - for( i = 1; i < lag_diff; i++ ) { - /* remove part outside new window */ - energy -= silk_SMULBB( basis_ptr[ sf_length - i ], basis_ptr[ sf_length - i ] ); - silk_assert( energy >= 0 ); - - /* add part that comes into window */ - energy = silk_ADD_SAT32( energy, silk_SMULBB( basis_ptr[ -i ], basis_ptr[ -i ] ) ); - silk_assert( energy >= 0 ); - silk_assert( lag_counter < SCRATCH_SIZE ); - scratch_mem[ lag_counter ] = energy; - lag_counter++; - } - - delta = matrix_ptr( Lag_range_ptr, k, 0, 2 ); - for( i = 0; i < nb_cbk_search; i++ ) { - /* Fill out the 3 dim array that stores the correlations for */ - /* each code_book vector for each start lag */ - idx = matrix_ptr( Lag_CB_ptr, k, i, cbk_size ) - delta; - for( j = 0; j < PE_NB_STAGE3_LAGS; j++ ) { - silk_assert( idx + j < SCRATCH_SIZE ); - silk_assert( idx + j < lag_counter ); - 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; - } - RESTORE_STACK; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/prefilter_FIX.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/prefilter_FIX.c deleted file mode 100644 index d381730c..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/prefilter_FIX.c +++ /dev/null @@ -1,209 +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 "stack_alloc.h" -#include "tuning_parameters.h" - -/* Prefilter for finding Quantizer input signal */ -static OPUS_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; - VARDECL( opus_int32, x_filt_Q12 ); - VARDECL( opus_int32, st_res_Q2 ); - opus_int16 B_Q10[ 2 ]; - SAVE_STACK; - - /* Set up pointers */ - px = x; - pxw_Q3 = xw_Q3; - lag = P->lagPrev; - ALLOC( x_filt_Q12, psEnc->sCmn.subfr_length, opus_int32 ); - ALLOC( st_res_Q2, psEnc->sCmn.subfr_length, opus_int32 ); - 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 ]; - RESTORE_STACK; -} - -/* Prefilter for finding Quantizer input signal */ -static OPUS_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/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/process_gains_FIX.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/process_gains_FIX.c deleted file mode 100644 index 05aba317..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/process_gains_FIX.c +++ /dev/null @@ -1,117 +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" - -/* Processing of gains */ -void silk_process_gains_FIX( - silk_encoder_state_FIX *psEnc, /* I/O Encoder state */ - silk_encoder_control_FIX *psEncCtrl, /* I/O Encoder control */ - opus_int condCoding /* I The type of conditional coding to use */ -) -{ - silk_shape_state_FIX *psShapeSt = &psEnc->sShape; - opus_int k; - opus_int32 s_Q16, InvMaxSqrVal_Q16, gain, gain_squared, ResNrg, ResNrgPart, quant_offset_Q10; - - /* Gain reduction when LTP coding gain is high */ - if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { - /*s = -0.5f * silk_sigmoid( 0.25f * ( psEncCtrl->LTPredCodGain - 12.0f ) ); */ - s_Q16 = -silk_sigm_Q15( silk_RSHIFT_ROUND( psEncCtrl->LTPredCodGain_Q7 - SILK_FIX_CONST( 12.0, 7 ), 4 ) ); - for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { - psEncCtrl->Gains_Q16[ k ] = silk_SMLAWB( psEncCtrl->Gains_Q16[ k ], psEncCtrl->Gains_Q16[ k ], s_Q16 ); - } - } - - /* Limit the quantized signal */ - /* InvMaxSqrVal = pow( 2.0f, 0.33f * ( 21.0f - SNR_dB ) ) / subfr_length; */ - InvMaxSqrVal_Q16 = silk_DIV32_16( silk_log2lin( - silk_SMULWB( SILK_FIX_CONST( 21 + 16 / 0.33, 7 ) - psEnc->sCmn.SNR_dB_Q7, SILK_FIX_CONST( 0.33, 16 ) ) ), psEnc->sCmn.subfr_length ); - - for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { - /* Soft limit on ratio residual energy and squared gains */ - ResNrg = psEncCtrl->ResNrg[ k ]; - ResNrgPart = silk_SMULWW( ResNrg, InvMaxSqrVal_Q16 ); - if( psEncCtrl->ResNrgQ[ k ] > 0 ) { - ResNrgPart = silk_RSHIFT_ROUND( ResNrgPart, psEncCtrl->ResNrgQ[ k ] ); - } else { - if( ResNrgPart >= silk_RSHIFT( silk_int32_MAX, -psEncCtrl->ResNrgQ[ k ] ) ) { - ResNrgPart = silk_int32_MAX; - } else { - ResNrgPart = silk_LSHIFT( ResNrgPart, -psEncCtrl->ResNrgQ[ k ] ); - } - } - gain = psEncCtrl->Gains_Q16[ k ]; - gain_squared = silk_ADD_SAT32( ResNrgPart, silk_SMMUL( gain, gain ) ); - if( gain_squared < silk_int16_MAX ) { - /* recalculate with higher precision */ - gain_squared = silk_SMLAWW( silk_LSHIFT( ResNrgPart, 16 ), gain, gain ); - silk_assert( gain_squared > 0 ); - gain = silk_SQRT_APPROX( gain_squared ); /* Q8 */ - gain = silk_min( gain, silk_int32_MAX >> 8 ); - psEncCtrl->Gains_Q16[ k ] = silk_LSHIFT_SAT32( gain, 8 ); /* Q16 */ - } else { - gain = silk_SQRT_APPROX( gain_squared ); /* Q0 */ - gain = silk_min( gain, silk_int32_MAX >> 16 ); - psEncCtrl->Gains_Q16[ k ] = silk_LSHIFT_SAT32( gain, 16 ); /* Q16 */ - } - } - - /* Save unquantized gains and gain Index */ - silk_memcpy( psEncCtrl->GainsUnq_Q16, psEncCtrl->Gains_Q16, psEnc->sCmn.nb_subfr * sizeof( opus_int32 ) ); - psEncCtrl->lastGainIndexPrev = psShapeSt->LastGainIndex; - - /* Quantize gains */ - silk_gains_quant( psEnc->sCmn.indices.GainsIndices, psEncCtrl->Gains_Q16, - &psShapeSt->LastGainIndex, condCoding == CODE_CONDITIONALLY, psEnc->sCmn.nb_subfr ); - - /* Set quantizer offset for voiced signals. Larger offset when LTP coding gain is low or tilt is high (ie low-pass) */ - if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { - if( psEncCtrl->LTPredCodGain_Q7 + silk_RSHIFT( psEnc->sCmn.input_tilt_Q15, 8 ) > SILK_FIX_CONST( 1.0, 7 ) ) { - psEnc->sCmn.indices.quantOffsetType = 0; - } else { - psEnc->sCmn.indices.quantOffsetType = 1; - } - } - - /* Quantizer boundary adjustment */ - quant_offset_Q10 = silk_Quantization_Offsets_Q10[ psEnc->sCmn.indices.signalType >> 1 ][ psEnc->sCmn.indices.quantOffsetType ]; - psEncCtrl->Lambda_Q10 = SILK_FIX_CONST( LAMBDA_OFFSET, 10 ) - + silk_SMULBB( SILK_FIX_CONST( LAMBDA_DELAYED_DECISIONS, 10 ), psEnc->sCmn.nStatesDelayedDecision ) - + silk_SMULWB( SILK_FIX_CONST( LAMBDA_SPEECH_ACT, 18 ), psEnc->sCmn.speech_activity_Q8 ) - + silk_SMULWB( SILK_FIX_CONST( LAMBDA_INPUT_QUALITY, 12 ), psEncCtrl->input_quality_Q14 ) - + silk_SMULWB( SILK_FIX_CONST( LAMBDA_CODING_QUALITY, 12 ), psEncCtrl->coding_quality_Q14 ) - + silk_SMULWB( SILK_FIX_CONST( LAMBDA_QUANT_OFFSET, 16 ), quant_offset_Q10 ); - - silk_assert( psEncCtrl->Lambda_Q10 > 0 ); - silk_assert( psEncCtrl->Lambda_Q10 < SILK_FIX_CONST( 2, 10 ) ); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/regularize_correlations_FIX.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/regularize_correlations_FIX.c deleted file mode 100644 index a2836b05..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/regularize_correlations_FIX.c +++ /dev/null @@ -1,47 +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" - -/* 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 */ -) -{ - opus_int i; - for( i = 0; i < D; i++ ) { - matrix_ptr( &XX[ 0 ], i, i, D ) = silk_ADD32( matrix_ptr( &XX[ 0 ], i, i, D ), noise ); - } - xx[ 0 ] += noise; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/residual_energy16_FIX.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/residual_energy16_FIX.c deleted file mode 100644 index ebffb2a6..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/residual_energy16_FIX.c +++ /dev/null @@ -1,103 +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" - -/* Residual energy: nrg = wxx - 2 * wXx * c + c' * wXX * c */ -opus_int32 silk_residual_energy16_covar_FIX( - const opus_int16 *c, /* I Prediction vector */ - const opus_int32 *wXX, /* I Correlation matrix */ - const opus_int32 *wXx, /* I Correlation vector */ - opus_int32 wxx, /* I Signal energy */ - opus_int D, /* I Dimension */ - opus_int cQ /* I Q value for c vector 0 - 15 */ -) -{ - opus_int i, j, lshifts, Qxtra; - opus_int32 c_max, w_max, tmp, tmp2, nrg; - opus_int cn[ MAX_MATRIX_SIZE ]; - const opus_int32 *pRow; - - /* Safety checks */ - silk_assert( D >= 0 ); - silk_assert( D <= 16 ); - silk_assert( cQ > 0 ); - silk_assert( cQ < 16 ); - - lshifts = 16 - cQ; - Qxtra = lshifts; - - c_max = 0; - for( i = 0; i < D; i++ ) { - c_max = silk_max_32( c_max, silk_abs( (opus_int32)c[ i ] ) ); - } - Qxtra = silk_min_int( Qxtra, silk_CLZ32( c_max ) - 17 ); - - w_max = silk_max_32( wXX[ 0 ], wXX[ D * D - 1 ] ); - Qxtra = silk_min_int( Qxtra, silk_CLZ32( silk_MUL( D, silk_RSHIFT( silk_SMULWB( w_max, c_max ), 4 ) ) ) - 5 ); - Qxtra = silk_max_int( Qxtra, 0 ); - for( i = 0; i < D; i++ ) { - cn[ i ] = silk_LSHIFT( ( opus_int )c[ i ], Qxtra ); - silk_assert( silk_abs(cn[i]) <= ( silk_int16_MAX + 1 ) ); /* Check that silk_SMLAWB can be used */ - } - lshifts -= Qxtra; - - /* Compute wxx - 2 * wXx * c */ - tmp = 0; - for( i = 0; i < D; i++ ) { - tmp = silk_SMLAWB( tmp, wXx[ i ], cn[ i ] ); - } - nrg = silk_RSHIFT( wxx, 1 + lshifts ) - tmp; /* Q: -lshifts - 1 */ - - /* Add c' * wXX * c, assuming wXX is symmetric */ - tmp2 = 0; - for( i = 0; i < D; i++ ) { - tmp = 0; - pRow = &wXX[ i * D ]; - for( j = i + 1; j < D; j++ ) { - tmp = silk_SMLAWB( tmp, pRow[ j ], cn[ j ] ); - } - tmp = silk_SMLAWB( tmp, silk_RSHIFT( pRow[ i ], 1 ), cn[ i ] ); - tmp2 = silk_SMLAWB( tmp2, tmp, cn[ i ] ); - } - nrg = silk_ADD_LSHIFT32( nrg, tmp2, lshifts ); /* Q: -lshifts - 1 */ - - /* Keep one bit free always, because we add them for LSF interpolation */ - if( nrg < 1 ) { - nrg = 1; - } else if( nrg > silk_RSHIFT( silk_int32_MAX, lshifts + 2 ) ) { - nrg = silk_int32_MAX >> 1; - } else { - nrg = silk_LSHIFT( nrg, lshifts + 1 ); /* Q0 */ - } - return nrg; - -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/residual_energy_FIX.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/residual_energy_FIX.c deleted file mode 100644 index 105ae318..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/residual_energy_FIX.c +++ /dev/null @@ -1,97 +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 "stack_alloc.h" - -/* Calculates residual energies of input subframes where all subframes have LPC_order */ -/* of preceding samples */ -void silk_residual_energy_FIX( - opus_int32 nrgs[ MAX_NB_SUBFR ], /* O Residual energy per subframe */ - opus_int nrgsQ[ MAX_NB_SUBFR ], /* O Q value per subframe */ - const opus_int16 x[], /* I Input signal */ - opus_int16 a_Q12[ 2 ][ MAX_LPC_ORDER ], /* I AR coefs for each frame half */ - 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 */ -) -{ - opus_int offset, i, j, rshift, lz1, lz2; - 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 ); - silk_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 ); - - /* Point to first subframe of the just calculated LPC residual signal */ - LPC_res_ptr = LPC_res + LPC_order; - for( j = 0; j < ( MAX_NB_SUBFR >> 1 ); j++ ) { - /* Measure subframe energy */ - silk_sum_sqr_shift( &nrgs[ i * ( MAX_NB_SUBFR >> 1 ) + j ], &rshift, LPC_res_ptr, subfr_length ); - - /* Set Q values for the measured energy */ - nrgsQ[ i * ( MAX_NB_SUBFR >> 1 ) + j ] = -rshift; - - /* Move to next subframe */ - LPC_res_ptr += offset; - } - /* Move to next frame half */ - x_ptr += ( MAX_NB_SUBFR >> 1 ) * offset; - } - - /* Apply the squared subframe gains */ - for( i = 0; i < nb_subfr; i++ ) { - /* Fully upscale gains and energies */ - lz1 = silk_CLZ32( nrgs[ i ] ) - 1; - lz2 = silk_CLZ32( gains[ i ] ) - 1; - - tmp32 = silk_LSHIFT32( gains[ i ], lz2 ); - - /* Find squared gains */ - tmp32 = silk_SMMUL( tmp32, tmp32 ); /* Q( 2 * lz2 - 32 )*/ - - /* Scale energies */ - 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/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/schur64_FIX.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/schur64_FIX.c deleted file mode 100644 index 764a10ef..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/schur64_FIX.c +++ /dev/null @@ -1,92 +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 "SigProc_FIX.h" - -/* Slower than schur(), but more accurate. */ -/* Uses SMULL(), available on armv4 */ -opus_int32 silk_schur64( /* O returns residual energy */ - opus_int32 rc_Q16[], /* O Reflection coefficients [order] Q16 */ - const opus_int32 c[], /* I Correlations [order+1] */ - opus_int32 order /* I Prediction order */ -) -{ - opus_int k, n; - 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 ); - - /* Check for invalid input */ - if( c[ 0 ] <= 0 ) { - silk_memset( rc_Q16, 0, order * sizeof( opus_int32 ) ); - return 0; - } - - for( k = 0; k < order + 1; k++ ) { - C[ k ][ 0 ] = C[ k ][ 1 ] = c[ k ]; - } - - for( k = 0; k < order; k++ ) { - /* Check that we won't be getting an unstable rc, otherwise stop here. */ - if (silk_abs_int32(C[ k + 1 ][ 0 ]) >= C[ 0 ][ 1 ]) { - if ( C[ k + 1 ][ 0 ] > 0 ) { - rc_Q16[ k ] = -SILK_FIX_CONST( .99f, 16 ); - } else { - rc_Q16[ k ] = SILK_FIX_CONST( .99f, 16 ); - } - k++; - break; - } - - /* Get reflection coefficient: divide two Q30 values and get result in Q31 */ - rc_tmp_Q31 = silk_DIV32_varQ( -C[ k + 1 ][ 0 ], C[ 0 ][ 1 ], 31 ); - - /* Save the output */ - rc_Q16[ k ] = silk_RSHIFT_ROUND( rc_tmp_Q31, 15 ); - - /* Update correlations */ - for( n = 0; n < order - k; n++ ) { - Ctmp1_Q30 = C[ n + k + 1 ][ 0 ]; - Ctmp2_Q30 = C[ n ][ 1 ]; - - /* Multiply and add the highest int32 */ - C[ n + k + 1 ][ 0 ] = Ctmp1_Q30 + silk_SMMUL( silk_LSHIFT( Ctmp2_Q30, 1 ), rc_tmp_Q31 ); - C[ n ][ 1 ] = Ctmp2_Q30 + silk_SMMUL( silk_LSHIFT( Ctmp1_Q30, 1 ), rc_tmp_Q31 ); - } - } - - for(; k < order; k++ ) { - rc_Q16[ k ] = 0; - } - - return silk_max_32( 1, C[ 0 ][ 1 ] ); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/schur_FIX.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/schur_FIX.c deleted file mode 100644 index c4c0ef23..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/schur_FIX.c +++ /dev/null @@ -1,106 +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 "SigProc_FIX.h" - -/* Faster than schur64(), but much less accurate. */ -/* uses SMLAWB(), requiring armv5E and higher. */ -opus_int32 silk_schur( /* O Returns residual energy */ - opus_int16 *rc_Q15, /* O reflection coefficients [order] Q15 */ - const opus_int32 *c, /* I correlations [order+1] */ - const opus_int32 order /* I prediction order */ -) -{ - opus_int k, n, lz; - 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 ); - - /* Get number of leading zeros */ - lz = silk_CLZ32( c[ 0 ] ); - - /* Copy correlations and adjust level to Q30 */ - if( lz < 2 ) { - /* lz must be 1, so shift one to the right */ - for( k = 0; k < order + 1; k++ ) { - C[ k ][ 0 ] = C[ k ][ 1 ] = silk_RSHIFT( c[ k ], 1 ); - } - } else if( lz > 2 ) { - /* Shift to the left */ - lz -= 2; - for( k = 0; k < order + 1; k++ ) { - C[ k ][ 0 ] = C[ k ][ 1 ] = silk_LSHIFT( c[ k ], lz ); - } - } else { - /* No need to shift */ - for( k = 0; k < order + 1; k++ ) { - C[ k ][ 0 ] = C[ k ][ 1 ] = c[ k ]; - } - } - - for( k = 0; k < order; k++ ) { - /* Check that we won't be getting an unstable rc, otherwise stop here. */ - if (silk_abs_int32(C[ k + 1 ][ 0 ]) >= C[ 0 ][ 1 ]) { - if ( C[ k + 1 ][ 0 ] > 0 ) { - rc_Q15[ k ] = -SILK_FIX_CONST( .99f, 15 ); - } else { - rc_Q15[ k ] = SILK_FIX_CONST( .99f, 15 ); - } - k++; - break; - } - - /* Get reflection coefficient */ - rc_tmp_Q15 = -silk_DIV32_16( C[ k + 1 ][ 0 ], silk_max_32( silk_RSHIFT( C[ 0 ][ 1 ], 15 ), 1 ) ); - - /* Clip (shouldn't happen for properly conditioned inputs) */ - rc_tmp_Q15 = silk_SAT16( rc_tmp_Q15 ); - - /* Store */ - rc_Q15[ k ] = (opus_int16)rc_tmp_Q15; - - /* Update correlations */ - for( n = 0; n < order - k; n++ ) { - Ctmp1 = C[ n + k + 1 ][ 0 ]; - Ctmp2 = C[ n ][ 1 ]; - C[ n + k + 1 ][ 0 ] = silk_SMLAWB( Ctmp1, silk_LSHIFT( Ctmp2, 1 ), rc_tmp_Q15 ); - C[ n ][ 1 ] = silk_SMLAWB( Ctmp2, silk_LSHIFT( Ctmp1, 1 ), rc_tmp_Q15 ); - } - } - - for(; k < order; k++ ) { - rc_Q15[ k ] = 0; - } - - /* return residual energy */ - return silk_max_32( 1, C[ 0 ][ 1 ] ); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/solve_LS_FIX.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/solve_LS_FIX.c deleted file mode 100644 index 51d7d49d..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/solve_LS_FIX.c +++ /dev/null @@ -1,249 +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 "stack_alloc.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 OPUS_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 OPUS_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 OPUS_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 OPUS_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 */ -) -{ - VARDECL( opus_int32, L_Q16 ); - opus_int32 Y[ MAX_MATRIX_SIZE ]; - inv_D_t inv_D[ MAX_MATRIX_SIZE ]; - SAVE_STACK; - - silk_assert( M <= MAX_MATRIX_SIZE ); - ALLOC( L_Q16, M * M, opus_int32 ); - - /*************************************************** - 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 ); - RESTORE_STACK; -} - -static OPUS_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 OPUS_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 OPUS_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 OPUS_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/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/structs_FIX.h b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/structs_FIX.h deleted file mode 100644 index 244b4793..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/structs_FIX.h +++ /dev/null @@ -1,133 +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. -***********************************************************************/ - -#ifndef SILK_STRUCTS_FIX_H -#define SILK_STRUCTS_FIX_H - -#include "typedef.h" -#include "main.h" -#include "structs.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -/********************************/ -/* Noise shaping analysis state */ -/********************************/ -typedef struct { - opus_int8 LastGainIndex; - opus_int32 HarmBoost_smth_Q16; - opus_int32 HarmShapeGain_smth_Q16; - 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 */ -} silk_encoder_state_FIX; - -/************************/ -/* Encoder control FIX */ -/************************/ -typedef struct { - /* Prediction and coding parameters */ - 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; - opus_int pitchL[ MAX_NB_SUBFR ]; - - /* 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 ]; - 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; - opus_int input_quality_Q14; - 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 */ - opus_int ResNrgQ[ MAX_NB_SUBFR ]; /* Q domain for the residual energy > 0 */ - - /* Parameters for CBR mode */ - opus_int32 GainsUnq_Q16[ MAX_NB_SUBFR ]; - opus_int8 lastGainIndexPrev; -} silk_encoder_control_FIX; - -/************************/ -/* Encoder Super Struct */ -/************************/ -typedef struct { - silk_encoder_state_FIX state_Fxx[ ENCODER_NUM_CHANNELS ]; - stereo_enc_state sStereo; - 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; -} silk_encoder; - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/vector_ops_FIX.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/vector_ops_FIX.c deleted file mode 100644 index 509c8b35..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/vector_ops_FIX.c +++ /dev/null @@ -1,96 +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 "SigProc_FIX.h" - -/* Copy and multiply a vector by a constant */ -void silk_scale_copy_vector16( - opus_int16 *data_out, - const opus_int16 *data_in, - opus_int32 gain_Q16, /* I Gain in Q16 */ - const opus_int dataSize /* I Length */ -) -{ - opus_int i; - opus_int32 tmp32; - - for( i = 0; i < dataSize; i++ ) { - tmp32 = silk_SMULWB( gain_Q16, data_in[ i ] ); - data_out[ i ] = (opus_int16)silk_CHECK_FIT16( tmp32 ); - } -} - -/* Multiply a vector by a constant */ -void silk_scale_vector32_Q26_lshift_18( - opus_int32 *data1, /* I/O Q0/Q18 */ - opus_int32 gain_Q26, /* I Q26 */ - opus_int dataSize /* I length */ -) -{ - opus_int i; - - for( i = 0; i < dataSize; i++ ) { - data1[ i ] = (opus_int32)silk_CHECK_FIT32( silk_RSHIFT64( silk_SMULL( data1[ i ], gain_Q26 ), 8 ) ); /* OUTPUT: Q18 */ - } -} - -/* sum = for(i=0;i6, memory access can be reduced by half. */ -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 */ -) -{ - opus_int i; - opus_int32 sum = 0; - for( i = 0; i < len; i++ ) { - sum = silk_SMLABB( sum, inVec1[ i ], inVec2[ i ] ); - } - return sum; -} - -opus_int64 silk_inner_prod16_aligned_64( - 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; - opus_int64 sum = 0; - for( i = 0; i < len; i++ ) { - sum = silk_SMLALBB( sum, inVec1[ i ], inVec2[ i ] ); - } - return sum; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/warped_autocorrelation_FIX.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/warped_autocorrelation_FIX.c deleted file mode 100644 index a4a579b1..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/fixed/warped_autocorrelation_FIX.c +++ /dev/null @@ -1,88 +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" - -#define QC 10 -#define QS 14 - -/* Autocorrelations for a warped frequency axis */ -void silk_warped_autocorrelation_FIX( - 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, tmp2_QS; - opus_int32 state_QS[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 }; - opus_int64 corr_QC[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 }; - - /* Order must be even */ - silk_assert( ( order & 1 ) == 0 ); - silk_assert( 2 * QS - QC >= 0 ); - - /* Loop over samples */ - for( n = 0; 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 ] += silk_RSHIFT64( silk_SMULL( tmp1_QS, state_QS[ 0 ] ), 2 * QS - QC ); - /* 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 ] += silk_RSHIFT64( silk_SMULL( tmp2_QS, state_QS[ 0 ] ), 2 * QS - QC ); - } - state_QS[ order ] = tmp1_QS; - corr_QC[ order ] += silk_RSHIFT64( silk_SMULL( tmp1_QS, state_QS[ 0 ] ), 2 * QS - QC ); - } - - lsh = silk_CLZ64( corr_QC[ 0 ] ) - 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++ ) { - corr[ i ] = (opus_int32)silk_CHECK_FIT32( silk_LSHIFT64( corr_QC[ i ], lsh ) ); - } - } else { - for( i = 0; i < order + 1; i++ ) { - corr[ i ] = (opus_int32)silk_CHECK_FIT32( silk_RSHIFT64( corr_QC[ i ], -lsh ) ); - } - } - silk_assert( corr_QC[ 0 ] >= 0 ); /* If breaking, decrease QC*/ -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/LPC_analysis_filter_FLP.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/LPC_analysis_filter_FLP.c deleted file mode 100644 index cae89a0a..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/LPC_analysis_filter_FLP.c +++ /dev/null @@ -1,249 +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 -#include "main_FLP.h" - -/************************************************/ -/* LPC analysis filter */ -/* NB! State is kept internally and the */ -/* filter always starts with zero state */ -/* first Order output samples are set to zero */ -/************************************************/ - -/* 16th order LPC analysis filter, does not write first 16 samples */ -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 */ - const opus_int length /* I Length of input signal */ -) -{ - opus_int ix; - silk_float LPC_pred; - const silk_float *s_ptr; - - for( ix = 16; ix < length; ix++ ) { - s_ptr = &s[ix - 1]; - - /* short-term prediction */ - LPC_pred = s_ptr[ 0 ] * PredCoef[ 0 ] + - s_ptr[ -1 ] * PredCoef[ 1 ] + - s_ptr[ -2 ] * PredCoef[ 2 ] + - s_ptr[ -3 ] * PredCoef[ 3 ] + - s_ptr[ -4 ] * PredCoef[ 4 ] + - s_ptr[ -5 ] * PredCoef[ 5 ] + - s_ptr[ -6 ] * PredCoef[ 6 ] + - s_ptr[ -7 ] * PredCoef[ 7 ] + - s_ptr[ -8 ] * PredCoef[ 8 ] + - s_ptr[ -9 ] * PredCoef[ 9 ] + - s_ptr[ -10 ] * PredCoef[ 10 ] + - s_ptr[ -11 ] * PredCoef[ 11 ] + - s_ptr[ -12 ] * PredCoef[ 12 ] + - s_ptr[ -13 ] * PredCoef[ 13 ] + - s_ptr[ -14 ] * PredCoef[ 14 ] + - s_ptr[ -15 ] * PredCoef[ 15 ]; - - /* prediction error */ - r_LPC[ix] = s_ptr[ 1 ] - LPC_pred; - } -} - -/* 12th order LPC analysis filter, does not write first 12 samples */ -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 */ - const opus_int length /* I Length of input signal */ -) -{ - opus_int ix; - silk_float LPC_pred; - const silk_float *s_ptr; - - for( ix = 12; ix < length; ix++ ) { - s_ptr = &s[ix - 1]; - - /* short-term prediction */ - LPC_pred = s_ptr[ 0 ] * PredCoef[ 0 ] + - s_ptr[ -1 ] * PredCoef[ 1 ] + - s_ptr[ -2 ] * PredCoef[ 2 ] + - s_ptr[ -3 ] * PredCoef[ 3 ] + - s_ptr[ -4 ] * PredCoef[ 4 ] + - s_ptr[ -5 ] * PredCoef[ 5 ] + - s_ptr[ -6 ] * PredCoef[ 6 ] + - s_ptr[ -7 ] * PredCoef[ 7 ] + - s_ptr[ -8 ] * PredCoef[ 8 ] + - s_ptr[ -9 ] * PredCoef[ 9 ] + - s_ptr[ -10 ] * PredCoef[ 10 ] + - s_ptr[ -11 ] * PredCoef[ 11 ]; - - /* prediction error */ - r_LPC[ix] = s_ptr[ 1 ] - LPC_pred; - } -} - -/* 10th order LPC analysis filter, does not write first 10 samples */ -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 */ - const opus_int length /* I Length of input signal */ -) -{ - opus_int ix; - silk_float LPC_pred; - const silk_float *s_ptr; - - for( ix = 10; ix < length; ix++ ) { - s_ptr = &s[ix - 1]; - - /* short-term prediction */ - LPC_pred = s_ptr[ 0 ] * PredCoef[ 0 ] + - s_ptr[ -1 ] * PredCoef[ 1 ] + - s_ptr[ -2 ] * PredCoef[ 2 ] + - s_ptr[ -3 ] * PredCoef[ 3 ] + - s_ptr[ -4 ] * PredCoef[ 4 ] + - s_ptr[ -5 ] * PredCoef[ 5 ] + - s_ptr[ -6 ] * PredCoef[ 6 ] + - s_ptr[ -7 ] * PredCoef[ 7 ] + - s_ptr[ -8 ] * PredCoef[ 8 ] + - s_ptr[ -9 ] * PredCoef[ 9 ]; - - /* prediction error */ - r_LPC[ix] = s_ptr[ 1 ] - LPC_pred; - } -} - -/* 8th order LPC analysis filter, does not write first 8 samples */ -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 */ - const opus_int length /* I Length of input signal */ -) -{ - opus_int ix; - silk_float LPC_pred; - const silk_float *s_ptr; - - for( ix = 8; ix < length; ix++ ) { - s_ptr = &s[ix - 1]; - - /* short-term prediction */ - LPC_pred = s_ptr[ 0 ] * PredCoef[ 0 ] + - s_ptr[ -1 ] * PredCoef[ 1 ] + - s_ptr[ -2 ] * PredCoef[ 2 ] + - s_ptr[ -3 ] * PredCoef[ 3 ] + - s_ptr[ -4 ] * PredCoef[ 4 ] + - s_ptr[ -5 ] * PredCoef[ 5 ] + - s_ptr[ -6 ] * PredCoef[ 6 ] + - s_ptr[ -7 ] * PredCoef[ 7 ]; - - /* prediction error */ - r_LPC[ix] = s_ptr[ 1 ] - LPC_pred; - } -} - -/* 6th order LPC analysis filter, does not write first 6 samples */ -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 */ - const opus_int length /* I Length of input signal */ -) -{ - opus_int ix; - silk_float LPC_pred; - const silk_float *s_ptr; - - for( ix = 6; ix < length; ix++ ) { - s_ptr = &s[ix - 1]; - - /* short-term prediction */ - LPC_pred = s_ptr[ 0 ] * PredCoef[ 0 ] + - s_ptr[ -1 ] * PredCoef[ 1 ] + - s_ptr[ -2 ] * PredCoef[ 2 ] + - s_ptr[ -3 ] * PredCoef[ 3 ] + - s_ptr[ -4 ] * PredCoef[ 4 ] + - s_ptr[ -5 ] * PredCoef[ 5 ]; - - /* prediction error */ - r_LPC[ix] = s_ptr[ 1 ] - LPC_pred; - } -} - -/************************************************/ -/* LPC analysis filter */ -/* NB! State is kept internally and the */ -/* filter always starts with zero state */ -/* first Order output samples are set to zero */ -/************************************************/ -void silk_LPC_analysis_filter_FLP( - silk_float r_LPC[], /* O LPC residual signal */ - const silk_float PredCoef[], /* I LPC coefficients */ - const silk_float s[], /* I Input signal */ - const opus_int length, /* I Length of input signal */ - const opus_int Order /* I LPC order */ -) -{ - silk_assert( Order <= length ); - - switch( Order ) { - case 6: - silk_LPC_analysis_filter6_FLP( r_LPC, PredCoef, s, length ); - break; - - case 8: - silk_LPC_analysis_filter8_FLP( r_LPC, PredCoef, s, length ); - break; - - case 10: - silk_LPC_analysis_filter10_FLP( r_LPC, PredCoef, s, length ); - break; - - case 12: - silk_LPC_analysis_filter12_FLP( r_LPC, PredCoef, s, length ); - break; - - case 16: - silk_LPC_analysis_filter16_FLP( r_LPC, PredCoef, s, length ); - break; - - default: - silk_assert( 0 ); - break; - } - - /* Set first Order output samples to zero */ - silk_memset( r_LPC, 0, Order * sizeof( silk_float ) ); -} - diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/LPC_inv_pred_gain_FLP.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/LPC_inv_pred_gain_FLP.c deleted file mode 100644 index 25178bac..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/LPC_inv_pred_gain_FLP.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 "SigProc_FIX.h" -#include "SigProc_FLP.h" - -#define RC_THRESHOLD 0.9999f - -/* compute inverse of LPC prediction gain, and */ -/* test if LPC coefficients are stable (all poles within unit circle) */ -/* this code is based on silk_a2k_FLP() */ -silk_float silk_LPC_inverse_pred_gain_FLP( /* O return inverse prediction gain, energy domain */ - const silk_float *A, /* I prediction coefficients [order] */ - opus_int32 order /* I prediction order */ -) -{ - opus_int k, n; - double invGain, rc, rc_mult1, rc_mult2; - silk_float Atmp[ 2 ][ SILK_MAX_ORDER_LPC ]; - silk_float *Aold, *Anew; - - Anew = Atmp[ order & 1 ]; - silk_memcpy( Anew, 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 ) { - 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 ); - } - } - rc = -Anew[ 0 ]; - if( rc > RC_THRESHOLD || rc < -RC_THRESHOLD ) { - return 0.0f; - } - rc_mult1 = 1.0f - rc * rc; - invGain *= rc_mult1; - return (silk_float)invGain; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/LTP_analysis_filter_FLP.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/LTP_analysis_filter_FLP.c deleted file mode 100644 index 849b7c1c..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/LTP_analysis_filter_FLP.c +++ /dev/null @@ -1,75 +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" - -void silk_LTP_analysis_filter_FLP( - silk_float *LTP_res, /* O LTP res MAX_NB_SUBFR*(pre_lgth+subfr_lngth) */ - const silk_float *x, /* I Input signal, with preceding samples */ - const silk_float B[ LTP_ORDER * MAX_NB_SUBFR ], /* I LTP coefficients for each subframe */ - const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ - const silk_float invGains[ MAX_NB_SUBFR ], /* I Inverse quantization gains */ - const opus_int subfr_length, /* I Length of each subframe */ - const opus_int nb_subfr, /* I number of subframes */ - const opus_int pre_length /* I Preceding samples for each subframe */ -) -{ - const silk_float *x_ptr, *x_lag_ptr; - silk_float Btmp[ LTP_ORDER ]; - silk_float *LTP_res_ptr; - silk_float inv_gain; - opus_int k, i, j; - - x_ptr = x; - LTP_res_ptr = LTP_res; - for( k = 0; k < nb_subfr; k++ ) { - x_lag_ptr = x_ptr - pitchL[ k ]; - inv_gain = invGains[ k ]; - for( i = 0; i < LTP_ORDER; i++ ) { - Btmp[ i ] = B[ k * LTP_ORDER + i ]; - } - - /* LTP analysis FIR filter */ - for( i = 0; i < subfr_length + pre_length; i++ ) { - LTP_res_ptr[ i ] = x_ptr[ i ]; - /* Subtract long-term prediction */ - for( j = 0; j < LTP_ORDER; j++ ) { - LTP_res_ptr[ i ] -= Btmp[ j ] * x_lag_ptr[ LTP_ORDER / 2 - j ]; - } - LTP_res_ptr[ i ] *= inv_gain; - x_lag_ptr++; - } - - /* Update pointers */ - LTP_res_ptr += subfr_length + pre_length; - x_ptr += subfr_length; - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/LTP_scale_ctrl_FLP.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/LTP_scale_ctrl_FLP.c deleted file mode 100644 index 8dbe29d0..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/LTP_scale_ctrl_FLP.c +++ /dev/null @@ -1,52 +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" - -void silk_LTP_scale_ctrl_FLP( - silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ - silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ - opus_int condCoding /* I The type of conditional coding to use */ -) -{ - opus_int round_loss; - - if( condCoding == CODE_INDEPENDENTLY ) { - /* Only scale if first frame in packet */ - round_loss = psEnc->sCmn.PacketLoss_perc + psEnc->sCmn.nFramesPerPacket; - psEnc->sCmn.indices.LTP_scaleIndex = (opus_int8)silk_LIMIT( round_loss * psEncCtrl->LTPredCodGain * 0.1f, 0.0f, 2.0f ); - } else { - /* Default is minimum scaling */ - psEnc->sCmn.indices.LTP_scaleIndex = 0; - } - - psEncCtrl->LTP_scale = (silk_float)silk_LTPScales_table_Q14[ psEnc->sCmn.indices.LTP_scaleIndex ] / 16384.0f; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/SigProc_FLP.h b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/SigProc_FLP.h deleted file mode 100644 index f0cb3733..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/SigProc_FLP.h +++ /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. -***********************************************************************/ - -#ifndef SILK_SIGPROC_FLP_H -#define SILK_SIGPROC_FLP_H - -#include "SigProc_FIX.h" -#include "float_cast.h" -#include - -#ifdef __cplusplus -extern "C" -{ -#endif - -/********************************************************************/ -/* SIGNAL PROCESSING FUNCTIONS */ -/********************************************************************/ - -/* Chirp (bw expand) LP AR filter */ -void silk_bwexpander_FLP( - silk_float *ar, /* I/O AR filter to be expanded (without leading 1) */ - const opus_int d, /* I length of ar */ - const silk_float chirp /* I chirp factor (typically in range (0..1) ) */ -); - -/* compute inverse of LPC prediction gain, and */ -/* test if LPC coefficients are stable (all poles within unit circle) */ -/* this code is based on silk_FLP_a2k() */ -silk_float silk_LPC_inverse_pred_gain_FLP( /* O return inverse prediction gain, energy domain */ - const silk_float *A, /* I prediction coefficients [order] */ - opus_int32 order /* I prediction order */ -); - -silk_float silk_schur_FLP( /* O returns residual energy */ - silk_float refl_coef[], /* O reflection coefficients (length order) */ - const silk_float auto_corr[], /* I autocorrelation sequence (length order+1) */ - opus_int order /* I order */ -); - -void silk_k2a_FLP( - silk_float *A, /* O prediction coefficients [order] */ - const silk_float *rc, /* I reflection coefficients [order] */ - 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) */ - const silk_float *inputData, /* I input data to correlate */ - opus_int inputDataSize, /* I length of input */ - opus_int correlationCount /* I number of correlation taps to compute */ -); - -opus_int silk_pitch_analysis_core_FLP( /* O Voicing estimate: 0 voiced, 1 unvoiced */ - const silk_float *frame, /* I Signal of length PE_FRAME_LENGTH_MS*Fs_kHz */ - opus_int *pitch_out, /* O Pitch lag values [nb_subfr] */ - opus_int16 *lagIndex, /* O Lag Index */ - opus_int8 *contourIndex, /* O Pitch contour Index */ - silk_float *LTPCorr, /* I/O Normalized correlation; input: value from previous frame */ - opus_int prevLag, /* I Last lag of previous frame; set to zero is unvoiced */ - const silk_float search_thres1, /* I First stage threshold for lag candidates 0 - 1 */ - 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 */ - int arch /* I Run-time architecture */ -); - -void silk_insertion_sort_decreasing_FLP( - silk_float *a, /* I/O Unsorted / Sorted vector */ - opus_int *idx, /* O Index vector for the sorted elements */ - const opus_int L, /* I Vector length */ - const opus_int K /* I Number of correctly sorted positions */ -); - -/* Compute reflection coefficients from input signal */ -silk_float silk_burg_modified_FLP( /* O returns residual energy */ - silk_float A[], /* O prediction coefficients (length order) */ - const silk_float x[], /* I input signal, length: nb_subfr*(D+L_sub) */ - const silk_float minInvGain, /* I minimum inverse 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 */ -); - -/* multiply a vector by a constant */ -void silk_scale_vector_FLP( - silk_float *data1, - silk_float gain, - opus_int dataSize -); - -/* copy and multiply a vector by a constant */ -void silk_scale_copy_vector_FLP( - silk_float *data_out, - const silk_float *data_in, - silk_float gain, - opus_int dataSize -); - -/* inner product of two silk_float arrays, with result as double */ -double silk_inner_product_FLP( - const silk_float *data1, - const silk_float *data2, - opus_int dataSize -); - -/* sum of squares of a silk_float array, with result as double */ -double silk_energy_FLP( - const silk_float *data, - opus_int dataSize -); - -/********************************************************************/ -/* MACROS */ -/********************************************************************/ - -#define PI (3.1415926536f) - -#define silk_min_float( a, b ) (((a) < (b)) ? (a) : (b)) -#define silk_max_float( a, b ) (((a) > (b)) ? (a) : (b)) -#define silk_abs_float( a ) ((silk_float)fabs(a)) - -/* sigmoid function */ -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 OPUS_INLINE opus_int32 silk_float2int( silk_float x ) -{ - return (opus_int32)float2int( x ); -} - -/* floating-point to integer conversion (rounding) */ -static OPUS_INLINE void silk_float2short_array( - opus_int16 *out, - const silk_float *in, - opus_int32 length -) -{ - opus_int32 k; - for( k = length - 1; k >= 0; k-- ) { - out[k] = silk_SAT16( (opus_int32)float2int( in[k] ) ); - } -} - -/* integer to floating-point conversion */ -static OPUS_INLINE void silk_short2float_array( - silk_float *out, - const opus_int16 *in, - opus_int32 length -) -{ - opus_int32 k; - for( k = length - 1; k >= 0; k-- ) { - out[k] = (silk_float)in[k]; - } -} - -/* using log2() helps the fixed-point conversion */ -static OPUS_INLINE silk_float silk_log2( double x ) -{ - return ( silk_float )( 3.32192809488736 * log10( x ) ); -} - -#ifdef __cplusplus -} -#endif - -#endif /* SILK_SIGPROC_FLP_H */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/apply_sine_window_FLP.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/apply_sine_window_FLP.c deleted file mode 100644 index 6aae57c0..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/apply_sine_window_FLP.c +++ /dev/null @@ -1,81 +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" - -/* Apply sine window to signal vector */ -/* Window types: */ -/* 1 -> sine window from 0 to pi/2 */ -/* 2 -> sine window from pi/2 to pi */ -void silk_apply_sine_window_FLP( - silk_float px_win[], /* O Pointer to windowed signal */ - const silk_float px[], /* I Pointer to input signal */ - const opus_int win_type, /* I Selects a window type */ - const opus_int length /* I Window length, multiple of 4 */ -) -{ - opus_int k; - silk_float freq, c, S0, S1; - - silk_assert( win_type == 1 || win_type == 2 ); - - /* Length must be multiple of 4 */ - silk_assert( ( length & 3 ) == 0 ); - - freq = PI / ( length + 1 ); - - /* Approximation of 2 * cos(f) */ - c = 2.0f - freq * freq; - - /* Initialize state */ - if( win_type < 2 ) { - /* Start from 0 */ - S0 = 0.0f; - /* Approximation of sin(f) */ - S1 = freq; - } else { - /* Start from 1 */ - S0 = 1.0f; - /* Approximation of cos(f) */ - S1 = 0.5f * c; - } - - /* Uses the recursive equation: sin(n*f) = 2 * cos(f) * sin((n-1)*f) - sin((n-2)*f) */ - /* 4 samples at a time */ - for( k = 0; k < length; k += 4 ) { - px_win[ k + 0 ] = px[ k + 0 ] * 0.5f * ( S0 + S1 ); - px_win[ k + 1 ] = px[ k + 1 ] * S1; - S0 = c * S1 - S0; - px_win[ k + 2 ] = px[ k + 2 ] * 0.5f * ( S1 + S0 ); - px_win[ k + 3 ] = px[ k + 3 ] * S0; - S1 = c * S0 - S1; - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/autocorrelation_FLP.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/autocorrelation_FLP.c deleted file mode 100644 index 8b8a9e65..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/autocorrelation_FLP.c +++ /dev/null @@ -1,52 +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 "typedef.h" -#include "SigProc_FLP.h" - -/* compute autocorrelation */ -void silk_autocorrelation_FLP( - silk_float *results, /* O result (length correlationCount) */ - const silk_float *inputData, /* I input data to correlate */ - opus_int inputDataSize, /* I length of input */ - opus_int correlationCount /* I number of correlation taps to compute */ -) -{ - opus_int i; - - if( correlationCount > inputDataSize ) { - correlationCount = inputDataSize; - } - - for( i = 0; i < correlationCount; i++ ) { - results[ i ] = (silk_float)silk_inner_product_FLP( inputData, inputData + i, inputDataSize - i ); - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/burg_modified_FLP.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/burg_modified_FLP.c deleted file mode 100644 index ea5dc25a..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/burg_modified_FLP.c +++ /dev/null @@ -1,186 +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 "SigProc_FLP.h" -#include "tuning_parameters.h" -#include "define.h" - -#define MAX_FRAME_SIZE 384 /* subfr_length * nb_subfr = ( 0.005 * 16000 + 16 ) * 4 = 384*/ - -/* Compute reflection coefficients from input signal */ -silk_float silk_burg_modified_FLP( /* O returns residual energy */ - silk_float A[], /* O prediction coefficients (length order) */ - const silk_float x[], /* I input signal, length: nb_subfr*(D+L_sub) */ - const silk_float minInvGain, /* I minimum inverse 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 */ -) -{ - opus_int k, n, s, reached_max_gain; - double C0, invGain, num, nrg_f, nrg_b, rc, Atmp, tmp1, tmp2; - const silk_float *x_ptr; - double C_first_row[ SILK_MAX_ORDER_LPC ], C_last_row[ SILK_MAX_ORDER_LPC ]; - 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 ); - - /* Compute autocorrelations, added over subframes */ - C0 = silk_energy_FLP( x, nb_subfr * subfr_length ); - silk_memset( C_first_row, 0, SILK_MAX_ORDER_LPC * sizeof( double ) ); - 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 ] += silk_inner_product_FLP( x_ptr, x_ptr + n, subfr_length - n ); - } - } - silk_memcpy( C_last_row, C_first_row, SILK_MAX_ORDER_LPC * sizeof( double ) ); - - /* Initialize */ - CAb[ 0 ] = CAf[ 0 ] = C0 + FIND_LPC_COND_FAC * C0 + 1e-9f; - invGain = 1.0f; - 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) */ - for( s = 0; s < nb_subfr; s++ ) { - x_ptr = x + s * subfr_length; - tmp1 = x_ptr[ n ]; - tmp2 = x_ptr[ subfr_length - n - 1 ]; - for( k = 0; k < n; k++ ) { - C_first_row[ k ] -= x_ptr[ n ] * x_ptr[ n - k - 1 ]; - C_last_row[ k ] -= x_ptr[ subfr_length - n - 1 ] * x_ptr[ subfr_length - n + k ]; - Atmp = Af[ k ]; - tmp1 += x_ptr[ n - k - 1 ] * Atmp; - tmp2 += x_ptr[ subfr_length - n + k ] * Atmp; - } - for( k = 0; k <= n; k++ ) { - CAf[ k ] -= tmp1 * x_ptr[ n - k ]; - CAb[ k ] -= tmp2 * x_ptr[ subfr_length - n + k - 1 ]; - } - } - tmp1 = C_first_row[ n ]; - tmp2 = C_last_row[ n ]; - for( k = 0; k < n; k++ ) { - Atmp = Af[ k ]; - tmp1 += C_last_row[ n - k - 1 ] * Atmp; - tmp2 += C_first_row[ n - k - 1 ] * Atmp; - } - CAf[ n + 1 ] = tmp1; - CAb[ n + 1 ] = tmp2; - - /* Calculate nominator and denominator for the next order reflection (parcor) coefficient */ - num = CAb[ n + 1 ]; - nrg_b = CAb[ 0 ]; - nrg_f = CAf[ 0 ]; - for( k = 0; k < n; k++ ) { - Atmp = Af[ k ]; - num += CAb[ n - k ] * Atmp; - nrg_b += CAb[ k + 1 ] * Atmp; - nrg_f += CAf[ k + 1 ] * Atmp; - } - silk_assert( nrg_f > 0.0 ); - silk_assert( nrg_b > 0.0 ); - - /* Calculate the next order reflection (parcor) coefficient */ - rc = -2.0 * num / ( nrg_f + nrg_b ); - silk_assert( rc > -1.0 && rc < 1.0 ); - - /* Update inverse prediction gain */ - tmp1 = invGain * ( 1.0 - rc * rc ); - if( tmp1 <= minInvGain ) { - /* Max prediction gain exceeded; set reflection coefficient such that max prediction gain is exactly hit */ - rc = sqrt( 1.0 - minInvGain / invGain ); - if( num > 0 ) { - /* Ensure adjusted reflection coefficients has the original sign */ - rc = -rc; - } - invGain = minInvGain; - reached_max_gain = 1; - } else { - invGain = tmp1; - } - - /* Update the AR coefficients */ - for( k = 0; k < (n + 1) >> 1; k++ ) { - tmp1 = Af[ k ]; - tmp2 = Af[ n - k - 1 ]; - Af[ k ] = tmp1 + rc * tmp2; - Af[ n - k - 1 ] = tmp2 + rc * tmp1; - } - Af[ n ] = rc; - - if( reached_max_gain ) { - /* Reached max prediction gain; set remaining coefficients to zero and exit loop */ - for( k = n + 1; k < D; k++ ) { - Af[ k ] = 0.0; - } - break; - } - - /* Update C * Af and C * Ab */ - for( k = 0; k <= n + 1; k++ ) { - tmp1 = CAf[ k ]; - CAf[ k ] += rc * CAb[ n - k + 1 ]; - CAb[ n - k + 1 ] += rc * tmp1; - } - } - - if( reached_max_gain ) { - /* Convert to silk_float */ - for( k = 0; k < D; k++ ) { - A[ k ] = (silk_float)( -Af[ k ] ); - } - /* Subtract energy of preceding samples from C0 */ - for( s = 0; s < nb_subfr; s++ ) { - C0 -= silk_energy_FLP( x + s * subfr_length, D ); - } - /* Approximate residual energy */ - nrg_f = C0 * invGain; - } else { - /* Compute residual energy and store coefficients as silk_float */ - nrg_f = CAf[ 0 ]; - tmp1 = 1.0; - for( k = 0; k < D; k++ ) { - Atmp = Af[ k ]; - nrg_f += CAf[ k + 1 ] * Atmp; - tmp1 += Atmp * Atmp; - A[ k ] = (silk_float)(-Atmp); - } - nrg_f -= FIND_LPC_COND_FAC * C0 * tmp1; - } - - /* Return residual energy */ - return (silk_float)nrg_f; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/bwexpander_FLP.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/bwexpander_FLP.c deleted file mode 100644 index d55a4d79..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/bwexpander_FLP.c +++ /dev/null @@ -1,49 +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 "SigProc_FLP.h" - -/* Chirp (bw expand) LP AR filter */ -void silk_bwexpander_FLP( - silk_float *ar, /* I/O AR filter to be expanded (without leading 1) */ - const opus_int d, /* I length of ar */ - const silk_float chirp /* I chirp factor (typically in range (0..1) ) */ -) -{ - opus_int i; - silk_float cfac = chirp; - - for( i = 0; i < d - 1; i++ ) { - ar[ i ] *= cfac; - cfac *= chirp; - } - ar[ d - 1 ] *= cfac; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/corrMatrix_FLP.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/corrMatrix_FLP.c deleted file mode 100644 index eae6a1cf..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/corrMatrix_FLP.c +++ /dev/null @@ -1,93 +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 - -/********************************************************************** - * Correlation matrix computations for LS estimate. - **********************************************************************/ - -#include "main_FLP.h" - -/* Calculates correlation vector X'*t */ -void silk_corrVector_FLP( - const silk_float *x, /* I x vector [L+order-1] used to create X */ - const silk_float *t, /* I Target vector [L] */ - const opus_int L, /* I Length of vecors */ - const opus_int Order, /* I Max lag for correlation */ - silk_float *Xt /* O X'*t correlation vector [order] */ -) -{ - opus_int lag; - const silk_float *ptr1; - - ptr1 = &x[ Order - 1 ]; /* Points to first sample of column 0 of X: X[:,0] */ - for( lag = 0; lag < Order; lag++ ) { - /* Calculate X[:,lag]'*t */ - Xt[ lag ] = (silk_float)silk_inner_product_FLP( ptr1, t, L ); - ptr1--; /* Next column of X */ - } -} - -/* Calculates correlation matrix X'*X */ -void silk_corrMatrix_FLP( - const silk_float *x, /* I x vector [ L+order-1 ] used to create X */ - const opus_int L, /* I Length of vectors */ - const opus_int Order, /* I Max lag for correlation */ - silk_float *XX /* O X'*X correlation matrix [order x order] */ -) -{ - opus_int j, lag; - double energy; - const silk_float *ptr1, *ptr2; - - ptr1 = &x[ Order - 1 ]; /* First sample of column 0 of X */ - energy = silk_energy_FLP( ptr1, L ); /* X[:,0]'*X[:,0] */ - matrix_ptr( XX, 0, 0, Order ) = ( silk_float )energy; - for( j = 1; j < Order; j++ ) { - /* Calculate X[:,j]'*X[:,j] */ - energy += ptr1[ -j ] * ptr1[ -j ] - ptr1[ L - j ] * ptr1[ L - j ]; - matrix_ptr( XX, j, j, Order ) = ( silk_float )energy; - } - - ptr2 = &x[ Order - 2 ]; /* First sample of column 1 of X */ - for( lag = 1; lag < Order; lag++ ) { - /* Calculate X[:,0]'*X[:,lag] */ - energy = silk_inner_product_FLP( ptr1, ptr2, L ); - matrix_ptr( XX, lag, 0, Order ) = ( silk_float )energy; - matrix_ptr( XX, 0, lag, Order ) = ( silk_float )energy; - /* Calculate X[:,j]'*X[:,j + lag] */ - for( j = 1; j < ( Order - lag ); j++ ) { - energy += ptr1[ -j ] * ptr2[ -j ] - ptr1[ L - j ] * ptr2[ L - j ]; - matrix_ptr( XX, lag + j, j, Order ) = ( silk_float )energy; - matrix_ptr( XX, j, lag + j, Order ) = ( silk_float )energy; - } - ptr2--; /* Next column of X */ - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/encode_frame_FLP.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/encode_frame_FLP.c deleted file mode 100644 index d54e2686..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/encode_frame_FLP.c +++ /dev/null @@ -1,372 +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" - -/* Low Bitrate Redundancy (LBRR) encoding. Reuse all parameters but encode with lower bitrate */ -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 */ - opus_int condCoding /* I The type of conditional coding used so far for this frame */ -); - -void silk_encode_do_VAD_FLP( - silk_encoder_state_FLP *psEnc /* I/O Encoder state FLP */ -) -{ - /****************************/ - /* Voice Activity Detection */ - /****************************/ - silk_VAD_GetSA_Q8( &psEnc->sCmn, psEnc->sCmn.inputBuf + 1 ); - - /**************************************************/ - /* Convert speech activity into VAD and DTX flags */ - /**************************************************/ - if( psEnc->sCmn.speech_activity_Q8 < SILK_FIX_CONST( SPEECH_ACTIVITY_DTX_THRES, 8 ) ) { - psEnc->sCmn.indices.signalType = TYPE_NO_VOICE_ACTIVITY; - psEnc->sCmn.noSpeechCounter++; - 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; - psEnc->sCmn.inDTX = 0; - } - psEnc->sCmn.VAD_flags[ psEnc->sCmn.nFramesEncoded ] = 0; - } else { - psEnc->sCmn.noSpeechCounter = 0; - psEnc->sCmn.inDTX = 0; - psEnc->sCmn.indices.signalType = TYPE_UNVOICED; - psEnc->sCmn.VAD_flags[ psEnc->sCmn.nFramesEncoded ] = 1; - } -} - -/****************/ -/* Encode frame */ -/****************/ -opus_int silk_encode_frame_FLP( - silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ - opus_int32 *pnBytesOut, /* O Number of payload bytes; */ - ec_enc *psRangeEnc, /* I/O compressor data structure */ - opus_int condCoding, /* I The type of conditional coding to use */ - opus_int maxBits, /* I If > 0: maximum number of output bits */ - opus_int useCBR /* I Flag to force constant-bitrate operation */ -) -{ - 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; - opus_int32 seed_copy, nBits, nBits_lower, nBits_upper, gainMult_lower, gainMult_upper; - opus_int32 gainsID, gainsID_lower, gainsID_upper; - opus_int16 gainMult_Q8; - opus_int16 ec_prevLagIndex_copy; - opus_int ec_prevSignalType_copy; - opus_int8 LastGainIndex_copy2; - opus_int32 pGains_Q16[ MAX_NB_SUBFR ]; - opus_uint8 ec_buf_copy[ 1275 ]; - - /* 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; - - psEnc->sCmn.indices.Seed = psEnc->sCmn.frameCounter++ & 3; - - /**************************************************************/ - /* 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 */ - - /***************************************/ - /* Ensure smooth bandwidth transitions */ - /***************************************/ - silk_LP_variable_cutoff( &psEnc->sCmn.sLP, psEnc->sCmn.inputBuf + 1, psEnc->sCmn.frame_length ); - - /*******************************************/ - /* Copy new frame to front of input buffer */ - /*******************************************/ - silk_short2float_array( x_frame + LA_SHAPE_MS * psEnc->sCmn.fs_kHz, psEnc->sCmn.inputBuf + 1, psEnc->sCmn.frame_length ); - - /* Add tiny signal to avoid high CPU load from denormalized floating point numbers */ - for( i = 0; i < 8; i++ ) { - x_frame[ LA_SHAPE_MS * psEnc->sCmn.fs_kHz + i * ( psEnc->sCmn.frame_length >> 3 ) ] += ( 1 - ( i & 2 ) ) * 1e-6f; - } - - if( !psEnc->sCmn.prefillFlag ) { - /*****************************************/ - /* Find pitch lags, initial LPC analysis */ - /*****************************************/ - silk_find_pitch_lags_FLP( psEnc, &sEncCtrl, res_pitch, x_frame, psEnc->sCmn.arch ); - - /************************/ - /* Noise shape analysis */ - /************************/ - silk_noise_shape_analysis_FLP( psEnc, &sEncCtrl, res_pitch_frame, x_frame ); - - /***************************************************/ - /* Find linear prediction coefficients (LPC + LTP) */ - /***************************************************/ - silk_find_pred_coefs_FLP( psEnc, &sEncCtrl, res_pitch, 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 ); - - /* Loop over quantizer and entroy coding to control bitrate */ - maxIter = 6; - gainMult_Q8 = SILK_FIX_CONST( 1, 8 ); - found_lower = 0; - found_upper = 0; - gainsID = silk_gains_ID( psEnc->sCmn.indices.GainsIndices, psEnc->sCmn.nb_subfr ); - gainsID_lower = -1; - gainsID_upper = -1; - /* Copy part of the input state */ - silk_memcpy( &sRangeEnc_copy, psRangeEnc, sizeof( ec_enc ) ); - silk_memcpy( &sNSQ_copy, &psEnc->sCmn.sNSQ, sizeof( silk_nsq_state ) ); - seed_copy = psEnc->sCmn.indices.Seed; - ec_prevLagIndex_copy = psEnc->sCmn.ec_prevLagIndex; - ec_prevSignalType_copy = psEnc->sCmn.ec_prevSignalType; - for( iter = 0; ; iter++ ) { - if( gainsID == gainsID_lower ) { - nBits = nBits_lower; - } else if( gainsID == gainsID_upper ) { - nBits = nBits_upper; - } else { - /* Restore part of the input state */ - if( iter > 0 ) { - silk_memcpy( psRangeEnc, &sRangeEnc_copy, sizeof( ec_enc ) ); - silk_memcpy( &psEnc->sCmn.sNSQ, &sNSQ_copy, sizeof( silk_nsq_state ) ); - psEnc->sCmn.indices.Seed = seed_copy; - psEnc->sCmn.ec_prevLagIndex = ec_prevLagIndex_copy; - psEnc->sCmn.ec_prevSignalType = ec_prevSignalType_copy; - } - - /*****************************************/ - /* Noise shaping quantization */ - /*****************************************/ - silk_NSQ_wrapper_FLP( psEnc, &sEncCtrl, &psEnc->sCmn.indices, &psEnc->sCmn.sNSQ, psEnc->sCmn.pulses, xfw ); - - /****************************************/ - /* Encode Parameters */ - /****************************************/ - silk_encode_indices( &psEnc->sCmn, psRangeEnc, psEnc->sCmn.nFramesEncoded, 0, condCoding ); - - /****************************************/ - /* Encode Excitation Signal */ - /****************************************/ - 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; - } - } - - if( iter == maxIter ) { - 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 ); - 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; - } - break; - } - - 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; - found_upper = 0; - gainsID_upper = -1; - } else { - found_upper = 1; - nBits_upper = nBits; - gainMult_upper = gainMult_Q8; - gainsID_upper = gainsID; - } - } else if( nBits < maxBits - 5 ) { - found_lower = 1; - nBits_lower = nBits; - gainMult_lower = gainMult_Q8; - if( gainsID != gainsID_lower ) { - gainsID_lower = gainsID; - /* Copy part of the output state */ - silk_memcpy( &sRangeEnc_copy2, psRangeEnc, sizeof( ec_enc ) ); - silk_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; - } - } else { - /* Within 5 bits of budget: close enough */ - break; - } - - 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 ) ); - } - 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 ); - /* New gain multplier must be between 25% and 75% of old range (note that gainMult_upper < gainMult_lower) */ - if( gainMult_Q8 > silk_ADD_RSHIFT32( gainMult_lower, gainMult_upper - gainMult_lower, 2 ) ) { - gainMult_Q8 = silk_ADD_RSHIFT32( gainMult_lower, gainMult_upper - gainMult_lower, 2 ); - } else - if( gainMult_Q8 < silk_SUB_RSHIFT32( gainMult_upper, gainMult_upper - gainMult_lower, 2 ) ) { - gainMult_Q8 = silk_SUB_RSHIFT32( gainMult_upper, gainMult_upper - gainMult_lower, 2 ); - } - } - - for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { - pGains_Q16[ i ] = silk_LSHIFT_SAT32( silk_SMULWB( sEncCtrl.GainsUnq_Q16[ i ], gainMult_Q8 ), 8 ); - } - - /* Quantize gains */ - psEnc->sShape.LastGainIndex = sEncCtrl.lastGainIndexPrev; - silk_gains_quant( psEnc->sCmn.indices.GainsIndices, pGains_Q16, - &psEnc->sShape.LastGainIndex, condCoding == CODE_CONDITIONALLY, psEnc->sCmn.nb_subfr ); - - /* Unique identifier of gains vector */ - gainsID = silk_gains_ID( psEnc->sCmn.indices.GainsIndices, psEnc->sCmn.nb_subfr ); - - /* Overwrite unquantized gains with quantized gains and convert back to Q0 from Q16 */ - for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { - sEncCtrl.Gains[ i ] = pGains_Q16[ i ] / 65536.0f; - } - } - } - - /* Update input buffer */ - 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 ) ); - - /* Exit without entropy coding */ - if( psEnc->sCmn.prefillFlag ) { - /* No payload */ - *pnBytesOut = 0; - 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 */ - /****************************************/ - psEnc->sCmn.first_frame_after_reset = 0; - /* Payload size */ - *pnBytesOut = silk_RSHIFT( ec_tell( psRangeEnc ) + 7, 3 ); - - return ret; -} - -/* Low-Bitrate Redundancy (LBRR) encoding. Reuse all parameters but encode excitation at lower bitrate */ -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 */ - opus_int condCoding /* I The type of conditional coding used so far for this frame */ -) -{ - opus_int k; - opus_int32 Gains_Q16[ MAX_NB_SUBFR ]; - silk_float TempGains[ MAX_NB_SUBFR ]; - SideInfoIndices *psIndices_LBRR = &psEnc->sCmn.indices_LBRR[ psEnc->sCmn.nFramesEncoded ]; - silk_nsq_state sNSQ_LBRR; - - /*******************************************/ - /* Control use of inband LBRR */ - /*******************************************/ - if( psEnc->sCmn.LBRR_enabled && psEnc->sCmn.speech_activity_Q8 > SILK_FIX_CONST( LBRR_SPEECH_ACTIVITY_THRES, 8 ) ) { - psEnc->sCmn.LBRR_flags[ psEnc->sCmn.nFramesEncoded ] = 1; - - /* Copy noise shaping quantizer state and quantization indices from regular encoding */ - silk_memcpy( &sNSQ_LBRR, &psEnc->sCmn.sNSQ, sizeof( silk_nsq_state ) ); - silk_memcpy( psIndices_LBRR, &psEnc->sCmn.indices, sizeof( SideInfoIndices ) ); - - /* Save original gains */ - silk_memcpy( TempGains, psEncCtrl->Gains, psEnc->sCmn.nb_subfr * sizeof( silk_float ) ); - - if( psEnc->sCmn.nFramesEncoded == 0 || psEnc->sCmn.LBRR_flags[ psEnc->sCmn.nFramesEncoded - 1 ] == 0 ) { - /* First frame in packet or previous frame not LBRR coded */ - psEnc->sCmn.LBRRprevLastGainIndex = psEnc->sShape.LastGainIndex; - - /* Increase Gains to get target LBRR rate */ - psIndices_LBRR->GainsIndices[ 0 ] += psEnc->sCmn.LBRR_GainIncreases; - psIndices_LBRR->GainsIndices[ 0 ] = silk_min_int( psIndices_LBRR->GainsIndices[ 0 ], N_LEVELS_QGAIN - 1 ); - } - - /* Decode to get gains in sync with decoder */ - silk_gains_dequant( Gains_Q16, psIndices_LBRR->GainsIndices, - &psEnc->sCmn.LBRRprevLastGainIndex, condCoding == CODE_CONDITIONALLY, psEnc->sCmn.nb_subfr ); - - /* Overwrite unquantized gains with quantized gains and convert back to Q0 from Q16 */ - for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { - psEncCtrl->Gains[ k ] = Gains_Q16[ k ] * ( 1.0f / 65536.0f ); - } - - /*****************************************/ - /* Noise shaping quantization */ - /*****************************************/ - silk_NSQ_wrapper_FLP( psEnc, psEncCtrl, psIndices_LBRR, &sNSQ_LBRR, - psEnc->sCmn.pulses_LBRR[ psEnc->sCmn.nFramesEncoded ], xfw ); - - /* Restore original gains */ - silk_memcpy( psEncCtrl->Gains, TempGains, psEnc->sCmn.nb_subfr * sizeof( silk_float ) ); - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/energy_FLP.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/energy_FLP.c deleted file mode 100644 index 24b8179f..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/energy_FLP.c +++ /dev/null @@ -1,60 +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 "SigProc_FLP.h" - -/* sum of squares of a silk_float array, with result as double */ -double silk_energy_FLP( - const silk_float *data, - opus_int dataSize -) -{ - opus_int i, dataSize4; - double result; - - /* 4x unrolled loop */ - result = 0.0; - dataSize4 = dataSize & 0xFFFC; - for( i = 0; i < dataSize4; i += 4 ) { - result += data[ i + 0 ] * (double)data[ i + 0 ] + - data[ i + 1 ] * (double)data[ i + 1 ] + - data[ i + 2 ] * (double)data[ i + 2 ] + - data[ i + 3 ] * (double)data[ i + 3 ]; - } - - /* add any remaining products */ - for( ; i < dataSize; i++ ) { - result += data[ i ] * (double)data[ i ]; - } - - silk_assert( result >= 0.0 ); - return result; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/find_LPC_FLP.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/find_LPC_FLP.c deleted file mode 100644 index 61c1ad95..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/find_LPC_FLP.c +++ /dev/null @@ -1,104 +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 "define.h" -#include "main_FLP.h" -#include "tuning_parameters.h" - -/* LPC analysis */ -void silk_find_LPC_FLP( - silk_encoder_state *psEncC, /* I/O Encoder state */ - opus_int16 NLSF_Q15[], /* O NLSFs */ - const silk_float x[], /* I Input signal */ - const silk_float minInvGain /* I Inverse of max prediction gain */ -) -{ - opus_int k, subfr_length; - silk_float a[ MAX_LPC_ORDER ]; - - /* Used only for NLSF interpolation */ - silk_float res_nrg, res_nrg_2nd, res_nrg_interp; - opus_int16 NLSF0_Q15[ MAX_LPC_ORDER ]; - silk_float a_tmp[ MAX_LPC_ORDER ]; - silk_float LPC_res[ MAX_FRAME_LENGTH + MAX_NB_SUBFR * MAX_LPC_ORDER ]; - - subfr_length = psEncC->subfr_length + psEncC->predictLPCOrder; - - /* Default: No interpolation */ - psEncC->indices.NLSFInterpCoef_Q2 = 4; - - /* Burg AR analysis for the full frame */ - res_nrg = silk_burg_modified_FLP( a, x, minInvGain, subfr_length, psEncC->nb_subfr, psEncC->predictLPCOrder ); - - if( psEncC->useInterpolatedNLSFs && !psEncC->first_frame_after_reset && psEncC->nb_subfr == MAX_NB_SUBFR ) { - /* Optimal solution for last 10 ms; 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 */ - res_nrg -= silk_burg_modified_FLP( a_tmp, x + ( MAX_NB_SUBFR / 2 ) * subfr_length, minInvGain, subfr_length, MAX_NB_SUBFR / 2, psEncC->predictLPCOrder ); - - /* Convert to NLSFs */ - silk_A2NLSF_FLP( NLSF_Q15, a_tmp, psEncC->predictLPCOrder ); - - /* Search over interpolation indices to find the one with lowest residual energy */ - res_nrg_2nd = silk_float_MAX; - 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_FLP( a_tmp, NLSF0_Q15, psEncC->predictLPCOrder ); - - /* Calculate residual energy with LSF interpolation */ - silk_LPC_analysis_filter_FLP( LPC_res, a_tmp, x, 2 * subfr_length, psEncC->predictLPCOrder ); - res_nrg_interp = (silk_float)( - silk_energy_FLP( LPC_res + psEncC->predictLPCOrder, subfr_length - psEncC->predictLPCOrder ) + - silk_energy_FLP( LPC_res + psEncC->predictLPCOrder + subfr_length, subfr_length - psEncC->predictLPCOrder ) ); - - /* Determine whether current interpolated NLSFs are best so far */ - if( res_nrg_interp < res_nrg ) { - /* Interpolation has lower residual energy */ - res_nrg = res_nrg_interp; - psEncC->indices.NLSFInterpCoef_Q2 = (opus_int8)k; - } else if( res_nrg_interp > res_nrg_2nd ) { - /* No reason to continue iterating - residual energies will continue to climb */ - break; - } - res_nrg_2nd = res_nrg_interp; - } - } - - if( psEncC->indices.NLSFInterpCoef_Q2 == 4 ) { - /* NLSF interpolation is currently inactive, calculate NLSFs from full frame AR coefficients */ - silk_A2NLSF_FLP( NLSF_Q15, a, psEncC->predictLPCOrder ); - } - - silk_assert( psEncC->indices.NLSFInterpCoef_Q2 == 4 || - ( psEncC->useInterpolatedNLSFs && !psEncC->first_frame_after_reset && psEncC->nb_subfr == MAX_NB_SUBFR ) ); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/find_LTP_FLP.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/find_LTP_FLP.c deleted file mode 100644 index 72299960..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/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/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/find_pitch_lags_FLP.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/find_pitch_lags_FLP.c deleted file mode 100644 index f3b22d25..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/find_pitch_lags_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 -#include "main_FLP.h" -#include "tuning_parameters.h" - -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 */ - int arch /* I Run-time architecture */ -) -{ - opus_int buf_len; - silk_float thrhld, res_nrg; - const silk_float *x_buf_ptr, *x_buf; - silk_float auto_corr[ MAX_FIND_PITCH_LPC_ORDER + 1 ]; - silk_float A[ MAX_FIND_PITCH_LPC_ORDER ]; - silk_float refl_coef[ MAX_FIND_PITCH_LPC_ORDER ]; - silk_float Wsig[ FIND_PITCH_LPC_WIN_MAX ]; - silk_float *Wsig_ptr; - - /******************************************/ - /* Set up buffer lengths etc based on Fs */ - /******************************************/ - 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; - - /******************************************/ - /* Estimate LPC AR coeficients */ - /******************************************/ - - /* Calculate windowed signal */ - - /* First LA_LTP samples */ - x_buf_ptr = x_buf + buf_len - psEnc->sCmn.pitch_LPC_win_length; - Wsig_ptr = Wsig; - silk_apply_sine_window_FLP( Wsig_ptr, x_buf_ptr, 1, psEnc->sCmn.la_pitch ); - - /* Middle non-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 - ( psEnc->sCmn.la_pitch << 1 ) ) * sizeof( silk_float ) ); - - /* Last LA_LTP samples */ - Wsig_ptr += psEnc->sCmn.pitch_LPC_win_length - ( psEnc->sCmn.la_pitch << 1 ); - x_buf_ptr += psEnc->sCmn.pitch_LPC_win_length - ( psEnc->sCmn.la_pitch << 1 ); - silk_apply_sine_window_FLP( Wsig_ptr, x_buf_ptr, 2, psEnc->sCmn.la_pitch ); - - /* Calculate autocorrelation sequence */ - silk_autocorrelation_FLP( auto_corr, Wsig, psEnc->sCmn.pitch_LPC_win_length, psEnc->sCmn.pitchEstimationLPCOrder + 1 ); - - /* Add white noise, as a fraction of the energy */ - auto_corr[ 0 ] += auto_corr[ 0 ] * FIND_PITCH_WHITE_NOISE_FRACTION + 1; - - /* Calculate the reflection coefficients using Schur */ - res_nrg = silk_schur_FLP( refl_coef, auto_corr, psEnc->sCmn.pitchEstimationLPCOrder ); - - /* Prediction gain */ - psEncCtrl->predGain = auto_corr[ 0 ] / silk_max_float( res_nrg, 1.0f ); - - /* Convert reflection coefficients to prediction coefficients */ - silk_k2a_FLP( A, refl_coef, psEnc->sCmn.pitchEstimationLPCOrder ); - - /* Bandwidth expansion */ - silk_bwexpander_FLP( A, psEnc->sCmn.pitchEstimationLPCOrder, FIND_PITCH_BANDWIDTH_EXPANSION ); - - /*****************************************/ - /* LPC analysis filtering */ - /*****************************************/ - silk_LPC_analysis_filter_FLP( res, A, x_buf, buf_len, psEnc->sCmn.pitchEstimationLPCOrder ); - - if( psEnc->sCmn.indices.signalType != TYPE_NO_VOICE_ACTIVITY && psEnc->sCmn.first_frame_after_reset == 0 ) { - /* Threshold for pitch estimator */ - thrhld = 0.6f; - thrhld -= 0.004f * psEnc->sCmn.pitchEstimationLPCOrder; - thrhld -= 0.1f * psEnc->sCmn.speech_activity_Q8 * ( 1.0f / 256.0f ); - thrhld -= 0.15f * (psEnc->sCmn.prevSignalType >> 1); - thrhld -= 0.1f * psEnc->sCmn.input_tilt_Q15 * ( 1.0f / 32768.0f ); - - /*****************************************/ - /* Call Pitch estimator */ - /*****************************************/ - 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, arch ) == 0 ) - { - psEnc->sCmn.indices.signalType = TYPE_VOICED; - } else { - psEnc->sCmn.indices.signalType = TYPE_UNVOICED; - } - } else { - silk_memset( psEncCtrl->pitchL, 0, sizeof( psEncCtrl->pitchL ) ); - psEnc->sCmn.indices.lagIndex = 0; - psEnc->sCmn.indices.contourIndex = 0; - psEnc->LTPCorr = 0; - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/find_pred_coefs_FLP.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/find_pred_coefs_FLP.c deleted file mode 100644 index ea2c6c43..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/find_pred_coefs_FLP.c +++ /dev/null @@ -1,117 +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" - -/* Find LPC and LTP coefficients */ -void silk_find_pred_coefs_FLP( - silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ - silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ - const silk_float res_pitch[], /* I Residual from pitch analysis */ - const silk_float x[], /* I Speech signal */ - opus_int condCoding /* I The type of conditional coding to use */ -) -{ - opus_int i; - silk_float WLTP[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ]; - silk_float invGains[ MAX_NB_SUBFR ], Wght[ 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 ]; - silk_float minInvGain; - - /* Weighting for weighted least squares */ - 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 ); - - /* 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 ); - - /* Quantize LTP gain parameters */ - silk_quant_LTP_gains_FLP( psEncCtrl->LTPCoef, psEnc->sCmn.indices.LTPIndex, &psEnc->sCmn.indices.PERIndex, - &psEnc->sCmn.sum_log_gain_Q7, WLTP, psEnc->sCmn.mu_LTP_Q9, psEnc->sCmn.LTPQuantLowComplexity, psEnc->sCmn.nb_subfr ); - - /* Control LTP scaling */ - silk_LTP_scale_ctrl_FLP( psEnc, psEncCtrl, condCoding ); - - /* Create LTP residual */ - silk_LTP_analysis_filter_FLP( LPC_in_pre, x - psEnc->sCmn.predictLPCOrder, psEncCtrl->LTPCoef, - psEncCtrl->pitchL, invGains, psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.predictLPCOrder ); - } else { - /************/ - /* UNVOICED */ - /************/ - /* Create signal with prepended subframes, scaled by inverse gains */ - x_ptr = x - psEnc->sCmn.predictLPCOrder; - x_pre_ptr = LPC_in_pre; - for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { - silk_scale_copy_vector_FLP( x_pre_ptr, x_ptr, invGains[ i ], - psEnc->sCmn.subfr_length + psEnc->sCmn.predictLPCOrder ); - x_pre_ptr += psEnc->sCmn.subfr_length + psEnc->sCmn.predictLPCOrder; - x_ptr += psEnc->sCmn.subfr_length; - } - 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 { - minInvGain = (silk_float)pow( 2, psEncCtrl->LTPredCodGain / 3 ) / MAX_PREDICTION_POWER_GAIN; - minInvGain /= 0.25f + 0.75f * psEncCtrl->coding_quality; - } - - /* LPC_in_pre contains the LTP-filtered input for voiced, and the unfiltered input for unvoiced */ - silk_find_LPC_FLP( &psEnc->sCmn, NLSF_Q15, LPC_in_pre, minInvGain ); - - /* Quantize LSFs */ - silk_process_NLSFs_FLP( &psEnc->sCmn, psEncCtrl->PredCoef, NLSF_Q15, psEnc->sCmn.prev_NLSFq_Q15 ); - - /* Calculate residual energy using quantized LPC coefficients */ - silk_residual_energy_FLP( psEncCtrl->ResNrg, LPC_in_pre, psEncCtrl->PredCoef, psEncCtrl->Gains, - psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.predictLPCOrder ); - - /* 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 ) ); -} - diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/inner_product_FLP.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/inner_product_FLP.c deleted file mode 100644 index 029c0129..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/inner_product_FLP.c +++ /dev/null @@ -1,60 +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 "SigProc_FLP.h" - -/* inner product of two silk_float arrays, with result as double */ -double silk_inner_product_FLP( - const silk_float *data1, - const silk_float *data2, - opus_int dataSize -) -{ - opus_int i, dataSize4; - double result; - - /* 4x unrolled loop */ - result = 0.0; - dataSize4 = dataSize & 0xFFFC; - for( i = 0; i < dataSize4; i += 4 ) { - result += data1[ i + 0 ] * (double)data2[ i + 0 ] + - data1[ i + 1 ] * (double)data2[ i + 1 ] + - data1[ i + 2 ] * (double)data2[ i + 2 ] + - data1[ i + 3 ] * (double)data2[ i + 3 ]; - } - - /* add any remaining products */ - for( ; i < dataSize; i++ ) { - result += data1[ i ] * (double)data2[ i ]; - } - - return result; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/k2a_FLP.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/k2a_FLP.c deleted file mode 100644 index 12af4e76..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/k2a_FLP.c +++ /dev/null @@ -1,53 +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 "SigProc_FLP.h" - -/* step up function, converts reflection coefficients to prediction coefficients */ -void silk_k2a_FLP( - silk_float *A, /* O prediction coefficients [order] */ - const silk_float *rc, /* I reflection coefficients [order] */ - opus_int32 order /* I prediction order */ -) -{ - opus_int k, n; - silk_float Atmp[ SILK_MAX_ORDER_LPC ]; - - for( k = 0; k < order; k++ ) { - for( n = 0; n < k; n++ ) { - Atmp[ n ] = A[ n ]; - } - for( n = 0; n < k; n++ ) { - A[ n ] += Atmp[ k - n - 1 ] * rc[ k ]; - } - A[ k ] = -rc[ k ]; - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/levinsondurbin_FLP.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/levinsondurbin_FLP.c deleted file mode 100644 index f0ba6069..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/levinsondurbin_FLP.c +++ /dev/null @@ -1,81 +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 "SigProc_FLP.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 */ -) -{ - 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; - } - - /* return the residual energy */ - return nrg; -} - diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/main_FLP.h b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/main_FLP.h deleted file mode 100644 index fb553b61..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/main_FLP.h +++ /dev/null @@ -1,312 +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. -***********************************************************************/ - -#ifndef SILK_MAIN_FLP_H -#define SILK_MAIN_FLP_H - -#include "SigProc_FLP.h" -#include "SigProc_FIX.h" -#include "structs_FLP.h" -#include "main.h" -#include "define.h" -#include "debug.h" -#include "entenc.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -#define silk_encoder_state_Fxx silk_encoder_state_FLP -#define silk_encode_do_VAD_Fxx silk_encode_do_VAD_FLP -#define silk_encode_frame_Fxx silk_encode_frame_FLP - -/*********************/ -/* Encoder Functions */ -/*********************/ - -/* High-pass filter with cutoff frequency adaptation based on pitch lag statistics */ -void silk_HP_variable_cutoff( - silk_encoder_state_Fxx state_Fxx[] /* I/O Encoder states */ -); - -/* Encoder main function */ -void silk_encode_do_VAD_FLP( - silk_encoder_state_FLP *psEnc /* I/O Encoder state FLP */ -); - -/* Encoder main function */ -opus_int silk_encode_frame_FLP( - silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ - opus_int32 *pnBytesOut, /* O Number of payload bytes; */ - ec_enc *psRangeEnc, /* I/O compressor data structure */ - opus_int condCoding, /* I The type of conditional coding to use */ - opus_int maxBits, /* I If > 0: maximum number of output bits */ - opus_int useCBR /* I Flag to force constant-bitrate operation */ -); - -/* Initializes the Silk encoder state */ -opus_int silk_init_encoder( - 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 */ -/**************************/ -/* Compute noise shaping coefficients and initial gain values */ -void silk_noise_shape_analysis_FLP( - silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ - silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ - const silk_float *pitch_res, /* I LPC residual from pitch analysis */ - const silk_float *x /* I Input signal [frame_length + la_shape] */ -); - -/* Autocorrelations for a warped frequency axis */ -void silk_warped_autocorrelation_FLP( - silk_float *corr, /* O Result [order + 1] */ - const silk_float *input, /* I Input data to correlate */ - const silk_float warping, /* I Warping coefficient */ - const opus_int length, /* I Length of input */ - const opus_int order /* I Correlation order (even) */ -); - -/* Calculation of LTP state scaling */ -void silk_LTP_scale_ctrl_FLP( - silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ - silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ - opus_int condCoding /* I The type of conditional coding to use */ -); - -/**********************************************/ -/* Prediction Analysis */ -/**********************************************/ -/* Find pitch lags */ -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 */ - int arch /* I Run-time architecture */ -); - -/* Find LPC and LTP coefficients */ -void silk_find_pred_coefs_FLP( - silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ - silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ - const silk_float res_pitch[], /* I Residual from pitch analysis */ - const silk_float x[], /* I Speech signal */ - opus_int condCoding /* I The type of conditional coding to use */ -); - -/* LPC analysis */ -void silk_find_LPC_FLP( - silk_encoder_state *psEncC, /* I/O Encoder state */ - opus_int16 NLSF_Q15[], /* O NLSFs */ - const silk_float x[], /* I Input signal */ - const silk_float minInvGain /* I Prediction gain from LTP (dB) */ -); - -/* 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 */ - 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 */ -); - -void silk_LTP_analysis_filter_FLP( - silk_float *LTP_res, /* O LTP res MAX_NB_SUBFR*(pre_lgth+subfr_lngth) */ - const silk_float *x, /* I Input signal, with preceding samples */ - const silk_float B[ LTP_ORDER * MAX_NB_SUBFR ], /* I LTP coefficients for each subframe */ - const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */ - const silk_float invGains[ MAX_NB_SUBFR ], /* I Inverse quantization gains */ - const opus_int subfr_length, /* I Length of each subframe */ - const opus_int nb_subfr, /* I number of subframes */ - const opus_int pre_length /* I Preceding samples for each subframe */ -); - -/* Calculates residual energies of input subframes where all subframes have LPC_order */ -/* of preceding samples */ -void silk_residual_energy_FLP( - silk_float nrgs[ MAX_NB_SUBFR ], /* O Residual energy per subframe */ - const silk_float x[], /* I Input signal */ - silk_float a[ 2 ][ MAX_LPC_ORDER ], /* I AR coefs for each frame half */ - const silk_float gains[], /* 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 */ -); - -/* 16th order LPC analysis filter */ -void silk_LPC_analysis_filter_FLP( - silk_float r_LPC[], /* O LPC residual signal */ - const silk_float PredCoef[], /* I LPC coefficients */ - const silk_float s[], /* I Input signal */ - const opus_int length, /* I Length of input signal */ - const opus_int Order /* I LPC order */ -); - -/* LTP tap quantizer */ -void silk_quant_LTP_gains_FLP( - silk_float B[ 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 */ - opus_int32 *sum_log_gain_Q7, /* I/O Cumulative max prediction gain */ - 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 */ -); - -/* Residual energy: nrg = wxx - 2 * wXx * c + c' * wXX * c */ -silk_float silk_residual_energy_covar_FLP( /* O Weighted residual energy */ - const silk_float *c, /* I Filter coefficients */ - silk_float *wXX, /* I/O Weighted correlation matrix, reg. out */ - const silk_float *wXx, /* I Weighted correlation vector */ - const silk_float wxx, /* I Weighted correlation value */ - const opus_int D /* I Dimension */ -); - -/* Processing of gains */ -void silk_process_gains_FLP( - silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ - silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ - opus_int condCoding /* I The type of conditional coding to use */ -); - -/******************/ -/* Linear Algebra */ -/******************/ -/* Calculates correlation matrix X'*X */ -void silk_corrMatrix_FLP( - const silk_float *x, /* I x vector [ L+order-1 ] used to create X */ - const opus_int L, /* I Length of vectors */ - const opus_int Order, /* I Max lag for correlation */ - silk_float *XX /* O X'*X correlation matrix [order x order] */ -); - -/* Calculates correlation vector X'*t */ -void silk_corrVector_FLP( - const silk_float *x, /* I x vector [L+order-1] used to create X */ - const silk_float *t, /* I Target vector [L] */ - const opus_int L, /* I Length of vecors */ - const opus_int Order, /* I Max lag for correlation */ - 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 */ -/* 2 -> sine window from pi/2 to pi */ -void silk_apply_sine_window_FLP( - silk_float px_win[], /* O Pointer to windowed signal */ - const silk_float px[], /* I Pointer to input signal */ - const opus_int win_type, /* I Selects a window type */ - const opus_int length /* I Window length, multiple of 4 */ -); - -/* Wrapper functions. Call flp / fix code */ - -/* Convert AR filter coefficients to NLSF parameters */ -void silk_A2NLSF_FLP( - opus_int16 *NLSF_Q15, /* O NLSF vector [ LPC_order ] */ - const silk_float *pAR, /* I LPC coefficients [ LPC_order ] */ - const opus_int LPC_order /* I LPC order */ -); - -/* Convert NLSF parameters to AR prediction filter coefficients */ -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 */ -); - -/* Limit, stabilize, and quantize NLSFs */ -void silk_process_NLSFs_FLP( - silk_encoder_state *psEncC, /* I/O Encoder state */ - silk_float PredCoef[ 2 ][ MAX_LPC_ORDER ], /* O Prediction coefficients */ - opus_int16 NLSF_Q15[ MAX_LPC_ORDER ], /* I/O Normalized LSFs (quant out) (0 - (2^15-1)) */ - const opus_int16 prev_NLSF_Q15[ MAX_LPC_ORDER ] /* I Previous Normalized LSFs (0 - (2^15-1)) */ -); - -/* Floating-point Silk NSQ wrapper */ -void silk_NSQ_wrapper_FLP( - silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ - silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ - SideInfoIndices *psIndices, /* I/O Quantization indices */ - silk_nsq_state *psNSQ, /* I/O Noise Shaping Quantzation state */ - opus_int8 pulses[], /* O Quantized pulse signal */ - const silk_float x[] /* I Prefiltered input signal */ -); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/noise_shape_analysis_FLP.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/noise_shape_analysis_FLP.c deleted file mode 100644 index 65f6ea58..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/noise_shape_analysis_FLP.c +++ /dev/null @@ -1,365 +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" - -/* 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 silk_float warped_gain( - const silk_float *coefs, - silk_float lambda, - opus_int order -) { - opus_int i; - silk_float gain; - - lambda = -lambda; - gain = coefs[ order - 1 ]; - for( i = order - 2; i >= 0; i-- ) { - gain = lambda * gain + coefs[ i ]; - } - return (silk_float)( 1.0f / ( 1.0f - lambda * 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 OPUS_INLINE void warped_true2monic_coefs( - silk_float *coefs_syn, - silk_float *coefs_ana, - silk_float lambda, - silk_float limit, - opus_int order -) { - opus_int i, iter, ind = 0; - silk_float tmp, maxabs, chirp, gain_syn, gain_ana; - - /* 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 ]; - } - gain_syn = ( 1.0f - lambda * lambda ) / ( 1.0f + lambda * coefs_syn[ 0 ] ); - gain_ana = ( 1.0f - lambda * lambda ) / ( 1.0f + lambda * coefs_ana[ 0 ] ); - for( i = 0; i < order; i++ ) { - coefs_syn[ i ] *= gain_syn; - coefs_ana[ i ] *= gain_ana; - } - - /* Limit */ - for( iter = 0; iter < 10; iter++ ) { - /* 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 ] ) ); - if( tmp > maxabs ) { - maxabs = tmp; - ind = i; - } - } - if( maxabs <= limit ) { - /* Coefficients are within range - done */ - return; - } - - /* 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 ]; - } - gain_syn = 1.0f / gain_syn; - gain_ana = 1.0f / gain_ana; - for( i = 0; i < order; i++ ) { - coefs_syn[ i ] *= gain_syn; - coefs_ana[ i ] *= gain_ana; - } - - /* 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 ); - - /* 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 ]; - } - gain_syn = ( 1.0f - lambda * lambda ) / ( 1.0f + lambda * coefs_syn[ 0 ] ); - gain_ana = ( 1.0f - lambda * lambda ) / ( 1.0f + lambda * coefs_ana[ 0 ] ); - for( i = 0; i < order; i++ ) { - coefs_syn[ i ] *= gain_syn; - coefs_ana[ i ] *= gain_ana; - } - } - 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 */ - silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ - const silk_float *pitch_res, /* I LPC residual from pitch analysis */ - const silk_float *x /* I Input signal [frame_length + la_shape] */ -) -{ - 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; - silk_float x_windowed[ SHAPE_LPC_WIN_MAX ]; - silk_float auto_corr[ MAX_SHAPE_LPC_ORDER + 1 ]; - const silk_float *x_ptr, *pitch_res_ptr; - - /* Point to start of first LPC analysis block */ - x_ptr = x - psEnc->sCmn.la_shape; - - /****************/ - /* GAIN CONTROL */ - /****************/ - SNR_adj_dB = psEnc->sCmn.SNR_dB_Q7 * ( 1 / 128.0f ); - - /* Input quality is the average of the quality in the lowest two VAD bands */ - psEncCtrl->input_quality = 0.5f * ( psEnc->sCmn.input_quality_bands_Q15[ 0 ] + psEnc->sCmn.input_quality_bands_Q15[ 1 ] ) * ( 1.0f / 32768.0f ); - - /* Coding quality level, between 0.0 and 1.0 */ - psEncCtrl->coding_quality = silk_sigmoid( 0.25f * ( SNR_adj_dB - 20.0f ) ); - - if( psEnc->sCmn.useCBR == 0 ) { - /* Reduce coding SNR during low speech activity */ - b = 1.0f - psEnc->sCmn.speech_activity_Q8 * ( 1.0f / 256.0f ); - SNR_adj_dB -= BG_SNR_DECR_dB * psEncCtrl->coding_quality * ( 0.5f + 0.5f * psEncCtrl->input_quality ) * b * b; - } - - if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { - /* Reduce gains for periodic signals */ - SNR_adj_dB += HARM_SNR_INCR_dB * psEnc->LTPCorr; - } else { - /* For unvoiced signals and low-quality input, adjust the quality slower than SNR_dB setting */ - SNR_adj_dB += ( -0.4f * psEnc->sCmn.SNR_dB_Q7 * ( 1 / 128.0f ) + 6.0f ) * ( 1.0f - psEncCtrl->input_quality ); - } - - /*************************/ - /* 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; - 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++ ) { - nrg = ( silk_float )nSamples + ( silk_float )silk_energy_FLP( pitch_res_ptr, nSamples ); - log_energy = silk_log2( nrg ); - if( k > 0 ) { - energy_variation += silk_abs_float( log_energy - log_energy_prev ); - } - 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 ) { - 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 ); - } - - /*******************************/ - /* Control bandwidth expansion */ - /*******************************/ - /* 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; - } - - /********************************************/ - /* Compute noise shaping AR coefs and gains */ - /********************************************/ - 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 = ( psEnc->sCmn.shapeWinLength - flat_part ) / 2; - - silk_apply_sine_window_FLP( x_windowed, x_ptr, 1, slope_part ); - shift = slope_part; - silk_memcpy( x_windowed + shift, x_ptr + shift, flat_part * sizeof(silk_float) ); - shift += flat_part; - silk_apply_sine_window_FLP( 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_FLP( auto_corr, x_windowed, warping, - psEnc->sCmn.shapeWinLength, psEnc->sCmn.shapingLPCOrder ); - } else { - /* Calculate regular auto correlation */ - silk_autocorrelation_FLP( auto_corr, x_windowed, psEnc->sCmn.shapeWinLength, psEnc->sCmn.shapingLPCOrder + 1 ); - } - - /* Add white noise, as a fraction of energy */ - auto_corr[ 0 ] += auto_corr[ 0 ] * SHAPE_WHITE_NOISE_FRACTION; - - /* 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 ); - 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 ); - } - - /* 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 ) ); - - /* 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 ); - } - - /*****************/ - /* Gain tweaking */ - /*****************/ - /* Increase gains during low speech activity */ - gain_mult = (silk_float)pow( 2.0f, -0.16f * SNR_adj_dB ); - gain_add = (silk_float)pow( 2.0f, 0.16f * MIN_QGAIN_DB ); - for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { - psEncCtrl->Gains[ k ] *= gain_mult; - 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 */ - /************************************************/ - /* Less low frequency shaping for noisy inputs */ - strength = LOW_FREQ_SHAPING * ( 1.0f + LOW_QUALITY_LOW_FREQ_SHAPING_DECR * ( psEnc->sCmn.input_quality_bands_Q15[ 0 ] * ( 1.0f / 32768.0f ) - 1.0f ) ); - strength *= psEnc->sCmn.speech_activity_Q8 * ( 1.0f / 256.0f ); - 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])*/ - for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { - b = 0.2f / psEnc->sCmn.fs_kHz + 3.0f / psEncCtrl->pitchL[ k ]; - psEncCtrl->LF_MA_shp[ k ] = -1.0f + b; - psEncCtrl->LF_AR_shp[ k ] = 1.0f - b - b * strength; - } - Tilt = - HP_NOISE_COEF - - (1 - HP_NOISE_COEF) * HARM_HP_NOISE_COEF * psEnc->sCmn.speech_activity_Q8 * ( 1.0f / 256.0f ); - } else { - b = 1.3f / psEnc->sCmn.fs_kHz; - psEncCtrl->LF_MA_shp[ 0 ] = -1.0f + b; - psEncCtrl->LF_AR_shp[ 0 ] = 1.0f - b - b * strength * 0.6f; - for( k = 1; k < psEnc->sCmn.nb_subfr; k++ ) { - psEncCtrl->LF_MA_shp[ k ] = psEncCtrl->LF_MA_shp[ 0 ]; - psEncCtrl->LF_AR_shp[ k ] = psEncCtrl->LF_AR_shp[ 0 ]; - } - Tilt = -HP_NOISE_COEF; - } - - /****************************/ - /* 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; - - /* More harmonic noise shaping for high bitrates or noisy input */ - HarmShapeGain += HIGH_RATE_OR_LOW_QUALITY_HARMONIC_SHAPING * - ( 1.0f - ( 1.0f - psEncCtrl->coding_quality ) * psEncCtrl->input_quality ); - - /* Less harmonic noise shaping for less periodic signals */ - HarmShapeGain *= ( silk_float )sqrt( psEnc->LTPCorr ); - } else { - HarmShapeGain = 0.0f; - } - - /*************************/ - /* 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 ); - psEncCtrl->Tilt[ k ] = psShapeSt->Tilt_smth; - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/pitch_analysis_core_FLP.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/pitch_analysis_core_FLP.c deleted file mode 100644 index e58f041b..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/pitch_analysis_core_FLP.c +++ /dev/null @@ -1,630 +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 - -/***************************************************************************** -* Pitch analyser function -******************************************************************************/ -#include "SigProc_FLP.h" -#include "SigProc_FIX.h" -#include "pitch_est_defines.h" -#include "pitch.h" - -#define SCRATCH_SIZE 22 - -/************************************************************/ -/* Internally used functions */ -/************************************************************/ -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 */ - int arch /* I Run-time architecture */ -); - -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 */ - 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 */ -); - -/************************************************************/ -/* CORE PITCH ANALYSIS FUNCTION */ -/************************************************************/ -opus_int silk_pitch_analysis_core_FLP( /* O Voicing estimate: 0 voiced, 1 unvoiced */ - const silk_float *frame, /* I Signal of length PE_FRAME_LENGTH_MS*Fs_kHz */ - opus_int *pitch_out, /* O Pitch lag values [nb_subfr] */ - opus_int16 *lagIndex, /* O Lag Index */ - opus_int8 *contourIndex, /* O Pitch contour Index */ - silk_float *LTPCorr, /* I/O Normalized correlation; input: value from previous frame */ - opus_int prevLag, /* I Last lag of previous frame; set to zero is unvoiced */ - const silk_float search_thres1, /* I First stage threshold for lag candidates 0 - 1 */ - 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 */ - int arch /* I Run-time architecture */ -) -{ - opus_int i, k, d, j; - silk_float frame_8kHz[ PE_MAX_FRAME_LENGTH_MS * 8 ]; - silk_float frame_4kHz[ PE_MAX_FRAME_LENGTH_MS * 4 ]; - opus_int16 frame_8_FIX[ PE_MAX_FRAME_LENGTH_MS * 8 ]; - opus_int16 frame_4_FIX[ PE_MAX_FRAME_LENGTH_MS * 4 ]; - 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; - opus_int d_srch[ PE_D_SRCH_LENGTH ]; - opus_int16 d_comp[ (PE_MAX_LAG >> 1) + 5 ]; - opus_int length_d_srch, length_d_comp; - silk_float Cmax, CCmax, CCmax_b, CCmax_new_b, CCmax_new; - opus_int CBimax, CBimax_new, lag, start_lag, end_lag, lag_new; - opus_int cbk_size; - silk_float lag_log2, prevLag_log2, delta_lag_log2_sqr; - silk_float energies_st3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ][ PE_NB_STAGE3_LAGS ]; - silk_float cross_corr_st3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ][ PE_NB_STAGE3_LAGS ]; - opus_int lag_counter; - opus_int frame_length, frame_length_8kHz, frame_length_4kHz; - 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_int nb_cbk_search; - const opus_int8 *Lag_CB_ptr; - - /* Check for valid sampling frequency */ - silk_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 ); - - silk_assert( search_thres1 >= 0.0f && search_thres1 <= 1.0f ); - silk_assert( search_thres2 >= 0.0f && search_thres2 <= 1.0f ); - - /* 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; - - /* Resample from input sampled at Fs_kHz to 8 kHz */ - if( Fs_kHz == 16 ) { - /* Resample to 16 -> 8 khz */ - opus_int16 frame_16_FIX[ 16 * PE_MAX_FRAME_LENGTH_MS ]; - silk_float2short_array( frame_16_FIX, frame, frame_length ); - silk_memset( filt_state, 0, 2 * sizeof( opus_int32 ) ); - silk_resampler_down2( filt_state, frame_8_FIX, frame_16_FIX, frame_length ); - silk_short2float_array( frame_8kHz, frame_8_FIX, frame_length_8kHz ); - } else if( Fs_kHz == 12 ) { - /* Resample to 12 -> 8 khz */ - opus_int16 frame_12_FIX[ 12 * PE_MAX_FRAME_LENGTH_MS ]; - silk_float2short_array( frame_12_FIX, frame, frame_length ); - silk_memset( filt_state, 0, 6 * sizeof( opus_int32 ) ); - 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 ); - silk_float2short_array( frame_8_FIX, frame, frame_length_8kHz ); - } - - /* Decimate again to 4 kHz */ - silk_memset( filt_state, 0, 2 * sizeof( opus_int32 ) ); - silk_resampler_down2( filt_state, frame_4_FIX, frame_8_FIX, frame_length_8kHz ); - silk_short2float_array( frame_4kHz, frame_4_FIX, frame_length_4kHz ); - - /* Low-pass filter */ - for( i = frame_length_4kHz - 1; i > 0; i-- ) { - 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 ); - - 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_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 = 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)( 2 * cross_corr / normalizer ); - - /* From now on normalizer is computed recursively */ - 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 = 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)( 2 * cross_corr / normalizer ); - } - /* Update target pointer */ - target_ptr += sf_length_8kHz; - } - - /* Apply short-lag bias */ - for( i = max_lag_4kHz; i >= min_lag_4kHz; i-- ) { - C[ 0 ][ i ] -= C[ 0 ][ i ] * i / 4096.0f; - } - - /* Sort */ - length_d_srch = 4 + 2 * complexity; - silk_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 ]; - if( Cmax < 0.2f ) { - silk_memset( pitch_out, 0, nb_subfr * sizeof( opus_int ) ); - *LTPCorr = 0.0f; - *lagIndex = 0; - *contourIndex = 0; - return 1; - } - - threshold = search_thres1 * 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 ); - } else { - length_d_srch = i; - break; - } - } - silk_assert( length_d_srch > 0 ); - - for( i = min_lag_8kHz - 5; i < max_lag_8kHz + 5; i++ ) { - d_comp[ i ] = 0; - } - for( i = 0; i < length_d_srch; i++ ) { - d_comp[ d_srch[ i ] ] = 1; - } - - /* Convolution */ - for( i = max_lag_8kHz + 3; i >= min_lag_8kHz; i-- ) { - d_comp[ i ] += d_comp[ i - 1 ] + d_comp[ i - 2 ]; - } - - length_d_srch = 0; - for( i = min_lag_8kHz; i < max_lag_8kHz + 1; i++ ) { - if( d_comp[ i + 1 ] > 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 ]; - } - - length_d_comp = 0; - for( i = min_lag_8kHz; i < max_lag_8kHz + 4; i++ ) { - if( d_comp[ i ] > 0 ) { - d_comp[ length_d_comp ] = (opus_int16)( i - 2 ); - length_d_comp++; - } - } - - /********************************************************************************** - ** SECOND STAGE, operating at 8 kHz, on lag sections with high correlation - *************************************************************************************/ - /********************************************************************************* - * 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(silk_float)); - - if( Fs_kHz == 8 ) { - target_ptr = &frame[ PE_LTP_MEM_LENGTH_MS * 8 ]; - } else { - 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 ) + 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 ); - if( cross_corr > 0.0f ) { - 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; - } - } - target_ptr += sf_length_8kHz; - } - - /* search over lag range and lags codebook */ - /* scale factor for lag codebook, as a function of center lag */ - - CCmax = 0.0f; /* This value doesn't matter */ - CCmax_b = -1000.0f; - - CBimax = 0; /* To avoid returning undefined lag values */ - lag = -1; /* To check if lag with strong enough correlation has been found */ - - if( prevLag > 0 ) { - if( Fs_kHz == 12 ) { - prevLag = silk_LSHIFT( prevLag, 1 ) / 3; - } else if( Fs_kHz == 16 ) { - prevLag = silk_RSHIFT( prevLag, 1 ); - } - prevLag_log2 = silk_log2( (silk_float)prevLag ); - } else { - prevLag_log2 = 0; - } - - /* Set up stage 2 codebook based on number of subframes */ - if( nb_subfr == PE_MAX_NB_SUBFR ) { - cbk_size = PE_NB_CBKS_STAGE2_EXT; - Lag_CB_ptr = &silk_CB_lags_stage2[ 0 ][ 0 ]; - if( Fs_kHz == 8 && complexity > SILK_PE_MIN_COMPLEX ) { - /* If input is 8 khz use a larger codebook here because it is last stage */ - nb_cbk_search = PE_NB_CBKS_STAGE2_EXT; - } else { - nb_cbk_search = PE_NB_CBKS_STAGE2; - } - } 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; - } - - for( k = 0; k < length_d_srch; k++ ) { - d = d_srch[ k ]; - for( j = 0; j < nb_cbk_search; j++ ) { - CC[j] = 0.0f; - for( i = 0; i < nb_subfr; i++ ) { - /* Try all codebooks */ - CC[ j ] += C[ i ][ d + matrix_ptr( Lag_CB_ptr, i, j, cbk_size )]; - } - } - /* Find best codebook */ - CCmax_new = -1000.0f; - CBimax_new = 0; - for( i = 0; i < nb_cbk_search; i++ ) { - if( CC[ i ] > CCmax_new ) { - CCmax_new = CC[ i ]; - CBimax_new = i; - } - } - - /* Bias towards shorter lags */ - 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 ); - } - - 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; - lag = d; - CBimax = CBimax_new; - } - } - - if( lag == -1 ) { - /* No suitable candidate found */ - silk_memset( pitch_out, 0, PE_MAX_NB_SUBFR * sizeof(opus_int) ); - *LTPCorr = 0.0f; - *lagIndex = 0; - *contourIndex = 0; - return 1; - } - - /* Output normalized correlation */ - *LTPCorr = (silk_float)( CCmax / nb_subfr ); - silk_assert( *LTPCorr >= 0.0f ); - - if( Fs_kHz > 8 ) { - /* Search in original signal */ - - /* Compensate for decimation */ - silk_assert( lag == silk_SAT16( lag ) ); - if( Fs_kHz == 12 ) { - lag = silk_RSHIFT_ROUND( silk_SMULBB( lag, 3 ), 1 ); - } else { /* Fs_kHz == 16 */ - lag = silk_LSHIFT( lag, 1 ); - } - - lag = silk_LIMIT_int( lag, min_lag, max_lag ); - 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 */ - - 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, arch ); - silk_P_Ana_calc_energy_st3( energies_st3, frame, start_lag, sf_length, nb_subfr, complexity ); - - lag_counter = 0; - silk_assert( lag == silk_SAT16( lag ) ); - contour_bias = PE_FLATCONTOUR_BIAS / lag; - - /* Set up cbk parameters according to complexity setting and frame length */ - if( nb_subfr == PE_MAX_NB_SUBFR ) { - nb_cbk_search = (opus_int)silk_nb_cbk_searchs_stage3[ complexity ]; - cbk_size = PE_NB_CBKS_STAGE3_MAX; - Lag_CB_ptr = &silk_CB_lags_stage3[ 0 ][ 0 ]; - } else { - nb_cbk_search = PE_NB_CBKS_STAGE3_10MS; - cbk_size = PE_NB_CBKS_STAGE3_10MS; - 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 = energy_tmp; - for( k = 0; k < nb_subfr; k++ ) { - 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)( 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 ) { - CCmax = CCmax_new; - lag_new = d; - CBimax = j; - } - } - lag_counter++; - } - - for( k = 0; k < nb_subfr; k++ ) { - pitch_out[ k ] = lag_new + matrix_ptr( Lag_CB_ptr, k, CBimax, cbk_size ); - pitch_out[ k ] = silk_LIMIT( pitch_out[ k ], min_lag, PE_MAX_LAG_MS * Fs_kHz ); - } - *lagIndex = (opus_int16)( lag_new - min_lag ); - *contourIndex = (opus_int8)CBimax; - } else { /* Fs_kHz == 8 */ - /* 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 * 8 ); - } - *lagIndex = (opus_int16)( lag - min_lag_8kHz ); - *contourIndex = (opus_int8)CBimax; - } - silk_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 */ - int arch /* I Run-time architecture */ -) -{ - 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 ); - - if( nb_subfr == PE_MAX_NB_SUBFR ) { - Lag_range_ptr = &silk_Lag_range_stage3[ complexity ][ 0 ][ 0 ]; - Lag_CB_ptr = &silk_CB_lags_stage3[ 0 ][ 0 ]; - 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); - 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; - } - - target_ptr = &frame[ silk_LSHIFT( sf_length, 2 ) ]; /* Pointer to middle of frame */ - for( k = 0; k < nb_subfr; k++ ) { - lag_counter = 0; - - /* 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++ ) { - silk_assert( lag_counter < SCRATCH_SIZE ); - scratch_mem[ lag_counter ] = xcorr[ lag_high - j ]; - lag_counter++; - } - - delta = matrix_ptr( Lag_range_ptr, k, 0, 2 ); - for( i = 0; i < nb_cbk_search; i++ ) { - /* Fill out the 3 dim array that stores the correlations for */ - /* each code_book vector for each start lag */ - idx = matrix_ptr( Lag_CB_ptr, k, i, cbk_size ) - delta; - 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 ]; - } - } - target_ptr += sf_length; - } -} - -/********************************************************************/ -/* 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 */ - 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 */ -) -{ - const silk_float *target_ptr, *basis_ptr; - double energy; - opus_int k, i, j, lag_counter; - opus_int nb_cbk_search, delta, idx, cbk_size, lag_diff; - 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 ); - - if( nb_subfr == PE_MAX_NB_SUBFR ) { - Lag_range_ptr = &silk_Lag_range_stage3[ complexity ][ 0 ][ 0 ]; - Lag_CB_ptr = &silk_CB_lags_stage3[ 0 ][ 0 ]; - 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); - 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; - } - - 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_energy_FLP( basis_ptr, sf_length ) + 1e-3; - silk_assert( energy >= 0.0 ); - scratch_mem[lag_counter] = (silk_float)energy; - lag_counter++; - - lag_diff = ( matrix_ptr( Lag_range_ptr, k, 1, 2 ) - matrix_ptr( Lag_range_ptr, k, 0, 2 ) + 1 ); - for( i = 1; i < lag_diff; i++ ) { - /* remove part outside new window */ - energy -= basis_ptr[sf_length - i] * (double)basis_ptr[sf_length - i]; - silk_assert( energy >= 0.0 ); - - /* add part that comes into window */ - energy += basis_ptr[ -i ] * (double)basis_ptr[ -i ]; - silk_assert( energy >= 0.0 ); - silk_assert( lag_counter < SCRATCH_SIZE ); - scratch_mem[lag_counter] = (silk_float)energy; - lag_counter++; - } - - delta = matrix_ptr( Lag_range_ptr, k, 0, 2 ); - for( i = 0; i < nb_cbk_search; i++ ) { - /* Fill out the 3 dim array that stores the correlations for */ - /* each code_book vector for each start lag */ - idx = matrix_ptr( Lag_CB_ptr, k, i, cbk_size ) - delta; - 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.0f ); - } - } - target_ptr += sf_length; - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/prefilter_FLP.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/prefilter_FLP.c deleted file mode 100644 index 8bc32fb4..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/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 OPUS_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 OPUS_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/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/process_gains_FLP.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/process_gains_FLP.c deleted file mode 100644 index c0da0dae..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/process_gains_FLP.c +++ /dev/null @@ -1,103 +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" - -/* Processing of gains */ -void silk_process_gains_FLP( - silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ - silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ - opus_int condCoding /* I The type of conditional coding to use */ -) -{ - silk_shape_state_FLP *psShapeSt = &psEnc->sShape; - opus_int k; - opus_int32 pGains_Q16[ MAX_NB_SUBFR ]; - silk_float s, InvMaxSqrVal, gain, quant_offset; - - /* Gain reduction when LTP coding gain is high */ - if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { - s = 1.0f - 0.5f * silk_sigmoid( 0.25f * ( psEncCtrl->LTPredCodGain - 12.0f ) ); - for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { - psEncCtrl->Gains[ k ] *= s; - } - } - - /* Limit the quantized signal */ - InvMaxSqrVal = ( silk_float )( pow( 2.0f, 0.33f * ( 21.0f - psEnc->sCmn.SNR_dB_Q7 * ( 1 / 128.0f ) ) ) / psEnc->sCmn.subfr_length ); - - for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { - /* Soft limit on ratio residual energy and squared gains */ - gain = psEncCtrl->Gains[ k ]; - gain = ( silk_float )sqrt( gain * gain + psEncCtrl->ResNrg[ k ] * InvMaxSqrVal ); - psEncCtrl->Gains[ k ] = silk_min_float( gain, 32767.0f ); - } - - /* Prepare gains for noise shaping quantization */ - for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { - pGains_Q16[ k ] = (opus_int32)( psEncCtrl->Gains[ k ] * 65536.0f ); - } - - /* Save unquantized gains and gain Index */ - silk_memcpy( psEncCtrl->GainsUnq_Q16, pGains_Q16, psEnc->sCmn.nb_subfr * sizeof( opus_int32 ) ); - psEncCtrl->lastGainIndexPrev = psShapeSt->LastGainIndex; - - /* Quantize gains */ - silk_gains_quant( psEnc->sCmn.indices.GainsIndices, pGains_Q16, - &psShapeSt->LastGainIndex, condCoding == CODE_CONDITIONALLY, psEnc->sCmn.nb_subfr ); - - /* Overwrite unquantized gains with quantized gains and convert back to Q0 from Q16 */ - for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { - psEncCtrl->Gains[ k ] = pGains_Q16[ k ] / 65536.0f; - } - - /* Set quantizer offset for voiced signals. Larger offset when LTP coding gain is low or tilt is high (ie low-pass) */ - if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { - if( psEncCtrl->LTPredCodGain + psEnc->sCmn.input_tilt_Q15 * ( 1.0f / 32768.0f ) > 1.0f ) { - psEnc->sCmn.indices.quantOffsetType = 0; - } else { - psEnc->sCmn.indices.quantOffsetType = 1; - } - } - - /* Quantizer boundary adjustment */ - quant_offset = silk_Quantization_Offsets_Q10[ psEnc->sCmn.indices.signalType >> 1 ][ psEnc->sCmn.indices.quantOffsetType ] / 1024.0f; - psEncCtrl->Lambda = LAMBDA_OFFSET - + LAMBDA_DELAYED_DECISIONS * psEnc->sCmn.nStatesDelayedDecision - + LAMBDA_SPEECH_ACT * psEnc->sCmn.speech_activity_Q8 * ( 1.0f / 256.0f ) - + LAMBDA_INPUT_QUALITY * psEncCtrl->input_quality - + LAMBDA_CODING_QUALITY * psEncCtrl->coding_quality - + LAMBDA_QUANT_OFFSET * quant_offset; - - silk_assert( psEncCtrl->Lambda > 0.0f ); - silk_assert( psEncCtrl->Lambda < 2.0f ); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/regularize_correlations_FLP.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/regularize_correlations_FLP.c deleted file mode 100644 index df461260..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/regularize_correlations_FLP.c +++ /dev/null @@ -1,48 +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" - -/* 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 */ -) -{ - opus_int i; - - for( i = 0; i < D; i++ ) { - matrix_ptr( &XX[ 0 ], i, i, D ) += noise; - } - xx[ 0 ] += noise; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/residual_energy_FLP.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/residual_energy_FLP.c deleted file mode 100644 index b2e03a86..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/residual_energy_FLP.c +++ /dev/null @@ -1,117 +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" - -#define MAX_ITERATIONS_RESIDUAL_NRG 10 -#define REGULARIZATION_FACTOR 1e-8f - -/* Residual energy: nrg = wxx - 2 * wXx * c + c' * wXX * c */ -silk_float silk_residual_energy_covar_FLP( /* O Weighted residual energy */ - const silk_float *c, /* I Filter coefficients */ - silk_float *wXX, /* I/O Weighted correlation matrix, reg. out */ - const silk_float *wXx, /* I Weighted correlation vector */ - const silk_float wxx, /* I Weighted correlation value */ - const opus_int D /* I Dimension */ -) -{ - opus_int i, j, k; - silk_float tmp, nrg = 0.0f, regularization; - - /* Safety checks */ - silk_assert( D >= 0 ); - - regularization = REGULARIZATION_FACTOR * ( wXX[ 0 ] + wXX[ D * D - 1 ] ); - for( k = 0; k < MAX_ITERATIONS_RESIDUAL_NRG; k++ ) { - nrg = wxx; - - tmp = 0.0f; - for( i = 0; i < D; i++ ) { - tmp += wXx[ i ] * c[ i ]; - } - nrg -= 2.0f * tmp; - - /* compute c' * wXX * c, assuming wXX is symmetric */ - for( i = 0; i < D; i++ ) { - tmp = 0.0f; - for( j = i + 1; j < D; j++ ) { - tmp += matrix_c_ptr( wXX, i, j, D ) * c[ j ]; - } - nrg += c[ i ] * ( 2.0f * tmp + matrix_c_ptr( wXX, i, i, D ) * c[ i ] ); - } - if( nrg > 0 ) { - break; - } else { - /* Add white noise */ - for( i = 0; i < D; i++ ) { - matrix_c_ptr( wXX, i, i, D ) += regularization; - } - /* Increase noise for next run */ - regularization *= 2.0f; - } - } - if( k == MAX_ITERATIONS_RESIDUAL_NRG ) { - silk_assert( nrg == 0 ); - nrg = 1.0f; - } - - return nrg; -} - -/* Calculates residual energies of input subframes where all subframes have LPC_order */ -/* of preceding samples */ -void silk_residual_energy_FLP( - silk_float nrgs[ MAX_NB_SUBFR ], /* O Residual energy per subframe */ - const silk_float x[], /* I Input signal */ - silk_float a[ 2 ][ MAX_LPC_ORDER ], /* I AR coefs for each frame half */ - const silk_float gains[], /* 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 */ -) -{ - opus_int shift; - silk_float *LPC_res_ptr, LPC_res[ ( MAX_FRAME_LENGTH + MAX_NB_SUBFR * MAX_LPC_ORDER ) / 2 ]; - - LPC_res_ptr = LPC_res + LPC_order; - shift = LPC_order + subfr_length; - - /* Filter input to create the LPC residual for each frame half, and measure subframe energies */ - silk_LPC_analysis_filter_FLP( LPC_res, a[ 0 ], x + 0 * shift, 2 * shift, LPC_order ); - nrgs[ 0 ] = ( silk_float )( gains[ 0 ] * gains[ 0 ] * silk_energy_FLP( LPC_res_ptr + 0 * shift, subfr_length ) ); - nrgs[ 1 ] = ( silk_float )( gains[ 1 ] * gains[ 1 ] * silk_energy_FLP( LPC_res_ptr + 1 * shift, subfr_length ) ); - - if( nb_subfr == MAX_NB_SUBFR ) { - silk_LPC_analysis_filter_FLP( LPC_res, a[ 1 ], x + 2 * shift, 2 * shift, LPC_order ); - nrgs[ 2 ] = ( silk_float )( gains[ 2 ] * gains[ 2 ] * silk_energy_FLP( LPC_res_ptr + 0 * shift, subfr_length ) ); - nrgs[ 3 ] = ( silk_float )( gains[ 3 ] * gains[ 3 ] * silk_energy_FLP( LPC_res_ptr + 1 * shift, subfr_length ) ); - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/scale_copy_vector_FLP.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/scale_copy_vector_FLP.c deleted file mode 100644 index 20db32b3..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/scale_copy_vector_FLP.c +++ /dev/null @@ -1,57 +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 "SigProc_FLP.h" - -/* copy and multiply a vector by a constant */ -void silk_scale_copy_vector_FLP( - silk_float *data_out, - const silk_float *data_in, - silk_float gain, - opus_int dataSize -) -{ - opus_int i, dataSize4; - - /* 4x unrolled loop */ - dataSize4 = dataSize & 0xFFFC; - for( i = 0; i < dataSize4; i += 4 ) { - data_out[ i + 0 ] = gain * data_in[ i + 0 ]; - data_out[ i + 1 ] = gain * data_in[ i + 1 ]; - data_out[ i + 2 ] = gain * data_in[ i + 2 ]; - data_out[ i + 3 ] = gain * data_in[ i + 3 ]; - } - - /* any remaining elements */ - for( ; i < dataSize; i++ ) { - data_out[ i ] = gain * data_in[ i ]; - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/scale_vector_FLP.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/scale_vector_FLP.c deleted file mode 100644 index 108fdcbe..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/scale_vector_FLP.c +++ /dev/null @@ -1,56 +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 "SigProc_FLP.h" - -/* multiply a vector by a constant */ -void silk_scale_vector_FLP( - silk_float *data1, - silk_float gain, - opus_int dataSize -) -{ - opus_int i, dataSize4; - - /* 4x unrolled loop */ - dataSize4 = dataSize & 0xFFFC; - for( i = 0; i < dataSize4; i += 4 ) { - data1[ i + 0 ] *= gain; - data1[ i + 1 ] *= gain; - data1[ i + 2 ] *= gain; - data1[ i + 3 ] *= gain; - } - - /* any remaining elements */ - for( ; i < dataSize; i++ ) { - data1[ i ] *= gain; - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/schur_FLP.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/schur_FLP.c deleted file mode 100644 index ee436f83..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/schur_FLP.c +++ /dev/null @@ -1,70 +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 "SigProc_FLP.h" - -silk_float silk_schur_FLP( /* O returns residual energy */ - silk_float refl_coef[], /* O reflection coefficients (length order) */ - const silk_float auto_corr[], /* I autocorrelation sequence (length order+1) */ - opus_int order /* I order */ -) -{ - opus_int k, n; - silk_float C[ SILK_MAX_ORDER_LPC + 1 ][ 2 ]; - silk_float Ctmp1, Ctmp2, rc_tmp; - - silk_assert( order==6||order==8||order==10||order==12||order==14||order==16 ); - - /* Copy correlations */ - for( k = 0; k < order+1; k++ ) { - C[ k ][ 0 ] = C[ k ][ 1 ] = auto_corr[ k ]; - } - - 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; - - /* Update correlations */ - for( n = 0; n < order - k; n++ ) { - Ctmp1 = C[ n + k + 1 ][ 0 ]; - Ctmp2 = C[ n ][ 1 ]; - C[ n + k + 1 ][ 0 ] = Ctmp1 + Ctmp2 * rc_tmp; - C[ n ][ 1 ] = Ctmp2 + Ctmp1 * rc_tmp; - } - } - - /* Return residual energy */ - return C[ 0 ][ 1 ]; -} - diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/solve_LS_FLP.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/solve_LS_FLP.c deleted file mode 100644 index 7c90d665..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/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 OPUS_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 OPUS_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 OPUS_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 OPUS_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 OPUS_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 OPUS_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/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/sort_FLP.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/sort_FLP.c deleted file mode 100644 index f08d7592..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/sort_FLP.c +++ /dev/null @@ -1,83 +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 - -/* Insertion sort (fast for already almost sorted arrays): */ -/* Best case: O(n) for an already sorted array */ -/* Worst case: O(n^2) for an inversely sorted array */ - -#include "typedef.h" -#include "SigProc_FLP.h" - -void silk_insertion_sort_decreasing_FLP( - silk_float *a, /* I/O Unsorted / Sorted vector */ - opus_int *idx, /* O Index vector for the sorted elements */ - const opus_int L, /* I Vector length */ - const opus_int K /* I Number of correctly sorted positions */ -) -{ - silk_float value; - opus_int i, j; - - /* Safety checks */ - silk_assert( K > 0 ); - silk_assert( L > 0 ); - silk_assert( L >= K ); - - /* Write start indices in index vector */ - for( i = 0; i < K; i++ ) { - idx[ i ] = i; - } - - /* Sort vector elements by value, decreasing order */ - for( i = 1; i < K; i++ ) { - value = a[ i ]; - for( j = i - 1; ( j >= 0 ) && ( value > a[ j ] ); j-- ) { - a[ j + 1 ] = a[ j ]; /* Shift value */ - idx[ j + 1 ] = idx[ j ]; /* Shift index */ - } - a[ j + 1 ] = value; /* Write value */ - idx[ j + 1 ] = i; /* Write index */ - } - - /* If less than L values are asked check the remaining values, */ - /* but only spend CPU to ensure that the K first values are correct */ - for( i = K; i < L; i++ ) { - value = a[ i ]; - if( value > a[ K - 1 ] ) { - for( j = K - 2; ( j >= 0 ) && ( value > a[ j ] ); j-- ) { - a[ j + 1 ] = a[ j ]; /* Shift value */ - idx[ j + 1 ] = idx[ j ]; /* Shift index */ - } - a[ j + 1 ] = value; /* Write value */ - idx[ j + 1 ] = i; /* Write index */ - } - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/structs_FLP.h b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/structs_FLP.h deleted file mode 100644 index bb529e71..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/structs_FLP.h +++ /dev/null @@ -1,131 +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. -***********************************************************************/ - -#ifndef SILK_STRUCTS_FLP_H -#define SILK_STRUCTS_FLP_H - -#include "typedef.h" -#include "main.h" -#include "structs.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -/********************************/ -/* Noise shaping analysis state */ -/********************************/ -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 */ - silk_float LTPCorr; /* Normalized correlation from pitch lag estimator */ -} silk_encoder_state_FLP; - -/************************/ -/* Encoder control FLP */ -/************************/ -typedef struct { - /* Prediction and coding parameters */ - silk_float Gains[ MAX_NB_SUBFR ]; - silk_float PredCoef[ 2 ][ MAX_LPC_ORDER ]; /* holds interpolated and final coefficients */ - silk_float LTPCoef[LTP_ORDER * MAX_NB_SUBFR]; - silk_float LTP_scale; - 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 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; - silk_float input_quality; - silk_float coding_quality; - - /* Measures */ - silk_float sparseness; - silk_float predGain; - silk_float LTPredCodGain; - silk_float ResNrg[ MAX_NB_SUBFR ]; /* Residual energy per subframe */ - - /* Parameters for CBR mode */ - opus_int32 GainsUnq_Q16[ MAX_NB_SUBFR ]; - opus_int8 lastGainIndexPrev; -} silk_encoder_control_FLP; - -/************************/ -/* Encoder Super Struct */ -/************************/ -typedef struct { - silk_encoder_state_FLP state_Fxx[ ENCODER_NUM_CHANNELS ]; - stereo_enc_state sStereo; - 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; -} silk_encoder; - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/warped_autocorrelation_FLP.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/warped_autocorrelation_FLP.c deleted file mode 100644 index 542414f4..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/warped_autocorrelation_FLP.c +++ /dev/null @@ -1,73 +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" - -/* Autocorrelations for a warped frequency axis */ -void silk_warped_autocorrelation_FLP( - silk_float *corr, /* O Result [order + 1] */ - const silk_float *input, /* I Input data to correlate */ - const silk_float warping, /* I Warping coefficient */ - const opus_int length, /* I Length of input */ - const opus_int order /* I Correlation order (even) */ -) -{ - 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 }; - - /* Order must be even */ - silk_assert( ( order & 1 ) == 0 ); - - /* Loop over samples */ - for( n = 0; n < length; n++ ) { - tmp1 = input[ n ]; - /* Loop over allpass sections */ - for( i = 0; i < order; i += 2 ) { - /* Output of allpass section */ - tmp2 = state[ i ] + warping * ( state[ i + 1 ] - tmp1 ); - state[ i ] = tmp1; - C[ i ] += state[ 0 ] * tmp1; - /* Output of allpass section */ - tmp1 = state[ i + 1 ] + warping * ( state[ i + 2 ] - tmp2 ); - state[ i + 1 ] = tmp2; - C[ i + 1 ] += state[ 0 ] * tmp2; - } - state[ order ] = tmp1; - C[ order ] += state[ 0 ] * tmp1; - } - - /* Copy correlations in silk_float output format */ - for( i = 0; i < order + 1; i++ ) { - corr[ i ] = ( silk_float )C[ i ]; - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/wrappers_FLP.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/wrappers_FLP.c deleted file mode 100644 index 350599b2..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/float/wrappers_FLP.c +++ /dev/null @@ -1,201 +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" - -/* Wrappers. Calls flp / fix code */ - -/* Convert AR filter coefficients to NLSF parameters */ -void silk_A2NLSF_FLP( - opus_int16 *NLSF_Q15, /* O NLSF vector [ LPC_order ] */ - const silk_float *pAR, /* I LPC coefficients [ LPC_order ] */ - const opus_int LPC_order /* I LPC order */ -) -{ - opus_int i; - opus_int32 a_fix_Q16[ MAX_LPC_ORDER ]; - - for( i = 0; i < LPC_order; i++ ) { - a_fix_Q16[ i ] = silk_float2int( pAR[ i ] * 65536.0f ); - } - - silk_A2NLSF( NLSF_Q15, a_fix_Q16, LPC_order ); -} - -/* Convert LSF parameters to AR prediction filter coefficients */ -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 */ -) -{ - opus_int i; - opus_int16 a_fix_Q12[ MAX_LPC_ORDER ]; - - silk_NLSF2A( a_fix_Q12, NLSF_Q15, LPC_order ); - - for( i = 0; i < LPC_order; i++ ) { - pAR[ i ] = ( silk_float )a_fix_Q12[ i ] * ( 1.0f / 4096.0f ); - } -} - -/******************************************/ -/* Floating-point NLSF processing wrapper */ -/******************************************/ -void silk_process_NLSFs_FLP( - silk_encoder_state *psEncC, /* I/O Encoder state */ - silk_float PredCoef[ 2 ][ MAX_LPC_ORDER ], /* O Prediction coefficients */ - opus_int16 NLSF_Q15[ MAX_LPC_ORDER ], /* I/O Normalized LSFs (quant out) (0 - (2^15-1)) */ - const opus_int16 prev_NLSF_Q15[ MAX_LPC_ORDER ] /* I Previous Normalized LSFs (0 - (2^15-1)) */ -) -{ - opus_int i, j; - opus_int16 PredCoef_Q12[ 2 ][ MAX_LPC_ORDER ]; - - silk_process_NLSFs( psEncC, PredCoef_Q12, NLSF_Q15, prev_NLSF_Q15); - - for( j = 0; j < 2; j++ ) { - for( i = 0; i < psEncC->predictLPCOrder; i++ ) { - PredCoef[ j ][ i ] = ( silk_float )PredCoef_Q12[ j ][ i ] * ( 1.0f / 4096.0f ); - } - } -} - -/****************************************/ -/* Floating-point Silk NSQ wrapper */ -/****************************************/ -void silk_NSQ_wrapper_FLP( - silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ - silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ - SideInfoIndices *psIndices, /* I/O Quantization indices */ - silk_nsq_state *psNSQ, /* I/O Noise Shaping Quantzation state */ - opus_int8 pulses[], /* O Quantized pulse signal */ - const silk_float x[] /* I Prefiltered input signal */ -) -{ - opus_int i, j; - opus_int32 x_Q3[ 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_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 ]; - opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ]; - - /* Convert control struct to fix control struct */ - /* 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 ); - } - } - - for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { - LF_shp_Q14[ i ] = silk_LSHIFT32( silk_float2int( psEncCtrl->LF_AR_shp[ i ] * 16384.0f ), 16 ) | - (opus_uint16)silk_float2int( psEncCtrl->LF_MA_shp[ i ] * 16384.0f ); - Tilt_Q14[ i ] = (opus_int)silk_float2int( psEncCtrl->Tilt[ i ] * 16384.0f ); - HarmShapeGain_Q14[ i ] = (opus_int)silk_float2int( psEncCtrl->HarmShapeGain[ i ] * 16384.0f ); - } - Lambda_Q10 = ( opus_int )silk_float2int( psEncCtrl->Lambda * 1024.0f ); - - /* prediction and coding parameters */ - for( i = 0; i < psEnc->sCmn.nb_subfr * LTP_ORDER; i++ ) { - LTPCoef_Q14[ i ] = (opus_int16)silk_float2int( psEncCtrl->LTPCoef[ i ] * 16384.0f ); - } - - for( j = 0; j < 2; j++ ) { - for( i = 0; i < psEnc->sCmn.predictLPCOrder; i++ ) { - PredCoef_Q12[ j ][ i ] = (opus_int16)silk_float2int( psEncCtrl->PredCoef[ j ][ i ] * 4096.0f ); - } - } - - for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { - Gains_Q16[ i ] = silk_float2int( psEncCtrl->Gains[ i ] * 65536.0f ); - silk_assert( Gains_Q16[ i ] > 0 ); - } - - if( psIndices->signalType == TYPE_VOICED ) { - LTP_scale_Q14 = silk_LTPScales_table_Q14[ psIndices->LTP_scaleIndex ]; - } else { - LTP_scale_Q14 = 0; - } - - /* Convert input to fix */ - for( i = 0; i < psEnc->sCmn.frame_length; i++ ) { - x_Q3[ i ] = silk_float2int( 8.0f * 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 ); - } 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 ); - } -} - -/***********************************************/ -/* 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 */ - 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 */ - 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_int i; - opus_int16 B_Q14[ MAX_NB_SUBFR * LTP_ORDER ]; - opus_int32 W_Q18[ MAX_NB_SUBFR*LTP_ORDER*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 ); - } - - silk_quant_LTP_gains( B_Q14, cbk_index, periodicity_index, sum_log_gain_Q7, W_Q18, mu_Q10, lowComplexity, nb_subfr ); - - for( i = 0; i < nb_subfr * LTP_ORDER; i++ ) { - B[ i ] = (silk_float)B_Q14[ i ] * ( 1.0f / 16384.0f ); - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/gain_quant.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/gain_quant.c deleted file mode 100644 index 64ccd061..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/gain_quant.c +++ /dev/null @@ -1,141 +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" - -#define OFFSET ( ( MIN_QGAIN_DB * 128 ) / 6 + 16 * 128 ) -#define SCALE_Q16 ( ( 65536 * ( N_LEVELS_QGAIN - 1 ) ) / ( ( ( MAX_QGAIN_DB - MIN_QGAIN_DB ) * 128 ) / 6 ) ) -#define INV_SCALE_Q16 ( ( 65536 * ( ( ( MAX_QGAIN_DB - MIN_QGAIN_DB ) * 128 ) / 6 ) ) / ( N_LEVELS_QGAIN - 1 ) ) - -/* Gain scalar quantization with hysteresis, uniform on log scale */ -void silk_gains_quant( - opus_int8 ind[ MAX_NB_SUBFR ], /* O gain indices */ - opus_int32 gain_Q16[ MAX_NB_SUBFR ], /* I/O gains (quantized out) */ - opus_int8 *prev_ind, /* I/O last index in previous frame */ - const opus_int conditional, /* I first gain is delta coded if 1 */ - const opus_int nb_subfr /* I number of subframes */ -) -{ - opus_int k, double_step_size_threshold; - - for( k = 0; k < nb_subfr; k++ ) { - /* Convert to log scale, scale, floor() */ - ind[ k ] = silk_SMULWB( SCALE_Q16, silk_lin2log( gain_Q16[ k ] ) - OFFSET ); - - /* Round towards previous quantized gain (hysteresis) */ - if( ind[ k ] < *prev_ind ) { - ind[ k ]++; - } - ind[ k ] = silk_LIMIT_int( ind[ k ], 0, N_LEVELS_QGAIN - 1 ); - - /* Compute delta indices and limit */ - if( k == 0 && conditional == 0 ) { - /* Full index */ - ind[ k ] = silk_LIMIT_int( ind[ k ], *prev_ind + MIN_DELTA_GAIN_QUANT, N_LEVELS_QGAIN - 1 ); - *prev_ind = ind[ k ]; - } else { - /* Delta index */ - ind[ k ] = ind[ k ] - *prev_ind; - - /* Double the quantization step size for large gain increases, so that the max gain level can be reached */ - double_step_size_threshold = 2 * MAX_DELTA_GAIN_QUANT - N_LEVELS_QGAIN + *prev_ind; - if( ind[ k ] > double_step_size_threshold ) { - ind[ k ] = double_step_size_threshold + silk_RSHIFT( ind[ k ] - double_step_size_threshold + 1, 1 ); - } - - ind[ k ] = silk_LIMIT_int( ind[ k ], MIN_DELTA_GAIN_QUANT, MAX_DELTA_GAIN_QUANT ); - - /* Accumulate deltas */ - if( ind[ k ] > double_step_size_threshold ) { - *prev_ind += silk_LSHIFT( ind[ k ], 1 ) - double_step_size_threshold; - } else { - *prev_ind += ind[ k ]; - } - - /* Shift to make non-negative */ - ind[ k ] -= MIN_DELTA_GAIN_QUANT; - } - - /* Scale and convert to linear scale */ - gain_Q16[ k ] = silk_log2lin( silk_min_32( silk_SMULWB( INV_SCALE_Q16, *prev_ind ) + OFFSET, 3967 ) ); /* 3967 = 31 in Q7 */ - } -} - -/* Gains scalar dequantization, uniform on log scale */ -void silk_gains_dequant( - opus_int32 gain_Q16[ MAX_NB_SUBFR ], /* O quantized gains */ - const opus_int8 ind[ MAX_NB_SUBFR ], /* I gain indices */ - opus_int8 *prev_ind, /* I/O last index in previous frame */ - const opus_int conditional, /* I first gain is delta coded if 1 */ - const opus_int nb_subfr /* I number of subframes */ -) -{ - opus_int k, ind_tmp, double_step_size_threshold; - - for( k = 0; k < nb_subfr; k++ ) { - if( k == 0 && conditional == 0 ) { - /* Gain index is not allowed to go down more than 16 steps (~21.8 dB) */ - *prev_ind = silk_max_int( ind[ k ], *prev_ind - 16 ); - } else { - /* Delta index */ - ind_tmp = ind[ k ] + MIN_DELTA_GAIN_QUANT; - - /* Accumulate deltas */ - double_step_size_threshold = 2 * MAX_DELTA_GAIN_QUANT - N_LEVELS_QGAIN + *prev_ind; - if( ind_tmp > double_step_size_threshold ) { - *prev_ind += silk_LSHIFT( ind_tmp, 1 ) - double_step_size_threshold; - } else { - *prev_ind += ind_tmp; - } - } - *prev_ind = silk_LIMIT_int( *prev_ind, 0, N_LEVELS_QGAIN - 1 ); - - /* Scale and convert to linear scale */ - gain_Q16[ k ] = silk_log2lin( silk_min_32( silk_SMULWB( INV_SCALE_Q16, *prev_ind ) + OFFSET, 3967 ) ); /* 3967 = 31 in Q7 */ - } -} - -/* Compute unique identifier of gain indices vector */ -opus_int32 silk_gains_ID( /* O returns unique identifier of gains */ - const opus_int8 ind[ MAX_NB_SUBFR ], /* I gain indices */ - const opus_int nb_subfr /* I number of subframes */ -) -{ - opus_int k; - opus_int32 gainsID; - - gainsID = 0; - for( k = 0; k < nb_subfr; k++ ) { - gainsID = silk_ADD_LSHIFT32( ind[ k ], gainsID, 8 ); - } - - return gainsID; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/init_decoder.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/init_decoder.c deleted file mode 100644 index f887c678..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/init_decoder.c +++ /dev/null @@ -1,56 +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" - -/************************/ -/* Init Decoder State */ -/************************/ -opus_int silk_init_decoder( - silk_decoder_state *psDec /* I/O Decoder state pointer */ -) -{ - /* Clear the entire encoder state, except anything copied */ - silk_memset( psDec, 0, sizeof( silk_decoder_state ) ); - - /* Used to deactivate LSF interpolation */ - psDec->first_frame_after_reset = 1; - psDec->prev_gain_Q16 = 65536; - - /* Reset CNG state */ - silk_CNG_Reset( psDec ); - - /* Reset PLC state */ - silk_PLC_Reset( psDec ); - - return(0); -} - diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/init_encoder.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/init_encoder.c deleted file mode 100644 index 65995c33..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/init_encoder.c +++ /dev/null @@ -1,64 +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 -#ifdef FIXED_POINT -#include "main_FIX.h" -#else -#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 */ - int arch /* I Run-time architecture */ -) -{ - opus_int ret = 0; - - /* 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; - - /* Used to deactivate LSF interpolation, pitch prediction */ - psEnc->sCmn.first_frame_after_reset = 1; - - /* Initialize Silk VAD */ - ret += silk_VAD_Init( &psEnc->sCmn.sVAD ); - - return ret; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/inner_prod_aligned.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/inner_prod_aligned.c deleted file mode 100644 index 257ae9e0..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/inner_prod_aligned.c +++ /dev/null @@ -1,47 +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 "SigProc_FIX.h" - -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 */ - const opus_int scale, /* I number of bits to shift */ - const opus_int len /* I vector lengths */ -) -{ - opus_int i; - opus_int32 sum = 0; - for( i = 0; i < len; i++ ) { - sum = silk_ADD_RSHIFT32( sum, silk_SMULBB( inVec1[ i ], inVec2[ i ] ), scale ); - } - return sum; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/interpolate.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/interpolate.c deleted file mode 100644 index 1bd8ca4d..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/interpolate.c +++ /dev/null @@ -1,51 +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" - -/* Interpolate two vectors */ -void silk_interpolate( - opus_int16 xi[ MAX_LPC_ORDER ], /* O interpolated vector */ - const opus_int16 x0[ MAX_LPC_ORDER ], /* I first vector */ - const opus_int16 x1[ MAX_LPC_ORDER ], /* I second vector */ - const opus_int ifact_Q2, /* I interp. factor, weight on 2nd vector */ - const opus_int d /* I number of parameters */ -) -{ - opus_int i; - - silk_assert( ifact_Q2 >= 0 ); - silk_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/sources/LabSound/third_party/libnyquist/third_party/opus/silk/lin2log.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/lin2log.c deleted file mode 100644 index d4fe5153..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/lin2log.c +++ /dev/null @@ -1,46 +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 "SigProc_FIX.h" -/* Approximation of 128 * log2() (very close inverse of silk_log2lin()) */ -/* Convert input to a log scale */ -opus_int32 silk_lin2log( - const opus_int32 inLin /* I input in linear scale */ -) -{ - opus_int32 lz, frac_Q7; - - 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 ); -} - diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/log2lin.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/log2lin.c deleted file mode 100644 index a692e009..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/log2lin.c +++ /dev/null @@ -1,58 +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 "SigProc_FIX.h" - -/* Approximation of 2^() (very close inverse of silk_lin2log()) */ -/* Convert input to a linear scale */ -opus_int32 silk_log2lin( - const opus_int32 inLog_Q7 /* I input on log scale */ -) -{ - opus_int32 out, frac_Q7; - - if( inLog_Q7 < 0 ) { - return 0; - } else if ( inLog_Q7 >= 3967 ) { - return silk_int32_MAX; - } - - out = silk_LSHIFT( 1, silk_RSHIFT( inLog_Q7, 7 ) ); - frac_Q7 = inLog_Q7 & 0x7F; - if( inLog_Q7 < 2048 ) { - /* Piece-wise parabolic approximation */ - out = silk_ADD_RSHIFT32( out, silk_MUL( out, silk_SMLAWB( frac_Q7, silk_SMULBB( frac_Q7, 128 - frac_Q7 ), -174 ) ), 7 ); - } else { - /* Piece-wise parabolic approximation */ - out = silk_MLA( out, silk_RSHIFT( out, 7 ), silk_SMLAWB( frac_Q7, silk_SMULBB( frac_Q7, 128 - frac_Q7 ), -174 ) ); - } - return out; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/macros.h b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/macros.h deleted file mode 100644 index a84e5a5d..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/macros.h +++ /dev/null @@ -1,115 +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. -***********************************************************************/ - -#ifndef SILK_MACROS_H -#define SILK_MACROS_H - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "opus_types.h" -#include "opus_defines.h" - -/* This is an OPUS_INLINE header file for general platform. */ - -/* (a32 * (opus_int32)((opus_int16)(b32))) >> 16 output have to be 32bit int */ -#define silk_SMULWB(a32, b32) ((((a32) >> 16) * (opus_int32)((opus_int16)(b32))) + ((((a32) & 0x0000FFFF) * (opus_int32)((opus_int16)(b32))) >> 16)) - -/* a32 + (b32 * (opus_int32)((opus_int16)(c32))) >> 16 output have to be 32bit int */ -#define silk_SMLAWB(a32, b32, c32) ((a32) + ((((b32) >> 16) * (opus_int32)((opus_int16)(c32))) + ((((b32) & 0x0000FFFF) * (opus_int32)((opus_int16)(c32))) >> 16))) - -/* (a32 * (b32 >> 16)) >> 16 */ -#define silk_SMULWT(a32, b32) (((a32) >> 16) * ((b32) >> 16) + ((((a32) & 0x0000FFFF) * ((b32) >> 16)) >> 16)) - -/* a32 + (b32 * (c32 >> 16)) >> 16 */ -#define silk_SMLAWT(a32, b32, c32) ((a32) + (((b32) >> 16) * ((c32) >> 16)) + ((((b32) & 0x0000FFFF) * ((c32) >> 16)) >> 16)) - -/* (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))) - -/* a32 + (opus_int32)((opus_int16)(b32)) * (opus_int32)((opus_int16)(c32)) output have to be 32bit int */ -#define silk_SMLABB(a32, b32, c32) ((a32) + ((opus_int32)((opus_int16)(b32))) * (opus_int32)((opus_int16)(c32))) - -/* (opus_int32)((opus_int16)(a32)) * (b32 >> 16) */ -#define silk_SMULBT(a32, b32) ((opus_int32)((opus_int16)(a32)) * ((b32) >> 16)) - -/* a32 + (opus_int32)((opus_int16)(b32)) * (c32 >> 16) */ -#define silk_SMLABT(a32, b32, c32) ((a32) + ((opus_int32)((opus_int16)(b32))) * ((c32) >> 16)) - -/* a64 + (b32 * c32) */ -#define silk_SMLAL(a64, b32, c32) (silk_ADD64((a64), ((opus_int64)(b32) * (opus_int64)(c32)))) - -/* (a32 * b32) >> 16 */ -#define silk_SMULWW(a32, b32) silk_MLA(silk_SMULWB((a32), (b32)), (a32), silk_RSHIFT_ROUND((b32), 16)) - -/* a32 + ((b32 * c32) >> 16) */ -#define silk_SMLAWW(a32, b32, c32) silk_MLA(silk_SMLAWB((a32), (b32), (c32)), (b32), silk_RSHIFT_ROUND((c32), 16)) - -/* add/subtract with output saturated */ -#define silk_ADD_SAT32(a, b) ((((opus_uint32)(a) + (opus_uint32)(b)) & 0x80000000) == 0 ? \ - ((((a) & (b)) & 0x80000000) != 0 ? silk_int32_MIN : (a)+(b)) : \ - ((((a) | (b)) & 0x80000000) == 0 ? silk_int32_MAX : (a)+(b)) ) - -#define silk_SUB_SAT32(a, b) ((((opus_uint32)(a)-(opus_uint32)(b)) & 0x80000000) == 0 ? \ - (( (a) & ((b)^0x80000000) & 0x80000000) ? silk_int32_MIN : (a)-(b)) : \ - ((((a)^0x80000000) & (b) & 0x80000000) ? silk_int32_MAX : (a)-(b)) ) - -#include "ecintrin.h" - -static OPUS_INLINE opus_int32 silk_CLZ16(opus_int16 in16) -{ - return 32 - EC_ILOG(in16<<16|0x8000); -} - -static OPUS_INLINE opus_int32 silk_CLZ32(opus_int32 in32) -{ - return in32 ? 32 - EC_ILOG(in32) : 32; -} - -/* 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))) - -/* Column based */ -#ifndef matrix_c_ptr -# 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 - -#endif /* SILK_MACROS_H */ - diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/main.h b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/main.h deleted file mode 100644 index 2bdf8978..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/main.h +++ /dev/null @@ -1,438 +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. -***********************************************************************/ - -#ifndef SILK_MAIN_H -#define SILK_MAIN_H - -#include "SigProc_FIX.h" -#include "define.h" -#include "structs.h" -#include "tables.h" -#include "PLC.h" -#include "control.h" -#include "debug.h" -#include "entenc.h" -#include "entdec.h" - -/* Convert Left/Right stereo signal to adaptive Mid/Side representation */ -void silk_stereo_LR_to_MS( - stereo_enc_state *state, /* I/O State */ - opus_int16 x1[], /* I/O Left input signal, becomes mid signal */ - opus_int16 x2[], /* I/O Right input signal, becomes side signal */ - opus_int8 ix[ 2 ][ 3 ], /* O Quantization indices */ - opus_int8 *mid_only_flag, /* O Flag: only mid signal coded */ - opus_int32 mid_side_rates_bps[], /* O Bitrates for mid and side signals */ - opus_int32 total_rate_bps, /* I Total bitrate */ - opus_int prev_speech_act_Q8, /* I Speech activity level in previous frame */ - opus_int toMono, /* I Last frame before a stereo->mono transition */ - opus_int fs_kHz, /* I Sample rate (kHz) */ - opus_int frame_length /* I Number of samples */ -); - -/* Convert adaptive Mid/Side representation to Left/Right stereo signal */ -void silk_stereo_MS_to_LR( - stereo_dec_state *state, /* I/O State */ - opus_int16 x1[], /* I/O Left input signal, becomes mid signal */ - opus_int16 x2[], /* I/O Right input signal, becomes side signal */ - const opus_int32 pred_Q13[], /* I Predictors */ - opus_int fs_kHz, /* I Samples rate (kHz) */ - opus_int frame_length /* I Number of samples */ -); - -/* Find least-squares prediction gain for one signal based on another and quantize it */ -opus_int32 silk_stereo_find_predictor( /* O Returns predictor in Q13 */ - opus_int32 *ratio_Q14, /* O Ratio of residual and mid energies */ - const opus_int16 x[], /* I Basis signal */ - const opus_int16 y[], /* I Target signal */ - opus_int32 mid_res_amp_Q0[], /* I/O Smoothed mid, residual norms */ - opus_int length, /* I Number of samples */ - opus_int smooth_coef_Q16 /* I Smoothing coefficient */ -); - -/* Quantize mid/side predictors */ -void silk_stereo_quant_pred( - opus_int32 pred_Q13[], /* I/O Predictors (out: quantized) */ - opus_int8 ix[ 2 ][ 3 ] /* O Quantization indices */ -); - -/* Entropy code the mid/side quantization indices */ -void silk_stereo_encode_pred( - ec_enc *psRangeEnc, /* I/O Compressor data structure */ - opus_int8 ix[ 2 ][ 3 ] /* I Quantization indices */ -); - -/* Entropy code the mid-only flag */ -void silk_stereo_encode_mid_only( - ec_enc *psRangeEnc, /* I/O Compressor data structure */ - opus_int8 mid_only_flag -); - -/* Decode mid/side predictors */ -void silk_stereo_decode_pred( - ec_dec *psRangeDec, /* I/O Compressor data structure */ - opus_int32 pred_Q13[] /* O Predictors */ -); - -/* Decode mid-only flag */ -void silk_stereo_decode_mid_only( - ec_dec *psRangeDec, /* I/O Compressor data structure */ - opus_int *decode_only_mid /* O Flag that only mid channel has been coded */ -); - -/* 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 */ -); - -/* 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 */ -); - -/* Check encoder control struct */ -opus_int check_control_input( - silk_EncControlStruct *encControl /* I Control structure */ -); - -/* Control internal sampling rate */ -opus_int silk_control_audio_bandwidth( - silk_encoder_state *psEncC, /* I/O Pointer to Silk encoder state */ - silk_EncControlStruct *encControl /* I Control structure */ -); - -/* 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) */ -); - -/***************/ -/* Shell coder */ -/***************/ - -/* Encode quantization indices of excitation */ -void silk_encode_pulses( - ec_enc *psRangeEnc, /* I/O compressor data structure */ - const opus_int signalType, /* I Signal type */ - const opus_int quantOffsetType, /* I quantOffsetType */ - opus_int8 pulses[], /* I quantization indices */ - const opus_int frame_length /* I Frame length */ -); - -/* Shell encoder, operates on one shell code frame of 16 pulses */ -void silk_shell_encoder( - ec_enc *psRangeEnc, /* I/O compressor data structure */ - const opus_int *pulses0 /* I data: nonnegative pulse amplitudes */ -); - -/* Shell decoder, operates on one shell code frame of 16 pulses */ -void silk_shell_decoder( - opus_int *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 */ -); - -/* Gain scalar quantization with hysteresis, uniform on log scale */ -void silk_gains_quant( - opus_int8 ind[ MAX_NB_SUBFR ], /* O gain indices */ - opus_int32 gain_Q16[ MAX_NB_SUBFR ], /* I/O gains (quantized out) */ - opus_int8 *prev_ind, /* I/O last index in previous frame */ - const opus_int conditional, /* I first gain is delta coded if 1 */ - const opus_int nb_subfr /* I number of subframes */ -); - -/* Gains scalar dequantization, uniform on log scale */ -void silk_gains_dequant( - opus_int32 gain_Q16[ MAX_NB_SUBFR ], /* O quantized gains */ - const opus_int8 ind[ MAX_NB_SUBFR ], /* I gain indices */ - opus_int8 *prev_ind, /* I/O last index in previous frame */ - const opus_int conditional, /* I first gain is delta coded if 1 */ - const opus_int nb_subfr /* I number of subframes */ -); - -/* Compute unique identifier of gain indices vector */ -opus_int32 silk_gains_ID( /* O returns unique identifier of gains */ - const opus_int8 ind[ MAX_NB_SUBFR ], /* I gain indices */ - const opus_int nb_subfr /* I number of subframes */ -); - -/* Interpolate two vectors */ -void silk_interpolate( - opus_int16 xi[ MAX_LPC_ORDER ], /* O interpolated vector */ - const opus_int16 x0[ MAX_LPC_ORDER ], /* I first vector */ - const opus_int16 x1[ MAX_LPC_ORDER ], /* I second vector */ - const opus_int ifact_Q2, /* I interp. factor, weight on 2nd vector */ - const opus_int d /* I number of parameters */ -); - -/* LTP tap quantizer */ -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 */ - opus_int32 *sum_gain_dB_Q7, /* I/O Cumulative max prediction gain */ - 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 */ -); - -/* Entropy constrained matrix-weighted VQ, 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 */ - 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 */ -); - -/************************************/ -/* Noise shaping quantization (NSQ) */ -/************************************/ -void silk_NSQ( - const silk_encoder_state *psEncC, /* I/O 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 */ -); - -/* Noise shaping using delayed decision */ -void silk_NSQ_del_dec( - const silk_encoder_state *psEncC, /* I/O 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 VAD */ -/************/ -/* Initialize the Silk VAD */ -opus_int silk_VAD_Init( /* O Return value, 0 if success */ - silk_VAD_state *psSilk_VAD /* I/O Pointer to Silk VAD state */ -); - -/* Get speech activity level in Q8 */ -opus_int silk_VAD_GetSA_Q8( /* O Return value, 0 if success */ - silk_encoder_state *psEncC, /* I/O Encoder state */ - const opus_int16 pIn[] /* I PCM input */ -); - -/* Low-pass filter with variable cutoff frequency based on */ -/* piece-wise linear interpolation between elliptic filters */ -/* Start by setting transition_frame_no = 1; */ -void silk_LP_variable_cutoff( - silk_LP_state *psLP, /* I/O LP filter state */ - opus_int16 *frame, /* I/O Low-pass filtered output signal */ - const opus_int frame_length /* I Frame length */ -); - -/******************/ -/* NLSF Quantizer */ -/******************/ -/* Limit, stabilize, convert and quantize NLSFs */ -void silk_process_NLSFs( - silk_encoder_state *psEncC, /* I/O Encoder state */ - opus_int16 PredCoef_Q12[ 2 ][ MAX_LPC_ORDER ], /* O Prediction coefficients */ - opus_int16 pNLSF_Q15[ MAX_LPC_ORDER ], /* I/O Normalized LSFs (quant out) (0 - (2^15-1)) */ - const opus_int16 prev_NLSFq_Q15[ MAX_LPC_ORDER ] /* I Previous Normalized LSFs (0 - (2^15-1)) */ -); - -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 ] */ - const silk_NLSF_CB_struct *psNLSF_CB, /* I Codebook object */ - const opus_int16 *pW_QW, /* 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 */ -); - -/* 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] */ - 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_int K, /* I Number of codebook vectors */ - const opus_int LPC_order /* I Number of LPCs */ -); - -/* Delayed-decision quantizer for NLSF residuals */ -opus_int32 silk_NLSF_del_dec_quant( /* O Returns RD value in Q25 */ - opus_int8 indices[], /* O Quantization indices [ order ] */ - const opus_int16 x_Q10[], /* I Input [ order ] */ - const opus_int16 w_Q5[], /* I Weights [ order ] */ - const opus_uint8 pred_coef_Q8[], /* I Backward predictor coefs [ order ] */ - const opus_int16 ec_ix[], /* I Indices to entropy coding tables [ order ] */ - const opus_uint8 ec_rates_Q5[], /* I Rates [] */ - const opus_int quant_step_size_Q16, /* I Quantization step size */ - const opus_int16 inv_quant_step_size_Q6, /* I Inverse quantization step size */ - const opus_int32 mu_Q20, /* I R/D tradeoff */ - const opus_int16 order /* I Number of input values */ -); - -/* Unpack predictor values and indices for entropy coding tables */ -void silk_NLSF_unpack( - opus_int16 ec_ix[], /* O Indices to entropy tables [ LPC_ORDER ] */ - opus_uint8 pred_Q8[], /* O LSF predictor [ LPC_ORDER ] */ - const silk_NLSF_CB_struct *psNLSF_CB, /* I Codebook object */ - const opus_int CB1_index /* I Index of vector in first LSF codebook */ -); - -/***********************/ -/* NLSF vector decoder */ -/***********************/ -void silk_NLSF_decode( - opus_int16 *pNLSF_Q15, /* O Quantized NLSF vector [ LPC_ORDER ] */ - opus_int8 *NLSFIndices, /* I Codebook path vector [ LPC_ORDER + 1 ] */ - const silk_NLSF_CB_struct *psNLSF_CB /* I Codebook object */ -); - -/****************************************************/ -/* Decoder Functions */ -/****************************************************/ -opus_int silk_init_decoder( - silk_decoder_state *psDec /* I/O Decoder state pointer */ -); - -/* Set decoder sampling rate */ -opus_int silk_decoder_set_fs( - silk_decoder_state *psDec, /* I/O Decoder state pointer */ - opus_int fs_kHz, /* I Sampling frequency (kHz) */ - opus_int32 fs_API_Hz /* I API Sampling frequency (Hz) */ -); - -/****************/ -/* Decode frame */ -/****************/ -opus_int silk_decode_frame( - silk_decoder_state *psDec, /* I/O Pointer to Silk decoder state */ - ec_dec *psRangeDec, /* I/O Compressor data structure */ - 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 */ -); - -/* Decode indices from bitstream */ -void silk_decode_indices( - silk_decoder_state *psDec, /* I/O State */ - ec_dec *psRangeDec, /* I/O Compressor data structure */ - opus_int FrameIndex, /* I Frame number */ - opus_int decode_LBRR, /* I Flag indicating LBRR data is being decoded */ - opus_int condCoding /* I The type of conditional coding to use */ -); - -/* Decode parameters from payload */ -void silk_decode_parameters( - silk_decoder_state *psDec, /* I/O State */ - silk_decoder_control *psDecCtrl, /* I/O Decoder control */ - opus_int condCoding /* I The type of conditional coding to use */ -); - -/* Core decoder. Performs inverse NSQ operation LTP + LPC */ -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 */ -); - -/* 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 */ - const opus_int signalType, /* I Sigtype */ - const opus_int quantOffsetType, /* I quantOffsetType */ - const opus_int frame_length /* I Frame length */ -); - -/******************/ -/* CNG */ -/******************/ - -/* Reset CNG */ -void silk_CNG_Reset( - silk_decoder_state *psDec /* I/O Decoder state */ -); - -/* Updates CNG estimate, and applies the CNG when packet was lost */ -void silk_CNG( - silk_decoder_state *psDec, /* I/O Decoder state */ - silk_decoder_control *psDecCtrl, /* I/O Decoder control */ - opus_int16 frame[], /* I/O Signal */ - opus_int length /* I Length of residual */ -); - -/* Encoding of various parameters */ -void silk_encode_indices( - silk_encoder_state *psEncC, /* I/O Encoder state */ - ec_enc *psRangeEnc, /* I/O Compressor data structure */ - opus_int FrameIndex, /* I Frame number */ - opus_int encode_LBRR, /* I Flag indicating LBRR data is being encoded */ - opus_int condCoding /* I The type of conditional coding to use */ -); - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/pitch_est_defines.h b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/pitch_est_defines.h deleted file mode 100644 index e1e4b5d7..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/pitch_est_defines.h +++ /dev/null @@ -1,88 +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. -***********************************************************************/ - -#ifndef SILK_PE_DEFINES_H -#define SILK_PE_DEFINES_H - -#include "SigProc_FIX.h" - -/********************************************************/ -/* Definitions for pitch estimator */ -/********************************************************/ - -#define PE_MAX_FS_KHZ 16 /* Maximum sampling frequency used */ - -#define PE_MAX_NB_SUBFR 4 -#define PE_SUBFR_LENGTH_MS 5 /* 5 ms */ - -#define PE_LTP_MEM_LENGTH_MS ( 4 * PE_SUBFR_LENGTH_MS ) - -#define PE_MAX_FRAME_LENGTH_MS ( PE_LTP_MEM_LENGTH_MS + PE_MAX_NB_SUBFR * PE_SUBFR_LENGTH_MS ) -#define PE_MAX_FRAME_LENGTH ( PE_MAX_FRAME_LENGTH_MS * PE_MAX_FS_KHZ ) -#define PE_MAX_FRAME_LENGTH_ST_1 ( PE_MAX_FRAME_LENGTH >> 2 ) -#define PE_MAX_FRAME_LENGTH_ST_2 ( PE_MAX_FRAME_LENGTH >> 1 ) - -#define PE_MAX_LAG_MS 18 /* 18 ms -> 56 Hz */ -#define PE_MIN_LAG_MS 2 /* 2 ms -> 500 Hz */ -#define PE_MAX_LAG ( PE_MAX_LAG_MS * PE_MAX_FS_KHZ ) -#define PE_MIN_LAG ( PE_MIN_LAG_MS * PE_MAX_FS_KHZ ) - -#define PE_D_SRCH_LENGTH 24 - -#define PE_NB_STAGE3_LAGS 5 - -#define PE_NB_CBKS_STAGE2 3 -#define PE_NB_CBKS_STAGE2_EXT 11 - -#define PE_NB_CBKS_STAGE3_MAX 34 -#define PE_NB_CBKS_STAGE3_MID 24 -#define PE_NB_CBKS_STAGE3_MIN 16 - -#define PE_NB_CBKS_STAGE3_10MS 12 -#define PE_NB_CBKS_STAGE2_10MS 3 - -#define PE_SHORTLAG_BIAS 0.2f /* for logarithmic weighting */ -#define PE_PREVLAG_BIAS 0.2f /* for logarithmic weighting */ -#define PE_FLATCONTOUR_BIAS 0.05f - -#define SILK_PE_MIN_COMPLEX 0 -#define SILK_PE_MID_COMPLEX 1 -#define SILK_PE_MAX_COMPLEX 2 - -/* Tables for 20 ms frames */ -extern const opus_int8 silk_CB_lags_stage2[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE2_EXT ]; -extern const opus_int8 silk_CB_lags_stage3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ]; -extern const opus_int8 silk_Lag_range_stage3[ SILK_PE_MAX_COMPLEX + 1 ] [ PE_MAX_NB_SUBFR ][ 2 ]; -extern const opus_int8 silk_nb_cbk_searchs_stage3[ SILK_PE_MAX_COMPLEX + 1 ]; - -/* Tables for 10 ms frames */ -extern const opus_int8 silk_CB_lags_stage2_10_ms[ PE_MAX_NB_SUBFR >> 1][ 3 ]; -extern const opus_int8 silk_CB_lags_stage3_10_ms[ PE_MAX_NB_SUBFR >> 1 ][ 12 ]; -extern const opus_int8 silk_Lag_range_stage3_10_ms[ PE_MAX_NB_SUBFR >> 1 ][ 2 ]; - -#endif - diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/pitch_est_tables.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/pitch_est_tables.c deleted file mode 100644 index 81a8baca..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/pitch_est_tables.c +++ /dev/null @@ -1,99 +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 "typedef.h" -#include "pitch_est_defines.h" - -const opus_int8 silk_CB_lags_stage2_10_ms[ PE_MAX_NB_SUBFR >> 1][ PE_NB_CBKS_STAGE2_10MS ] = -{ - {0, 1, 0}, - {0, 0, 1} -}; - -const opus_int8 silk_CB_lags_stage3_10_ms[ PE_MAX_NB_SUBFR >> 1 ][ PE_NB_CBKS_STAGE3_10MS ] = -{ - { 0, 0, 1,-1, 1,-1, 2,-2, 2,-2, 3,-3}, - { 0, 1, 0, 1,-1, 2,-1, 2,-2, 3,-2, 3} -}; - -const opus_int8 silk_Lag_range_stage3_10_ms[ PE_MAX_NB_SUBFR >> 1 ][ 2 ] = -{ - {-3, 7}, - {-2, 7} -}; - -const opus_int8 silk_CB_lags_stage2[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE2_EXT ] = -{ - {0, 2,-1,-1,-1, 0, 0, 1, 1, 0, 1}, - {0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0}, - {0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0}, - {0,-1, 2, 1, 0, 1, 1, 0, 0,-1,-1} -}; - -const opus_int8 silk_CB_lags_stage3[ PE_MAX_NB_SUBFR ][ PE_NB_CBKS_STAGE3_MAX ] = -{ - {0, 0, 1,-1, 0, 1,-1, 0,-1, 1,-2, 2,-2,-2, 2,-3, 2, 3,-3,-4, 3,-4, 4, 4,-5, 5,-6,-5, 6,-7, 6, 5, 8,-9}, - {0, 0, 1, 0, 0, 0, 0, 0, 0, 0,-1, 1, 0, 0, 1,-1, 0, 1,-1,-1, 1,-1, 2, 1,-1, 2,-2,-2, 2,-2, 2, 2, 3,-3}, - {0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1,-1, 1, 0, 0, 2, 1,-1, 2,-1,-1, 2,-1, 2, 2,-1, 3,-2,-2,-2, 3}, - {0, 1, 0, 0, 1, 0, 1,-1, 2,-1, 2,-1, 2, 3,-2, 3,-2,-2, 4, 4,-3, 5,-3,-4, 6,-4, 6, 5,-5, 8,-6,-5,-7, 9} -}; - -const opus_int8 silk_Lag_range_stage3[ SILK_PE_MAX_COMPLEX + 1 ] [ PE_MAX_NB_SUBFR ][ 2 ] = -{ - /* Lags to search for low number of stage3 cbks */ - { - {-5,8}, - {-1,6}, - {-1,6}, - {-4,10} - }, - /* Lags to search for middle number of stage3 cbks */ - { - {-6,10}, - {-2,6}, - {-1,6}, - {-5,10} - }, - /* Lags to search for max number of stage3 cbks */ - { - {-9,12}, - {-3,7}, - {-2,7}, - {-7,13} - } -}; - -const opus_int8 silk_nb_cbk_searchs_stage3[ SILK_PE_MAX_COMPLEX + 1 ] = -{ - PE_NB_CBKS_STAGE3_MIN, - PE_NB_CBKS_STAGE3_MID, - PE_NB_CBKS_STAGE3_MAX -}; diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/process_NLSFs.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/process_NLSFs.c deleted file mode 100644 index c27cf030..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/process_NLSFs.c +++ /dev/null @@ -1,105 +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" - -/* Limit, stabilize, convert and quantize NLSFs */ -void silk_process_NLSFs( - silk_encoder_state *psEncC, /* I/O Encoder state */ - opus_int16 PredCoef_Q12[ 2 ][ MAX_LPC_ORDER ], /* O Prediction coefficients */ - opus_int16 pNLSF_Q15[ MAX_LPC_ORDER ], /* I/O Normalized LSFs (quant out) (0 - (2^15-1)) */ - const opus_int16 prev_NLSFq_Q15[ MAX_LPC_ORDER ] /* I Previous Normalized LSFs (0 - (2^15-1)) */ -) -{ - opus_int i, doInterpolate; - opus_int NLSF_mu_Q20; - opus_int32 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 ) ); - - /***********************/ - /* Calculate mu values */ - /***********************/ - /* NLSF_mu = 0.003 - 0.0015 * psEnc->speech_activity; */ - NLSF_mu_Q20 = silk_SMLAWB( SILK_FIX_CONST( 0.003, 20 ), SILK_FIX_CONST( -0.001, 28 ), psEncC->speech_activity_Q8 ); - if( psEncC->nb_subfr == 2 ) { - /* Multiply by 1.5 for 10 ms packets */ - NLSF_mu_Q20 = silk_ADD_RSHIFT( NLSF_mu_Q20, NLSF_mu_Q20, 1 ); - } - - silk_assert( NLSF_mu_Q20 > 0 ); - silk_assert( NLSF_mu_Q20 <= SILK_FIX_CONST( 0.005, 20 ) ); - - /* Calculate NLSF weights */ - silk_NLSF_VQ_weights_laroia( pNLSFW_QW, pNLSF_Q15, psEncC->predictLPCOrder ); - - /* Update NLSF weights for interpolated NLSFs */ - doInterpolate = ( psEncC->useInterpolatedNLSFs == 1 ) && ( psEncC->indices.NLSFInterpCoef_Q2 < 4 ); - if( doInterpolate ) { - /* Calculate the interpolated NLSF vector for the first half */ - silk_interpolate( pNLSF0_temp_Q15, prev_NLSFq_Q15, pNLSF_Q15, - psEncC->indices.NLSFInterpCoef_Q2, psEncC->predictLPCOrder ); - - /* Calculate first half NLSF weights for the interpolated NLSFs */ - silk_NLSF_VQ_weights_laroia( pNLSFW0_temp_QW, pNLSF0_temp_Q15, psEncC->predictLPCOrder ); - - /* 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 ); - silk_assert( pNLSFW_QW[ i ] >= 1 ); - } - } - - silk_NLSF_encode( psEncC->indices.NLSFIndices, pNLSF_Q15, psEncC->psNLSF_CB, pNLSFW_QW, - 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 ); - - if( doInterpolate ) { - /* Calculate the interpolated, quantized LSF vector for the first half */ - silk_interpolate( pNLSF0_temp_Q15, prev_NLSFq_Q15, pNLSF_Q15, - psEncC->indices.NLSFInterpCoef_Q2, psEncC->predictLPCOrder ); - - /* Convert back to LPC coefficients */ - silk_NLSF2A( PredCoef_Q12[ 0 ], pNLSF0_temp_Q15, psEncC->predictLPCOrder ); - - } else { - /* Copy LPC coefficients for first half from second half */ - silk_memcpy( PredCoef_Q12[ 0 ], PredCoef_Q12[ 1 ], psEncC->predictLPCOrder * sizeof( opus_int16 ) ); - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/quant_LTP_gains.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/quant_LTP_gains.c deleted file mode 100644 index fd0870da..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/quant_LTP_gains.c +++ /dev/null @@ -1,128 +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" - -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 */ - opus_int32 *sum_log_gain_Q7, /* I/O Cumulative max prediction gain */ - 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_uint8 *cbk_gain_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; - opus_int32 sum_log_gain_tmp_Q7, best_sum_log_gain_Q7, max_gain_Q7, gain_Q7; - - /***************************************************/ - /* iterate over different codebooks with different */ - /* rates/distortions, and choose best */ - /***************************************************/ - min_rate_dist_Q14 = 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 pointer to first subframe */ - W_Q18_ptr = W_Q18; - b_Q14_ptr = B_Q14; - - rate_dist_Q14 = 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 */ - &rate_dist_Q14_subfr, /* O best weighted quantization error + mu * rate */ - &gain_Q7, /* O sum of absolute LTP coefficients */ - b_Q14_ptr, /* I input vector to be quantized */ - W_Q18_ptr, /* I weighting matrix */ - cbk_ptr_Q7, /* I codebook */ - cbk_gain_ptr_Q7, /* I codebook effective gains */ - cl_ptr_Q5, /* I code length for each codebook vector */ - mu_Q9, /* I tradeoff between weighted error and rate */ - max_gain_Q7, /* I maximum sum of absolute LTP coefficients */ - cbk_size /* I number of vectors in codebook */ - ); - - rate_dist_Q14 = silk_ADD_POS_SAT32( rate_dist_Q14, rate_dist_Q14_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 )); - - 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 ) ); - best_sum_log_gain_Q7 = sum_log_gain_tmp_Q7; - } - - /* 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 ); - } - } - *sum_log_gain_Q7 = best_sum_log_gain_Q7; -} - diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler.c deleted file mode 100644 index 374fbb37..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler.c +++ /dev/null @@ -1,215 +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 - -/* - * Matrix of resampling methods used: - * Fs_out (kHz) - * 8 12 16 24 48 - * - * 8 C UF U UF UF - * 12 AF C UF U UF - * Fs_in (kHz) 16 D AF C UF UF - * 24 AF D AF C U - * 48 AF AF AF D C - * - * C -> Copy (no resampling) - * D -> Allpass-based 2x downsampling - * U -> Allpass-based 2x upsampling - * UF -> Allpass-based 2x upsampling followed by FIR interpolation - * AF -> AR2 filter followed by FIR interpolation - */ - -#include "resampler_private.h" - -/* Tables with delay compensation values to equalize total delay for different modes */ -static const opus_int8 delay_matrix_enc[ 5 ][ 3 ] = { -/* in \ out 8 12 16 */ -/* 8 */ { 6, 0, 3 }, -/* 12 */ { 0, 7, 3 }, -/* 16 */ { 0, 1, 10 }, -/* 24 */ { 0, 2, 6 }, -/* 48 */ { 18, 10, 12 } -}; - -static const opus_int8 delay_matrix_dec[ 3 ][ 5 ] = { -/* in \ out 8 12 16 24 48 */ -/* 8 */ { 4, 0, 2, 0, 0 }, -/* 12 */ { 0, 9, 4, 7, 4 }, -/* 16 */ { 0, 3, 12, 7, 7 } -}; - -/* Simple way to make [8000, 12000, 16000, 24000, 48000] to [0, 1, 2, 3, 4] */ -#define rateID(R) ( ( ( ((R)>>12) - ((R)>16000) ) >> ((R)>24000) ) - 1 ) - -#define USE_silk_resampler_copy (0) -#define USE_silk_resampler_private_up2_HQ_wrapper (1) -#define USE_silk_resampler_private_IIR_FIR (2) -#define USE_silk_resampler_private_down_FIR (3) - -/* Initialize/reset the resampler state for a given pair of input/output sampling rates */ -opus_int silk_resampler_init( - silk_resampler_state_struct *S, /* I/O Resampler state */ - opus_int32 Fs_Hz_in, /* I Input sampling rate (Hz) */ - opus_int32 Fs_Hz_out, /* I Output sampling rate (Hz) */ - opus_int forEnc /* I If 1: encoder; if 0: decoder */ -) -{ - opus_int up2x; - - /* Clear state */ - silk_memset( S, 0, sizeof( silk_resampler_state_struct ) ); - - /* Input checking */ - 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 ); - 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 ); - return -1; - } - S->inputDelay = delay_matrix_dec[ rateID( Fs_Hz_in ) ][ rateID( Fs_Hz_out ) ]; - } - - S->Fs_in_kHz = silk_DIV32_16( Fs_Hz_in, 1000 ); - S->Fs_out_kHz = silk_DIV32_16( Fs_Hz_out, 1000 ); - - /* Number of samples processed per batch */ - S->batchSize = S->Fs_in_kHz * RESAMPLER_MAX_BATCH_SIZE_MS; - - /* Find resampler with the right sampling ratio */ - up2x = 0; - if( Fs_Hz_out > Fs_Hz_in ) { - /* Upsample */ - if( Fs_Hz_out == silk_MUL( Fs_Hz_in, 2 ) ) { /* Fs_out : Fs_in = 2 : 1 */ - /* Special case: directly use 2x upsampler */ - S->resampler_function = USE_silk_resampler_private_up2_HQ_wrapper; - } else { - /* Default resampler */ - S->resampler_function = USE_silk_resampler_private_IIR_FIR; - up2x = 1; - } - } else if ( Fs_Hz_out < Fs_Hz_in ) { - /* Downsample */ - S->resampler_function = USE_silk_resampler_private_down_FIR; - if( silk_MUL( Fs_Hz_out, 4 ) == silk_MUL( Fs_Hz_in, 3 ) ) { /* Fs_out : Fs_in = 3 : 4 */ - S->FIR_Fracs = 3; - S->FIR_Order = RESAMPLER_DOWN_ORDER_FIR0; - S->Coefs = silk_Resampler_3_4_COEFS; - } else if( silk_MUL( Fs_Hz_out, 3 ) == silk_MUL( Fs_Hz_in, 2 ) ) { /* Fs_out : Fs_in = 2 : 3 */ - S->FIR_Fracs = 2; - S->FIR_Order = RESAMPLER_DOWN_ORDER_FIR0; - S->Coefs = silk_Resampler_2_3_COEFS; - } else if( silk_MUL( Fs_Hz_out, 2 ) == Fs_Hz_in ) { /* Fs_out : Fs_in = 1 : 2 */ - S->FIR_Fracs = 1; - S->FIR_Order = RESAMPLER_DOWN_ORDER_FIR1; - S->Coefs = silk_Resampler_1_2_COEFS; - } else if( silk_MUL( Fs_Hz_out, 3 ) == Fs_Hz_in ) { /* Fs_out : Fs_in = 1 : 3 */ - S->FIR_Fracs = 1; - S->FIR_Order = RESAMPLER_DOWN_ORDER_FIR2; - S->Coefs = silk_Resampler_1_3_COEFS; - } else if( silk_MUL( Fs_Hz_out, 4 ) == Fs_Hz_in ) { /* Fs_out : Fs_in = 1 : 4 */ - S->FIR_Fracs = 1; - S->FIR_Order = RESAMPLER_DOWN_ORDER_FIR2; - S->Coefs = silk_Resampler_1_4_COEFS; - } else if( silk_MUL( Fs_Hz_out, 6 ) == Fs_Hz_in ) { /* Fs_out : Fs_in = 1 : 6 */ - S->FIR_Fracs = 1; - S->FIR_Order = RESAMPLER_DOWN_ORDER_FIR2; - S->Coefs = silk_Resampler_1_6_COEFS; - } else { - /* None available */ - silk_assert( 0 ); - return -1; - } - } else { - /* Input and output sampling rates are equal: copy */ - S->resampler_function = USE_silk_resampler_copy; - } - - /* Ratio of input/output samples */ - S->invRatio_Q16 = silk_LSHIFT32( silk_DIV32( silk_LSHIFT32( Fs_Hz_in, 14 + up2x ), Fs_Hz_out ), 2 ); - /* Make sure the ratio is rounded up */ - while( silk_SMULWW( S->invRatio_Q16, Fs_Hz_out ) < silk_LSHIFT32( Fs_Hz_in, up2x ) ) { - S->invRatio_Q16++; - } - - return 0; -} - -/* Resampler: convert from one sampling rate to another */ -/* Input and output sampling rate are at most 48000 Hz */ -opus_int silk_resampler( - silk_resampler_state_struct *S, /* I/O Resampler state */ - opus_int16 out[], /* O Output signal */ - const opus_int16 in[], /* I Input signal */ - opus_int32 inLen /* I Number of input samples */ -) -{ - opus_int nSamples; - - /* Need at least 1 ms of input data */ - silk_assert( inLen >= S->Fs_in_kHz ); - /* Delay can't exceed the 1 ms of buffering */ - silk_assert( S->inputDelay <= S->Fs_in_kHz ); - - nSamples = S->Fs_in_kHz - S->inputDelay; - - /* Copy to delay buffer */ - silk_memcpy( &S->delayBuf[ S->inputDelay ], in, nSamples * sizeof( opus_int16 ) ); - - switch( S->resampler_function ) { - case USE_silk_resampler_private_up2_HQ_wrapper: - silk_resampler_private_up2_HQ_wrapper( S, out, S->delayBuf, S->Fs_in_kHz ); - silk_resampler_private_up2_HQ_wrapper( S, &out[ S->Fs_out_kHz ], &in[ nSamples ], inLen - S->Fs_in_kHz ); - break; - case USE_silk_resampler_private_IIR_FIR: - silk_resampler_private_IIR_FIR( S, out, S->delayBuf, S->Fs_in_kHz ); - silk_resampler_private_IIR_FIR( S, &out[ S->Fs_out_kHz ], &in[ nSamples ], inLen - S->Fs_in_kHz ); - break; - case USE_silk_resampler_private_down_FIR: - silk_resampler_private_down_FIR( S, out, S->delayBuf, S->Fs_in_kHz ); - silk_resampler_private_down_FIR( S, &out[ S->Fs_out_kHz ], &in[ nSamples ], inLen - S->Fs_in_kHz ); - break; - default: - silk_memcpy( out, S->delayBuf, S->Fs_in_kHz * sizeof( opus_int16 ) ); - silk_memcpy( &out[ S->Fs_out_kHz ], &in[ nSamples ], ( inLen - S->Fs_in_kHz ) * sizeof( opus_int16 ) ); - } - - /* Copy to delay buffer */ - silk_memcpy( S->delayBuf, &in[ inLen - S->inputDelay ], S->inputDelay * sizeof( opus_int16 ) ); - - return 0; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_down2.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_down2.c deleted file mode 100644 index cec36346..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_down2.c +++ /dev/null @@ -1,74 +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 "SigProc_FIX.h" -#include "resampler_rom.h" - -/* Downsample by a factor 2 */ -void silk_resampler_down2( - opus_int32 *S, /* I/O State vector [ 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 ); - - /* Internal variables and state are in Q10 format */ - for( k = 0; k < len2; k++ ) { - /* Convert to Q10 */ - in32 = silk_LSHIFT( (opus_int32)in[ 2 * k ], 10 ); - - /* All-pass section for even input sample */ - Y = silk_SUB32( in32, S[ 0 ] ); - X = silk_SMLAWB( Y, Y, silk_resampler_down2_1 ); - out32 = silk_ADD32( S[ 0 ], X ); - S[ 0 ] = silk_ADD32( in32, X ); - - /* Convert to Q10 */ - in32 = silk_LSHIFT( (opus_int32)in[ 2 * k + 1 ], 10 ); - - /* All-pass section for odd input sample, and add to output of previous section */ - Y = silk_SUB32( in32, S[ 1 ] ); - X = silk_SMULWB( Y, silk_resampler_down2_0 ); - out32 = silk_ADD32( out32, S[ 1 ] ); - out32 = silk_ADD32( out32, X ); - S[ 1 ] = silk_ADD32( in32, X ); - - /* Add, convert back to int16 and store to output */ - out[ k ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( out32, 11 ) ); - } -} - diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_down2_3.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_down2_3.c deleted file mode 100644 index 4342614d..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_down2_3.c +++ /dev/null @@ -1,103 +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 "SigProc_FIX.h" -#include "resampler_private.h" -#include "stack_alloc.h" - -#define ORDER_FIR 4 - -/* Downsample by a factor 2/3, low quality */ -void silk_resampler_down2_3( - opus_int32 *S, /* I/O State vector [ 6 ] */ - opus_int16 *out, /* O Output signal [ floor(2*inLen/3) ] */ - const opus_int16 *in, /* I Input signal [ inLen ] */ - opus_int32 inLen /* I Number of input samples */ -) -{ - opus_int32 nSamplesIn, counter, res_Q6; - 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 ) ); - - /* Iterate over blocks of frameSizeIn input samples */ - while( 1 ) { - nSamplesIn = silk_min( inLen, RESAMPLER_MAX_BATCH_SIZE_IN ); - - /* Second-order AR filter (output in Q8) */ - silk_resampler_private_AR2( &S[ ORDER_FIR ], &buf[ ORDER_FIR ], in, - silk_Resampler_2_3_COEFS_LQ, nSamplesIn ); - - /* Interpolate filtered signal */ - buf_ptr = buf; - counter = nSamplesIn; - while( counter > 2 ) { - /* Inner product */ - res_Q6 = silk_SMULWB( buf_ptr[ 0 ], silk_Resampler_2_3_COEFS_LQ[ 2 ] ); - res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 1 ], silk_Resampler_2_3_COEFS_LQ[ 3 ] ); - res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 2 ], silk_Resampler_2_3_COEFS_LQ[ 5 ] ); - res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 3 ], silk_Resampler_2_3_COEFS_LQ[ 4 ] ); - - /* Scale down, saturate and store in output array */ - *out++ = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( res_Q6, 6 ) ); - - res_Q6 = silk_SMULWB( buf_ptr[ 1 ], silk_Resampler_2_3_COEFS_LQ[ 4 ] ); - res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 2 ], silk_Resampler_2_3_COEFS_LQ[ 5 ] ); - res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 3 ], silk_Resampler_2_3_COEFS_LQ[ 3 ] ); - res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 4 ], silk_Resampler_2_3_COEFS_LQ[ 2 ] ); - - /* Scale down, saturate and store in output array */ - *out++ = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( res_Q6, 6 ) ); - - buf_ptr += 3; - counter -= 3; - } - - in += nSamplesIn; - inLen -= nSamplesIn; - - if( inLen > 0 ) { - /* More iterations to do; copy last part of filtered signal to beginning of buffer */ - silk_memcpy( buf, &buf[ nSamplesIn ], ORDER_FIR * sizeof( opus_int32 ) ); - } else { - break; - } - } - - /* 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/sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_private.h b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_private.h deleted file mode 100644 index 422a7d9d..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_private.h +++ /dev/null @@ -1,88 +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. -***********************************************************************/ - -#ifndef SILK_RESAMPLER_PRIVATE_H -#define SILK_RESAMPLER_PRIVATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "SigProc_FIX.h" -#include "resampler_structs.h" -#include "resampler_rom.h" - -/* Number of input samples to process in the inner loop */ -#define RESAMPLER_MAX_BATCH_SIZE_MS 10 -#define RESAMPLER_MAX_FS_KHZ 48 -#define RESAMPLER_MAX_BATCH_SIZE_IN ( RESAMPLER_MAX_BATCH_SIZE_MS * RESAMPLER_MAX_FS_KHZ ) - -/* Description: Hybrid IIR/FIR polyphase implementation of resampling */ -void silk_resampler_private_IIR_FIR( - void *SS, /* I/O Resampler state */ - opus_int16 out[], /* O Output signal */ - const opus_int16 in[], /* I Input signal */ - opus_int32 inLen /* I Number of input samples */ -); - -/* Description: Hybrid IIR/FIR polyphase implementation of resampling */ -void silk_resampler_private_down_FIR( - void *SS, /* I/O Resampler state */ - opus_int16 out[], /* O Output signal */ - const opus_int16 in[], /* I Input signal */ - opus_int32 inLen /* I Number of input samples */ -); - -/* Upsample by a factor 2, high quality */ -void silk_resampler_private_up2_HQ_wrapper( - void *SS, /* I/O Resampler state (unused) */ - opus_int16 *out, /* O Output signal [ 2 * len ] */ - const opus_int16 *in, /* I Input signal [ len ] */ - opus_int32 len /* I Number of input samples */ -); - -/* Upsample by a factor 2, high quality */ -void silk_resampler_private_up2_HQ( - opus_int32 *S, /* I/O Resampler state [ 6 ] */ - opus_int16 *out, /* O Output signal [ 2 * len ] */ - const opus_int16 *in, /* I Input signal [ len ] */ - opus_int32 len /* I Number of input samples */ -); - -/* Second order AR filter */ -void silk_resampler_private_AR2( - opus_int32 S[], /* I/O State vector [ 2 ] */ - opus_int32 out_Q8[], /* O Output signal */ - const opus_int16 in[], /* I Input signal */ - const opus_int16 A_Q14[], /* I AR coefficients, Q14 */ - opus_int32 len /* I Signal length */ -); - -#ifdef __cplusplus -} -#endif -#endif /* SILK_RESAMPLER_PRIVATE_H */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_private_AR2.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_private_AR2.c deleted file mode 100644 index 5fff2371..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_private_AR2.c +++ /dev/null @@ -1,55 +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 "SigProc_FIX.h" -#include "resampler_private.h" - -/* Second order AR filter with single delay elements */ -void silk_resampler_private_AR2( - opus_int32 S[], /* I/O State vector [ 2 ] */ - opus_int32 out_Q8[], /* O Output signal */ - const opus_int16 in[], /* I Input signal */ - const opus_int16 A_Q14[], /* I AR coefficients, Q14 */ - opus_int32 len /* I Signal length */ -) -{ - opus_int32 k; - opus_int32 out32; - - for( k = 0; k < len; k++ ) { - out32 = silk_ADD_LSHIFT32( S[ 0 ], (opus_int32)in[ k ], 8 ); - out_Q8[ k ] = out32; - out32 = silk_LSHIFT( out32, 2 ); - S[ 0 ] = silk_SMLAWB( S[ 1 ], out32, A_Q14[ 0 ] ); - S[ 1 ] = silk_SMULWB( out32, A_Q14[ 1 ] ); - } -} - diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_private_IIR_FIR.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_private_IIR_FIR.c deleted file mode 100644 index 6b2b3a2e..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_private_IIR_FIR.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 "SigProc_FIX.h" -#include "resampler_private.h" -#include "stack_alloc.h" - -static OPUS_INLINE opus_int16 *silk_resampler_private_IIR_FIR_INTERPOL( - opus_int16 *out, - opus_int16 *buf, - opus_int32 max_index_Q16, - opus_int32 index_increment_Q16 -) -{ - opus_int32 index_Q16, res_Q15; - opus_int16 *buf_ptr; - opus_int32 table_index; - - /* Interpolate upsampled signal and store in output array */ - for( index_Q16 = 0; index_Q16 < max_index_Q16; index_Q16 += index_increment_Q16 ) { - table_index = silk_SMULWB( index_Q16 & 0xFFFF, 12 ); - buf_ptr = &buf[ index_Q16 >> 16 ]; - - res_Q15 = silk_SMULBB( buf_ptr[ 0 ], silk_resampler_frac_FIR_12[ table_index ][ 0 ] ); - res_Q15 = silk_SMLABB( res_Q15, buf_ptr[ 1 ], silk_resampler_frac_FIR_12[ table_index ][ 1 ] ); - res_Q15 = silk_SMLABB( res_Q15, buf_ptr[ 2 ], silk_resampler_frac_FIR_12[ table_index ][ 2 ] ); - res_Q15 = silk_SMLABB( res_Q15, buf_ptr[ 3 ], silk_resampler_frac_FIR_12[ table_index ][ 3 ] ); - res_Q15 = silk_SMLABB( res_Q15, buf_ptr[ 4 ], silk_resampler_frac_FIR_12[ 11 - table_index ][ 3 ] ); - res_Q15 = silk_SMLABB( res_Q15, buf_ptr[ 5 ], silk_resampler_frac_FIR_12[ 11 - table_index ][ 2 ] ); - res_Q15 = silk_SMLABB( res_Q15, buf_ptr[ 6 ], silk_resampler_frac_FIR_12[ 11 - table_index ][ 1 ] ); - res_Q15 = silk_SMLABB( res_Q15, buf_ptr[ 7 ], silk_resampler_frac_FIR_12[ 11 - table_index ][ 0 ] ); - *out++ = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( res_Q15, 15 ) ); - } - return out; -} -/* Upsample using a combination of allpass-based 2x upsampling and FIR interpolation */ -void silk_resampler_private_IIR_FIR( - void *SS, /* I/O Resampler state */ - opus_int16 out[], /* O Output signal */ - const opus_int16 in[], /* I Input signal */ - opus_int32 inLen /* I Number of input samples */ -) -{ - silk_resampler_state_struct *S = (silk_resampler_state_struct *)SS; - opus_int32 nSamplesIn; - opus_int32 max_index_Q16, index_increment_Q16; - VARDECL( opus_int16, buf ); - SAVE_STACK; - - ALLOC( buf, 2 * S->batchSize + RESAMPLER_ORDER_FIR_12, opus_int16 ); - - /* Copy buffered samples to start of buffer */ - silk_memcpy( buf, S->sFIR.i16, RESAMPLER_ORDER_FIR_12 * sizeof( opus_int16 ) ); - - /* Iterate over blocks of frameSizeIn input samples */ - index_increment_Q16 = S->invRatio_Q16; - while( 1 ) { - nSamplesIn = silk_min( inLen, S->batchSize ); - - /* Upsample 2x */ - silk_resampler_private_up2_HQ( S->sIIR, &buf[ RESAMPLER_ORDER_FIR_12 ], in, nSamplesIn ); - - max_index_Q16 = silk_LSHIFT32( nSamplesIn, 16 + 1 ); /* + 1 because 2x upsampling */ - out = silk_resampler_private_IIR_FIR_INTERPOL( out, buf, max_index_Q16, index_increment_Q16 ); - in += nSamplesIn; - inLen -= nSamplesIn; - - if( inLen > 0 ) { - /* More iterations to do; copy last part of filtered signal to beginning of buffer */ - silk_memcpy( buf, &buf[ nSamplesIn << 1 ], RESAMPLER_ORDER_FIR_12 * sizeof( opus_int16 ) ); - } else { - break; - } - } - - /* Copy last part of filtered signal to the state for the next call */ - silk_memcpy( S->sFIR.i16, &buf[ nSamplesIn << 1 ], RESAMPLER_ORDER_FIR_12 * sizeof( opus_int16 ) ); - RESTORE_STACK; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_private_down_FIR.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_private_down_FIR.c deleted file mode 100644 index 783e42b3..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_private_down_FIR.c +++ /dev/null @@ -1,194 +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 "SigProc_FIX.h" -#include "resampler_private.h" -#include "stack_alloc.h" - -static OPUS_INLINE opus_int16 *silk_resampler_private_down_FIR_INTERPOL( - opus_int16 *out, - opus_int32 *buf, - const opus_int16 *FIR_Coefs, - opus_int FIR_Order, - opus_int FIR_Fracs, - opus_int32 max_index_Q16, - opus_int32 index_increment_Q16 -) -{ - opus_int32 index_Q16, res_Q6; - opus_int32 *buf_ptr; - opus_int32 interpol_ind; - const opus_int16 *interpol_ptr; - - switch( FIR_Order ) { - case RESAMPLER_DOWN_ORDER_FIR0: - for( index_Q16 = 0; index_Q16 < max_index_Q16; index_Q16 += index_increment_Q16 ) { - /* Integer part gives pointer to buffered input */ - buf_ptr = buf + silk_RSHIFT( index_Q16, 16 ); - - /* Fractional part gives interpolation coefficients */ - interpol_ind = silk_SMULWB( index_Q16 & 0xFFFF, FIR_Fracs ); - - /* Inner product */ - interpol_ptr = &FIR_Coefs[ RESAMPLER_DOWN_ORDER_FIR0 / 2 * interpol_ind ]; - res_Q6 = silk_SMULWB( buf_ptr[ 0 ], interpol_ptr[ 0 ] ); - res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 1 ], interpol_ptr[ 1 ] ); - res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 2 ], interpol_ptr[ 2 ] ); - res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 3 ], interpol_ptr[ 3 ] ); - res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 4 ], interpol_ptr[ 4 ] ); - res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 5 ], interpol_ptr[ 5 ] ); - res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 6 ], interpol_ptr[ 6 ] ); - res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 7 ], interpol_ptr[ 7 ] ); - res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 8 ], interpol_ptr[ 8 ] ); - interpol_ptr = &FIR_Coefs[ RESAMPLER_DOWN_ORDER_FIR0 / 2 * ( FIR_Fracs - 1 - interpol_ind ) ]; - res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 17 ], interpol_ptr[ 0 ] ); - res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 16 ], interpol_ptr[ 1 ] ); - res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 15 ], interpol_ptr[ 2 ] ); - res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 14 ], interpol_ptr[ 3 ] ); - res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 13 ], interpol_ptr[ 4 ] ); - res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 12 ], interpol_ptr[ 5 ] ); - res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 11 ], interpol_ptr[ 6 ] ); - res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 10 ], interpol_ptr[ 7 ] ); - res_Q6 = silk_SMLAWB( res_Q6, buf_ptr[ 9 ], interpol_ptr[ 8 ] ); - - /* Scale down, saturate and store in output array */ - *out++ = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( res_Q6, 6 ) ); - } - break; - case RESAMPLER_DOWN_ORDER_FIR1: - for( index_Q16 = 0; index_Q16 < max_index_Q16; index_Q16 += index_increment_Q16 ) { - /* Integer part gives pointer to buffered input */ - buf_ptr = buf + silk_RSHIFT( index_Q16, 16 ); - - /* Inner product */ - res_Q6 = silk_SMULWB( silk_ADD32( buf_ptr[ 0 ], buf_ptr[ 23 ] ), FIR_Coefs[ 0 ] ); - res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 1 ], buf_ptr[ 22 ] ), FIR_Coefs[ 1 ] ); - res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 2 ], buf_ptr[ 21 ] ), FIR_Coefs[ 2 ] ); - res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 3 ], buf_ptr[ 20 ] ), FIR_Coefs[ 3 ] ); - res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 4 ], buf_ptr[ 19 ] ), FIR_Coefs[ 4 ] ); - res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 5 ], buf_ptr[ 18 ] ), FIR_Coefs[ 5 ] ); - res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 6 ], buf_ptr[ 17 ] ), FIR_Coefs[ 6 ] ); - res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 7 ], buf_ptr[ 16 ] ), FIR_Coefs[ 7 ] ); - res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 8 ], buf_ptr[ 15 ] ), FIR_Coefs[ 8 ] ); - res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 9 ], buf_ptr[ 14 ] ), FIR_Coefs[ 9 ] ); - res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 10 ], buf_ptr[ 13 ] ), FIR_Coefs[ 10 ] ); - res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 11 ], buf_ptr[ 12 ] ), FIR_Coefs[ 11 ] ); - - /* Scale down, saturate and store in output array */ - *out++ = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( res_Q6, 6 ) ); - } - break; - case RESAMPLER_DOWN_ORDER_FIR2: - for( index_Q16 = 0; index_Q16 < max_index_Q16; index_Q16 += index_increment_Q16 ) { - /* Integer part gives pointer to buffered input */ - buf_ptr = buf + silk_RSHIFT( index_Q16, 16 ); - - /* Inner product */ - res_Q6 = silk_SMULWB( silk_ADD32( buf_ptr[ 0 ], buf_ptr[ 35 ] ), FIR_Coefs[ 0 ] ); - res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 1 ], buf_ptr[ 34 ] ), FIR_Coefs[ 1 ] ); - res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 2 ], buf_ptr[ 33 ] ), FIR_Coefs[ 2 ] ); - res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 3 ], buf_ptr[ 32 ] ), FIR_Coefs[ 3 ] ); - res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 4 ], buf_ptr[ 31 ] ), FIR_Coefs[ 4 ] ); - res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 5 ], buf_ptr[ 30 ] ), FIR_Coefs[ 5 ] ); - res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 6 ], buf_ptr[ 29 ] ), FIR_Coefs[ 6 ] ); - res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 7 ], buf_ptr[ 28 ] ), FIR_Coefs[ 7 ] ); - res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 8 ], buf_ptr[ 27 ] ), FIR_Coefs[ 8 ] ); - res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 9 ], buf_ptr[ 26 ] ), FIR_Coefs[ 9 ] ); - res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 10 ], buf_ptr[ 25 ] ), FIR_Coefs[ 10 ] ); - res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 11 ], buf_ptr[ 24 ] ), FIR_Coefs[ 11 ] ); - res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 12 ], buf_ptr[ 23 ] ), FIR_Coefs[ 12 ] ); - res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 13 ], buf_ptr[ 22 ] ), FIR_Coefs[ 13 ] ); - res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 14 ], buf_ptr[ 21 ] ), FIR_Coefs[ 14 ] ); - res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 15 ], buf_ptr[ 20 ] ), FIR_Coefs[ 15 ] ); - res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 16 ], buf_ptr[ 19 ] ), FIR_Coefs[ 16 ] ); - res_Q6 = silk_SMLAWB( res_Q6, silk_ADD32( buf_ptr[ 17 ], buf_ptr[ 18 ] ), FIR_Coefs[ 17 ] ); - - /* Scale down, saturate and store in output array */ - *out++ = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( res_Q6, 6 ) ); - } - break; - default: - silk_assert( 0 ); - } - return out; -} - -/* Resample with a 2nd order AR filter followed by FIR interpolation */ -void silk_resampler_private_down_FIR( - void *SS, /* I/O Resampler state */ - opus_int16 out[], /* O Output signal */ - const opus_int16 in[], /* I Input signal */ - opus_int32 inLen /* I Number of input samples */ -) -{ - silk_resampler_state_struct *S = (silk_resampler_state_struct *)SS; - opus_int32 nSamplesIn; - opus_int32 max_index_Q16, index_increment_Q16; - 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 ) ); - - FIR_Coefs = &S->Coefs[ 2 ]; - - /* Iterate over blocks of frameSizeIn input samples */ - index_increment_Q16 = S->invRatio_Q16; - while( 1 ) { - nSamplesIn = silk_min( inLen, S->batchSize ); - - /* Second-order AR filter (output in Q8) */ - silk_resampler_private_AR2( S->sIIR, &buf[ S->FIR_Order ], in, S->Coefs, nSamplesIn ); - - max_index_Q16 = silk_LSHIFT32( nSamplesIn, 16 ); - - /* Interpolate filtered signal */ - out = silk_resampler_private_down_FIR_INTERPOL( out, buf, FIR_Coefs, S->FIR_Order, - S->FIR_Fracs, max_index_Q16, index_increment_Q16 ); - - in += nSamplesIn; - inLen -= nSamplesIn; - - if( inLen > 1 ) { - /* More iterations to do; copy last part of filtered signal to beginning of buffer */ - silk_memcpy( buf, &buf[ nSamplesIn ], S->FIR_Order * sizeof( opus_int32 ) ); - } else { - break; - } - } - - /* 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/sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_private_up2_HQ.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_private_up2_HQ.c deleted file mode 100644 index c7ec8de3..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_private_up2_HQ.c +++ /dev/null @@ -1,113 +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 "SigProc_FIX.h" -#include "resampler_private.h" - -/* Upsample by a factor 2, high quality */ -/* Uses 2nd order allpass filters for the 2x upsampling, followed by a */ -/* notch filter just above Nyquist. */ -void silk_resampler_private_up2_HQ( - opus_int32 *S, /* I/O Resampler state [ 6 ] */ - opus_int16 *out, /* O Output signal [ 2 * len ] */ - const opus_int16 *in, /* I Input signal [ len ] */ - opus_int32 len /* I Number of input samples */ -) -{ - opus_int32 k; - opus_int32 in32, out32_1, out32_2, Y, X; - - silk_assert( silk_resampler_up2_hq_0[ 0 ] > 0 ); - silk_assert( silk_resampler_up2_hq_0[ 1 ] > 0 ); - silk_assert( silk_resampler_up2_hq_0[ 2 ] < 0 ); - silk_assert( silk_resampler_up2_hq_1[ 0 ] > 0 ); - silk_assert( silk_resampler_up2_hq_1[ 1 ] > 0 ); - silk_assert( silk_resampler_up2_hq_1[ 2 ] < 0 ); - - /* Internal variables and state are in Q10 format */ - for( k = 0; k < len; k++ ) { - /* Convert to Q10 */ - in32 = silk_LSHIFT( (opus_int32)in[ k ], 10 ); - - /* First all-pass section for even output sample */ - Y = silk_SUB32( in32, S[ 0 ] ); - X = silk_SMULWB( Y, silk_resampler_up2_hq_0[ 0 ] ); - out32_1 = silk_ADD32( S[ 0 ], X ); - S[ 0 ] = silk_ADD32( in32, X ); - - /* Second all-pass section for even output sample */ - Y = silk_SUB32( out32_1, S[ 1 ] ); - X = silk_SMULWB( Y, silk_resampler_up2_hq_0[ 1 ] ); - out32_2 = silk_ADD32( S[ 1 ], X ); - S[ 1 ] = silk_ADD32( out32_1, X ); - - /* Third all-pass section for even output sample */ - Y = silk_SUB32( out32_2, S[ 2 ] ); - X = silk_SMLAWB( Y, Y, silk_resampler_up2_hq_0[ 2 ] ); - out32_1 = silk_ADD32( S[ 2 ], X ); - S[ 2 ] = silk_ADD32( out32_2, X ); - - /* Apply gain in Q15, convert back to int16 and store to output */ - out[ 2 * k ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( out32_1, 10 ) ); - - /* First all-pass section for odd output sample */ - Y = silk_SUB32( in32, S[ 3 ] ); - X = silk_SMULWB( Y, silk_resampler_up2_hq_1[ 0 ] ); - out32_1 = silk_ADD32( S[ 3 ], X ); - S[ 3 ] = silk_ADD32( in32, X ); - - /* Second all-pass section for odd output sample */ - Y = silk_SUB32( out32_1, S[ 4 ] ); - X = silk_SMULWB( Y, silk_resampler_up2_hq_1[ 1 ] ); - out32_2 = silk_ADD32( S[ 4 ], X ); - S[ 4 ] = silk_ADD32( out32_1, X ); - - /* Third all-pass section for odd output sample */ - Y = silk_SUB32( out32_2, S[ 5 ] ); - X = silk_SMLAWB( Y, Y, silk_resampler_up2_hq_1[ 2 ] ); - out32_1 = silk_ADD32( S[ 5 ], X ); - S[ 5 ] = silk_ADD32( out32_2, X ); - - /* Apply gain in Q15, convert back to int16 and store to output */ - out[ 2 * k + 1 ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( out32_1, 10 ) ); - } -} - -void silk_resampler_private_up2_HQ_wrapper( - void *SS, /* I/O Resampler state (unused) */ - opus_int16 *out, /* O Output signal [ 2 * len ] */ - const opus_int16 *in, /* I Input signal [ len ] */ - opus_int32 len /* I Number of input samples */ -) -{ - silk_resampler_state_struct *S = (silk_resampler_state_struct *)SS; - silk_resampler_private_up2_HQ( S->sIIR, out, in, len ); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_rom.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_rom.c deleted file mode 100644 index 2d502706..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_rom.c +++ /dev/null @@ -1,96 +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 - -/* Filter coefficients for IIR/FIR polyphase resampling * - * Total size: 179 Words (358 Bytes) */ - -#include "resampler_private.h" - -/* Matlab code for the notch filter coefficients: */ -/* B = [1, 0.147, 1]; A = [1, 0.107, 0.89]; G = 0.93; freqz(G * B, A, 2^14, 16e3); axis([0, 8000, -10, 1]) */ -/* fprintf('\t%6d, %6d, %6d, %6d\n', round(B(2)*2^16), round(-A(2)*2^16), round((1-A(3))*2^16), round(G*2^15)) */ -/* const opus_int16 silk_resampler_up2_hq_notch[ 4 ] = { 9634, -7012, 7209, 30474 }; */ - -/* 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, -}; - -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, -}; - -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, -}; - -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, -}; - -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, -}; - -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, -}; - -silk_DWORD_ALIGN const opus_int16 silk_Resampler_2_3_COEFS_LQ[ 2 + 2 * 2 ] = { - -2797, -6507, - 4697, 10739, - 1567, 8276, -}; - -/* 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 }, -}; diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_rom.h b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_rom.h deleted file mode 100644 index 490b3388..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_rom.h +++ /dev/null @@ -1,68 +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. -***********************************************************************/ - -#ifndef SILK_FIX_RESAMPLER_ROM_H -#define SILK_FIX_RESAMPLER_ROM_H - -#ifdef __cplusplus -extern "C" -{ -#endif - -#include "typedef.h" -#include "resampler_structs.h" - -#define RESAMPLER_DOWN_ORDER_FIR0 18 -#define RESAMPLER_DOWN_ORDER_FIR1 24 -#define RESAMPLER_DOWN_ORDER_FIR2 36 -#define RESAMPLER_ORDER_FIR_12 8 - -/* Tables for 2x downsampler */ -static const opus_int16 silk_resampler_down2_0 = 9872; -static const opus_int16 silk_resampler_down2_1 = 39809 - 65536; - -/* Tables for 2x upsampler, high quality */ -static const opus_int16 silk_resampler_up2_hq_0[ 3 ] = { 1746, 14986, 39083 - 65536 }; -static const opus_int16 silk_resampler_up2_hq_1[ 3 ] = { 6854, 25769, 55542 - 65536 }; - -/* Tables with IIR and FIR coefficients for fractional downsamplers */ -extern const opus_int16 silk_Resampler_3_4_COEFS[ 2 + 3 * RESAMPLER_DOWN_ORDER_FIR0 / 2 ]; -extern const opus_int16 silk_Resampler_2_3_COEFS[ 2 + 2 * RESAMPLER_DOWN_ORDER_FIR0 / 2 ]; -extern const opus_int16 silk_Resampler_1_2_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR1 / 2 ]; -extern const opus_int16 silk_Resampler_1_3_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR2 / 2 ]; -extern const opus_int16 silk_Resampler_1_4_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR2 / 2 ]; -extern const opus_int16 silk_Resampler_1_6_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR2 / 2 ]; -extern const opus_int16 silk_Resampler_2_3_COEFS_LQ[ 2 + 2 * 2 ]; - -/* Table with interplation fractions of 1/24, 3/24, ..., 23/24 */ -extern const opus_int16 silk_resampler_frac_FIR_12[ 12 ][ RESAMPLER_ORDER_FIR_12 / 2 ]; - -#ifdef __cplusplus -} -#endif - -#endif /* SILK_FIX_RESAMPLER_ROM_H */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_structs.h b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_structs.h deleted file mode 100644 index 9e9457d1..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/resampler_structs.h +++ /dev/null @@ -1,60 +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. -***********************************************************************/ - -#ifndef SILK_RESAMPLER_STRUCTS_H -#define SILK_RESAMPLER_STRUCTS_H - -#ifdef __cplusplus -extern "C" { -#endif - -#define SILK_RESAMPLER_MAX_FIR_ORDER 36 -#define SILK_RESAMPLER_MAX_IIR_ORDER 6 - -typedef struct _silk_resampler_state_struct{ - opus_int32 sIIR[ SILK_RESAMPLER_MAX_IIR_ORDER ]; /* this must be the first element of this struct */ - union{ - opus_int32 i32[ SILK_RESAMPLER_MAX_FIR_ORDER ]; - opus_int16 i16[ SILK_RESAMPLER_MAX_FIR_ORDER ]; - } sFIR; - opus_int16 delayBuf[ 48 ]; - opus_int resampler_function; - opus_int batchSize; - opus_int32 invRatio_Q16; - opus_int FIR_Order; - opus_int FIR_Fracs; - opus_int Fs_in_kHz; - opus_int Fs_out_kHz; - opus_int inputDelay; - const opus_int16 *Coefs; -} silk_resampler_state_struct; - -#ifdef __cplusplus -} -#endif -#endif /* SILK_RESAMPLER_STRUCTS_H */ - diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/shell_coder.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/shell_coder.c deleted file mode 100644 index 796f57d6..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/shell_coder.c +++ /dev/null @@ -1,151 +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" - -/* shell coder; pulse-subframe length is hardcoded */ - -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 */ -) -{ - opus_int k; - for( k = 0; k < len; k++ ) { - out[ k ] = in[ 2 * k ] + in[ 2 * k + 1 ]; - } -} - -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 */ - const opus_uint8 *shell_table /* I table of shell cdfs */ -) -{ - if( p > 0 ) { - ec_enc_icdf( psRangeEnc, p_child1, &shell_table[ silk_shell_code_table_offsets[ p ] ], 8 ); - } -} - -static OPUS_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 */ - 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 */ -) -{ - if( p > 0 ) { - p_child1[ 0 ] = ec_dec_icdf( psRangeDec, &shell_table[ silk_shell_code_table_offsets[ p ] ], 8 ); - p_child2[ 0 ] = p - p_child1[ 0 ]; - } else { - p_child1[ 0 ] = 0; - p_child2[ 0 ] = 0; - } -} - -/* Shell encoder, operates on one shell code frame of 16 pulses */ -void silk_shell_encoder( - ec_enc *psRangeEnc, /* I/O compressor data structure */ - const opus_int *pulses0 /* I data: nonnegative pulse amplitudes */ -) -{ - opus_int pulses1[ 8 ], pulses2[ 4 ], pulses3[ 2 ], pulses4[ 1 ]; - - /* this function operates on one shell code frame of 16 pulses */ - silk_assert( SHELL_CODEC_FRAME_LENGTH == 16 ); - - /* tree representation per pulse-subframe */ - combine_pulses( pulses1, pulses0, 8 ); - combine_pulses( pulses2, pulses1, 4 ); - combine_pulses( pulses3, pulses2, 2 ); - combine_pulses( pulses4, pulses3, 1 ); - - encode_split( psRangeEnc, pulses3[ 0 ], pulses4[ 0 ], silk_shell_code_table3 ); - - encode_split( psRangeEnc, pulses2[ 0 ], pulses3[ 0 ], silk_shell_code_table2 ); - - encode_split( psRangeEnc, pulses1[ 0 ], pulses2[ 0 ], silk_shell_code_table1 ); - encode_split( psRangeEnc, pulses0[ 0 ], pulses1[ 0 ], silk_shell_code_table0 ); - encode_split( psRangeEnc, pulses0[ 2 ], pulses1[ 1 ], silk_shell_code_table0 ); - - encode_split( psRangeEnc, pulses1[ 2 ], pulses2[ 1 ], silk_shell_code_table1 ); - encode_split( psRangeEnc, pulses0[ 4 ], pulses1[ 2 ], silk_shell_code_table0 ); - encode_split( psRangeEnc, pulses0[ 6 ], pulses1[ 3 ], silk_shell_code_table0 ); - - encode_split( psRangeEnc, pulses2[ 2 ], pulses3[ 1 ], silk_shell_code_table2 ); - - encode_split( psRangeEnc, pulses1[ 4 ], pulses2[ 2 ], silk_shell_code_table1 ); - encode_split( psRangeEnc, pulses0[ 8 ], pulses1[ 4 ], silk_shell_code_table0 ); - encode_split( psRangeEnc, pulses0[ 10 ], pulses1[ 5 ], silk_shell_code_table0 ); - - encode_split( psRangeEnc, pulses1[ 6 ], pulses2[ 3 ], silk_shell_code_table1 ); - encode_split( psRangeEnc, pulses0[ 12 ], pulses1[ 6 ], silk_shell_code_table0 ); - encode_split( psRangeEnc, pulses0[ 14 ], pulses1[ 7 ], silk_shell_code_table0 ); -} - - -/* Shell decoder, operates on one shell code frame of 16 pulses */ -void silk_shell_decoder( - opus_int *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 ]; - - /* this function operates on one shell code frame of 16 pulses */ - silk_assert( SHELL_CODEC_FRAME_LENGTH == 16 ); - - decode_split( &pulses3[ 0 ], &pulses3[ 1 ], psRangeDec, pulses4, silk_shell_code_table3 ); - - decode_split( &pulses2[ 0 ], &pulses2[ 1 ], psRangeDec, pulses3[ 0 ], silk_shell_code_table2 ); - - decode_split( &pulses1[ 0 ], &pulses1[ 1 ], psRangeDec, pulses2[ 0 ], silk_shell_code_table1 ); - decode_split( &pulses0[ 0 ], &pulses0[ 1 ], psRangeDec, pulses1[ 0 ], silk_shell_code_table0 ); - decode_split( &pulses0[ 2 ], &pulses0[ 3 ], psRangeDec, pulses1[ 1 ], silk_shell_code_table0 ); - - decode_split( &pulses1[ 2 ], &pulses1[ 3 ], psRangeDec, pulses2[ 1 ], silk_shell_code_table1 ); - decode_split( &pulses0[ 4 ], &pulses0[ 5 ], psRangeDec, pulses1[ 2 ], silk_shell_code_table0 ); - decode_split( &pulses0[ 6 ], &pulses0[ 7 ], psRangeDec, pulses1[ 3 ], silk_shell_code_table0 ); - - decode_split( &pulses2[ 2 ], &pulses2[ 3 ], psRangeDec, pulses3[ 1 ], silk_shell_code_table2 ); - - decode_split( &pulses1[ 4 ], &pulses1[ 5 ], psRangeDec, pulses2[ 2 ], silk_shell_code_table1 ); - decode_split( &pulses0[ 8 ], &pulses0[ 9 ], psRangeDec, pulses1[ 4 ], silk_shell_code_table0 ); - decode_split( &pulses0[ 10 ], &pulses0[ 11 ], psRangeDec, pulses1[ 5 ], silk_shell_code_table0 ); - - decode_split( &pulses1[ 6 ], &pulses1[ 7 ], psRangeDec, pulses2[ 3 ], silk_shell_code_table1 ); - decode_split( &pulses0[ 12 ], &pulses0[ 13 ], psRangeDec, pulses1[ 6 ], silk_shell_code_table0 ); - decode_split( &pulses0[ 14 ], &pulses0[ 15 ], psRangeDec, pulses1[ 7 ], silk_shell_code_table0 ); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/sigm_Q15.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/sigm_Q15.c deleted file mode 100644 index 3c507d25..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/sigm_Q15.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 - -/* Approximate sigmoid function */ - -#include "SigProc_FIX.h" - -/* fprintf(1, '%d, ', round(1024 * ([1 ./ (1 + exp(-(1:5))), 1] - 1 ./ (1 + exp(-(0:5)))))); */ -static const opus_int32 sigm_LUT_slope_Q10[ 6 ] = { - 237, 153, 73, 30, 12, 7 -}; -/* fprintf(1, '%d, ', round(32767 * 1 ./ (1 + exp(-(0:5))))); */ -static const opus_int32 sigm_LUT_pos_Q15[ 6 ] = { - 16384, 23955, 28861, 31213, 32178, 32548 -}; -/* fprintf(1, '%d, ', round(32767 * 1 ./ (1 + exp((0:5))))); */ -static const opus_int32 sigm_LUT_neg_Q15[ 6 ] = { - 16384, 8812, 3906, 1554, 589, 219 -}; - -opus_int silk_sigm_Q15( - opus_int in_Q5 /* I */ -) -{ - opus_int ind; - - if( in_Q5 < 0 ) { - /* Negative input */ - in_Q5 = -in_Q5; - if( in_Q5 >= 6 * 32 ) { - return 0; /* Clip */ - } else { - /* Linear interpolation of look up table */ - ind = silk_RSHIFT( in_Q5, 5 ); - return( sigm_LUT_neg_Q15[ ind ] - silk_SMULBB( sigm_LUT_slope_Q10[ ind ], in_Q5 & 0x1F ) ); - } - } else { - /* Positive input */ - if( in_Q5 >= 6 * 32 ) { - return 32767; /* clip */ - } else { - /* Linear interpolation of look up table */ - ind = silk_RSHIFT( in_Q5, 5 ); - return( sigm_LUT_pos_Q15[ ind ] + silk_SMULBB( sigm_LUT_slope_Q10[ ind ], in_Q5 & 0x1F ) ); - } - } -} - diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/sort.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/sort.c deleted file mode 100644 index 8670dbdd..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/sort.c +++ /dev/null @@ -1,154 +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 - -/* Insertion sort (fast for already almost sorted arrays): */ -/* 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 */ - -#include "SigProc_FIX.h" - -void silk_insertion_sort_increasing( - opus_int32 *a, /* I/O Unsorted / Sorted vector */ - opus_int *idx, /* O Index vector for the sorted elements */ - const opus_int L, /* I Vector length */ - const opus_int K /* I Number of correctly sorted positions */ -) -{ - opus_int32 value; - opus_int i, j; - - /* Safety checks */ - silk_assert( K > 0 ); - silk_assert( L > 0 ); - silk_assert( L >= K ); - - /* Write start indices in index vector */ - for( i = 0; i < K; i++ ) { - idx[ i ] = i; - } - - /* Sort vector elements by value, increasing order */ - for( i = 1; i < K; i++ ) { - value = a[ i ]; - for( j = i - 1; ( j >= 0 ) && ( value < a[ j ] ); j-- ) { - a[ j + 1 ] = a[ j ]; /* Shift value */ - idx[ j + 1 ] = idx[ j ]; /* Shift index */ - } - a[ j + 1 ] = value; /* Write value */ - idx[ j + 1 ] = i; /* Write index */ - } - - /* If less than L values are asked for, check the remaining values, */ - /* but only spend CPU to ensure that the K first values are correct */ - for( i = K; i < L; i++ ) { - value = a[ i ]; - if( value < a[ K - 1 ] ) { - for( j = K - 2; ( j >= 0 ) && ( value < a[ j ] ); j-- ) { - a[ j + 1 ] = a[ j ]; /* Shift value */ - idx[ j + 1 ] = idx[ j ]; /* Shift index */ - } - a[ j + 1 ] = value; /* Write value */ - idx[ j + 1 ] = i; /* Write index */ - } - } -} - -#ifdef FIXED_POINT -/* This function is only used by the fixed-point build */ -void silk_insertion_sort_decreasing_int16( - opus_int16 *a, /* I/O Unsorted / Sorted vector */ - opus_int *idx, /* O Index vector for the sorted elements */ - const opus_int L, /* I Vector length */ - const opus_int K /* I Number of correctly sorted positions */ -) -{ - opus_int i, j; - opus_int value; - - /* Safety checks */ - silk_assert( K > 0 ); - silk_assert( L > 0 ); - silk_assert( L >= K ); - - /* Write start indices in index vector */ - for( i = 0; i < K; i++ ) { - idx[ i ] = i; - } - - /* Sort vector elements by value, decreasing order */ - for( i = 1; i < K; i++ ) { - value = a[ i ]; - for( j = i - 1; ( j >= 0 ) && ( value > a[ j ] ); j-- ) { - a[ j + 1 ] = a[ j ]; /* Shift value */ - idx[ j + 1 ] = idx[ j ]; /* Shift index */ - } - a[ j + 1 ] = value; /* Write value */ - idx[ j + 1 ] = i; /* Write index */ - } - - /* If less than L values are asked for, check the remaining values, */ - /* but only spend CPU to ensure that the K first values are correct */ - for( i = K; i < L; i++ ) { - value = a[ i ]; - if( value > a[ K - 1 ] ) { - for( j = K - 2; ( j >= 0 ) && ( value > a[ j ] ); j-- ) { - a[ j + 1 ] = a[ j ]; /* Shift value */ - idx[ j + 1 ] = idx[ j ]; /* Shift index */ - } - a[ j + 1 ] = value; /* Write value */ - idx[ j + 1 ] = i; /* Write index */ - } - } -} -#endif - -void silk_insertion_sort_increasing_all_values_int16( - opus_int16 *a, /* I/O Unsorted / Sorted vector */ - const opus_int L /* I Vector length */ -) -{ - opus_int value; - opus_int i, j; - - /* Safety checks */ - silk_assert( L > 0 ); - - /* Sort vector elements by value, increasing order */ - for( i = 1; i < L; i++ ) { - value = a[ i ]; - for( j = i - 1; ( j >= 0 ) && ( value < a[ j ] ); j-- ) { - a[ j + 1 ] = a[ j ]; /* Shift value */ - } - a[ j + 1 ] = value; /* Write value */ - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/stereo_LR_to_MS.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/stereo_LR_to_MS.c deleted file mode 100644 index 42906e6f..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/stereo_LR_to_MS.c +++ /dev/null @@ -1,229 +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 "stack_alloc.h" - -/* Convert Left/Right stereo signal to adaptive Mid/Side representation */ -void silk_stereo_LR_to_MS( - stereo_enc_state *state, /* I/O State */ - opus_int16 x1[], /* I/O Left input signal, becomes mid signal */ - opus_int16 x2[], /* I/O Right input signal, becomes side signal */ - opus_int8 ix[ 2 ][ 3 ], /* O Quantization indices */ - opus_int8 *mid_only_flag, /* O Flag: only mid signal coded */ - opus_int32 mid_side_rates_bps[], /* O Bitrates for mid and side signals */ - opus_int32 total_rate_bps, /* I Total bitrate */ - opus_int prev_speech_act_Q8, /* I Speech activity level in previous frame */ - opus_int toMono, /* I Last frame before a stereo->mono transition */ - opus_int fs_kHz, /* I Sample rate (kHz) */ - opus_int frame_length /* I Number of samples */ -) -{ - 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; - 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 ]; - diff = x1[ n - 2 ] - (opus_int32)x2[ n - 2 ]; - mid[ n ] = (opus_int16)silk_RSHIFT_ROUND( sum, 1 ); - side[ n ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( diff, 1 ) ); - } - - /* Buffering */ - silk_memcpy( mid, state->sMid, 2 * sizeof( opus_int16 ) ); - silk_memcpy( side, state->sSide, 2 * sizeof( opus_int16 ) ); - silk_memcpy( state->sMid, &mid[ frame_length ], 2 * sizeof( opus_int16 ) ); - 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 ); - 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 ); - LP_side[ n ] = sum; - HP_side[ n ] = side[ n + 1 ] - sum; - } - - /* Find energies and predictors */ - is10msFrame = frame_length == 10 * fs_kHz; - smooth_coef_Q16 = is10msFrame ? - SILK_FIX_CONST( STEREO_RATIO_SMOOTH_COEF / 2, 16 ) : - SILK_FIX_CONST( STEREO_RATIO_SMOOTH_COEF, 16 ); - smooth_coef_Q16 = silk_SMULWB( silk_SMULBB( prev_speech_act_Q8, prev_speech_act_Q8 ), smooth_coef_Q16 ); - - pred_Q13[ 0 ] = silk_stereo_find_predictor( &LP_ratio_Q14, LP_mid, LP_side, &state->mid_side_amp_Q0[ 0 ], frame_length, smooth_coef_Q16 ); - pred_Q13[ 1 ] = silk_stereo_find_predictor( &HP_ratio_Q14, HP_mid, HP_side, &state->mid_side_amp_Q0[ 2 ], frame_length, smooth_coef_Q16 ); - /* Ratio of the norms of residual and mid signals */ - frac_Q16 = silk_SMLABB( HP_ratio_Q14, LP_ratio_Q14, 3 ); - frac_Q16 = silk_min( frac_Q16, SILK_FIX_CONST( 1, 16 ) ); - - /* Determine bitrate distribution between mid and side, and possibly reduce stereo width */ - total_rate_bps -= is10msFrame ? 1200 : 600; /* Subtract approximate bitrate for coding stereo parameters */ - if( total_rate_bps < 1 ) { - total_rate_bps = 1; - } - min_mid_rate_bps = silk_SMLABB( 2000, fs_kHz, 900 ); - 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 ); - mid_side_rates_bps[ 0 ] = silk_DIV32_varQ( total_rate_bps, SILK_FIX_CONST( 8 + 5, 16 ) + frac_3_Q16, 16+3 ); - /* If Mid bitrate below minimum, reduce stereo width */ - if( mid_side_rates_bps[ 0 ] < min_mid_rate_bps ) { - mid_side_rates_bps[ 0 ] = min_mid_rate_bps; - mid_side_rates_bps[ 1 ] = total_rate_bps - mid_side_rates_bps[ 0 ]; - /* width = 4 * ( 2 * side_rate - min_rate ) / ( ( 1 + 3 * frac ) * min_rate ) */ - width_Q14 = silk_DIV32_varQ( silk_LSHIFT( mid_side_rates_bps[ 1 ], 1 ) - min_mid_rate_bps, - silk_SMULWB( SILK_FIX_CONST( 1, 16 ) + frac_3_Q16, min_mid_rate_bps ), 14+2 ); - width_Q14 = silk_LIMIT( width_Q14, 0, SILK_FIX_CONST( 1, 14 ) ); - } else { - mid_side_rates_bps[ 1 ] = total_rate_bps - mid_side_rates_bps[ 0 ]; - width_Q14 = SILK_FIX_CONST( 1, 14 ); - } - - /* Smoother */ - state->smth_width_Q14 = (opus_int16)silk_SMLAWB( state->smth_width_Q14, width_Q14 - state->smth_width_Q14, smooth_coef_Q16 ); - - /* At very low bitrates or for inputs that are nearly amplitude panned, switch to panned-mono coding */ - *mid_only_flag = 0; - if( toMono ) { - /* Last frame before stereo->mono transition; collapse stereo width */ - width_Q14 = 0; - pred_Q13[ 0 ] = 0; - pred_Q13[ 1 ] = 0; - silk_stereo_quant_pred( pred_Q13, ix ); - } else if( state->width_prev_Q14 == 0 && - ( 8 * total_rate_bps < 13 * min_mid_rate_bps || silk_SMULWB( frac_Q16, state->smth_width_Q14 ) < SILK_FIX_CONST( 0.05, 14 ) ) ) - { - /* Code as panned-mono; previous frame already had zero width */ - /* Scale down and quantize predictors */ - pred_Q13[ 0 ] = silk_RSHIFT( silk_SMULBB( state->smth_width_Q14, pred_Q13[ 0 ] ), 14 ); - pred_Q13[ 1 ] = silk_RSHIFT( silk_SMULBB( state->smth_width_Q14, pred_Q13[ 1 ] ), 14 ); - silk_stereo_quant_pred( pred_Q13, ix ); - /* Collapse stereo width */ - width_Q14 = 0; - pred_Q13[ 0 ] = 0; - pred_Q13[ 1 ] = 0; - mid_side_rates_bps[ 0 ] = total_rate_bps; - mid_side_rates_bps[ 1 ] = 0; - *mid_only_flag = 1; - } else if( state->width_prev_Q14 != 0 && - ( 8 * total_rate_bps < 11 * min_mid_rate_bps || silk_SMULWB( frac_Q16, state->smth_width_Q14 ) < SILK_FIX_CONST( 0.02, 14 ) ) ) - { - /* Transition to zero-width stereo */ - /* Scale down and quantize predictors */ - pred_Q13[ 0 ] = silk_RSHIFT( silk_SMULBB( state->smth_width_Q14, pred_Q13[ 0 ] ), 14 ); - pred_Q13[ 1 ] = silk_RSHIFT( silk_SMULBB( state->smth_width_Q14, pred_Q13[ 1 ] ), 14 ); - silk_stereo_quant_pred( pred_Q13, ix ); - /* Collapse stereo width */ - width_Q14 = 0; - pred_Q13[ 0 ] = 0; - pred_Q13[ 1 ] = 0; - } else if( state->smth_width_Q14 > SILK_FIX_CONST( 0.95, 14 ) ) { - /* Full-width stereo coding */ - silk_stereo_quant_pred( pred_Q13, ix ); - width_Q14 = SILK_FIX_CONST( 1, 14 ); - } else { - /* Reduced-width stereo coding; scale down and quantize predictors */ - pred_Q13[ 0 ] = silk_RSHIFT( silk_SMULBB( state->smth_width_Q14, pred_Q13[ 0 ] ), 14 ); - pred_Q13[ 1 ] = silk_RSHIFT( silk_SMULBB( state->smth_width_Q14, pred_Q13[ 1 ] ), 14 ); - silk_stereo_quant_pred( pred_Q13, ix ); - width_Q14 = state->smth_width_Q14; - } - - /* Make sure to keep on encoding until the tapered output has been transmitted */ - if( *mid_only_flag == 1 ) { - state->silent_side_len += frame_length - STEREO_INTERP_LEN_MS * fs_kHz; - if( state->silent_side_len < LA_SHAPE_MS * fs_kHz ) { - *mid_only_flag = 0; - } else { - /* Limit to avoid wrapping around */ - state->silent_side_len = 10000; - } - } else { - state->silent_side_len = 0; - } - - if( *mid_only_flag == 0 && mid_side_rates_bps[ 1 ] < 1 ) { - mid_side_rates_bps[ 1 ] = 1; - mid_side_rates_bps[ 0 ] = silk_max_int( 1, total_rate_bps - mid_side_rates_bps[ 1 ]); - } - - /* Interpolate predictors and subtract prediction from side channel */ - pred0_Q13 = -state->pred_prev_Q13[ 0 ]; - pred1_Q13 = -state->pred_prev_Q13[ 1 ]; - w_Q24 = silk_LSHIFT( state->width_prev_Q14, 10 ); - denom_Q16 = silk_DIV32_16( (opus_int32)1 << 16, STEREO_INTERP_LEN_MS * fs_kHz ); - delta0_Q13 = -silk_RSHIFT_ROUND( silk_SMULBB( pred_Q13[ 0 ] - state->pred_prev_Q13[ 0 ], denom_Q16 ), 16 ); - delta1_Q13 = -silk_RSHIFT_ROUND( silk_SMULBB( pred_Q13[ 1 ] - state->pred_prev_Q13[ 1 ], denom_Q16 ), 16 ); - deltaw_Q24 = silk_LSHIFT( silk_SMULWB( width_Q14 - state->width_prev_Q14, denom_Q16 ), 10 ); - for( n = 0; n < STEREO_INTERP_LEN_MS * fs_kHz; n++ ) { - 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_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 ) ); - } - - pred0_Q13 = -pred_Q13[ 0 ]; - 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_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 ) ); - } - 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/sources/LabSound/third_party/libnyquist/third_party/opus/silk/stereo_MS_to_LR.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/stereo_MS_to_LR.c deleted file mode 100644 index 62521a4f..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/stereo_MS_to_LR.c +++ /dev/null @@ -1,85 +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" - -/* Convert adaptive Mid/Side representation to Left/Right stereo signal */ -void silk_stereo_MS_to_LR( - stereo_dec_state *state, /* I/O State */ - opus_int16 x1[], /* I/O Left input signal, becomes mid signal */ - opus_int16 x2[], /* I/O Right input signal, becomes side signal */ - const opus_int32 pred_Q13[], /* I Predictors */ - opus_int fs_kHz, /* I Samples rate (kHz) */ - opus_int frame_length /* I Number of samples */ -) -{ - opus_int n, denom_Q16, delta0_Q13, delta1_Q13; - opus_int32 sum, diff, pred0_Q13, pred1_Q13; - - /* Buffering */ - silk_memcpy( x1, state->sMid, 2 * sizeof( opus_int16 ) ); - silk_memcpy( x2, state->sSide, 2 * sizeof( opus_int16 ) ); - silk_memcpy( state->sMid, &x1[ frame_length ], 2 * sizeof( opus_int16 ) ); - silk_memcpy( state->sSide, &x2[ frame_length ], 2 * sizeof( opus_int16 ) ); - - /* Interpolate predictors and add prediction to side channel */ - pred0_Q13 = state->pred_prev_Q13[ 0 ]; - pred1_Q13 = state->pred_prev_Q13[ 1 ]; - denom_Q16 = silk_DIV32_16( (opus_int32)1 << 16, STEREO_INTERP_LEN_MS * fs_kHz ); - delta0_Q13 = silk_RSHIFT_ROUND( silk_SMULBB( pred_Q13[ 0 ] - state->pred_prev_Q13[ 0 ], denom_Q16 ), 16 ); - delta1_Q13 = silk_RSHIFT_ROUND( silk_SMULBB( pred_Q13[ 1 ] - state->pred_prev_Q13[ 1 ], denom_Q16 ), 16 ); - for( n = 0; n < STEREO_INTERP_LEN_MS * fs_kHz; n++ ) { - pred0_Q13 += delta0_Q13; - pred1_Q13 += delta1_Q13; - sum = silk_LSHIFT( silk_ADD_LSHIFT( x1[ n ] + x1[ n + 2 ], x1[ n + 1 ], 1 ), 9 ); /* Q11 */ - sum = silk_SMLAWB( silk_LSHIFT( (opus_int32)x2[ n + 1 ], 8 ), sum, pred0_Q13 ); /* Q8 */ - sum = silk_SMLAWB( sum, silk_LSHIFT( (opus_int32)x1[ n + 1 ], 11 ), pred1_Q13 ); /* Q8 */ - x2[ n + 1 ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( sum, 8 ) ); - } - pred0_Q13 = pred_Q13[ 0 ]; - pred1_Q13 = pred_Q13[ 1 ]; - for( n = STEREO_INTERP_LEN_MS * fs_kHz; n < frame_length; n++ ) { - sum = silk_LSHIFT( silk_ADD_LSHIFT( x1[ n ] + x1[ n + 2 ], x1[ n + 1 ], 1 ), 9 ); /* Q11 */ - sum = silk_SMLAWB( silk_LSHIFT( (opus_int32)x2[ n + 1 ], 8 ), sum, pred0_Q13 ); /* Q8 */ - sum = silk_SMLAWB( sum, silk_LSHIFT( (opus_int32)x1[ n + 1 ], 11 ), pred1_Q13 ); /* Q8 */ - x2[ n + 1 ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( sum, 8 ) ); - } - state->pred_prev_Q13[ 0 ] = pred_Q13[ 0 ]; - state->pred_prev_Q13[ 1 ] = pred_Q13[ 1 ]; - - /* Convert to left/right signals */ - for( n = 0; n < frame_length; n++ ) { - sum = x1[ n + 1 ] + (opus_int32)x2[ n + 1 ]; - diff = x1[ n + 1 ] - (opus_int32)x2[ n + 1 ]; - x1[ n + 1 ] = (opus_int16)silk_SAT16( sum ); - x2[ n + 1 ] = (opus_int16)silk_SAT16( diff ); - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/stereo_decode_pred.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/stereo_decode_pred.c deleted file mode 100644 index 56ba3925..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/stereo_decode_pred.c +++ /dev/null @@ -1,73 +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" - -/* Decode mid/side predictors */ -void silk_stereo_decode_pred( - ec_dec *psRangeDec, /* I/O Compressor data structure */ - opus_int32 pred_Q13[] /* O Predictors */ -) -{ - opus_int n, ix[ 2 ][ 3 ]; - opus_int32 low_Q13, step_Q13; - - /* Entropy decoding */ - n = ec_dec_icdf( psRangeDec, silk_stereo_pred_joint_iCDF, 8 ); - ix[ 0 ][ 2 ] = silk_DIV32_16( n, 5 ); - ix[ 1 ][ 2 ] = n - 5 * ix[ 0 ][ 2 ]; - for( n = 0; n < 2; n++ ) { - ix[ n ][ 0 ] = ec_dec_icdf( psRangeDec, silk_uniform3_iCDF, 8 ); - ix[ n ][ 1 ] = ec_dec_icdf( psRangeDec, silk_uniform5_iCDF, 8 ); - } - - /* Dequantize */ - for( n = 0; n < 2; n++ ) { - ix[ n ][ 0 ] += 3 * ix[ n ][ 2 ]; - low_Q13 = silk_stereo_pred_quant_Q13[ ix[ n ][ 0 ] ]; - step_Q13 = silk_SMULWB( silk_stereo_pred_quant_Q13[ ix[ n ][ 0 ] + 1 ] - low_Q13, - SILK_FIX_CONST( 0.5 / STEREO_QUANT_SUB_STEPS, 16 ) ); - pred_Q13[ n ] = silk_SMLABB( low_Q13, step_Q13, 2 * ix[ n ][ 1 ] + 1 ); - } - - /* Subtract second from first predictor (helps when actually applying these) */ - pred_Q13[ 0 ] -= pred_Q13[ 1 ]; -} - -/* Decode mid-only flag */ -void silk_stereo_decode_mid_only( - ec_dec *psRangeDec, /* I/O Compressor data structure */ - opus_int *decode_only_mid /* O Flag that only mid channel has been coded */ -) -{ - /* Decode flag that only mid channel is coded */ - *decode_only_mid = ec_dec_icdf( psRangeDec, silk_stereo_only_code_mid_iCDF, 8 ); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/stereo_encode_pred.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/stereo_encode_pred.c deleted file mode 100644 index e6dd1950..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/stereo_encode_pred.c +++ /dev/null @@ -1,62 +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 code the mid/side quantization indices */ -void silk_stereo_encode_pred( - ec_enc *psRangeEnc, /* I/O Compressor data structure */ - opus_int8 ix[ 2 ][ 3 ] /* I Quantization indices */ -) -{ - opus_int n; - - /* Entropy coding */ - n = 5 * ix[ 0 ][ 2 ] + ix[ 1 ][ 2 ]; - silk_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 ); - ec_enc_icdf( psRangeEnc, ix[ n ][ 0 ], silk_uniform3_iCDF, 8 ); - ec_enc_icdf( psRangeEnc, ix[ n ][ 1 ], silk_uniform5_iCDF, 8 ); - } -} - -/* Entropy code the mid-only flag */ -void silk_stereo_encode_mid_only( - ec_enc *psRangeEnc, /* I/O Compressor data structure */ - opus_int8 mid_only_flag -) -{ - /* Encode flag that only mid channel is coded */ - ec_enc_icdf( psRangeEnc, mid_only_flag, silk_stereo_only_code_mid_iCDF, 8 ); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/stereo_find_predictor.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/stereo_find_predictor.c deleted file mode 100644 index e30e90bd..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/stereo_find_predictor.c +++ /dev/null @@ -1,79 +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" - -/* Find least-squares prediction gain for one signal based on another and quantize it */ -opus_int32 silk_stereo_find_predictor( /* O Returns predictor in Q13 */ - opus_int32 *ratio_Q14, /* O Ratio of residual and mid energies */ - const opus_int16 x[], /* I Basis signal */ - const opus_int16 y[], /* I Target signal */ - opus_int32 mid_res_amp_Q0[], /* I/O Smoothed mid, residual norms */ - opus_int length, /* I Number of samples */ - opus_int smooth_coef_Q16 /* I Smoothing coefficient */ -) -{ - opus_int scale, scale1, scale2; - opus_int32 nrgx, nrgy, corr, pred_Q13, pred2_Q10; - - /* Find predictor */ - silk_sum_sqr_shift( &nrgx, &scale1, x, length ); - silk_sum_sqr_shift( &nrgy, &scale2, y, length ); - scale = silk_max_int( scale1, scale2 ); - scale = scale + ( scale & 1 ); /* make even */ - nrgy = silk_RSHIFT32( nrgy, scale - scale2 ); - nrgx = silk_RSHIFT32( nrgx, scale - scale1 ); - nrgx = silk_max_int( nrgx, 1 ); - corr = silk_inner_prod_aligned_scale( x, y, scale, length ); - pred_Q13 = silk_DIV32_varQ( corr, nrgx, 13 ); - pred_Q13 = silk_LIMIT( pred_Q13, -(1 << 14), 1 << 14 ); - pred2_Q10 = silk_SMULWB( pred_Q13, pred_Q13 ); - - /* Faster update for signals with large prediction parameters */ - smooth_coef_Q16 = (opus_int)silk_max_int( smooth_coef_Q16, silk_abs( pred2_Q10 ) ); - - /* Smoothed mid and residual norms */ - silk_assert( smooth_coef_Q16 < 32768 ); - scale = silk_RSHIFT( scale, 1 ); - mid_res_amp_Q0[ 0 ] = silk_SMLAWB( mid_res_amp_Q0[ 0 ], silk_LSHIFT( silk_SQRT_APPROX( nrgx ), scale ) - mid_res_amp_Q0[ 0 ], - smooth_coef_Q16 ); - /* Residual energy = nrgy - 2 * pred * corr + pred^2 * nrgx */ - nrgy = silk_SUB_LSHIFT32( nrgy, silk_SMULWB( corr, pred_Q13 ), 3 + 1 ); - nrgy = silk_ADD_LSHIFT32( nrgy, silk_SMULWB( nrgx, pred2_Q10 ), 6 ); - mid_res_amp_Q0[ 1 ] = silk_SMLAWB( mid_res_amp_Q0[ 1 ], silk_LSHIFT( silk_SQRT_APPROX( nrgy ), scale ) - mid_res_amp_Q0[ 1 ], - smooth_coef_Q16 ); - - /* Ratio of smoothed residual and mid norms */ - *ratio_Q14 = silk_DIV32_varQ( mid_res_amp_Q0[ 1 ], silk_max( mid_res_amp_Q0[ 0 ], 1 ), 14 ); - *ratio_Q14 = silk_LIMIT( *ratio_Q14, 0, 32767 ); - - return pred_Q13; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/stereo_quant_pred.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/stereo_quant_pred.c deleted file mode 100644 index d4ced6c3..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/stereo_quant_pred.c +++ /dev/null @@ -1,73 +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" - -/* Quantize mid/side predictors */ -void silk_stereo_quant_pred( - opus_int32 pred_Q13[], /* I/O Predictors (out: quantized) */ - opus_int8 ix[ 2 ][ 3 ] /* O Quantization indices */ -) -{ - opus_int i, j, n; - opus_int32 low_Q13, step_Q13, lvl_Q13, err_min_Q13, err_Q13, quant_pred_Q13 = 0; - - /* Quantize */ - for( n = 0; n < 2; n++ ) { - /* Brute-force search over quantization levels */ - err_min_Q13 = silk_int32_MAX; - for( i = 0; i < STEREO_QUANT_TAB_SIZE - 1; i++ ) { - low_Q13 = silk_stereo_pred_quant_Q13[ i ]; - step_Q13 = silk_SMULWB( silk_stereo_pred_quant_Q13[ i + 1 ] - low_Q13, - SILK_FIX_CONST( 0.5 / STEREO_QUANT_SUB_STEPS, 16 ) ); - for( j = 0; j < STEREO_QUANT_SUB_STEPS; j++ ) { - lvl_Q13 = silk_SMLABB( low_Q13, step_Q13, 2 * j + 1 ); - err_Q13 = silk_abs( pred_Q13[ n ] - lvl_Q13 ); - if( err_Q13 < err_min_Q13 ) { - err_min_Q13 = err_Q13; - quant_pred_Q13 = lvl_Q13; - ix[ n ][ 0 ] = i; - ix[ n ][ 1 ] = j; - } else { - /* Error increasing, so we're past the optimum */ - goto done; - } - } - } - done: - ix[ n ][ 2 ] = silk_DIV32_16( ix[ n ][ 0 ], 3 ); - ix[ n ][ 0 ] -= ix[ n ][ 2 ] * 3; - pred_Q13[ n ] = quant_pred_Q13; - } - - /* Subtract second from first predictor (helps when actually applying these) */ - pred_Q13[ 0 ] -= pred_Q13[ 1 ]; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/structs.h b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/structs.h deleted file mode 100644 index 1826b36a..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/structs.h +++ /dev/null @@ -1,327 +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. -***********************************************************************/ - -#ifndef SILK_STRUCTS_H -#define SILK_STRUCTS_H - -#include "typedef.h" -#include "SigProc_FIX.h" -#include "define.h" -#include "entenc.h" -#include "entdec.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -/************************************/ -/* Noise shaping quantization state */ -/************************************/ -typedef struct { - opus_int16 xq[ 2 * MAX_FRAME_LENGTH ]; /* Buffer for quantized output signal */ - opus_int32 sLTP_shp_Q14[ 2 * MAX_FRAME_LENGTH ]; - 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_int lagPrev; - opus_int sLTP_buf_idx; - opus_int sLTP_shp_buf_idx; - opus_int32 rand_seed; - opus_int32 prev_gain_Q16; - opus_int rewhite_flag; -} silk_nsq_state; - -/********************************/ -/* VAD state */ -/********************************/ -typedef struct { - opus_int32 AnaState[ 2 ]; /* Analysis filterbank state: 0-8 kHz */ - opus_int32 AnaState1[ 2 ]; /* Analysis filterbank state: 0-4 kHz */ - opus_int32 AnaState2[ 2 ]; /* Analysis filterbank state: 0-2 kHz */ - opus_int32 XnrgSubfr[ VAD_N_BANDS ]; /* Subframe energies */ - opus_int32 NrgRatioSmth_Q8[ VAD_N_BANDS ]; /* Smoothed energy level in each band */ - opus_int16 HPstate; /* State of differentiator in the lowest band */ - opus_int32 NL[ VAD_N_BANDS ]; /* Noise energy level in each band */ - opus_int32 inv_NL[ VAD_N_BANDS ]; /* Inverse noise energy level in each band */ - opus_int32 NoiseLevelBias[ VAD_N_BANDS ]; /* Noise level estimator bias/offset */ - opus_int32 counter; /* Frame counter used in the initial phase */ -} silk_VAD_state; - -/* Variable cut-off low-pass filter state */ -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 */ -} silk_LP_state; - -/* Structure containing NLSF codebook */ -typedef struct { - const opus_int16 nVectors; - const opus_int16 order; - const opus_int16 quantStepSize_Q16; - const opus_int16 invQuantStepSize_Q6; - const opus_uint8 *CB1_NLSF_Q8; - const opus_uint8 *CB1_iCDF; - const opus_uint8 *pred_Q8; - const opus_uint8 *ec_sel; - const opus_uint8 *ec_iCDF; - const opus_uint8 *ec_Rates_Q5; - const opus_int16 *deltaMin_Q15; -} silk_NLSF_CB_struct; - -typedef struct { - opus_int16 pred_prev_Q13[ 2 ]; - opus_int16 sMid[ 2 ]; - opus_int16 sSide[ 2 ]; - opus_int32 mid_side_amp_Q0[ 4 ]; - opus_int16 smth_width_Q14; - opus_int16 width_prev_Q14; - opus_int16 silent_side_len; - opus_int8 predIx[ MAX_FRAMES_PER_PACKET ][ 2 ][ 3 ]; - opus_int8 mid_only_flags[ MAX_FRAMES_PER_PACKET ]; -} stereo_enc_state; - -typedef struct { - opus_int16 pred_prev_Q13[ 2 ]; - opus_int16 sMid[ 2 ]; - opus_int16 sSide[ 2 ]; -} stereo_dec_state; - -typedef struct { - opus_int8 GainsIndices[ MAX_NB_SUBFR ]; - opus_int8 LTPIndex[ MAX_NB_SUBFR ]; - opus_int8 NLSFIndices[ MAX_LPC_ORDER + 1 ]; - opus_int16 lagIndex; - opus_int8 contourIndex; - opus_int8 signalType; - opus_int8 quantOffsetType; - opus_int8 NLSFInterpCoef_Q2; - opus_int8 PERIndex; - opus_int8 LTP_scaleIndex; - opus_int8 Seed; -} SideInfoIndices; - -/********************************/ -/* Encoder state */ -/********************************/ -typedef struct { - opus_int32 In_HP_State[ 2 ]; /* High pass filter state */ - opus_int32 variable_HP_smth1_Q15; /* State of first smoother */ - opus_int32 variable_HP_smth2_Q15; /* State of second smoother */ - silk_LP_state sLP; /* Low pass filter state */ - silk_VAD_state sVAD; /* Voice activity detector state */ - silk_nsq_state sNSQ; /* Noise Shape Quantizer State */ - opus_int16 prev_NLSFq_Q15[ MAX_LPC_ORDER ]; /* Previously quantized NLSF vector */ - opus_int speech_activity_Q8; /* Speech activity */ - opus_int allow_bandwidth_switch; /* Flag indicating that switching of internal bandwidth is allowed */ - opus_int8 LBRRprevLastGainIndex; - opus_int8 prevSignalType; - opus_int prevLag; - opus_int pitch_LPC_win_length; - opus_int max_pitch_lag; /* Highest possible pitch lag (samples) */ - opus_int32 API_fs_Hz; /* API sampling frequency (Hz) */ - opus_int32 prev_API_fs_Hz; /* Previous API sampling frequency (Hz) */ - opus_int maxInternal_fs_Hz; /* Maximum internal sampling frequency (Hz) */ - opus_int minInternal_fs_Hz; /* Minimum internal sampling frequency (Hz) */ - opus_int desiredInternal_fs_Hz; /* Soft request for internal sampling frequency (Hz) */ - opus_int fs_kHz; /* Internal sampling frequency (kHz) */ - opus_int nb_subfr; /* Number of 5 ms subframes in a frame */ - opus_int frame_length; /* Frame length (samples) */ - opus_int subfr_length; /* Subframe length (samples) */ - opus_int ltp_mem_length; /* Length of LTP memory */ - opus_int la_pitch; /* Look-ahead for pitch analysis (samples) */ - opus_int la_shape; /* Look-ahead for noise shape analysis (samples) */ - opus_int shapeWinLength; /* Window length for noise shape analysis (samples) */ - opus_int32 TargetRate_bps; /* Target bitrate (bps) */ - opus_int PacketSize_ms; /* Number of milliseconds to put in each packet */ - opus_int PacketLoss_perc; /* Packet loss rate measured by farend */ - opus_int32 frameCounter; - opus_int Complexity; /* Complexity setting */ - opus_int nStatesDelayedDecision; /* Number of states in delayed decision quantization */ - opus_int useInterpolatedNLSFs; /* Flag for using NLSF interpolation */ - opus_int shapingLPCOrder; /* Filter order for noise shaping filters */ - opus_int predictLPCOrder; /* Filter order for prediction filters */ - 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 */ - opus_int warping_Q16; /* Warping parameter for warped noise shaping */ - opus_int useCBR; /* Flag to enable constant bitrate */ - opus_int prefillFlag; /* Flag to indicate that only buffers are prefilled, no coding */ - const opus_uint8 *pitch_lag_low_bits_iCDF; /* Pointer to iCDF table for low bits of pitch lag index */ - const opus_uint8 *pitch_contour_iCDF; /* Pointer to iCDF table for pitch contour index */ - const silk_NLSF_CB_struct *psNLSF_CB; /* Pointer to NLSF codebook */ - opus_int input_quality_bands_Q15[ VAD_N_BANDS ]; - opus_int input_tilt_Q15; - opus_int SNR_dB_Q7; /* Quality setting */ - - opus_int8 VAD_flags[ MAX_FRAMES_PER_PACKET ]; - opus_int8 LBRR_flag; - opus_int LBRR_flags[ MAX_FRAMES_PER_PACKET ]; - - 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; - opus_int nFramesPerPacket; - opus_int nFramesEncoded; /* Number of frames analyzed in current packet */ - - opus_int nChannelsAPI; - opus_int nChannelsInternal; - opus_int channelNb; - - /* Parameters For LTP scaling Control */ - opus_int frames_since_onset; - - /* Specifically for entropy coding */ - opus_int ec_prevSignalType; - opus_int16 ec_prevLagIndex; - - silk_resampler_state_struct resampler_state; - - /* DTX */ - opus_int useDTX; /* Flag to enable DTX */ - opus_int inDTX; /* Flag to signal DTX period */ - opus_int noSpeechCounter; /* Counts concecutive nonactive frames, used by DTX */ - - /* Inband Low Bitrate Redundancy (LBRR) data */ - opus_int useInBandFEC; /* Saves the API setting for query */ - opus_int LBRR_enabled; /* Depends on useInBandFRC, bitrate and packet loss rate */ - opus_int LBRR_GainIncreases; /* Gains increment for coding LBRR frames */ - SideInfoIndices indices_LBRR[ MAX_FRAMES_PER_PACKET ]; - opus_int8 pulses_LBRR[ MAX_FRAMES_PER_PACKET ][ MAX_FRAME_LENGTH ]; -} silk_encoder_state; - - -/* Struct for Packet Loss Concealment */ -typedef struct { - opus_int32 pitchL_Q8; /* Pitch lag to use for voiced concealment */ - opus_int16 LTPCoef_Q14[ LTP_ORDER ]; /* LTP coeficients to use for voiced concealment */ - opus_int16 prevLPC_Q12[ MAX_LPC_ORDER ]; - opus_int last_frame_lost; /* Was previous frame lost */ - opus_int32 rand_seed; /* Seed for unvoiced signal generation */ - opus_int16 randScale_Q14; /* Scaling of unvoiced random signal */ - opus_int32 conc_energy; - opus_int conc_energy_shift; - opus_int16 prevLTP_scale_Q14; - opus_int32 prevGain_Q16[ 2 ]; - opus_int fs_kHz; - opus_int nb_subfr; - opus_int subfr_length; -} silk_PLC_struct; - -/* Struct for CNG */ -typedef struct { - opus_int32 CNG_exc_buf_Q14[ MAX_FRAME_LENGTH ]; - opus_int16 CNG_smth_NLSF_Q15[ MAX_LPC_ORDER ]; - opus_int32 CNG_synth_state[ MAX_LPC_ORDER ]; - opus_int32 CNG_smth_Gain_Q16; - opus_int32 rand_seed; - opus_int fs_kHz; -} silk_CNG_struct; - -/********************************/ -/* Decoder state */ -/********************************/ -typedef struct { - opus_int32 prev_gain_Q16; - opus_int32 exc_Q14[ MAX_FRAME_LENGTH ]; - opus_int32 sLPC_Q14_buf[ MAX_LPC_ORDER ]; - opus_int16 outBuf[ MAX_FRAME_LENGTH + 2 * MAX_SUB_FRAME_LENGTH ]; /* Buffer for output signal */ - opus_int lagPrev; /* Previous Lag */ - opus_int8 LastGainIndex; /* Previous gain index */ - opus_int fs_kHz; /* Sampling frequency in kHz */ - opus_int32 fs_API_hz; /* API sample frequency (Hz) */ - opus_int nb_subfr; /* Number of 5 ms subframes in a frame */ - opus_int frame_length; /* Frame length (samples) */ - opus_int subfr_length; /* Subframe length (samples) */ - opus_int ltp_mem_length; /* Length of LTP memory */ - opus_int LPC_order; /* LPC order */ - opus_int16 prevNLSF_Q15[ MAX_LPC_ORDER ]; /* Used to interpolate LSFs */ - opus_int first_frame_after_reset; /* Flag for deactivating NLSF interpolation */ - const opus_uint8 *pitch_lag_low_bits_iCDF; /* Pointer to iCDF table for low bits of pitch lag index */ - const opus_uint8 *pitch_contour_iCDF; /* Pointer to iCDF table for pitch contour index */ - - /* For buffering payload in case of more frames per packet */ - opus_int nFramesDecoded; - opus_int nFramesPerPacket; - - /* Specifically for entropy coding */ - opus_int ec_prevSignalType; - opus_int16 ec_prevLagIndex; - - opus_int VAD_flags[ MAX_FRAMES_PER_PACKET ]; - opus_int LBRR_flag; - opus_int LBRR_flags[ MAX_FRAMES_PER_PACKET ]; - - silk_resampler_state_struct resampler_state; - - const silk_NLSF_CB_struct *psNLSF_CB; /* Pointer to NLSF codebook */ - - /* Quantization indices */ - SideInfoIndices indices; - - /* CNG state */ - silk_CNG_struct sCNG; - - /* Stuff used for PLC */ - opus_int lossCnt; - opus_int prevSignalType; - - silk_PLC_struct sPLC; - -} silk_decoder_state; - -/************************/ -/* Decoder control */ -/************************/ -typedef struct { - /* Prediction and coding parameters */ - opus_int pitchL[ MAX_NB_SUBFR ]; - opus_int32 Gains_Q16[ MAX_NB_SUBFR ]; - /* Holds interpolated and final coefficients, 4-byte aligned */ - 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; -} silk_decoder_control; - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/sum_sqr_shift.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/sum_sqr_shift.c deleted file mode 100644 index 12514c99..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/sum_sqr_shift.c +++ /dev/null @@ -1,85 +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 "SigProc_FIX.h" - -/* 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( - opus_int32 *energy, /* O Energy of x, after shifting to the right */ - opus_int *shift, /* O Number of bits right shift applied to energy */ - const opus_int16 *x, /* I Input vector */ - opus_int len /* I Length of input vector */ -) -{ - opus_int i, shft; - opus_int32 nrg_tmp, 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; - break; - } - } - for( ; i < len; 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; - } - } - 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; - } - - /* Output arguments */ - *shift = shft; - *energy = nrg; -} - diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/table_LSF_cos.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/table_LSF_cos.c deleted file mode 100644 index ec9dc639..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/table_LSF_cos.c +++ /dev/null @@ -1,70 +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 "tables.h" - -/* Cosine approximation table for LSF conversion */ -/* Q12 values (even) */ -const opus_int16 silk_LSFCosTab_FIX_Q12[ LSF_COS_TAB_SZ_FIX + 1 ] = { - 8192, 8190, 8182, 8170, - 8152, 8130, 8104, 8072, - 8034, 7994, 7946, 7896, - 7840, 7778, 7714, 7644, - 7568, 7490, 7406, 7318, - 7226, 7128, 7026, 6922, - 6812, 6698, 6580, 6458, - 6332, 6204, 6070, 5934, - 5792, 5648, 5502, 5352, - 5198, 5040, 4880, 4718, - 4552, 4382, 4212, 4038, - 3862, 3684, 3502, 3320, - 3136, 2948, 2760, 2570, - 2378, 2186, 1990, 1794, - 1598, 1400, 1202, 1002, - 802, 602, 402, 202, - 0, -202, -402, -602, - -802, -1002, -1202, -1400, - -1598, -1794, -1990, -2186, - -2378, -2570, -2760, -2948, - -3136, -3320, -3502, -3684, - -3862, -4038, -4212, -4382, - -4552, -4718, -4880, -5040, - -5198, -5352, -5502, -5648, - -5792, -5934, -6070, -6204, - -6332, -6458, -6580, -6698, - -6812, -6922, -7026, -7128, - -7226, -7318, -7406, -7490, - -7568, -7644, -7714, -7778, - -7840, -7896, -7946, -7994, - -8034, -8072, -8104, -8130, - -8152, -8170, -8182, -8190, - -8192 -}; diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/tables.h b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/tables.h deleted file mode 100644 index a91431e8..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/tables.h +++ /dev/null @@ -1,122 +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. -***********************************************************************/ - -#ifndef SILK_TABLES_H -#define SILK_TABLES_H - -#include "define.h" -#include "structs.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -/* Entropy coding tables (with size in bytes indicated) */ -extern const opus_uint8 silk_gain_iCDF[ 3 ][ N_LEVELS_QGAIN / 8 ]; /* 24 */ -extern const opus_uint8 silk_delta_gain_iCDF[ MAX_DELTA_GAIN_QUANT - MIN_DELTA_GAIN_QUANT + 1 ]; /* 41 */ - -extern const opus_uint8 silk_pitch_lag_iCDF[ 2 * ( PITCH_EST_MAX_LAG_MS - PITCH_EST_MIN_LAG_MS ) ];/* 32 */ -extern const opus_uint8 silk_pitch_delta_iCDF[ 21 ]; /* 21 */ -extern const opus_uint8 silk_pitch_contour_iCDF[ 34 ]; /* 34 */ -extern const opus_uint8 silk_pitch_contour_NB_iCDF[ 11 ]; /* 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_rate_levels_iCDF[ 2 ][ N_RATE_LEVELS - 1 ]; /* 18 */ -extern const opus_uint8 silk_rate_levels_BITS_Q5[ 2 ][ N_RATE_LEVELS - 1 ]; /* 18 */ - -extern const opus_uint8 silk_max_pulses_table[ 4 ]; /* 4 */ - -extern const opus_uint8 silk_shell_code_table0[ 152 ]; /* 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_lsb_iCDF[ 2 ]; /* 2 */ - -extern const opus_uint8 silk_sign_iCDF[ 42 ]; /* 42 */ - -extern const opus_uint8 silk_uniform3_iCDF[ 3 ]; /* 3 */ -extern const opus_uint8 silk_uniform4_iCDF[ 4 ]; /* 4 */ -extern const opus_uint8 silk_uniform5_iCDF[ 5 ]; /* 5 */ -extern const opus_uint8 silk_uniform6_iCDF[ 6 ]; /* 6 */ -extern const opus_uint8 silk_uniform8_iCDF[ 8 ]; /* 8 */ - -extern const opus_uint8 silk_NLSF_EXT_iCDF[ 7 ]; /* 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 */ -extern const opus_int16 silk_LTPScales_table_Q14[ 3 ]; /* 6 */ - -extern const opus_uint8 silk_type_offset_VAD_iCDF[ 4 ]; /* 4 */ -extern const opus_uint8 silk_type_offset_no_VAD_iCDF[ 2 ]; /* 2 */ - -extern const opus_int16 silk_stereo_pred_quant_Q13[ STEREO_QUANT_TAB_SIZE ]; /* 32 */ -extern const opus_uint8 silk_stereo_pred_joint_iCDF[ 25 ]; /* 25 */ -extern const opus_uint8 silk_stereo_only_code_mid_iCDF[ 2 ]; /* 2 */ - -extern const opus_uint8 * const silk_LBRR_flags_iCDF_ptr[ 2 ]; /* 10 */ - -extern const opus_uint8 silk_NLSF_interpolation_factor_iCDF[ 5 ]; /* 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 */ - -/* Interpolation points for filter coefficients used in the bandwidth transition smoother */ -extern const opus_int32 silk_Transition_LP_B_Q28[ TRANSITION_INT_NUM ][ TRANSITION_NB ]; /* 60 */ -extern const opus_int32 silk_Transition_LP_A_Q28[ TRANSITION_INT_NUM ][ TRANSITION_NA ]; /* 60 */ - -/* Rom table with cosine values */ -extern const opus_int16 silk_LSFCosTab_FIX_Q12[ LSF_COS_TAB_SZ_FIX + 1 ]; /* 258 */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/tables_LTP.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/tables_LTP.c deleted file mode 100644 index 0e6a0254..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/tables_LTP.c +++ /dev/null @@ -1,296 +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 "tables.h" - -const opus_uint8 silk_LTP_per_index_iCDF[3] = { - 179, 99, 0 -}; - -static const opus_uint8 silk_LTP_gain_iCDF_0[8] = { - 71, 56, 43, 30, 21, 12, 6, 0 -}; - -static const opus_uint8 silk_LTP_gain_iCDF_1[16] = { - 199, 165, 144, 124, 109, 96, 84, 71, - 61, 51, 42, 32, 23, 15, 8, 0 -}; - -static const opus_uint8 silk_LTP_gain_iCDF_2[32] = { - 241, 225, 211, 199, 187, 175, 164, 153, - 142, 132, 123, 114, 105, 96, 88, 80, - 72, 64, 57, 50, 44, 38, 33, 29, - 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 -}; - -static const opus_uint8 silk_LTP_gain_BITS_Q5_1[16] = { - 69, 93, 115, 118, 131, 138, 141, 138, - 150, 150, 155, 150, 155, 160, 166, 160 -}; - -static const opus_uint8 silk_LTP_gain_BITS_Q5_2[32] = { - 131, 128, 134, 141, 141, 141, 145, 145, - 145, 150, 155, 155, 155, 155, 160, 160, - 160, 160, 166, 166, 173, 173, 182, 192, - 182, 192, 192, 192, 205, 192, 205, 224 -}; - -const opus_uint8 * const silk_LTP_gain_iCDF_ptrs[NB_LTP_CBKS] = { - silk_LTP_gain_iCDF_0, - silk_LTP_gain_iCDF_1, - silk_LTP_gain_iCDF_2 -}; - -const opus_uint8 * const silk_LTP_gain_BITS_Q5_ptrs[NB_LTP_CBKS] = { - silk_LTP_gain_BITS_Q5_0, - silk_LTP_gain_BITS_Q5_1, - silk_LTP_gain_BITS_Q5_2 -}; - -static const opus_int8 silk_LTP_gain_vq_0[8][5] = -{ -{ - 4, 6, 24, 7, 5 -}, -{ - 0, 0, 2, 0, 0 -}, -{ - 12, 28, 41, 13, -4 -}, -{ - -9, 15, 42, 25, 14 -}, -{ - 1, -2, 62, 41, -9 -}, -{ - -10, 37, 65, -4, 3 -}, -{ - -6, 4, 66, 7, -8 -}, -{ - 16, 14, 38, -3, 33 -} -}; - -static const opus_int8 silk_LTP_gain_vq_1[16][5] = -{ -{ - 13, 22, 39, 23, 12 -}, -{ - -1, 36, 64, 27, -6 -}, -{ - -7, 10, 55, 43, 17 -}, -{ - 1, 1, 8, 1, 1 -}, -{ - 6, -11, 74, 53, -9 -}, -{ - -12, 55, 76, -12, 8 -}, -{ - -3, 3, 93, 27, -4 -}, -{ - 26, 39, 59, 3, -8 -}, -{ - 2, 0, 77, 11, 9 -}, -{ - -8, 22, 44, -6, 7 -}, -{ - 40, 9, 26, 3, 9 -}, -{ - -7, 20, 101, -7, 4 -}, -{ - 3, -8, 42, 26, 0 -}, -{ - -15, 33, 68, 2, 23 -}, -{ - -2, 55, 46, -2, 15 -}, -{ - 3, -1, 21, 16, 41 -} -}; - -static const opus_int8 silk_LTP_gain_vq_2[32][5] = -{ -{ - -6, 27, 61, 39, 5 -}, -{ - -11, 42, 88, 4, 1 -}, -{ - -2, 60, 65, 6, -4 -}, -{ - -1, -5, 73, 56, 1 -}, -{ - -9, 19, 94, 29, -9 -}, -{ - 0, 12, 99, 6, 4 -}, -{ - 8, -19, 102, 46, -13 -}, -{ - 3, 2, 13, 3, 2 -}, -{ - 9, -21, 84, 72, -18 -}, -{ - -11, 46, 104, -22, 8 -}, -{ - 18, 38, 48, 23, 0 -}, -{ - -16, 70, 83, -21, 11 -}, -{ - 5, -11, 117, 22, -8 -}, -{ - -6, 23, 117, -12, 3 -}, -{ - 3, -8, 95, 28, 4 -}, -{ - -10, 15, 77, 60, -15 -}, -{ - -1, 4, 124, 2, -4 -}, -{ - 3, 38, 84, 24, -25 -}, -{ - 2, 13, 42, 13, 31 -}, -{ - 21, -4, 56, 46, -1 -}, -{ - -1, 35, 79, -13, 19 -}, -{ - -7, 65, 88, -9, -14 -}, -{ - 20, 4, 81, 49, -29 -}, -{ - 20, 0, 75, 3, -17 -}, -{ - 5, -9, 44, 92, -8 -}, -{ - 1, -3, 22, 69, 31 -}, -{ - -6, 95, 41, -12, 5 -}, -{ - 39, 67, 16, -4, 1 -}, -{ - 0, -6, 120, 55, -36 -}, -{ - -13, 44, 122, 4, -24 -}, -{ - 81, 5, 11, 3, 7 -}, -{ - 2, 0, 9, 10, 88 -} -}; - -const opus_int8 * const silk_LTP_vq_ptrs_Q7[NB_LTP_CBKS] = { - (opus_int8 *)&silk_LTP_gain_vq_0[0][0], - (opus_int8 *)&silk_LTP_gain_vq_1[0][0], - (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/sources/LabSound/third_party/libnyquist/third_party/opus/silk/tables_NLSF_CB_NB_MB.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/tables_NLSF_CB_NB_MB.c deleted file mode 100644 index 8c59d207..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/tables_NLSF_CB_NB_MB.c +++ /dev/null @@ -1,159 +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 "tables.h" - -static const opus_uint8 silk_NLSF_CB1_NB_MB_Q8[ 320 ] = { - 12, 35, 60, 83, 108, 132, 157, 180, - 206, 228, 15, 32, 55, 77, 101, 125, - 151, 175, 201, 225, 19, 42, 66, 89, - 114, 137, 162, 184, 209, 230, 12, 25, - 50, 72, 97, 120, 147, 172, 200, 223, - 26, 44, 69, 90, 114, 135, 159, 180, - 205, 225, 13, 22, 53, 80, 106, 130, - 156, 180, 205, 228, 15, 25, 44, 64, - 90, 115, 142, 168, 196, 222, 19, 24, - 62, 82, 100, 120, 145, 168, 190, 214, - 22, 31, 50, 79, 103, 120, 151, 170, - 203, 227, 21, 29, 45, 65, 106, 124, - 150, 171, 196, 224, 30, 49, 75, 97, - 121, 142, 165, 186, 209, 229, 19, 25, - 52, 70, 93, 116, 143, 166, 192, 219, - 26, 34, 62, 75, 97, 118, 145, 167, - 194, 217, 25, 33, 56, 70, 91, 113, - 143, 165, 196, 223, 21, 34, 51, 72, - 97, 117, 145, 171, 196, 222, 20, 29, - 50, 67, 90, 117, 144, 168, 197, 221, - 22, 31, 48, 66, 95, 117, 146, 168, - 196, 222, 24, 33, 51, 77, 116, 134, - 158, 180, 200, 224, 21, 28, 70, 87, - 106, 124, 149, 170, 194, 217, 26, 33, - 53, 64, 83, 117, 152, 173, 204, 225, - 27, 34, 65, 95, 108, 129, 155, 174, - 210, 225, 20, 26, 72, 99, 113, 131, - 154, 176, 200, 219, 34, 43, 61, 78, - 93, 114, 155, 177, 205, 229, 23, 29, - 54, 97, 124, 138, 163, 179, 209, 229, - 30, 38, 56, 89, 118, 129, 158, 178, - 200, 231, 21, 29, 49, 63, 85, 111, - 142, 163, 193, 222, 27, 48, 77, 103, - 133, 158, 179, 196, 215, 232, 29, 47, - 74, 99, 124, 151, 176, 198, 220, 237, - 33, 42, 61, 76, 93, 121, 155, 174, - 207, 225, 29, 53, 87, 112, 136, 154, - 170, 188, 208, 227, 24, 30, 52, 84, - 131, 150, 166, 186, 203, 229, 37, 48, - 64, 84, 104, 118, 156, 177, 201, 230 -}; - -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, - 48, 45, 42, 41, 40, 38, 36, 34, - 31, 30, 21, 12, 10, 3, 1, 0, - 255, 245, 244, 236, 233, 225, 217, 203, - 190, 176, 175, 161, 149, 136, 125, 114, - 102, 91, 81, 71, 60, 52, 43, 35, - 28, 20, 19, 18, 12, 11, 5, 0 -}; - -static const opus_uint8 silk_NLSF_CB2_SELECT_NB_MB[ 160 ] = { - 16, 0, 0, 0, 0, 99, 66, 36, - 36, 34, 36, 34, 34, 34, 34, 83, - 69, 36, 52, 34, 116, 102, 70, 68, - 68, 176, 102, 68, 68, 34, 65, 85, - 68, 84, 36, 116, 141, 152, 139, 170, - 132, 187, 184, 216, 137, 132, 249, 168, - 185, 139, 104, 102, 100, 68, 68, 178, - 218, 185, 185, 170, 244, 216, 187, 187, - 170, 244, 187, 187, 219, 138, 103, 155, - 184, 185, 137, 116, 183, 155, 152, 136, - 132, 217, 184, 184, 170, 164, 217, 171, - 155, 139, 244, 169, 184, 185, 170, 164, - 216, 223, 218, 138, 214, 143, 188, 218, - 168, 244, 141, 136, 155, 170, 168, 138, - 220, 219, 139, 164, 219, 202, 216, 137, - 168, 186, 246, 185, 139, 116, 185, 219, - 185, 138, 100, 100, 134, 100, 102, 34, - 68, 68, 100, 68, 168, 203, 221, 218, - 168, 167, 154, 136, 104, 70, 164, 246, - 171, 137, 139, 137, 155, 218, 219, 139 -}; - -static const opus_uint8 silk_NLSF_CB2_iCDF_NB_MB[ 72 ] = { - 255, 254, 253, 238, 14, 3, 2, 1, - 0, 255, 254, 252, 218, 35, 3, 2, - 1, 0, 255, 254, 250, 208, 59, 4, - 2, 1, 0, 255, 254, 246, 194, 71, - 10, 2, 1, 0, 255, 252, 236, 183, - 82, 8, 2, 1, 0, 255, 252, 235, - 180, 90, 17, 2, 1, 0, 255, 248, - 224, 171, 97, 30, 4, 1, 0, 255, - 254, 236, 173, 95, 37, 7, 1, 0 -}; - -static const opus_uint8 silk_NLSF_CB2_BITS_NB_MB_Q5[ 72 ] = { - 255, 255, 255, 131, 6, 145, 255, 255, - 255, 255, 255, 236, 93, 15, 96, 255, - 255, 255, 255, 255, 194, 83, 25, 71, - 221, 255, 255, 255, 255, 162, 73, 34, - 66, 162, 255, 255, 255, 210, 126, 73, - 43, 57, 173, 255, 255, 255, 201, 125, - 71, 48, 58, 130, 255, 255, 255, 166, - 110, 73, 57, 62, 104, 210, 255, 255, - 251, 123, 65, 55, 68, 100, 171, 255 -}; - -static const opus_uint8 silk_NLSF_PRED_NB_MB_Q8[ 18 ] = { - 179, 138, 140, 148, 151, 149, 153, 151, - 163, 116, 67, 82, 59, 92, 72, 100, - 89, 92 -}; - -static const opus_int16 silk_NLSF_DELTA_MIN_NB_MB_Q15[ 11 ] = { - 250, 3, 6, 3, 3, 3, 4, 3, - 3, 3, 461 -}; - -const silk_NLSF_CB_struct silk_NLSF_CB_NB_MB = -{ - 32, - 10, - SILK_FIX_CONST( 0.18, 16 ), - SILK_FIX_CONST( 1.0 / 0.18, 6 ), - silk_NLSF_CB1_NB_MB_Q8, - silk_NLSF_CB1_iCDF_NB_MB, - silk_NLSF_PRED_NB_MB_Q8, - silk_NLSF_CB2_SELECT_NB_MB, - silk_NLSF_CB2_iCDF_NB_MB, - silk_NLSF_CB2_BITS_NB_MB_Q5, - silk_NLSF_DELTA_MIN_NB_MB_Q15, -}; diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/tables_NLSF_CB_WB.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/tables_NLSF_CB_WB.c deleted file mode 100644 index 50af87eb..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/tables_NLSF_CB_WB.c +++ /dev/null @@ -1,198 +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 "tables.h" - -static const opus_uint8 silk_NLSF_CB1_WB_Q8[ 512 ] = { - 7, 23, 38, 54, 69, 85, 100, 116, - 131, 147, 162, 178, 193, 208, 223, 239, - 13, 25, 41, 55, 69, 83, 98, 112, - 127, 142, 157, 171, 187, 203, 220, 236, - 15, 21, 34, 51, 61, 78, 92, 106, - 126, 136, 152, 167, 185, 205, 225, 240, - 10, 21, 36, 50, 63, 79, 95, 110, - 126, 141, 157, 173, 189, 205, 221, 237, - 17, 20, 37, 51, 59, 78, 89, 107, - 123, 134, 150, 164, 184, 205, 224, 240, - 10, 15, 32, 51, 67, 81, 96, 112, - 129, 142, 158, 173, 189, 204, 220, 236, - 8, 21, 37, 51, 65, 79, 98, 113, - 126, 138, 155, 168, 179, 192, 209, 218, - 12, 15, 34, 55, 63, 78, 87, 108, - 118, 131, 148, 167, 185, 203, 219, 236, - 16, 19, 32, 36, 56, 79, 91, 108, - 118, 136, 154, 171, 186, 204, 220, 237, - 11, 28, 43, 58, 74, 89, 105, 120, - 135, 150, 165, 180, 196, 211, 226, 241, - 6, 16, 33, 46, 60, 75, 92, 107, - 123, 137, 156, 169, 185, 199, 214, 225, - 11, 19, 30, 44, 57, 74, 89, 105, - 121, 135, 152, 169, 186, 202, 218, 234, - 12, 19, 29, 46, 57, 71, 88, 100, - 120, 132, 148, 165, 182, 199, 216, 233, - 17, 23, 35, 46, 56, 77, 92, 106, - 123, 134, 152, 167, 185, 204, 222, 237, - 14, 17, 45, 53, 63, 75, 89, 107, - 115, 132, 151, 171, 188, 206, 221, 240, - 9, 16, 29, 40, 56, 71, 88, 103, - 119, 137, 154, 171, 189, 205, 222, 237, - 16, 19, 36, 48, 57, 76, 87, 105, - 118, 132, 150, 167, 185, 202, 218, 236, - 12, 17, 29, 54, 71, 81, 94, 104, - 126, 136, 149, 164, 182, 201, 221, 237, - 15, 28, 47, 62, 79, 97, 115, 129, - 142, 155, 168, 180, 194, 208, 223, 238, - 8, 14, 30, 45, 62, 78, 94, 111, - 127, 143, 159, 175, 192, 207, 223, 239, - 17, 30, 49, 62, 79, 92, 107, 119, - 132, 145, 160, 174, 190, 204, 220, 235, - 14, 19, 36, 45, 61, 76, 91, 108, - 121, 138, 154, 172, 189, 205, 222, 238, - 12, 18, 31, 45, 60, 76, 91, 107, - 123, 138, 154, 171, 187, 204, 221, 236, - 13, 17, 31, 43, 53, 70, 83, 103, - 114, 131, 149, 167, 185, 203, 220, 237, - 17, 22, 35, 42, 58, 78, 93, 110, - 125, 139, 155, 170, 188, 206, 224, 240, - 8, 15, 34, 50, 67, 83, 99, 115, - 131, 146, 162, 178, 193, 209, 224, 239, - 13, 16, 41, 66, 73, 86, 95, 111, - 128, 137, 150, 163, 183, 206, 225, 241, - 17, 25, 37, 52, 63, 75, 92, 102, - 119, 132, 144, 160, 175, 191, 212, 231, - 19, 31, 49, 65, 83, 100, 117, 133, - 147, 161, 174, 187, 200, 213, 227, 242, - 18, 31, 52, 68, 88, 103, 117, 126, - 138, 149, 163, 177, 192, 207, 223, 239, - 16, 29, 47, 61, 76, 90, 106, 119, - 133, 147, 161, 176, 193, 209, 224, 240, - 15, 21, 35, 50, 61, 73, 86, 97, - 110, 119, 129, 141, 175, 198, 218, 237 -}; - -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, - 98, 95, 79, 68, 52, 50, 48, 45, - 43, 32, 31, 27, 18, 10, 3, 0, - 255, 251, 235, 230, 212, 201, 196, 182, - 167, 166, 163, 151, 138, 124, 110, 104, - 90, 78, 76, 70, 69, 57, 45, 34, - 24, 21, 11, 6, 5, 4, 3, 0 -}; - -static const opus_uint8 silk_NLSF_CB2_SELECT_WB[ 256 ] = { - 0, 0, 0, 0, 0, 0, 0, 1, - 100, 102, 102, 68, 68, 36, 34, 96, - 164, 107, 158, 185, 180, 185, 139, 102, - 64, 66, 36, 34, 34, 0, 1, 32, - 208, 139, 141, 191, 152, 185, 155, 104, - 96, 171, 104, 166, 102, 102, 102, 132, - 1, 0, 0, 0, 0, 16, 16, 0, - 80, 109, 78, 107, 185, 139, 103, 101, - 208, 212, 141, 139, 173, 153, 123, 103, - 36, 0, 0, 0, 0, 0, 0, 1, - 48, 0, 0, 0, 0, 0, 0, 32, - 68, 135, 123, 119, 119, 103, 69, 98, - 68, 103, 120, 118, 118, 102, 71, 98, - 134, 136, 157, 184, 182, 153, 139, 134, - 208, 168, 248, 75, 189, 143, 121, 107, - 32, 49, 34, 34, 34, 0, 17, 2, - 210, 235, 139, 123, 185, 137, 105, 134, - 98, 135, 104, 182, 100, 183, 171, 134, - 100, 70, 68, 70, 66, 66, 34, 131, - 64, 166, 102, 68, 36, 2, 1, 0, - 134, 166, 102, 68, 34, 34, 66, 132, - 212, 246, 158, 139, 107, 107, 87, 102, - 100, 219, 125, 122, 137, 118, 103, 132, - 114, 135, 137, 105, 171, 106, 50, 34, - 164, 214, 141, 143, 185, 151, 121, 103, - 192, 34, 0, 0, 0, 0, 0, 1, - 208, 109, 74, 187, 134, 249, 159, 137, - 102, 110, 154, 118, 87, 101, 119, 101, - 0, 2, 0, 36, 36, 66, 68, 35, - 96, 164, 102, 100, 36, 0, 2, 33, - 167, 138, 174, 102, 100, 84, 2, 2, - 100, 107, 120, 119, 36, 197, 24, 0 -}; - -static const opus_uint8 silk_NLSF_CB2_iCDF_WB[ 72 ] = { - 255, 254, 253, 244, 12, 3, 2, 1, - 0, 255, 254, 252, 224, 38, 3, 2, - 1, 0, 255, 254, 251, 209, 57, 4, - 2, 1, 0, 255, 254, 244, 195, 69, - 4, 2, 1, 0, 255, 251, 232, 184, - 84, 7, 2, 1, 0, 255, 254, 240, - 186, 86, 14, 2, 1, 0, 255, 254, - 239, 178, 91, 30, 5, 1, 0, 255, - 248, 227, 177, 100, 19, 2, 1, 0 -}; - -static const opus_uint8 silk_NLSF_CB2_BITS_WB_Q5[ 72 ] = { - 255, 255, 255, 156, 4, 154, 255, 255, - 255, 255, 255, 227, 102, 15, 92, 255, - 255, 255, 255, 255, 213, 83, 24, 72, - 236, 255, 255, 255, 255, 150, 76, 33, - 63, 214, 255, 255, 255, 190, 121, 77, - 43, 55, 185, 255, 255, 255, 245, 137, - 71, 43, 59, 139, 255, 255, 255, 255, - 131, 66, 50, 66, 107, 194, 255, 255, - 166, 116, 76, 55, 53, 125, 255, 255 -}; - -static const opus_uint8 silk_NLSF_PRED_WB_Q8[ 30 ] = { - 175, 148, 160, 176, 178, 173, 174, 164, - 177, 174, 196, 182, 198, 192, 182, 68, - 62, 66, 60, 72, 117, 85, 90, 118, - 136, 151, 142, 160, 142, 155 -}; - -static const opus_int16 silk_NLSF_DELTA_MIN_WB_Q15[ 17 ] = { - 100, 3, 40, 3, 3, 3, 5, 14, - 14, 10, 11, 3, 8, 9, 7, 3, - 347 -}; - -const silk_NLSF_CB_struct silk_NLSF_CB_WB = -{ - 32, - 16, - SILK_FIX_CONST( 0.15, 16 ), - SILK_FIX_CONST( 1.0 / 0.15, 6 ), - silk_NLSF_CB1_WB_Q8, - silk_NLSF_CB1_iCDF_WB, - silk_NLSF_PRED_WB_Q8, - silk_NLSF_CB2_SELECT_WB, - silk_NLSF_CB2_iCDF_WB, - silk_NLSF_CB2_BITS_WB_Q5, - silk_NLSF_DELTA_MIN_WB_Q15, -}; - diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/tables_gain.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/tables_gain.c deleted file mode 100644 index 37e41d89..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/tables_gain.c +++ /dev/null @@ -1,63 +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 "tables.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -const opus_uint8 silk_gain_iCDF[ 3 ][ N_LEVELS_QGAIN / 8 ] = -{ -{ - 224, 112, 44, 15, 3, 2, 1, 0 -}, -{ - 254, 237, 192, 132, 70, 23, 4, 0 -}, -{ - 255, 252, 226, 155, 61, 11, 2, 0 -} -}; - -const opus_uint8 silk_delta_gain_iCDF[ MAX_DELTA_GAIN_QUANT - MIN_DELTA_GAIN_QUANT + 1 ] = { - 250, 245, 234, 203, 71, 50, 42, 38, - 35, 33, 31, 29, 28, 27, 26, 25, - 24, 23, 22, 21, 20, 19, 18, 17, - 16, 15, 14, 13, 12, 11, 10, 9, - 8, 7, 6, 5, 4, 3, 2, 1, - 0 -}; - -#ifdef __cplusplus -} -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/tables_other.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/tables_other.c deleted file mode 100644 index 398686bf..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/tables_other.c +++ /dev/null @@ -1,138 +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 "structs.h" -#include "define.h" -#include "tables.h" - -#ifdef __cplusplus -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, - 820, 2950, 5000, 6500, 7526, 8266, 10050, 13732 -}; -const opus_uint8 silk_stereo_pred_joint_iCDF[ 25 ] = { - 249, 247, 246, 245, 244, - 234, 210, 202, 201, 200, - 197, 174, 82, 59, 56, - 55, 54, 46, 22, 12, - 11, 10, 9, 7, 0 -}; -const opus_uint8 silk_stereo_only_code_mid_iCDF[ 2 ] = { 64, 0 }; - -/* Tables for LBRR flags */ -static const opus_uint8 silk_LBRR_flags_2_iCDF[ 3 ] = { 203, 150, 0 }; -static const opus_uint8 silk_LBRR_flags_3_iCDF[ 7 ] = { 215, 195, 166, 125, 110, 82, 0 }; -const opus_uint8 * const silk_LBRR_flags_iCDF_ptr[ 2 ] = { - silk_LBRR_flags_2_iCDF, - silk_LBRR_flags_3_iCDF -}; - -/* Table for LSB coding */ -const opus_uint8 silk_lsb_iCDF[ 2 ] = { 120, 0 }; - -/* Tables for LTPScale */ -const opus_uint8 silk_LTPscale_iCDF[ 3 ] = { 128, 64, 0 }; - -/* Tables for signal type and offset coding */ -const opus_uint8 silk_type_offset_VAD_iCDF[ 4 ] = { - 232, 158, 10, 0 -}; -const opus_uint8 silk_type_offset_no_VAD_iCDF[ 2 ] = { - 230, 0 -}; - -/* Tables for NLSF interpolation factor */ -const opus_uint8 silk_NLSF_interpolation_factor_iCDF[ 5 ] = { 243, 221, 192, 181, 0 }; - -/* Quantization offsets */ -const opus_int16 silk_Quantization_Offsets_Q10[ 2 ][ 2 ] = { - { OFFSET_UVL_Q10, OFFSET_UVH_Q10 }, { OFFSET_VL_Q10, OFFSET_VH_Q10 } -}; - -/* Table for LTPScale */ -const opus_int16 silk_LTPScales_table_Q14[ 3 ] = { 15565, 12288, 8192 }; - -/* Uniform entropy tables */ -const opus_uint8 silk_uniform3_iCDF[ 3 ] = { 171, 85, 0 }; -const opus_uint8 silk_uniform4_iCDF[ 4 ] = { 192, 128, 64, 0 }; -const opus_uint8 silk_uniform5_iCDF[ 5 ] = { 205, 154, 102, 51, 0 }; -const opus_uint8 silk_uniform6_iCDF[ 6 ] = { 213, 171, 128, 85, 43, 0 }; -const opus_uint8 silk_uniform8_iCDF[ 8 ] = { 224, 192, 160, 128, 96, 64, 32, 0 }; - -const opus_uint8 silk_NLSF_EXT_iCDF[ 7 ] = { 100, 40, 16, 7, 3, 1, 0 }; - -/* Elliptic/Cauer filters designed with 0.1 dB passband ripple, - 80 dB minimum stopband attenuation, and - [0.95 : 0.15 : 0.35] normalized cut off frequencies. */ - -/* Interpolation points for filter coefficients used in the bandwidth transition smoother */ -const opus_int32 silk_Transition_LP_B_Q28[ TRANSITION_INT_NUM ][ TRANSITION_NB ] = -{ -{ 250767114, 501534038, 250767114 }, -{ 209867381, 419732057, 209867381 }, -{ 170987846, 341967853, 170987846 }, -{ 131531482, 263046905, 131531482 }, -{ 89306658, 178584282, 89306658 } -}; - -/* Interpolation points for filter coefficients used in the bandwidth transition smoother */ -const opus_int32 silk_Transition_LP_A_Q28[ TRANSITION_INT_NUM ][ TRANSITION_NA ] = -{ -{ 506393414, 239854379 }, -{ 411067935, 169683996 }, -{ 306733530, 116694253 }, -{ 185807084, 77959395 }, -{ 35497197, 57401098 } -}; - -#ifdef __cplusplus -} -#endif - diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/tables_pitch_lag.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/tables_pitch_lag.c deleted file mode 100644 index e80cc59a..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/tables_pitch_lag.c +++ /dev/null @@ -1,69 +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 "tables.h" - -const opus_uint8 silk_pitch_lag_iCDF[ 2 * ( PITCH_EST_MAX_LAG_MS - PITCH_EST_MIN_LAG_MS ) ] = { - 253, 250, 244, 233, 212, 182, 150, 131, - 120, 110, 98, 85, 72, 60, 49, 40, - 32, 25, 19, 15, 13, 11, 9, 8, - 7, 6, 5, 4, 3, 2, 1, 0 -}; - -const opus_uint8 silk_pitch_delta_iCDF[21] = { - 210, 208, 206, 203, 199, 193, 183, 168, - 142, 104, 74, 52, 37, 27, 20, 14, - 10, 6, 4, 2, 0 -}; - -const opus_uint8 silk_pitch_contour_iCDF[34] = { - 223, 201, 183, 167, 152, 138, 124, 111, - 98, 88, 79, 70, 62, 56, 50, 44, - 39, 35, 31, 27, 24, 21, 18, 16, - 14, 12, 10, 8, 6, 4, 3, 2, - 1, 0 -}; - -const opus_uint8 silk_pitch_contour_NB_iCDF[11] = { - 188, 176, 155, 138, 119, 97, 67, 43, - 26, 10, 0 -}; - -const opus_uint8 silk_pitch_contour_10_ms_iCDF[12] = { - 165, 119, 80, 61, 47, 35, 27, 20, - 14, 9, 4, 0 -}; - -const opus_uint8 silk_pitch_contour_10_ms_NB_iCDF[3] = { - 113, 63, 0 -}; - - diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/tables_pulses_per_block.c b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/tables_pulses_per_block.c deleted file mode 100644 index c7c01c88..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/tables_pulses_per_block.c +++ /dev/null @@ -1,264 +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 "tables.h" - -const opus_uint8 silk_max_pulses_table[ 4 ] = { - 8, 10, 12, 16 -}; - -const opus_uint8 silk_pulses_per_block_iCDF[ 10 ][ 18 ] = { -{ - 125, 51, 26, 18, 15, 12, 11, 10, - 9, 8, 7, 6, 5, 4, 3, 2, - 1, 0 -}, -{ - 198, 105, 45, 22, 15, 12, 11, 10, - 9, 8, 7, 6, 5, 4, 3, 2, - 1, 0 -}, -{ - 213, 162, 116, 83, 59, 43, 32, 24, - 18, 15, 12, 9, 7, 6, 5, 3, - 2, 0 -}, -{ - 239, 187, 116, 59, 28, 16, 11, 10, - 9, 8, 7, 6, 5, 4, 3, 2, - 1, 0 -}, -{ - 250, 229, 188, 135, 86, 51, 30, 19, - 13, 10, 8, 6, 5, 4, 3, 2, - 1, 0 -}, -{ - 249, 235, 213, 185, 156, 128, 103, 83, - 66, 53, 42, 33, 26, 21, 17, 13, - 10, 0 -}, -{ - 254, 249, 235, 206, 164, 118, 77, 46, - 27, 16, 10, 7, 5, 4, 3, 2, - 1, 0 -}, -{ - 255, 253, 249, 239, 220, 191, 156, 119, - 85, 57, 37, 23, 15, 10, 6, 4, - 2, 0 -}, -{ - 255, 253, 251, 246, 237, 223, 203, 179, - 152, 124, 98, 75, 55, 40, 29, 21, - 15, 0 -}, -{ - 255, 254, 253, 247, 220, 162, 106, 67, - 42, 28, 18, 12, 9, 6, 4, 3, - 2, 0 -} -}; - -const opus_uint8 silk_pulses_per_block_BITS_Q5[ 9 ][ 18 ] = { -{ - 31, 57, 107, 160, 205, 205, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255 -}, -{ - 69, 47, 67, 111, 166, 205, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255 -}, -{ - 82, 74, 79, 95, 109, 128, 145, 160, - 173, 205, 205, 205, 224, 255, 255, 224, - 255, 224 -}, -{ - 125, 74, 59, 69, 97, 141, 182, 255, - 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255 -}, -{ - 173, 115, 85, 73, 76, 92, 115, 145, - 173, 205, 224, 224, 255, 255, 255, 255, - 255, 255 -}, -{ - 166, 134, 113, 102, 101, 102, 107, 118, - 125, 138, 145, 155, 166, 182, 192, 192, - 205, 150 -}, -{ - 224, 182, 134, 101, 83, 79, 85, 97, - 120, 145, 173, 205, 224, 255, 255, 255, - 255, 255 -}, -{ - 255, 224, 192, 150, 120, 101, 92, 89, - 93, 102, 118, 134, 160, 182, 192, 224, - 224, 224 -}, -{ - 255, 224, 224, 182, 155, 134, 118, 109, - 104, 102, 106, 111, 118, 131, 145, 160, - 173, 131 -} -}; - -const opus_uint8 silk_rate_levels_iCDF[ 2 ][ 9 ] = -{ -{ - 241, 190, 178, 132, 87, 74, 41, 14, - 0 -}, -{ - 223, 193, 157, 140, 106, 57, 39, 18, - 0 -} -}; - -const opus_uint8 silk_rate_levels_BITS_Q5[ 2 ][ 9 ] = -{ -{ - 131, 74, 141, 79, 80, 138, 95, 104, - 134 -}, -{ - 95, 99, 91, 125, 93, 76, 123, 115, - 123 -} -}; - -const opus_uint8 silk_shell_code_table0[ 152 ] = { - 128, 0, 214, 42, 0, 235, 128, 21, - 0, 244, 184, 72, 11, 0, 248, 214, - 128, 42, 7, 0, 248, 225, 170, 80, - 25, 5, 0, 251, 236, 198, 126, 54, - 18, 3, 0, 250, 238, 211, 159, 82, - 35, 15, 5, 0, 250, 231, 203, 168, - 128, 88, 53, 25, 6, 0, 252, 238, - 216, 185, 148, 108, 71, 40, 18, 4, - 0, 253, 243, 225, 199, 166, 128, 90, - 57, 31, 13, 3, 0, 254, 246, 233, - 212, 183, 147, 109, 73, 44, 23, 10, - 2, 0, 255, 250, 240, 223, 198, 166, - 128, 90, 58, 33, 16, 6, 1, 0, - 255, 251, 244, 231, 210, 181, 146, 110, - 75, 46, 25, 12, 5, 1, 0, 255, - 253, 248, 238, 221, 196, 164, 128, 92, - 60, 35, 18, 8, 3, 1, 0, 255, - 253, 249, 242, 229, 208, 180, 146, 110, - 76, 48, 27, 14, 7, 3, 1, 0 -}; - -const opus_uint8 silk_shell_code_table1[ 152 ] = { - 129, 0, 207, 50, 0, 236, 129, 20, - 0, 245, 185, 72, 10, 0, 249, 213, - 129, 42, 6, 0, 250, 226, 169, 87, - 27, 4, 0, 251, 233, 194, 130, 62, - 20, 4, 0, 250, 236, 207, 160, 99, - 47, 17, 3, 0, 255, 240, 217, 182, - 131, 81, 41, 11, 1, 0, 255, 254, - 233, 201, 159, 107, 61, 20, 2, 1, - 0, 255, 249, 233, 206, 170, 128, 86, - 50, 23, 7, 1, 0, 255, 250, 238, - 217, 186, 148, 108, 70, 39, 18, 6, - 1, 0, 255, 252, 243, 226, 200, 166, - 128, 90, 56, 30, 13, 4, 1, 0, - 255, 252, 245, 231, 209, 180, 146, 110, - 76, 47, 25, 11, 4, 1, 0, 255, - 253, 248, 237, 219, 194, 163, 128, 93, - 62, 37, 19, 8, 3, 1, 0, 255, - 254, 250, 241, 226, 205, 177, 145, 111, - 79, 51, 30, 15, 6, 2, 1, 0 -}; - -const opus_uint8 silk_shell_code_table2[ 152 ] = { - 129, 0, 203, 54, 0, 234, 129, 23, - 0, 245, 184, 73, 10, 0, 250, 215, - 129, 41, 5, 0, 252, 232, 173, 86, - 24, 3, 0, 253, 240, 200, 129, 56, - 15, 2, 0, 253, 244, 217, 164, 94, - 38, 10, 1, 0, 253, 245, 226, 189, - 132, 71, 27, 7, 1, 0, 253, 246, - 231, 203, 159, 105, 56, 23, 6, 1, - 0, 255, 248, 235, 213, 179, 133, 85, - 47, 19, 5, 1, 0, 255, 254, 243, - 221, 194, 159, 117, 70, 37, 12, 2, - 1, 0, 255, 254, 248, 234, 208, 171, - 128, 85, 48, 22, 8, 2, 1, 0, - 255, 254, 250, 240, 220, 189, 149, 107, - 67, 36, 16, 6, 2, 1, 0, 255, - 254, 251, 243, 227, 201, 166, 128, 90, - 55, 29, 13, 5, 2, 1, 0, 255, - 254, 252, 246, 234, 213, 183, 147, 109, - 73, 43, 22, 10, 4, 2, 1, 0 -}; - -const opus_uint8 silk_shell_code_table3[ 152 ] = { - 130, 0, 200, 58, 0, 231, 130, 26, - 0, 244, 184, 76, 12, 0, 249, 214, - 130, 43, 6, 0, 252, 232, 173, 87, - 24, 3, 0, 253, 241, 203, 131, 56, - 14, 2, 0, 254, 246, 221, 167, 94, - 35, 8, 1, 0, 254, 249, 232, 193, - 130, 65, 23, 5, 1, 0, 255, 251, - 239, 211, 162, 99, 45, 15, 4, 1, - 0, 255, 251, 243, 223, 186, 131, 74, - 33, 11, 3, 1, 0, 255, 252, 245, - 230, 202, 158, 105, 57, 24, 8, 2, - 1, 0, 255, 253, 247, 235, 214, 179, - 132, 84, 44, 19, 7, 2, 1, 0, - 255, 254, 250, 240, 223, 196, 159, 112, - 69, 36, 15, 6, 2, 1, 0, 255, - 254, 253, 245, 231, 209, 176, 136, 93, - 55, 27, 11, 3, 2, 1, 0, 255, - 254, 253, 252, 239, 221, 194, 158, 117, - 76, 42, 18, 4, 3, 2, 1, 0 -}; - -const opus_uint8 silk_shell_code_table_offsets[ 17 ] = { - 0, 0, 2, 5, 9, 14, 20, 27, - 35, 44, 54, 65, 77, 90, 104, 119, - 135 -}; - -const opus_uint8 silk_sign_iCDF[ 42 ] = { - 254, 49, 67, 77, 82, 93, 99, - 198, 11, 18, 24, 31, 36, 45, - 255, 46, 66, 78, 87, 94, 104, - 208, 14, 21, 32, 42, 51, 66, - 255, 94, 104, 109, 112, 115, 118, - 248, 53, 69, 80, 88, 95, 102 -}; diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/tuning_parameters.h b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/tuning_parameters.h deleted file mode 100644 index e1057bba..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/tuning_parameters.h +++ /dev/null @@ -1,171 +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. -***********************************************************************/ - -#ifndef SILK_TUNING_PARAMETERS_H -#define SILK_TUNING_PARAMETERS_H - -#ifdef __cplusplus -extern "C" -{ -#endif - -/* Decay time for bitreservoir */ -#define BITRESERVOIR_DECAY_TIME_MS 500 - -/*******************/ -/* Pitch estimator */ -/*******************/ - -/* Level of noise floor for whitening filter LPC analysis in pitch analysis */ -#define FIND_PITCH_WHITE_NOISE_FRACTION 1e-3f - -/* Bandwidth expansion for whitening filter in pitch analysis */ -#define FIND_PITCH_BANDWIDTH_EXPANSION 0.99f - -/*********************/ -/* Linear prediction */ -/*********************/ - -/* 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 - -/* LTP quantization settings */ -#define MU_LTP_QUANT_NB 0.03f -#define MU_LTP_QUANT_MB 0.025f -#define MU_LTP_QUANT_WB 0.02f - -/* Max cumulative LTP gain */ -#define MAX_SUM_LOG_GAIN_DB 250.0f - -/***********************/ -/* High pass filtering */ -/***********************/ - -/* Smoothing parameters for low end of pitch frequency range estimation */ -#define VARIABLE_HP_SMTH_COEF1 0.1f -#define VARIABLE_HP_SMTH_COEF2 0.015f -#define VARIABLE_HP_MAX_DELTA_FREQ 0.4f - -/* Min and max cut-off frequency values (-3 dB points) */ -#define VARIABLE_HP_MIN_CUTOFF_HZ 60 -#define VARIABLE_HP_MAX_CUTOFF_HZ 100 - -/***********/ -/* Various */ -/***********/ - -/* VAD threshold */ -#define SPEECH_ACTIVITY_DTX_THRES 0.05f - -/* Speech Activity LBRR enable threshold */ -#define LBRR_SPEECH_ACTIVITY_THRES 0.3f - -/*************************/ -/* Perceptual parameters */ -/*************************/ - -/* reduction in coding SNR during low speech activity */ -#define BG_SNR_DECR_dB 2.0f - -/* factor for reducing quantization noise during voiced speech */ -#define HARM_SNR_INCR_dB 2.0f - -/* factor for reducing quantization noise for unvoiced sparse signals */ -#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 - -/* warping control */ -#define WARPING_MULTIPLIER 0.015f - -/* fraction added to first autocorrelation value */ -#define SHAPE_WHITE_NOISE_FRACTION 5e-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 - -/* harmonic noise shaping */ -#define HARMONIC_SHAPING 0.3f - -/* extra harmonic noise shaping for high bitrates or noisy input */ -#define HIGH_RATE_OR_LOW_QUALITY_HARMONIC_SHAPING 0.2f - -/* parameter for shaping noise towards higher frequencies */ -#define HP_NOISE_COEF 0.25f - -/* parameter for shaping noise even more towards higher frequencies during voiced speech */ -#define HARM_HP_NOISE_COEF 0.35f - -/* parameter for applying a high-pass tilt to the input signal */ -#define INPUT_TILT 0.05f - -/* parameter for extra high-pass tilt to the input signal at high rates */ -#define HIGH_RATE_INPUT_TILT 0.1f - -/* parameter for reducing noise at the very low frequencies */ -#define LOW_FREQ_SHAPING 4.0f - -/* less reduction of noise at the very low frequencies for signals with low SNR at low frequencies */ -#define LOW_QUALITY_LOW_FREQ_SHAPING_DECR 0.5f - -/* subframe smoothing coefficient for HarmBoost, HarmShapeGain, Tilt (lower -> more smoothing) */ -#define SUBFR_SMTH_COEF 0.4f - -/* parameters defining the R/D tradeoff in the residual quantizer */ -#define LAMBDA_OFFSET 1.2f -#define LAMBDA_SPEECH_ACT -0.2f -#define LAMBDA_DELAYED_DECISIONS -0.05f -#define LAMBDA_INPUT_QUALITY -0.1f -#define LAMBDA_CODING_QUALITY -0.2f -#define LAMBDA_QUANT_OFFSET 0.8f - -/* Compensation in bitrate calculations for 10 ms modes */ -#define REDUCE_BITRATE_10_MS_BPS 2200 - -/* Maximum time before allowing a bandwidth transition */ -#define MAX_BANDWIDTH_SWITCH_DELAY_MS 5000 - -#ifdef __cplusplus -} -#endif - -#endif /* SILK_TUNING_PARAMETERS_H */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/typedef.h b/sources/LabSound/third_party/libnyquist/third_party/opus/silk/typedef.h deleted file mode 100644 index 97b7e709..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/opus/silk/typedef.h +++ /dev/null @@ -1,78 +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. -***********************************************************************/ - -#ifndef SILK_TYPEDEF_H -#define SILK_TYPEDEF_H - -#include "opus_types.h" -#include "opus_defines.h" - -#ifndef FIXED_POINT -# include -# define silk_float float -# define silk_float_MAX FLT_MAX -#endif - -#define silk_int64_MAX ((opus_int64)0x7FFFFFFFFFFFFFFFLL) /* 2^63 - 1 */ -#define silk_int64_MIN ((opus_int64)0x8000000000000000LL) /* -2^63 */ -#define silk_int32_MAX 0x7FFFFFFF /* 2^31 - 1 = 2147483647 */ -#define silk_int32_MIN ((opus_int32)0x80000000) /* -2^31 = -2147483648 */ -#define silk_int16_MAX 0x7FFF /* 2^15 - 1 = 32767 */ -#define silk_int16_MIN ((opus_int16)0x8000) /* -2^15 = -32768 */ -#define silk_int8_MAX 0x7F /* 2^7 - 1 = 127 */ -#define silk_int8_MIN ((opus_int8)0x80) /* -2^7 = -128 */ -#define silk_uint8_MAX 0xFF /* 2^8 - 1 = 255 */ - -#define silk_TRUE 1 -#define silk_FALSE 0 - -/* assertions */ -#if (defined _WIN32 && !defined _WINCE && !defined(__GNUC__) && !defined(NO_ASSERTS)) -# ifndef silk_assert -# include /* ASSERTE() */ -# define silk_assert(COND) _ASSERTE(COND) -# endif -#else -# ifdef ENABLE_ASSERTIONS -# include -# include -#define silk_fatal(str) _silk_fatal(str, __FILE__, __LINE__); -#ifdef __GNUC__ -__attribute__((noreturn)) -#endif -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(); -} -# define silk_assert(COND) {if (!(COND)) {silk_fatal("assertion failed: " #COND);}} -# else -# define silk_assert(COND) -# endif -#endif - -#endif /* SILK_TYPEDEF_H */ diff --git a/sources/LabSound/third_party/libnyquist/third_party/rtaudio/RtAudio.cpp b/sources/LabSound/third_party/libnyquist/third_party/rtaudio/RtAudio.cpp deleted file mode 100644 index a0e00123..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/rtaudio/RtAudio.cpp +++ /dev/null @@ -1,10205 +0,0 @@ -/************************************************************************/ -/*! \class RtAudio - \brief Realtime audio i/o C++ classes. - - RtAudio provides a common API (Application Programming Interface) - for realtime audio input/output across Linux (native ALSA, Jack, - and OSS), Macintosh OS X (CoreAudio and Jack), and Windows - (DirectSound, ASIO and WASAPI) operating systems. - - RtAudio WWW site: http://www.music.mcgill.ca/~gary/rtaudio/ - - RtAudio: realtime audio i/o C++ classes - Copyright (c) 2001-2014 Gary P. Scavone - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation files - (the "Software"), to deal in the Software without restriction, - including without limitation the rights to use, copy, modify, merge, - publish, distribute, sublicense, and/or sell copies of the Software, - and to permit persons to whom the Software is furnished to do so, - subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - Any person wishing to distribute modifications to the Software is - asked to send the modifications to the original developer so that - they can be incorporated into the canonical version. This is, - however, not a binding provision of this license. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR - ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ -/************************************************************************/ - -// RtAudio: Version 4.1.1 - -#include "RtAudio.h" -#include -#include -#include -#include -#include - -// Static variable definitions. -const unsigned int RtApi::MAX_SAMPLE_RATES = 14; -const unsigned int RtApi::SAMPLE_RATES[] = { - 4000, 5512, 8000, 9600, 11025, 16000, 22050, - 32000, 44100, 48000, 88200, 96000, 176400, 192000 -}; - -#if defined(__WINDOWS_DS__) || defined(__WINDOWS_ASIO__) || defined(__WINDOWS_WASAPI__) - #define MUTEX_INITIALIZE(A) InitializeCriticalSection(A) - #define MUTEX_DESTROY(A) DeleteCriticalSection(A) - #define MUTEX_LOCK(A) EnterCriticalSection(A) - #define MUTEX_UNLOCK(A) LeaveCriticalSection(A) - - #include "tchar.h" - - static std::string convertCharPointerToStdString(const char *text) - { - return std::string(text); - } - - static std::string convertCharPointerToStdString(const wchar_t *text) - { - int length = WideCharToMultiByte(CP_UTF8, 0, text, -1, NULL, 0, NULL, NULL); - std::string s( length-1, '\0' ); - WideCharToMultiByte(CP_UTF8, 0, text, -1, &s[0], length, NULL, NULL); - return s; - } - -#elif defined(__LINUX_ALSA__) || defined(__LINUX_PULSE__) || defined(__UNIX_JACK__) || defined(__LINUX_OSS__) || defined(__MACOSX_CORE__) - // pthread API - #define MUTEX_INITIALIZE(A) pthread_mutex_init(A, NULL) - #define MUTEX_DESTROY(A) pthread_mutex_destroy(A) - #define MUTEX_LOCK(A) pthread_mutex_lock(A) - #define MUTEX_UNLOCK(A) pthread_mutex_unlock(A) -#else - #define MUTEX_INITIALIZE(A) abs(*A) // dummy definitions - #define MUTEX_DESTROY(A) abs(*A) // dummy definitions -#endif - -// *************************************************** // -// -// RtAudio definitions. -// -// *************************************************** // - -std::string RtAudio :: getVersion( void ) throw() -{ - return RTAUDIO_VERSION; -} - -void RtAudio :: getCompiledApi( std::vector &apis ) throw() -{ - apis.clear(); - - // The order here will control the order of RtAudio's API search in - // the constructor. -#if defined(__UNIX_JACK__) - apis.push_back( UNIX_JACK ); -#endif -#if defined(__LINUX_ALSA__) - apis.push_back( LINUX_ALSA ); -#endif -#if defined(__LINUX_PULSE__) - apis.push_back( LINUX_PULSE ); -#endif -#if defined(__LINUX_OSS__) - apis.push_back( LINUX_OSS ); -#endif -#if defined(__WINDOWS_ASIO__) - apis.push_back( WINDOWS_ASIO ); -#endif -#if defined(__WINDOWS_WASAPI__) - apis.push_back( WINDOWS_WASAPI ); -#endif -#if defined(__WINDOWS_DS__) - apis.push_back( WINDOWS_DS ); -#endif -#if defined(__MACOSX_CORE__) - apis.push_back( MACOSX_CORE ); -#endif -#if defined(__RTAUDIO_DUMMY__) - apis.push_back( RTAUDIO_DUMMY ); -#endif -} - -void RtAudio :: openRtApi( RtAudio::Api api ) -{ - if ( rtapi_ ) - delete rtapi_; - rtapi_ = 0; - -#if defined(__UNIX_JACK__) - if ( api == UNIX_JACK ) - rtapi_ = new RtApiJack(); -#endif -#if defined(__LINUX_ALSA__) - if ( api == LINUX_ALSA ) - rtapi_ = new RtApiAlsa(); -#endif -#if defined(__LINUX_PULSE__) - if ( api == LINUX_PULSE ) - rtapi_ = new RtApiPulse(); -#endif -#if defined(__LINUX_OSS__) - if ( api == LINUX_OSS ) - rtapi_ = new RtApiOss(); -#endif -#if defined(__WINDOWS_ASIO__) - if ( api == WINDOWS_ASIO ) - rtapi_ = new RtApiAsio(); -#endif -#if defined(__WINDOWS_WASAPI__) - if ( api == WINDOWS_WASAPI ) - rtapi_ = new RtApiWasapi(); -#endif -#if defined(__WINDOWS_DS__) - if ( api == WINDOWS_DS ) - rtapi_ = new RtApiDs(); -#endif -#if defined(__MACOSX_CORE__) - if ( api == MACOSX_CORE ) - rtapi_ = new RtApiCore(); -#endif -#if defined(__RTAUDIO_DUMMY__) - if ( api == RTAUDIO_DUMMY ) - rtapi_ = new RtApiDummy(); -#endif -} - -RtAudio :: RtAudio( RtAudio::Api api ) -{ - rtapi_ = 0; - - if ( api != UNSPECIFIED ) { - // Attempt to open the specified API. - openRtApi( api ); - if ( rtapi_ ) return; - - // No compiled support for specified API value. Issue a debug - // warning and continue as if no API was specified. - std::cerr << "\nRtAudio: no compiled support for specified API argument!\n" << std::endl; - } - - // Iterate through the compiled APIs and return as soon as we find - // one with at least one device or we reach the end of the list. - std::vector< RtAudio::Api > apis; - getCompiledApi( apis ); - for ( unsigned int i=0; igetDeviceCount() ) break; - } - - if ( rtapi_ ) return; - - // It should not be possible to get here because the preprocessor - // definition __RTAUDIO_DUMMY__ is automatically defined if no - // API-specific definitions are passed to the compiler. But just in - // case something weird happens, we'll thow an error. - std::string errorText = "\nRtAudio: no compiled API support found ... critical error!!\n\n"; - throw( RtAudioError( errorText, RtAudioError::UNSPECIFIED ) ); -} - -RtAudio :: ~RtAudio() throw() -{ - if ( rtapi_ ) - delete rtapi_; -} - -void RtAudio :: openStream( RtAudio::StreamParameters *outputParameters, - RtAudio::StreamParameters *inputParameters, - RtAudioFormat format, unsigned int sampleRate, - unsigned int *bufferFrames, - RtAudioCallback callback, void *userData, - RtAudio::StreamOptions *options, - RtAudioErrorCallback errorCallback ) -{ - return rtapi_->openStream( outputParameters, inputParameters, format, - sampleRate, bufferFrames, callback, - userData, options, errorCallback ); -} - -// *************************************************** // -// -// Public RtApi definitions (see end of file for -// private or protected utility functions). -// -// *************************************************** // - -RtApi :: RtApi() -{ - stream_.state = STREAM_CLOSED; - stream_.mode = UNINITIALIZED; - stream_.apiHandle = 0; - stream_.userBuffer[0] = 0; - stream_.userBuffer[1] = 0; - MUTEX_INITIALIZE( &stream_.mutex ); - showWarnings_ = true; - firstErrorOccurred_ = false; -} - -RtApi :: ~RtApi() -{ - MUTEX_DESTROY( &stream_.mutex ); -} - -void RtApi :: openStream( RtAudio::StreamParameters *oParams, - RtAudio::StreamParameters *iParams, - RtAudioFormat format, unsigned int sampleRate, - unsigned int *bufferFrames, - RtAudioCallback callback, void *userData, - RtAudio::StreamOptions *options, - RtAudioErrorCallback errorCallback ) -{ - if ( stream_.state != STREAM_CLOSED ) { - errorText_ = "RtApi::openStream: a stream is already open!"; - error( RtAudioError::INVALID_USE ); - return; - } - - // Clear stream information potentially left from a previously open stream. - clearStreamInfo(); - - if ( oParams && oParams->nChannels < 1 ) { - errorText_ = "RtApi::openStream: a non-NULL output StreamParameters structure cannot have an nChannels value less than one."; - error( RtAudioError::INVALID_USE ); - return; - } - - if ( iParams && iParams->nChannels < 1 ) { - errorText_ = "RtApi::openStream: a non-NULL input StreamParameters structure cannot have an nChannels value less than one."; - error( RtAudioError::INVALID_USE ); - return; - } - - if ( oParams == NULL && iParams == NULL ) { - errorText_ = "RtApi::openStream: input and output StreamParameters structures are both NULL!"; - error( RtAudioError::INVALID_USE ); - return; - } - - if ( formatBytes(format) == 0 ) { - errorText_ = "RtApi::openStream: 'format' parameter value is undefined."; - error( RtAudioError::INVALID_USE ); - return; - } - - unsigned int nDevices = getDeviceCount(); - unsigned int oChannels = 0; - if ( oParams ) { - oChannels = oParams->nChannels; - if ( oParams->deviceId >= nDevices ) { - errorText_ = "RtApi::openStream: output device parameter value is invalid."; - error( RtAudioError::INVALID_USE ); - return; - } - } - - unsigned int iChannels = 0; - if ( iParams ) { - iChannels = iParams->nChannels; - if ( iParams->deviceId >= nDevices ) { - errorText_ = "RtApi::openStream: input device parameter value is invalid."; - error( RtAudioError::INVALID_USE ); - return; - } - } - - bool result; - - if ( oChannels > 0 ) { - - result = probeDeviceOpen( oParams->deviceId, OUTPUT, oChannels, oParams->firstChannel, - sampleRate, format, bufferFrames, options ); - if ( result == false ) { - error( RtAudioError::SYSTEM_ERROR ); - return; - } - } - - if ( iChannels > 0 ) { - - result = probeDeviceOpen( iParams->deviceId, INPUT, iChannels, iParams->firstChannel, - sampleRate, format, bufferFrames, options ); - if ( result == false ) { - if ( oChannels > 0 ) closeStream(); - error( RtAudioError::SYSTEM_ERROR ); - return; - } - } - - stream_.callbackInfo.callback = (void *) callback; - stream_.callbackInfo.userData = userData; - stream_.callbackInfo.errorCallback = (void *) errorCallback; - - if ( options ) options->numberOfBuffers = stream_.nBuffers; - stream_.state = STREAM_STOPPED; -} - -unsigned int RtApi :: getDefaultInputDevice( void ) -{ - // Should be implemented in subclasses if possible. - return 0; -} - -unsigned int RtApi :: getDefaultOutputDevice( void ) -{ - // Should be implemented in subclasses if possible. - return 0; -} - -void RtApi :: closeStream( void ) -{ - // MUST be implemented in subclasses! - return; -} - -bool RtApi :: probeDeviceOpen( unsigned int /*device*/, StreamMode /*mode*/, unsigned int /*channels*/, - unsigned int /*firstChannel*/, unsigned int /*sampleRate*/, - RtAudioFormat /*format*/, unsigned int * /*bufferSize*/, - RtAudio::StreamOptions * /*options*/ ) -{ - // MUST be implemented in subclasses! - return FAILURE; -} - -void RtApi :: tickStreamTime( void ) -{ - // Subclasses that do not provide their own implementation of - // getStreamTime should call this function once per buffer I/O to - // provide basic stream time support. - - stream_.streamTime += ( stream_.bufferSize * 1.0 / stream_.sampleRate ); - -#if defined( HAVE_GETTIMEOFDAY ) - gettimeofday( &stream_.lastTickTimestamp, NULL ); -#endif -} - -long RtApi :: getStreamLatency( void ) -{ - verifyStream(); - - long totalLatency = 0; - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) - totalLatency = stream_.latency[0]; - if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) - totalLatency += stream_.latency[1]; - - return totalLatency; -} - -double RtApi :: getStreamTime( void ) -{ - verifyStream(); - -#if defined( HAVE_GETTIMEOFDAY ) - // Return a very accurate estimate of the stream time by - // adding in the elapsed time since the last tick. - struct timeval then; - struct timeval now; - - if ( stream_.state != STREAM_RUNNING || stream_.streamTime == 0.0 ) - return stream_.streamTime; - - gettimeofday( &now, NULL ); - then = stream_.lastTickTimestamp; - return stream_.streamTime + - ((now.tv_sec + 0.000001 * now.tv_usec) - - (then.tv_sec + 0.000001 * then.tv_usec)); -#else - return stream_.streamTime; -#endif -} - -void RtApi :: setStreamTime( double time ) -{ - verifyStream(); - - if ( time >= 0.0 ) - stream_.streamTime = time; -} - -unsigned int RtApi :: getStreamSampleRate( void ) -{ - verifyStream(); - - return stream_.sampleRate; -} - - -// *************************************************** // -// -// OS/API-specific methods. -// -// *************************************************** // - -#if defined(__MACOSX_CORE__) - -// The OS X CoreAudio API is designed to use a separate callback -// procedure for each of its audio devices. A single RtAudio duplex -// stream using two different devices is supported here, though it -// cannot be guaranteed to always behave correctly because we cannot -// synchronize these two callbacks. -// -// A property listener is installed for over/underrun information. -// However, no functionality is currently provided to allow property -// listeners to trigger user handlers because it is unclear what could -// be done if a critical stream parameter (buffer size, sample rate, -// device disconnect) notification arrived. The listeners entail -// quite a bit of extra code and most likely, a user program wouldn't -// be prepared for the result anyway. However, we do provide a flag -// to the client callback function to inform of an over/underrun. - -// A structure to hold various information related to the CoreAudio API -// implementation. -struct CoreHandle { - AudioDeviceID id[2]; // device ids -#if defined( MAC_OS_X_VERSION_10_5 ) && ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) - AudioDeviceIOProcID procId[2]; -#endif - UInt32 iStream[2]; // device stream index (or first if using multiple) - UInt32 nStreams[2]; // number of streams to use - bool xrun[2]; - char *deviceBuffer; - pthread_cond_t condition; - int drainCounter; // Tracks callback counts when draining - bool internalDrain; // Indicates if stop is initiated from callback or not. - - CoreHandle() - :deviceBuffer(0), drainCounter(0), internalDrain(false) { nStreams[0] = 1; nStreams[1] = 1; id[0] = 0; id[1] = 0; xrun[0] = false; xrun[1] = false; } -}; - -RtApiCore:: RtApiCore() -{ -#if defined( AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER ) - // This is a largely undocumented but absolutely necessary - // requirement starting with OS-X 10.6. If not called, queries and - // updates to various audio device properties are not handled - // correctly. - CFRunLoopRef theRunLoop = NULL; - AudioObjectPropertyAddress property = { kAudioHardwarePropertyRunLoop, - kAudioObjectPropertyScopeGlobal, - kAudioObjectPropertyElementMaster }; - OSStatus result = AudioObjectSetPropertyData( kAudioObjectSystemObject, &property, 0, NULL, sizeof(CFRunLoopRef), &theRunLoop); - if ( result != noErr ) { - errorText_ = "RtApiCore::RtApiCore: error setting run loop property!"; - error( RtAudioError::WARNING ); - } -#endif -} - -RtApiCore :: ~RtApiCore() -{ - // The subclass destructor gets called before the base class - // destructor, so close an existing stream before deallocating - // apiDeviceId memory. - if ( stream_.state != STREAM_CLOSED ) closeStream(); -} - -unsigned int RtApiCore :: getDeviceCount( void ) -{ - // Find out how many audio devices there are, if any. - UInt32 dataSize; - AudioObjectPropertyAddress propertyAddress = { kAudioHardwarePropertyDevices, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; - OSStatus result = AudioObjectGetPropertyDataSize( kAudioObjectSystemObject, &propertyAddress, 0, NULL, &dataSize ); - if ( result != noErr ) { - errorText_ = "RtApiCore::getDeviceCount: OS-X error getting device info!"; - error( RtAudioError::WARNING ); - return 0; - } - - return dataSize / sizeof( AudioDeviceID ); -} - -unsigned int RtApiCore :: getDefaultInputDevice( void ) -{ - unsigned int nDevices = getDeviceCount(); - if ( nDevices <= 1 ) return 0; - - AudioDeviceID id; - UInt32 dataSize = sizeof( AudioDeviceID ); - AudioObjectPropertyAddress property = { kAudioHardwarePropertyDefaultInputDevice, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; - OSStatus result = AudioObjectGetPropertyData( kAudioObjectSystemObject, &property, 0, NULL, &dataSize, &id ); - if ( result != noErr ) { - errorText_ = "RtApiCore::getDefaultInputDevice: OS-X system error getting device."; - error( RtAudioError::WARNING ); - return 0; - } - - dataSize *= nDevices; - AudioDeviceID deviceList[ nDevices ]; - property.mSelector = kAudioHardwarePropertyDevices; - result = AudioObjectGetPropertyData( kAudioObjectSystemObject, &property, 0, NULL, &dataSize, (void *) &deviceList ); - if ( result != noErr ) { - errorText_ = "RtApiCore::getDefaultInputDevice: OS-X system error getting device IDs."; - error( RtAudioError::WARNING ); - return 0; - } - - for ( unsigned int i=0; i= nDevices ) { - errorText_ = "RtApiCore::getDeviceInfo: device ID is invalid!"; - error( RtAudioError::INVALID_USE ); - return info; - } - - AudioDeviceID deviceList[ nDevices ]; - UInt32 dataSize = sizeof( AudioDeviceID ) * nDevices; - AudioObjectPropertyAddress property = { kAudioHardwarePropertyDevices, - kAudioObjectPropertyScopeGlobal, - kAudioObjectPropertyElementMaster }; - OSStatus result = AudioObjectGetPropertyData( kAudioObjectSystemObject, &property, - 0, NULL, &dataSize, (void *) &deviceList ); - if ( result != noErr ) { - errorText_ = "RtApiCore::getDeviceInfo: OS-X system error getting device IDs."; - error( RtAudioError::WARNING ); - return info; - } - - AudioDeviceID id = deviceList[ device ]; - - // Get the device name. - info.name.erase(); - CFStringRef cfname; - dataSize = sizeof( CFStringRef ); - property.mSelector = kAudioObjectPropertyManufacturer; - result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, &cfname ); - if ( result != noErr ) { - errorStream_ << "RtApiCore::probeDeviceInfo: system error (" << getErrorCode( result ) << ") getting device manufacturer."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - return info; - } - - //const char *mname = CFStringGetCStringPtr( cfname, CFStringGetSystemEncoding() ); - int length = CFStringGetLength(cfname); - char *mname = (char *)malloc(length * 3 + 1); -#if defined( UNICODE ) || defined( _UNICODE ) - CFStringGetCString(cfname, mname, length * 3 + 1, kCFStringEncodingUTF8); -#else - CFStringGetCString(cfname, mname, length * 3 + 1, CFStringGetSystemEncoding()); -#endif - info.name.append( (const char *)mname, strlen(mname) ); - info.name.append( ": " ); - CFRelease( cfname ); - free(mname); - - property.mSelector = kAudioObjectPropertyName; - result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, &cfname ); - if ( result != noErr ) { - errorStream_ << "RtApiCore::probeDeviceInfo: system error (" << getErrorCode( result ) << ") getting device name."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - return info; - } - - //const char *name = CFStringGetCStringPtr( cfname, CFStringGetSystemEncoding() ); - length = CFStringGetLength(cfname); - char *name = (char *)malloc(length * 3 + 1); -#if defined( UNICODE ) || defined( _UNICODE ) - CFStringGetCString(cfname, name, length * 3 + 1, kCFStringEncodingUTF8); -#else - CFStringGetCString(cfname, name, length * 3 + 1, CFStringGetSystemEncoding()); -#endif - info.name.append( (const char *)name, strlen(name) ); - CFRelease( cfname ); - free(name); - - // Get the output stream "configuration". - AudioBufferList *bufferList = nil; - property.mSelector = kAudioDevicePropertyStreamConfiguration; - property.mScope = kAudioDevicePropertyScopeOutput; - // property.mElement = kAudioObjectPropertyElementWildcard; - dataSize = 0; - result = AudioObjectGetPropertyDataSize( id, &property, 0, NULL, &dataSize ); - if ( result != noErr || dataSize == 0 ) { - errorStream_ << "RtApiCore::getDeviceInfo: system error (" << getErrorCode( result ) << ") getting output stream configuration info for device (" << device << ")."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - return info; - } - - // Allocate the AudioBufferList. - bufferList = (AudioBufferList *) malloc( dataSize ); - if ( bufferList == NULL ) { - errorText_ = "RtApiCore::getDeviceInfo: memory error allocating output AudioBufferList."; - error( RtAudioError::WARNING ); - return info; - } - - result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, bufferList ); - if ( result != noErr || dataSize == 0 ) { - free( bufferList ); - errorStream_ << "RtApiCore::getDeviceInfo: system error (" << getErrorCode( result ) << ") getting output stream configuration for device (" << device << ")."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - return info; - } - - // Get output channel information. - unsigned int i, nStreams = bufferList->mNumberBuffers; - for ( i=0; imBuffers[i].mNumberChannels; - free( bufferList ); - - // Get the input stream "configuration". - property.mScope = kAudioDevicePropertyScopeInput; - result = AudioObjectGetPropertyDataSize( id, &property, 0, NULL, &dataSize ); - if ( result != noErr || dataSize == 0 ) { - errorStream_ << "RtApiCore::getDeviceInfo: system error (" << getErrorCode( result ) << ") getting input stream configuration info for device (" << device << ")."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - return info; - } - - // Allocate the AudioBufferList. - bufferList = (AudioBufferList *) malloc( dataSize ); - if ( bufferList == NULL ) { - errorText_ = "RtApiCore::getDeviceInfo: memory error allocating input AudioBufferList."; - error( RtAudioError::WARNING ); - return info; - } - - result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, bufferList ); - if (result != noErr || dataSize == 0) { - free( bufferList ); - errorStream_ << "RtApiCore::getDeviceInfo: system error (" << getErrorCode( result ) << ") getting input stream configuration for device (" << device << ")."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - return info; - } - - // Get input channel information. - nStreams = bufferList->mNumberBuffers; - for ( i=0; imBuffers[i].mNumberChannels; - free( bufferList ); - - // If device opens for both playback and capture, we determine the channels. - if ( info.outputChannels > 0 && info.inputChannels > 0 ) - info.duplexChannels = (info.outputChannels > info.inputChannels) ? info.inputChannels : info.outputChannels; - - // Probe the device sample rates. - bool isInput = false; - if ( info.outputChannels == 0 ) isInput = true; - - // Determine the supported sample rates. - property.mSelector = kAudioDevicePropertyAvailableNominalSampleRates; - if ( isInput == false ) property.mScope = kAudioDevicePropertyScopeOutput; - result = AudioObjectGetPropertyDataSize( id, &property, 0, NULL, &dataSize ); - if ( result != kAudioHardwareNoError || dataSize == 0 ) { - errorStream_ << "RtApiCore::getDeviceInfo: system error (" << getErrorCode( result ) << ") getting sample rate info."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - return info; - } - - UInt32 nRanges = dataSize / sizeof( AudioValueRange ); - AudioValueRange rangeList[ nRanges ]; - result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, &rangeList ); - if ( result != kAudioHardwareNoError ) { - errorStream_ << "RtApiCore::getDeviceInfo: system error (" << getErrorCode( result ) << ") getting sample rates."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - return info; - } - - // The sample rate reporting mechanism is a bit of a mystery. It - // seems that it can either return individual rates or a range of - // rates. I assume that if the min / max range values are the same, - // then that represents a single supported rate and if the min / max - // range values are different, the device supports an arbitrary - // range of values (though there might be multiple ranges, so we'll - // use the most conservative range). - Float64 minimumRate = 1.0, maximumRate = 10000000000.0; - bool haveValueRange = false; - info.sampleRates.clear(); - for ( UInt32 i=0; i info.preferredSampleRate ) ) - info.preferredSampleRate = tmpSr; - - } else { - haveValueRange = true; - if ( rangeList[i].mMinimum > minimumRate ) minimumRate = rangeList[i].mMinimum; - if ( rangeList[i].mMaximum < maximumRate ) maximumRate = rangeList[i].mMaximum; - } - } - - if ( haveValueRange ) { - for ( unsigned int k=0; k= (unsigned int) minimumRate && SAMPLE_RATES[k] <= (unsigned int) maximumRate ) { - info.sampleRates.push_back( SAMPLE_RATES[k] ); - - if ( !info.preferredSampleRate || ( SAMPLE_RATES[k] <= 48000 && SAMPLE_RATES[k] > info.preferredSampleRate ) ) - info.preferredSampleRate = SAMPLE_RATES[k]; - } - } - } - - // Sort and remove any redundant values - std::sort( info.sampleRates.begin(), info.sampleRates.end() ); - info.sampleRates.erase( unique( info.sampleRates.begin(), info.sampleRates.end() ), info.sampleRates.end() ); - - if ( info.sampleRates.size() == 0 ) { - errorStream_ << "RtApiCore::probeDeviceInfo: No supported sample rates found for device (" << device << ")."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - return info; - } - - // CoreAudio always uses 32-bit floating point data for PCM streams. - // Thus, any other "physical" formats supported by the device are of - // no interest to the client. - info.nativeFormats = RTAUDIO_FLOAT32; - - if ( info.outputChannels > 0 ) - if ( getDefaultOutputDevice() == device ) info.isDefaultOutput = true; - if ( info.inputChannels > 0 ) - if ( getDefaultInputDevice() == device ) info.isDefaultInput = true; - - info.probed = true; - return info; -} - -static OSStatus callbackHandler( AudioDeviceID inDevice, - const AudioTimeStamp* /*inNow*/, - const AudioBufferList* inInputData, - const AudioTimeStamp* /*inInputTime*/, - AudioBufferList* outOutputData, - const AudioTimeStamp* /*inOutputTime*/, - void* infoPointer ) -{ - CallbackInfo *info = (CallbackInfo *) infoPointer; - - RtApiCore *object = (RtApiCore *) info->object; - if ( object->callbackEvent( inDevice, inInputData, outOutputData ) == false ) - return kAudioHardwareUnspecifiedError; - else - return kAudioHardwareNoError; -} - -static OSStatus xrunListener( AudioObjectID /*inDevice*/, - UInt32 nAddresses, - const AudioObjectPropertyAddress properties[], - void* handlePointer ) -{ - CoreHandle *handle = (CoreHandle *) handlePointer; - for ( UInt32 i=0; ixrun[1] = true; - else - handle->xrun[0] = true; - } - } - - return kAudioHardwareNoError; -} - -static OSStatus rateListener( AudioObjectID inDevice, - UInt32 /*nAddresses*/, - const AudioObjectPropertyAddress /*properties*/[], - void* ratePointer ) -{ - Float64 *rate = (Float64 *) ratePointer; - UInt32 dataSize = sizeof( Float64 ); - AudioObjectPropertyAddress property = { kAudioDevicePropertyNominalSampleRate, - kAudioObjectPropertyScopeGlobal, - kAudioObjectPropertyElementMaster }; - AudioObjectGetPropertyData( inDevice, &property, 0, NULL, &dataSize, rate ); - return kAudioHardwareNoError; -} - -bool RtApiCore :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, - unsigned int firstChannel, unsigned int sampleRate, - RtAudioFormat format, unsigned int *bufferSize, - RtAudio::StreamOptions *options ) -{ - // Get device ID - unsigned int nDevices = getDeviceCount(); - if ( nDevices == 0 ) { - // This should not happen because a check is made before this function is called. - errorText_ = "RtApiCore::probeDeviceOpen: no devices found!"; - return FAILURE; - } - - if ( device >= nDevices ) { - // This should not happen because a check is made before this function is called. - errorText_ = "RtApiCore::probeDeviceOpen: device ID is invalid!"; - return FAILURE; - } - - AudioDeviceID deviceList[ nDevices ]; - UInt32 dataSize = sizeof( AudioDeviceID ) * nDevices; - AudioObjectPropertyAddress property = { kAudioHardwarePropertyDevices, - kAudioObjectPropertyScopeGlobal, - kAudioObjectPropertyElementMaster }; - OSStatus result = AudioObjectGetPropertyData( kAudioObjectSystemObject, &property, - 0, NULL, &dataSize, (void *) &deviceList ); - if ( result != noErr ) { - errorText_ = "RtApiCore::probeDeviceOpen: OS-X system error getting device IDs."; - return FAILURE; - } - - AudioDeviceID id = deviceList[ device ]; - - // Setup for stream mode. - bool isInput = false; - if ( mode == INPUT ) { - isInput = true; - property.mScope = kAudioDevicePropertyScopeInput; - } - else - property.mScope = kAudioDevicePropertyScopeOutput; - - // Get the stream "configuration". - AudioBufferList *bufferList = nil; - dataSize = 0; - property.mSelector = kAudioDevicePropertyStreamConfiguration; - result = AudioObjectGetPropertyDataSize( id, &property, 0, NULL, &dataSize ); - if ( result != noErr || dataSize == 0 ) { - errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting stream configuration info for device (" << device << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Allocate the AudioBufferList. - bufferList = (AudioBufferList *) malloc( dataSize ); - if ( bufferList == NULL ) { - errorText_ = "RtApiCore::probeDeviceOpen: memory error allocating AudioBufferList."; - return FAILURE; - } - - result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, bufferList ); - if (result != noErr || dataSize == 0) { - free( bufferList ); - errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting stream configuration for device (" << device << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Search for one or more streams that contain the desired number of - // channels. CoreAudio devices can have an arbitrary number of - // streams and each stream can have an arbitrary number of channels. - // For each stream, a single buffer of interleaved samples is - // provided. RtAudio prefers the use of one stream of interleaved - // data or multiple consecutive single-channel streams. However, we - // now support multiple consecutive multi-channel streams of - // interleaved data as well. - UInt32 iStream, offsetCounter = firstChannel; - UInt32 nStreams = bufferList->mNumberBuffers; - bool monoMode = false; - bool foundStream = false; - - // First check that the device supports the requested number of - // channels. - UInt32 deviceChannels = 0; - for ( iStream=0; iStreammBuffers[iStream].mNumberChannels; - - if ( deviceChannels < ( channels + firstChannel ) ) { - free( bufferList ); - errorStream_ << "RtApiCore::probeDeviceOpen: the device (" << device << ") does not support the requested channel count."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Look for a single stream meeting our needs. - UInt32 firstStream, streamCount = 1, streamChannels = 0, channelOffset = 0; - for ( iStream=0; iStreammBuffers[iStream].mNumberChannels; - if ( streamChannels >= channels + offsetCounter ) { - firstStream = iStream; - channelOffset = offsetCounter; - foundStream = true; - break; - } - if ( streamChannels > offsetCounter ) break; - offsetCounter -= streamChannels; - } - - // If we didn't find a single stream above, then we should be able - // to meet the channel specification with multiple streams. - if ( foundStream == false ) { - monoMode = true; - offsetCounter = firstChannel; - for ( iStream=0; iStreammBuffers[iStream].mNumberChannels; - if ( streamChannels > offsetCounter ) break; - offsetCounter -= streamChannels; - } - - firstStream = iStream; - channelOffset = offsetCounter; - Int32 channelCounter = channels + offsetCounter - streamChannels; - - if ( streamChannels > 1 ) monoMode = false; - while ( channelCounter > 0 ) { - streamChannels = bufferList->mBuffers[++iStream].mNumberChannels; - if ( streamChannels > 1 ) monoMode = false; - channelCounter -= streamChannels; - streamCount++; - } - } - - free( bufferList ); - - // Determine the buffer size. - AudioValueRange bufferRange; - dataSize = sizeof( AudioValueRange ); - property.mSelector = kAudioDevicePropertyBufferFrameSizeRange; - result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, &bufferRange ); - - if ( result != noErr ) { - errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting buffer size range for device (" << device << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - if ( bufferRange.mMinimum > *bufferSize ) *bufferSize = (unsigned long) bufferRange.mMinimum; - else if ( bufferRange.mMaximum < *bufferSize ) *bufferSize = (unsigned long) bufferRange.mMaximum; - if ( options && options->flags & RTAUDIO_MINIMIZE_LATENCY ) *bufferSize = (unsigned long) bufferRange.mMinimum; - - // Set the buffer size. For multiple streams, I'm assuming we only - // need to make this setting for the master channel. - UInt32 theSize = (UInt32) *bufferSize; - dataSize = sizeof( UInt32 ); - property.mSelector = kAudioDevicePropertyBufferFrameSize; - result = AudioObjectSetPropertyData( id, &property, 0, NULL, dataSize, &theSize ); - - if ( result != noErr ) { - errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") setting the buffer size for device (" << device << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // If attempting to setup a duplex stream, the bufferSize parameter - // MUST be the same in both directions! - *bufferSize = theSize; - if ( stream_.mode == OUTPUT && mode == INPUT && *bufferSize != stream_.bufferSize ) { - errorStream_ << "RtApiCore::probeDeviceOpen: system error setting buffer size for duplex stream on device (" << device << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - stream_.bufferSize = *bufferSize; - stream_.nBuffers = 1; - - // Try to set "hog" mode ... it's not clear to me this is working. - if ( options && options->flags & RTAUDIO_HOG_DEVICE ) { - pid_t hog_pid; - dataSize = sizeof( hog_pid ); - property.mSelector = kAudioDevicePropertyHogMode; - result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, &hog_pid ); - if ( result != noErr ) { - errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting 'hog' state!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - - if ( hog_pid != getpid() ) { - hog_pid = getpid(); - result = AudioObjectSetPropertyData( id, &property, 0, NULL, dataSize, &hog_pid ); - if ( result != noErr ) { - errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") setting 'hog' state!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - } - } - - // Check and if necessary, change the sample rate for the device. - Float64 nominalRate; - dataSize = sizeof( Float64 ); - property.mSelector = kAudioDevicePropertyNominalSampleRate; - result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, &nominalRate ); - if ( result != noErr ) { - errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting current sample rate."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Only change the sample rate if off by more than 1 Hz. - if ( fabs( nominalRate - (double)sampleRate ) > 1.0 ) { - - // Set a property listener for the sample rate change - Float64 reportedRate = 0.0; - AudioObjectPropertyAddress tmp = { kAudioDevicePropertyNominalSampleRate, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; - result = AudioObjectAddPropertyListener( id, &tmp, rateListener, (void *) &reportedRate ); - if ( result != noErr ) { - errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") setting sample rate property listener for device (" << device << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - nominalRate = (Float64) sampleRate; - result = AudioObjectSetPropertyData( id, &property, 0, NULL, dataSize, &nominalRate ); - if ( result != noErr ) { - AudioObjectRemovePropertyListener( id, &tmp, rateListener, (void *) &reportedRate ); - errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") setting sample rate for device (" << device << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Now wait until the reported nominal rate is what we just set. - UInt32 microCounter = 0; - while ( reportedRate != nominalRate ) { - microCounter += 5000; - if ( microCounter > 5000000 ) break; - usleep( 5000 ); - } - - // Remove the property listener. - AudioObjectRemovePropertyListener( id, &tmp, rateListener, (void *) &reportedRate ); - - if ( microCounter > 5000000 ) { - errorStream_ << "RtApiCore::probeDeviceOpen: timeout waiting for sample rate update for device (" << device << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - } - - // Now set the stream format for all streams. Also, check the - // physical format of the device and change that if necessary. - AudioStreamBasicDescription description; - dataSize = sizeof( AudioStreamBasicDescription ); - property.mSelector = kAudioStreamPropertyVirtualFormat; - result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, &description ); - if ( result != noErr ) { - errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting stream format for device (" << device << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Set the sample rate and data format id. However, only make the - // change if the sample rate is not within 1.0 of the desired - // rate and the format is not linear pcm. - bool updateFormat = false; - if ( fabs( description.mSampleRate - (Float64)sampleRate ) > 1.0 ) { - description.mSampleRate = (Float64) sampleRate; - updateFormat = true; - } - - if ( description.mFormatID != kAudioFormatLinearPCM ) { - description.mFormatID = kAudioFormatLinearPCM; - updateFormat = true; - } - - if ( updateFormat ) { - result = AudioObjectSetPropertyData( id, &property, 0, NULL, dataSize, &description ); - if ( result != noErr ) { - errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") setting sample rate or data format for device (" << device << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - } - - // Now check the physical format. - property.mSelector = kAudioStreamPropertyPhysicalFormat; - result = AudioObjectGetPropertyData( id, &property, 0, NULL, &dataSize, &description ); - if ( result != noErr ) { - errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting stream physical format for device (" << device << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - //std::cout << "Current physical stream format:" << std::endl; - //std::cout << " mBitsPerChan = " << description.mBitsPerChannel << std::endl; - //std::cout << " aligned high = " << (description.mFormatFlags & kAudioFormatFlagIsAlignedHigh) << ", isPacked = " << (description.mFormatFlags & kAudioFormatFlagIsPacked) << std::endl; - //std::cout << " bytesPerFrame = " << description.mBytesPerFrame << std::endl; - //std::cout << " sample rate = " << description.mSampleRate << std::endl; - - if ( description.mFormatID != kAudioFormatLinearPCM || description.mBitsPerChannel < 16 ) { - description.mFormatID = kAudioFormatLinearPCM; - //description.mSampleRate = (Float64) sampleRate; - AudioStreamBasicDescription testDescription = description; - UInt32 formatFlags; - - // We'll try higher bit rates first and then work our way down. - std::vector< std::pair > physicalFormats; - formatFlags = (description.mFormatFlags | kLinearPCMFormatFlagIsFloat) & ~kLinearPCMFormatFlagIsSignedInteger; - physicalFormats.push_back( std::pair( 32, formatFlags ) ); - formatFlags = (description.mFormatFlags | kLinearPCMFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked) & ~kLinearPCMFormatFlagIsFloat; - physicalFormats.push_back( std::pair( 32, formatFlags ) ); - physicalFormats.push_back( std::pair( 24, formatFlags ) ); // 24-bit packed - formatFlags &= ~( kAudioFormatFlagIsPacked | kAudioFormatFlagIsAlignedHigh ); - physicalFormats.push_back( std::pair( 24.2, formatFlags ) ); // 24-bit in 4 bytes, aligned low - formatFlags |= kAudioFormatFlagIsAlignedHigh; - physicalFormats.push_back( std::pair( 24.4, formatFlags ) ); // 24-bit in 4 bytes, aligned high - formatFlags = (description.mFormatFlags | kLinearPCMFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked) & ~kLinearPCMFormatFlagIsFloat; - physicalFormats.push_back( std::pair( 16, formatFlags ) ); - physicalFormats.push_back( std::pair( 8, formatFlags ) ); - - bool setPhysicalFormat = false; - for( unsigned int i=0; iflags & RTAUDIO_NONINTERLEAVED ) stream_.userInterleaved = false; - else stream_.userInterleaved = true; - stream_.deviceInterleaved[mode] = true; - if ( monoMode == true ) stream_.deviceInterleaved[mode] = false; - - // Set flags for buffer conversion. - stream_.doConvertBuffer[mode] = false; - if ( stream_.userFormat != stream_.deviceFormat[mode] ) - stream_.doConvertBuffer[mode] = true; - if ( stream_.nUserChannels[mode] < stream_.nDeviceChannels[mode] ) - stream_.doConvertBuffer[mode] = true; - if ( streamCount == 1 ) { - if ( stream_.nUserChannels[mode] > 1 && - stream_.userInterleaved != stream_.deviceInterleaved[mode] ) - stream_.doConvertBuffer[mode] = true; - } - else if ( monoMode && stream_.userInterleaved ) - stream_.doConvertBuffer[mode] = true; - - // Allocate our CoreHandle structure for the stream. - CoreHandle *handle = 0; - if ( stream_.apiHandle == 0 ) { - try { - handle = new CoreHandle; - } - catch ( std::bad_alloc& ) { - errorText_ = "RtApiCore::probeDeviceOpen: error allocating CoreHandle memory."; - goto error; - } - - if ( pthread_cond_init( &handle->condition, NULL ) ) { - errorText_ = "RtApiCore::probeDeviceOpen: error initializing pthread condition variable."; - goto error; - } - stream_.apiHandle = (void *) handle; - } - else - handle = (CoreHandle *) stream_.apiHandle; - handle->iStream[mode] = firstStream; - handle->nStreams[mode] = streamCount; - handle->id[mode] = id; - - // Allocate necessary internal buffers. - unsigned long bufferBytes; - bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); - // stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); - stream_.userBuffer[mode] = (char *) malloc( bufferBytes * sizeof(char) ); - memset( stream_.userBuffer[mode], 0, bufferBytes * sizeof(char) ); - if ( stream_.userBuffer[mode] == NULL ) { - errorText_ = "RtApiCore::probeDeviceOpen: error allocating user buffer memory."; - goto error; - } - - // If possible, we will make use of the CoreAudio stream buffers as - // "device buffers". However, we can't do this if using multiple - // streams. - if ( stream_.doConvertBuffer[mode] && handle->nStreams[mode] > 1 ) { - - bool makeBuffer = true; - bufferBytes = stream_.nDeviceChannels[mode] * formatBytes( stream_.deviceFormat[mode] ); - if ( mode == INPUT ) { - if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { - unsigned long bytesOut = stream_.nDeviceChannels[0] * formatBytes( stream_.deviceFormat[0] ); - if ( bufferBytes <= bytesOut ) makeBuffer = false; - } - } - - if ( makeBuffer ) { - bufferBytes *= *bufferSize; - if ( stream_.deviceBuffer ) free( stream_.deviceBuffer ); - stream_.deviceBuffer = (char *) calloc( bufferBytes, 1 ); - if ( stream_.deviceBuffer == NULL ) { - errorText_ = "RtApiCore::probeDeviceOpen: error allocating device buffer memory."; - goto error; - } - } - } - - stream_.sampleRate = sampleRate; - stream_.device[mode] = device; - stream_.state = STREAM_STOPPED; - stream_.callbackInfo.object = (void *) this; - - // Setup the buffer conversion information structure. - if ( stream_.doConvertBuffer[mode] ) { - if ( streamCount > 1 ) setConvertInfo( mode, 0 ); - else setConvertInfo( mode, channelOffset ); - } - - if ( mode == INPUT && stream_.mode == OUTPUT && stream_.device[0] == device ) - // Only one callback procedure per device. - stream_.mode = DUPLEX; - else { -#if defined( MAC_OS_X_VERSION_10_5 ) && ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) - result = AudioDeviceCreateIOProcID( id, callbackHandler, (void *) &stream_.callbackInfo, &handle->procId[mode] ); -#else - // deprecated in favor of AudioDeviceCreateIOProcID() - result = AudioDeviceAddIOProc( id, callbackHandler, (void *) &stream_.callbackInfo ); -#endif - if ( result != noErr ) { - errorStream_ << "RtApiCore::probeDeviceOpen: system error setting callback for device (" << device << ")."; - errorText_ = errorStream_.str(); - goto error; - } - if ( stream_.mode == OUTPUT && mode == INPUT ) - stream_.mode = DUPLEX; - else - stream_.mode = mode; - } - - // Setup the device property listener for over/underload. - property.mSelector = kAudioDeviceProcessorOverload; - property.mScope = kAudioObjectPropertyScopeGlobal; - result = AudioObjectAddPropertyListener( id, &property, xrunListener, (void *) handle ); - - return SUCCESS; - - error: - if ( handle ) { - pthread_cond_destroy( &handle->condition ); - delete handle; - stream_.apiHandle = 0; - } - - for ( int i=0; i<2; i++ ) { - if ( stream_.userBuffer[i] ) { - free( stream_.userBuffer[i] ); - stream_.userBuffer[i] = 0; - } - } - - if ( stream_.deviceBuffer ) { - free( stream_.deviceBuffer ); - stream_.deviceBuffer = 0; - } - - stream_.state = STREAM_CLOSED; - return FAILURE; -} - -void RtApiCore :: closeStream( void ) -{ - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApiCore::closeStream(): no open stream to close!"; - error( RtAudioError::WARNING ); - return; - } - - CoreHandle *handle = (CoreHandle *) stream_.apiHandle; - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - if ( stream_.state == STREAM_RUNNING ) - AudioDeviceStop( handle->id[0], callbackHandler ); -#if defined( MAC_OS_X_VERSION_10_5 ) && ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) - AudioDeviceDestroyIOProcID( handle->id[0], handle->procId[0] ); -#else - // deprecated in favor of AudioDeviceDestroyIOProcID() - AudioDeviceRemoveIOProc( handle->id[0], callbackHandler ); -#endif - } - - if ( stream_.mode == INPUT || ( stream_.mode == DUPLEX && stream_.device[0] != stream_.device[1] ) ) { - if ( stream_.state == STREAM_RUNNING ) - AudioDeviceStop( handle->id[1], callbackHandler ); -#if defined( MAC_OS_X_VERSION_10_5 ) && ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) - AudioDeviceDestroyIOProcID( handle->id[1], handle->procId[1] ); -#else - // deprecated in favor of AudioDeviceDestroyIOProcID() - AudioDeviceRemoveIOProc( handle->id[1], callbackHandler ); -#endif - } - - for ( int i=0; i<2; i++ ) { - if ( stream_.userBuffer[i] ) { - free( stream_.userBuffer[i] ); - stream_.userBuffer[i] = 0; - } - } - - if ( stream_.deviceBuffer ) { - free( stream_.deviceBuffer ); - stream_.deviceBuffer = 0; - } - - // Destroy pthread condition variable. - pthread_cond_destroy( &handle->condition ); - delete handle; - stream_.apiHandle = 0; - - stream_.mode = UNINITIALIZED; - stream_.state = STREAM_CLOSED; -} - -void RtApiCore :: startStream( void ) -{ - verifyStream(); - if ( stream_.state == STREAM_RUNNING ) { - errorText_ = "RtApiCore::startStream(): the stream is already running!"; - error( RtAudioError::WARNING ); - return; - } - - OSStatus result = noErr; - CoreHandle *handle = (CoreHandle *) stream_.apiHandle; - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - - result = AudioDeviceStart( handle->id[0], callbackHandler ); - if ( result != noErr ) { - errorStream_ << "RtApiCore::startStream: system error (" << getErrorCode( result ) << ") starting callback procedure on device (" << stream_.device[0] << ")."; - errorText_ = errorStream_.str(); - goto unlock; - } - } - - if ( stream_.mode == INPUT || - ( stream_.mode == DUPLEX && stream_.device[0] != stream_.device[1] ) ) { - - result = AudioDeviceStart( handle->id[1], callbackHandler ); - if ( result != noErr ) { - errorStream_ << "RtApiCore::startStream: system error starting input callback procedure on device (" << stream_.device[1] << ")."; - errorText_ = errorStream_.str(); - goto unlock; - } - } - - handle->drainCounter = 0; - handle->internalDrain = false; - stream_.state = STREAM_RUNNING; - - unlock: - if ( result == noErr ) return; - error( RtAudioError::SYSTEM_ERROR ); -} - -void RtApiCore :: stopStream( void ) -{ - verifyStream(); - if ( stream_.state == STREAM_STOPPED ) { - errorText_ = "RtApiCore::stopStream(): the stream is already stopped!"; - error( RtAudioError::WARNING ); - return; - } - - OSStatus result = noErr; - CoreHandle *handle = (CoreHandle *) stream_.apiHandle; - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - - if ( handle->drainCounter == 0 ) { - handle->drainCounter = 2; - pthread_cond_wait( &handle->condition, &stream_.mutex ); // block until signaled - } - - result = AudioDeviceStop( handle->id[0], callbackHandler ); - if ( result != noErr ) { - errorStream_ << "RtApiCore::stopStream: system error (" << getErrorCode( result ) << ") stopping callback procedure on device (" << stream_.device[0] << ")."; - errorText_ = errorStream_.str(); - goto unlock; - } - } - - if ( stream_.mode == INPUT || ( stream_.mode == DUPLEX && stream_.device[0] != stream_.device[1] ) ) { - - result = AudioDeviceStop( handle->id[1], callbackHandler ); - if ( result != noErr ) { - errorStream_ << "RtApiCore::stopStream: system error (" << getErrorCode( result ) << ") stopping input callback procedure on device (" << stream_.device[1] << ")."; - errorText_ = errorStream_.str(); - goto unlock; - } - } - - stream_.state = STREAM_STOPPED; - - unlock: - if ( result == noErr ) return; - error( RtAudioError::SYSTEM_ERROR ); -} - -void RtApiCore :: abortStream( void ) -{ - verifyStream(); - if ( stream_.state == STREAM_STOPPED ) { - errorText_ = "RtApiCore::abortStream(): the stream is already stopped!"; - error( RtAudioError::WARNING ); - return; - } - - CoreHandle *handle = (CoreHandle *) stream_.apiHandle; - handle->drainCounter = 2; - - stopStream(); -} - -// This function will be called by a spawned thread when the user -// callback function signals that the stream should be stopped or -// aborted. It is better to handle it this way because the -// callbackEvent() function probably should return before the AudioDeviceStop() -// function is called. -static void *coreStopStream( void *ptr ) -{ - CallbackInfo *info = (CallbackInfo *) ptr; - RtApiCore *object = (RtApiCore *) info->object; - - object->stopStream(); - pthread_exit( NULL ); -} - -bool RtApiCore :: callbackEvent( AudioDeviceID deviceId, - const AudioBufferList *inBufferList, - const AudioBufferList *outBufferList ) -{ - if ( stream_.state == STREAM_STOPPED || stream_.state == STREAM_STOPPING ) return SUCCESS; - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApiCore::callbackEvent(): the stream is closed ... this shouldn't happen!"; - error( RtAudioError::WARNING ); - return FAILURE; - } - - CallbackInfo *info = (CallbackInfo *) &stream_.callbackInfo; - CoreHandle *handle = (CoreHandle *) stream_.apiHandle; - - // Check if we were draining the stream and signal is finished. - if ( handle->drainCounter > 3 ) { - ThreadHandle threadId; - - stream_.state = STREAM_STOPPING; - if ( handle->internalDrain == true ) - pthread_create( &threadId, NULL, coreStopStream, info ); - else // external call to stopStream() - pthread_cond_signal( &handle->condition ); - return SUCCESS; - } - - AudioDeviceID outputDevice = handle->id[0]; - - // Invoke user callback to get fresh output data UNLESS we are - // draining stream or duplex mode AND the input/output devices are - // different AND this function is called for the input device. - if ( handle->drainCounter == 0 && ( stream_.mode != DUPLEX || deviceId == outputDevice ) ) { - RtAudioCallback callback = (RtAudioCallback) info->callback; - double streamTime = getStreamTime(); - RtAudioStreamStatus status = 0; - if ( stream_.mode != INPUT && handle->xrun[0] == true ) { - status |= RTAUDIO_OUTPUT_UNDERFLOW; - handle->xrun[0] = false; - } - if ( stream_.mode != OUTPUT && handle->xrun[1] == true ) { - status |= RTAUDIO_INPUT_OVERFLOW; - handle->xrun[1] = false; - } - - int cbReturnValue = callback( stream_.userBuffer[0], stream_.userBuffer[1], - stream_.bufferSize, streamTime, status, info->userData ); - if ( cbReturnValue == 2 ) { - stream_.state = STREAM_STOPPING; - handle->drainCounter = 2; - abortStream(); - return SUCCESS; - } - else if ( cbReturnValue == 1 ) { - handle->drainCounter = 1; - handle->internalDrain = true; - } - } - - if ( stream_.mode == OUTPUT || ( stream_.mode == DUPLEX && deviceId == outputDevice ) ) { - - if ( handle->drainCounter > 1 ) { // write zeros to the output stream - - if ( handle->nStreams[0] == 1 ) { - memset( outBufferList->mBuffers[handle->iStream[0]].mData, - 0, - outBufferList->mBuffers[handle->iStream[0]].mDataByteSize ); - } - else { // fill multiple streams with zeros - for ( unsigned int i=0; inStreams[0]; i++ ) { - memset( outBufferList->mBuffers[handle->iStream[0]+i].mData, - 0, - outBufferList->mBuffers[handle->iStream[0]+i].mDataByteSize ); - } - } - } - else if ( handle->nStreams[0] == 1 ) { - if ( stream_.doConvertBuffer[0] ) { // convert directly to CoreAudio stream buffer - convertBuffer( (char *) outBufferList->mBuffers[handle->iStream[0]].mData, - stream_.userBuffer[0], stream_.convertInfo[0] ); - } - else { // copy from user buffer - memcpy( outBufferList->mBuffers[handle->iStream[0]].mData, - stream_.userBuffer[0], - outBufferList->mBuffers[handle->iStream[0]].mDataByteSize ); - } - } - else { // fill multiple streams - Float32 *inBuffer = (Float32 *) stream_.userBuffer[0]; - if ( stream_.doConvertBuffer[0] ) { - convertBuffer( stream_.deviceBuffer, stream_.userBuffer[0], stream_.convertInfo[0] ); - inBuffer = (Float32 *) stream_.deviceBuffer; - } - - if ( stream_.deviceInterleaved[0] == false ) { // mono mode - UInt32 bufferBytes = outBufferList->mBuffers[handle->iStream[0]].mDataByteSize; - for ( unsigned int i=0; imBuffers[handle->iStream[0]+i].mData, - (void *)&inBuffer[i*stream_.bufferSize], bufferBytes ); - } - } - else { // fill multiple multi-channel streams with interleaved data - UInt32 streamChannels, channelsLeft, inJump, outJump, inOffset; - Float32 *out, *in; - - bool inInterleaved = ( stream_.userInterleaved ) ? true : false; - UInt32 inChannels = stream_.nUserChannels[0]; - if ( stream_.doConvertBuffer[0] ) { - inInterleaved = true; // device buffer will always be interleaved for nStreams > 1 and not mono mode - inChannels = stream_.nDeviceChannels[0]; - } - - if ( inInterleaved ) inOffset = 1; - else inOffset = stream_.bufferSize; - - channelsLeft = inChannels; - for ( unsigned int i=0; inStreams[0]; i++ ) { - in = inBuffer; - out = (Float32 *) outBufferList->mBuffers[handle->iStream[0]+i].mData; - streamChannels = outBufferList->mBuffers[handle->iStream[0]+i].mNumberChannels; - - outJump = 0; - // Account for possible channel offset in first stream - if ( i == 0 && stream_.channelOffset[0] > 0 ) { - streamChannels -= stream_.channelOffset[0]; - outJump = stream_.channelOffset[0]; - out += outJump; - } - - // Account for possible unfilled channels at end of the last stream - if ( streamChannels > channelsLeft ) { - outJump = streamChannels - channelsLeft; - streamChannels = channelsLeft; - } - - // Determine input buffer offsets and skips - if ( inInterleaved ) { - inJump = inChannels; - in += inChannels - channelsLeft; - } - else { - inJump = 1; - in += (inChannels - channelsLeft) * inOffset; - } - - for ( unsigned int i=0; idrainCounter ) { - handle->drainCounter++; - goto unlock; - } - - AudioDeviceID inputDevice; - inputDevice = handle->id[1]; - if ( stream_.mode == INPUT || ( stream_.mode == DUPLEX && deviceId == inputDevice ) ) { - - if ( handle->nStreams[1] == 1 ) { - if ( stream_.doConvertBuffer[1] ) { // convert directly from CoreAudio stream buffer - convertBuffer( stream_.userBuffer[1], - (char *) inBufferList->mBuffers[handle->iStream[1]].mData, - stream_.convertInfo[1] ); - } - else { // copy to user buffer - memcpy( stream_.userBuffer[1], - inBufferList->mBuffers[handle->iStream[1]].mData, - inBufferList->mBuffers[handle->iStream[1]].mDataByteSize ); - } - } - else { // read from multiple streams - Float32 *outBuffer = (Float32 *) stream_.userBuffer[1]; - if ( stream_.doConvertBuffer[1] ) outBuffer = (Float32 *) stream_.deviceBuffer; - - if ( stream_.deviceInterleaved[1] == false ) { // mono mode - UInt32 bufferBytes = inBufferList->mBuffers[handle->iStream[1]].mDataByteSize; - for ( unsigned int i=0; imBuffers[handle->iStream[1]+i].mData, bufferBytes ); - } - } - else { // read from multiple multi-channel streams - UInt32 streamChannels, channelsLeft, inJump, outJump, outOffset; - Float32 *out, *in; - - bool outInterleaved = ( stream_.userInterleaved ) ? true : false; - UInt32 outChannels = stream_.nUserChannels[1]; - if ( stream_.doConvertBuffer[1] ) { - outInterleaved = true; // device buffer will always be interleaved for nStreams > 1 and not mono mode - outChannels = stream_.nDeviceChannels[1]; - } - - if ( outInterleaved ) outOffset = 1; - else outOffset = stream_.bufferSize; - - channelsLeft = outChannels; - for ( unsigned int i=0; inStreams[1]; i++ ) { - out = outBuffer; - in = (Float32 *) inBufferList->mBuffers[handle->iStream[1]+i].mData; - streamChannels = inBufferList->mBuffers[handle->iStream[1]+i].mNumberChannels; - - inJump = 0; - // Account for possible channel offset in first stream - if ( i == 0 && stream_.channelOffset[1] > 0 ) { - streamChannels -= stream_.channelOffset[1]; - inJump = stream_.channelOffset[1]; - in += inJump; - } - - // Account for possible unread channels at end of the last stream - if ( streamChannels > channelsLeft ) { - inJump = streamChannels - channelsLeft; - streamChannels = channelsLeft; - } - - // Determine output buffer offsets and skips - if ( outInterleaved ) { - outJump = outChannels; - out += outChannels - channelsLeft; - } - else { - outJump = 1; - out += (outChannels - channelsLeft) * outOffset; - } - - for ( unsigned int i=0; i -#include -#include - -// A structure to hold various information related to the Jack API -// implementation. -struct JackHandle { - jack_client_t *client; - jack_port_t **ports[2]; - std::string deviceName[2]; - bool xrun[2]; - pthread_cond_t condition; - int drainCounter; // Tracks callback counts when draining - bool internalDrain; // Indicates if stop is initiated from callback or not. - - JackHandle() - :client(0), drainCounter(0), internalDrain(false) { ports[0] = 0; ports[1] = 0; xrun[0] = false; xrun[1] = false; } -}; - -static void jackSilentError( const char * ) {}; - -RtApiJack :: RtApiJack() -{ - // Nothing to do here. -#if !defined(__RTAUDIO_DEBUG__) - // Turn off Jack's internal error reporting. - jack_set_error_function( &jackSilentError ); -#endif -} - -RtApiJack :: ~RtApiJack() -{ - if ( stream_.state != STREAM_CLOSED ) closeStream(); -} - -unsigned int RtApiJack :: getDeviceCount( void ) -{ - // See if we can become a jack client. - jack_options_t options = (jack_options_t) ( JackNoStartServer ); //JackNullOption; - jack_status_t *status = NULL; - jack_client_t *client = jack_client_open( "RtApiJackCount", options, status ); - if ( client == 0 ) return 0; - - const char **ports; - std::string port, previousPort; - unsigned int nChannels = 0, nDevices = 0; - ports = jack_get_ports( client, NULL, NULL, 0 ); - if ( ports ) { - // Parse the port names up to the first colon (:). - size_t iColon = 0; - do { - port = (char *) ports[ nChannels ]; - iColon = port.find(":"); - if ( iColon != std::string::npos ) { - port = port.substr( 0, iColon + 1 ); - if ( port != previousPort ) { - nDevices++; - previousPort = port; - } - } - } while ( ports[++nChannels] ); - free( ports ); - } - - jack_client_close( client ); - return nDevices; -} - -RtAudio::DeviceInfo RtApiJack :: getDeviceInfo( unsigned int device ) -{ - RtAudio::DeviceInfo info; - info.probed = false; - - jack_options_t options = (jack_options_t) ( JackNoStartServer ); //JackNullOption - jack_status_t *status = NULL; - jack_client_t *client = jack_client_open( "RtApiJackInfo", options, status ); - if ( client == 0 ) { - errorText_ = "RtApiJack::getDeviceInfo: Jack server not found or connection error!"; - error( RtAudioError::WARNING ); - return info; - } - - const char **ports; - std::string port, previousPort; - unsigned int nPorts = 0, nDevices = 0; - ports = jack_get_ports( client, NULL, NULL, 0 ); - if ( ports ) { - // Parse the port names up to the first colon (:). - size_t iColon = 0; - do { - port = (char *) ports[ nPorts ]; - iColon = port.find(":"); - if ( iColon != std::string::npos ) { - port = port.substr( 0, iColon ); - if ( port != previousPort ) { - if ( nDevices == device ) info.name = port; - nDevices++; - previousPort = port; - } - } - } while ( ports[++nPorts] ); - free( ports ); - } - - if ( device >= nDevices ) { - jack_client_close( client ); - errorText_ = "RtApiJack::getDeviceInfo: device ID is invalid!"; - error( RtAudioError::INVALID_USE ); - return info; - } - - // Get the current jack server sample rate. - info.sampleRates.clear(); - - info.preferredSampleRate = jack_get_sample_rate( client ); - info.sampleRates.push_back( info.preferredSampleRate ); - - // Count the available ports containing the client name as device - // channels. Jack "input ports" equal RtAudio output channels. - unsigned int nChannels = 0; - ports = jack_get_ports( client, info.name.c_str(), NULL, JackPortIsInput ); - if ( ports ) { - while ( ports[ nChannels ] ) nChannels++; - free( ports ); - info.outputChannels = nChannels; - } - - // Jack "output ports" equal RtAudio input channels. - nChannels = 0; - ports = jack_get_ports( client, info.name.c_str(), NULL, JackPortIsOutput ); - if ( ports ) { - while ( ports[ nChannels ] ) nChannels++; - free( ports ); - info.inputChannels = nChannels; - } - - if ( info.outputChannels == 0 && info.inputChannels == 0 ) { - jack_client_close(client); - errorText_ = "RtApiJack::getDeviceInfo: error determining Jack input/output channels!"; - error( RtAudioError::WARNING ); - return info; - } - - // If device opens for both playback and capture, we determine the channels. - if ( info.outputChannels > 0 && info.inputChannels > 0 ) - info.duplexChannels = (info.outputChannels > info.inputChannels) ? info.inputChannels : info.outputChannels; - - // Jack always uses 32-bit floats. - info.nativeFormats = RTAUDIO_FLOAT32; - - // Jack doesn't provide default devices so we'll use the first available one. - if ( device == 0 && info.outputChannels > 0 ) - info.isDefaultOutput = true; - if ( device == 0 && info.inputChannels > 0 ) - info.isDefaultInput = true; - - jack_client_close(client); - info.probed = true; - return info; -} - -static int jackCallbackHandler( jack_nframes_t nframes, void *infoPointer ) -{ - CallbackInfo *info = (CallbackInfo *) infoPointer; - - RtApiJack *object = (RtApiJack *) info->object; - if ( object->callbackEvent( (unsigned long) nframes ) == false ) return 1; - - return 0; -} - -// This function will be called by a spawned thread when the Jack -// server signals that it is shutting down. It is necessary to handle -// it this way because the jackShutdown() function must return before -// the jack_deactivate() function (in closeStream()) will return. -static void *jackCloseStream( void *ptr ) -{ - CallbackInfo *info = (CallbackInfo *) ptr; - RtApiJack *object = (RtApiJack *) info->object; - - object->closeStream(); - - pthread_exit( NULL ); -} -static void jackShutdown( void *infoPointer ) -{ - CallbackInfo *info = (CallbackInfo *) infoPointer; - RtApiJack *object = (RtApiJack *) info->object; - - // Check current stream state. If stopped, then we'll assume this - // was called as a result of a call to RtApiJack::stopStream (the - // deactivation of a client handle causes this function to be called). - // If not, we'll assume the Jack server is shutting down or some - // other problem occurred and we should close the stream. - if ( object->isStreamRunning() == false ) return; - - ThreadHandle threadId; - pthread_create( &threadId, NULL, jackCloseStream, info ); - std::cerr << "\nRtApiJack: the Jack server is shutting down this client ... stream stopped and closed!!\n" << std::endl; -} - -static int jackXrun( void *infoPointer ) -{ - JackHandle *handle = (JackHandle *) infoPointer; - - if ( handle->ports[0] ) handle->xrun[0] = true; - if ( handle->ports[1] ) handle->xrun[1] = true; - - return 0; -} - -bool RtApiJack :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, - unsigned int firstChannel, unsigned int sampleRate, - RtAudioFormat format, unsigned int *bufferSize, - RtAudio::StreamOptions *options ) -{ - JackHandle *handle = (JackHandle *) stream_.apiHandle; - - // Look for jack server and try to become a client (only do once per stream). - jack_client_t *client = 0; - if ( mode == OUTPUT || ( mode == INPUT && stream_.mode != OUTPUT ) ) { - jack_options_t jackoptions = (jack_options_t) ( JackNoStartServer ); //JackNullOption; - jack_status_t *status = NULL; - if ( options && !options->streamName.empty() ) - client = jack_client_open( options->streamName.c_str(), jackoptions, status ); - else - client = jack_client_open( "RtApiJack", jackoptions, status ); - if ( client == 0 ) { - errorText_ = "RtApiJack::probeDeviceOpen: Jack server not found or connection error!"; - error( RtAudioError::WARNING ); - return FAILURE; - } - } - else { - // The handle must have been created on an earlier pass. - client = handle->client; - } - - const char **ports; - std::string port, previousPort, deviceName; - unsigned int nPorts = 0, nDevices = 0; - ports = jack_get_ports( client, NULL, NULL, 0 ); - if ( ports ) { - // Parse the port names up to the first colon (:). - size_t iColon = 0; - do { - port = (char *) ports[ nPorts ]; - iColon = port.find(":"); - if ( iColon != std::string::npos ) { - port = port.substr( 0, iColon ); - if ( port != previousPort ) { - if ( nDevices == device ) deviceName = port; - nDevices++; - previousPort = port; - } - } - } while ( ports[++nPorts] ); - free( ports ); - } - - if ( device >= nDevices ) { - errorText_ = "RtApiJack::probeDeviceOpen: device ID is invalid!"; - return FAILURE; - } - - // Count the available ports containing the client name as device - // channels. Jack "input ports" equal RtAudio output channels. - unsigned int nChannels = 0; - unsigned long flag = JackPortIsInput; - if ( mode == INPUT ) flag = JackPortIsOutput; - ports = jack_get_ports( client, deviceName.c_str(), NULL, flag ); - if ( ports ) { - while ( ports[ nChannels ] ) nChannels++; - free( ports ); - } - - // Compare the jack ports for specified client to the requested number of channels. - if ( nChannels < (channels + firstChannel) ) { - errorStream_ << "RtApiJack::probeDeviceOpen: requested number of channels (" << channels << ") + offset (" << firstChannel << ") not found for specified device (" << device << ":" << deviceName << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Check the jack server sample rate. - unsigned int jackRate = jack_get_sample_rate( client ); - if ( sampleRate != jackRate ) { - jack_client_close( client ); - errorStream_ << "RtApiJack::probeDeviceOpen: the requested sample rate (" << sampleRate << ") is different than the JACK server rate (" << jackRate << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - stream_.sampleRate = jackRate; - - // Get the latency of the JACK port. - ports = jack_get_ports( client, deviceName.c_str(), NULL, flag ); - if ( ports[ firstChannel ] ) { - // Added by Ge Wang - jack_latency_callback_mode_t cbmode = (mode == INPUT ? JackCaptureLatency : JackPlaybackLatency); - // the range (usually the min and max are equal) - jack_latency_range_t latrange; latrange.min = latrange.max = 0; - // get the latency range - jack_port_get_latency_range( jack_port_by_name( client, ports[firstChannel] ), cbmode, &latrange ); - // be optimistic, use the min! - stream_.latency[mode] = latrange.min; - //stream_.latency[mode] = jack_port_get_latency( jack_port_by_name( client, ports[ firstChannel ] ) ); - } - free( ports ); - - // The jack server always uses 32-bit floating-point data. - stream_.deviceFormat[mode] = RTAUDIO_FLOAT32; - stream_.userFormat = format; - - if ( options && options->flags & RTAUDIO_NONINTERLEAVED ) stream_.userInterleaved = false; - else stream_.userInterleaved = true; - - // Jack always uses non-interleaved buffers. - stream_.deviceInterleaved[mode] = false; - - // Jack always provides host byte-ordered data. - stream_.doByteSwap[mode] = false; - - // Get the buffer size. The buffer size and number of buffers - // (periods) is set when the jack server is started. - stream_.bufferSize = (int) jack_get_buffer_size( client ); - *bufferSize = stream_.bufferSize; - - stream_.nDeviceChannels[mode] = channels; - stream_.nUserChannels[mode] = channels; - - // Set flags for buffer conversion. - stream_.doConvertBuffer[mode] = false; - if ( stream_.userFormat != stream_.deviceFormat[mode] ) - stream_.doConvertBuffer[mode] = true; - if ( stream_.userInterleaved != stream_.deviceInterleaved[mode] && - stream_.nUserChannels[mode] > 1 ) - stream_.doConvertBuffer[mode] = true; - - // Allocate our JackHandle structure for the stream. - if ( handle == 0 ) { - try { - handle = new JackHandle; - } - catch ( std::bad_alloc& ) { - errorText_ = "RtApiJack::probeDeviceOpen: error allocating JackHandle memory."; - goto error; - } - - if ( pthread_cond_init(&handle->condition, NULL) ) { - errorText_ = "RtApiJack::probeDeviceOpen: error initializing pthread condition variable."; - goto error; - } - stream_.apiHandle = (void *) handle; - handle->client = client; - } - handle->deviceName[mode] = deviceName; - - // Allocate necessary internal buffers. - unsigned long bufferBytes; - bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); - stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); - if ( stream_.userBuffer[mode] == NULL ) { - errorText_ = "RtApiJack::probeDeviceOpen: error allocating user buffer memory."; - goto error; - } - - if ( stream_.doConvertBuffer[mode] ) { - - bool makeBuffer = true; - if ( mode == OUTPUT ) - bufferBytes = stream_.nDeviceChannels[0] * formatBytes( stream_.deviceFormat[0] ); - else { // mode == INPUT - bufferBytes = stream_.nDeviceChannels[1] * formatBytes( stream_.deviceFormat[1] ); - if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { - unsigned long bytesOut = stream_.nDeviceChannels[0] * formatBytes(stream_.deviceFormat[0]); - if ( bufferBytes < bytesOut ) makeBuffer = false; - } - } - - if ( makeBuffer ) { - bufferBytes *= *bufferSize; - if ( stream_.deviceBuffer ) free( stream_.deviceBuffer ); - stream_.deviceBuffer = (char *) calloc( bufferBytes, 1 ); - if ( stream_.deviceBuffer == NULL ) { - errorText_ = "RtApiJack::probeDeviceOpen: error allocating device buffer memory."; - goto error; - } - } - } - - // Allocate memory for the Jack ports (channels) identifiers. - handle->ports[mode] = (jack_port_t **) malloc ( sizeof (jack_port_t *) * channels ); - if ( handle->ports[mode] == NULL ) { - errorText_ = "RtApiJack::probeDeviceOpen: error allocating port memory."; - goto error; - } - - stream_.device[mode] = device; - stream_.channelOffset[mode] = firstChannel; - stream_.state = STREAM_STOPPED; - stream_.callbackInfo.object = (void *) this; - - if ( stream_.mode == OUTPUT && mode == INPUT ) - // We had already set up the stream for output. - stream_.mode = DUPLEX; - else { - stream_.mode = mode; - jack_set_process_callback( handle->client, jackCallbackHandler, (void *) &stream_.callbackInfo ); - jack_set_xrun_callback( handle->client, jackXrun, (void *) &handle ); - jack_on_shutdown( handle->client, jackShutdown, (void *) &stream_.callbackInfo ); - } - - // Register our ports. - char label[64]; - if ( mode == OUTPUT ) { - for ( unsigned int i=0; iports[0][i] = jack_port_register( handle->client, (const char *)label, - JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0 ); - } - } - else { - for ( unsigned int i=0; iports[1][i] = jack_port_register( handle->client, (const char *)label, - JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0 ); - } - } - - // Setup the buffer conversion information structure. We don't use - // buffers to do channel offsets, so we override that parameter - // here. - if ( stream_.doConvertBuffer[mode] ) setConvertInfo( mode, 0 ); - - return SUCCESS; - - error: - if ( handle ) { - pthread_cond_destroy( &handle->condition ); - jack_client_close( handle->client ); - - if ( handle->ports[0] ) free( handle->ports[0] ); - if ( handle->ports[1] ) free( handle->ports[1] ); - - delete handle; - stream_.apiHandle = 0; - } - - for ( int i=0; i<2; i++ ) { - if ( stream_.userBuffer[i] ) { - free( stream_.userBuffer[i] ); - stream_.userBuffer[i] = 0; - } - } - - if ( stream_.deviceBuffer ) { - free( stream_.deviceBuffer ); - stream_.deviceBuffer = 0; - } - - return FAILURE; -} - -void RtApiJack :: closeStream( void ) -{ - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApiJack::closeStream(): no open stream to close!"; - error( RtAudioError::WARNING ); - return; - } - - JackHandle *handle = (JackHandle *) stream_.apiHandle; - if ( handle ) { - - if ( stream_.state == STREAM_RUNNING ) - jack_deactivate( handle->client ); - - jack_client_close( handle->client ); - } - - if ( handle ) { - if ( handle->ports[0] ) free( handle->ports[0] ); - if ( handle->ports[1] ) free( handle->ports[1] ); - pthread_cond_destroy( &handle->condition ); - delete handle; - stream_.apiHandle = 0; - } - - for ( int i=0; i<2; i++ ) { - if ( stream_.userBuffer[i] ) { - free( stream_.userBuffer[i] ); - stream_.userBuffer[i] = 0; - } - } - - if ( stream_.deviceBuffer ) { - free( stream_.deviceBuffer ); - stream_.deviceBuffer = 0; - } - - stream_.mode = UNINITIALIZED; - stream_.state = STREAM_CLOSED; -} - -void RtApiJack :: startStream( void ) -{ - verifyStream(); - if ( stream_.state == STREAM_RUNNING ) { - errorText_ = "RtApiJack::startStream(): the stream is already running!"; - error( RtAudioError::WARNING ); - return; - } - - JackHandle *handle = (JackHandle *) stream_.apiHandle; - int result = jack_activate( handle->client ); - if ( result ) { - errorText_ = "RtApiJack::startStream(): unable to activate JACK client!"; - goto unlock; - } - - const char **ports; - - // Get the list of available ports. - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - result = 1; - ports = jack_get_ports( handle->client, handle->deviceName[0].c_str(), NULL, JackPortIsInput); - if ( ports == NULL) { - errorText_ = "RtApiJack::startStream(): error determining available JACK input ports!"; - goto unlock; - } - - // Now make the port connections. Since RtAudio wasn't designed to - // allow the user to select particular channels of a device, we'll - // just open the first "nChannels" ports with offset. - for ( unsigned int i=0; iclient, jack_port_name( handle->ports[0][i] ), ports[ stream_.channelOffset[0] + i ] ); - if ( result ) { - free( ports ); - errorText_ = "RtApiJack::startStream(): error connecting output ports!"; - goto unlock; - } - } - free(ports); - } - - if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { - result = 1; - ports = jack_get_ports( handle->client, handle->deviceName[1].c_str(), NULL, JackPortIsOutput ); - if ( ports == NULL) { - errorText_ = "RtApiJack::startStream(): error determining available JACK output ports!"; - goto unlock; - } - - // Now make the port connections. See note above. - for ( unsigned int i=0; iclient, ports[ stream_.channelOffset[1] + i ], jack_port_name( handle->ports[1][i] ) ); - if ( result ) { - free( ports ); - errorText_ = "RtApiJack::startStream(): error connecting input ports!"; - goto unlock; - } - } - free(ports); - } - - handle->drainCounter = 0; - handle->internalDrain = false; - stream_.state = STREAM_RUNNING; - - unlock: - if ( result == 0 ) return; - error( RtAudioError::SYSTEM_ERROR ); -} - -void RtApiJack :: stopStream( void ) -{ - verifyStream(); - if ( stream_.state == STREAM_STOPPED ) { - errorText_ = "RtApiJack::stopStream(): the stream is already stopped!"; - error( RtAudioError::WARNING ); - return; - } - - JackHandle *handle = (JackHandle *) stream_.apiHandle; - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - - if ( handle->drainCounter == 0 ) { - handle->drainCounter = 2; - pthread_cond_wait( &handle->condition, &stream_.mutex ); // block until signaled - } - } - - jack_deactivate( handle->client ); - stream_.state = STREAM_STOPPED; -} - -void RtApiJack :: abortStream( void ) -{ - verifyStream(); - if ( stream_.state == STREAM_STOPPED ) { - errorText_ = "RtApiJack::abortStream(): the stream is already stopped!"; - error( RtAudioError::WARNING ); - return; - } - - JackHandle *handle = (JackHandle *) stream_.apiHandle; - handle->drainCounter = 2; - - stopStream(); -} - -// This function will be called by a spawned thread when the user -// callback function signals that the stream should be stopped or -// aborted. It is necessary to handle it this way because the -// callbackEvent() function must return before the jack_deactivate() -// function will return. -static void *jackStopStream( void *ptr ) -{ - CallbackInfo *info = (CallbackInfo *) ptr; - RtApiJack *object = (RtApiJack *) info->object; - - object->stopStream(); - pthread_exit( NULL ); -} - -bool RtApiJack :: callbackEvent( unsigned long nframes ) -{ - if ( stream_.state == STREAM_STOPPED || stream_.state == STREAM_STOPPING ) return SUCCESS; - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApiCore::callbackEvent(): the stream is closed ... this shouldn't happen!"; - error( RtAudioError::WARNING ); - return FAILURE; - } - if ( stream_.bufferSize != nframes ) { - errorText_ = "RtApiCore::callbackEvent(): the JACK buffer size has changed ... cannot process!"; - error( RtAudioError::WARNING ); - return FAILURE; - } - - CallbackInfo *info = (CallbackInfo *) &stream_.callbackInfo; - JackHandle *handle = (JackHandle *) stream_.apiHandle; - - // Check if we were draining the stream and signal is finished. - if ( handle->drainCounter > 3 ) { - ThreadHandle threadId; - - stream_.state = STREAM_STOPPING; - if ( handle->internalDrain == true ) - pthread_create( &threadId, NULL, jackStopStream, info ); - else - pthread_cond_signal( &handle->condition ); - return SUCCESS; - } - - // Invoke user callback first, to get fresh output data. - if ( handle->drainCounter == 0 ) { - RtAudioCallback callback = (RtAudioCallback) info->callback; - double streamTime = getStreamTime(); - RtAudioStreamStatus status = 0; - if ( stream_.mode != INPUT && handle->xrun[0] == true ) { - status |= RTAUDIO_OUTPUT_UNDERFLOW; - handle->xrun[0] = false; - } - if ( stream_.mode != OUTPUT && handle->xrun[1] == true ) { - status |= RTAUDIO_INPUT_OVERFLOW; - handle->xrun[1] = false; - } - int cbReturnValue = callback( stream_.userBuffer[0], stream_.userBuffer[1], - stream_.bufferSize, streamTime, status, info->userData ); - if ( cbReturnValue == 2 ) { - stream_.state = STREAM_STOPPING; - handle->drainCounter = 2; - ThreadHandle id; - pthread_create( &id, NULL, jackStopStream, info ); - return SUCCESS; - } - else if ( cbReturnValue == 1 ) { - handle->drainCounter = 1; - handle->internalDrain = true; - } - } - - jack_default_audio_sample_t *jackbuffer; - unsigned long bufferBytes = nframes * sizeof( jack_default_audio_sample_t ); - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - - if ( handle->drainCounter > 1 ) { // write zeros to the output stream - - for ( unsigned int i=0; iports[0][i], (jack_nframes_t) nframes ); - memset( jackbuffer, 0, bufferBytes ); - } - - } - else if ( stream_.doConvertBuffer[0] ) { - - convertBuffer( stream_.deviceBuffer, stream_.userBuffer[0], stream_.convertInfo[0] ); - - for ( unsigned int i=0; iports[0][i], (jack_nframes_t) nframes ); - memcpy( jackbuffer, &stream_.deviceBuffer[i*bufferBytes], bufferBytes ); - } - } - else { // no buffer conversion - for ( unsigned int i=0; iports[0][i], (jack_nframes_t) nframes ); - memcpy( jackbuffer, &stream_.userBuffer[0][i*bufferBytes], bufferBytes ); - } - } - } - - // Don't bother draining input - if ( handle->drainCounter ) { - handle->drainCounter++; - goto unlock; - } - - if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { - - if ( stream_.doConvertBuffer[1] ) { - for ( unsigned int i=0; iports[1][i], (jack_nframes_t) nframes ); - memcpy( &stream_.deviceBuffer[i*bufferBytes], jackbuffer, bufferBytes ); - } - convertBuffer( stream_.userBuffer[1], stream_.deviceBuffer, stream_.convertInfo[1] ); - } - else { // no buffer conversion - for ( unsigned int i=0; iports[1][i], (jack_nframes_t) nframes ); - memcpy( &stream_.userBuffer[1][i*bufferBytes], jackbuffer, bufferBytes ); - } - } - } - - unlock: - RtApi::tickStreamTime(); - return SUCCESS; -} - //******************** End of __UNIX_JACK__ *********************// -#endif - -#if defined(__WINDOWS_ASIO__) // ASIO API on Windows - -// The ASIO API is designed around a callback scheme, so this -// implementation is similar to that used for OS-X CoreAudio and Linux -// Jack. The primary constraint with ASIO is that it only allows -// access to a single driver at a time. Thus, it is not possible to -// have more than one simultaneous RtAudio stream. -// -// This implementation also requires a number of external ASIO files -// and a few global variables. The ASIO callback scheme does not -// allow for the passing of user data, so we must create a global -// pointer to our callbackInfo structure. -// -// On unix systems, we make use of a pthread condition variable. -// Since there is no equivalent in Windows, I hacked something based -// on information found in -// http://www.cs.wustl.edu/~schmidt/win32-cv-1.html. - -#include "asiosys.h" -#include "asio.h" -#include "iasiothiscallresolver.h" -#include "asiodrivers.h" -#include - -static AsioDrivers drivers; -static ASIOCallbacks asioCallbacks; -static ASIODriverInfo driverInfo; -static CallbackInfo *asioCallbackInfo; -static bool asioXRun; - -struct AsioHandle { - int drainCounter; // Tracks callback counts when draining - bool internalDrain; // Indicates if stop is initiated from callback or not. - ASIOBufferInfo *bufferInfos; - HANDLE condition; - - AsioHandle() - :drainCounter(0), internalDrain(false), bufferInfos(0) {} -}; - -// Function declarations (definitions at end of section) -static const char* getAsioErrorString( ASIOError result ); -static void sampleRateChanged( ASIOSampleRate sRate ); -static long asioMessages( long selector, long value, void* message, double* opt ); - -RtApiAsio :: RtApiAsio() -{ - // ASIO cannot run on a multi-threaded appartment. You can call - // CoInitialize beforehand, but it must be for appartment threading - // (in which case, CoInitilialize will return S_FALSE here). - coInitialized_ = false; - HRESULT hr = CoInitialize( NULL ); - if ( FAILED(hr) ) { - errorText_ = "RtApiAsio::ASIO requires a single-threaded appartment. Call CoInitializeEx(0,COINIT_APARTMENTTHREADED)"; - error( RtAudioError::WARNING ); - } - coInitialized_ = true; - - drivers.removeCurrentDriver(); - driverInfo.asioVersion = 2; - - // See note in DirectSound implementation about GetDesktopWindow(). - driverInfo.sysRef = GetForegroundWindow(); -} - -RtApiAsio :: ~RtApiAsio() -{ - if ( stream_.state != STREAM_CLOSED ) closeStream(); - if ( coInitialized_ ) CoUninitialize(); -} - -unsigned int RtApiAsio :: getDeviceCount( void ) -{ - return (unsigned int) drivers.asioGetNumDev(); -} - -RtAudio::DeviceInfo RtApiAsio :: getDeviceInfo( unsigned int device ) -{ - RtAudio::DeviceInfo info; - info.probed = false; - - // Get device ID - unsigned int nDevices = getDeviceCount(); - if ( nDevices == 0 ) { - errorText_ = "RtApiAsio::getDeviceInfo: no devices found!"; - error( RtAudioError::INVALID_USE ); - return info; - } - - if ( device >= nDevices ) { - errorText_ = "RtApiAsio::getDeviceInfo: device ID is invalid!"; - error( RtAudioError::INVALID_USE ); - return info; - } - - // If a stream is already open, we cannot probe other devices. Thus, use the saved results. - if ( stream_.state != STREAM_CLOSED ) { - if ( device >= devices_.size() ) { - errorText_ = "RtApiAsio::getDeviceInfo: device ID was not present before stream was opened."; - error( RtAudioError::WARNING ); - return info; - } - return devices_[ device ]; - } - - char driverName[32]; - ASIOError result = drivers.asioGetDriverName( (int) device, driverName, 32 ); - if ( result != ASE_OK ) { - errorStream_ << "RtApiAsio::getDeviceInfo: unable to get driver name (" << getAsioErrorString( result ) << ")."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - return info; - } - - info.name = driverName; - - if ( !drivers.loadDriver( driverName ) ) { - errorStream_ << "RtApiAsio::getDeviceInfo: unable to load driver (" << driverName << ")."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - return info; - } - - result = ASIOInit( &driverInfo ); - if ( result != ASE_OK ) { - errorStream_ << "RtApiAsio::getDeviceInfo: error (" << getAsioErrorString( result ) << ") initializing driver (" << driverName << ")."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - return info; - } - - // Determine the device channel information. - long inputChannels, outputChannels; - result = ASIOGetChannels( &inputChannels, &outputChannels ); - if ( result != ASE_OK ) { - drivers.removeCurrentDriver(); - errorStream_ << "RtApiAsio::getDeviceInfo: error (" << getAsioErrorString( result ) << ") getting channel count (" << driverName << ")."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - return info; - } - - info.outputChannels = outputChannels; - info.inputChannels = inputChannels; - if ( info.outputChannels > 0 && info.inputChannels > 0 ) - info.duplexChannels = (info.outputChannels > info.inputChannels) ? info.inputChannels : info.outputChannels; - - // Determine the supported sample rates. - info.sampleRates.clear(); - for ( unsigned int i=0; i info.preferredSampleRate ) ) - info.preferredSampleRate = SAMPLE_RATES[i]; - } - } - - // Determine supported data types ... just check first channel and assume rest are the same. - ASIOChannelInfo channelInfo; - channelInfo.channel = 0; - channelInfo.isInput = true; - if ( info.inputChannels <= 0 ) channelInfo.isInput = false; - result = ASIOGetChannelInfo( &channelInfo ); - if ( result != ASE_OK ) { - drivers.removeCurrentDriver(); - errorStream_ << "RtApiAsio::getDeviceInfo: error (" << getAsioErrorString( result ) << ") getting driver channel info (" << driverName << ")."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - return info; - } - - info.nativeFormats = 0; - if ( channelInfo.type == ASIOSTInt16MSB || channelInfo.type == ASIOSTInt16LSB ) - info.nativeFormats |= RTAUDIO_SINT16; - else if ( channelInfo.type == ASIOSTInt32MSB || channelInfo.type == ASIOSTInt32LSB ) - info.nativeFormats |= RTAUDIO_SINT32; - else if ( channelInfo.type == ASIOSTFloat32MSB || channelInfo.type == ASIOSTFloat32LSB ) - info.nativeFormats |= RTAUDIO_FLOAT32; - else if ( channelInfo.type == ASIOSTFloat64MSB || channelInfo.type == ASIOSTFloat64LSB ) - info.nativeFormats |= RTAUDIO_FLOAT64; - else if ( channelInfo.type == ASIOSTInt24MSB || channelInfo.type == ASIOSTInt24LSB ) - info.nativeFormats |= RTAUDIO_SINT24; - - if ( info.outputChannels > 0 ) - if ( getDefaultOutputDevice() == device ) info.isDefaultOutput = true; - if ( info.inputChannels > 0 ) - if ( getDefaultInputDevice() == device ) info.isDefaultInput = true; - - info.probed = true; - drivers.removeCurrentDriver(); - return info; -} - -static void bufferSwitch( long index, ASIOBool /*processNow*/ ) -{ - RtApiAsio *object = (RtApiAsio *) asioCallbackInfo->object; - object->callbackEvent( index ); -} - -void RtApiAsio :: saveDeviceInfo( void ) -{ - devices_.clear(); - - unsigned int nDevices = getDeviceCount(); - devices_.resize( nDevices ); - for ( unsigned int i=0; isaveDeviceInfo(); - - if ( !drivers.loadDriver( driverName ) ) { - errorStream_ << "RtApiAsio::probeDeviceOpen: unable to load driver (" << driverName << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - result = ASIOInit( &driverInfo ); - if ( result != ASE_OK ) { - errorStream_ << "RtApiAsio::probeDeviceOpen: error (" << getAsioErrorString( result ) << ") initializing driver (" << driverName << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - } - - // keep them before any "goto error", they are used for error cleanup + goto device boundary checks - bool buffersAllocated = false; - AsioHandle *handle = (AsioHandle *) stream_.apiHandle; - unsigned int nChannels; - - - // Check the device channel count. - long inputChannels, outputChannels; - result = ASIOGetChannels( &inputChannels, &outputChannels ); - if ( result != ASE_OK ) { - errorStream_ << "RtApiAsio::probeDeviceOpen: error (" << getAsioErrorString( result ) << ") getting channel count (" << driverName << ")."; - errorText_ = errorStream_.str(); - goto error; - } - - if ( ( mode == OUTPUT && (channels+firstChannel) > (unsigned int) outputChannels) || - ( mode == INPUT && (channels+firstChannel) > (unsigned int) inputChannels) ) { - errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") does not support requested channel count (" << channels << ") + offset (" << firstChannel << ")."; - errorText_ = errorStream_.str(); - goto error; - } - stream_.nDeviceChannels[mode] = channels; - stream_.nUserChannels[mode] = channels; - stream_.channelOffset[mode] = firstChannel; - - // Verify the sample rate is supported. - result = ASIOCanSampleRate( (ASIOSampleRate) sampleRate ); - if ( result != ASE_OK ) { - errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") does not support requested sample rate (" << sampleRate << ")."; - errorText_ = errorStream_.str(); - goto error; - } - - // Get the current sample rate - ASIOSampleRate currentRate; - result = ASIOGetSampleRate( ¤tRate ); - if ( result != ASE_OK ) { - errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") error getting sample rate."; - errorText_ = errorStream_.str(); - goto error; - } - - // Set the sample rate only if necessary - if ( currentRate != sampleRate ) { - result = ASIOSetSampleRate( (ASIOSampleRate) sampleRate ); - if ( result != ASE_OK ) { - errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") error setting sample rate (" << sampleRate << ")."; - errorText_ = errorStream_.str(); - goto error; - } - } - - // Determine the driver data type. - ASIOChannelInfo channelInfo; - channelInfo.channel = 0; - if ( mode == OUTPUT ) channelInfo.isInput = false; - else channelInfo.isInput = true; - result = ASIOGetChannelInfo( &channelInfo ); - if ( result != ASE_OK ) { - errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") error (" << getAsioErrorString( result ) << ") getting data format."; - errorText_ = errorStream_.str(); - goto error; - } - - // Assuming WINDOWS host is always little-endian. - stream_.doByteSwap[mode] = false; - stream_.userFormat = format; - stream_.deviceFormat[mode] = 0; - if ( channelInfo.type == ASIOSTInt16MSB || channelInfo.type == ASIOSTInt16LSB ) { - stream_.deviceFormat[mode] = RTAUDIO_SINT16; - if ( channelInfo.type == ASIOSTInt16MSB ) stream_.doByteSwap[mode] = true; - } - else if ( channelInfo.type == ASIOSTInt32MSB || channelInfo.type == ASIOSTInt32LSB ) { - stream_.deviceFormat[mode] = RTAUDIO_SINT32; - if ( channelInfo.type == ASIOSTInt32MSB ) stream_.doByteSwap[mode] = true; - } - else if ( channelInfo.type == ASIOSTFloat32MSB || channelInfo.type == ASIOSTFloat32LSB ) { - stream_.deviceFormat[mode] = RTAUDIO_FLOAT32; - if ( channelInfo.type == ASIOSTFloat32MSB ) stream_.doByteSwap[mode] = true; - } - else if ( channelInfo.type == ASIOSTFloat64MSB || channelInfo.type == ASIOSTFloat64LSB ) { - stream_.deviceFormat[mode] = RTAUDIO_FLOAT64; - if ( channelInfo.type == ASIOSTFloat64MSB ) stream_.doByteSwap[mode] = true; - } - else if ( channelInfo.type == ASIOSTInt24MSB || channelInfo.type == ASIOSTInt24LSB ) { - stream_.deviceFormat[mode] = RTAUDIO_SINT24; - if ( channelInfo.type == ASIOSTInt24MSB ) stream_.doByteSwap[mode] = true; - } - - if ( stream_.deviceFormat[mode] == 0 ) { - errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") data format not supported by RtAudio."; - errorText_ = errorStream_.str(); - goto error; - } - - // Set the buffer size. For a duplex stream, this will end up - // setting the buffer size based on the input constraints, which - // should be ok. - long minSize, maxSize, preferSize, granularity; - result = ASIOGetBufferSize( &minSize, &maxSize, &preferSize, &granularity ); - if ( result != ASE_OK ) { - errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") error (" << getAsioErrorString( result ) << ") getting buffer size."; - errorText_ = errorStream_.str(); - goto error; - } - - if ( isDuplexInput ) { - // When this is the duplex input (output was opened before), then we have to use the same - // buffersize as the output, because it might use the preferred buffer size, which most - // likely wasn't passed as input to this. The buffer sizes have to be identically anyway, - // So instead of throwing an error, make them equal. The caller uses the reference - // to the "bufferSize" param as usual to set up processing buffers. - - *bufferSize = stream_.bufferSize; - - } else { - if ( *bufferSize == 0 ) *bufferSize = preferSize; - else if ( *bufferSize < (unsigned int) minSize ) *bufferSize = (unsigned int) minSize; - else if ( *bufferSize > (unsigned int) maxSize ) *bufferSize = (unsigned int) maxSize; - else if ( granularity == -1 ) { - // Make sure bufferSize is a power of two. - int log2_of_min_size = 0; - int log2_of_max_size = 0; - - for ( unsigned int i = 0; i < sizeof(long) * 8; i++ ) { - if ( minSize & ((long)1 << i) ) log2_of_min_size = i; - if ( maxSize & ((long)1 << i) ) log2_of_max_size = i; - } - - long min_delta = std::abs( (long)*bufferSize - ((long)1 << log2_of_min_size) ); - int min_delta_num = log2_of_min_size; - - for (int i = log2_of_min_size + 1; i <= log2_of_max_size; i++) { - long current_delta = std::abs( (long)*bufferSize - ((long)1 << i) ); - if (current_delta < min_delta) { - min_delta = current_delta; - min_delta_num = i; - } - } - - *bufferSize = ( (unsigned int)1 << min_delta_num ); - if ( *bufferSize < (unsigned int) minSize ) *bufferSize = (unsigned int) minSize; - else if ( *bufferSize > (unsigned int) maxSize ) *bufferSize = (unsigned int) maxSize; - } - else if ( granularity != 0 ) { - // Set to an even multiple of granularity, rounding up. - *bufferSize = (*bufferSize + granularity-1) / granularity * granularity; - } - } - - /* - // we don't use it anymore, see above! - // Just left it here for the case... - if ( isDuplexInput && stream_.bufferSize != *bufferSize ) { - errorText_ = "RtApiAsio::probeDeviceOpen: input/output buffersize discrepancy!"; - goto error; - } - */ - - stream_.bufferSize = *bufferSize; - stream_.nBuffers = 2; - - if ( options && options->flags & RTAUDIO_NONINTERLEAVED ) stream_.userInterleaved = false; - else stream_.userInterleaved = true; - - // ASIO always uses non-interleaved buffers. - stream_.deviceInterleaved[mode] = false; - - // Allocate, if necessary, our AsioHandle structure for the stream. - if ( handle == 0 ) { - try { - handle = new AsioHandle; - } - catch ( std::bad_alloc& ) { - errorText_ = "RtApiAsio::probeDeviceOpen: error allocating AsioHandle memory."; - goto error; - } - handle->bufferInfos = 0; - - // Create a manual-reset event. - handle->condition = CreateEvent( NULL, // no security - TRUE, // manual-reset - FALSE, // non-signaled initially - NULL ); // unnamed - stream_.apiHandle = (void *) handle; - } - - // Create the ASIO internal buffers. Since RtAudio sets up input - // and output separately, we'll have to dispose of previously - // created output buffers for a duplex stream. - if ( mode == INPUT && stream_.mode == OUTPUT ) { - ASIODisposeBuffers(); - if ( handle->bufferInfos ) free( handle->bufferInfos ); - } - - // Allocate, initialize, and save the bufferInfos in our stream callbackInfo structure. - unsigned int i; - nChannels = stream_.nDeviceChannels[0] + stream_.nDeviceChannels[1]; - handle->bufferInfos = (ASIOBufferInfo *) malloc( nChannels * sizeof(ASIOBufferInfo) ); - if ( handle->bufferInfos == NULL ) { - errorStream_ << "RtApiAsio::probeDeviceOpen: error allocating bufferInfo memory for driver (" << driverName << ")."; - errorText_ = errorStream_.str(); - goto error; - } - - ASIOBufferInfo *infos; - infos = handle->bufferInfos; - for ( i=0; iisInput = ASIOFalse; - infos->channelNum = i + stream_.channelOffset[0]; - infos->buffers[0] = infos->buffers[1] = 0; - } - for ( i=0; iisInput = ASIOTrue; - infos->channelNum = i + stream_.channelOffset[1]; - infos->buffers[0] = infos->buffers[1] = 0; - } - - // prepare for callbacks - stream_.sampleRate = sampleRate; - stream_.device[mode] = device; - stream_.mode = isDuplexInput ? DUPLEX : mode; - - // store this class instance before registering callbacks, that are going to use it - asioCallbackInfo = &stream_.callbackInfo; - stream_.callbackInfo.object = (void *) this; - - // Set up the ASIO callback structure and create the ASIO data buffers. - asioCallbacks.bufferSwitch = &bufferSwitch; - asioCallbacks.sampleRateDidChange = &sampleRateChanged; - asioCallbacks.asioMessage = &asioMessages; - asioCallbacks.bufferSwitchTimeInfo = NULL; - result = ASIOCreateBuffers( handle->bufferInfos, nChannels, stream_.bufferSize, &asioCallbacks ); - if ( result != ASE_OK ) { - // Standard method failed. This can happen with strict/misbehaving drivers that return valid buffer size ranges - // but only accept the preferred buffer size as parameter for ASIOCreateBuffers. eg. Creatives ASIO driver - // in that case, let's be naïve and try that instead - *bufferSize = preferSize; - stream_.bufferSize = *bufferSize; - result = ASIOCreateBuffers( handle->bufferInfos, nChannels, stream_.bufferSize, &asioCallbacks ); - } - - if ( result != ASE_OK ) { - errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") error (" << getAsioErrorString( result ) << ") creating buffers."; - errorText_ = errorStream_.str(); - goto error; - } - buffersAllocated = true; - stream_.state = STREAM_STOPPED; - - // Set flags for buffer conversion. - stream_.doConvertBuffer[mode] = false; - if ( stream_.userFormat != stream_.deviceFormat[mode] ) - stream_.doConvertBuffer[mode] = true; - if ( stream_.userInterleaved != stream_.deviceInterleaved[mode] && - stream_.nUserChannels[mode] > 1 ) - stream_.doConvertBuffer[mode] = true; - - // Allocate necessary internal buffers - unsigned long bufferBytes; - bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); - stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); - if ( stream_.userBuffer[mode] == NULL ) { - errorText_ = "RtApiAsio::probeDeviceOpen: error allocating user buffer memory."; - goto error; - } - - if ( stream_.doConvertBuffer[mode] ) { - - bool makeBuffer = true; - bufferBytes = stream_.nDeviceChannels[mode] * formatBytes( stream_.deviceFormat[mode] ); - if ( isDuplexInput && stream_.deviceBuffer ) { - unsigned long bytesOut = stream_.nDeviceChannels[0] * formatBytes( stream_.deviceFormat[0] ); - if ( bufferBytes <= bytesOut ) makeBuffer = false; - } - - if ( makeBuffer ) { - bufferBytes *= *bufferSize; - if ( stream_.deviceBuffer ) free( stream_.deviceBuffer ); - stream_.deviceBuffer = (char *) calloc( bufferBytes, 1 ); - if ( stream_.deviceBuffer == NULL ) { - errorText_ = "RtApiAsio::probeDeviceOpen: error allocating device buffer memory."; - goto error; - } - } - } - - // Determine device latencies - long inputLatency, outputLatency; - result = ASIOGetLatencies( &inputLatency, &outputLatency ); - if ( result != ASE_OK ) { - errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") error (" << getAsioErrorString( result ) << ") getting latency."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING); // warn but don't fail - } - else { - stream_.latency[0] = outputLatency; - stream_.latency[1] = inputLatency; - } - - // Setup the buffer conversion information structure. We don't use - // buffers to do channel offsets, so we override that parameter - // here. - if ( stream_.doConvertBuffer[mode] ) setConvertInfo( mode, 0 ); - - return SUCCESS; - - error: - if ( !isDuplexInput ) { - // the cleanup for error in the duplex input, is done by RtApi::openStream - // So we clean up for single channel only - - if ( buffersAllocated ) - ASIODisposeBuffers(); - - drivers.removeCurrentDriver(); - - if ( handle ) { - CloseHandle( handle->condition ); - if ( handle->bufferInfos ) - free( handle->bufferInfos ); - - delete handle; - stream_.apiHandle = 0; - } - - - if ( stream_.userBuffer[mode] ) { - free( stream_.userBuffer[mode] ); - stream_.userBuffer[mode] = 0; - } - - if ( stream_.deviceBuffer ) { - free( stream_.deviceBuffer ); - stream_.deviceBuffer = 0; - } - } - - return FAILURE; -}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -void RtApiAsio :: closeStream() -{ - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApiAsio::closeStream(): no open stream to close!"; - error( RtAudioError::WARNING ); - return; - } - - if ( stream_.state == STREAM_RUNNING ) { - stream_.state = STREAM_STOPPED; - ASIOStop(); - } - ASIODisposeBuffers(); - drivers.removeCurrentDriver(); - - AsioHandle *handle = (AsioHandle *) stream_.apiHandle; - if ( handle ) { - CloseHandle( handle->condition ); - if ( handle->bufferInfos ) - free( handle->bufferInfos ); - delete handle; - stream_.apiHandle = 0; - } - - for ( int i=0; i<2; i++ ) { - if ( stream_.userBuffer[i] ) { - free( stream_.userBuffer[i] ); - stream_.userBuffer[i] = 0; - } - } - - if ( stream_.deviceBuffer ) { - free( stream_.deviceBuffer ); - stream_.deviceBuffer = 0; - } - - stream_.mode = UNINITIALIZED; - stream_.state = STREAM_CLOSED; -} - -bool stopThreadCalled = false; - -void RtApiAsio :: startStream() -{ - verifyStream(); - if ( stream_.state == STREAM_RUNNING ) { - errorText_ = "RtApiAsio::startStream(): the stream is already running!"; - error( RtAudioError::WARNING ); - return; - } - - AsioHandle *handle = (AsioHandle *) stream_.apiHandle; - ASIOError result = ASIOStart(); - if ( result != ASE_OK ) { - errorStream_ << "RtApiAsio::startStream: error (" << getAsioErrorString( result ) << ") starting device."; - errorText_ = errorStream_.str(); - goto unlock; - } - - handle->drainCounter = 0; - handle->internalDrain = false; - ResetEvent( handle->condition ); - stream_.state = STREAM_RUNNING; - asioXRun = false; - - unlock: - stopThreadCalled = false; - - if ( result == ASE_OK ) return; - error( RtAudioError::SYSTEM_ERROR ); -} - -void RtApiAsio :: stopStream() -{ - verifyStream(); - if ( stream_.state == STREAM_STOPPED ) { - errorText_ = "RtApiAsio::stopStream(): the stream is already stopped!"; - error( RtAudioError::WARNING ); - return; - } - - AsioHandle *handle = (AsioHandle *) stream_.apiHandle; - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - if ( handle->drainCounter == 0 ) { - handle->drainCounter = 2; - WaitForSingleObject( handle->condition, INFINITE ); // block until signaled - } - } - - stream_.state = STREAM_STOPPED; - - ASIOError result = ASIOStop(); - if ( result != ASE_OK ) { - errorStream_ << "RtApiAsio::stopStream: error (" << getAsioErrorString( result ) << ") stopping device."; - errorText_ = errorStream_.str(); - } - - if ( result == ASE_OK ) return; - error( RtAudioError::SYSTEM_ERROR ); -} - -void RtApiAsio :: abortStream() -{ - verifyStream(); - if ( stream_.state == STREAM_STOPPED ) { - errorText_ = "RtApiAsio::abortStream(): the stream is already stopped!"; - error( RtAudioError::WARNING ); - return; - } - - // The following lines were commented-out because some behavior was - // noted where the device buffers need to be zeroed to avoid - // continuing sound, even when the device buffers are completely - // disposed. So now, calling abort is the same as calling stop. - // AsioHandle *handle = (AsioHandle *) stream_.apiHandle; - // handle->drainCounter = 2; - stopStream(); -} - -// This function will be called by a spawned thread when the user -// callback function signals that the stream should be stopped or -// aborted. It is necessary to handle it this way because the -// callbackEvent() function must return before the ASIOStop() -// function will return. -static unsigned __stdcall asioStopStream( void *ptr ) -{ - CallbackInfo *info = (CallbackInfo *) ptr; - RtApiAsio *object = (RtApiAsio *) info->object; - - object->stopStream(); - _endthreadex( 0 ); - return 0; -} - -bool RtApiAsio :: callbackEvent( long bufferIndex ) -{ - if ( stream_.state == STREAM_STOPPED || stream_.state == STREAM_STOPPING ) return SUCCESS; - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApiAsio::callbackEvent(): the stream is closed ... this shouldn't happen!"; - error( RtAudioError::WARNING ); - return FAILURE; - } - - CallbackInfo *info = (CallbackInfo *) &stream_.callbackInfo; - AsioHandle *handle = (AsioHandle *) stream_.apiHandle; - - // Check if we were draining the stream and signal if finished. - if ( handle->drainCounter > 3 ) { - - stream_.state = STREAM_STOPPING; - if ( handle->internalDrain == false ) - SetEvent( handle->condition ); - else { // spawn a thread to stop the stream - unsigned threadId; - stream_.callbackInfo.thread = _beginthreadex( NULL, 0, &asioStopStream, - &stream_.callbackInfo, 0, &threadId ); - } - return SUCCESS; - } - - // Invoke user callback to get fresh output data UNLESS we are - // draining stream. - if ( handle->drainCounter == 0 ) { - RtAudioCallback callback = (RtAudioCallback) info->callback; - double streamTime = getStreamTime(); - RtAudioStreamStatus status = 0; - if ( stream_.mode != INPUT && asioXRun == true ) { - status |= RTAUDIO_OUTPUT_UNDERFLOW; - asioXRun = false; - } - if ( stream_.mode != OUTPUT && asioXRun == true ) { - status |= RTAUDIO_INPUT_OVERFLOW; - asioXRun = false; - } - int cbReturnValue = callback( stream_.userBuffer[0], stream_.userBuffer[1], - stream_.bufferSize, streamTime, status, info->userData ); - if ( cbReturnValue == 2 ) { - stream_.state = STREAM_STOPPING; - handle->drainCounter = 2; - unsigned threadId; - stream_.callbackInfo.thread = _beginthreadex( NULL, 0, &asioStopStream, - &stream_.callbackInfo, 0, &threadId ); - return SUCCESS; - } - else if ( cbReturnValue == 1 ) { - handle->drainCounter = 1; - handle->internalDrain = true; - } - } - - unsigned int nChannels, bufferBytes, i, j; - nChannels = stream_.nDeviceChannels[0] + stream_.nDeviceChannels[1]; - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - - bufferBytes = stream_.bufferSize * formatBytes( stream_.deviceFormat[0] ); - - if ( handle->drainCounter > 1 ) { // write zeros to the output stream - - for ( i=0, j=0; ibufferInfos[i].isInput != ASIOTrue ) - memset( handle->bufferInfos[i].buffers[bufferIndex], 0, bufferBytes ); - } - - } - else if ( stream_.doConvertBuffer[0] ) { - - convertBuffer( stream_.deviceBuffer, stream_.userBuffer[0], stream_.convertInfo[0] ); - if ( stream_.doByteSwap[0] ) - byteSwapBuffer( stream_.deviceBuffer, - stream_.bufferSize * stream_.nDeviceChannels[0], - stream_.deviceFormat[0] ); - - for ( i=0, j=0; ibufferInfos[i].isInput != ASIOTrue ) - memcpy( handle->bufferInfos[i].buffers[bufferIndex], - &stream_.deviceBuffer[j++*bufferBytes], bufferBytes ); - } - - } - else { - - if ( stream_.doByteSwap[0] ) - byteSwapBuffer( stream_.userBuffer[0], - stream_.bufferSize * stream_.nUserChannels[0], - stream_.userFormat ); - - for ( i=0, j=0; ibufferInfos[i].isInput != ASIOTrue ) - memcpy( handle->bufferInfos[i].buffers[bufferIndex], - &stream_.userBuffer[0][bufferBytes*j++], bufferBytes ); - } - - } - } - - // Don't bother draining input - if ( handle->drainCounter ) { - handle->drainCounter++; - goto unlock; - } - - if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { - - bufferBytes = stream_.bufferSize * formatBytes(stream_.deviceFormat[1]); - - if (stream_.doConvertBuffer[1]) { - - // Always interleave ASIO input data. - for ( i=0, j=0; ibufferInfos[i].isInput == ASIOTrue ) - memcpy( &stream_.deviceBuffer[j++*bufferBytes], - handle->bufferInfos[i].buffers[bufferIndex], - bufferBytes ); - } - - if ( stream_.doByteSwap[1] ) - byteSwapBuffer( stream_.deviceBuffer, - stream_.bufferSize * stream_.nDeviceChannels[1], - stream_.deviceFormat[1] ); - convertBuffer( stream_.userBuffer[1], stream_.deviceBuffer, stream_.convertInfo[1] ); - - } - else { - for ( i=0, j=0; ibufferInfos[i].isInput == ASIOTrue ) { - memcpy( &stream_.userBuffer[1][bufferBytes*j++], - handle->bufferInfos[i].buffers[bufferIndex], - bufferBytes ); - } - } - - if ( stream_.doByteSwap[1] ) - byteSwapBuffer( stream_.userBuffer[1], - stream_.bufferSize * stream_.nUserChannels[1], - stream_.userFormat ); - } - } - - unlock: - // The following call was suggested by Malte Clasen. While the API - // documentation indicates it should not be required, some device - // drivers apparently do not function correctly without it. - ASIOOutputReady(); - - RtApi::tickStreamTime(); - return SUCCESS; -} - -static void sampleRateChanged( ASIOSampleRate sRate ) -{ - // The ASIO documentation says that this usually only happens during - // external sync. Audio processing is not stopped by the driver, - // actual sample rate might not have even changed, maybe only the - // sample rate status of an AES/EBU or S/PDIF digital input at the - // audio device. - - RtApi *object = (RtApi *) asioCallbackInfo->object; - try { - object->stopStream(); - } - catch ( RtAudioError &exception ) { - std::cerr << "\nRtApiAsio: sampleRateChanged() error (" << exception.getMessage() << ")!\n" << std::endl; - return; - } - - std::cerr << "\nRtApiAsio: driver reports sample rate changed to " << sRate << " ... stream stopped!!!\n" << std::endl; -} - -static long asioMessages( long selector, long value, void* /*message*/, double* /*opt*/ ) -{ - long ret = 0; - - switch( selector ) { - case kAsioSelectorSupported: - if ( value == kAsioResetRequest - || value == kAsioEngineVersion - || value == kAsioResyncRequest - || value == kAsioLatenciesChanged - // The following three were added for ASIO 2.0, you don't - // necessarily have to support them. - || value == kAsioSupportsTimeInfo - || value == kAsioSupportsTimeCode - || value == kAsioSupportsInputMonitor) - ret = 1L; - break; - case kAsioResetRequest: - // Defer the task and perform the reset of the driver during the - // next "safe" situation. You cannot reset the driver right now, - // as this code is called from the driver. Reset the driver is - // done by completely destruct is. I.e. ASIOStop(), - // ASIODisposeBuffers(), Destruction Afterwards you initialize the - // driver again. - std::cerr << "\nRtApiAsio: driver reset requested!!!" << std::endl; - ret = 1L; - break; - case kAsioResyncRequest: - // This informs the application that the driver encountered some - // non-fatal data loss. It is used for synchronization purposes - // of different media. Added mainly to work around the Win16Mutex - // problems in Windows 95/98 with the Windows Multimedia system, - // which could lose data because the Mutex was held too long by - // another thread. However a driver can issue it in other - // situations, too. - // std::cerr << "\nRtApiAsio: driver resync requested!!!" << std::endl; - asioXRun = true; - ret = 1L; - break; - case kAsioLatenciesChanged: - // This will inform the host application that the drivers were - // latencies changed. Beware, it this does not mean that the - // buffer sizes have changed! You might need to update internal - // delay data. - std::cerr << "\nRtApiAsio: driver latency may have changed!!!" << std::endl; - ret = 1L; - break; - case kAsioEngineVersion: - // Return the supported ASIO version of the host application. If - // a host application does not implement this selector, ASIO 1.0 - // is assumed by the driver. - ret = 2L; - break; - case kAsioSupportsTimeInfo: - // Informs the driver whether the - // asioCallbacks.bufferSwitchTimeInfo() callback is supported. - // For compatibility with ASIO 1.0 drivers the host application - // should always support the "old" bufferSwitch method, too. - ret = 0; - break; - case kAsioSupportsTimeCode: - // Informs the driver whether application is interested in time - // code info. If an application does not need to know about time - // code, the driver has less work to do. - ret = 0; - break; - } - return ret; -} - -static const char* getAsioErrorString( ASIOError result ) -{ - struct Messages - { - ASIOError value; - const char*message; - }; - - static const Messages m[] = - { - { ASE_NotPresent, "Hardware input or output is not present or available." }, - { ASE_HWMalfunction, "Hardware is malfunctioning." }, - { ASE_InvalidParameter, "Invalid input parameter." }, - { ASE_InvalidMode, "Invalid mode." }, - { ASE_SPNotAdvancing, "Sample position not advancing." }, - { ASE_NoClock, "Sample clock or rate cannot be determined or is not present." }, - { ASE_NoMemory, "Not enough memory to complete the request." } - }; - - for ( unsigned int i = 0; i < sizeof(m)/sizeof(m[0]); ++i ) - if ( m[i].value == result ) return m[i].message; - - return "Unknown error."; -} - -//******************** End of __WINDOWS_ASIO__ *********************// -#endif - - -#if defined(__WINDOWS_WASAPI__) // Windows WASAPI API - -// Authored by Marcus Tomlinson , April 2014 -// - Introduces support for the Windows WASAPI API -// - Aims to deliver bit streams to and from hardware at the lowest possible latency, via the absolute minimum buffer sizes required -// - Provides flexible stream configuration to an otherwise strict and inflexible WASAPI interface -// - Includes automatic internal conversion of sample rate and buffer size between hardware and the user - -#ifndef INITGUID - #define INITGUID -#endif -#include -#include -#include -#include - -//============================================================================= - -#define SAFE_RELEASE( objectPtr )\ -if ( objectPtr )\ -{\ - objectPtr->Release();\ - objectPtr = NULL;\ -} - -typedef HANDLE ( __stdcall *TAvSetMmThreadCharacteristicsPtr )( LPCWSTR TaskName, LPDWORD TaskIndex ); - -//----------------------------------------------------------------------------- - -// WASAPI dictates stream sample rate, format, channel count, and in some cases, buffer size. -// Therefore we must perform all necessary conversions to user buffers in order to satisfy these -// requirements. WasapiBuffer ring buffers are used between HwIn->UserIn and UserOut->HwOut to -// provide intermediate storage for read / write synchronization. -class WasapiBuffer -{ -public: - WasapiBuffer() - : buffer_( NULL ), - bufferSize_( 0 ), - inIndex_( 0 ), - outIndex_( 0 ) {} - - ~WasapiBuffer() { - free( buffer_ ); - } - - // sets the length of the internal ring buffer - void setBufferSize( unsigned int bufferSize, unsigned int formatBytes ) { - free( buffer_ ); - - buffer_ = ( char* ) calloc( bufferSize, formatBytes ); - - bufferSize_ = bufferSize; - inIndex_ = 0; - outIndex_ = 0; - } - - // attempt to push a buffer into the ring buffer at the current "in" index - bool pushBuffer( char* buffer, unsigned int bufferSize, RtAudioFormat format ) - { - if ( !buffer || // incoming buffer is NULL - bufferSize == 0 || // incoming buffer has no data - bufferSize > bufferSize_ ) // incoming buffer too large - { - return false; - } - - unsigned int relOutIndex = outIndex_; - unsigned int inIndexEnd = inIndex_ + bufferSize; - if ( relOutIndex < inIndex_ && inIndexEnd >= bufferSize_ ) { - relOutIndex += bufferSize_; - } - - // "in" index can end on the "out" index but cannot begin at it - if ( inIndex_ <= relOutIndex && inIndexEnd > relOutIndex ) { - return false; // not enough space between "in" index and "out" index - } - - // copy buffer from external to internal - int fromZeroSize = inIndex_ + bufferSize - bufferSize_; - fromZeroSize = fromZeroSize < 0 ? 0 : fromZeroSize; - int fromInSize = bufferSize - fromZeroSize; - - switch( format ) - { - case RTAUDIO_SINT8: - memcpy( &( ( char* ) buffer_ )[inIndex_], buffer, fromInSize * sizeof( char ) ); - memcpy( buffer_, &( ( char* ) buffer )[fromInSize], fromZeroSize * sizeof( char ) ); - break; - case RTAUDIO_SINT16: - memcpy( &( ( short* ) buffer_ )[inIndex_], buffer, fromInSize * sizeof( short ) ); - memcpy( buffer_, &( ( short* ) buffer )[fromInSize], fromZeroSize * sizeof( short ) ); - break; - case RTAUDIO_SINT24: - memcpy( &( ( S24* ) buffer_ )[inIndex_], buffer, fromInSize * sizeof( S24 ) ); - memcpy( buffer_, &( ( S24* ) buffer )[fromInSize], fromZeroSize * sizeof( S24 ) ); - break; - case RTAUDIO_SINT32: - memcpy( &( ( int* ) buffer_ )[inIndex_], buffer, fromInSize * sizeof( int ) ); - memcpy( buffer_, &( ( int* ) buffer )[fromInSize], fromZeroSize * sizeof( int ) ); - break; - case RTAUDIO_FLOAT32: - memcpy( &( ( float* ) buffer_ )[inIndex_], buffer, fromInSize * sizeof( float ) ); - memcpy( buffer_, &( ( float* ) buffer )[fromInSize], fromZeroSize * sizeof( float ) ); - break; - case RTAUDIO_FLOAT64: - memcpy( &( ( double* ) buffer_ )[inIndex_], buffer, fromInSize * sizeof( double ) ); - memcpy( buffer_, &( ( double* ) buffer )[fromInSize], fromZeroSize * sizeof( double ) ); - break; - } - - // update "in" index - inIndex_ += bufferSize; - inIndex_ %= bufferSize_; - - return true; - } - - // attempt to pull a buffer from the ring buffer from the current "out" index - bool pullBuffer( char* buffer, unsigned int bufferSize, RtAudioFormat format ) - { - if ( !buffer || // incoming buffer is NULL - bufferSize == 0 || // incoming buffer has no data - bufferSize > bufferSize_ ) // incoming buffer too large - { - return false; - } - - unsigned int relInIndex = inIndex_; - unsigned int outIndexEnd = outIndex_ + bufferSize; - if ( relInIndex < outIndex_ && outIndexEnd >= bufferSize_ ) { - relInIndex += bufferSize_; - } - - // "out" index can begin at and end on the "in" index - if ( outIndex_ < relInIndex && outIndexEnd > relInIndex ) { - return false; // not enough space between "out" index and "in" index - } - - // copy buffer from internal to external - int fromZeroSize = outIndex_ + bufferSize - bufferSize_; - fromZeroSize = fromZeroSize < 0 ? 0 : fromZeroSize; - int fromOutSize = bufferSize - fromZeroSize; - - switch( format ) - { - case RTAUDIO_SINT8: - memcpy( buffer, &( ( char* ) buffer_ )[outIndex_], fromOutSize * sizeof( char ) ); - memcpy( &( ( char* ) buffer )[fromOutSize], buffer_, fromZeroSize * sizeof( char ) ); - break; - case RTAUDIO_SINT16: - memcpy( buffer, &( ( short* ) buffer_ )[outIndex_], fromOutSize * sizeof( short ) ); - memcpy( &( ( short* ) buffer )[fromOutSize], buffer_, fromZeroSize * sizeof( short ) ); - break; - case RTAUDIO_SINT24: - memcpy( buffer, &( ( S24* ) buffer_ )[outIndex_], fromOutSize * sizeof( S24 ) ); - memcpy( &( ( S24* ) buffer )[fromOutSize], buffer_, fromZeroSize * sizeof( S24 ) ); - break; - case RTAUDIO_SINT32: - memcpy( buffer, &( ( int* ) buffer_ )[outIndex_], fromOutSize * sizeof( int ) ); - memcpy( &( ( int* ) buffer )[fromOutSize], buffer_, fromZeroSize * sizeof( int ) ); - break; - case RTAUDIO_FLOAT32: - memcpy( buffer, &( ( float* ) buffer_ )[outIndex_], fromOutSize * sizeof( float ) ); - memcpy( &( ( float* ) buffer )[fromOutSize], buffer_, fromZeroSize * sizeof( float ) ); - break; - case RTAUDIO_FLOAT64: - memcpy( buffer, &( ( double* ) buffer_ )[outIndex_], fromOutSize * sizeof( double ) ); - memcpy( &( ( double* ) buffer )[fromOutSize], buffer_, fromZeroSize * sizeof( double ) ); - break; - } - - // update "out" index - outIndex_ += bufferSize; - outIndex_ %= bufferSize_; - - return true; - } - -private: - char* buffer_; - unsigned int bufferSize_; - unsigned int inIndex_; - unsigned int outIndex_; -}; - -//----------------------------------------------------------------------------- - -// In order to satisfy WASAPI's buffer requirements, we need a means of converting sample rate -// between HW and the user. The convertBufferWasapi function is used to perform this conversion -// between HwIn->UserIn and UserOut->HwOut during the stream callback loop. -// This sample rate converter favors speed over quality, and works best with conversions between -// one rate and its multiple. -void convertBufferWasapi( char* outBuffer, - const char* inBuffer, - const unsigned int& channelCount, - const unsigned int& inSampleRate, - const unsigned int& outSampleRate, - const unsigned int& inSampleCount, - unsigned int& outSampleCount, - const RtAudioFormat& format ) -{ - // calculate the new outSampleCount and relative sampleStep - float sampleRatio = ( float ) outSampleRate / inSampleRate; - float sampleStep = 1.0f / sampleRatio; - float inSampleFraction = 0.0f; - - outSampleCount = ( unsigned int ) roundf( inSampleCount * sampleRatio ); - - // frame-by-frame, copy each relative input sample into it's corresponding output sample - for ( unsigned int outSample = 0; outSample < outSampleCount; outSample++ ) - { - unsigned int inSample = ( unsigned int ) inSampleFraction; - - switch ( format ) - { - case RTAUDIO_SINT8: - memcpy( &( ( char* ) outBuffer )[ outSample * channelCount ], &( ( char* ) inBuffer )[ inSample * channelCount ], channelCount * sizeof( char ) ); - break; - case RTAUDIO_SINT16: - memcpy( &( ( short* ) outBuffer )[ outSample * channelCount ], &( ( short* ) inBuffer )[ inSample * channelCount ], channelCount * sizeof( short ) ); - break; - case RTAUDIO_SINT24: - memcpy( &( ( S24* ) outBuffer )[ outSample * channelCount ], &( ( S24* ) inBuffer )[ inSample * channelCount ], channelCount * sizeof( S24 ) ); - break; - case RTAUDIO_SINT32: - memcpy( &( ( int* ) outBuffer )[ outSample * channelCount ], &( ( int* ) inBuffer )[ inSample * channelCount ], channelCount * sizeof( int ) ); - break; - case RTAUDIO_FLOAT32: - memcpy( &( ( float* ) outBuffer )[ outSample * channelCount ], &( ( float* ) inBuffer )[ inSample * channelCount ], channelCount * sizeof( float ) ); - break; - case RTAUDIO_FLOAT64: - memcpy( &( ( double* ) outBuffer )[ outSample * channelCount ], &( ( double* ) inBuffer )[ inSample * channelCount ], channelCount * sizeof( double ) ); - break; - } - - // jump to next in sample - inSampleFraction += sampleStep; - } -} - -//----------------------------------------------------------------------------- - -// A structure to hold various information related to the WASAPI implementation. -struct WasapiHandle -{ - IAudioClient* captureAudioClient; - IAudioClient* renderAudioClient; - IAudioCaptureClient* captureClient; - IAudioRenderClient* renderClient; - HANDLE captureEvent; - HANDLE renderEvent; - - WasapiHandle() - : captureAudioClient( NULL ), - renderAudioClient( NULL ), - captureClient( NULL ), - renderClient( NULL ), - captureEvent( NULL ), - renderEvent( NULL ) {} -}; - -//============================================================================= - -RtApiWasapi::RtApiWasapi() - : coInitialized_( false ), deviceEnumerator_( NULL ) -{ - // WASAPI can run either apartment or multi-threaded - HRESULT hr = CoInitialize( NULL ); - if ( !FAILED( hr ) ) - coInitialized_ = true; - - // Instantiate device enumerator - hr = CoCreateInstance( __uuidof( MMDeviceEnumerator ), NULL, - CLSCTX_ALL, __uuidof( IMMDeviceEnumerator ), - ( void** ) &deviceEnumerator_ ); - - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::RtApiWasapi: Unable to instantiate device enumerator"; - error( RtAudioError::DRIVER_ERROR ); - } -} - -//----------------------------------------------------------------------------- - -RtApiWasapi::~RtApiWasapi() -{ - if ( stream_.state != STREAM_CLOSED ) - closeStream(); - - SAFE_RELEASE( deviceEnumerator_ ); - - // If this object previously called CoInitialize() - if ( coInitialized_ ) - CoUninitialize(); -} - -//============================================================================= - -unsigned int RtApiWasapi::getDeviceCount( void ) -{ - unsigned int captureDeviceCount = 0; - unsigned int renderDeviceCount = 0; - - IMMDeviceCollection* captureDevices = NULL; - IMMDeviceCollection* renderDevices = NULL; - - // Count capture devices - errorText_.clear(); - HRESULT hr = deviceEnumerator_->EnumAudioEndpoints( eCapture, DEVICE_STATE_ACTIVE, &captureDevices ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::getDeviceCount: Unable to retrieve capture device collection."; - goto Exit; - } - - hr = captureDevices->GetCount( &captureDeviceCount ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::getDeviceCount: Unable to retrieve capture device count."; - goto Exit; - } - - // Count render devices - hr = deviceEnumerator_->EnumAudioEndpoints( eRender, DEVICE_STATE_ACTIVE, &renderDevices ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::getDeviceCount: Unable to retrieve render device collection."; - goto Exit; - } - - hr = renderDevices->GetCount( &renderDeviceCount ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::getDeviceCount: Unable to retrieve render device count."; - goto Exit; - } - -Exit: - // release all references - SAFE_RELEASE( captureDevices ); - SAFE_RELEASE( renderDevices ); - - if ( errorText_.empty() ) - return captureDeviceCount + renderDeviceCount; - - error( RtAudioError::DRIVER_ERROR ); - return 0; -} - -//----------------------------------------------------------------------------- - -RtAudio::DeviceInfo RtApiWasapi::getDeviceInfo( unsigned int device ) -{ - RtAudio::DeviceInfo info; - unsigned int captureDeviceCount = 0; - unsigned int renderDeviceCount = 0; - std::string defaultDeviceName; - bool isCaptureDevice = false; - - PROPVARIANT deviceNameProp; - PROPVARIANT defaultDeviceNameProp; - - IMMDeviceCollection* captureDevices = NULL; - IMMDeviceCollection* renderDevices = NULL; - IMMDevice* devicePtr = NULL; - IMMDevice* defaultDevicePtr = NULL; - IAudioClient* audioClient = NULL; - IPropertyStore* devicePropStore = NULL; - IPropertyStore* defaultDevicePropStore = NULL; - - WAVEFORMATEX* deviceFormat = NULL; - WAVEFORMATEX* closestMatchFormat = NULL; - - // probed - info.probed = false; - - // Count capture devices - errorText_.clear(); - RtAudioError::Type errorType = RtAudioError::DRIVER_ERROR; - HRESULT hr = deviceEnumerator_->EnumAudioEndpoints( eCapture, DEVICE_STATE_ACTIVE, &captureDevices ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::getDeviceInfo: Unable to retrieve capture device collection."; - goto Exit; - } - - hr = captureDevices->GetCount( &captureDeviceCount ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::getDeviceInfo: Unable to retrieve capture device count."; - goto Exit; - } - - // Count render devices - hr = deviceEnumerator_->EnumAudioEndpoints( eRender, DEVICE_STATE_ACTIVE, &renderDevices ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::getDeviceInfo: Unable to retrieve render device collection."; - goto Exit; - } - - hr = renderDevices->GetCount( &renderDeviceCount ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::getDeviceInfo: Unable to retrieve render device count."; - goto Exit; - } - - // validate device index - if ( device >= captureDeviceCount + renderDeviceCount ) { - errorText_ = "RtApiWasapi::getDeviceInfo: Invalid device index."; - errorType = RtAudioError::INVALID_USE; - goto Exit; - } - - // determine whether index falls within capture or render devices - if ( device >= renderDeviceCount ) { - hr = captureDevices->Item( device - renderDeviceCount, &devicePtr ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::getDeviceInfo: Unable to retrieve capture device handle."; - goto Exit; - } - isCaptureDevice = true; - } - else { - hr = renderDevices->Item( device, &devicePtr ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::getDeviceInfo: Unable to retrieve render device handle."; - goto Exit; - } - isCaptureDevice = false; - } - - // get default device name - if ( isCaptureDevice ) { - hr = deviceEnumerator_->GetDefaultAudioEndpoint( eCapture, eConsole, &defaultDevicePtr ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::getDeviceInfo: Unable to retrieve default capture device handle."; - goto Exit; - } - } - else { - hr = deviceEnumerator_->GetDefaultAudioEndpoint( eRender, eConsole, &defaultDevicePtr ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::getDeviceInfo: Unable to retrieve default render device handle."; - goto Exit; - } - } - - hr = defaultDevicePtr->OpenPropertyStore( STGM_READ, &defaultDevicePropStore ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::getDeviceInfo: Unable to open default device property store."; - goto Exit; - } - PropVariantInit( &defaultDeviceNameProp ); - - hr = defaultDevicePropStore->GetValue( PKEY_Device_FriendlyName, &defaultDeviceNameProp ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::getDeviceInfo: Unable to retrieve default device property: PKEY_Device_FriendlyName."; - goto Exit; - } - - defaultDeviceName = convertCharPointerToStdString(defaultDeviceNameProp.pwszVal); - - // name - hr = devicePtr->OpenPropertyStore( STGM_READ, &devicePropStore ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::getDeviceInfo: Unable to open device property store."; - goto Exit; - } - - PropVariantInit( &deviceNameProp ); - - hr = devicePropStore->GetValue( PKEY_Device_FriendlyName, &deviceNameProp ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::getDeviceInfo: Unable to retrieve device property: PKEY_Device_FriendlyName."; - goto Exit; - } - - info.name =convertCharPointerToStdString(deviceNameProp.pwszVal); - - // is default - if ( isCaptureDevice ) { - info.isDefaultInput = info.name == defaultDeviceName; - info.isDefaultOutput = false; - } - else { - info.isDefaultInput = false; - info.isDefaultOutput = info.name == defaultDeviceName; - } - - // channel count - hr = devicePtr->Activate( __uuidof( IAudioClient ), CLSCTX_ALL, NULL, ( void** ) &audioClient ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::getDeviceInfo: Unable to retrieve device audio client."; - goto Exit; - } - - hr = audioClient->GetMixFormat( &deviceFormat ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::getDeviceInfo: Unable to retrieve device mix format."; - goto Exit; - } - - if ( isCaptureDevice ) { - info.inputChannels = deviceFormat->nChannels; - info.outputChannels = 0; - info.duplexChannels = 0; - } - else { - info.inputChannels = 0; - info.outputChannels = deviceFormat->nChannels; - info.duplexChannels = 0; - } - - // sample rates - info.sampleRates.clear(); - - // allow support for all sample rates as we have a built-in sample rate converter - for ( unsigned int i = 0; i < MAX_SAMPLE_RATES; i++ ) { - info.sampleRates.push_back( SAMPLE_RATES[i] ); - } - info.preferredSampleRate = deviceFormat->nSamplesPerSec; - - // native format - info.nativeFormats = 0; - - if ( deviceFormat->wFormatTag == WAVE_FORMAT_IEEE_FLOAT || - ( deviceFormat->wFormatTag == WAVE_FORMAT_EXTENSIBLE && - ( ( WAVEFORMATEXTENSIBLE* ) deviceFormat )->SubFormat == KSDATAFORMAT_SUBTYPE_IEEE_FLOAT ) ) - { - if ( deviceFormat->wBitsPerSample == 32 ) { - info.nativeFormats |= RTAUDIO_FLOAT32; - } - else if ( deviceFormat->wBitsPerSample == 64 ) { - info.nativeFormats |= RTAUDIO_FLOAT64; - } - } - else if ( deviceFormat->wFormatTag == WAVE_FORMAT_PCM || - ( deviceFormat->wFormatTag == WAVE_FORMAT_EXTENSIBLE && - ( ( WAVEFORMATEXTENSIBLE* ) deviceFormat )->SubFormat == KSDATAFORMAT_SUBTYPE_PCM ) ) - { - if ( deviceFormat->wBitsPerSample == 8 ) { - info.nativeFormats |= RTAUDIO_SINT8; - } - else if ( deviceFormat->wBitsPerSample == 16 ) { - info.nativeFormats |= RTAUDIO_SINT16; - } - else if ( deviceFormat->wBitsPerSample == 24 ) { - info.nativeFormats |= RTAUDIO_SINT24; - } - else if ( deviceFormat->wBitsPerSample == 32 ) { - info.nativeFormats |= RTAUDIO_SINT32; - } - } - - // probed - info.probed = true; - -Exit: - // release all references - PropVariantClear( &deviceNameProp ); - PropVariantClear( &defaultDeviceNameProp ); - - SAFE_RELEASE( captureDevices ); - SAFE_RELEASE( renderDevices ); - SAFE_RELEASE( devicePtr ); - SAFE_RELEASE( defaultDevicePtr ); - SAFE_RELEASE( audioClient ); - SAFE_RELEASE( devicePropStore ); - SAFE_RELEASE( defaultDevicePropStore ); - - CoTaskMemFree( deviceFormat ); - CoTaskMemFree( closestMatchFormat ); - - if ( !errorText_.empty() ) - error( errorType ); - return info; -} - -//----------------------------------------------------------------------------- - -unsigned int RtApiWasapi::getDefaultOutputDevice( void ) -{ - for ( unsigned int i = 0; i < getDeviceCount(); i++ ) { - if ( getDeviceInfo( i ).isDefaultOutput ) { - return i; - } - } - - return 0; -} - -//----------------------------------------------------------------------------- - -unsigned int RtApiWasapi::getDefaultInputDevice( void ) -{ - for ( unsigned int i = 0; i < getDeviceCount(); i++ ) { - if ( getDeviceInfo( i ).isDefaultInput ) { - return i; - } - } - - return 0; -} - -//----------------------------------------------------------------------------- - -void RtApiWasapi::closeStream( void ) -{ - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApiWasapi::closeStream: No open stream to close."; - error( RtAudioError::WARNING ); - return; - } - - if ( stream_.state != STREAM_STOPPED ) - stopStream(); - - // clean up stream memory - SAFE_RELEASE( ( ( WasapiHandle* ) stream_.apiHandle )->captureAudioClient ) - SAFE_RELEASE( ( ( WasapiHandle* ) stream_.apiHandle )->renderAudioClient ) - - SAFE_RELEASE( ( ( WasapiHandle* ) stream_.apiHandle )->captureClient ) - SAFE_RELEASE( ( ( WasapiHandle* ) stream_.apiHandle )->renderClient ) - - if ( ( ( WasapiHandle* ) stream_.apiHandle )->captureEvent ) - CloseHandle( ( ( WasapiHandle* ) stream_.apiHandle )->captureEvent ); - - if ( ( ( WasapiHandle* ) stream_.apiHandle )->renderEvent ) - CloseHandle( ( ( WasapiHandle* ) stream_.apiHandle )->renderEvent ); - - delete ( WasapiHandle* ) stream_.apiHandle; - stream_.apiHandle = NULL; - - for ( int i = 0; i < 2; i++ ) { - if ( stream_.userBuffer[i] ) { - free( stream_.userBuffer[i] ); - stream_.userBuffer[i] = 0; - } - } - - if ( stream_.deviceBuffer ) { - free( stream_.deviceBuffer ); - stream_.deviceBuffer = 0; - } - - // update stream state - stream_.state = STREAM_CLOSED; -} - -//----------------------------------------------------------------------------- - -void RtApiWasapi::startStream( void ) -{ - verifyStream(); - - if ( stream_.state == STREAM_RUNNING ) { - errorText_ = "RtApiWasapi::startStream: The stream is already running."; - error( RtAudioError::WARNING ); - return; - } - - // update stream state - stream_.state = STREAM_RUNNING; - - // create WASAPI stream thread - stream_.callbackInfo.thread = ( ThreadHandle ) CreateThread( NULL, 0, runWasapiThread, this, CREATE_SUSPENDED, NULL ); - - if ( !stream_.callbackInfo.thread ) { - errorText_ = "RtApiWasapi::startStream: Unable to instantiate callback thread."; - error( RtAudioError::THREAD_ERROR ); - } - else { - SetThreadPriority( ( void* ) stream_.callbackInfo.thread, stream_.callbackInfo.priority ); - ResumeThread( ( void* ) stream_.callbackInfo.thread ); - } -} - -//----------------------------------------------------------------------------- - -void RtApiWasapi::stopStream( void ) -{ - verifyStream(); - - if ( stream_.state == STREAM_STOPPED ) { - errorText_ = "RtApiWasapi::stopStream: The stream is already stopped."; - error( RtAudioError::WARNING ); - return; - } - - // inform stream thread by setting stream state to STREAM_STOPPING - stream_.state = STREAM_STOPPING; - - // wait until stream thread is stopped - while( stream_.state != STREAM_STOPPED ) { - Sleep( 1 ); - } - - // Wait for the last buffer to play before stopping. - Sleep( 1000 * stream_.bufferSize / stream_.sampleRate ); - - // stop capture client if applicable - if ( ( ( WasapiHandle* ) stream_.apiHandle )->captureAudioClient ) { - HRESULT hr = ( ( WasapiHandle* ) stream_.apiHandle )->captureAudioClient->Stop(); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::stopStream: Unable to stop capture stream."; - error( RtAudioError::DRIVER_ERROR ); - return; - } - } - - // stop render client if applicable - if ( ( ( WasapiHandle* ) stream_.apiHandle )->renderAudioClient ) { - HRESULT hr = ( ( WasapiHandle* ) stream_.apiHandle )->renderAudioClient->Stop(); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::stopStream: Unable to stop render stream."; - error( RtAudioError::DRIVER_ERROR ); - return; - } - } - - // close thread handle - if ( stream_.callbackInfo.thread && !CloseHandle( ( void* ) stream_.callbackInfo.thread ) ) { - errorText_ = "RtApiWasapi::stopStream: Unable to close callback thread."; - error( RtAudioError::THREAD_ERROR ); - return; - } - - stream_.callbackInfo.thread = (ThreadHandle) NULL; -} - -//----------------------------------------------------------------------------- - -void RtApiWasapi::abortStream( void ) -{ - verifyStream(); - - if ( stream_.state == STREAM_STOPPED ) { - errorText_ = "RtApiWasapi::abortStream: The stream is already stopped."; - error( RtAudioError::WARNING ); - return; - } - - // inform stream thread by setting stream state to STREAM_STOPPING - stream_.state = STREAM_STOPPING; - - // wait until stream thread is stopped - while ( stream_.state != STREAM_STOPPED ) { - Sleep( 1 ); - } - - // stop capture client if applicable - if ( ( ( WasapiHandle* ) stream_.apiHandle )->captureAudioClient ) { - HRESULT hr = ( ( WasapiHandle* ) stream_.apiHandle )->captureAudioClient->Stop(); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::abortStream: Unable to stop capture stream."; - error( RtAudioError::DRIVER_ERROR ); - return; - } - } - - // stop render client if applicable - if ( ( ( WasapiHandle* ) stream_.apiHandle )->renderAudioClient ) { - HRESULT hr = ( ( WasapiHandle* ) stream_.apiHandle )->renderAudioClient->Stop(); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::abortStream: Unable to stop render stream."; - error( RtAudioError::DRIVER_ERROR ); - return; - } - } - - // close thread handle - if ( stream_.callbackInfo.thread && !CloseHandle( ( void* ) stream_.callbackInfo.thread ) ) { - errorText_ = "RtApiWasapi::abortStream: Unable to close callback thread."; - error( RtAudioError::THREAD_ERROR ); - return; - } - - stream_.callbackInfo.thread = (ThreadHandle) NULL; -} - -//----------------------------------------------------------------------------- - -bool RtApiWasapi::probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, - unsigned int firstChannel, unsigned int sampleRate, - RtAudioFormat format, unsigned int* bufferSize, - RtAudio::StreamOptions* options ) -{ - bool methodResult = FAILURE; - unsigned int captureDeviceCount = 0; - unsigned int renderDeviceCount = 0; - - IMMDeviceCollection* captureDevices = NULL; - IMMDeviceCollection* renderDevices = NULL; - IMMDevice* devicePtr = NULL; - WAVEFORMATEX* deviceFormat = NULL; - unsigned int bufferBytes; - stream_.state = STREAM_STOPPED; - - // create API Handle if not already created - if ( !stream_.apiHandle ) - stream_.apiHandle = ( void* ) new WasapiHandle(); - - // Count capture devices - errorText_.clear(); - RtAudioError::Type errorType = RtAudioError::DRIVER_ERROR; - HRESULT hr = deviceEnumerator_->EnumAudioEndpoints( eCapture, DEVICE_STATE_ACTIVE, &captureDevices ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::probeDeviceOpen: Unable to retrieve capture device collection."; - goto Exit; - } - - hr = captureDevices->GetCount( &captureDeviceCount ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::probeDeviceOpen: Unable to retrieve capture device count."; - goto Exit; - } - - // Count render devices - hr = deviceEnumerator_->EnumAudioEndpoints( eRender, DEVICE_STATE_ACTIVE, &renderDevices ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::probeDeviceOpen: Unable to retrieve render device collection."; - goto Exit; - } - - hr = renderDevices->GetCount( &renderDeviceCount ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::probeDeviceOpen: Unable to retrieve render device count."; - goto Exit; - } - - // validate device index - if ( device >= captureDeviceCount + renderDeviceCount ) { - errorType = RtAudioError::INVALID_USE; - errorText_ = "RtApiWasapi::probeDeviceOpen: Invalid device index."; - goto Exit; - } - - // determine whether index falls within capture or render devices - if ( device >= renderDeviceCount ) { - if ( mode != INPUT ) { - errorType = RtAudioError::INVALID_USE; - errorText_ = "RtApiWasapi::probeDeviceOpen: Capture device selected as output device."; - goto Exit; - } - - // retrieve captureAudioClient from devicePtr - IAudioClient*& captureAudioClient = ( ( WasapiHandle* ) stream_.apiHandle )->captureAudioClient; - - hr = captureDevices->Item( device - renderDeviceCount, &devicePtr ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::probeDeviceOpen: Unable to retrieve capture device handle."; - goto Exit; - } - - hr = devicePtr->Activate( __uuidof( IAudioClient ), CLSCTX_ALL, - NULL, ( void** ) &captureAudioClient ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::probeDeviceOpen: Unable to retrieve device audio client."; - goto Exit; - } - - hr = captureAudioClient->GetMixFormat( &deviceFormat ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::probeDeviceOpen: Unable to retrieve device mix format."; - goto Exit; - } - - stream_.nDeviceChannels[mode] = deviceFormat->nChannels; - captureAudioClient->GetStreamLatency( ( long long* ) &stream_.latency[mode] ); - } - else { - if ( mode != OUTPUT ) { - errorType = RtAudioError::INVALID_USE; - errorText_ = "RtApiWasapi::probeDeviceOpen: Render device selected as input device."; - goto Exit; - } - - // retrieve renderAudioClient from devicePtr - IAudioClient*& renderAudioClient = ( ( WasapiHandle* ) stream_.apiHandle )->renderAudioClient; - - hr = renderDevices->Item( device, &devicePtr ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::probeDeviceOpen: Unable to retrieve render device handle."; - goto Exit; - } - - hr = devicePtr->Activate( __uuidof( IAudioClient ), CLSCTX_ALL, - NULL, ( void** ) &renderAudioClient ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::probeDeviceOpen: Unable to retrieve device audio client."; - goto Exit; - } - - hr = renderAudioClient->GetMixFormat( &deviceFormat ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::probeDeviceOpen: Unable to retrieve device mix format."; - goto Exit; - } - - stream_.nDeviceChannels[mode] = deviceFormat->nChannels; - renderAudioClient->GetStreamLatency( ( long long* ) &stream_.latency[mode] ); - } - - // fill stream data - if ( ( stream_.mode == OUTPUT && mode == INPUT ) || - ( stream_.mode == INPUT && mode == OUTPUT ) ) { - stream_.mode = DUPLEX; - } - else { - stream_.mode = mode; - } - - stream_.device[mode] = device; - stream_.doByteSwap[mode] = false; - stream_.sampleRate = sampleRate; - stream_.bufferSize = *bufferSize; - stream_.nBuffers = 1; - stream_.nUserChannels[mode] = channels; - stream_.channelOffset[mode] = firstChannel; - stream_.userFormat = format; - stream_.deviceFormat[mode] = getDeviceInfo( device ).nativeFormats; - - if ( options && options->flags & RTAUDIO_NONINTERLEAVED ) - stream_.userInterleaved = false; - else - stream_.userInterleaved = true; - stream_.deviceInterleaved[mode] = true; - - // Set flags for buffer conversion. - stream_.doConvertBuffer[mode] = false; - if ( stream_.userFormat != stream_.deviceFormat[mode] || - stream_.nUserChannels != stream_.nDeviceChannels ) - stream_.doConvertBuffer[mode] = true; - else if ( stream_.userInterleaved != stream_.deviceInterleaved[mode] && - stream_.nUserChannels[mode] > 1 ) - stream_.doConvertBuffer[mode] = true; - - if ( stream_.doConvertBuffer[mode] ) - setConvertInfo( mode, 0 ); - - // Allocate necessary internal buffers - bufferBytes = stream_.nUserChannels[mode] * stream_.bufferSize * formatBytes( stream_.userFormat ); - - stream_.userBuffer[mode] = ( char* ) calloc( bufferBytes, 1 ); - if ( !stream_.userBuffer[mode] ) { - errorType = RtAudioError::MEMORY_ERROR; - errorText_ = "RtApiWasapi::probeDeviceOpen: Error allocating user buffer memory."; - goto Exit; - } - - if ( options && options->flags & RTAUDIO_SCHEDULE_REALTIME ) - stream_.callbackInfo.priority = 15; - else - stream_.callbackInfo.priority = 0; - - ///! TODO: RTAUDIO_MINIMIZE_LATENCY // Provide stream buffers directly to callback - ///! TODO: RTAUDIO_HOG_DEVICE // Exclusive mode - - methodResult = SUCCESS; - -Exit: - //clean up - SAFE_RELEASE( captureDevices ); - SAFE_RELEASE( renderDevices ); - SAFE_RELEASE( devicePtr ); - CoTaskMemFree( deviceFormat ); - - // if method failed, close the stream - if ( methodResult == FAILURE ) - closeStream(); - - if ( !errorText_.empty() ) - error( errorType ); - return methodResult; -} - -//============================================================================= - -DWORD WINAPI RtApiWasapi::runWasapiThread( void* wasapiPtr ) -{ - if ( wasapiPtr ) - ( ( RtApiWasapi* ) wasapiPtr )->wasapiThread(); - - return 0; -} - -DWORD WINAPI RtApiWasapi::stopWasapiThread( void* wasapiPtr ) -{ - if ( wasapiPtr ) - ( ( RtApiWasapi* ) wasapiPtr )->stopStream(); - - return 0; -} - -DWORD WINAPI RtApiWasapi::abortWasapiThread( void* wasapiPtr ) -{ - if ( wasapiPtr ) - ( ( RtApiWasapi* ) wasapiPtr )->abortStream(); - - return 0; -} - -//----------------------------------------------------------------------------- - -void RtApiWasapi::wasapiThread() -{ - // as this is a new thread, we must CoInitialize it - CoInitialize( NULL ); - - HRESULT hr; - - IAudioClient* captureAudioClient = ( ( WasapiHandle* ) stream_.apiHandle )->captureAudioClient; - IAudioClient* renderAudioClient = ( ( WasapiHandle* ) stream_.apiHandle )->renderAudioClient; - IAudioCaptureClient* captureClient = ( ( WasapiHandle* ) stream_.apiHandle )->captureClient; - IAudioRenderClient* renderClient = ( ( WasapiHandle* ) stream_.apiHandle )->renderClient; - HANDLE captureEvent = ( ( WasapiHandle* ) stream_.apiHandle )->captureEvent; - HANDLE renderEvent = ( ( WasapiHandle* ) stream_.apiHandle )->renderEvent; - - WAVEFORMATEX* captureFormat = NULL; - WAVEFORMATEX* renderFormat = NULL; - float captureSrRatio = 0.0f; - float renderSrRatio = 0.0f; - WasapiBuffer captureBuffer; - WasapiBuffer renderBuffer; - - // declare local stream variables - RtAudioCallback callback = ( RtAudioCallback ) stream_.callbackInfo.callback; - BYTE* streamBuffer = NULL; - unsigned long captureFlags = 0; - unsigned int bufferFrameCount = 0; - unsigned int numFramesPadding = 0; - unsigned int convBufferSize = 0; - bool callbackPushed = false; - bool callbackPulled = false; - bool callbackStopped = false; - int callbackResult = 0; - - // convBuffer is used to store converted buffers between WASAPI and the user - char* convBuffer = NULL; - unsigned int convBuffSize = 0; - unsigned int deviceBuffSize = 0; - - errorText_.clear(); - RtAudioError::Type errorType = RtAudioError::DRIVER_ERROR; - - // Attempt to assign "Pro Audio" characteristic to thread - HMODULE AvrtDll = LoadLibrary( (LPCTSTR) "AVRT.dll" ); - if ( AvrtDll ) { - DWORD taskIndex = 0; - TAvSetMmThreadCharacteristicsPtr AvSetMmThreadCharacteristicsPtr = ( TAvSetMmThreadCharacteristicsPtr ) GetProcAddress( AvrtDll, "AvSetMmThreadCharacteristicsW" ); - AvSetMmThreadCharacteristicsPtr( L"Pro Audio", &taskIndex ); - FreeLibrary( AvrtDll ); - } - - // start capture stream if applicable - if ( captureAudioClient ) { - hr = captureAudioClient->GetMixFormat( &captureFormat ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::wasapiThread: Unable to retrieve device mix format."; - goto Exit; - } - - captureSrRatio = ( ( float ) captureFormat->nSamplesPerSec / stream_.sampleRate ); - - // initialize capture stream according to desire buffer size - float desiredBufferSize = stream_.bufferSize * captureSrRatio; - REFERENCE_TIME desiredBufferPeriod = ( REFERENCE_TIME ) ( ( float ) desiredBufferSize * 10000000 / captureFormat->nSamplesPerSec ); - - if ( !captureClient ) { - hr = captureAudioClient->Initialize( AUDCLNT_SHAREMODE_SHARED, - AUDCLNT_STREAMFLAGS_EVENTCALLBACK, - desiredBufferPeriod, - desiredBufferPeriod, - captureFormat, - NULL ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::wasapiThread: Unable to initialize capture audio client."; - goto Exit; - } - - hr = captureAudioClient->GetService( __uuidof( IAudioCaptureClient ), - ( void** ) &captureClient ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::wasapiThread: Unable to retrieve capture client handle."; - goto Exit; - } - - // configure captureEvent to trigger on every available capture buffer - captureEvent = CreateEvent( NULL, FALSE, FALSE, NULL ); - if ( !captureEvent ) { - errorType = RtAudioError::SYSTEM_ERROR; - errorText_ = "RtApiWasapi::wasapiThread: Unable to create capture event."; - goto Exit; - } - - hr = captureAudioClient->SetEventHandle( captureEvent ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::wasapiThread: Unable to set capture event handle."; - goto Exit; - } - - ( ( WasapiHandle* ) stream_.apiHandle )->captureClient = captureClient; - ( ( WasapiHandle* ) stream_.apiHandle )->captureEvent = captureEvent; - } - - unsigned int inBufferSize = 0; - hr = captureAudioClient->GetBufferSize( &inBufferSize ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::wasapiThread: Unable to get capture buffer size."; - goto Exit; - } - - // scale outBufferSize according to stream->user sample rate ratio - unsigned int outBufferSize = ( unsigned int ) ( stream_.bufferSize * captureSrRatio ) * stream_.nDeviceChannels[INPUT]; - inBufferSize *= stream_.nDeviceChannels[INPUT]; - - // set captureBuffer size - captureBuffer.setBufferSize( inBufferSize + outBufferSize, formatBytes( stream_.deviceFormat[INPUT] ) ); - - // reset the capture stream - hr = captureAudioClient->Reset(); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::wasapiThread: Unable to reset capture stream."; - goto Exit; - } - - // start the capture stream - hr = captureAudioClient->Start(); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::wasapiThread: Unable to start capture stream."; - goto Exit; - } - } - - // start render stream if applicable - if ( renderAudioClient ) { - hr = renderAudioClient->GetMixFormat( &renderFormat ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::wasapiThread: Unable to retrieve device mix format."; - goto Exit; - } - - renderSrRatio = ( ( float ) renderFormat->nSamplesPerSec / stream_.sampleRate ); - - // initialize render stream according to desire buffer size - float desiredBufferSize = stream_.bufferSize * renderSrRatio; - REFERENCE_TIME desiredBufferPeriod = ( REFERENCE_TIME ) ( ( float ) desiredBufferSize * 10000000 / renderFormat->nSamplesPerSec ); - - if ( !renderClient ) { - hr = renderAudioClient->Initialize( AUDCLNT_SHAREMODE_SHARED, - AUDCLNT_STREAMFLAGS_EVENTCALLBACK, - desiredBufferPeriod, - desiredBufferPeriod, - renderFormat, - NULL ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::wasapiThread: Unable to initialize render audio client."; - goto Exit; - } - - hr = renderAudioClient->GetService( __uuidof( IAudioRenderClient ), - ( void** ) &renderClient ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::wasapiThread: Unable to retrieve render client handle."; - goto Exit; - } - - // configure renderEvent to trigger on every available render buffer - renderEvent = CreateEvent( NULL, FALSE, FALSE, NULL ); - if ( !renderEvent ) { - errorType = RtAudioError::SYSTEM_ERROR; - errorText_ = "RtApiWasapi::wasapiThread: Unable to create render event."; - goto Exit; - } - - hr = renderAudioClient->SetEventHandle( renderEvent ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::wasapiThread: Unable to set render event handle."; - goto Exit; - } - - ( ( WasapiHandle* ) stream_.apiHandle )->renderClient = renderClient; - ( ( WasapiHandle* ) stream_.apiHandle )->renderEvent = renderEvent; - } - - unsigned int outBufferSize = 0; - hr = renderAudioClient->GetBufferSize( &outBufferSize ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::wasapiThread: Unable to get render buffer size."; - goto Exit; - } - - // scale inBufferSize according to user->stream sample rate ratio - unsigned int inBufferSize = ( unsigned int ) ( stream_.bufferSize * renderSrRatio ) * stream_.nDeviceChannels[OUTPUT]; - outBufferSize *= stream_.nDeviceChannels[OUTPUT]; - - // set renderBuffer size - renderBuffer.setBufferSize( inBufferSize + outBufferSize, formatBytes( stream_.deviceFormat[OUTPUT] ) ); - - // reset the render stream - hr = renderAudioClient->Reset(); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::wasapiThread: Unable to reset render stream."; - goto Exit; - } - - // start the render stream - hr = renderAudioClient->Start(); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::wasapiThread: Unable to start render stream."; - goto Exit; - } - } - - if ( stream_.mode == INPUT ) { - convBuffSize = ( size_t ) ( stream_.bufferSize * captureSrRatio ) * stream_.nDeviceChannels[INPUT] * formatBytes( stream_.deviceFormat[INPUT] ); - deviceBuffSize = stream_.bufferSize * stream_.nDeviceChannels[INPUT] * formatBytes( stream_.deviceFormat[INPUT] ); - } - else if ( stream_.mode == OUTPUT ) { - convBuffSize = ( size_t ) ( stream_.bufferSize * renderSrRatio ) * stream_.nDeviceChannels[OUTPUT] * formatBytes( stream_.deviceFormat[OUTPUT] ); - deviceBuffSize = stream_.bufferSize * stream_.nDeviceChannels[OUTPUT] * formatBytes( stream_.deviceFormat[OUTPUT] ); - } - else if ( stream_.mode == DUPLEX ) { - convBuffSize = std::max( ( size_t ) ( stream_.bufferSize * captureSrRatio ) * stream_.nDeviceChannels[INPUT] * formatBytes( stream_.deviceFormat[INPUT] ), - ( size_t ) ( stream_.bufferSize * renderSrRatio ) * stream_.nDeviceChannels[OUTPUT] * formatBytes( stream_.deviceFormat[OUTPUT] ) ); - deviceBuffSize = std::max( stream_.bufferSize * stream_.nDeviceChannels[INPUT] * formatBytes( stream_.deviceFormat[INPUT] ), - stream_.bufferSize * stream_.nDeviceChannels[OUTPUT] * formatBytes( stream_.deviceFormat[OUTPUT] ) ); - } - - convBuffer = ( char* ) malloc( convBuffSize ); - stream_.deviceBuffer = ( char* ) malloc( deviceBuffSize ); - if ( !convBuffer || !stream_.deviceBuffer ) { - errorType = RtAudioError::MEMORY_ERROR; - errorText_ = "RtApiWasapi::wasapiThread: Error allocating device buffer memory."; - goto Exit; - } - - // stream process loop - while ( stream_.state != STREAM_STOPPING ) { - if ( !callbackPulled ) { - // Callback Input - // ============== - // 1. Pull callback buffer from inputBuffer - // 2. If 1. was successful: Convert callback buffer to user sample rate and channel count - // Convert callback buffer to user format - - if ( captureAudioClient ) { - // Pull callback buffer from inputBuffer - callbackPulled = captureBuffer.pullBuffer( convBuffer, - ( unsigned int ) ( stream_.bufferSize * captureSrRatio ) * stream_.nDeviceChannels[INPUT], - stream_.deviceFormat[INPUT] ); - - if ( callbackPulled ) { - // Convert callback buffer to user sample rate - convertBufferWasapi( stream_.deviceBuffer, - convBuffer, - stream_.nDeviceChannels[INPUT], - captureFormat->nSamplesPerSec, - stream_.sampleRate, - ( unsigned int ) ( stream_.bufferSize * captureSrRatio ), - convBufferSize, - stream_.deviceFormat[INPUT] ); - - if ( stream_.doConvertBuffer[INPUT] ) { - // Convert callback buffer to user format - convertBuffer( stream_.userBuffer[INPUT], - stream_.deviceBuffer, - stream_.convertInfo[INPUT] ); - } - else { - // no further conversion, simple copy deviceBuffer to userBuffer - memcpy( stream_.userBuffer[INPUT], - stream_.deviceBuffer, - stream_.bufferSize * stream_.nUserChannels[INPUT] * formatBytes( stream_.userFormat ) ); - } - } - } - else { - // if there is no capture stream, set callbackPulled flag - callbackPulled = true; - } - - // Execute Callback - // ================ - // 1. Execute user callback method - // 2. Handle return value from callback - - // if callback has not requested the stream to stop - if ( callbackPulled && !callbackStopped ) { - // Execute user callback method - callbackResult = callback( stream_.userBuffer[OUTPUT], - stream_.userBuffer[INPUT], - stream_.bufferSize, - getStreamTime(), - captureFlags & AUDCLNT_BUFFERFLAGS_DATA_DISCONTINUITY ? RTAUDIO_INPUT_OVERFLOW : 0, - stream_.callbackInfo.userData ); - - // Handle return value from callback - if ( callbackResult == 1 ) { - // instantiate a thread to stop this thread - HANDLE threadHandle = CreateThread( NULL, 0, stopWasapiThread, this, 0, NULL ); - if ( !threadHandle ) { - errorType = RtAudioError::THREAD_ERROR; - errorText_ = "RtApiWasapi::wasapiThread: Unable to instantiate stream stop thread."; - goto Exit; - } - else if ( !CloseHandle( threadHandle ) ) { - errorType = RtAudioError::THREAD_ERROR; - errorText_ = "RtApiWasapi::wasapiThread: Unable to close stream stop thread handle."; - goto Exit; - } - - callbackStopped = true; - } - else if ( callbackResult == 2 ) { - // instantiate a thread to stop this thread - HANDLE threadHandle = CreateThread( NULL, 0, abortWasapiThread, this, 0, NULL ); - if ( !threadHandle ) { - errorType = RtAudioError::THREAD_ERROR; - errorText_ = "RtApiWasapi::wasapiThread: Unable to instantiate stream abort thread."; - goto Exit; - } - else if ( !CloseHandle( threadHandle ) ) { - errorType = RtAudioError::THREAD_ERROR; - errorText_ = "RtApiWasapi::wasapiThread: Unable to close stream abort thread handle."; - goto Exit; - } - - callbackStopped = true; - } - } - } - - // Callback Output - // =============== - // 1. Convert callback buffer to stream format - // 2. Convert callback buffer to stream sample rate and channel count - // 3. Push callback buffer into outputBuffer - - if ( renderAudioClient && callbackPulled ) { - if ( stream_.doConvertBuffer[OUTPUT] ) { - // Convert callback buffer to stream format - convertBuffer( stream_.deviceBuffer, - stream_.userBuffer[OUTPUT], - stream_.convertInfo[OUTPUT] ); - - } - - // Convert callback buffer to stream sample rate - convertBufferWasapi( convBuffer, - stream_.deviceBuffer, - stream_.nDeviceChannels[OUTPUT], - stream_.sampleRate, - renderFormat->nSamplesPerSec, - stream_.bufferSize, - convBufferSize, - stream_.deviceFormat[OUTPUT] ); - - // Push callback buffer into outputBuffer - callbackPushed = renderBuffer.pushBuffer( convBuffer, - convBufferSize * stream_.nDeviceChannels[OUTPUT], - stream_.deviceFormat[OUTPUT] ); - } - else { - // if there is no render stream, set callbackPushed flag - callbackPushed = true; - } - - // Stream Capture - // ============== - // 1. Get capture buffer from stream - // 2. Push capture buffer into inputBuffer - // 3. If 2. was successful: Release capture buffer - - if ( captureAudioClient ) { - // if the callback input buffer was not pulled from captureBuffer, wait for next capture event - if ( !callbackPulled ) { - WaitForSingleObject( captureEvent, INFINITE ); - } - - // Get capture buffer from stream - hr = captureClient->GetBuffer( &streamBuffer, - &bufferFrameCount, - &captureFlags, NULL, NULL ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::wasapiThread: Unable to retrieve capture buffer."; - goto Exit; - } - - if ( bufferFrameCount != 0 ) { - // Push capture buffer into inputBuffer - if ( captureBuffer.pushBuffer( ( char* ) streamBuffer, - bufferFrameCount * stream_.nDeviceChannels[INPUT], - stream_.deviceFormat[INPUT] ) ) - { - // Release capture buffer - hr = captureClient->ReleaseBuffer( bufferFrameCount ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::wasapiThread: Unable to release capture buffer."; - goto Exit; - } - } - else - { - // Inform WASAPI that capture was unsuccessful - hr = captureClient->ReleaseBuffer( 0 ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::wasapiThread: Unable to release capture buffer."; - goto Exit; - } - } - } - else - { - // Inform WASAPI that capture was unsuccessful - hr = captureClient->ReleaseBuffer( 0 ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::wasapiThread: Unable to release capture buffer."; - goto Exit; - } - } - } - - // Stream Render - // ============= - // 1. Get render buffer from stream - // 2. Pull next buffer from outputBuffer - // 3. If 2. was successful: Fill render buffer with next buffer - // Release render buffer - - if ( renderAudioClient ) { - // if the callback output buffer was not pushed to renderBuffer, wait for next render event - if ( callbackPulled && !callbackPushed ) { - WaitForSingleObject( renderEvent, INFINITE ); - } - - // Get render buffer from stream - hr = renderAudioClient->GetBufferSize( &bufferFrameCount ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::wasapiThread: Unable to retrieve render buffer size."; - goto Exit; - } - - hr = renderAudioClient->GetCurrentPadding( &numFramesPadding ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::wasapiThread: Unable to retrieve render buffer padding."; - goto Exit; - } - - bufferFrameCount -= numFramesPadding; - - if ( bufferFrameCount != 0 ) { - hr = renderClient->GetBuffer( bufferFrameCount, &streamBuffer ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::wasapiThread: Unable to retrieve render buffer."; - goto Exit; - } - - // Pull next buffer from outputBuffer - // Fill render buffer with next buffer - if ( renderBuffer.pullBuffer( ( char* ) streamBuffer, - bufferFrameCount * stream_.nDeviceChannels[OUTPUT], - stream_.deviceFormat[OUTPUT] ) ) - { - // Release render buffer - hr = renderClient->ReleaseBuffer( bufferFrameCount, 0 ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::wasapiThread: Unable to release render buffer."; - goto Exit; - } - } - else - { - // Inform WASAPI that render was unsuccessful - hr = renderClient->ReleaseBuffer( 0, 0 ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::wasapiThread: Unable to release render buffer."; - goto Exit; - } - } - } - else - { - // Inform WASAPI that render was unsuccessful - hr = renderClient->ReleaseBuffer( 0, 0 ); - if ( FAILED( hr ) ) { - errorText_ = "RtApiWasapi::wasapiThread: Unable to release render buffer."; - goto Exit; - } - } - } - - // if the callback buffer was pushed renderBuffer reset callbackPulled flag - if ( callbackPushed ) { - callbackPulled = false; - } - - // tick stream time - RtApi::tickStreamTime(); - } - -Exit: - // clean up - CoTaskMemFree( captureFormat ); - CoTaskMemFree( renderFormat ); - - free ( convBuffer ); - - CoUninitialize(); - - // update stream state - stream_.state = STREAM_STOPPED; - - if ( errorText_.empty() ) - return; - else - error( errorType ); -} - -//******************** End of __WINDOWS_WASAPI__ *********************// -#endif - - -#if defined(__WINDOWS_DS__) // Windows DirectSound API - -// Modified by Robin Davies, October 2005 -// - Improvements to DirectX pointer chasing. -// - Bug fix for non-power-of-two Asio granularity used by Edirol PCR-A30. -// - Auto-call CoInitialize for DSOUND and ASIO platforms. -// Various revisions for RtAudio 4.0 by Gary Scavone, April 2007 -// Changed device query structure for RtAudio 4.0.7, January 2010 - -#include -#include -#include - -#if defined(__MINGW32__) - // missing from latest mingw winapi -#define WAVE_FORMAT_96M08 0x00010000 /* 96 kHz, Mono, 8-bit */ -#define WAVE_FORMAT_96S08 0x00020000 /* 96 kHz, Stereo, 8-bit */ -#define WAVE_FORMAT_96M16 0x00040000 /* 96 kHz, Mono, 16-bit */ -#define WAVE_FORMAT_96S16 0x00080000 /* 96 kHz, Stereo, 16-bit */ -#endif - -#define MINIMUM_DEVICE_BUFFER_SIZE 32768 - -#ifdef _MSC_VER // if Microsoft Visual C++ -#pragma comment( lib, "winmm.lib" ) // then, auto-link winmm.lib. Otherwise, it has to be added manually. -#endif - -static inline DWORD dsPointerBetween( DWORD pointer, DWORD laterPointer, DWORD earlierPointer, DWORD bufferSize ) -{ - if ( pointer > bufferSize ) pointer -= bufferSize; - if ( laterPointer < earlierPointer ) laterPointer += bufferSize; - if ( pointer < earlierPointer ) pointer += bufferSize; - return pointer >= earlierPointer && pointer < laterPointer; -} - -// A structure to hold various information related to the DirectSound -// API implementation. -struct DsHandle { - unsigned int drainCounter; // Tracks callback counts when draining - bool internalDrain; // Indicates if stop is initiated from callback or not. - void *id[2]; - void *buffer[2]; - bool xrun[2]; - UINT bufferPointer[2]; - DWORD dsBufferSize[2]; - DWORD dsPointerLeadTime[2]; // the number of bytes ahead of the safe pointer to lead by. - HANDLE condition; - - DsHandle() - :drainCounter(0), internalDrain(false) { id[0] = 0; id[1] = 0; buffer[0] = 0; buffer[1] = 0; xrun[0] = false; xrun[1] = false; bufferPointer[0] = 0; bufferPointer[1] = 0; } -}; - -// Declarations for utility functions, callbacks, and structures -// specific to the DirectSound implementation. -static BOOL CALLBACK deviceQueryCallback( LPGUID lpguid, - LPCTSTR description, - LPCTSTR module, - LPVOID lpContext ); - -static const char* getErrorString( int code ); - -static unsigned __stdcall callbackHandler( void *ptr ); - -struct DsDevice { - LPGUID id[2]; - bool validId[2]; - bool found; - std::string name; - - DsDevice() - : found(false) { validId[0] = false; validId[1] = false; } -}; - -struct DsProbeData { - bool isInput; - std::vector* dsDevices; -}; - -RtApiDs :: RtApiDs() -{ - // Dsound will run both-threaded. If CoInitialize fails, then just - // accept whatever the mainline chose for a threading model. - coInitialized_ = false; - HRESULT hr = CoInitialize( NULL ); - if ( !FAILED( hr ) ) coInitialized_ = true; -} - -RtApiDs :: ~RtApiDs() -{ - if ( coInitialized_ ) CoUninitialize(); // balanced call. - if ( stream_.state != STREAM_CLOSED ) closeStream(); -} - -// The DirectSound default output is always the first device. -unsigned int RtApiDs :: getDefaultOutputDevice( void ) -{ - return 0; -} - -// The DirectSound default input is always the first input device, -// which is the first capture device enumerated. -unsigned int RtApiDs :: getDefaultInputDevice( void ) -{ - return 0; -} - -unsigned int RtApiDs :: getDeviceCount( void ) -{ - // Set query flag for previously found devices to false, so that we - // can check for any devices that have disappeared. - for ( unsigned int i=0; i indices; - for ( unsigned int i=0; i(dsDevices.size()); -} - -RtAudio::DeviceInfo RtApiDs :: getDeviceInfo( unsigned int device ) -{ - RtAudio::DeviceInfo info; - info.probed = false; - - if ( dsDevices.size() == 0 ) { - // Force a query of all devices - getDeviceCount(); - if ( dsDevices.size() == 0 ) { - errorText_ = "RtApiDs::getDeviceInfo: no devices found!"; - error( RtAudioError::INVALID_USE ); - return info; - } - } - - if ( device >= dsDevices.size() ) { - errorText_ = "RtApiDs::getDeviceInfo: device ID is invalid!"; - error( RtAudioError::INVALID_USE ); - return info; - } - - HRESULT result; - if ( dsDevices[ device ].validId[0] == false ) goto probeInput; - - LPDIRECTSOUND output; - DSCAPS outCaps; - result = DirectSoundCreate( dsDevices[ device ].id[0], &output, NULL ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::getDeviceInfo: error (" << getErrorString( result ) << ") opening output device (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - goto probeInput; - } - - outCaps.dwSize = sizeof( outCaps ); - result = output->GetCaps( &outCaps ); - if ( FAILED( result ) ) { - output->Release(); - errorStream_ << "RtApiDs::getDeviceInfo: error (" << getErrorString( result ) << ") getting capabilities!"; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - goto probeInput; - } - - // Get output channel information. - info.outputChannels = ( outCaps.dwFlags & DSCAPS_PRIMARYSTEREO ) ? 2 : 1; - - // Get sample rate information. - info.sampleRates.clear(); - for ( unsigned int k=0; k= (unsigned int) outCaps.dwMinSecondarySampleRate && - SAMPLE_RATES[k] <= (unsigned int) outCaps.dwMaxSecondarySampleRate ) { - info.sampleRates.push_back( SAMPLE_RATES[k] ); - - if ( !info.preferredSampleRate || ( SAMPLE_RATES[k] <= 48000 && SAMPLE_RATES[k] > info.preferredSampleRate ) ) - info.preferredSampleRate = SAMPLE_RATES[k]; - } - } - - // Get format information. - if ( outCaps.dwFlags & DSCAPS_PRIMARY16BIT ) info.nativeFormats |= RTAUDIO_SINT16; - if ( outCaps.dwFlags & DSCAPS_PRIMARY8BIT ) info.nativeFormats |= RTAUDIO_SINT8; - - output->Release(); - - if ( getDefaultOutputDevice() == device ) - info.isDefaultOutput = true; - - if ( dsDevices[ device ].validId[1] == false ) { - info.name = dsDevices[ device ].name; - info.probed = true; - return info; - } - - probeInput: - - LPDIRECTSOUNDCAPTURE input; - result = DirectSoundCaptureCreate( dsDevices[ device ].id[1], &input, NULL ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::getDeviceInfo: error (" << getErrorString( result ) << ") opening input device (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - return info; - } - - DSCCAPS inCaps; - inCaps.dwSize = sizeof( inCaps ); - result = input->GetCaps( &inCaps ); - if ( FAILED( result ) ) { - input->Release(); - errorStream_ << "RtApiDs::getDeviceInfo: error (" << getErrorString( result ) << ") getting object capabilities (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - return info; - } - - // Get input channel information. - info.inputChannels = inCaps.dwChannels; - - // Get sample rate and format information. - std::vector rates; - if ( inCaps.dwChannels >= 2 ) { - if ( inCaps.dwFormats & WAVE_FORMAT_1S16 ) info.nativeFormats |= RTAUDIO_SINT16; - if ( inCaps.dwFormats & WAVE_FORMAT_2S16 ) info.nativeFormats |= RTAUDIO_SINT16; - if ( inCaps.dwFormats & WAVE_FORMAT_4S16 ) info.nativeFormats |= RTAUDIO_SINT16; - if ( inCaps.dwFormats & WAVE_FORMAT_96S16 ) info.nativeFormats |= RTAUDIO_SINT16; - if ( inCaps.dwFormats & WAVE_FORMAT_1S08 ) info.nativeFormats |= RTAUDIO_SINT8; - if ( inCaps.dwFormats & WAVE_FORMAT_2S08 ) info.nativeFormats |= RTAUDIO_SINT8; - if ( inCaps.dwFormats & WAVE_FORMAT_4S08 ) info.nativeFormats |= RTAUDIO_SINT8; - if ( inCaps.dwFormats & WAVE_FORMAT_96S08 ) info.nativeFormats |= RTAUDIO_SINT8; - - if ( info.nativeFormats & RTAUDIO_SINT16 ) { - if ( inCaps.dwFormats & WAVE_FORMAT_1S16 ) rates.push_back( 11025 ); - if ( inCaps.dwFormats & WAVE_FORMAT_2S16 ) rates.push_back( 22050 ); - if ( inCaps.dwFormats & WAVE_FORMAT_4S16 ) rates.push_back( 44100 ); - if ( inCaps.dwFormats & WAVE_FORMAT_96S16 ) rates.push_back( 96000 ); - } - else if ( info.nativeFormats & RTAUDIO_SINT8 ) { - if ( inCaps.dwFormats & WAVE_FORMAT_1S08 ) rates.push_back( 11025 ); - if ( inCaps.dwFormats & WAVE_FORMAT_2S08 ) rates.push_back( 22050 ); - if ( inCaps.dwFormats & WAVE_FORMAT_4S08 ) rates.push_back( 44100 ); - if ( inCaps.dwFormats & WAVE_FORMAT_96S08 ) rates.push_back( 96000 ); - } - } - else if ( inCaps.dwChannels == 1 ) { - if ( inCaps.dwFormats & WAVE_FORMAT_1M16 ) info.nativeFormats |= RTAUDIO_SINT16; - if ( inCaps.dwFormats & WAVE_FORMAT_2M16 ) info.nativeFormats |= RTAUDIO_SINT16; - if ( inCaps.dwFormats & WAVE_FORMAT_4M16 ) info.nativeFormats |= RTAUDIO_SINT16; - if ( inCaps.dwFormats & WAVE_FORMAT_96M16 ) info.nativeFormats |= RTAUDIO_SINT16; - if ( inCaps.dwFormats & WAVE_FORMAT_1M08 ) info.nativeFormats |= RTAUDIO_SINT8; - if ( inCaps.dwFormats & WAVE_FORMAT_2M08 ) info.nativeFormats |= RTAUDIO_SINT8; - if ( inCaps.dwFormats & WAVE_FORMAT_4M08 ) info.nativeFormats |= RTAUDIO_SINT8; - if ( inCaps.dwFormats & WAVE_FORMAT_96M08 ) info.nativeFormats |= RTAUDIO_SINT8; - - if ( info.nativeFormats & RTAUDIO_SINT16 ) { - if ( inCaps.dwFormats & WAVE_FORMAT_1M16 ) rates.push_back( 11025 ); - if ( inCaps.dwFormats & WAVE_FORMAT_2M16 ) rates.push_back( 22050 ); - if ( inCaps.dwFormats & WAVE_FORMAT_4M16 ) rates.push_back( 44100 ); - if ( inCaps.dwFormats & WAVE_FORMAT_96M16 ) rates.push_back( 96000 ); - } - else if ( info.nativeFormats & RTAUDIO_SINT8 ) { - if ( inCaps.dwFormats & WAVE_FORMAT_1M08 ) rates.push_back( 11025 ); - if ( inCaps.dwFormats & WAVE_FORMAT_2M08 ) rates.push_back( 22050 ); - if ( inCaps.dwFormats & WAVE_FORMAT_4M08 ) rates.push_back( 44100 ); - if ( inCaps.dwFormats & WAVE_FORMAT_96M08 ) rates.push_back( 96000 ); - } - } - else info.inputChannels = 0; // technically, this would be an error - - input->Release(); - - if ( info.inputChannels == 0 ) return info; - - // Copy the supported rates to the info structure but avoid duplication. - bool found; - for ( unsigned int i=0; i 0 && info.inputChannels > 0 ) - info.duplexChannels = (info.outputChannels > info.inputChannels) ? info.inputChannels : info.outputChannels; - - if ( device == 0 ) info.isDefaultInput = true; - - // Copy name and return. - info.name = dsDevices[ device ].name; - info.probed = true; - return info; -} - -bool RtApiDs :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, - unsigned int firstChannel, unsigned int sampleRate, - RtAudioFormat format, unsigned int *bufferSize, - RtAudio::StreamOptions *options ) -{ - if ( channels + firstChannel > 2 ) { - errorText_ = "RtApiDs::probeDeviceOpen: DirectSound does not support more than 2 channels per device."; - return FAILURE; - } - - size_t nDevices = dsDevices.size(); - if ( nDevices == 0 ) { - // This should not happen because a check is made before this function is called. - errorText_ = "RtApiDs::probeDeviceOpen: no devices found!"; - return FAILURE; - } - - if ( device >= nDevices ) { - // This should not happen because a check is made before this function is called. - errorText_ = "RtApiDs::probeDeviceOpen: device ID is invalid!"; - return FAILURE; - } - - if ( mode == OUTPUT ) { - if ( dsDevices[ device ].validId[0] == false ) { - errorStream_ << "RtApiDs::probeDeviceOpen: device (" << device << ") does not support output!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - } - else { // mode == INPUT - if ( dsDevices[ device ].validId[1] == false ) { - errorStream_ << "RtApiDs::probeDeviceOpen: device (" << device << ") does not support input!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - } - - // According to a note in PortAudio, using GetDesktopWindow() - // instead of GetForegroundWindow() is supposed to avoid problems - // that occur when the application's window is not the foreground - // window. Also, if the application window closes before the - // DirectSound buffer, DirectSound can crash. In the past, I had - // problems when using GetDesktopWindow() but it seems fine now - // (January 2010). I'll leave it commented here. - // HWND hWnd = GetForegroundWindow(); - HWND hWnd = GetDesktopWindow(); - - // Check the numberOfBuffers parameter and limit the lowest value to - // two. This is a judgement call and a value of two is probably too - // low for capture, but it should work for playback. - int nBuffers = 0; - if ( options ) nBuffers = options->numberOfBuffers; - if ( options && options->flags & RTAUDIO_MINIMIZE_LATENCY ) nBuffers = 2; - if ( nBuffers < 2 ) nBuffers = 3; - - // Check the lower range of the user-specified buffer size and set - // (arbitrarily) to a lower bound of 32. - if ( *bufferSize < 32 ) *bufferSize = 32; - - // Create the wave format structure. The data format setting will - // be determined later. - WAVEFORMATEX waveFormat; - ZeroMemory( &waveFormat, sizeof(WAVEFORMATEX) ); - waveFormat.wFormatTag = WAVE_FORMAT_PCM; - waveFormat.nChannels = channels + firstChannel; - waveFormat.nSamplesPerSec = (unsigned long) sampleRate; - - // Determine the device buffer size. By default, we'll use the value - // defined above (32K), but we will grow it to make allowances for - // very large software buffer sizes. - DWORD dsBufferSize = MINIMUM_DEVICE_BUFFER_SIZE; - DWORD dsPointerLeadTime = 0; - - void *ohandle = 0, *bhandle = 0; - HRESULT result; - if ( mode == OUTPUT ) { - - LPDIRECTSOUND output; - result = DirectSoundCreate( dsDevices[ device ].id[0], &output, NULL ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") opening output device (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - - DSCAPS outCaps; - outCaps.dwSize = sizeof( outCaps ); - result = output->GetCaps( &outCaps ); - if ( FAILED( result ) ) { - output->Release(); - errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") getting capabilities (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Check channel information. - if ( channels + firstChannel == 2 && !( outCaps.dwFlags & DSCAPS_PRIMARYSTEREO ) ) { - errorStream_ << "RtApiDs::getDeviceInfo: the output device (" << dsDevices[ device ].name << ") does not support stereo playback."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Check format information. Use 16-bit format unless not - // supported or user requests 8-bit. - if ( outCaps.dwFlags & DSCAPS_PRIMARY16BIT && - !( format == RTAUDIO_SINT8 && outCaps.dwFlags & DSCAPS_PRIMARY8BIT ) ) { - waveFormat.wBitsPerSample = 16; - stream_.deviceFormat[mode] = RTAUDIO_SINT16; - } - else { - waveFormat.wBitsPerSample = 8; - stream_.deviceFormat[mode] = RTAUDIO_SINT8; - } - stream_.userFormat = format; - - // Update wave format structure and buffer information. - waveFormat.nBlockAlign = waveFormat.nChannels * waveFormat.wBitsPerSample / 8; - waveFormat.nAvgBytesPerSec = waveFormat.nSamplesPerSec * waveFormat.nBlockAlign; - dsPointerLeadTime = nBuffers * (*bufferSize) * (waveFormat.wBitsPerSample / 8) * channels; - - // If the user wants an even bigger buffer, increase the device buffer size accordingly. - while ( dsPointerLeadTime * 2U > dsBufferSize ) - dsBufferSize *= 2; - - // Set cooperative level to DSSCL_EXCLUSIVE ... sound stops when window focus changes. - // result = output->SetCooperativeLevel( hWnd, DSSCL_EXCLUSIVE ); - // Set cooperative level to DSSCL_PRIORITY ... sound remains when window focus changes. - result = output->SetCooperativeLevel( hWnd, DSSCL_PRIORITY ); - if ( FAILED( result ) ) { - output->Release(); - errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") setting cooperative level (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Even though we will write to the secondary buffer, we need to - // access the primary buffer to set the correct output format - // (since the default is 8-bit, 22 kHz!). Setup the DS primary - // buffer description. - DSBUFFERDESC bufferDescription; - ZeroMemory( &bufferDescription, sizeof( DSBUFFERDESC ) ); - bufferDescription.dwSize = sizeof( DSBUFFERDESC ); - bufferDescription.dwFlags = DSBCAPS_PRIMARYBUFFER; - - // Obtain the primary buffer - LPDIRECTSOUNDBUFFER buffer; - result = output->CreateSoundBuffer( &bufferDescription, &buffer, NULL ); - if ( FAILED( result ) ) { - output->Release(); - errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") accessing primary buffer (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Set the primary DS buffer sound format. - result = buffer->SetFormat( &waveFormat ); - if ( FAILED( result ) ) { - output->Release(); - errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") setting primary buffer format (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Setup the secondary DS buffer description. - ZeroMemory( &bufferDescription, sizeof( DSBUFFERDESC ) ); - bufferDescription.dwSize = sizeof( DSBUFFERDESC ); - bufferDescription.dwFlags = ( DSBCAPS_STICKYFOCUS | - DSBCAPS_GLOBALFOCUS | - DSBCAPS_GETCURRENTPOSITION2 | - DSBCAPS_LOCHARDWARE ); // Force hardware mixing - bufferDescription.dwBufferBytes = dsBufferSize; - bufferDescription.lpwfxFormat = &waveFormat; - - // Try to create the secondary DS buffer. If that doesn't work, - // try to use software mixing. Otherwise, there's a problem. - result = output->CreateSoundBuffer( &bufferDescription, &buffer, NULL ); - if ( FAILED( result ) ) { - bufferDescription.dwFlags = ( DSBCAPS_STICKYFOCUS | - DSBCAPS_GLOBALFOCUS | - DSBCAPS_GETCURRENTPOSITION2 | - DSBCAPS_LOCSOFTWARE ); // Force software mixing - result = output->CreateSoundBuffer( &bufferDescription, &buffer, NULL ); - if ( FAILED( result ) ) { - output->Release(); - errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") creating secondary buffer (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - } - - // Get the buffer size ... might be different from what we specified. - DSBCAPS dsbcaps; - dsbcaps.dwSize = sizeof( DSBCAPS ); - result = buffer->GetCaps( &dsbcaps ); - if ( FAILED( result ) ) { - output->Release(); - buffer->Release(); - errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") getting buffer settings (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - - dsBufferSize = dsbcaps.dwBufferBytes; - - // Lock the DS buffer - LPVOID audioPtr; - DWORD dataLen; - result = buffer->Lock( 0, dsBufferSize, &audioPtr, &dataLen, NULL, NULL, 0 ); - if ( FAILED( result ) ) { - output->Release(); - buffer->Release(); - errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") locking buffer (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Zero the DS buffer - ZeroMemory( audioPtr, dataLen ); - - // Unlock the DS buffer - result = buffer->Unlock( audioPtr, dataLen, NULL, 0 ); - if ( FAILED( result ) ) { - output->Release(); - buffer->Release(); - errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") unlocking buffer (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - - ohandle = (void *) output; - bhandle = (void *) buffer; - } - - if ( mode == INPUT ) { - - LPDIRECTSOUNDCAPTURE input; - result = DirectSoundCaptureCreate( dsDevices[ device ].id[1], &input, NULL ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") opening input device (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - - DSCCAPS inCaps; - inCaps.dwSize = sizeof( inCaps ); - result = input->GetCaps( &inCaps ); - if ( FAILED( result ) ) { - input->Release(); - errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") getting input capabilities (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Check channel information. - if ( inCaps.dwChannels < channels + firstChannel ) { - errorText_ = "RtApiDs::getDeviceInfo: the input device does not support requested input channels."; - return FAILURE; - } - - // Check format information. Use 16-bit format unless user - // requests 8-bit. - DWORD deviceFormats; - if ( channels + firstChannel == 2 ) { - deviceFormats = WAVE_FORMAT_1S08 | WAVE_FORMAT_2S08 | WAVE_FORMAT_4S08 | WAVE_FORMAT_96S08; - if ( format == RTAUDIO_SINT8 && inCaps.dwFormats & deviceFormats ) { - waveFormat.wBitsPerSample = 8; - stream_.deviceFormat[mode] = RTAUDIO_SINT8; - } - else { // assume 16-bit is supported - waveFormat.wBitsPerSample = 16; - stream_.deviceFormat[mode] = RTAUDIO_SINT16; - } - } - else { // channel == 1 - deviceFormats = WAVE_FORMAT_1M08 | WAVE_FORMAT_2M08 | WAVE_FORMAT_4M08 | WAVE_FORMAT_96M08; - if ( format == RTAUDIO_SINT8 && inCaps.dwFormats & deviceFormats ) { - waveFormat.wBitsPerSample = 8; - stream_.deviceFormat[mode] = RTAUDIO_SINT8; - } - else { // assume 16-bit is supported - waveFormat.wBitsPerSample = 16; - stream_.deviceFormat[mode] = RTAUDIO_SINT16; - } - } - stream_.userFormat = format; - - // Update wave format structure and buffer information. - waveFormat.nBlockAlign = waveFormat.nChannels * waveFormat.wBitsPerSample / 8; - waveFormat.nAvgBytesPerSec = waveFormat.nSamplesPerSec * waveFormat.nBlockAlign; - dsPointerLeadTime = nBuffers * (*bufferSize) * (waveFormat.wBitsPerSample / 8) * channels; - - // If the user wants an even bigger buffer, increase the device buffer size accordingly. - while ( dsPointerLeadTime * 2U > dsBufferSize ) - dsBufferSize *= 2; - - // Setup the secondary DS buffer description. - DSCBUFFERDESC bufferDescription; - ZeroMemory( &bufferDescription, sizeof( DSCBUFFERDESC ) ); - bufferDescription.dwSize = sizeof( DSCBUFFERDESC ); - bufferDescription.dwFlags = 0; - bufferDescription.dwReserved = 0; - bufferDescription.dwBufferBytes = dsBufferSize; - bufferDescription.lpwfxFormat = &waveFormat; - - // Create the capture buffer. - LPDIRECTSOUNDCAPTUREBUFFER buffer; - result = input->CreateCaptureBuffer( &bufferDescription, &buffer, NULL ); - if ( FAILED( result ) ) { - input->Release(); - errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") creating input buffer (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Get the buffer size ... might be different from what we specified. - DSCBCAPS dscbcaps; - dscbcaps.dwSize = sizeof( DSCBCAPS ); - result = buffer->GetCaps( &dscbcaps ); - if ( FAILED( result ) ) { - input->Release(); - buffer->Release(); - errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") getting buffer settings (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - - dsBufferSize = dscbcaps.dwBufferBytes; - - // NOTE: We could have a problem here if this is a duplex stream - // and the play and capture hardware buffer sizes are different - // (I'm actually not sure if that is a problem or not). - // Currently, we are not verifying that. - - // Lock the capture buffer - LPVOID audioPtr; - DWORD dataLen; - result = buffer->Lock( 0, dsBufferSize, &audioPtr, &dataLen, NULL, NULL, 0 ); - if ( FAILED( result ) ) { - input->Release(); - buffer->Release(); - errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") locking input buffer (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Zero the buffer - ZeroMemory( audioPtr, dataLen ); - - // Unlock the buffer - result = buffer->Unlock( audioPtr, dataLen, NULL, 0 ); - if ( FAILED( result ) ) { - input->Release(); - buffer->Release(); - errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") unlocking input buffer (" << dsDevices[ device ].name << ")!"; - errorText_ = errorStream_.str(); - return FAILURE; - } - - ohandle = (void *) input; - bhandle = (void *) buffer; - } - - // Set various stream parameters - DsHandle *handle = 0; - stream_.nDeviceChannels[mode] = channels + firstChannel; - stream_.nUserChannels[mode] = channels; - stream_.bufferSize = *bufferSize; - stream_.channelOffset[mode] = firstChannel; - stream_.deviceInterleaved[mode] = true; - if ( options && options->flags & RTAUDIO_NONINTERLEAVED ) stream_.userInterleaved = false; - else stream_.userInterleaved = true; - - // Set flag for buffer conversion - stream_.doConvertBuffer[mode] = false; - if (stream_.nUserChannels[mode] != stream_.nDeviceChannels[mode]) - stream_.doConvertBuffer[mode] = true; - if (stream_.userFormat != stream_.deviceFormat[mode]) - stream_.doConvertBuffer[mode] = true; - if ( stream_.userInterleaved != stream_.deviceInterleaved[mode] && - stream_.nUserChannels[mode] > 1 ) - stream_.doConvertBuffer[mode] = true; - - // Allocate necessary internal buffers - long bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); - stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); - if ( stream_.userBuffer[mode] == NULL ) { - errorText_ = "RtApiDs::probeDeviceOpen: error allocating user buffer memory."; - goto error; - } - - if ( stream_.doConvertBuffer[mode] ) { - - bool makeBuffer = true; - bufferBytes = stream_.nDeviceChannels[mode] * formatBytes( stream_.deviceFormat[mode] ); - if ( mode == INPUT ) { - if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { - unsigned long bytesOut = stream_.nDeviceChannels[0] * formatBytes( stream_.deviceFormat[0] ); - if ( bufferBytes <= (long) bytesOut ) makeBuffer = false; - } - } - - if ( makeBuffer ) { - bufferBytes *= *bufferSize; - if ( stream_.deviceBuffer ) free( stream_.deviceBuffer ); - stream_.deviceBuffer = (char *) calloc( bufferBytes, 1 ); - if ( stream_.deviceBuffer == NULL ) { - errorText_ = "RtApiDs::probeDeviceOpen: error allocating device buffer memory."; - goto error; - } - } - } - - // Allocate our DsHandle structures for the stream. - if ( stream_.apiHandle == 0 ) { - try { - handle = new DsHandle; - } - catch ( std::bad_alloc& ) { - errorText_ = "RtApiDs::probeDeviceOpen: error allocating AsioHandle memory."; - goto error; - } - - // Create a manual-reset event. - handle->condition = CreateEvent( NULL, // no security - TRUE, // manual-reset - FALSE, // non-signaled initially - NULL ); // unnamed - stream_.apiHandle = (void *) handle; - } - else - handle = (DsHandle *) stream_.apiHandle; - handle->id[mode] = ohandle; - handle->buffer[mode] = bhandle; - handle->dsBufferSize[mode] = dsBufferSize; - handle->dsPointerLeadTime[mode] = dsPointerLeadTime; - - stream_.device[mode] = device; - stream_.state = STREAM_STOPPED; - if ( stream_.mode == OUTPUT && mode == INPUT ) - // We had already set up an output stream. - stream_.mode = DUPLEX; - else - stream_.mode = mode; - stream_.nBuffers = nBuffers; - stream_.sampleRate = sampleRate; - - // Setup the buffer conversion information structure. - if ( stream_.doConvertBuffer[mode] ) setConvertInfo( mode, firstChannel ); - - // Setup the callback thread. - if ( stream_.callbackInfo.isRunning == false ) { - unsigned threadId; - stream_.callbackInfo.isRunning = true; - stream_.callbackInfo.object = (void *) this; - stream_.callbackInfo.thread = _beginthreadex( NULL, 0, &callbackHandler, - &stream_.callbackInfo, 0, &threadId ); - if ( stream_.callbackInfo.thread == 0 ) { - errorText_ = "RtApiDs::probeDeviceOpen: error creating callback thread!"; - goto error; - } - - // Boost DS thread priority - SetThreadPriority( (HANDLE) stream_.callbackInfo.thread, THREAD_PRIORITY_HIGHEST ); - } - return SUCCESS; - - error: - if ( handle ) { - if ( handle->buffer[0] ) { // the object pointer can be NULL and valid - LPDIRECTSOUND object = (LPDIRECTSOUND) handle->id[0]; - LPDIRECTSOUNDBUFFER buffer = (LPDIRECTSOUNDBUFFER) handle->buffer[0]; - if ( buffer ) buffer->Release(); - object->Release(); - } - if ( handle->buffer[1] ) { - LPDIRECTSOUNDCAPTURE object = (LPDIRECTSOUNDCAPTURE) handle->id[1]; - LPDIRECTSOUNDCAPTUREBUFFER buffer = (LPDIRECTSOUNDCAPTUREBUFFER) handle->buffer[1]; - if ( buffer ) buffer->Release(); - object->Release(); - } - CloseHandle( handle->condition ); - delete handle; - stream_.apiHandle = 0; - } - - for ( int i=0; i<2; i++ ) { - if ( stream_.userBuffer[i] ) { - free( stream_.userBuffer[i] ); - stream_.userBuffer[i] = 0; - } - } - - if ( stream_.deviceBuffer ) { - free( stream_.deviceBuffer ); - stream_.deviceBuffer = 0; - } - - stream_.state = STREAM_CLOSED; - return FAILURE; -} - -void RtApiDs :: closeStream() -{ - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApiDs::closeStream(): no open stream to close!"; - error( RtAudioError::WARNING ); - return; - } - - // Stop the callback thread. - stream_.callbackInfo.isRunning = false; - WaitForSingleObject( (HANDLE) stream_.callbackInfo.thread, INFINITE ); - CloseHandle( (HANDLE) stream_.callbackInfo.thread ); - - DsHandle *handle = (DsHandle *) stream_.apiHandle; - if ( handle ) { - if ( handle->buffer[0] ) { // the object pointer can be NULL and valid - LPDIRECTSOUND object = (LPDIRECTSOUND) handle->id[0]; - LPDIRECTSOUNDBUFFER buffer = (LPDIRECTSOUNDBUFFER) handle->buffer[0]; - if ( buffer ) { - buffer->Stop(); - buffer->Release(); - } - object->Release(); - } - if ( handle->buffer[1] ) { - LPDIRECTSOUNDCAPTURE object = (LPDIRECTSOUNDCAPTURE) handle->id[1]; - LPDIRECTSOUNDCAPTUREBUFFER buffer = (LPDIRECTSOUNDCAPTUREBUFFER) handle->buffer[1]; - if ( buffer ) { - buffer->Stop(); - buffer->Release(); - } - object->Release(); - } - CloseHandle( handle->condition ); - delete handle; - stream_.apiHandle = 0; - } - - for ( int i=0; i<2; i++ ) { - if ( stream_.userBuffer[i] ) { - free( stream_.userBuffer[i] ); - stream_.userBuffer[i] = 0; - } - } - - if ( stream_.deviceBuffer ) { - free( stream_.deviceBuffer ); - stream_.deviceBuffer = 0; - } - - stream_.mode = UNINITIALIZED; - stream_.state = STREAM_CLOSED; -} - -void RtApiDs :: startStream() -{ - verifyStream(); - if ( stream_.state == STREAM_RUNNING ) { - errorText_ = "RtApiDs::startStream(): the stream is already running!"; - error( RtAudioError::WARNING ); - return; - } - - DsHandle *handle = (DsHandle *) stream_.apiHandle; - - // Increase scheduler frequency on lesser windows (a side-effect of - // increasing timer accuracy). On greater windows (Win2K or later), - // this is already in effect. - timeBeginPeriod( 1 ); - - buffersRolling = false; - duplexPrerollBytes = 0; - - if ( stream_.mode == DUPLEX ) { - // 0.5 seconds of silence in DUPLEX mode while the devices spin up and synchronize. - duplexPrerollBytes = (int) ( 0.5 * stream_.sampleRate * formatBytes( stream_.deviceFormat[1] ) * stream_.nDeviceChannels[1] ); - } - - HRESULT result = 0; - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - - LPDIRECTSOUNDBUFFER buffer = (LPDIRECTSOUNDBUFFER) handle->buffer[0]; - result = buffer->Play( 0, 0, DSBPLAY_LOOPING ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::startStream: error (" << getErrorString( result ) << ") starting output buffer!"; - errorText_ = errorStream_.str(); - goto unlock; - } - } - - if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { - - LPDIRECTSOUNDCAPTUREBUFFER buffer = (LPDIRECTSOUNDCAPTUREBUFFER) handle->buffer[1]; - result = buffer->Start( DSCBSTART_LOOPING ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::startStream: error (" << getErrorString( result ) << ") starting input buffer!"; - errorText_ = errorStream_.str(); - goto unlock; - } - } - - handle->drainCounter = 0; - handle->internalDrain = false; - ResetEvent( handle->condition ); - stream_.state = STREAM_RUNNING; - - unlock: - if ( FAILED( result ) ) error( RtAudioError::SYSTEM_ERROR ); -} - -void RtApiDs :: stopStream() -{ - verifyStream(); - if ( stream_.state == STREAM_STOPPED ) { - errorText_ = "RtApiDs::stopStream(): the stream is already stopped!"; - error( RtAudioError::WARNING ); - return; - } - - HRESULT result = 0; - LPVOID audioPtr; - DWORD dataLen; - DsHandle *handle = (DsHandle *) stream_.apiHandle; - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - if ( handle->drainCounter == 0 ) { - handle->drainCounter = 2; - WaitForSingleObject( handle->condition, INFINITE ); // block until signaled - } - - stream_.state = STREAM_STOPPED; - - MUTEX_LOCK( &stream_.mutex ); - - // Stop the buffer and clear memory - LPDIRECTSOUNDBUFFER buffer = (LPDIRECTSOUNDBUFFER) handle->buffer[0]; - result = buffer->Stop(); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::stopStream: error (" << getErrorString( result ) << ") stopping output buffer!"; - errorText_ = errorStream_.str(); - goto unlock; - } - - // Lock the buffer and clear it so that if we start to play again, - // we won't have old data playing. - result = buffer->Lock( 0, handle->dsBufferSize[0], &audioPtr, &dataLen, NULL, NULL, 0 ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::stopStream: error (" << getErrorString( result ) << ") locking output buffer!"; - errorText_ = errorStream_.str(); - goto unlock; - } - - // Zero the DS buffer - ZeroMemory( audioPtr, dataLen ); - - // Unlock the DS buffer - result = buffer->Unlock( audioPtr, dataLen, NULL, 0 ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::stopStream: error (" << getErrorString( result ) << ") unlocking output buffer!"; - errorText_ = errorStream_.str(); - goto unlock; - } - - // If we start playing again, we must begin at beginning of buffer. - handle->bufferPointer[0] = 0; - } - - if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { - LPDIRECTSOUNDCAPTUREBUFFER buffer = (LPDIRECTSOUNDCAPTUREBUFFER) handle->buffer[1]; - audioPtr = NULL; - dataLen = 0; - - stream_.state = STREAM_STOPPED; - - if ( stream_.mode != DUPLEX ) - MUTEX_LOCK( &stream_.mutex ); - - result = buffer->Stop(); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::stopStream: error (" << getErrorString( result ) << ") stopping input buffer!"; - errorText_ = errorStream_.str(); - goto unlock; - } - - // Lock the buffer and clear it so that if we start to play again, - // we won't have old data playing. - result = buffer->Lock( 0, handle->dsBufferSize[1], &audioPtr, &dataLen, NULL, NULL, 0 ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::stopStream: error (" << getErrorString( result ) << ") locking input buffer!"; - errorText_ = errorStream_.str(); - goto unlock; - } - - // Zero the DS buffer - ZeroMemory( audioPtr, dataLen ); - - // Unlock the DS buffer - result = buffer->Unlock( audioPtr, dataLen, NULL, 0 ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::stopStream: error (" << getErrorString( result ) << ") unlocking input buffer!"; - errorText_ = errorStream_.str(); - goto unlock; - } - - // If we start recording again, we must begin at beginning of buffer. - handle->bufferPointer[1] = 0; - } - - unlock: - timeEndPeriod( 1 ); // revert to normal scheduler frequency on lesser windows. - MUTEX_UNLOCK( &stream_.mutex ); - - if ( FAILED( result ) ) error( RtAudioError::SYSTEM_ERROR ); -} - -void RtApiDs :: abortStream() -{ - verifyStream(); - if ( stream_.state == STREAM_STOPPED ) { - errorText_ = "RtApiDs::abortStream(): the stream is already stopped!"; - error( RtAudioError::WARNING ); - return; - } - - DsHandle *handle = (DsHandle *) stream_.apiHandle; - handle->drainCounter = 2; - - stopStream(); -} - -void RtApiDs :: callbackEvent() -{ - if ( stream_.state == STREAM_STOPPED || stream_.state == STREAM_STOPPING ) { - Sleep( 50 ); // sleep 50 milliseconds - return; - } - - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApiDs::callbackEvent(): the stream is closed ... this shouldn't happen!"; - error( RtAudioError::WARNING ); - return; - } - - CallbackInfo *info = (CallbackInfo *) &stream_.callbackInfo; - DsHandle *handle = (DsHandle *) stream_.apiHandle; - - // Check if we were draining the stream and signal is finished. - if ( handle->drainCounter > stream_.nBuffers + 2 ) { - - stream_.state = STREAM_STOPPING; - if ( handle->internalDrain == false ) - SetEvent( handle->condition ); - else - stopStream(); - return; - } - - // Invoke user callback to get fresh output data UNLESS we are - // draining stream. - if ( handle->drainCounter == 0 ) { - RtAudioCallback callback = (RtAudioCallback) info->callback; - double streamTime = getStreamTime(); - RtAudioStreamStatus status = 0; - if ( stream_.mode != INPUT && handle->xrun[0] == true ) { - status |= RTAUDIO_OUTPUT_UNDERFLOW; - handle->xrun[0] = false; - } - if ( stream_.mode != OUTPUT && handle->xrun[1] == true ) { - status |= RTAUDIO_INPUT_OVERFLOW; - handle->xrun[1] = false; - } - int cbReturnValue = callback( stream_.userBuffer[0], stream_.userBuffer[1], - stream_.bufferSize, streamTime, status, info->userData ); - if ( cbReturnValue == 2 ) { - stream_.state = STREAM_STOPPING; - handle->drainCounter = 2; - abortStream(); - return; - } - else if ( cbReturnValue == 1 ) { - handle->drainCounter = 1; - handle->internalDrain = true; - } - } - - HRESULT result; - DWORD currentWritePointer, safeWritePointer; - DWORD currentReadPointer, safeReadPointer; - UINT nextWritePointer; - - LPVOID buffer1 = NULL; - LPVOID buffer2 = NULL; - DWORD bufferSize1 = 0; - DWORD bufferSize2 = 0; - - char *buffer; - long bufferBytes; - - MUTEX_LOCK( &stream_.mutex ); - if ( stream_.state == STREAM_STOPPED ) { - MUTEX_UNLOCK( &stream_.mutex ); - return; - } - - if ( buffersRolling == false ) { - if ( stream_.mode == DUPLEX ) { - //assert( handle->dsBufferSize[0] == handle->dsBufferSize[1] ); - - // It takes a while for the devices to get rolling. As a result, - // there's no guarantee that the capture and write device pointers - // will move in lockstep. Wait here for both devices to start - // rolling, and then set our buffer pointers accordingly. - // e.g. Crystal Drivers: the capture buffer starts up 5700 to 9600 - // bytes later than the write buffer. - - // Stub: a serious risk of having a pre-emptive scheduling round - // take place between the two GetCurrentPosition calls... but I'm - // really not sure how to solve the problem. Temporarily boost to - // Realtime priority, maybe; but I'm not sure what priority the - // DirectSound service threads run at. We *should* be roughly - // within a ms or so of correct. - - LPDIRECTSOUNDBUFFER dsWriteBuffer = (LPDIRECTSOUNDBUFFER) handle->buffer[0]; - LPDIRECTSOUNDCAPTUREBUFFER dsCaptureBuffer = (LPDIRECTSOUNDCAPTUREBUFFER) handle->buffer[1]; - - DWORD startSafeWritePointer, startSafeReadPointer; - - result = dsWriteBuffer->GetCurrentPosition( NULL, &startSafeWritePointer ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current write position!"; - errorText_ = errorStream_.str(); - MUTEX_UNLOCK( &stream_.mutex ); - error( RtAudioError::SYSTEM_ERROR ); - return; - } - result = dsCaptureBuffer->GetCurrentPosition( NULL, &startSafeReadPointer ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current read position!"; - errorText_ = errorStream_.str(); - MUTEX_UNLOCK( &stream_.mutex ); - error( RtAudioError::SYSTEM_ERROR ); - return; - } - while ( true ) { - result = dsWriteBuffer->GetCurrentPosition( NULL, &safeWritePointer ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current write position!"; - errorText_ = errorStream_.str(); - MUTEX_UNLOCK( &stream_.mutex ); - error( RtAudioError::SYSTEM_ERROR ); - return; - } - result = dsCaptureBuffer->GetCurrentPosition( NULL, &safeReadPointer ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current read position!"; - errorText_ = errorStream_.str(); - MUTEX_UNLOCK( &stream_.mutex ); - error( RtAudioError::SYSTEM_ERROR ); - return; - } - if ( safeWritePointer != startSafeWritePointer && safeReadPointer != startSafeReadPointer ) break; - Sleep( 1 ); - } - - //assert( handle->dsBufferSize[0] == handle->dsBufferSize[1] ); - - handle->bufferPointer[0] = safeWritePointer + handle->dsPointerLeadTime[0]; - if ( handle->bufferPointer[0] >= handle->dsBufferSize[0] ) handle->bufferPointer[0] -= handle->dsBufferSize[0]; - handle->bufferPointer[1] = safeReadPointer; - } - else if ( stream_.mode == OUTPUT ) { - - // Set the proper nextWritePosition after initial startup. - LPDIRECTSOUNDBUFFER dsWriteBuffer = (LPDIRECTSOUNDBUFFER) handle->buffer[0]; - result = dsWriteBuffer->GetCurrentPosition( ¤tWritePointer, &safeWritePointer ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current write position!"; - errorText_ = errorStream_.str(); - MUTEX_UNLOCK( &stream_.mutex ); - error( RtAudioError::SYSTEM_ERROR ); - return; - } - handle->bufferPointer[0] = safeWritePointer + handle->dsPointerLeadTime[0]; - if ( handle->bufferPointer[0] >= handle->dsBufferSize[0] ) handle->bufferPointer[0] -= handle->dsBufferSize[0]; - } - - buffersRolling = true; - } - - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - - LPDIRECTSOUNDBUFFER dsBuffer = (LPDIRECTSOUNDBUFFER) handle->buffer[0]; - - if ( handle->drainCounter > 1 ) { // write zeros to the output stream - bufferBytes = stream_.bufferSize * stream_.nUserChannels[0]; - bufferBytes *= formatBytes( stream_.userFormat ); - memset( stream_.userBuffer[0], 0, bufferBytes ); - } - - // Setup parameters and do buffer conversion if necessary. - if ( stream_.doConvertBuffer[0] ) { - buffer = stream_.deviceBuffer; - convertBuffer( buffer, stream_.userBuffer[0], stream_.convertInfo[0] ); - bufferBytes = stream_.bufferSize * stream_.nDeviceChannels[0]; - bufferBytes *= formatBytes( stream_.deviceFormat[0] ); - } - else { - buffer = stream_.userBuffer[0]; - bufferBytes = stream_.bufferSize * stream_.nUserChannels[0]; - bufferBytes *= formatBytes( stream_.userFormat ); - } - - // No byte swapping necessary in DirectSound implementation. - - // Ahhh ... windoze. 16-bit data is signed but 8-bit data is - // unsigned. So, we need to convert our signed 8-bit data here to - // unsigned. - if ( stream_.deviceFormat[0] == RTAUDIO_SINT8 ) - for ( int i=0; idsBufferSize[0]; - nextWritePointer = handle->bufferPointer[0]; - - DWORD endWrite, leadPointer; - while ( true ) { - // Find out where the read and "safe write" pointers are. - result = dsBuffer->GetCurrentPosition( ¤tWritePointer, &safeWritePointer ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current write position!"; - errorText_ = errorStream_.str(); - error( RtAudioError::SYSTEM_ERROR ); - return; - } - - // We will copy our output buffer into the region between - // safeWritePointer and leadPointer. If leadPointer is not - // beyond the next endWrite position, wait until it is. - leadPointer = safeWritePointer + handle->dsPointerLeadTime[0]; - //std::cout << "safeWritePointer = " << safeWritePointer << ", leadPointer = " << leadPointer << ", nextWritePointer = " << nextWritePointer << std::endl; - if ( leadPointer > dsBufferSize ) leadPointer -= dsBufferSize; - if ( leadPointer < nextWritePointer ) leadPointer += dsBufferSize; // unwrap offset - endWrite = nextWritePointer + bufferBytes; - - // Check whether the entire write region is behind the play pointer. - if ( leadPointer >= endWrite ) break; - - // If we are here, then we must wait until the leadPointer advances - // beyond the end of our next write region. We use the - // Sleep() function to suspend operation until that happens. - double millis = ( endWrite - leadPointer ) * 1000.0; - millis /= ( formatBytes( stream_.deviceFormat[0]) * stream_.nDeviceChannels[0] * stream_.sampleRate); - if ( millis < 1.0 ) millis = 1.0; - Sleep( (DWORD) millis ); - } - - if ( dsPointerBetween( nextWritePointer, safeWritePointer, currentWritePointer, dsBufferSize ) - || dsPointerBetween( endWrite, safeWritePointer, currentWritePointer, dsBufferSize ) ) { - // We've strayed into the forbidden zone ... resync the read pointer. - handle->xrun[0] = true; - nextWritePointer = safeWritePointer + handle->dsPointerLeadTime[0] - bufferBytes; - if ( nextWritePointer >= dsBufferSize ) nextWritePointer -= dsBufferSize; - handle->bufferPointer[0] = nextWritePointer; - endWrite = nextWritePointer + bufferBytes; - } - - // Lock free space in the buffer - result = dsBuffer->Lock( nextWritePointer, bufferBytes, &buffer1, - &bufferSize1, &buffer2, &bufferSize2, 0 ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") locking buffer during playback!"; - errorText_ = errorStream_.str(); - MUTEX_UNLOCK( &stream_.mutex ); - error( RtAudioError::SYSTEM_ERROR ); - return; - } - - // Copy our buffer into the DS buffer - CopyMemory( buffer1, buffer, bufferSize1 ); - if ( buffer2 != NULL ) CopyMemory( buffer2, buffer+bufferSize1, bufferSize2 ); - - // Update our buffer offset and unlock sound buffer - dsBuffer->Unlock( buffer1, bufferSize1, buffer2, bufferSize2 ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") unlocking buffer during playback!"; - errorText_ = errorStream_.str(); - MUTEX_UNLOCK( &stream_.mutex ); - error( RtAudioError::SYSTEM_ERROR ); - return; - } - nextWritePointer = ( nextWritePointer + bufferSize1 + bufferSize2 ) % dsBufferSize; - handle->bufferPointer[0] = nextWritePointer; - } - - // Don't bother draining input - if ( handle->drainCounter ) { - handle->drainCounter++; - goto unlock; - } - - if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { - - // Setup parameters. - if ( stream_.doConvertBuffer[1] ) { - buffer = stream_.deviceBuffer; - bufferBytes = stream_.bufferSize * stream_.nDeviceChannels[1]; - bufferBytes *= formatBytes( stream_.deviceFormat[1] ); - } - else { - buffer = stream_.userBuffer[1]; - bufferBytes = stream_.bufferSize * stream_.nUserChannels[1]; - bufferBytes *= formatBytes( stream_.userFormat ); - } - - LPDIRECTSOUNDCAPTUREBUFFER dsBuffer = (LPDIRECTSOUNDCAPTUREBUFFER) handle->buffer[1]; - long nextReadPointer = handle->bufferPointer[1]; - DWORD dsBufferSize = handle->dsBufferSize[1]; - - // Find out where the write and "safe read" pointers are. - result = dsBuffer->GetCurrentPosition( ¤tReadPointer, &safeReadPointer ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current read position!"; - errorText_ = errorStream_.str(); - MUTEX_UNLOCK( &stream_.mutex ); - error( RtAudioError::SYSTEM_ERROR ); - return; - } - - if ( safeReadPointer < (DWORD)nextReadPointer ) safeReadPointer += dsBufferSize; // unwrap offset - DWORD endRead = nextReadPointer + bufferBytes; - - // Handling depends on whether we are INPUT or DUPLEX. - // If we're in INPUT mode then waiting is a good thing. If we're in DUPLEX mode, - // then a wait here will drag the write pointers into the forbidden zone. - // - // In DUPLEX mode, rather than wait, we will back off the read pointer until - // it's in a safe position. This causes dropouts, but it seems to be the only - // practical way to sync up the read and write pointers reliably, given the - // the very complex relationship between phase and increment of the read and write - // pointers. - // - // In order to minimize audible dropouts in DUPLEX mode, we will - // provide a pre-roll period of 0.5 seconds in which we return - // zeros from the read buffer while the pointers sync up. - - if ( stream_.mode == DUPLEX ) { - if ( safeReadPointer < endRead ) { - if ( duplexPrerollBytes <= 0 ) { - // Pre-roll time over. Be more agressive. - int adjustment = endRead-safeReadPointer; - - handle->xrun[1] = true; - // Two cases: - // - large adjustments: we've probably run out of CPU cycles, so just resync exactly, - // and perform fine adjustments later. - // - small adjustments: back off by twice as much. - if ( adjustment >= 2*bufferBytes ) - nextReadPointer = safeReadPointer-2*bufferBytes; - else - nextReadPointer = safeReadPointer-bufferBytes-adjustment; - - if ( nextReadPointer < 0 ) nextReadPointer += dsBufferSize; - - } - else { - // In pre=roll time. Just do it. - nextReadPointer = safeReadPointer - bufferBytes; - while ( nextReadPointer < 0 ) nextReadPointer += dsBufferSize; - } - endRead = nextReadPointer + bufferBytes; - } - } - else { // mode == INPUT - while ( safeReadPointer < endRead && stream_.callbackInfo.isRunning ) { - // See comments for playback. - double millis = (endRead - safeReadPointer) * 1000.0; - millis /= ( formatBytes(stream_.deviceFormat[1]) * stream_.nDeviceChannels[1] * stream_.sampleRate); - if ( millis < 1.0 ) millis = 1.0; - Sleep( (DWORD) millis ); - - // Wake up and find out where we are now. - result = dsBuffer->GetCurrentPosition( ¤tReadPointer, &safeReadPointer ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current read position!"; - errorText_ = errorStream_.str(); - MUTEX_UNLOCK( &stream_.mutex ); - error( RtAudioError::SYSTEM_ERROR ); - return; - } - - if ( safeReadPointer < (DWORD)nextReadPointer ) safeReadPointer += dsBufferSize; // unwrap offset - } - } - - // Lock free space in the buffer - result = dsBuffer->Lock( nextReadPointer, bufferBytes, &buffer1, - &bufferSize1, &buffer2, &bufferSize2, 0 ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") locking capture buffer!"; - errorText_ = errorStream_.str(); - MUTEX_UNLOCK( &stream_.mutex ); - error( RtAudioError::SYSTEM_ERROR ); - return; - } - - if ( duplexPrerollBytes <= 0 ) { - // Copy our buffer into the DS buffer - CopyMemory( buffer, buffer1, bufferSize1 ); - if ( buffer2 != NULL ) CopyMemory( buffer+bufferSize1, buffer2, bufferSize2 ); - } - else { - memset( buffer, 0, bufferSize1 ); - if ( buffer2 != NULL ) memset( buffer + bufferSize1, 0, bufferSize2 ); - duplexPrerollBytes -= bufferSize1 + bufferSize2; - } - - // Update our buffer offset and unlock sound buffer - nextReadPointer = ( nextReadPointer + bufferSize1 + bufferSize2 ) % dsBufferSize; - dsBuffer->Unlock( buffer1, bufferSize1, buffer2, bufferSize2 ); - if ( FAILED( result ) ) { - errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") unlocking capture buffer!"; - errorText_ = errorStream_.str(); - MUTEX_UNLOCK( &stream_.mutex ); - error( RtAudioError::SYSTEM_ERROR ); - return; - } - handle->bufferPointer[1] = nextReadPointer; - - // No byte swapping necessary in DirectSound implementation. - - // If necessary, convert 8-bit data from unsigned to signed. - if ( stream_.deviceFormat[1] == RTAUDIO_SINT8 ) - for ( int j=0; jobject; - bool* isRunning = &info->isRunning; - - while ( *isRunning == true ) { - object->callbackEvent(); - } - - _endthreadex( 0 ); - return 0; -} - -static BOOL CALLBACK deviceQueryCallback( LPGUID lpguid, - LPCTSTR description, - LPCTSTR /*module*/, - LPVOID lpContext ) -{ - struct DsProbeData& probeInfo = *(struct DsProbeData*) lpContext; - std::vector& dsDevices = *probeInfo.dsDevices; - - HRESULT hr; - bool validDevice = false; - if ( probeInfo.isInput == true ) { - DSCCAPS caps; - LPDIRECTSOUNDCAPTURE object; - - hr = DirectSoundCaptureCreate( lpguid, &object, NULL ); - if ( hr != DS_OK ) return TRUE; - - caps.dwSize = sizeof(caps); - hr = object->GetCaps( &caps ); - if ( hr == DS_OK ) { - if ( caps.dwChannels > 0 && caps.dwFormats > 0 ) - validDevice = true; - } - object->Release(); - } - else { - DSCAPS caps; - LPDIRECTSOUND object; - hr = DirectSoundCreate( lpguid, &object, NULL ); - if ( hr != DS_OK ) return TRUE; - - caps.dwSize = sizeof(caps); - hr = object->GetCaps( &caps ); - if ( hr == DS_OK ) { - if ( caps.dwFlags & DSCAPS_PRIMARYMONO || caps.dwFlags & DSCAPS_PRIMARYSTEREO ) - validDevice = true; - } - object->Release(); - } - - // If good device, then save its name and guid. - std::string name = convertCharPointerToStdString( description ); - //if ( name == "Primary Sound Driver" || name == "Primary Sound Capture Driver" ) - if ( lpguid == NULL ) - name = "Default Device"; - if ( validDevice ) { - for ( unsigned int i=0; i -#include - - // A structure to hold various information related to the ALSA API - // implementation. -struct AlsaHandle { - snd_pcm_t *handles[2]; - bool synchronized; - bool xrun[2]; - pthread_cond_t runnable_cv; - bool runnable; - - AlsaHandle() - :synchronized(false), runnable(false) { xrun[0] = false; xrun[1] = false; } -}; - -static void *alsaCallbackHandler( void * ptr ); - -RtApiAlsa :: RtApiAlsa() -{ - // Nothing to do here. -} - -RtApiAlsa :: ~RtApiAlsa() -{ - if ( stream_.state != STREAM_CLOSED ) closeStream(); -} - -unsigned int RtApiAlsa :: getDeviceCount( void ) -{ - unsigned nDevices = 0; - int result, subdevice, card; - char name[64]; - snd_ctl_t *handle; - - // Count cards and devices - card = -1; - snd_card_next( &card ); - while ( card >= 0 ) { - sprintf( name, "hw:%d", card ); - result = snd_ctl_open( &handle, name, 0 ); - if ( result < 0 ) { - errorStream_ << "RtApiAlsa::getDeviceCount: control open, card = " << card << ", " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - goto nextcard; - } - subdevice = -1; - while( 1 ) { - result = snd_ctl_pcm_next_device( handle, &subdevice ); - if ( result < 0 ) { - errorStream_ << "RtApiAlsa::getDeviceCount: control next device, card = " << card << ", " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - break; - } - if ( subdevice < 0 ) - break; - nDevices++; - } - nextcard: - snd_ctl_close( handle ); - snd_card_next( &card ); - } - - result = snd_ctl_open( &handle, "default", 0 ); - if (result == 0) { - nDevices++; - snd_ctl_close( handle ); - } - - return nDevices; -} - -RtAudio::DeviceInfo RtApiAlsa :: getDeviceInfo( unsigned int device ) -{ - RtAudio::DeviceInfo info; - info.probed = false; - - unsigned nDevices = 0; - int result, subdevice, card; - char name[64]; - snd_ctl_t *chandle; - - // Count cards and devices - card = -1; - subdevice = -1; - snd_card_next( &card ); - while ( card >= 0 ) { - sprintf( name, "hw:%d", card ); - result = snd_ctl_open( &chandle, name, SND_CTL_NONBLOCK ); - if ( result < 0 ) { - errorStream_ << "RtApiAlsa::getDeviceInfo: control open, card = " << card << ", " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - goto nextcard; - } - subdevice = -1; - while( 1 ) { - result = snd_ctl_pcm_next_device( chandle, &subdevice ); - if ( result < 0 ) { - errorStream_ << "RtApiAlsa::getDeviceInfo: control next device, card = " << card << ", " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - break; - } - if ( subdevice < 0 ) break; - if ( nDevices == device ) { - sprintf( name, "hw:%d,%d", card, subdevice ); - goto foundDevice; - } - nDevices++; - } - nextcard: - snd_ctl_close( chandle ); - snd_card_next( &card ); - } - - result = snd_ctl_open( &chandle, "default", SND_CTL_NONBLOCK ); - if ( result == 0 ) { - if ( nDevices == device ) { - strcpy( name, "default" ); - goto foundDevice; - } - nDevices++; - } - - if ( nDevices == 0 ) { - errorText_ = "RtApiAlsa::getDeviceInfo: no devices found!"; - error( RtAudioError::INVALID_USE ); - return info; - } - - if ( device >= nDevices ) { - errorText_ = "RtApiAlsa::getDeviceInfo: device ID is invalid!"; - error( RtAudioError::INVALID_USE ); - return info; - } - - foundDevice: - - // If a stream is already open, we cannot probe the stream devices. - // Thus, use the saved results. - if ( stream_.state != STREAM_CLOSED && - ( stream_.device[0] == device || stream_.device[1] == device ) ) { - snd_ctl_close( chandle ); - if ( device >= devices_.size() ) { - errorText_ = "RtApiAlsa::getDeviceInfo: device ID was not present before stream was opened."; - error( RtAudioError::WARNING ); - return info; - } - return devices_[ device ]; - } - - int openMode = SND_PCM_ASYNC; - snd_pcm_stream_t stream; - snd_pcm_info_t *pcminfo; - snd_pcm_info_alloca( &pcminfo ); - snd_pcm_t *phandle; - snd_pcm_hw_params_t *params; - snd_pcm_hw_params_alloca( ¶ms ); - - // First try for playback unless default device (which has subdev -1) - stream = SND_PCM_STREAM_PLAYBACK; - snd_pcm_info_set_stream( pcminfo, stream ); - if ( subdevice != -1 ) { - snd_pcm_info_set_device( pcminfo, subdevice ); - snd_pcm_info_set_subdevice( pcminfo, 0 ); - - result = snd_ctl_pcm_info( chandle, pcminfo ); - if ( result < 0 ) { - // Device probably doesn't support playback. - goto captureProbe; - } - } - - result = snd_pcm_open( &phandle, name, stream, openMode | SND_PCM_NONBLOCK ); - if ( result < 0 ) { - errorStream_ << "RtApiAlsa::getDeviceInfo: snd_pcm_open error for device (" << name << "), " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - goto captureProbe; - } - - // The device is open ... fill the parameter structure. - result = snd_pcm_hw_params_any( phandle, params ); - if ( result < 0 ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::getDeviceInfo: snd_pcm_hw_params error for device (" << name << "), " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - goto captureProbe; - } - - // Get output channel information. - unsigned int value; - result = snd_pcm_hw_params_get_channels_max( params, &value ); - if ( result < 0 ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::getDeviceInfo: error getting device (" << name << ") output channels, " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - goto captureProbe; - } - info.outputChannels = value; - snd_pcm_close( phandle ); - - captureProbe: - stream = SND_PCM_STREAM_CAPTURE; - snd_pcm_info_set_stream( pcminfo, stream ); - - // Now try for capture unless default device (with subdev = -1) - if ( subdevice != -1 ) { - result = snd_ctl_pcm_info( chandle, pcminfo ); - snd_ctl_close( chandle ); - if ( result < 0 ) { - // Device probably doesn't support capture. - if ( info.outputChannels == 0 ) return info; - goto probeParameters; - } - } - else - snd_ctl_close( chandle ); - - result = snd_pcm_open( &phandle, name, stream, openMode | SND_PCM_NONBLOCK); - if ( result < 0 ) { - errorStream_ << "RtApiAlsa::getDeviceInfo: snd_pcm_open error for device (" << name << "), " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - if ( info.outputChannels == 0 ) return info; - goto probeParameters; - } - - // The device is open ... fill the parameter structure. - result = snd_pcm_hw_params_any( phandle, params ); - if ( result < 0 ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::getDeviceInfo: snd_pcm_hw_params error for device (" << name << "), " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - if ( info.outputChannels == 0 ) return info; - goto probeParameters; - } - - result = snd_pcm_hw_params_get_channels_max( params, &value ); - if ( result < 0 ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::getDeviceInfo: error getting device (" << name << ") input channels, " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - if ( info.outputChannels == 0 ) return info; - goto probeParameters; - } - info.inputChannels = value; - snd_pcm_close( phandle ); - - // If device opens for both playback and capture, we determine the channels. - if ( info.outputChannels > 0 && info.inputChannels > 0 ) - info.duplexChannels = (info.outputChannels > info.inputChannels) ? info.inputChannels : info.outputChannels; - - // ALSA doesn't provide default devices so we'll use the first available one. - if ( device == 0 && info.outputChannels > 0 ) - info.isDefaultOutput = true; - if ( device == 0 && info.inputChannels > 0 ) - info.isDefaultInput = true; - - probeParameters: - // At this point, we just need to figure out the supported data - // formats and sample rates. We'll proceed by opening the device in - // the direction with the maximum number of channels, or playback if - // they are equal. This might limit our sample rate options, but so - // be it. - - if ( info.outputChannels >= info.inputChannels ) - stream = SND_PCM_STREAM_PLAYBACK; - else - stream = SND_PCM_STREAM_CAPTURE; - snd_pcm_info_set_stream( pcminfo, stream ); - - result = snd_pcm_open( &phandle, name, stream, openMode | SND_PCM_NONBLOCK); - if ( result < 0 ) { - errorStream_ << "RtApiAlsa::getDeviceInfo: snd_pcm_open error for device (" << name << "), " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - return info; - } - - // The device is open ... fill the parameter structure. - result = snd_pcm_hw_params_any( phandle, params ); - if ( result < 0 ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::getDeviceInfo: snd_pcm_hw_params error for device (" << name << "), " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - return info; - } - - // Test our discrete set of sample rate values. - info.sampleRates.clear(); - for ( unsigned int i=0; i info.preferredSampleRate ) ) - info.preferredSampleRate = SAMPLE_RATES[i]; - } - } - if ( info.sampleRates.size() == 0 ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::getDeviceInfo: no supported sample rates found for device (" << name << ")."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - return info; - } - - // Probe the supported data formats ... we don't care about endian-ness just yet - snd_pcm_format_t format; - info.nativeFormats = 0; - format = SND_PCM_FORMAT_S8; - if ( snd_pcm_hw_params_test_format( phandle, params, format ) == 0 ) - info.nativeFormats |= RTAUDIO_SINT8; - format = SND_PCM_FORMAT_S16; - if ( snd_pcm_hw_params_test_format( phandle, params, format ) == 0 ) - info.nativeFormats |= RTAUDIO_SINT16; - format = SND_PCM_FORMAT_S24; - if ( snd_pcm_hw_params_test_format( phandle, params, format ) == 0 ) - info.nativeFormats |= RTAUDIO_SINT24; - format = SND_PCM_FORMAT_S32; - if ( snd_pcm_hw_params_test_format( phandle, params, format ) == 0 ) - info.nativeFormats |= RTAUDIO_SINT32; - format = SND_PCM_FORMAT_FLOAT; - if ( snd_pcm_hw_params_test_format( phandle, params, format ) == 0 ) - info.nativeFormats |= RTAUDIO_FLOAT32; - format = SND_PCM_FORMAT_FLOAT64; - if ( snd_pcm_hw_params_test_format( phandle, params, format ) == 0 ) - info.nativeFormats |= RTAUDIO_FLOAT64; - - // Check that we have at least one supported format - if ( info.nativeFormats == 0 ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::getDeviceInfo: pcm device (" << name << ") data format not supported by RtAudio."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - return info; - } - - // Get the device name - char *cardname; - result = snd_card_get_name( card, &cardname ); - if ( result >= 0 ) { - sprintf( name, "hw:%s,%d", cardname, subdevice ); - free( cardname ); - } - info.name = name; - - // That's all ... close the device and return - snd_pcm_close( phandle ); - info.probed = true; - return info; -} - -void RtApiAlsa :: saveDeviceInfo( void ) -{ - devices_.clear(); - - unsigned int nDevices = getDeviceCount(); - devices_.resize( nDevices ); - for ( unsigned int i=0; iflags & RTAUDIO_ALSA_USE_DEFAULT ) - snprintf(name, sizeof(name), "%s", "default"); - else { - // Count cards and devices - card = -1; - snd_card_next( &card ); - while ( card >= 0 ) { - sprintf( name, "hw:%d", card ); - result = snd_ctl_open( &chandle, name, SND_CTL_NONBLOCK ); - if ( result < 0 ) { - errorStream_ << "RtApiAlsa::probeDeviceOpen: control open, card = " << card << ", " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - return FAILURE; - } - subdevice = -1; - while( 1 ) { - result = snd_ctl_pcm_next_device( chandle, &subdevice ); - if ( result < 0 ) break; - if ( subdevice < 0 ) break; - if ( nDevices == device ) { - sprintf( name, "hw:%d,%d", card, subdevice ); - snd_ctl_close( chandle ); - goto foundDevice; - } - nDevices++; - } - snd_ctl_close( chandle ); - snd_card_next( &card ); - } - - result = snd_ctl_open( &chandle, "default", SND_CTL_NONBLOCK ); - if ( result == 0 ) { - if ( nDevices == device ) { - strcpy( name, "default" ); - goto foundDevice; - } - nDevices++; - } - - if ( nDevices == 0 ) { - // This should not happen because a check is made before this function is called. - errorText_ = "RtApiAlsa::probeDeviceOpen: no devices found!"; - return FAILURE; - } - - if ( device >= nDevices ) { - // This should not happen because a check is made before this function is called. - errorText_ = "RtApiAlsa::probeDeviceOpen: device ID is invalid!"; - return FAILURE; - } - } - - foundDevice: - - // The getDeviceInfo() function will not work for a device that is - // already open. Thus, we'll probe the system before opening a - // stream and save the results for use by getDeviceInfo(). - if ( mode == OUTPUT || ( mode == INPUT && stream_.mode != OUTPUT ) ) // only do once - this->saveDeviceInfo(); - - snd_pcm_stream_t stream; - if ( mode == OUTPUT ) - stream = SND_PCM_STREAM_PLAYBACK; - else - stream = SND_PCM_STREAM_CAPTURE; - - snd_pcm_t *phandle; - int openMode = SND_PCM_ASYNC; - result = snd_pcm_open( &phandle, name, stream, openMode ); - if ( result < 0 ) { - if ( mode == OUTPUT ) - errorStream_ << "RtApiAlsa::probeDeviceOpen: pcm device (" << name << ") won't open for output."; - else - errorStream_ << "RtApiAlsa::probeDeviceOpen: pcm device (" << name << ") won't open for input."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Fill the parameter structure. - snd_pcm_hw_params_t *hw_params; - snd_pcm_hw_params_alloca( &hw_params ); - result = snd_pcm_hw_params_any( phandle, hw_params ); - if ( result < 0 ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::probeDeviceOpen: error getting pcm device (" << name << ") parameters, " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - return FAILURE; - } - -#if defined(__RTAUDIO_DEBUG__) - fprintf( stderr, "\nRtApiAlsa: dump hardware params just after device open:\n\n" ); - snd_pcm_hw_params_dump( hw_params, out ); -#endif - - // Set access ... check user preference. - if ( options && options->flags & RTAUDIO_NONINTERLEAVED ) { - stream_.userInterleaved = false; - result = snd_pcm_hw_params_set_access( phandle, hw_params, SND_PCM_ACCESS_RW_NONINTERLEAVED ); - if ( result < 0 ) { - result = snd_pcm_hw_params_set_access( phandle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED ); - stream_.deviceInterleaved[mode] = true; - } - else - stream_.deviceInterleaved[mode] = false; - } - else { - stream_.userInterleaved = true; - result = snd_pcm_hw_params_set_access( phandle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED ); - if ( result < 0 ) { - result = snd_pcm_hw_params_set_access( phandle, hw_params, SND_PCM_ACCESS_RW_NONINTERLEAVED ); - stream_.deviceInterleaved[mode] = false; - } - else - stream_.deviceInterleaved[mode] = true; - } - - if ( result < 0 ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::probeDeviceOpen: error setting pcm device (" << name << ") access, " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Determine how to set the device format. - stream_.userFormat = format; - snd_pcm_format_t deviceFormat = SND_PCM_FORMAT_UNKNOWN; - - if ( format == RTAUDIO_SINT8 ) - deviceFormat = SND_PCM_FORMAT_S8; - else if ( format == RTAUDIO_SINT16 ) - deviceFormat = SND_PCM_FORMAT_S16; - else if ( format == RTAUDIO_SINT24 ) - deviceFormat = SND_PCM_FORMAT_S24; - else if ( format == RTAUDIO_SINT32 ) - deviceFormat = SND_PCM_FORMAT_S32; - else if ( format == RTAUDIO_FLOAT32 ) - deviceFormat = SND_PCM_FORMAT_FLOAT; - else if ( format == RTAUDIO_FLOAT64 ) - deviceFormat = SND_PCM_FORMAT_FLOAT64; - - if ( snd_pcm_hw_params_test_format(phandle, hw_params, deviceFormat) == 0) { - stream_.deviceFormat[mode] = format; - goto setFormat; - } - - // The user requested format is not natively supported by the device. - deviceFormat = SND_PCM_FORMAT_FLOAT64; - if ( snd_pcm_hw_params_test_format( phandle, hw_params, deviceFormat ) == 0 ) { - stream_.deviceFormat[mode] = RTAUDIO_FLOAT64; - goto setFormat; - } - - deviceFormat = SND_PCM_FORMAT_FLOAT; - if ( snd_pcm_hw_params_test_format(phandle, hw_params, deviceFormat ) == 0 ) { - stream_.deviceFormat[mode] = RTAUDIO_FLOAT32; - goto setFormat; - } - - deviceFormat = SND_PCM_FORMAT_S32; - if ( snd_pcm_hw_params_test_format(phandle, hw_params, deviceFormat ) == 0 ) { - stream_.deviceFormat[mode] = RTAUDIO_SINT32; - goto setFormat; - } - - deviceFormat = SND_PCM_FORMAT_S24; - if ( snd_pcm_hw_params_test_format(phandle, hw_params, deviceFormat ) == 0 ) { - stream_.deviceFormat[mode] = RTAUDIO_SINT24; - goto setFormat; - } - - deviceFormat = SND_PCM_FORMAT_S16; - if ( snd_pcm_hw_params_test_format(phandle, hw_params, deviceFormat ) == 0 ) { - stream_.deviceFormat[mode] = RTAUDIO_SINT16; - goto setFormat; - } - - deviceFormat = SND_PCM_FORMAT_S8; - if ( snd_pcm_hw_params_test_format(phandle, hw_params, deviceFormat ) == 0 ) { - stream_.deviceFormat[mode] = RTAUDIO_SINT8; - goto setFormat; - } - - // If we get here, no supported format was found. - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::probeDeviceOpen: pcm device " << device << " data format not supported by RtAudio."; - errorText_ = errorStream_.str(); - return FAILURE; - - setFormat: - result = snd_pcm_hw_params_set_format( phandle, hw_params, deviceFormat ); - if ( result < 0 ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::probeDeviceOpen: error setting pcm device (" << name << ") data format, " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Determine whether byte-swaping is necessary. - stream_.doByteSwap[mode] = false; - if ( deviceFormat != SND_PCM_FORMAT_S8 ) { - result = snd_pcm_format_cpu_endian( deviceFormat ); - if ( result == 0 ) - stream_.doByteSwap[mode] = true; - else if (result < 0) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::probeDeviceOpen: error getting pcm device (" << name << ") endian-ness, " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - return FAILURE; - } - } - - // Set the sample rate. - result = snd_pcm_hw_params_set_rate_near( phandle, hw_params, (unsigned int*) &sampleRate, 0 ); - if ( result < 0 ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::probeDeviceOpen: error setting sample rate on device (" << name << "), " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Determine the number of channels for this device. We support a possible - // minimum device channel number > than the value requested by the user. - stream_.nUserChannels[mode] = channels; - unsigned int value; - result = snd_pcm_hw_params_get_channels_max( hw_params, &value ); - unsigned int deviceChannels = value; - if ( result < 0 || deviceChannels < channels + firstChannel ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::probeDeviceOpen: requested channel parameters not supported by device (" << name << "), " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - result = snd_pcm_hw_params_get_channels_min( hw_params, &value ); - if ( result < 0 ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::probeDeviceOpen: error getting minimum channels for device (" << name << "), " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - return FAILURE; - } - deviceChannels = value; - if ( deviceChannels < channels + firstChannel ) deviceChannels = channels + firstChannel; - stream_.nDeviceChannels[mode] = deviceChannels; - - // Set the device channels. - result = snd_pcm_hw_params_set_channels( phandle, hw_params, deviceChannels ); - if ( result < 0 ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::probeDeviceOpen: error setting channels for device (" << name << "), " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Set the buffer (or period) size. - int dir = 0; - snd_pcm_uframes_t periodSize = *bufferSize; - result = snd_pcm_hw_params_set_period_size_near( phandle, hw_params, &periodSize, &dir ); - if ( result < 0 ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::probeDeviceOpen: error setting period size for device (" << name << "), " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - return FAILURE; - } - *bufferSize = periodSize; - - // Set the buffer number, which in ALSA is referred to as the "period". - unsigned int periods = 0; - if ( options && options->flags & RTAUDIO_MINIMIZE_LATENCY ) periods = 2; - if ( options && options->numberOfBuffers > 0 ) periods = options->numberOfBuffers; - if ( periods < 2 ) periods = 4; // a fairly safe default value - result = snd_pcm_hw_params_set_periods_near( phandle, hw_params, &periods, &dir ); - if ( result < 0 ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::probeDeviceOpen: error setting periods for device (" << name << "), " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // If attempting to setup a duplex stream, the bufferSize parameter - // MUST be the same in both directions! - if ( stream_.mode == OUTPUT && mode == INPUT && *bufferSize != stream_.bufferSize ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::probeDeviceOpen: system error setting buffer size for duplex stream on device (" << name << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - stream_.bufferSize = *bufferSize; - - // Install the hardware configuration - result = snd_pcm_hw_params( phandle, hw_params ); - if ( result < 0 ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::probeDeviceOpen: error installing hardware configuration on device (" << name << "), " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - return FAILURE; - } - -#if defined(__RTAUDIO_DEBUG__) - fprintf(stderr, "\nRtApiAlsa: dump hardware params after installation:\n\n"); - snd_pcm_hw_params_dump( hw_params, out ); -#endif - - // Set the software configuration to fill buffers with zeros and prevent device stopping on xruns. - snd_pcm_sw_params_t *sw_params = NULL; - snd_pcm_sw_params_alloca( &sw_params ); - snd_pcm_sw_params_current( phandle, sw_params ); - snd_pcm_sw_params_set_start_threshold( phandle, sw_params, *bufferSize ); - snd_pcm_sw_params_set_stop_threshold( phandle, sw_params, ULONG_MAX ); - snd_pcm_sw_params_set_silence_threshold( phandle, sw_params, 0 ); - - // The following two settings were suggested by Theo Veenker - //snd_pcm_sw_params_set_avail_min( phandle, sw_params, *bufferSize ); - //snd_pcm_sw_params_set_xfer_align( phandle, sw_params, 1 ); - - // here are two options for a fix - //snd_pcm_sw_params_set_silence_size( phandle, sw_params, ULONG_MAX ); - snd_pcm_uframes_t val; - snd_pcm_sw_params_get_boundary( sw_params, &val ); - snd_pcm_sw_params_set_silence_size( phandle, sw_params, val ); - - result = snd_pcm_sw_params( phandle, sw_params ); - if ( result < 0 ) { - snd_pcm_close( phandle ); - errorStream_ << "RtApiAlsa::probeDeviceOpen: error installing software configuration on device (" << name << "), " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - return FAILURE; - } - -#if defined(__RTAUDIO_DEBUG__) - fprintf(stderr, "\nRtApiAlsa: dump software params after installation:\n\n"); - snd_pcm_sw_params_dump( sw_params, out ); -#endif - - // Set flags for buffer conversion - stream_.doConvertBuffer[mode] = false; - if ( stream_.userFormat != stream_.deviceFormat[mode] ) - stream_.doConvertBuffer[mode] = true; - if ( stream_.nUserChannels[mode] < stream_.nDeviceChannels[mode] ) - stream_.doConvertBuffer[mode] = true; - if ( stream_.userInterleaved != stream_.deviceInterleaved[mode] && - stream_.nUserChannels[mode] > 1 ) - stream_.doConvertBuffer[mode] = true; - - // Allocate the ApiHandle if necessary and then save. - AlsaHandle *apiInfo = 0; - if ( stream_.apiHandle == 0 ) { - try { - apiInfo = (AlsaHandle *) new AlsaHandle; - } - catch ( std::bad_alloc& ) { - errorText_ = "RtApiAlsa::probeDeviceOpen: error allocating AlsaHandle memory."; - goto error; - } - - if ( pthread_cond_init( &apiInfo->runnable_cv, NULL ) ) { - errorText_ = "RtApiAlsa::probeDeviceOpen: error initializing pthread condition variable."; - goto error; - } - - stream_.apiHandle = (void *) apiInfo; - apiInfo->handles[0] = 0; - apiInfo->handles[1] = 0; - } - else { - apiInfo = (AlsaHandle *) stream_.apiHandle; - } - apiInfo->handles[mode] = phandle; - phandle = 0; - - // Allocate necessary internal buffers. - unsigned long bufferBytes; - bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); - stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); - if ( stream_.userBuffer[mode] == NULL ) { - errorText_ = "RtApiAlsa::probeDeviceOpen: error allocating user buffer memory."; - goto error; - } - - if ( stream_.doConvertBuffer[mode] ) { - - bool makeBuffer = true; - bufferBytes = stream_.nDeviceChannels[mode] * formatBytes( stream_.deviceFormat[mode] ); - if ( mode == INPUT ) { - if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { - unsigned long bytesOut = stream_.nDeviceChannels[0] * formatBytes( stream_.deviceFormat[0] ); - if ( bufferBytes <= bytesOut ) makeBuffer = false; - } - } - - if ( makeBuffer ) { - bufferBytes *= *bufferSize; - if ( stream_.deviceBuffer ) free( stream_.deviceBuffer ); - stream_.deviceBuffer = (char *) calloc( bufferBytes, 1 ); - if ( stream_.deviceBuffer == NULL ) { - errorText_ = "RtApiAlsa::probeDeviceOpen: error allocating device buffer memory."; - goto error; - } - } - } - - stream_.sampleRate = sampleRate; - stream_.nBuffers = periods; - stream_.device[mode] = device; - stream_.state = STREAM_STOPPED; - - // Setup the buffer conversion information structure. - if ( stream_.doConvertBuffer[mode] ) setConvertInfo( mode, firstChannel ); - - // Setup thread if necessary. - if ( stream_.mode == OUTPUT && mode == INPUT ) { - // We had already set up an output stream. - stream_.mode = DUPLEX; - // Link the streams if possible. - apiInfo->synchronized = false; - if ( snd_pcm_link( apiInfo->handles[0], apiInfo->handles[1] ) == 0 ) - apiInfo->synchronized = true; - else { - errorText_ = "RtApiAlsa::probeDeviceOpen: unable to synchronize input and output devices."; - error( RtAudioError::WARNING ); - } - } - else { - stream_.mode = mode; - - // Setup callback thread. - stream_.callbackInfo.object = (void *) this; - - // Set the thread attributes for joinable and realtime scheduling - // priority (optional). The higher priority will only take affect - // if the program is run as root or suid. Note, under Linux - // processes with CAP_SYS_NICE privilege, a user can change - // scheduling policy and priority (thus need not be root). See - // POSIX "capabilities". - pthread_attr_t attr; - pthread_attr_init( &attr ); - pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_JOINABLE ); - -#ifdef SCHED_RR // Undefined with some OSes (eg: NetBSD 1.6.x with GNU Pthread) - if ( options && options->flags & RTAUDIO_SCHEDULE_REALTIME ) { - // We previously attempted to increase the audio callback priority - // to SCHED_RR here via the attributes. However, while no errors - // were reported in doing so, it did not work. So, now this is - // done in the alsaCallbackHandler function. - stream_.callbackInfo.doRealtime = true; - int priority = options->priority; - int min = sched_get_priority_min( SCHED_RR ); - int max = sched_get_priority_max( SCHED_RR ); - if ( priority < min ) priority = min; - else if ( priority > max ) priority = max; - stream_.callbackInfo.priority = priority; - } -#endif - - stream_.callbackInfo.isRunning = true; - result = pthread_create( &stream_.callbackInfo.thread, &attr, alsaCallbackHandler, &stream_.callbackInfo ); - pthread_attr_destroy( &attr ); - if ( result ) { - stream_.callbackInfo.isRunning = false; - errorText_ = "RtApiAlsa::error creating callback thread!"; - goto error; - } - } - - return SUCCESS; - - error: - if ( apiInfo ) { - pthread_cond_destroy( &apiInfo->runnable_cv ); - if ( apiInfo->handles[0] ) snd_pcm_close( apiInfo->handles[0] ); - if ( apiInfo->handles[1] ) snd_pcm_close( apiInfo->handles[1] ); - delete apiInfo; - stream_.apiHandle = 0; - } - - if ( phandle) snd_pcm_close( phandle ); - - for ( int i=0; i<2; i++ ) { - if ( stream_.userBuffer[i] ) { - free( stream_.userBuffer[i] ); - stream_.userBuffer[i] = 0; - } - } - - if ( stream_.deviceBuffer ) { - free( stream_.deviceBuffer ); - stream_.deviceBuffer = 0; - } - - stream_.state = STREAM_CLOSED; - return FAILURE; -} - -void RtApiAlsa :: closeStream() -{ - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApiAlsa::closeStream(): no open stream to close!"; - error( RtAudioError::WARNING ); - return; - } - - AlsaHandle *apiInfo = (AlsaHandle *) stream_.apiHandle; - stream_.callbackInfo.isRunning = false; - MUTEX_LOCK( &stream_.mutex ); - if ( stream_.state == STREAM_STOPPED ) { - apiInfo->runnable = true; - pthread_cond_signal( &apiInfo->runnable_cv ); - } - MUTEX_UNLOCK( &stream_.mutex ); - pthread_join( stream_.callbackInfo.thread, NULL ); - - if ( stream_.state == STREAM_RUNNING ) { - stream_.state = STREAM_STOPPED; - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) - snd_pcm_drop( apiInfo->handles[0] ); - if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) - snd_pcm_drop( apiInfo->handles[1] ); - } - - if ( apiInfo ) { - pthread_cond_destroy( &apiInfo->runnable_cv ); - if ( apiInfo->handles[0] ) snd_pcm_close( apiInfo->handles[0] ); - if ( apiInfo->handles[1] ) snd_pcm_close( apiInfo->handles[1] ); - delete apiInfo; - stream_.apiHandle = 0; - } - - for ( int i=0; i<2; i++ ) { - if ( stream_.userBuffer[i] ) { - free( stream_.userBuffer[i] ); - stream_.userBuffer[i] = 0; - } - } - - if ( stream_.deviceBuffer ) { - free( stream_.deviceBuffer ); - stream_.deviceBuffer = 0; - } - - stream_.mode = UNINITIALIZED; - stream_.state = STREAM_CLOSED; -} - -void RtApiAlsa :: startStream() -{ - // This method calls snd_pcm_prepare if the device isn't already in that state. - - verifyStream(); - if ( stream_.state == STREAM_RUNNING ) { - errorText_ = "RtApiAlsa::startStream(): the stream is already running!"; - error( RtAudioError::WARNING ); - return; - } - - MUTEX_LOCK( &stream_.mutex ); - - int result = 0; - snd_pcm_state_t state; - AlsaHandle *apiInfo = (AlsaHandle *) stream_.apiHandle; - snd_pcm_t **handle = (snd_pcm_t **) apiInfo->handles; - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - state = snd_pcm_state( handle[0] ); - if ( state != SND_PCM_STATE_PREPARED ) { - result = snd_pcm_prepare( handle[0] ); - if ( result < 0 ) { - errorStream_ << "RtApiAlsa::startStream: error preparing output pcm device, " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - goto unlock; - } - } - } - - if ( ( stream_.mode == INPUT || stream_.mode == DUPLEX ) && !apiInfo->synchronized ) { - result = snd_pcm_drop(handle[1]); // fix to remove stale data received since device has been open - state = snd_pcm_state( handle[1] ); - if ( state != SND_PCM_STATE_PREPARED ) { - result = snd_pcm_prepare( handle[1] ); - if ( result < 0 ) { - errorStream_ << "RtApiAlsa::startStream: error preparing input pcm device, " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - goto unlock; - } - } - } - - stream_.state = STREAM_RUNNING; - - unlock: - apiInfo->runnable = true; - pthread_cond_signal( &apiInfo->runnable_cv ); - MUTEX_UNLOCK( &stream_.mutex ); - - if ( result >= 0 ) return; - error( RtAudioError::SYSTEM_ERROR ); -} - -void RtApiAlsa :: stopStream() -{ - verifyStream(); - if ( stream_.state == STREAM_STOPPED ) { - errorText_ = "RtApiAlsa::stopStream(): the stream is already stopped!"; - error( RtAudioError::WARNING ); - return; - } - - stream_.state = STREAM_STOPPED; - MUTEX_LOCK( &stream_.mutex ); - - int result = 0; - AlsaHandle *apiInfo = (AlsaHandle *) stream_.apiHandle; - snd_pcm_t **handle = (snd_pcm_t **) apiInfo->handles; - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - if ( apiInfo->synchronized ) - result = snd_pcm_drop( handle[0] ); - else - result = snd_pcm_drain( handle[0] ); - if ( result < 0 ) { - errorStream_ << "RtApiAlsa::stopStream: error draining output pcm device, " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - goto unlock; - } - } - - if ( ( stream_.mode == INPUT || stream_.mode == DUPLEX ) && !apiInfo->synchronized ) { - result = snd_pcm_drop( handle[1] ); - if ( result < 0 ) { - errorStream_ << "RtApiAlsa::stopStream: error stopping input pcm device, " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - goto unlock; - } - } - - unlock: - apiInfo->runnable = false; // fixes high CPU usage when stopped - MUTEX_UNLOCK( &stream_.mutex ); - - if ( result >= 0 ) return; - error( RtAudioError::SYSTEM_ERROR ); -} - -void RtApiAlsa :: abortStream() -{ - verifyStream(); - if ( stream_.state == STREAM_STOPPED ) { - errorText_ = "RtApiAlsa::abortStream(): the stream is already stopped!"; - error( RtAudioError::WARNING ); - return; - } - - stream_.state = STREAM_STOPPED; - MUTEX_LOCK( &stream_.mutex ); - - int result = 0; - AlsaHandle *apiInfo = (AlsaHandle *) stream_.apiHandle; - snd_pcm_t **handle = (snd_pcm_t **) apiInfo->handles; - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - result = snd_pcm_drop( handle[0] ); - if ( result < 0 ) { - errorStream_ << "RtApiAlsa::abortStream: error aborting output pcm device, " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - goto unlock; - } - } - - if ( ( stream_.mode == INPUT || stream_.mode == DUPLEX ) && !apiInfo->synchronized ) { - result = snd_pcm_drop( handle[1] ); - if ( result < 0 ) { - errorStream_ << "RtApiAlsa::abortStream: error aborting input pcm device, " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - goto unlock; - } - } - - unlock: - apiInfo->runnable = false; // fixes high CPU usage when stopped - MUTEX_UNLOCK( &stream_.mutex ); - - if ( result >= 0 ) return; - error( RtAudioError::SYSTEM_ERROR ); -} - -void RtApiAlsa :: callbackEvent() -{ - AlsaHandle *apiInfo = (AlsaHandle *) stream_.apiHandle; - if ( stream_.state == STREAM_STOPPED ) { - MUTEX_LOCK( &stream_.mutex ); - while ( !apiInfo->runnable ) - pthread_cond_wait( &apiInfo->runnable_cv, &stream_.mutex ); - - if ( stream_.state != STREAM_RUNNING ) { - MUTEX_UNLOCK( &stream_.mutex ); - return; - } - MUTEX_UNLOCK( &stream_.mutex ); - } - - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApiAlsa::callbackEvent(): the stream is closed ... this shouldn't happen!"; - error( RtAudioError::WARNING ); - return; - } - - int doStopStream = 0; - RtAudioCallback callback = (RtAudioCallback) stream_.callbackInfo.callback; - double streamTime = getStreamTime(); - RtAudioStreamStatus status = 0; - if ( stream_.mode != INPUT && apiInfo->xrun[0] == true ) { - status |= RTAUDIO_OUTPUT_UNDERFLOW; - apiInfo->xrun[0] = false; - } - if ( stream_.mode != OUTPUT && apiInfo->xrun[1] == true ) { - status |= RTAUDIO_INPUT_OVERFLOW; - apiInfo->xrun[1] = false; - } - doStopStream = callback( stream_.userBuffer[0], stream_.userBuffer[1], - stream_.bufferSize, streamTime, status, stream_.callbackInfo.userData ); - - if ( doStopStream == 2 ) { - abortStream(); - return; - } - - MUTEX_LOCK( &stream_.mutex ); - - // The state might change while waiting on a mutex. - if ( stream_.state == STREAM_STOPPED ) goto unlock; - - int result; - char *buffer; - int channels; - snd_pcm_t **handle; - snd_pcm_sframes_t frames; - RtAudioFormat format; - handle = (snd_pcm_t **) apiInfo->handles; - - if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { - - // Setup parameters. - if ( stream_.doConvertBuffer[1] ) { - buffer = stream_.deviceBuffer; - channels = stream_.nDeviceChannels[1]; - format = stream_.deviceFormat[1]; - } - else { - buffer = stream_.userBuffer[1]; - channels = stream_.nUserChannels[1]; - format = stream_.userFormat; - } - - // Read samples from device in interleaved/non-interleaved format. - if ( stream_.deviceInterleaved[1] ) - result = snd_pcm_readi( handle[1], buffer, stream_.bufferSize ); - else { - void *bufs[channels]; - size_t offset = stream_.bufferSize * formatBytes( format ); - for ( int i=0; ixrun[1] = true; - result = snd_pcm_prepare( handle[1] ); - if ( result < 0 ) { - errorStream_ << "RtApiAlsa::callbackEvent: error preparing device after overrun, " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - } - } - else { - errorStream_ << "RtApiAlsa::callbackEvent: error, current state is " << snd_pcm_state_name( state ) << ", " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - } - } - else { - errorStream_ << "RtApiAlsa::callbackEvent: audio read error, " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - } - error( RtAudioError::WARNING ); - goto tryOutput; - } - - // Do byte swapping if necessary. - if ( stream_.doByteSwap[1] ) - byteSwapBuffer( buffer, stream_.bufferSize * channels, format ); - - // Do buffer conversion if necessary. - if ( stream_.doConvertBuffer[1] ) - convertBuffer( stream_.userBuffer[1], stream_.deviceBuffer, stream_.convertInfo[1] ); - - // Check stream latency - result = snd_pcm_delay( handle[1], &frames ); - if ( result == 0 && frames > 0 ) stream_.latency[1] = frames; - } - - tryOutput: - - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - - // Setup parameters and do buffer conversion if necessary. - if ( stream_.doConvertBuffer[0] ) { - buffer = stream_.deviceBuffer; - convertBuffer( buffer, stream_.userBuffer[0], stream_.convertInfo[0] ); - channels = stream_.nDeviceChannels[0]; - format = stream_.deviceFormat[0]; - } - else { - buffer = stream_.userBuffer[0]; - channels = stream_.nUserChannels[0]; - format = stream_.userFormat; - } - - // Do byte swapping if necessary. - if ( stream_.doByteSwap[0] ) - byteSwapBuffer(buffer, stream_.bufferSize * channels, format); - - // Write samples to device in interleaved/non-interleaved format. - if ( stream_.deviceInterleaved[0] ) - result = snd_pcm_writei( handle[0], buffer, stream_.bufferSize ); - else { - void *bufs[channels]; - size_t offset = stream_.bufferSize * formatBytes( format ); - for ( int i=0; ixrun[0] = true; - result = snd_pcm_prepare( handle[0] ); - if ( result < 0 ) { - errorStream_ << "RtApiAlsa::callbackEvent: error preparing device after underrun, " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - } - } - else { - errorStream_ << "RtApiAlsa::callbackEvent: error, current state is " << snd_pcm_state_name( state ) << ", " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - } - } - else { - errorStream_ << "RtApiAlsa::callbackEvent: audio write error, " << snd_strerror( result ) << "."; - errorText_ = errorStream_.str(); - } - error( RtAudioError::WARNING ); - goto unlock; - } - - // Check stream latency - result = snd_pcm_delay( handle[0], &frames ); - if ( result == 0 && frames > 0 ) stream_.latency[0] = frames; - } - - unlock: - MUTEX_UNLOCK( &stream_.mutex ); - - RtApi::tickStreamTime(); - if ( doStopStream == 1 ) this->stopStream(); -} - -static void *alsaCallbackHandler( void *ptr ) -{ - CallbackInfo *info = (CallbackInfo *) ptr; - RtApiAlsa *object = (RtApiAlsa *) info->object; - bool *isRunning = &info->isRunning; - -#ifdef SCHED_RR // Undefined with some OSes (eg: NetBSD 1.6.x with GNU Pthread) - if ( &info->doRealtime ) { - pthread_t tID = pthread_self(); // ID of this thread - sched_param prio = { info->priority }; // scheduling priority of thread - pthread_setschedparam( tID, SCHED_RR, &prio ); - } -#endif - - while ( *isRunning == true ) { - pthread_testcancel(); - object->callbackEvent(); - } - - pthread_exit( NULL ); -} - -//******************** End of __LINUX_ALSA__ *********************// -#endif - -#if defined(__LINUX_PULSE__) - -// Code written by Peter Meerwald, pmeerw@pmeerw.net -// and Tristan Matthews. - -#include -#include -#include - -static const unsigned int SUPPORTED_SAMPLERATES[] = { 8000, 16000, 22050, 32000, - 44100, 48000, 96000, 0}; - -struct rtaudio_pa_format_mapping_t { - RtAudioFormat rtaudio_format; - pa_sample_format_t pa_format; -}; - -static const rtaudio_pa_format_mapping_t supported_sampleformats[] = { - {RTAUDIO_SINT16, PA_SAMPLE_S16LE}, - {RTAUDIO_SINT32, PA_SAMPLE_S32LE}, - {RTAUDIO_FLOAT32, PA_SAMPLE_FLOAT32LE}, - {0, PA_SAMPLE_INVALID}}; - -struct PulseAudioHandle { - pa_simple *s_play; - pa_simple *s_rec; - pthread_t thread; - pthread_cond_t runnable_cv; - bool runnable; - PulseAudioHandle() : s_play(0), s_rec(0), runnable(false) { } -}; - -RtApiPulse::~RtApiPulse() -{ - if ( stream_.state != STREAM_CLOSED ) - closeStream(); -} - -unsigned int RtApiPulse::getDeviceCount( void ) -{ - return 1; -} - -RtAudio::DeviceInfo RtApiPulse::getDeviceInfo( unsigned int /*device*/ ) -{ - RtAudio::DeviceInfo info; - info.probed = true; - info.name = "PulseAudio"; - info.outputChannels = 2; - info.inputChannels = 2; - info.duplexChannels = 2; - info.isDefaultOutput = true; - info.isDefaultInput = true; - - for ( const unsigned int *sr = SUPPORTED_SAMPLERATES; *sr; ++sr ) - info.sampleRates.push_back( *sr ); - - info.preferredSampleRate = 48000; - info.nativeFormats = RTAUDIO_SINT16 | RTAUDIO_SINT32 | RTAUDIO_FLOAT32; - - return info; -} - -static void *pulseaudio_callback( void * user ) -{ - CallbackInfo *cbi = static_cast( user ); - RtApiPulse *context = static_cast( cbi->object ); - volatile bool *isRunning = &cbi->isRunning; - - while ( *isRunning ) { - pthread_testcancel(); - context->callbackEvent(); - } - - pthread_exit( NULL ); -} - -void RtApiPulse::closeStream( void ) -{ - PulseAudioHandle *pah = static_cast( stream_.apiHandle ); - - stream_.callbackInfo.isRunning = false; - if ( pah ) { - MUTEX_LOCK( &stream_.mutex ); - if ( stream_.state == STREAM_STOPPED ) { - pah->runnable = true; - pthread_cond_signal( &pah->runnable_cv ); - } - MUTEX_UNLOCK( &stream_.mutex ); - - pthread_join( pah->thread, 0 ); - if ( pah->s_play ) { - pa_simple_flush( pah->s_play, NULL ); - pa_simple_free( pah->s_play ); - } - if ( pah->s_rec ) - pa_simple_free( pah->s_rec ); - - pthread_cond_destroy( &pah->runnable_cv ); - delete pah; - stream_.apiHandle = 0; - } - - if ( stream_.userBuffer[0] ) { - free( stream_.userBuffer[0] ); - stream_.userBuffer[0] = 0; - } - if ( stream_.userBuffer[1] ) { - free( stream_.userBuffer[1] ); - stream_.userBuffer[1] = 0; - } - - stream_.state = STREAM_CLOSED; - stream_.mode = UNINITIALIZED; -} - -void RtApiPulse::callbackEvent( void ) -{ - PulseAudioHandle *pah = static_cast( stream_.apiHandle ); - - if ( stream_.state == STREAM_STOPPED ) { - MUTEX_LOCK( &stream_.mutex ); - while ( !pah->runnable ) - pthread_cond_wait( &pah->runnable_cv, &stream_.mutex ); - - if ( stream_.state != STREAM_RUNNING ) { - MUTEX_UNLOCK( &stream_.mutex ); - return; - } - MUTEX_UNLOCK( &stream_.mutex ); - } - - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApiPulse::callbackEvent(): the stream is closed ... " - "this shouldn't happen!"; - error( RtAudioError::WARNING ); - return; - } - - RtAudioCallback callback = (RtAudioCallback) stream_.callbackInfo.callback; - double streamTime = getStreamTime(); - RtAudioStreamStatus status = 0; - int doStopStream = callback( stream_.userBuffer[OUTPUT], stream_.userBuffer[INPUT], - stream_.bufferSize, streamTime, status, - stream_.callbackInfo.userData ); - - if ( doStopStream == 2 ) { - abortStream(); - return; - } - - MUTEX_LOCK( &stream_.mutex ); - void *pulse_in = stream_.doConvertBuffer[INPUT] ? stream_.deviceBuffer : stream_.userBuffer[INPUT]; - void *pulse_out = stream_.doConvertBuffer[OUTPUT] ? stream_.deviceBuffer : stream_.userBuffer[OUTPUT]; - - if ( stream_.state != STREAM_RUNNING ) - goto unlock; - - int pa_error; - size_t bytes; - if (stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - if ( stream_.doConvertBuffer[OUTPUT] ) { - convertBuffer( stream_.deviceBuffer, - stream_.userBuffer[OUTPUT], - stream_.convertInfo[OUTPUT] ); - bytes = stream_.nDeviceChannels[OUTPUT] * stream_.bufferSize * - formatBytes( stream_.deviceFormat[OUTPUT] ); - } else - bytes = stream_.nUserChannels[OUTPUT] * stream_.bufferSize * - formatBytes( stream_.userFormat ); - - if ( pa_simple_write( pah->s_play, pulse_out, bytes, &pa_error ) < 0 ) { - errorStream_ << "RtApiPulse::callbackEvent: audio write error, " << - pa_strerror( pa_error ) << "."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - } - } - - if ( stream_.mode == INPUT || stream_.mode == DUPLEX) { - if ( stream_.doConvertBuffer[INPUT] ) - bytes = stream_.nDeviceChannels[INPUT] * stream_.bufferSize * - formatBytes( stream_.deviceFormat[INPUT] ); - else - bytes = stream_.nUserChannels[INPUT] * stream_.bufferSize * - formatBytes( stream_.userFormat ); - - if ( pa_simple_read( pah->s_rec, pulse_in, bytes, &pa_error ) < 0 ) { - errorStream_ << "RtApiPulse::callbackEvent: audio read error, " << - pa_strerror( pa_error ) << "."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - } - if ( stream_.doConvertBuffer[INPUT] ) { - convertBuffer( stream_.userBuffer[INPUT], - stream_.deviceBuffer, - stream_.convertInfo[INPUT] ); - } - } - - unlock: - MUTEX_UNLOCK( &stream_.mutex ); - RtApi::tickStreamTime(); - - if ( doStopStream == 1 ) - stopStream(); -} - -void RtApiPulse::startStream( void ) -{ - PulseAudioHandle *pah = static_cast( stream_.apiHandle ); - - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApiPulse::startStream(): the stream is not open!"; - error( RtAudioError::INVALID_USE ); - return; - } - if ( stream_.state == STREAM_RUNNING ) { - errorText_ = "RtApiPulse::startStream(): the stream is already running!"; - error( RtAudioError::WARNING ); - return; - } - - MUTEX_LOCK( &stream_.mutex ); - - stream_.state = STREAM_RUNNING; - - pah->runnable = true; - pthread_cond_signal( &pah->runnable_cv ); - MUTEX_UNLOCK( &stream_.mutex ); -} - -void RtApiPulse::stopStream( void ) -{ - PulseAudioHandle *pah = static_cast( stream_.apiHandle ); - - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApiPulse::stopStream(): the stream is not open!"; - error( RtAudioError::INVALID_USE ); - return; - } - if ( stream_.state == STREAM_STOPPED ) { - errorText_ = "RtApiPulse::stopStream(): the stream is already stopped!"; - error( RtAudioError::WARNING ); - return; - } - - stream_.state = STREAM_STOPPED; - MUTEX_LOCK( &stream_.mutex ); - - if ( pah && pah->s_play ) { - int pa_error; - if ( pa_simple_drain( pah->s_play, &pa_error ) < 0 ) { - errorStream_ << "RtApiPulse::stopStream: error draining output device, " << - pa_strerror( pa_error ) << "."; - errorText_ = errorStream_.str(); - MUTEX_UNLOCK( &stream_.mutex ); - error( RtAudioError::SYSTEM_ERROR ); - return; - } - } - - stream_.state = STREAM_STOPPED; - MUTEX_UNLOCK( &stream_.mutex ); -} - -void RtApiPulse::abortStream( void ) -{ - PulseAudioHandle *pah = static_cast( stream_.apiHandle ); - - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApiPulse::abortStream(): the stream is not open!"; - error( RtAudioError::INVALID_USE ); - return; - } - if ( stream_.state == STREAM_STOPPED ) { - errorText_ = "RtApiPulse::abortStream(): the stream is already stopped!"; - error( RtAudioError::WARNING ); - return; - } - - stream_.state = STREAM_STOPPED; - MUTEX_LOCK( &stream_.mutex ); - - if ( pah && pah->s_play ) { - int pa_error; - if ( pa_simple_flush( pah->s_play, &pa_error ) < 0 ) { - errorStream_ << "RtApiPulse::abortStream: error flushing output device, " << - pa_strerror( pa_error ) << "."; - errorText_ = errorStream_.str(); - MUTEX_UNLOCK( &stream_.mutex ); - error( RtAudioError::SYSTEM_ERROR ); - return; - } - } - - stream_.state = STREAM_STOPPED; - MUTEX_UNLOCK( &stream_.mutex ); -} - -bool RtApiPulse::probeDeviceOpen( unsigned int device, StreamMode mode, - unsigned int channels, unsigned int firstChannel, - unsigned int sampleRate, RtAudioFormat format, - unsigned int *bufferSize, RtAudio::StreamOptions *options ) -{ - PulseAudioHandle *pah = 0; - unsigned long bufferBytes = 0; - pa_sample_spec ss; - - if ( device != 0 ) return false; - if ( mode != INPUT && mode != OUTPUT ) return false; - if ( channels != 1 && channels != 2 ) { - errorText_ = "RtApiPulse::probeDeviceOpen: unsupported number of channels."; - return false; - } - ss.channels = channels; - - if ( firstChannel != 0 ) return false; - - bool sr_found = false; - for ( const unsigned int *sr = SUPPORTED_SAMPLERATES; *sr; ++sr ) { - if ( sampleRate == *sr ) { - sr_found = true; - stream_.sampleRate = sampleRate; - ss.rate = sampleRate; - break; - } - } - if ( !sr_found ) { - errorText_ = "RtApiPulse::probeDeviceOpen: unsupported sample rate."; - return false; - } - - bool sf_found = 0; - for ( const rtaudio_pa_format_mapping_t *sf = supported_sampleformats; - sf->rtaudio_format && sf->pa_format != PA_SAMPLE_INVALID; ++sf ) { - if ( format == sf->rtaudio_format ) { - sf_found = true; - stream_.userFormat = sf->rtaudio_format; - stream_.deviceFormat[mode] = stream_.userFormat; - ss.format = sf->pa_format; - break; - } - } - if ( !sf_found ) { // Use internal data format conversion. - stream_.userFormat = format; - stream_.deviceFormat[mode] = RTAUDIO_FLOAT32; - ss.format = PA_SAMPLE_FLOAT32LE; - } - - // Set other stream parameters. - if ( options && options->flags & RTAUDIO_NONINTERLEAVED ) stream_.userInterleaved = false; - else stream_.userInterleaved = true; - stream_.deviceInterleaved[mode] = true; - stream_.nBuffers = 1; - stream_.doByteSwap[mode] = false; - stream_.nUserChannels[mode] = channels; - stream_.nDeviceChannels[mode] = channels + firstChannel; - stream_.channelOffset[mode] = 0; - std::string streamName = "RtAudio"; - - // Set flags for buffer conversion. - stream_.doConvertBuffer[mode] = false; - if ( stream_.userFormat != stream_.deviceFormat[mode] ) - stream_.doConvertBuffer[mode] = true; - if ( stream_.nUserChannels[mode] < stream_.nDeviceChannels[mode] ) - stream_.doConvertBuffer[mode] = true; - - // Allocate necessary internal buffers. - bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); - stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); - if ( stream_.userBuffer[mode] == NULL ) { - errorText_ = "RtApiPulse::probeDeviceOpen: error allocating user buffer memory."; - goto error; - } - stream_.bufferSize = *bufferSize; - - if ( stream_.doConvertBuffer[mode] ) { - - bool makeBuffer = true; - bufferBytes = stream_.nDeviceChannels[mode] * formatBytes( stream_.deviceFormat[mode] ); - if ( mode == INPUT ) { - if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { - unsigned long bytesOut = stream_.nDeviceChannels[0] * formatBytes( stream_.deviceFormat[0] ); - if ( bufferBytes <= bytesOut ) makeBuffer = false; - } - } - - if ( makeBuffer ) { - bufferBytes *= *bufferSize; - if ( stream_.deviceBuffer ) free( stream_.deviceBuffer ); - stream_.deviceBuffer = (char *) calloc( bufferBytes, 1 ); - if ( stream_.deviceBuffer == NULL ) { - errorText_ = "RtApiPulse::probeDeviceOpen: error allocating device buffer memory."; - goto error; - } - } - } - - stream_.device[mode] = device; - - // Setup the buffer conversion information structure. - if ( stream_.doConvertBuffer[mode] ) setConvertInfo( mode, firstChannel ); - - if ( !stream_.apiHandle ) { - PulseAudioHandle *pah = new PulseAudioHandle; - if ( !pah ) { - errorText_ = "RtApiPulse::probeDeviceOpen: error allocating memory for handle."; - goto error; - } - - stream_.apiHandle = pah; - if ( pthread_cond_init( &pah->runnable_cv, NULL ) != 0 ) { - errorText_ = "RtApiPulse::probeDeviceOpen: error creating condition variable."; - goto error; - } - } - pah = static_cast( stream_.apiHandle ); - - int error; - if ( options && !options->streamName.empty() ) streamName = options->streamName; - switch ( mode ) { - case INPUT: - pa_buffer_attr buffer_attr; - buffer_attr.fragsize = bufferBytes; - buffer_attr.maxlength = -1; - - pah->s_rec = pa_simple_new( NULL, streamName.c_str(), PA_STREAM_RECORD, NULL, "Record", &ss, NULL, &buffer_attr, &error ); - if ( !pah->s_rec ) { - errorText_ = "RtApiPulse::probeDeviceOpen: error connecting input to PulseAudio server."; - goto error; - } - break; - case OUTPUT: - pah->s_play = pa_simple_new( NULL, "RtAudio", PA_STREAM_PLAYBACK, NULL, "Playback", &ss, NULL, NULL, &error ); - if ( !pah->s_play ) { - errorText_ = "RtApiPulse::probeDeviceOpen: error connecting output to PulseAudio server."; - goto error; - } - break; - default: - goto error; - } - - if ( stream_.mode == UNINITIALIZED ) - stream_.mode = mode; - else if ( stream_.mode == mode ) - goto error; - else - stream_.mode = DUPLEX; - - if ( !stream_.callbackInfo.isRunning ) { - stream_.callbackInfo.object = this; - stream_.callbackInfo.isRunning = true; - if ( pthread_create( &pah->thread, NULL, pulseaudio_callback, (void *)&stream_.callbackInfo) != 0 ) { - errorText_ = "RtApiPulse::probeDeviceOpen: error creating thread."; - goto error; - } - } - - stream_.state = STREAM_STOPPED; - return true; - - error: - if ( pah && stream_.callbackInfo.isRunning ) { - pthread_cond_destroy( &pah->runnable_cv ); - delete pah; - stream_.apiHandle = 0; - } - - for ( int i=0; i<2; i++ ) { - if ( stream_.userBuffer[i] ) { - free( stream_.userBuffer[i] ); - stream_.userBuffer[i] = 0; - } - } - - if ( stream_.deviceBuffer ) { - free( stream_.deviceBuffer ); - stream_.deviceBuffer = 0; - } - - return FAILURE; -} - -//******************** End of __LINUX_PULSE__ *********************// -#endif - -#if defined(__LINUX_OSS__) - -#include -#include -#include -#include -#include -#include -#include - -static void *ossCallbackHandler(void * ptr); - -// A structure to hold various information related to the OSS API -// implementation. -struct OssHandle { - int id[2]; // device ids - bool xrun[2]; - bool triggered; - pthread_cond_t runnable; - - OssHandle() - :triggered(false) { id[0] = 0; id[1] = 0; xrun[0] = false; xrun[1] = false; } -}; - -RtApiOss :: RtApiOss() -{ - // Nothing to do here. -} - -RtApiOss :: ~RtApiOss() -{ - if ( stream_.state != STREAM_CLOSED ) closeStream(); -} - -unsigned int RtApiOss :: getDeviceCount( void ) -{ - int mixerfd = open( "/dev/mixer", O_RDWR, 0 ); - if ( mixerfd == -1 ) { - errorText_ = "RtApiOss::getDeviceCount: error opening '/dev/mixer'."; - error( RtAudioError::WARNING ); - return 0; - } - - oss_sysinfo sysinfo; - if ( ioctl( mixerfd, SNDCTL_SYSINFO, &sysinfo ) == -1 ) { - close( mixerfd ); - errorText_ = "RtApiOss::getDeviceCount: error getting sysinfo, OSS version >= 4.0 is required."; - error( RtAudioError::WARNING ); - return 0; - } - - close( mixerfd ); - return sysinfo.numaudios; -} - -RtAudio::DeviceInfo RtApiOss :: getDeviceInfo( unsigned int device ) -{ - RtAudio::DeviceInfo info; - info.probed = false; - - int mixerfd = open( "/dev/mixer", O_RDWR, 0 ); - if ( mixerfd == -1 ) { - errorText_ = "RtApiOss::getDeviceInfo: error opening '/dev/mixer'."; - error( RtAudioError::WARNING ); - return info; - } - - oss_sysinfo sysinfo; - int result = ioctl( mixerfd, SNDCTL_SYSINFO, &sysinfo ); - if ( result == -1 ) { - close( mixerfd ); - errorText_ = "RtApiOss::getDeviceInfo: error getting sysinfo, OSS version >= 4.0 is required."; - error( RtAudioError::WARNING ); - return info; - } - - unsigned nDevices = sysinfo.numaudios; - if ( nDevices == 0 ) { - close( mixerfd ); - errorText_ = "RtApiOss::getDeviceInfo: no devices found!"; - error( RtAudioError::INVALID_USE ); - return info; - } - - if ( device >= nDevices ) { - close( mixerfd ); - errorText_ = "RtApiOss::getDeviceInfo: device ID is invalid!"; - error( RtAudioError::INVALID_USE ); - return info; - } - - oss_audioinfo ainfo; - ainfo.dev = device; - result = ioctl( mixerfd, SNDCTL_AUDIOINFO, &ainfo ); - close( mixerfd ); - if ( result == -1 ) { - errorStream_ << "RtApiOss::getDeviceInfo: error getting device (" << ainfo.name << ") info."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - return info; - } - - // Probe channels - if ( ainfo.caps & PCM_CAP_OUTPUT ) info.outputChannels = ainfo.max_channels; - if ( ainfo.caps & PCM_CAP_INPUT ) info.inputChannels = ainfo.max_channels; - if ( ainfo.caps & PCM_CAP_DUPLEX ) { - if ( info.outputChannels > 0 && info.inputChannels > 0 && ainfo.caps & PCM_CAP_DUPLEX ) - info.duplexChannels = (info.outputChannels > info.inputChannels) ? info.inputChannels : info.outputChannels; - } - - // Probe data formats ... do for input - unsigned long mask = ainfo.iformats; - if ( mask & AFMT_S16_LE || mask & AFMT_S16_BE ) - info.nativeFormats |= RTAUDIO_SINT16; - if ( mask & AFMT_S8 ) - info.nativeFormats |= RTAUDIO_SINT8; - if ( mask & AFMT_S32_LE || mask & AFMT_S32_BE ) - info.nativeFormats |= RTAUDIO_SINT32; - if ( mask & AFMT_FLOAT ) - info.nativeFormats |= RTAUDIO_FLOAT32; - if ( mask & AFMT_S24_LE || mask & AFMT_S24_BE ) - info.nativeFormats |= RTAUDIO_SINT24; - - // Check that we have at least one supported format - if ( info.nativeFormats == 0 ) { - errorStream_ << "RtApiOss::getDeviceInfo: device (" << ainfo.name << ") data format not supported by RtAudio."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - return info; - } - - // Probe the supported sample rates. - info.sampleRates.clear(); - if ( ainfo.nrates ) { - for ( unsigned int i=0; i info.preferredSampleRate ) ) - info.preferredSampleRate = SAMPLE_RATES[k]; - - break; - } - } - } - } - else { - // Check min and max rate values; - for ( unsigned int k=0; k= (int) SAMPLE_RATES[k] ) { - info.sampleRates.push_back( SAMPLE_RATES[k] ); - - if ( !info.preferredSampleRate || ( SAMPLE_RATES[k] <= 48000 && SAMPLE_RATES[k] > info.preferredSampleRate ) ) - info.preferredSampleRate = SAMPLE_RATES[k]; - } - } - } - - if ( info.sampleRates.size() == 0 ) { - errorStream_ << "RtApiOss::getDeviceInfo: no supported sample rates found for device (" << ainfo.name << ")."; - errorText_ = errorStream_.str(); - error( RtAudioError::WARNING ); - } - else { - info.probed = true; - info.name = ainfo.name; - } - - return info; -} - - -bool RtApiOss :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, - unsigned int firstChannel, unsigned int sampleRate, - RtAudioFormat format, unsigned int *bufferSize, - RtAudio::StreamOptions *options ) -{ - int mixerfd = open( "/dev/mixer", O_RDWR, 0 ); - if ( mixerfd == -1 ) { - errorText_ = "RtApiOss::probeDeviceOpen: error opening '/dev/mixer'."; - return FAILURE; - } - - oss_sysinfo sysinfo; - int result = ioctl( mixerfd, SNDCTL_SYSINFO, &sysinfo ); - if ( result == -1 ) { - close( mixerfd ); - errorText_ = "RtApiOss::probeDeviceOpen: error getting sysinfo, OSS version >= 4.0 is required."; - return FAILURE; - } - - unsigned nDevices = sysinfo.numaudios; - if ( nDevices == 0 ) { - // This should not happen because a check is made before this function is called. - close( mixerfd ); - errorText_ = "RtApiOss::probeDeviceOpen: no devices found!"; - return FAILURE; - } - - if ( device >= nDevices ) { - // This should not happen because a check is made before this function is called. - close( mixerfd ); - errorText_ = "RtApiOss::probeDeviceOpen: device ID is invalid!"; - return FAILURE; - } - - oss_audioinfo ainfo; - ainfo.dev = device; - result = ioctl( mixerfd, SNDCTL_AUDIOINFO, &ainfo ); - close( mixerfd ); - if ( result == -1 ) { - errorStream_ << "RtApiOss::getDeviceInfo: error getting device (" << ainfo.name << ") info."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Check if device supports input or output - if ( ( mode == OUTPUT && !( ainfo.caps & PCM_CAP_OUTPUT ) ) || - ( mode == INPUT && !( ainfo.caps & PCM_CAP_INPUT ) ) ) { - if ( mode == OUTPUT ) - errorStream_ << "RtApiOss::probeDeviceOpen: device (" << ainfo.name << ") does not support output."; - else - errorStream_ << "RtApiOss::probeDeviceOpen: device (" << ainfo.name << ") does not support input."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - int flags = 0; - OssHandle *handle = (OssHandle *) stream_.apiHandle; - if ( mode == OUTPUT ) - flags |= O_WRONLY; - else { // mode == INPUT - if (stream_.mode == OUTPUT && stream_.device[0] == device) { - // We just set the same device for playback ... close and reopen for duplex (OSS only). - close( handle->id[0] ); - handle->id[0] = 0; - if ( !( ainfo.caps & PCM_CAP_DUPLEX ) ) { - errorStream_ << "RtApiOss::probeDeviceOpen: device (" << ainfo.name << ") does not support duplex mode."; - errorText_ = errorStream_.str(); - return FAILURE; - } - // Check that the number previously set channels is the same. - if ( stream_.nUserChannels[0] != channels ) { - errorStream_ << "RtApiOss::probeDeviceOpen: input/output channels must be equal for OSS duplex device (" << ainfo.name << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - flags |= O_RDWR; - } - else - flags |= O_RDONLY; - } - - // Set exclusive access if specified. - if ( options && options->flags & RTAUDIO_HOG_DEVICE ) flags |= O_EXCL; - - // Try to open the device. - int fd; - fd = open( ainfo.devnode, flags, 0 ); - if ( fd == -1 ) { - if ( errno == EBUSY ) - errorStream_ << "RtApiOss::probeDeviceOpen: device (" << ainfo.name << ") is busy."; - else - errorStream_ << "RtApiOss::probeDeviceOpen: error opening device (" << ainfo.name << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // For duplex operation, specifically set this mode (this doesn't seem to work). - /* - if ( flags | O_RDWR ) { - result = ioctl( fd, SNDCTL_DSP_SETDUPLEX, NULL ); - if ( result == -1) { - errorStream_ << "RtApiOss::probeDeviceOpen: error setting duplex mode for device (" << ainfo.name << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - } - */ - - // Check the device channel support. - stream_.nUserChannels[mode] = channels; - if ( ainfo.max_channels < (int)(channels + firstChannel) ) { - close( fd ); - errorStream_ << "RtApiOss::probeDeviceOpen: the device (" << ainfo.name << ") does not support requested channel parameters."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Set the number of channels. - int deviceChannels = channels + firstChannel; - result = ioctl( fd, SNDCTL_DSP_CHANNELS, &deviceChannels ); - if ( result == -1 || deviceChannels < (int)(channels + firstChannel) ) { - close( fd ); - errorStream_ << "RtApiOss::probeDeviceOpen: error setting channel parameters on device (" << ainfo.name << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - stream_.nDeviceChannels[mode] = deviceChannels; - - // Get the data format mask - int mask; - result = ioctl( fd, SNDCTL_DSP_GETFMTS, &mask ); - if ( result == -1 ) { - close( fd ); - errorStream_ << "RtApiOss::probeDeviceOpen: error getting device (" << ainfo.name << ") data formats."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Determine how to set the device format. - stream_.userFormat = format; - int deviceFormat = -1; - stream_.doByteSwap[mode] = false; - if ( format == RTAUDIO_SINT8 ) { - if ( mask & AFMT_S8 ) { - deviceFormat = AFMT_S8; - stream_.deviceFormat[mode] = RTAUDIO_SINT8; - } - } - else if ( format == RTAUDIO_SINT16 ) { - if ( mask & AFMT_S16_NE ) { - deviceFormat = AFMT_S16_NE; - stream_.deviceFormat[mode] = RTAUDIO_SINT16; - } - else if ( mask & AFMT_S16_OE ) { - deviceFormat = AFMT_S16_OE; - stream_.deviceFormat[mode] = RTAUDIO_SINT16; - stream_.doByteSwap[mode] = true; - } - } - else if ( format == RTAUDIO_SINT24 ) { - if ( mask & AFMT_S24_NE ) { - deviceFormat = AFMT_S24_NE; - stream_.deviceFormat[mode] = RTAUDIO_SINT24; - } - else if ( mask & AFMT_S24_OE ) { - deviceFormat = AFMT_S24_OE; - stream_.deviceFormat[mode] = RTAUDIO_SINT24; - stream_.doByteSwap[mode] = true; - } - } - else if ( format == RTAUDIO_SINT32 ) { - if ( mask & AFMT_S32_NE ) { - deviceFormat = AFMT_S32_NE; - stream_.deviceFormat[mode] = RTAUDIO_SINT32; - } - else if ( mask & AFMT_S32_OE ) { - deviceFormat = AFMT_S32_OE; - stream_.deviceFormat[mode] = RTAUDIO_SINT32; - stream_.doByteSwap[mode] = true; - } - } - - if ( deviceFormat == -1 ) { - // The user requested format is not natively supported by the device. - if ( mask & AFMT_S16_NE ) { - deviceFormat = AFMT_S16_NE; - stream_.deviceFormat[mode] = RTAUDIO_SINT16; - } - else if ( mask & AFMT_S32_NE ) { - deviceFormat = AFMT_S32_NE; - stream_.deviceFormat[mode] = RTAUDIO_SINT32; - } - else if ( mask & AFMT_S24_NE ) { - deviceFormat = AFMT_S24_NE; - stream_.deviceFormat[mode] = RTAUDIO_SINT24; - } - else if ( mask & AFMT_S16_OE ) { - deviceFormat = AFMT_S16_OE; - stream_.deviceFormat[mode] = RTAUDIO_SINT16; - stream_.doByteSwap[mode] = true; - } - else if ( mask & AFMT_S32_OE ) { - deviceFormat = AFMT_S32_OE; - stream_.deviceFormat[mode] = RTAUDIO_SINT32; - stream_.doByteSwap[mode] = true; - } - else if ( mask & AFMT_S24_OE ) { - deviceFormat = AFMT_S24_OE; - stream_.deviceFormat[mode] = RTAUDIO_SINT24; - stream_.doByteSwap[mode] = true; - } - else if ( mask & AFMT_S8) { - deviceFormat = AFMT_S8; - stream_.deviceFormat[mode] = RTAUDIO_SINT8; - } - } - - if ( stream_.deviceFormat[mode] == 0 ) { - // This really shouldn't happen ... - close( fd ); - errorStream_ << "RtApiOss::probeDeviceOpen: device (" << ainfo.name << ") data format not supported by RtAudio."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Set the data format. - int temp = deviceFormat; - result = ioctl( fd, SNDCTL_DSP_SETFMT, &deviceFormat ); - if ( result == -1 || deviceFormat != temp ) { - close( fd ); - errorStream_ << "RtApiOss::probeDeviceOpen: error setting data format on device (" << ainfo.name << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Attempt to set the buffer size. According to OSS, the minimum - // number of buffers is two. The supposed minimum buffer size is 16 - // bytes, so that will be our lower bound. The argument to this - // call is in the form 0xMMMMSSSS (hex), where the buffer size (in - // bytes) is given as 2^SSSS and the number of buffers as 2^MMMM. - // We'll check the actual value used near the end of the setup - // procedure. - int ossBufferBytes = *bufferSize * formatBytes( stream_.deviceFormat[mode] ) * deviceChannels; - if ( ossBufferBytes < 16 ) ossBufferBytes = 16; - int buffers = 0; - if ( options ) buffers = options->numberOfBuffers; - if ( options && options->flags & RTAUDIO_MINIMIZE_LATENCY ) buffers = 2; - if ( buffers < 2 ) buffers = 3; - temp = ((int) buffers << 16) + (int)( log10( (double)ossBufferBytes ) / log10( 2.0 ) ); - result = ioctl( fd, SNDCTL_DSP_SETFRAGMENT, &temp ); - if ( result == -1 ) { - close( fd ); - errorStream_ << "RtApiOss::probeDeviceOpen: error setting buffer size on device (" << ainfo.name << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - stream_.nBuffers = buffers; - - // Save buffer size (in sample frames). - *bufferSize = ossBufferBytes / ( formatBytes(stream_.deviceFormat[mode]) * deviceChannels ); - stream_.bufferSize = *bufferSize; - - // Set the sample rate. - int srate = sampleRate; - result = ioctl( fd, SNDCTL_DSP_SPEED, &srate ); - if ( result == -1 ) { - close( fd ); - errorStream_ << "RtApiOss::probeDeviceOpen: error setting sample rate (" << sampleRate << ") on device (" << ainfo.name << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - - // Verify the sample rate setup worked. - if ( abs( srate - sampleRate ) > 100 ) { - close( fd ); - errorStream_ << "RtApiOss::probeDeviceOpen: device (" << ainfo.name << ") does not support sample rate (" << sampleRate << ")."; - errorText_ = errorStream_.str(); - return FAILURE; - } - stream_.sampleRate = sampleRate; - - if ( mode == INPUT && stream_.mode == OUTPUT && stream_.device[0] == device) { - // We're doing duplex setup here. - stream_.deviceFormat[0] = stream_.deviceFormat[1]; - stream_.nDeviceChannels[0] = deviceChannels; - } - - // Set interleaving parameters. - stream_.userInterleaved = true; - stream_.deviceInterleaved[mode] = true; - if ( options && options->flags & RTAUDIO_NONINTERLEAVED ) - stream_.userInterleaved = false; - - // Set flags for buffer conversion - stream_.doConvertBuffer[mode] = false; - if ( stream_.userFormat != stream_.deviceFormat[mode] ) - stream_.doConvertBuffer[mode] = true; - if ( stream_.nUserChannels[mode] < stream_.nDeviceChannels[mode] ) - stream_.doConvertBuffer[mode] = true; - if ( stream_.userInterleaved != stream_.deviceInterleaved[mode] && - stream_.nUserChannels[mode] > 1 ) - stream_.doConvertBuffer[mode] = true; - - // Allocate the stream handles if necessary and then save. - if ( stream_.apiHandle == 0 ) { - try { - handle = new OssHandle; - } - catch ( std::bad_alloc& ) { - errorText_ = "RtApiOss::probeDeviceOpen: error allocating OssHandle memory."; - goto error; - } - - if ( pthread_cond_init( &handle->runnable, NULL ) ) { - errorText_ = "RtApiOss::probeDeviceOpen: error initializing pthread condition variable."; - goto error; - } - - stream_.apiHandle = (void *) handle; - } - else { - handle = (OssHandle *) stream_.apiHandle; - } - handle->id[mode] = fd; - - // Allocate necessary internal buffers. - unsigned long bufferBytes; - bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); - stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); - if ( stream_.userBuffer[mode] == NULL ) { - errorText_ = "RtApiOss::probeDeviceOpen: error allocating user buffer memory."; - goto error; - } - - if ( stream_.doConvertBuffer[mode] ) { - - bool makeBuffer = true; - bufferBytes = stream_.nDeviceChannels[mode] * formatBytes( stream_.deviceFormat[mode] ); - if ( mode == INPUT ) { - if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { - unsigned long bytesOut = stream_.nDeviceChannels[0] * formatBytes( stream_.deviceFormat[0] ); - if ( bufferBytes <= bytesOut ) makeBuffer = false; - } - } - - if ( makeBuffer ) { - bufferBytes *= *bufferSize; - if ( stream_.deviceBuffer ) free( stream_.deviceBuffer ); - stream_.deviceBuffer = (char *) calloc( bufferBytes, 1 ); - if ( stream_.deviceBuffer == NULL ) { - errorText_ = "RtApiOss::probeDeviceOpen: error allocating device buffer memory."; - goto error; - } - } - } - - stream_.device[mode] = device; - stream_.state = STREAM_STOPPED; - - // Setup the buffer conversion information structure. - if ( stream_.doConvertBuffer[mode] ) setConvertInfo( mode, firstChannel ); - - // Setup thread if necessary. - if ( stream_.mode == OUTPUT && mode == INPUT ) { - // We had already set up an output stream. - stream_.mode = DUPLEX; - if ( stream_.device[0] == device ) handle->id[0] = fd; - } - else { - stream_.mode = mode; - - // Setup callback thread. - stream_.callbackInfo.object = (void *) this; - - // Set the thread attributes for joinable and realtime scheduling - // priority. The higher priority will only take affect if the - // program is run as root or suid. - pthread_attr_t attr; - pthread_attr_init( &attr ); - pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_JOINABLE ); -#ifdef SCHED_RR // Undefined with some OSes (eg: NetBSD 1.6.x with GNU Pthread) - if ( options && options->flags & RTAUDIO_SCHEDULE_REALTIME ) { - struct sched_param param; - int priority = options->priority; - int min = sched_get_priority_min( SCHED_RR ); - int max = sched_get_priority_max( SCHED_RR ); - if ( priority < min ) priority = min; - else if ( priority > max ) priority = max; - param.sched_priority = priority; - pthread_attr_setschedparam( &attr, ¶m ); - pthread_attr_setschedpolicy( &attr, SCHED_RR ); - } - else - pthread_attr_setschedpolicy( &attr, SCHED_OTHER ); -#else - pthread_attr_setschedpolicy( &attr, SCHED_OTHER ); -#endif - - stream_.callbackInfo.isRunning = true; - result = pthread_create( &stream_.callbackInfo.thread, &attr, ossCallbackHandler, &stream_.callbackInfo ); - pthread_attr_destroy( &attr ); - if ( result ) { - stream_.callbackInfo.isRunning = false; - errorText_ = "RtApiOss::error creating callback thread!"; - goto error; - } - } - - return SUCCESS; - - error: - if ( handle ) { - pthread_cond_destroy( &handle->runnable ); - if ( handle->id[0] ) close( handle->id[0] ); - if ( handle->id[1] ) close( handle->id[1] ); - delete handle; - stream_.apiHandle = 0; - } - - for ( int i=0; i<2; i++ ) { - if ( stream_.userBuffer[i] ) { - free( stream_.userBuffer[i] ); - stream_.userBuffer[i] = 0; - } - } - - if ( stream_.deviceBuffer ) { - free( stream_.deviceBuffer ); - stream_.deviceBuffer = 0; - } - - return FAILURE; -} - -void RtApiOss :: closeStream() -{ - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApiOss::closeStream(): no open stream to close!"; - error( RtAudioError::WARNING ); - return; - } - - OssHandle *handle = (OssHandle *) stream_.apiHandle; - stream_.callbackInfo.isRunning = false; - MUTEX_LOCK( &stream_.mutex ); - if ( stream_.state == STREAM_STOPPED ) - pthread_cond_signal( &handle->runnable ); - MUTEX_UNLOCK( &stream_.mutex ); - pthread_join( stream_.callbackInfo.thread, NULL ); - - if ( stream_.state == STREAM_RUNNING ) { - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) - ioctl( handle->id[0], SNDCTL_DSP_HALT, 0 ); - else - ioctl( handle->id[1], SNDCTL_DSP_HALT, 0 ); - stream_.state = STREAM_STOPPED; - } - - if ( handle ) { - pthread_cond_destroy( &handle->runnable ); - if ( handle->id[0] ) close( handle->id[0] ); - if ( handle->id[1] ) close( handle->id[1] ); - delete handle; - stream_.apiHandle = 0; - } - - for ( int i=0; i<2; i++ ) { - if ( stream_.userBuffer[i] ) { - free( stream_.userBuffer[i] ); - stream_.userBuffer[i] = 0; - } - } - - if ( stream_.deviceBuffer ) { - free( stream_.deviceBuffer ); - stream_.deviceBuffer = 0; - } - - stream_.mode = UNINITIALIZED; - stream_.state = STREAM_CLOSED; -} - -void RtApiOss :: startStream() -{ - verifyStream(); - if ( stream_.state == STREAM_RUNNING ) { - errorText_ = "RtApiOss::startStream(): the stream is already running!"; - error( RtAudioError::WARNING ); - return; - } - - MUTEX_LOCK( &stream_.mutex ); - - stream_.state = STREAM_RUNNING; - - // No need to do anything else here ... OSS automatically starts - // when fed samples. - - MUTEX_UNLOCK( &stream_.mutex ); - - OssHandle *handle = (OssHandle *) stream_.apiHandle; - pthread_cond_signal( &handle->runnable ); -} - -void RtApiOss :: stopStream() -{ - verifyStream(); - if ( stream_.state == STREAM_STOPPED ) { - errorText_ = "RtApiOss::stopStream(): the stream is already stopped!"; - error( RtAudioError::WARNING ); - return; - } - - MUTEX_LOCK( &stream_.mutex ); - - // The state might change while waiting on a mutex. - if ( stream_.state == STREAM_STOPPED ) { - MUTEX_UNLOCK( &stream_.mutex ); - return; - } - - int result = 0; - OssHandle *handle = (OssHandle *) stream_.apiHandle; - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - - // Flush the output with zeros a few times. - char *buffer; - int samples; - RtAudioFormat format; - - if ( stream_.doConvertBuffer[0] ) { - buffer = stream_.deviceBuffer; - samples = stream_.bufferSize * stream_.nDeviceChannels[0]; - format = stream_.deviceFormat[0]; - } - else { - buffer = stream_.userBuffer[0]; - samples = stream_.bufferSize * stream_.nUserChannels[0]; - format = stream_.userFormat; - } - - memset( buffer, 0, samples * formatBytes(format) ); - for ( unsigned int i=0; iid[0], buffer, samples * formatBytes(format) ); - if ( result == -1 ) { - errorText_ = "RtApiOss::stopStream: audio write error."; - error( RtAudioError::WARNING ); - } - } - - result = ioctl( handle->id[0], SNDCTL_DSP_HALT, 0 ); - if ( result == -1 ) { - errorStream_ << "RtApiOss::stopStream: system error stopping callback procedure on device (" << stream_.device[0] << ")."; - errorText_ = errorStream_.str(); - goto unlock; - } - handle->triggered = false; - } - - if ( stream_.mode == INPUT || ( stream_.mode == DUPLEX && handle->id[0] != handle->id[1] ) ) { - result = ioctl( handle->id[1], SNDCTL_DSP_HALT, 0 ); - if ( result == -1 ) { - errorStream_ << "RtApiOss::stopStream: system error stopping input callback procedure on device (" << stream_.device[0] << ")."; - errorText_ = errorStream_.str(); - goto unlock; - } - } - - unlock: - stream_.state = STREAM_STOPPED; - MUTEX_UNLOCK( &stream_.mutex ); - - if ( result != -1 ) return; - error( RtAudioError::SYSTEM_ERROR ); -} - -void RtApiOss :: abortStream() -{ - verifyStream(); - if ( stream_.state == STREAM_STOPPED ) { - errorText_ = "RtApiOss::abortStream(): the stream is already stopped!"; - error( RtAudioError::WARNING ); - return; - } - - MUTEX_LOCK( &stream_.mutex ); - - // The state might change while waiting on a mutex. - if ( stream_.state == STREAM_STOPPED ) { - MUTEX_UNLOCK( &stream_.mutex ); - return; - } - - int result = 0; - OssHandle *handle = (OssHandle *) stream_.apiHandle; - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - result = ioctl( handle->id[0], SNDCTL_DSP_HALT, 0 ); - if ( result == -1 ) { - errorStream_ << "RtApiOss::abortStream: system error stopping callback procedure on device (" << stream_.device[0] << ")."; - errorText_ = errorStream_.str(); - goto unlock; - } - handle->triggered = false; - } - - if ( stream_.mode == INPUT || ( stream_.mode == DUPLEX && handle->id[0] != handle->id[1] ) ) { - result = ioctl( handle->id[1], SNDCTL_DSP_HALT, 0 ); - if ( result == -1 ) { - errorStream_ << "RtApiOss::abortStream: system error stopping input callback procedure on device (" << stream_.device[0] << ")."; - errorText_ = errorStream_.str(); - goto unlock; - } - } - - unlock: - stream_.state = STREAM_STOPPED; - MUTEX_UNLOCK( &stream_.mutex ); - - if ( result != -1 ) return; - error( RtAudioError::SYSTEM_ERROR ); -} - -void RtApiOss :: callbackEvent() -{ - OssHandle *handle = (OssHandle *) stream_.apiHandle; - if ( stream_.state == STREAM_STOPPED ) { - MUTEX_LOCK( &stream_.mutex ); - pthread_cond_wait( &handle->runnable, &stream_.mutex ); - if ( stream_.state != STREAM_RUNNING ) { - MUTEX_UNLOCK( &stream_.mutex ); - return; - } - MUTEX_UNLOCK( &stream_.mutex ); - } - - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApiOss::callbackEvent(): the stream is closed ... this shouldn't happen!"; - error( RtAudioError::WARNING ); - return; - } - - // Invoke user callback to get fresh output data. - int doStopStream = 0; - RtAudioCallback callback = (RtAudioCallback) stream_.callbackInfo.callback; - double streamTime = getStreamTime(); - RtAudioStreamStatus status = 0; - if ( stream_.mode != INPUT && handle->xrun[0] == true ) { - status |= RTAUDIO_OUTPUT_UNDERFLOW; - handle->xrun[0] = false; - } - if ( stream_.mode != OUTPUT && handle->xrun[1] == true ) { - status |= RTAUDIO_INPUT_OVERFLOW; - handle->xrun[1] = false; - } - doStopStream = callback( stream_.userBuffer[0], stream_.userBuffer[1], - stream_.bufferSize, streamTime, status, stream_.callbackInfo.userData ); - if ( doStopStream == 2 ) { - this->abortStream(); - return; - } - - MUTEX_LOCK( &stream_.mutex ); - - // The state might change while waiting on a mutex. - if ( stream_.state == STREAM_STOPPED ) goto unlock; - - int result; - char *buffer; - int samples; - RtAudioFormat format; - - if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { - - // Setup parameters and do buffer conversion if necessary. - if ( stream_.doConvertBuffer[0] ) { - buffer = stream_.deviceBuffer; - convertBuffer( buffer, stream_.userBuffer[0], stream_.convertInfo[0] ); - samples = stream_.bufferSize * stream_.nDeviceChannels[0]; - format = stream_.deviceFormat[0]; - } - else { - buffer = stream_.userBuffer[0]; - samples = stream_.bufferSize * stream_.nUserChannels[0]; - format = stream_.userFormat; - } - - // Do byte swapping if necessary. - if ( stream_.doByteSwap[0] ) - byteSwapBuffer( buffer, samples, format ); - - if ( stream_.mode == DUPLEX && handle->triggered == false ) { - int trig = 0; - ioctl( handle->id[0], SNDCTL_DSP_SETTRIGGER, &trig ); - result = write( handle->id[0], buffer, samples * formatBytes(format) ); - trig = PCM_ENABLE_INPUT|PCM_ENABLE_OUTPUT; - ioctl( handle->id[0], SNDCTL_DSP_SETTRIGGER, &trig ); - handle->triggered = true; - } - else - // Write samples to device. - result = write( handle->id[0], buffer, samples * formatBytes(format) ); - - if ( result == -1 ) { - // We'll assume this is an underrun, though there isn't a - // specific means for determining that. - handle->xrun[0] = true; - errorText_ = "RtApiOss::callbackEvent: audio write error."; - error( RtAudioError::WARNING ); - // Continue on to input section. - } - } - - if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { - - // Setup parameters. - if ( stream_.doConvertBuffer[1] ) { - buffer = stream_.deviceBuffer; - samples = stream_.bufferSize * stream_.nDeviceChannels[1]; - format = stream_.deviceFormat[1]; - } - else { - buffer = stream_.userBuffer[1]; - samples = stream_.bufferSize * stream_.nUserChannels[1]; - format = stream_.userFormat; - } - - // Read samples from device. - result = read( handle->id[1], buffer, samples * formatBytes(format) ); - - if ( result == -1 ) { - // We'll assume this is an overrun, though there isn't a - // specific means for determining that. - handle->xrun[1] = true; - errorText_ = "RtApiOss::callbackEvent: audio read error."; - error( RtAudioError::WARNING ); - goto unlock; - } - - // Do byte swapping if necessary. - if ( stream_.doByteSwap[1] ) - byteSwapBuffer( buffer, samples, format ); - - // Do buffer conversion if necessary. - if ( stream_.doConvertBuffer[1] ) - convertBuffer( stream_.userBuffer[1], stream_.deviceBuffer, stream_.convertInfo[1] ); - } - - unlock: - MUTEX_UNLOCK( &stream_.mutex ); - - RtApi::tickStreamTime(); - if ( doStopStream == 1 ) this->stopStream(); -} - -static void *ossCallbackHandler( void *ptr ) -{ - CallbackInfo *info = (CallbackInfo *) ptr; - RtApiOss *object = (RtApiOss *) info->object; - bool *isRunning = &info->isRunning; - - while ( *isRunning == true ) { - pthread_testcancel(); - object->callbackEvent(); - } - - pthread_exit( NULL ); -} - -//******************** End of __LINUX_OSS__ *********************// -#endif - - -// *************************************************** // -// -// Protected common (OS-independent) RtAudio methods. -// -// *************************************************** // - -// This method can be modified to control the behavior of error -// message printing. -void RtApi :: error( RtAudioError::Type type ) -{ - errorStream_.str(""); // clear the ostringstream - - RtAudioErrorCallback errorCallback = (RtAudioErrorCallback) stream_.callbackInfo.errorCallback; - if ( errorCallback ) { - // abortStream() can generate new error messages. Ignore them. Just keep original one. - - if ( firstErrorOccurred_ ) - return; - - firstErrorOccurred_ = true; - const std::string errorMessage = errorText_; - - if ( type != RtAudioError::WARNING && stream_.state != STREAM_STOPPED) { - stream_.callbackInfo.isRunning = false; // exit from the thread - abortStream(); - } - - errorCallback( type, errorMessage ); - firstErrorOccurred_ = false; - return; - } - - if ( type == RtAudioError::WARNING && showWarnings_ == true ) - std::cerr << '\n' << errorText_ << "\n\n"; - else if ( type != RtAudioError::WARNING ) - throw( RtAudioError( errorText_, type ) ); -} - -void RtApi :: verifyStream() -{ - if ( stream_.state == STREAM_CLOSED ) { - errorText_ = "RtApi:: a stream is not open!"; - error( RtAudioError::INVALID_USE ); - } -} - -void RtApi :: clearStreamInfo() -{ - stream_.mode = UNINITIALIZED; - stream_.state = STREAM_CLOSED; - stream_.sampleRate = 0; - stream_.bufferSize = 0; - stream_.nBuffers = 0; - stream_.userFormat = 0; - stream_.userInterleaved = true; - stream_.streamTime = 0.0; - stream_.apiHandle = 0; - stream_.deviceBuffer = 0; - stream_.callbackInfo.callback = 0; - stream_.callbackInfo.userData = 0; - stream_.callbackInfo.isRunning = false; - stream_.callbackInfo.errorCallback = 0; - for ( int i=0; i<2; i++ ) { - stream_.device[i] = 11111; - stream_.doConvertBuffer[i] = false; - stream_.deviceInterleaved[i] = true; - stream_.doByteSwap[i] = false; - stream_.nUserChannels[i] = 0; - stream_.nDeviceChannels[i] = 0; - stream_.channelOffset[i] = 0; - stream_.deviceFormat[i] = 0; - stream_.latency[i] = 0; - stream_.userBuffer[i] = 0; - stream_.convertInfo[i].channels = 0; - stream_.convertInfo[i].inJump = 0; - stream_.convertInfo[i].outJump = 0; - stream_.convertInfo[i].inFormat = 0; - stream_.convertInfo[i].outFormat = 0; - stream_.convertInfo[i].inOffset.clear(); - stream_.convertInfo[i].outOffset.clear(); - } -} - -unsigned int RtApi :: formatBytes( RtAudioFormat format ) -{ - if ( format == RTAUDIO_SINT16 ) - return 2; - else if ( format == RTAUDIO_SINT32 || format == RTAUDIO_FLOAT32 ) - return 4; - else if ( format == RTAUDIO_FLOAT64 ) - return 8; - else if ( format == RTAUDIO_SINT24 ) - return 3; - else if ( format == RTAUDIO_SINT8 ) - return 1; - - errorText_ = "RtApi::formatBytes: undefined format."; - error( RtAudioError::WARNING ); - - return 0; -} - -void RtApi :: setConvertInfo( StreamMode mode, unsigned int firstChannel ) -{ - if ( mode == INPUT ) { // convert device to user buffer - stream_.convertInfo[mode].inJump = stream_.nDeviceChannels[1]; - stream_.convertInfo[mode].outJump = stream_.nUserChannels[1]; - stream_.convertInfo[mode].inFormat = stream_.deviceFormat[1]; - stream_.convertInfo[mode].outFormat = stream_.userFormat; - } - else { // convert user to device buffer - stream_.convertInfo[mode].inJump = stream_.nUserChannels[0]; - stream_.convertInfo[mode].outJump = stream_.nDeviceChannels[0]; - stream_.convertInfo[mode].inFormat = stream_.userFormat; - stream_.convertInfo[mode].outFormat = stream_.deviceFormat[0]; - } - - if ( stream_.convertInfo[mode].inJump < stream_.convertInfo[mode].outJump ) - stream_.convertInfo[mode].channels = stream_.convertInfo[mode].inJump; - else - stream_.convertInfo[mode].channels = stream_.convertInfo[mode].outJump; - - // Set up the interleave/deinterleave offsets. - if ( stream_.deviceInterleaved[mode] != stream_.userInterleaved ) { - if ( ( mode == OUTPUT && stream_.deviceInterleaved[mode] ) || - ( mode == INPUT && stream_.userInterleaved ) ) { - for ( int k=0; k 0 ) { - if ( stream_.deviceInterleaved[mode] ) { - if ( mode == OUTPUT ) { - for ( int k=0; k> 8); - //out[info.outOffset[j]] >>= 8; - } - in += info.inJump; - out += info.outJump; - } - } - else if (info.inFormat == RTAUDIO_FLOAT32) { - Float32 *in = (Float32 *)inBuffer; - for (unsigned int i=0; i> 8); - } - in += info.inJump; - out += info.outJump; - } - } - else if (info.inFormat == RTAUDIO_SINT32) { - Int32 *in = (Int32 *)inBuffer; - for (unsigned int i=0; i> 16) & 0x0000ffff); - } - in += info.inJump; - out += info.outJump; - } - } - else if (info.inFormat == RTAUDIO_FLOAT32) { - Float32 *in = (Float32 *)inBuffer; - for (unsigned int i=0; i> 8) & 0x00ff); - } - in += info.inJump; - out += info.outJump; - } - } - else if (info.inFormat == RTAUDIO_SINT24) { - Int24 *in = (Int24 *)inBuffer; - for (unsigned int i=0; i> 16); - } - in += info.inJump; - out += info.outJump; - } - } - else if (info.inFormat == RTAUDIO_SINT32) { - Int32 *in = (Int32 *)inBuffer; - for (unsigned int i=0; i> 24) & 0x000000ff); - } - in += info.inJump; - out += info.outJump; - } - } - else if (info.inFormat == RTAUDIO_FLOAT32) { - Float32 *in = (Float32 *)inBuffer; - for (unsigned int i=0; i>8) | (x<<8); } -//static inline uint32_t bswap_32(uint32_t x) { return (bswap_16(x&0xffff)<<16) | (bswap_16(x>>16)); } -//static inline uint64_t bswap_64(uint64_t x) { return (((unsigned long long)bswap_32(x&0xffffffffull))<<32) | (bswap_32(x>>32)); } - -void RtApi :: byteSwapBuffer( char *buffer, unsigned int samples, RtAudioFormat format ) -{ - register char val; - register char *ptr; - - ptr = buffer; - if ( format == RTAUDIO_SINT16 ) { - for ( unsigned int i=0; i -#include -#include -#include - -/*! \typedef typedef unsigned long RtAudioFormat; - \brief RtAudio data format type. - - Support for signed integers and floats. Audio data fed to/from an - RtAudio stream is assumed to ALWAYS be in host byte order. The - internal routines will automatically take care of any necessary - byte-swapping between the host format and the soundcard. Thus, - endian-ness is not a concern in the following format definitions. - - - \e RTAUDIO_SINT8: 8-bit signed integer. - - \e RTAUDIO_SINT16: 16-bit signed integer. - - \e RTAUDIO_SINT24: 24-bit signed integer. - - \e RTAUDIO_SINT32: 32-bit signed integer. - - \e RTAUDIO_FLOAT32: Normalized between plus/minus 1.0. - - \e RTAUDIO_FLOAT64: Normalized between plus/minus 1.0. -*/ -typedef unsigned long RtAudioFormat; -static const RtAudioFormat RTAUDIO_SINT8 = 0x1; // 8-bit signed integer. -static const RtAudioFormat RTAUDIO_SINT16 = 0x2; // 16-bit signed integer. -static const RtAudioFormat RTAUDIO_SINT24 = 0x4; // 24-bit signed integer. -static const RtAudioFormat RTAUDIO_SINT32 = 0x8; // 32-bit signed integer. -static const RtAudioFormat RTAUDIO_FLOAT32 = 0x10; // Normalized between plus/minus 1.0. -static const RtAudioFormat RTAUDIO_FLOAT64 = 0x20; // Normalized between plus/minus 1.0. - -/*! \typedef typedef unsigned long RtAudioStreamFlags; - \brief RtAudio stream option flags. - - The following flags can be OR'ed together to allow a client to - make changes to the default stream behavior: - - - \e RTAUDIO_NONINTERLEAVED: Use non-interleaved buffers (default = interleaved). - - \e RTAUDIO_MINIMIZE_LATENCY: Attempt to set stream parameters for lowest possible latency. - - \e RTAUDIO_HOG_DEVICE: Attempt grab device for exclusive use. - - \e RTAUDIO_ALSA_USE_DEFAULT: Use the "default" PCM device (ALSA only). - - By default, RtAudio streams pass and receive audio data from the - client in an interleaved format. By passing the - RTAUDIO_NONINTERLEAVED flag to the openStream() function, audio - data will instead be presented in non-interleaved buffers. In - this case, each buffer argument in the RtAudioCallback function - will point to a single array of data, with \c nFrames samples for - each channel concatenated back-to-back. For example, the first - sample of data for the second channel would be located at index \c - nFrames (assuming the \c buffer pointer was recast to the correct - data type for the stream). - - Certain audio APIs offer a number of parameters that influence the - I/O latency of a stream. By default, RtAudio will attempt to set - these parameters internally for robust (glitch-free) performance - (though some APIs, like Windows Direct Sound, make this difficult). - By passing the RTAUDIO_MINIMIZE_LATENCY flag to the openStream() - function, internal stream settings will be influenced in an attempt - to minimize stream latency, though possibly at the expense of stream - performance. - - If the RTAUDIO_HOG_DEVICE flag is set, RtAudio will attempt to - open the input and/or output stream device(s) for exclusive use. - Note that this is not possible with all supported audio APIs. - - If the RTAUDIO_SCHEDULE_REALTIME flag is set, RtAudio will attempt - to select realtime scheduling (round-robin) for the callback thread. - - If the RTAUDIO_ALSA_USE_DEFAULT flag is set, RtAudio will attempt to - open the "default" PCM device when using the ALSA API. Note that this - will override any specified input or output device id. -*/ -typedef unsigned int RtAudioStreamFlags; -static const RtAudioStreamFlags RTAUDIO_NONINTERLEAVED = 0x1; // Use non-interleaved buffers (default = interleaved). -static const RtAudioStreamFlags RTAUDIO_MINIMIZE_LATENCY = 0x2; // Attempt to set stream parameters for lowest possible latency. -static const RtAudioStreamFlags RTAUDIO_HOG_DEVICE = 0x4; // Attempt grab device and prevent use by others. -static const RtAudioStreamFlags RTAUDIO_SCHEDULE_REALTIME = 0x8; // Try to select realtime scheduling for callback thread. -static const RtAudioStreamFlags RTAUDIO_ALSA_USE_DEFAULT = 0x10; // Use the "default" PCM device (ALSA only). - -/*! \typedef typedef unsigned long RtAudioStreamStatus; - \brief RtAudio stream status (over- or underflow) flags. - - Notification of a stream over- or underflow is indicated by a - non-zero stream \c status argument in the RtAudioCallback function. - The stream status can be one of the following two options, - depending on whether the stream is open for output and/or input: - - - \e RTAUDIO_INPUT_OVERFLOW: Input data was discarded because of an overflow condition at the driver. - - \e RTAUDIO_OUTPUT_UNDERFLOW: The output buffer ran low, likely producing a break in the output sound. -*/ -typedef unsigned int RtAudioStreamStatus; -static const RtAudioStreamStatus RTAUDIO_INPUT_OVERFLOW = 0x1; // Input data was discarded because of an overflow condition at the driver. -static const RtAudioStreamStatus RTAUDIO_OUTPUT_UNDERFLOW = 0x2; // The output buffer ran low, likely causing a gap in the output sound. - -//! RtAudio callback function prototype. -/*! - All RtAudio clients must create a function of type RtAudioCallback - to read and/or write data from/to the audio stream. When the - underlying audio system is ready for new input or output data, this - function will be invoked. - - \param outputBuffer For output (or duplex) streams, the client - should write \c nFrames of audio sample frames into this - buffer. This argument should be recast to the datatype - specified when the stream was opened. For input-only - streams, this argument will be NULL. - - \param inputBuffer For input (or duplex) streams, this buffer will - hold \c nFrames of input audio sample frames. This - argument should be recast to the datatype specified when the - stream was opened. For output-only streams, this argument - will be NULL. - - \param nFrames The number of sample frames of input or output - data in the buffers. The actual buffer size in bytes is - dependent on the data type and number of channels in use. - - \param streamTime The number of seconds that have elapsed since the - stream was started. - - \param status If non-zero, this argument indicates a data overflow - or underflow condition for the stream. The particular - condition can be determined by comparison with the - RtAudioStreamStatus flags. - - \param userData A pointer to optional data provided by the client - when opening the stream (default = NULL). - - To continue normal stream operation, the RtAudioCallback function - should return a value of zero. To stop the stream and drain the - output buffer, the function should return a value of one. To abort - the stream immediately, the client should return a value of two. - */ -typedef int (*RtAudioCallback)( void *outputBuffer, void *inputBuffer, - unsigned int nFrames, - double streamTime, - RtAudioStreamStatus status, - void *userData ); - -/************************************************************************/ -/*! \class RtAudioError - \brief Exception handling class for RtAudio. - - The RtAudioError class is quite simple but it does allow errors to be - "caught" by RtAudioError::Type. See the RtAudio documentation to know - which methods can throw an RtAudioError. -*/ -/************************************************************************/ - -class RtAudioError : public std::exception -{ - public: - //! Defined RtAudioError types. - enum Type { - WARNING, /*!< A non-critical error. */ - DEBUG_WARNING, /*!< A non-critical error which might be useful for debugging. */ - UNSPECIFIED, /*!< The default, unspecified error type. */ - NO_DEVICES_FOUND, /*!< No devices found on system. */ - INVALID_DEVICE, /*!< An invalid device ID was specified. */ - MEMORY_ERROR, /*!< An error occured during memory allocation. */ - INVALID_PARAMETER, /*!< An invalid parameter was specified to a function. */ - INVALID_USE, /*!< The function was called incorrectly. */ - DRIVER_ERROR, /*!< A system driver error occured. */ - SYSTEM_ERROR, /*!< A system error occured. */ - THREAD_ERROR /*!< A thread error occured. */ - }; - - //! The constructor. - RtAudioError( const std::string& message, Type type = RtAudioError::UNSPECIFIED ) throw() : message_(message), type_(type) {} - - //! The destructor. - virtual ~RtAudioError( void ) throw() {} - - //! Prints thrown error message to stderr. - virtual void printMessage( void ) const throw() { std::cerr << '\n' << message_ << "\n\n"; } - - //! Returns the thrown error message type. - virtual const Type& getType(void) const throw() { return type_; } - - //! Returns the thrown error message string. - virtual const std::string& getMessage(void) const throw() { return message_; } - - //! Returns the thrown error message as a c-style string. - virtual const char* what( void ) const throw() { return message_.c_str(); } - - protected: - std::string message_; - Type type_; -}; - -//! RtAudio error callback function prototype. -/*! - \param type Type of error. - \param errorText Error description. - */ -typedef void (*RtAudioErrorCallback)( RtAudioError::Type type, const std::string &errorText ); - -// **************************************************************** // -// -// RtAudio class declaration. -// -// RtAudio is a "controller" used to select an available audio i/o -// interface. It presents a common API for the user to call but all -// functionality is implemented by the class RtApi and its -// subclasses. RtAudio creates an instance of an RtApi subclass -// based on the user's API choice. If no choice is made, RtAudio -// attempts to make a "logical" API selection. -// -// **************************************************************** // - -class RtApi; - -class RtAudio -{ - public: - - //! Audio API specifier arguments. - enum Api { - UNSPECIFIED, /*!< Search for a working compiled API. */ - LINUX_ALSA, /*!< The Advanced Linux Sound Architecture API. */ - LINUX_PULSE, /*!< The Linux PulseAudio API. */ - LINUX_OSS, /*!< The Linux Open Sound System API. */ - UNIX_JACK, /*!< The Jack Low-Latency Audio Server API. */ - MACOSX_CORE, /*!< Macintosh OS-X Core Audio API. */ - WINDOWS_WASAPI, /*!< The Microsoft WASAPI API. */ - WINDOWS_ASIO, /*!< The Steinberg Audio Stream I/O API. */ - WINDOWS_DS, /*!< The Microsoft Direct Sound API. */ - RTAUDIO_DUMMY /*!< A compilable but non-functional API. */ - }; - - //! The public device information structure for returning queried values. - struct DeviceInfo { - bool probed; /*!< true if the device capabilities were successfully probed. */ - std::string name; /*!< Character string device identifier. */ - unsigned int outputChannels; /*!< Maximum output channels supported by device. */ - unsigned int inputChannels; /*!< Maximum input channels supported by device. */ - unsigned int duplexChannels; /*!< Maximum simultaneous input/output channels supported by device. */ - bool isDefaultOutput; /*!< true if this is the default output device. */ - bool isDefaultInput; /*!< true if this is the default input device. */ - std::vector sampleRates; /*!< Supported sample rates (queried from list of standard rates). */ - unsigned int preferredSampleRate; /*!< Preferred sample rate, eg. for WASAPI the system sample rate. */ - RtAudioFormat nativeFormats; /*!< Bit mask of supported data formats. */ - - // Default constructor. - DeviceInfo() - :probed(false), outputChannels(0), inputChannels(0), duplexChannels(0), - isDefaultOutput(false), isDefaultInput(false), preferredSampleRate(0), nativeFormats(0) {} - }; - - //! The structure for specifying input or ouput stream parameters. - struct StreamParameters { - unsigned int deviceId; /*!< Device index (0 to getDeviceCount() - 1). */ - unsigned int nChannels; /*!< Number of channels. */ - unsigned int firstChannel; /*!< First channel index on device (default = 0). */ - - // Default constructor. - StreamParameters() - : deviceId(0), nChannels(0), firstChannel(0) {} - }; - - //! The structure for specifying stream options. - /*! - The following flags can be OR'ed together to allow a client to - make changes to the default stream behavior: - - - \e RTAUDIO_NONINTERLEAVED: Use non-interleaved buffers (default = interleaved). - - \e RTAUDIO_MINIMIZE_LATENCY: Attempt to set stream parameters for lowest possible latency. - - \e RTAUDIO_HOG_DEVICE: Attempt grab device for exclusive use. - - \e RTAUDIO_SCHEDULE_REALTIME: Attempt to select realtime scheduling for callback thread. - - \e RTAUDIO_ALSA_USE_DEFAULT: Use the "default" PCM device (ALSA only). - - By default, RtAudio streams pass and receive audio data from the - client in an interleaved format. By passing the - RTAUDIO_NONINTERLEAVED flag to the openStream() function, audio - data will instead be presented in non-interleaved buffers. In - this case, each buffer argument in the RtAudioCallback function - will point to a single array of data, with \c nFrames samples for - each channel concatenated back-to-back. For example, the first - sample of data for the second channel would be located at index \c - nFrames (assuming the \c buffer pointer was recast to the correct - data type for the stream). - - Certain audio APIs offer a number of parameters that influence the - I/O latency of a stream. By default, RtAudio will attempt to set - these parameters internally for robust (glitch-free) performance - (though some APIs, like Windows Direct Sound, make this difficult). - By passing the RTAUDIO_MINIMIZE_LATENCY flag to the openStream() - function, internal stream settings will be influenced in an attempt - to minimize stream latency, though possibly at the expense of stream - performance. - - If the RTAUDIO_HOG_DEVICE flag is set, RtAudio will attempt to - open the input and/or output stream device(s) for exclusive use. - Note that this is not possible with all supported audio APIs. - - If the RTAUDIO_SCHEDULE_REALTIME flag is set, RtAudio will attempt - to select realtime scheduling (round-robin) for the callback thread. - The \c priority parameter will only be used if the RTAUDIO_SCHEDULE_REALTIME - flag is set. It defines the thread's realtime priority. - - If the RTAUDIO_ALSA_USE_DEFAULT flag is set, RtAudio will attempt to - open the "default" PCM device when using the ALSA API. Note that this - will override any specified input or output device id. - - The \c numberOfBuffers parameter can be used to control stream - latency in the Windows DirectSound, Linux OSS, and Linux Alsa APIs - only. A value of two is usually the smallest allowed. Larger - numbers can potentially result in more robust stream performance, - though likely at the cost of stream latency. The value set by the - user is replaced during execution of the RtAudio::openStream() - function by the value actually used by the system. - - The \c streamName parameter can be used to set the client name - when using the Jack API. By default, the client name is set to - RtApiJack. However, if you wish to create multiple instances of - RtAudio with Jack, each instance must have a unique client name. - */ - struct StreamOptions { - RtAudioStreamFlags flags; /*!< A bit-mask of stream flags (RTAUDIO_NONINTERLEAVED, RTAUDIO_MINIMIZE_LATENCY, RTAUDIO_HOG_DEVICE, RTAUDIO_ALSA_USE_DEFAULT). */ - unsigned int numberOfBuffers; /*!< Number of stream buffers. */ - std::string streamName; /*!< A stream name (currently used only in Jack). */ - int priority; /*!< Scheduling priority of callback thread (only used with flag RTAUDIO_SCHEDULE_REALTIME). */ - - // Default constructor. - StreamOptions() - : flags(0), numberOfBuffers(0), priority(0) {} - }; - - //! A static function to determine the current RtAudio version. - static std::string getVersion( void ) throw(); - - //! A static function to determine the available compiled audio APIs. - /*! - The values returned in the std::vector can be compared against - the enumerated list values. Note that there can be more than one - API compiled for certain operating systems. - */ - static void getCompiledApi( std::vector &apis ) throw(); - - //! The class constructor. - /*! - The constructor performs minor initialization tasks. An exception - can be thrown if no API support is compiled. - - If no API argument is specified and multiple API support has been - compiled, the default order of use is JACK, ALSA, OSS (Linux - systems) and ASIO, DS (Windows systems). - */ - RtAudio( RtAudio::Api api=UNSPECIFIED ); - - //! The destructor. - /*! - If a stream is running or open, it will be stopped and closed - automatically. - */ - ~RtAudio() throw(); - - //! Returns the audio API specifier for the current instance of RtAudio. - RtAudio::Api getCurrentApi( void ) throw(); - - //! A public function that queries for the number of audio devices available. - /*! - This function performs a system query of available devices each time it - is called, thus supporting devices connected \e after instantiation. If - a system error occurs during processing, a warning will be issued. - */ - unsigned int getDeviceCount( void ) throw(); - - //! Return an RtAudio::DeviceInfo structure for a specified device number. - /*! - - Any device integer between 0 and getDeviceCount() - 1 is valid. - If an invalid argument is provided, an RtAudioError (type = INVALID_USE) - will be thrown. If a device is busy or otherwise unavailable, the - structure member "probed" will have a value of "false" and all - other members are undefined. If the specified device is the - current default input or output device, the corresponding - "isDefault" member will have a value of "true". - */ - RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); - - //! A function that returns the index of the default output device. - /*! - If the underlying audio API does not provide a "default - device", or if no devices are available, the return value will be - 0. Note that this is a valid device identifier and it is the - client's responsibility to verify that a device is available - before attempting to open a stream. - */ - unsigned int getDefaultOutputDevice( void ) throw(); - - //! A function that returns the index of the default input device. - /*! - If the underlying audio API does not provide a "default - device", or if no devices are available, the return value will be - 0. Note that this is a valid device identifier and it is the - client's responsibility to verify that a device is available - before attempting to open a stream. - */ - unsigned int getDefaultInputDevice( void ) throw(); - - //! A public function for opening a stream with the specified parameters. - /*! - An RtAudioError (type = SYSTEM_ERROR) is thrown if a stream cannot be - opened with the specified parameters or an error occurs during - processing. An RtAudioError (type = INVALID_USE) is thrown if any - invalid device ID or channel number parameters are specified. - - \param outputParameters Specifies output stream parameters to use - when opening a stream, including a device ID, number of channels, - and starting channel number. For input-only streams, this - argument should be NULL. The device ID is an index value between - 0 and getDeviceCount() - 1. - \param inputParameters Specifies input stream parameters to use - when opening a stream, including a device ID, number of channels, - and starting channel number. For output-only streams, this - argument should be NULL. The device ID is an index value between - 0 and getDeviceCount() - 1. - \param format An RtAudioFormat specifying the desired sample data format. - \param sampleRate The desired sample rate (sample frames per second). - \param *bufferFrames A pointer to a value indicating the desired - internal buffer size in sample frames. The actual value - used by the device is returned via the same pointer. A - value of zero can be specified, in which case the lowest - allowable value is determined. - \param callback A client-defined function that will be invoked - when input data is available and/or output data is needed. - \param userData An optional pointer to data that can be accessed - from within the callback function. - \param options An optional pointer to a structure containing various - global stream options, including a list of OR'ed RtAudioStreamFlags - and a suggested number of stream buffers that can be used to - control stream latency. More buffers typically result in more - robust performance, though at a cost of greater latency. If a - value of zero is specified, a system-specific median value is - chosen. If the RTAUDIO_MINIMIZE_LATENCY flag bit is set, the - lowest allowable value is used. The actual value used is - returned via the structure argument. The parameter is API dependent. - \param errorCallback A client-defined function that will be invoked - when an error has occured. - */ - void openStream( RtAudio::StreamParameters *outputParameters, - RtAudio::StreamParameters *inputParameters, - RtAudioFormat format, unsigned int sampleRate, - unsigned int *bufferFrames, RtAudioCallback callback, - void *userData = NULL, RtAudio::StreamOptions *options = NULL, RtAudioErrorCallback errorCallback = NULL ); - - //! A function that closes a stream and frees any associated stream memory. - /*! - If a stream is not open, this function issues a warning and - returns (no exception is thrown). - */ - void closeStream( void ) throw(); - - //! A function that starts a stream. - /*! - An RtAudioError (type = SYSTEM_ERROR) is thrown if an error occurs - during processing. An RtAudioError (type = INVALID_USE) is thrown if a - stream is not open. A warning is issued if the stream is already - running. - */ - void startStream( void ); - - //! Stop a stream, allowing any samples remaining in the output queue to be played. - /*! - An RtAudioError (type = SYSTEM_ERROR) is thrown if an error occurs - during processing. An RtAudioError (type = INVALID_USE) is thrown if a - stream is not open. A warning is issued if the stream is already - stopped. - */ - void stopStream( void ); - - //! Stop a stream, discarding any samples remaining in the input/output queue. - /*! - An RtAudioError (type = SYSTEM_ERROR) is thrown if an error occurs - during processing. An RtAudioError (type = INVALID_USE) is thrown if a - stream is not open. A warning is issued if the stream is already - stopped. - */ - void abortStream( void ); - - //! Returns true if a stream is open and false if not. - bool isStreamOpen( void ) const throw(); - - //! Returns true if the stream is running and false if it is stopped or not open. - bool isStreamRunning( void ) const throw(); - - //! Returns the number of elapsed seconds since the stream was started. - /*! - If a stream is not open, an RtAudioError (type = INVALID_USE) will be thrown. - */ - double getStreamTime( void ); - - //! Set the stream time to a time in seconds greater than or equal to 0.0. - /*! - If a stream is not open, an RtAudioError (type = INVALID_USE) will be thrown. - */ - void setStreamTime( double time ); - - //! Returns the internal stream latency in sample frames. - /*! - The stream latency refers to delay in audio input and/or output - caused by internal buffering by the audio system and/or hardware. - For duplex streams, the returned value will represent the sum of - the input and output latencies. If a stream is not open, an - RtAudioError (type = INVALID_USE) will be thrown. If the API does not - report latency, the return value will be zero. - */ - long getStreamLatency( void ); - - //! Returns actual sample rate in use by the stream. - /*! - On some systems, the sample rate used may be slightly different - than that specified in the stream parameters. If a stream is not - open, an RtAudioError (type = INVALID_USE) will be thrown. - */ - unsigned int getStreamSampleRate( void ); - - //! Specify whether warning messages should be printed to stderr. - void showWarnings( bool value = true ) throw(); - - protected: - - void openRtApi( RtAudio::Api api ); - RtApi *rtapi_; -}; - -// Operating system dependent thread functionality. -#if defined(__WINDOWS_DS__) || defined(__WINDOWS_ASIO__) || defined(__WINDOWS_WASAPI__) - - #ifndef NOMINMAX - #define NOMINMAX - #endif - #include - #include - - typedef uintptr_t ThreadHandle; - typedef CRITICAL_SECTION StreamMutex; - -#elif defined(__LINUX_ALSA__) || defined(__LINUX_PULSE__) || defined(__UNIX_JACK__) || defined(__LINUX_OSS__) || defined(__MACOSX_CORE__) - // Using pthread library for various flavors of unix. - #include - - typedef pthread_t ThreadHandle; - typedef pthread_mutex_t StreamMutex; - -#else // Setup for "dummy" behavior - - #define __RTAUDIO_DUMMY__ - typedef int ThreadHandle; - typedef int StreamMutex; - -#endif - -// This global structure type is used to pass callback information -// between the private RtAudio stream structure and global callback -// handling functions. -struct CallbackInfo { - void *object; // Used as a "this" pointer. - ThreadHandle thread; - void *callback; - void *userData; - void *errorCallback; - void *apiInfo; // void pointer for API specific callback information - bool isRunning; - bool doRealtime; - int priority; - - // Default constructor. - CallbackInfo() - :object(0), callback(0), userData(0), errorCallback(0), apiInfo(0), isRunning(false), doRealtime(false) {} -}; - -// **************************************************************** // -// -// RtApi class declaration. -// -// Subclasses of RtApi contain all API- and OS-specific code necessary -// to fully implement the RtAudio API. -// -// Note that RtApi is an abstract base class and cannot be -// explicitly instantiated. The class RtAudio will create an -// instance of an RtApi subclass (RtApiOss, RtApiAlsa, -// RtApiJack, RtApiCore, RtApiDs, or RtApiAsio). -// -// **************************************************************** // - -#pragma pack(push, 1) -class S24 { - - protected: - unsigned char c3[3]; - - public: - S24() {} - - S24& operator = ( const int& i ) { - c3[0] = (i & 0x000000ff); - c3[1] = (i & 0x0000ff00) >> 8; - c3[2] = (i & 0x00ff0000) >> 16; - return *this; - } - - S24( const S24& v ) { *this = v; } - S24( const double& d ) { *this = (int) d; } - S24( const float& f ) { *this = (int) f; } - S24( const signed short& s ) { *this = (int) s; } - S24( const char& c ) { *this = (int) c; } - - int asInt() { - int i = c3[0] | (c3[1] << 8) | (c3[2] << 16); - if (i & 0x800000) i |= ~0xffffff; - return i; - } -}; -#pragma pack(pop) - -#if defined( HAVE_GETTIMEOFDAY ) - #include -#endif - -#include - -class RtApi -{ -public: - - RtApi(); - virtual ~RtApi(); - virtual RtAudio::Api getCurrentApi( void ) = 0; - virtual unsigned int getDeviceCount( void ) = 0; - virtual RtAudio::DeviceInfo getDeviceInfo( unsigned int device ) = 0; - virtual unsigned int getDefaultInputDevice( void ); - virtual unsigned int getDefaultOutputDevice( void ); - void openStream( RtAudio::StreamParameters *outputParameters, - RtAudio::StreamParameters *inputParameters, - RtAudioFormat format, unsigned int sampleRate, - unsigned int *bufferFrames, RtAudioCallback callback, - void *userData, RtAudio::StreamOptions *options, - RtAudioErrorCallback errorCallback ); - virtual void closeStream( void ); - virtual void startStream( void ) = 0; - virtual void stopStream( void ) = 0; - virtual void abortStream( void ) = 0; - long getStreamLatency( void ); - unsigned int getStreamSampleRate( void ); - virtual double getStreamTime( void ); - virtual void setStreamTime( double time ); - bool isStreamOpen( void ) const { return stream_.state != STREAM_CLOSED; } - bool isStreamRunning( void ) const { return stream_.state == STREAM_RUNNING; } - void showWarnings( bool value ) { showWarnings_ = value; } - - -protected: - - static const unsigned int MAX_SAMPLE_RATES; - static const unsigned int SAMPLE_RATES[]; - - enum { FAILURE, SUCCESS }; - - enum StreamState { - STREAM_STOPPED, - STREAM_STOPPING, - STREAM_RUNNING, - STREAM_CLOSED = -50 - }; - - enum StreamMode { - OUTPUT, - INPUT, - DUPLEX, - UNINITIALIZED = -75 - }; - - // A protected structure used for buffer conversion. - struct ConvertInfo { - int channels; - int inJump, outJump; - RtAudioFormat inFormat, outFormat; - std::vector inOffset; - std::vector outOffset; - }; - - // A protected structure for audio streams. - struct RtApiStream { - unsigned int device[2]; // Playback and record, respectively. - void *apiHandle; // void pointer for API specific stream handle information - StreamMode mode; // OUTPUT, INPUT, or DUPLEX. - StreamState state; // STOPPED, RUNNING, or CLOSED - char *userBuffer[2]; // Playback and record, respectively. - char *deviceBuffer; - bool doConvertBuffer[2]; // Playback and record, respectively. - bool userInterleaved; - bool deviceInterleaved[2]; // Playback and record, respectively. - bool doByteSwap[2]; // Playback and record, respectively. - unsigned int sampleRate; - unsigned int bufferSize; - unsigned int nBuffers; - unsigned int nUserChannels[2]; // Playback and record, respectively. - unsigned int nDeviceChannels[2]; // Playback and record channels, respectively. - unsigned int channelOffset[2]; // Playback and record, respectively. - unsigned long latency[2]; // Playback and record, respectively. - RtAudioFormat userFormat; - RtAudioFormat deviceFormat[2]; // Playback and record, respectively. - StreamMutex mutex; - CallbackInfo callbackInfo; - ConvertInfo convertInfo[2]; - double streamTime; // Number of elapsed seconds since the stream started. - -#if defined(HAVE_GETTIMEOFDAY) - struct timeval lastTickTimestamp; -#endif - - RtApiStream() - :apiHandle(0), deviceBuffer(0) { device[0] = 11111; device[1] = 11111; } - }; - - typedef S24 Int24; - typedef signed short Int16; - typedef signed int Int32; - typedef float Float32; - typedef double Float64; - - std::ostringstream errorStream_; - std::string errorText_; - bool showWarnings_; - RtApiStream stream_; - bool firstErrorOccurred_; - - /*! - Protected, api-specific method that attempts to open a device - with the given parameters. This function MUST be implemented by - all subclasses. If an error is encountered during the probe, a - "warning" message is reported and FAILURE is returned. A - successful probe is indicated by a return value of SUCCESS. - */ - virtual bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, - unsigned int firstChannel, unsigned int sampleRate, - RtAudioFormat format, unsigned int *bufferSize, - RtAudio::StreamOptions *options ); - - //! A protected function used to increment the stream time. - void tickStreamTime( void ); - - //! Protected common method to clear an RtApiStream structure. - void clearStreamInfo(); - - /*! - Protected common method that throws an RtAudioError (type = - INVALID_USE) if a stream is not open. - */ - void verifyStream( void ); - - //! Protected common error method to allow global control over error handling. - void error( RtAudioError::Type type ); - - /*! - Protected method used to perform format, channel number, and/or interleaving - conversions between the user and device buffers. - */ - void convertBuffer( char *outBuffer, char *inBuffer, ConvertInfo &info ); - - //! Protected common method used to perform byte-swapping on buffers. - void byteSwapBuffer( char *buffer, unsigned int samples, RtAudioFormat format ); - - //! Protected common method that returns the number of bytes for a given format. - unsigned int formatBytes( RtAudioFormat format ); - - //! Protected common method that sets up the parameters for buffer conversion. - void setConvertInfo( StreamMode mode, unsigned int firstChannel ); -}; - -// **************************************************************** // -// -// Inline RtAudio definitions. -// -// **************************************************************** // - -inline RtAudio::Api RtAudio :: getCurrentApi( void ) throw() { return rtapi_->getCurrentApi(); } -inline unsigned int RtAudio :: getDeviceCount( void ) throw() { return rtapi_->getDeviceCount(); } -inline RtAudio::DeviceInfo RtAudio :: getDeviceInfo( unsigned int device ) { return rtapi_->getDeviceInfo( device ); } -inline unsigned int RtAudio :: getDefaultInputDevice( void ) throw() { return rtapi_->getDefaultInputDevice(); } -inline unsigned int RtAudio :: getDefaultOutputDevice( void ) throw() { return rtapi_->getDefaultOutputDevice(); } -inline void RtAudio :: closeStream( void ) throw() { return rtapi_->closeStream(); } -inline void RtAudio :: startStream( void ) { return rtapi_->startStream(); } -inline void RtAudio :: stopStream( void ) { return rtapi_->stopStream(); } -inline void RtAudio :: abortStream( void ) { return rtapi_->abortStream(); } -inline bool RtAudio :: isStreamOpen( void ) const throw() { return rtapi_->isStreamOpen(); } -inline bool RtAudio :: isStreamRunning( void ) const throw() { return rtapi_->isStreamRunning(); } -inline long RtAudio :: getStreamLatency( void ) { return rtapi_->getStreamLatency(); } -inline unsigned int RtAudio :: getStreamSampleRate( void ) { return rtapi_->getStreamSampleRate(); } -inline double RtAudio :: getStreamTime( void ) { return rtapi_->getStreamTime(); } -inline void RtAudio :: setStreamTime( double time ) { return rtapi_->setStreamTime( time ); } -inline void RtAudio :: showWarnings( bool value ) throw() { rtapi_->showWarnings( value ); } - -// RtApi Subclass prototypes. - -#if defined(__MACOSX_CORE__) - -#include - -class RtApiCore: public RtApi -{ -public: - - RtApiCore(); - ~RtApiCore(); - RtAudio::Api getCurrentApi( void ) { return RtAudio::MACOSX_CORE; } - unsigned int getDeviceCount( void ); - RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); - unsigned int getDefaultOutputDevice( void ); - unsigned int getDefaultInputDevice( void ); - void closeStream( void ); - void startStream( void ); - void stopStream( void ); - void abortStream( void ); - long getStreamLatency( void ); - - // This function is intended for internal use only. It must be - // public because it is called by the internal callback handler, - // which is not a member of RtAudio. External use of this function - // will most likely produce highly undesireable results! - bool callbackEvent( AudioDeviceID deviceId, - const AudioBufferList *inBufferList, - const AudioBufferList *outBufferList ); - - private: - - bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, - unsigned int firstChannel, unsigned int sampleRate, - RtAudioFormat format, unsigned int *bufferSize, - RtAudio::StreamOptions *options ); - static const char* getErrorCode( OSStatus code ); -}; - -#endif - -#if defined(__UNIX_JACK__) - -class RtApiJack: public RtApi -{ -public: - - RtApiJack(); - ~RtApiJack(); - RtAudio::Api getCurrentApi( void ) { return RtAudio::UNIX_JACK; } - unsigned int getDeviceCount( void ); - RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); - void closeStream( void ); - void startStream( void ); - void stopStream( void ); - void abortStream( void ); - long getStreamLatency( void ); - - // This function is intended for internal use only. It must be - // public because it is called by the internal callback handler, - // which is not a member of RtAudio. External use of this function - // will most likely produce highly undesireable results! - bool callbackEvent( unsigned long nframes ); - - private: - - bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, - unsigned int firstChannel, unsigned int sampleRate, - RtAudioFormat format, unsigned int *bufferSize, - RtAudio::StreamOptions *options ); -}; - -#endif - -#if defined(__WINDOWS_ASIO__) - -class RtApiAsio: public RtApi -{ -public: - - RtApiAsio(); - ~RtApiAsio(); - RtAudio::Api getCurrentApi( void ) { return RtAudio::WINDOWS_ASIO; } - unsigned int getDeviceCount( void ); - RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); - void closeStream( void ); - void startStream( void ); - void stopStream( void ); - void abortStream( void ); - long getStreamLatency( void ); - - // This function is intended for internal use only. It must be - // public because it is called by the internal callback handler, - // which is not a member of RtAudio. External use of this function - // will most likely produce highly undesireable results! - bool callbackEvent( long bufferIndex ); - - private: - - std::vector devices_; - void saveDeviceInfo( void ); - bool coInitialized_; - bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, - unsigned int firstChannel, unsigned int sampleRate, - RtAudioFormat format, unsigned int *bufferSize, - RtAudio::StreamOptions *options ); -}; - -#endif - -#if defined(__WINDOWS_DS__) - -class RtApiDs: public RtApi -{ -public: - - RtApiDs(); - ~RtApiDs(); - RtAudio::Api getCurrentApi( void ) { return RtAudio::WINDOWS_DS; } - unsigned int getDeviceCount( void ); - unsigned int getDefaultOutputDevice( void ); - unsigned int getDefaultInputDevice( void ); - RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); - void closeStream( void ); - void startStream( void ); - void stopStream( void ); - void abortStream( void ); - long getStreamLatency( void ); - - // This function is intended for internal use only. It must be - // public because it is called by the internal callback handler, - // which is not a member of RtAudio. External use of this function - // will most likely produce highly undesireable results! - void callbackEvent( void ); - - private: - - bool coInitialized_; - bool buffersRolling; - long duplexPrerollBytes; - std::vector dsDevices; - bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, - unsigned int firstChannel, unsigned int sampleRate, - RtAudioFormat format, unsigned int *bufferSize, - RtAudio::StreamOptions *options ); -}; - -#endif - -#if defined(__WINDOWS_WASAPI__) - -struct IMMDeviceEnumerator; - -class RtApiWasapi : public RtApi -{ -public: - RtApiWasapi(); - ~RtApiWasapi(); - - RtAudio::Api getCurrentApi( void ) { return RtAudio::WINDOWS_WASAPI; } - unsigned int getDeviceCount( void ); - RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); - unsigned int getDefaultOutputDevice( void ); - unsigned int getDefaultInputDevice( void ); - void closeStream( void ); - void startStream( void ); - void stopStream( void ); - void abortStream( void ); - -private: - bool coInitialized_; - IMMDeviceEnumerator* deviceEnumerator_; - - bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, - unsigned int firstChannel, unsigned int sampleRate, - RtAudioFormat format, unsigned int* bufferSize, - RtAudio::StreamOptions* options ); - - static DWORD WINAPI runWasapiThread( void* wasapiPtr ); - static DWORD WINAPI stopWasapiThread( void* wasapiPtr ); - static DWORD WINAPI abortWasapiThread( void* wasapiPtr ); - void wasapiThread(); -}; - -#endif - -#if defined(__LINUX_ALSA__) - -class RtApiAlsa: public RtApi -{ -public: - - RtApiAlsa(); - ~RtApiAlsa(); - RtAudio::Api getCurrentApi() { return RtAudio::LINUX_ALSA; } - unsigned int getDeviceCount( void ); - RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); - void closeStream( void ); - void startStream( void ); - void stopStream( void ); - void abortStream( void ); - - // This function is intended for internal use only. It must be - // public because it is called by the internal callback handler, - // which is not a member of RtAudio. External use of this function - // will most likely produce highly undesireable results! - void callbackEvent( void ); - - private: - - std::vector devices_; - void saveDeviceInfo( void ); - bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, - unsigned int firstChannel, unsigned int sampleRate, - RtAudioFormat format, unsigned int *bufferSize, - RtAudio::StreamOptions *options ); -}; - -#endif - -#if defined(__LINUX_PULSE__) - -class RtApiPulse: public RtApi -{ -public: - ~RtApiPulse(); - RtAudio::Api getCurrentApi() { return RtAudio::LINUX_PULSE; } - unsigned int getDeviceCount( void ); - RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); - void closeStream( void ); - void startStream( void ); - void stopStream( void ); - void abortStream( void ); - - // This function is intended for internal use only. It must be - // public because it is called by the internal callback handler, - // which is not a member of RtAudio. External use of this function - // will most likely produce highly undesireable results! - void callbackEvent( void ); - - private: - - std::vector devices_; - void saveDeviceInfo( void ); - bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, - unsigned int firstChannel, unsigned int sampleRate, - RtAudioFormat format, unsigned int *bufferSize, - RtAudio::StreamOptions *options ); -}; - -#endif - -#if defined(__LINUX_OSS__) - -class RtApiOss: public RtApi -{ -public: - - RtApiOss(); - ~RtApiOss(); - RtAudio::Api getCurrentApi() { return RtAudio::LINUX_OSS; } - unsigned int getDeviceCount( void ); - RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); - void closeStream( void ); - void startStream( void ); - void stopStream( void ); - void abortStream( void ); - - // This function is intended for internal use only. It must be - // public because it is called by the internal callback handler, - // which is not a member of RtAudio. External use of this function - // will most likely produce highly undesireable results! - void callbackEvent( void ); - - private: - - bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, - unsigned int firstChannel, unsigned int sampleRate, - RtAudioFormat format, unsigned int *bufferSize, - RtAudio::StreamOptions *options ); -}; - -#endif - -#if defined(__RTAUDIO_DUMMY__) - -class RtApiDummy: public RtApi -{ -public: - - RtApiDummy() { errorText_ = "RtApiDummy: This class provides no functionality."; error( RtAudioError::WARNING ); } - RtAudio::Api getCurrentApi( void ) { return RtAudio::RTAUDIO_DUMMY; } - unsigned int getDeviceCount( void ) { return 0; } - RtAudio::DeviceInfo getDeviceInfo( unsigned int /*device*/ ) { RtAudio::DeviceInfo info; return info; } - void closeStream( void ) {} - void startStream( void ) {} - void stopStream( void ) {} - void abortStream( void ) {} - - private: - - bool probeDeviceOpen( unsigned int /*device*/, StreamMode /*mode*/, unsigned int /*channels*/, - unsigned int /*firstChannel*/, unsigned int /*sampleRate*/, - RtAudioFormat /*format*/, unsigned int * /*bufferSize*/, - RtAudio::StreamOptions * /*options*/ ) { return false; } -}; - -#endif - -#endif - -// Indentation settings for Vim and Emacs -// -// Local Variables: -// c-basic-offset: 2 -// indent-tabs-mode: nil -// End: -// -// vim: et sts=2 sw=2 diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/include/wavpack.h b/sources/LabSound/third_party/libnyquist/third_party/wavpack/include/wavpack.h deleted file mode 100644 index 374924b0..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/include/wavpack.h +++ /dev/null @@ -1,420 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2016 David Bryant. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// wavpack.h - -#ifndef WAVPACK_H -#define WAVPACK_H - -// This header file contains all the definitions required to use the -// functions in "wputils.c" to read and write WavPack files and streams. - -#include - -#if defined(_MSC_VER) && _MSC_VER < 1600 -typedef unsigned __int64 uint64_t; -typedef unsigned __int32 uint32_t; -typedef unsigned __int16 uint16_t; -typedef unsigned __int8 uint8_t; -typedef __int64 int64_t; -typedef __int32 int32_t; -typedef __int16 int16_t; -typedef __int8 int8_t; -#else -#include -#endif - -// RIFF / wav header formats (these occur at the beginning of both wav files -// and pre-4.0 WavPack files that are not in the "raw" mode). Generally, an -// application using the library to read or write WavPack files will not be -// concerned with any of these. - -typedef struct { - char ckID [4]; - uint32_t ckSize; - char formType [4]; -} RiffChunkHeader; - -typedef struct { - char ckID [4]; - uint32_t ckSize; -} ChunkHeader; - -#define ChunkHeaderFormat "4L" - -typedef struct { - uint16_t FormatTag, NumChannels; - uint32_t SampleRate, BytesPerSecond; - uint16_t BlockAlign, BitsPerSample; - uint16_t cbSize, ValidBitsPerSample; - int32_t ChannelMask; - uint16_t SubFormat; - char GUID [14]; -} WaveHeader; - -#define WaveHeaderFormat "SSLLSSSSLS" - -// This is the ONLY structure that occurs in WavPack files (as of version -// 4.0), and is the preamble to every block in both the .wv and .wvc -// files (in little-endian format). Normally, this structure has no use -// to an application using the library to read or write WavPack files, -// but if an application needs to manually parse WavPack files then this -// would be used (with appropriate endian correction). - -typedef struct { - char ckID [4]; - uint32_t ckSize; - int16_t version; - unsigned char block_index_u8; - unsigned char total_samples_u8; - uint32_t total_samples, block_index, block_samples, flags, crc; -} WavpackHeader; - -#define WavpackHeaderFormat "4LS2LLLLL" - -// Macros to access the 40-bit block_index field - -#define GET_BLOCK_INDEX(hdr) ( (int64_t) (hdr).block_index + ((int64_t) (hdr).block_index_u8 << 32) ) - -#define SET_BLOCK_INDEX(hdr,value) do { \ - int64_t tmp = (value); \ - (hdr).block_index = (uint32_t) tmp; \ - (hdr).block_index_u8 = \ - (unsigned char) (tmp >> 32); \ -} while (0) - -// Macros to access the 40-bit total_samples field, which is complicated by the fact that -// all 1's in the lower 32 bits indicates "unknown" (regardless of upper 8 bits) - -#define GET_TOTAL_SAMPLES(hdr) ( ((hdr).total_samples == (uint32_t) -1) ? -1 : \ - (int64_t) (hdr).total_samples + ((int64_t) (hdr).total_samples_u8 << 32) - (hdr).total_samples_u8 ) - -#define SET_TOTAL_SAMPLES(hdr,value) do { \ - int64_t tmp = (value); \ - if (tmp < 0) \ - (hdr).total_samples = (uint32_t) -1; \ - else { \ - tmp += (tmp / 0xffffffffLL); \ - (hdr).total_samples = (uint32_t) tmp; \ - (hdr).total_samples_u8 = \ - (unsigned char) (tmp >> 32); \ - } \ -} while (0) - -// or-values for WavpackHeader.flags -#define BYTES_STORED 3 // 1-4 bytes/sample -#define MONO_FLAG 4 // not stereo -#define HYBRID_FLAG 8 // hybrid mode -#define JOINT_STEREO 0x10 // joint stereo -#define CROSS_DECORR 0x20 // no-delay cross decorrelation -#define HYBRID_SHAPE 0x40 // noise shape (hybrid mode only) -#define FLOAT_DATA 0x80 // ieee 32-bit floating point data - -#define INT32_DATA 0x100 // special extended int handling -#define HYBRID_BITRATE 0x200 // bitrate noise (hybrid mode only) -#define HYBRID_BALANCE 0x400 // balance noise (hybrid stereo mode only) - -#define INITIAL_BLOCK 0x800 // initial block of multichannel segment -#define FINAL_BLOCK 0x1000 // final block of multichannel segment - -#define SHIFT_LSB 13 -#define SHIFT_MASK (0x1fL << SHIFT_LSB) - -#define MAG_LSB 18 -#define MAG_MASK (0x1fL << MAG_LSB) - -#define SRATE_LSB 23 -#define SRATE_MASK (0xfL << SRATE_LSB) - -#define FALSE_STEREO 0x40000000 // block is stereo, but data is mono -#define NEW_SHAPING 0x20000000 // use IIR filter for negative shaping - -#define MONO_DATA (MONO_FLAG | FALSE_STEREO) - -// Introduced in WavPack 5.0: -#define HAS_CHECKSUM 0x10000000 // block contains a trailing checksum -#define DSD_FLAG 0x80000000 // block is encoded DSD (1-bit PCM) - -#define IGNORED_FLAGS 0x08000000 // reserved, but ignore if encountered -#define UNKNOWN_FLAGS 0x00000000 // we no longer have any of these spares - -#define MIN_STREAM_VERS 0x402 // lowest stream version we'll decode -#define MAX_STREAM_VERS 0x410 // highest stream version we'll decode or encode - -// These are the mask bit definitions for the metadata chunk id byte (see format.txt) - -#define ID_UNIQUE 0x3f -#define ID_OPTIONAL_DATA 0x20 -#define ID_ODD_SIZE 0x40 -#define ID_LARGE 0x80 - -#define ID_DUMMY 0x0 -#define ID_ENCODER_INFO 0x1 -#define ID_DECORR_TERMS 0x2 -#define ID_DECORR_WEIGHTS 0x3 -#define ID_DECORR_SAMPLES 0x4 -#define ID_ENTROPY_VARS 0x5 -#define ID_HYBRID_PROFILE 0x6 -#define ID_SHAPING_WEIGHTS 0x7 -#define ID_FLOAT_INFO 0x8 -#define ID_INT32_INFO 0x9 -#define ID_WV_BITSTREAM 0xa -#define ID_WVC_BITSTREAM 0xb -#define ID_WVX_BITSTREAM 0xc -#define ID_CHANNEL_INFO 0xd - -#define ID_RIFF_HEADER (ID_OPTIONAL_DATA | 0x1) -#define ID_RIFF_TRAILER (ID_OPTIONAL_DATA | 0x2) -#define ID_ALT_HEADER (ID_OPTIONAL_DATA | 0x3) -#define ID_ALT_TRAILER (ID_OPTIONAL_DATA | 0x4) -#define ID_CONFIG_BLOCK (ID_OPTIONAL_DATA | 0x5) -#define ID_MD5_CHECKSUM (ID_OPTIONAL_DATA | 0x6) -#define ID_SAMPLE_RATE (ID_OPTIONAL_DATA | 0x7) -#define ID_ALT_EXTENSION (ID_OPTIONAL_DATA | 0x8) -#define ID_ALT_MD5_CHECKSUM (ID_OPTIONAL_DATA | 0x9) -#define ID_NEW_CONFIG_BLOCK (ID_OPTIONAL_DATA | 0xa) -#define ID_BLOCK_CHECKSUM (ID_OPTIONAL_DATA | 0xf) - -///////////////////////// WavPack Configuration /////////////////////////////// - -// This external structure is used during encode to provide configuration to -// the encoding engine and during decoding to provide fle information back to -// the higher level functions. Not all fields are used in both modes. - -typedef struct { - float bitrate, shaping_weight; - int bits_per_sample, bytes_per_sample; - int qmode, flags, xmode, num_channels, float_norm_exp; - int32_t block_samples, extra_flags, sample_rate, channel_mask; - unsigned char md5_checksum [16], md5_read; - int num_tag_strings; // this field is not used - char **tag_strings; // this field is not used -} WavpackConfig; - -#define CONFIG_HYBRID_FLAG 8 // hybrid mode -#define CONFIG_JOINT_STEREO 0x10 // joint stereo -#define CONFIG_CROSS_DECORR 0x20 // no-delay cross decorrelation -#define CONFIG_HYBRID_SHAPE 0x40 // noise shape (hybrid mode only) -#define CONFIG_FAST_FLAG 0x200 // fast mode -#define CONFIG_HIGH_FLAG 0x800 // high quality mode -#define CONFIG_VERY_HIGH_FLAG 0x1000 // very high -#define CONFIG_BITRATE_KBPS 0x2000 // bitrate is kbps, not bits / sample -#define CONFIG_SHAPE_OVERRIDE 0x8000 // shaping mode specified -#define CONFIG_JOINT_OVERRIDE 0x10000 // joint-stereo mode specified -#define CONFIG_DYNAMIC_SHAPING 0x20000 // dynamic noise shaping -#define CONFIG_CREATE_EXE 0x40000 // create executable -#define CONFIG_CREATE_WVC 0x80000 // create correction file -#define CONFIG_OPTIMIZE_WVC 0x100000 // maximize bybrid compression -#define CONFIG_COMPATIBLE_WRITE 0x400000 // write files for decoders < 4.3 -#define CONFIG_CALC_NOISE 0x800000 // calc noise in hybrid mode -#define CONFIG_EXTRA_MODE 0x2000000 // extra processing mode -#define CONFIG_SKIP_WVX 0x4000000 // no wvx stream w/ floats & big ints -#define CONFIG_MD5_CHECKSUM 0x8000000 // store MD5 signature -#define CONFIG_MERGE_BLOCKS 0x10000000 // merge blocks of equal redundancy (for lossyWAV) -#define CONFIG_PAIR_UNDEF_CHANS 0x20000000 // encode undefined channels in stereo pairs -#define CONFIG_OPTIMIZE_MONO 0x80000000 // optimize for mono streams posing as stereo - -// The lower 8 bits of qmode indicate the use of new features in version 5 that (presently) -// only apply to Core Audio Files (CAF) and DSD files, but could apply to other things too. -// These flags are stored in the file and can be retrieved by a decoder that is aware of -// them, but the individual bits are meaningless to the library. If ANY of these bits are -// set then the MD5 sum is written with a new ID so that old decoders will not see it -// (because these features will cause the MD5 sum to be different and fail). - -#define QMODE_BIG_ENDIAN 0x1 // big-endian data format (opposite of WAV format) -#define QMODE_SIGNED_BYTES 0x2 // 8-bit audio data is signed (opposite of WAV format) -#define QMODE_UNSIGNED_WORDS 0x4 // audio data (other than 8-bit) is unsigned (opposite of WAV format) -#define QMODE_REORDERED_CHANS 0x8 // source channels were not Microsoft order, so they were reordered -#define QMODE_DSD_LSB_FIRST 0x10 // DSD bytes, LSB first (most Sony .dsf files) -#define QMODE_DSD_MSB_FIRST 0x20 // DSD bytes, MSB first (Philips .dff files) -#define QMODE_DSD_IN_BLOCKS 0x40 // DSD data is blocked by channels (Sony .dsf only) -#define QMODE_DSD_AUDIO (QMODE_DSD_LSB_FIRST | QMODE_DSD_MSB_FIRST) - -// The rest of the qmode word is reserved for the private use of the command-line programs -// and are ignored by the library (and not stored either). They really should not be defined -// here, but I thought it would be a good idea to have all the definitions together. - -#define QMODE_ADOBE_MODE 0x100 // user specified Adobe mode -#define QMODE_NO_STORE_WRAPPER 0x200 // user specified to not store audio file wrapper (RIFF, CAFF, etc.) -#define QMODE_CHANS_UNASSIGNED 0x400 // user specified "..." in --channel-order option -#define QMODE_IGNORE_LENGTH 0x800 // user specified to ignore length in file header -#define QMODE_RAW_PCM 0x1000 // user specified raw PCM format (no header present) - -////////////// Callbacks used for reading & writing WavPack streams ////////// - -typedef struct { - int32_t (*read_bytes)(void *id, void *data, int32_t bcount); - uint32_t (*get_pos)(void *id); - int (*set_pos_abs)(void *id, uint32_t pos); - int (*set_pos_rel)(void *id, int32_t delta, int mode); - int (*push_back_byte)(void *id, int c); - uint32_t (*get_length)(void *id); - int (*can_seek)(void *id); - - // this callback is for writing edited tags only - int32_t (*write_bytes)(void *id, void *data, int32_t bcount); -} WavpackStreamReader; - -// Extended version of structure for handling large files and added -// functionality for truncating and closing files - -typedef struct { - int32_t (*read_bytes)(void *id, void *data, int32_t bcount); - int32_t (*write_bytes)(void *id, void *data, int32_t bcount); - int64_t (*get_pos)(void *id); // new signature for large files - int (*set_pos_abs)(void *id, int64_t pos); // new signature for large files - int (*set_pos_rel)(void *id, int64_t delta, int mode); // new signature for large files - int (*push_back_byte)(void *id, int c); - int64_t (*get_length)(void *id); // new signature for large files - int (*can_seek)(void *id); - int (*truncate_here)(void *id); // new function to truncate file at current position - int (*close)(void *id); // new function to close file -} WavpackStreamReader64; - -typedef int (*WavpackBlockOutput)(void *id, void *data, int32_t bcount); - -//////////////////////////// function prototypes ///////////////////////////// - -typedef void WavpackContext; - -#ifdef __cplusplus -extern "C" { -#endif - -#define MAX_WAVPACK_SAMPLES ((1LL << 40) - 257) - -WavpackContext *WavpackOpenRawDecoder ( - void *main_data, int32_t main_size, - void *corr_data, int32_t corr_size, - int16_t version, char *error, int flags, int norm_offset); - -WavpackContext *WavpackOpenFileInputEx64 (WavpackStreamReader64 *reader, void *wv_id, void *wvc_id, char *error, int flags, int norm_offset); -WavpackContext *WavpackOpenFileInputEx (WavpackStreamReader *reader, void *wv_id, void *wvc_id, char *error, int flags, int norm_offset); -WavpackContext *WavpackOpenFileInput (const char *infilename, char *error, int flags, int norm_offset); - -#define OPEN_WVC 0x1 // open/read "correction" file -#define OPEN_TAGS 0x2 // read ID3v1 / APEv2 tags (seekable file) -#define OPEN_WRAPPER 0x4 // make audio wrapper available (i.e. RIFF) -#define OPEN_2CH_MAX 0x8 // open multichannel as stereo (no downmix) -#define OPEN_NORMALIZE 0x10 // normalize floating point data to +/- 1.0 -#define OPEN_STREAMING 0x20 // "streaming" mode blindly unpacks blocks - // w/o regard to header file position info -#define OPEN_EDIT_TAGS 0x40 // allow editing of tags -#define OPEN_FILE_UTF8 0x80 // assume filenames are UTF-8 encoded, not ANSI (Windows only) - -// new for version 5 - -#define OPEN_DSD_NATIVE 0x100 // open DSD files as bitstreams - // (returned as 8-bit "samples" stored in 32-bit words) -#define OPEN_DSD_AS_PCM 0x200 // open DSD files as 24-bit PCM (decimated 8x) -#define OPEN_ALT_TYPES 0x400 // application is aware of alternate file types & qmode - // (just affects retrieving wrappers & MD5 checksums) -#define OPEN_NO_CHECKSUM 0x800 // don't verify block checksums before decoding - -int WavpackGetMode (WavpackContext *wpc); - -#define MODE_WVC 0x1 -#define MODE_LOSSLESS 0x2 -#define MODE_HYBRID 0x4 -#define MODE_FLOAT 0x8 -#define MODE_VALID_TAG 0x10 -#define MODE_HIGH 0x20 -#define MODE_FAST 0x40 -#define MODE_EXTRA 0x80 // extra mode used, see MODE_XMODE for possible level -#define MODE_APETAG 0x100 -#define MODE_SFX 0x200 -#define MODE_VERY_HIGH 0x400 -#define MODE_MD5 0x800 -#define MODE_XMODE 0x7000 // mask for extra level (1-6, 0=unknown) -#define MODE_DNS 0x8000 - -int WavpackVerifySingleBlock (unsigned char *buffer, int verify_checksum); -int WavpackGetQualifyMode (WavpackContext *wpc); -char *WavpackGetErrorMessage (WavpackContext *wpc); -int WavpackGetVersion (WavpackContext *wpc); -char *WavpackGetFileExtension (WavpackContext *wpc); -unsigned char WavpackGetFileFormat (WavpackContext *wpc); -uint32_t WavpackUnpackSamples (WavpackContext *wpc, int32_t *buffer, uint32_t samples); -uint32_t WavpackGetNumSamples (WavpackContext *wpc); -int64_t WavpackGetNumSamples64 (WavpackContext *wpc); -uint32_t WavpackGetNumSamplesInFrame (WavpackContext *wpc); -uint32_t WavpackGetSampleIndex (WavpackContext *wpc); -int64_t WavpackGetSampleIndex64 (WavpackContext *wpc); -int WavpackGetNumErrors (WavpackContext *wpc); -int WavpackLossyBlocks (WavpackContext *wpc); -int WavpackSeekSample (WavpackContext *wpc, uint32_t sample); -int WavpackSeekSample64 (WavpackContext *wpc, int64_t sample); -WavpackContext *WavpackCloseFile (WavpackContext *wpc); -uint32_t WavpackGetSampleRate (WavpackContext *wpc); -uint32_t WavpackGetNativeSampleRate (WavpackContext *wpc); -int WavpackGetBitsPerSample (WavpackContext *wpc); -int WavpackGetBytesPerSample (WavpackContext *wpc); -int WavpackGetNumChannels (WavpackContext *wpc); -int WavpackGetChannelMask (WavpackContext *wpc); -int WavpackGetReducedChannels (WavpackContext *wpc); -int WavpackGetFloatNormExp (WavpackContext *wpc); -int WavpackGetMD5Sum (WavpackContext *wpc, unsigned char data [16]); -void WavpackGetChannelIdentities (WavpackContext *wpc, unsigned char *identities); -uint32_t WavpackGetChannelLayout (WavpackContext *wpc, unsigned char *reorder); -uint32_t WavpackGetWrapperBytes (WavpackContext *wpc); -unsigned char *WavpackGetWrapperData (WavpackContext *wpc); -void WavpackFreeWrapper (WavpackContext *wpc); -void WavpackSeekTrailingWrapper (WavpackContext *wpc); -double WavpackGetProgress (WavpackContext *wpc); -uint32_t WavpackGetFileSize (WavpackContext *wpc); -int64_t WavpackGetFileSize64 (WavpackContext *wpc); -double WavpackGetRatio (WavpackContext *wpc); -double WavpackGetAverageBitrate (WavpackContext *wpc, int count_wvc); -double WavpackGetInstantBitrate (WavpackContext *wpc); -int WavpackGetNumTagItems (WavpackContext *wpc); -int WavpackGetTagItem (WavpackContext *wpc, const char *item, char *value, int size); -int WavpackGetTagItemIndexed (WavpackContext *wpc, int index, char *item, int size); -int WavpackGetNumBinaryTagItems (WavpackContext *wpc); -int WavpackGetBinaryTagItem (WavpackContext *wpc, const char *item, char *value, int size); -int WavpackGetBinaryTagItemIndexed (WavpackContext *wpc, int index, char *item, int size); -int WavpackAppendTagItem (WavpackContext *wpc, const char *item, const char *value, int vsize); -int WavpackAppendBinaryTagItem (WavpackContext *wpc, const char *item, const char *value, int vsize); -int WavpackDeleteTagItem (WavpackContext *wpc, const char *item); -int WavpackWriteTag (WavpackContext *wpc); - -WavpackContext *WavpackOpenFileOutput (WavpackBlockOutput blockout, void *wv_id, void *wvc_id); -void WavpackSetFileInformation (WavpackContext *wpc, char *file_extension, unsigned char file_format); - -#define WP_FORMAT_WAV 0 // Microsoft RIFF, including BWF and RF64 varients -#define WP_FORMAT_W64 1 // Sony Wave64 -#define WP_FORMAT_CAF 2 // Apple CoreAudio -#define WP_FORMAT_DFF 3 // Philips DSDIFF -#define WP_FORMAT_DSF 4 // Sony DSD Format - -int WavpackSetConfiguration (WavpackContext *wpc, WavpackConfig *config, uint32_t total_samples); -int WavpackSetConfiguration64 (WavpackContext *wpc, WavpackConfig *config, int64_t total_samples, const unsigned char *chan_ids); -int WavpackSetChannelLayout (WavpackContext *wpc, uint32_t layout_tag, const unsigned char *reorder); -int WavpackAddWrapper (WavpackContext *wpc, void *data, uint32_t bcount); -int WavpackStoreMD5Sum (WavpackContext *wpc, unsigned char data [16]); -int WavpackPackInit (WavpackContext *wpc); -int WavpackPackSamples (WavpackContext *wpc, int32_t *sample_buffer, uint32_t sample_count); -int WavpackFlushSamples (WavpackContext *wpc); -void WavpackUpdateNumSamples (WavpackContext *wpc, void *first_block); -void *WavpackGetWrapperLocation (void *first_block, uint32_t *size); -double WavpackGetEncodedNoise (WavpackContext *wpc, double *peak); - -void WavpackFloatNormalize (int32_t *values, int32_t num_values, int delta_exp); - -void WavpackLittleEndianToNative (void *data, char *format); -void WavpackNativeToLittleEndian (void *data, char *format); -void WavpackBigEndianToNative (void *data, char *format); -void WavpackNativeToBigEndian (void *data, char *format); - -uint32_t WavpackGetLibraryVersion (void); -const char *WavpackGetLibraryVersionString (void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/output/arm64-v8a/liblibnyquist.a b/sources/LabSound/third_party/libnyquist/third_party/wavpack/output/arm64-v8a/liblibnyquist.a deleted file mode 100644 index fad3373beafa07e35237c4a59bfef504f6f69657..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2142564 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�{SMwQzmeEJtA@Jzs7^47u}Op8R#WmXQ1~B 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
    B%>{IS13KcJ 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πU%G_WMdONvc_|Rf(M2BLwp{1l?wZwiiIp63X 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≦@4ymz)7L840!l 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 du&+i2R2Y~6)AwaSrYsrJtyV@H9+VMo2Qp%? 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%0DMO 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�lYQFoJ?B&UHN(>l#IqOca*kd= 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.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 diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/output/arm64-v8a/liblibwavpack.a b/sources/LabSound/third_party/libnyquist/third_party/wavpack/output/arm64-v8a/liblibwavpack.a deleted file mode 100644 index 118551175fb4dd1fd778797da07d4c1cb8db490d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 214412 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 Bza9Vp diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/output/armeabi-v7a/liblibnyquist.a b/sources/LabSound/third_party/libnyquist/third_party/wavpack/output/armeabi-v7a/liblibnyquist.a deleted file mode 100644 index 9b5a1f207982f8b07d99b6bb3cc8852bc87dbca6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1691076 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�Q1@T-AA(IJN7$xH@iT5 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

    ~>#Fv(Yi0UE3-_v;&AC4kce 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≪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

      C_kSs_hBpZ?u*)GWpAzoE2J}|JETLTOQchz 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ⅈBn7mKZ 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%0D_(|Y3Kz*rBe($quZ~o|8 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�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 diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/output/armeabi-v7a/liblibwavpack.a b/sources/LabSound/third_party/libnyquist/third_party/wavpack/output/armeabi-v7a/liblibwavpack.a deleted file mode 100644 index a17158c759b9f71367cbfd08bfb8457dd93a629f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160080 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̾#v;o%5zK=>1d(4i5`=p< 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]er-k}UKEC)Aeee|^TqJf zowJ-88^yYnHrW}g8XKnzOQ&B*{;Imh>9RcN7g9{s8;#SoymPoTBPRAE!EkrgT!qiu zKsQLEw)Y%lcZe1iQ?#20 zJw=6jB<3fM>E5TkT7Z`GTbZACf|nv=yWISoHe!AESj zw9VDN_(p*?STX&C|<*fQhl4(%#X9O)T&l!Kx5zh^Xb z;I_U4xApD81L`n%9LWi^_Uunau8BV-|HuIZ%CNlRh0p81!tgiit=%d3^zVg_Bc5On zk1WH57&YP{-8G-$lL{)9U0q5^ICjd%{a&{<=VuoYaal{?V^dI6Uqfla!Rsb3hG`ZMC2{S`Ho9;!il+Y&+S$ntb|6I0)E zPtX$SG8UPkO}I2Ov$;* z8*ElO9gR$L)o;_sLN+#rwz#@gE4c`tiA?e>%dG{ymS04!c(L;%BCo5SC45-L4v-`! zP{S4A5#lC*pqgb0JuCQWYKF|4VaNE`E;6UGEpRu)_&92Yp9g-3oK2k{Y!$XrMg}Kn zS0g1rfYfGO-DZ@5t@Va~i_vfl+&o4RZE%R+2=pKh+>A`#%Gsp$_3RTG$ADf9YIr@@ z@Z%q6_*;ZmC_5%wkTBAyYw$gXZ2T=rLi#e#Y6n4@FOMKlC9rRHQ|BCD`UN!k-%~WU zJSj$&8e5D^eQ#vyFLphV%b}07wFCwfFK0Bj?3ikv6nbC9d-fZ}tO{cgpjF?%emb0{ zx>2mM+{<&tqnfw$mFg>a?ToKJiM>0XTe=}qz{iRgm>N*L#Gd<}?V$L>*UI@zAXX+V zmD6T#h_3oVO@+|`ud#AJT85o>I_2e-z8H}Wa|L|e7YbVPdgrLk0C^HMV# z1N0;nEtHZbTC(_m&{0Pma5pi_{bOXP=N^oFwL^hbB(oWmp%2wzPHY^nZg0rS9Eg)c zFz$dFkS3GmYKF~!1qE+|?92#%tU)+;x1ECT5cqj%^1apm{)Px)rJRFy{u}w8@g=?= zg0q?le_SDQ1^RTC`@aj)J4?nN^pXL?De7eNw6sT-jBSL8!MjhUGeaw&1+=`# zEb#`La1kW*-UZZ4*6$CkA6`!BH4T1h`woem;e0-mKijk|m)ih%6Uvfh#RF(>iYsBozl2o7PFs=kunz)~8_Kac zg=gy!UBm01GnTH9?!vw8g1u@wYZF^yw{et|N0%wg7kbvbl_iN7=ySIQ_o$u-bso3U zv|F#qTji}@4%4X7EvV#vhm3;eP2!WOW2)=0i#X3&X2er{$P8ziGdR&KOvBErsZG3q zrzB6_og2arK({fyo@Rjs`sNTl!;?@i!{sa4SDj;qax{wFR0lDmhUL<5>RfGKE1D!7 z%YK%HNpz$rDSUlrK&Kp16b+5|T6HB^og#d4LOA@;<=U<)wqQ9`=*4m>HVYKuVH|%m zQg~s>^p_9$T(SCsEJBv1dsR$U5mJp;k@vaG)QRtP63c{i=&Br_A{yA(WKA`qZQV+| zs-Cw`SH<{oFr1bU&f(MW(3cpf$nmOtGnD=Jb#ts$$xlGD*-B_vY2FZV!;1(a7S0|F zXAOokC20BD6r#~ve1OsfOCHCmmwrD+8Ohk zDzqFpO!Ww`WXX^Rw>&K3!JM6HM&1{=g*MoRoH`0NOJX2yhrQkxZ2od22RH z+Fdj_(HBZ_M%pLC?$x8qH8I+H=*O9%W>uIfpJhDdvopT5!Z$O;)F?pE5C%&%+QW74 z7l$ipt{KUa5z3I!8VsicX=k_=2nS!$&4@)Khj6xk1JA1ejdXB)Qpt;E*4jM1*ni&5mIdCCU3VPeTE>MFBjxhm2f5nxM8?Gf-530fwZp-pte z3~gYKM?5>ehgS2WVR)OQaM{or4A*kJIT(H`0jDn@OGgW9O1Rn#q0`T#zllF@$+OH) zn`^rXej8q?kbvjS(X&p#^SyS!b9Ve$XY7%!mk{Ue6Ro^Q7+DE%E=I9B40@h~L6^}t zUg{-cJRW}hmS-m;7l`A?d96oKDU=N}M!mMJpirM7>gAQKwB~lf_@rTC%z9w!!z|=I za&gpE{b=-!_Khs2u&?MyE*!?JV+_!M$>Ac`Y`I43l5_2770bRV07D_={$vT@_aYyM zK(;<(IgfZZn502Ob)s;TGJ@t{*%PDzT5MANosR2S{;2TIS z(_!*GFZo{4x>$tJKrKZS=(A*o+l6V8ue&{qvWB0EM?K+ZjQ)(+0U-8%iIP!DiWB>i zkOxx$S^6jgo60 zhc~OpLCyXZGzoVM+)CIi(aq#mtI-MTk3wCBwk`w&<*YJIsEo~*1TSUluG}l{bha|~ z2aGxA7zqxJehdXPK=V~NdUVggK1`W(9Yt&}w7p6>s32_AS7M(%>Z3#o%BsT`I z8ye(X0QkxohN?H-E=ucZiEeGG zJ0;@em!f^PgF9o!HjYiwh$T2U@rGT?t22xwqo6O^YbY!kjG7%3O4;k>0toT2kP<&S zUX;|n302_8G7pzYgnSxj>#604o?80khBvjI+P2!Hd{`(ZPCXMz^wb8%Xh%oY*#yAJ z(zheVLT;_%sbgGqjLI}SM{p1NYIUNoW~|yqBZhU>hQUF^ ztqGmAI9h!Dlk3&qj(;ZGP%Y8kG1cGWl+EU?N^lZ5P|NHcG-mW#?pst}yl>*nAX0~2pRBcW$sVivk2cHz)0bnwIxLFUrfZ^WEprGZ8xYUf_WEDEB2jk&T-7VPbEkxaAZVY&Bw4JSXO&&CV4xMz<^+sp_QxWYafW+bh9p(scX~ zEikNkEZIO|5slKKI-Rdqt0Ozst|ZO3@+Gv2P^5ds+hYNGpo=_azIXCLCiIZ4pp;LtOy-9l%8_Ag zyx`*K$?JX-Sh1u4t31kdXQ=I(%u-G!bDDXa#V@Mu`NoX$j482$T0UzO?UyE5{*-9{ z4HQ>kto#MQWcSb#?K}OZb~Z3$n>C9Q(i9z6mYV3TG)@}g{4*cX@f;VVx;}hEP%rp7 z-UjTDy+_o!)oH=WTPGA{#Xm`j*6YZ!yQtG2J=!a6L;ZoUEp{8Y+-p86{vvevbGjzB z!@ON&dENll>7Cc>8bQiMR@(1qZ@S$czKIhDvBz*0+xJ*4|DeuH=m6$4){Y4*)wqfz zYMF#|N@IxLxJr7XU3@=u5g4 z5=T5G!5u0RBM!e&GaGqvNF!G41nfW}baDc6_SMG6)RCezO3B8YEyu7Pg-@k#MU*~^ zmU8T{9(>YMFTvq^Wd)`kUYS=CdlYPn=Dj%HSbGOac`D#3$%qx$Pgw-@;bk!sHs533 z=0$sGVa7-ayuxvckn2`s;}KUUO#!348P81SSbK}{vwG_xS9IV8W2Nk2S;@2m3Mc%h z?c8O?9__@G@SlEdK|l$`Cc#PX*D+~N+a4);2<^;!Vs&2aL?L#61FsZS8O8X{h_@&F zm~J+4rRBIWrDC#V5!+Vb)2*6A-Hk^W$Q0d1555+~!oOHebz*tHaU~5TL;fVsuN_x* zNOl?EQ|FBOwz0;XqYUja1{p?Zo_M2}!gJQs%$}^Lfw=#B)3Fwt1;0-8qMCLFGBIj0 zpgEC=G9t7h8wa7qNN(f1MaW%1sgfBS5yFaTH;e9`9{BgzL~45?6SR z9zzO{abg7TNHLeCy7t;$d1M4J@l_YhTc)WyQv!QdyT660GKnXAUyq>en z$pRU`I`QeI8;ZvX*QWw>iR6kunJUm~Kt7Td=bS?$OId2RM428jxWD=D5AMIo;QpIE zuqOVAsK%)IJ!1#Raq$5Y8}X=m88gFrnAg$EI;b4EekAne@eBe6EuzWu;ej&%sqn(- zaz&-%8Xc3=)_VY{7F6HRk0yYZ{(w4`DM-%c<%4F-ZZ>day2pi@hXG4 zx_CkrNtc$$Fm$knSk4IDpRe6KgPtSMVO@0aE44QF*+?6+EcaCM=cC#Vb(M7BLlMFU z^Dg!x^|tuoQ>rfr>inon7Ub~G*isN7=X3w%C-q8%GF2D1&aW&>c z!i#*;@d=3PG(yhWYI=YKP_8ob)2SWrjq#7iXfDV4tuQqs+pAis?Hb&x6#~wbz~0JF z1Q=>5y6Qw0Pxv|gi4=%p`U7qd$&XnG5{F{YrXw03Nz9~waQAA4_IY|YI_vbtlgkRU z_y%_3RjhuHm4%caPUYf7f&I!P!9QK+u-3Y`-Q0bN=gy_+l!f!0lohrM)Kit~RlKE- z@RB|ICO36_L<^-~x|{g9mJ*HF2h#4P>FR@)kI_mW2z(-wRkc@6z&CB+6kZ^k=})%0 zHSIgNYf4gwjmNcB!QGkWU2gok#zj#U)p+a@5mQsr`>F4xu0RWF$i(rHtX z95Zco?4YscYMa1LF(2`m3%r&DI3=J1mW+ zJvX%hU{SWxiypOQ2+MxP%z=Z%Rt9$)Hmj4tVE8gt6e{Ac!b%1kj2elLty-pPaK@T7 zRUGX_)TW1?k?@x(PX0`=EdyupR;o}mm{0H|Pa2MdqUI+8X^iz5mB*Y>S)+md$uOw( zowNmC02DA96tL5V& z^`H|}mlFec6ulKnEOOaqTE-;LGehefx+6Dnz#%%n^MrvUE* z_Jo+O<_C8gHR6wl&alSe%Ur?@=y3s%HlPcG4UrTH{`FJR1*MQ2qvpOpGCE|D!HDMl zC;Vj&iK2PGhA+7(F$7EW5bRc2PT>yx<%mEJ{!C{Knizx6Wehk2{k=pR&ind=o?w$R z2HY_QReqG^xn;()gNH zHBp@k^t<}FXOp}-mLECybk8_1QdKBv7L z+4w?9(f3#}d&AxEmDvK_svAkLAkYD)%O=sv`nBEMb&Vm4r@`+L3i4dSJ(3qLw5s}r z%k3Bw=VcekripGsh!M#|8Dy|Aq!%}%s8`3cG=5Ph9AjuzpfMWB8zZJRC}oB)F5&Fz zeO0n4jMs|5KI64lT)%}8LuKnsW2jkrTz$QS7aE@^U>%Ae;byg~bG-9iMfRzqXvhp3 zxsU>-)E#z6&qIlu_QXvaH&`$(EiuDs2%-}{=s3XV*ygtMXu}0FlpkoYrVXmldKF%6 zYzz~KhZtT6N9e&0^jnSB-SbrVmBo2DISjAwxJ{%rP!R0m(p5|jphlNFHJfu2Yu2DO zHOD@N>d2EmMrxubFJd2O<)LQvz-FzeWtMD0pJ|139GoxB7sahEt+;icu}q(K@TOut zZ?oJxjKDwCYVz)V-v~S@ zr(zs8pv9%fi!z_g)MYNy$EQ;Dr&3WbG{VT#j0?ICDLTo6`cb~7N-4Hprh`uFD6tiN zusW_puv-?|z-eZA;h6i3zoB^#esrHvdEU#xbHke9I~9JDFFSqMZ2V;52TcB zlwt`4DdXrk9)3uX5C3l)ItSb6$_`VMNS1jvaH36_p$&{~OrRC4c*%(Eqn)Ts1kqgy zudk{``EB#K0H(L$JpNWEAZcIGOv4xBqhnM_?FQm6Y{uP!S(4w{#X%2I~N~CpW3TN;m5gXlQI*S`s2-&2IxARmKO-JlEEty!yE4p(l4iVJ@bK)JCtC^7k zwS*((9k5sv#b7mDAYl-C34?HqJ#C%s@ODDITAI1y>>zciyJVwhR@6GX+TP0N?DN|o z1TB({6TX$T5YcF;EhQRyrI%S`=0%wWoGz<b}f)8?uQbhkXXU7a2{r<$Jb!RtIu>1jUBvhJaxz#i95d*&2@1GR8adB0!^Vjk-1 zb)hfSZhD?JpOhIuc#7g}D)dUQNm02a{#fkxZ~&?sB(b9>m3YkXCgZi5t7MrAmcH^1 zZRA95PjaLgqz(+Ys89Jfs2=N1NW%s!k%RT3!*IY@`)w-ec%B1mbym+dGqTUY6}e!q zljCa{ux1QOaJQlsSf8S%V9U~zveqULb zIuW&n-UqW>Jq+{h*y+2@s?t|LFP2zVh;(; zk-7XDibWgusKfDrF|EgB>Y`NJmYlPKnfnM~@~*Tk*|Sn+^W@#p$PSmpYDkM3 zGh1DI@bOZ*!I;^Mu3q2_-VbNFB$=q<=R`3nP@czvrC$6Lq5S4CVq!eqAt2qL`#|Rt$GQtQ}(ilRo?jTEcL` z(yv(tF@~t9W+Z40;&Fho%<7jfwqO8%JeiwV9jFi%9h=@kYFU1x*) z)lTA_{rPa~$&b=()uxN2n9-y6>`th$G@a^V&sluLby%9SdD+&^8=Mj(LUs8sF7kE8e!b~R zB>7b?#x2a2nJl*5f4mI>kNr&csOS^vB1u7};Kn^5Tw4a%rjue})Thbtfu zC|*$4UNj?ZuD!v->Wpew_Owk+;b=OOnNLEY6D#}LzvyMfY!wyS(7xo*Dy+O%1)I&p&hn^v)L;*wdY%2O^?dH5pb1HroHZU}J@NnjvnyTXug=@(P z-tFq09P6l!xd4lR)A0lu44Br0(4y31$`s(`&u_Y5?K z^uc~$zp>^;A;S=ZjopDBcBwF*AkqQhkRKC&0ssv6B`123lb^Bt*RwYZu|u#8a@b!i z+R831+p5~YSZ=Ti%C3+|^NX54l}@o+*w2<}zW9<_>M3L2#D3y$$n+rl!OBm){QQBR z2eHDb{7jx?>-1os?4&NTllr#tk?f~rd(|%)PRb1iI*UG(y^!o+{=m=q1Kb?s=5N`M zEjlcpy1Dse)Td5DAD2JJ`+-B;Wjx0XCaueO#czfVc)#C>6$=Yg(j6u)bURKuL-0Ar zJ8x%86CVc$!Gl@ia1Qp6sUG9qs@Y>UsB_5FHVPM(?Mhn*^aiE{_lDWgJEbJz1Pdq` zhpIw2j@@Kx#V_lOBW5YNRtAo!vubC4Fdp7-ycT*Ny)Tf)86_Fl@D$+7A~b|7+_23k zqbM}$+XGPYeB4unvQ77fWEQyoG1arg;R`fqQr>eg9D~9-_96n0_}jJ=OzEVj4^{-6URb-KhWvg zMNjZg2a&L0=#!n<%aFD%%8*-k?8HV|62 zo-4kPrdVkk;1GTiY7@sOIh$zUPeO;_&wf&eKMmt2o1ge$`>G$(1VM=>et0PThiyje z5$@A5vVzysK71mz$bnoJv{E<@RVp?ykE5i)<@SBXX)GSRV$90aOMB)%~Fxe|UaaW}L7ew>6p) zC(@|Fm*}wNuWBpswr=gEN<3DTwqsePZ@RfTI~ew(5RIPg{jTj^?I^CnwCg*0&}HVg+ngGPQgeu=!UQH#a|g4J5eH{TSz%x8xHC z`=n!FGxYXdV=m_$KK}~&x>Yr|^m0}uaKKyuhf{|2HQIpnoi1FRNz4FFINUl5`xxV9 zJzftR3TeC}>%O^Z$#)Q{$m+TL7AxP4m3*H|`>il$ZnHd=*goimw`+F7(39;VouGu3 z0&x`VRlErOeOnvID@VtYnU8ZOA1mK=-|!48w-6m_oS54018=A5zSAa|2V>($^PkF;p`f#qcQ zp^aU20=9D1?iR|hl&4>q3ej0MhuT^a9w4(F{!ser{~4{J`QALd%!rfodAn_QJ7>8) zZQT5+F`X0M`cGWOoDYoBcH^#7OOlPuzG=CHYR|;|@fKIl6WYYLOe_w3 z^0Ix<%`0hu_aiZ1Dm#`B{eUrxRmd()&WE~%;OdDT zeDu$(B`ye1uup9_W*!#4^x5aqfjw@gDos~gRn$IKd2%1O@oCz*YN;qDPu2l^n8=x)C=O-%Q#nQSJz*hgaRkh1uS$)9xyt^fxR z@F;({g4)eioj#3#jojMO>@Miv!vOlh?;?1G6*>Z&@-R%$kzS;+urr-V#?O9k+_g8_ zkdESCcq^PA2ExW&$fg$^m_Y*JfLi~+jYz9^SA8u}&E$j8yw}mD#;@0e0~}6Pe=^k! zzvv2gxq5O-Qf+>RK-ohiP|nL%bahD=i!-YAiAaJ7u0lJE<=vBnh{$SZHAk&l!s`$v zXw`lmS?ymz^+;y-O$Z`ZnROLtYBJA7UH|ST&<7e|J3Il4&>sY`w6zmYa}pj+QM(*@ zJhuPYgr{0tBU(EEC!aGD(WIsn^fWzR$R;ca30G+aS<9`N0nVFymt}~aHNqDgLK3DI zQ-BX7>a!gC#=*Xh>JH5yv(w5H^`$iz5J4K5T0_WMG^pZ%4y*dF#2XEJ?Z5?fHqg%* zeX44Twk4}wEDhD@hY%kDbrjnzu-eBL%Pl94sq8NbG8O?`ulQiV6zuToBLw zD4+9|k`Z`8du$2!S;IC|nDx)kZw z_Xa6A4P$YR$iR!=CvkF7lOg9&wgO4D<^Ly+HVXpnR@w?$y0GUkEtSRHVuQ0PV>x#m zJ>ntRM)p;S=>dS+}c|~iGBO|k_zLI36`N+*#pO;Iz<@VC0 zDUJfW{glI#^w)kWM$s6RUR`Ik7+zL!>YB4bJRgD=mS;7UW>V=C`}PrT;cw(^4!6bP zBa#Y?)om0(-eS%`i;|Y!MdhG{cZ#Fc4DgF^PL`M$&XojzrfnGKu|E(Wed3ng_YLla z3Zu~|!C`zq#xabT1P_Eo-!>H+dlWG8s;4QavNr>o?Opg3rr~6rch1NphYnVOhag|| zQ*NF_S>zODvElG#JcU#*TK_pw1nQU7;VX32g0V0PC@v)-l?Mz=SsvVr3u&>ZV>_K1 z(dL+_T%{VTs)f0*^V}j*dpnO2{ht&d`84L*9v#qhYHt3+M&OUOdD5pt%mnT!<+T*;=o6D&6w9`lnofZynm-x1S_FWhVMqaoJ8v{ zhIdnHhA1*A+yd5QJWtcB=8R}Ow^Zg092kBF=>CGgtp9XEE7{QNV;lr}dH)IESj8kL ziU!_aV03$XcpE)W7af>9W6dNR5b18}mdMu9qs8M@eaAGwBAB9@CNZN}?4GK7Vt&T8 zDQzU0qFN@2K1Yl3RQ)P6TB1NL<(NR0!&G#f=|h$g{jtCj$noScq6_7TqwQ%I!iiF5Ya(pn7cm(*}Bo=i90DU2>4zE<201d5Ln3YpWJo^R6S;473V z0pweTz z70s_N0`#g;0F@~(0JTf6be?1oI$(1J@;F_8Oh?x%7(y6;wa#cbejOjY#8 zytNV3!CnVZ8wRffjea_etdiH4u?}<%uGb_l{1P=SWQ@~k%z^|+ja9p8(7JWghHAEN zE)U;7g|8QHkL_O8)FCJ~)LY%j<(GC+BlLf#e|6;if8D>4coUp<`TqPVe6jljnsBfu zDkrn(mC)I5YfkD?3d;xaqzHqf2`oI0Ca^i{cp(&)$*n1D^}37Gn2u1`-zTW+9JNi` zV~?P(8db>U5LskO8m)(kZ2RSi?C(a5AuNj6Iu)`2t>)^o7duy@i>~lj;M$yPGcmd< zBbL@D-oAw&viFFI{bAZD)`;V#gXKjJ9hy2R$kHbZf?JAlqxB0ml@bhmKmAtDMpeCsyRI7z82QB8j? z%&U>vWHdA-jq-j;{p>w(V)Zkx@q^vQ4-SgEjd}aoMm~iW^ivRZ!cT?|2IDl}<|#+C z7mm*7(c6GioLud-x4xXe%({QD{Z*W#vnLy3u5Fi+!c~oCth*A7b@vcsjnK}K8)(M* z?vbZ6=m$l*h%n;T0DpUeC+I1(vgS!$n|y5`V|AKt)9r_ch@IodnRqg*cH=Mx^&Qfm24=eo4W+ zxMnkZ5S%Gi-t3^2ar1%2MU0_@ClduWja=mC7AvPz?qC5s|B8?93?l$vsS`*caK(}& zO(#yHoJv%2>hNi?S=ey?wrZ6)G4XZO+)!|vq7~fuwVgnob-bpGN|Sxo$YLT!w-ns{ z1KY7FB*twP;dC>FU>wLB?oEgEZA8f$E2=pp`8zQ-__L&>vFBO4cpj-go7lLZ09VVP z3?lF}9+$}igOrY??87LMA-Q(5@s(3Scg!xl(JFAwVWUVm)}d1bbu;M{KHQh$tKHLB z=!KdmH5Q5`fb17Bb8ak5v)`r5yT-z7xp0WF;4MT(L*;P3F}4OV}1H3d>Mbo*s_USmMLj|PB4z5fJD0DyF!}-38+$HinvKEwR5d9dB zf1MAi&_j}&E=@v1R(s{;Rk>4B3~Q`T=_h5t^e|Re^?=%-N*6~<*Pg&L9or5lC=HhF4k%5|~WYXW{ z!`{l7kcu>G&Q$utYIDET`MNM8^BtYzbLQ(7;7(K1#UxpLy8PXH zL(|=!qqgvr;j^M5pHSm*xhAq{^8VYY%UDtFNy1kH8)y72*i*i7x|f$pogWJj68fh?JTws)5i$Y2(z2AsSUUAchQ?Ti za~C^k^I9`oIo>Jl#%rXRZO-zb^@3dsc+WA93cp}JoUUFiAdC5k7eg3=1FTF+p*313 z%2>IFBGGM8EjB8#kk%n9s7tb56*Vs0X0Q&gm3p~8WnY(-BK2Cd4}sJJKTP57INt{T z)k(8au4>oN$l5n#MxHegCZn9{okyT$t2nmEDV>O~L?!ZX`?=YZIJXnk#^FyWE>`xS za5=!Xdf8G0W0jxD(|Ml0$@TXl5^L-Y|17x8)IF=ZNg;h|MzD$>usLRUpOy1!QhH(& zt=4NT soQhinq$6qj)WW+vuq*Ch|rdaM3s-nsA{6JQOG*%hc9K3IFOqGhpk5#aJ zj+Hh+RjgJqFF>-~P3E$!$y*yk#~Hq)-^sXM(tlO)mb%dTQLwe@`e^9*fLZaD%*Qj< zZLaF$dQnP<-c-y_iJIuBl4n~_u84RqfJ!>e5?s`8z-doxH@(6OTGckCRYuLb(M6;E zp5Qqgm>4t8;T4U8yYGXbcw@!sm>Q*?#h+RiJWxZ-pj@Bj~We#z!WW072 zZsv}S=e&8DV49mObcVZbz6!z{uifoZKNl5zf{sks-_pTJ+=P}DX9h{Hv|cTmN(}N! z$;Q~k+Q`@#JI^mi2gJjAS4tu5_M4KR@*2BjnI-U+#%p(svAu>rscXPEq!sHaiEeUm z#Zg`@o3Nj%NNiWt80(_k8+cCCkhDD5xY#QKa#P=ZX4ueKJ`=jDCq{vj{_XR3s)j1#&QXILy zZdF>R_H@n=#S9>IMhB&M){JbJ+x|F|59%rG{ZenoO(^Fz#>yQG>Nq4rOc9IH1KU;E zkjde@0S2>_bB7nr+cV7{yH(^60_15ZRB#~KJp@3Bje?5IbZv2XPa4ty6k$S#7XPJr zEvH&mnM>V6oE-lcRUz4Eey4XRuiWrb&CL{)ZE5Lq5&_V}SGQ7XhDo)c>+eS<*#JfFfJWyI^uuX-#Z5 zC!L6sN;eU7Y`!lyc> zijBtOzY@S{@Tgu5pmt6>zMnd(d(uBZL^3r^2NL=*Aj;(gEY!U?M>1cHt2XpltUFzt z`Vv4`< z@4x=_ucfX~7qaZucqa!dFRFVoQ1I*SIj7?JaHDU^s%T7a?rCwg)FS*$3N%4|0}TP% z73u=%U`Ruo)sl2I-3G^!C4$JaGtEcA6Etszfq=WaXd^Vy85Xp0@lOU6Rnz1_;IQ~A z0<}z;s)|4oGFTO?^rSJF++8lxU9E|Igcz^FN0RmtrrMs(8-zV z?J7aQ7AZ-Pr#Z08wOzC=UR1L^>QS$n=V!;W!hpWRft}+Ys)>%R!K7>>#geX%o1s%X-UIw zKr57(2IB!l{8VzZ5uf0K33EM)v$DAHcAd74whEHRssoL&h2)@(Nx7lr)(?`^J$_b` zrT=J#)^%h7Q%|YuBmm*i&DD8c6#z)f3oNd0OeFbEYOX)!T;O>RsxVN8OeGB29rnKADB4Mc< zK&|SRp(ufT*$1NFak|V*JZL4Woq;{5hctu2JEg(1(pHdqdD6o-bZCkN`aP5$XcpzE z;g81SqDI6UvnsC83C`wz=Cjc@Ye@38Riq44!!z{PV+(#I1!3<{($^o}c%#SkZ+tuwt&m)J} zA3^|q)^r!@gHUaj?=Bq?PWoT+qUa0?!z7*G>~y|C&CYa|xQ76vUM5P~9pct1Q242- zdn5~3X>;dipt_s#ILoSg5_>%-hT@G1BFV7O*5{DKw=MYp7j z^%|C1F{B+yI2^=!&9=JPVb1iM)6-}#&e?4KLx$S5tuZ8mSUi?NV65V#G3IocELPro z@)nLqHJJH+6`K#t^$c29b%WX&-RW}eK|Sebb@^&qoY*lL}-=d9`V7j zSgVp$_<7^C@Tx%g`FCZxne?`dq|<mYa-AmrjkHq`a-)zHF@HZlwoNTJ!^ zM{~5*(HxC0z7oaJFApWqB+gbMty|rsFo_c6bCgJz{8)y*2yc#EW>KcjBly3WErF=_ zYy2v z-Bu4(`zwiD*ZkKNHOAX}^cWB)o3 zBdgd}oCOdLj+CyqJS(j^E5~46VQ%7mlIyHQoO<>NPyE}SdSg|Cq!ly=^B@~7r_^Dg z8gZt`;m#|hte`_AfLEm1H7FTF>w-2ChM$exir%sLq@W}gG};1(Luwl)R^H#*@oPJ{Y}X3js6Y2uGbGPqUa?d`UEH$op2rx2iF`BI}%TcWW@C3PH= z!k&CYrU1aiEHiXS;%SZ*L(xq;S&#J6G*lTkYCr4K^*Hk>gq;W+ko9Sbon6gJ5A27L zPY|Psw183OHgw!=eEgc=@w6k(HM?ZWPVMQG2LLIV-2b#D! zlL7ZF#yz;%Y;bKB=dz~{k`h<2vVVOZu!zW`nWXKXnz|_?0L+&LGlKrt(yEza1&Tc4 z!2yv_c=-|S(R-fm8 z&&^hmhLFepB+`;PNh3Yb2Ag&Aoo-YfWy`nBvl^Zhwb|GY0a&o~P}S`FjQ1MG0Rib^ z_>il|EO~ZB>qVanW$>!IY=!04k6<*ejn?I(xx535F?3_?4l7Y%o<@P;U8-%8_N%J2 zYP1ZB5OTb1zLO510(%@Uo2uUSs0qWbJ!W;L+RO5g}m{$arU&zEnTN#*>uLR<_Mb>H)A5f!cut_1ivv<1I~j3I#hw~7p@ps z2;#=OO-@SDhgPMlv?8mL5@ z4mMoO5L*zoMCydXC6)o>@yBR{Orz;+caNL*WDXMyk;v_l`FEE2rZE7zBGbG{D!emRZ1X z-Ik6GK3qE9Gf$7#zSgV_yFo$KlxVh!PcvRi#-;JC%&b5|3EwJ!P9-C_AQSN>Eru_$zof!D@=``g{o&m32|J@zDa+~hhAkgXhXldGpNOOBqx zZkfXNm^aFpE3D~~O+8)&RNffX{1rixWwc)vI9FW@KOcI__<3B!jL8y3 z!v3K2UQs4&Giual(V;$xx66x&_APCm59cYNpHobB{h1;Wz}Haa<7IpULzAs`0|H5=A-smHxN5^J4)fU*C1%j@gc`S ztT8w3GfR&#ek_sOffO32Cx#)Ccn>pKW8S1 zf7-WuZLe#&G;`+6InUqwd7k_4_vRcEFr!lb9|LHl$1YMNI+Yj`@UV<-Rxb5u z@E{&u_4y1ei(}?=bU(GPiPp8U8=y&dj)G!qK4+q3Y|-rqXP=M_3{o~~R8l~b$wg0 zUbaqT6%eIGK)E-Lkz7=zylztXR^)1DeyTG&z$Di0lS#b8?<`6Qp8V%h5yb~)*^6Mv ziEttK;g|l2_REu6`E9n$%{8;^g(yD>?Ehuz<^6vvCCyH635kP9QlBhz-Qq^opQsM| zPWFqFwJBxAULw5EMl#p93kT0y(T7nqg3LofRJ~8DemMsf-99+|$+6c0mzNI&&$8=N zxlbyGk0y33_UhzGCw6C2q2#R-4!6B;uILNqV~i#NFlj+%r(65yd+5O>RXJpOAu+vb zZI3Quls2%21jn7E!Ye0_tR!wBF3SN6K7i(NQ~1lgFtRdBWW8PKI?`hG5IAvtgF?V> zXNJIQALMoWxC(>z+32BshkOMg=)@`{EUM}Kb6>Sz)x%cJ&*(rcMAT_DXlAs==*Xoj zXWK&p-xW9ZACZ(K^DbL9#=bDBVTTEtiKE9FU)1Q*-wL+SataLRj@8Q_aZ{^v@D*3L z0e*;Y-|Ho?p*x1=d_m-G1X0{53S-?8q`^QX8~}KMLeX&dPm}Re-GKC6Eh`i{vYgR7 zWE{)QAnN0pyeFF8w)36PzkMwB=5@Yf?Qd2$iy1EGIKd!j+iLbtW=P#s$@EO&ix!$} zS<;E}R;rv6e5K-~;cXl@k4GhzPxzYCx`_oud0*=K6;{Vh-AH$mz`X-)&=x)!VRpAY zMBo>kOW`2B4z^WhnwprlxPt@g4?UFQRr-!iuRL1uLjS#qWCDYB8>w4p6d-2vnwEHBEQsE*u$7T{T_|WX-dM)8o zvtpU&xRi@l{TnU93B#AK7@Xil;M0eNg+eaJ$ESXyj35^qJj|D2_~YR=h@yVu4E<%z zhK+I@7;mOu1!G}_&QKa~>J`Vtt>2TBNl)r)<&FGcXT@oDr^q+N8Wg!FTDd7{^*r@mr;GeTA|F;wF0)(JQN`kHvCskWuu$^ zklmbvtGVlcXuWfp4V14R0-PT?2fPXPJgZhDYHFU~1?Ew^)v%d+?{C4vF)d(JtZW^W zL|deTB=N=mbR{lcYX|WK!jWjLBy}q56zu%8+p$7j<~8rvH1Eq2BsQ*rKm%zGq-v@c zH3;V-U5n>{m6uK1UpML-XTcOlQyhp_fEwAshK%@?*v`s=M+O?l9Z zoH(+41||Z@gJ7}?@EEcr`YMF)n|;q=%)z4=&1djn1zTa)Y}0!5VZNs6k=Ba!?{~<; z&(E2Y=PbA>I&{Te(REq#o9sDx(F<2d4E+L}&9!k*?3{f5ESTXeolEh~ngSARh_QC* z6gfhd&WH|7!*`y8u18$D49J+jnzkDiDynJM%i^Cz7zXjlO3brKZiSUYcx*U<7 z?v4F=b5i)*&YUR@^+^)PwbIO`c~VpPrksP)niiYJ`ImY(Z0#ql#>9 zWb(Mew2ZCWQB^X(rfLhuRX>}ZD)_QhFBV^E3j4J)E6=%ghCS;h`__DCR)IZhuA^Bj z>|67oAk{8nv79x-t8`XD_;UN!o8(qL&sOahn=2Ahw^but7+beIQZry++X(S>f7TT45x!F;lGoY<3`pFjI5GVF>YbC@%x%q>=s{LOua%%`p=n$ z-o~@5p7Z!xt43UxaY$)+QH^`>f*RoG?O?64gI#Jpu$7iOcwHEG8*4i{*KRihj{_VS z2izss73=f}Q09VjuB2Q~k()u8v(|t91PWR=?@75C{!+19admO<{ECI%j>wsfA$S>* z%$Sy%_Tsd6kp-W6kwo5uRyhXeE3I4nEEr~KyBY108IF`cPiX@_Rg3`SF1e~WNVY=o4c!@g2NWu05`^fDGWPEwIxH~jf!zGEOY2MT^5M3IV9Yr*%G zDoBSdo~^$Ph6ckojVGx{w|!PzqKIxJe01zs$Ot=m)pp)m9fr5nN1&ktT5v)iK?7C) zQ@n*fK=3oxxHB%2Y6^MPt(acShU=7nIL!;Kv-*&B#*%*U?20eb zWtfY&2Qv+J^E95z&0C2HI*|T($?F!l)++D7a~U;jAlmXC9&fSmmp@3~w~Qxo=vy&! zab_-06&g=9H2ykM@2mzQYI3cdG*-hitQHiFBbQPneX$;V3_XB5!}Hi6Z!i`M5>4F% z%2hY4-f6#Y*bRRHpStIy4fLEX9{OqVt2o)>|Gsgn!?UV82D)X%X}WbIA$<)3Ngo}) zlvB%kKI^4*Ld%Hm;hXpA>moQ?)x)L`$IQG~dD(u#o;MlCyp^a~~y^ILDQ&3dFc z_=>0wA2}#e{3DI)O1f%Fc$?twT4p^n(#v(EGLr!9!N^L)?AM0qkC@f`-x7K&Si4LV z>NvAJAq9uOzsxr*_lwsp!}l=t8f;7wggWYUmOBD5?`6-DWDINOJ*}&joL_6^?bgfP zSp9?VMotC^h^NVwz2T*9o;MkhR@eV@Vw7Y)&^h>hXWjI@GE#0{Vu+6LZqB=7`PCNx zZlUoOKgtVndwg0x=1|jVsIqqCDJI0r+qR$uau~YQdhpRp#uEa&sQ(t%{~#T;&&e3N zc{W?Qp@xUXQG?Kf`qm}r0qTg;15SK!m!v0Wqq7=Z91Gw&t+m@k|AZaj_?VN-|3Afm z?8j*+#Xe$u)=0&8(Jii9%MXzi~fZ`d9d^=NKj;yes6SURx zZY}8!(VG-hBP93w5X~Od`kiHVyRSpn+0U18pymBf8OlN#N^zwH-GjkgCxf|8M$pj_ zbmX#5FR?D91fOFt(KVL0hRfj;F`f7dtuhzKUz1_vOl8^~CA@ z=wF!LWwDK+_jlpT`bud+;`}(m*&*AJ92=2tjtWpMl}wV^1opZ9-SVY?FNjED%13+I z5Rst}ITBptU=PkmpW)QH%!@r!>Tz!fTtdX5E<`(Q& zhR;o9J!sMl(vpT{K1Q(H4RbNffjMq%8*yMg3;bzW;CggErNi`;jM$h{^dbwqq*v?w zTk7nK@+bGDxaJWBCF;w*O8)Rj-(}~`=jA*E`>rhicx~rf$9ZB5DcVChY)IbdAAxg8 zUqkr0oBks=?|_^4gq!!MJL888AP3jHG{lZCz@0EbdR|h_*uz=*Cr;!s=QE&|ay}15 zPWOM~FHx&<03TYP7-p7d$iytq!owb21H5EDSU_mJe|TPKE;<67MVHl}hQf<@U{|JF z4evnsc3X7NXP=0k@lA?Z8`ys&}v12mmd&AKpWvt;v1wEigA_+E8F-S zbm|iWu~QRV$#?mJo3TYkNf)d z{AOt%@B`QhB!+!T!%WVF*P@lZNCS^CdE8r8J#TfGJ1H#v+{ViaIlzu`Y_ms1az_ib z0{<`K>E|>ax8F*;8`_+jTsfE=!S`%P@Uo5uL%rcCFd;cHCxYn!PN4^CK#80jqH&CI zCXF~ng?~-X*S1^8uN!(SKN@<$&x0iHo*rto>aRk5(D(0*w79)9=v%pTLa>FkIwa4c zN~R!jNn(X;UMMv#Yg4?oG>Og-4A|E;10wSGOY@`J$NmMa&me)G~9LOo_EW(sllL^jJ4$ujCc! zyD{62OpoA<*mevB(|4vMg)eQHnawydr@ehoadWi&@pzie_~YWT+biWILTXq(Dd^%2 zbZ%M7m@t|VVrazF>vNV9Zph^e_{Xcm&475qbh`~2I)h_103hh#*9!27{bKd&vN@wK z6aS1xHg9nUL9&x&XJs396%ZqSG(j_@H#R{t|0>V$-p|CO#m(P|YWw#R*YY3c7sKm< z+c6$)ZawAWFEU(7ncqB&V+g8l^%+?%Ffng~KyHA+aY9*sUhaqoi8_}geiCn$Gg8x0 z&Vl+`F)8qcZ1a2(is$D8SQrHM;z_b%ILqwkRjp}cBYS1BUv9bo^F~D*4_Ir51 zsNt8mjmS!HHr><*-SmHuAi(0wik+pC$z1E)k{Uc>&Bq_K4o_~)Tx%6RXCvLS3vC*; zSYgU9Y{f-j*bmlz;S0WJUH>{DM+9}GwpEOtSnkSa>{8+xB4xL1x<^g%09_Rtl z<@#~SKI(;XGh8C*iq_6MUJH8>{+1y|6QL;Y*_E3_mq%g(Fo}r{miX!2DfD>7RB@qb z5&OVm*86o5S-ga}Z@#2m7bPhAAodCXi>8Zj`O)x=PWgtMcTuX9>_8DWy4rLS_ z^?fzF@83t>oShunlwA12^hj^TBQh`yPkd~?M92F6O6;AlyH6$!LI!UW+3qS0qWT6D z?H*ZXi;M{jC4F_vRtY2@NOe{HTy)QUaJBbLLzG)YdgC5rZtUd2r`q`8Mjd7|*!I#X z@xi8PYCsT$1e7rE!D3s{?meTKU7I8X`6^#WeOIA^qxLCxtu}JweewVnv_tNUPgalk z5J>hU@y9B>;QDo(0fO5oVMlvLkkSe7a3$=?zR=ET5Lwum*$-Y+pwBsI-39_X@P zVe8oB&e(157dvgv8KkkC{jy)#=Mfd{{o+bx;O-Gh>=(i7v-f9k@BAzFezB^9%P!j0 zil>Tf_24+*mv)z@08F`m8o#?w%MJOaA%f*X&rzW>8Dhy+5dUuFn59v6! z{)4?=Z29hLpeQ#$S&5%h4=#%Ug3#ma8v(cR&D)zmboMROo7a%)T9qx8b_r63cl5RObS66`(Cgq(qW1Oq8FdL#f|Ez zIEqwlT7>qq4t}MMK-W`N^C@6KPT|gBWjBEkP-11jVKw*PVwLqO_jcH7KKxVt>ENRv z>RF|StmfxOtg;SL9$TfqLIYfV;kQVPD}E{{139&&OqtdTU_iY8@%jQ*U|Ai|EmZIZ zmG)buy@^WCSYMQwsITtB>&ut==KTfg+w|e}6-j+d{sQ$qZtB}J`8{RJAocpXt&lzx zUSB865Dq#vGxEA@8M}G*68UkD#3zA^II`Y-vKI=3>Z*rFxVZm%E^(kd5~n{|I#*E^ zi={LMd;RwjvXGY6>=#;<^`jSaZV|Ke$Tg8CoV#}OhElQ~zs7f?cG(LS|1CLb z<>)Wew^1gaCLiWn1z4_+nE#guE~x(QsOzok&u4FT%%Po*uhWi}0y%_5EQgQcqrjKy zeWrMyFd2Fug453o?^6g(p3m|=Gri9#-eR@A_c_n|oa=oS zd!I$#=MwL;R6f~H!S{(ww4C4a&G3bF@&o&;cG zUAx{~9kOdTm@9lwHkqq^cI{?!wcD=UYOZ$LwU3#r9d_;G=4zW=yUkoZZrAQGSC84X zJGmlq+MMV`_f8(!CES~%;q@>kI}$8!w6ZQ~bubR>(dfAM$>?nqHqx7qRN)^01qR3! znAp-LfsE?y|Cmk}P+J~Db`{J;Ifzhq#0<5q_yqVojs0IRk0t)bk)@a)<&5}*Z#l6= zd^xB_qxhL(4FN#4rHpAcoX^Ov_jsacVS=5iJPI{|aazY)>RP>emAqd>yCDf8M|bi% z+EN~p^cmvIBmaW!0DV{Z3?KAPwfN~c=W07qIIQz%RcOL!_nSRRQ%SRRQ%SRRQ%SRRQ%SRRQ%SRRQ% zSRRQ%SRRQ%SRRQ%SRRQ%SRRQ%SRRQ%SRRQ%SRRQ%SRRQ%SRRQ%SRRQ%SRRQ%SRRQ% zSRRQ%SRRQ%SRRROH6-Q*CDp7=$`rG6nKKEbGOI7Z8GR=Id72+HhPY*i0( zM<^$<3D0DRX}T*i2+6rseUZ2wd~U^^R(8A9+>V!oNJfUX0hP4^84tl)Jrp3NB?qK# zwLg^+5TL>(R5Bpk`k+UcUGsG=e8e+dZc0STs z|G>0mzd~tj-(?y2=cHu-;@uQ^HCmaH#5`LKHB=c@kdRC5wv{lJ3jXG(=ap%!h0Ubvn{_C{7;hNwnms z2x-;FbX46|CevzumfZ)Gx*nX(_Hbk5##{3!2hKqWZN!#6;x&R-78O*(`y1T9H{=2Q_0Us9#JHP)SSlm|G zAGq^FtMpAPkmrC)2;!?%+9gs?>2IvkSD2y(4n)wfv%4zxB*w?nEOD)Aew(+@(@YVH>gi=zlkOK7}HB zAIK}R4ipqkn3Xf=6sC5Z?&wDT7w1+1PZ4CE5aF;S>glp0NBIrkbnDu^SeX@9_^<$6nE{^y|35oeXe|3+0=grRvNV4EAp{L;BBAxKzxrV zc_EpEeYoVMJ`D8hczXcGfwXI)F@>!W{a~;ud|l2MxEtXY5zTZvxB~I)*2tSsuw>q< z|2Y*iyi9&qvd%oyL(0x%3}~SpI3Ga=R_)j2A&mX2vJ4B%aCbu;99!6|JMrSJ8`&ib z9wR6*K&>N@Dvtrl)QQSiE)(>c6R9CZd}OKXR}+|6XH#9F1N*R~Y{0Sd$9Uf3idatG zqXa4IkWVj9sr)PN#EA@yI>@t$Y%&|u9Py6ttvKF)pOou2<&wY)qu(&`4)ck1*(Bca zKI&v!!3A<))H`16v=kGcUHl0{o2G|SDzE-vmAVVgNsjE6+B$cu3b8OHr?veJAI>Lu zMjQIAF+m8@#X3_6QBn4bIxO}@rhc|)Vmnz`io3AeDavw|V_$=ga}Gni?%aHI-o}=M zw{@inb4oPO6nU?2B(iBFvKw#ek)7(`%;j8y2xt@E9#wZ#Dc{R!u7wP)RdHQlq#9Ob||tmfH!{tJ$;FHb%|e<3yyudYQ_& z+0)p_HpO0>;LcLBCum>%i<>>M0b!M(RhTD9PBm)pEHNErqxvxW<~q;5NgRyix1xZ! zeRBZ&CaSp0h#rN0D_>yQj<;|ABj@Q2ar-95&a}@Zm+Vfi+!SpT`(|NRuy6qTCOKbV zn|iJ7?M~%-fB-RoBuj`HE&Vj>N9>z_<2&y=F<0!HoyNWi0!h`=*SB*f&WAE1P#^O2xnReTwQO zY{+U*n+K+tA#a8g^9we~`{s9pJ){;+oF}ERRWfmL3+FkpaK1hPqmIriY>+pvcukLK zGCQ##^MDG=v|JW?LA?W<${OsOOizS0i<&tRtts{nOq#fgdN{X>n4eGiF8W@U*?Emu zf~fg%tFFPm8De$_b?LN+_{1AI=d2T1@08;whIiFqa!3h?W(SzBHiqOX-!b3NtukM` znXgTLh~3PWXWw*1;mr2eW6zxyM}1o_pos!gna@^&mSX~}hA7Fb?KtLNa+L8fFsO+h ze~st6Fr&nO`w0BR-BdLa75v0kDZ}8MS~YS)f~A=CwPzAVu)Y&vPHYw)hT_DQ*#<-L z8!7fT1UG()J$oK-r%W;vq!Ol;HhT&isS=qf&?L-D@%xS6q!qEJ;XMeCBrtp&9sYY27s zSIl+4^9RY2-Ke$Zj%UXW-t^LW|B-^I$IHdrQjj7{Vy302-AbE6!M7qOZzde(8FCbW zqo`oPH_%Ms7p$q;A)xf5hwf1{PeXqO4LfdUFCesJURFLGxXHPX91R6o1vGe?JxB-{ zhk*oAz~$|<;iy-zOX-* z@vg`sUvcdQbD7Vjj2CtnV9D_)!#{$TX8`9&=*wicJizPuvDYu*X28le-C6uBK`rUT z_ZMeP9y3>RnUIg#)P8ZwYI+rEvEORyyVNQ^WfkMY@=xp`H)6pClV8m;U;!MO~uiE*`K-x~)aOwTfS} zN>0knv`_kuNZyCTQhD&8G$Z^?P{OolO>RMLlJxaOsg8bVeSB(#@nPosWX)Do-eFCJ z%9`4#m~nm8La14Uk*J${uW@g{D%PY&9ahOH8o?lB`iA~Ka-jAdibz}iCB~UPRY{-X zWy>c&7P3%FWzv%9<+$Mm5pNX#6Oqdy z;g;q z#JdI7)SB0%V00$@WEjj7bUalfY9uW~*-sdEkw? z-YKu?FVj~f`-z;;2V3+BswE?|Gz%mM6^6-E=8HLBbp215gnkTP^xJv9XdBW<4RKKO zW1Iy~Q3}DQod)4l`KT%&G}F1ecRhW<^|9lPXcPIN+j3rvR%Rqc{@w|t+qL=lCW+)> z2oF8!Tm`?pM_iWpH+sL6JNA|W{q;WnN;_SB9e7zFOm5WCV@#sz7z0Xg8#H6|I7~!z z)lEs^@3NxzOV(!#;%ks5=HRXN|$a@};0LaM~$ z>r!VyiklwDIh;JlpVO+`{lLPa+suwz4l5t9Aztw|W$qRK0;#s9f1)YRF0T^m`*yYi z)bMSofEVl^qM7zaQ3hKJE;=Rq?Bh7|m+bboG@Bh`ds7r_$nHT+leaOGHrp?-EPp79 zL3{8qJFRjI%#(Qb2 zHT8r6c&~kS^*2UKcq#repS;hBx0HjkJZ9eSzxBYh)=ME)8BJ=2i>@Jayn2PmOp_#y z&h>pvdWhYIcHyx+uFjR~`_rt&a^#NQN8mF3k_?grJ*~b0m|Hh>ohf3pL9{20_MlQN zKa6^4Zsg7WiCPfZq6yx4MjB)-cI1P{V$2NNRh10gy1DtfVmsI&O|rh0+M_g59`(qC zM^*o0)&9GAzthSoucLSa2PiqY(h9reSU+NYuMuLn*Fw@hq{ILvjFv|Yq^p}6s#_8E z=+kPbqDYUrmV*OU1?9~L)aUoyX1N@~mF^ZOZJG#~AYC3xo@MB5AvJUvaw|C`SR-`+$SKm!$26E^+Ae1Muw2>BAtv6&s_iY zuDYLz_lkYOepiH6Nlw2}HLAcGllTUmgSDYK^LSlkv)u&iL8f`^A*eYxdF{|P(suj7 z?ZcNx)_^+$q3t%9SrLzGZsCH4i8NGOC(SZSx8rW{`hZ~k5WsYay>TwTkRL0dblA#S zZmX4$J%~A~qSuf~TCK6r>R0?YCi7Z+C(5bqW%uFP9p>49kP=)#{MlB1^=#Fi_QX~n zz)|m6yEdEh1c*0PgmmLfS$NdO8kw`JQ>x0@|G0i^T*b#Isp}Qx*d=ue2_a^znJnfs zb-FQI(TD<;$F=-cwkauF%Y|6L`9e2{Mrf!P@&Jlakw5C2`&V;Dok;w!EeSGPFlsCl7up*jG71`0bl1W*e~E3)CgF! zev@{>DcomeD=AR+mV4+$ye|3Vp14Al#wb7($Yn>Y#k4*qS&)&(Ww$d0&5A0e`7vQI z0zRMunxmmM|8%kR5vsPss{h{%NuN&_lA%ngi$saB)0cQlu7Jf9+8Vp7b%K2)_Sz)` z(9y!A_bnnhNLdiNK1SDt5D#q?36d4|{#7GQ@?0HSLi!Aj>{iZC9_PNjYnA*}Ta>-A zQ_D&FItfA5M9*TWlb3VcO?-%dW|x#-6tEha#t`^Rml?}Vq?;dkx%Ru#$i+QE=jB_C zYXpEw6yaN}Gf}1b-ZV?wI8D$?mn92B2@|@NG!1*D7Xw{}=Mh7x3}!7)#&4 zc6B>mYo)?$Z6EX}T?#L@+n^e9h>G8?;(Q7vogglyyv-~+H{*Ne^|6y}=9{d)W#laF zq!FDog3q+ch)?Hk8AJcgbT9W=rT_mW^#87LhM@kr)X%<9s=br`L4&VQ5@h<8RWAL5 z{(oa-zik!&-YR*^TJ)v}X(*t%sq)Gw{R119ZARbg)>rKgYdiT#S;@Y4O~V;(DiC&| z)0#@cs-{<{sNX7n%PKjc^_=0}AorviSr45SLhK?k0WzitXa^vFf)H2~<#m*`d6O)P z)j4tXq|m?k1D47tWQgsg$y$5};-{doh}n6y@3XsfS9 zRslZJ({Z1M=IWnf74QZij;rQ!Y5`AP6CFv$k9t%&h^7gYoLV{l+?ofDQYL5A8h_^D zaDmk2$^m-$+^onK`4(L@IVtj4y~wzvB1;gyI+Md!%X3AmYM&2(jH~KZ1&`qMj2Cm& z86P^CXRTl23ZCN3yhl8D_uoTtj`DqQP9u?;MfS^!-Tfj#@i8bLI8xJU7=wMHV}?CA zeKULep=ma3Q9xxadav#EQWW3+ajNCF{N=*DsEhQ#`+dMA~Bi2^z3#$d$ibN5{@pl0&d|TV3k4xzA53niBhZTMC#u(P3-NuV|b^4i;iTAIfQW%aWaIVssJ$O)$ox&GZX~jpdQSbaDRdTYam3B`ID>X9O)T>w~m9ROr?&XH?u>q62VT zVf|PJMT@8xV(&dVhjJ?S@e;)dI~>}Kzc1g)8v*6q-J;B!aI?4)t9!duQ!Gau!S}O} z#c#_{IA2CHnXXz7-NbK-ie8f?Plb@aTE<9UC0ha5I|XAWS`0yH#v0Zox8$PLMnm67 z6fEz+u6iJ~wlW^0;SlE89rCR79!o^oB*SaV>4W08CDcvfcyr>tAkbKuSc>Q={`y-N z8}PQ?s|#scxuWpgj44Vq4g$+FNSsH*-YfX+=1fS0HLMF0(Q4F;yYYPt#0T(sLUq=G zbj*OA9j7qbE}ziRO_uxYrpj!MlSo7Vmea=f__0JKqF)myB4Efx{&H9Qtf>cAOjLKN z&yCtw2Xyvn46kS_vKRitvQ$!Qe&9UCHD)CZmcvSp|<-^N*cxH%|9%*dnN~Cwh9wR#ZGU z{qu+!fF&g}T=ZR_2K;7trG>R~r_AiF;JaacHa07(US8|l46T_JCKUUh zUoGR7iY%Q`s6$;@tQHYQg>`DFm1QE;iJzx#Bdi%)r81PTqf17_)aD}0tYGiSrqO%q z7M3hH>x0q33HAkJG~J-WZsf8S-D9*9-HAOaZEOPHj=X6PVYtu-J>*e`By0{p> zKX-jW=;M~yf5H0ld+SR+Szl<2+I)jbj{p+s>N5Dp#<`$783S9W+jA(W7o|>oV=l^; z&AzZJ9E@H}uEflod1`Ao;3DR2#&0z6qcf{oZk($ev5BHukSxD;42DDGq5 zfVQ0da)Tf^8se{k!MRON^#T?(Q$RSMVWiP%~64btSLU( z*p9JP?$Mz}d8VP9{%MME07nBm6Ib1$l!${JDtn##j$zTGm2Gg}gDXBQ?jpzpR@%+% zKgrR9>H-6s+Z`l=wy-CBy_*i20=wJyoGscb6SB|(NwEJk5vcHXezJ~Na-i^K)IDx)7x+7P4Gi*N149j->w3%KO4D&0S zrA}{yZpV+xGQzBHAFGJkuN!Q8kAqOJ9n#ysC)~~QY%({L53Igw)QE=xFTwv3Giy}F zZk4#~;^Qi-m-pt1v6O>HqIx;+^}3U5b5$o#Ve8mGmy7Uc*)=6O0E`B*Ozm05vTDEX zpFAD8M|8uX?wnTqN7u;8qx7mnGNz#(bax+8a(H{ZteR(eZnR3R=lyR;3;R}U!JSlv z&Xi#)Q&p^1Yc)*bN8nd0dqHXx7e!smPq2G@PbQM`xYP`<_VM_H!e;=;LP3En(z-5r zmF-28;aR*D|5Dn-I_r-7y6>kHDd&dtc+4@S#+je{?2U4s^hp{*TjBb2bnir+=ovFk zXtFFF33dsqVPUS?22oTu+`^?QkFiV|1s*ZyCOF=%O<}chEU=-dQZcUb(Bp!pR!QI3 z4p5jD_9!?{yl?Vp@4AQA9fj%@=muVxvPWYF%FkF+&tls{UOs(^%I9aTl2@%or&p%y z?@ecXR`Huw$=gWJR`zM9HecFtV9BZp)&c*j9J1Hq*mpy}?_gFk1RRU8@e%l32Vj=DLk*r3j7|i8+eOU=kD~ zv_@mepR1a%DtXmodL5(9-3~vXSJBFCN!FuSe`NX*xKqGMI7HfdWjmxeWDZ1WeB*Y+ zwWbLJFzY#=?Z*!r` zDB}`qbDW2{jGRTaOZi11hLLP~Mam#Ew@Yl?kltl04XNb_fj*x>Ov)aA`!TzarYN%`MUen?>+ zX>F~1{$I)u-N`^ujfxOo5{fn=MByMF#_o67a-EGsQlJqbj$89d{1O)-t{yK!q~=Ok zvYwGZIB*cJ^VpI90ukcRkRLX&21I@^pX2zE56BOCV7*U%h_sFuA#y)Vgc!q*{4x2# zFeB_|A0jf4&;5#?9UsM|fR$ia6k@S){5qiW z8xYll@#u7<0%0VQE8)gIgiQ%`=i-N`{7K2+iZ403@d}GF?%x=G#qeLU@8K|Rw6x(2 zH;5)Q=r1Y{_!SAPe0yecCEPTc#omfdean^Q8q>S&qrEf2YOV5Mt=4?> zJ$ShR6(y%PipbML>a>N!BVZ)jOc#>#)W)rDM)jZ3zgNcfPWZ7o@MD(>WWh)FuM)@V zCvhpyd2vkt!26z=Tt3>rZu-ZOH!3ra;l{==VSg6?wcMj<^Z7^kFBOMBz<<>_CEG;K z5Vv=nK$V}kp%EE|lR||Sb>J2PtlWXXENF+Pod)_AV> z#?yTMk@5U+ezr=EP7X_Rq{R=T)vL#ht#CXhMwqd!+?KKe9r(7i zVr2KTW{rw~6PTz7L5d%^H(9awjUF@JnfS>X5Kd?N!7+-6(}D=U(|+5TnMt4<1v)c5 z)tgSR(G;xFMXstE7AY=TqF=74EY;ZNwpu!~iCS-91S?99dSLSRX^ zbn=|FeT(q1whBkqlge-rW;#xoWqj;&xa@Y4sG{4bpGj8qEntq?xN{m|ixfLe?st)< zK^_*5zho^A?JWb4{$mCf-QH0NGQ$&+sIBsz{yXB7WCxFtnKuMjJAkFFrm7nG@vAetX+#{U=j z4%t{ZqN(zvcK>D*dX=mLhzVVOP)jBtF1}`8Oy%6?WPn~5{HKHh$%tFHb>ohd@3=|4 z7mV2|1XWz8Y*%lgYzR;!fRB+#*X?{u$7l0SB{zHU1Evu#|3D!qnG0b*iL^)lEe>x z2yWi$QmS5^fiWtki6!QatemlM@yN;mMj=%a!|NSdY^wp2+!C7-%p>U~iZlfeS0pE3fe^{ zgV^k*rvxuTnk)a>afQ}R;Vpg@>%G>vxB7x7B6IqL!FS9WQw@^i-))xlLM+rpY*Jn{ z9Oz0tXjiTMv%OBvPS+wV1qO1zJ3{^}t;`KS><1N)4vw1-(R!z+OfRWh`3YKROH9s! z$Q%9h;tx4j*~$__uDNYq3y>bnu43xOnaA2c)2n`Fx>=W#v??uaGmZ+zZy`+5Ia2hX z0sKC>*C)uKAdU{*d?{jdfEjAg!Jt>Wm7wvK>j=N_MPS z;w>031;VLZx8&a=CHH?Sy1$ph22YHXPs`2*-;*K2O4xjB$(QV8Nvc6~8zd1QW}-{P zwaIja8KZPjpGaM9zPi8Za+me&*1kvCC=2X!sn?_bn zW0OZ)GqRlPe52_@C)_)-GFul!WAF68g8~obi$GozT|GA`{MUO@XqsdE*M_cLbH$!T zB_$>2`|S1@Fm$9Xl+E8xk-ToQe;c*5IZX#Tf;!aZRov<;bcVd_J9l;)~Mw2ckHZlNi*}w93 zlHJTz8xKp8y~k;Yp-65vOLD#W|6P*nJ!k2Fq2UeHg-h?Yo;fxV??6DU7>DgmzJvD3 z_)^kOdyo@rH7bi|?Q>$W?35gPsb7x9@byNOx&4IX*i+Hn&e%hyxMo$l5mdP;_Ik1y zB1_Yqq73rVMhCqNd(9>}SInGTCd*!1tamgC8>KedWahPEz1O*kL~W8~50oi4<2N$e zl2Ax=ZwMz|z@!K$T}-q0)$G?0GRaeMm`n7DOjMpCrg*L>V&>*F;oH=!_O-Ez_0oSW z)dZWcevt>GaO;hc9gaCzQ;z_r3!Lf#a_n6}g>sm?OQ1nB4B}^!`UKc}=gAHW(s*Ip zEVEVTijSG+^@6I&Q+hM<(@Fa1z920<>^Z)qKaBd8Y)UU$n>ks8IVxJ1*g|D3F7ih7 zsZ3tWIrv9LG~;$Sjd3HIQR=KrC$E=DU3l_3H$z<Rf^3P>*5I>)^^h3z$2 zWg52NV5=9t*lpF{D$6ZWN5g$3JNl<2M%G*qqLe$*|K-G8o zm(vcXMdcibYcfNK*~~C=Xs2ha*L^CRnXM18ph)yKj3jE8cZ-ISL9uF|XV;SR(5mt2 zOt3A&?4dPjv!1+(lvBb0fh=Jnd~)9rXVq-gq9g!#tOG4-uoXMQfr|Sl%*MC1pw?xC2J#3Zy!CL%=sQMPYWu^1OYZ_yK!w!x! zi*YOKvKGCpG1CWeQ;GaXbogTeD*pf-pj=hI!fyeSLOaBF@&}EQ$o{}>*Us!XC9)1p;mDO;)+>mpidU*Hc+^A2J8=^<49u`z1t3F9? zpcddp-N)s|TU;yCP(8f-YPs>U+>m8gJzR=&h*ke9xk2&VkoYI7exKZsExmeJVyCS7 zf0rAR^oGPuS@i3h=jmrZ$mnYxGgGahSP%$HB^pZ5rwh*Miv;_px1?CW4_hbu9= z@kp0GvZOvbO&^J^oPfV2K21%yaTqu}6fB}>u-7$G2ikZye;PXuJeDwIK{jW2`8w;N z3<}c3j=U{=F`I%_`#qkK6+u<%lws9g6g^IS!qwuyS(s@Z0D(Y!6M)M(@SO=AuR~73 zA*0p*nJ7)2@|~5}-Plx`?($~_*CLv(KrxMeXbzr%_<8<&mFH~l@eqIq! zH5!o)AahyzZXP>4CpbLj`Bf85ox_lHWF1Q5f8Rh-hkhno9dWBGDE9>6XUhVjMtF#KP^(n zHwHN&y~p9U7EAn^@ijcb=0o68xA?_MK+`j*;18lcnfNg1EwNnK_V;+|8U$d02_DyQr@Yf7zr=01x!bxUjX!sUDAk)0X|zqCla>gR@DyPCQt4V z8io?cG+@pOamjUx?sVp)I14gy=EGaBfCK_~t7R;d9Yw&@Cpb?x@-pve-aI}va?nwE z(HLf(*#(~VX!cxjV|d_@)TW}Eyzu0q*)%R5f{&Kaefy5v@XYmFX= z9I1n0>J{RD7@mPTZ$D|2-~XF$z^F`p%^qC&IS)_De;4b<$F`!O4B36aYe)1|-IjWdrNc&bZfmFf|ru@ADy3}#X_>twj=xc#bQ3zYl zZCQgcmehL{vv_ZK(Nrr%K1$-FNMn-SJ>t13rQCl<;XzA z#Asz}Quyy(JBffyxi+)J43&BQoAh_-;V`sTuKrAzfpR#TWSr$F;lU|QzE<2`(aC7p zw7_^l!5z-69f=g|O(KUv&f)5dzDhXTB>q_Q4y*UbD$DSf?ES_j!l(L{Bt}`zt|`y@ zP-71IUIL(H0okIuUH^2aaECiD_;;}j6ZgvY?(BM-Ug3*$SXp|KW@W}kCgP7-c#*^{ zC2d^IznF9WMhz1L$>;RM+~=$IYrvfqx?opUv7C1cL0ARNveN9GTvuOs7E)Z3?S2dA z@D%$=xfhLnBGKeKFdPoZkVUT2bJM@d zR;oLCbL>skaHJO@jK67Zf5+N({5lo`Dag^ex^qSd+87iCaOZ>-er?zi8zCI|Xa!kWq)L4@Dc=Z^?6hA1x_DEsj5^sLMvw zkm}{czMmY;3Eeni(wsXvliI@pcdl<$^n9tBmxD z9#&F9YXqLBdcQw=M2qG~_KxvP8%_5%_ZBPqDvQ`Y#DEXOD(%Dn*2Tmak{$m>5-FhW zUs*(vTOlJlvuI?ObP-2-Rg4#=j65NIAK4|n8u?c7$SzU0Y8vUTqT3dad@Fn8Thga{ zeO|pqRkE?vNIU_a&BDIm7qt1HGdtCpA7FV!hd(W8`qs*BNhE_87xA=-ix_mtrcM^V zf?Q$_(65Y%IgogR<@oAP_MJ8H5hu~;5Fe2;+g_fMbFMD^8sa17PKmui!2TdE$I%gu zkEoOQ2=osU93hL_=+Mi%`pFoW&H$Mk{h8*o|u|F zaKlgN_j8&QwNX51BuO_uG~;H3o{ucg9$B84Z^|H0#?e66Jl|zxh>0{tR${!okh0=S zpe#u2fz-WLpqNBVl8`n1X_JvvvKyxEl{|(QBAvJj*Pu9I z&_A?%FaUFokl>Iq;Xv3&-1;<~5Hm+4pWAS?_J?sFm#;N=Ff!2hb0$f8Bo2jRdbDy( zkKDYCTK4`mXl;LyJ%YluYvqmZ&X-M>BfH(5Uou@B6?VBA?XO8ZmHM>l z;OmY~b?`{|9+R2FP2V-9!ktfg725Aw+sOmiAZe&KTr_ocxHHxnOb6XnNfcF|E1h+B zPS-KelD$?qGpg+w4~Qqj@1@7Pd2CFN?=U?kf#z|Kx;K1Zd$vnQ-E`ix#o8X(EnR^lbhgojij;=Ol;|imAUsyRqRaojUD-mtU4?`#o#jDHV-&vDt^H>iUcV%CP+_ZaQ}~>D!0Zb4KZ#< zuK&l0?;FPLW*nQ_G!rjw>X)zB;?(`n^(RZH z#O5@a0JkP6AL!oPnkURvkG)ZNV7EpIoqgNh-zrV532GyWGTZQkT%mU#lOs&n4MHGf z55ef5kxZ>VcL*XWHnm0oBAbppQE)X z&ZwI~nA|>Ri!{vF>84s(I()CdGf0xRdh=lUCO6{?vL9@IR9*}gZnb_O8Ta;)BKr}7 z$Dgx)pca*2Ctr62hdn3yN1mA;+A1O`pe~QZ)|Kz9Deu+RM($fzz9Vys2vz3$lFVP3 zi?0I4X-vq{V^BBHJ+U#GgpO9)yaw4|8n|%e!jWW-t&x|5Es#%19raLKIA`4I#Xrig zDz6qlC#~c^MYr4?yE*tS`DsIq(>Y-qPyvH4AuLET$`9)S_#ozhNWMWvN6f5wIOP|} z%=tNOwKvM?G$?!F((h`5_~=!hx?jqCrCjJW}>X>s$ufC0ou$SZsUYfpnySqGlq zY7nR29}qN1hSC^=w>5ZY2b*(s++rl%jH4jf${g;taOy6=!SaX*d6@llO z@A~V!E!RNkxtrT{pOEP76DCO8-S=~|)m}j1CA&i5KFKPY`sC;lii?Ar`U{T_fPZ#( zPLNp~xAN73L~HO_7jm`X32VMAPYH@18NX|;HDB6VLbArifDhiYUo>KC&+#4V5oitu zL%lJ;&@{e~aZ4fr9a|9|-5EaFt@iDa(pZKy)mkjp)?R|k7*3~Tr|(5K6`rpLFdF5} z+zsE;hm_5ikogi8=#S)<=WNiFXI&?)NpC_Pm+=7>d2ydd!)A-k@k zMu5d_9FP+EqH!XT^@y%P@&msJJr#D%H1y;Pb^8bgZ}x>ceZ)rT?n;O;5#d(-W+8VC zBApc49G)a+O8%;R0nSsdA741QwN=jS40~n~PB{s^TXgl5q}{@jTLs7rcfGCXSo(H` z40GxvH`NXn)>!qYUqd< z;_mWOzPgGJ7A@3(*!zp&d3TP=GSloi#eM%`%EIS@+2S<0N^No@;%SF>22fp)OY<$a`J)uBl;Y)%6G&B&RT2`{~|55n-EIH?7clk zDD?Kj#M+ogdHfDh`RG$9Mf8&(fI8adsOyLIq<=M{dY|Qs-Q9jc1EIYg>h9pYMSk}- zUj=$xqh|%0L0&|~qM9O*B;+fG4J?%1uneM;vuY(vy@ZIhfeCj&T4${-;gtde#bjhGh;H9JQ97;;CQXZC&If{)gwSGF_-xwXDVOSmmctEuzVi zGA;CIcU!C59`}WBQnN`ZmXfq@y^S+Q(}c%;ktuTF=hvWwm0U@5h@Tupk31;bo2!3WJue2BC z9=~SoU?L?ns2t7ylHXcWPpu5lp4ZIC)2gf;b7s#BzPw_;h6j05nrx=@fxr7tOzG%M z3h=Z}+WY2m^sbBqnoWWpA%iiKhf!zOJ@Q*A0jxa&S&e#6q?{#aBX^lOJR@^BXl4nO zpX35aOMi%gZYq06p;YGaG%{X%Dv77o?Uy+`Dsy;L<`B1~)z1abg-d1f{u6Wdr>3h35RQt4 zx;vOB>U;LiMYX&(Z~bCR;ZX`&b+= z*LXTF?qSi&)GqC?(f~S6yHWzNaT7(S+7^7yw8pBDlqJxz7QttF9Zh3UiJV`Gnma9{ zZf5Ypiqm}|9*gJe+(yIglHOkFz&}(UWZ!~K4+zH8_ceY{apXqbVuhb99CRiL_@U?) zj}pNG&n`?1h`=7>1J^OeQfD?$r(oAk!KC(b!YxiD#@Ir(aaq~&P!vL5;arASiFhkW8f0RZdb#xOMDrIlu4K8|6KA$qUYx>~=;2_>;ruPh#-%J@2MIGQE%;Iq-j^d_Ik7 zGrLPlJsGXczJ_~VV>&DSP|*pvUFd?JK4Vw5nOi)AX~AgCv4)DFTzrXm8VoFTCKAJ> zWGYHLBi2;VfzFBDbkUoT4rJ0G0L+P zvfrRO;D#{Ff=LR>&?5Hvrhk{Wu*m+(0^MPeZ1H-BGvE6x)lXv{osy-qLa!jF6Xl!G z;fFTOWoXp}$eM?n6Dq=6VsMDyM7p5cCd?)}R_bO3etsO3Imeu#i<{U4WZT7?Q!*)5 zK6XF|HRn0I@^QRv21$Y&+Lm}n6MQf_W|ng_9Rf;LAXF}0?@Wt^NUeiwSpF2TnSRF~ z9lm0>Oe$!9_KN$QP=K7I8fs82Tn@UKb;4D<>HB3ISTrDxm-m24?~z|1r?ML=2;VI; zc{?TZezG%{AGHW?$LRQg!D5kPCa{G5m6@nW#__gF<2fV1f$Ep!;D{*f& ziWO>F=&fcbm(lDyL;c`u%X&ZRY9>eloWTlluJ45Wr2lX~B(tkkFLMpsBXug$+J7%&Qo$YSu~akiD#R9D3VsOw*UW6e8~YKVVXpEF!8-L#q~` zd#Kvoj7O1j8hxF)FG)U;AN{F(B0GO9MLyz3=z@iJxcn&=bi<`8y{4 zv?Q4|35$W=;n0$7JyydZVHsbP1h5y|FS@hdwL@5Sfu?H0BPO(!;*EhXjg;>G+mLF0 zgqDm|0Uoejf+pZ$UiZ?_a`d%?v`)5QW_7Dn&*$UviHlE_`AiFK%H=Fhy9VsHSesI@abv$-BEB?!pfOqm2r&Cdq%Ar!p=Bm> z#j(Tk^TF9B-^4b?2a_Wo8RlcM`N%RKndW1P`N)@F(8;%WSk|j8rJ39ccLSoS@V@X z33-sF=|A;uN|Ti^Xm?nJ;BVO0lE{@G&vjvr8VvZkX8ss zqmiQV@_ER=hX+EPAMm#+-yx^Tj;~Zv?w&RLu?l0gjo(($f6)46O>$c~2UW9xY*eDV z7^wI~>~xBNv{$xCl8N%})hSL%z`hp!+|6hUB@;?$L{U3cX}m^)j6QrS!5*=w;i7(F@LwzpRoq*_@TM1K#L__LAAfL8qlhXS?>=iD~j!2 zj9LUQ#?9J^OsJ;CR^V35uUB$ZOM0`wlArP|>!+HP?Sxg6z%(HC&dYDgAc3_v8} z=G1Nv<=|m8fe}sD1`CUXh+{RMOk#+_?sB+bWtjP4vI=a{!x2gkSUF^puyU4U z=}a001g!dnY*qbVbn~=daT6VLnv%rt8LKUdTSUqar57o|_j|gVA@5h5h#p!pJ|Bbf zQ!m;_bWy|;jfk->!#+KRslrG1sQos6k6*RRcK{yq)#03%J5IZKyF_A%o*uMc%QDdxa|^P-P~P9CvTPS~E$cv90kZ zHe1>MA?2b3b!P&mS%aUN^(06N+Z3Ye*YX=aoFvO`Bm!0vq>|ds%K6znj5hOWm(=6` z6WX@PE_vKKFmK@myKtMBj1Gw~kkN4(4~)f)tMBLl_+XP$n2v(OOROXdxyZmbiT*WP z3#5}+&=!NS@6>E|2 zlM(~gGOs0<58A+=P<5IAN7}_w z)_U4iGTC}NE%ir4oRz;YC)zk6IZ_pTuHxtLH~9o`69zjyR2TUkQaZy#@`2mzP981H zU=*BkY>%S}4F0dium4kt73z%_;nrhHqmaVQv=btPDW7^_x}c38l#BzO#C|w1L3rUYbB9 zm;Et%lYrS+y_0xAe_rz)TVR z-uLCiH{@+deQZ8I8P9Y7-N$ouDD!0~S=MGS&3OLl_5Bg!$(a7p@w94RW-xuvi;Jp? zzM;c*Yx@v+((rm?LvSLGyR+Hpkk60WsXHPcC*{l~(+jsoF1v-F%uT1T-q+6B3Jp#d zJ?IXr_Of?Ha?i8_f;y5?`>Z)0LjnA8!G(y9kbF=Qh$ft;GH@78R#wh>+JA+w5pA%9 zqz*<~F)#OUFGcPR=Dwtf!0fgJ>F9-MRPs`=^vpl!JEGpi7`7#fGL;OFH&WEW^DkNR zI(_GEMA6iGzSEi)OAhrCs?V&nZ>66wrk!x@OK&BejY5cl4jKR9{Wr`$ zD$v9l+I8Xv2-tp+thOc0w!gT6$EUSoxcz(+dj=6U5D$E|&&b-H93jwrJYlVk+E1CP z3ZYHZ%80w1+^*^q%6f| zdX=z8MO{B4wsfM+1J7$`-Go4CMpC$n=YS!os+~7)$W4L-oe9+rk_f!sKW79n za%nz;7DqabTm2#}avs0KQOOv=Tu7*mzd_7gUgJ&Cw*FC$MoR2bKR_4pr4P)=Gww(C zT5#BB{P3`G_dh*j%=xDl{_722>eI&Dk9eDO#{I`oi0wL^XPo+!lTZ2bDK<3uJ2-jZ zi1EW+#@&02IXltWJw+fC9tRhT{&iw5jCWB@;ZMVnQD9d0ews{=_18IS8MWO+u5?E( zz#n+Dsjwsn6Rt-{e>beuoDcXXa^KtsmmgJcVxr;%{-YE}s5!#$EL?WfntPdRQn+ta zQ3K;4iA4{ye=E(s0A0)2%U zDH;^AA)>=YUZ)s_PdsE|n?qi&qGy!*_s}%3tloC73ApsO4SXI6FdII;RFiKNn&-GA ztl}}2EEX?GiWVUJN=wl`;y4toE}cNAkdd#;dimgT_%YwYm+pKQ9>POBD{8ObG^wx7`0-8+98PSK)PevC4=W0>Ok%&*`KlF zj|zKEqzMF50Mjo8ir?A3${nTiNfJnY<6N;99}H+<_;Q|Q3+R6qKiXdz_rA%N@K?0I z4GA{)$M~NOZ}g<^l||i`zFlqny!Ly4P5ZsSqW#`qPf6b|fkf&jGkBPDMJLXt{lbc) zxdbu8C4P3TB_NGtCqg!FEL)CrOi1fl5r^ZzMK0H++vqDAMJp{G6Dz)qLvecR;%jBC z@p8+Q)KT1mqx2d}|4kk)=_2@syy7(^i>#f*&q(>XV4vErO6pag+9MkQ?*;Iu+jWd# zwK3;?<6biO#jf@l_kPG2k{di}skrNlruRcG{s4`rGv>a_BsA{rWco>3^D(K_;SCr= zU=nez=-(N>bk=MM+o-!!A!)JcMR1F2+lWn*9nL+*ncEEm6O$VF5qy}#?7#ON;5u{% zIqtpCg)vg>OR8bwO4IC{zNC7tlNvOAxYwZ#ccYUVle!F!T$^;i(DAfDq&J8_3E+Q8 z=5g<64f#hNgm+cDiB1O`6^R+Iw2FV>v*xY`j7Tt*6H&vqdk~)3IZpYHvWpa zr=J}2p7d?llM@-D#3#)t3Kb4*Cvge5bj}pGZp&Is1PeLIGUDh#}IEpYyuK!hzd{jjtaXRe4^&p`5l3%a3 zcP7W0vm!izD(k4_2GxAm7kg-$EI>Rv56$kF6qYXu_TnxLZnSR2(rX^hA8Gh<_FYo) z6{M+eOTd>86FNgf_4SP_{VKJ9rm@mUUqa^~nPjKSQurB997FUEQm4Kxxr*FY(hptp zTFiNg%KMrGB7?uxMl2oQqW^-=69@s*J2rCUIt)r%BE9h-H!F#ifdPX6`Om^Z0<}4R z;hxcDw9j{=1C1Ni+0MU?6><#sc%@ozxjZun51!WW2;vi;4LrQrc&4qIt%30YbF6n% z8T;teUB;@D_$hW~4OJNKA731Uhf^HszX%?{WDp*^2xRoW+e*95^`1I`7u&?#uClM0 zxrvGp?XqFaA}=O;PSC}umH2C&U&fRbcRdVyupR(@ODQ+AG9>L?KizLqNe#ee#!k2Ppj;49W@u;4EJ1SRG*ebCp)R*M;DhqXjJdfr5PPL7nZ8* z2_4^&n-6(Rq7%ABYH8l;CWWNPGINj{dv9|RR$J3%7^^mgn~LFri34t{aAAMVyF6&y zR&5di#1H78W+{xNXMh^gQm>U^OFfG*U_r}_$k@Z}L~G?9t?^#9i@V8q*1W~@oTeZl z^dmj=SgBfmt*e;zx)cSh^{>l2l=_WT=aElKrr!WHCRyvX{++wl`dg%?bfnLVZ=~2m zaiW#ctDmx+UW`?{obOTYi@mU?;8qwTS z5ec>TX|(E9+8}??>^X69OTHJ)*3rqL*>eS@qS=C?9OlcR<9~2#1lBMz6(UtMr_E3v zE$J9hY)$P6pY<8lf8Y_7o!Rks7rt*!%j7-Zg|}69sH2Z}>e-$TbbKZs7(PR=8-UY% z^j@+Eb?m&bu(Ii~Z1c*AlRPEgQ`v!z)fbnS{;e)A8>_NYI#ym>UU-RlrSf!^)bsIy z&c{Z4T4kqoJ~-k|WfPGQrY0&KQWDKfrVm|Hm57|VkpHQqiW;*_bP^o1i#xwQ;&qih z6(TddcdF_Qo)z^}sx8JI96_NkxuD?CP4Jxr=h1^s)6L2Ai0%9>)}=7ZrNh+?7N*>uupIXJr~oO}M!$eS1+9 zy~vGL?f_iuO1nm^oK+Im#W-!8cHaY!QO9BK=s& z0@V^EPgOkg$y+d8LV1!mHvE3STnqUPzHNE~F@UrGb@6{2W~9C7<#waw=m~G^FZyI6 zRTTl5f>u^P3q-0$J8sqJTaxYF$Af}|xK-u6)CF=^NRjs? z&SbmHDEOVsM7Hh{wm0XI|hL zEwPHa1DwXy$0hU91mpotPviu?TGPV7DFP!g&rEnn9d->$nUWIa=PN=t~lTxobqTAeN)NR5jQ1>M@kg$*r z>~d|=9e9@)Jc#WURDSx{KS`UJP4ZdigMkha9t}2;)oJ;8Za5Dj+N(LnCE6^yDTQB# zSjgSWIjXI4CurYMqacMHNpdk@JlllY_*W=I)b=ymn+}aO)-+uqA6D)_#g5pQQP&wE zx@?4meef8eW6~}?!opu9#jCvl;zJifANNKMxf$bP8y=A!BeS(fkF@|}YYZ3y4|_Z} z>hWyTut5(#VnpAOX^yk%a*>uX9yJ00fRseLiaTW8rB}~3(@8pTvS#<0-Ay0Uf&TJs zx(6Bbzz9W*tP>7MmVJu+Wat$$HK2}%w`ErBHbTc$YQTP$@@0E2e9kIK9{yBlYez)B zen7y7=k^BZDqB;k+HQolDX$E@Zln?FF+!mLRlg@h&5`otwCz$)^IKQiDO z1}C8kGO6IF2FF@X)Gp?SvFf-{NB*ya;F__D5lNU;-s3vr+OO%(JHUk*pjykYhj{$D zVLeR>SU=M}IH;0zKSLT#9O1HR4sONZc>vBlNbVZwdErfxaQQ^*Syx20koKAWkt!ZG zvoj^us7U{);RW(m=jHN$DV$E#=Zh6W*bMnNMdQ~%O!|*{J z;*S%n**-!qUf|hq&viz4CZ$Adh#c}^UVV8SlLr_RNfgJSdRgY7LImAV&5?dzjNBC8 z-7VIb>ot8fpVxGF#0N~nXzVanoi^&W+w{bBGIG|K)GC>sP^1_ljHFuo9;!lJd6YQ1 z&GbU}5%s3SLdYC{_MFk!$|laJ>oHdKGNP{Tq1w(Og70Hn@XK=or3<;0M(F`m3#!cm zWYqqEkR@|>FJb=rVjZ}UKQWU6dSw?JQ8)ImL$=w%cqU2{EgH$6#Fzl1*3F|* z?{NO4V{bP%ZMIr9GqdXBmcSkF=sqhkOJbAMRh;W;8oZhmANye8O&WHwhB`-T0ZXMN z1lg+lQl7D@HBb4o)1AqJe|7mA!rjN%e&P3L2$iF8NsM8l1Y`2Sy%tZy*c^^%DVu&- zhMfA%%Z)~+WS3D#yxDeWq3d*PhHY_msLN$D?GD(4lm%H=wvhmHQK=tG2Jr;hWQLw$ zqP7^TP8fCMWIJn5RJ}+^%wkrmU!DuU;f}R&co%K?hlhGnX_UwxYGu9UI=M9?V2;BG zZBP~|?@^GXwjuGUQL<>dBky0PwgtP5x`V_>8t^TMUiYs90}J}(S6UH8$lovTz*fBk zvvrw@;BHmd5jpEyusLu&P;FbVOOBBvKGzmkn`;A+n#2?GvPrESH^-eD=zCqp(8ziF z=7GL}gnCVJr?*gJfQjMGQ{MT(K4^0LWtpw*<$dzPTKk1ad7r#t)9C3Dh9U(5y&y|< zOk_>0O%pDJPO5QghCBR*Ck7iE9%84K!xFem>x7B}GnmpL9?u-V`3BGU9XHHytCp`1 ze2?aXf{~6Z8AHyzH~~2~J&_~a+#oE1YXCU;N$U1xbBbH|)nwW-fqTFtEnTGrxXdsw zHR|>O6g-h!5Zw1z2wiVl8NXyG#Aq*3?bBa5f#x1!1ri!{1L{2XfRRsqu3h@Bm%CsH zggU}X;@TcLe??a7c~?8g7*g^2BMaO{ovgR4WxUGs@Fy&@8wk`5wGqG7Se2W&5mIC9 zI_Nm2hh0RO(1_(at{!)@I)rHURF6?dXepnWMvYs=X@maB=UZGomiLze4H^#g63hEs zO#=rT?ZMf`P&EyVRax#vdqlUvT1@4!Bt~>>0<4}oIL)Y({0QMU0#;n=)vymxdk#XcnV$ORz>xCZ#(AXg{#tqO6efAux5|4Z0&n3h<-HOzs_-Tp zb_x2`D}j3pgXO)4zRB^g%6lblZ{al^CmB30&}rAfJFrN%$a`Y9gg~0isfCS zl2tR#eAsKp0xtC1A%J2W;0UepC%VqBA9qQa9RCR6dKtZ?zwlP43zUH zkFP8`N#=*P08VnQpacfA1(T~^xcKmxT3+`*2>qWF-yDN| zznCiAD6k*!X~~kY^gOjG%uD*hA9e}H_$E0RXfdKl0n%SI0>hvE+!64{M!4UBqji*Hy^2AV?5Eq_qXk zxWoXSr!I4m-ZOqW@p?);(dxk=s*Vkj($Ee!X3F3hl`0;KGG6L*p`i*6^ zKwTu{qm8O5oNAG?^^|-PZ#=p#cF%&9%j{!WuE0YFS=7om8ig$Bxml!y6F3Ih zyY#|bEZFf5Yte!M`HdX+x%NnqM^Bzwf4dEBkBHVcm?d7TYUgE)1lE#Oemzd5W5*K! zIHn^u=Pvi9w;8!@#`F{N%5g$#oROKfJc*~RmCNOA{FVu_KnkP?+7WcJ7X0`L(Ec0o>t`Y1P_J>{*3k*c6pTQ$6IB@Nk*k>Vq*}Y(g zoC+J&rhYB&(K@xicv}n+E56Jo(=75U94P-|I`~9DKeZvaMU>(@yOF?oGEM#7+5rj& z0jjpNo=rbl)?+Rg{3fWL5Nc7b3P<9Wv=_NMBYj^+xFwm1$?Lm!@Kt?+FXn&%M z<>k#k{>N)>!csWWpZHh1&DC`p%-wJlco4!`7m^kw5y?3FogJx>vzN(RVBdR1 zRf-=F_g+<%h4$GW2<&B_tyVfwFQscR6z5Qn6*-4>#L(ifUS-vCXuvX^1Ezf|Ibf$w zJXj(WWW}rwR=&yNaC`S5Yh-xu^;vhT?y|*PQ$N zWV;sPzS>ogLF0nHlvG^&{$6v|lZiNcg5|^+TGi)@8g(ZT@zQr!e^>|oMX_H8bmc=O zd}ytoikSfB>{??LGO-N;tSwD~wf0i#5dCDDe)JtQ=Y587g^ZWQlvI zFc??wb^3?qI5yLnwwpE63E}4<=-u9g(6gC} ze+-(427Na&wd~e@SHC@@*#ZFRY29)a7iaVTx!rjx?QS&m>8&#Icnw$nLL78+nUucJ zlM~FW7h|(C^d!^Lo|~a3nUrHPWoCw+WJ-?7lzAC?k_kB`Q)Xr8Nv7kNOdpG*8zaEd zoF_e~ghcnUJ1%AkU{A>Ms1OC48VkW5mf5;<*HCZm{YUxH3>It6ZQWDe%%qM(AUDTm zpe(&qTU86a(D+cKa)1q=yYwF94YOpe-(e@n8mdvkfg5Z3B7GjCG4&qIOYVsec8VnQ zBaiFd$oT{|F2U)*-ZsG7n4h7F37_qIU6wwcO*N)>ye4(?&CKA&a9>}&UKFS8HEYjFyD^tO zM#h>w#)})qM2;Kb4X*H>IOD}VV=?#UQ#i^5dsM}0`JR}GhXOPBf)7!Sv2+cvWT)vf z*RS5LYr-h{i1G4vk|Y`7CRca|^=ueRD^pxO#D3pGHPQolx8kSrE={sR2?_XiFTPYN z>PY5p!a`(pADt7*G*-2#4dD-9^&i?Q<-y&Yu`750&1wFI5EpwmIU*8q@6cd!2Df#W zut)p93P0r;^+@LG#^Cv(ydYXm>G2!`nt zJCnt`xG8MZPI#fkr@7b(2XzWYO+WD#H+RYthbW-Z#i!&67^%fO4Ssg<^9XLseZ14B z@4Do!%V_?nhIUfguX%5p+DldWn^6*%k)^ULyoru4>a_D2VivijaH@nn%BFwj^Q&6~ z;yv9R7sI)`hq$L0KK#MIt~=UyQrbdX2je$-5WfuAjUARowmm z0lvN{Q2rD6DkCt6uX6D@_$q@qgs+gMOr!FD%IZ|15f#f8sND<^M9o4}yjPxHtx=bk zW>}$$!r>gexxQ8i8fgZeua%0`yTQ{|;aB3i-@`_tFt|&lAlDo>Dcp1}y+ggHdhwrq zIiUUK>}er;^!0innxXaiT9!=}a7rhHQ#xkLzeSear6`w4or$4a3^cUYSbCEAFUD_`Z!jGMOta}I z8m9pauEi1!PwYcIn6`_;H)ScH$K^tn$Dwmv8wT%Z4m+O#G1LVFw`18H>MUo>AI6Q} z^|cjL$&<|x_Cq*KEZWA&`+_ zzRT`;f1Yu0JLhjuLY%rzR-FT^00$%7doVDLyO94*VxKJn@ch0>`Buu2M&&`aJK3e{ zdwl*ND^aIx&1usjmQ>kFQ_b#Bt~8X&W0xKpb%y2?e0(`e03G7ATdqHmYrAXO(BG(( zMCjxOsOYA*h}s7R)(IOo2osHc?CRXNwz6sK8UW{V&X)IU)SKR$r;4-Kns+<=Qsm=N z=;I0nJ)<4sQ7Z#0V_1>FV9FTEPE*Ek^dpZr;|DyOWDMzm7BLNe**;+;X6f;G-WiXA z9Xwjl#!v5d{*h4>?2s{N<7Yw~%lYnE0*wiAi1~KU&Gp#+4E5c%e-m^tJWrXVKT9 z*8Dv9>gg?nEsSZ*Qi-+HA);Y`JnnOW?6X0oe?Jf2TX{?C_UO#GwnJ+*ydyTDVH7L1t1^x;|o!s!RNS|@b@40jAaXBgBucT`8V^6dB7?G zk@ti*8RO4b#esPF2rs3X?pMW}&26l4yJ|uKd=0ZsR5TSP zHua3|Z!#L1e&o4p2GImkV`47KPkur9XJ1f$>I=$Ge?j?~FDUQ+g7Tg(C_noJ<-K1} z-uDIN=f0r){1=q>e?j@c7nH~Sx$^ArCf~$Dw2HNx;g!N~cx`O8@zb`qcT^Q%%~Tsd z&+_ytS*l@T(6<%`GAYY(ZBBr{Leyv_y)E-U_-4X0a)eFs;(-$(NAWCSg7h2!wL^hf zpsgQQJHgUi>bnR_y-(OkimM)BECweJC*h1LcqE;-RuuTtlgzu4)z-){Pb0k;u;$vc zVCW5kKCHPM)hD{eDQZ{n?Sf-0PMJjK{!ucfJCl=cMsGt*!QatdbDB)26!T8Mc~6Qt zEm6;{4W6O8E)KHemJW-hd#1WQk%MTElZ`cL z<8=`;mSZNd{N!)^8TD{V@i{JF!;nUwf5F{mZzN3Gl$X7y~VXMN@qJ!9hH z-~;$Z;dfAvFX)k^s^%XKbK6{clwTB-UW`~g6W4WdRg#h3Y)or5pO6duCUPR3W6Y)c z=_gLfElFsjv$slSYddf2*-ONZ3%uHBPENd8wq?bmqmz>aH-Mc#yly)$#uZ%>F3pH5 z+&yuf)Khv(_@_y6Mb}0rC&~-a$$oh}I$1B@^>Rx;eTP#IRG&3rWfO))9-ix5QIe|5 zCrg1x0$h75y}E)#yPo0Ib^f({%TRLwY3EfqSYAi1z-yo*n;$7F^m2!9#&w820(Sgz zZk8sR_oP|we+fsiMH>iiRQIHH_$in198TY3sy??MfS4>KvxdvII@O$%s;b_(nz|;9 zQ&kV57%<6*)1bk*z^h&n_?ruS>J@>uxxlYp5!jduQq(K$@>Wp2^2}9o!>wLvBwl1e^B9%d^t4Klh2`B%MR8&gbUwY^s1$o%FpZ2D*rm9P<;y{!XjK}o%21fg z)n1-?P}ebs zR@ft76R__!SIM_8qx!*zUgS(3Yp&WQXX+IhHKHq-8e)W)?Qs`<6?;Wf?8n;s8tRF}o~$-m8;bz9zjjLi^39M6HAvE=<2PF$+T(?fx(@=CG0NmU)9 zGde{6x-0dkwqx9*o|1t^sbBP!XjKkRN@KxB2YbGOt7EL>iV-DWwjW0zKJ>V%T1XAU zrsJ}Qk>-*JpzLmYPU_0-Iq6sGDIZV&rE^lyb!bk$CMeh;X5QhRQDr~0YZn^p%=nSD z+w*xGU(>TGMbC^8GhV7&aCQ&GLp8{}*JIZ4NA8O6;~cwwf!gQR&ug^p&($x3JfePS zYv-MIy;AtO_1b;@bM+=)Sg+Kjc9{)=CFy;}v_934$*JZ4k$TF{iKiohLf9c$wfqWSR3SIdde^;r6G|AJXgox8CC^%INtCs19rjH~eZoE0G(ITr z<%nIOQMV1WU9d-d+81n=-w2Lit(d8%lzhkjmW+bf@A*&)E@;ZjCYc=wwm3|Ts! z_N&|`wFT7yH-dY_cQ$8Ik0SSEMOATt(yY~L_8aW=XV(uC6jV-NdDpSa&8*di&;6>= z-1Jp~8ya6~BL6Yrg7pJ=#vIOrvs*afKbT8oT!b`V_S!+EA(RJ7UevczvM9gWJ#_!| zS;BD~MZ%TUVtm;tpx&$+{oK1crPhIem#5zSrNlEh@RJwc{iP^fWBawC5T>H?%`>jj z@pMtLVSJ~rbu8sP<6{&KA2;P0ep>M3mXk()zAnFRC{x6M2E`c3?GN7~1d z78JGZs*?3q=zAJLBmjNxi|Va`qQe74N3q?gi2=!4_A2X{&hneJ*ZGKRhW(X67g^Oz z#IqMsa&oZWBpA^fz663*&u%A<#ScWEN|@?qunn7ruI}yOp7UBuXH0J)r(rxiz~Y-k zx1H6}@iOzms*#5YEBJu0GKe%M#4*AJ?{l%)Xx{NvVi7z?Fl>%F&vk`2 z_7K)*qgdy3(JA^$TMLt!(8Q>_i~ROYIK4;EDOEfrV;$~wS$7PSeQ4?ltn_q_>1Txq z4Eu|j6UG#;NYJ1l{+p}6j7+VDA7lFV^4{_ZE{GaG(5;DUg|jd!K9%n4bF*A1hxzO| ze(`TFy25;lGEO~(SFr1dT@+nnpIX)Pu`8GGXjxI>p=&p@^q$hG=1)DZ$@0T_hWS(P zYqC^uKF<89?=`o59x#9Ee+@QJ?kAc*P1MXL=U(%tNw1C8_shOv&U)@#aC_v?CBZ$g z`}Q|6QvHX1qtX8lK^*8WF;;DNom5ZO(vR?3P0WI8gU=pRJV=b}; zO@CU<3X3iy;8UHCv%yV;?nsAckS`cwMltA6iN zcob3F#N~-no43Oa^>m!tWOER16hkPtsqH?EkUo&dPqUy#NFT!e9wXGMo}R&jOEM%8 zk<5q4NAY$ilDRE`zTAv*y)Y;`@vISQu~{G^r0I@YE(Suhv-)M8!2q?;2={wgR_xL} zomUT@UBL&{9!#+8qUs!8j8;$OR~D{lwVSgCIcu)=aCTX=THF0`!>V@6Za@N=gBrtF zTU95}kVQ~c3m7=_3||2M)Od;fj`5NjQ~CBV&bS`xIzZUX)VRX0m!B`g6uI$4b z@FN_>8u_8}^V*I%uj4fDmY;X5iS38H<>zf{;(b!qFBRAxg0?ZTQ6UU5=Tu}=2pr1$ zb!9*6cxkAz!Ae%@N}Lb$JLbxcHS=SXsrE>_m-O8F+s3aW!4|u1oVNAIZskOz!)sL} zJO@{0guA@4Erj9t5`0!oS%p^qw=4*6|GL>IVp@*i^`TM8W%$(aVa97hOSI#iY79hUi${u z==-eiU#Z&L4&j|T{hSbX{lhVJ2I$ zDi_avq!*4r&hkHE<XWoFTf>XiC`r>Dy; zLjRNU?~vO0MD;f4OAXSH9(+5ONn{#xp5JJw*}?56R=mycb}(~?(eUb4&Lbbh6S*$o zX&z%!=r4$T;Ko*S{FzQ~`I~VNlg_`DjxE@%jVmMCxN^Ul^vB4DSE{+Mx+@Qq`pY-Q z;e<$zvMh2qyz1^0OO^2hm4wIgJoZ{b3Fh712WZJ{2c=ZCC3ydkJ@Hi`LdCyT5o?K1 zEDQ=^&&o46CF~^}+GMeiEEmy+TwsdjD^GPU#15-G;9MljMUrzNwpitU=R&Np%B60O z%F7Yn@OBSB@!_>X@Bzv@#FcQrvrXJC0Y)5@wC%pLK> zG8qz8vQuJv71sMCjf#=eT-j8Ud${mw-^L_S+s&r$Zd&`;qHs-J8jvd=oG zF}cRWy*H8(qU>91ZjAnHSxg$a&=}jv> zg<7bRx71#N%tpd$cpR{d(r}RE0jNt!4>Wb4?L*wO#MK=ONTU4d9wEK$J{I{PA=sw& z+x@kTDqUN|=y8KqgWizaoxE~+lE~XF~3Y_0h!}B*u zpV(OFk!b?1`ET>{2oWwHXrY1+8JS)nSn#0$V52AXZr zDVs4)P@nLeC2tAYD1Q7tY|rbpe}`&*BI|JBkHQVY=*1V^A1>MHdh~}G@r8FqZ*>c% zMup4Ai}hB-Q2e^%eCAWaB??U;=?roPe~lu}*E=|bl)P1xX_Gs1nPy45Rr3wZpWLqC z*3L3}l4isUd92g{d~_A4xg?@(i+;bbX-P>m!B}qaZSm!-yo3|8N*oSI$hbx*sa5-E z2%<~9H)zB7n9b`uI4Ss?Og!`65sqE2g{I9MlZ5ro{@`}=Y1?;U_D*ZoxB3akYZX3x z&RThw)JP^X!l7zchnVm`8F0WPo}v+ql_tjK?Cs%_qXUK|%R$F@gzv+M52xlb`2zW; zAWX7KW&=NSUcI<@Uh)ji1d+b4NFa^dGt9}UkXdtb60vH{$pQAvnl#bTdG*7pvJLuh`5VGK<%y;6bY!xXiAjq{XO1?htF^-dOPpr<$R% zqQeq_z4*!G*dsr8YB>D)HDD#K8!}jfgs{L){ba1APdN{;^t>sH)CtB6^`AJ2;V7Zn z%;Kefg%3fOQ70Z8xDY%eE*z`6q#dDOKx1_njKk)P_h`1b&**)yUFtlRj0$Wv1eWvXOGkv#N^fC_Vr4o6*K~J68M_Ki7>e*n_ z4j`h3Ty$K)1S~Jn3%616I%~F`g0+9-j3yzjMaNm!B-4q|hxzgNbCM!$X(xn>z56F* zhdwNeqR>a?@k6;nDJ664L$kX$+d&-!U4F?*TB>@*9`0|L>+e86KZAZ2e8>-(0=Wg* zJ;lP6FUD;7U69`V^Fn{SIT1Ir2Ux@g*VFtHBZ_1Z(~IgE$Twu(UcU}gt6s$Nd*x}C zOTDbhYL?$EH99MqUjJk{%YR1$pp%%IxikWN@V* zjBBH+pr+3b^$L8 zfM#_bkZ}}tM*>CXcf^V`44EavYJVEfC(l67OzGvvL8YYx$-sSxa7e+;au z#qwTm&VCiS;O+g$BsE}j+huCCCd@lbW^d(vj-<-nd!`ZMcAJV6y)CG2FKJOxWL&R_ z(pyHOWC%4Hr;-7KaOq8!-x4^%e?~rz#|yAA-z|K1WBw)3D5Ejc!ve!*0_S(2B5UYd z;}58_aMiJv*+&U9UHBZNNCKtck0LP^YzKQt)N@cDSyUt@s&*Z++1e8(2_-ZI6i=2_ zQCAD4JmzXPL(iQv>RJRRO7=>LR07?!xnbucv$u<_Ec*lP`a@LD^``e(D{Yb$BGDgm zXZN#K=q3*l;W?XvT$M2MwX?xg6>-gL!c#^%Ht!vQl5p!EmC=jGrpCHgj7 zvd}sJ7tjCg9I54_|_>qLzzdHDJ^Ram5{pT?#p!fI9T1ydBSl7kS~LqE{IPiZ1z_q8IEU&*v1au#3bZ zU9jhKo>;;Y*4%lB-e^H>U^|x($q4iloAUf&*5>yOJD)M^Jaedbydh>jBF|y|g{IKh z`>D3zkj%-PDXfI|vlG-i$we!jPc6dw{1kTLIz~eN$MW45wZ9G3&JE=A%Vzh~TRaeR z)Gm8Da7edOzuH2{St0pNLh`ZewKq$m8VXGTkoWTdTP7}NO<^y4KYJ?LL$xmkn(SIw z9V8IIA}XN+$<(l4>f1?u8V-6J_Ng@NW#ak>cuwu2NGBv@Yz4a6C zE&VBZLqEJzzb|jF{`Ifa(9y5;@EVOOI4u3O1AKAP!fP>j<{y^N?vrM$z_5dI4Ck{7YU{@{T4*QLl150c$ z;*WL;9MSlZFYo7nB$dGGX$x8?&Af< z%J!7Vqk{){;~>XQx!b~1H2MIzagbvt*Nd>~cT}5N*||`jV^1%ebEWVmt{;A zGj<4&QTa3Bu{ld;9jQ11q;$}!L8l0#u{gKip>js!SH+5-JLjMive+1nKY^G-+9AY3 zHz=EqXOL6&L)H-p{jjp0q4!u-M!t7u=snh$k?)-vdXLp+_HG6k()3B>eyI$wHaJUxmY#~?-=Np*F!S`7y#09~qgUjZ z(h>ILDUmf>-ha-ZEc`yKOQQNDxJ{jlX6YvpV6cxVyapz(G9r&0B{X{y9~oFPix)eu zGppnnUSCznfjF)54S6UxY37gOXCPr2%n_VyG*pQ&*JxNKqID5ftdWnC0d1hj>uAc8 zEbWayP?R+Ip6@QiCPltG?Gh(l8nTfe#a(nOTCD{_G{I=7)`H_|kqOz_LGH$N=9yKZ z>zi2h4EGDuC9L^qwQQ<9RJDR%k*i{{HhA^|XJR%Nt$Lm__G(!8$g8y8(th_?RqEEY zkIr^sHRBu5O)zaeVx86B z=T19E9M#9b({<+%AnafjW`*A3E3N+|RWy9E@{Dh~h&f}uvh|s>^Z?H*-z3^FR=YDjG zIvLzha2&1ZLUmU%CK}U|%FiMl#`;=z0t#z!VwuA=xXnlX=B+8_y@@I*5N;l6fUO?& zN8b1FE-5jS0u%9xS)6R%NUJ>7k6j#mYEdEvt{74;{F=D?_^3lIO2KCP()QN&$OjZO zm46V2ApX(~__E|fSIw_Ac9Ib> zo^B+;4JKn>UP&)dPI|~|QfGHsbB6X0vDnsluS54|Tc0CZq5JcbnMRK#mGgP&{{Q4H zeLrGm3IIF=pfV?=n70ueKY;c3u-KqJQIO^)&TCdc^vAu&ELAJCv_DF}a` z8s^tL`zliu7%%MTf+W&$^_kJ|8F>T}boc+*GrYah|10VKl8v5h$Nv6vAn=>N7y|#F z_FoX9<{906=>)@-WImjXMz_ZV zuMuE{bU(`;dNNjIrIap%BsFuEx zux5$$mf$l3sd*qd5qgHI}*6}YWon*cw0AXH^ zbC7~ZQz%F@;}}Ul7~72RMl5&_&#-@66Z#79YM!j#3~mHoJf^M*N<76xHNl=ToG&!0 z|5d&*Rl7i$^Zn-36f<8#ZPV}xqvq?m@>o)ArraW1J5%EOdBs3ONCuJ4I7lQ9y$Y*lftEOX z_)UqF0<<=Zj?EE#sr_a~z*v)H5R`BdD@mM79SXzVsj*03j8`1bEV0%Hp zR^$e6h#}(F=rd0v9CU=Ii7)SAOk+_Kq+As_I2em)Z9BgB7GpUWr`!SYpeG+IVH*W( zDlMRCnBXOz4}y4E+QVfd9xj4-2g+^4J2-@R&|e$zBw(hu;ECHHSMzJ05St)!fEE(T zxbe<-G2wrK1u4>#Xg=Z>sWcOBtZQRypXI*J`q4n^rv$biPZ|SH!QZ($t-|ZbhZ9Ic z4O;b~n3WW`%0C9)WmaKfT6&ie-pWk^bW-_$TpAnQ6)T>&e2Qw>-X0iz<|D`f?f`7pun8uAWDvr^hFpO$tGd)Fe+Agk7 zNp^5~AfHTs_ZVvg-=|Gdox!#OSs(o>5yRYJ)7_{R^BnGIl52NuaPg^e+Co;Gy{wp+p|*VF4%PFvcicAvi0|(JwC;WENz4H#yULqcgql9=0O37d)xD zIz$XVG=@W+6!~x53jFEUTt)wG%^uOeR^30ijte+|<`@Tn6IynP`G_WH!#Mz&xlnx2 z;DM$I59F->-yZ6pcZi$~F#xk|20)Xxg^)Ix)eZ;n(4Xz^J-WX!=BQltxX%Hl`OMFh znu;-NnV^%YjQN=zkI1O@JiDz|-D2G)RNIGX!KPOdb!bK)~ziAUKR>|lHdS9Ypll#T%C0Gq+ zyA_6?a{Bq}rQ?_zuLLxL z;SP8(js!d-5i_Wa=bb&1gZF@`yHcNeu)~7j)1(zq*kO zW_r0BC2ox|=IY-BHqygK?KSUFS@S&Ry(#9SiJS@Z!LSNdTFCD>F=%=jvS7He; z3-pM0(Bl;WfvgKZ5YJSPtP4L#F@Kz>QUyI2aff(HeXI}Q$CRWPcHCl46wIJk$@Jeh z#BsXSV!;f}Wm19(R*a_jkO9vnF28uVs&`S_%u4~Lm+o&pq7h|Bxs52T7bD7k)oCn! zTtpY3NS=C4I?h2*#r&ff5tFgw)8Xu*<`>-nV3W-*VkkiWFJKpk?XU*v>$G9?H8PBV z&xw2^bm>huPKTBUDF?O-Np!{~B4>c>^k^w&(>7c9JNHSj? z!v7v-A^kl&naDKf8E@%tFxbN}QMsJ){+AfaPZ#dkC;Ms8eY$uwYxXWJ7Tp|u6DcI7 z>mk2Y!lAoaEq#lxH@_nz%0kIOm_m<+{z zf!bD3TfRXE1oh0Xd2%~F)yB}qvTs8T@xn}&zEbG03A8z-bF84c{)4YcenP*c>4m+E z2pSDrWJNO5p3oAAA$Dwq+DO0y;1!+B{D=(B4?8eBL9b=~70PK;YoIxsFz9F2pQfK5 zdeprCCi;n3qKEyM(9b4kT119V3!-w!|tCpUJE;sUM30rVmg6z_hN4-3e-S+?-y5Wj^lr?KBnKUTCRU9W-xqw?QT zBzL^a&v2QbY!dXTCw0!UGfL61J!v`?`J%V zGh{y7yuMd2S*+IfIxjq_=KJ-sm3oV23x<}h&P!;|@$sMjXXJ&((x1|^jyF3UOB7qb z{SMF_AwsPP^l%FuYZr&s9`p7jOu3GEtc<1v&D)s&Ad-k=vyx)jD5hBRkJ<3qVyt0r zzcsw+OSh`M!4~3Itk#vN>}1T}?@W>f-Pr@;b7EAN$ai!k3!lj%cTWm3Xtojbn20g- zZ@M2!=@A}>1AGnwjq||4t67{eW>K7VmrKn~)O^h>_J0VC947dXFnM3sJl@`KYZfmn znL5jh1Grc~q&_2^$_t(Ge6Ln(yVTnfpypWkZ*;xMHq~z|+vaA+>?F{I zyeCF0YHOw6{7Ksoym#39V^*Gk+N0qR`%%49j5W8g{$;C8di|@gp@B%X7g_C$Vel}j ze=ap@yh(EKMz4WBbwa~J>g4-gfeDM6?5SjJL$-W|YadHt(&FpPtF6afF_@PMTrPtj zBC@6aF3)+@ql0p_&y%6T><=7(7=|A+l5`FoFG6PD;=k20j3g09*odqq%eFGfSmXZ|jrPVqJwpq~ zS`m;5JR&ifvQzAcmgnp3Qw(=n3##yYkQJ>${758SIi_ik<$MhQccBvV@AjDWFlgx%4`eDsY>DnFFi! z9F6H#e4UHsm1ri&3SS~WanVdCfPT|)rLm`_959mq}qoR`;cZI z#@Po^ukpeJIgl{7e3R^J$gUywZ@Mc^AB|;C39@VkOv&aFc^aS(adLJCO&dCtB#QCX z-Mj%(k0Wvg4vbE(HHxL#&r>+TOsz5D{-!6xH-Qf+n5G=@SPQ=~pyyxIe$e?Pe~C=L z-mGlIvwiSWwl-PaolG#;ZE8|1pw9oMd8WgD-sLx^JG(8<1?r3y>Mn=*WX^#MnhJf_ znQmIfohq9xs8?(X3Ofw0scaqph8Cs@sS*mtwDdTjk}3ITWVH7V#nd_B>^JDP2xdv- zVpR4Brb!$v$pe#GGf6_sRJPeS6LI0>{mMF9%y$SN_I1z@yh}Ti=$W7mJwcbz$H^`g5N}y7{NI_`OcN6*ZSPKc0Xjq8_ai zDg2B(?}&LVCtKAbEd`k^NY_A}h?9ru5sQ+opJY;K2V1A9{uzT&@4}7RK@!^RF7h^O zCn$GE9*s2`mWwDOd=`uKJGqW!MlhCrlPgJg>QTrkm&(#6(Rh1=d}3N7wj50`t>bZL z$Zt6fP{i^_JA|qW{avv~eg0=D^aZX04x>O!G@J|xuqK7YUVe*<{oJH7ZGq7%)+^e` zlt+8TZ1lL8Ibh?Vtx5-NRK?Z9cIJS$v2z&=dR_2V!OnPocJt#T3W3L2NVVrlZ(sIc zaVkU+Cl#$XHQfRHbq+G@p288%I?M^?L*x3pqyt!f&GH7ZGu;>IjCb{^D6i$IxwBFy zr*A0U3+(aP61$+e0nf}K1$O6EHdJjFr=hSs7IfLFmU)9?--;|gQ)|y z%Vg8pp-`XHuHeeLbzt2cjLXIOI5C0~c|qiefeCY-x@tk&9T*=*db#X%?Z?3EwxR>f zss}OnEJbhG8hdb7>2+(R#u3y&{KaP@oEm&;cHDy2VfD3!H^omaI?y@Rt}#@4-GU~m zB+^cT#&)FZPNha;s1&La8M-es`o1NNju35)bkO$1)h^G1dv0Up20<+oM^~U9(ucKw z&H3v>rHxR>2+w3ZgDw9q(PtZ3yGWNP)bU-elpo>cZY%9eR>m2syU%F+-y(Ie7SgYV zU&uy0ye>WR+q$O~eb8BIE8ra` z4u&4{2w;&P^T6;~+4q^tWiGom0fwKkwVp45Q&1(lL3`KU41- zImZY)GX1!^e(?M7yZ4!uQa#bF9yS^*sgEAG?eI9J_X+8ab;o=i+rqAI{kLU%Ndz3D zAt^ob;pjZ|52&T)rn~HOJRs+$$J^)U8EX)5$Bz^WV)5Z@4VIx%iJpL#5uI ziC|381LlZ(lAwaBs^Kd9MvkU|!@%j-A0&;ShmwD*keO38%sk^}+d3uk!D#i=f8Im` ziejKj*7J@Om;JjbXFL#|tkCe{R*5{Uc3Dt_cFwLkd%og=x zVxGzuE-{UBF~bdkR@}u7H_jZ5Ku_SOssvEn7Ev7!R-KbtR7?6oeP>)@vhCbsta{sS zXco5e;f-fRBxKb7Biu-|Y6dmP9}$S0v%F~4EPbk?d8$FmZ+;7Ir|gH71KK~(n7*w( zF71yj7u_eG8G4N{N>~MuN3Qd(XCj9#)j^V^d4tt`-nYzG1oWMg%Llf?G!=idJ}&d` z4Jz*boQki^Q_G|^(W*Oi^XNIlB?Hf-AdAeM+_k1>nons5(;dvbJ7x}2R->+35HwF! z)$*9YbCuXMYcn9nw!KQse~7-uZ}^R*K|HqCa}U$X)+iyG2*0j5#KM2HCgb>uo*bDr ze7yV^*4G$$#rgu>{zpzHW(10GMhM;6Z>(x+YuA}=+vBa7@np*z82BE6nvLv@>Yr=m z+m#jkMk^oVSJ0>9T8LZtb-9c)Dh7o4Ex7P|#or<>wa)Gvn{&*_$N7|NFU!~C*t#7c zqeM+M^@*CZyZF%f&FS5SmBkHfaz8Ad=rB?6j_?n-iQXn-1zljQ`ZT;b9%pEb*mk&% zs7M<*VnuKrZ%q~T?QJc_ZL-8nObZl?b&Z=W+*a{u$;>UejYV6UY^DYHV#Pt}(Z~Eq zgNLnRw6`?Y-cq~0k0nZ5w-p~&EpWCPmey)`vd*vYVb!u0NH`$2e#z~jen=<8zu~{H z{pb)GL8Icke5Yd)KeRx9pDxu(z+d%;$ck8duEAHTVcIL@(&`fT@E)`_2pm+-LnUrUr1+SI=8eU%3azw+26gf(dC zyh7ZM!yA*iXuq^8e5mZq2G`oE)dZ_T7QpIzw)Kc=Z9A?#-WD{)#qDCz_eqw*I(y=i zU&XaG^0B*Kus7KCEZkLq&u=cB%3`S-q)}9ytwgR4eqpF7E?J+Ie|Qe*116M_PLe4J z-oR$%_Pd%%LPTBo6SrEoxr)iU8AysQ(er^0gokoS#&BPbGGFCEJWk?;B`|r^SOp%6 zAbG4S+A2eql<=6}iMnH~xms-(`+(nHdggtEwgA^p-pYIICy1#8$9W) zrEb^eU~61NZK>GtIF4jXdNYgT|M0zApn8Jf6HaWjw)koLKy3_vSa$OOI?uAK`Xv+xaiiI|pyv+W z!V%GRuc>EEAnK z75WFO`j+@dg2-cCCtG_HX8I)`W+9u^+kC=4j34Z*uK!vzJK>M8{D7^bdtTRRY%y-E z$;n8Hbh^oQZmfdeBPa2ioUtzMeocs9v^eVYO1xV#*-P7<6aIWF3S{@SI#R!fhwRSH zCF|+I$S0Q(hT@8F^tsM24Z{0ucynIG0VC@y`X?Q38y=*t+lflPm2{k;sXFWT{{rZq zPV!X?&odRhjTVNmK9DFU7r~0Q0&M_8iTHGaNggj8z!}wSG?v5zCU0;X5S!K)E9u5N ziU};S>TUOzDP4Sv&3z+03SkV3OLbbD6|mWj3rm2y$N-K7n=8+dflR&-;;_*Y;s}L$c7w zOAk7C!=IGBN*RREn-T93Uf#{ z!E)g0fl4&#UKNkh1LI(R4Ea8oB#ixos4MsDbq*(Lfw;)vlJx;KS-*HX@$!2)YQWdy8@?^#J?Wn=YV zI(kf!owKV`*r_!jDrZyYPCr=sO@dduW7seIsbE5CApKo+#K>t&KW|Lmqpk`!yLreX z`?(9AmgmPL_yc(K?lN+Yr|&nWcdBm=Js*yR)gJtSO^-&z*JjQn)99%nNr+W2bNr6V zGt4I$Qx;SHjAc{Z^lL7U$?_xuJr)c9cynr!nV+n-VRLQAg=dYDc-LNL`?e|SGzMd0 z4-irhNv!MaB{~^G{bsLfUuxXpX~=A9DuTC7fo{?t8MK9`NYlYM|& zc>{|Brr1z=Cdq74)5LnlqxP9em_lTXB|E*`MG;l1b^g8R{6z@7rQD8c{q~Sy@kU1_ z+-rIR1<&x>)JbX^olFcKv<0{|*F&xOlIW%BZ}BzofoKM(T=>ld392%vMi^|c*xR~M zn79LzzAyBl;F$E5Hip!rVswjP2aJX_sb45n%tS_NsK zK;eq9IdUBtC*dfqTV1p_q^2b5-X~4epTTtHUM+pxhXDLzEdc*mD@~fq#nvT`c2Kut z@3_x&2e6j|gmFgA?Qp78A#5=HojYMb%l`QgHcdq9y3gR<8h?VZ${)y_u1;V9 zatw%x4N6E&PbOW>q9kiZfBAVm>?}!!-q)CS*>)hdUBF$U1aOneSM1D`KOiF6k377| zGC~1TQ4couwne~CT^gaVnPO!^@Ol+r6LX;ulS_oIj;cuX*?o>a`>Yf@I_>G&n(Vx- zE-LtiGtT!2A2Umjar}Tfg7BGEaKjnnbB@+6-X5rPY$;PVGz*Mz0c&y-4-B|{= zQ{9_nEA)-(R|U}f%zNF8zSq3h&q15~pf_aN!<3OVVQ_rW`-l}p%>KbkKxwgt@}c+< z$q%Wta{%Y#+Qfs|6_nRw{qFSXVHo^j2Qp;)BctC}ZjXMy2E#B6V5)cnw%dWRw1_V9 zl}t5;$Mjx^4(i@^_+{+i-svs`Y22{Mm;U|h(|Pcr8utJ7HABZ`t>0Plj8V zpMJD7%z2vSX8?v7G`el?4ra#)`)uzB`|Ke!{5-QgygitGXB`w=B9Kv&^nM-cFbLaa zFUB@&vRVtp6-%!%l5e0a8O0_b5flTAgClRB;Fr6`i|^OlV$Qe)`nwR+nVlSb6O$2Z zYQK%2(nX{Cm%MN0+V<-hoa7D}oIsm=G5BJyXWN^6YC8JuG<8}J&p7xacpz)hp!K@k zR#>p}I^Pvjq??7HxRo~I4T)YGtw;xSNg%V?F=*T}!VktaIO$O53o3w3;v^h(I0%?P zHD|&~oIE}*T2sJM3@=IGCQX<@BpX*699%&xxn}NnT-nB|B<5>taGx_@Ax`f?VrD5EWl>nPT!lsVEMHrWYFIKR3PpqWScqKuZ?()8->$)c9xYVQq39 zvlkxWLlV;ZwP6;0AxMH4`nheJSP>I4)BX>4Zv$Udb>{o$Bu5A~c84~tw2hKZ(>tVc z|Am&hlN7urm;|&5q9wi+TJ`U6MHrKY9JOs;Jvk)XoefL}uXKh^{m-@YXYT08OjTkP zk^@QtDux#^7OO!K6N4IFG~vaQ`~9uG&p8RA?fu`+=l_-uoW1tmYpuQ3^E~TW&sxv3 zo@eYClHxJu0OuQA<85NY0+d}O9q|+mu53<7u@@2f2$5M*&E0S<-sL#==^mm7HW@P8 zDdy}IM{DlRG3I`0_v^L4N;39b1=#z|Gv*?md~5y7}JB~ zu@FHf`pH9PupMu3;eR5xdKLZ5F62vDc|-pEe+%NR-VOl~*OH*m#hWW*8AP zH9Yq7*jIA+gEe8c=KlkEubcT_+nh$;(GY{{FoLJWN7_bU30{hkwXX7b&yTY-*078~ zYcWpt(}zsfo6LAyCYv{7Pp>mbn)5xIVP;8a#(a`Ns8MGB*gJy+IYI3fbx3eDRbeW~ zz>`?0$#JhgIUevuqo0^FNS=Ify4ui>d#!}`TtGAp5os?+T&M@|i0cfT%XOam#0+KR z1uIbG$qUEx-i7~Y1eTdDDM9C!-J532{AggM#v6t3Rk|$4 z-e$kvRid1RQTfH|6(cIntf&{_G6Pbwz`edK@Jp46%L0a9rFrvz+ z=KQB85B%Q913vM+WY-&cfE7Wb#0%ts4T6%f+)8)gRbC7t#^iH4FqG+!dK+HF*-vbf zKT3>6`+XQhF{i_ri>S{nhHr-f9&>C?;MM-z0CGi7N(j zakb>fxI_R1?4nt0NL|uZl&>*@L~t?S>0;P>>4>$A z5K(YE%MR2XI(k1wciy$iShbK<(wI)}&mx2Vx>n_rYP@#_DXAR2XMfrWe|ObJN}Ts| zN5A6f;ks5mY%0|!dvoH|zedXY|B4x`gZ4Ih`M@xeTq) zpSvxKq;}t%Bn^}D4D;q*Aea~IsvW|sgv%lNlB3S%8v#tgF}%Ch|J-fy(dH}}`UIi0 zBrw;Kz+6iLb1ezXwIndtlE7R`0&^`1%(cWZhqpcluKimr8sSDfl_2E;N)$&V~ZEU5%|818QcDO5IY@n72 zWsKgPer>`vg|p<5z;>sidoJ@^Q@egsZOIUBT(>R)xq+H5ns$b_3e{fRnotRYnmhd^M~=HH_p3-js~hQtcB`R+=^(^c z_;VY6Hq)7iy&|Er%qQ$s`hdM!75}cYZ*(;6hIG^IrqhMY(^ku`u`%M5epd;b^`z?3 z!*!W~nn^zXYVM`6R%9JS?v!M*Gu_+*Cg@D4)G>4%ex{{{wgf^r{78389-;}pO_<*p zlgqE2%u{GSRG|oF1Ak3bR!56^X_q`i>S~jEc;K77mGwyq8R7%QuGp|_n*i=P-gcTN z8ibnQFkL0js_}z)W5(3XgZGy_)4E*_bxpt+H<)g3SSv>#bBT-NEXa0B*>T?UfxRv7 zwDk+Qf$g-<8qt)N1=WznnZR-&j!IY5k&8?&M7u?PjY=jJ_kAzDITbekbT z3VZe-d&saB|DjH!%Gwp{oZ_`3id|D`mew-zm1zYY3fVHxmlE1OfyagS?7H>xKk*~^ zXjzch!;|@@QwnE2tN@vuO%^J<&o$>Y@iE!YgHGzYXV)EG`E48bh@ZF1pT$igF_p~W z0%F_r+t*J4HK6r-x~U+vPW#{mKxXEsT(#&-)VR~vVAwx^J@!EINcCE$VjTzZ@vB(3 z-dgZGdqHKFfr@be92z$}HaH`$#SKSEfp^YHv0U^yp1E!&M-NhVlkrOL? zZ0|P?Zn;0k{Wh)`vsO}ipNvR57g#qOBmxqCu;g@V-*zm6@Z(ka25I^DKC)n`^}$DE z;Ec?^7%%Z}wdgq&?8oI|DJH6mKIX1Vcldyt zm{Ide@d4R^g;}Q33kb|axq=k z?*1$Q!@z&1wxsHym#m9*gWvi(pI-KA{k-qoGsyP!(|nb~0?F-{o7MBa>c7#TUxJXp z#2l`BJVo*pd2kA2(w&R3Qq-*>ZpD!yyDx8uXjhT>r!hxbv@mEtP)15913*^u z0F{JIJ3yh7#$6@ds+bH+Dl!E%v&%LT&YBTE{@XzKnKhas0!}%4=4bWd!9{!(MSk;4 zSlG;+>_c7@e&#{LKCB0#ft}$_q~>(DViWzr9oKa@2A|^1*QSFxYJ1A4H(BASyiMVg z2;mSAz}yaf)hNK7<|ot(Q=33F8tNVoD6gK0rT(9xbLZftW2>Y-j{l3qo&pLf;XOF)e4;oGK@lhM$}-*ZP1l}_5DymyoYK6@ z9ut8=13og9_9LBz^C6Efs#iuhaMwu4q@hk|lTckQDdYN4V@AzK4v!klc{Y!XK8~|X z4$2ugCiLu1fPEaHT>nYXopOKB%!=(!VjxSOCfGlpnK!nE0ZDAT7fkrDV*z~_vF*y0xRIDW3ZSSdrO0lXEwfs+yx0jg@9K&p!HCjR1 zI49oZ1n1i=x^qpiFej7^1)dUdiXRWn4`v#mG{#PBUIDw2YZ|wImEiHHj;;OZ&13})3=)9|f z6GvF1q%>}k>-dzK>%8TFIdu^}iZAk)N)T{*$q>t%_}Yf)->kLZ-eyHp zb0wa@J?H1)XIf2VRcE#s`EZY4Q0gxknky0gHgGv`Oq_3=cw)b9Tq`B= z_c)%>(36Y4qEp7cl+tf6Iggam2$-Dfky6@yYZ!02GFB;KRw@aT7_(k!_tq=Vj#;lr zusvtJB9n-O=L?Cmo|lvbIV@LDyLb}H>FQtm5(<#|1Y{!eUnR(-+!?qo;RG_rsd&cP z+I+E&Dp*_FE{;3UeEed`9oH^&&B#xjI5HD^x?|8~;P_Q49r$M;Z7}XF7HI@)4IdxP zymPZB+9vKOn67xnTT5CIOPJC^cY+eUY_YpT?$bq5ZR*ycg{|6Kec*Lh#kb&XP!w*NstP zY}0vj?CjX{4rq*7M`TWWKG$%~I(wjc^Y&=k1-2c>nS-N!T@PO>8rgF?}8=uML9I$c47BsFKvpgmA zTKj!ja7@S34t7FC*l@gCeNnTqq z*l)jB{de||rzl>E0+g0!IqPYZL7+WsJ^5YhF^p}ZsaM)Pc|)x4u~N57a`J}lx`Yc- zv${{(qEy5?v16=mPINB+QRtuQ@E>OnqR%uQDZgbr$YtPu4+Tjf9^^bTK-o&6d!ciM zgK-yo_8;u>gsx@m9!|oez>c`p#jfgK7#}!xM($IPxVK;@ZmCQRgJ_Yyg8OBRJii~% zUR3oFu)&%#CocxDJ^WZLO+Ic=p_j*9xZ-Ux*JsW$?uRE6+YFj2dp-g*u zoZ2puGFTSqL9Xfc@`Oo@2Gw5QN#iTNlg6JXy?MP`{dWK)*9|rVIvJ!{X%hLQ-_7CV zPnFeCT$P&FZJykCRXuw&6Z*mT$2 z6U-yhj>0T?WtNSalGr8>TOEqCXU<<1+gArMXibf)k32|vzaGEK>Q|HE_QhB~I7Qjc zRi3BT-$6>F&c7;y=y`|yjmn;IyZw^!&#FMUKg~h9{Yiq1ennoVNJBi+S(fG8M0Hcd z6r`G6X6WZ9*#rp_yn*P-*~U*ox?9AyO|BF4jE`1OElx5S=nPN*oRO|K9%q?0#(r(5 zJ>QrF$amQJxZAx(E$b22^LS4&{zs^Cx}6z*HtW3h)=ftrVSY9sxv{AeNl#WL8Jq>! z&tuNjck8kt_gP(ty`an7pq=K-O}8gF!SCC1gHCXPJvSZYML?Q}$8&qg?`1q^s@!S3W^SP#P8JM=Kc09Gjv!3Dg&e;VgWreH zWuI{i-BIV<>QuHFu8DFgLY;KWN`m-E4+|7D$>b>JyiLEg>QNrWYlFX0g?$R(&aht$ zbQ8-N1LU_eZO_Ml;JD&K9?8^qk`zdXWP4Z0Ikn{w^zxvg`Q@qZtWv)*(E6RJ>|)zQ z=9J@EP39dQrHs-_1K7K0Wd7|75Q-u^kju z%g4Z?3sc?N>4{LH4S{-w)#A5%-VBll6rkf4EIGQ*= zm9%=y0fqUgnt=#bN&NL4ff2WMiK-JVhu@kSeG4eP4oEpVIT9V22rhu`bAjy~hlsud zd_UGPq%-)5P;D}>n#f7?rZa-u7Upy!l0Rp^+;m0|^Py*A1z6W?9h{i)ZSoV!P582R2{M5B-nLNDTBK(;2pWCi=SJGj|eE{%6Ly14|7x9tk0{m(b4*c zc|H3xvnqHjclo8h?As_}hit^3^8w*)+S52lk+7 zg2(icfG|0v;$e1TJd(17$Uieo(HKNopK+xq`pVPcQ_WQBz(!+pyOo-Lvi+&k-x#zcPlLhV>zZd)yF3B z{$W1`&cPQz%N{81BvD+d{-A_DGfbX?w6qFm8CKQv{3x^yT}m-^RK28(@_eG8KUJ^r z-UQN-x=CSD$v9+CP}v+0^}^FiIZx@kfS)7$EFa=Yb8e%TuPwLFBw|u~VL}BcP>fX% zlQ7Uqc3gp8mUokj;D2v}zn6(!REg4T87;Y$PE;TN91k|+t~D(^2vEF`yfnZIQ6#;X ziBT7CZS_e?$jw~Uv+5Q~H_x*RovC_OKPHA9L&X4IEsQn$z=V>#j+)3ov8X?*gY2@R zvGh}YES*v!uCgK#$xbR$7+Le2#(H3_R!~I4L1RSSBLYqpzjQ#sW)+l1afmA)$*nRy z6N^|1Vk;ldZ8Q&-Qf4X5UAhARZR0Z+ygF z!~S71JYz^X{LV-Kg1ie+8H{x^{7Lc&7?`_gWiT#o)%+wCV{n+XHO;srwDP>6pST6+ ziS#;y_C(Er}5 zp{1ZwQXt3lp9oSh5f>z*=|sFc#`sd`FOOe9Y}F@W3e|6mpu~<$tSk{9on+KV4Xv30 zV(#&tXylm?RnQ_`E#y`qsZLUF)pO)jFso#SW`kbJ$64_~Xj@U4JnqCGuZn)6P_d>p z6DaJY<~9x1b88i~P%F_ytKWg^m@rz9Xbw4nLe;3(LwGGdcxEK^ zK#_DZq7`Ium0q(LJ*U+yivy#|d4S~6nK==`39iE4L=l&1_AWQ$r?z$& zrrXCadq72S@)AFsoH=lCd`ADC!#ibzQEMEu@L#= zeG8o9#l{Es4maZ-uSx+q%ioU9lxb$hdG`y#N9UN$f+YSH3DdOaMtAi?UjPlYxr>o$ zJKbkioxB*{TYSpeI`0x|>ou1G_|S6DRkzeTs(dHD&JysZ*e$8@MS);Zvn-0vck4Bm zL=UB9e0|g;aQO=v!k^YhfQ+{WAdSWEIKeXaBR;hc4e~Mpsf7~>@&LO zeH?9Kpv7Szbipepfr5;I%``G_jPhB;pqv9 z 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

      (V1u|vUFPnr?I|1 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≦z0caF6-)R*~a_$*}Vr08aQ&mByLRfnC=sM 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

      4v2;gC~JtnUROn^x^Io|%I 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

      cJo1dvx%QkNbBA&;PEE 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 L)}p>dJ?M^N8f@Id-{LcF2>^m*^`KD_#V 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ð;X3-a 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 CGYQTB diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/output/x86/liblibwavpack.a b/sources/LabSound/third_party/libnyquist/third_party/wavpack/output/x86/liblibwavpack.a deleted file mode 100644 index 997a041f9d71e387fc6bf6f6a73db7994d473e77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 210856 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�_l`Q(VwJh&uJYCTR87 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 ibDF17n<_wZ&6ZpOx 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 diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/output/x86_64/liblibnyquist.a b/sources/LabSound/third_party/libnyquist/third_party/wavpack/output/x86_64/liblibnyquist.a deleted file mode 100644 index c0c3a12eb75ad72ac581d36db67f51cf2eff0e34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2442692 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 z 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

      4Q=&&I_J5{ENZ7sSs{k)bH{@@ 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�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

      T8Fna#3O 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�hJG_d_?7ADxXlPqw*=0&!~J(dT~J`- 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 ALI3~& diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/output/x86_64/liblibwavpack.a b/sources/LabSound/third_party/libnyquist/third_party/wavpack/output/x86_64/liblibwavpack.a deleted file mode 100644 index c1f4795f638b2ca4effc1abe77c4408961710acf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 228388 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 diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/common_utils.c b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/common_utils.c deleted file mode 100644 index c53db918..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/common_utils.c +++ /dev/null @@ -1,771 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2013 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// common_utils.c - -// This module provides a lot of the trivial WavPack API functions and several -// functions that are common to both reading and writing WavPack files (like -// WavpackCloseFile()). Functions here are restricted to those that have few -// external dependancies and this is done so that applications that statically -// link to the WavPack library (like the command-line utilities on Windows) -// do not need to include the entire library image if they only use a subset -// of it. This module will be loaded for ANY WavPack application. - -#include -#include -#include - -#include "wavpack_local.h" - -#ifndef LIBWAVPACK_VERSION_STRING -#include "wavpack_version.h" -#endif - -///////////////////////////// local table storage //////////////////////////// - -const uint32_t sample_rates [] = { 6000, 8000, 9600, 11025, 12000, 16000, 22050, - 24000, 32000, 44100, 48000, 64000, 88200, 96000, 192000 }; - -///////////////////////////// executable code //////////////////////////////// - -// This function obtains general information about an open input file and -// returns a mask with the following bit values: - -// MODE_WVC: a .wvc file has been found and will be used for lossless -// MODE_LOSSLESS: file is lossless (either pure or hybrid) -// MODE_HYBRID: file is hybrid mode (either lossy or lossless) -// MODE_FLOAT: audio data is 32-bit ieee floating point -// MODE_VALID_TAG: file conatins a valid ID3v1 or APEv2 tag -// MODE_HIGH: file was created in "high" mode (information only) -// MODE_FAST: file was created in "fast" mode (information only) -// MODE_EXTRA: file was created using "extra" mode (information only) -// MODE_APETAG: file contains a valid APEv2 tag -// MODE_SFX: file was created as a "self-extracting" executable -// MODE_VERY_HIGH: file was created in the "very high" mode (or in -// the "high" mode prior to 4.4) -// MODE_MD5: file contains an MD5 checksum -// MODE_XMODE: level used for extra mode (1-6, 0=unknown) -// MODE_DNS: dynamic noise shaping - -int WavpackGetMode (WavpackContext *wpc) -{ - int mode = 0; - - if (wpc) { - if (wpc->config.flags & CONFIG_HYBRID_FLAG) - mode |= MODE_HYBRID; - else if (!(wpc->config.flags & CONFIG_LOSSY_MODE)) - mode |= MODE_LOSSLESS; - - if (wpc->wvc_flag) - mode |= (MODE_LOSSLESS | MODE_WVC); - - if (wpc->lossy_blocks) - mode &= ~MODE_LOSSLESS; - - if (wpc->config.flags & CONFIG_FLOAT_DATA) - mode |= MODE_FLOAT; - - if (wpc->config.flags & (CONFIG_HIGH_FLAG | CONFIG_VERY_HIGH_FLAG)) { - mode |= MODE_HIGH; - - if ((wpc->config.flags & CONFIG_VERY_HIGH_FLAG) || - (wpc->streams && wpc->streams [0] && wpc->streams [0]->wphdr.version < 0x405)) - mode |= MODE_VERY_HIGH; - } - - if (wpc->config.flags & CONFIG_FAST_FLAG) - mode |= MODE_FAST; - - if (wpc->config.flags & CONFIG_EXTRA_MODE) - mode |= (MODE_EXTRA | (wpc->config.xmode << 12)); - - if (wpc->config.flags & CONFIG_CREATE_EXE) - mode |= MODE_SFX; - - if (wpc->config.flags & CONFIG_MD5_CHECKSUM) - mode |= MODE_MD5; - - if ((wpc->config.flags & CONFIG_HYBRID_FLAG) && (wpc->config.flags & CONFIG_DYNAMIC_SHAPING) && - wpc->streams && wpc->streams [0] && wpc->streams [0]->wphdr.version >= 0x407) - mode |= MODE_DNS; - -#ifndef NO_TAGS - if (valid_tag (&wpc->m_tag)) { - mode |= MODE_VALID_TAG; - - if (valid_tag (&wpc->m_tag) == 'A') - mode |= MODE_APETAG; - } -#endif - - mode |= (wpc->config.qmode << 16) & 0xFF0000; - } - - return mode; -} - -// This function obtains information about specific file features that were -// added for version 5.0, specifically qualifications added to support CAF -// and DSD files. Except for indicating the presence of DSD data, these -// bits are meant to simply indicate the format of the data in the original -// source file and do NOT indicate how the library will return the data to -// the appication (which is always the same). This means that in general an -// application that simply wants to play or process the audio data need not -// be concerned about these. If the file is DSD audio, then either of the -// QMDOE_DSD_LSB_FIRST or QMODE_DSD_MSB_FIRST bits will be set (but the -// DSD audio is always returned to the caller MSB first). - -// QMODE_BIG_ENDIAN 0x1 // big-endian data format (opposite of WAV format) -// QMODE_SIGNED_BYTES 0x2 // 8-bit audio data is signed (opposite of WAV format) -// QMODE_UNSIGNED_WORDS 0x4 // audio data (other than 8-bit) is unsigned (opposite of WAV format) -// QMODE_REORDERED_CHANS 0x8 // source channels were not Microsoft order, so they were reordered -// QMODE_DSD_LSB_FIRST 0x10 // DSD bytes, LSB first (most Sony .dsf files) -// QMODE_DSD_MSB_FIRST 0x20 // DSD bytes, MSB first (Philips .dff files) -// QMODE_DSD_IN_BLOCKS 0x40 // DSD data is blocked by channels (Sony .dsf only) - -int WavpackGetQualifyMode (WavpackContext *wpc) -{ - return wpc->config.qmode & 0xFF; -} - -// This function returns a pointer to a string describing the last error -// generated by WavPack. - -char *WavpackGetErrorMessage (WavpackContext *wpc) -{ - return wpc->error_message; -} - -// Get total number of samples contained in the WavPack file, or -1 if unknown - -uint32_t WavpackGetNumSamples (WavpackContext *wpc) -{ - return (uint32_t) WavpackGetNumSamples64 (wpc); -} - -int64_t WavpackGetNumSamples64 (WavpackContext *wpc) -{ - return wpc ? wpc->total_samples : -1; -} - -// Get the current sample index position, or -1 if unknown - -uint32_t WavpackGetSampleIndex (WavpackContext *wpc) -{ - return (uint32_t) WavpackGetSampleIndex64 (wpc); -} - -int64_t WavpackGetSampleIndex64 (WavpackContext *wpc) -{ - if (wpc) { -#ifdef ENABLE_LEGACY - if (wpc->stream3) - return get_sample_index3 (wpc); - else if (wpc->streams && wpc->streams [0]) - return wpc->streams [0]->sample_index; -#else - if (wpc->streams && wpc->streams [0]) - return wpc->streams [0]->sample_index; -#endif - } - - return -1; -} - -// Get the number of errors encountered so far - -int WavpackGetNumErrors (WavpackContext *wpc) -{ - return wpc ? wpc->crc_errors : 0; -} - -// return TRUE if any uncorrected lossy blocks were actually written or read - -int WavpackLossyBlocks (WavpackContext *wpc) -{ - return wpc ? wpc->lossy_blocks : 0; -} - -// Calculate the progress through the file as a double from 0.0 (for begin) -// to 1.0 (for done). A return value of -1.0 indicates that the progress is -// unknown. - -double WavpackGetProgress (WavpackContext *wpc) -{ - if (wpc && wpc->total_samples != -1 && wpc->total_samples != 0) - return (double) WavpackGetSampleIndex64 (wpc) / wpc->total_samples; - else - return -1.0; -} - -// Return the total size of the WavPack file(s) in bytes. - -uint32_t WavpackGetFileSize (WavpackContext *wpc) -{ - return (uint32_t) (wpc ? wpc->filelen + wpc->file2len : 0); -} - -int64_t WavpackGetFileSize64 (WavpackContext *wpc) -{ - return wpc ? wpc->filelen + wpc->file2len : 0; -} - -// Calculate the ratio of the specified WavPack file size to the size of the -// original audio data as a double greater than 0.0 and (usually) smaller than -// 1.0. A value greater than 1.0 represents "negative" compression and a -// return value of 0.0 indicates that the ratio cannot be determined. - -double WavpackGetRatio (WavpackContext *wpc) -{ - if (wpc && wpc->total_samples != -1 && wpc->filelen) { - double output_size = (double) wpc->total_samples * wpc->config.num_channels * - wpc->config.bytes_per_sample; - double input_size = (double) wpc->filelen + wpc->file2len; - - if (output_size >= 1.0 && input_size >= 1.0) - return input_size / output_size; - } - - return 0.0; -} - -// Calculate the average bitrate of the WavPack file in bits per second. A -// return of 0.0 indicates that the bitrate cannot be determined. An option is -// provided to use (or not use) any attendant .wvc file. - -double WavpackGetAverageBitrate (WavpackContext *wpc, int count_wvc) -{ - if (wpc && wpc->total_samples != -1 && wpc->filelen) { - double output_time = (double) wpc->total_samples / WavpackGetSampleRate (wpc); - double input_size = (double) wpc->filelen + (count_wvc ? wpc->file2len : 0); - - if (output_time >= 0.1 && input_size >= 1.0) - return input_size * 8.0 / output_time; - } - - return 0.0; -} - -// Calculate the bitrate of the current WavPack file block in bits per second. -// This can be used for an "instant" bit display and gets updated from about -// 1 to 4 times per second. A return of 0.0 indicates that the bitrate cannot -// be determined. - -double WavpackGetInstantBitrate (WavpackContext *wpc) -{ - if (wpc && wpc->stream3) - return WavpackGetAverageBitrate (wpc, TRUE); - - if (wpc && wpc->streams && wpc->streams [0] && wpc->streams [0]->wphdr.block_samples) { - double output_time = (double) wpc->streams [0]->wphdr.block_samples / WavpackGetSampleRate (wpc); - double input_size = 0; - int si; - - for (si = 0; si < wpc->num_streams; ++si) { - if (wpc->streams [si]->blockbuff) - input_size += ((WavpackHeader *) wpc->streams [si]->blockbuff)->ckSize; - - if (wpc->streams [si]->block2buff) - input_size += ((WavpackHeader *) wpc->streams [si]->block2buff)->ckSize; - } - - if (output_time > 0.0 && input_size >= 1.0) - return input_size * 8.0 / output_time; - } - - return 0.0; -} - -// This function allows retrieving the Core Audio File channel layout, many of which do not -// conform to the Microsoft ordering standard that WavPack requires internally (at least for -// those channels present in the "channel mask"). In addition to the layout tag, this function -// returns the reordering string (if stored in the file) to allow the unpacker to reorder the -// channels back to the specified layout (if it wants to restore the CAF order). The number of -// channels in the layout is determined from the lower nybble of the layout word (and should -// probably match the number of channels in the file), and if a reorder string is requested -// then that much space must be allocated. Note that all the reordering is actually done -// outside of this library, and that if reordering is done then the appropriate qmode bit -// will be set. -// -// Note: Normally this function would not be used by an application unless it specifically -// wanted to restore a non-standard channel order (to check an MD5, for example) or obtain -// the Core Audio channel layout ID. For simple file decoding for playback, the channel_mask -// should provide all the information required unless there are non-Microsoft channels -// involved, in which case WavpackGetChannelIdentities() will provide the identities of -// the other channels (if they are known). - -uint32_t WavpackGetChannelLayout (WavpackContext *wpc, unsigned char *reorder) -{ - if ((wpc->channel_layout & 0xff) && wpc->channel_reordering && reorder) - memcpy (reorder, wpc->channel_reordering, wpc->channel_layout & 0xff); - - return wpc->channel_layout; -} - -// This function provides the identities of ALL the channels in the file, including the -// standard Microsoft channels (which come first, in order, and are numbered 1-18) and also -// any non-Microsoft channels (which can be in any order and have values from 33-254). The -// value 0x00 is invalid and 0xFF indicates an "unknown" or "unnassigned" channel. The -// string is NULL terminated so the caller must supply enough space for the number -// of channels indicated by WavpackGetNumChannels(), plus one. -// -// Note that this function returns the actual order of the channels in the Wavpack file -// (i.e., the order returned by WavpackUnpackSamples()). If the file includes a "reordering" -// string because the source file was not in Microsoft order that is NOT taken into account -// here and really only needs to be considered if doing an MD5 verification or if it's -// required to restore the original order/file (like wvunpack does). - -void WavpackGetChannelIdentities (WavpackContext *wpc, unsigned char *identities) -{ - int num_channels = wpc->config.num_channels, index = 1; - uint32_t channel_mask = wpc->config.channel_mask; - unsigned char *src = wpc->channel_identities; - - while (num_channels--) { - if (channel_mask) { - while (!(channel_mask & 1)) { - channel_mask >>= 1; - index++; - } - - *identities++ = index++; - channel_mask >>= 1; - } - else if (src && *src) - *identities++ = *src++; - else - *identities++ = 0xff; - } - - *identities = 0; -} - -// For local use only. Install a callback to be executed when WavpackCloseFile() is called, -// usually used to dump some statistics accumulated during encode or decode. - -void install_close_callback (WavpackContext *wpc, void cb_func (void *wpc)) -{ - wpc->close_callback = cb_func; -} - -// Close the specified WavPack file and release all resources used by it. -// Returns NULL. - -WavpackContext *WavpackCloseFile (WavpackContext *wpc) -{ - if (wpc->close_callback) - wpc->close_callback (wpc); - - if (wpc->streams) { - free_streams (wpc); - - if (wpc->streams [0]) - free (wpc->streams [0]); - - free (wpc->streams); - } - -#ifdef ENABLE_LEGACY - if (wpc->stream3) - free_stream3 (wpc); -#endif - - if (wpc->reader && wpc->reader->close && wpc->wv_in) - wpc->reader->close (wpc->wv_in); - - if (wpc->reader && wpc->reader->close && wpc->wvc_in) - wpc->reader->close (wpc->wvc_in); - - WavpackFreeWrapper (wpc); - - if (wpc->channel_reordering) - free (wpc->channel_reordering); - -#ifndef NO_TAGS - free_tag (&wpc->m_tag); -#endif - -#ifdef ENABLE_DSD - if (wpc->decimation_context) - decimate_dsd_destroy (wpc->decimation_context); -#endif - - free (wpc); - - return NULL; -} - -// These routines are used to access (and free) header and trailer data that -// was retrieved from the Wavpack file. The header will be available before -// the samples are decoded and the trailer will be available after all samples -// have been read. - -uint32_t WavpackGetWrapperBytes (WavpackContext *wpc) -{ - return wpc ? wpc->wrapper_bytes : 0; -} - -unsigned char *WavpackGetWrapperData (WavpackContext *wpc) -{ - return wpc ? wpc->wrapper_data : NULL; -} - -void WavpackFreeWrapper (WavpackContext *wpc) -{ - if (wpc && wpc->wrapper_data) { - free (wpc->wrapper_data); - wpc->wrapper_data = NULL; - wpc->wrapper_bytes = 0; - } -} - -// Returns the sample rate of the specified WavPack file - -uint32_t WavpackGetSampleRate (WavpackContext *wpc) -{ - return wpc ? (wpc->dsd_multiplier ? wpc->config.sample_rate * wpc->dsd_multiplier : wpc->config.sample_rate) : 44100; -} - -// Returns the native sample rate of the specified WavPack file -// (provides the native rate for DSD files rather than the "byte" rate that's used for -// seeking, duration, etc. and would generally be used just for user facing reports) - -uint32_t WavpackGetNativeSampleRate (WavpackContext *wpc) -{ - return wpc ? (wpc->dsd_multiplier ? wpc->config.sample_rate * wpc->dsd_multiplier * 8 : wpc->config.sample_rate) : 44100; -} - -// Returns the number of channels of the specified WavPack file. Note that -// this is the actual number of channels contained in the file even if the -// OPEN_2CH_MAX flag was specified when the file was opened. - -int WavpackGetNumChannels (WavpackContext *wpc) -{ - return wpc ? wpc->config.num_channels : 2; -} - -// Returns the standard Microsoft channel mask for the specified WavPack -// file. A value of zero indicates that there is no speaker assignment -// information. - -int WavpackGetChannelMask (WavpackContext *wpc) -{ - return wpc ? wpc->config.channel_mask : 0; -} - -// Return the normalization value for floating point data (valid only -// if floating point data is present). A value of 127 indicates that -// the floating point range is +/- 1.0. Higher values indicate a -// larger floating point range. - -int WavpackGetFloatNormExp (WavpackContext *wpc) -{ - return wpc->config.float_norm_exp; -} - -// Returns the actual number of valid bits per sample contained in the -// original file, which may or may not be a multiple of 8. Floating data -// always has 32 bits, integers may be from 1 to 32 bits each. When this -// value is not a multiple of 8, then the "extra" bits are located in the -// LSBs of the results. That is, values are right justified when unpacked -// into ints, but are left justified in the number of bytes used by the -// original data. - -int WavpackGetBitsPerSample (WavpackContext *wpc) -{ - return wpc ? wpc->config.bits_per_sample : 16; -} - -// Returns the number of bytes used for each sample (1 to 4) in the original -// file. This is required information for the user of this module because the -// audio data is returned in the LOWER bytes of the long buffer and must be -// left-shifted 8, 16, or 24 bits if normalized longs are required. - -int WavpackGetBytesPerSample (WavpackContext *wpc) -{ - return wpc ? wpc->config.bytes_per_sample : 2; -} - -// If the OPEN_2CH_MAX flag is specified when opening the file, this function -// will return the actual number of channels decoded from the file (which may -// or may not be less than the actual number of channels, but will always be -// 1 or 2). Normally, this will be the front left and right channels of a -// multichannel file. - -int WavpackGetReducedChannels (WavpackContext *wpc) -{ - if (wpc) - return wpc->reduced_channels ? wpc->reduced_channels : wpc->config.num_channels; - else - return 2; -} - -// Free all memory allocated for raw WavPack blocks (for all allocated streams) -// and free all additonal streams. This does not free the default stream ([0]) -// which is always kept around. - -void free_streams (WavpackContext *wpc) -{ - int si = wpc->num_streams; - - while (si--) { - if (wpc->streams [si]->blockbuff) { - free (wpc->streams [si]->blockbuff); - wpc->streams [si]->blockbuff = NULL; - } - - if (wpc->streams [si]->block2buff) { - free (wpc->streams [si]->block2buff); - wpc->streams [si]->block2buff = NULL; - } - - if (wpc->streams [si]->sample_buffer) { - free (wpc->streams [si]->sample_buffer); - wpc->streams [si]->sample_buffer = NULL; - } - - if (wpc->streams [si]->dc.shaping_data) { - free (wpc->streams [si]->dc.shaping_data); - wpc->streams [si]->dc.shaping_data = NULL; - } - -#ifdef ENABLE_DSD - if (wpc->streams [si]->dsd.probabilities) { - free (wpc->streams [si]->dsd.probabilities); - wpc->streams [si]->dsd.probabilities = NULL; - } - - if (wpc->streams [si]->dsd.summed_probabilities) { - free (wpc->streams [si]->dsd.summed_probabilities); - wpc->streams [si]->dsd.summed_probabilities = NULL; - } - - if (wpc->streams [si]->dsd.value_lookup) { - int i; - - for (i = 0; i < wpc->streams [si]->dsd.history_bins; ++i) - if (wpc->streams [si]->dsd.value_lookup [i]) - free (wpc->streams [si]->dsd.value_lookup [i]); - - free (wpc->streams [si]->dsd.value_lookup); - wpc->streams [si]->dsd.value_lookup = NULL; - } - - if (wpc->streams [si]->dsd.ptable) { - free (wpc->streams [si]->dsd.ptable); - wpc->streams [si]->dsd.ptable = NULL; - } -#endif - - if (si) { - wpc->num_streams--; - free (wpc->streams [si]); - wpc->streams [si] = NULL; - } - } - - wpc->current_stream = 0; -} - -void WavpackFloatNormalize (int32_t *values, int32_t num_values, int delta_exp) -{ - f32 *fvalues = (f32 *) values; - int exp; - - if (!delta_exp) - return; - - while (num_values--) { - if ((exp = get_exponent (*fvalues)) == 0 || exp + delta_exp <= 0) - *fvalues = 0; - else if (exp == 255 || (exp += delta_exp) >= 255) { - set_exponent (*fvalues, 255); - set_mantissa (*fvalues, 0); - } - else - set_exponent (*fvalues, exp); - - fvalues++; - } -} - -void WavpackLittleEndianToNative (void *data, char *format) -{ - unsigned char *cp = (unsigned char *) data; - int64_t temp; - - while (*format) { - switch (*format) { - case 'D': - temp = cp [0] + ((int64_t) cp [1] << 8) + ((int64_t) cp [2] << 16) + ((int64_t) cp [3] << 24) + - ((int64_t) cp [4] << 32) + ((int64_t) cp [5] << 40) + ((int64_t) cp [6] << 48) + ((int64_t) cp [7] << 56); - * (int64_t *) cp = temp; - cp += 8; - break; - - case 'L': - temp = cp [0] + ((int32_t) cp [1] << 8) + ((int32_t) cp [2] << 16) + ((int32_t) cp [3] << 24); - * (int32_t *) cp = (int32_t) temp; - cp += 4; - break; - - case 'S': - temp = cp [0] + (cp [1] << 8); - * (int16_t *) cp = (int16_t) temp; - cp += 2; - break; - - default: - if (isdigit (*format)) - cp += *format - '0'; - - break; - } - - format++; - } -} - -void WavpackNativeToLittleEndian (void *data, char *format) -{ - unsigned char *cp = (unsigned char *) data; - int64_t temp; - - while (*format) { - switch (*format) { - case 'D': - temp = * (int64_t *) cp; - *cp++ = (unsigned char) temp; - *cp++ = (unsigned char) (temp >> 8); - *cp++ = (unsigned char) (temp >> 16); - *cp++ = (unsigned char) (temp >> 24); - *cp++ = (unsigned char) (temp >> 32); - *cp++ = (unsigned char) (temp >> 40); - *cp++ = (unsigned char) (temp >> 48); - *cp++ = (unsigned char) (temp >> 56); - break; - - case 'L': - temp = * (int32_t *) cp; - *cp++ = (unsigned char) temp; - *cp++ = (unsigned char) (temp >> 8); - *cp++ = (unsigned char) (temp >> 16); - *cp++ = (unsigned char) (temp >> 24); - break; - - case 'S': - temp = * (int16_t *) cp; - *cp++ = (unsigned char) temp; - *cp++ = (unsigned char) (temp >> 8); - break; - - default: - if (isdigit (*format)) - cp += *format - '0'; - - break; - } - - format++; - } -} - -void WavpackBigEndianToNative (void *data, char *format) -{ - unsigned char *cp = (unsigned char *) data; - int64_t temp; - - while (*format) { - switch (*format) { - case 'D': - temp = cp [7] + ((int64_t) cp [6] << 8) + ((int64_t) cp [5] << 16) + ((int64_t) cp [4] << 24) + - ((int64_t) cp [3] << 32) + ((int64_t) cp [2] << 40) + ((int64_t) cp [1] << 48) + ((int64_t) cp [0] << 56); - * (int64_t *) cp = temp; - cp += 8; - break; - - case 'L': - temp = cp [3] + ((int32_t) cp [2] << 8) + ((int32_t) cp [1] << 16) + ((int32_t) cp [0] << 24); - * (int32_t *) cp = (int32_t) temp; - cp += 4; - break; - - case 'S': - temp = cp [1] + (cp [0] << 8); - * (int16_t *) cp = (int16_t) temp; - cp += 2; - break; - - default: - if (isdigit (*format)) - cp += *format - '0'; - - break; - } - - format++; - } -} - -void WavpackNativeToBigEndian (void *data, char *format) -{ - unsigned char *cp = (unsigned char *) data; - int64_t temp; - - while (*format) { - switch (*format) { - case 'D': - temp = * (int64_t *) cp; - *cp++ = (unsigned char) (temp >> 56); - *cp++ = (unsigned char) (temp >> 48); - *cp++ = (unsigned char) (temp >> 40); - *cp++ = (unsigned char) (temp >> 32); - *cp++ = (unsigned char) (temp >> 24); - *cp++ = (unsigned char) (temp >> 16); - *cp++ = (unsigned char) (temp >> 8); - *cp++ = (unsigned char) temp; - break; - - case 'L': - temp = * (int32_t *) cp; - *cp++ = (unsigned char) (temp >> 24); - *cp++ = (unsigned char) (temp >> 16); - *cp++ = (unsigned char) (temp >> 8); - *cp++ = (unsigned char) temp; - break; - - case 'S': - temp = * (int16_t *) cp; - *cp++ = (unsigned char) (temp >> 8); - *cp++ = (unsigned char) temp; - break; - - default: - if (isdigit (*format)) - cp += *format - '0'; - - break; - } - - format++; - } -} - -uint32_t WavpackGetLibraryVersion (void) -{ - return (LIBWAVPACK_MAJOR<<16) - |(LIBWAVPACK_MINOR<<8) - |(LIBWAVPACK_MICRO<<0); -} - -const char *WavpackGetLibraryVersionString (void) -{ - return LIBWAVPACK_VERSION_STRING; -} - diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/decorr_tables.h b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/decorr_tables.h deleted file mode 100644 index be17de95..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/decorr_tables.h +++ /dev/null @@ -1,1077 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2013 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// decorr_tables.h - -// These four tables specify the characteristics of the decorrelation filters -// for the four basic compression modes (fast, normal, high, and very high). -// -// The first entry in the table represents the "default" filter for the -// corresponding mode; subsequent entries represent filters that are tried -// in the "extra" modes 1-3 ("extra" modes 4-6 create filters from scratch). -// -// The first value indicates whether the filter is applied to joint stereo -// data (0=L/R, 1=M/S) and the second value represents the "delta" value of -// the adaptive filter. The rest of the values (2-16, depending on mode) are -// the "terms" of the filter. -// -// Each term represents one layer of the sequential filter, where positive -// values indicate the relative sample involved from the same channel (1=prev), -// 17 & 18 are special functions using the previous 2 samples, and negative -// values indicate cross channel decorrelation (in stereo only). -// -// It would be ideal if this was the only source for the decorrelation tables, -// but unfortunately the defaults (first entry) are duplicated in the assembly -// code for the function pack_decorr_mono_buffer() and there is no check in -// that code to make sure the correct filter is being passed in. SO, IF A -// CHANGE IS MADE HERE TO ONE OF THE DEFAULT FILTERS, THEN THE CORRESPONDING -// ASSEMBLY CODE MUST BE CHANGED ALSO, OR VERY CORRUPT FILES WILL RESULT!! -// -// Since this include file contains that actual tables as static const data, -// it should only be included from ONE source file (currently pack.c)! - -static const WavpackDecorrSpec fast_specs [] = { - { 1, 2,18,17 }, // 0 - { 1, 1,17,17 }, // 1 - { 0, 2,18,17 }, // 2 - { 0, 1,17,17 }, // 3 - { 1, 3, 1,18 }, // 4 - { 1, 1,17, 1 }, // 5 - { 0, 1, 1,17 }, // 6 - { 0, 1,-2,17 }, // 7 - { 0, 2,-1,17 }, // 8 - { 1, 1,17, 2 }, // 9 - { 0, 3,18,18 }, // 10 - { 0, 1,17, 1 }, // 11 - { 1, 6, 1, 2 }, // 12 - { 1, 1,17, 3 }, // 13 - { 0, 1,-2, 3 }, // 14 - { 0, 1, 2,17 }, // 15 - { 0, 1,18,-2 }, // 16 - { 0, 1,-1,17 }, // 17 - { 0, 1,18,17 }, // 18 - { 0, 1,17, 2 }, // 19 - { 1, 2,18,-2 }, // 20 - { 1, 1, 1,17 }, // 21 - { 0, 3,18, 2 }, // 22 - { 0, 1,17,-2 }, // 23 - { 0, 1,18,-2 }, // 24 - { 1, 2,17,-3 }, // 25 - { 0, 1,18, 3 }, // 26 - { 0, 1,18,18 }, // 27 - { 1, 1, 1, 3 }, // 28 - { 1, 1,18, 3 }, // 29 - { 1, 1, 1, 3 }, // 30 - { 0, 2,18,17 }, // 31 - { 1, 1, 1,17 }, // 32 - { 1, 1,17, 3 }, // 33 - { 0, 3,18,17 }, // 34 - { 0, 1,18,18 }, // 35 - { 1, 1, 1, 3 }, // 36 - { 1, 1, 1,18 }, // 37 - { 0, 1,18,-2 }, // 38 - { 0, 2,18,17 }, // 39 - { 0, 1,-1,18 }, // 40 - { 1, 1,17, 3 }, // 41 - { 0, 1,17, 2 }, // 42 - { 0, 1,17, 3 }, // 43 - { 1, 1,18, 2 }, // 44 - { 1, 1,17,-2 }, // 45 - { 0, 1, 1,-2 }, // 46 - { 0, 2,18,17 }, // 47 - { 0, 1,17,-2 }, // 48 - { 1, 1,17,-2 }, // 49 - { 0, 1,18, 3 }, // 50 - { 0, 1, 2,17 }, // 51 - { 1, 2,18,-3 }, // 52 - { 1, 2, 1,18 }, // 53 - { 1, 2,18, 2 }, // 54 - { 0, 1,17,-1 }, // 55 - { 0, 1,17,-2 }, // 56 - { 1, 1,17,-2 }, // 57 - { 1, 1, 1, 3 }, // 58 - { 0, 1, 1,17 }, // 59 - { 1, 2,18,-2 }, // 60 - { 1, 2,17,-3 }, // 61 - { 0, 2,18,17 }, // 62 - { 0, 2,18,17 }, // 63 - { 1, 1,17, 2 }, // 64 - { 1, 2,18,18 }, // 65 - { 0, 1,17, 2 }, // 66 - { 0, 1,18,17 }, // 67 - { 1, 1, 1,17 }, // 68 - { 1, 1,17, 2 }, // 69 - { 0, 2,18,18 }, // 70 - { 0, 2,18,17 }, // 71 - { 1, 2,17,-3 }, // 72 - { 1, 6, 1, 2 }, // 73 - { 0, 3,17,17 }, // 74 - { 0, 1, 1,18 }, // 75 - { 0, 1, 1,-2 }, // 76 - { 1, 1,17, 2 }, // 77 - { 0, 2,18,17 }, // 78 - { 0, 2,18,17 }, // 79 - { 1, 1,18, 3 }, // 80 - { 1, 2,17,-3 }, // 81 - { 0, 1,17, 2 }, // 82 - { 0, 1,17, 3 }, // 83 - { 0, 1,18,-2 }, // 84 - { 1, 1,18,18 }, // 85 - { 1, 6, 1, 2 }, // 86 - { 0, 2,18,17 }, // 87 - { 0, 2,18,17 }, // 88 - { 0, 1,-1,17 }, // 89 - { 1, 1,18, 3 }, // 90 - { 0, 1,17,18 }, // 91 - { 1, 1,17, 3 }, // 92 - { 0, 1,18, 3 }, // 93 - { 0, 2,18,17 }, // 94 - { 0, 2,18,17 }, // 95 - { 1, 2,18, 2 }, // 96 - { 0, 1,-2, 3 }, // 97 - { 0, 4,18,-1 }, // 98 - { 0, 2,18,18 }, // 99 - { 0, 1,-2, 3 }, // 100 - { 1, 1,17,-2 }, // 101 - { 0, 1,17, 3 }, // 102 - { 0, 2,18,17 }, // 103 - { 0, 2,-1,18 }, // 104 - { 1, 1, 2,17 }, // 105 - { 0, 2,17,-2 }, // 106 - { 0, 1,17, 2 }, // 107 - { 1, 2,18,-3 }, // 108 - { 0, 1,17,-2 }, // 109 - { 0, 2,18,17 }, // 110 - { 0, 2,18,17 }, // 111 - { 1, 1,17,-2 }, // 112 - { 1, 2,17,-3 }, // 113 - { 1, 1, 1, 3 }, // 114 - { 1, 1, 2,17 }, // 115 - { 1, 2,18, 2 }, // 116 - { 1, 1, 2,17 }, // 117 - { 1, 1,18, 2 }, // 118 - { 0, 2,18,17 }, // 119 - { 0, 2,18,17 }, // 120 - { 0, 1,17,-2 }, // 121 - { 0, 2,18,17 }, // 122 - { 0, 2,17,-1 }, // 123 - { 0, 2,18,-2 }, // 124 - { 0, 2,18,17 }, // 125 - { 0, 2,18,17 }, // 126 - { 0, 2,18,17 }, // 127 - { 1, 1, 1, 3 }, // 128 - { 0, 2,-2,17 }, // 129 - { 0, 2,18,-2 }, // 130 - { 0, 2,17,-2 }, // 131 - { 1, 1, 2,17 }, // 132 - { 1, 1, 1, 3 }, // 133 - { 0, 1, 2,17 }, // 134 - { 0, 2,18,17 }, // 135 - { 0, 3,-1,17 }, // 136 - { 1, 1, 2,17 }, // 137 - { 0, 2,18,18 }, // 138 - { 0, 1,17, 2 }, // 139 - { 1, 4,18,-3 }, // 140 - { 1, 1,18, 1 }, // 141 - { 0, 2,18,17 }, // 142 - { 0, 2,18,17 }, // 143 - { 1, 2,18,-1 }, // 144 - { 0, 1,-1,18 }, // 145 - { 1, 6, 1, 2 }, // 146 - { 1, 1,17, 2 }, // 147 - { 1, 4,18, 3 }, // 148 - { 0, 1, 1,17 }, // 149 - { 0, 1,18, 2 }, // 150 - { 0, 2,18,17 }, // 151 - { 0, 2,18,17 }, // 152 - { 1, 2,17, 2 }, // 153 - { 0, 2,18,-2 }, // 154 - { 0, 1, 1,18 }, // 155 - { 1, 2,18,-3 }, // 156 - { 0, 2,18,17 }, // 157 - { 0, 2,18,17 }, // 158 - { 0, 2,18,17 }, // 159 - { 1, 2,18,18 }, // 160 - { 1, 3,17,17 }, // 161 - { 0, 1,-2,17 }, // 162 - { 0, 1,17,18 }, // 163 - { 0, 1,-1, 3 }, // 164 - { 1, 1, 2,17 }, // 165 - { 0, 2,18,-1 }, // 166 - { 0, 2,18,17 }, // 167 - { 0, 2,18,17 }, // 168 - { 1, 1,17,-2 }, // 169 - { 1, 2,17, 2 }, // 170 - { 1, 1,18, 3 }, // 171 - { 0, 1,18, 2 }, // 172 - { 1, 2,17,-3 }, // 173 - { 0, 2,18,17 }, // 174 - { 0, 2,18,17 }, // 175 - { 0, 1,-2,17 }, // 176 - { 0, 1,17,-1 }, // 177 - { 0, 1,18,-1 }, // 178 - { 0, 2,18,17 }, // 179 - { 1, 2,17,-3 }, // 180 - { 1, 1, 1,18 }, // 181 - { 1, 3,18, 2 }, // 182 - { 0, 2,18,17 }, // 183 - { 0, 2,18,17 }, // 184 - { 0, 2,18,17 }, // 185 - { 0, 2,18,17 }, // 186 - { 0, 3,18,18 }, // 187 - { 0, 1, 1,-2 }, // 188 - { 0, 2,18,17 }, // 189 - { 0, 2,18,17 }, // 190 - { 0, 2,18,17 }, // 191 - { 1, 2,17,-3 }, // 192 - { 1, 1,18,18 }, // 193 - { 0, 2,18, 2 }, // 194 - { 0, 1,17,18 }, // 195 - { 1, 2,18, 2 }, // 196 - { 1, 1,17,-2 }, // 197 - { 0, 2,17,-1 }, // 198 - { 0, 2,18,17 }, // 199 - { 0, 2,18,17 }, // 200 - { 0, 2,18,17 }, // 201 - { 0, 1, 1,-2 }, // 202 - { 0, 1,18, 1 }, // 203 - { 1, 2,18,-2 }, // 204 - { 0, 1,17, 2 }, // 205 - { 0, 2,18,17 }, // 206 - { 0, 2,18,17 }, // 207 - { 1, 1,17, 3 }, // 208 - { 0, 1,17,-1 }, // 209 - { 0, 1,18, 2 }, // 210 - { 1, 1,17, 3 }, // 211 - { 1, 1,17,-2 }, // 212 - { 0, 1,18,18 }, // 213 - { 0, 2,18,17 }, // 214 - { 0, 2,18,17 }, // 215 - { 0, 2,18,17 }, // 216 - { 0, 2,18,17 }, // 217 - { 0, 2,18,17 }, // 218 - { 1, 1,17,18 }, // 219 - { 0, 1,-2, 3 }, // 220 - { 0, 2,18,17 }, // 221 - { 0, 2,18,17 }, // 222 - { 0, 2,18,17 }, // 223 - { 1, 2,18,-3 }, // 224 - { 0, 2,18,17 }, // 225 - { 0, 3,18, 2 }, // 226 - { 0, 1, 1,18 }, // 227 - { 0, 2,18,17 }, // 228 - { 0, 1,17,-1 }, // 229 - { 0, 2,18,17 }, // 230 - { 0, 2,18,17 }, // 231 - { 0, 2,18,17 }, // 232 - { 0, 1,-2, 3 }, // 233 - { 0, 3,17,17 }, // 234 - { 0, 2,18,17 }, // 235 - { 0, 2,18,17 }, // 236 - { 1, 1,17, 2 }, // 237 - { 0, 2,18,17 }, // 238 - { 0, 2,18,17 }, // 239 - { 1, 1,17, 2 }, // 240 - { 0, 2,18,17 }, // 241 - { 0, 2,18,17 }, // 242 - { 0, 2,18,17 }, // 243 - { 0, 2,18, 2 }, // 244 - { 0, 2,18,17 }, // 245 - { 0, 2,18,17 }, // 246 - { 0, 2,18,17 }, // 247 - { 0, 2,18,17 }, // 248 - { 0, 2,18,17 }, // 249 - { 0, 2,18,17 }, // 250 - { 0, 2,18,17 }, // 251 - { 0, 2,18,17 }, // 252 - { 0, 2,18,17 }, // 253 - { 0, 2,18,17 }, // 254 - { 0, 2,18,17 }, // 255 -}; - -static const WavpackDecorrSpec default_specs [] = { - { 1, 2,18,18, 2,17, 3 }, // 0 - { 0, 2,18,17,-1, 3, 2 }, // 1 - { 1, 1,17,18,18,-2, 2 }, // 2 - { 0, 2,18,17, 3,-2,17 }, // 3 - { 1, 2,18,17, 2,17, 3 }, // 4 - { 0, 1,18,18,-1, 2,17 }, // 5 - { 0, 1,17,17,-2, 2, 3 }, // 6 - { 0, 1,18,-2,18, 2,17 }, // 7 - { 1, 2,18,18,-1, 2, 3 }, // 8 - { 0, 2,18,17, 3, 2, 5 }, // 9 - { 1, 1,18,17,18, 2, 5 }, // 10 - { 0, 1,17,17,-2, 2, 3 }, // 11 - { 0, 1,18,-2,18, 2, 5 }, // 12 - { 0, 1,17,-2,17, 2,-3 }, // 13 - { 1, 1,17,-2,17, 1, 2 }, // 14 - { 0, 1,17,17,-2, 2, 3 }, // 15 - { 1, 1,18, 3, 1, 5, 4 }, // 16 - { 1, 4,18,18, 2, 3,-2 }, // 17 - { 0, 1, 1,-1,-1, 2,17 }, // 18 - { 0, 2,18,17, 3, 2, 5 }, // 19 - { 0, 1,18,18,18, 2,17 }, // 20 - { 0, 1,18,17,-1, 2,18 }, // 21 - { 1, 1,17, 3, 2, 1, 7 }, // 22 - { 0, 2,18,-2,18, 2, 3 }, // 23 - { 1, 3,18,-3,18, 2, 3 }, // 24 - { 0, 3,18,17, 2, 3,17 }, // 25 - { 1, 1,17,17, 2, 1, 4 }, // 26 - { 0, 1,17,18,-2, 2,17 }, // 27 - { 1, 1,18,18, 3, 5, 2 }, // 28 - { 0, 1,17,17, 2,18, 4 }, // 29 - { 0, 1,18,17, 1, 4, 6 }, // 30 - { 1, 1, 3,17,18, 2,17 }, // 31 - { 1, 1,17, 3, 2, 1, 7 }, // 32 - { 0, 1,18,17,-1, 2, 3 }, // 33 - { 1, 1,17,17, 2, 1, 4 }, // 34 - { 1, 2,18,17,-1,17, 3 }, // 35 - { 1, 2,18,17, 2, 3,-1 }, // 36 - { 0, 2,18,18,-2, 2,17 }, // 37 - { 0, 1,17,17, 2,18, 4 }, // 38 - { 0, 5,-2,18,18,18, 2 }, // 39 - { 1, 1,18,18,-1, 6, 3 }, // 40 - { 0, 1,17,17,-2, 2, 3 }, // 41 - { 1, 1,18,17,18, 2,17 }, // 42 - { 0, 1,18,17, 4, 3, 1 }, // 43 - { 0, 1,-2,18, 2, 2,18 }, // 44 - { 1, 2,18,18,-2, 2,-1 }, // 45 - { 1, 1,17,17, 2, 1, 4 }, // 46 - { 0, 1,17,18,-2, 2,17 }, // 47 - { 1, 1,17, 3, 2, 1, 7 }, // 48 - { 1, 3,18,-3,18, 2, 3 }, // 49 - { 1, 2,18,18,-2, 2,-1 }, // 50 - { 1, 1,18,18, 3, 5, 2 }, // 51 - { 0, 2,18,18,-1, 2,17 }, // 52 - { 0, 1,18,-1,17,18, 2 }, // 53 - { 0, 1,17,-1, 2, 3, 6 }, // 54 - { 0, 1,18,-2,18, 2, 5 }, // 55 - { 1, 2,18,18,-2, 2,-1 }, // 56 - { 0, 3,18,18, 2, 3,17 }, // 57 - { 0, 1,17,17, 2,18, 4 }, // 58 - { 1, 1,17,-2,17, 1, 2 }, // 59 - { 0, 1,-1, 3, 5, 4, 7 }, // 60 - { 0, 3,18,18, 3, 2, 5 }, // 61 - { 0, 1,17,17, 2,18, 4 }, // 62 - { 0, 1,18,17,-2,18, 3 }, // 63 - { 0, 2,18,18,-2, 2,17 }, // 64 - { 0, 3,18,17,-2, 2, 3 }, // 65 - { 1, 1,18,18,-2, 2,17 }, // 66 - { 0, 1,18,17, 4, 3, 1 }, // 67 - { 1, 2, 3,18,17, 2,17 }, // 68 - { 1, 2,18,18, 2,-2,18 }, // 69 - { 1, 2,18,18,-1,18, 2 }, // 70 - { 0, 2,18,18,-2, 2,17 }, // 71 - { 1, 3,18,18, 2, 3,-2 }, // 72 - { 0, 3,18,18, 3, 2, 5 }, // 73 - { 0, 1,18,-2,18, 2, 5 }, // 74 - { 1, 1,17, 3, 2, 1, 7 }, // 75 - { 1, 3,18,18,-2, 2,18 }, // 76 - { 1, 1,17,18,18,-2, 2 }, // 77 - { 0, 1,18,-2,18, 2, 5 }, // 78 - { 0, 2,18,-2,18, 2, 3 }, // 79 - { 0, 1,-1, 3, 4, 5, 7 }, // 80 - { 1, 1,17,17, 2,-1, 7 }, // 81 - { 0, 1,18,-1,-1, 2,-2 }, // 82 - { 0, 2,18,17, 2, 3,17 }, // 83 - { 0, 1,18,17, 2,18, 2 }, // 84 - { 0, 2,18,17,-1, 2,17 }, // 85 - { 0, 1, 1,18, 3, 2, 5 }, // 86 - { 0, 2,18,-2, 4,18, 2 }, // 87 - { 1, 1,18, 3, 1, 5, 4 }, // 88 - { 0, 1,18,17,18, 2, 5 }, // 89 - { 1, 1,18, 3, 1, 5, 4 }, // 90 - { 0, 4,18,18,-2, 2,18 }, // 91 - { 1, 1,18,18, 3, 2, 5 }, // 92 - { 1, 1,17,17, 2, 1, 4 }, // 93 - { 0, 2,18,18,-2,18, 2 }, // 94 - { 0, 2,18,18,-2,18, 2 }, // 95 - { 1, 1,18,18, 2, 1, 3 }, // 96 - { 1, 1,17,17, 2, 1, 4 }, // 97 - { 1, 2,17,17, 2,18, 3 }, // 98 - { 0, 1,18,17, 1, 4, 6 }, // 99 - { 1, 2,18,18,-2, 2,-1 }, // 100 - { 0, 1,18,-2,18, 2, 5 }, // 101 - { 1, 1,17, 2,18, 2,17 }, // 102 - { 0, 2,18,18,-2,18, 2 }, // 103 - { 0, 1,18,18, 3, 6,-1 }, // 104 - { 0, 1,18,17, 2,18, 3 }, // 105 - { 0, 1,18,17,-2, 2,17 }, // 106 - { 1, 1, 3,17,18, 2,17 }, // 107 - { 1, 3,18,-3,18, 2, 3 }, // 108 - { 1, 3,18,18,-3,18, 2 }, // 109 - { 1, 1,18, 3, 1, 5, 4 }, // 110 - { 0, 1,17,-2,17, 2,-3 }, // 111 - { 1, 1,18,18, 3, 5, 2 }, // 112 - { 1, 2,18,18,-2, 2,-1 }, // 113 - { 0, 1,18,-1,-1, 2,-2 }, // 114 - { 1, 1,18, 3, 1, 5, 4 }, // 115 - { 0, 3,18,17,-1, 2,17 }, // 116 - { 1, 3,18,17, 2,18,-2 }, // 117 - { 0, 2,18,18,-2,18, 2 }, // 118 - { 1, 2,18,18,-2, 2,-1 }, // 119 - { 1, 1,18, 3, 1, 5, 4 }, // 120 - { 0, 4, 3,18,18, 2,17 }, // 121 - { 0, 2,18,18,-2,18, 2 }, // 122 - { 1, 1,18,17,-1,18, 2 }, // 123 - { 0, 2,18,18,-2,18, 2 }, // 124 - { 0, 2,18,18,-2,18, 2 }, // 125 - { 0, 2,18,18,-2,18, 2 }, // 126 - { 0, 2,18,18,-2,18, 2 }, // 127 - { 1, 1,18,18,18, 3, 2 }, // 128 - { 0, 1,17,-1, 2, 3, 6 }, // 129 - { 0, 1,17,-1, 2, 3, 6 }, // 130 - { 0, 2,18,17,-2, 3, 2 }, // 131 - { 1, 3,18,17, 2,-2,18 }, // 132 - { 0, 2,18,18, 2,17, 3 }, // 133 - { 0, 1,18,18, 2,18,-2 }, // 134 - { 0, 2,18,-2, 4,18, 2 }, // 135 - { 0, 1,-2,18, 2, 2,18 }, // 136 - { 0, 2,18,17, 3, 6, 2 }, // 137 - { 0, 1,18,17,18, 2, 5 }, // 138 - { 0, 3,18,18,-2, 3, 2 }, // 139 - { 1, 1,18,18, 2,18, 5 }, // 140 - { 0, 1,17,-1, 2, 3, 6 }, // 141 - { 1, 4,18,18, 2, 3,-2 }, // 142 - { 0, 2,18,17,18, 2,-2 }, // 143 - { 0, 1, 1,18, 3, 2, 5 }, // 144 - { 1, 4,18,-2,18, 2, 3 }, // 145 - { 1, 2,18, 2,18, 3,-2 }, // 146 - { 0, 2,18,18,18, 2, 4 }, // 147 - { 0, 2, 3,17,18, 2,17 }, // 148 - { 1, 1,18,-1,18, 2,17 }, // 149 - { 1, 2,17,17, 2,18, 3 }, // 150 - { 0, 2,18,17,-2, 3, 2 }, // 151 - { 0, 1, 1,-1,-1, 2,17 }, // 152 - { 0, 3, 3,18,18, 2,17 }, // 153 - { 0, 1,18,-1,17,18, 2 }, // 154 - { 0, 1,18,17, 2,18, 3 }, // 155 - { 0, 2,18,18,-2,18, 2 }, // 156 - { 0, 1,18,17, 2,18, 2 }, // 157 - { 0, 2,18,18,-2,18, 2 }, // 158 - { 0, 2,18,18,-2,18, 2 }, // 159 - { 1, 2,17,17, 2,18, 3 }, // 160 - { 0, 1,18,17,-2, 2, 3 }, // 161 - { 0, 1,18,-2,18, 2, 5 }, // 162 - { 1, 4,18,-2,18, 2, 3 }, // 163 - { 1, 3,18,17, 2, 3, 6 }, // 164 - { 0, 2,18,18, 2,17, 3 }, // 165 - { 0, 2,18,17, 2,18, 2 }, // 166 - { 0, 2,18,18,-2,18, 2 }, // 167 - { 1, 1,18,18, 3, 5, 2 }, // 168 - { 0, 2,18,18,-2, 2, 3 }, // 169 - { 1, 2,18,17, 2,17, 3 }, // 170 - { 0, 1,18,17, 2, 3,18 }, // 171 - { 0, 2,18,18,-2,18, 2 }, // 172 - { 1, 4,18,18, 2, 3,-2 }, // 173 - { 0, 1,17,-2,17, 2,-3 }, // 174 - { 0, 1,17,17, 2,18, 4 }, // 175 - { 1, 1,18,18,18, 2, 4 }, // 176 - { 1, 2,18, 2,18, 3,-2 }, // 177 - { 1, 1,18,18,-2, 2,17 }, // 178 - { 0, 2,18,18,-2,18, 2 }, // 179 - { 0, 2,18,18, 2,17, 3 }, // 180 - { 0, 2,18,18,18, 2, 4 }, // 181 - { 0, 2,18,18,-2,18, 2 }, // 182 - { 0, 2,18,17,-2, 3, 2 }, // 183 - { 0, 1, 1,-1,-1, 2,17 }, // 184 - { 1, 4,18,18, 2, 3,-2 }, // 185 - { 0, 2,18,18,-2,18, 2 }, // 186 - { 0, 1,18,-2,18, 3, 2 }, // 187 - { 0, 2,18,18,-2,18, 2 }, // 188 - { 0, 2,18,18,-2,18, 2 }, // 189 - { 0, 2,18,18,-2,18, 2 }, // 190 - { 0, 2,18,18,-2,18, 2 }, // 191 - { 0, 1,18,18,-2, 2,17 }, // 192 - { 0, 3,18,17, 2, 3,17 }, // 193 - { 1, 2,18,18, 2,-2,18 }, // 194 - { 0, 1,-1, 3, 5, 4, 7 }, // 195 - { 1, 1,18, 3, 1, 5, 4 }, // 196 - { 1, 1,18,18,-2,18, 3 }, // 197 - { 0, 2,18,17,18, 2,-2 }, // 198 - { 0, 2,18,18, 2,17, 3 }, // 199 - { 1, 2,18, 2,18, 3,-2 }, // 200 - { 1, 4,18,18, 2, 3,-2 }, // 201 - { 1, 3,18,17, 2, 3, 6 }, // 202 - { 0, 2,18,18,-2,18, 2 }, // 203 - { 1, 2,18,17,-2,-1,17 }, // 204 - { 0, 1,17,-1, 2, 3, 6 }, // 205 - { 0, 2,18,18,-2,18, 2 }, // 206 - { 0, 2,18,18,-2, 2, 3 }, // 207 - { 1, 1,18,18,18, 2, 5 }, // 208 - { 0, 1,17,17,-2, 2, 3 }, // 209 - { 0, 2,18,18,-2,18, 2 }, // 210 - { 0, 2,18,17, 3, 6, 2 }, // 211 - { 0, 2,18,17,18, 2, 3 }, // 212 - { 0, 3,18,17,-3,18, 2 }, // 213 - { 0, 1,18,18,18, 2, 3 }, // 214 - { 0, 1,18,-2,-3, 2, 6 }, // 215 - { 0, 2,18,18,-2,18, 2 }, // 216 - { 1, 1,18,17,18, 2, 5 }, // 217 - { 0, 2,18,18,-2,18, 2 }, // 218 - { 0, 2,18,18,-2,18, 2 }, // 219 - { 1, 1,18,17,18, 2, 5 }, // 220 - { 0, 2,18,18,-2,18, 2 }, // 221 - { 0, 2,18,18,-2,18, 2 }, // 222 - { 0, 2,18,18,-2,18, 2 }, // 223 - { 0, 1,18,18,18, 2, 3 }, // 224 - { 1, 1,17,-2,17, 1, 2 }, // 225 - { 1, 1,17,17, 2,-1, 7 }, // 226 - { 0, 1,18,17, 4, 3, 1 }, // 227 - { 1, 3,18,-3,18, 2, 3 }, // 228 - { 0, 1, 1,18, 3, 2, 5 }, // 229 - { 0, 2,18,18,-2,18, 2 }, // 230 - { 0, 2,18,18,-2,18, 2 }, // 231 - { 0, 1,18,18, 3, 6, 2 }, // 232 - { 0, 1,17,17, 2,18, 4 }, // 233 - { 0, 1,17,17, 2,18, 4 }, // 234 - { 0, 2,18,18,-2,18, 2 }, // 235 - { 0, 2,18,18,-2,18, 2 }, // 236 - { 0, 2,18,18,-2,18, 2 }, // 237 - { 1, 2,18,-2,18, 3, 2 }, // 238 - { 1, 1,17,-2,17, 1, 2 }, // 239 - { 1, 1,18,18, 3, 2, 5 }, // 240 - { 0, 1,18,18,-1, 2, 3 }, // 241 - { 0, 2,18,18,-2,18, 2 }, // 242 - { 0, 2,18,18,-2,18, 2 }, // 243 - { 0, 1,18,17,18, 2, 5 }, // 244 - { 0, 2,18,18,-2,18, 2 }, // 245 - { 0, 2,18,18,-2,18, 2 }, // 246 - { 0, 2,18,18,-2,18, 2 }, // 247 - { 0, 2,18,18,-2,18, 2 }, // 248 - { 0, 1, 3,18,18, 2,17 }, // 249 - { 0, 2,18,18,-2,18, 2 }, // 250 - { 0, 2,18,18,-2,18, 2 }, // 251 - { 0, 2,18,18,-2,18, 2 }, // 252 - { 0, 2,18,18,-2,18, 2 }, // 253 - { 0, 2,18,18,-2,18, 2 }, // 254 - { 0, 2,18,18,-2,18, 2 }, // 255 -}; - -static const WavpackDecorrSpec high_specs [] = { - { 1, 2,18,18,18,-2, 2, 3, 5,-1,17, 4 }, // 0 - { 0, 1,18,17,-2, 2,18, 3, 7, 2, 5, 4 }, // 1 - { 1, 2, 1,18, 3, 6,-2,18, 2, 3, 4, 5 }, // 2 - { 0, 2,18,18,-2, 2,18, 3, 6, 2,17, 4 }, // 3 - { 1, 2,18,18, 2,18, 3, 2,-1, 4,18, 5 }, // 4 - { 1, 1, 7, 6, 5, 3, 4, 2, 5, 4, 3, 7 }, // 5 - { 1, 1,17, 3,18, 7, 2, 6, 1, 4, 3, 5 }, // 6 - { 1, 1,-2,18,18,18, 3,-2, 6, 5, 2, 1 }, // 7 - { 1, 2,18,18,-1,18, 2, 3, 6,-2,17, 5 }, // 8 - { 0, 1,17,17,18, 3, 6, 4, 5, 2,18,-2 }, // 9 - { 1, 2, 1,18,-2, 3, 5, 2, 4,-1, 6, 1 }, // 10 - { 0, 2,18,18, 3, 6,18, 2, 4, 8, 5, 3 }, // 11 - { 0, 1,-2, 1,18, 2,-2, 7,18, 2,-1, 5 }, // 12 - { 1, 1, 4, 3, 8, 1, 5, 2, 5, 6, 2, 8 }, // 13 - { 1, 1,17,18, 2, 6, 3, 4,-1, 1, 8, 6 }, // 14 - { 0, 1,18,18, 3, 6, 3,-2, 2, 5,-1, 1 }, // 15 - { 0, 1,18,18,17,-1, 2,-2,18, 3, 4, 5 }, // 16 - { 1, 2,18,17, 2,-2,18, 3, 5, 7, 2, 4 }, // 17 - { 1, 2,18,18, 3, 6,-2,18, 2, 5, 8, 3 }, // 18 - { 0, 1,18,17, 2,18,18, 2, 6, 5,17, 7 }, // 19 - { 1, 2,18,17, 2,18, 3, 2, 6,18,-1, 4 }, // 20 - { 1, 1, 5, 3, 6, 5, 3, 4, 1, 2, 4, 7 }, // 21 - { 1, 1, 5, 3, 6, 5, 3, 4, 1, 2, 4, 7 }, // 22 - { 0, 1,-2,18,18,18,-2, 3, 2, 4, 6, 5 }, // 23 - { 1, 2,18,17,-3, 3,-1,18, 2, 3, 6, 5 }, // 24 - { 0, 1,17,18, 7, 3,-2, 7, 1, 2, 4, 5 }, // 25 - { 1, 1, 2,18,18,-2, 2, 4,-1,18, 3, 6 }, // 26 - { 0, 3, 1,18, 4, 3, 5, 2, 4,18, 2, 3 }, // 27 - { 0, 1,-2,18, 2,18, 3, 7,18, 2, 6,-2 }, // 28 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 29 - { 1, 1,18,18, 5, 4, 6, 4, 5, 1, 4, 3 }, // 30 - { 1, 1,18, 3, 6, 5, 7, 8, 2, 3, 1,-1 }, // 31 - { 1, 1,18,18,18, 2,-2, 3, 5,18, 2, 8 }, // 32 - { 0, 2,18,17,-2, 2, 3,18,-3, 5, 2, 7 }, // 33 - { 1, 1, 1, 1,-1, 8,17, 3,-2, 2, 6,17 }, // 34 - { 0, 2,18,18,17, 2,-2, 3, 2, 4,18, 5 }, // 35 - { 1, 1,17,18, 2,-1, 5, 7,18, 3, 4, 6 }, // 36 - { 1, 1, 5, 4, 5,17, 3, 6, 3, 4, 7, 2 }, // 37 - { 0, 1,17, 3, 1, 7, 4, 2, 5,-2,18, 6 }, // 38 - { 0, 1,17,18, 2,18, 4, 3, 5, 7,-3, 6 }, // 39 - { 1, 2,17,17,-3,-2, 2, 8,18,-1, 3, 5 }, // 40 - { 0, 1,17,17,18, 2, 3, 6,-2, 8, 1, 7 }, // 41 - { 1, 1, 1, 2, 6,-2,18, 2, 5,-3, 7,-2 }, // 42 - { 0, 1,18,18, 3,18, 6, 8,-2, 2, 3, 5 }, // 43 - { 0, 1,18,17, 2,18,-2, 3, 7, 6, 2, 4 }, // 44 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 45 - { 1, 1,18,18, 2,-1, 3, 6, 1, 3, 4, 8 }, // 46 - { 0, 1,18,18, 3, 6, 5, 3,-2, 2,18,-1 }, // 47 - { 0, 1,18,17,-3,18, 2, 4,-2, 3, 6,17 }, // 48 - { 1, 3, 1, 2,17, 3,18, 7,-1, 5, 2, 4 }, // 49 - { 1, 1,18, 3,18, 6, 8,18,-2, 5, 7, 2 }, // 50 - { 0, 1,17, 2,18, 6, 3, 2, 5, 4, 8, 1 }, // 51 - { 0, 1,18,17,-1, 2, 3,18,18, 2, 3,17 }, // 52 - { 1, 1,18, 7, 6, 5, 5, 3, 1, 4, 2, 4 }, // 53 - { 1, 1, 6,17, 3, 8, 1, 5, 7,-1, 2, 1 }, // 54 - { 1, 1,18,-2,18, 3,-2, 2, 7, 4, 6,18 }, // 55 - { 1, 3,18,-3,18, 2, 3,18,-1, 7, 2, 5 }, // 56 - { 0, 2,18,-2, 7, 1, 3, 2, 4, 6,-3, 7 }, // 57 - { 1, 1,18,-2, 2,-3,18,-2,17,-1, 4, 2 }, // 58 - { 0, 3,17,17, 2, 5, 3, 7,18, 6, 4, 2 }, // 59 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 60 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 61 - { 1, 1,18,17, 4, 6, 6, 4, 5, 3, 4, 1 }, // 62 - { 0, 1,18, 5, 3, 6, 2, 3, 8, 1, 3, 7 }, // 63 - { 1, 2,18,17,-2, 2,18, 3, 5, 7,-1, 2 }, // 64 - { 0, 1, 1,18,18, 3, 6,-1, 4, 8, 5, 2 }, // 65 - { 1, 1, 1, 5, 3, 4, 1, 1, 3, 5, 7, 3 }, // 66 - { 0, 1, 3,18,18, 2,18,18,-1, 2, 3,18 }, // 67 - { 1, 2,18,18,-1,18, 2, 3, 4, 6,18, 5 }, // 68 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 69 - { 1, 1,18, 3, 1, 4, 5, 2, 7, 1, 3, 6 }, // 70 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 71 - { 1, 2,18,18,-1,18, 2, 3, 5,-2, 6, 8 }, // 72 - { 1, 1,17,18, 4, 8, 3, 2, 5, 2, 7, 6 }, // 73 - { 1, 4, 1, 2, 5,18,-2, 2, 3, 7,-1, 4 }, // 74 - { 0, 2,18,17,-1, 3, 6,18, 2, 3, 7, 5 }, // 75 - { 0, 1,-2,18, 2,-3, 6,18, 4, 3,-2, 5 }, // 76 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 77 - { 0, 1,17,17, 6, 2, 4, 8, 3, 5,-1,17 }, // 78 - { 1, 1,18, 3,18, 6, 8,18,-2, 5, 7, 2 }, // 79 - { 1, 2,17,17,-3, 2,18,-2, 8, 3, 6,-1 }, // 80 - { 1, 1,18,-2,17,18, 2, 3,-2, 6, 5, 4 }, // 81 - { 1, 2,18,17,-1, 3,18, 2, 5, 3, 6,-3 }, // 82 - { 0, 1,18,17, 2,18, 7,18, 2, 4, 3,17 }, // 83 - { 1, 3,18,18, 5, 6, 4, 3, 4,18, 6, 5 }, // 84 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 85 - { 1, 1, 7, 6, 5, 3, 4, 2, 5, 4, 3, 7 }, // 86 - { 0, 1,-2,18,18,18, 3, 6, 4, 2, 5, 2 }, // 87 - { 0, 3,18,17,-3,18, 3, 2, 5,-1,17, 3 }, // 88 - { 1, 1,17,18, 7, 3, 1, 7, 4, 2, 6, 5 }, // 89 - { 1, 1,18, 2,-2,-1,18, 5, 3,-2, 1, 2 }, // 90 - { 0, 3,18,18,-1, 3, 2, 7, 5,18, 4, 3 }, // 91 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 92 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 93 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 94 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 95 - { 1, 1,17,18, 2,-2, 4, 8,18, 3, 6, 5 }, // 96 - { 0, 2,18,17, 3, 5,-2, 7, 2,18, 3,-1 }, // 97 - { 1, 1,18, 2,-2,-1,18, 5, 3,-2, 1, 2 }, // 98 - { 0, 2, 3,17,18,18, 2, 5, 7, 6,18, 3 }, // 99 - { 1, 1,17,18,18, 4, 3, 2,18, 7, 8,-1 }, // 100 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 101 - { 0, 1,17, 1, 2, 3, 5, 6, 1, 4, 8,17 }, // 102 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 103 - { 0, 2,18,17,-1,18,-3, 2, 8, 3, 6,17 }, // 104 - { 1, 1,17,17, 1, 2, 4, 5,-1, 2, 1, 6 }, // 105 - { 1, 1, 1, 2, 6,-2,18, 2,-3, 3,-2, 5 }, // 106 - { 0, 1,18, 3,18, 6,18, 5, 2, 4,-1, 8 }, // 107 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 108 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 109 - { 1, 1,18,18,-1, 2,18, 3, 6, 4,-2, 7 }, // 110 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 111 - { 0, 2,-1,18,18,18, 2,-2, 4, 7, 2, 3 }, // 112 - { 0, 3, 3,17,-2, 5, 2, 7,18, 6, 4, 5 }, // 113 - { 0, 1,17, 6,18, 3, 8, 4, 5, 3, 8,18 }, // 114 - { 0, 2,18, 2, 6, 2,18, 3, 2, 4, 5, 8 }, // 115 - { 0, 1, 3,18,18, 2,18,-1, 2,18, 2,17 }, // 116 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 117 - { 0, 1, 3, 6,17,-2, 5, 1, 2, 7, 4, 8 }, // 118 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 119 - { 1, 3, 3,18,17, 5, 6, 2, 7,-2, 8,18 }, // 120 - { 1, 1,18,-1, 3, 1, 7, 2,-1, 4, 6,17 }, // 121 - { 1, 1,18, 2,-2,-1,18, 5, 3,-2, 1, 2 }, // 122 - { 0, 2,18, 1, 2,18, 3, 6, 5, 2, 4, 8 }, // 123 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 124 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 125 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 126 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 127 - { 1, 1,17,-2, 2,18,18, 8, 5, 3, 2, 6 }, // 128 - { 0, 1,18,17, 2,18, 3, 2, 7,-2,18, 4 }, // 129 - { 1, 2, 1,18, 2, 3,-1, 5, 6, 4, 7,17 }, // 130 - { 0, 2,18,17, 3, 6,-2, 2, 3, 8, 5,17 }, // 131 - { 0, 2,18,18, 3, 2,18,-1, 2, 4, 3,17 }, // 132 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 133 - { 1, 2,17,-1,18, 2, 3,-2, 5,18, 2, 7 }, // 134 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 135 - { 1, 2,18,-3,18, 2, 3,-2,18, 5, 6,-3 }, // 136 - { 0, 2,18,17, 3, 5,-2, 7, 2,18, 3,-1 }, // 137 - { 1, 1, 1,18,-1, 2, 3, 1,-2, 8, 2, 5 }, // 138 - { 0, 1,18,18, 3, 6,18, 2, 3, 4, 8, 5 }, // 139 - { 0, 1,-2, 1,18, 2,-2, 5, 7,18, 2,-1 }, // 140 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 141 - { 1, 1,17,18,-1, 2, 8, 3, 4, 5, 1, 7 }, // 142 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 143 - { 0, 2,18,18,-1, 2,18, 3,-2, 5, 4, 2 }, // 144 - { 1, 1,18,17, 2,18, 3, 8, 5, 2, 7,17 }, // 145 - { 0, 1,18,18, 3,18, 6, 8,-2, 2, 3, 5 }, // 146 - { 0, 1,18,18, 2,18, 2, 6,18, 2,17, 7 }, // 147 - { 1, 3,18,17,18, 2, 8,18, 5,-1, 3, 6 }, // 148 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 149 - { 1, 1,18, 7, 6, 5, 5, 3, 1, 4, 2, 4 }, // 150 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 151 - { 1, 2,18,17,-1, 3, 6,18, 2, 5, 8, 3 }, // 152 - { 0, 1,17,18,18, 4, 7, 2, 3,-2,18, 5 }, // 153 - { 1, 2,18, 1, 2, 6, 2, 5,18, 2, 4, 8 }, // 154 - { 0, 4,18, 4, 1, 2, 3, 5, 4, 1, 2, 6 }, // 155 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 156 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 157 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 158 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 159 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 160 - { 0, 2,18,17, 2,-1,18, 3,-3, 5, 2, 4 }, // 161 - { 0, 1,17,17, 3, 6, 3, 5,-2, 2,18,-1 }, // 162 - { 0, 2,18,18, 3,-2,18, 2,-3, 5, 3, 6 }, // 163 - { 1, 1,17,17, 2, 4, 1, 3, 5, 2, 6,-3 }, // 164 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 165 - { 0, 1,17, 1, 3, 2, 7, 1, 6, 3, 4, 8 }, // 166 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 167 - { 0, 1,17,-1,18, 2, 1, 5, 3, 8,-1,-2 }, // 168 - { 1, 1,17,18,-1, 8, 2, 5, 3, 4, 1, 6 }, // 169 - { 1, 2, 1,18, 3,-1, 5, 1, 2, 4, 7, 6 }, // 170 - { 0, 1,18,18, 3, 6, 5, 3,-2, 2,18,-1 }, // 171 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 172 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 173 - { 0, 1, 1,18,-1, 3, 8, 5, 6, 1, 2, 3 }, // 174 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 175 - { 0, 2,18,18, 2, 3, 6,18,-1, 4, 2, 3 }, // 176 - { 1, 1, 1, 3, 5,18, 2, 6, 7, 2, 3, 1 }, // 177 - { 1, 1, 1, 3, 8,18, 5, 2, 7, 1, 3,-2 }, // 178 - { 0, 2,17, 2,18, 3, 6, 2, 4, 5, 8, 3 }, // 179 - { 0, 1,18,17, 2,18, 3, 2, 7,-2,18, 4 }, // 180 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 181 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 182 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 183 - { 1, 2,18,-3,18,-1, 3,-2, 5, 7, 1, 2 }, // 184 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 185 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 186 - { 0, 3,18,18, 2, 6,18, 5,18, 2, 3,17 }, // 187 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 188 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 189 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 190 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 191 - { 1, 3, 1,-1, 1, 3,-2, 2, 5, 7,-3,18 }, // 192 - { 1, 2,18, 7, 3,-3, 2, 8, 2, 5, 4,17 }, // 193 - { 1, 1, 1, 4, 5, 1, 3, 4, 6, 7, 8, 3 }, // 194 - { 0, 1,18,17, 2,18,-1, 2, 3,18, 2, 4 }, // 195 - { 0, 2,18,18,-2,18, 2, 3, 4, 7, 5,17 }, // 196 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 197 - { 1, 1,17,18, 2, 1, 3, 2, 5, 1, 2, 3 }, // 198 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 199 - { 0, 2,18,18,-1, 2, 3, 5, 8, 6, 1,-2 }, // 200 - { 0, 1,17,18, 8, 3, 4, 6, 5, 2, 8, 7 }, // 201 - { 1, 2, 1, 3,-2,18, 2, 5, 1, 7,-1,-2 }, // 202 - { 0, 3,18,17,-1, 3,18, 2, 3, 6, 4,17 }, // 203 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 204 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 205 - { 1, 2,18,18, 4,18, 6, 7, 8, 3,18, 2 }, // 206 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 207 - { 0, 2,17,-3,17, 2,-2, 8, 3,18, 4,-3 }, // 208 - { 1, 1,18,17, 3, 5, 6, 2, 8, 1, 3, 7 }, // 209 - { 0, 1,18,18, 3, 6, 5, 3,-2, 2,18,-1 }, // 210 - { 0, 3,18,18, 2, 6,18, 5,18, 2, 3,17 }, // 211 - { 1, 1,18,18, 5, 4, 6, 4, 5, 1, 4, 3 }, // 212 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 213 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 214 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 215 - { 0, 2, 3,17,18,-3, 2, 5,18, 6,-1, 7 }, // 216 - { 1, 1,17,18, 3, 2, 5,-1, 6, 8, 4, 7 }, // 217 - { 1, 1,18, 1,-2, 3, 2, 1, 7, 6, 3, 4 }, // 218 - { 0, 3, 1, 2,17, 3,18, 2, 7, 5, 4,-1 }, // 219 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 220 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 221 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 222 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 223 - { 1, 1,17,-2, 2,18,18, 8, 5, 3, 2, 6 }, // 224 - { 0, 2,18, 5,18, 2, 3, 7,-2, 1, 6, 8 }, // 225 - { 0, 1, 2,-1,18,-1, 2, 4,-3, 5,18, 3 }, // 226 - { 0, 1, 3,17,18, 5, 2,18, 7, 3, 6, 5 }, // 227 - { 1, 4, 1, 2, 5,18,-2, 2, 3, 7,-1, 4 }, // 228 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 229 - { 0, 1, 1,18, 2, 1, 3, 4, 1, 5, 2, 7 }, // 230 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 231 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 232 - { 0, 1,17,17,18, 2, 4, 5,18,-2, 6, 3 }, // 233 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 234 - { 0, 2,18,18,-1, 3, 5, 6, 8,18, 2, 3 }, // 235 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 236 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 237 - { 0, 1,18,18, 4, 6, 8,18, 7, 3, 2, 5 }, // 238 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 239 - { 0, 2,-1,18,18,18, 2, 4,-2, 2, 3, 6 }, // 240 - { 0, 2,18,-2, 7, 1, 3, 2, 4, 6,-3, 7 }, // 241 - { 1, 1,17,18, 8, 3, 4, 6,-2, 5, 3, 8 }, // 242 - { 0, 2,18, 1, 2, 6, 2, 8, 3,18, 5, 4 }, // 243 - { 1, 1, 3,18,18, 2,18, 2,18, 3, 2,18 }, // 244 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 245 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 246 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 247 - { 1, 1, 3,17,18, 5, 2, 6, 7, 1, 4, 8 }, // 248 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 249 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 250 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 251 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 252 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 253 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 254 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2, 8 }, // 255 -}; - -static const WavpackDecorrSpec very_high_specs [] = { - { 1, 2,18,18, 2, 3,-2,18, 2, 4, 7, 5, 3, 6, 8,-1,18, 2 }, // 0 - { 0, 1,18,18,-1,18, 2, 3, 4, 6, 5, 7,18,-3, 8, 2,-1, 3 }, // 1 - { 1, 2, 1,18,-2, 4,18, 2, 3, 6,-1, 7, 5,-2,18, 8, 2, 4 }, // 2 - { 0, 1,17,17, 2, 3, 4,18,-1, 5, 6, 7,18, 2, 8,17, 3,-2 }, // 3 - { 1, 1,18,18, 2,18, 3, 2,18, 4,-1, 3,18, 2, 6, 8,17, 5 }, // 4 - { 0, 2,18,17, 2, 3,-2, 5,18,-3, 2, 4, 7, 3, 6, 8, 5,17 }, // 5 - { 1, 1,18,-2, 2,-3,18, 5,-2,18, 2, 3, 6, 2,17, 4, 7,-1 }, // 6 - { 1, 1,17, 8,18, 3,-2, 2, 5, 4,18, 6, 3, 8, 7, 2, 5, 4 }, // 7 - { 0, 2,18,17,-2, 2,18, 3, 2, 5,-3, 4, 7,18, 3, 8, 6, 2 }, // 8 - { 1, 1, 3, 6, 5, 5, 1, 3, 7, 4, 2, 6, 4,18, 3, 7, 5, 6 }, // 9 - { 1, 2, 1,18, 3, 2,-2, 1, 5, 4, 6, 2, 7, 1, 8, 3,-1, 1 }, // 10 - { 0, 1,18,18, 2, 3, 6, 3, 5,-2, 2, 4,18, 3,-2,-1, 6, 7 }, // 11 - { 0, 1,-2,18, 2,18, 7, 2, 6,-2, 3, 4,18,18, 2,-3, 8, 5 }, // 12 - { 0, 2,18,18,18, 2, 4, 3,18, 5, 3, 6,-2, 2, 4,18, 8, 7 }, // 13 - { 0, 1,-2, 1,18, 2,-2,18,-1, 5, 7, 2, 3, 4,18, 2, 6, 2 }, // 14 - { 1, 1,17,18, 3, 2, 1, 7,-1, 2, 4, 3, 5, 6,-2,18, 7, 8 }, // 15 - { 1, 1,18,18, 2,18, 3, 4, 6,-2,18, 5, 8, 2, 3, 7, 4,-1 }, // 16 - { 0, 1,18,18,18,-1, 2, 3, 4, 6, 8,18, 3, 5, 2, 6, 7, 4 }, // 17 - { 1, 1,17,-2,18,18, 2, 5, 3, 8, 2,-1, 6, 1, 3, 4, 7, 5 }, // 18 - { 0, 1,17,17,18, 2, 3, 6,-2, 8, 1, 7, 5, 2, 3, 1, 4, 8 }, // 19 - { 1, 1,17,17, 3, 2, 7, 1, 4, 3, 6, 2, 5,-2, 8, 7,18, 6 }, // 20 - { 0, 1,18,17,-2, 2,18, 3,-3, 7, 6, 5, 2, 4,-1, 8, 3,17 }, // 21 - { 1, 1, 2,18,18,-2, 2, 4,-1, 5,18, 3, 8, 6, 2, 7,17, 4 }, // 22 - { 0, 1,17, 3, 6, 8, 5, 4, 3, 8, 1,18, 7, 2, 4, 5, 6, 3 }, // 23 - { 1, 2,17,18, 4, 8, 3, 2, 5, 7, 6, 8, 2, 7,-2,18, 3, 4 }, // 24 - { 1, 1, 6, 5, 5, 3, 4, 7, 3, 2, 4, 6, 3, 7, 1, 5, 2, 4 }, // 25 - { 1, 1, 1,18,-1, 2, 1, 3, 8,-2, 2, 5, 6, 3, 8, 7,18, 4 }, // 26 - { 0, 1, 1,17,-1,18, 3, 2, 5, 4, 6, 7, 8, 3, 4, 2, 1,-2 }, // 27 - { 0, 1,18, 2,18,18, 2,18, 6,-2,18, 7, 5, 4, 3, 2,18,-2 }, // 28 - { 0, 3, 1, 4,18, 3, 2, 4, 1, 5, 2, 3, 6,18, 8, 7, 2, 4 }, // 29 - { 0, 1,17,-2, 1,-3, 2,18, 3,-2, 4,18, 3, 6, 7,-3, 2, 8 }, // 30 - { 1, 1,17,18,18, 4, 2, 3, 7, 6,18, 8, 5,-1, 4, 2, 3,17 }, // 31 - { 1, 2,18,-1,17,18, 2, 3,-2,18, 5, 8, 2, 4, 3, 7, 6,-1 }, // 32 - { 1, 1,18,18,18,-2, 4, 2, 3,18, 5, 8, 2, 4, 6, 7,-2, 3 }, // 33 - { 1, 2,18,18,-2,18,-1, 3, 2, 5,18,-2, 7, 2, 3, 4, 6, 8 }, // 34 - { 0, 1,17,18,-1, 2, 4,18, 8, 3, 6, 5, 7,-3, 2, 4, 3,17 }, // 35 - { 1, 1,18,18,17, 2,-1,18, 3, 2,18, 6, 5, 4,18, 7, 2,-1 }, // 36 - { 0, 2, 1,18,-1,18, 3, 2, 4, 6,-3, 7,-1, 5, 1, 2, 3, 8 }, // 37 - { 1, 1, 1,17,-2, 2,-3, 6, 3, 5, 1, 2, 7, 6, 8,-2, 4, 1 }, // 38 - { 0, 1,17,-1, 5, 1, 4, 3, 6, 2,-2,18, 3, 2, 4, 5, 8,-1 }, // 39 - { 0, 2,18,18,17, 2, 3,-2, 5,18, 2, 4, 7, 8, 6,17, 3, 5 }, // 40 - { 1, 1, 1, 5, 1, 3, 4, 3, 7, 5, 1, 3, 6, 1, 2, 4, 3, 8 }, // 41 - { 1, 2, 1,-1, 3, 2,18, 7,-2, 5, 2, 6, 4, 3,-1,18, 8, 7 }, // 42 - { 0, 2,18,17, 3,18, 2, 5, 4, 3, 6, 2, 7, 8,18, 3, 4, 5 }, // 43 - { 1, 1, 3, 6,17, 8, 7, 5,18,-1, 1, 2, 3, 4, 2, 6, 8, 1 }, // 44 - { 0, 2,18,18, 3,-3,18, 2, 6, 5, 3, 7,18, 4,-2, 8, 2, 3 }, // 45 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 46 - { 1, 1,17, 1, 7, 2, 3,18,-2, 3, 6, 4, 2, 7, 8, 5, 3,17 }, // 47 - { 1, 1, 3, 6, 5, 5, 1, 3, 7, 4, 2, 6, 4,18, 3, 7, 5, 6 }, // 48 - { 0, 1,18,18,18, 2, 4,-1,18, 8,-1, 2, 3, 4, 6,-2, 1, 7 }, // 49 - { 1, 1,18,-2,17,18, 2, 6, 3,-2, 5, 4, 7, 1,-3, 8, 2, 6 }, // 50 - { 0, 1,17,18,18, 4, 2, 7, 3, 6,-2,18, 8, 4, 5, 2, 7,17 }, // 51 - { 1, 1,18,18, 5, 4, 6, 4, 1, 5, 4, 3, 2, 5, 6, 1, 4, 5 }, // 52 - { 0, 1,18,18,-2,18, 2,-3, 3, 8, 5,18, 6, 4, 3,-1, 7, 2 }, // 53 - { 1, 1,18, 2,-2,-3,18, 5, 2, 3,-2, 4, 6, 1,-3, 2, 7, 8 }, // 54 - { 0, 1,18, 3, 5, 8, 2, 6, 7, 3, 1, 5, 2,-1, 8, 6, 7, 4 }, // 55 - { 1, 1, 4, 3, 8, 1, 5, 6, 2, 5, 8,-2, 2, 7, 3,18, 5, 4 }, // 56 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 57 - { 1, 1,17, 3,18,18, 7, 2, 4,18, 6, 2, 3,-1, 8, 5,18,-3 }, // 58 - { 0, 1, 3,17,18, 2,18, 6, 7,-3,18, 2, 5, 6, 3, 8, 7,-1 }, // 59 - { 1, 1,18,18, 2,18,18, 2,-1, 7, 3,18, 5, 2, 6, 4,-1,18 }, // 60 - { 0, 3,18, 3, 4, 1, 5, 2,18, 4, 2, 3,18, 7, 6, 1, 2, 4 }, // 61 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 62 - { 1, 1,17, 1,18, 2, 3, 6, 4, 5, 7,18, 3, 8, 2, 4,-2,17 }, // 63 - { 1, 2,18,17, 2, 3, 5,18, 6,-2, 7, 3, 2, 4,18, 8,-1, 5 }, // 64 - { 0, 2, 1,18,-1,18, 3, 2, 4, 6,-3, 7,-1, 5, 1, 2, 3, 8 }, // 65 - { 1, 1, 1,18,-1, 8, 2, 6, 3,-2, 1, 2, 5, 4,-3, 8, 6, 3 }, // 66 - { 0, 1,18,18, 2,18, 2,18, 7, 6,18, 2,-2, 3, 5, 4,18, 8 }, // 67 - { 1, 2,18,17, 2, 3,18,-1, 2, 3, 6,18, 5, 4, 3, 7, 2, 8 }, // 68 - { 1, 2,18,18, 3,-2, 4,18, 5, 7, 6, 2, 4,-3, 8, 5,18, 3 }, // 69 - { 1, 1,17,-2,18,18, 2, 5, 3, 8, 2,-1, 6, 1, 3, 4, 7, 5 }, // 70 - { 1, 1, 3,17,18, 5, 7, 2, 4, 6, 1, 8,-1, 3, 7, 4, 1, 2 }, // 71 - { 0, 2, 1,-2, 2,18, 3, 5, 2, 4, 7,-1, 2, 3, 5,18,-2, 4 }, // 72 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 73 - { 1, 1, 1, 2,-2, 6,18,-3, 2, 7, 3,-2, 5, 6, 1, 8, 2, 4 }, // 74 - { 0, 1,18,18,18, 3,-2, 6,18, 2, 4, 3, 5, 8, 7, 6, 2,-2 }, // 75 - { 1, 1, 1, 5, 1, 3, 4, 3, 7, 5, 1, 3, 6, 1, 2, 4, 3, 8 }, // 76 - { 0, 1, 3,17,18, 2, 5,18, 6, 7, 5,-2, 2, 4,18, 3, 6, 8 }, // 77 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 78 - { 0, 2,17,-1,18, 2, 4,-1, 8, 3,18, 7,-3, 4, 5, 1, 2,-2 }, // 79 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 8, 6, 4, 5, 7,-1 }, // 80 - { 1, 1,18,18, 3, 6, 4, 8,-2, 2, 5, 3, 7,18, 6, 8, 4, 2 }, // 81 - { 1, 1,17,18,18,-2, 5, 2, 3, 1, 4,-1, 8, 6, 5, 3, 2,18 }, // 82 - { 1, 1,17,17, 1, 2, 4, 5, 2, 6,-1, 3, 1, 1,-2, 4, 2, 7 }, // 83 - { 1, 1,17, 1, 7, 2, 3,18,-2, 3, 6, 4, 2, 7, 8, 5, 3,17 }, // 84 - { 0, 1,18,17,-2,-3, 1, 2, 3, 2, 5, 4, 7,-3, 6,-2, 2, 1 }, // 85 - { 1, 1, 1, 3, 5,18, 1, 2, 7, 3, 6, 2, 5, 8,-1, 1, 4, 7 }, // 86 - { 1, 1,17, 3, 6, 8, 1, 4, 5, 3,-2, 7, 2, 8, 5, 6,18, 3 }, // 87 - { 1, 1,17,18, 2, 4, 8,-2, 3, 1, 5, 6, 7, 1, 2, 3, 4, 7 }, // 88 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 89 - { 1, 1, 3, 1, 8,18, 5, 2, 3,18, 6, 7,-2, 4, 3, 2, 8,18 }, // 90 - { 0, 1,18,17, 2,18, 3, 4,-1,18, 7, 6, 2, 8, 4,18,18, 5 }, // 91 - { 0, 1,18,18, 2,18,18, 2, 7,-2, 6, 5, 4, 3,18, 3, 2,17 }, // 92 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 93 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 94 - { 1, 1,17, 8,18, 3, 2, 1, 5, 4, 6,-1, 3,-3, 8,18, 7, 2 }, // 95 - { 1, 2,18,17,18, 2, 3, 5,-2,18, 6,-1, 2, 3, 7, 4, 8,17 }, // 96 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 8, 6, 4, 5, 7,-1 }, // 97 - { 1, 2,18,18,-2,17, 2,18, 3, 4,18, 8, 7,-1, 2, 4, 5,17 }, // 98 - { 0, 2,17,-3,17, 3, 2,-2,18, 8, 4,-3, 2,18, 5, 3,-2, 6 }, // 99 - { 0, 1,18,18, 2,18,18, 2, 7,-2, 6, 5, 4, 3,18, 3, 2,17 }, // 100 - { 0, 2, 1,18,-1, 3, 5, 2,-3,18, 7, 3,-1, 6, 4, 2,17, 5 }, // 101 - { 1, 1,17,-2,17, 2,-3, 1, 5,-1, 4, 6, 3, 2, 8, 7,-2, 5 }, // 102 - { 1, 1, 1,18, 1, 3, 5, 8, 6, 2, 3,-1, 7, 1, 4, 8, 5,-3 }, // 103 - { 0, 2, 3,18,18, 2,18,-2, 6, 5, 7, 2, 4,18, 3, 6,-3, 5 }, // 104 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 105 - { 1, 1, 3, 6,17, 8, 7, 5,18,-1, 1, 2, 3, 4, 2, 6, 8, 1 }, // 106 - { 0, 4,18, 2,17, 3,18,-2, 2, 6,18, 2, 7, 3, 5, 4, 8,18 }, // 107 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 108 - { 0, 1,18,18, 2, 3, 6, 3, 5,-2, 2, 4,18, 3,-2,-1, 6, 7 }, // 109 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 110 - { 1, 1,17, 1, 2, 5, 3,-2, 1, 4, 3, 7, 6,-3, 2, 1, 1, 2 }, // 111 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 112 - { 1, 1,18,18,-2,18,-2, 2, 3, 6,18, 4,-1, 2, 3, 8, 1, 4 }, // 113 - { 1, 1,17,-2,17, 2,-3, 1, 5,-1, 4, 6, 3, 2, 8, 7,-2, 5 }, // 114 - { 0, 1,17,17,18, 3, 2,18,18, 6, 8, 2,-2, 3, 5, 4,17,18 }, // 115 - { 1, 1, 1, 5, 1, 3, 4, 3, 7, 5, 1, 3, 6, 1, 2, 4, 3, 8 }, // 116 - { 1, 1, 1, 3,-3,18,18, 6, 5,18, 2,-1, 3, 8, 7,-3, 4,17 }, // 117 - { 1, 1,18, 1, 2, 1, 3, 8, 7, 4, 1, 5, 2,-1,-3,18, 6, 2 }, // 118 - { 0, 1,18, 3, 5, 2, 6, 8,18, 5, 7, 2, 3,-1, 6, 7, 8, 5 }, // 119 - { 0, 2,18, 3,-2, 7, 8, 2, 5, 4,-3, 8, 3, 2,18, 5, 4, 6 }, // 120 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 121 - { 1, 3, 1, 1, 2, 5, 2, 7, 4, 3,-1,18,-2, 8, 2, 1, 6, 7 }, // 122 - { 0, 1, 3,17,18, 5, 2, 6, 7,18, 4, 5, 3, 6,18, 2, 7, 8 }, // 123 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 124 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 125 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 126 - { 0, 1, 1,18, 1, 2, 3, 5, 1, 2, 6, 7, 4, 3, 8, 1,17, 5 }, // 127 - { 1, 2,17,-1,18,-2, 2, 3, 5,18, 2, 4, 6, 7, 3,-1, 5, 8 }, // 128 - { 1, 1,18,18,-3,18,-2, 2, 3,-2,18, 6, 4, 5, 8, 3,17,-3 }, // 129 - { 1, 1,18, 7, 6, 5, 5, 3, 1, 4, 2, 7, 3, 4,-3, 6,18, 8 }, // 130 - { 0, 2,18,18, 2, 3, 5,18, 2, 4, 3, 6,18, 7, 8,-1, 5, 2 }, // 131 - { 0, 1,18,17,-1, 2,18, 3, 2,18, 4, 3,18, 2, 6, 5, 8,17 }, // 132 - { 0, 2,18,17, 2, 3,18, 5,-1, 6, 7, 8, 2, 3, 4, 5,18, 6 }, // 133 - { 1, 2,18,-3,18, 2, 3,-2,-3, 5,18, 7, 6, 2, 4, 3, 8,-2 }, // 134 - { 1, 1,17,18,18,-2, 2, 3, 5, 4, 8,18,-1, 5, 3, 6,-2, 7 }, // 135 - { 1, 2,18,17, 2,-2,18, 3,-1, 4,18, 2, 7, 5, 3, 8, 6, 4 }, // 136 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 137 - { 1, 1, 1, 5, 1, 3, 4, 3, 7, 5, 1, 3, 6, 1, 2, 4, 3, 8 }, // 138 - { 0, 2,18,18, 3, 3,-2, 2, 5,18, 6, 3,-1, 4, 7,-1, 1, 2 }, // 139 - { 0, 1,-2, 1,18, 2,-2, 5, 7,18, 3, 2, 6, 2,-1, 4,-2,17 }, // 140 - { 0, 2,18,18,18, 2, 3,-2,18, 5, 4, 2, 6, 8, 3,-2, 4,18 }, // 141 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 142 - { 1, 1,17,18,-1, 3, 2, 5, 1, 3, 2, 8, 4, 7, 6, 2,-1, 5 }, // 143 - { 1, 1,17,18,18, 4, 2, 3, 7, 6,18, 8, 5,-1, 4, 2, 3,17 }, // 144 - { 0, 1,18,18,-2,18, 2, 3, 4, 5, 6,18, 8, 2, 3, 7,-2, 4 }, // 145 - { 0, 1,18,-2,18,18,-3,-2, 2, 3, 5, 8, 1, 2, 6, 4, 7,-1 }, // 146 - { 0, 1,18,17, 2,18, 3,-2, 2, 7, 6, 4,18, 3, 8, 7, 4, 2 }, // 147 - { 1, 1,17,18,18, 4, 2, 3, 7, 6,18, 8, 5,-1, 4, 2, 3,17 }, // 148 - { 1, 1,18,17,18, 2, 5, 3,-2,18, 6, 2, 3, 4, 8, 7, 5,-1 }, // 149 - { 0, 1, 2,-1,18,-1, 2, 4,-3,18, 5, 3, 6,18, 2, 4, 7, 8 }, // 150 - { 1, 1,17,18, 8, 3, 6, 4,-1, 5, 2, 7, 3, 8, 6, 5,18, 4 }, // 151 - { 0, 2,18, 3,-2, 7, 8, 2, 5, 4,-3, 8, 3, 2,18, 5, 4, 6 }, // 152 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 153 - { 1, 1, 1,18,-1, 8, 2, 6, 3,-2, 1, 2, 5, 4,-3, 8, 6, 3 }, // 154 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 155 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 156 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 157 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 158 - { 0, 1,17,18,18, 4, 2, 7, 3, 6,-2,18, 8, 4, 5, 2, 7,17 }, // 159 - { 1, 2,18,-1,18, 3,-2,18, 2, 5, 3, 6, 7, 2,-1,18, 8, 4 }, // 160 - { 1, 2, 1,18,-2, 4,18, 2, 3, 6,-1, 7, 5,-2,18, 8, 2, 4 }, // 161 - { 1, 2, 1,18,-3, 2, 3,18,-1, 5, 6, 2, 8, 3, 4, 1,-2, 7 }, // 162 - { 0, 1, 1,17,-1,18, 3, 2, 5, 4, 6, 7, 8, 3, 4, 2, 1,-2 }, // 163 - { 1, 1,18,17,18, 4, 3, 5, 1, 2, 6, 3, 4, 7, 1, 8, 5, 2 }, // 164 - { 0, 1,18,-2, 7, 1, 3, 2,-3, 4, 6,-2, 7, 8, 1, 5, 4, 3 }, // 165 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 166 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 167 - { 0, 2,18,18,18,-2, 2, 5, 3, 7,18, 2, 4,-3, 5, 6, 3, 8 }, // 168 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 169 - { 0, 3, 3,18,-1, 5, 2, 7,18, 6, 5, 2, 4, 3,-1, 7,18, 6 }, // 170 - { 0, 2,18,18,18, 4, 3, 2, 6, 4, 8,18, 5, 3, 2, 7,-2, 6 }, // 171 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 172 - { 0, 2,18,18,18, 2, 3,-2,18, 5, 4, 2, 6, 8, 3,-2, 4,18 }, // 173 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 174 - { 1, 1,17, 8,18, 3, 2, 1, 5, 4, 6,-1, 3,-3, 8,18, 7, 2 }, // 175 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 176 - { 0, 1,-1,18,18,18, 2, 4, 6,-2, 2, 8, 3, 4,18, 7,-1, 6 }, // 177 - { 0, 1,18, 1,-2, 2, 4, 1, 3,-1, 2, 5, 7, 1, 6, 8,-2,17 }, // 178 - { 0, 1,17,17,18, 2, 5, 4,18, 3, 8, 7, 4, 6, 8, 1, 5, 2 }, // 179 - { 1, 2,18,18, 5, 4, 6, 3, 4,18, 8, 4,-1, 7, 5, 3, 6, 2 }, // 180 - { 0, 1,18,18,-3,18, 3, 6, 2, 5, 7,18, 3, 8,-1, 4, 5, 2 }, // 181 - { 1, 1,18, 2,-2,-3,18, 5, 2,-2, 4, 3, 6,18, 8,-1, 2, 7 }, // 182 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 183 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 184 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 185 - { 1, 1,17, 1, 7, 2, 3,18,-2, 3, 6, 4, 2, 7, 8, 5, 3,17 }, // 186 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 187 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 188 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 189 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 190 - { 0, 1,17,18, 3,18, 2, 5, 4, 7,-3, 6, 3, 2,18, 4, 7, 3 }, // 191 - { 1, 1, 1, 7, 4, 5, 3, 4, 5, 1, 3, 6, 3, 2, 4, 8,-2, 7 }, // 192 - { 0, 1, 1,18,-1,-2,18, 3, 2,-1, 6, 7, 4, 5, 3,18, 2,-3 }, // 193 - { 1, 1,18,18,-1, 3, 6,18, 5, 4, 8, 2, 3, 6,18, 7, 4,-2 }, // 194 - { 0, 2,18,18, 2, 6,18, 2,18, 5, 3,18, 2, 4, 7, 8, 3,18 }, // 195 - { 1, 1, 3,18,18, 5,18, 6, 2, 4, 7,-2,18, 5, 8, 6, 3, 2 }, // 196 - { 0, 1,18,-2, 7, 1, 3, 2,-3, 4, 6,-2, 7, 8, 1, 5, 4, 3 }, // 197 - { 1, 1,18,-2,18, 2, 5,18, 3,-2, 4, 7, 2,-1, 8, 6, 5, 1 }, // 198 - { 1, 1,17,17, 5,18, 4, 1, 2, 8, 6, 4,-2, 3, 5,-1, 1, 8 }, // 199 - { 0, 2, 1, 2,17, 3, 7,18, 2,-1, 4, 5,18, 2, 7, 3, 6, 8 }, // 200 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 201 - { 1, 1, 3, 6,17, 8, 7, 5,18,-1, 1, 2, 3, 4, 2, 6, 8, 1 }, // 202 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 203 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 204 - { 0, 2,18,18,18, 2,-2, 3, 6, 4, 8,18, 2, 5, 7, 4, 3, 6 }, // 205 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 206 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 207 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 208 - { 1, 1,18, 1, 8, 3, 5, 6, 4,-1, 8, 3, 7,18, 2, 5, 8, 4 }, // 209 - { 1, 1,17,18, 5, 2, 4, 3, 1, 6,-2, 1, 3, 2, 4, 5,-1,17 }, // 210 - { 1, 1,18,17, 2,18, 3,-3, 7, 2, 6, 4, 3, 5,18, 8, 2,-2 }, // 211 - { 1, 1,18,17,18, 4, 3, 5,-1,18, 2, 7, 8, 4, 6, 3,18, 5 }, // 212 - { 0, 1,18,17,18,-2, 2,-3, 3, 4, 8, 5, 2,18, 6, 3, 7,-2 }, // 213 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 214 - { 1, 1,17,18, 8, 3, 4, 6,18, 5,-2, 3, 8, 5, 2, 4, 7, 6 }, // 215 - { 0, 1,18,-2, 3, 5, 1, 7, 3, 2, 6,-3, 4, 1, 5, 8, 3,-2 }, // 216 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 217 - { 1, 1, 3,17,18, 5,-1,18, 2, 6, 7,18, 5, 3,-3,-1, 6, 2 }, // 218 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 219 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 220 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 221 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 222 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 223 - { 1, 3,18,17,-2, 3,-1,18, 2, 5, 3, 7, 6, 2, 4, 8,18, 5 }, // 224 - { 0, 1,18,-1,18, 2,18, 3, 5,18, 2, 8,18, 5, 4,-1, 6, 2 }, // 225 - { 1, 2,18,-2,18,18, 2, 3, 4,-3, 2, 5,18, 7, 4, 3, 8, 6 }, // 226 - { 0, 2,17,-1,18, 2,-1, 1, 7, 3, 8, 5,-2, 4, 1, 2,-3, 6 }, // 227 - { 0, 1,18,17, 2,18, 2,18, 6, 7, 4, 3,18, 5, 2,-2,17, 8 }, // 228 - { 0, 3,18,17, 2, 3,-3,-1,18, 2, 4, 5,18, 7, 3, 2,-3, 6 }, // 229 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 230 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 231 - { 0, 2, 3,18,18,18, 2, 6, 5,18, 7, 2, 4, 6,18, 5, 3, 8 }, // 232 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 233 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 234 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 235 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 236 - { 0, 1,18,18, 3, 6, 3,-2, 2,18, 5,-1, 7, 3, 4,-2, 2, 6 }, // 237 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 238 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 239 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 240 - { 1, 1,18,17,18,18,-2, 2, 3,-3,18, 6, 4, 2,-2, 8, 3, 7 }, // 241 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 242 - { 0, 1,18,18,18, 4, 2, 7, 8,18, 3, 2,-2, 4, 7, 6,17, 5 }, // 243 - { 1, 1,18,18,-1,-2, 8, 3,18, 6, 3, 5, 8, 2, 4, 7, 1, 6 }, // 244 - { 1, 1, 1,-3, 3,18,18, 2,-1, 3, 6, 5,18, 4, 7,-2, 8, 3 }, // 245 - { 1, 1, 1,18, 4, 2, 5,18, 1, 3,-1, 6, 1, 4, 8, 2, 5, 1 }, // 246 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 247 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 248 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 249 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 250 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 251 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 252 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 253 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 254 - { 0, 1,-1,18,18, 2,18, 3, 5,18, 2,18, 6, 8, 4, 5, 7,-1 }, // 255 -}; - -#define NUM_FAST_SPECS (sizeof (fast_specs) / sizeof (fast_specs [0])) -#define NUM_DEFAULT_SPECS (sizeof (default_specs) / sizeof (default_specs [0])) -#define NUM_HIGH_SPECS (sizeof (high_specs) / sizeof (high_specs [0])) -#define NUM_VERY_HIGH_SPECS (sizeof (very_high_specs) / sizeof (very_high_specs [0])) diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/decorr_utils.c b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/decorr_utils.c deleted file mode 100644 index a76b14cc..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/decorr_utils.c +++ /dev/null @@ -1,204 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2013 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// decorr_utils.c - -// This module contains the functions that process metadata blocks that are -// specific to the decorrelator. These would be called any time a WavPack -// block was parsed. These are in a module separate from the actual unpack -// decorrelation code (unpack.c) so that if an application just wants to get -// information from WavPack files (rather than actually decoding audio) then -// less code needs to be linked. - -#include -#include - -#include "wavpack_local.h" - -///////////////////////////// executable code //////////////////////////////// - -// Read decorrelation terms from specified metadata block into the -// decorr_passes array. The terms range from -3 to 8, plus 17 & 18; -// other values are reserved and generate errors for now. The delta -// ranges from 0 to 7 with all values valid. Note that the terms are -// stored in the opposite order in the decorr_passes array compared -// to packing. - -int read_decorr_terms (WavpackStream *wps, WavpackMetadata *wpmd) -{ - int termcnt = wpmd->byte_length; - unsigned char *byteptr = (unsigned char *)wpmd->data; - struct decorr_pass *dpp; - - if (termcnt > MAX_NTERMS) - return FALSE; - - wps->num_terms = termcnt; - - for (dpp = wps->decorr_passes + termcnt - 1; termcnt--; dpp--) { - dpp->term = (int)(*byteptr & 0x1f) - 5; - dpp->delta = (*byteptr++ >> 5) & 0x7; - - if (!dpp->term || dpp->term < -3 || (dpp->term > MAX_TERM && dpp->term < 17) || dpp->term > 18 || - ((wps->wphdr.flags & MONO_DATA) && dpp->term < 0)) - return FALSE; - } - - return TRUE; -} - -// Read decorrelation weights from specified metadata block into the -// decorr_passes array. The weights range +/-1024, but are rounded and -// truncated to fit in signed chars for metadata storage. Weights are -// separate for the two channels and are specified from the "last" term -// (first during encode). Unspecified weights are set to zero. - -int read_decorr_weights (WavpackStream *wps, WavpackMetadata *wpmd) -{ - int termcnt = wpmd->byte_length, tcount; - char *byteptr = (char *)wpmd->data; - struct decorr_pass *dpp; - - if (!(wps->wphdr.flags & MONO_DATA)) - termcnt /= 2; - - if (termcnt > wps->num_terms) - return FALSE; - - for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++) - dpp->weight_A = dpp->weight_B = 0; - - while (--dpp >= wps->decorr_passes && termcnt--) { - dpp->weight_A = restore_weight (*byteptr++); - - if (!(wps->wphdr.flags & MONO_DATA)) - dpp->weight_B = restore_weight (*byteptr++); - } - - return TRUE; -} - -// Read decorrelation samples from specified metadata block into the -// decorr_passes array. The samples are signed 32-bit values, but are -// converted to signed log2 values for storage in metadata. Values are -// stored for both channels and are specified from the "last" term -// (first during encode) with unspecified samples set to zero. The -// number of samples stored varies with the actual term value, so -// those must obviously come first in the metadata. - -int read_decorr_samples (WavpackStream *wps, WavpackMetadata *wpmd) -{ - unsigned char *byteptr = (unsigned char *)wpmd->data; - unsigned char *endptr = byteptr + wpmd->byte_length; - struct decorr_pass *dpp; - int tcount; - - for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++) { - CLEAR (dpp->samples_A); - CLEAR (dpp->samples_B); - } - - if (wps->wphdr.version == 0x402 && (wps->wphdr.flags & HYBRID_FLAG)) { - if (byteptr + (wps->wphdr.flags & MONO_DATA ? 2 : 4) > endptr) - return FALSE; - - wps->dc.error [0] = wp_exp2s ((int16_t)(byteptr [0] + (byteptr [1] << 8))); - byteptr += 2; - - if (!(wps->wphdr.flags & MONO_DATA)) { - wps->dc.error [1] = wp_exp2s ((int16_t)(byteptr [0] + (byteptr [1] << 8))); - byteptr += 2; - } - } - - while (dpp-- > wps->decorr_passes && byteptr < endptr) - if (dpp->term > MAX_TERM) { - if (byteptr + (wps->wphdr.flags & MONO_DATA ? 4 : 8) > endptr) - return FALSE; - - dpp->samples_A [0] = wp_exp2s ((int16_t)(byteptr [0] + (byteptr [1] << 8))); - dpp->samples_A [1] = wp_exp2s ((int16_t)(byteptr [2] + (byteptr [3] << 8))); - byteptr += 4; - - if (!(wps->wphdr.flags & MONO_DATA)) { - dpp->samples_B [0] = wp_exp2s ((int16_t)(byteptr [0] + (byteptr [1] << 8))); - dpp->samples_B [1] = wp_exp2s ((int16_t)(byteptr [2] + (byteptr [3] << 8))); - byteptr += 4; - } - } - else if (dpp->term < 0) { - if (byteptr + 4 > endptr) - return FALSE; - - dpp->samples_A [0] = wp_exp2s ((int16_t)(byteptr [0] + (byteptr [1] << 8))); - dpp->samples_B [0] = wp_exp2s ((int16_t)(byteptr [2] + (byteptr [3] << 8))); - byteptr += 4; - } - else { - int m = 0, cnt = dpp->term; - - while (cnt--) { - if (byteptr + (wps->wphdr.flags & MONO_DATA ? 2 : 4) > endptr) - return FALSE; - - dpp->samples_A [m] = wp_exp2s ((int16_t)(byteptr [0] + (byteptr [1] << 8))); - byteptr += 2; - - if (!(wps->wphdr.flags & MONO_DATA)) { - dpp->samples_B [m] = wp_exp2s ((int16_t)(byteptr [0] + (byteptr [1] << 8))); - byteptr += 2; - } - - m++; - } - } - - return byteptr == endptr; -} - -// Read the shaping weights from specified metadata block into the -// WavpackStream structure. Note that there must be two values (even -// for mono streams) and that the values are stored in the same -// manner as decorrelation weights. These would normally be read from -// the "correction" file and are used for lossless reconstruction of -// hybrid data. - -int read_shaping_info (WavpackStream *wps, WavpackMetadata *wpmd) -{ - if (wpmd->byte_length == 2) { - char *byteptr = (char *)wpmd->data; - - wps->dc.shaping_acc [0] = (int32_t) restore_weight (*byteptr++) << 16; - wps->dc.shaping_acc [1] = (int32_t) restore_weight (*byteptr++) << 16; - return TRUE; - } - else if (wpmd->byte_length >= (wps->wphdr.flags & MONO_DATA ? 4 : 8)) { - unsigned char *byteptr = (unsigned char *)wpmd->data; - - wps->dc.error [0] = wp_exp2s ((int16_t)(byteptr [0] + (byteptr [1] << 8))); - wps->dc.shaping_acc [0] = wp_exp2s ((int16_t)(byteptr [2] + (byteptr [3] << 8))); - byteptr += 4; - - if (!(wps->wphdr.flags & MONO_DATA)) { - wps->dc.error [1] = wp_exp2s ((int16_t)(byteptr [0] + (byteptr [1] << 8))); - wps->dc.shaping_acc [1] = wp_exp2s ((int16_t)(byteptr [2] + (byteptr [3] << 8))); - byteptr += 4; - } - - if (wpmd->byte_length == (wps->wphdr.flags & MONO_DATA ? 6 : 12)) { - wps->dc.shaping_delta [0] = wp_exp2s ((int16_t)(byteptr [0] + (byteptr [1] << 8))); - - if (!(wps->wphdr.flags & MONO_DATA)) - wps->dc.shaping_delta [1] = wp_exp2s ((int16_t)(byteptr [2] + (byteptr [3] << 8))); - } - - return TRUE; - } - - return FALSE; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/entropy_utils.c b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/entropy_utils.c deleted file mode 100644 index fe8e4056..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/entropy_utils.c +++ /dev/null @@ -1,378 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2013 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// entropy_utils.c - -// This module contains the functions that process metadata blocks that are -// specific to the entropy decoder; these would be called any time a WavPack -// block was parsed. Additionally, it contains tables and functions that are -// common to both entropy coding and decoding. These are in a module separate -// from the actual entropy encoder (write_words.c) and decoder (read_words.c) -// so that if applications that just do a subset of the full WavPack reading -// and writing can link with a subset of the library. - -#include -#include - -#include "wavpack_local.h" - -///////////////////////////// local table storage //////////////////////////// - -const uint32_t bitset [] = { - 1L << 0, 1L << 1, 1L << 2, 1L << 3, - 1L << 4, 1L << 5, 1L << 6, 1L << 7, - 1L << 8, 1L << 9, 1L << 10, 1L << 11, - 1L << 12, 1L << 13, 1L << 14, 1L << 15, - 1L << 16, 1L << 17, 1L << 18, 1L << 19, - 1L << 20, 1L << 21, 1L << 22, 1L << 23, - 1L << 24, 1L << 25, 1L << 26, 1L << 27, - 1L << 28, 1L << 29, 1L << 30, 1L << 31 -}; - -const uint32_t bitmask [] = { - (1L << 0) - 1, (1L << 1) - 1, (1L << 2) - 1, (1L << 3) - 1, - (1L << 4) - 1, (1L << 5) - 1, (1L << 6) - 1, (1L << 7) - 1, - (1L << 8) - 1, (1L << 9) - 1, (1L << 10) - 1, (1L << 11) - 1, - (1L << 12) - 1, (1L << 13) - 1, (1L << 14) - 1, (1L << 15) - 1, - (1L << 16) - 1, (1L << 17) - 1, (1L << 18) - 1, (1L << 19) - 1, - (1L << 20) - 1, (1L << 21) - 1, (1L << 22) - 1, (1L << 23) - 1, - (1L << 24) - 1, (1L << 25) - 1, (1L << 26) - 1, (1L << 27) - 1, - (1L << 28) - 1, (1L << 29) - 1, (1L << 30) - 1, 0x7fffffff -}; - -const char nbits_table [] = { - 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, // 0 - 15 - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, // 16 - 31 - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, // 32 - 47 - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, // 48 - 63 - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 64 - 79 - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 80 - 95 - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 96 - 111 - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 112 - 127 - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 128 - 143 - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 144 - 159 - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 160 - 175 - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 176 - 191 - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 192 - 207 - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 208 - 223 - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, // 224 - 239 - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 // 240 - 255 -}; - -static const unsigned char log2_table [] = { - 0x00, 0x01, 0x03, 0x04, 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0d, 0x0e, 0x10, 0x11, 0x12, 0x14, 0x15, - 0x16, 0x18, 0x19, 0x1a, 0x1c, 0x1d, 0x1e, 0x20, 0x21, 0x22, 0x24, 0x25, 0x26, 0x28, 0x29, 0x2a, - 0x2c, 0x2d, 0x2e, 0x2f, 0x31, 0x32, 0x33, 0x34, 0x36, 0x37, 0x38, 0x39, 0x3b, 0x3c, 0x3d, 0x3e, - 0x3f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4d, 0x4e, 0x4f, 0x50, 0x51, - 0x52, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, - 0x64, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x74, 0x75, - 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, - 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, - 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, - 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb2, - 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc0, - 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcb, 0xcc, 0xcd, 0xce, - 0xcf, 0xd0, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd8, 0xd9, 0xda, 0xdb, - 0xdc, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe4, 0xe5, 0xe6, 0xe7, 0xe7, - 0xe8, 0xe9, 0xea, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xee, 0xef, 0xf0, 0xf1, 0xf1, 0xf2, 0xf3, 0xf4, - 0xf4, 0xf5, 0xf6, 0xf7, 0xf7, 0xf8, 0xf9, 0xf9, 0xfa, 0xfb, 0xfc, 0xfc, 0xfd, 0xfe, 0xff, 0xff -}; - -static const unsigned char exp2_table [] = { - 0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0a, 0x0b, - 0x0b, 0x0c, 0x0d, 0x0e, 0x0e, 0x0f, 0x10, 0x10, 0x11, 0x12, 0x13, 0x13, 0x14, 0x15, 0x16, 0x16, - 0x17, 0x18, 0x19, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1d, 0x1e, 0x1f, 0x20, 0x20, 0x21, 0x22, 0x23, - 0x24, 0x24, 0x25, 0x26, 0x27, 0x28, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3a, 0x3b, 0x3c, 0x3d, - 0x3e, 0x3f, 0x40, 0x41, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x48, 0x49, 0x4a, 0x4b, - 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, - 0x5b, 0x5c, 0x5d, 0x5e, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, - 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, - 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x87, 0x88, 0x89, 0x8a, - 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, - 0x9c, 0x9d, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, - 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, - 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc8, 0xc9, 0xca, 0xcb, 0xcd, 0xce, 0xcf, 0xd0, 0xd2, 0xd3, 0xd4, - 0xd6, 0xd7, 0xd8, 0xd9, 0xdb, 0xdc, 0xdd, 0xde, 0xe0, 0xe1, 0xe2, 0xe4, 0xe5, 0xe6, 0xe8, 0xe9, - 0xea, 0xec, 0xed, 0xee, 0xf0, 0xf1, 0xf2, 0xf4, 0xf5, 0xf6, 0xf8, 0xf9, 0xfa, 0xfc, 0xfd, 0xff -}; - -///////////////////////////// executable code //////////////////////////////// - -// Read the median log2 values from the specifed metadata structure, convert -// them back to 32-bit unsigned values and store them. If length is not -// exactly correct then we flag and return an error. - -int read_entropy_vars (WavpackStream *wps, WavpackMetadata *wpmd) -{ - unsigned char *byteptr = (unsigned char *)wpmd->data; - - if (wpmd->byte_length != ((wps->wphdr.flags & MONO_DATA) ? 6 : 12)) - return FALSE; - - wps->w.c [0].median [0] = wp_exp2s (byteptr [0] + (byteptr [1] << 8)); - wps->w.c [0].median [1] = wp_exp2s (byteptr [2] + (byteptr [3] << 8)); - wps->w.c [0].median [2] = wp_exp2s (byteptr [4] + (byteptr [5] << 8)); - - if (!(wps->wphdr.flags & MONO_DATA)) { - wps->w.c [1].median [0] = wp_exp2s (byteptr [6] + (byteptr [7] << 8)); - wps->w.c [1].median [1] = wp_exp2s (byteptr [8] + (byteptr [9] << 8)); - wps->w.c [1].median [2] = wp_exp2s (byteptr [10] + (byteptr [11] << 8)); - } - - return TRUE; -} - -// Read the hybrid related values from the specifed metadata structure, convert -// them back to their internal formats and store them. The extended profile -// stuff is not implemented yet, so return an error if we get more data than -// we know what to do with. - -int read_hybrid_profile (WavpackStream *wps, WavpackMetadata *wpmd) -{ - unsigned char *byteptr = (unsigned char *)wpmd->data; - unsigned char *endptr = byteptr + wpmd->byte_length; - - if (wps->wphdr.flags & HYBRID_BITRATE) { - if (byteptr + (wps->wphdr.flags & MONO_DATA ? 2 : 4) > endptr) - return FALSE; - - wps->w.c [0].slow_level = wp_exp2s (byteptr [0] + (byteptr [1] << 8)); - byteptr += 2; - - if (!(wps->wphdr.flags & MONO_DATA)) { - wps->w.c [1].slow_level = wp_exp2s (byteptr [0] + (byteptr [1] << 8)); - byteptr += 2; - } - } - - if (byteptr + (wps->wphdr.flags & MONO_DATA ? 2 : 4) > endptr) - return FALSE; - - wps->w.bitrate_acc [0] = (int32_t)(byteptr [0] + (byteptr [1] << 8)) << 16; - byteptr += 2; - - if (!(wps->wphdr.flags & MONO_DATA)) { - wps->w.bitrate_acc [1] = (int32_t)(byteptr [0] + (byteptr [1] << 8)) << 16; - byteptr += 2; - } - - if (byteptr < endptr) { - if (byteptr + (wps->wphdr.flags & MONO_DATA ? 2 : 4) > endptr) - return FALSE; - - wps->w.bitrate_delta [0] = wp_exp2s ((int16_t)(byteptr [0] + (byteptr [1] << 8))); - byteptr += 2; - - if (!(wps->wphdr.flags & MONO_DATA)) { - wps->w.bitrate_delta [1] = wp_exp2s ((int16_t)(byteptr [0] + (byteptr [1] << 8))); - byteptr += 2; - } - - if (byteptr < endptr) - return FALSE; - } - else - wps->w.bitrate_delta [0] = wps->w.bitrate_delta [1] = 0; - - return TRUE; -} - -// This function is called during both encoding and decoding of hybrid data to -// update the "error_limit" variable which determines the maximum sample error -// allowed in the main bitstream. In the HYBRID_BITRATE mode (which is the only -// currently implemented) this is calculated from the slow_level values and the -// bitrate accumulators. Note that the bitrate accumulators can be changing. - -void update_error_limit (WavpackStream *wps) -{ - int bitrate_0 = (wps->w.bitrate_acc [0] += wps->w.bitrate_delta [0]) >> 16; - - if (wps->wphdr.flags & MONO_DATA) { - if (wps->wphdr.flags & HYBRID_BITRATE) { - int slow_log_0 = (wps->w.c [0].slow_level + SLO) >> SLS; - - if (slow_log_0 - bitrate_0 > -0x100) - wps->w.c [0].error_limit = wp_exp2s (slow_log_0 - bitrate_0 + 0x100); - else - wps->w.c [0].error_limit = 0; - } - else - wps->w.c [0].error_limit = wp_exp2s (bitrate_0); - } - else { - int bitrate_1 = (wps->w.bitrate_acc [1] += wps->w.bitrate_delta [1]) >> 16; - - if (wps->wphdr.flags & HYBRID_BITRATE) { - int slow_log_0 = (wps->w.c [0].slow_level + SLO) >> SLS; - int slow_log_1 = (wps->w.c [1].slow_level + SLO) >> SLS; - - if (wps->wphdr.flags & HYBRID_BALANCE) { - int balance = (slow_log_1 - slow_log_0 + bitrate_1 + 1) >> 1; - - if (balance > bitrate_0) { - bitrate_1 = bitrate_0 * 2; - bitrate_0 = 0; - } - else if (-balance > bitrate_0) { - bitrate_0 = bitrate_0 * 2; - bitrate_1 = 0; - } - else { - bitrate_1 = bitrate_0 + balance; - bitrate_0 = bitrate_0 - balance; - } - } - - if (slow_log_0 - bitrate_0 > -0x100) - wps->w.c [0].error_limit = wp_exp2s (slow_log_0 - bitrate_0 + 0x100); - else - wps->w.c [0].error_limit = 0; - - if (slow_log_1 - bitrate_1 > -0x100) - wps->w.c [1].error_limit = wp_exp2s (slow_log_1 - bitrate_1 + 0x100); - else - wps->w.c [1].error_limit = 0; - } - else { - wps->w.c [0].error_limit = wp_exp2s (bitrate_0); - wps->w.c [1].error_limit = wp_exp2s (bitrate_1); - } - } -} - -// The concept of a base 2 logarithm is used in many parts of WavPack. It is -// a way of sufficiently accurately representing 32-bit signed and unsigned -// values storing only 16 bits (actually fewer). It is also used in the hybrid -// mode for quickly comparing the relative magnitude of large values (i.e. -// division) and providing smooth exponentials using only addition. - -// These are not strict logarithms in that they become linear around zero and -// can therefore represent both zero and negative values. They have 8 bits -// of precision and in "roundtrip" conversions the total error never exceeds 1 -// part in 225 except for the cases of +/-115 and +/-195 (which error by 1). - - -// This function returns the log2 for the specified 32-bit unsigned value. -// The maximum value allowed is about 0xff800000 and returns 8447. - -int FASTCALL wp_log2 (uint32_t avalue) -{ - int dbits; - - if ((avalue += avalue >> 9) < (1 << 8)) { - dbits = nbits_table [avalue]; - return (dbits << 8) + log2_table [(avalue << (9 - dbits)) & 0xff]; - } - else { - if (avalue < (1L << 16)) - dbits = nbits_table [avalue >> 8] + 8; - else if (avalue < (1L << 24)) - dbits = nbits_table [avalue >> 16] + 16; - else - dbits = nbits_table [avalue >> 24] + 24; - - return (dbits << 8) + log2_table [(avalue >> (dbits - 9)) & 0xff]; - } -} - -// This function scans a buffer of longs and accumulates the total log2 value -// of all the samples. This is useful for determining maximum compression -// because the bitstream storage required for entropy coding is proportional -// to the base 2 log of the samples. On some platforms there is an assembly -// version of this. - -#if !defined(OPT_ASM_X86) && !defined(OPT_ASM_X64) - -uint32_t log2buffer (int32_t *samples, uint32_t num_samples, int limit) -{ - uint32_t result = 0, avalue; - int dbits; - - while (num_samples--) { - avalue = abs (*samples++); - - if ((avalue += avalue >> 9) < (1 << 8)) { - dbits = nbits_table [avalue]; - result += (dbits << 8) + log2_table [(avalue << (9 - dbits)) & 0xff]; - } - else { - if (avalue < (1L << 16)) - dbits = nbits_table [avalue >> 8] + 8; - else if (avalue < (1L << 24)) - dbits = nbits_table [avalue >> 16] + 16; - else - dbits = nbits_table [avalue >> 24] + 24; - - result += dbits = (dbits << 8) + log2_table [(avalue >> (dbits - 9)) & 0xff]; - - if (limit && dbits >= limit) - return (uint32_t) -1; - } - } - - return result; -} - -#endif - -// This function returns the log2 for the specified 32-bit signed value. -// All input values are valid and the return values are in the range of -// +/- 8192. - -int wp_log2s (int32_t value) -{ - return (value < 0) ? -wp_log2 (-value) : wp_log2 (value); -} - -// This function returns the original integer represented by the supplied -// logarithm (at least within the provided accuracy). The log is signed, -// but since a full 32-bit value is returned this can be used for unsigned -// conversions as well (i.e. the input range is -8192 to +8447). - -int32_t wp_exp2s (int log) -{ - uint32_t value; - - if (log < 0) - return -wp_exp2s (-log); - - value = exp2_table [log & 0xff] | 0x100; - - if ((log >>= 8) <= 9) - return value >> (9 - log); - else - return value << (log - 9); -} - -// These two functions convert internal weights (which are normally +/-1024) -// to and from an 8-bit signed character version for storage in metadata. The -// weights are clipped here in the case that they are outside that range. - -signed char store_weight (int weight) -{ - if (weight > 1024) - weight = 1024; - else if (weight < -1024) - weight = -1024; - - if (weight > 0) - weight -= (weight + 64) >> 7; - - return (weight + 4) >> 3; -} - -int restore_weight (signed char weight) -{ - int result; - - if ((result = (int) weight << 3) > 0) - result += (result + 64) >> 7; - - return result; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/extra1.c b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/extra1.c deleted file mode 100644 index 80a63629..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/extra1.c +++ /dev/null @@ -1,704 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2013 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// extra1.c - -// This module handles the "extra" mode for mono files. - -#include -#include -#include -#include - -#include "wavpack_local.h" - -// This flag causes this module to take into account the size of the header -// (which grows with more decorrelation passes) when making decisions about -// adding additional passes (as opposed to just considering the resulting -// magnitude of the residuals). With really long blocks it seems to actually -// hurt compression (for reasons I cannot explain), but with short blocks it -// works okay, so we're enabling it for now. - -#define USE_OVERHEAD - -// If the log2 value of any sample in a buffer being scanned exceeds this value, -// we abandon that configuration. This prevents us from going down paths that -// are wildly unstable. - -#define LOG_LIMIT 6912 - -//#define EXTRA_DUMP // dump generated filter data error_line() - -#ifdef OPT_ASM_X86 - #define PACK_DECORR_MONO_PASS_CONT pack_decorr_mono_pass_cont_x86 -#elif defined(OPT_ASM_X64) && (defined (_WIN64) || defined(__CYGWIN__) || defined(__MINGW64__)) - #define PACK_DECORR_MONO_PASS_CONT pack_decorr_mono_pass_cont_x64win -#elif defined(OPT_ASM_X64) - #define PACK_DECORR_MONO_PASS_CONT pack_decorr_mono_pass_cont_x64 -#endif - -#ifdef PACK_DECORR_MONO_PASS_CONT - void PACK_DECORR_MONO_PASS_CONT (int32_t *out_buffer, int32_t *in_buffer, struct decorr_pass *dpp, int32_t sample_count); -#endif - -typedef struct { - int32_t *sampleptrs [MAX_NTERMS+2]; - struct decorr_pass dps [MAX_NTERMS]; - int nterms, log_limit; - uint32_t best_bits; -} WavpackExtraInfo; - -static void decorr_mono_pass (int32_t *in_samples, int32_t *out_samples, uint32_t num_samples, struct decorr_pass *dpp, int dir) -{ - int32_t cont_samples = 0; - int m = 0, i; - -#ifdef PACK_DECORR_MONO_PASS_CONT - if (num_samples > 16 && dir > 0) { - int32_t pre_samples = (dpp->term > MAX_TERM) ? 2 : dpp->term; - cont_samples = num_samples - pre_samples; - num_samples = pre_samples; - } -#endif - - dpp->sum_A = 0; - - if (dir < 0) { - out_samples += (num_samples + cont_samples - 1); - in_samples += (num_samples + cont_samples - 1); - dir = -1; - } - else - dir = 1; - - dpp->weight_A = restore_weight (store_weight (dpp->weight_A)); - - for (i = 0; i < 8; ++i) - dpp->samples_A [i] = wp_exp2s (wp_log2s (dpp->samples_A [i])); - - if (dpp->term > MAX_TERM) { - while (num_samples--) { - int32_t left, sam_A; - - if (dpp->term & 1) - sam_A = 2 * dpp->samples_A [0] - dpp->samples_A [1]; - else - sam_A = (3 * dpp->samples_A [0] - dpp->samples_A [1]) >> 1; - - dpp->samples_A [1] = dpp->samples_A [0]; - dpp->samples_A [0] = left = in_samples [0]; - - left -= apply_weight (dpp->weight_A, sam_A); - update_weight (dpp->weight_A, dpp->delta, sam_A, left); - dpp->sum_A += dpp->weight_A; - out_samples [0] = left; - in_samples += dir; - out_samples += dir; - } - } - else if (dpp->term > 0) { - while (num_samples--) { - int k = (m + dpp->term) & (MAX_TERM - 1); - int32_t left, sam_A; - - sam_A = dpp->samples_A [m]; - dpp->samples_A [k] = left = in_samples [0]; - m = (m + 1) & (MAX_TERM - 1); - - left -= apply_weight (dpp->weight_A, sam_A); - update_weight (dpp->weight_A, dpp->delta, sam_A, left); - dpp->sum_A += dpp->weight_A; - out_samples [0] = left; - in_samples += dir; - out_samples += dir; - } - } - - if (m && dpp->term > 0 && dpp->term <= MAX_TERM) { - int32_t temp_A [MAX_TERM]; - int k; - - memcpy (temp_A, dpp->samples_A, sizeof (dpp->samples_A)); - - for (k = 0; k < MAX_TERM; k++) { - dpp->samples_A [k] = temp_A [m]; - m = (m + 1) & (MAX_TERM - 1); - } - } - -#ifdef PACK_DECORR_MONO_PASS_CONT - if (cont_samples) - PACK_DECORR_MONO_PASS_CONT (out_samples, in_samples, dpp, cont_samples); -#endif -} - -static void reverse_mono_decorr (struct decorr_pass *dpp) -{ - if (dpp->term > MAX_TERM) { - int32_t sam_A; - - if (dpp->term & 1) - sam_A = 2 * dpp->samples_A [0] - dpp->samples_A [1]; - else - sam_A = (3 * dpp->samples_A [0] - dpp->samples_A [1]) >> 1; - - dpp->samples_A [1] = dpp->samples_A [0]; - dpp->samples_A [0] = sam_A; - - if (dpp->term & 1) - sam_A = 2 * dpp->samples_A [0] - dpp->samples_A [1]; - else - sam_A = (3 * dpp->samples_A [0] - dpp->samples_A [1]) >> 1; - - dpp->samples_A [1] = sam_A; - } - else if (dpp->term > 1) { - int i = 0, j = dpp->term - 1, cnt = dpp->term / 2; - - while (cnt--) { - i &= (MAX_TERM - 1); - j &= (MAX_TERM - 1); - dpp->samples_A [i] ^= dpp->samples_A [j]; - dpp->samples_A [j] ^= dpp->samples_A [i]; - dpp->samples_A [i++] ^= dpp->samples_A [j--]; - } - -// CLEAR (dpp->samples_A); - } -} - -static void decorr_mono_buffer (int32_t *samples, int32_t *outsamples, uint32_t num_samples, struct decorr_pass *dpp, int tindex) -{ - struct decorr_pass dp, *dppi = dpp + tindex; - int delta = dppi->delta, pre_delta, term = dppi->term; - - if (delta == 7) - pre_delta = 7; - else if (delta < 2) - pre_delta = 3; - else - pre_delta = delta + 1; - - CLEAR (dp); - dp.term = term; - dp.delta = pre_delta; - decorr_mono_pass (samples, outsamples, num_samples > 2048 ? 2048 : num_samples, &dp, -1); - dp.delta = delta; - - if (tindex == 0) - reverse_mono_decorr (&dp); - else - CLEAR (dp.samples_A); - - memcpy (dppi->samples_A, dp.samples_A, sizeof (dp.samples_A)); - dppi->weight_A = dp.weight_A; - - if (delta == 0) { - dp.delta = 1; - decorr_mono_pass (samples, outsamples, num_samples, &dp, 1); - dp.delta = 0; - memcpy (dp.samples_A, dppi->samples_A, sizeof (dp.samples_A)); - dppi->weight_A = dp.weight_A = dp.sum_A / num_samples; - } - -// if (memcmp (dppi, &dp, sizeof (dp))) -// error_line ("decorr_passes don't match, delta = %d", delta); - - decorr_mono_pass (samples, outsamples, num_samples, &dp, 1); -} - -static int log2overhead (int first_term, int num_terms) -{ -#ifdef USE_OVERHEAD - if (first_term > MAX_TERM) - return (4 + num_terms * 2) << 11; - else - return (2 + num_terms * 2) << 11; -#else - return 0; -#endif -} - -static void recurse_mono (WavpackContext *wpc, WavpackExtraInfo *info, int depth, int delta, uint32_t input_bits) -{ - WavpackStream *wps = wpc->streams [wpc->current_stream]; - int term, branches = ((wpc->config.extra_flags & EXTRA_BRANCHES) >> 6) - depth; - int32_t *samples, *outsamples; - uint32_t term_bits [22], bits; - - if (branches < 1 || depth + 1 == info->nterms) - branches = 1; - - CLEAR (term_bits); - samples = info->sampleptrs [depth]; - outsamples = info->sampleptrs [depth + 1]; - - for (term = 1; term <= 18; ++term) { - if (term == 17 && branches == 1 && depth + 1 < info->nterms) - continue; - - if (term > 8 && term < 17) - continue; - - if ((wpc->config.flags & CONFIG_FAST_FLAG) && (term > 4 && term < 17)) - continue; - - info->dps [depth].term = term; - info->dps [depth].delta = delta; - decorr_mono_buffer (samples, outsamples, wps->wphdr.block_samples, info->dps, depth); - bits = LOG2BUFFER (outsamples, wps->wphdr.block_samples, info->log_limit); - - if (bits != (uint32_t) -1) - bits += log2overhead (info->dps [0].term, depth + 1); - - if (bits < info->best_bits) { - info->best_bits = bits; - CLEAR (wps->decorr_passes); - memcpy (wps->decorr_passes, info->dps, sizeof (info->dps [0]) * (depth + 1)); - memcpy (info->sampleptrs [info->nterms + 1], info->sampleptrs [depth + 1], wps->wphdr.block_samples * 4); - } - - term_bits [term + 3] = bits; - } - - while (depth + 1 < info->nterms && branches--) { - uint32_t local_best_bits = input_bits; - int best_term = 0, i; - - for (i = 0; i < 22; ++i) - if (term_bits [i] && term_bits [i] < local_best_bits) { - local_best_bits = term_bits [i]; -// term_bits [i] = 0; - best_term = i - 3; - } - - if (!best_term) - break; - - term_bits [best_term + 3] = 0; - - info->dps [depth].term = best_term; - info->dps [depth].delta = delta; - decorr_mono_buffer (samples, outsamples, wps->wphdr.block_samples, info->dps, depth); - -// if (log2buffer (outsamples, wps->wphdr.block_samples * 2, 0) != local_best_bits) -// error_line ("data doesn't match!"); - - recurse_mono (wpc, info, depth + 1, delta, local_best_bits); - } -} - -static void delta_mono (WavpackContext *wpc, WavpackExtraInfo *info) -{ - WavpackStream *wps = wpc->streams [wpc->current_stream]; - int lower = FALSE, delta, d; - uint32_t bits; - - if (wps->decorr_passes [0].term) - delta = wps->decorr_passes [0].delta; - else - return; - - for (d = delta - 1; d >= 0; --d) { - int i; - - if (!d && (wps->wphdr.flags & HYBRID_FLAG)) - break; - - for (i = 0; i < info->nterms && wps->decorr_passes [i].term; ++i) { - info->dps [i].term = wps->decorr_passes [i].term; - info->dps [i].delta = d; - decorr_mono_buffer (info->sampleptrs [i], info->sampleptrs [i+1], wps->wphdr.block_samples, info->dps, i); - } - - bits = LOG2BUFFER (info->sampleptrs [i], wps->wphdr.block_samples, info->log_limit); - - if (bits != (uint32_t) -1) - bits += log2overhead (wps->decorr_passes [0].term, i); - - if (bits < info->best_bits) { - lower = TRUE; - info->best_bits = bits; - CLEAR (wps->decorr_passes); - memcpy (wps->decorr_passes, info->dps, sizeof (info->dps [0]) * i); - memcpy (info->sampleptrs [info->nterms + 1], info->sampleptrs [i], wps->wphdr.block_samples * 4); - } - else - break; - } - - for (d = delta + 1; !lower && d <= 7; ++d) { - int i; - - for (i = 0; i < info->nterms && wps->decorr_passes [i].term; ++i) { - info->dps [i].term = wps->decorr_passes [i].term; - info->dps [i].delta = d; - decorr_mono_buffer (info->sampleptrs [i], info->sampleptrs [i+1], wps->wphdr.block_samples, info->dps, i); - } - - bits = LOG2BUFFER (info->sampleptrs [i], wps->wphdr.block_samples, info->log_limit); - - if (bits != (uint32_t) -1) - bits += log2overhead (wps->decorr_passes [0].term, i); - - if (bits < info->best_bits) { - info->best_bits = bits; - CLEAR (wps->decorr_passes); - memcpy (wps->decorr_passes, info->dps, sizeof (info->dps [0]) * i); - memcpy (info->sampleptrs [info->nterms + 1], info->sampleptrs [i], wps->wphdr.block_samples * 4); - } - else - break; - } -} - -static void sort_mono (WavpackContext *wpc, WavpackExtraInfo *info) -{ - WavpackStream *wps = wpc->streams [wpc->current_stream]; - int reversed = TRUE; - uint32_t bits; - - while (reversed) { - int ri, i; - - memcpy (info->dps, wps->decorr_passes, sizeof (wps->decorr_passes)); - reversed = FALSE; - - for (ri = 0; ri < info->nterms && wps->decorr_passes [ri].term; ++ri) { - - if (ri + 1 >= info->nterms || !wps->decorr_passes [ri+1].term) - break; - - if (wps->decorr_passes [ri].term == wps->decorr_passes [ri+1].term) { - decorr_mono_buffer (info->sampleptrs [ri], info->sampleptrs [ri+1], wps->wphdr.block_samples, info->dps, ri); - continue; - } - - info->dps [ri] = wps->decorr_passes [ri+1]; - info->dps [ri+1] = wps->decorr_passes [ri]; - - for (i = ri; i < info->nterms && wps->decorr_passes [i].term; ++i) - decorr_mono_buffer (info->sampleptrs [i], info->sampleptrs [i+1], wps->wphdr.block_samples, info->dps, i); - - bits = LOG2BUFFER (info->sampleptrs [i], wps->wphdr.block_samples, info->log_limit); - - if (bits != (uint32_t) -1) - bits += log2overhead (wps->decorr_passes [0].term, i); - - if (bits < info->best_bits) { - reversed = TRUE; - info->best_bits = bits; - CLEAR (wps->decorr_passes); - memcpy (wps->decorr_passes, info->dps, sizeof (info->dps [0]) * i); - memcpy (info->sampleptrs [info->nterms + 1], info->sampleptrs [i], wps->wphdr.block_samples * 4); - } - else { - info->dps [ri] = wps->decorr_passes [ri]; - info->dps [ri+1] = wps->decorr_passes [ri+1]; - decorr_mono_buffer (info->sampleptrs [ri], info->sampleptrs [ri+1], wps->wphdr.block_samples, info->dps, ri); - } - } - } -} - -static const uint32_t xtable [] = { 91, 123, 187, 251 }; - -static void analyze_mono (WavpackContext *wpc, int32_t *samples, int do_samples) -{ - WavpackStream *wps = wpc->streams [wpc->current_stream]; - WavpackExtraInfo info; - int i; - -#ifdef LOG_LIMIT - info.log_limit = (((wps->wphdr.flags & MAG_MASK) >> MAG_LSB) + 4) * 256; - - if (info.log_limit > LOG_LIMIT) - info.log_limit = LOG_LIMIT; -#else - info.log_limit = 0; -#endif - - if (wpc->config.flags & (CONFIG_HIGH_FLAG | CONFIG_VERY_HIGH_FLAG)) - wpc->config.extra_flags = xtable [wpc->config.xmode - 4]; - else - wpc->config.extra_flags = xtable [wpc->config.xmode - 3]; - - info.nterms = wps->num_terms; - - for (i = 0; i < info.nterms + 2; ++i) - info.sampleptrs [i] = malloc (wps->wphdr.block_samples * 4); - - memcpy (info.dps, wps->decorr_passes, sizeof (info.dps)); - memcpy (info.sampleptrs [0], samples, wps->wphdr.block_samples * 4); - - for (i = 0; i < info.nterms && info.dps [i].term; ++i) - decorr_mono_pass (info.sampleptrs [i], info.sampleptrs [i + 1], wps->wphdr.block_samples, info.dps + i, 1); - - info.best_bits = LOG2BUFFER (info.sampleptrs [info.nterms], wps->wphdr.block_samples, 0) * 1; - info.best_bits += log2overhead (info.dps [0].term, i); - memcpy (info.sampleptrs [info.nterms + 1], info.sampleptrs [i], wps->wphdr.block_samples * 4); - - if (wpc->config.extra_flags & EXTRA_BRANCHES) - recurse_mono (wpc, &info, 0, (int) floor (wps->delta_decay + 0.5), - LOG2BUFFER (info.sampleptrs [0], wps->wphdr.block_samples, 0)); - - if (wpc->config.extra_flags & EXTRA_SORT_FIRST) - sort_mono (wpc, &info); - - if (wpc->config.extra_flags & EXTRA_TRY_DELTAS) { - delta_mono (wpc, &info); - - if ((wpc->config.extra_flags & EXTRA_ADJUST_DELTAS) && wps->decorr_passes [0].term) - wps->delta_decay = (float)((wps->delta_decay * 2.0 + wps->decorr_passes [0].delta) / 3.0); - else - wps->delta_decay = 2.0; - } - - if (wpc->config.extra_flags & EXTRA_SORT_LAST) - sort_mono (wpc, &info); - - if (do_samples) - memcpy (samples, info.sampleptrs [info.nterms + 1], wps->wphdr.block_samples * 4); - - for (i = 0; i < info.nterms; ++i) - if (!wps->decorr_passes [i].term) - break; - - wps->num_terms = i; - - for (i = 0; i < info.nterms + 2; ++i) - free (info.sampleptrs [i]); -} - -static void mono_add_noise (WavpackStream *wps, int32_t *lptr, int32_t *rptr) -{ - int shaping_weight, new = wps->wphdr.flags & NEW_SHAPING; - short *shaping_array = wps->dc.shaping_array; - int32_t error = 0, temp, cnt; - - scan_word (wps, rptr, wps->wphdr.block_samples, -1); - cnt = wps->wphdr.block_samples; - - if (wps->wphdr.flags & HYBRID_SHAPE) { - while (cnt--) { - if (shaping_array) - shaping_weight = *shaping_array++; - else - shaping_weight = (wps->dc.shaping_acc [0] += wps->dc.shaping_delta [0]) >> 16; - - temp = -apply_weight (shaping_weight, error); - - if (new && shaping_weight < 0 && temp) { - if (temp == error) - temp = (temp < 0) ? temp + 1 : temp - 1; - - lptr [0] += (error = nosend_word (wps, rptr [0], 0) - rptr [0] + temp); - } - else - lptr [0] += (error = nosend_word (wps, rptr [0], 0) - rptr [0]) + temp; - - lptr++; - rptr++; - } - - if (!shaping_array) - wps->dc.shaping_acc [0] -= wps->dc.shaping_delta [0] * wps->wphdr.block_samples; - } - else - while (cnt--) { - lptr [0] += nosend_word (wps, rptr [0], 0) - rptr [0]; - lptr++; - rptr++; - } -} - -void execute_mono (WavpackContext *wpc, int32_t *samples, int no_history, int do_samples) -{ - int32_t *temp_buffer [2], *best_buffer, *noisy_buffer = NULL; - struct decorr_pass temp_decorr_pass, save_decorr_passes [MAX_NTERMS]; - WavpackStream *wps = wpc->streams [wpc->current_stream]; - int32_t num_samples = wps->wphdr.block_samples; - int32_t buf_size = sizeof (int32_t) * num_samples; - uint32_t best_size = (uint32_t) -1, size; - int log_limit, pi, i; - -#ifdef SKIP_DECORRELATION - CLEAR (wps->decorr_passes); - wps->num_terms = 0; - return; -#endif - - for (i = 0; i < num_samples; ++i) - if (samples [i]) - break; - - if (i == num_samples) { - CLEAR (wps->decorr_passes); - wps->num_terms = 0; - init_words (wps); - return; - } - -#ifdef LOG_LIMIT - log_limit = (((wps->wphdr.flags & MAG_MASK) >> MAG_LSB) + 4) * 256; - - if (log_limit > LOG_LIMIT) - log_limit = LOG_LIMIT; -#else - log_limit = 0; -#endif - - CLEAR (save_decorr_passes); - temp_buffer [0] = malloc (buf_size); - temp_buffer [1] = malloc (buf_size); - best_buffer = malloc (buf_size); - - if (wps->num_passes > 1 && (wps->wphdr.flags & HYBRID_FLAG)) { - CLEAR (temp_decorr_pass); - temp_decorr_pass.delta = 2; - temp_decorr_pass.term = 18; - - decorr_mono_pass (samples, temp_buffer [0], - num_samples > 2048 ? 2048 : num_samples, &temp_decorr_pass, -1); - - reverse_mono_decorr (&temp_decorr_pass); - decorr_mono_pass (samples, temp_buffer [0], num_samples, &temp_decorr_pass, 1); - CLEAR (temp_decorr_pass); - temp_decorr_pass.delta = 2; - temp_decorr_pass.term = 17; - - decorr_mono_pass (temp_buffer [0], temp_buffer [1], - num_samples > 2048 ? 2048 : num_samples, &temp_decorr_pass, -1); - - decorr_mono_pass (temp_buffer [0], temp_buffer [1], num_samples, &temp_decorr_pass, 1); - noisy_buffer = malloc (buf_size); - memcpy (noisy_buffer, samples, buf_size); - mono_add_noise (wps, noisy_buffer, temp_buffer [1]); - no_history = 1; - } - - if (no_history || wps->num_passes >= 7) - wps->best_decorr = wps->mask_decorr = 0; - - for (pi = 0; pi < wps->num_passes;) { - const WavpackDecorrSpec *wpds; - int nterms, c, j; - - if (!pi) - c = wps->best_decorr; - else { - if (wps->mask_decorr == 0) - c = 0; - else - c = (wps->best_decorr & (wps->mask_decorr - 1)) | wps->mask_decorr; - - if (c == wps->best_decorr) { - wps->mask_decorr = wps->mask_decorr ? ((wps->mask_decorr << 1) & (wps->num_decorrs - 1)) : 1; - continue; - } - } - - wpds = &wps->decorr_specs [c]; - nterms = (int) strlen ((char *) wpds->terms); - - while (1) { - memcpy (temp_buffer [0], noisy_buffer ? noisy_buffer : samples, buf_size); - CLEAR (save_decorr_passes); - - for (j = 0; j < nterms; ++j) { - CLEAR (temp_decorr_pass); - temp_decorr_pass.delta = wpds->delta; - temp_decorr_pass.term = wpds->terms [j]; - - if (temp_decorr_pass.term < 0) - temp_decorr_pass.term = 1; - - decorr_mono_pass (temp_buffer [j&1], temp_buffer [~j&1], - num_samples > 2048 ? 2048 : num_samples, &temp_decorr_pass, -1); - - if (j) { - CLEAR (temp_decorr_pass.samples_A); - } - else - reverse_mono_decorr (&temp_decorr_pass); - - memcpy (save_decorr_passes + j, &temp_decorr_pass, sizeof (struct decorr_pass)); - decorr_mono_pass (temp_buffer [j&1], temp_buffer [~j&1], num_samples, &temp_decorr_pass, 1); - } - - size = LOG2BUFFER (temp_buffer [j&1], num_samples, log_limit); - - if (size == (uint32_t) -1 && nterms) - nterms >>= 1; - else - break; - } - - size += log2overhead (wpds->terms [0], nterms); - - if (size < best_size) { - memcpy (best_buffer, temp_buffer [j&1], buf_size); - memcpy (wps->decorr_passes, save_decorr_passes, sizeof (struct decorr_pass) * MAX_NTERMS); - wps->num_terms = nterms; - wps->best_decorr = c; - best_size = size; - } - - if (pi++) - wps->mask_decorr = wps->mask_decorr ? ((wps->mask_decorr << 1) & (wps->num_decorrs - 1)) : 1; - } - - if (wpc->config.xmode > 3) { - if (noisy_buffer) { - analyze_mono (wpc, noisy_buffer, do_samples); - - if (do_samples) - memcpy (samples, noisy_buffer, buf_size); - } - else - analyze_mono (wpc, samples, do_samples); - } - else if (do_samples) - memcpy (samples, best_buffer, buf_size); - - if (no_history || wpc->config.xmode > 3) - scan_word (wps, best_buffer, num_samples, -1); - - if (noisy_buffer) - free (noisy_buffer); - - free (temp_buffer [1]); - free (temp_buffer [0]); - free (best_buffer); - -#ifdef EXTRA_DUMP - if (1) { - char string [256], substring [20]; - int i; - - sprintf (string, "M: terms ="); - - for (i = 0; i < wps->num_terms; ++i) { - if (wps->decorr_passes [i].term) { - if (i && wps->decorr_passes [i-1].delta == wps->decorr_passes [i].delta) - sprintf (substring, " %d", wps->decorr_passes [i].term); - else - sprintf (substring, " %d->%d", wps->decorr_passes [i].term, - wps->decorr_passes [i].delta); - } - else - sprintf (substring, " *"); - - strcat (string, substring); - } - - error_line (string); - } -#endif -} - diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/extra2.c b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/extra2.c deleted file mode 100644 index 8a1a3058..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/extra2.c +++ /dev/null @@ -1,929 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2013 Conifer Software. // -// MMX optimizations (c) 2006 Joachim Henke // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// extra2.c - -// This module handles the "extra" mode for stereo files. - -#include -#include -#include -#include - -#include "wavpack_local.h" - -// This flag causes this module to take into account the size of the header -// (which grows with more decorrelation passes) when making decisions about -// adding additional passes (as opposed to just considering the resulting -// magnitude of the residuals). With really long blocks it seems to actually -// hurt compression (for reasons I cannot explain), but with short blocks it -// works okay, so we're enabling it for now. - -#define USE_OVERHEAD - -// If the log2 value of any sample in a buffer being scanned exceeds this value, -// we abandon that configuration. This prevents us from going down paths that -// are wildly unstable. - -#define LOG_LIMIT 6912 - -//#define EXTRA_DUMP // dump generated filter data to error_line() - -#ifdef OPT_ASM_X86 - #define PACK_DECORR_STEREO_PASS_CONT pack_decorr_stereo_pass_cont_x86 - #define PACK_DECORR_STEREO_PASS_CONT_REV pack_decorr_stereo_pass_cont_rev_x86 - #define PACK_DECORR_STEREO_PASS_CONT_AVAILABLE pack_cpu_has_feature_x86(CPU_FEATURE_MMX) -#elif defined(OPT_ASM_X64) && (defined (_WIN64) || defined(__CYGWIN__) || defined(__MINGW64__)) - #define PACK_DECORR_STEREO_PASS_CONT pack_decorr_stereo_pass_cont_x64win - #define PACK_DECORR_STEREO_PASS_CONT_REV pack_decorr_stereo_pass_cont_rev_x64win - #define PACK_DECORR_STEREO_PASS_CONT_AVAILABLE 1 -#elif defined(OPT_ASM_X64) - #define PACK_DECORR_STEREO_PASS_CONT pack_decorr_stereo_pass_cont_x64 - #define PACK_DECORR_STEREO_PASS_CONT_REV pack_decorr_stereo_pass_cont_rev_x64 - #define PACK_DECORR_STEREO_PASS_CONT_AVAILABLE 1 -#endif - -#ifdef PACK_DECORR_STEREO_PASS_CONT - void PACK_DECORR_STEREO_PASS_CONT (struct decorr_pass *dpp, int32_t *in_buffer, int32_t *out_buffer, int32_t sample_count); - void PACK_DECORR_STEREO_PASS_CONT_REV (struct decorr_pass *dpp, int32_t *in_buffer, int32_t *out_buffer, int32_t sample_count); -#endif - -typedef struct { - int32_t *sampleptrs [MAX_NTERMS+2]; - struct decorr_pass dps [MAX_NTERMS]; - int nterms, log_limit; - uint32_t best_bits; -} WavpackExtraInfo; - -static void decorr_stereo_pass (int32_t *in_samples, int32_t *out_samples, int32_t num_samples, struct decorr_pass *dpp, int dir) -{ - int32_t cont_samples = 0; - int m = 0, i; - -#ifdef PACK_DECORR_STEREO_PASS_CONT - if (num_samples > 16 && PACK_DECORR_STEREO_PASS_CONT_AVAILABLE) { - int32_t pre_samples = (dpp->term < 0 || dpp->term > MAX_TERM) ? 2 : dpp->term; - cont_samples = num_samples - pre_samples; - num_samples = pre_samples; - } -#endif - - dpp->sum_A = dpp->sum_B = 0; - - if (dir < 0) { - out_samples += (num_samples + cont_samples - 1) * 2; - in_samples += (num_samples + cont_samples - 1) * 2; - dir = -2; - } - else - dir = 2; - - dpp->weight_A = restore_weight (store_weight (dpp->weight_A)); - dpp->weight_B = restore_weight (store_weight (dpp->weight_B)); - - for (i = 0; i < 8; ++i) { - dpp->samples_A [i] = wp_exp2s (wp_log2s (dpp->samples_A [i])); - dpp->samples_B [i] = wp_exp2s (wp_log2s (dpp->samples_B [i])); - } - - switch (dpp->term) { - - case 2: - while (num_samples--) { - int32_t sam, tmp; - - sam = dpp->samples_A [0]; - dpp->samples_A [0] = dpp->samples_A [1]; - out_samples [0] = tmp = (dpp->samples_A [1] = in_samples [0]) - apply_weight (dpp->weight_A, sam); - update_weight (dpp->weight_A, dpp->delta, sam, tmp); - dpp->sum_A += dpp->weight_A; - - sam = dpp->samples_B [0]; - dpp->samples_B [0] = dpp->samples_B [1]; - out_samples [1] = tmp = (dpp->samples_B [1] = in_samples [1]) - apply_weight (dpp->weight_B, sam); - update_weight (dpp->weight_B, dpp->delta, sam, tmp); - dpp->sum_B += dpp->weight_B; - - in_samples += dir; - out_samples += dir; - } - - break; - - case 17: - while (num_samples--) { - int32_t sam, tmp; - - sam = 2 * dpp->samples_A [0] - dpp->samples_A [1]; - dpp->samples_A [1] = dpp->samples_A [0]; - out_samples [0] = tmp = (dpp->samples_A [0] = in_samples [0]) - apply_weight (dpp->weight_A, sam); - update_weight (dpp->weight_A, dpp->delta, sam, tmp); - dpp->sum_A += dpp->weight_A; - - sam = 2 * dpp->samples_B [0] - dpp->samples_B [1]; - dpp->samples_B [1] = dpp->samples_B [0]; - out_samples [1] = tmp = (dpp->samples_B [0] = in_samples [1]) - apply_weight (dpp->weight_B, sam); - update_weight (dpp->weight_B, dpp->delta, sam, tmp); - dpp->sum_B += dpp->weight_B; - - in_samples += dir; - out_samples += dir; - } - - break; - - case 18: - while (num_samples--) { - int32_t sam, tmp; - - sam = dpp->samples_A [0] + ((dpp->samples_A [0] - dpp->samples_A [1]) >> 1); - dpp->samples_A [1] = dpp->samples_A [0]; - out_samples [0] = tmp = (dpp->samples_A [0] = in_samples [0]) - apply_weight (dpp->weight_A, sam); - update_weight (dpp->weight_A, dpp->delta, sam, tmp); - dpp->sum_A += dpp->weight_A; - - sam = dpp->samples_B [0] + ((dpp->samples_B [0] - dpp->samples_B [1]) >> 1); - dpp->samples_B [1] = dpp->samples_B [0]; - out_samples [1] = tmp = (dpp->samples_B [0] = in_samples [1]) - apply_weight (dpp->weight_B, sam); - update_weight (dpp->weight_B, dpp->delta, sam, tmp); - dpp->sum_B += dpp->weight_B; - - in_samples += dir; - out_samples += dir; - } - - break; - - default: { - int k = dpp->term & (MAX_TERM - 1); - - while (num_samples--) { - int32_t sam, tmp; - - sam = dpp->samples_A [m]; - out_samples [0] = tmp = (dpp->samples_A [k] = in_samples [0]) - apply_weight (dpp->weight_A, sam); - update_weight (dpp->weight_A, dpp->delta, sam, tmp); - dpp->sum_A += dpp->weight_A; - - sam = dpp->samples_B [m]; - out_samples [1] = tmp = (dpp->samples_B [k] = in_samples [1]) - apply_weight (dpp->weight_B, sam); - update_weight (dpp->weight_B, dpp->delta, sam, tmp); - dpp->sum_B += dpp->weight_B; - - in_samples += dir; - out_samples += dir; - m = (m + 1) & (MAX_TERM - 1); - k = (k + 1) & (MAX_TERM - 1); - } - - if (m) { - int32_t temp_A [MAX_TERM], temp_B [MAX_TERM]; - int k; - - memcpy (temp_A, dpp->samples_A, sizeof (dpp->samples_A)); - memcpy (temp_B, dpp->samples_B, sizeof (dpp->samples_B)); - - for (k = 0; k < MAX_TERM; k++) { - dpp->samples_A [k] = temp_A [m]; - dpp->samples_B [k] = temp_B [m]; - m = (m + 1) & (MAX_TERM - 1); - } - } - - break; - } - - case -1: - while (num_samples--) { - int32_t sam_A, sam_B, tmp; - - sam_A = dpp->samples_A [0]; - out_samples [0] = tmp = (sam_B = in_samples [0]) - apply_weight (dpp->weight_A, sam_A); - update_weight_clip (dpp->weight_A, dpp->delta, sam_A, tmp); - dpp->sum_A += dpp->weight_A; - - out_samples [1] = tmp = (dpp->samples_A [0] = in_samples [1]) - apply_weight (dpp->weight_B, sam_B); - update_weight_clip (dpp->weight_B, dpp->delta, sam_B, tmp); - dpp->sum_B += dpp->weight_B; - - in_samples += dir; - out_samples += dir; - } - - break; - - case -2: - while (num_samples--) { - int32_t sam_A, sam_B, tmp; - - sam_B = dpp->samples_B [0]; - out_samples [1] = tmp = (sam_A = in_samples [1]) - apply_weight (dpp->weight_B, sam_B); - update_weight_clip (dpp->weight_B, dpp->delta, sam_B, tmp); - dpp->sum_B += dpp->weight_B; - - out_samples [0] = tmp = (dpp->samples_B [0] = in_samples [0]) - apply_weight (dpp->weight_A, sam_A); - update_weight_clip (dpp->weight_A, dpp->delta, sam_A, tmp); - dpp->sum_A += dpp->weight_A; - - in_samples += dir; - out_samples += dir; - } - - break; - - case -3: - while (num_samples--) { - int32_t sam_A, sam_B, tmp; - - sam_A = dpp->samples_A [0]; - sam_B = dpp->samples_B [0]; - - dpp->samples_A [0] = tmp = in_samples [1]; - out_samples [1] = tmp -= apply_weight (dpp->weight_B, sam_B); - update_weight_clip (dpp->weight_B, dpp->delta, sam_B, tmp); - dpp->sum_B += dpp->weight_B; - - dpp->samples_B [0] = tmp = in_samples [0]; - out_samples [0] = tmp -= apply_weight (dpp->weight_A, sam_A); - update_weight_clip (dpp->weight_A, dpp->delta, sam_A, tmp); - dpp->sum_A += dpp->weight_A; - - in_samples += dir; - out_samples += dir; - } - - break; - } - -#ifdef PACK_DECORR_STEREO_PASS_CONT - if (cont_samples) { - if (dir < 0) - PACK_DECORR_STEREO_PASS_CONT_REV (dpp, in_samples, out_samples, cont_samples); - else - PACK_DECORR_STEREO_PASS_CONT (dpp, in_samples, out_samples, cont_samples); - } -#endif -} - -static void reverse_decorr (struct decorr_pass *dpp) -{ - if (dpp->term > MAX_TERM) { - int32_t sam_A, sam_B; - - if (dpp->term & 1) { - sam_A = 2 * dpp->samples_A [0] - dpp->samples_A [1]; - sam_B = 2 * dpp->samples_B [0] - dpp->samples_B [1]; - } - else { - sam_A = (3 * dpp->samples_A [0] - dpp->samples_A [1]) >> 1; - sam_B = (3 * dpp->samples_B [0] - dpp->samples_B [1]) >> 1; - } - - dpp->samples_A [1] = dpp->samples_A [0]; - dpp->samples_B [1] = dpp->samples_B [0]; - dpp->samples_A [0] = sam_A; - dpp->samples_B [0] = sam_B; - - if (dpp->term & 1) { - sam_A = 2 * dpp->samples_A [0] - dpp->samples_A [1]; - sam_B = 2 * dpp->samples_B [0] - dpp->samples_B [1]; - } - else { - sam_A = (3 * dpp->samples_A [0] - dpp->samples_A [1]) >> 1; - sam_B = (3 * dpp->samples_B [0] - dpp->samples_B [1]) >> 1; - } - - dpp->samples_A [1] = sam_A; - dpp->samples_B [1] = sam_B; - } - else if (dpp->term > 1) { - int i = 0, j = dpp->term - 1, cnt = dpp->term / 2; - - while (cnt--) { - i &= (MAX_TERM - 1); - j &= (MAX_TERM - 1); - dpp->samples_A [i] ^= dpp->samples_A [j]; - dpp->samples_A [j] ^= dpp->samples_A [i]; - dpp->samples_A [i] ^= dpp->samples_A [j]; - dpp->samples_B [i] ^= dpp->samples_B [j]; - dpp->samples_B [j] ^= dpp->samples_B [i]; - dpp->samples_B [i++] ^= dpp->samples_B [j--]; - } - } - else if (dpp->term == -1) { - } - else if (dpp->term == -2) { - } - else if (dpp->term == -3) { - } -} - -static void decorr_stereo_buffer (WavpackExtraInfo *info, int32_t *samples, int32_t *outsamples, int32_t num_samples, int tindex) -{ - struct decorr_pass dp, *dppi = info->dps + tindex; - int delta = dppi->delta, pre_delta; - int term = dppi->term; - - if (delta == 7) - pre_delta = 7; - else if (delta < 2) - pre_delta = 3; - else - pre_delta = delta + 1; - - CLEAR (dp); - dp.term = term; - dp.delta = pre_delta; - decorr_stereo_pass (samples, outsamples, num_samples > 2048 ? 2048 : num_samples, &dp, -1); - dp.delta = delta; - - if (tindex == 0) - reverse_decorr (&dp); - else { - CLEAR (dp.samples_A); - CLEAR (dp.samples_B); - } - - memcpy (dppi->samples_A, dp.samples_A, sizeof (dp.samples_A)); - memcpy (dppi->samples_B, dp.samples_B, sizeof (dp.samples_B)); - dppi->weight_A = dp.weight_A; - dppi->weight_B = dp.weight_B; - - if (delta == 0) { - dp.delta = 1; - decorr_stereo_pass (samples, outsamples, num_samples, &dp, 1); - dp.delta = 0; - memcpy (dp.samples_A, dppi->samples_A, sizeof (dp.samples_A)); - memcpy (dp.samples_B, dppi->samples_B, sizeof (dp.samples_B)); - dppi->weight_A = dp.weight_A = dp.sum_A / num_samples; - dppi->weight_B = dp.weight_B = dp.sum_B / num_samples; - } - -// if (memcmp (dppi, &dp, sizeof (dp))) -// error_line ("decorr_passes don't match, delta = %d", delta); - - decorr_stereo_pass (samples, outsamples, num_samples, &dp, 1); -} - -static int log2overhead (int first_term, int num_terms) -{ -#ifdef USE_OVERHEAD - if (first_term > MAX_TERM) - return (8 + num_terms * 3) << 11; - else - return (4 + num_terms * 3) << 11; -#else - return 0; -#endif -} - -static void recurse_stereo (WavpackContext *wpc, WavpackExtraInfo *info, int depth, int delta, uint32_t input_bits) -{ - WavpackStream *wps = wpc->streams [wpc->current_stream]; - int term, branches = ((wpc->config.extra_flags & EXTRA_BRANCHES) >> 6) - depth; - int32_t *samples, *outsamples; - uint32_t term_bits [22], bits; - - if (branches < 1 || depth + 1 == info->nterms) - branches = 1; - - CLEAR (term_bits); - samples = info->sampleptrs [depth]; - outsamples = info->sampleptrs [depth + 1]; - - for (term = -3; term <= 18; ++term) { - if (!term || (term > 8 && term < 17)) - continue; - - if (term == 17 && branches == 1 && depth + 1 < info->nterms) - continue; - - if (term == -1 || term == -2) - if (!(wps->wphdr.flags & CROSS_DECORR)) - continue; - - if ((wpc->config.flags & CONFIG_FAST_FLAG) && (term > 4 && term < 17)) - continue; - - info->dps [depth].term = term; - info->dps [depth].delta = delta; - decorr_stereo_buffer (info, samples, outsamples, wps->wphdr.block_samples, depth); - bits = LOG2BUFFER (outsamples, wps->wphdr.block_samples * 2, info->log_limit); - - if (bits != (uint32_t) -1) - bits += log2overhead (info->dps [0].term, depth + 1); - - if (bits < info->best_bits) { - info->best_bits = bits; - CLEAR (wps->decorr_passes); - memcpy (wps->decorr_passes, info->dps, sizeof (info->dps [0]) * (depth + 1)); - memcpy (info->sampleptrs [info->nterms + 1], info->sampleptrs [depth + 1], wps->wphdr.block_samples * 8); - } - - term_bits [term + 3] = bits; - } - - while (depth + 1 < info->nterms && branches--) { - uint32_t local_best_bits = input_bits; - int best_term = 0, i; - - for (i = 0; i < 22; ++i) - if (term_bits [i] && term_bits [i] < local_best_bits) { - local_best_bits = term_bits [i]; -// term_bits [i] = 0; - best_term = i - 3; - } - - if (!best_term) - break; - - term_bits [best_term + 3] = 0; - - info->dps [depth].term = best_term; - info->dps [depth].delta = delta; - decorr_stereo_buffer (info, samples, outsamples, wps->wphdr.block_samples, depth); - -// if (log2buffer (outsamples, wps->wphdr.block_samples * 2, 0) != local_best_bits) -// error_line ("data doesn't match!"); - - recurse_stereo (wpc, info, depth + 1, delta, local_best_bits); - } -} - -static void delta_stereo (WavpackContext *wpc, WavpackExtraInfo *info) -{ - WavpackStream *wps = wpc->streams [wpc->current_stream]; - int lower = FALSE; - int delta, d; - uint32_t bits; - - if (wps->decorr_passes [0].term) - delta = wps->decorr_passes [0].delta; - else - return; - - for (d = delta - 1; d >= 0; --d) { - int i; - - if (!d && (wps->wphdr.flags & HYBRID_FLAG)) - break; - - for (i = 0; i < info->nterms && wps->decorr_passes [i].term; ++i) { - info->dps [i].term = wps->decorr_passes [i].term; - info->dps [i].delta = d; - decorr_stereo_buffer (info, info->sampleptrs [i], info->sampleptrs [i+1], wps->wphdr.block_samples, i); - } - - bits = LOG2BUFFER (info->sampleptrs [i], wps->wphdr.block_samples * 2, info->log_limit); - - if (bits != (uint32_t) -1) - bits += log2overhead (wps->decorr_passes [0].term, i); - - if (bits < info->best_bits) { - lower = TRUE; - info->best_bits = bits; - CLEAR (wps->decorr_passes); - memcpy (wps->decorr_passes, info->dps, sizeof (info->dps [0]) * i); - memcpy (info->sampleptrs [info->nterms + 1], info->sampleptrs [i], wps->wphdr.block_samples * 8); - } - else - break; - } - - for (d = delta + 1; !lower && d <= 7; ++d) { - int i; - - for (i = 0; i < info->nterms && wps->decorr_passes [i].term; ++i) { - info->dps [i].term = wps->decorr_passes [i].term; - info->dps [i].delta = d; - decorr_stereo_buffer (info, info->sampleptrs [i], info->sampleptrs [i+1], wps->wphdr.block_samples, i); - } - - bits = LOG2BUFFER (info->sampleptrs [i], wps->wphdr.block_samples * 2, info->log_limit); - - if (bits != (uint32_t) -1) - bits += log2overhead (wps->decorr_passes [0].term, i); - - if (bits < info->best_bits) { - info->best_bits = bits; - CLEAR (wps->decorr_passes); - memcpy (wps->decorr_passes, info->dps, sizeof (info->dps [0]) * i); - memcpy (info->sampleptrs [info->nterms + 1], info->sampleptrs [i], wps->wphdr.block_samples * 8); - } - else - break; - } -} - -static void sort_stereo (WavpackContext *wpc, WavpackExtraInfo *info) -{ - WavpackStream *wps = wpc->streams [wpc->current_stream]; - int reversed = TRUE; - uint32_t bits; - - while (reversed) { - int ri, i; - - memcpy (info->dps, wps->decorr_passes, sizeof (wps->decorr_passes)); - reversed = FALSE; - - for (ri = 0; ri < info->nterms && wps->decorr_passes [ri].term; ++ri) { - - if (ri + 1 >= info->nterms || !wps->decorr_passes [ri+1].term) - break; - - if (wps->decorr_passes [ri].term == wps->decorr_passes [ri+1].term) { - decorr_stereo_buffer (info, info->sampleptrs [ri], info->sampleptrs [ri+1], wps->wphdr.block_samples, ri); - continue; - } - - info->dps [ri] = wps->decorr_passes [ri+1]; - info->dps [ri+1] = wps->decorr_passes [ri]; - - for (i = ri; i < info->nterms && wps->decorr_passes [i].term; ++i) - decorr_stereo_buffer (info, info->sampleptrs [i], info->sampleptrs [i+1], wps->wphdr.block_samples, i); - - bits = LOG2BUFFER (info->sampleptrs [i], wps->wphdr.block_samples * 2, info->log_limit); - - if (bits != (uint32_t) -1) - bits += log2overhead (wps->decorr_passes [0].term, i); - - if (bits < info->best_bits) { - reversed = TRUE; - info->best_bits = bits; - CLEAR (wps->decorr_passes); - memcpy (wps->decorr_passes, info->dps, sizeof (info->dps [0]) * i); - memcpy (info->sampleptrs [info->nterms + 1], info->sampleptrs [i], wps->wphdr.block_samples * 8); - } - else { - info->dps [ri] = wps->decorr_passes [ri]; - info->dps [ri+1] = wps->decorr_passes [ri+1]; - decorr_stereo_buffer (info, info->sampleptrs [ri], info->sampleptrs [ri+1], wps->wphdr.block_samples, ri); - } - } - } -} - -static const uint32_t xtable [] = { 91, 123, 187, 251 }; - -static void analyze_stereo (WavpackContext *wpc, int32_t *samples, int do_samples) -{ - WavpackStream *wps = wpc->streams [wpc->current_stream]; - WavpackExtraInfo info; - int i; - -#ifdef LOG_LIMIT - info.log_limit = (((wps->wphdr.flags & MAG_MASK) >> MAG_LSB) + 4) * 256; - - if (info.log_limit > LOG_LIMIT) - info.log_limit = LOG_LIMIT; -#else - info.log_limit = 0; -#endif - - if (wpc->config.flags & (CONFIG_HIGH_FLAG | CONFIG_VERY_HIGH_FLAG)) - wpc->config.extra_flags = xtable [wpc->config.xmode - 4]; - else - wpc->config.extra_flags = xtable [wpc->config.xmode - 3]; - - info.nterms = wps->num_terms; - - for (i = 0; i < info.nterms + 2; ++i) - info.sampleptrs [i] = malloc (wps->wphdr.block_samples * 8); - - memcpy (info.dps, wps->decorr_passes, sizeof (info.dps)); - memcpy (info.sampleptrs [0], samples, wps->wphdr.block_samples * 8); - - for (i = 0; i < info.nterms && info.dps [i].term; ++i) - decorr_stereo_pass (info.sampleptrs [i], info.sampleptrs [i + 1], wps->wphdr.block_samples, info.dps + i, 1); - - info.best_bits = LOG2BUFFER (info.sampleptrs [info.nterms], wps->wphdr.block_samples * 2, 0) * 1; - info.best_bits += log2overhead (info.dps [0].term, i); - memcpy (info.sampleptrs [info.nterms + 1], info.sampleptrs [i], wps->wphdr.block_samples * 8); - - if (wpc->config.extra_flags & EXTRA_BRANCHES) - recurse_stereo (wpc, &info, 0, (int) floor (wps->delta_decay + 0.5), - LOG2BUFFER (info.sampleptrs [0], wps->wphdr.block_samples * 2, 0)); - - if (wpc->config.extra_flags & EXTRA_SORT_FIRST) - sort_stereo (wpc, &info); - - if (wpc->config.extra_flags & EXTRA_TRY_DELTAS) { - delta_stereo (wpc, &info); - - if ((wpc->config.extra_flags & EXTRA_ADJUST_DELTAS) && wps->decorr_passes [0].term) - wps->delta_decay = (float)((wps->delta_decay * 2.0 + wps->decorr_passes [0].delta) / 3.0); - else - wps->delta_decay = 2.0; - } - - if (wpc->config.extra_flags & EXTRA_SORT_LAST) - sort_stereo (wpc, &info); - - if (do_samples) - memcpy (samples, info.sampleptrs [info.nterms + 1], wps->wphdr.block_samples * 8); - - for (i = 0; i < info.nterms; ++i) - if (!wps->decorr_passes [i].term) - break; - - wps->num_terms = i; - - for (i = 0; i < info.nterms + 2; ++i) - free (info.sampleptrs [i]); -} - -static void stereo_add_noise (WavpackStream *wps, int32_t *lptr, int32_t *rptr) -{ - int shaping_weight, new = wps->wphdr.flags & NEW_SHAPING; - short *shaping_array = wps->dc.shaping_array; - int32_t error [2], temp, cnt; - - scan_word (wps, rptr, wps->wphdr.block_samples, -1); - cnt = wps->wphdr.block_samples; - CLEAR (error); - - if (wps->wphdr.flags & HYBRID_SHAPE) { - while (cnt--) { - if (shaping_array) - shaping_weight = *shaping_array++; - else - shaping_weight = (wps->dc.shaping_acc [0] += wps->dc.shaping_delta [0]) >> 16; - - temp = -apply_weight (shaping_weight, error [0]); - - if (new && shaping_weight < 0 && temp) { - if (temp == error [0]) - temp = (temp < 0) ? temp + 1 : temp - 1; - - lptr [0] += (error [0] = nosend_word (wps, rptr [0], 0) - rptr [0] + temp); - } - else - lptr [0] += (error [0] = nosend_word (wps, rptr [0], 0) - rptr [0]) + temp; - - if (!shaping_array) - shaping_weight = (wps->dc.shaping_acc [1] += wps->dc.shaping_delta [1]) >> 16; - - temp = -apply_weight (shaping_weight, error [1]); - - if (new && shaping_weight < 0 && temp) { - if (temp == error [1]) - temp = (temp < 0) ? temp + 1 : temp - 1; - - lptr [1] += (error [1] = nosend_word (wps, rptr [1], 1) - rptr [1] + temp); - } - else - lptr [1] += (error [1] = nosend_word (wps, rptr [1], 1) - rptr [1]) + temp; - - lptr += 2; - rptr += 2; - } - - if (!shaping_array) { - wps->dc.shaping_acc [0] -= wps->dc.shaping_delta [0] * wps->wphdr.block_samples; - wps->dc.shaping_acc [1] -= wps->dc.shaping_delta [1] * wps->wphdr.block_samples; - } - } - else - while (cnt--) { - lptr [0] += nosend_word (wps, rptr [0], 0) - rptr [0]; - lptr [1] += nosend_word (wps, rptr [1], 1) - rptr [1]; - lptr += 2; - rptr += 2; - } -} - -void execute_stereo (WavpackContext *wpc, int32_t *samples, int no_history, int do_samples) -{ - int32_t *temp_buffer [2], *best_buffer, *noisy_buffer = NULL, *js_buffer = NULL; - struct decorr_pass temp_decorr_pass, save_decorr_passes [MAX_NTERMS]; - WavpackStream *wps = wpc->streams [wpc->current_stream]; - int32_t num_samples = wps->wphdr.block_samples; - int32_t buf_size = sizeof (int32_t) * num_samples * 2; - uint32_t best_size = (uint32_t) -1, size; - int log_limit, force_js = 0, force_ts = 0, pi, i; - -#ifdef SKIP_DECORRELATION - CLEAR (wps->decorr_passes); - wps->num_terms = 0; - return; -#endif - - for (i = 0; i < num_samples * 2; ++i) - if (samples [i]) - break; - - if (i == num_samples * 2) { - wps->wphdr.flags &= ~((uint32_t) JOINT_STEREO); - CLEAR (wps->decorr_passes); - wps->num_terms = 0; - init_words (wps); - return; - } - -#ifdef LOG_LIMIT - log_limit = (((wps->wphdr.flags & MAG_MASK) >> MAG_LSB) + 4) * 256; - - if (log_limit > LOG_LIMIT) - log_limit = LOG_LIMIT; -#else - log_limit = 0; -#endif - - if (wpc->config.flags & CONFIG_JOINT_OVERRIDE) { - if (wps->wphdr.flags & JOINT_STEREO) - force_js = 1; - else - force_ts = 1; - } - - CLEAR (save_decorr_passes); - temp_buffer [0] = malloc (buf_size); - temp_buffer [1] = malloc (buf_size); - best_buffer = malloc (buf_size); - - if (wps->num_passes > 1 && (wps->wphdr.flags & HYBRID_FLAG)) { - CLEAR (temp_decorr_pass); - temp_decorr_pass.delta = 2; - temp_decorr_pass.term = 18; - - decorr_stereo_pass (samples, temp_buffer [0], - num_samples > 2048 ? 2048 : num_samples, &temp_decorr_pass, -1); - - reverse_decorr (&temp_decorr_pass); - decorr_stereo_pass (samples, temp_buffer [0], num_samples, &temp_decorr_pass, 1); - CLEAR (temp_decorr_pass); - temp_decorr_pass.delta = 2; - temp_decorr_pass.term = 17; - - decorr_stereo_pass (temp_buffer [0], temp_buffer [1], - num_samples > 2048 ? 2048 : num_samples, &temp_decorr_pass, -1); - - decorr_stereo_pass (temp_buffer [0], temp_buffer [1], num_samples, &temp_decorr_pass, 1); - noisy_buffer = malloc (buf_size); - memcpy (noisy_buffer, samples, buf_size); - stereo_add_noise (wps, noisy_buffer, temp_buffer [1]); - no_history = 1; - } - - if (no_history || wps->num_passes >= 7) - wps->best_decorr = wps->mask_decorr = 0; - - for (pi = 0; pi < wps->num_passes;) { - const WavpackDecorrSpec *wpds; - int nterms, c, j; - - if (!pi) - c = wps->best_decorr; - else { - if (wps->mask_decorr == 0) - c = 0; - else - c = (wps->best_decorr & (wps->mask_decorr - 1)) | wps->mask_decorr; - - if (c == wps->best_decorr) { - wps->mask_decorr = wps->mask_decorr ? ((wps->mask_decorr << 1) & (wps->num_decorrs - 1)) : 1; - continue; - } - } - - wpds = &wps->decorr_specs [c]; - nterms = (int) strlen ((char *) wpds->terms); - - while (1) { - if (force_js || (wpds->joint_stereo && !force_ts)) { - if (!js_buffer) { - int32_t *lptr, cnt = num_samples; - - lptr = js_buffer = malloc (buf_size); - memcpy (js_buffer, noisy_buffer ? noisy_buffer : samples, buf_size); - - while (cnt--) { - lptr [1] += ((lptr [0] -= lptr [1]) >> 1); - lptr += 2; - } - } - - memcpy (temp_buffer [0], js_buffer, buf_size); - } - else - memcpy (temp_buffer [0], noisy_buffer ? noisy_buffer : samples, buf_size); - - CLEAR (save_decorr_passes); - - for (j = 0; j < nterms; ++j) { - CLEAR (temp_decorr_pass); - temp_decorr_pass.delta = wpds->delta; - temp_decorr_pass.term = wpds->terms [j]; - - if (temp_decorr_pass.term < 0 && !(wps->wphdr.flags & CROSS_DECORR)) - temp_decorr_pass.term = -3; - - decorr_stereo_pass (temp_buffer [j&1], temp_buffer [~j&1], - num_samples > 2048 ? 2048 : num_samples, &temp_decorr_pass, -1); - - if (j) { - CLEAR (temp_decorr_pass.samples_A); - CLEAR (temp_decorr_pass.samples_B); - } - else - reverse_decorr (&temp_decorr_pass); - - memcpy (save_decorr_passes + j, &temp_decorr_pass, sizeof (struct decorr_pass)); - decorr_stereo_pass (temp_buffer [j&1], temp_buffer [~j&1], num_samples, &temp_decorr_pass, 1); - } - - size = LOG2BUFFER (temp_buffer [j&1], num_samples * 2, log_limit); - - if (size == (uint32_t) -1 && nterms) - nterms >>= 1; - else - break; - } - - size += log2overhead (wpds->terms [0], nterms); - - if (size < best_size) { - memcpy (best_buffer, temp_buffer [j&1], buf_size); - memcpy (wps->decorr_passes, save_decorr_passes, sizeof (struct decorr_pass) * MAX_NTERMS); - wps->num_terms = nterms; - wps->best_decorr = c; - best_size = size; - } - - if (pi++) - wps->mask_decorr = wps->mask_decorr ? ((wps->mask_decorr << 1) & (wps->num_decorrs - 1)) : 1; - } - - if (force_js || (wps->decorr_specs [wps->best_decorr].joint_stereo && !force_ts)) - wps->wphdr.flags |= JOINT_STEREO; - else - wps->wphdr.flags &= ~((uint32_t) JOINT_STEREO); - - if (wpc->config.xmode > 3) { - if (wps->wphdr.flags & JOINT_STEREO) { - analyze_stereo (wpc, js_buffer, do_samples); - - if (do_samples) - memcpy (samples, js_buffer, buf_size); - } - else if (noisy_buffer) { - analyze_stereo (wpc, noisy_buffer, do_samples); - - if (do_samples) - memcpy (samples, noisy_buffer, buf_size); - } - else - analyze_stereo (wpc, samples, do_samples); - } - else if (do_samples) - memcpy (samples, best_buffer, buf_size); - - if (wpc->config.xmode > 3 || no_history || wps->joint_stereo != wps->decorr_specs [wps->best_decorr].joint_stereo) { - wps->joint_stereo = wps->decorr_specs [wps->best_decorr].joint_stereo; - scan_word (wps, best_buffer, num_samples, -1); - } - - if (noisy_buffer) - free (noisy_buffer); - - if (js_buffer) - free (js_buffer); - - free (temp_buffer [1]); - free (temp_buffer [0]); - free (best_buffer); - -#ifdef EXTRA_DUMP - if (1) { - char string [256], substring [20]; - int i; - - sprintf (string, "%s: terms =", - (wps->wphdr.flags & JOINT_STEREO) ? "JS" : "TS"); - - for (i = 0; i < wps->num_terms; ++i) { - if (wps->decorr_passes [i].term) { - if (i && wps->decorr_passes [i-1].delta == wps->decorr_passes [i].delta) - sprintf (substring, " %d", wps->decorr_passes [i].term); - else - sprintf (substring, " %d->%d", wps->decorr_passes [i].term, - wps->decorr_passes [i].delta); - } - else - sprintf (substring, " *"); - - strcat (string, substring); - } - - error_line (string); - } -#endif -} - diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/open_filename.c b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/open_filename.c deleted file mode 100644 index 4c74e676..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/open_filename.c +++ /dev/null @@ -1,304 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2013 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// open_filename.c - -// This module provides all the code required to open an existing WavPack -// file, by filename, for reading. It does not contain the actual code to -// unpack audio data and this was done so that programs that just want to -// query WavPack files for information (like, for example, taggers) don't -// need to link in a lot of unnecessary code. -// -// To allow opening files by filename, this code provides an interface -// between the reader callback mechanism that WavPack uses internally and -// the standard fstream C library. Note that in applications that do not -// require opening files by filename, this module can be omitted (which -// might make building easier). -// -// For Unicode support on Windows, a flag has been added (OPEN_FILE_UTF8) -// that forces the filename string to be assumed UTF-8 and converted to -// a widechar string suitable for _wfopen(). Without this flag we revert -// to the previous behavior of simply calling fopen() and hoping that the -// local character set works. This is ignored on non-Windows platforms -// (which is okay because they are probably UTF-8 anyway). - -#ifdef _WIN32 -#define WIN32_LEAN_AND_MEAN -#include -#include -#endif - -#include -#include - -#include "wavpack_local.h" - -#include -#include - -#if (defined(__GNUC__) || defined(__sun)) && !defined(_WIN32) -#include -#endif - -#ifdef __OS2__ -#include -#endif - -#ifdef _WIN32 -#define fileno _fileno -static FILE *fopen_utf8 (const char *filename_utf8, const char *mode_utf8); -#if !defined(S_ISREG) && defined(S_IFMT) && defined(S_IFREG) -#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) -#endif -#endif - -#ifdef HAVE_FSEEKO -#define fseek fseeko -#define ftell ftello -#endif - -static int32_t read_bytes (void *id, void *data, int32_t bcount) -{ - return (int32_t) fread (data, 1, bcount, (FILE*) id); -} - -static int64_t get_pos (void *id) -{ -#ifdef _WIN32 - return _ftelli64 ((FILE*) id); -#else - return ftell ((FILE*) id); -#endif -} - -static int set_pos_abs (void *id, int64_t pos) -{ -#ifdef _WIN32 - return _fseeki64 (id, pos, SEEK_SET); -#else - return fseek (id, pos, SEEK_SET); -#endif -} - -static int set_pos_rel (void *id, int64_t delta, int mode) -{ -#ifdef _WIN32 - return _fseeki64 (id, delta, mode); -#else - return fseek (id, delta, mode); -#endif -} - -static int push_back_byte (void *id, int c) -{ - return ungetc (c, id); -} - -#ifdef _WIN32 - -static int64_t get_length (void *id) -{ - LARGE_INTEGER Size; - HANDLE fHandle; - - if (id == NULL) - return 0; - - fHandle = (HANDLE)_get_osfhandle(_fileno((FILE*) id)); - if (fHandle == INVALID_HANDLE_VALUE) - return 0; - - Size.u.LowPart = GetFileSize(fHandle, &Size.u.HighPart); - - if (Size.u.LowPart == INVALID_FILE_SIZE && GetLastError() != NO_ERROR) - return 0; - - return (int64_t)Size.QuadPart; -} - -#else - -static int64_t get_length (void *id) -{ - FILE *file = id; - struct stat statbuf; - - if (!file || fstat (fileno (file), &statbuf) || !S_ISREG(statbuf.st_mode)) - return 0; - - return statbuf.st_size; -} - -#endif - -static int can_seek (void *id) -{ - FILE *file = id; - struct stat statbuf; - - return file && !fstat (fileno (file), &statbuf) && S_ISREG(statbuf.st_mode); -} - -static int32_t write_bytes (void *id, void *data, int32_t bcount) -{ - return (int32_t) fwrite (data, 1, bcount, (FILE*) id); -} - -#ifdef _WIN32 - -static int truncate_here (void *id) -{ - FILE *file = id; - int64_t curr_pos = _ftelli64 (file); - - return _chsize_s (fileno (file), curr_pos); -} - -#else - -static int truncate_here (void *id) -{ - FILE *file = id; - off_t curr_pos = ftell (file); - - return ftruncate (fileno (file), curr_pos); -} - -#endif - -static int close_stream (void *id) -{ - return fclose ((FILE*) id); -} - -// int32_t (*read_bytes)(void *id, void *data, int32_t bcount); -// int32_t (*write_bytes)(void *id, void *data, int32_t bcount); -// int64_t (*get_pos)(void *id); // new signature for large files -// int (*set_pos_abs)(void *id, int64_t pos); // new signature for large files -// int (*set_pos_rel)(void *id, int64_t delta, int mode); // new signature for large files -// int (*push_back_byte)(void *id, int c); -// int64_t (*get_length)(void *id); // new signature for large files -// int (*can_seek)(void *id); -// int (*truncate_here)(void *id); // new function to truncate file at current position -// int (*close)(void *id); // new function to close file - -static WavpackStreamReader64 freader = { - read_bytes, write_bytes, get_pos, set_pos_abs, set_pos_rel, - push_back_byte, get_length, can_seek, truncate_here, close_stream -}; - -// This function attempts to open the specified WavPack file for reading. If -// this fails for any reason then an appropriate message is copied to "error" -// (which must accept 80 characters) and NULL is returned, otherwise a -// pointer to a WavpackContext structure is returned (which is used to call -// all other functions in this module). A filename beginning with "-" is -// assumed to be stdin. The "flags" argument has the following bit mask -// values to specify details of the open operation: - -// OPEN_WVC: attempt to open/read "correction" file -// OPEN_TAGS: attempt to read ID3v1 / APEv2 tags (requires seekable file) -// OPEN_WRAPPER: make audio wrapper available (i.e. RIFF) to caller -// OPEN_2CH_MAX: open only first stream of multichannel file (usually L/R) -// OPEN_NORMALIZE: normalize floating point data to +/- 1.0 (w/ offset exp) -// OPEN_STREAMING: blindly unpacks blocks w/o regard to header file position -// OPEN_EDIT_TAGS: allow editing of tags (file must be writable) -// OPEN_FILE_UTF8: assume infilename is UTF-8 encoded (Windows only) - -// Version 4.2 of the WavPack library adds the OPEN_STREAMING flag. This is -// essentially a "raw" mode where the library will simply decode any blocks -// fed it through the reader callback, regardless of where those blocks came -// from in a stream. The only requirement is that complete WavPack blocks are -// fed to the decoder (and this may require multiple blocks in multichannel -// mode) and that complete blocks are decoded (even if all samples are not -// actually required). All the blocks must contain the same number of channels -// and bit resolution, and the correction data must be either present or not. -// All other parameters may change from block to block (like lossy/lossless). -// Obviously, in this mode any seeking must be performed by the application -// (and again, decoding must start at the beginning of the block containing -// the seek sample). - -WavpackContext *WavpackOpenFileInput (const char *infilename, char *error, int flags, int norm_offset) -{ - char *file_mode = (flags & OPEN_EDIT_TAGS) ? "r+b" : "rb"; - FILE *(*fopen_func)(const char *, const char *) = fopen; - FILE *wv_id, *wvc_id; - -#ifdef _WIN32 - if (flags & OPEN_FILE_UTF8) - fopen_func = fopen_utf8; -#endif - - if (*infilename == '-') { - wv_id = stdin; -#if defined(_WIN32) - _setmode (fileno (stdin), O_BINARY); -#endif -#if defined(__OS2__) - setmode (fileno (stdin), O_BINARY); -#endif - } - else if ((wv_id = fopen_func (infilename, file_mode)) == NULL) { - if (error) strcpy (error, (flags & OPEN_EDIT_TAGS) ? "can't open file for editing" : "can't open file"); - return NULL; - } - - if (wv_id != stdin && (flags & OPEN_WVC)) { - char *in2filename = malloc (strlen (infilename) + 10); - - strcpy (in2filename, infilename); - strcat (in2filename, "c"); - wvc_id = fopen_func (in2filename, "rb"); - free (in2filename); - } - else - wvc_id = NULL; - - return WavpackOpenFileInputEx64 (&freader, wv_id, wvc_id, error, flags, norm_offset); -} - -#ifdef _WIN32 - -// The following code Copyright (c) 2004-2012 LoRd_MuldeR -// (see cli/win32_unicode_support.c for full license) - -static wchar_t *utf8_to_utf16(const char *input) -{ - wchar_t *Buffer; - int BuffSize = 0, Result = 0; - - BuffSize = MultiByteToWideChar(CP_UTF8, 0, input, -1, NULL, 0); - Buffer = (wchar_t*) malloc(sizeof(wchar_t) * BuffSize); - if(Buffer) - { - Result = MultiByteToWideChar(CP_UTF8, 0, input, -1, Buffer, BuffSize); - } - - return ((Result > 0) && (Result <= BuffSize)) ? Buffer : NULL; -} - - -static FILE *fopen_utf8(const char *filename_utf8, const char *mode_utf8) -{ - FILE *ret = NULL; - wchar_t *filename_utf16 = utf8_to_utf16(filename_utf8); - wchar_t *mode_utf16 = utf8_to_utf16(mode_utf8); - - if(filename_utf16 && mode_utf16) - { - ret = _wfopen(filename_utf16, mode_utf16); - } - - if(filename_utf16) free(filename_utf16); - if(mode_utf16) free(mode_utf16); - - return ret; -} - -#endif - - diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/open_legacy.c b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/open_legacy.c deleted file mode 100644 index fb615099..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/open_legacy.c +++ /dev/null @@ -1,114 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2016 David Bryant. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// open_legacy.c - -// This code provides an interface between the new reader callback mechanism that -// WavPack uses internally and the old reader callback functions that did not -// provide large file support. - -#include -#include - -#include "wavpack_local.h" - -typedef struct { - WavpackStreamReader *reader; - void *id; -} WavpackReaderTranslator; - -static int32_t trans_read_bytes (void *id, void *data, int32_t bcount) -{ - WavpackReaderTranslator *trans = (WavpackReaderTranslator *)id; - return trans->reader->read_bytes (trans->id, data, bcount); -} - -static int32_t trans_write_bytes (void *id, void *data, int32_t bcount) -{ - WavpackReaderTranslator *trans = (WavpackReaderTranslator *)id; - return trans->reader->write_bytes (trans->id, data, bcount); -} - -static int64_t trans_get_pos (void *id) -{ - WavpackReaderTranslator *trans = (WavpackReaderTranslator *)id; - return trans->reader->get_pos (trans->id); -} - -static int trans_set_pos_abs (void *id, int64_t pos) -{ - WavpackReaderTranslator *trans = (WavpackReaderTranslator *)id; - return trans->reader->set_pos_abs (trans->id, (uint32_t) pos); -} - -static int trans_set_pos_rel (void *id, int64_t delta, int mode) -{ - WavpackReaderTranslator *trans = (WavpackReaderTranslator *)id; - return trans->reader->set_pos_rel (trans->id, (int32_t) delta, mode); -} - -static int trans_push_back_byte (void *id, int c) -{ - WavpackReaderTranslator *trans = (WavpackReaderTranslator *)id; - return trans->reader->push_back_byte (trans->id, c); -} - -static int64_t trans_get_length (void *id) -{ - WavpackReaderTranslator *trans = (WavpackReaderTranslator *)id; - return trans->reader->get_length (trans->id); -} - -static int trans_can_seek (void *id) -{ - WavpackReaderTranslator *trans = (WavpackReaderTranslator *)id; - return trans->reader->can_seek (trans->id); -} - -static int trans_close_stream (void *id) -{ - free (id); - return 0; -} - -static WavpackStreamReader64 trans_reader = { - trans_read_bytes, trans_write_bytes, trans_get_pos, trans_set_pos_abs, trans_set_pos_rel, - trans_push_back_byte, trans_get_length, trans_can_seek, NULL, trans_close_stream -}; - -// This function is identical to WavpackOpenFileInput64() except that instead -// of providing the new 64-bit reader callbacks, the old reader callbacks are -// utilized and a translation layer is employed. It is provided as a compatibility -// function for existing applications. To ensure that streaming applications using -// this function continue to work, the OPEN_NO_CHECKSUM flag is forced on when -// the OPEN_STREAMING flag is set. - -WavpackContext *WavpackOpenFileInputEx (WavpackStreamReader *reader, void *wv_id, void *wvc_id, char *error, int flags, int norm_offset) -{ - WavpackReaderTranslator *trans_wv = NULL, *trans_wvc = NULL; - - // this prevents existing streaming applications from failing if they try to pass - // in blocks that have been modified from the original (e.g., Matroska blocks) - - if (flags & OPEN_STREAMING) - flags |= OPEN_NO_CHECKSUM; - - if (wv_id) { - trans_wv = (WavpackReaderTranslator *)malloc (sizeof (WavpackReaderTranslator)); - trans_wv->reader = reader; - trans_wv->id = wv_id; - } - - if (wvc_id) { - trans_wvc = (WavpackReaderTranslator *)malloc (sizeof (WavpackReaderTranslator)); - trans_wvc->reader = reader; - trans_wvc->id = wvc_id; - } - - return WavpackOpenFileInputEx64 (&trans_reader, trans_wv, trans_wvc, error, flags, norm_offset); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/open_raw.c b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/open_raw.c deleted file mode 100644 index 6fda6f31..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/open_raw.c +++ /dev/null @@ -1,315 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2016 David Bryant. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// open_raw.c - -// This code provides the ability to decode WavPack frames directly from -// memory for use in a streaming application. It can handle full blocks -// or the headerless block data provided by Matroska and the DirectShow -// WavPack splitter. For information about how Matroska stores WavPack, -// see: https://www.matroska.org/technical/specs/codecid/wavpack.html - -#include -#include - -#include "wavpack_local.h" - -typedef struct { - unsigned char *sptr, *dptr, *eptr, free_required; -} RawSegment; - -typedef struct { - RawSegment *segments; - int num_segments, curr_segment; - unsigned char ungetc_char, ungetc_flag; -} WavpackRawContext; - -static int32_t raw_read_bytes (void *id, void *data, int32_t bcount) -{ - WavpackRawContext *rcxt = id; - unsigned char *outptr = data; - - while (bcount) { - if (rcxt->ungetc_flag) { - *outptr++ = rcxt->ungetc_char; - rcxt->ungetc_flag = 0; - bcount--; - } - else if (rcxt->curr_segment < rcxt->num_segments) { - RawSegment *segptr = rcxt->segments + rcxt->curr_segment; - int bytes_to_copy = (int)(segptr->eptr - segptr->dptr); - - if (bytes_to_copy > bcount) - bytes_to_copy = bcount; - - memcpy (outptr, segptr->dptr, bytes_to_copy); - outptr += bytes_to_copy; - bcount -= bytes_to_copy; - - if ((segptr->dptr += bytes_to_copy) == segptr->eptr) - rcxt->curr_segment++; - } - else - break; - } - - return (int32_t)(outptr - (unsigned char *) data); -} - -static int32_t raw_write_bytes (void *id, void *data, int32_t bcount) -{ - return 0; -} - -static int64_t raw_get_pos (void *id) -{ - return 0; -} - -static int raw_set_pos_abs (void *id, int64_t pos) -{ - return 0; -} - -static int raw_set_pos_rel (void *id, int64_t delta, int mode) -{ - return 0; -} - -static int raw_push_back_byte (void *id, int c) -{ - WavpackRawContext *rcxt = id; - rcxt->ungetc_char = c; - rcxt->ungetc_flag = 1; - return c; -} - -static int64_t raw_get_length (void *id) -{ - return 0; -} - -static int raw_can_seek (void *id) -{ - return 0; -} - -static int raw_close_stream (void *id) -{ - WavpackRawContext *rcxt = id; - int i; - - if (rcxt) { - for (i = 0; i < rcxt->num_segments; ++i) - if (rcxt->segments [i].sptr && rcxt->segments [i].free_required) - free (rcxt->segments [i].sptr); - - if (rcxt->segments) free (rcxt->segments); - free (rcxt); - } - - return 0; -} - -static WavpackStreamReader64 raw_reader = { - raw_read_bytes, raw_write_bytes, raw_get_pos, raw_set_pos_abs, raw_set_pos_rel, - raw_push_back_byte, raw_get_length, raw_can_seek, NULL, raw_close_stream -}; - -// This function is similar to WavpackOpenFileInput() except that instead of -// providing a filename to open, the caller provides pointers to buffered -// WavPack frames (both standard and, optionally, correction data). It -// decodes only a single frame. Note that in this context, a "frame" is a -// collection of WavPack blocks that represent all the channels present. In -// the case of mono or [most] stereo streams, this is the same thing, but -// for multichannel streams each frame consists of several WavPack blocks -// (which can contain only 1 or 2 channels). - -WavpackContext *WavpackOpenRawDecoder ( - void *main_data, int32_t main_size, - void *corr_data, int32_t corr_size, - int16_t version, char *error, int flags, int norm_offset) -{ - WavpackRawContext *raw_wv = NULL, *raw_wvc = NULL; - - // if the WavPack data does not contain headers we assume Matroska-style storage - // and recreate the missing headers - - if (strncmp (main_data, "wvpk", 4)) { - uint32_t multiple_blocks = 0, block_size, block_samples = 0, wphdr_flags, crc; - uint32_t main_bytes = main_size, corr_bytes = corr_size; - unsigned char *mcp = main_data; - unsigned char *ccp = corr_data; - int msi = 0, csi = 0; - - raw_wv = malloc (sizeof (WavpackRawContext)); - memset (raw_wv, 0, sizeof (WavpackRawContext)); - - if (corr_data && corr_size) { - raw_wvc = malloc (sizeof (WavpackRawContext)); - memset (raw_wvc, 0, sizeof (WavpackRawContext)); - } - - while (main_bytes >= 12) { - WavpackHeader *wphdr = malloc (sizeof (WavpackHeader)); - - if (!msi) { - block_samples = *mcp++; - block_samples += *mcp++ << 8; - block_samples += *mcp++ << 16; - block_samples += *mcp++ << 24; - main_bytes -= 4; - } - - wphdr_flags = *mcp++; - wphdr_flags += *mcp++ << 8; - wphdr_flags += *mcp++ << 16; - wphdr_flags += *mcp++ << 24; - main_bytes -= 4; - - // if the first block does not have the FINAL_BLOCK flag set, - // then there are multiple blocks - - if (!msi && !(wphdr_flags & FINAL_BLOCK)) - multiple_blocks = 1; - - crc = *mcp++; - crc += *mcp++ << 8; - crc += *mcp++ << 16; - crc += *mcp++ << 24; - main_bytes -= 4; - - if (multiple_blocks) { - block_size = *mcp++; - block_size += *mcp++ << 8; - block_size += *mcp++ << 16; - block_size += *mcp++ << 24; - main_bytes -= 4; - } - else - block_size = main_bytes; - - if (block_size > main_bytes) { - if (error) strcpy (error, "main block overran available data!"); - raw_close_stream (raw_wv); - raw_close_stream (raw_wvc); - return NULL; - } - - memset (wphdr, 0, sizeof (WavpackHeader)); - memcpy (wphdr->ckID, "wvpk", 4); - wphdr->ckSize = sizeof (WavpackHeader) - 8 + block_size; - SET_TOTAL_SAMPLES (*wphdr, block_samples); - wphdr->block_samples = block_samples; - wphdr->version = version; - wphdr->flags = wphdr_flags; - wphdr->crc = crc; - WavpackLittleEndianToNative (wphdr, WavpackHeaderFormat); - - raw_wv->num_segments += 2; - raw_wv->segments = realloc (raw_wv->segments, sizeof (RawSegment) * raw_wv->num_segments); - raw_wv->segments [msi].dptr = raw_wv->segments [msi].sptr = (unsigned char *) wphdr; - raw_wv->segments [msi].eptr = raw_wv->segments [msi].dptr + sizeof (WavpackHeader); - raw_wv->segments [msi++].free_required = 1; - raw_wv->segments [msi].dptr = raw_wv->segments [msi].sptr = mcp; - raw_wv->segments [msi].eptr = raw_wv->segments [msi].dptr + block_size; - raw_wv->segments [msi++].free_required = 0; - main_bytes -= block_size; - mcp += block_size; - - if (corr_data && corr_bytes >= 4) { - wphdr = malloc (sizeof (WavpackHeader)); - - crc = *ccp++; - crc += *ccp++ << 8; - crc += *ccp++ << 16; - crc += *ccp++ << 24; - corr_bytes -= 4; - - if (multiple_blocks) { - block_size = *ccp++; - block_size += *ccp++ << 8; - block_size += *ccp++ << 16; - block_size += *ccp++ << 24; - corr_bytes -= 4; - } - else - block_size = corr_bytes; - - if (block_size > corr_bytes) { - if (error) strcpy (error, "correction block overran available data!"); - raw_close_stream (raw_wv); - raw_close_stream (raw_wvc); - return NULL; - } - - memset (wphdr, 0, sizeof (WavpackHeader)); - memcpy (wphdr->ckID, "wvpk", 4); - wphdr->ckSize = sizeof (WavpackHeader) - 8 + block_size; - SET_TOTAL_SAMPLES (*wphdr, block_samples); - wphdr->block_samples = block_samples; - wphdr->version = version; - wphdr->flags = wphdr_flags; - wphdr->crc = crc; - WavpackLittleEndianToNative (wphdr, WavpackHeaderFormat); - - raw_wvc->num_segments += 2; - raw_wvc->segments = realloc (raw_wvc->segments, sizeof (RawSegment) * raw_wvc->num_segments); - raw_wvc->segments [csi].dptr = raw_wvc->segments [csi].sptr = (unsigned char *) wphdr; - raw_wvc->segments [csi].eptr = raw_wvc->segments [csi].dptr + sizeof (WavpackHeader); - raw_wvc->segments [csi++].free_required = 1; - raw_wvc->segments [csi].dptr = raw_wvc->segments [csi].sptr = ccp; - raw_wvc->segments [csi].eptr = raw_wvc->segments [csi].dptr + block_size; - raw_wvc->segments [csi++].free_required = 0; - corr_bytes -= block_size; - ccp += block_size; - } - } - - if (main_bytes || (corr_data && corr_bytes)) { - if (error) strcpy (error, "leftover multiblock data!"); - raw_close_stream (raw_wv); - raw_close_stream (raw_wvc); - return NULL; - } - } - else { // the case of WavPack blocks with headers is much easier... - if (main_data) { - raw_wv = malloc (sizeof (WavpackRawContext)); - memset (raw_wv, 0, sizeof (WavpackRawContext)); - raw_wv->num_segments = 1; - raw_wv->segments = malloc (sizeof (RawSegment) * raw_wv->num_segments); - raw_wv->segments [0].dptr = raw_wv->segments [0].sptr = main_data; - raw_wv->segments [0].eptr = raw_wv->segments [0].dptr + main_size; - raw_wv->segments [0].free_required = 0; - } - - if (corr_data && corr_size) { - raw_wvc = malloc (sizeof (WavpackRawContext)); - memset (raw_wvc, 0, sizeof (WavpackRawContext)); - raw_wvc->num_segments = 1; - raw_wvc->segments = malloc (sizeof (RawSegment) * raw_wvc->num_segments); - raw_wvc->segments [0].dptr = raw_wvc->segments [0].sptr = corr_data; - raw_wvc->segments [0].eptr = raw_wvc->segments [0].dptr + corr_size; - raw_wvc->segments [0].free_required = 0; - } - } - - return WavpackOpenFileInputEx64 (&raw_reader, raw_wv, raw_wvc, error, flags | OPEN_STREAMING | OPEN_NO_CHECKSUM, norm_offset); -} - -// Return the number of samples represented by the current (and in the raw case, only) frame. - -uint32_t WavpackGetNumSamplesInFrame (WavpackContext *wpc) -{ - if (wpc && wpc->streams && wpc->streams [0]) - return wpc->streams [0]->wphdr.block_samples; - else - return -1; -} - diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/open_utils.c b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/open_utils.c deleted file mode 100644 index c880d348..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/open_utils.c +++ /dev/null @@ -1,1279 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2016 David Bryant. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// open_utils.c - -// This module provides all the code required to open an existing WavPack file -// for reading by using a reader callback mechanism (NOT a filename). This -// includes the code required to find and parse WavPack blocks, process any -// included metadata, and queue up the bitstreams containing the encoded audio -// data. It does not the actual code to unpack audio data and this was done so -// that programs that just want to query WavPack files for information (like, -// for example, taggers) don't need to link in a lot of unnecessary code. - -#include -#include - -#include "wavpack_local.h" - -// This function is identical to WavpackOpenFileInput() except that instead -// of providing a filename to open, the caller provides a pointer to a set of -// reader callbacks and instances of up to two streams. The first of these -// streams is required and contains the regular WavPack data stream; the second -// contains the "correction" file if desired. Unlike the standard open -// function which handles the correction file transparently, in this case it -// is the responsibility of the caller to be aware of correction files. - -static int seek_eof_information (WavpackContext *wpc, int64_t *final_index, int get_wrapper); - -WavpackContext *WavpackOpenFileInputEx64 (WavpackStreamReader64 *reader, void *wv_id, void *wvc_id, char *error, int flags, int norm_offset) -{ - WavpackContext *wpc = (WavpackContext *)malloc (sizeof (WavpackContext)); - WavpackStream *wps; - int num_blocks = 0; - unsigned char first_byte; - uint32_t bcount; - - if (!wpc) { - if (error) strcpy (error, "can't allocate memory"); - return NULL; - } - - CLEAR (*wpc); - wpc->wv_in = wv_id; - wpc->wvc_in = wvc_id; - wpc->reader = reader; - wpc->total_samples = -1; - wpc->norm_offset = norm_offset; - wpc->max_streams = OLD_MAX_STREAMS; // use this until overwritten with actual number - wpc->open_flags = flags; - - wpc->filelen = wpc->reader->get_length (wpc->wv_in); - -#ifndef NO_TAGS - if ((flags & (OPEN_TAGS | OPEN_EDIT_TAGS)) && wpc->reader->can_seek (wpc->wv_in)) { - load_tag (wpc); - wpc->reader->set_pos_abs (wpc->wv_in, 0); - - if ((flags & OPEN_EDIT_TAGS) && !editable_tag (&wpc->m_tag)) { - if (error) strcpy (error, "can't edit tags located at the beginning of files!"); - return WavpackCloseFile (wpc); - } - } -#endif - - if (wpc->reader->read_bytes (wpc->wv_in, &first_byte, 1) != 1) { - if (error) strcpy (error, "can't read all of WavPack file!"); - return WavpackCloseFile (wpc); - } - - wpc->reader->push_back_byte (wpc->wv_in, first_byte); - - if (first_byte == 'R') { -#ifdef ENABLE_LEGACY - return open_file3 (wpc, error); -#else - if (error) strcpy (error, "this legacy WavPack file is deprecated, use version 4.80.0 to transcode"); - return WavpackCloseFile (wpc); -#endif - } - - wpc->streams = (WavpackStream **)(malloc ((wpc->num_streams = 1) * sizeof (wpc->streams [0]))); - if (!wpc->streams) { - if (error) strcpy (error, "can't allocate memory"); - return WavpackCloseFile (wpc); - } - - wpc->streams [0] = wps = (WavpackStream *)malloc (sizeof (WavpackStream)); - if (!wps) { - if (error) strcpy (error, "can't allocate memory"); - return WavpackCloseFile (wpc); - } - CLEAR (*wps); - - while (!wps->wphdr.block_samples) { - - wpc->filepos = wpc->reader->get_pos (wpc->wv_in); - bcount = read_next_header (wpc->reader, wpc->wv_in, &wps->wphdr); - - if (bcount == (uint32_t) -1 || - (!wps->wphdr.block_samples && num_blocks++ > 16)) { - if (error) strcpy (error, "not compatible with this version of WavPack file!"); - return WavpackCloseFile (wpc); - } - - wpc->filepos += bcount; - wps->blockbuff = (unsigned char *)malloc (wps->wphdr.ckSize + 8); - if (!wps->blockbuff) { - if (error) strcpy (error, "can't allocate memory"); - return WavpackCloseFile (wpc); - } - memcpy (wps->blockbuff, &wps->wphdr, 32); - - if (wpc->reader->read_bytes (wpc->wv_in, wps->blockbuff + 32, wps->wphdr.ckSize - 24) != wps->wphdr.ckSize - 24) { - if (error) strcpy (error, "can't read all of WavPack file!"); - return WavpackCloseFile (wpc); - } - - // if block does not verify, flag error, free buffer, and continue - if (!WavpackVerifySingleBlock (wps->blockbuff, !(flags & OPEN_NO_CHECKSUM))) { - wps->wphdr.block_samples = 0; - free (wps->blockbuff); - wps->blockbuff = NULL; - wpc->crc_errors++; - continue; - } - - wps->init_done = FALSE; - - if (wps->wphdr.block_samples) { - if (flags & OPEN_STREAMING) - SET_BLOCK_INDEX (wps->wphdr, 0); - else if (wpc->total_samples == -1) { - if (GET_BLOCK_INDEX (wps->wphdr) || GET_TOTAL_SAMPLES (wps->wphdr) == -1) { - wpc->initial_index = GET_BLOCK_INDEX (wps->wphdr); - SET_BLOCK_INDEX (wps->wphdr, 0); - - if (wpc->reader->can_seek (wpc->wv_in)) { - int64_t final_index = -1; - - seek_eof_information (wpc, &final_index, FALSE); - - if (final_index != -1) - wpc->total_samples = final_index - wpc->initial_index; - } - } - else - wpc->total_samples = GET_TOTAL_SAMPLES (wps->wphdr); - } - } - else if (wpc->total_samples == -1 && !GET_BLOCK_INDEX (wps->wphdr) && GET_TOTAL_SAMPLES (wps->wphdr)) - wpc->total_samples = GET_TOTAL_SAMPLES (wps->wphdr); - - if (wpc->wvc_in && wps->wphdr.block_samples && (wps->wphdr.flags & HYBRID_FLAG)) { - unsigned char ch; - - if (wpc->reader->read_bytes (wpc->wvc_in, &ch, 1) == 1) { - wpc->reader->push_back_byte (wpc->wvc_in, ch); - wpc->file2len = wpc->reader->get_length (wpc->wvc_in); - wpc->wvc_flag = TRUE; - } - } - - if (wpc->wvc_flag && !read_wvc_block (wpc)) { - if (error) strcpy (error, "not compatible with this version of correction file!"); - return WavpackCloseFile (wpc); - } - - if (!wps->init_done && !unpack_init (wpc)) { - if (error) strcpy (error, wpc->error_message [0] ? wpc->error_message : - "not compatible with this version of WavPack file!"); - - return WavpackCloseFile (wpc); - } - - wps->init_done = TRUE; - } - - wpc->config.flags &= ~0xff; - wpc->config.flags |= wps->wphdr.flags & 0xff; - - if (!wpc->config.num_channels) { - wpc->config.num_channels = (wps->wphdr.flags & MONO_FLAG) ? 1 : 2; - wpc->config.channel_mask = 0x5 - wpc->config.num_channels; - } - - if ((flags & OPEN_2CH_MAX) && !(wps->wphdr.flags & FINAL_BLOCK)) - wpc->reduced_channels = (wps->wphdr.flags & MONO_FLAG) ? 1 : 2; - - if (wps->wphdr.flags & DSD_FLAG) { -#ifdef ENABLE_DSD - if (flags & OPEN_DSD_NATIVE) { - wpc->config.bytes_per_sample = 1; - wpc->config.bits_per_sample = 8; - } - else if (flags & OPEN_DSD_AS_PCM) { - wpc->decimation_context = decimate_dsd_init (wpc->reduced_channels ? - wpc->reduced_channels : wpc->config.num_channels); - - wpc->config.bytes_per_sample = 3; - wpc->config.bits_per_sample = 24; - } - else { - if (error) strcpy (error, "not configured to handle DSD WavPack files!"); - return WavpackCloseFile (wpc); - } -#else - if (error) strcpy (error, "not configured to handle DSD WavPack files!"); - return WavpackCloseFile (wpc); -#endif - } - else { - wpc->config.bytes_per_sample = (wps->wphdr.flags & BYTES_STORED) + 1; - wpc->config.float_norm_exp = wps->float_norm_exp; - - wpc->config.bits_per_sample = (wpc->config.bytes_per_sample * 8) - - ((wps->wphdr.flags & SHIFT_MASK) >> SHIFT_LSB); - } - - if (!wpc->config.sample_rate) { - if (!wps->wphdr.block_samples || (wps->wphdr.flags & SRATE_MASK) == SRATE_MASK) - wpc->config.sample_rate = 44100; - else - wpc->config.sample_rate = sample_rates [(wps->wphdr.flags & SRATE_MASK) >> SRATE_LSB]; - } - - return wpc; -} - -// This function returns the major version number of the WavPack program -// (or library) that created the open file. Currently, this can be 1 to 5. -// Minor versions are not recorded in WavPack files. - -int WavpackGetVersion (WavpackContext *wpc) -{ - if (wpc) { -#ifdef ENABLE_LEGACY - if (wpc->stream3) - return get_version3 (wpc); -#endif - return wpc->version_five ? 5 : 4; - } - - return 0; -} - -// Return the file format specified in the call to WavpackSetFileInformation() -// when the file was created. For all files created prior to WavPack 5.0 this -// will 0 (WP_FORMAT_WAV). - -unsigned char WavpackGetFileFormat (WavpackContext *wpc) -{ - return wpc->file_format; -} - -// Return a string representing the recommended file extension for the open -// WavPack file. For all files created prior to WavPack 5.0 this will be "wav", -// even for raw files with no RIFF into. This string is specified in the -// call to WavpackSetFileInformation() when the file was created. - -char *WavpackGetFileExtension (WavpackContext *wpc) -{ - if (wpc && wpc->file_extension [0]) - return wpc->file_extension; - else - return "wav"; -} - -// This function initializes everything required to unpack a WavPack block -// and must be called before unpack_samples() is called to obtain audio data. -// It is assumed that the WavpackHeader has been read into the wps->wphdr -// (in the current WavpackStream) and that the entire block has been read at -// wps->blockbuff. If a correction file is available (wpc->wvc_flag = TRUE) -// then the corresponding correction block must be read into wps->block2buff -// and its WavpackHeader has overwritten the header at wps->wphdr. This is -// where all the metadata blocks are scanned including those that contain -// bitstream data. - -static int read_metadata_buff (WavpackMetadata *wpmd, unsigned char *blockbuff, unsigned char **buffptr); -static int process_metadata (WavpackContext *wpc, WavpackMetadata *wpmd); -static void bs_open_read (Bitstream *bs, void *buffer_start, void *buffer_end); - -int unpack_init (WavpackContext *wpc) -{ - WavpackStream *wps = wpc->streams [wpc->current_stream]; - unsigned char *blockptr, *block2ptr; - WavpackMetadata wpmd; - - wps->num_terms = 0; - wps->mute_error = FALSE; - wps->crc = wps->crc_x = 0xffffffff; - wps->dsd.ready = 0; - CLEAR (wps->wvbits); - CLEAR (wps->wvcbits); - CLEAR (wps->wvxbits); - CLEAR (wps->decorr_passes); - CLEAR (wps->dc); - CLEAR (wps->w); - - if (!(wps->wphdr.flags & MONO_FLAG) && wpc->config.num_channels && wps->wphdr.block_samples && - (wpc->reduced_channels == 1 || wpc->config.num_channels == 1)) { - wps->mute_error = TRUE; - return FALSE; - } - - if ((wps->wphdr.flags & UNKNOWN_FLAGS) || (wps->wphdr.flags & MONO_DATA) == MONO_DATA) { - wps->mute_error = TRUE; - return FALSE; - } - - blockptr = wps->blockbuff + sizeof (WavpackHeader); - - while (read_metadata_buff (&wpmd, wps->blockbuff, &blockptr)) - if (!process_metadata (wpc, &wpmd)) { - wps->mute_error = TRUE; - return FALSE; - } - - if (wps->wphdr.block_samples && wpc->wvc_flag && wps->block2buff) { - block2ptr = wps->block2buff + sizeof (WavpackHeader); - - while (read_metadata_buff (&wpmd, wps->block2buff, &block2ptr)) - if (!process_metadata (wpc, &wpmd)) { - wps->mute_error = TRUE; - return FALSE; - } - } - - if (wps->wphdr.block_samples && ((wps->wphdr.flags & DSD_FLAG) ? !wps->dsd.ready : !bs_is_open (&wps->wvbits))) { - if (bs_is_open (&wps->wvcbits)) - strcpy (wpc->error_message, "can't unpack correction files alone!"); - - wps->mute_error = TRUE; - return FALSE; - } - - if (wps->wphdr.block_samples && !bs_is_open (&wps->wvxbits)) { - if ((wps->wphdr.flags & INT32_DATA) && wps->int32_sent_bits) - wpc->lossy_blocks = TRUE; - - if ((wps->wphdr.flags & FLOAT_DATA) && - wps->float_flags & (FLOAT_EXCEPTIONS | FLOAT_ZEROS_SENT | FLOAT_SHIFT_SENT | FLOAT_SHIFT_SAME)) - wpc->lossy_blocks = TRUE; - } - - if (wps->wphdr.block_samples) - wps->sample_index = GET_BLOCK_INDEX (wps->wphdr); - - return TRUE; -} - -//////////////////////////////// matadata handlers /////////////////////////////// - -// These functions handle specific metadata types and are called directly -// during WavPack block parsing by process_metadata() at the bottom. - -// This function initialzes the main bitstream for audio samples, which must -// be in the "wv" file. - -static int init_wv_bitstream (WavpackStream *wps, WavpackMetadata *wpmd) -{ - if (!wpmd->byte_length || (wpmd->byte_length & 1)) - return FALSE; - - bs_open_read (&wps->wvbits, wpmd->data, (unsigned char *) wpmd->data + wpmd->byte_length); - return TRUE; -} - -// This function initialzes the "correction" bitstream for audio samples, -// which currently must be in the "wvc" file. - -static int init_wvc_bitstream (WavpackStream *wps, WavpackMetadata *wpmd) -{ - if (!wpmd->byte_length || (wpmd->byte_length & 1)) - return FALSE; - - bs_open_read (&wps->wvcbits, wpmd->data, (unsigned char *) wpmd->data + wpmd->byte_length); - return TRUE; -} - -// This function initialzes the "extra" bitstream for audio samples which -// contains the information required to losslessly decompress 32-bit float data -// or integer data that exceeds 24 bits. This bitstream is in the "wv" file -// for pure lossless data or the "wvc" file for hybrid lossless. This data -// would not be used for hybrid lossy mode. There is also a 32-bit CRC stored -// in the first 4 bytes of these blocks. - -static int init_wvx_bitstream (WavpackStream *wps, WavpackMetadata *wpmd) -{ - unsigned char *cp = (unsigned char *)wpmd->data; - - if (wpmd->byte_length <= 4 || (wpmd->byte_length & 1)) - return FALSE; - - wps->crc_wvx = *cp++; - wps->crc_wvx |= (int32_t) *cp++ << 8; - wps->crc_wvx |= (int32_t) *cp++ << 16; - wps->crc_wvx |= (int32_t) *cp++ << 24; - - bs_open_read (&wps->wvxbits, cp, (unsigned char *) wpmd->data + wpmd->byte_length); - return TRUE; -} - -// Read the int32 data from the specified metadata into the specified stream. -// This data is used for integer data that has more than 24 bits of magnitude -// or, in some cases, used to eliminate redundant bits from any audio stream. - -static int read_int32_info (WavpackStream *wps, WavpackMetadata *wpmd) -{ - int bytecnt = wpmd->byte_length; - char *byteptr = (char *)wpmd->data; - - if (bytecnt != 4) - return FALSE; - - wps->int32_sent_bits = *byteptr++; - wps->int32_zeros = *byteptr++; - wps->int32_ones = *byteptr++; - wps->int32_dups = *byteptr; - - return TRUE; -} - -static int read_float_info (WavpackStream *wps, WavpackMetadata *wpmd) -{ - int bytecnt = wpmd->byte_length; - char *byteptr = (char *)wpmd->data; - - if (bytecnt != 4) - return FALSE; - - wps->float_flags = *byteptr++; - wps->float_shift = *byteptr++; - wps->float_max_exp = *byteptr++; - wps->float_norm_exp = *byteptr; - return TRUE; -} - -// Read multichannel information from metadata. The first byte is the total -// number of channels and the following bytes represent the channel_mask -// as described for Microsoft WAVEFORMATEX. - -static int read_channel_info (WavpackContext *wpc, WavpackMetadata *wpmd) -{ - int bytecnt = wpmd->byte_length, shift = 0, mask_bits; - unsigned char *byteptr = (unsigned char *)wpmd->data; - uint32_t mask = 0; - - if (!bytecnt || bytecnt > 7) - return FALSE; - - if (!wpc->config.num_channels) { - - // if bytecnt is 6 or 7 we are using new configuration with "unlimited" streams - - if (bytecnt >= 6) { - wpc->config.num_channels = (byteptr [0] | ((byteptr [2] & 0xf) << 8)) + 1; - wpc->max_streams = (byteptr [1] | ((byteptr [2] & 0xf0) << 4)) + 1; - - if (wpc->config.num_channels < wpc->max_streams) - return FALSE; - - byteptr += 3; - mask = *byteptr++; - mask |= (uint32_t) *byteptr++ << 8; - mask |= (uint32_t) *byteptr++ << 16; - - if (bytecnt == 7) // this was introduced in 5.0 - mask |= (uint32_t) *byteptr << 24; - } - else { - wpc->config.num_channels = *byteptr++; - - while (--bytecnt) { - mask |= (uint32_t) *byteptr++ << shift; - shift += 8; - } - } - - if (wpc->config.num_channels > wpc->max_streams * 2) - return FALSE; - - wpc->config.channel_mask = mask; - - for (mask_bits = 0; mask; mask >>= 1) - if ((mask & 1) && ++mask_bits > wpc->config.num_channels) - return FALSE; - } - - return TRUE; -} - -// Read multichannel identity information from metadata. Data is an array of -// unsigned characters representing any channels in the file that DO NOT -// match one the 18 Microsoft standard channels (and are represented in the -// channel mask). A value of 0 is not allowed and 0xff means an unknown or -// undefined channel identity. - -static int read_channel_identities (WavpackContext *wpc, WavpackMetadata *wpmd) -{ - if (!wpc->channel_identities) { - wpc->channel_identities = (unsigned char *)malloc (wpmd->byte_length + 1); - memcpy (wpc->channel_identities, wpmd->data, wpmd->byte_length); - wpc->channel_identities [wpmd->byte_length] = 0; - } - - return TRUE; -} - -// Read configuration information from metadata. - -static int read_config_info (WavpackContext *wpc, WavpackMetadata *wpmd) -{ - int bytecnt = wpmd->byte_length; - unsigned char *byteptr = (unsigned char *)wpmd->data; - - if (bytecnt >= 3) { - wpc->config.flags &= 0xff; - wpc->config.flags |= (int32_t) *byteptr++ << 8; - wpc->config.flags |= (int32_t) *byteptr++ << 16; - wpc->config.flags |= (int32_t) *byteptr++ << 24; - bytecnt -= 3; - - if (bytecnt && (wpc->config.flags & CONFIG_EXTRA_MODE)) { - wpc->config.xmode = *byteptr++; - bytecnt--; - } - - // we used an extra config byte here for the 5.0.0 alpha, so still - // honor it now (but this has been replaced with NEW_CONFIG) - - if (bytecnt) { - wpc->config.qmode = (wpc->config.qmode & ~0xff) | *byteptr; - wpc->version_five = 1; - } - } - - return TRUE; -} - -// Read "new" configuration information from metadata. - -static int read_new_config_info (WavpackContext *wpc, WavpackMetadata *wpmd) -{ - int bytecnt = wpmd->byte_length; - unsigned char *byteptr = (unsigned char *)wpmd->data; - - wpc->version_five = 1; // just having this block signals version 5.0 - - wpc->file_format = wpc->config.qmode = wpc->channel_layout = 0; - - if (wpc->channel_reordering) { - free (wpc->channel_reordering); - wpc->channel_reordering = NULL; - } - - // if there's any data, the first two bytes are file_format and qmode flags - - if (bytecnt >= 2) { - wpc->file_format = *byteptr++; - wpc->config.qmode = (wpc->config.qmode & ~0xff) | *byteptr++; - bytecnt -= 2; - - // another byte indicates a channel layout - - if (bytecnt) { - int nchans, i; - - wpc->channel_layout = (int32_t) *byteptr++ << 16; - bytecnt--; - - // another byte means we have a channel count for the layout and maybe a reordering - - if (bytecnt) { - wpc->channel_layout += nchans = *byteptr++; - bytecnt--; - - // any more means there's a reordering string - - if (bytecnt) { - if (bytecnt > nchans) - return FALSE; - - wpc->channel_reordering = (unsigned char *)malloc (nchans); - - // note that redundant reordering info is not stored, so we fill in the rest - - if (wpc->channel_reordering) { - for (i = 0; i < nchans; ++i) - if (bytecnt) { - wpc->channel_reordering [i] = *byteptr++; - - if (wpc->channel_reordering [i] >= nchans) // make sure index is in range - wpc->channel_reordering [i] = 0; - - bytecnt--; - } - else - wpc->channel_reordering [i] = i; - } - } - } - else - wpc->channel_layout += wpc->config.num_channels; - } - } - - return TRUE; -} - -// Read non-standard sampling rate from metadata. - -static int read_sample_rate (WavpackContext *wpc, WavpackMetadata *wpmd) -{ - int bytecnt = wpmd->byte_length; - unsigned char *byteptr = (unsigned char *)wpmd->data; - - if (bytecnt == 3 || bytecnt == 4) { - wpc->config.sample_rate = (int32_t) *byteptr++; - wpc->config.sample_rate |= (int32_t) *byteptr++ << 8; - wpc->config.sample_rate |= (int32_t) *byteptr++ << 16; - - // for sampling rates > 16777215 (non-audio probably, or ...) - - if (bytecnt == 4) - wpc->config.sample_rate |= (int32_t) (*byteptr & 0x7f) << 24; - } - - return TRUE; -} - -// Read wrapper data from metadata. Currently, this consists of the RIFF -// header and trailer that wav files contain around the audio data but could -// be used for other formats as well. Because WavPack files contain all the -// information required for decoding and playback, this data can probably -// be ignored except when an exact wavefile restoration is needed. - -static int read_wrapper_data (WavpackContext *wpc, WavpackMetadata *wpmd) -{ - if ((wpc->open_flags & OPEN_WRAPPER) && wpc->wrapper_bytes < MAX_WRAPPER_BYTES && wpmd->byte_length) { - wpc->wrapper_data = (unsigned char *)realloc (wpc->wrapper_data, wpc->wrapper_bytes + wpmd->byte_length); - if (!wpc->wrapper_data) - return FALSE; - memcpy (wpc->wrapper_data + wpc->wrapper_bytes, wpmd->data, wpmd->byte_length); - wpc->wrapper_bytes += wpmd->byte_length; - } - - return TRUE; -} - -static int read_metadata_buff (WavpackMetadata *wpmd, unsigned char *blockbuff, unsigned char **buffptr) -{ - WavpackHeader *wphdr = (WavpackHeader *) blockbuff; - unsigned char *buffend = blockbuff + wphdr->ckSize + 8; - - if (buffend - *buffptr < 2) - return FALSE; - - wpmd->id = *(*buffptr)++; - wpmd->byte_length = *(*buffptr)++ << 1; - - if (wpmd->id & ID_LARGE) { - wpmd->id &= ~ID_LARGE; - - if (buffend - *buffptr < 2) - return FALSE; - - wpmd->byte_length += *(*buffptr)++ << 9; - wpmd->byte_length += *(*buffptr)++ << 17; - } - - if (wpmd->id & ID_ODD_SIZE) { - if (!wpmd->byte_length) // odd size and zero length makes no sense - return FALSE; - wpmd->id &= ~ID_ODD_SIZE; - wpmd->byte_length--; - } - - if (wpmd->byte_length) { - if (buffend - *buffptr < wpmd->byte_length + (wpmd->byte_length & 1)) { - wpmd->data = NULL; - return FALSE; - } - - wpmd->data = *buffptr; - (*buffptr) += wpmd->byte_length + (wpmd->byte_length & 1); - } - else - wpmd->data = NULL; - - return TRUE; -} - -static int process_metadata (WavpackContext *wpc, WavpackMetadata *wpmd) -{ - WavpackStream *wps = wpc->streams [wpc->current_stream]; - - switch (wpmd->id) { - case ID_DUMMY: - return TRUE; - - case ID_DECORR_TERMS: - return read_decorr_terms (wps, wpmd); - - case ID_DECORR_WEIGHTS: - return read_decorr_weights (wps, wpmd); - - case ID_DECORR_SAMPLES: - return read_decorr_samples (wps, wpmd); - - case ID_ENTROPY_VARS: - return read_entropy_vars (wps, wpmd); - - case ID_HYBRID_PROFILE: - return read_hybrid_profile (wps, wpmd); - - case ID_SHAPING_WEIGHTS: - return read_shaping_info (wps, wpmd); - - case ID_FLOAT_INFO: - return read_float_info (wps, wpmd); - - case ID_INT32_INFO: - return read_int32_info (wps, wpmd); - - case ID_CHANNEL_INFO: - return read_channel_info (wpc, wpmd); - - case ID_CHANNEL_IDENTITIES: - return read_channel_identities (wpc, wpmd); - - case ID_CONFIG_BLOCK: - return read_config_info (wpc, wpmd); - - case ID_NEW_CONFIG_BLOCK: - return read_new_config_info (wpc, wpmd); - - case ID_SAMPLE_RATE: - return read_sample_rate (wpc, wpmd); - - case ID_WV_BITSTREAM: - return init_wv_bitstream (wps, wpmd); - - case ID_WVC_BITSTREAM: - return init_wvc_bitstream (wps, wpmd); - - case ID_WVX_BITSTREAM: - return init_wvx_bitstream (wps, wpmd); - - case ID_DSD_BLOCK: -#ifdef ENABLE_DSD - return init_dsd_block (wpc, wpmd); -#else - strcpy (wpc->error_message, "not configured to handle DSD WavPack files!"); - return FALSE; -#endif - - case ID_ALT_HEADER: case ID_ALT_TRAILER: - if (!(wpc->open_flags & OPEN_ALT_TYPES)) - return TRUE; - - case ID_RIFF_HEADER: case ID_RIFF_TRAILER: - return read_wrapper_data (wpc, wpmd); - - case ID_ALT_MD5_CHECKSUM: - if (!(wpc->open_flags & OPEN_ALT_TYPES)) - return TRUE; - - case ID_MD5_CHECKSUM: - if (wpmd->byte_length == 16) { - memcpy (wpc->config.md5_checksum, wpmd->data, 16); - wpc->config.flags |= CONFIG_MD5_CHECKSUM; - wpc->config.md5_read = 1; - } - - return TRUE; - - case ID_ALT_EXTENSION: - if (wpmd->byte_length && wpmd->byte_length < sizeof (wpc->file_extension)) { - memcpy (wpc->file_extension, wpmd->data, wpmd->byte_length); - wpc->file_extension [wpmd->byte_length] = 0; - } - - return TRUE; - - // we don't actually verify the checksum here (it's done right after the - // block is read), but it's a good indicator of version 5 files - - case ID_BLOCK_CHECKSUM: - wpc->version_five = 1; - return TRUE; - - default: - return (wpmd->id & ID_OPTIONAL_DATA) ? TRUE : FALSE; - } -} - -//////////////////////////////// bitstream management /////////////////////////////// - -// Open the specified BitStream and associate with the specified buffer. - -static void bs_read (Bitstream *bs); - -static void bs_open_read (Bitstream *bs, void *buffer_start, void *buffer_end) -{ - bs->error = bs->sr = bs->bc = 0; - bs->ptr = ((bs->buf = (uint16_t *)buffer_start) - 1); - bs->end = (uint16_t *)buffer_end; - bs->wrap = bs_read; -} - -// This function is only called from the getbit() and getbits() macros when -// the BitStream has been exhausted and more data is required. Sinve these -// bistreams no longer access files, this function simple sets an error and -// resets the buffer. - -static void bs_read (Bitstream *bs) -{ - bs->ptr = bs->buf; - bs->error = 1; -} - -// This function is called to close the bitstream. It returns the number of -// full bytes actually read as bits. - -uint32_t bs_close_read (Bitstream *bs) -{ - uint32_t bytes_read; - - if (bs->bc < sizeof (*(bs->ptr)) * 8) - bs->ptr++; - - bytes_read = (uint32_t)(bs->ptr - bs->buf) * sizeof (*(bs->ptr)); - - if (!(bytes_read & 1)) - ++bytes_read; - - CLEAR (*bs); - return bytes_read; -} - -// Normally the trailing wrapper will not be available when a WavPack file is first -// opened for reading because it is stored in the final block of the file. This -// function forces a seek to the end of the file to pick up any trailing wrapper -// stored there (then use WavPackGetWrapper**() to obtain). This can obviously only -// be used for seekable files (not pipes) and is not available for pre-4.0 WavPack -// files. - -void WavpackSeekTrailingWrapper (WavpackContext *wpc) -{ - if ((wpc->open_flags & OPEN_WRAPPER) && - wpc->reader->can_seek (wpc->wv_in) && !wpc->stream3) - seek_eof_information (wpc, NULL, TRUE); -} - -// Get any MD5 checksum stored in the metadata (should be called after reading -// last sample or an extra seek will occur). A return value of FALSE indicates -// that no MD5 checksum was stored. - -int WavpackGetMD5Sum (WavpackContext *wpc, unsigned char data [16]) -{ - if (wpc->config.flags & CONFIG_MD5_CHECKSUM) { - if (!wpc->config.md5_read && wpc->reader->can_seek (wpc->wv_in)) - seek_eof_information (wpc, NULL, FALSE); - - if (wpc->config.md5_read) { - memcpy (data, wpc->config.md5_checksum, 16); - return TRUE; - } - } - - return FALSE; -} - -// Read from current file position until a valid 32-byte WavPack 4.0 header is -// found and read into the specified pointer. The number of bytes skipped is -// returned. If no WavPack header is found within 1 meg, then a -1 is returned -// to indicate the error. No additional bytes are read past the header and it -// is returned in the processor's native endian mode. Seeking is not required. - -uint32_t read_next_header (WavpackStreamReader64 *reader, void *id, WavpackHeader *wphdr) -{ - unsigned char buffer [sizeof (*wphdr)], *sp = buffer + sizeof (*wphdr), *ep = sp; - uint32_t bytes_skipped = 0; - int bleft; - - while (1) { - if (sp < ep) { - bleft = (int)(ep - sp); - memmove (buffer, sp, bleft); - } - else - bleft = 0; - - if (reader->read_bytes (id, buffer + bleft, sizeof (*wphdr) - bleft) != sizeof (*wphdr) - bleft) - return -1; - - sp = buffer; - - if (*sp++ == 'w' && *sp == 'v' && *++sp == 'p' && *++sp == 'k' && - !(*++sp & 1) && sp [2] < 16 && !sp [3] && (sp [2] || sp [1] || *sp >= 24) && sp [5] == 4 && - sp [4] >= (MIN_STREAM_VERS & 0xff) && sp [4] <= (MAX_STREAM_VERS & 0xff) && sp [18] < 3 && !sp [19]) { - memcpy (wphdr, buffer, sizeof (*wphdr)); - WavpackLittleEndianToNative (wphdr, WavpackHeaderFormat); - return bytes_skipped; - } - - while (sp < ep && *sp != 'w') - sp++; - - if ((bytes_skipped += (uint32_t)(sp - buffer)) > 1024 * 1024) - return -1; - } -} - -// Compare the regular wv file block header to a potential matching wvc -// file block header and return action code based on analysis: -// -// 0 = use wvc block (assuming rest of block is readable) -// 1 = bad match; try to read next wvc block -// -1 = bad match; ignore wvc file for this block and backup fp (if -// possible) and try to use this block next time - -static int match_wvc_header (WavpackHeader *wv_hdr, WavpackHeader *wvc_hdr) -{ - if (GET_BLOCK_INDEX (*wv_hdr) == GET_BLOCK_INDEX (*wvc_hdr) && - wv_hdr->block_samples == wvc_hdr->block_samples) { - int wvi = 0, wvci = 0; - - if (wv_hdr->flags == wvc_hdr->flags) - return 0; - - if (wv_hdr->flags & INITIAL_BLOCK) - wvi -= 1; - - if (wv_hdr->flags & FINAL_BLOCK) - wvi += 1; - - if (wvc_hdr->flags & INITIAL_BLOCK) - wvci -= 1; - - if (wvc_hdr->flags & FINAL_BLOCK) - wvci += 1; - - return (wvci - wvi < 0) ? 1 : -1; - } - - if (((GET_BLOCK_INDEX (*wvc_hdr) - GET_BLOCK_INDEX (*wv_hdr)) << 24) < 0) - return 1; - else - return -1; -} - -// Read the wvc block that matches the regular wv block that has been -// read for the current stream. If an exact match is not found then -// we either keep reading or back up and (possibly) use the block -// later. The skip_wvc flag is set if not matching wvc block is found -// so that we can still decode using only the lossy version (although -// we flag this as an error). A return of FALSE indicates a serious -// error (not just that we missed one wvc block). - -int read_wvc_block (WavpackContext *wpc) -{ - WavpackStream *wps = wpc->streams [wpc->current_stream]; - int64_t bcount, file2pos; - WavpackHeader orig_wphdr; - WavpackHeader wphdr; - int compare_result; - - while (1) { - file2pos = wpc->reader->get_pos (wpc->wvc_in); - bcount = read_next_header (wpc->reader, wpc->wvc_in, &wphdr); - - if (bcount == (uint32_t) -1) { - wps->wvc_skip = TRUE; - wpc->crc_errors++; - return FALSE; - } - - memcpy (&orig_wphdr, &wphdr, 32); // save original header for verify step - - if (wpc->open_flags & OPEN_STREAMING) - SET_BLOCK_INDEX (wphdr, wps->sample_index = 0); - else - SET_BLOCK_INDEX (wphdr, GET_BLOCK_INDEX (wphdr) - wpc->initial_index); - - if (wphdr.flags & INITIAL_BLOCK) - wpc->file2pos = file2pos + bcount; - - compare_result = match_wvc_header (&wps->wphdr, &wphdr); - - if (!compare_result) { - wps->block2buff = (unsigned char *)malloc (wphdr.ckSize + 8); - if (!wps->block2buff) - return FALSE; - - if (wpc->reader->read_bytes (wpc->wvc_in, wps->block2buff + 32, wphdr.ckSize - 24) != - wphdr.ckSize - 24) { - free (wps->block2buff); - wps->block2buff = NULL; - wps->wvc_skip = TRUE; - wpc->crc_errors++; - return FALSE; - } - - memcpy (wps->block2buff, &orig_wphdr, 32); - - // don't use corrupt blocks - if (!WavpackVerifySingleBlock (wps->block2buff, !(wpc->open_flags & OPEN_NO_CHECKSUM))) { - free (wps->block2buff); - wps->block2buff = NULL; - wps->wvc_skip = TRUE; - wpc->crc_errors++; - return TRUE; - } - - wps->wvc_skip = FALSE; - memcpy (wps->block2buff, &wphdr, 32); - memcpy (&wps->wphdr, &wphdr, 32); - return TRUE; - } - else if (compare_result == -1) { - wps->wvc_skip = TRUE; - wpc->reader->set_pos_rel (wpc->wvc_in, -32, SEEK_CUR); - wpc->crc_errors++; - return TRUE; - } - } -} - -// This function is used to seek to end of a file to obtain certain information -// that is stored there at the file creation time because it is not known at -// the start. This includes the MD5 sum and and trailing part of the file -// wrapper, and in some rare cases may include the total number of samples in -// the file (although we usually try to back up and write that at the front of -// the file). Note this function restores the file position to its original -// location (and obviously requires a seekable file). The normal return value -// is TRUE indicating no errors, although this does not actually mean that any -// information was retrieved. An error return of FALSE usually means the file -// terminated unexpectedly. Note that this could be used to get all three -// types of information in one go, but it's not actually used that way now. - -static int seek_eof_information (WavpackContext *wpc, int64_t *final_index, int get_wrapper) -{ - int64_t restore_pos, last_pos = -1; - WavpackStreamReader64 *reader = wpc->reader; - int alt_types = wpc->open_flags & OPEN_ALT_TYPES; - uint32_t blocks = 0, audio_blocks = 0; - void *id = wpc->wv_in; - WavpackHeader wphdr; - - restore_pos = reader->get_pos (id); // we restore file position when done - - // start 1MB from the end-of-file, or from the start if the file is not that big - - if (reader->get_length (id) > (int64_t) 1048576) - reader->set_pos_rel (id, -1048576, SEEK_END); - else - reader->set_pos_abs (id, 0); - - // Note that we go backward (without parsing inside blocks) until we find a block - // with audio (careful to not get stuck in a loop). Only then do we go forward - // parsing all blocks in their entirety. - - while (1) { - uint32_t bcount = read_next_header (reader, id, &wphdr); - int64_t current_pos = reader->get_pos (id); - - // if we just got to the same place as last time, we're stuck and need to give up - - if (current_pos == last_pos) { - reader->set_pos_abs (id, restore_pos); - return FALSE; - } - - last_pos = current_pos; - - // We enter here if we just read 1 MB without seeing any WavPack block headers. - // Since WavPack blocks are < 1 MB, that means we're in a big APE tag, or we got - // to the end-of-file. - - if (bcount == (uint32_t) -1) { - - // if we have not seen any blocks at all yet, back up almost 2 MB (or to the - // beginning of the file) and try again - - if (!blocks) { - if (current_pos > (int64_t) 2000000) - reader->set_pos_rel (id, -2000000, SEEK_CUR); - else - reader->set_pos_abs (id, 0); - - continue; - } - - // if we have seen WavPack blocks, then this means we've done all we can do here - - reader->set_pos_abs (id, restore_pos); - return TRUE; - } - - blocks++; - - // If the block has audio samples, calculate a final index, although this is not - // final since this may not be the last block with audio. On the other hand, if - // this block does not have audio, and we haven't seen one with audio, we have - // to go back some more. - - if (wphdr.block_samples) { - if (final_index) - *final_index = GET_BLOCK_INDEX (wphdr) + wphdr.block_samples; - - audio_blocks++; - } - else if (!audio_blocks) { - if (current_pos > (int64_t) 1048576) - reader->set_pos_rel (id, -1048576, SEEK_CUR); - else - reader->set_pos_abs (id, 0); - - continue; - } - - // at this point we have seen at least one block with audio, so we parse the - // entire block looking for MD5 metadata or (conditionally) trailing wrappers - - bcount = wphdr.ckSize - sizeof (WavpackHeader) + 8; - - while (bcount >= 2) { - unsigned char meta_id, c1, c2; - uint32_t meta_bc, meta_size; - - if (reader->read_bytes (id, &meta_id, 1) != 1 || - reader->read_bytes (id, &c1, 1) != 1) { - reader->set_pos_abs (id, restore_pos); - return FALSE; - } - - meta_bc = c1 << 1; - bcount -= 2; - - if (meta_id & ID_LARGE) { - if (bcount < 2 || reader->read_bytes (id, &c1, 1) != 1 || - reader->read_bytes (id, &c2, 1) != 1) { - reader->set_pos_abs (id, restore_pos); - return FALSE; - } - - meta_bc += ((uint32_t) c1 << 9) + ((uint32_t) c2 << 17); - bcount -= 2; - } - - meta_size = (meta_id & ID_ODD_SIZE) ? meta_bc - 1 : meta_bc; - meta_id &= ID_UNIQUE; - - if (get_wrapper && (meta_id == ID_RIFF_TRAILER || (alt_types && meta_id == ID_ALT_TRAILER)) && meta_bc) { - wpc->wrapper_data = (unsigned char *)realloc (wpc->wrapper_data, wpc->wrapper_bytes + meta_bc); - - if (!wpc->wrapper_data) { - reader->set_pos_abs (id, restore_pos); - return FALSE; - } - - if (reader->read_bytes (id, wpc->wrapper_data + wpc->wrapper_bytes, meta_bc) == meta_bc) - wpc->wrapper_bytes += meta_size; - else { - reader->set_pos_abs (id, restore_pos); - return FALSE; - } - } - else if (meta_id == ID_MD5_CHECKSUM || (alt_types && meta_id == ID_ALT_MD5_CHECKSUM)) { - if (meta_bc == 16 && bcount >= 16) { - if (reader->read_bytes (id, wpc->config.md5_checksum, 16) == 16) - wpc->config.md5_read = TRUE; - else { - reader->set_pos_abs (id, restore_pos); - return FALSE; - } - } - else - reader->set_pos_rel (id, meta_bc, SEEK_CUR); - } - else - reader->set_pos_rel (id, meta_bc, SEEK_CUR); - - bcount -= meta_bc; - } - } -} - -// Quickly verify the referenced block. It is assumed that the WavPack header has been converted -// to native endian format. If a block checksum is performed, that is done in little-endian -// (file) format. It is also assumed that the caller has made sure that the block length -// indicated in the header is correct (we won't overflow the buffer). If a checksum is present, -// then it is checked, otherwise we just check that all the metadata blocks are formatted -// correctly (without looking at their contents). Returns FALSE for bad block. - -int WavpackVerifySingleBlock (unsigned char *buffer, int verify_checksum) -{ - WavpackHeader *wphdr = (WavpackHeader *) buffer; - uint32_t checksum_passed = 0, bcount, meta_bc; - unsigned char *dp, meta_id, c1, c2; - - if (strncmp (wphdr->ckID, "wvpk", 4) || wphdr->ckSize + 8 < sizeof (WavpackHeader)) - return FALSE; - - bcount = wphdr->ckSize - sizeof (WavpackHeader) + 8; - dp = (unsigned char *)(wphdr + 1); - - while (bcount >= 2) { - meta_id = *dp++; - c1 = *dp++; - - meta_bc = c1 << 1; - bcount -= 2; - - if (meta_id & ID_LARGE) { - if (bcount < 2) - return FALSE; - - c1 = *dp++; - c2 = *dp++; - meta_bc += ((uint32_t) c1 << 9) + ((uint32_t) c2 << 17); - bcount -= 2; - } - - if (bcount < meta_bc) - return FALSE; - - if (verify_checksum && (meta_id & ID_UNIQUE) == ID_BLOCK_CHECKSUM) { -#ifdef BITSTREAM_SHORTS - uint16_t *csptr = (uint16_t*) buffer; -#else - unsigned char *csptr = buffer; -#endif - int wcount = (int)(dp - 2 - buffer) >> 1; - uint32_t csum = (uint32_t) -1; - - if ((meta_id & ID_ODD_SIZE) || meta_bc < 2 || meta_bc > 4) - return FALSE; - -#ifdef BITSTREAM_SHORTS - while (wcount--) - csum = (csum * 3) + *csptr++; -#else - WavpackNativeToLittleEndian ((WavpackHeader *) buffer, WavpackHeaderFormat); - - while (wcount--) { - csum = (csum * 3) + csptr [0] + (csptr [1] << 8); - csptr += 2; - } - - WavpackLittleEndianToNative ((WavpackHeader *) buffer, WavpackHeaderFormat); -#endif - - if (meta_bc == 4) { - if (*dp++ != (csum & 0xff) || *dp++ != ((csum >> 8) & 0xff) || *dp++ != ((csum >> 16) & 0xff) || *dp++ != ((csum >> 24) & 0xff)) - return FALSE; - } - else { - csum ^= csum >> 16; - - if (*dp++ != (csum & 0xff) || *dp++ != ((csum >> 8) & 0xff)) - return FALSE; - } - - checksum_passed++; - } - - bcount -= meta_bc; - dp += meta_bc; - } - - return (bcount == 0) && (!verify_checksum || !(wphdr->flags & HAS_CHECKSUM) || checksum_passed); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack.c b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack.c deleted file mode 100644 index 84e884b2..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack.c +++ /dev/null @@ -1,1726 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2013 Conifer Software. // -// MMX optimizations (c) 2006 Joachim Henke // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// pack.c - -// This module actually handles the compression of the audio data, except for -// the entropy encoding which is handled by the write_words.c module. For better -// efficiency, the conversion is isolated to tight loops that handle an entire -// buffer. - -#include -#include -#include - -#include "wavpack_local.h" -#include "decorr_tables.h" // contains data, only include from this module! - -///////////////////////////// executable code //////////////////////////////// - -// This function initializes everything required to pack WavPack bitstreams -// and must be called BEFORE any other function in this module. - -void pack_init (WavpackContext *wpc) -{ - WavpackStream *wps = wpc->streams [wpc->current_stream]; - - wps->sample_index = 0; - wps->delta_decay = 2.0; - CLEAR (wps->decorr_passes); - CLEAR (wps->dc); - -#ifdef SKIP_DECORRELATION - wpc->config.xmode = 0; -#endif - - /* although we set the term and delta values here for clarity, they're - * actually hardcoded in the analysis function for speed - */ - - CLEAR (wps->analysis_pass); - wps->analysis_pass.term = 18; - wps->analysis_pass.delta = 2; - - if (wpc->config.flags & CONFIG_AUTO_SHAPING) { - if (wpc->config.flags & CONFIG_OPTIMIZE_WVC) - wps->dc.shaping_acc [0] = wps->dc.shaping_acc [1] = -(512L << 16); - else if (wpc->config.sample_rate >= 64000) - wps->dc.shaping_acc [0] = wps->dc.shaping_acc [1] = 1024L << 16; - else - wpc->config.flags |= CONFIG_DYNAMIC_SHAPING; - } - else { - int32_t weight = (int32_t) floor (wpc->config.shaping_weight * 1024.0 + 0.5); - - if (weight <= -1000) - weight = -1000; - - wps->dc.shaping_acc [0] = wps->dc.shaping_acc [1] = weight << 16; - } - - if (wpc->config.flags & CONFIG_DYNAMIC_SHAPING) - wps->dc.shaping_data = malloc (wpc->max_samples * sizeof (*wps->dc.shaping_data)); - - if (!wpc->config.xmode) - wps->num_passes = 0; - else if (wpc->config.xmode == 1) - wps->num_passes = 2; - else if (wpc->config.xmode == 2) - wps->num_passes = 4; - else - wps->num_passes = 9; - - if (wpc->config.flags & CONFIG_VERY_HIGH_FLAG) { - wps->num_decorrs = NUM_VERY_HIGH_SPECS; - wps->decorr_specs = very_high_specs; - } - else if (wpc->config.flags & CONFIG_HIGH_FLAG) { - wps->num_decorrs = NUM_HIGH_SPECS; - wps->decorr_specs = high_specs; - } - else if (wpc->config.flags & CONFIG_FAST_FLAG) { - wps->num_decorrs = NUM_FAST_SPECS; - wps->decorr_specs = fast_specs; - } - else { - wps->num_decorrs = NUM_DEFAULT_SPECS; - wps->decorr_specs = default_specs; - } - - init_words (wps); -} - -// Allocate room for and copy the decorrelation terms from the decorr_passes -// array into the specified metadata structure. Both the actual term id and -// the delta are packed into single characters. - -static void write_decorr_terms (WavpackStream *wps, WavpackMetadata *wpmd) -{ - int tcount = wps->num_terms; - struct decorr_pass *dpp; - char *byteptr; - - byteptr = wpmd->data = malloc (tcount + 1); - wpmd->id = ID_DECORR_TERMS; - - for (dpp = wps->decorr_passes; tcount--; ++dpp) - *byteptr++ = ((dpp->term + 5) & 0x1f) | ((dpp->delta << 5) & 0xe0); - - wpmd->byte_length = (int32_t)(byteptr - (char *) wpmd->data); -} - -// Allocate room for and copy the decorrelation term weights from the -// decorr_passes array into the specified metadata structure. The weights -// range +/-1024, but are rounded and truncated to fit in signed chars for -// metadata storage. Weights are separate for the two channels - -static void write_decorr_weights (WavpackStream *wps, WavpackMetadata *wpmd) -{ - struct decorr_pass *dpp = wps->decorr_passes; - int tcount = wps->num_terms, i; - char *byteptr; - - byteptr = wpmd->data = malloc ((tcount * 2) + 1); - wpmd->id = ID_DECORR_WEIGHTS; - - for (i = wps->num_terms - 1; i >= 0; --i) - if (store_weight (dpp [i].weight_A) || - (!(wps->wphdr.flags & MONO_DATA) && store_weight (dpp [i].weight_B))) - break; - - tcount = i + 1; - - for (i = 0; i < wps->num_terms; ++i) { - if (i < tcount) { - dpp [i].weight_A = restore_weight (*byteptr++ = store_weight (dpp [i].weight_A)); - - if (!(wps->wphdr.flags & MONO_DATA)) - dpp [i].weight_B = restore_weight (*byteptr++ = store_weight (dpp [i].weight_B)); - } - else - dpp [i].weight_A = dpp [i].weight_B = 0; - } - - wpmd->byte_length = (int32_t)(byteptr - (char *) wpmd->data); -} - -// Allocate room for and copy the decorrelation samples from the decorr_passes -// array into the specified metadata structure. The samples are signed 32-bit -// values, but are converted to signed log2 values for storage in metadata. -// Values are stored for both channels and are specified from the first term -// with unspecified samples set to zero. The number of samples stored varies -// with the actual term value, so those must obviously be specified before -// these in the metadata list. Any number of terms can have their samples -// specified from no terms to all the terms, however I have found that -// sending more than the first term's samples is a waste. The "wcount" -// variable can be set to the number of terms to have their samples stored. - -static void write_decorr_samples (WavpackStream *wps, WavpackMetadata *wpmd) -{ - int tcount = wps->num_terms, wcount = 1, temp; - struct decorr_pass *dpp; - unsigned char *byteptr; - - byteptr = wpmd->data = malloc (256); - wpmd->id = ID_DECORR_SAMPLES; - - for (dpp = wps->decorr_passes; tcount--; ++dpp) - if (wcount) { - if (dpp->term > MAX_TERM) { - dpp->samples_A [0] = wp_exp2s (temp = wp_log2s (dpp->samples_A [0])); - *byteptr++ = temp; - *byteptr++ = temp >> 8; - dpp->samples_A [1] = wp_exp2s (temp = wp_log2s (dpp->samples_A [1])); - *byteptr++ = temp; - *byteptr++ = temp >> 8; - - if (!(wps->wphdr.flags & MONO_DATA)) { - dpp->samples_B [0] = wp_exp2s (temp = wp_log2s (dpp->samples_B [0])); - *byteptr++ = temp; - *byteptr++ = temp >> 8; - dpp->samples_B [1] = wp_exp2s (temp = wp_log2s (dpp->samples_B [1])); - *byteptr++ = temp; - *byteptr++ = temp >> 8; - } - } - else if (dpp->term < 0) { - dpp->samples_A [0] = wp_exp2s (temp = wp_log2s (dpp->samples_A [0])); - *byteptr++ = temp; - *byteptr++ = temp >> 8; - dpp->samples_B [0] = wp_exp2s (temp = wp_log2s (dpp->samples_B [0])); - *byteptr++ = temp; - *byteptr++ = temp >> 8; - } - else { - int m = 0, cnt = dpp->term; - - while (cnt--) { - dpp->samples_A [m] = wp_exp2s (temp = wp_log2s (dpp->samples_A [m])); - *byteptr++ = temp; - *byteptr++ = temp >> 8; - - if (!(wps->wphdr.flags & MONO_DATA)) { - dpp->samples_B [m] = wp_exp2s (temp = wp_log2s (dpp->samples_B [m])); - *byteptr++ = temp; - *byteptr++ = temp >> 8; - } - - m++; - } - } - - wcount--; - } - else { - CLEAR (dpp->samples_A); - CLEAR (dpp->samples_B); - } - - wpmd->byte_length = (int32_t)(byteptr - (unsigned char *) wpmd->data); -} - -// Allocate room for and copy the noise shaping info into the specified -// metadata structure. These would normally be written to the -// "correction" file and are used for lossless reconstruction of -// hybrid data. The "delta" parameter is not yet used in encoding as it -// will be part of the "quality" mode. - -static void write_shaping_info (WavpackStream *wps, WavpackMetadata *wpmd) -{ - char *byteptr; - int temp; - - byteptr = wpmd->data = malloc (12); - wpmd->id = ID_SHAPING_WEIGHTS; - - wps->dc.error [0] = wp_exp2s (temp = wp_log2s (wps->dc.error [0])); - *byteptr++ = temp; - *byteptr++ = temp >> 8; - wps->dc.shaping_acc [0] = wp_exp2s (temp = wp_log2s (wps->dc.shaping_acc [0])); - *byteptr++ = temp; - *byteptr++ = temp >> 8; - - if (!(wps->wphdr.flags & MONO_DATA)) { - wps->dc.error [1] = wp_exp2s (temp = wp_log2s (wps->dc.error [1])); - *byteptr++ = temp; - *byteptr++ = temp >> 8; - wps->dc.shaping_acc [1] = wp_exp2s (temp = wp_log2s (wps->dc.shaping_acc [1])); - *byteptr++ = temp; - *byteptr++ = temp >> 8; - } - - if (wps->dc.shaping_delta [0] | wps->dc.shaping_delta [1]) { - wps->dc.shaping_delta [0] = wp_exp2s (temp = wp_log2s (wps->dc.shaping_delta [0])); - *byteptr++ = temp; - *byteptr++ = temp >> 8; - - if (!(wps->wphdr.flags & MONO_DATA)) { - wps->dc.shaping_delta [1] = wp_exp2s (temp = wp_log2s (wps->dc.shaping_delta [1])); - *byteptr++ = temp; - *byteptr++ = temp >> 8; - } - } - - wpmd->byte_length = (int32_t)(byteptr - (char *) wpmd->data); -} - -// Allocate room for and copy the int32 data values into the specified -// metadata structure. This data is used for integer data that has more -// than 24 bits of magnitude or, in some cases, it's used to eliminate -// redundant bits from any audio stream. - -static void write_int32_info (WavpackStream *wps, WavpackMetadata *wpmd) -{ - char *byteptr; - - byteptr = wpmd->data = malloc (4); - wpmd->id = ID_INT32_INFO; - *byteptr++ = wps->int32_sent_bits; - *byteptr++ = wps->int32_zeros; - *byteptr++ = wps->int32_ones; - *byteptr++ = wps->int32_dups; - wpmd->byte_length = (int32_t)(byteptr - (char *) wpmd->data); -} - -static void write_float_info (WavpackStream *wps, WavpackMetadata *wpmd) -{ - char *byteptr; - - byteptr = wpmd->data = malloc (4); - wpmd->id = ID_FLOAT_INFO; - *byteptr++ = wps->float_flags; - *byteptr++ = wps->float_shift; - *byteptr++ = wps->float_max_exp; - *byteptr++ = wps->float_norm_exp; - wpmd->byte_length = (int32_t)(byteptr - (char *) wpmd->data); -} - -// Allocate room for and copy the multichannel information into the specified -// metadata structure. The first byte is the total number of channels and the -// following bytes represent the channel_mask as described for Microsoft -// WAVEFORMATEX. - -static void write_channel_info (WavpackContext *wpc, WavpackMetadata *wpmd) -{ - uint32_t mask = wpc->config.channel_mask; - char *byteptr = wpmd->data = malloc (8); - - wpmd->id = ID_CHANNEL_INFO; - - if (wpc->num_streams > OLD_MAX_STREAMS) { // if > 8 streams, use 6 or 7 bytes (breaks old decoders - *byteptr++ = wpc->config.num_channels - 1; // that could only handle 8 streams) and allow (in theory) - *byteptr++ = wpc->num_streams - 1; // up to 4096 channels - *byteptr++ = (((wpc->num_streams - 1) >> 4) & 0xf0) | (((wpc->config.num_channels - 1) >> 8) & 0xf); - *byteptr++ = mask; - *byteptr++ = (mask >> 8); - *byteptr++ = (mask >> 16); - - if (mask & 0xff000000) // this will break versions < 5.0, but is RF64-specific - *byteptr++ = (mask >> 24); - } - else { // otherwise use only 1 to 5 bytes - *byteptr++ = wpc->config.num_channels; - - while (mask) { - *byteptr++ = mask; - mask >>= 8; - } - } - - wpmd->byte_length = (int32_t)(byteptr - (char *) wpmd->data); -} - -// Allocate room for and copy the multichannel identities into the specified -// metadata structure. Data is an array of unsigned characters representing -// any channels in the file that DO NOT match one the 18 Microsoft standard -// channels (and are represented in the channel mask). A value of 0 is not -// allowed and 0xff means an unknown or undefined channel identity. - -static void write_channel_identities_info (WavpackContext *wpc, WavpackMetadata *wpmd) -{ - wpmd->byte_length = (int) strlen ((char *) wpc->channel_identities); - wpmd->data = strdup ((char *) wpc->channel_identities); - wpmd->id = ID_CHANNEL_IDENTITIES; -} - -// Allocate room for and copy the configuration information into the specified -// metadata structure. Currently, we just store the upper 3 bytes of -// config.flags and only in the first block of audio data. Note that this is -// for informational purposes not required for playback or decoding (like -// whether high or fast mode was specified). - -static void write_config_info (WavpackContext *wpc, WavpackMetadata *wpmd) -{ - char *byteptr; - - byteptr = wpmd->data = malloc (8); - wpmd->id = ID_CONFIG_BLOCK; - *byteptr++ = (char) (wpc->config.flags >> 8); - *byteptr++ = (char) (wpc->config.flags >> 16); - *byteptr++ = (char) (wpc->config.flags >> 24); - - if (wpc->config.flags & CONFIG_EXTRA_MODE) - *byteptr++ = (char) wpc->config.xmode; - - // for the 5.0.0 alpha, we wrote the qmode flags here, but this - // has been replaced with the new_config block - // *byteptr++ = (char) wpc->config.qmode; - - wpmd->byte_length = (int32_t)(byteptr - (char *) wpmd->data); -} - -// Allocate room for and copy the "new" configuration information into the -// specified metadata structure. This is all the stuff introduced with version -// 5.0 and includes the qmode flags (big-endian, etc.) and CAF extended -// channel layouts (including optional reordering). Even if there is no new -// configuration, we still send the empty metadata block to signal a 5.0 file. - -static void write_new_config_info (WavpackContext *wpc, WavpackMetadata *wpmd) -{ - char *byteptr = wpmd->data = malloc (260); - - wpmd->id = ID_NEW_CONFIG_BLOCK; - - if (wpc->file_format || (wpc->config.qmode & 0xff) || wpc->channel_layout) { - *byteptr++ = (char) wpc->file_format; - *byteptr++ = (char) wpc->config.qmode; - - if (wpc->channel_layout) { - int nchans = wpc->channel_layout & 0xff; - - *byteptr++ = (char) ((wpc->channel_layout & 0xff0000) >> 16); - - if (wpc->channel_reordering || nchans != wpc->config.num_channels) - *byteptr++ = (char) nchans; - - if (wpc->channel_reordering) { - int i, num_to_send = 0; - - // to save space, don't send redundant reorder string bytes - - for (i = 0; i < nchans; ++i) - if (wpc->channel_reordering [i] != i) - num_to_send = i + 1; - - if (num_to_send) { - memcpy (byteptr, wpc->channel_reordering, num_to_send); - byteptr += num_to_send; - } - } - } - } - - wpmd->byte_length = (int32_t)(byteptr - (char *) wpmd->data); -} - -// Allocate room for and copy the non-standard sampling rate into the specified -// metadata structure. We normally store the lower 3 bytes of the sampling rate, -// unless 4 bytes are required (introduced in version 5). Note that this would -// only be used when the sampling rate was not included in the table of 15 -// "standard" values. - -static void write_sample_rate (WavpackContext *wpc, WavpackMetadata *wpmd) -{ - char *byteptr; - - byteptr = wpmd->data = malloc (4); - wpmd->id = ID_SAMPLE_RATE; - *byteptr++ = (char) (wpc->config.sample_rate); - *byteptr++ = (char) (wpc->config.sample_rate >> 8); - *byteptr++ = (char) (wpc->config.sample_rate >> 16); - - // handle 4-byte sampling rates for scientific applications, etc. - - if (wpc->config.sample_rate & 0x7f000000) - *byteptr++ = (char) (wpc->config.sample_rate >> 24) & 0x7f; - - wpmd->byte_length = (int32_t)(byteptr - (char *) wpmd->data); -} - -// Pack an entire block of samples (either mono or stereo) into a completed -// WavPack block. This function is actually a shell for pack_samples() and -// performs tasks like handling any shift required by the format, preprocessing -// of floating point data or integer data over 24 bits wide, and implementing -// the "extra" mode (via the extra?.c modules). It is assumed that there is -// sufficient space for the completed block at "wps->blockbuff" and that -// "wps->blockend" points to the end of the available space. A return value of -// FALSE indicates an error. - -static int scan_int32_data (WavpackStream *wps, int32_t *values, int32_t num_values); -static void scan_int32_quick (WavpackStream *wps, int32_t *values, int32_t num_values); -static void send_int32_data (WavpackStream *wps, int32_t *values, int32_t num_values); -static int scan_redundancy (int32_t *values, int32_t num_values); -static int pack_samples (WavpackContext *wpc, int32_t *buffer); -static void bs_open_write (Bitstream *bs, void *buffer_start, void *buffer_end); -static uint32_t bs_close_write (Bitstream *bs); - -int pack_block (WavpackContext *wpc, int32_t *buffer) -{ - WavpackStream *wps = wpc->streams [wpc->current_stream]; - uint32_t flags = wps->wphdr.flags, sflags = wps->wphdr.flags; - int32_t sample_count = wps->wphdr.block_samples, *orig_data = NULL; - int dynamic_shaping_done = FALSE; - - // This is done first because this code can potentially change the size of the block about to - // be encoded. This can happen because the dynamic noise shaping algorithm wants to send a - // shorter block because the desired noise-shaping profile is changing quickly. It can also - // be that the --merge-blocks feature wants to create a longer block because it combines areas - // with equal redundancy. These are not applicable for anything besides the first stream of - // the file and they are not applicable with float data or >24-bit data. - - if (!wpc->current_stream && !(flags & FLOAT_DATA) && (flags & MAG_MASK) >> MAG_LSB < 24) { - if ((wpc->config.flags & CONFIG_DYNAMIC_SHAPING) && !wpc->config.block_samples) { - dynamic_noise_shaping (wpc, buffer, TRUE); - sample_count = wps->wphdr.block_samples; - dynamic_shaping_done = TRUE; - } - else if (wpc->block_boundary && sample_count >= (int32_t) wpc->block_boundary * 2) { - int bc = sample_count / wpc->block_boundary, chans = (flags & MONO_DATA) ? 1 : 2; - int res = scan_redundancy (buffer, wpc->block_boundary * chans), i; - - for (i = 1; i < bc; ++i) - if (res != scan_redundancy (buffer + (i * wpc->block_boundary * chans), - wpc->block_boundary * chans)) { - sample_count = wps->wphdr.block_samples = wpc->block_boundary * i; - break; - } - } - } - - // This code scans stereo data to check whether it can be stored as mono data - // (i.e., all L/R samples identical). Only available with MAX_STREAM_VERS. - - if (!(flags & MONO_FLAG) && wpc->stream_version == MAX_STREAM_VERS) { - int32_t lor = 0, diff = 0; - int32_t *sptr, *dptr, i; - - for (sptr = buffer, i = 0; i < (int32_t) sample_count; sptr += 2, i++) { - lor |= sptr [0] | sptr [1]; - diff |= sptr [0] - sptr [1]; - - if (lor && diff) - break; - } - - if (i == sample_count && lor && !diff) { - flags &= ~(JOINT_STEREO | CROSS_DECORR | HYBRID_BALANCE); - wps->wphdr.flags = flags |= FALSE_STEREO; - dptr = buffer; - sptr = buffer; - - for (i = sample_count; i--; sptr++) - *dptr++ = *sptr++; - - if (!wps->false_stereo) { - wps->false_stereo = 1; - wps->num_terms = 0; - init_words (wps); - } - } - else if (wps->false_stereo) { - wps->false_stereo = 0; - wps->num_terms = 0; - init_words (wps); - } - } - - // This is where we handle any fixed shift which occurs when the integer size does not evenly fit - // in bytes (like 12-bit or 20-bit) and is the same for the entire file (not based on scanning) - - if (flags & SHIFT_MASK) { - int shift = (flags & SHIFT_MASK) >> SHIFT_LSB; - int mag = (flags & MAG_MASK) >> MAG_LSB; - uint32_t cnt = sample_count; - int32_t *ptr = buffer; - - if (flags & MONO_DATA) - while (cnt--) - *ptr++ >>= shift; - else - while (cnt--) { - *ptr++ >>= shift; - *ptr++ >>= shift; - } - - if ((mag -= shift) < 0) - flags &= ~MAG_MASK; - else - flags -= (1 << MAG_LSB) * shift; - - wps->wphdr.flags = flags; - } - - // The regular WavPack decorrelation and entropy encoding can handle up to 24-bit integer data. If - // we have float data or integers larger than 24-bit, then we have to potentially do extra processing. - // For lossy encoding, we can simply convert this data in-place to 24-bit data and encode and sent - // that, along with some metadata about how to restore the original format (even if the restoration - // is not exact). However, for lossless operation we must make a copy of the original data that will - // be used to create a "extension stream" that will allow verbatim restoration of the original data. - // In the hybrid mode that extension goes in the correction file, otherwise it goes in the mail file. - - if ((flags & FLOAT_DATA) || (flags & MAG_MASK) >> MAG_LSB >= 24) { // if float data or >24-bit integers... - - // if lossless we have to copy the data to use later... - - if ((!(flags & HYBRID_FLAG) || wpc->wvc_flag) && !(wpc->config.flags & CONFIG_SKIP_WVX)) { - orig_data = malloc (sizeof (f32) * ((flags & MONO_DATA) ? sample_count : sample_count * 2)); - memcpy (orig_data, buffer, sizeof (f32) * ((flags & MONO_DATA) ? sample_count : sample_count * 2)); - - if (flags & FLOAT_DATA) { // if lossless float data come here - wps->float_norm_exp = wpc->config.float_norm_exp; - - if (!scan_float_data (wps, (f32 *) buffer, (flags & MONO_DATA) ? sample_count : sample_count * 2)) { - free (orig_data); - orig_data = NULL; - } - } - else { // otherwise lossless > 24-bit integers - if (!scan_int32_data (wps, buffer, (flags & MONO_DATA) ? sample_count : sample_count * 2)) { - free (orig_data); - orig_data = NULL; - } - } - } - else { // otherwise, we're lossy, so no copy - if (flags & FLOAT_DATA) { - wps->float_norm_exp = wpc->config.float_norm_exp; - - if (scan_float_data (wps, (f32 *) buffer, (flags & MONO_DATA) ? sample_count : sample_count * 2)) - wpc->lossy_blocks = TRUE; - } - else if (scan_int32_data (wps, buffer, (flags & MONO_DATA) ? sample_count : sample_count * 2)) - wpc->lossy_blocks = TRUE; - } - - // if there's any chance of magnitude change, clear the noise-shaping error term - // and also reset the entropy encoder (which this does) - - wps->dc.error [0] = wps->dc.error [1] = 0; - wps->num_terms = 0; - } - // if 24-bit integers or less we do a "quick" scan which just scans for redundancy and does NOT set the flag's "magnitude" value - else { - scan_int32_quick (wps, buffer, (flags & MONO_DATA) ? sample_count : sample_count * 2); - - if (wps->shift != wps->int32_zeros + wps->int32_ones + wps->int32_dups) { // detect a change in any redundancy shifting here - wps->shift = wps->int32_zeros + wps->int32_ones + wps->int32_dups; - wps->dc.error [0] = wps->dc.error [1] = 0; // on a change, clear the noise-shaping error term and - wps->num_terms = 0; // also reset the entropy encoder (which this does) - } - } - - if ((wpc->config.flags & CONFIG_DYNAMIC_SHAPING) && !dynamic_shaping_done) // calculate dynamic noise profile - dynamic_noise_shaping (wpc, buffer, FALSE); - - // In some cases we need to start the decorrelation and entropy encoding from scratch. This - // could be because we switched from stereo to mono encoding or because the magnitude of - // the data changed, or just because this is the first block. - - if (!wps->num_passes && !wps->num_terms) { - wps->num_passes = 1; - - if (flags & MONO_DATA) - execute_mono (wpc, buffer, 1, 0); - else - execute_stereo (wpc, buffer, 1, 0); - - wps->num_passes = 0; - } - - // actually pack the block here and return on an error (which pretty much can only be a block buffer overrun) - - if (!pack_samples (wpc, buffer)) { - wps->wphdr.flags = sflags; - - if (orig_data) - free (orig_data); - - return FALSE; - } - else - wps->wphdr.flags = sflags; - - // potentially move any unused dynamic noise shaping profile data to use next time - - if (wps->dc.shaping_data) { - if (wps->dc.shaping_samples != sample_count) - memmove (wps->dc.shaping_data, wps->dc.shaping_data + sample_count, - (wps->dc.shaping_samples - sample_count) * sizeof (*wps->dc.shaping_data)); - - wps->dc.shaping_samples -= sample_count; - } - - // finally, if we're doing lossless float data or lossless >24-bit integers, this is where we take the - // original data that we saved earlier and create the "extension" stream containing the information - // required to refine the "lossy" 24-bit data into the lossless original - - if (orig_data) { - uint32_t data_count; - unsigned char *cptr; - - if (wpc->wvc_flag) - cptr = wps->block2buff + ((WavpackHeader *) wps->block2buff)->ckSize + 8; - else - cptr = wps->blockbuff + ((WavpackHeader *) wps->blockbuff)->ckSize + 8; - - bs_open_write (&wps->wvxbits, cptr + 8, wpc->wvc_flag ? wps->block2end : wps->blockend); - - if (flags & FLOAT_DATA) - send_float_data (wps, (f32*) orig_data, (flags & MONO_DATA) ? sample_count : sample_count * 2); - else - send_int32_data (wps, orig_data, (flags & MONO_DATA) ? sample_count : sample_count * 2); - - data_count = bs_close_write (&wps->wvxbits); - free (orig_data); - - if (data_count) { - if (data_count != (uint32_t) -1) { - *cptr++ = ID_WVX_BITSTREAM | ID_LARGE; - *cptr++ = (data_count += 4) >> 1; - *cptr++ = data_count >> 9; - *cptr++ = data_count >> 17; - *cptr++ = wps->crc_x; - *cptr++ = wps->crc_x >> 8; - *cptr++ = wps->crc_x >> 16; - *cptr = wps->crc_x >> 24; - - if (wpc->wvc_flag) - ((WavpackHeader *) wps->block2buff)->ckSize += data_count + 4; - else - ((WavpackHeader *) wps->blockbuff)->ckSize += data_count + 4; - } - else - return FALSE; - } - } - - return TRUE; -} - -// Quickly scan a buffer of long integer data and determine whether any -// redundancy in the LSBs can be used to reduce the data's magnitude. If yes, -// then the INT32_DATA flag is set and the int32 parameters are set. This -// version is designed to terminate as soon as it figures out that no -// redundancy is available so that it can be used for all files. - -static void scan_int32_quick (WavpackStream *wps, int32_t *values, int32_t num_values) -{ - uint32_t magdata = 0, ordata = 0, xordata = 0, anddata = ~0; - int total_shift = 0; - int32_t *dp, count; - - wps->int32_sent_bits = wps->int32_zeros = wps->int32_ones = wps->int32_dups = 0; - - for (dp = values, count = num_values; count--; dp++) { - magdata |= (*dp < 0) ? ~*dp : *dp; - xordata |= *dp ^ -(*dp & 1); - anddata &= *dp; - ordata |= *dp; - - if ((ordata & 1) && !(anddata & 1) && (xordata & 2)) - return; - } - - wps->wphdr.flags &= ~MAG_MASK; - - while (magdata) { - wps->wphdr.flags += 1 << MAG_LSB; - magdata >>= 1; - } - - if (!(wps->wphdr.flags & MAG_MASK)) - return; - - if (!(ordata & 1)) - while (!(ordata & 1)) { - wps->wphdr.flags -= 1 << MAG_LSB; - wps->int32_zeros++; - total_shift++; - ordata >>= 1; - } - else if (anddata & 1) - while (anddata & 1) { - wps->wphdr.flags -= 1 << MAG_LSB; - wps->int32_ones++; - total_shift++; - anddata >>= 1; - } - else if (!(xordata & 2)) - while (!(xordata & 2)) { - wps->wphdr.flags -= 1 << MAG_LSB; - wps->int32_dups++; - total_shift++; - xordata >>= 1; - } - - if (total_shift) { - wps->wphdr.flags |= INT32_DATA; - - for (dp = values, count = num_values; count--; dp++) - *dp >>= total_shift; - } -} - -static int scan_redundancy (int32_t *values, int32_t num_values) -{ - uint32_t ordata = 0, xordata = 0, anddata = ~0; - int redundant_bits = 0; - int32_t *dp, count; - - for (dp = values, count = num_values; count--; dp++) { - xordata |= *dp ^ -(*dp & 1); - anddata &= *dp; - ordata |= *dp; - - if ((ordata & 1) && !(anddata & 1) && (xordata & 2)) - return 0; - } - - if (!ordata || anddata == ~0 || !xordata) - return 0; - - if (!(ordata & 1)) - while (!(ordata & 1)) { - redundant_bits++; - ordata >>= 1; - } - else if (anddata & 1) - while (anddata & 1) { - redundant_bits = (redundant_bits + 1) | 0x40; - anddata >>= 1; - } - else if (!(xordata & 2)) - while (!(xordata & 2)) { - redundant_bits = (redundant_bits + 1) | 0x80; - redundant_bits++; - xordata >>= 1; - } - - return redundant_bits; -} - -// Scan a buffer of long integer data and determine whether any redundancy in -// the LSBs can be used to reduce the data's magnitude. If yes, then the -// INT32_DATA flag is set and the int32 parameters are set. If bits must still -// be transmitted literally to get down to 24 bits (which is all the integer -// compression code can handle) then we return TRUE to indicate that a wvx -// stream must be created in either lossless mode. - -static int scan_int32_data (WavpackStream *wps, int32_t *values, int32_t num_values) -{ - uint32_t magdata = 0, ordata = 0, xordata = 0, anddata = ~0; - uint32_t crc = 0xffffffff; - int total_shift = 0; - int32_t *dp, count; - - wps->int32_sent_bits = wps->int32_zeros = wps->int32_ones = wps->int32_dups = 0; - - for (dp = values, count = num_values; count--; dp++) { - crc = crc * 9 + (*dp & 0xffff) * 3 + ((*dp >> 16) & 0xffff); - magdata |= (*dp < 0) ? ~*dp : *dp; - xordata |= *dp ^ -(*dp & 1); - anddata &= *dp; - ordata |= *dp; - } - - wps->crc_x = crc; - wps->wphdr.flags &= ~MAG_MASK; - - while (magdata) { - wps->wphdr.flags += 1 << MAG_LSB; - magdata >>= 1; - } - - if (!((wps->wphdr.flags & MAG_MASK) >> MAG_LSB)) { - wps->wphdr.flags &= ~INT32_DATA; - return FALSE; - } - - if (!(ordata & 1)) - while (!(ordata & 1)) { - wps->wphdr.flags -= 1 << MAG_LSB; - wps->int32_zeros++; - total_shift++; - ordata >>= 1; - } - else if (anddata & 1) - while (anddata & 1) { - wps->wphdr.flags -= 1 << MAG_LSB; - wps->int32_ones++; - total_shift++; - anddata >>= 1; - } - else if (!(xordata & 2)) - while (!(xordata & 2)) { - wps->wphdr.flags -= 1 << MAG_LSB; - wps->int32_dups++; - total_shift++; - xordata >>= 1; - } - - if (((wps->wphdr.flags & MAG_MASK) >> MAG_LSB) > 23) { - wps->int32_sent_bits = (unsigned char)(((wps->wphdr.flags & MAG_MASK) >> MAG_LSB) - 23); - total_shift += wps->int32_sent_bits; - wps->wphdr.flags &= ~MAG_MASK; - wps->wphdr.flags += 23 << MAG_LSB; - } - - if (total_shift) { - wps->wphdr.flags |= INT32_DATA; - - for (dp = values, count = num_values; count--; dp++) - *dp >>= total_shift; - } - - return wps->int32_sent_bits; -} - -// For the specified buffer values and the int32 parameters stored in "wps", -// send the literal bits required to the "wvxbits" bitstream. - -static void send_int32_data (WavpackStream *wps, int32_t *values, int32_t num_values) -{ - int sent_bits = wps->int32_sent_bits, pre_shift; - int32_t mask = (1 << sent_bits) - 1; - int32_t count, value, *dp; - - pre_shift = wps->int32_zeros + wps->int32_ones + wps->int32_dups; - - if (sent_bits) - for (dp = values, count = num_values; count--; dp++) { - value = (*dp >> pre_shift) & mask; - putbits (value, sent_bits, &wps->wvxbits); - } -} - -void send_general_metadata (WavpackContext *wpc) -{ - WavpackStream *wps = wpc->streams [wpc->current_stream]; - uint32_t flags = wps->wphdr.flags; - WavpackMetadata wpmd; - - if ((flags & SRATE_MASK) == SRATE_MASK && wpc->config.sample_rate != 44100) { - write_sample_rate (wpc, &wpmd); - copy_metadata (&wpmd, wps->blockbuff, wps->blockend); - free_metadata (&wpmd); - } - - if ((flags & INITIAL_BLOCK) && - (wpc->config.num_channels > 2 || - wpc->config.channel_mask != 0x5 - wpc->config.num_channels)) { - write_channel_info (wpc, &wpmd); - copy_metadata (&wpmd, wps->blockbuff, wps->blockend); - free_metadata (&wpmd); - - if (wpc->channel_identities) { - write_channel_identities_info (wpc, &wpmd); - copy_metadata (&wpmd, wps->blockbuff, wps->blockend); - free_metadata (&wpmd); - } - } - - if ((flags & INITIAL_BLOCK) && !wps->sample_index) { - write_config_info (wpc, &wpmd); - copy_metadata (&wpmd, wps->blockbuff, wps->blockend); - free_metadata (&wpmd); - } - - if (flags & INITIAL_BLOCK) { - write_new_config_info (wpc, &wpmd); - copy_metadata (&wpmd, wps->blockbuff, wps->blockend); - free_metadata (&wpmd); - } -} - -// Pack an entire block of samples (either mono or stereo) into a completed -// WavPack block. It is assumed that there is sufficient space for the -// completed block at "wps->blockbuff" and that "wps->blockend" points to the -// end of the available space. A return value of FALSE indicates an error. -// Any unsent metadata is transmitted first, then required metadata for this -// block is sent, and finally the compressed integer data is sent. If a "wpx" -// stream is required for floating point data or large integer data, then this -// must be handled outside this function. To find out how much data was written -// the caller must look at the ckSize field of the written WavpackHeader, NOT -// the one in the WavpackStream. - -#ifdef OPT_ASM_X86 - #define DECORR_STEREO_PASS(a,b,c) do { \ - if (pack_cpu_has_feature_x86 (CPU_FEATURE_MMX)) \ - pack_decorr_stereo_pass_x86 (a, b, c); \ - else decorr_stereo_pass (a, b, c); } while (0) - #define DECORR_MONO_BUFFER pack_decorr_mono_buffer_x86 - #define SCAN_MAX_MAGNITUDE(a,b) \ - (pack_cpu_has_feature_x86 (CPU_FEATURE_MMX) ? \ - scan_max_magnitude_x86 (a, b) : \ - scan_max_magnitude (a, b)) -#elif defined(OPT_ASM_X64) && (defined (_WIN64) || defined(__CYGWIN__) || defined(__MINGW64__)) - #define DECORR_STEREO_PASS pack_decorr_stereo_pass_x64win - #define DECORR_MONO_BUFFER pack_decorr_mono_buffer_x64win - #define SCAN_MAX_MAGNITUDE scan_max_magnitude_x64win -#elif defined(OPT_ASM_X64) - #define DECORR_STEREO_PASS pack_decorr_stereo_pass_x64 - #define DECORR_MONO_BUFFER pack_decorr_mono_buffer_x64 - #define SCAN_MAX_MAGNITUDE scan_max_magnitude_x64 -#else - #define DECORR_STEREO_PASS decorr_stereo_pass - #define DECORR_MONO_BUFFER decorr_mono_buffer - #define SCAN_MAX_MAGNITUDE scan_max_magnitude -#endif - -uint32_t DECORR_MONO_BUFFER (int32_t *buffer, struct decorr_pass *decorr_passes, int32_t num_terms, int32_t sample_count); - -#ifdef OPT_ASM_X86 -void decorr_stereo_pass (struct decorr_pass *dpp, int32_t *buffer, int32_t sample_count); -void pack_decorr_stereo_pass_x86 (struct decorr_pass *dpp, int32_t *buffer, int32_t sample_count); -uint32_t scan_max_magnitude (int32_t *values, int32_t num_values); -uint32_t scan_max_magnitude_x86 (int32_t *values, int32_t num_values); -#else -void DECORR_STEREO_PASS (struct decorr_pass *dpp, int32_t *buffer, int32_t sample_count); -uint32_t SCAN_MAX_MAGNITUDE (int32_t *values, int32_t num_values); -#endif - -// This macro controls the "repack" function where a block of samples will be repacked with -// fewer terms if a single residual exceeds the specified magnitude threshold. - -#define REPACK_SAFE_NUM_TERMS 5 // 5 terms is always okay (and we truncate to this) - -static int pack_samples (WavpackContext *wpc, int32_t *buffer) -{ - WavpackStream *wps = wpc->streams [wpc->current_stream], saved_stream; - uint32_t flags = wps->wphdr.flags, repack_possible, data_count, crc, crc2, i; - uint32_t sample_count = wps->wphdr.block_samples, repack_mask; - int32_t *bptr, *saved_buffer = NULL; - struct decorr_pass *dpp; - WavpackMetadata wpmd; - - crc = crc2 = 0xffffffff; - - if (!(flags & HYBRID_FLAG) && (flags & MONO_DATA)) { - int32_t *eptr = buffer + sample_count; - - for (bptr = buffer; bptr < eptr;) - crc += (crc << 1) + *bptr++; - - if (wps->num_passes) - execute_mono (wpc, buffer, !wps->num_terms, 1); - } - else if (!(flags & HYBRID_FLAG) && !(flags & MONO_DATA)) { - int32_t *eptr = buffer + (sample_count * 2); - - for (bptr = buffer; bptr < eptr; bptr += 2) - crc += (crc << 3) + (bptr [0] << 1) + bptr [0] + bptr [1]; - - if (wps->num_passes) { - execute_stereo (wpc, buffer, !wps->num_terms, 1); - flags = wps->wphdr.flags; - } - } - else if ((flags & HYBRID_FLAG) && (flags & MONO_DATA)) { - if (wps->num_passes) - execute_mono (wpc, buffer, !wps->num_terms, 0); - } - else if ((flags & HYBRID_FLAG) && !(flags & MONO_DATA)) { - if (wps->num_passes) { - execute_stereo (wpc, buffer, !wps->num_terms, 0); - flags = wps->wphdr.flags; - } - } - - wps->wphdr.ckSize = sizeof (WavpackHeader) - 8; - memcpy (wps->blockbuff, &wps->wphdr, sizeof (WavpackHeader)); - - if (wpc->metacount) { - WavpackMetadata *wpmdp = wpc->metadata; - - while (wpc->metacount) { - copy_metadata (wpmdp, wps->blockbuff, wps->blockend); - wpc->metabytes -= wpmdp->byte_length; - free_metadata (wpmdp++); - wpc->metacount--; - } - - free (wpc->metadata); - wpc->metadata = NULL; - } - - if (!sample_count) - return TRUE; - - memcpy (&wps->wphdr, wps->blockbuff, sizeof (WavpackHeader)); - repack_possible = !wps->num_passes && wps->num_terms > REPACK_SAFE_NUM_TERMS; - repack_mask = (flags & MAG_MASK) >> MAG_LSB >= 16 ? 0xF0000000 : 0xFFF00000; - saved_stream = *wps; - - if (repack_possible && !(flags & HYBRID_FLAG)) { - saved_buffer = malloc (sample_count * sizeof (int32_t) * (flags & MONO_DATA ? 1 : 2)); - memcpy (saved_buffer, buffer, sample_count * sizeof (int32_t) * (flags & MONO_DATA ? 1 : 2)); - } - - // This code is written as a loop, but in the overwhelming majority of cases it executes only once. - // If one of the higher modes is being used and a residual exceeds a certain threshold, then the - // block will be repacked using fewer decorrelation terms. Note that this has only been triggered - // by pathological audio samples designed to trigger it...in practice this might never happen. Note - // that this only applies to the "high" and "very high" modes and only when packing directly - // (i.e. without the "extra" modes that will have already checked magnitude). - - do { - short *shaping_array = wps->dc.shaping_array; - int tcount, lossy = FALSE, m = 0; - double noise_acc = 0.0, noise; - uint32_t max_magnitude = 0; - - write_decorr_terms (wps, &wpmd); - copy_metadata (&wpmd, wps->blockbuff, wps->blockend); - free_metadata (&wpmd); - - write_decorr_weights (wps, &wpmd); - copy_metadata (&wpmd, wps->blockbuff, wps->blockend); - free_metadata (&wpmd); - - write_decorr_samples (wps, &wpmd); - copy_metadata (&wpmd, wps->blockbuff, wps->blockend); - free_metadata (&wpmd); - - write_entropy_vars (wps, &wpmd); - copy_metadata (&wpmd, wps->blockbuff, wps->blockend); - free_metadata (&wpmd); - - if (flags & HYBRID_FLAG) { - write_hybrid_profile (wps, &wpmd); - copy_metadata (&wpmd, wps->blockbuff, wps->blockend); - free_metadata (&wpmd); - } - - if (flags & FLOAT_DATA) { - write_float_info (wps, &wpmd); - copy_metadata (&wpmd, wps->blockbuff, wps->blockend); - free_metadata (&wpmd); - } - - if (flags & INT32_DATA) { - write_int32_info (wps, &wpmd); - copy_metadata (&wpmd, wps->blockbuff, wps->blockend); - free_metadata (&wpmd); - } - - send_general_metadata (wpc); - bs_open_write (&wps->wvbits, wps->blockbuff + ((WavpackHeader *) wps->blockbuff)->ckSize + 12, wps->blockend); - - if (wpc->wvc_flag) { - wps->wphdr.ckSize = sizeof (WavpackHeader) - 8; - memcpy (wps->block2buff, &wps->wphdr, sizeof (WavpackHeader)); - - if (flags & HYBRID_SHAPE) { - write_shaping_info (wps, &wpmd); - copy_metadata (&wpmd, wps->block2buff, wps->block2end); - free_metadata (&wpmd); - } - - bs_open_write (&wps->wvcbits, wps->block2buff + ((WavpackHeader *) wps->block2buff)->ckSize + 12, wps->block2end); - } - - /////////////////////// handle lossless mono mode ///////////////////////// - - if (!(flags & HYBRID_FLAG) && (flags & MONO_DATA)) { - if (!wps->num_passes) { - max_magnitude = DECORR_MONO_BUFFER (buffer, wps->decorr_passes, wps->num_terms, sample_count); - m = sample_count & (MAX_TERM - 1); - } - - send_words_lossless (wps, buffer, sample_count); - } - - //////////////////// handle the lossless stereo mode ////////////////////// - - else if (!(flags & HYBRID_FLAG) && !(flags & MONO_DATA)) { - if (!wps->num_passes) { - if (flags & JOINT_STEREO) { - int32_t *eptr = buffer + (sample_count * 2); - - for (bptr = buffer; bptr < eptr; bptr += 2) - bptr [1] += ((bptr [0] -= bptr [1]) >> 1); - } - - for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount-- ; dpp++) - DECORR_STEREO_PASS (dpp, buffer, sample_count); - - m = sample_count & (MAX_TERM - 1); - - if (repack_possible) - max_magnitude = SCAN_MAX_MAGNITUDE (buffer, sample_count * 2); - } - - send_words_lossless (wps, buffer, sample_count); - } - - /////////////////// handle the lossy/hybrid mono mode ///////////////////// - - else if ((flags & HYBRID_FLAG) && (flags & MONO_DATA)) - for (bptr = buffer, i = 0; i < sample_count; ++i) { - int32_t code, temp; - int shaping_weight; - - crc2 += (crc2 << 1) + (code = *bptr++); - - if (flags & HYBRID_SHAPE) { - if (shaping_array) - shaping_weight = *shaping_array++; - else - shaping_weight = (wps->dc.shaping_acc [0] += wps->dc.shaping_delta [0]) >> 16; - - temp = -apply_weight (shaping_weight, wps->dc.error [0]); - - if ((flags & NEW_SHAPING) && shaping_weight < 0 && temp) { - if (temp == wps->dc.error [0]) - temp = (temp < 0) ? temp + 1 : temp - 1; - - wps->dc.error [0] = -code; - code += temp; - } - else - wps->dc.error [0] = -(code += temp); - } - - for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount-- ; dpp++) - if (dpp->term > MAX_TERM) { - if (dpp->term & 1) - dpp->samples_A [2] = 2 * dpp->samples_A [0] - dpp->samples_A [1]; - else - dpp->samples_A [2] = (3 * dpp->samples_A [0] - dpp->samples_A [1]) >> 1; - - code -= (dpp->aweight_A = apply_weight (dpp->weight_A, dpp->samples_A [2])); - } - else - code -= (dpp->aweight_A = apply_weight (dpp->weight_A, dpp->samples_A [m])); - - max_magnitude |= (code < 0 ? ~code : code); - code = send_word (wps, code, 0); - - while (--dpp >= wps->decorr_passes) { - if (dpp->term > MAX_TERM) { - update_weight (dpp->weight_A, dpp->delta, dpp->samples_A [2], code); - dpp->samples_A [1] = dpp->samples_A [0]; - dpp->samples_A [0] = (code += dpp->aweight_A); - } - else { - int32_t sam = dpp->samples_A [m]; - - update_weight (dpp->weight_A, dpp->delta, sam, code); - dpp->samples_A [(m + dpp->term) & (MAX_TERM - 1)] = (code += dpp->aweight_A); - } - } - - wps->dc.error [0] += code; - m = (m + 1) & (MAX_TERM - 1); - - if ((crc += (crc << 1) + code) != crc2) - lossy = TRUE; - - if (wpc->config.flags & CONFIG_CALC_NOISE) { - noise = code - bptr [-1]; - - noise_acc += noise *= noise; - wps->dc.noise_ave = (wps->dc.noise_ave * 0.99) + (noise * 0.01); - - if (wps->dc.noise_ave > wps->dc.noise_max) - wps->dc.noise_max = wps->dc.noise_ave; - } - } - - /////////////////// handle the lossy/hybrid stereo mode /////////////////// - - else if ((flags & HYBRID_FLAG) && !(flags & MONO_DATA)) - for (bptr = buffer, i = 0; i < sample_count; ++i) { - int32_t left, right, temp; - int shaping_weight; - - left = *bptr++; - crc2 += (crc2 << 3) + (left << 1) + left + (right = *bptr++); - - if (flags & HYBRID_SHAPE) { - if (shaping_array) - shaping_weight = *shaping_array++; - else - shaping_weight = (wps->dc.shaping_acc [0] += wps->dc.shaping_delta [0]) >> 16; - - temp = -apply_weight (shaping_weight, wps->dc.error [0]); - - if ((flags & NEW_SHAPING) && shaping_weight < 0 && temp) { - if (temp == wps->dc.error [0]) - temp = (temp < 0) ? temp + 1 : temp - 1; - - wps->dc.error [0] = -left; - left += temp; - } - else - wps->dc.error [0] = -(left += temp); - - if (!shaping_array) - shaping_weight = (wps->dc.shaping_acc [1] += wps->dc.shaping_delta [1]) >> 16; - - temp = -apply_weight (shaping_weight, wps->dc.error [1]); - - if ((flags & NEW_SHAPING) && shaping_weight < 0 && temp) { - if (temp == wps->dc.error [1]) - temp = (temp < 0) ? temp + 1 : temp - 1; - - wps->dc.error [1] = -right; - right += temp; - } - else - wps->dc.error [1] = -(right += temp); - } - - if (flags & JOINT_STEREO) - right += ((left -= right) >> 1); - - for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount-- ; dpp++) - if (dpp->term > MAX_TERM) { - if (dpp->term & 1) { - dpp->samples_A [2] = 2 * dpp->samples_A [0] - dpp->samples_A [1]; - dpp->samples_B [2] = 2 * dpp->samples_B [0] - dpp->samples_B [1]; - } - else { - dpp->samples_A [2] = (3 * dpp->samples_A [0] - dpp->samples_A [1]) >> 1; - dpp->samples_B [2] = (3 * dpp->samples_B [0] - dpp->samples_B [1]) >> 1; - } - - left -= (dpp->aweight_A = apply_weight (dpp->weight_A, dpp->samples_A [2])); - right -= (dpp->aweight_B = apply_weight (dpp->weight_B, dpp->samples_B [2])); - } - else if (dpp->term > 0) { - left -= (dpp->aweight_A = apply_weight (dpp->weight_A, dpp->samples_A [m])); - right -= (dpp->aweight_B = apply_weight (dpp->weight_B, dpp->samples_B [m])); - } - else { - if (dpp->term == -1) - dpp->samples_B [0] = left; - else if (dpp->term == -2) - dpp->samples_A [0] = right; - - left -= (dpp->aweight_A = apply_weight (dpp->weight_A, dpp->samples_A [0])); - right -= (dpp->aweight_B = apply_weight (dpp->weight_B, dpp->samples_B [0])); - } - - max_magnitude |= (left < 0 ? ~left : left) | (right < 0 ? ~right : right); - left = send_word (wps, left, 0); - right = send_word (wps, right, 1); - - while (--dpp >= wps->decorr_passes) - if (dpp->term > MAX_TERM) { - update_weight (dpp->weight_A, dpp->delta, dpp->samples_A [2], left); - update_weight (dpp->weight_B, dpp->delta, dpp->samples_B [2], right); - - dpp->samples_A [1] = dpp->samples_A [0]; - dpp->samples_B [1] = dpp->samples_B [0]; - - dpp->samples_A [0] = (left += dpp->aweight_A); - dpp->samples_B [0] = (right += dpp->aweight_B); - } - else if (dpp->term > 0) { - int k = (m + dpp->term) & (MAX_TERM - 1); - - update_weight (dpp->weight_A, dpp->delta, dpp->samples_A [m], left); - dpp->samples_A [k] = (left += dpp->aweight_A); - - update_weight (dpp->weight_B, dpp->delta, dpp->samples_B [m], right); - dpp->samples_B [k] = (right += dpp->aweight_B); - } - else { - if (dpp->term == -1) { - dpp->samples_B [0] = left + dpp->aweight_A; - dpp->aweight_B = apply_weight (dpp->weight_B, dpp->samples_B [0]); - } - else if (dpp->term == -2) { - dpp->samples_A [0] = right + dpp->aweight_B; - dpp->aweight_A = apply_weight (dpp->weight_A, dpp->samples_A [0]); - } - - update_weight_clip (dpp->weight_A, dpp->delta, dpp->samples_A [0], left); - update_weight_clip (dpp->weight_B, dpp->delta, dpp->samples_B [0], right); - dpp->samples_B [0] = (left += dpp->aweight_A); - dpp->samples_A [0] = (right += dpp->aweight_B); - } - - if (flags & JOINT_STEREO) - left += (right -= (left >> 1)); - - wps->dc.error [0] += left; - wps->dc.error [1] += right; - m = (m + 1) & (MAX_TERM - 1); - - if ((crc += (crc << 3) + (left << 1) + left + right) != crc2) - lossy = TRUE; - - if (wpc->config.flags & CONFIG_CALC_NOISE) { - noise = (double)(left - bptr [-2]) * (left - bptr [-2]); - noise += (double)(right - bptr [-1]) * (right - bptr [-1]); - - noise_acc += noise /= 2.0; - wps->dc.noise_ave = (wps->dc.noise_ave * 0.99) + (noise * 0.01); - - if (wps->dc.noise_ave > wps->dc.noise_max) - wps->dc.noise_max = wps->dc.noise_ave; - } - } - - if (m) - for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++) - if (dpp->term > 0 && dpp->term <= MAX_TERM) { - int32_t temp_A [MAX_TERM], temp_B [MAX_TERM]; - int k; - - memcpy (temp_A, dpp->samples_A, sizeof (dpp->samples_A)); - memcpy (temp_B, dpp->samples_B, sizeof (dpp->samples_B)); - - for (k = 0; k < MAX_TERM; k++) { - dpp->samples_A [k] = temp_A [m]; - dpp->samples_B [k] = temp_B [m]; - m = (m + 1) & (MAX_TERM - 1); - } - } - - if (wpc->config.flags & CONFIG_CALC_NOISE) - wps->dc.noise_sum += noise_acc; - - flush_word (wps); - data_count = bs_close_write (&wps->wvbits); - - if (data_count) { - if (data_count != (uint32_t) -1) { - unsigned char *cptr = wps->blockbuff + ((WavpackHeader *) wps->blockbuff)->ckSize + 8; - - *cptr++ = ID_WV_BITSTREAM | ID_LARGE; - *cptr++ = data_count >> 1; - *cptr++ = data_count >> 9; - *cptr++ = data_count >> 17; - ((WavpackHeader *) wps->blockbuff)->ckSize += data_count + 4; - } - else - return FALSE; - } - - ((WavpackHeader *) wps->blockbuff)->crc = crc; - - if (wpc->wvc_flag) { - data_count = bs_close_write (&wps->wvcbits); - - if (data_count && lossy) { - if (data_count != (uint32_t) -1) { - unsigned char *cptr = wps->block2buff + ((WavpackHeader *) wps->block2buff)->ckSize + 8; - - *cptr++ = ID_WVC_BITSTREAM | ID_LARGE; - *cptr++ = data_count >> 1; - *cptr++ = data_count >> 9; - *cptr++ = data_count >> 17; - ((WavpackHeader *) wps->block2buff)->ckSize += data_count + 4; - } - else - return FALSE; - } - - ((WavpackHeader *) wps->block2buff)->crc = crc2; - } - else if (lossy) - wpc->lossy_blocks = TRUE; - - // we're done with the entire block, so now we check if our threshold for a "repack" was hit - - if (repack_possible && wps->num_terms > REPACK_SAFE_NUM_TERMS && (max_magnitude & repack_mask)) { - *wps = saved_stream; - wps->num_terms = REPACK_SAFE_NUM_TERMS; - memcpy (wps->blockbuff, &wps->wphdr, sizeof (WavpackHeader)); - - if (saved_buffer) - memcpy (buffer, saved_buffer, sample_count * sizeof (int32_t) * (flags & MONO_DATA ? 1 : 2)); - - if (flags & HYBRID_FLAG) - crc = crc2 = 0xffffffff; - } - else { - // if we actually did repack the block with fewer terms, we detect that here - // and clean up so that we return to the original term count...otherwise we just - // free the saved_buffer (if allocated) and break out of the loop - if (wps->num_terms != saved_stream.num_terms) { - int ti; - - for (ti = wps->num_terms; ti < saved_stream.num_terms; ++ti) { - wps->decorr_passes [ti].weight_A = wps->decorr_passes [ti].weight_B = 0; - CLEAR (wps->decorr_passes [ti].samples_A); - CLEAR (wps->decorr_passes [ti].samples_B); - } - - wps->num_terms = saved_stream.num_terms; - } - - if (saved_buffer) - free (saved_buffer); - - break; - } - - } while (1); - - wps->sample_index += sample_count; - return TRUE; -} - -#if !defined(OPT_ASM_X64) - -// This is the "C" version of the stereo decorrelation pass function. There -// are assembly optimized versions of this that can be used if available. -// It performs a single pass of stereo decorrelation, in place, as specified -// by the decorr_pass structure. Note that this function does NOT return the -// dpp->samples_X[] values in the "normalized" positions for terms 1-8, so if -// the number of samples is not a multiple of MAX_TERM, these must be moved if -// they are to be used somewhere else. - -void decorr_stereo_pass (struct decorr_pass *dpp, int32_t *buffer, int32_t sample_count) -{ - int32_t *bptr, *eptr = buffer + (sample_count * 2); - int m, k; - - switch (dpp->term) { - case 17: - for (bptr = buffer; bptr < eptr; bptr += 2) { - int32_t sam, tmp; - - sam = 2 * dpp->samples_A [0] - dpp->samples_A [1]; - dpp->samples_A [1] = dpp->samples_A [0]; - bptr [0] = tmp = (dpp->samples_A [0] = bptr [0]) - apply_weight (dpp->weight_A, sam); - update_weight (dpp->weight_A, dpp->delta, sam, tmp); - - sam = 2 * dpp->samples_B [0] - dpp->samples_B [1]; - dpp->samples_B [1] = dpp->samples_B [0]; - bptr [1] = tmp = (dpp->samples_B [0] = bptr [1]) - apply_weight (dpp->weight_B, sam); - update_weight (dpp->weight_B, dpp->delta, sam, tmp); - } - - break; - - case 18: - for (bptr = buffer; bptr < eptr; bptr += 2) { - int32_t sam, tmp; - - sam = dpp->samples_A [0] + ((dpp->samples_A [0] - dpp->samples_A [1]) >> 1); - dpp->samples_A [1] = dpp->samples_A [0]; - bptr [0] = tmp = (dpp->samples_A [0] = bptr [0]) - apply_weight (dpp->weight_A, sam); - update_weight (dpp->weight_A, dpp->delta, sam, tmp); - - sam = dpp->samples_B [0] + ((dpp->samples_B [0] - dpp->samples_B [1]) >> 1); - dpp->samples_B [1] = dpp->samples_B [0]; - bptr [1] = tmp = (dpp->samples_B [0] = bptr [1]) - apply_weight (dpp->weight_B, sam); - update_weight (dpp->weight_B, dpp->delta, sam, tmp); - } - - break; - - default: - for (m = 0, k = dpp->term & (MAX_TERM - 1), bptr = buffer; bptr < eptr; bptr += 2) { - int32_t sam, tmp; - - sam = dpp->samples_A [m]; - bptr [0] = tmp = (dpp->samples_A [k] = bptr [0]) - apply_weight (dpp->weight_A, sam); - update_weight (dpp->weight_A, dpp->delta, sam, tmp); - - sam = dpp->samples_B [m]; - bptr [1] = tmp = (dpp->samples_B [k] = bptr [1]) - apply_weight (dpp->weight_B, sam); - update_weight (dpp->weight_B, dpp->delta, sam, tmp); - - m = (m + 1) & (MAX_TERM - 1); - k = (k + 1) & (MAX_TERM - 1); - } - - break; - - case -1: - for (bptr = buffer; bptr < eptr; bptr += 2) { - int32_t sam_A, sam_B, tmp; - - sam_A = dpp->samples_A [0]; - bptr [0] = tmp = (sam_B = bptr [0]) - apply_weight (dpp->weight_A, sam_A); - update_weight_clip (dpp->weight_A, dpp->delta, sam_A, tmp); - - bptr [1] = tmp = (dpp->samples_A [0] = bptr [1]) - apply_weight (dpp->weight_B, sam_B); - update_weight_clip (dpp->weight_B, dpp->delta, sam_B, tmp); - } - - break; - - case -2: - for (bptr = buffer; bptr < eptr; bptr += 2) { - int32_t sam_A, sam_B, tmp; - - sam_B = dpp->samples_B [0]; - bptr [1] = tmp = (sam_A = bptr [1]) - apply_weight (dpp->weight_B, sam_B); - update_weight_clip (dpp->weight_B, dpp->delta, sam_B, tmp); - - bptr [0] = tmp = (dpp->samples_B [0] = bptr [0]) - apply_weight (dpp->weight_A, sam_A); - update_weight_clip (dpp->weight_A, dpp->delta, sam_A, tmp); - } - - break; - - case -3: - for (bptr = buffer; bptr < eptr; bptr += 2) { - int32_t sam_A, sam_B, tmp; - - sam_A = dpp->samples_A [0]; - sam_B = dpp->samples_B [0]; - - dpp->samples_A [0] = tmp = bptr [1]; - bptr [1] = tmp -= apply_weight (dpp->weight_B, sam_B); - update_weight_clip (dpp->weight_B, dpp->delta, sam_B, tmp); - - dpp->samples_B [0] = tmp = bptr [0]; - bptr [0] = tmp -= apply_weight (dpp->weight_A, sam_A); - update_weight_clip (dpp->weight_A, dpp->delta, sam_A, tmp); - } - - break; - } -} - -// This is the "C" version of the magnitude scanning function. There are -// assembly optimized versions of this that can be used if available. This -// function scans a buffer of signed 32-bit ints and returns the magnitude -// of the largest sample, with a power-of-two resolution. It might be more -// useful to return the actual maximum absolute value (and this function -// could do that without breaking anything), but that implementation would -// likely be slower. Instead, this simply returns the "or" of all the -// values "xor"d with their own sign. - -uint32_t scan_max_magnitude (int32_t *values, int32_t num_values) -{ - uint32_t magnitude = 0; - - while (num_values--) - magnitude |= (*values < 0) ? ~*values++ : *values++; - - return magnitude; -} - -#endif - -#if !defined(OPT_ASM_X86) && !defined(OPT_ASM_X64) - -// This is the "C" version of the mono decorrelation pass function. There -// are assembly optimized versions of this that are be used if available. -// It decorrelates a buffer of mono samples, in place, as specified by the array -// of decorr_pass structures. Note that this function does NOT return the -// dpp->samples_X[] values in the "normalized" positions for terms 1-8, so if -// the number of samples is not a multiple of MAX_TERM, these must be moved if -// they are to be used somewhere else. The magnitude of the output samples is -// accumulated and returned (see scan_max_magnitude() for more details). - -uint32_t decorr_mono_buffer (int32_t *buffer, struct decorr_pass *decorr_passes, int32_t num_terms, int32_t sample_count) -{ - uint32_t max_magnitude = 0; - struct decorr_pass *dpp; - int tcount, i; - - for (i = 0; i < sample_count; ++i) { - int32_t code = *buffer; - - for (tcount = num_terms, dpp = decorr_passes; tcount--; dpp++) { - int32_t sam; - - if (dpp->term > MAX_TERM) { - if (dpp->term & 1) - sam = 2 * dpp->samples_A [0] - dpp->samples_A [1]; - else - sam = (3 * dpp->samples_A [0] - dpp->samples_A [1]) >> 1; - - dpp->samples_A [1] = dpp->samples_A [0]; - dpp->samples_A [0] = code; - } - else { - sam = dpp->samples_A [i & (MAX_TERM - 1)]; - dpp->samples_A [(i + dpp->term) & (MAX_TERM - 1)] = code; - } - - code -= apply_weight (dpp->weight_A, sam); - update_weight (dpp->weight_A, dpp->delta, sam, code); - } - - *buffer++ = code; - max_magnitude |= (code < 0) ? ~code : code; - } - - return max_magnitude; -} - -#endif - -////////////////////////////////////////////////////////////////////////////// -// This function returns the accumulated RMS noise as a double if the // -// CALC_NOISE bit was set in the WavPack header. The peak noise can also be // -// returned if desired. See wavpack.c for the calculations required to // -// convert this into decibels of noise below full scale. // -////////////////////////////////////////////////////////////////////////////// - -double WavpackGetEncodedNoise (WavpackContext *wpc, double *peak) -{ - WavpackStream *wps = wpc->streams [wpc->current_stream]; - - if (peak) - *peak = wps->dc.noise_max; - - return wps->dc.noise_sum; -} - -// Open the specified BitStream using the specified buffer pointers. It is -// assumed that enough buffer space has been allocated for all data that will -// be written, otherwise an error will be generated. - -static void bs_write (Bitstream *bs); - -static void bs_open_write (Bitstream *bs, void *buffer_start, void *buffer_end) -{ - bs->error = bs->sr = bs->bc = 0; - bs->ptr = bs->buf = buffer_start; - bs->end = buffer_end; - bs->wrap = bs_write; -} - -// This function is only called from the putbit() and putbits() macros when -// the buffer is full, which is now flagged as an error. - -static void bs_write (Bitstream *bs) -{ - bs->ptr = bs->buf; - bs->error = 1; -} - -// This function forces a flushing write of the specified BitStream, and -// returns the total number of bytes written into the buffer. - -static uint32_t bs_close_write (Bitstream *bs) -{ - uint32_t bytes_written; - - if (bs->error) - return (uint32_t) -1; - - while (1) { - while (bs->bc) - putbit_1 (bs); - - bytes_written = (uint32_t)(bs->ptr - bs->buf) * sizeof (*(bs->ptr)); - - if (bytes_written & 1) { - putbit_1 (bs); - } - else - break; - }; - - CLEAR (*bs); - return bytes_written; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack_dns.c b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack_dns.c deleted file mode 100644 index 2c6f3c8f..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack_dns.c +++ /dev/null @@ -1,191 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2013 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// pack_dns.c - -// This module handles the implementation of "dynamic noise shaping" which is -// designed to move the spectrum of the quantization noise introduced by lossy -// compression up or down in frequency so that it is more likely to be masked -// by the source material. - -#include -#include -#include - -#include "wavpack_local.h" - -static void best_floating_line (short *values, int num_values, double *initial_y, double *final_y, short *max_error); - -void dynamic_noise_shaping (WavpackContext *wpc, int32_t *buffer, int shortening_allowed) -{ - WavpackStream *wps = wpc->streams [wpc->current_stream]; - int32_t sample_count = wps->wphdr.block_samples; - struct decorr_pass *ap = &wps->analysis_pass; - uint32_t flags = wps->wphdr.flags; - int32_t *bptr, temp, sam; - short *swptr; - int sc; - - if (!wps->num_terms && sample_count > 8) { - if (flags & MONO_DATA) - for (bptr = buffer + sample_count - 3, sc = sample_count - 2; sc--;) { - sam = (3 * bptr [1] - bptr [2]) >> 1; - temp = *bptr-- - apply_weight (ap->weight_A, sam); - update_weight (ap->weight_A, 2, sam, temp); - } - else - for (bptr = buffer + (sample_count - 3) * 2 + 1, sc = sample_count - 2; sc--;) { - sam = (3 * bptr [2] - bptr [4]) >> 1; - temp = *bptr-- - apply_weight (ap->weight_B, sam); - update_weight (ap->weight_B, 2, sam, temp); - sam = (3 * bptr [2] - bptr [4]) >> 1; - temp = *bptr-- - apply_weight (ap->weight_A, sam); - update_weight (ap->weight_A, 2, sam, temp); - } - } - - if (sample_count > wps->dc.shaping_samples) { - sc = sample_count - wps->dc.shaping_samples; - swptr = wps->dc.shaping_data + wps->dc.shaping_samples; - bptr = buffer + wps->dc.shaping_samples * ((flags & MONO_DATA) ? 1 : 2); - - if (flags & MONO_DATA) - while (sc--) { - sam = (3 * ap->samples_A [0] - ap->samples_A [1]) >> 1; - temp = *bptr - apply_weight (ap->weight_A, sam); - update_weight (ap->weight_A, 2, sam, temp); - ap->samples_A [1] = ap->samples_A [0]; - ap->samples_A [0] = *bptr++; - *swptr++ = (ap->weight_A < 256) ? 1024 : 1536 - ap->weight_A * 2; - } - else - while (sc--) { - sam = (3 * ap->samples_A [0] - ap->samples_A [1]) >> 1; - temp = *bptr - apply_weight (ap->weight_A, sam); - update_weight (ap->weight_A, 2, sam, temp); - ap->samples_A [1] = ap->samples_A [0]; - ap->samples_A [0] = *bptr++; - - sam = (3 * ap->samples_B [0] - ap->samples_B [1]) >> 1; - temp = *bptr - apply_weight (ap->weight_B, sam); - update_weight (ap->weight_B, 2, sam, temp); - ap->samples_B [1] = ap->samples_B [0]; - ap->samples_B [0] = *bptr++; - - *swptr++ = (ap->weight_A + ap->weight_B < 512) ? 1024 : 1536 - ap->weight_A - ap->weight_B; - } - - wps->dc.shaping_samples = sample_count; - } - - if (wpc->wvc_flag) { - int max_allowed_error = 1000000 / wpc->ave_block_samples; - short max_error, trial_max_error; - double initial_y, final_y; - - if (max_allowed_error < 128) - max_allowed_error = 128; - - best_floating_line (wps->dc.shaping_data, sample_count, &initial_y, &final_y, &max_error); - - if (shortening_allowed && max_error > max_allowed_error) { - int min_samples = 0, max_samples = sample_count, trial_count; - double trial_initial_y, trial_final_y; - - while (1) { - trial_count = (min_samples + max_samples) / 2; - - best_floating_line (wps->dc.shaping_data, trial_count, &trial_initial_y, - &trial_final_y, &trial_max_error); - - if (trial_max_error < max_allowed_error) { - max_error = trial_max_error; - min_samples = trial_count; - initial_y = trial_initial_y; - final_y = trial_final_y; - } - else - max_samples = trial_count; - - if (min_samples > 10000 || max_samples - min_samples < 2) - break; - } - - sample_count = min_samples; - } - - if (initial_y < -512) initial_y = -512; - else if (initial_y > 1024) initial_y = 1024; - - if (final_y < -512) final_y = -512; - else if (final_y > 1024) final_y = 1024; -#if 0 - error_line ("%.2f sec, sample count = %5d, max error = %3d, range = %5d, %5d, actual = %5d, %5d", - (double) wps->sample_index / wpc->config.sample_rate, sample_count, max_error, - (int) floor (initial_y), (int) floor (final_y), - wps->dc.shaping_data [0], wps->dc.shaping_data [sample_count-1]); -#endif - if (sample_count != wps->wphdr.block_samples) - wps->wphdr.block_samples = sample_count; - - if (wpc->wvc_flag) { - wps->dc.shaping_acc [0] = wps->dc.shaping_acc [1] = (int32_t) floor (initial_y * 65536.0 + 0.5); - - wps->dc.shaping_delta [0] = wps->dc.shaping_delta [1] = - (int32_t) floor ((final_y - initial_y) / (sample_count - 1) * 65536.0 + 0.5); - - wps->dc.shaping_array = NULL; - } - else - wps->dc.shaping_array = wps->dc.shaping_data; - } - else - wps->dc.shaping_array = wps->dc.shaping_data; -} - -// Given an array of integer data (in shorts), find the linear function that most closely -// represents it (based on minimum sum of absolute errors). This is returned as the double -// precision initial & final Y values of the best-fit line. The function can also optionally -// compute and return a maximum error value (as a short). Note that the ends of the resulting -// line may fall way outside the range of input values, so some sort of clipping may be -// needed. - -static void best_floating_line (short *values, int num_values, double *initial_y, double *final_y, short *max_error) -{ - double left_sum = 0.0, right_sum = 0.0, center_x = (num_values - 1) / 2.0, center_y, m; - int i; - - for (i = 0; i < num_values >> 1; ++i) { - right_sum += values [num_values - i - 1]; - left_sum += values [i]; - } - - if (num_values & 1) { - right_sum += values [num_values >> 1] * 0.5; - left_sum += values [num_values >> 1] * 0.5; - } - - center_y = (right_sum + left_sum) / num_values; - m = (right_sum - left_sum) / ((double) num_values * num_values) * 4.0; - - if (initial_y) - *initial_y = center_y - m * center_x; - - if (final_y) - *final_y = center_y + m * center_x; - - if (max_error) { - double max = 0.0; - - for (i = 0; i < num_values; ++i) - if (fabs (values [i] - (center_y + (i - center_x) * m)) > max) - max = fabs (values [i] - (center_y + (i - center_x) * m)); - - *max_error = (short) floor (max + 0.5); - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack_dsd.c b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack_dsd.c deleted file mode 100644 index 531f454e..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack_dsd.c +++ /dev/null @@ -1,669 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** DSDPACK **** // -// Lossless DSD (Direct Stream Digital) Audio Compressor // -// Copyright (c) 2013 - 2016 David Bryant. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// pack_dsd.c - -// This module actually handles the compression of the DSD audio data. - -#ifdef ENABLE_DSD - -#include -#include -#include - -#include "wavpack_local.h" - -///////////////////////////// executable code //////////////////////////////// - -// This function initializes everything required to pack WavPack DSD bitstreams -// and must be called BEFORE any other function in this module. - -void pack_dsd_init (WavpackContext *wpc) -{ - WavpackStream *wps = wpc->streams [wpc->current_stream]; - - wps->sample_index = 0; -} - -// Pack an entire block of samples (either mono or stereo) into a completed -// WavPack block. This function is actually a shell for pack_samples() and -// performs tasks like handling any shift required by the format, preprocessing -// of floating point data or integer data over 24 bits wide, and implementing -// the "extra" mode (via the extra?.c modules). It is assumed that there is -// sufficient space for the completed block at "wps->blockbuff" and that -// "wps->blockend" points to the end of the available space. A return value of -// FALSE indicates an error. - -// Pack an entire block of samples (either mono or stereo) into a completed -// WavPack block. It is assumed that there is sufficient space for the -// completed block at "wps->blockbuff" and that "wps->blockend" points to the -// end of the available space. A return value of FALSE indicates an error. -// Any unsent metadata is transmitted first, then required metadata for this -// block is sent, and finally the compressed integer data is sent. If a "wpx" -// stream is required for floating point data or large integer data, then this -// must be handled outside this function. To find out how much data was written -// the caller must look at the ckSize field of the written WavpackHeader, NOT -// the one in the WavpackStream. - -static int encode_buffer_high (WavpackStream *wps, int32_t *buffer, int num_samples, unsigned char *destination); -static int encode_buffer_fast (WavpackStream *wps, int32_t *buffer, int num_samples, unsigned char *destination); - -int pack_dsd_block (WavpackContext *wpc, int32_t *buffer) -{ - WavpackStream *wps = wpc->streams [wpc->current_stream]; - uint32_t flags = wps->wphdr.flags, mult = wpc->dsd_multiplier, data_count; - uint32_t sample_count = wps->wphdr.block_samples; - unsigned char *dsd_encoding, dsd_power = 0; - int32_t res; - - // This code scans stereo data to check whether it can be stored as mono data - // (i.e., all L/R samples identical). - - if (!(flags & MONO_FLAG)) { - int32_t *sptr, *dptr, i; - - for (sptr = buffer, i = 0; i < (int32_t) sample_count; sptr += 2, i++) - if ((sptr [0] ^ sptr [1]) & 0xff) - break; - - if (i == sample_count) { - wps->wphdr.flags = flags |= FALSE_STEREO; - dptr = buffer; - sptr = buffer; - - for (i = sample_count; i--; sptr++) - *dptr++ = *sptr++; - } - else - wps->wphdr.flags = flags &= ~FALSE_STEREO; - } - - wps->wphdr.ckSize = sizeof (WavpackHeader) - 8; - memcpy (wps->blockbuff, &wps->wphdr, sizeof (WavpackHeader)); - - if (wpc->metacount) { - WavpackMetadata *wpmdp = wpc->metadata; - - while (wpc->metacount) { - copy_metadata (wpmdp, wps->blockbuff, wps->blockend); - wpc->metabytes -= wpmdp->byte_length; - free_metadata (wpmdp++); - wpc->metacount--; - } - - free (wpc->metadata); - wpc->metadata = NULL; - } - - if (!sample_count) - return TRUE; - - send_general_metadata (wpc); - memcpy (&wps->wphdr, wps->blockbuff, sizeof (WavpackHeader)); - - dsd_encoding = wps->blockbuff + ((WavpackHeader *) wps->blockbuff)->ckSize + 12; - - while (mult >>= 1) - dsd_power++; - - *dsd_encoding++ = dsd_power; - - if (wpc->config.flags & CONFIG_HIGH_FLAG) { - int fast_res = encode_buffer_fast (wps, buffer, sample_count, dsd_encoding); - - res = encode_buffer_high (wps, buffer, sample_count, dsd_encoding); - - if ((fast_res != -1) && (res == -1 || res > fast_res)) - res = encode_buffer_fast (wps, buffer, sample_count, dsd_encoding); - } - else - res = encode_buffer_fast (wps, buffer, sample_count, dsd_encoding); - - if (res == -1) { - int num_samples = sample_count * ((flags & MONO_DATA) ? 1 : 2); - uint32_t crc = 0xffffffff; - - *dsd_encoding++ = 0; - - data_count = num_samples + 2; - - while (num_samples--) - crc += (crc << 1) + (*dsd_encoding++ = *buffer++); - - ((WavpackHeader *) wps->blockbuff)->crc = crc; - } - else - data_count = res + 1; - - if (data_count) { - unsigned char *cptr = wps->blockbuff + ((WavpackHeader *) wps->blockbuff)->ckSize + 8; - - if (data_count & 1) { - cptr [data_count + 4] = 0; - *cptr++ = ID_DSD_BLOCK | ID_LARGE | ID_ODD_SIZE; - data_count++; - } - else - *cptr++ = ID_DSD_BLOCK | ID_LARGE; - - *cptr++ = data_count >> 1; - *cptr++ = data_count >> 9; - *cptr++ = data_count >> 17; - ((WavpackHeader *) wps->blockbuff)->ckSize += data_count + 4; - } - - wps->sample_index += sample_count; - return TRUE; -} - -/*------------------------------------------------------------------------------------------------------------------------*/ - -// #define DSD_BYTE_READY(low,high) (((low) >> 24) == ((high) >> 24)) -// #define DSD_BYTE_READY(low,high) (!(((low) ^ (high)) >> 24)) -#define DSD_BYTE_READY(low,high) (!(((low) ^ (high)) & 0xff000000)) - -#define MAX_HISTORY_BITS 5 -#define MAX_PROBABILITY 0xa0 // set to 0xff to disable RLE encoding for probabilities table - -#if (MAX_PROBABILITY < 0xff) - -static int rle_encode (unsigned char *src, int bcount, unsigned char *destination) -{ - int max_rle_zeros = 0xff - MAX_PROBABILITY; - unsigned char *dp = destination; - int zcount = 0; - - while (bcount--) { - if (*src) { - while (zcount) { - *dp++ = MAX_PROBABILITY + (zcount > max_rle_zeros ? max_rle_zeros : zcount); - zcount -= (zcount > max_rle_zeros ? max_rle_zeros : zcount); - } - - *dp++ = *src++; - } - else { - zcount++; - src++; - } - } - - while (zcount) { - *dp++ = MAX_PROBABILITY + (zcount > max_rle_zeros ? max_rle_zeros : zcount); - zcount -= (zcount > max_rle_zeros ? max_rle_zeros : zcount); - } - - *dp++ = 0; - - return (int)(dp - destination); -} - -#endif - -static void calculate_probabilities (int hist [256], unsigned char probs [256], unsigned short prob_sums [256]) -{ - int divisor, min_value, max_value, sum_values; - int min_hits = 0x7fffffff, max_hits = 0, i; - - for (i = 0; i < 256; ++i) { - if (hist [i] < min_hits) min_hits = hist [i]; - if (hist [i] > max_hits) max_hits = hist [i]; - } - - if (max_hits == 0) { - memset (probs, 0, sizeof (*probs) * 256); - memset (prob_sums, 0, sizeof (*prob_sums) * 256); - return; - } - -// fprintf (stderr, "process_histogram(): hits = %d to %d\n", min_hits, max_hits); - - if (max_hits > MAX_PROBABILITY) - divisor = ((max_hits << 8) + (MAX_PROBABILITY >> 1)) / MAX_PROBABILITY; - else - divisor = 0; - - while (1) { - min_value = 0x7fffffff; max_value = 0; sum_values = 0; - - for (i = 0; i < 256; ++i) { - int value; - - if (hist [i]) { - if (divisor) { - if (!(value = ((hist [i] << 8) + (divisor >> 1)) / divisor)) - value = 1; - } - else - value = hist [i]; - - if (value < min_value) min_value = value; - if (value > max_value) max_value = value; - } - else - value = 0; - - prob_sums [i] = sum_values += value; - probs [i] = value; - } - - if (max_value > MAX_PROBABILITY) { - divisor++; - continue; - } - -#if 0 // this code reduces probability values when they are completely redundant (i.e., common divisor), but - // this doesn't really happen often enough to make it worthwhile - - if (min_value > 1) { - for (i = 0; i < 256; ++i) - if (probs [i] % min_value) - break; - - if (i == 256) { - for (i = 0; i < 256; ++i) { - prob_sums [i] /= min_value; - probs [i] /= min_value; - } - - // fprintf (stderr, "fixed min_value = %d, divisor = %d, probs_sum = %d\n", min_value, divisor, prob_sums [255]); - } - } -#endif - - break; - } -} - -static int encode_buffer_fast (WavpackStream *wps, int32_t *buffer, int num_samples, unsigned char *destination) -{ - uint32_t flags = wps->wphdr.flags, crc = 0xffffffff; - unsigned int low = 0, high = 0xffffffff, mult; - unsigned short (*summed_probabilities) [256]; - unsigned char (*probabilities) [256]; - unsigned char *dp = destination, *ep; - int history_bins, bc, p0 = 0, p1 = 0; - int total_summed_probabilities = 0; - int (*histogram) [256]; - int32_t *bp = buffer; - char history_bits; - - if (!(flags & MONO_DATA)) - num_samples *= 2; - - if (num_samples < 280) - return -1; - else if (num_samples < 560) - history_bits = 0; - else if (num_samples < 1725) - history_bits = 1; - else if (num_samples < 5000) - history_bits = 2; - else if (num_samples < 14000) - history_bits = 3; - else if (num_samples < 28000) - history_bits = 4; - else if (num_samples < 76000) - history_bits = 5; - else if (num_samples < 130000) - history_bits = 6; - else if (num_samples < 300000) - history_bits = 7; - else - history_bits = 8; - - if (history_bits > MAX_HISTORY_BITS) - history_bits = MAX_HISTORY_BITS; - - history_bins = 1 << history_bits; - histogram = malloc (sizeof (*histogram) * history_bins); - memset (histogram, 0, sizeof (*histogram) * history_bins); - probabilities = malloc (sizeof (*probabilities) * history_bins); - summed_probabilities = malloc (sizeof (*summed_probabilities) * history_bins); - - bc = num_samples; - - if (flags & MONO_DATA) - while (bc--) { - crc += (crc << 1) + (*bp & 0xff); - histogram [p0] [*bp & 0xff]++; - p0 = *bp++ & (history_bins-1); - } - else - while (bc--) { - crc += (crc << 1) + (*bp & 0xff); - histogram [p0] [*bp & 0xff]++; - p0 = p1; - p1 = *bp++ & (history_bins-1); - } - - for (p0 = 0; p0 < history_bins; p0++) { - calculate_probabilities (histogram [p0], probabilities [p0], summed_probabilities [p0]); - total_summed_probabilities += summed_probabilities [p0] [255]; - } - - ((WavpackHeader *) wps->blockbuff)->crc = crc; - - // This code detects the case where the required value lookup tables grow silly big and cuts them back down. This would - // normally only happen with large blocks or poorly compressible data. The target is to guarantee that the total memory - // required for all three decode tables will be 2K bytes per history bin. - - while (total_summed_probabilities > history_bins * 1280) { - int max_sum = 0, sum_values = 0, largest_bin = 0; - - for (p0 = 0; p0 < history_bins; ++p0) - if (summed_probabilities [p0] [255] > max_sum) { - max_sum = summed_probabilities [p0] [255]; - largest_bin = p0; - } - - total_summed_probabilities -= max_sum; - p0 = largest_bin; - - for (p1 = 0; p1 < 256; ++p1) - summed_probabilities [p0] [p1] = sum_values += probabilities [p0] [p1] = (probabilities [p0] [p1] + 1) >> 1; - - total_summed_probabilities += summed_probabilities [p0] [255]; - // fprintf (stderr, "processed bin 0x%02x, bin: %d --> %d, new sum = %d\n", - // p0, max_sum, summed_probabilities [p0] [255], total_summed_probabilities); - } - - free (histogram); - bp = buffer; - bc = num_samples; - *dp++ = 1; - *dp++ = history_bits; - *dp++ = MAX_PROBABILITY; - ep = destination + num_samples - 10; - -#if (MAX_PROBABILITY < 0xff) - dp += rle_encode ((unsigned char *) probabilities, sizeof (*probabilities) * history_bins, dp); -#else - memcpy (dp, probabilities, sizeof (*probabilities) * history_bins); - dp += sizeof (*probabilities) * history_bins; -#endif - - p0 = p1 = 0; - - while (dp < ep && bc--) { - - mult = (high - low) / summed_probabilities [p0] [255]; - - if (!mult) { - high = low; - - while (DSD_BYTE_READY (high, low)) { - *dp++ = high >> 24; - high = (high << 8) | 0xff; - low <<= 8; - } - - mult = (high - low) / summed_probabilities [p0] [255]; - } - - if (*bp & 0xff) - low += summed_probabilities [p0] [(*bp & 0xff)-1] * mult; - - high = low + probabilities [p0] [*bp & 0xff] * mult - 1; - - while (DSD_BYTE_READY (high, low)) { - *dp++ = high >> 24; - high = (high << 8) | 0xff; - low <<= 8; - } - - if (flags & MONO_DATA) - p0 = *bp++ & (history_bins-1); - else { - p0 = p1; - p1 = *bp++ & (history_bins-1); - } - } - - high = low; - - while (DSD_BYTE_READY (high, low)) { - *dp++ = high >> 24; - high = (high << 8) | 0xff; - low <<= 8; - } - - free (summed_probabilities); - free (probabilities); - - if (dp < ep) - return (int)(dp - destination); - else - return -1; -} - -/*------------------------------------------------------------------------------------------------------------------------*/ - -#define PTABLE_BITS 8 -#define PTABLE_BINS (1<> 8; c--;) - value += (DOWN - value) >> DECAY; - - for (i = 0; i < PTABLE_BINS/2; ++i) { - table [i] = value; - table [PTABLE_BINS-1-i] = 0x100ffff - value; - - if (value > 0x010000) { - rate += (rate * rate_s + 128) >> 8; - - for (c = (rate + 64) >> 7; c--;) - value += (DOWN - value) >> DECAY; - } - } -} - -static int normalize_ptable (int *ptable) -{ - int rate = 0, min_error, error_sum, i; - int ntable [PTABLE_BINS]; - - init_ptable (ntable, rate, RATE_S); - - for (min_error = i = 0; i < PTABLE_BINS; ++i) - min_error += abs (ptable [i] - ntable [i]) >> 8; - - while (1) { - init_ptable (ntable, ++rate, RATE_S); - - for (error_sum = i = 0; i < PTABLE_BINS; ++i) - error_sum += abs (ptable [i] - ntable [i]) >> 8; - - if (error_sum < min_error) - min_error = error_sum; - else - break; - } - - return rate - 1; -} - -static int encode_buffer_high (WavpackStream *wps, int32_t *buffer, int num_samples, unsigned char *destination) -{ - int channel, stereo = (wps->wphdr.flags & MONO_DATA) ? 0 : 1; - uint32_t crc = 0xffffffff, high = 0xffffffff, low = 0; - unsigned char *dp = destination, *ep; - DSDfilters *sp; - - if (num_samples * (stereo + 1) < 280) - return -1; - - *dp++ = 3; - ep = destination + num_samples * (stereo + 1) - 10; - - if (!wps->sample_index) { - if (!wps->dsd.ptable) - wps->dsd.ptable = malloc (PTABLE_BINS * sizeof (*wps->dsd.ptable)); - - init_ptable (wps->dsd.ptable, INITIAL_TERM, RATE_S); - - for (channel = 0; channel < 2; ++channel) { - sp = wps->dsd.filters + channel; - - sp->filter1 = sp->filter2 = sp->filter3 = sp->filter4 = sp->filter5 = VALUE_ONE / 2; - sp->filter6 = sp->factor = 0; - } - - *dp++ = INITIAL_TERM; - *dp++ = RATE_S; - } - else { - int rate = normalize_ptable (wps->dsd.ptable); - init_ptable (wps->dsd.ptable, rate, RATE_S); - *dp++ = rate; - *dp++ = RATE_S; - } - - for (channel = 0; channel <= stereo; ++channel) { - sp = wps->dsd.filters + channel; - - *dp = sp->filter1 >> (PRECISION - 8); - sp->filter1 = *dp++ << (PRECISION - 8); - - *dp = sp->filter2 >> (PRECISION - 8); - sp->filter2 = *dp++ << (PRECISION - 8); - - *dp = sp->filter3 >> (PRECISION - 8); - sp->filter3 = *dp++ << (PRECISION - 8); - - *dp = sp->filter4 >> (PRECISION - 8); - sp->filter4 = *dp++ << (PRECISION - 8); - - *dp = sp->filter5 >> (PRECISION - 8); - sp->filter5 = *dp++ << (PRECISION - 8); - - *dp++ = sp->factor; - *dp++ = sp->factor >> 8; - sp->filter6 = 0; - sp->factor = (sp->factor << 16) >> 16; - } - - sp = wps->dsd.filters; - - while (dp < ep && num_samples--) { - int bitcount = 8; - - crc += (crc << 1) + (sp->byte = *buffer++ & 0xff); - sp [0].value = sp [0].filter1 - sp [0].filter5 + ((sp [0].filter6 * sp [0].factor) >> 2); - - if (stereo) { - crc += (crc << 1) + (sp [1].byte = *buffer++ & 0xff); - sp [1].value = sp [1].filter1 - sp [1].filter5 + ((sp [1].filter6 * sp [1].factor) >> 2); - } - - while (bitcount--) { - int32_t *pp = wps->dsd.ptable + ((sp [0].value >> (PRECISION - PRECISION_USE)) & PTABLE_MASK); - - if (sp [0].byte & 0x80) { - high = low + ((high - low) >> 8) * (*pp >> 16); - *pp += (UP - *pp) >> DECAY; - sp [0].filter0 = -1; - } - else { - low += 1 + ((high - low) >> 8) * (*pp >> 16); - *pp += (DOWN - *pp) >> DECAY; - sp [0].filter0 = 0; - } - - while (DSD_BYTE_READY (high, low)) { - *dp++ = high >> 24; - high = (high << 8) | 0xff; - low <<= 8; - } - - sp [0].value += sp [0].filter6 << 3; - sp [0].factor += (((sp [0].value ^ sp [0].filter0) >> 31) | 1) & ((sp [0].value ^ (sp [0].value - (sp [0].filter6 << 4))) >> 31); - sp [0].filter1 += ((sp [0].filter0 & VALUE_ONE) - sp [0].filter1) >> 6; - sp [0].filter2 += ((sp [0].filter0 & VALUE_ONE) - sp [0].filter2) >> 4; - sp [0].filter3 += (sp [0].filter2 - sp [0].filter3) >> 4; - sp [0].filter4 += (sp [0].filter3 - sp [0].filter4) >> 4; - sp [0].value = (sp [0].filter4 - sp [0].filter5) >> 4; - sp [0].filter5 += sp [0].value; - sp [0].filter6 += (sp [0].value - sp [0].filter6) >> 3; - sp [0].value = sp [0].filter1 - sp [0].filter5 + ((sp [0].filter6 * sp [0].factor) >> 2); - sp [0].byte <<= 1; - - if (!stereo) - continue; - - pp = wps->dsd.ptable + ((sp [1].value >> (PRECISION - PRECISION_USE)) & PTABLE_MASK); - - if (sp [1].byte & 0x80) { - high = low + ((high - low) >> 8) * (*pp >> 16); - *pp += (UP - *pp) >> DECAY; - sp [1].filter0 = -1; - } - else { - low += 1 + ((high - low) >> 8) * (*pp >> 16); - *pp += (DOWN - *pp) >> DECAY; - sp [1].filter0 = 0; - } - - while (DSD_BYTE_READY (high, low)) { - *dp++ = high >> 24; - high = (high << 8) | 0xff; - low <<= 8; - } - - sp [1].value += sp [1].filter6 << 3; - sp [1].factor += (((sp [1].value ^ sp [1].filter0) >> 31) | 1) & ((sp [1].value ^ (sp [1].value - (sp [1].filter6 << 4))) >> 31); - sp [1].filter1 += ((sp [1].filter0 & VALUE_ONE) - sp [1].filter1) >> 6; - sp [1].filter2 += ((sp [1].filter0 & VALUE_ONE) - sp [1].filter2) >> 4; - sp [1].filter3 += (sp [1].filter2 - sp [1].filter3) >> 4; - sp [1].filter4 += (sp [1].filter3 - sp [1].filter4) >> 4; - sp [1].value = (sp [1].filter4 - sp [1].filter5) >> 4; - sp [1].filter5 += sp [1].value; - sp [1].filter6 += (sp [1].value - sp [1].filter6) >> 3; - sp [1].value = sp [1].filter1 - sp [1].filter5 + ((sp [1].filter6 * sp [1].factor) >> 2); - sp [1].byte <<= 1; - } - - sp [0].factor -= (sp->factor + 512) >> 10; - - if (stereo) - sp [1].factor -= (sp [1].factor + 512) >> 10; - } - - ((WavpackHeader *) wps->blockbuff)->crc = crc; - high = low; - - while (DSD_BYTE_READY (high, low)) { - *dp++ = high >> 24; - high = (high << 8) | 0xff; - low <<= 8; - } - - if (dp < ep) - return (int)(dp - destination); - else - return -1; -} - -#endif // ENABLE_DSD diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack_floats.c b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack_floats.c deleted file mode 100644 index 90ab6565..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack_floats.c +++ /dev/null @@ -1,270 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2013 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// pack_floats.c - -// This module deals with the compression of floating-point data. Note that no -// floating point math is involved here...the values are only processed with -// the macros that directly access the mantissa, exponent, and sign fields. -// That's why we use the f32 type instead of the built-in float type. - -#include - -#include "wavpack_local.h" - -//#define DISPLAY_DIAGNOSTICS - -// Scan the provided buffer of floating-point values and (1) convert the -// significant portion of the data to integers for compression using the -// regular WavPack algorithms (which only operate on integers) and (2) -// determine whether the data requires a second stream for lossless -// storage (which will usually be the case except when the floating-point -// data was originally integer data). The converted integers are returned -// "in-place" and a return value of TRUE indicates that a second stream -// is required. - -int scan_float_data (WavpackStream *wps, f32 *values, int32_t num_values) -{ - int32_t shifted_ones = 0, shifted_zeros = 0, shifted_both = 0; - int32_t false_zeros = 0, neg_zeros = 0; -#ifdef DISPLAY_DIAGNOSTICS - int32_t true_zeros = 0, denormals = 0, exceptions = 0; -#endif - uint32_t ordata = 0, crc = 0xffffffff; - int32_t count, value, shift_count; - int max_mag = 0, max_exp = 0; - f32 *dp; - - wps->float_shift = wps->float_flags = 0; - - // First loop goes through all the data and (1) calculates the CRC and (2) finds the - // max magnitude that does not have an exponent of 255 (reserved for +/-inf and NaN). - for (dp = values, count = num_values; count--; dp++) { - crc = crc * 27 + get_mantissa (*dp) * 9 + get_exponent (*dp) * 3 + get_sign (*dp); - - if (get_exponent (*dp) < 255 && get_magnitude (*dp) > max_mag) - max_mag = get_magnitude (*dp); - } - - wps->crc_x = crc; - - // round up the magnitude so that when we convert the floating-point values to integers, - // they will be (at most) just over 24-bits signed precision - if (get_exponent (max_mag)) - max_exp = get_exponent (max_mag + 0x7F0000); - - for (dp = values, count = num_values; count--; dp++) { - // Exponent of 255 is reserved for +/-inf (mantissa = 0) or NaN (mantissa != 0). - // we use a value one greater than 24-bits unsigned for this. - if (get_exponent (*dp) == 255) { -#ifdef DISPLAY_DIAGNOSTICS - exceptions++; -#endif - wps->float_flags |= FLOAT_EXCEPTIONS; - value = 0x1000000; - shift_count = 0; - } - // This is the regular case. We generate a 24-bit unsigned value with the implied - // '1' MSB set and calculate a shift that will make it line up with the biggest - // samples in this block (although that shift would obviously shift out real data). - else if (get_exponent (*dp)) { - shift_count = max_exp - get_exponent (*dp); - value = 0x800000 + get_mantissa (*dp); - } - // Zero exponent means either +/- zero (mantissa = 0) or denormals (mantissa != 0). - // shift_count is set so that denormals (without an implied '1') will line up with - // regular values (with their implied '1' added at bit 23). Trust me. We don't care - // about the shift with zero. - else { - shift_count = max_exp ? max_exp - 1 : 0; - value = get_mantissa (*dp); - -#ifdef DISPLAY_DIAGNOSTICS - if (get_mantissa (*dp)) - denormals++; -#endif - } - - if (shift_count < 25) - value >>= shift_count; // perform the shift if there could be anything left - else - value = 0; // else just zero the value - - // If we are going to encode an integer zero, then this might be a "false zero" which - // means that there are significant bits but they're completely shifted out, or a - // "negative zero" which is simply a floating point value that we have to encode - // (and converting it to a positive zero would be an error). - if (!value) { - if (get_exponent (*dp) || get_mantissa (*dp)) - ++false_zeros; - else if (get_sign (*dp)) - ++neg_zeros; -#ifdef DISPLAY_DIAGNOSTICS - else - ++true_zeros; -#endif - } - // If we are going to shift something (but not everything) out of our integer before - // encoding, then we generate a mask corresponding to the bits that will be shifted - // out and increment the counter for the 3 possible cases of (1) all zeros, (2) all - // ones, and (3) a mix of ones and zeros. - else if (shift_count) { - int32_t mask = (1 << shift_count) - 1; - - if (!(get_mantissa (*dp) & mask)) - shifted_zeros++; - else if ((get_mantissa (*dp) & mask) == mask) - shifted_ones++; - else - shifted_both++; - } - - // "or" all the integer values together, and store the final integer with applied sign - - ordata |= value; - * (int32_t *) dp = (get_sign (*dp)) ? -value : value; - } - - wps->float_max_exp = max_exp; // on decode, we use this to calculate actual exponent - - // Now, based on our various counts, we determine the scheme required to encode the bits - // shifted out. Usually these will simply have to be sent literally, but in some rare cases - // we can get away with always assuming ones shifted out, or assuming all the bits shifted - // out in each value are the same (which means we only have to send a single bit). - if (shifted_both) - wps->float_flags |= FLOAT_SHIFT_SENT; - else if (shifted_ones && !shifted_zeros) - wps->float_flags |= FLOAT_SHIFT_ONES; - else if (shifted_ones && shifted_zeros) - wps->float_flags |= FLOAT_SHIFT_SAME; - // Another case is that we only shift out zeros (or maybe nothing), and in that case we - // check to see if our data actually has less than 24 or 25 bits of resolution, which means - // that we reduce can the magnitude of the integers we are encoding (which saves all those - // bits). The number of bits of reduced resolution is stored in float_shift. - else if (ordata && !(ordata & 1)) { - while (!(ordata & 1)) { - wps->float_shift++; - ordata >>= 1; - } - - // here we shift out all those zeros in the integer data we will encode - for (dp = values, count = num_values; count--; dp++) - * (int32_t *) dp >>= wps->float_shift; - } - - // Here we calculate the actual magnitude used by our integer data, although this is just - // used for informational purposes during encode/decode to possibly use faster math. - - wps->wphdr.flags &= ~MAG_MASK; - - while (ordata) { - wps->wphdr.flags += 1 << MAG_LSB; - ordata >>= 1; - } - - // Finally, we have to set some flags that guide how we encode various types of "zeros". - // If none of these are set (which is the most common situation), then every integer - // zero in the decoded data will simply become a floating-point zero. - - if (false_zeros || neg_zeros) - wps->float_flags |= FLOAT_ZEROS_SENT; - - if (neg_zeros) - wps->float_flags |= FLOAT_NEG_ZEROS; - -#ifdef DISPLAY_DIAGNOSTICS - { - int32_t *ip, min = 0x7fffffff, max = 0x80000000; - for (ip = (int32_t *) values, count = num_values; count--; ip++) { - if (*ip < min) min = *ip; - if (*ip > max) max = *ip; - } - - fprintf (stderr, "integer range = %d to %d\n", min, max); - } - - fprintf (stderr, "samples = %d, max exp = %d, pre-shift = %d, denormals = %d, exceptions = %d, max_mag = %x\n", - num_values, max_exp, wps->float_shift, denormals, exceptions, max_mag); - fprintf (stderr, "shifted ones/zeros/both = %d/%d/%d, true/neg/false zeros = %d/%d/%d\n", - shifted_ones, shifted_zeros, shifted_both, true_zeros, neg_zeros, false_zeros); -#endif - - return wps->float_flags & (FLOAT_EXCEPTIONS | FLOAT_ZEROS_SENT | FLOAT_SHIFT_SENT | FLOAT_SHIFT_SAME); -} - -// Given a buffer of float data, convert the data to integers (which is what the WavPack compression -// algorithms require) and write the other data required for lossless compression (which includes -// significant bits shifted out of the integers, plus information about +/- zeros and exceptions -// like NaN and +/- infinities) into the wvxbits stream (which is assumed to be opened). Note that -// for this work correctly, scan_float_data() must have been called on the original data to set -// the appropiate flags in float_flags and max_exp. - -void send_float_data (WavpackStream *wps, f32 *values, int32_t num_values) -{ - int max_exp = wps->float_max_exp; - int32_t count, value, shift_count; - f32 *dp; - - for (dp = values, count = num_values; count--; dp++) { - if (get_exponent (*dp) == 255) { - if (get_mantissa (*dp)) { - putbit_1 (&wps->wvxbits); - putbits (get_mantissa (*dp), 23, &wps->wvxbits); - } - else { - putbit_0 (&wps->wvxbits); - } - - value = 0x1000000; - shift_count = 0; - } - else if (get_exponent (*dp)) { - shift_count = max_exp - get_exponent (*dp); - value = 0x800000 + get_mantissa (*dp); - } - else { - shift_count = max_exp ? max_exp - 1 : 0; - value = get_mantissa (*dp); - } - - if (shift_count < 25) - value >>= shift_count; - else - value = 0; - - if (!value) { - if (wps->float_flags & FLOAT_ZEROS_SENT) { - if (get_exponent (*dp) || get_mantissa (*dp)) { - putbit_1 (&wps->wvxbits); - putbits (get_mantissa (*dp), 23, &wps->wvxbits); - - if (max_exp >= 25) { - putbits (get_exponent (*dp), 8, &wps->wvxbits); - } - - putbit (get_sign (*dp), &wps->wvxbits); - } - else { - putbit_0 (&wps->wvxbits); - - if (wps->float_flags & FLOAT_NEG_ZEROS) - putbit (get_sign (*dp), &wps->wvxbits); - } - } - } - else if (shift_count) { - if (wps->float_flags & FLOAT_SHIFT_SENT) { - int32_t data = get_mantissa (*dp) & ((1 << shift_count) - 1); - putbits (data, shift_count, &wps->wvxbits); - } - else if (wps->float_flags & FLOAT_SHIFT_SAME) { - putbit (get_mantissa (*dp) & 1, &wps->wvxbits); - } - } - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack_utils.c b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack_utils.c deleted file mode 100644 index 1918c185..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack_utils.c +++ /dev/null @@ -1,1418 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2013 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// pack_utils.c - -// This module provides the high-level API for creating WavPack files from -// audio data. It manages the buffers used to deinterleave the data passed -// in from the application into the individual streams and it handles the -// generation of riff headers and the "fixup" on the first WavPack block -// header for the case where the number of samples was unknown (or wrong). -// The actual audio stream compression is handled in the pack.c module. - -#include -#include -#include - -#include "wavpack_local.h" - -///////////////////////////// executable code //////////////////////////////// - -// Open context for writing WavPack files. The returned context pointer is used -// in all following calls to the library. The "blockout" function will be used -// to store the actual completed WavPack blocks and will be called with the id -// pointers containing user defined data (one for the wv file and one for the -// wvc file). A return value of NULL indicates that memory could not be -// allocated for the context. - -WavpackContext *WavpackOpenFileOutput (WavpackBlockOutput blockout, void *wv_id, void *wvc_id) -{ - WavpackContext *wpc = malloc (sizeof (WavpackContext)); - - if (!wpc) - return NULL; - - CLEAR (*wpc); - wpc->total_samples = -1; - wpc->stream_version = CUR_STREAM_VERS; - wpc->blockout = blockout; - wpc->wv_out = wv_id; - wpc->wvc_out = wvc_id; - return wpc; -} - -static int add_to_metadata (WavpackContext *wpc, void *data, uint32_t bcount, unsigned char id); - -// New for version 5.0, this function allows the application to store a file extension and a -// file_format identification. The extension would be used by the unpacker if the user had not -// specified the target filename, and specifically handles the case where the original file -// had the "wrong" extension for the file format (e.g., a Wave64 file having a "wav" extension) -// or an alternative (e.g., "bwf") or where the file format is not known. Specifying a file -// format besides the default WP_FORMAT_WAV will ensure that old decoders will not be able to -// see the non-wav wrapper provided with WavpackAddWrapper() (which they would end up putting -// on a file with a .wav extension). - -void WavpackSetFileInformation (WavpackContext *wpc, char *file_extension, unsigned char file_format) -{ - if (file_extension && strlen (file_extension) < sizeof (wpc->file_extension)) { - add_to_metadata (wpc, file_extension, (uint32_t) strlen (file_extension), ID_ALT_EXTENSION); - strcpy (wpc->file_extension, file_extension); - } - - wpc->file_format = file_format; -} - -// Set configuration for writing WavPack files. This must be done before -// sending any actual samples, however it is okay to send wrapper or other -// metadata before calling this. The "config" structure contains the following -// required information: - -// config->bytes_per_sample see WavpackGetBytesPerSample() for info -// config->bits_per_sample see WavpackGetBitsPerSample() for info -// config->channel_mask Microsoft standard (mono = 4, stereo = 3) -// config->num_channels self evident -// config->sample_rate self evident - -// In addition, the following fields and flags may be set: - -// config->flags: -// -------------- -// o CONFIG_HYBRID_FLAG select hybrid mode (must set bitrate) -// o CONFIG_JOINT_STEREO select joint stereo (must set override also) -// o CONFIG_JOINT_OVERRIDE override default joint stereo selection -// o CONFIG_HYBRID_SHAPE select hybrid noise shaping (set override & -// shaping_weight != 0.0) -// o CONFIG_SHAPE_OVERRIDE override default hybrid noise shaping -// (set CONFIG_HYBRID_SHAPE and shaping_weight) -// o CONFIG_FAST_FLAG "fast" compression mode -// o CONFIG_HIGH_FLAG "high" compression mode -// o CONFIG_BITRATE_KBPS hybrid bitrate is kbps, not bits / sample -// o CONFIG_CREATE_WVC create correction file -// o CONFIG_OPTIMIZE_WVC maximize bybrid compression (-cc option) -// o CONFIG_CALC_NOISE calc noise in hybrid mode -// o CONFIG_EXTRA_MODE extra processing mode (slow!) -// o CONFIG_SKIP_WVX no wvx stream for floats & large ints -// o CONFIG_MD5_CHECKSUM specify if you plan to store MD5 signature -// o CONFIG_CREATE_EXE specify if you plan to prepend sfx module -// o CONFIG_OPTIMIZE_MONO detect and optimize for mono files posing as -// stereo (uses a more recent stream format that -// is not compatible with decoders < 4.3) - -// config->bitrate hybrid bitrate in either bits/sample or kbps -// config->shaping_weight hybrid noise shaping coefficient override -// config->block_samples force samples per WavPack block (0 = use deflt) -// config->float_norm_exp select floating-point data (127 for +/-1.0) -// config->xmode extra mode processing value override - -// If the number of samples to be written is known then it should be passed -// here. If the duration is not known then pass -1. In the case that the size -// is not known (or the writing is terminated early) then it is suggested that -// the application retrieve the first block written and let the library update -// the total samples indication. A function is provided to do this update and -// it should be done to the "correction" file also. If this cannot be done -// (because a pipe is being used, for instance) then a valid WavPack will still -// be created, but when applications want to access that file they will have -// to seek all the way to the end to determine the actual duration. Also, if -// a RIFF header has been included then it should be updated as well or the -// WavPack file will not be directly unpackable to a valid wav file (although -// it will still be usable by itself). A return of FALSE indicates an error. -// -// The enhanced version of this function now allows setting the identities of -// any channels that are NOT standard Microsoft channels and are therefore not -// represented in the channel mask. WavPack files require that all the Microsoft -// channels come first (and in Microsoft order) and these are followed by any -// other channels (which can be in any order). -// -// The identities are provided in a NULL-terminated string (0x00 is not an allowed -// channel ID). The Microsoft channels may be provided as well (and will be checked) -// but it is really only neccessary to provide the "unknown" channels. Any truly -// unknown channels are indicated with a 0xFF. -// -// The channel IDs so far reserved are listed here: -// -// 0: not allowed / terminator -// 1 - 18: Microsoft standard channels -// 30, 31: Stereo mix from RF64 (not really recommended, but RF64 specifies this) -// 33 - 44: Core Audio channels (see Core Audio specification) -// 127 - 128: Amio LeftHeight, Amio RightHeight -// 138 - 142: Amio BottomFrontLeft/Center/Right, Amio ProximityLeft/Right -// 200 - 207: Core Audio channels (see Core Audio specification) -// 221 - 224: Core Audio channels 301 - 305 (offset by 80) -// 255: Present but unknown or unused channel -// -// All other channel IDs are reserved. Ask if something you need is missing. - -// Table of channels that will automatically "pair" into a single stereo stream - -static const struct { unsigned char a, b; } stereo_pairs [] = { - { 1, 2 }, // FL, FR - { 5, 6 }, // BL, BR - { 7, 8 }, // FLC, FRC - { 10, 11 }, // SL, SR - { 13, 15 }, // TFL, TFR - { 16, 18 }, // TBL, TBR - { 30, 31 }, // stereo mix L,R (RF64) - { 33, 34 }, // Rls, Rrs - { 35, 36 }, // Lw, Rw - { 38, 39 }, // Lt, Rt - { 127, 128 }, // Lh, Rh - { 138, 140 }, // Bfl, Bfr - { 141, 142 }, // Pl, Pr - { 200, 201 }, // Amb_W, Amb_X - { 202, 203 }, // Amb_Y, Amb_Z - { 204, 205 }, // MS_Mid, MS_Side - { 206, 207 }, // XY_X, XY_Y - { 221, 222 }, // Hph_L, Hph_R -}; - -#define NUM_STEREO_PAIRS (sizeof (stereo_pairs) / sizeof (stereo_pairs [0])) - -// Legacy version of this function for compatibility with existing applications. Note that this version -// also generates older streams to be compatible with all decoders back to 4.0, but of course cannot be -// used with > 2^32 samples or non-Microsoft channels. The older stream version only differs in that it -// does not support the "mono optimization" feature where stereo blocks containing identical audio data -// in both channels are encoded in mono for better efficiency. - -int WavpackSetConfiguration (WavpackContext *wpc, WavpackConfig *config, uint32_t total_samples) -{ - config->flags |= CONFIG_COMPATIBLE_WRITE; // write earlier version streams - - if (total_samples == (uint32_t) -1) - return WavpackSetConfiguration64 (wpc, config, -1, NULL); - else - return WavpackSetConfiguration64 (wpc, config, total_samples, NULL); -} - -int WavpackSetConfiguration64 (WavpackContext *wpc, WavpackConfig *config, int64_t total_samples, const unsigned char *chan_ids) -{ - uint32_t flags, bps = 0; - uint32_t chan_mask = config->channel_mask; - int num_chans = config->num_channels; - int i; - - wpc->stream_version = (config->flags & CONFIG_COMPATIBLE_WRITE) ? CUR_STREAM_VERS : MAX_STREAM_VERS; - - if ((config->qmode & QMODE_DSD_AUDIO) && config->bytes_per_sample == 1 && config->bits_per_sample == 8) { -#ifdef ENABLE_DSD - wpc->dsd_multiplier = 1; - flags = DSD_FLAG; - - for (i = 14; i >= 0; --i) - if (config->sample_rate % sample_rates [i] == 0) { - int divisor = config->sample_rate / sample_rates [i]; - - if (divisor && (divisor & (divisor - 1)) == 0) { - config->sample_rate /= divisor; - wpc->dsd_multiplier = divisor; - break; - } - } - - // most options that don't apply to DSD we can simply ignore for now, but NOT hybrid mode! - if (config->flags & CONFIG_HYBRID_FLAG) { - strcpy (wpc->error_message, "hybrid mode not available for DSD!"); - return FALSE; - } - - // with DSD, very few PCM options work (or make sense), so only allow those that do - config->flags &= (CONFIG_HIGH_FLAG | CONFIG_MD5_CHECKSUM | CONFIG_PAIR_UNDEF_CHANS); - config->float_norm_exp = config->xmode = 0; -#else - strcpy (wpc->error_message, "libwavpack not configured for DSD!"); - return FALSE; -#endif - } - else - flags = config->bytes_per_sample - 1; - - wpc->total_samples = total_samples; - wpc->config.sample_rate = config->sample_rate; - wpc->config.num_channels = config->num_channels; - wpc->config.channel_mask = config->channel_mask; - wpc->config.bits_per_sample = config->bits_per_sample; - wpc->config.bytes_per_sample = config->bytes_per_sample; - wpc->config.block_samples = config->block_samples; - wpc->config.flags = config->flags; - wpc->config.qmode = config->qmode; - - if (config->flags & CONFIG_VERY_HIGH_FLAG) - wpc->config.flags |= CONFIG_HIGH_FLAG; - - for (i = 0; i < 15; ++i) - if (wpc->config.sample_rate == sample_rates [i]) - break; - - flags |= i << SRATE_LSB; - - // all of this stuff only applies to PCM - - if (!(flags & DSD_FLAG)) { - if (config->float_norm_exp) { - wpc->config.float_norm_exp = config->float_norm_exp; - wpc->config.flags |= CONFIG_FLOAT_DATA; - flags |= FLOAT_DATA; - } - else - flags |= ((config->bytes_per_sample * 8) - config->bits_per_sample) << SHIFT_LSB; - - if (config->flags & CONFIG_HYBRID_FLAG) { - flags |= HYBRID_FLAG | HYBRID_BITRATE | HYBRID_BALANCE; - - if (!(wpc->config.flags & CONFIG_SHAPE_OVERRIDE)) { - wpc->config.flags |= CONFIG_HYBRID_SHAPE | CONFIG_AUTO_SHAPING; - flags |= HYBRID_SHAPE | NEW_SHAPING; - } - else if (wpc->config.flags & CONFIG_HYBRID_SHAPE) { - wpc->config.shaping_weight = config->shaping_weight; - flags |= HYBRID_SHAPE | NEW_SHAPING; - } - - if (wpc->config.flags & (CONFIG_CROSS_DECORR | CONFIG_OPTIMIZE_WVC)) - flags |= CROSS_DECORR; - - if (config->flags & CONFIG_BITRATE_KBPS) { - bps = (uint32_t) floor (config->bitrate * 256000.0 / config->sample_rate / config->num_channels + 0.5); - - if (bps > (64 << 8)) - bps = 64 << 8; - } - else - bps = (uint32_t) floor (config->bitrate * 256.0 + 0.5); - } - else - flags |= CROSS_DECORR; - - if (!(config->flags & CONFIG_JOINT_OVERRIDE) || (config->flags & CONFIG_JOINT_STEREO)) - flags |= JOINT_STEREO; - - if (config->flags & CONFIG_CREATE_WVC) - wpc->wvc_flag = TRUE; - } - - // if a channel-identities string was specified, process that here, otherwise all channels - // not present in the channel mask are considered "unassigned" - - if (chan_ids) { - int lastchan = 0, mask_copy = chan_mask; - - if ((int) strlen ((char *) chan_ids) > num_chans) { // can't be more than num channels! - strcpy (wpc->error_message, "chan_ids longer than num channels!"); - return FALSE; - } - - // skip past channels that are specified in the channel mask (no reason to store those) - - while (*chan_ids) - if (*chan_ids <= 32 && *chan_ids > lastchan && (mask_copy & (1 << (*chan_ids-1)))) { - mask_copy &= ~(1 << (*chan_ids-1)); - lastchan = *chan_ids++; - } - else - break; - - // now scan the string for an actually defined channel (and don't store if there aren't any) - - for (i = 0; chan_ids [i]; i++) - if (chan_ids [i] != 0xff) { - wpc->channel_identities = (unsigned char *) strdup ((char *) chan_ids); - break; - } - } - - // This loop goes through all the channels and creates the Wavpack "streams" for them to go in. - // A stream can hold either one or two channels, so we have several rules to determine how many - // channels will go in each stream. - - for (wpc->current_stream = 0; num_chans; wpc->current_stream++) { - WavpackStream *wps = malloc (sizeof (WavpackStream)); - unsigned char left_chan_id = 0, right_chan_id = 0; - int pos, chans = 1; - - // allocate the stream and initialize the pointer to it - wpc->streams = realloc (wpc->streams, (wpc->current_stream + 1) * sizeof (wpc->streams [0])); - wpc->streams [wpc->current_stream] = wps; - CLEAR (*wps); - - // if there are any bits [still] set in the channel_mask, get the next one or two IDs from there - if (chan_mask) - for (pos = 0; pos < 32; ++pos) - if (chan_mask & (1 << pos)) { - if (left_chan_id) { - right_chan_id = pos + 1; - break; - } - else { - chan_mask &= ~(1 << pos); - left_chan_id = pos + 1; - } - } - - // next check for any channels identified in the channel-identities string - while (!right_chan_id && chan_ids && *chan_ids) - if (left_chan_id) - right_chan_id = *chan_ids; - else - left_chan_id = *chan_ids++; - - // assume anything we did not get is "unassigned" - if (!left_chan_id) - left_chan_id = right_chan_id = 0xff; - else if (!right_chan_id) - right_chan_id = 0xff; - - // if we have 2 channels, this is where we decide if we can combine them into one stream: - // 1. they are "unassigned" and we've been told to combine unassigned pairs, or - // 2. they appear together in the valid "pairings" list - if (num_chans >= 2) { - if ((config->flags & CONFIG_PAIR_UNDEF_CHANS) && left_chan_id == 0xff && right_chan_id == 0xff) - chans = 2; - else - for (i = 0; i < NUM_STEREO_PAIRS; ++i) - if ((left_chan_id == stereo_pairs [i].a && right_chan_id == stereo_pairs [i].b) || - (left_chan_id == stereo_pairs [i].b && right_chan_id == stereo_pairs [i].a)) { - if (right_chan_id <= 32 && (chan_mask & (1 << (right_chan_id-1)))) - chan_mask &= ~(1 << (right_chan_id-1)); - else if (chan_ids && *chan_ids == right_chan_id) - chan_ids++; - - chans = 2; - break; - } - } - - num_chans -= chans; - - if (num_chans && wpc->current_stream == NEW_MAX_STREAMS - 1) - break; - - memcpy (wps->wphdr.ckID, "wvpk", 4); - wps->wphdr.ckSize = sizeof (WavpackHeader) - 8; - SET_TOTAL_SAMPLES (wps->wphdr, wpc->total_samples); - wps->wphdr.version = wpc->stream_version; - wps->wphdr.flags = flags; - wps->bits = bps; - - if (!wpc->current_stream) - wps->wphdr.flags |= INITIAL_BLOCK; - - if (!num_chans) - wps->wphdr.flags |= FINAL_BLOCK; - - if (chans == 1) { - wps->wphdr.flags &= ~(JOINT_STEREO | CROSS_DECORR | HYBRID_BALANCE); - wps->wphdr.flags |= MONO_FLAG; - } - } - - wpc->num_streams = wpc->current_stream; - wpc->current_stream = 0; - - if (num_chans) { - strcpy (wpc->error_message, "too many channels!"); - return FALSE; - } - - if (config->flags & CONFIG_EXTRA_MODE) - wpc->config.xmode = config->xmode ? config->xmode : 1; - - return TRUE; -} - -// This function allows setting the Core Audio File channel layout, many of which do not -// conform to the Microsoft ordering standard that Wavpack requires internally (at least for -// those channels present in the "channel mask"). In addition to the layout tag, this function -// allows a reordering string to be stored in the file to allow the unpacker to reorder the -// channels back to the specified layout (if it is aware of this feature and wants to restore -// the CAF order). The number of channels in the layout is specified in the lower nybble of -// the layout word, and if a reorder string is specified it must be that long. Note that all -// the reordering is actually done outside of this library, and that if reordering is done -// then the appropriate qmode bit must be set to ensure that any MD5 sum is stored with a new -// ID so that old decoders don't try to verify it (and to let the decoder know that a reorder -// might be required). -// -// Note: This function should only be used to encode Core Audio files in such a way that a -// verbatim archive can be created. Applications can just include the chan_ids parameter in -// the call to WavpackSetConfiguration64() if there are non-Microsoft channels to specify, -// or do nothing special if only Microsoft channels are present (the vast majority of cases). - -int WavpackSetChannelLayout (WavpackContext *wpc, uint32_t layout_tag, const unsigned char *reorder) -{ - int nchans = layout_tag & 0xff; - - if ((layout_tag & 0xff00ff00) || nchans > wpc->config.num_channels) - return FALSE; - - wpc->channel_layout = layout_tag; - - if (wpc->channel_reordering) { - free (wpc->channel_reordering); - wpc->channel_reordering = NULL; - } - - if (nchans && reorder) { - int min_index = 256, i; - - for (i = 0; i < nchans; ++i) - if (reorder [i] < min_index) - min_index = reorder [i]; - - wpc->channel_reordering = malloc (nchans); - - if (wpc->channel_reordering) - for (i = 0; i < nchans; ++i) - wpc->channel_reordering [i] = reorder [i] - min_index; - } - - return TRUE; -} - -// Prepare to actually pack samples by determining the size of the WavPack -// blocks and allocating sample buffers and initializing each stream. Call -// after WavpackSetConfiguration() and before WavpackPackSamples(). A return -// of FALSE indicates an error. - -static int write_metadata_block (WavpackContext *wpc); - -int WavpackPackInit (WavpackContext *wpc) -{ - if (wpc->metabytes > 16384) // 16384 bytes still leaves plenty of room for audio - write_metadata_block (wpc); // in this block (otherwise write a special one) - - // The default block size is a compromise. Longer blocks provide better encoding efficiency, - // but longer blocks adversely affect memory requirements and seeking performance. For WavPack - // version 5.0, the default block sizes have been reduced by half from the previous version, - // but the difference in encoding efficiency will generally be less than 0.1 percent. - - if (wpc->dsd_multiplier) { - wpc->block_samples = (wpc->config.sample_rate % 7) ? 48000 : 44100; - - if (wpc->config.flags & CONFIG_HIGH_FLAG) - wpc->block_samples /= 2; - - if (wpc->config.num_channels == 1) - wpc->block_samples *= 2; - - while (wpc->block_samples > 12000 && wpc->block_samples * wpc->config.num_channels > 300000) - wpc->block_samples /= 2; - } - else { - int divisor = (wpc->config.flags & CONFIG_HIGH_FLAG) ? 2 : 4; - - while (wpc->config.sample_rate % divisor) - divisor--; - - wpc->block_samples = wpc->config.sample_rate / divisor; - - while (wpc->block_samples > 12000 && wpc->block_samples * wpc->config.num_channels > 75000) - wpc->block_samples /= 2; - - while (wpc->block_samples * wpc->config.num_channels < 20000) - wpc->block_samples *= 2; - } - - if (wpc->config.block_samples) { - if ((wpc->config.flags & CONFIG_MERGE_BLOCKS) && - wpc->block_samples > (uint32_t) wpc->config.block_samples) { - wpc->block_boundary = wpc->config.block_samples; - wpc->block_samples /= wpc->config.block_samples; - wpc->block_samples *= wpc->config.block_samples; - } - else - wpc->block_samples = wpc->config.block_samples; - } - - wpc->ave_block_samples = wpc->block_samples; - wpc->max_samples = wpc->block_samples + (wpc->block_samples >> 1); - - for (wpc->current_stream = 0; wpc->current_stream < wpc->num_streams; wpc->current_stream++) { - WavpackStream *wps = wpc->streams [wpc->current_stream]; - - wps->sample_buffer = malloc (wpc->max_samples * (wps->wphdr.flags & MONO_FLAG ? 4 : 8)); - -#ifdef ENABLE_DSD - if (wps->wphdr.flags & DSD_FLAG) - pack_dsd_init (wpc); - else -#endif - pack_init (wpc); - } - - return TRUE; -} - -// Pack the specified samples. Samples must be stored in longs in the native -// endian format of the executing processor. The number of samples specified -// indicates composite samples (sometimes called "frames"). So, the actual -// number of data points would be this "sample_count" times the number of -// channels. Note that samples are accumulated here until enough exist to -// create a complete WavPack block (or several blocks for multichannel audio). -// If an application wants to break a block at a specific sample, then it must -// simply call WavpackFlushSamples() to force an early termination. Completed -// WavPack blocks are send to the function provided in the initial call to -// WavpackOpenFileOutput(). A return of FALSE indicates an error. - -static int pack_streams (WavpackContext *wpc, uint32_t block_samples); -static int create_riff_header (WavpackContext *wpc, int64_t total_samples, void *outbuffer); - -int WavpackPackSamples (WavpackContext *wpc, int32_t *sample_buffer, uint32_t sample_count) -{ - int nch = wpc->config.num_channels; - - while (sample_count) { - int32_t *source_pointer = sample_buffer; - unsigned int samples_to_copy; - - if (!wpc->riff_header_added && !wpc->riff_header_created && !wpc->file_format) { - char riff_header [128]; - - if (!add_to_metadata (wpc, riff_header, create_riff_header (wpc, wpc->total_samples, riff_header), ID_RIFF_HEADER)) - return FALSE; - } - - if (wpc->acc_samples + sample_count > wpc->max_samples) - samples_to_copy = wpc->max_samples - wpc->acc_samples; - else - samples_to_copy = sample_count; - - for (wpc->current_stream = 0; wpc->current_stream < wpc->num_streams; wpc->current_stream++) { - WavpackStream *wps = wpc->streams [wpc->current_stream]; - int32_t *dptr, *sptr, cnt; - - dptr = wps->sample_buffer + wpc->acc_samples * (wps->wphdr.flags & MONO_FLAG ? 1 : 2); - sptr = source_pointer; - cnt = samples_to_copy; - - // This code used to just copy the 32-bit samples regardless of the actual size with the - // assumption that the caller had properly sign-extended the values (if they were smaller - // than 32 bits). However, several people have discovered that if the data isn't properly - // sign extended then ugly things happen (e.g. CRC errors that show up only on decode). - // To prevent this, we now explicitly sign-extend samples smaller than 32-bit when we - // copy, and the performance hit from doing this is very small (generally < 1%). - - if (wps->wphdr.flags & MONO_FLAG) { - switch (wpc->config.bytes_per_sample) { - case 1: - while (cnt--) { - *dptr++ = (signed char) *sptr; - sptr += nch; - } - - break; - - case 2: - while (cnt--) { - *dptr++ = (int16_t) *sptr; - sptr += nch; - } - - break; - - case 3: - while (cnt--) { - *dptr++ = (*sptr << 8) >> 8; - sptr += nch; - } - - break; - - default: - while (cnt--) { - *dptr++ = *sptr; - sptr += nch; - } - } - - source_pointer++; - } - else { - switch (wpc->config.bytes_per_sample) { - case 1: - while (cnt--) { - *dptr++ = (signed char) sptr [0]; - *dptr++ = (signed char) sptr [1]; - sptr += nch; - } - - break; - - case 2: - while (cnt--) { - *dptr++ = (int16_t) sptr [0]; - *dptr++ = (int16_t) sptr [1]; - sptr += nch; - } - - break; - - case 3: - while (cnt--) { - *dptr++ = (sptr [0] << 8) >> 8; - *dptr++ = (sptr [1] << 8) >> 8; - sptr += nch; - } - - break; - - default: - while (cnt--) { - *dptr++ = sptr [0]; - *dptr++ = sptr [1]; - sptr += nch; - } - } - - source_pointer += 2; - } - } - - sample_buffer += samples_to_copy * nch; - sample_count -= samples_to_copy; - - if ((wpc->acc_samples += samples_to_copy) == wpc->max_samples && - !pack_streams (wpc, wpc->block_samples)) - return FALSE; - } - - return TRUE; -} - -// Flush all accumulated samples into WavPack blocks. This is normally called -// after all samples have been sent to WavpackPackSamples(), but can also be -// called to terminate a WavPack block at a specific sample (in other words it -// is possible to continue after this operation). This is also called to -// dump non-audio blocks like those holding metadata for various purposes. -// A return of FALSE indicates an error. - -int WavpackFlushSamples (WavpackContext *wpc) -{ - while (wpc->acc_samples) { - uint32_t block_samples; - - if (wpc->acc_samples > wpc->block_samples) - block_samples = wpc->acc_samples / 2; - else - block_samples = wpc->acc_samples; - - if (!pack_streams (wpc, block_samples)) - return FALSE; - } - - if (wpc->metacount) - write_metadata_block (wpc); - - return TRUE; -} - -// Note: The following function is no longer required because a proper wav -// header is now automatically generated for the application. However, if the -// application wants to generate its own header or wants to include additional -// chunks, then this function can still be used in which case the automatic -// wav header generation is suppressed. - -// Add wrapper (currently RIFF only) to WavPack blocks. This should be called -// before sending any audio samples for the RIFF header or after all samples -// have been sent for any RIFF trailer. WavpackFlushSamples() should be called -// between sending the last samples and calling this for trailer data to make -// sure that headers and trailers don't get mixed up in very short files. If -// the exact contents of the RIFF header are not known because, for example, -// the file duration is uncertain or trailing chunks are possible, simply write -// a "dummy" header of the correct length. When all data has been written it -// will be possible to read the first block written and update the header -// directly. An example of this can be found in the Audition filter. A -// return of FALSE indicates an error. - -int WavpackAddWrapper (WavpackContext *wpc, void *data, uint32_t bcount) -{ - int64_t index = WavpackGetSampleIndex64 (wpc); - unsigned char meta_id; - - if (!index || index == -1) { - wpc->riff_header_added = TRUE; - meta_id = wpc->file_format ? ID_ALT_HEADER : ID_RIFF_HEADER; - } - else { - wpc->riff_trailer_bytes += bcount; - meta_id = wpc->file_format ? ID_ALT_TRAILER : ID_RIFF_TRAILER; - } - - return add_to_metadata (wpc, data, bcount, meta_id); -} - -// Store computed MD5 sum in WavPack metadata. Note that the user must compute -// the 16 byte sum; it is not done here. A return of FALSE indicates an error. -// If any of the lower 8 bits of qmode are set, then this MD5 is stored with -// a metadata ID that old decoders do not recognize (because they would not -// interpret the qmode and would therefore fail the verification). - -int WavpackStoreMD5Sum (WavpackContext *wpc, unsigned char data [16]) -{ - return add_to_metadata (wpc, data, 16, (wpc->config.qmode & 0xff) ? ID_ALT_MD5_CHECKSUM : ID_MD5_CHECKSUM); -} - -#pragma pack(push,4) - -typedef struct { - char ckID [4]; - uint64_t chunkSize64; -} CS64Chunk; - -typedef struct { - uint64_t riffSize64, dataSize64, sampleCount64; - uint32_t tableLength; -} DS64Chunk; - -typedef struct { - char ckID [4]; - uint32_t ckSize; - char junk [28]; -} JunkChunk; - -#pragma pack(pop) - -#define DS64ChunkFormat "DDDL" - -static int create_riff_header (WavpackContext *wpc, int64_t total_samples, void *outbuffer) -{ - int do_rf64 = 0, write_junk = 1; - ChunkHeader ds64hdr, datahdr, fmthdr; - char *outptr = outbuffer; - RiffChunkHeader riffhdr; - DS64Chunk ds64_chunk; - JunkChunk junkchunk; - WaveHeader wavhdr; - - int64_t total_data_bytes, total_riff_bytes; - int32_t channel_mask = wpc->config.channel_mask; - int32_t sample_rate = wpc->config.sample_rate; - int bytes_per_sample = wpc->config.bytes_per_sample; - int bits_per_sample = wpc->config.bits_per_sample; - int format = (wpc->config.float_norm_exp) ? 3 : 1; - int num_channels = wpc->config.num_channels; - int wavhdrsize = 16; - - wpc->riff_header_created = TRUE; - - if (format == 3 && wpc->config.float_norm_exp != 127) { - strcpy (wpc->error_message, "can't create valid RIFF wav header for non-normalized floating data!"); - return FALSE; - } - - if (total_samples == -1) - total_samples = 0x7ffff000 / (bytes_per_sample * num_channels); - - total_data_bytes = total_samples * bytes_per_sample * num_channels; - - if (total_data_bytes > 0xff000000) { - write_junk = 0; - do_rf64 = 1; - } - - CLEAR (wavhdr); - - wavhdr.FormatTag = format; - wavhdr.NumChannels = num_channels; - wavhdr.SampleRate = sample_rate; - wavhdr.BytesPerSecond = sample_rate * num_channels * bytes_per_sample; - wavhdr.BlockAlign = bytes_per_sample * num_channels; - wavhdr.BitsPerSample = bits_per_sample; - - if (num_channels > 2 || channel_mask != 0x5 - num_channels) { - wavhdrsize = sizeof (wavhdr); - wavhdr.cbSize = 22; - wavhdr.ValidBitsPerSample = bits_per_sample; - wavhdr.SubFormat = format; - wavhdr.ChannelMask = channel_mask; - wavhdr.FormatTag = 0xfffe; - wavhdr.BitsPerSample = bytes_per_sample * 8; - wavhdr.GUID [4] = 0x10; - wavhdr.GUID [6] = 0x80; - wavhdr.GUID [9] = 0xaa; - wavhdr.GUID [11] = 0x38; - wavhdr.GUID [12] = 0x9b; - wavhdr.GUID [13] = 0x71; - } - - strncpy (riffhdr.ckID, do_rf64 ? "RF64" : "RIFF", sizeof (riffhdr.ckID)); - strncpy (riffhdr.formType, "WAVE", sizeof (riffhdr.formType)); - total_riff_bytes = sizeof (riffhdr) + wavhdrsize + sizeof (datahdr) + total_data_bytes + wpc->riff_trailer_bytes; - if (do_rf64) total_riff_bytes += sizeof (ds64hdr) + sizeof (ds64_chunk); - if (write_junk) total_riff_bytes += sizeof (junkchunk); - strncpy (fmthdr.ckID, "fmt ", sizeof (fmthdr.ckID)); - strncpy (datahdr.ckID, "data", sizeof (datahdr.ckID)); - fmthdr.ckSize = wavhdrsize; - - if (write_junk) { - CLEAR (junkchunk); - strncpy (junkchunk.ckID, "junk", sizeof (junkchunk.ckID)); - junkchunk.ckSize = sizeof (junkchunk) - 8; - WavpackNativeToLittleEndian (&junkchunk, ChunkHeaderFormat); - } - - if (do_rf64) { - strncpy (ds64hdr.ckID, "ds64", sizeof (ds64hdr.ckID)); - ds64hdr.ckSize = sizeof (ds64_chunk); - CLEAR (ds64_chunk); - ds64_chunk.riffSize64 = total_riff_bytes; - ds64_chunk.dataSize64 = total_data_bytes; - ds64_chunk.sampleCount64 = total_samples; - riffhdr.ckSize = (uint32_t) -1; - datahdr.ckSize = (uint32_t) -1; - WavpackNativeToLittleEndian (&ds64hdr, ChunkHeaderFormat); - WavpackNativeToLittleEndian (&ds64_chunk, DS64ChunkFormat); - } - else { - riffhdr.ckSize = (uint32_t) total_riff_bytes; - datahdr.ckSize = (uint32_t) total_data_bytes; - } - - WavpackNativeToLittleEndian (&riffhdr, ChunkHeaderFormat); - WavpackNativeToLittleEndian (&fmthdr, ChunkHeaderFormat); - WavpackNativeToLittleEndian (&wavhdr, WaveHeaderFormat); - WavpackNativeToLittleEndian (&datahdr, ChunkHeaderFormat); - - // write the RIFF chunks up to just before the data starts - - outptr = (char *) memcpy (outptr, &riffhdr, sizeof (riffhdr)) + sizeof (riffhdr); - - if (do_rf64) { - outptr = (char *) memcpy (outptr, &ds64hdr, sizeof (ds64hdr)) + sizeof (ds64hdr); - outptr = (char *) memcpy (outptr, &ds64_chunk, sizeof (ds64_chunk)) + sizeof (ds64_chunk); - } - - if (write_junk) - outptr = (char *) memcpy (outptr, &junkchunk, sizeof (junkchunk)) + sizeof (junkchunk); - - outptr = (char *) memcpy (outptr, &fmthdr, sizeof (fmthdr)) + sizeof (fmthdr); - outptr = (char *) memcpy (outptr, &wavhdr, wavhdrsize) + wavhdrsize; - outptr = (char *) memcpy (outptr, &datahdr, sizeof (datahdr)) + sizeof (datahdr); - - return (int)(outptr - (char *) outbuffer); -} - -static int block_add_checksum (unsigned char *buffer_start, unsigned char *buffer_end, int bytes); - -static int pack_streams (WavpackContext *wpc, uint32_t block_samples) -{ - uint32_t max_blocksize, max_chans = 1, bcount; - unsigned char *outbuff, *outend, *out2buff, *out2end; - int result = TRUE, i; - - // for calculating output (block) buffer size, first see if any streams are stereo - - for (i = 0; i < wpc->num_streams; i++) - if (!(wpc->streams [i]->wphdr.flags & MONO_FLAG)) { - max_chans = 2; - break; - } - - // then calculate maximum size based on bytes / sample - - max_blocksize = block_samples * max_chans * ((wpc->streams [0]->wphdr.flags & BYTES_STORED) + 1); - - // add margin based on how much "negative" compression is possible with pathological audio - - if ((wpc->config.flags & CONFIG_FLOAT_DATA) && !(wpc->config.flags & CONFIG_SKIP_WVX)) - max_blocksize += max_blocksize; // 100% margin for lossless float data - else - max_blocksize += max_blocksize >> 2; // otherwise 25% margin for everything else - - max_blocksize += wpc->metabytes + 1024; // finally, add metadata & another 1K margin - - out2buff = (wpc->wvc_flag) ? malloc (max_blocksize) : NULL; - out2end = out2buff + max_blocksize; - outbuff = malloc (max_blocksize); - outend = outbuff + max_blocksize; - - for (wpc->current_stream = 0; wpc->current_stream < wpc->num_streams; wpc->current_stream++) { - WavpackStream *wps = wpc->streams [wpc->current_stream]; - uint32_t flags = wps->wphdr.flags; - - flags &= ~MAG_MASK; - flags += (1 << MAG_LSB) * ((flags & BYTES_STORED) * 8 + 7); - - SET_BLOCK_INDEX (wps->wphdr, wps->sample_index); - wps->wphdr.block_samples = block_samples; - wps->wphdr.flags = flags; - wps->block2buff = out2buff; - wps->block2end = out2end; - wps->blockbuff = outbuff; - wps->blockend = outend; - -#ifdef ENABLE_DSD - if (flags & DSD_FLAG) - result = pack_dsd_block (wpc, wps->sample_buffer); - else -#endif - result = pack_block (wpc, wps->sample_buffer); - - if (result) { - result = block_add_checksum (outbuff, outend, (flags & HYBRID_FLAG) ? 2 : 4); - - if (result && out2buff) - result = block_add_checksum (out2buff, out2end, 2); - } - - wps->blockbuff = wps->block2buff = NULL; - - if (wps->wphdr.block_samples != block_samples) - block_samples = wps->wphdr.block_samples; - - if (!result) { - strcpy (wpc->error_message, "output buffer overflowed!"); - break; - } - - bcount = ((WavpackHeader *) outbuff)->ckSize + 8; - WavpackNativeToLittleEndian ((WavpackHeader *) outbuff, WavpackHeaderFormat); - result = wpc->blockout (wpc->wv_out, outbuff, bcount); - - if (!result) { - strcpy (wpc->error_message, "can't write WavPack data, disk probably full!"); - break; - } - - wpc->filelen += bcount; - - if (out2buff) { - bcount = ((WavpackHeader *) out2buff)->ckSize + 8; - WavpackNativeToLittleEndian ((WavpackHeader *) out2buff, WavpackHeaderFormat); - result = wpc->blockout (wpc->wvc_out, out2buff, bcount); - - if (!result) { - strcpy (wpc->error_message, "can't write WavPack data, disk probably full!"); - break; - } - - wpc->file2len += bcount; - } - - if (wpc->acc_samples != block_samples) - memmove (wps->sample_buffer, wps->sample_buffer + block_samples * (flags & MONO_FLAG ? 1 : 2), - (wpc->acc_samples - block_samples) * sizeof (int32_t) * (flags & MONO_FLAG ? 1 : 2)); - } - - wpc->current_stream = 0; - wpc->ave_block_samples = (wpc->ave_block_samples * 0x7 + block_samples + 0x4) >> 3; - wpc->acc_samples -= block_samples; - free (outbuff); - - if (out2buff) - free (out2buff); - - return result; -} - -// Given the pointer to the first block written (to either a .wv or .wvc file), -// update the block with the actual number of samples written. If the wav -// header was generated by the library, then it is updated also. This should -// be done if WavpackSetConfiguration() was called with an incorrect number -// of samples (or -1). It is the responsibility of the application to read and -// rewrite the block. An example of this can be found in the Audition filter. - -static void block_update_checksum (unsigned char *buffer_start); - -void WavpackUpdateNumSamples (WavpackContext *wpc, void *first_block) -{ - uint32_t wrapper_size; - - WavpackLittleEndianToNative (first_block, WavpackHeaderFormat); - SET_TOTAL_SAMPLES (* (WavpackHeader *) first_block, WavpackGetSampleIndex64 (wpc)); - - if (wpc->riff_header_created && WavpackGetWrapperLocation (first_block, &wrapper_size)) { - unsigned char riff_header [128]; - - if (wrapper_size == create_riff_header (wpc, WavpackGetSampleIndex64 (wpc), riff_header)) - memcpy (WavpackGetWrapperLocation (first_block, NULL), riff_header, wrapper_size); - } - - block_update_checksum (first_block); - WavpackNativeToLittleEndian (first_block, WavpackHeaderFormat); -} - -// Note: The following function is no longer required because the wav header -// automatically generated for the application will also be updated by -// WavpackUpdateNumSamples (). However, if the application wants to generate -// its own header or wants to include additional chunks, then this function -// still must be used to update the application generated header. - -// Given the pointer to the first block written to a WavPack file, this -// function returns the location of the stored RIFF header that was originally -// written with WavpackAddWrapper(). This would normally be used to update -// the wav header to indicate that a different number of samples was actually -// written or if additional RIFF chunks are written at the end of the file. -// The "size" parameter can be set to non-NULL to obtain the exact size of the -// RIFF header, and the function will return FALSE if the header is not found -// in the block's metadata (or it is not a valid WavPack block). It is the -// responsibility of the application to read and rewrite the block. An example -// of this can be found in the Audition filter. - -static void *find_metadata (void *wavpack_block, int desired_id, uint32_t *size); - -void *WavpackGetWrapperLocation (void *first_block, uint32_t *size) -{ - void *loc; - - WavpackLittleEndianToNative (first_block, WavpackHeaderFormat); - loc = find_metadata (first_block, ID_RIFF_HEADER, size); - - if (!loc) - loc = find_metadata (first_block, ID_ALT_HEADER, size); - - WavpackNativeToLittleEndian (first_block, WavpackHeaderFormat); - - return loc; -} - -static void *find_metadata (void *wavpack_block, int desired_id, uint32_t *size) -{ - WavpackHeader *wphdr = wavpack_block; - unsigned char *dp, meta_id, c1, c2; - int32_t bcount, meta_bc; - - if (strncmp (wphdr->ckID, "wvpk", 4)) - return NULL; - - bcount = wphdr->ckSize - sizeof (WavpackHeader) + 8; - dp = (unsigned char *)(wphdr + 1); - - while (bcount >= 2) { - meta_id = *dp++; - c1 = *dp++; - - meta_bc = c1 << 1; - bcount -= 2; - - if (meta_id & ID_LARGE) { - if (bcount < 2) - break; - - c1 = *dp++; - c2 = *dp++; - meta_bc += ((uint32_t) c1 << 9) + ((uint32_t) c2 << 17); - bcount -= 2; - } - - if ((meta_id & ID_UNIQUE) == desired_id) { - if ((bcount - meta_bc) >= 0) { - if (size) - *size = meta_bc - ((meta_id & ID_ODD_SIZE) ? 1 : 0); - - return dp; - } - else - return NULL; - } - - bcount -= meta_bc; - dp += meta_bc; - } - - return NULL; -} - -int copy_metadata (WavpackMetadata *wpmd, unsigned char *buffer_start, unsigned char *buffer_end) -{ - uint32_t mdsize = wpmd->byte_length + (wpmd->byte_length & 1); - WavpackHeader *wphdr = (WavpackHeader *) buffer_start; - - mdsize += (wpmd->byte_length > 510) ? 4 : 2; - buffer_start += wphdr->ckSize + 8; - - if (buffer_start + mdsize >= buffer_end) - return FALSE; - - buffer_start [0] = wpmd->id | (wpmd->byte_length & 1 ? ID_ODD_SIZE : 0); - buffer_start [1] = (wpmd->byte_length + 1) >> 1; - - if (wpmd->byte_length > 510) { - buffer_start [0] |= ID_LARGE; - buffer_start [2] = (wpmd->byte_length + 1) >> 9; - buffer_start [3] = (wpmd->byte_length + 1) >> 17; - } - - if (wpmd->data && wpmd->byte_length) { - memcpy (buffer_start + (wpmd->byte_length > 510 ? 4 : 2), wpmd->data, wpmd->byte_length); - - if (wpmd->byte_length & 1) // if size is odd, make sure pad byte is a zero - buffer_start [mdsize - 1] = 0; - } - - wphdr->ckSize += mdsize; - return TRUE; -} - -static int add_to_metadata (WavpackContext *wpc, void *data, uint32_t bcount, unsigned char id) -{ - WavpackMetadata *mdp; - unsigned char *src = data; - - while (bcount) { - if (wpc->metacount) { - uint32_t bc = bcount; - - mdp = wpc->metadata + wpc->metacount - 1; - - if (mdp->id == id) { - if (wpc->metabytes + bcount > 1000000) - bc = 1000000 - wpc->metabytes; - - mdp->data = realloc (mdp->data, mdp->byte_length + bc); - memcpy ((char *) mdp->data + mdp->byte_length, src, bc); - mdp->byte_length += bc; - wpc->metabytes += bc; - bcount -= bc; - src += bc; - - if (wpc->metabytes >= 1000000 && !write_metadata_block (wpc)) - return FALSE; - } - } - - if (bcount) { - wpc->metadata = realloc (wpc->metadata, (wpc->metacount + 1) * sizeof (WavpackMetadata)); - mdp = wpc->metadata + wpc->metacount++; - mdp->byte_length = 0; - mdp->data = NULL; - mdp->id = id; - } - } - - return TRUE; -} - -static char *write_metadata (WavpackMetadata *wpmd, char *outdata) -{ - unsigned char id = wpmd->id, wordlen [3]; - - wordlen [0] = (wpmd->byte_length + 1) >> 1; - wordlen [1] = (wpmd->byte_length + 1) >> 9; - wordlen [2] = (wpmd->byte_length + 1) >> 17; - - if (wpmd->byte_length & 1) - id |= ID_ODD_SIZE; - - if (wordlen [1] || wordlen [2]) - id |= ID_LARGE; - - *outdata++ = id; - *outdata++ = wordlen [0]; - - if (id & ID_LARGE) { - *outdata++ = wordlen [1]; - *outdata++ = wordlen [2]; - } - - if (wpmd->data && wpmd->byte_length) { - memcpy (outdata, wpmd->data, wpmd->byte_length); - outdata += wpmd->byte_length; - - if (wpmd->byte_length & 1) - *outdata++ = 0; - } - - return outdata; -} - -static int write_metadata_block (WavpackContext *wpc) -{ - char *block_buff, *block_ptr; - WavpackHeader *wphdr; - - if (wpc->metacount) { - int metacount = wpc->metacount, block_size = sizeof (WavpackHeader); - WavpackMetadata *wpmdp = wpc->metadata; - - while (metacount--) { - block_size += wpmdp->byte_length + (wpmdp->byte_length & 1); - block_size += (wpmdp->byte_length > 510) ? 4 : 2; - wpmdp++; - } - - // allocate 6 extra bytes for 4-byte checksum (which we add last) - wphdr = (WavpackHeader *) (block_buff = malloc (block_size + 6)); - - CLEAR (*wphdr); - memcpy (wphdr->ckID, "wvpk", 4); - SET_TOTAL_SAMPLES (*wphdr, wpc->total_samples); - wphdr->version = wpc->stream_version; - wphdr->ckSize = block_size - 8; - wphdr->block_samples = 0; - - block_ptr = (char *)(wphdr + 1); - - wpmdp = wpc->metadata; - - while (wpc->metacount) { - block_ptr = write_metadata (wpmdp, block_ptr); - wpc->metabytes -= wpmdp->byte_length; - free_metadata (wpmdp++); - wpc->metacount--; - } - - free (wpc->metadata); - wpc->metadata = NULL; - // add a 4-byte checksum here (increases block size by 6) - block_add_checksum ((unsigned char *) block_buff, (unsigned char *) block_buff + (block_size += 6), 4); - WavpackNativeToLittleEndian ((WavpackHeader *) block_buff, WavpackHeaderFormat); - - if (!wpc->blockout (wpc->wv_out, block_buff, block_size)) { - free (block_buff); - strcpy (wpc->error_message, "can't write WavPack data, disk probably full!"); - return FALSE; - } - - free (block_buff); - } - - return TRUE; -} - -void free_metadata (WavpackMetadata *wpmd) -{ - if (wpmd->data) { - free (wpmd->data); - wpmd->data = NULL; - } -} - -// These two functions add or update the block checksums that were introduced in WavPack 5.0. -// The presence of the checksum is indicated by a flag in the wavpack header (HAS_CHECKSUM) -// and the actual metadata item should be the last one in the block, and can be either 2 or 4 -// bytes. Of course, older versions of the decoder will simply ignore both of these. - -static int block_add_checksum (unsigned char *buffer_start, unsigned char *buffer_end, int bytes) -{ - WavpackHeader *wphdr = (WavpackHeader *) buffer_start; -#ifdef BITSTREAM_SHORTS - uint16_t *csptr = (uint16_t*) buffer_start; -#else - unsigned char *csptr = buffer_start; -#endif - int bcount = wphdr->ckSize + 8, wcount; - uint32_t csum = (uint32_t) -1; - - if (bytes != 2 && bytes != 4) - return FALSE; - - if (bcount < sizeof (WavpackHeader) || (bcount & 1) || buffer_start + bcount + 2 + bytes > buffer_end) - return FALSE; - - wphdr->flags |= HAS_CHECKSUM; - wphdr->ckSize += 2 + bytes; - wcount = bcount >> 1; - -#ifdef BITSTREAM_SHORTS - while (wcount--) - csum = (csum * 3) + *csptr++; -#else - WavpackNativeToLittleEndian ((WavpackHeader *) buffer_start, WavpackHeaderFormat); - - while (wcount--) { - csum = (csum * 3) + csptr [0] + (csptr [1] << 8); - csptr += 2; - } - - WavpackLittleEndianToNative ((WavpackHeader *) buffer_start, WavpackHeaderFormat); -#endif - - buffer_start += bcount; - *buffer_start++ = ID_BLOCK_CHECKSUM; - *buffer_start++ = bytes >> 1; - - if (bytes == 4) { - *buffer_start++ = csum; - *buffer_start++ = csum >> 8; - *buffer_start++ = csum >> 16; - *buffer_start++ = csum >> 24; - } - else { - csum ^= csum >> 16; - *buffer_start++ = csum; - *buffer_start++ = csum >> 8; - } - - return TRUE; -} - -static void block_update_checksum (unsigned char *buffer_start) -{ - WavpackHeader *wphdr = (WavpackHeader *) buffer_start; - unsigned char *dp, meta_id, c1, c2; - uint32_t bcount, meta_bc; - - if (!(wphdr->flags & HAS_CHECKSUM)) - return; - - bcount = wphdr->ckSize - sizeof (WavpackHeader) + 8; - dp = (unsigned char *)(wphdr + 1); - - while (bcount >= 2) { - meta_id = *dp++; - c1 = *dp++; - - meta_bc = c1 << 1; - bcount -= 2; - - if (meta_id & ID_LARGE) { - if (bcount < 2) - return; - - c1 = *dp++; - c2 = *dp++; - meta_bc += ((uint32_t) c1 << 9) + ((uint32_t) c2 << 17); - bcount -= 2; - } - - if (bcount < meta_bc) - return; - - if ((meta_id & ID_UNIQUE) == ID_BLOCK_CHECKSUM) { -#ifdef BITSTREAM_SHORTS - uint16_t *csptr = (uint16_t*) buffer_start; -#else - unsigned char *csptr = buffer_start; -#endif - int wcount = (int)(dp - 2 - buffer_start) >> 1; - uint32_t csum = (uint32_t) -1; - - if ((meta_id & ID_ODD_SIZE) || meta_bc < 2 || meta_bc > 4) - return; - -#ifdef BITSTREAM_SHORTS - while (wcount--) - csum = (csum * 3) + *csptr++; -#else - WavpackNativeToLittleEndian ((WavpackHeader *) buffer_start, WavpackHeaderFormat); - - while (wcount--) { - csum = (csum * 3) + csptr [0] + (csptr [1] << 8); - csptr += 2; - } - - WavpackLittleEndianToNative ((WavpackHeader *) buffer_start, WavpackHeaderFormat); -#endif - - if (meta_bc == 4) { - *dp++ = csum; - *dp++ = csum >> 8; - *dp++ = csum >> 16; - *dp++ = csum >> 24; - return; - } - else { - csum ^= csum >> 16; - *dp++ = csum; - *dp++ = csum >> 8; - return; - } - } - - bcount -= meta_bc; - dp += meta_bc; - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack_x64.S b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack_x64.S deleted file mode 100644 index a8798fdd..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack_x64.S +++ /dev/null @@ -1,1941 +0,0 @@ -############################################################################ -## **** WAVPACK **** ## -## Hybrid Lossless Wavefile Compressor ## -## Copyright (c) 1998 - 2015 Conifer Software. ## -## All Rights Reserved. ## -## Distributed under the BSD Software License (see license.txt) ## -############################################################################ - - .intel_syntax noprefix - .text - - .globl _pack_decorr_stereo_pass_x64win - .globl _pack_decorr_stereo_pass_cont_rev_x64win - .globl _pack_decorr_stereo_pass_cont_x64win - .globl _pack_decorr_mono_buffer_x64win - .globl _pack_decorr_mono_pass_cont_x64win - .globl _scan_max_magnitude_x64win - .globl _log2buffer_x64win - - .globl pack_decorr_stereo_pass_x64win - .globl pack_decorr_stereo_pass_cont_rev_x64win - .globl pack_decorr_stereo_pass_cont_x64win - .globl pack_decorr_mono_buffer_x64win - .globl pack_decorr_mono_pass_cont_x64win - .globl scan_max_magnitude_x64win - .globl log2buffer_x64win - - .globl _pack_decorr_stereo_pass_x64 - .globl _pack_decorr_stereo_pass_cont_rev_x64 - .globl _pack_decorr_stereo_pass_cont_x64 - .globl _pack_decorr_mono_buffer_x64 - .globl _pack_decorr_mono_pass_cont_x64 - .globl _scan_max_magnitude_x64 - .globl _log2buffer_x64 - - .globl pack_decorr_stereo_pass_x64 - .globl pack_decorr_stereo_pass_cont_rev_x64 - .globl pack_decorr_stereo_pass_cont_x64 - .globl pack_decorr_mono_buffer_x64 - .globl pack_decorr_mono_pass_cont_x64 - .globl scan_max_magnitude_x64 - .globl log2buffer_x64 - -# This module contains X64 assembly optimized versions of functions required -# to encode WavPack files. - -# This is an assembly optimized version of the following WavPack function: -# -# void pack_decorr_stereo_pass ( -# struct decorr_pass *dpp, -# int32_t *buffer, -# int32_t sample_count); -# -# It performs a single pass of stereo decorrelation, in place, as specified -# by the decorr_pass structure. Note that this function does NOT return the -# dpp->samples_X[] values in the "normalized" positions for terms 1-8, so if -# the number of samples is not a multiple of MAX_TERM, these must be moved if -# they are to be used somewhere else. -# -# This is written to work on an X86-64 processor (also called the AMD64) -# running in 64-bit mode and uses the MMX extensions to improve the -# performance by processing both stereo channels together. It is based on -# the original MMX code written by Joachim Henke that used MMX intrinsics -# called from C. Many thanks to Joachim for that! -# -# An issue with using MMX for this is that the sample history array in the -# decorr_pass structure contains separate arrays for each channel while the -# MMX code wants there to be a single array of dual samples. The fix for -# this is to convert the data in the arrays on entry and exit, and this is -# made easy by the fact that the 8 MMX regsiters hold exactly the required -# amount of data (64 bytes)! -# -# This version has entry points for both the System V ABI and the Windows -# X64 ABI. It does not use the "red zone" or the "shadow area"; it saves the -# non-volatile registers for both ABIs on the stack and allocates another -# 8 bytes on the stack so that it's properly aligned. Note that it does NOT -# provide unwind data for the Windows ABI (the unpack_x64.asm module for -# MSVC does). The arguments are passed in registers: -# -# System V Windows -# struct decorr_pass *dpp rdi rcx -# int32_t *buffer rsi rdx -# int32_t sample_count edx r8d -# -# During the processing loops, the following registers are used: -# -# rdi buffer pointer -# rsi termination buffer pointer -# rax,rbx,rdx used in default term to reduce calculation -# rbp decorr_pass pointer -# mm0, mm1 scratch -# mm2 original sample values -# mm3 correlation samples -# mm4 0 (for pcmpeqd) -# mm5 weights -# mm6 delta -# mm7 512 (for rounding) -# - -_pack_decorr_stereo_pass_x64win: -pack_decorr_stereo_pass_x64win: - push rbp - push rbx - push rdi - push rsi - sub rsp, 8 - mov rdi, rcx # copy params from win regs to Linux regs - mov rsi, rdx # so we can leave following code similar - mov rdx, r8 - mov rcx, r9 - jmp benter - -_pack_decorr_stereo_pass_x64: -pack_decorr_stereo_pass_x64: - push rbp - push rbx - push rdi - push rsi - sub rsp, 8 - -benter: mov rbp, rdi # rbp = *dpp - mov rdi, rsi # rdi = inbuffer - mov esi, edx - shl esi, 3 - jz bdone - add rsi, rdi # rsi = termination buffer pointer - - // convert samples_A and samples_B array into samples_AB array for MMX - // (the MMX registers provide exactly enough storage to do this easily) - - movq mm0, [rbp+16] - punpckldq mm0, [rbp+48] - movq mm1, [rbp+16] - punpckhdq mm1, [rbp+48] - movq mm2, [rbp+24] - punpckldq mm2, [rbp+56] - movq mm3, [rbp+24] - punpckhdq mm3, [rbp+56] - movq mm4, [rbp+32] - punpckldq mm4, [rbp+64] - movq mm5, [rbp+32] - punpckhdq mm5, [rbp+64] - movq mm6, [rbp+40] - punpckldq mm6, [rbp+72] - movq mm7, [rbp+40] - punpckhdq mm7, [rbp+72] - - movq [rbp+16], mm0 - movq [rbp+24], mm1 - movq [rbp+32], mm2 - movq [rbp+40], mm3 - movq [rbp+48], mm4 - movq [rbp+56], mm5 - movq [rbp+64], mm6 - movq [rbp+72], mm7 - - mov eax, 512 - movd mm7, eax - punpckldq mm7, mm7 # mm7 = round (512) - - mov eax, [rbp+4] - movd mm6, eax - punpckldq mm6, mm6 # mm6 = delta (0-7) - - mov eax, 0xFFFF # mask high weights to zero for PMADDWD - movd mm5, eax - punpckldq mm5, mm5 # mm5 = weight mask 0x0000FFFF0000FFFF - pand mm5, [rbp+8] # mm5 = weight_AB masked to 16-bit - - movq mm4, [rbp+16] # preload samples_AB[0] - - mov al, [rbp] # get term and vector to correct loop - cmp al, 17 - je buff_term_17_loop - cmp al, 18 - je buff_term_18_loop - cmp al, -1 - je buff_term_minus_1_loop - cmp al, -2 - je buff_term_minus_2_loop - cmp al, -3 - je buff_term_minus_3_loop - - pxor mm4, mm4 # mm4 = 0 (for pcmpeqd) - xor eax, eax - xor ebx, ebx - add bl, [rbp] - mov ecx, 7 - and ebx, ecx - jmp buff_default_term_loop - - .balign 64 - -buff_default_term_loop: - movq mm2, [rdi] # mm2 = left_right - movq mm3, [rbp+16+rax*8] - inc eax - and eax, ecx - movq [rbp+16+rbx*8], mm2 - inc ebx - and ebx, ecx - - movq mm1, mm3 - paddd mm1, mm1 - psrlw mm1, 1 - pmaddwd mm1, mm5 - - movq mm0, mm3 - psrld mm0, 15 - pmaddwd mm0, mm5 - - pslld mm0, 5 - paddd mm1, mm7 # add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 # add shifted sums - movq mm0, mm3 - movq [rdi], mm2 # store result - pxor mm0, mm2 - psrad mm0, 31 # mm0 = sign (sam_AB ^ left_right) - add rdi, 8 - pcmpeqd mm2, mm4 # mm2 = 1s if left_right was zero - pcmpeqd mm3, mm4 # mm3 = 1s if sam_AB was zero - por mm2, mm3 # mm2 = 1s if either was zero - pandn mm2, mm6 # mask delta with zeros check - pxor mm5, mm0 - paddw mm5, mm2 # and add to weight_AB - pxor mm5, mm0 - cmp rdi, rsi - jnz buff_default_term_loop - - jmp bdone - - .balign 64 - -buff_term_17_loop: - movq mm3, mm4 # get previous calculated value - paddd mm3, mm4 - psubd mm3, [rbp+24] - movq [rbp+24], mm4 - - movq mm1, mm3 - paddd mm1, mm1 - psrlw mm1, 1 - pmaddwd mm1, mm5 - - movq mm0, mm3 - psrld mm0, 15 - pmaddwd mm0, mm5 - - movq mm2, [rdi] # mm2 = left_right - movq mm4, mm2 - pslld mm0, 5 - paddd mm1, mm7 # add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 # add shifted sums - movq mm0, mm3 - movq [rdi], mm2 # store result - pxor mm1, mm1 - pxor mm0, mm2 - psrad mm0, 31 # mm0 = sign (sam_AB ^ left_right) - add rdi, 8 - pcmpeqd mm2, mm1 # mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 # mm3 = 1s if sam_AB was zero - por mm2, mm3 # mm2 = 1s if either was zero - pandn mm2, mm6 # mask delta with zeros check - pxor mm5, mm0 - paddw mm5, mm2 # and add to weight_AB - pxor mm5, mm0 - cmp rdi, rsi - jnz buff_term_17_loop - - movq [rbp+16], mm4 # post-store samples_AB[0] - jmp bdone - - .balign 64 - -buff_term_18_loop: - movq mm3, mm4 # get previous calculated value - psubd mm3, [rbp+24] - psrad mm3, 1 - paddd mm3, mm4 # mm3 = sam_AB - movq [rbp+24], mm4 - - movq mm1, mm3 - paddd mm1, mm1 - psrlw mm1, 1 - pmaddwd mm1, mm5 - - movq mm0, mm3 - psrld mm0, 15 - pmaddwd mm0, mm5 - - movq mm2, [rdi] # mm2 = left_right - movq mm4, mm2 - pslld mm0, 5 - paddd mm1, mm7 # add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 # add shifted sums - movq mm0, mm3 - movq [rdi], mm2 # store result - pxor mm1, mm1 - pxor mm0, mm2 - psrad mm0, 31 # mm0 = sign (sam_AB ^ left_right) - add rdi, 8 - pcmpeqd mm2, mm1 # mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 # mm3 = 1s if sam_AB was zero - por mm2, mm3 # mm2 = 1s if either was zero - pandn mm2, mm6 # mask delta with zeros check - pxor mm5, mm0 - paddw mm5, mm2 # and add to weight_AB - pxor mm5, mm0 - cmp rdi, rsi - jnz buff_term_18_loop - - movq [rbp+16], mm4 # post-store samples_AB[0] - jmp bdone - - .balign 64 - -buff_term_minus_1_loop: - movq mm3, mm4 # mm3 = previous calculated value - movq mm2, [rdi] # mm2 = left_right - movq mm4, mm2 - psrlq mm4, 32 - punpckldq mm3, mm2 # mm3 = sam_AB - - movq mm1, mm3 - paddd mm1, mm1 - psrlw mm1, 1 - pmaddwd mm1, mm5 - - movq mm0, mm3 - psrld mm0, 15 - pmaddwd mm0, mm5 - - pslld mm0, 5 - paddd mm1, mm7 # add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 # add shifted sums - movq mm0, mm3 - movq [rdi], mm2 # store result - pxor mm1, mm1 - pxor mm0, mm2 - psrad mm0, 31 # mm0 = sign (sam_AB ^ left_right) - add rdi, 8 - pcmpeqd mm2, mm1 # mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 # mm3 = 1s if sam_AB was zero - por mm2, mm3 # mm2 = 1s if either was zero - pandn mm2, mm6 # mask delta with zeros check - pcmpeqd mm1, mm1 - psubd mm1, mm7 - psubd mm1, mm7 - psubd mm1, mm0 - pxor mm5, mm0 - paddw mm5, mm1 - paddusw mm5, mm2 # and add to weight_AB - psubw mm5, mm1 - pxor mm5, mm0 - cmp rdi, rsi - jnz buff_term_minus_1_loop - - movq [rbp+16], mm4 # post-store samples_AB[0] - jmp bdone - - .balign 64 - -buff_term_minus_2_loop: - movq mm2, [rdi] # mm2 = left_right - movq mm3, mm2 - psrlq mm3, 32 - por mm3, mm4 - punpckldq mm4, mm2 - - movq mm1, mm3 - paddd mm1, mm1 - psrlw mm1, 1 - pmaddwd mm1, mm5 - - movq mm0, mm3 - psrld mm0, 15 - pmaddwd mm0, mm5 - - pslld mm0, 5 - paddd mm1, mm7 # add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 # add shifted sums - movq mm0, mm3 - movq [rdi], mm2 # store result - pxor mm1, mm1 - pxor mm0, mm2 - psrad mm0, 31 # mm0 = sign (sam_AB ^ left_right) - add rdi, 8 - pcmpeqd mm2, mm1 # mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 # mm3 = 1s if sam_AB was zero - por mm2, mm3 # mm2 = 1s if either was zero - pandn mm2, mm6 # mask delta with zeros check - pcmpeqd mm1, mm1 - psubd mm1, mm7 - psubd mm1, mm7 - psubd mm1, mm0 - pxor mm5, mm0 - paddw mm5, mm1 - paddusw mm5, mm2 # and add to weight_AB - psubw mm5, mm1 - pxor mm5, mm0 - cmp rdi, rsi - jnz buff_term_minus_2_loop - - movq [rbp+16], mm4 # post-store samples_AB[0] - jmp bdone - - .balign 64 - -buff_term_minus_3_loop: - movq mm2, [rdi] # mm2 = left_right - movq mm3, mm4 # mm3 = previous calculated value - movq mm4, mm2 # mm0 = swap dwords of new data - psrlq mm4, 32 - punpckldq mm4, mm2 # mm3 = sam_AB - - movq mm1, mm3 - paddd mm1, mm1 - psrlw mm1, 1 - pmaddwd mm1, mm5 - - movq mm0, mm3 - psrld mm0, 15 - pmaddwd mm0, mm5 - - pslld mm0, 5 - paddd mm1, mm7 # add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 # add shifted sums - movq mm0, mm3 - movq [rdi], mm2 # store result - pxor mm1, mm1 - pxor mm0, mm2 - psrad mm0, 31 # mm0 = sign (sam_AB ^ left_right) - add rdi, 8 - pcmpeqd mm2, mm1 # mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 # mm3 = 1s if sam_AB was zero - por mm2, mm3 # mm2 = 1s if either was zero - pandn mm2, mm6 # mask delta with zeros check - pcmpeqd mm1, mm1 - psubd mm1, mm7 - psubd mm1, mm7 - psubd mm1, mm0 - pxor mm5, mm0 - paddw mm5, mm1 - paddusw mm5, mm2 # and add to weight_AB - psubw mm5, mm1 - pxor mm5, mm0 - cmp rdi, rsi - jnz buff_term_minus_3_loop - - movq [rbp+16], mm4 # post-store samples_AB[0] - -bdone: pslld mm5, 16 # sign-extend 16-bit weights back to dwords - psrad mm5, 16 - movq [rbp+8], mm5 # put weight_AB back - - // convert samples_AB array back into samples_A and samples_B - - movq mm0, [rbp+16] - movq mm1, [rbp+24] - movq mm2, [rbp+32] - movq mm3, [rbp+40] - movq mm4, [rbp+48] - movq mm5, [rbp+56] - movq mm6, [rbp+64] - movq mm7, [rbp+72] - - movd [rbp+16], mm0 - movd [rbp+20], mm1 - movd [rbp+24], mm2 - movd [rbp+28], mm3 - movd [rbp+32], mm4 - movd [rbp+36], mm5 - movd [rbp+40], mm6 - movd [rbp+44], mm7 - - punpckhdq mm0, mm0 - punpckhdq mm1, mm1 - punpckhdq mm2, mm2 - punpckhdq mm3, mm3 - punpckhdq mm4, mm4 - punpckhdq mm5, mm5 - punpckhdq mm6, mm6 - punpckhdq mm7, mm7 - - movd [rbp+48], mm0 - movd [rbp+52], mm1 - movd [rbp+56], mm2 - movd [rbp+60], mm3 - movd [rbp+64], mm4 - movd [rbp+68], mm5 - movd [rbp+72], mm6 - movd [rbp+76], mm7 - - emms - - add rsp, 8 - pop rsi - pop rdi - pop rbx - pop rbp - ret - - -# These are assembly optimized version of the following WavPack functions: -# -# void pack_decorr_stereo_pass_cont ( -# struct decorr_pass *dpp, -# int32_t *in_buffer, -# int32_t *out_buffer, -# int32_t sample_count); -# -# void pack_decorr_stereo_pass_cont_rev ( -# struct decorr_pass *dpp, -# int32_t *in_buffer, -# int32_t *out_buffer, -# int32_t sample_count); -# -# It performs a single pass of stereo decorrelation, transfering from the -# input buffer to the output buffer. Note that this version of the function -# requires that the up to 8 previous (depending on dpp->term) stereo samples -# are visible and correct. In other words, it ignores the "samples_*" -# fields in the decorr_pass structure and gets the history data directly -# from the source buffer. It does, however, return the appropriate history -# samples to the decorr_pass structure before returning. -# -# This is written to work on an X86-64 processor (also called the AMD64) -# running in 64-bit mode and uses the MMX extensions to improve the -# performance by processing both stereo channels together. It is based on -# the original MMX code written by Joachim Henke that used MMX intrinsics -# called from C. Many thanks to Joachim for that! -# -# This version has entry points for both the System V ABI and the Windows -# X64 ABI. It does not use the "red zone" or the "shadow area"; it saves the -# non-volatile registers for both ABIs on the stack and allocates another -# 8 bytes on the stack to store the dpp pointer. Note that it does NOT -# provide unwind data for the Windows ABI (the unpack_x64.asm module for -# MSVC does). The arguments are passed in registers: -# -# System V Windows -# struct decorr_pass *dpp rdi rcx -# int32_t *in_buffer rsi rdx -# int32_t *out_buffer rdx r8 -# int32_t sample_count ecx r9 -# -# During the processing loops, the following registers are used: -# -# rdi input buffer pointer -# rsi direction (-8 forward, +8 reverse) -# rbx delta from input to output buffer -# ecx sample count -# rdx sign (dir) * term * -8 (terms 1-8 only) -# mm0, mm1 scratch -# mm2 original sample values -# mm3 correlation samples -# mm4 weight sums -# mm5 weights -# mm6 delta -# mm7 512 (for rounding) -# -# stack usage: -# -# [rsp+0] = *dpp -# - -_pack_decorr_stereo_pass_cont_rev_x64win: -pack_decorr_stereo_pass_cont_rev_x64win: - mov rax, 8 - jmp wstart - -_pack_decorr_stereo_pass_cont_x64win: -pack_decorr_stereo_pass_cont_x64win: - mov rax, -8 - jmp wstart - -wstart: push rbp - push rbx - push rdi - push rsi - sub rsp, 8 - mov rdi, rcx # copy params from win regs to Linux regs - mov rsi, rdx # so we can leave following code similar - mov rdx, r8 - mov rcx, r9 - jmp enter - -_pack_decorr_stereo_pass_cont_rev_x64: -pack_decorr_stereo_pass_cont_rev_x64: - mov rax, 8 - jmp start - -_pack_decorr_stereo_pass_cont_x64: -pack_decorr_stereo_pass_cont_x64: - mov rax, -8 - jmp start - -start: push rbp - push rbx - push rdi - push rsi - sub rsp, 8 - -enter: mov [rsp], rdi # [rbp-8] = *dpp - mov rdi, rsi # rdi = inbuffer - mov rsi, rax # get direction from rax - - mov eax, 512 - movd mm7, eax - punpckldq mm7, mm7 # mm7 = round (512) - - mov rax, [rsp] # access dpp - mov eax, [rax+4] - movd mm6, eax - punpckldq mm6, mm6 # mm6 = delta (0-7) - - mov rax, [rsp] # access dpp - movq mm5, [rax+8] # mm5 = weight_AB - movq mm4, [rax+88] # mm4 = sum_AB - - mov rbx, rdx # rbx = out_buffer (rdx) - in_buffer (rdi) - sub rbx, rdi - - mov rax, [rsp] # *eax = dpp - movsxd rax, DWORD PTR [rax] # get term and vector to correct loop - cmp al, 17 - je term_17_loop - cmp al, 18 - je term_18_loop - cmp al, -1 - je term_minus_1_loop - cmp al, -2 - je term_minus_2_loop - cmp al, -3 - je term_minus_3_loop - - shl rax, 3 - mov rdx, rax # rdx = term * 8 to index correlation sample - test rsi, rsi # test direction - jns default_term_loop - neg rdx - jmp default_term_loop - - .balign 64 - -default_term_loop: - movq mm3, [rdi+rdx] # mm3 = sam_AB - - movq mm1, mm3 - pslld mm1, 17 - psrld mm1, 17 - pmaddwd mm1, mm5 - - movq mm0, mm3 - pslld mm0, 1 - psrld mm0, 16 - pmaddwd mm0, mm5 - - movq mm2, [rdi] # mm2 = left_right - pslld mm0, 5 - paddd mm1, mm7 # add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 # add shifted sums - movq mm0, mm3 - movq [rdi+rbx], mm2 # store result - pxor mm0, mm2 - psrad mm0, 31 # mm0 = sign (sam_AB ^ left_right) - sub rdi, rsi - pxor mm1, mm1 # mm1 = zero - pcmpeqd mm2, mm1 # mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 # mm3 = 1s if sam_AB was zero - por mm2, mm3 # mm2 = 1s if either was zero - pandn mm2, mm6 # mask delta with zeros check - pxor mm5, mm0 - paddd mm5, mm2 # and add to weight_AB - pxor mm5, mm0 - paddd mm4, mm5 # add weights to sum - dec ecx - jnz default_term_loop - - mov rax, [rsp] # access dpp - movq [rax+8], mm5 # put weight_AB back - movq [rax+88], mm4 # put sum_AB back - emms - - mov rdx, [rsp] # access dpp with rdx - movsxd rcx, DWORD PTR [rdx] # rcx = dpp->term - -default_store_samples: - dec rcx - add rdi, rsi # back up one full sample - mov eax, [rdi+4] - mov [rdx+rcx*4+48], eax # store samples_B [ecx] - mov eax, [rdi] - mov [rdx+rcx*4+16], eax # store samples_A [ecx] - test rcx, rcx - jnz default_store_samples - jmp done - - .balign 64 - -term_17_loop: - movq mm3, [rdi+rsi] # get previous calculated value - paddd mm3, mm3 - psubd mm3, [rdi+rsi*2] - - movq mm1, mm3 - pslld mm1, 17 - psrld mm1, 17 - pmaddwd mm1, mm5 - - movq mm0, mm3 - pslld mm0, 1 - psrld mm0, 16 - pmaddwd mm0, mm5 - - movq mm2, [rdi] # mm2 = left_right - pslld mm0, 5 - paddd mm1, mm7 # add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 # add shifted sums - movq mm0, mm3 - movq [rdi+rbx], mm2 # store result - pxor mm0, mm2 - psrad mm0, 31 # mm0 = sign (sam_AB ^ left_right) - sub rdi, rsi - pxor mm1, mm1 # mm1 = zero - pcmpeqd mm2, mm1 # mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 # mm3 = 1s if sam_AB was zero - por mm2, mm3 # mm2 = 1s if either was zero - pandn mm2, mm6 # mask delta with zeros check - pxor mm5, mm0 - paddd mm5, mm2 # and add to weight_AB - pxor mm5, mm0 - paddd mm4, mm5 # add weights to sum - dec ecx - jnz term_17_loop - - mov rax, [rsp] # access dpp - movq [rax+8], mm5 # put weight_AB back - movq [rax+88], mm4 # put sum_AB back - emms - jmp term_1718_common_store - - .balign 64 - -term_18_loop: - movq mm3, [rdi+rsi] # get previous calculated value - movq mm0, mm3 - psubd mm3, [rdi+rsi*2] - psrad mm3, 1 - paddd mm3, mm0 # mm3 = sam_AB - - movq mm1, mm3 - pslld mm1, 17 - psrld mm1, 17 - pmaddwd mm1, mm5 - - movq mm0, mm3 - pslld mm0, 1 - psrld mm0, 16 - pmaddwd mm0, mm5 - - movq mm2, [rdi] # mm2 = left_right - pslld mm0, 5 - paddd mm1, mm7 # add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 # add shifted sums - movq mm0, mm3 - movq [rdi+rbx], mm2 # store result - pxor mm0, mm2 - psrad mm0, 31 # mm0 = sign (sam_AB ^ left_right) - sub rdi, rsi - pxor mm1, mm1 # mm1 = zero - pcmpeqd mm2, mm1 # mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 # mm3 = 1s if sam_AB was zero - por mm2, mm3 # mm2 = 1s if either was zero - pandn mm2, mm6 # mask delta with zeros check - pxor mm5, mm0 - paddd mm5, mm2 # and add to weight_AB - pxor mm5, mm0 - dec ecx - paddd mm4, mm5 # add weights to sum - jnz term_18_loop - - mov rax, [rsp] # access dpp - movq [rax+8], mm5 # put weight_AB back - movq [rax+88], mm4 # put sum_AB back - emms - -term_1718_common_store: - - mov rax, [rsp] # access dpp - add rdi, rsi # back up a full sample - mov edx, [rdi+4] # dpp->samples_B [0] = iptr [-1]; - mov [rax+48], edx - mov edx, [rdi] # dpp->samples_A [0] = iptr [-2]; - mov [rax+16], edx - add rdi, rsi # back up another sample - mov edx, [rdi+4] # dpp->samples_B [1] = iptr [-3]; - mov [rax+52], edx - mov edx, [rdi] # dpp->samples_A [1] = iptr [-4]; - mov [rax+20], edx - jmp done - - .balign 64 - -term_minus_1_loop: - movq mm3, [rdi+rsi] # mm3 = previous calculated value - movq mm2, [rdi] # mm2 = left_right - psrlq mm3, 32 - punpckldq mm3, mm2 # mm3 = sam_AB - - movq mm1, mm3 - pslld mm1, 17 - psrld mm1, 17 - pmaddwd mm1, mm5 - - movq mm0, mm3 - pslld mm0, 1 - psrld mm0, 16 - pmaddwd mm0, mm5 - - pslld mm0, 5 - paddd mm1, mm7 # add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 # add shifted sums - movq mm0, mm3 - movq [rdi+rbx], mm2 # store result - pxor mm0, mm2 - psrad mm0, 31 # mm0 = sign (sam_AB ^ left_right) - sub rdi, rsi - pxor mm1, mm1 # mm1 = zero - pcmpeqd mm2, mm1 # mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 # mm3 = 1s if sam_AB was zero - por mm2, mm3 # mm2 = 1s if either was zero - pandn mm2, mm6 # mask delta with zeros check - pcmpeqd mm1, mm1 - psubd mm1, mm7 - psubd mm1, mm7 - psubd mm1, mm0 - pxor mm5, mm0 - paddd mm5, mm1 - paddusw mm5, mm2 # and add to weight_AB - psubd mm5, mm1 - pxor mm5, mm0 - paddd mm4, mm5 # add weights to sum - dec ecx - jnz term_minus_1_loop - - mov rax, [rsp] # access dpp - movq [rax+8], mm5 # put weight_AB back - movq [rax+88], mm4 # put sum_AB back - emms - - add rdi, rsi # back up a full sample - mov edx, [rdi+4] # dpp->samples_A [0] = iptr [-1]; - mov rax, [rsp] - mov [rax+16], edx - jmp done - - .balign 64 - -term_minus_2_loop: - movq mm2, [rdi] # mm2 = left_right - movq mm3, mm2 # mm3 = swap dwords - psrlq mm3, 32 - punpckldq mm3, [rdi+rsi] # mm3 = sam_AB - - movq mm1, mm3 - pslld mm1, 17 - psrld mm1, 17 - pmaddwd mm1, mm5 - - movq mm0, mm3 - pslld mm0, 1 - psrld mm0, 16 - pmaddwd mm0, mm5 - - pslld mm0, 5 - paddd mm1, mm7 # add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 # add shifted sums - movq mm0, mm3 - movq [rdi+rbx], mm2 # store result - pxor mm0, mm2 - psrad mm0, 31 # mm0 = sign (sam_AB ^ left_right) - sub rdi, rsi - pxor mm1, mm1 # mm1 = zero - pcmpeqd mm2, mm1 # mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 # mm3 = 1s if sam_AB was zero - por mm2, mm3 # mm2 = 1s if either was zero - pandn mm2, mm6 # mask delta with zeros check - pcmpeqd mm1, mm1 - psubd mm1, mm7 - psubd mm1, mm7 - psubd mm1, mm0 - pxor mm5, mm0 - paddd mm5, mm1 - paddusw mm5, mm2 # and add to weight_AB - psubd mm5, mm1 - pxor mm5, mm0 - paddd mm4, mm5 # add weights to sum - dec ecx - jnz term_minus_2_loop - - mov rax, [rsp] # access dpp - movq [rax+8], mm5 # put weight_AB back - movq [rax+88], mm4 # put sum_AB back - emms - - add rdi, rsi # back up a full sample - mov edx, [rdi] # dpp->samples_B [0] = iptr [-2]; - mov rax, [rsp] - mov [rax+48], edx - jmp done - - .balign 64 - -term_minus_3_loop: - movq mm0, [rdi+rsi] # mm0 = previous calculated value - movq mm3, mm0 # mm3 = swap dwords - psrlq mm3, 32 - punpckldq mm3, mm0 # mm3 = sam_AB - - movq mm1, mm3 - pslld mm1, 17 - psrld mm1, 17 - pmaddwd mm1, mm5 - - movq mm0, mm3 - pslld mm0, 1 - psrld mm0, 16 - pmaddwd mm0, mm5 - - movq mm2, [rdi] # mm2 = left_right - pslld mm0, 5 - paddd mm1, mm7 # add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 # add shifted sums - movq mm0, mm3 - movq [rdi+rbx], mm2 # store result - pxor mm0, mm2 - psrad mm0, 31 # mm0 = sign (sam_AB ^ left_right) - sub rdi, rsi - pxor mm1, mm1 # mm1 = zero - pcmpeqd mm2, mm1 # mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 # mm3 = 1s if sam_AB was zero - por mm2, mm3 # mm2 = 1s if either was zero - pandn mm2, mm6 # mask delta with zeros check - pcmpeqd mm1, mm1 - psubd mm1, mm7 - psubd mm1, mm7 - psubd mm1, mm0 - pxor mm5, mm0 - paddd mm5, mm1 - paddusw mm5, mm2 # and add to weight_AB - psubd mm5, mm1 - pxor mm5, mm0 - paddd mm4, mm5 # add weights to sum - dec ecx - jnz term_minus_3_loop - - mov rax, [rsp] # access dpp - movq [rax+8], mm5 # put weight_AB back - movq [rax+88], mm4 # put sum_AB back - emms - - add rdi, rsi # back up a full sample - mov edx, [rdi+4] # dpp->samples_A [0] = iptr [-1]; - mov rax, [rsp] - mov [rax+16], edx - mov edx, [rdi] # dpp->samples_B [0] = iptr [-2]; - mov [rax+48], edx - -done: add rsp, 8 - pop rsi - pop rdi - pop rbx - pop rbp - ret - - -# This is an assembly optimized version of the following WavPack function: -# -# uint32_t decorr_mono_buffer (int32_t *buffer, -# struct decorr_pass *decorr_passes, -# int32_t num_terms, -# int32_t sample_count) -# -# Decorrelate a buffer of mono samples, in place, as specified by the array -# of decorr_pass structures. Note that this function does NOT return the -# dpp->samples_X[] values in the "normalized" positions for terms 1-8, so if -# the number of samples is not a multiple of MAX_TERM, these must be moved if -# they are to be used somewhere else. The magnitude of the output samples is -# accumulated and returned (see scan_max_magnitude() for more details). By -# using the overflow detection of the multiply instruction, this detects -# when the "long_math" varient is required. -# -# For the fastest possible operation with the four "common" decorrelation -# filters (i.e, fast, normal, high and very high) this function can be -# configured to include hardcoded versions of these filters that are created -# using macros. In that case, the passed filter is checked to make sure that -# it matches one of the four. If it doesn't, or if the hardcoded flters are -# not enabled, a "general" version of the decorrelation loop is used. This -# variable enables the hardcoded filters and can be disabled if there are -# problems with the code or macros: - - HARDCODED_FILTERS = 1 - -# Entry points for both the System V ABI and the Windows X64 ABI are provided. -# It does not use the "red zone" or the "shadow area"; it saves the -# non-volatile registers for both ABIs on the stack and allocates another -# 24 bytes on the stack to store the dpp pointer and the sample count. Note -# that it does NOT provide unwind data for the Windows ABI (the unpack_x64.asm -# module for MSVC does). The arguments are passed in registers: -# -# System V Windows -# int32_t *buffer rdi rcx -# struct decorr_pass *dpp rsi rdx -# int32_t num_terms rdx r8 -# int32_t sample_count ecx r9 -# -# stack usage: -# -# [rsp+8] = sample_count -# [rsp+0] = decorr_passes (unused in hardcoded filter case) -# -# register usage: -# -# ecx = sample being decorrelated -# esi = sample up counter -# rdi = *buffer -# rbp = *dpp -# r8 = magnitude accumulator -# r9 = dpp end ptr (unused in hardcoded filter case) -# - .if HARDCODED_FILTERS -# -# This macro is used for checking the decorr_passes array to make sure that the terms match -# the hardcoded terms. The terms of these filters are the first element in the tables defined -# in decorr_tables.h (with the negative terms replaced with 1). -# - - .macro chkterm term rbp_offset - cmp BYTE PTR [rbp], \term - jnz use_general_version - add rbp, \rbp_offset - .endm -# -# This macro processes the single specified term (with a fixed delta of 2) and updates the -# term pointer (rbp) with the specified offset when done. It assumes the following registers: -# -# ecx = sample being decorrelated -# esi = sample up counter (used for terms 1-8) -# rbp = decorr_pass pointer for this term (updated with "rbp_offset" when done) -# rax, rbx, rdx = scratch -# - .macro exeterm term rbp_offset - - .if \term <= 8 - mov eax, esi - and eax, 7 - mov ebx, [rbp+16+rax*4] - .if \term != 8 - add eax, \term - and eax, 7 - .endif - mov [rbp+16+rax*4], ecx - - .elseif \term == 17 - - mov edx, [rbp+16] # handle term 17 - mov [rbp+16], ecx - lea ebx, [rdx+rdx] - sub ebx, [rbp+20] - mov [rbp+20], edx - - .else - - mov edx, [rbp+16] # handle term 18 - mov [rbp+16], ecx - lea ebx, [rdx+rdx*2] - sub ebx, [rbp+20] - sar ebx, 1 - mov [rbp+20], edx - - .endif - - mov eax, [rbp+8] - imul eax, ebx # 32-bit multiply is almost always enough - jo 1f # but handle overflow if it happens - sar eax, 10 - sbb ecx, eax # borrow flag provides rounding - jmp 2f -1: mov eax, [rbp+8] # perform 64-bit multiply on overflow - imul ebx - shr eax, 10 - sbb ecx, eax - shl edx, 22 - sub ecx, edx -2: je 3f - test ebx, ebx - je 3f - xor ebx, ecx - sar ebx, 30 - or ebx, 1 # this generates delta of 1 - shl ebx, 1 # this generates delta of 2 - add [rbp+8], ebx -3: add rbp, \rbp_offset - - .endm - - .endif # end of macro definitions - -# entry points of function - -_pack_decorr_mono_buffer_x64win: -pack_decorr_mono_buffer_x64win: - push rbp - push rbx - push rdi - push rsi - sub rsp, 24 - mov rdi, rcx # copy params from win regs to Linux regs - mov rsi, rdx # so we can leave following code similar - mov rdx, r8 - mov rcx, r9 - jmp mentry - -_pack_decorr_mono_buffer_x64: -pack_decorr_mono_buffer_x64: - push rbp - push rbx - push rdi - push rsi - sub rsp, 24 - -mentry: mov [rsp+8], rcx # [rsp+8] = sample count - mov [rsp], rsi # [rsp+0] = decorr_passes - xor r8, r8 # r8 = max magnitude mask - xor esi, esi # up counter = 0 - - and ecx, ecx # test & handle zero sample count & zero term count - jz mexit - and edx, edx - jz mexit - - .if HARDCODED_FILTERS - -# first check to make sure all the "deltas" are 2 - - mov rbp, [rsp] # rbp is decorr_pass pointer - mov ebx, edx # get term count -deltas: cmp BYTE PTR [rbp+4], 2 # make sure all the deltas are 2 - jnz use_general_version # if any aren't, use general case - add rbp, 96 - dec ebx - jnz deltas - - mov rbp, [rsp] # rbp is decorr_pass pointer - cmp dl, 2 # 2 terms is "fast" - jnz nfast - chkterm 18, 96 # check "fast" terms - chkterm 17, -96 - jmp mono_fast_loop - -nfast: cmp dl, 5 # 5 terms is "normal" - jnz nnorm - chkterm 18, 96 # check "normal" terms - chkterm 18, 96 - chkterm 2, 96 - chkterm 17, 96 - chkterm 3, 96*-4 - jmp mono_normal_loop - -nnorm: cmp dl, 10 # 10 terms is "high" - jnz nhigh - chkterm 18, 96 # check "high" terms - chkterm 18, 96 - chkterm 18, 96 - chkterm 1, 96 - chkterm 2, 96 - chkterm 3, 96 - chkterm 5, 96 - chkterm 1, 96 - chkterm 17, 96 - chkterm 4, 96*-9 - jmp mono_high_loop - -nhigh: cmp dl, 16 # 16 terms is "very high" - jnz use_general_version # if none of these, use general version - chkterm 18, 96 # else check "very high" terms - chkterm 18, 96 - chkterm 2, 96 - chkterm 3, 96 - chkterm 1, 96 - chkterm 18, 96 - chkterm 2, 96 - chkterm 4, 96 - chkterm 7, 96 - chkterm 5, 96 - chkterm 3, 96 - chkterm 6, 96 - chkterm 8, 96 - chkterm 1, 96 - chkterm 18, 96 - chkterm 2, 96*-15 - jmp mono_vhigh_loop - - .balign 64 - -# hardcoded "fast" decorrelation loop - -mono_fast_loop: - mov ecx, [rdi+rsi*4] # ecx is the sample we're decorrelating - - exeterm 18, 96 - exeterm 17, -96 - - mov [rdi+rsi*4], ecx # store completed sample - mov eax, ecx # update magnitude mask - cdq - xor eax, edx - or r8, rax - inc esi # increment sample index - cmp esi, [rsp+8] - jnz mono_fast_loop # loop back for all samples - jmp mexit # then exit - - .balign 64 - -# hardcoded "normal" decorrelation loop - -mono_normal_loop: - mov ecx, [rdi+rsi*4] # ecx is the sample we're decorrelating - - exeterm 18, 96 - exeterm 18, 96 - exeterm 2, 96 - exeterm 17, 96 - exeterm 3, 96*-4 - - mov [rdi+rsi*4], ecx # store completed sample - mov eax, ecx # update magnitude mask - cdq - xor eax, edx - or r8, rax - inc esi # increment sample index - cmp esi, [rsp+8] - jnz mono_normal_loop # loop back for all samples - jmp mexit # then exit - - .balign 64 - -# hardcoded "high" decorrelation loop - -mono_high_loop: - mov ecx, [rdi+rsi*4] # ecx is the sample we're decorrelating - - exeterm 18, 96 - exeterm 18, 96 - exeterm 18, 96 - exeterm 1, 96 - exeterm 2, 96 - exeterm 3, 96 - exeterm 5, 96 - exeterm 1, 96 - exeterm 17, 96 - exeterm 4, 96*-9 - - mov [rdi+rsi*4], ecx # store completed sample - mov eax, ecx # update magnitude mask - cdq - xor eax, edx - or r8, rax - inc esi # increment sample index - cmp esi, [rsp+8] - jnz mono_high_loop # loop back for all samples - jmp mexit # then exit - - .balign 64 - -# hardcoded "very high" decorrelation loop - -mono_vhigh_loop: - mov ecx, [rdi+rsi*4] # ecx is the sample we're decorrelating - - exeterm 18, 96 - exeterm 18, 96 - exeterm 2, 96 - exeterm 3, 96 - exeterm 1, 96 - exeterm 18, 96 - exeterm 2, 96 - exeterm 4, 96 - exeterm 7, 96 - exeterm 5, 96 - exeterm 3, 96 - exeterm 6, 96 - exeterm 8, 96 - exeterm 1, 96 - exeterm 18, 96 - exeterm 2, 96*-15 - - mov [rdi+rsi*4], ecx # store completed sample - mov eax, ecx # update magnitude mask - cdq - xor eax, edx - or r8, rax - inc esi # increment sample index - cmp esi, [rsp+8] - jnz mono_vhigh_loop # loop back for all samples - jmp mexit # then exit - - .endif # end of hardcoded filters configuration - -# when none of the hardcoded filters are applicable, or we aren't using them, fall through to here - -use_general_version: - mov rbp, [rsp] # reload decorr_passes pointer to first term - imul rax, rdx, 96 - add rax, rbp # r9 = terminating decorr_pass pointer - mov r9, rax - jmp decorrelate_loop - - .balign 64 - -decorrelate_loop: - mov ecx, [rdi+rsi*4] # ecx is the sample we're decorrelating -nxterm: mov edx, [rbp] - cmp dl, 17 - jge 3f - - mov eax, esi - and eax, 7 - mov ebx, [rbp+16+rax*4] - add eax, edx - and eax, 7 - mov [rbp+16+rax*4], ecx - jmp domult - - .balign 4 -3: mov edx, [rbp+16] - mov [rbp+16], ecx - je 4f - lea ebx, [rdx+rdx*2] - sub ebx, [rbp+20] - sar ebx, 1 - mov [rbp+20], edx - jmp domult - - .balign 4 -4: lea ebx, [rdx+rdx] - sub ebx, [rbp+20] - mov [rbp+20], edx - -domult: mov eax, [rbp+8] - mov edx, eax - imul eax, ebx - jo multov # on overflow, jump to use 64-bit imul varient - sar eax, 10 - sbb ecx, eax - je 2f - test ebx, ebx - je 2f - xor ebx, ecx - sar ebx, 31 - xor edx, ebx - add edx, [rbp+4] - xor edx, ebx - mov [rbp+8], edx -2: add rbp, 96 - cmp rbp, r9 - jnz nxterm - - mov [rdi+rsi*4], ecx # store completed sample - mov eax, ecx # update magnitude mask - cdq - xor eax, edx - or r8, rax - mov rbp, [rsp] # reload decorr_passes pointer to first term - inc esi # increment sample index - cmp esi, [rsp+8] - jnz decorrelate_loop - jmp mexit - - .balign 4 -multov: mov eax, [rbp+8] - imul ebx - shr eax, 10 - sbb ecx, eax - shl edx, 22 - sub ecx, edx - je 2f - test ebx, ebx - je 2f - xor ebx, ecx - sar ebx, 31 - mov eax, [rbp+8] - xor eax, ebx - add eax, [rbp+4] - xor eax, ebx - mov [rbp+8], eax -2: add rbp, 96 - cmp rbp, r9 - jnz nxterm - - mov [rdi+rsi*4], ecx # store completed sample - mov eax, ecx # update magnitude mask - cdq - xor eax, edx - or r8, rax - mov rbp, [rsp] # reload decorr_passes pointer to first term - inc esi # increment sample index - cmp esi, [rsp+8] - jnz decorrelate_loop # loop all the way back - -# common exit for entire function - -mexit: mov rax, r8 # return max magnitude - add rsp, 24 - pop rsi - pop rdi - pop rbx - pop rbp - ret - - -# This is an assembly optimized version of the following WavPack function: -# -# void decorr_mono_pass_cont (int32_t *out_buffer, -# int32_t *in_buffer, -# struct decorr_pass *dpp, -# int32_t sample_count); -# -# It performs a single pass of mono decorrelation, transfering from the -# input buffer to the output buffer. Note that this version of the function -# requires that the up to 8 previous (depending on dpp->term) mono samples -# are visible and correct. In other words, it ignores the "samples_*" -# fields in the decorr_pass structure and gets the history data directly -# from the source buffer. It does, however, return the appropriate history -# samples to the decorr_pass structure before returning. -# -# By using the overflow detection of the multiply instruction, it detects -# when the "long_math" varient is required and automatically does it. -# -# This version has entry points for both the System V ABI and the Windows -# X64 ABI. It does not use the "red zone" or the "shadow area"; it saves the -# non-volatile registers for both ABIs on the stack and allocates another -# 8 bytes on the stack to store the dpp pointer. Note that it does NOT -# provide unwind data for the Windows ABI (the pack_x64.asm module for -# MSVC does). The arguments are passed in registers: -# -# System V Windows -# int32_t *out_buffer rdi rcx -# int32_t *in_buffer rsi rdx -# struct decorr_pass *dpp rdx r8 -# int32_t sample_count ecx r9 -# -# Stack usage: -# -# [rsp+0] = *dpp -# -# Register usage: -# -# rsi = source ptr -# rdi = destination ptr -# rcx = term * -4 (default terms) -# rcx = previous sample (terms 17 & 18) -# ebp = weight -# r8d = delta -# r9d = weight sum -# r10 = eptr -# - -_pack_decorr_mono_pass_cont_x64win: -pack_decorr_mono_pass_cont_x64win: - push rbp - push rbx - push rdi - push rsi - sub rsp, 8 - mov rdi, rcx # copy params from win regs to Linux regs - mov rsi, rdx # so we can leave following code similar - mov rdx, r8 - mov rcx, r9 - jmp menter - -_pack_decorr_mono_pass_cont_x64: -pack_decorr_mono_pass_cont_x64: - push rbp - push rbx - push rdi - push rsi - sub rsp, 8 - -menter: mov [rsp], rdx - and ecx, ecx # test & handle zero sample count - jz mono_done - - cld - mov r8d, [rdx+4] # rd8 = delta - mov ebp, [rdx+8] # ebp = weight - mov r9d, [rdx+88] # r9d = weight sum - lea r10, [rsi+rcx*4] # r10 = eptr - mov ecx, [rsi-4] # preload last sample - mov eax, [rdx] # get term - cmp al, 17 - je mono_term_17_loop - cmp al, 18 - je mono_term_18_loop - - imul rcx, rax, -4 # rcx is index to correlation sample - jmp mono_default_term_loop - - .balign 64 - -mono_default_term_loop: - mov edx, [rsi+rcx] - mov ebx, edx - imul edx, ebp - jo 1f - lodsd - sar edx, 10 - sbb eax, edx - jmp 2f -1: mov eax, ebx - imul ebp - shl edx, 22 - shr eax, 10 - adc edx, eax # edx = apply_weight (sam_A) - lodsd - sub eax, edx -2: stosd - je 3f - test ebx, ebx - je 3f - xor eax, ebx - cdq - xor ebp, edx - add ebp, r8d - xor ebp, edx -3: add r9d, ebp - cmp rsi, r10 - jnz mono_default_term_loop - - mov rdx, [rsp] # rdx = *dpp - mov [rdx+8], ebp # put weight back - mov [rdx+88], r9d # put weight sum back - movsxd rcx, DWORD PTR [rdx] # rcx = dpp->term - -mono_default_store_samples: - dec rcx - sub rsi, 4 # back up one sample - mov eax, [rsi] - mov [rdx+rcx*4+16], eax # store samples_A [ecx] - test rcx, rcx - jnz mono_default_store_samples - jmp mono_done - - .balign 64 - -mono_term_17_loop: - lea edx, [rcx+rcx] - sub edx, [rsi-8] # ebx = sam_A - mov ebx, edx - imul edx, ebp - jo 1f - sar edx, 10 - lodsd - mov ecx, eax - sbb eax, edx - jmp 2f -1: mov eax, ebx - imul ebp - shl edx, 22 - shr eax, 10 - adc edx, eax # edx = apply_weight (sam_A) - lodsd - mov ecx, eax - sub eax, edx -2: stosd - je 3f - test ebx, ebx - je 3f - xor eax, ebx - cdq - xor ebp, edx - add ebp, r8d - xor ebp, edx -3: add r9d, ebp - cmp rsi, r10 - jnz mono_term_17_loop - jmp mono_term_1718_exit - - .balign 64 - -mono_term_18_loop: - lea edx, [rcx+rcx*2] - sub edx, [rsi-8] - sar edx, 1 - mov ebx, edx # ebx = sam_A - imul edx, ebp - jo 1f - sar edx, 10 - lodsd - mov ecx, eax - sbb eax, edx - jmp 2f -1: mov eax, ebx - imul ebp - shl edx, 22 - shr eax, 10 - adc edx, eax # edx = apply_weight (sam_A) - lodsd - mov ecx, eax - sub eax, edx -2: stosd - je 3f - test ebx, ebx - je 3f - xor eax, ebx - cdq - xor ebp, edx - add ebp, r8d - xor ebp, edx -3: add r9d, ebp - cmp rsi, r10 - jnz mono_term_18_loop - -mono_term_1718_exit: - mov rdx, [rsp] # rdx = *dpp - mov [rdx+8], ebp # put weight back - mov [rdx+88], r9d # put weight sum back - mov eax, [rsi-4] # dpp->samples_A [0] = bptr [-1] - mov [rdx+16], eax - mov eax, [rsi-8] # dpp->samples_A [1] = bptr [-2] - mov [rdx+20], eax - -mono_done: - add rsp, 8 - pop rsi - pop rdi - pop rbx - pop rbp - ret - - -# This is an assembly optimized version of the following WavPack function: -# -# uint32_t scan_max_magnitude (int32_t *buffer, int32_t sample_count); -# -# This function scans a buffer of signed 32-bit ints and returns the magnitude -# of the largest sample, with a power-of-two resolution. It might be more -# useful to return the actual maximum absolute value, but that implementation -# would be slower. Instead, this simply returns the "or" of all the values -# "xor"d with their own sign, like so: -# -# while (sample_count--) -# magnitude |= (*buffer < 0) ? ~*buffer++ : *buffer++; -# -# This is written to work on an X86-64 processor (also called the AMD64) -# running in 64-bit mode and uses the MMX extensions to improve the -# performance by processing two samples together. -# -# This version has entry points for both the System V ABI and the Windows -# X64 ABI. It does not use the "red zone" or the "shadow area"; it saves the -# non-volatile registers for both ABIs on the stack and allocates another -# 8 bytes on the stack so that it's properly aligned. Note that it does NOT -# provide unwind data for the Windows ABI (the unpack_x64.asm module for -# MSVC does). The arguments are passed in registers: -# -# System V Windows -# int32_t *buffer rdi rcx -# int32_t sample_count rsi rdx -# -# During the processing loops, the following registers are used: -# -# rdi buffer pointer -# rsi termination buffer pointer -# ebx single magnitude accumulator -# mm0 dual magnitude accumulator -# mm1, mm2 scratch -# - -_scan_max_magnitude_x64win: -scan_max_magnitude_x64win: - push rbp - push rbx - push rdi - push rsi - sub rsp, 8 - mov rdi, rcx # copy params from win regs to Linux regs - mov rsi, rdx # so we can leave following code similar - mov rdx, r8 - mov rcx, r9 - jmp senter - -_scan_max_magnitude_x64: -scan_max_magnitude_x64: - push rbp - push rbx - push rdi - push rsi - sub rsp, 8 - -senter: xor ebx, ebx # clear magnitude accumulator - - mov eax, esi # eax = count - and eax, 7 - mov ecx, eax # ecx = leftover samples to "manually" scan at end - - shr esi, 3 # esi = num of loops to process mmx (8 samples/loop) - shl esi, 5 # esi = num of bytes to process mmx (32 bytes/loop) - jz nommx # jump around if no mmx loops to do (< 8 samples) - - pxor mm0, mm0 # clear dual magnitude accumulator - add rsi, rdi # rsi = termination buffer pointer for mmx loop - jmp mmxlp - - .balign 64 - -mmxlp: movq mm1, [rdi] # get stereo samples in mm1 & mm2 - movq mm2, mm1 - psrad mm1, 31 # mm1 = sign (mm2) - pxor mm1, mm2 # mm1 = absolute magnitude, or into result - por mm0, mm1 - - movq mm1, [rdi+8] # do it again with 6 more samples - movq mm2, mm1 - psrad mm1, 31 - pxor mm1, mm2 - por mm0, mm1 - - movq mm1, [rdi+16] - movq mm2, mm1 - psrad mm1, 31 - pxor mm1, mm2 - por mm0, mm1 - - movq mm1, [rdi+24] - movq mm2, mm1 - psrad mm1, 31 - pxor mm1, mm2 - por mm0, mm1 - - add rdi, 32 - cmp rdi, rsi - jnz mmxlp - - movd eax, mm0 # ebx = "or" of high and low mm0 - punpckhdq mm0, mm0 - movd ebx, mm0 - or ebx, eax - emms - -nommx: and ecx, ecx # any leftover samples to do? - jz noleft - -leftlp: mov eax, [rdi] - cdq - xor eax, edx - or ebx, eax - add rdi, 4 - loop leftlp - -noleft: mov eax, ebx # move magnitude to eax for return - add rsp, 8 - pop rsi - pop rdi - pop rbx - pop rbp - ret - - -# This is an assembly optimized version of the following WavPack function: -# -# uint32_t log2buffer (int32_t *samples, uint32_t num_samples, int limit); -# -# This function scans a buffer of 32-bit ints and accumulates the total -# log2 value of all the samples. This is useful for determining maximum -# compression because the bitstream storage required for entropy coding -# is proportional to the base 2 log of the samples. -# -# This is written to work on an X86-64 processor (also called the AMD64) -# running in 64-bit mode. This version has entry points for both the System -# V ABI and the Windows X64 ABI. It does not use the "red zone" or the -# "shadow area"; it saves the non-volatile registers for both ABIs on the -# stack and allocates another 8 bytes on the stack so it's aligned properly. -# Note that it does NOT provide unwind data for the Windows ABI (but the -# unpack_x64.asm module for MSVC does). The arguments are passed in registers: -# -# System V Windows -# int32_t *samples rdi rcx -# uint32_t num_samples esi rdx -# int limit edx r8 -# -# During the processing loops, the following registers are used: -# -# r8 pointer to the 256-byte log fraction table -# rsi input buffer pointer -# edi sum accumulator -# ebx sample count -# ebp limit (if specified non-zero) -# eax,ecx,edx scratch -# - - .balign 256 - -log2_table: - .byte 0x00, 0x01, 0x03, 0x04, 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0d, 0x0e, 0x10, 0x11, 0x12, 0x14, 0x15 - .byte 0x16, 0x18, 0x19, 0x1a, 0x1c, 0x1d, 0x1e, 0x20, 0x21, 0x22, 0x24, 0x25, 0x26, 0x28, 0x29, 0x2a - .byte 0x2c, 0x2d, 0x2e, 0x2f, 0x31, 0x32, 0x33, 0x34, 0x36, 0x37, 0x38, 0x39, 0x3b, 0x3c, 0x3d, 0x3e - .byte 0x3f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4d, 0x4e, 0x4f, 0x50, 0x51 - .byte 0x52, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63 - .byte 0x64, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x74, 0x75 - .byte 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85 - .byte 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95 - .byte 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4 - .byte 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb2 - .byte 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc0 - .byte 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcb, 0xcc, 0xcd, 0xce - .byte 0xcf, 0xd0, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd8, 0xd9, 0xda, 0xdb - .byte 0xdc, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe4, 0xe5, 0xe6, 0xe7, 0xe7 - .byte 0xe8, 0xe9, 0xea, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xee, 0xef, 0xf0, 0xf1, 0xf1, 0xf2, 0xf3, 0xf4 - .byte 0xf4, 0xf5, 0xf6, 0xf7, 0xf7, 0xf8, 0xf9, 0xf9, 0xfa, 0xfb, 0xfc, 0xfc, 0xfd, 0xfe, 0xff, 0xff - -_log2buffer_x64win: -log2buffer_x64win: - push rbp - push rbx - push rdi - push rsi - sub rsp, 8 - mov rdi, rcx # copy params from win regs to Linux regs - mov rsi, rdx # so we can leave following code similar - mov rdx, r8 - mov rcx, r9 - jmp log2bf - -_log2buffer_x64: -log2buffer_x64: - push rbp - push rbx - push rdi - push rsi - sub rsp, 8 - -log2bf: mov ebx, esi # ebx = num_samples - mov rsi, rdi # rsi = *samples - xor edi, edi # initialize sum - lea r8, [log2_table+rip] - test ebx, ebx # test count for zero - jz normal_exit - mov ebp, edx # ebp = limit - test ebp, ebp # we have separate loops for limit and no limit - jz no_limit_loop - jmp limit_loop - - .balign 64 - -limit_loop: - mov eax, [rsi] # get next sample into eax - cdq # edx = sign of sample (for abs) - add rsi, 4 - xor eax, edx - sub eax, edx - je L40 # skip if sample was zero - mov edx, eax # move to edx and apply rounding - shr eax, 9 - add edx, eax - bsr ecx, edx # ecx = MSB set in sample (0 - 31) - lea eax, [ecx+1] # eax = number used bits in sample (1 - 32) - sub ecx, 8 # ecx = shift right amount (-8 to 23) - ror edx, cl # use rotate to do "signed" shift - shl eax, 8 # move nbits to integer portion of log - movzx edx, dl # dl = mantissa, look up log fraction in table - mov al, [r8+rdx] # eax = combined integer and fraction for full log - add edi, eax # add to running sum and compare to limit - cmp eax, ebp - jge limit_exceeded -L40: sub ebx, 1 # loop back if more samples - jne limit_loop - jmp normal_exit - - .balign 64 - -no_limit_loop: - mov eax, [rsi] # get next sample into eax - cdq # edx = sign of sample (for abs) - add rsi, 4 - xor eax, edx - sub eax, edx - je L45 # skip if sample was zero - mov edx, eax # move to edx and apply rounding - shr eax, 9 - add edx, eax - bsr ecx, edx # ecx = MSB set in sample (0 - 31) - lea eax, [ecx+1] # eax = number used bits in sample (1 - 32) - sub ecx, 8 # ecx = shift right amount (-8 to 23) - ror edx, cl # use rotate to do "signed" shift - shl eax, 8 # move nbits to integer portion of log - movzx edx, dl # dl = mantissa, look up log fraction in table - mov al, [r8+rdx] # eax = combined integer and fraction for full log - add edi, eax # add to running sum -L45: sub ebx, 1 - jne no_limit_loop - jmp normal_exit - -limit_exceeded: - mov edi, -1 # return -1 to indicate limit hit -normal_exit: - mov eax, edi # move sum accumulator into eax for return - add rsp, 8 - pop rsi - pop rdi - pop rbx - pop rbp - ret - -#ifdef __ELF__ - .section .note.GNU-stack,"",@progbits -#endif - diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack_x64.asm b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack_x64.asm deleted file mode 100644 index 2a4b5516..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack_x64.asm +++ /dev/null @@ -1,1852 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; **** WAVPACK **** ;; -;; Hybrid Lossless Wavefile Compressor ;; -;; Copyright (c) 1998 - 2015 Conifer Software. ;; -;; All Rights Reserved. ;; -;; Distributed under the BSD Software License (see license.txt) ;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - include - - public pack_decorr_stereo_pass_cont_rev_x64win - public pack_decorr_stereo_pass_cont_x64win - -asmcode segment page 'CODE' - -; This module contains X64 assembly optimized versions of functions required -; to encode WavPack files. - -; This is an assembly optimized version of the following WavPack function: -; -; void pack_decorr_stereo_pass ( -; struct decorr_pass *dpp, -; int32_t *buffer, -; int32_t sample_count); -; -; It performs a single pass of stereo decorrelation, in place, as specified -; by the decorr_pass structure. Note that this function does NOT return the -; dpp->samples_X[] values in the "normalized" positions for terms 1-8, so if -; the number of samples is not a multiple of MAX_TERM, these must be moved if -; they are to be used somewhere else. -; -; This is written to work on an X86-64 processor (also called the AMD64) -; running in 64-bit mode and uses the MMX extensions to improve the -; performance by processing both stereo channels together. It is based on -; the original MMX code written by Joachim Henke that used MMX intrinsics -; called from C. Many thanks to Joachim for that! -; -; An issue with using MMX for this is that the sample history array in the -; decorr_pass structure contains separate arrays for each channel while the -; MMX code wants there to be a single array of dual samples. The fix for -; this is to convert the data in the arrays on entry and exit, and this is -; made easy by the fact that the 8 MMX regsiters hold exactly the required -; amount of data (64 bytes)! -; -; This is written to work on an X86-64 processor (also called the AMD64) -; running in 64-bit mode. This version is for the 64-bit Windows ABI and -; provides appropriate prologs and epilogs for stack unwinding. The -; arguments are passed in registers: -; -; struct decorr_pass *dpp rcx -; int32_t *buffer rdx -; int32_t sample_count r8d -; -; During the processing loops, the following registers are used: -; -; rdi buffer pointer -; rsi termination buffer pointer -; rax,rbx,rdx used in default term to reduce calculation -; rbp decorr_pass pointer -; mm0, mm1 scratch -; mm2 original sample values -; mm3 correlation samples -; mm4 0 (for pcmpeqd) -; mm5 weights -; mm6 delta -; mm7 512 (for rounding) -; - -pack_decorr_stereo_pass_x64win proc frame - push_reg rbp ; save non-volatile registers on stack - push_reg rbx ; (alphabetically) - push_reg rdi - push_reg rsi - alloc_stack 8 ; allocate 8 bytes on stack & align to 16 bytes - end_prologue - - mov rdi, rcx ; copy params from win regs to Linux regs - mov rsi, rdx ; so we can leave following code similar - mov rdx, r8 - mov rcx, r9 - - mov rbp, rdi ; rbp = *dpp - mov rdi, rsi ; rdi = inbuffer - mov esi, edx - sal esi, 3 - jz bdone - add rsi, rdi ; rsi = termination buffer pointer - - ; convert samples_A and samples_B array into samples_AB array for MMX - ; (the MMX registers provide exactly enough storage to do this easily) - - movq mm0, [rbp+16] - punpckldq mm0, [rbp+48] - movq mm1, [rbp+16] - punpckhdq mm1, [rbp+48] - movq mm2, [rbp+24] - punpckldq mm2, [rbp+56] - movq mm3, [rbp+24] - punpckhdq mm3, [rbp+56] - movq mm4, [rbp+32] - punpckldq mm4, [rbp+64] - movq mm5, [rbp+32] - punpckhdq mm5, [rbp+64] - movq mm6, [rbp+40] - punpckldq mm6, [rbp+72] - movq mm7, [rbp+40] - punpckhdq mm7, [rbp+72] - - movq [rbp+16], mm0 - movq [rbp+24], mm1 - movq [rbp+32], mm2 - movq [rbp+40], mm3 - movq [rbp+48], mm4 - movq [rbp+56], mm5 - movq [rbp+64], mm6 - movq [rbp+72], mm7 - - mov eax, 512 - movd mm7, eax - punpckldq mm7, mm7 ; mm7 = round (512) - - mov eax, [rbp+4] - movd mm6, eax - punpckldq mm6, mm6 ; mm6 = delta (0-7) - - mov eax, 0FFFFh ; mask high weights to zero for PMADDWD - movd mm5, eax - punpckldq mm5, mm5 ; mm5 = weight mask 0x0000FFFF0000FFFF - pand mm5, [rbp+8] ; mm5 = weight_AB masked to 16-bit - - movq mm4, [rbp+16] ; preload samples_AB[0] - - mov al, [rbp] ; get term and vector to correct loop - cmp al, 17 - je buff_term_17_loop - cmp al, 18 - je buff_term_18_loop - cmp al, -1 - je buff_term_minus_1_loop - cmp al, -2 - je buff_term_minus_2_loop - cmp al, -3 - je buff_term_minus_3_loop - - pxor mm4, mm4 ; mm4 = 0 (for pcmpeqd) - xor eax, eax - xor ebx, ebx - add bl, [rbp] - mov ecx, 7 - and ebx, ecx - jmp buff_default_term_loop - - align 64 - -buff_default_term_loop: - movq mm2, [rdi] ; mm2 = left_right - movq mm3, [rbp+16+rax*8] - inc eax - and eax, ecx - movq [rbp+16+rbx*8], mm2 - inc ebx - and ebx, ecx - - movq mm1, mm3 - paddd mm1, mm1 - psrlw mm1, 1 - pmaddwd mm1, mm5 - - movq mm0, mm3 - psrld mm0, 15 - pmaddwd mm0, mm5 - - pslld mm0, 5 - paddd mm1, mm7 ; add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 ; add shifted sums - movq mm0, mm3 - movq [rdi], mm2 ; store result - pxor mm0, mm2 - psrad mm0, 31 ; mm0 = sign (sam_AB ^ left_right) - add rdi, 8 - pcmpeqd mm2, mm4 ; mm2 = 1s if left_right was zero - pcmpeqd mm3, mm4 ; mm3 = 1s if sam_AB was zero - por mm2, mm3 ; mm2 = 1s if either was zero - pandn mm2, mm6 ; mask delta with zeros check - pxor mm5, mm0 - paddw mm5, mm2 ; and add to weight_AB - pxor mm5, mm0 - cmp rdi, rsi - jnz buff_default_term_loop - - jmp bdone - - align 64 - -buff_term_17_loop: - movq mm3, mm4 ; get previous calculated value - paddd mm3, mm4 - psubd mm3, [rbp+24] - movq [rbp+24], mm4 - - movq mm1, mm3 - paddd mm1, mm1 - psrlw mm1, 1 - pmaddwd mm1, mm5 - - movq mm0, mm3 - psrld mm0, 15 - pmaddwd mm0, mm5 - - movq mm2, [rdi] ; mm2 = left_right - movq mm4, mm2 - pslld mm0, 5 - paddd mm1, mm7 ; add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 ; add shifted sums - movq mm0, mm3 - movq [rdi], mm2 ; store result - pxor mm1, mm1 - pxor mm0, mm2 - psrad mm0, 31 ; mm0 = sign (sam_AB ^ left_right) - add rdi, 8 - pcmpeqd mm2, mm1 ; mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 ; mm3 = 1s if sam_AB was zero - por mm2, mm3 ; mm2 = 1s if either was zero - pandn mm2, mm6 ; mask delta with zeros check - pxor mm5, mm0 - paddw mm5, mm2 ; and add to weight_AB - pxor mm5, mm0 - cmp rdi, rsi - jnz buff_term_17_loop - - movq [rbp+16], mm4 ; post-store samples_AB[0] - jmp bdone - - align 64 - -buff_term_18_loop: - movq mm3, mm4 ; get previous calculated value - psubd mm3, [rbp+24] - psrad mm3, 1 - paddd mm3, mm4 ; mm3 = sam_AB - movq [rbp+24], mm4 - - movq mm1, mm3 - paddd mm1, mm1 - psrlw mm1, 1 - pmaddwd mm1, mm5 - - movq mm0, mm3 - psrld mm0, 15 - pmaddwd mm0, mm5 - - movq mm2, [rdi] ; mm2 = left_right - movq mm4, mm2 - pslld mm0, 5 - paddd mm1, mm7 ; add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 ; add shifted sums - movq mm0, mm3 - movq [rdi], mm2 ; store result - pxor mm1, mm1 - pxor mm0, mm2 - psrad mm0, 31 ; mm0 = sign (sam_AB ^ left_right) - add rdi, 8 - pcmpeqd mm2, mm1 ; mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 ; mm3 = 1s if sam_AB was zero - por mm2, mm3 ; mm2 = 1s if either was zero - pandn mm2, mm6 ; mask delta with zeros check - pxor mm5, mm0 - paddw mm5, mm2 ; and add to weight_AB - pxor mm5, mm0 - cmp rdi, rsi - jnz buff_term_18_loop - - movq [rbp+16], mm4 ; post-store samples_AB[0] - jmp bdone - - align 64 - -buff_term_minus_1_loop: - movq mm3, mm4 ; mm3 = previous calculated value - movq mm2, [rdi] ; mm2 = left_right - movq mm4, mm2 - psrlq mm4, 32 - punpckldq mm3, mm2 ; mm3 = sam_AB - - movq mm1, mm3 - paddd mm1, mm1 - psrlw mm1, 1 - pmaddwd mm1, mm5 - - movq mm0, mm3 - psrld mm0, 15 - pmaddwd mm0, mm5 - - pslld mm0, 5 - paddd mm1, mm7 ; add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 ; add shifted sums - movq mm0, mm3 - movq [rdi], mm2 ; store result - pxor mm1, mm1 - pxor mm0, mm2 - psrad mm0, 31 ; mm0 = sign (sam_AB ^ left_right) - add rdi, 8 - pcmpeqd mm2, mm1 ; mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 ; mm3 = 1s if sam_AB was zero - por mm2, mm3 ; mm2 = 1s if either was zero - pandn mm2, mm6 ; mask delta with zeros check - pcmpeqd mm1, mm1 - psubd mm1, mm7 - psubd mm1, mm7 - psubd mm1, mm0 - pxor mm5, mm0 - paddw mm5, mm1 - paddusw mm5, mm2 ; and add to weight_AB - psubw mm5, mm1 - pxor mm5, mm0 - cmp rdi, rsi - jnz buff_term_minus_1_loop - - movq [rbp+16], mm4 ; post-store samples_AB[0] - jmp bdone - - align 64 - -buff_term_minus_2_loop: - movq mm2, [rdi] ; mm2 = left_right - movq mm3, mm2 - psrlq mm3, 32 - por mm3, mm4 - punpckldq mm4, mm2 - - movq mm1, mm3 - paddd mm1, mm1 - psrlw mm1, 1 - pmaddwd mm1, mm5 - - movq mm0, mm3 - psrld mm0, 15 - pmaddwd mm0, mm5 - - pslld mm0, 5 - paddd mm1, mm7 ; add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 ; add shifted sums - movq mm0, mm3 - movq [rdi], mm2 ; store result - pxor mm1, mm1 - pxor mm0, mm2 - psrad mm0, 31 ; mm0 = sign (sam_AB ^ left_right) - add rdi, 8 - pcmpeqd mm2, mm1 ; mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 ; mm3 = 1s if sam_AB was zero - por mm2, mm3 ; mm2 = 1s if either was zero - pandn mm2, mm6 ; mask delta with zeros check - pcmpeqd mm1, mm1 - psubd mm1, mm7 - psubd mm1, mm7 - psubd mm1, mm0 - pxor mm5, mm0 - paddw mm5, mm1 - paddusw mm5, mm2 ; and add to weight_AB - psubw mm5, mm1 - pxor mm5, mm0 - cmp rdi, rsi - jnz buff_term_minus_2_loop - - movq [rbp+16], mm4 ; post-store samples_AB[0] - jmp bdone - - align 64 - -buff_term_minus_3_loop: - movq mm2, [rdi] ; mm2 = left_right - movq mm3, mm4 ; mm3 = previous calculated value - movq mm4, mm2 ; mm0 = swap dwords of new data - psrlq mm4, 32 - punpckldq mm4, mm2 ; mm3 = sam_AB - - movq mm1, mm3 - paddd mm1, mm1 - psrlw mm1, 1 - pmaddwd mm1, mm5 - - movq mm0, mm3 - psrld mm0, 15 - pmaddwd mm0, mm5 - - pslld mm0, 5 - paddd mm1, mm7 ; add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 ; add shifted sums - movq mm0, mm3 - movq [rdi], mm2 ; store result - pxor mm1, mm1 - pxor mm0, mm2 - psrad mm0, 31 ; mm0 = sign (sam_AB ^ left_right) - add rdi, 8 - pcmpeqd mm2, mm1 ; mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 ; mm3 = 1s if sam_AB was zero - por mm2, mm3 ; mm2 = 1s if either was zero - pandn mm2, mm6 ; mask delta with zeros check - pcmpeqd mm1, mm1 - psubd mm1, mm7 - psubd mm1, mm7 - psubd mm1, mm0 - pxor mm5, mm0 - paddw mm5, mm1 - paddusw mm5, mm2 ; and add to weight_AB - psubw mm5, mm1 - pxor mm5, mm0 - cmp rdi, rsi - jnz buff_term_minus_3_loop - - movq [rbp+16], mm4 ; post-store samples_AB[0] - -bdone: pslld mm5, 16 ; sign-extend 16-bit weights back to dwords - psrad mm5, 16 - movq [rbp+8], mm5 ; put weight_AB back - - ; convert samples_AB array back into samples_A and samples_B - - movq mm0, [rbp+16] - movq mm1, [rbp+24] - movq mm2, [rbp+32] - movq mm3, [rbp+40] - movq mm4, [rbp+48] - movq mm5, [rbp+56] - movq mm6, [rbp+64] - movq mm7, [rbp+72] - - movd DWORD PTR [rbp+16], mm0 - movd DWORD PTR [rbp+20], mm1 - movd DWORD PTR [rbp+24], mm2 - movd DWORD PTR [rbp+28], mm3 - movd DWORD PTR [rbp+32], mm4 - movd DWORD PTR [rbp+36], mm5 - movd DWORD PTR [rbp+40], mm6 - movd DWORD PTR [rbp+44], mm7 - - punpckhdq mm0, mm0 - punpckhdq mm1, mm1 - punpckhdq mm2, mm2 - punpckhdq mm3, mm3 - punpckhdq mm4, mm4 - punpckhdq mm5, mm5 - punpckhdq mm6, mm6 - punpckhdq mm7, mm7 - - movd DWORD PTR [rbp+48], mm0 - movd DWORD PTR [rbp+52], mm1 - movd DWORD PTR [rbp+56], mm2 - movd DWORD PTR [rbp+60], mm3 - movd DWORD PTR [rbp+64], mm4 - movd DWORD PTR [rbp+68], mm5 - movd DWORD PTR [rbp+72], mm6 - movd DWORD PTR [rbp+76], mm7 - - emms - - add rsp, 8 - pop rsi - pop rdi - pop rbx - pop rbp - ret - -pack_decorr_stereo_pass_x64win endp - -; These are assembly optimized version of the following WavPack functions: -; -; void pack_decorr_stereo_pass_cont ( -; struct decorr_pass *dpp, -; int32_t *in_buffer, -; int32_t *out_buffer, -; int32_t sample_count); -; -; void pack_decorr_stereo_pass_cont_rev ( -; struct decorr_pass *dpp, -; int32_t *in_buffer, -; int32_t *out_buffer, -; int32_t sample_count); -; -; It performs a single pass of stereo decorrelation, transfering from the -; input buffer to the output buffer. Note that this version of the function -; requires that the up to 8 previous (depending on dpp->term) stereo samples -; are visible and correct. In other words, it ignores the "samples_*" -; fields in the decorr_pass structure and gets the history data directly -; from the source buffer. It does, however, return the appropriate history -; samples to the decorr_pass structure before returning. -; -; This is written to work on an X86-64 processor (also called the AMD64) -; running in 64-bit mode and uses the MMX extensions to improve the -; performance by processing both stereo channels together. It is based on -; the original MMX code written by Joachim Henke that used MMX intrinsics -; called from C. Many thanks to Joachim for that! -; -; This version is for 64-bit Windows. Note that the two public functions -; are "leaf" functions that simply load rax with the direction and jump -; into the private common "frame" function. The arguments are passed in -; registers: -; -; struct decorr_pass *dpp rcx -; int32_t *in_buffer rdx -; int32_t *out_buffer r8 -; int32_t sample_count r9d -; -; During the processing loops, the following registers are used: -; -; rdi input buffer pointer -; rsi direction (-8 forward, +8 reverse) -; rbx delta from input to output buffer -; ecx sample count -; rdx sign (dir) * term * -8 (terms 1-8 only) -; mm0, mm1 scratch -; mm2 original sample values -; mm3 correlation samples -; mm4 weight sums -; mm5 weights -; mm6 delta -; mm7 512 (for rounding) -; -; stack usage: -; -; [rsp+0] = *dpp -; - -pack_decorr_stereo_pass_cont_rev_x64win: - mov rax, 8 ; get value for reverse direction & jump - jmp pack_decorr_stereo_pass_cont_common - -pack_decorr_stereo_pass_cont_x64win: - mov rax, -8 ; get value for forward direction & jump - jmp pack_decorr_stereo_pass_cont_common - -pack_decorr_stereo_pass_cont_common proc frame - push_reg rbp ; save non-volatile registers on stack - push_reg rbx ; (alphabetically) - push_reg rdi - push_reg rsi - alloc_stack 8 ; allocate 8 bytes on stack & align to 16 bytes - end_prologue - - mov [rsp], rcx ; [rsp] = *dpp - mov rdi, rcx ; copy params from win regs to Linux regs - mov rsi, rdx ; so we can leave following code similar - mov rdx, r8 - mov rcx, r9 - - mov rdi, rsi ; rdi = inbuffer - mov rsi, rax ; rsi = -direction - - mov eax, 512 - movd mm7, eax - punpckldq mm7, mm7 ; mm7 = round (512) - - mov rax, [rsp] ; access dpp - mov eax, [rax+4] - movd mm6, eax - punpckldq mm6, mm6 ; mm6 = delta (0-7) - - mov rax, [rsp] ; access dpp - movq mm5, [rax+8] ; mm5 = weight_AB - movq mm4, [rax+88] ; mm4 = sum_AB - - mov rbx, rdx ; rbx = out_buffer (rdx) - in_buffer (rdi) - sub rbx, rdi - - mov rax, [rsp] ; *eax = dpp - movsxd rax, DWORD PTR [rax] ; get term and vector to correct loop - cmp al, 17 - je term_17_loop - cmp al, 18 - je term_18_loop - cmp al, -1 - je term_minus_1_loop - cmp al, -2 - je term_minus_2_loop - cmp al, -3 - je term_minus_3_loop - - sal rax, 3 - mov rdx, rax ; rdx = term * 8 to index correlation sample - test rsi, rsi ; test direction - jns default_term_loop - neg rdx - jmp default_term_loop - - align 64 - -default_term_loop: - movq mm3, [rdi+rdx] ; mm3 = sam_AB - - movq mm1, mm3 - pslld mm1, 17 - psrld mm1, 17 - pmaddwd mm1, mm5 - - movq mm0, mm3 - pslld mm0, 1 - psrld mm0, 16 - pmaddwd mm0, mm5 - - movq mm2, [rdi] ; mm2 = left_right - pslld mm0, 5 - paddd mm1, mm7 ; add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 ; add shifted sums - movq mm0, mm3 - movq [rdi+rbx], mm2 ; store result - pxor mm0, mm2 - psrad mm0, 31 ; mm0 = sign (sam_AB ^ left_right) - sub rdi, rsi - pxor mm1, mm1 ; mm1 = zero - pcmpeqd mm2, mm1 ; mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 ; mm3 = 1s if sam_AB was zero - por mm2, mm3 ; mm2 = 1s if either was zero - pandn mm2, mm6 ; mask delta with zeros check - pxor mm5, mm0 - paddd mm5, mm2 ; and add to weight_AB - pxor mm5, mm0 - paddd mm4, mm5 ; add weights to sum - dec ecx - jnz default_term_loop - - mov rax, [rsp] ; access dpp - movq [rax+8], mm5 ; put weight_AB back - movq [rax+88], mm4 ; put sum_AB back - emms - - mov rdx, [rsp] ; access dpp with rdx - movsxd rcx, DWORD PTR [rdx] ; rcx = dpp->term - -default_store_samples: - dec rcx - add rdi, rsi ; back up one full sample - mov eax, [rdi+4] - mov [rdx+rcx*4+48], eax ; store samples_B [ecx] - mov eax, [rdi] - mov [rdx+rcx*4+16], eax ; store samples_A [ecx] - test rcx, rcx - jnz default_store_samples - jmp done - - align 64 - -term_17_loop: - movq mm3, [rdi+rsi] ; get previous calculated value - paddd mm3, mm3 - psubd mm3, [rdi+rsi*2] - - movq mm1, mm3 - pslld mm1, 17 - psrld mm1, 17 - pmaddwd mm1, mm5 - - movq mm0, mm3 - pslld mm0, 1 - psrld mm0, 16 - pmaddwd mm0, mm5 - - movq mm2, [rdi] ; mm2 = left_right - pslld mm0, 5 - paddd mm1, mm7 ; add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 ; add shifted sums - movq mm0, mm3 - movq [rdi+rbx], mm2 ; store result - pxor mm0, mm2 - psrad mm0, 31 ; mm0 = sign (sam_AB ^ left_right) - sub rdi, rsi - pxor mm1, mm1 ; mm1 = zero - pcmpeqd mm2, mm1 ; mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 ; mm3 = 1s if sam_AB was zero - por mm2, mm3 ; mm2 = 1s if either was zero - pandn mm2, mm6 ; mask delta with zeros check - pxor mm5, mm0 - paddd mm5, mm2 ; and add to weight_AB - pxor mm5, mm0 - paddd mm4, mm5 ; add weights to sum - dec ecx - jnz term_17_loop - - mov rax, [rsp] ; access dpp - movq [rax+8], mm5 ; put weight_AB back - movq [rax+88], mm4 ; put sum_AB back - emms - jmp term_1718_common_store - - align 64 - -term_18_loop: - movq mm3, [rdi+rsi] ; get previous calculated value - movq mm0, mm3 - psubd mm3, [rdi+rsi*2] - psrad mm3, 1 - paddd mm3, mm0 ; mm3 = sam_AB - - movq mm1, mm3 - pslld mm1, 17 - psrld mm1, 17 - pmaddwd mm1, mm5 - - movq mm0, mm3 - pslld mm0, 1 - psrld mm0, 16 - pmaddwd mm0, mm5 - - movq mm2, [rdi] ; mm2 = left_right - pslld mm0, 5 - paddd mm1, mm7 ; add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 ; add shifted sums - movq mm0, mm3 - movq [rdi+rbx], mm2 ; store result - pxor mm0, mm2 - psrad mm0, 31 ; mm0 = sign (sam_AB ^ left_right) - sub rdi, rsi - pxor mm1, mm1 ; mm1 = zero - pcmpeqd mm2, mm1 ; mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 ; mm3 = 1s if sam_AB was zero - por mm2, mm3 ; mm2 = 1s if either was zero - pandn mm2, mm6 ; mask delta with zeros check - pxor mm5, mm0 - paddd mm5, mm2 ; and add to weight_AB - pxor mm5, mm0 - dec ecx - paddd mm4, mm5 ; add weights to sum - jnz term_18_loop - - mov rax, [rsp] ; access dpp - movq [rax+8], mm5 ; put weight_AB back - movq [rax+88], mm4 ; put sum_AB back - emms - -term_1718_common_store: - - mov rax, [rsp] ; access dpp - add rdi, rsi ; back up a full sample - mov edx, [rdi+4] ; dpp->samples_B [0] = iptr [-1]; - mov [rax+48], edx - mov edx, [rdi] ; dpp->samples_A [0] = iptr [-2]; - mov [rax+16], edx - add rdi, rsi ; back up another sample - mov edx, [rdi+4] ; dpp->samples_B [1] = iptr [-3]; - mov [rax+52], edx - mov edx, [rdi] ; dpp->samples_A [1] = iptr [-4]; - mov [rax+20], edx - jmp done - - align 64 - -term_minus_1_loop: - movq mm3, [rdi+rsi] ; mm3 = previous calculated value - movq mm2, [rdi] ; mm2 = left_right - psrlq mm3, 32 - punpckldq mm3, mm2 ; mm3 = sam_AB - - movq mm1, mm3 - pslld mm1, 17 - psrld mm1, 17 - pmaddwd mm1, mm5 - - movq mm0, mm3 - pslld mm0, 1 - psrld mm0, 16 - pmaddwd mm0, mm5 - - pslld mm0, 5 - paddd mm1, mm7 ; add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 ; add shifted sums - movq mm0, mm3 - movq [rdi+rbx], mm2 ; store result - pxor mm0, mm2 - psrad mm0, 31 ; mm0 = sign (sam_AB ^ left_right) - sub rdi, rsi - pxor mm1, mm1 ; mm1 = zero - pcmpeqd mm2, mm1 ; mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 ; mm3 = 1s if sam_AB was zero - por mm2, mm3 ; mm2 = 1s if either was zero - pandn mm2, mm6 ; mask delta with zeros check - pcmpeqd mm1, mm1 - psubd mm1, mm7 - psubd mm1, mm7 - psubd mm1, mm0 - pxor mm5, mm0 - paddd mm5, mm1 - paddusw mm5, mm2 ; and add to weight_AB - psubd mm5, mm1 - pxor mm5, mm0 - paddd mm4, mm5 ; add weights to sum - dec ecx - jnz term_minus_1_loop - - mov rax, [rsp] ; access dpp - movq [rax+8], mm5 ; put weight_AB back - movq [rax+88], mm4 ; put sum_AB back - emms - - add rdi, rsi ; back up a full sample - mov edx, [rdi+4] ; dpp->samples_A [0] = iptr [-1]; - mov rax, [rsp] - mov [rax+16], edx - jmp done - - align 64 - -term_minus_2_loop: - movq mm2, [rdi] ; mm2 = left_right - movq mm3, mm2 ; mm3 = swap dwords - psrlq mm3, 32 - punpckldq mm3, [rdi+rsi] ; mm3 = sam_AB - - movq mm1, mm3 - pslld mm1, 17 - psrld mm1, 17 - pmaddwd mm1, mm5 - - movq mm0, mm3 - pslld mm0, 1 - psrld mm0, 16 - pmaddwd mm0, mm5 - - pslld mm0, 5 - paddd mm1, mm7 ; add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 ; add shifted sums - movq mm0, mm3 - movq [rdi+rbx], mm2 ; store result - pxor mm0, mm2 - psrad mm0, 31 ; mm0 = sign (sam_AB ^ left_right) - sub rdi, rsi - pxor mm1, mm1 ; mm1 = zero - pcmpeqd mm2, mm1 ; mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 ; mm3 = 1s if sam_AB was zero - por mm2, mm3 ; mm2 = 1s if either was zero - pandn mm2, mm6 ; mask delta with zeros check - pcmpeqd mm1, mm1 - psubd mm1, mm7 - psubd mm1, mm7 - psubd mm1, mm0 - pxor mm5, mm0 - paddd mm5, mm1 - paddusw mm5, mm2 ; and add to weight_AB - psubd mm5, mm1 - pxor mm5, mm0 - paddd mm4, mm5 ; add weights to sum - dec ecx - jnz term_minus_2_loop - - mov rax, [rsp] ; access dpp - movq [rax+8], mm5 ; put weight_AB back - movq [rax+88], mm4 ; put sum_AB back - emms - - add rdi, rsi ; back up a full sample - mov edx, [rdi] ; dpp->samples_B [0] = iptr [-2]; - mov rax, [rsp] - mov [rax+48], edx - jmp done - - align 64 - -term_minus_3_loop: - movq mm0, [rdi+rsi] ; mm0 = previous calculated value - movq mm3, mm0 ; mm3 = swap dwords - psrlq mm3, 32 - punpckldq mm3, mm0 ; mm3 = sam_AB - - movq mm1, mm3 - pslld mm1, 17 - psrld mm1, 17 - pmaddwd mm1, mm5 - - movq mm0, mm3 - pslld mm0, 1 - psrld mm0, 16 - pmaddwd mm0, mm5 - - movq mm2, [rdi] ; mm2 = left_right - pslld mm0, 5 - paddd mm1, mm7 ; add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 ; add shifted sums - movq mm0, mm3 - movq [rdi+rbx], mm2 ; store result - pxor mm0, mm2 - psrad mm0, 31 ; mm0 = sign (sam_AB ^ left_right) - sub rdi, rsi - pxor mm1, mm1 ; mm1 = zero - pcmpeqd mm2, mm1 ; mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 ; mm3 = 1s if sam_AB was zero - por mm2, mm3 ; mm2 = 1s if either was zero - pandn mm2, mm6 ; mask delta with zeros check - pcmpeqd mm1, mm1 - psubd mm1, mm7 - psubd mm1, mm7 - psubd mm1, mm0 - pxor mm5, mm0 - paddd mm5, mm1 - paddusw mm5, mm2 ; and add to weight_AB - psubd mm5, mm1 - pxor mm5, mm0 - paddd mm4, mm5 ; add weights to sum - dec ecx - jnz term_minus_3_loop - - mov rax, [rsp] ; access dpp - movq [rax+8], mm5 ; put weight_AB back - movq [rax+88], mm4 ; put sum_AB back - emms - - add rdi, rsi ; back up a full sample - mov edx, [rdi+4] ; dpp->samples_A [0] = iptr [-1]; - mov rax, [rsp] - mov [rax+16], edx - mov edx, [rdi] ; dpp->samples_B [0] = iptr [-2]; - mov [rax+48], edx - -done: add rsp, 8 ; begin epilog by deallocating stack - pop rsi ; restore non-volatile registers & return - pop rdi - pop rbx - pop rbp - ret - -pack_decorr_stereo_pass_cont_common endp - -; This is an assembly optimized version of the following WavPack function: -; -; uint32_t decorr_mono_buffer (int32_t *buffer, -; struct decorr_pass *decorr_passes, -; int32_t num_terms, -; int32_t sample_count) -; -; Decorrelate a buffer of mono samples, in place, as specified by the array -; of decorr_pass structures. Note that this function does NOT return the -; dpp->samples_X[] values in the "normalized" positions for terms 1-8, so if -; the number of samples is not a multiple of MAX_TERM, these must be moved if -; they are to be used somewhere else. The magnitude of the output samples is -; accumulated and returned (see scan_max_magnitude() for more details). By -; using the overflow detection of the multiply instruction, this detects -; when the "long_math" varient is required. -; -; For the fastest possible operation with the four "common" decorrelation -; filters (i.e, fast, normal, high and very high) this function can be -; configured to include hardcoded versions of these filters that are created -; using macros. In that case, the passed filter is checked to make sure that -; it matches one of the four. If it doesn't, or if the hardcoded flters are -; not enabled, a "general" version of the decorrelation loop is used. This -; variable enables the hardcoded filters and can be disabled if there are -; problems with the code or macros: - - HARDCODED_FILTERS = 1 - -; This is written to work on an X86-64 processor (also called the AMD64) -; running in 64-bit mode. This version is for the 64-bit Windows ABI and -; provides appropriate prologs and epilogs for stack unwinding. The -; arguments are passed in registers: -; -; int32_t *buffer rcx -; struct decorr_pass *dpp rdx -; int32_t num_terms r8 -; int32_t sample_count r9 -; -; stack usage: -; -; [rsp+8] = sample_count -; [rsp+0] = decorr_passes (unused in hardcoded filter case) -; -; register usage: -; -; ecx = sample being decorrelated -; esi = sample up counter -; rdi = *buffer -; rbp = *dpp -; r8 = magnitude accumulator -; r9 = dpp end ptr (unused in hardcoded filter case) -; - if HARDCODED_FILTERS -; -; This macro is used for checking the decorr_passes array to make sure that the terms match -; the hardcoded terms. The terms of these filters are the first element in the tables defined -; in decorr_tables.h (with the negative terms replaced with 1). -; - -chkterm macro term, rbp_offset - cmp BYTE PTR [rbp], term - jnz use_general_version - add rbp, rbp_offset - endm -; -; This macro processes the single specified term (with a fixed delta of 2) and updates the -; term pointer (rbp) with the specified offset when done. It assumes the following registers: -; -; ecx = sample being decorrelated -; esi = sample up counter (used for terms 1-8) -; rbp = decorr_pass pointer for this term (updated with "rbp_offset" when done) -; rax, rbx, rdx = scratch -; - -exeterm macro term, rbp_offset - local over, cont, done - - if term le 8 - mov eax, esi - and eax, 7 - mov ebx, [rbp+16+rax*4] - if term ne 8 - add eax, term - and eax, 7 - endif - mov [rbp+16+rax*4], ecx - - elseif term eq 17 - - mov edx, [rbp+16] ; handle term 17 - mov [rbp+16], ecx - lea ebx, [rdx+rdx] - sub ebx, [rbp+20] - mov [rbp+20], edx - - else - - mov edx, [rbp+16] ; handle term 18 - mov [rbp+16], ecx - lea ebx, [rdx+rdx*2] - sub ebx, [rbp+20] - sar ebx, 1 - mov [rbp+20], edx - - endif - - mov eax, [rbp+8] - imul eax, ebx ; 32-bit multiply is almost always enough - jo over ; but handle overflow if it happens - sar eax, 10 - sbb ecx, eax ; borrow flag provides rounding - jmp cont -over: mov eax, [rbp+8] ; perform 64-bit multiply on overflow - imul ebx - shr eax, 10 - sbb ecx, eax - shl edx, 22 - sub ecx, edx -cont: je done - test ebx, ebx - je done - xor ebx, ecx - sar ebx, 30 - or ebx, 1 ; this generates delta of 1 - sal ebx, 1 ; this generates delta of 2 - add [rbp+8], ebx -done: add rbp, rbp_offset - - endm - - endif ; end of macro definitions - -; entry points of function - -pack_decorr_mono_buffer_x64win proc public frame - push_reg rbp ; save non-volatile registers on stack - push_reg rbx ; (alphabetically) - push_reg rdi - push_reg rsi - alloc_stack 24 ; allocate 24 bytes on stack & align to 16 bytes - end_prologue - - mov rdi, rcx ; copy params from win regs to Linux regs - mov rsi, rdx ; so we can leave following code similar - mov rdx, r8 - mov rcx, r9 - - mov [rsp+8], rcx ; [rsp+8] = sample count - mov [rsp], rsi ; [rsp+0] = decorr_passes - xor r8, r8 ; r8 = max magnitude mask - xor esi, esi ; up counter = 0 - - and ecx, ecx ; test & handle zero sample count & zero term count - jz mexit - and edx, edx - jz mexit - - if HARDCODED_FILTERS - -; first check to make sure all the "deltas" are 2 - - mov rbp, [rsp] ; rbp is decorr_pass pointer - mov ebx, edx ; get term count -deltas: cmp BYTE PTR [rbp+4], 2 ; make sure all the deltas are 2 - jnz use_general_version ; if any aren't, use general case - add rbp, 96 - dec ebx - jnz deltas - - mov rbp, [rsp] ; rbp is decorr_pass pointer - cmp dl, 2 ; 2 terms is "fast" - jnz nfast - chkterm 18, 96 ; check "fast" terms - chkterm 17, -96 - jmp mono_fast_loop ; if both terms match, go execute filter - -nfast: cmp dl, 5 ; 5 terms is "normal" - jnz nnorm - chkterm 18, 96 ; check "normal" terms - chkterm 18, 96 - chkterm 2, 96 - chkterm 17, 96 - chkterm 3, 96*-4 - jmp mono_normal_loop ; if all terms match, go execute filter - -nnorm: cmp dl, 10 ; 10 terms is "high" - jnz nhigh - chkterm 18, 96 ; check "high" terms - chkterm 18, 96 - chkterm 18, 96 - chkterm 1, 96 - chkterm 2, 96 - chkterm 3, 96 - chkterm 5, 96 - chkterm 1, 96 - chkterm 17, 96 - chkterm 4, 96*-9 - jmp mono_high_loop ; if all terms match, go execute filter - -nhigh: cmp dl, 16 ; 16 terms is "very high" - jnz use_general_version ; if none of these, use general version - chkterm 18, 96 ; else check "very high" terms - chkterm 18, 96 - chkterm 2, 96 - chkterm 3, 96 - chkterm 1, 96 - chkterm 18, 96 - chkterm 2, 96 - chkterm 4, 96 - chkterm 7, 96 - chkterm 5, 96 - chkterm 3, 96 - chkterm 6, 96 - chkterm 8, 96 - chkterm 1, 96 - chkterm 18, 96 - chkterm 2, 96*-15 - jmp mono_vhigh_loop ; if all terms match, go execute filter - - align 64 - -; hardcoded "fast" decorrelation loop - -mono_fast_loop: - mov ecx, [rdi+rsi*4] ; ecx is the sample we're decorrelating - - exeterm 18, 96 - exeterm 17, -96 - - mov [rdi+rsi*4], ecx ; store completed sample - mov eax, ecx ; update magnitude mask - cdq - xor eax, edx - or r8, rax - inc esi ; increment sample index - cmp esi, [rsp+8] - jnz mono_fast_loop ; loop back for all samples - jmp mexit ; then exit - - align 64 - -; hardcoded "normal" decorrelation loop - -mono_normal_loop: - mov ecx, [rdi+rsi*4] ; ecx is the sample we're decorrelating - - exeterm 18, 96 - exeterm 18, 96 - exeterm 2, 96 - exeterm 17, 96 - exeterm 3, 96*-4 - - mov [rdi+rsi*4], ecx ; store completed sample - mov eax, ecx ; update magnitude mask - cdq - xor eax, edx - or r8, rax - inc esi ; increment sample index - cmp esi, [rsp+8] - jnz mono_normal_loop ; loop back for all samples - jmp mexit ; then exit - - align 64 - -; hardcoded "high" decorrelation loop - -mono_high_loop: - mov ecx, [rdi+rsi*4] ; ecx is the sample we're decorrelating - - exeterm 18, 96 - exeterm 18, 96 - exeterm 18, 96 - exeterm 1, 96 - exeterm 2, 96 - exeterm 3, 96 - exeterm 5, 96 - exeterm 1, 96 - exeterm 17, 96 - exeterm 4, 96*-9 - - mov [rdi+rsi*4], ecx ; store completed sample - mov eax, ecx ; update magnitude mask - cdq - xor eax, edx - or r8, rax - inc esi ; increment sample index - cmp esi, [rsp+8] - jnz mono_high_loop ; loop back for all samples - jmp mexit ; then exit - - align 64 - -; hardcoded "very high" decorrelation loop - -mono_vhigh_loop: - mov ecx, [rdi+rsi*4] ; ecx is the sample we're decorrelating - - exeterm 18, 96 - exeterm 18, 96 - exeterm 2, 96 - exeterm 3, 96 - exeterm 1, 96 - exeterm 18, 96 - exeterm 2, 96 - exeterm 4, 96 - exeterm 7, 96 - exeterm 5, 96 - exeterm 3, 96 - exeterm 6, 96 - exeterm 8, 96 - exeterm 1, 96 - exeterm 18, 96 - exeterm 2, 96*-15 - - mov [rdi+rsi*4], ecx ; store completed sample - mov eax, ecx ; update magnitude mask - cdq - xor eax, edx - or r8, rax - inc esi ; increment sample index - cmp esi, [rsp+8] - jnz mono_vhigh_loop ; loop back for all samples - jmp mexit ; then exit - - endif ; end of hardcoded filters configuration - -; if none of the hardcoded filters are applicable, or we aren't using them, fall through to here - -use_general_version: - mov rbp, [rsp] ; reload decorr_passes pointer to first term - imul rax, rdx, 96 - add rax, rbp ; r9 = terminating decorr_pass pointer - mov r9, rax - jmp decorrelate_loop - - align 64 - -decorrelate_loop: - mov ecx, [rdi+rsi*4] ; ecx is the sample we're decorrelating -nxterm: mov edx, [rbp] - cmp dl, 17 - jge @f - - mov eax, esi - and eax, 7 - mov ebx, [rbp+16+rax*4] - add eax, edx - and eax, 7 - mov [rbp+16+rax*4], ecx - jmp domult - - align 4 -@@: mov edx, [rbp+16] - mov [rbp+16], ecx - je @f - lea ebx, [rdx+rdx*2] - sub ebx, [rbp+20] - sar ebx, 1 - mov [rbp+20], edx - jmp domult - - align 4 -@@: lea ebx, [rdx+rdx] - sub ebx, [rbp+20] - mov [rbp+20], edx - -domult: mov eax, [rbp+8] - mov edx, eax - imul eax, ebx - jo multov ; on overflow, jump to use 64-bit imul varient - sar eax, 10 - sbb ecx, eax - je @f - test ebx, ebx - je @f - xor ebx, ecx - sar ebx, 31 - xor edx, ebx - add edx, [rbp+4] - xor edx, ebx - mov [rbp+8], edx -@@: add rbp, 96 - cmp rbp, r9 - jnz nxterm - - mov [rdi+rsi*4], ecx ; store completed sample - mov eax, ecx ; update magnitude mask - cdq - xor eax, edx - or r8, rax - mov rbp, [rsp] ; reload decorr_passes pointer to first term - inc esi ; increment sample index - cmp esi, [rsp+8] - jnz decorrelate_loop - jmp mexit - - align 4 -multov: mov eax, [rbp+8] - imul ebx - shr eax, 10 - sbb ecx, eax - shl edx, 22 - sub ecx, edx - je @f - test ebx, ebx - je @f - xor ebx, ecx - sar ebx, 31 - mov eax, [rbp+8] - xor eax, ebx - add eax, [rbp+4] - xor eax, ebx - mov [rbp+8], eax -@@: add rbp, 96 - cmp rbp, r9 - jnz nxterm - - mov [rdi+rsi*4], ecx ; store completed sample - mov eax, ecx ; update magnitude mask - cdq - xor eax, edx - or r8, rax - mov rbp, [rsp] ; reload decorr_passes pointer to first term - inc esi ; increment sample index - cmp esi, [rsp+8] - jnz decorrelate_loop ; loop all the way back - -; common exit for entire function - -mexit: mov rax, r8 ; return max magnitude - add rsp, 24 - pop rsi - pop rdi - pop rbx - pop rbp - ret - -pack_decorr_mono_buffer_x64win endp - - -; This is an assembly optimized version of the following WavPack function: -; -; void decorr_mono_pass_cont (int32_t *out_buffer, -; int32_t *in_buffer, -; struct decorr_pass *dpp, -; int32_t sample_count); -; -; It performs a single pass of mono decorrelation, transfering from the -; input buffer to the output buffer. Note that this version of the function -; requires that the up to 8 previous (depending on dpp->term) mono samples -; are visible and correct. In other words, it ignores the "samples_*" -; fields in the decorr_pass structure and gets the history data directly -; from the source buffer. It does, however, return the appropriate history -; samples to the decorr_pass structure before returning. -; -; By using the overflow detection of the multiply instruction, it detects -; when the "long_math" varient is required and automatically does it. -; -; This is written to work on an X86-64 processor (also called the AMD64) -; running in 64-bit mode. This version is for the 64-bit Windows ABI and -; provides appropriate prologs and epilogs for stack unwinding. The -; arguments are passed in registers: -; -; int32_t *out_buffer rcx -; int32_t *in_buffer rdx -; struct decorr_pass *dpp r8 -; int32_t sample_count r9 -; -; Stack usage: -; -; [rsp+0] = *dpp -; -; Register usage: -; -; rsi = source ptr -; rdi = destination ptr -; rcx = term * -4 (default terms) -; rcx = previous sample (terms 17 & 18) -; ebp = weight -; r8d = delta -; r9d = weight sum -; r10 = eptr -; - -pack_decorr_mono_pass_cont_x64win proc public frame - push_reg rbp - push_reg rbx - push_reg rdi - push_reg rsi - alloc_stack 8 ; allocate 8 bytes on stack & align to 16 bytes - end_prologue - - mov rdi, rcx ; copy params from win regs to Linux regs - mov rsi, rdx ; so we can leave following code similar - mov rdx, r8 - mov rcx, r9 - - mov [rsp], rdx - and ecx, ecx ; test & handle zero sample count - jz mono_done - - cld - mov r8d, [rdx+4] ; rd8 = delta - mov ebp, [rdx+8] ; ebp = weight - mov r9d, [rdx+88] ; r9d = weight sum - lea r10, [rsi+rcx*4] ; r10 = eptr - mov ecx, [rsi-4] ; preload last sample - mov eax, [rdx] ; get term - cmp al, 17 - je mono_term_17_loop - cmp al, 18 - je mono_term_18_loop - - imul rcx, rax, -4 ; rcx is index to correlation sample - jmp mono_default_term_loop - - align 64 - -mono_default_term_loop: - mov edx, [rsi+rcx] - mov ebx, edx - imul edx, ebp - jo over - lodsd - sar edx, 10 - sbb eax, edx - jmp @f -over: mov eax, ebx - imul ebp - shl edx, 22 - shr eax, 10 - adc edx, eax ; edx = apply_weight (sam_A) - lodsd - sub eax, edx -@@: stosd - je @f - test ebx, ebx - je @f - xor eax, ebx - cdq - xor ebp, edx - add ebp, r8d - xor ebp, edx -@@: add r9d, ebp - cmp rsi, r10 - jnz mono_default_term_loop - - mov rdx, [rsp] ; rdx = *dpp - mov [rdx+8], ebp ; put weight back - mov [rdx+88], r9d ; put weight sum back - movsxd rcx, DWORD PTR [rdx] ; rcx = dpp->term - -mono_default_store_samples: - dec rcx - sub rsi, 4 ; back up one sample - mov eax, [rsi] - mov [rdx+rcx*4+16], eax ; store samples_A [ecx] - test rcx, rcx - jnz mono_default_store_samples - jmp mono_done - - align 64 - -mono_term_17_loop: - lea edx, [rcx+rcx] - sub edx, [rsi-8] ; ebx = sam_A - mov ebx, edx - imul edx, ebp - jo over17 - sar edx, 10 - lodsd - mov ecx, eax - sbb eax, edx - jmp @f -over17: mov eax, ebx - imul ebp - shl edx, 22 - shr eax, 10 - adc edx, eax ; edx = apply_weight (sam_A) - lodsd - mov ecx, eax - sub eax, edx -@@: stosd - je @f - test ebx, ebx - je @f - xor eax, ebx - cdq - xor ebp, edx - add ebp, r8d - xor ebp, edx -@@: add r9d, ebp - cmp rsi, r10 - jnz mono_term_17_loop - jmp mono_term_1718_exit - - align 64 - -mono_term_18_loop: - lea edx, [rcx+rcx*2] - sub edx, [rsi-8] - sar edx, 1 - mov ebx, edx ; ebx = sam_A - imul edx, ebp - jo over18 - sar edx, 10 - lodsd - mov ecx, eax - sbb eax, edx - jmp @f -over18: mov eax, ebx - imul ebp - shl edx, 22 - shr eax, 10 - adc edx, eax ; edx = apply_weight (sam_A) - lodsd - mov ecx, eax - sub eax, edx -@@: stosd - je @f - test ebx, ebx - je @f - xor eax, ebx - cdq - xor ebp, edx - add ebp, r8d - xor ebp, edx -@@: add r9d, ebp - cmp rsi, r10 - jnz mono_term_18_loop - -mono_term_1718_exit: - mov rdx, [rsp] ; rdx = *dpp - mov [rdx+8], ebp ; put weight back - mov [rdx+88], r9d ; put weight sum back - mov eax, [rsi-4] ; dpp->samples_A [0] = bptr [-1] - mov [rdx+16], eax - mov eax, [rsi-8] ; dpp->samples_A [1] = bptr [-2] - mov [rdx+20], eax - -mono_done: - add rsp, 8 - pop rsi - pop rdi - pop rbx - pop rbp - ret - -pack_decorr_mono_pass_cont_x64win endp - - -; This is an assembly optimized version of the following WavPack function: -; -; uint32_t scan_max_magnitude (int32_t *buffer, int32_t sample_count); -; -; This function scans a buffer of signed 32-bit ints and returns the magnitude -; of the largest sample, with a power-of-two resolution. It might be more -; useful to return the actual maximum absolute value, but that implementation -; would be slower. Instead, this simply returns the "or" of all the values -; "xor"d with their own sign, like so: -; -; while (sample_count--) -; magnitude |= (*buffer < 0) ? ~*buffer++ : *buffer++; -; -; This is written to work on an X86-64 processor (also called the AMD64) -; running in 64-bit mode and uses the MMX extensions to improve the -; performance by processing two samples together. -; -; This is written to work on an X86-64 processor (also called the AMD64) -; running in 64-bit mode. This version is for the 64-bit Windows ABI and -; provides appropriate prologs and epilogs for stack unwinding. The -; arguments are passed in registers: -; -; int32_t *buffer rcx -; int32_t sample_count rdx -; -; During the processing loops, the following registers are used: -; -; rdi buffer pointer -; rsi termination buffer pointer -; ebx single magnitude accumulator -; mm0 dual magnitude accumulator -; mm1, mm2 scratch -; - -scan_max_magnitude_x64win proc public frame - push_reg rbp ; save non-volatile registers on stack - push_reg rbx ; (alphabetically) - push_reg rdi - push_reg rsi - alloc_stack 8 ; allocate 8 bytes on stack & align to 16 bytes - end_prologue - - mov rdi, rcx ; copy params from win regs to Linux regs - mov rsi, rdx ; so we can leave following code similar - - xor ebx, ebx ; clear magnitude accumulator - - mov eax, esi ; eax = count - and eax, 7 - mov ecx, eax ; ecx = leftover samples to "manually" scan at end - - shr esi, 3 ; esi = num of loops to process mmx (8 samples/loop) - shl esi, 5 ; esi = num of bytes to process mmx (32 bytes/loop) - jz nommx ; jump around if no mmx loops to do (< 8 samples) - - pxor mm0, mm0 ; clear dual magnitude accumulator - add rsi, rdi ; rsi = termination buffer pointer for mmx loop - jmp mmxlp - - align 64 - -mmxlp: movq mm1, [rdi] ; get stereo samples in mm1 & mm2 - movq mm2, mm1 - psrad mm1, 31 ; mm1 = sign (mm2) - pxor mm1, mm2 ; mm1 = absolute magnitude, or into result - por mm0, mm1 - - movq mm1, [rdi+8] ; do it again with 6 more samples - movq mm2, mm1 - psrad mm1, 31 - pxor mm1, mm2 - por mm0, mm1 - - movq mm1, [rdi+16] - movq mm2, mm1 - psrad mm1, 31 - pxor mm1, mm2 - por mm0, mm1 - - movq mm1, [rdi+24] - movq mm2, mm1 - psrad mm1, 31 - pxor mm1, mm2 - por mm0, mm1 - - add rdi, 32 - cmp rdi, rsi - jnz mmxlp - - movd eax, mm0 ; ebx = "or" of high and low mm0 - punpckhdq mm0, mm0 - movd ebx, mm0 - or ebx, eax - emms - -nommx: and ecx, ecx ; any leftover samples to do? - jz noleft - -leftlp: mov eax, [rdi] - cdq - xor eax, edx - or ebx, eax - add rdi, 4 - loop leftlp - -noleft: mov eax, ebx ; move magnitude to eax for return - add rsp, 8 - pop rsi - pop rdi - pop rbx - pop rbp - ret - -scan_max_magnitude_x64win endp - - -; This is an assembly optimized version of the following WavPack function: -; -; uint32_t log2buffer (int32_t *samples, uint32_t num_samples, int limit); -; -; This function scans a buffer of 32-bit ints and accumulates the total -; log2 value of all the samples. This is useful for determining maximum -; compression because the bitstream storage required for entropy coding -; is proportional to the base 2 log of the samples. -; -; This is written to work on an X86-64 processor (also called the AMD64) -; running in 64-bit mode. This version is for the 64-bit Windows ABI and -; provides appropriate prologs and epilogs for stack unwinding. The -; arguments are passed in registers: -; -; int32_t *samples rcx -; uint32_t num_samples rdx -; int limit r8 -; -; During the processing loops, the following registers are used: -; -; r8 pointer to the 256-byte log fraction table -; rsi input buffer pointer -; edi sum accumulator -; ebx sample count -; ebp limit (if specified non-zero) -; eax,ecx,edx scratch -; - - align 256 - - .radix 16 - -log2_table: - byte 000, 001, 003, 004, 006, 007, 009, 00a, 00b, 00d, 00e, 010, 011, 012, 014, 015 - byte 016, 018, 019, 01a, 01c, 01d, 01e, 020, 021, 022, 024, 025, 026, 028, 029, 02a - byte 02c, 02d, 02e, 02f, 031, 032, 033, 034, 036, 037, 038, 039, 03b, 03c, 03d, 03e - byte 03f, 041, 042, 043, 044, 045, 047, 048, 049, 04a, 04b, 04d, 04e, 04f, 050, 051 - byte 052, 054, 055, 056, 057, 058, 059, 05a, 05c, 05d, 05e, 05f, 060, 061, 062, 063 - byte 064, 066, 067, 068, 069, 06a, 06b, 06c, 06d, 06e, 06f, 070, 071, 072, 074, 075 - byte 076, 077, 078, 079, 07a, 07b, 07c, 07d, 07e, 07f, 080, 081, 082, 083, 084, 085 - byte 086, 087, 088, 089, 08a, 08b, 08c, 08d, 08e, 08f, 090, 091, 092, 093, 094, 095 - byte 096, 097, 098, 099, 09a, 09b, 09b, 09c, 09d, 09e, 09f, 0a0, 0a1, 0a2, 0a3, 0a4 - byte 0a5, 0a6, 0a7, 0a8, 0a9, 0a9, 0aa, 0ab, 0ac, 0ad, 0ae, 0af, 0b0, 0b1, 0b2, 0b2 - byte 0b3, 0b4, 0b5, 0b6, 0b7, 0b8, 0b9, 0b9, 0ba, 0bb, 0bc, 0bd, 0be, 0bf, 0c0, 0c0 - byte 0c1, 0c2, 0c3, 0c4, 0c5, 0c6, 0c6, 0c7, 0c8, 0c9, 0ca, 0cb, 0cb, 0cc, 0cd, 0ce - byte 0cf, 0d0, 0d0, 0d1, 0d2, 0d3, 0d4, 0d4, 0d5, 0d6, 0d7, 0d8, 0d8, 0d9, 0da, 0db - byte 0dc, 0dc, 0dd, 0de, 0df, 0e0, 0e0, 0e1, 0e2, 0e3, 0e4, 0e4, 0e5, 0e6, 0e7, 0e7 - byte 0e8, 0e9, 0ea, 0ea, 0eb, 0ec, 0ed, 0ee, 0ee, 0ef, 0f0, 0f1, 0f1, 0f2, 0f3, 0f4 - byte 0f4, 0f5, 0f6, 0f7, 0f7, 0f8, 0f9, 0f9, 0fa, 0fb, 0fc, 0fc, 0fd, 0fe, 0ff, 0ff - - .radix 10 - -log2buffer_x64win proc public frame - push_reg rbp ; save non-volatile registers on stack - push_reg rbx ; (alphabetically) - push_reg rdi - push_reg rsi - alloc_stack 8 ; allocate 8 bytes on stack & align to 16 bytes - end_prologue - - mov rdi, rcx ; copy params from win regs to Linux regs - mov rsi, rdx ; so we can leave following code similar - mov rdx, r8 - - mov ebx, esi ; ebx = num_samples - mov rsi, rdi ; rsi = *samples - xor edi, edi ; initialize sum - lea r8, log2_table - test ebx, ebx ; test count for zero - jz normal_exit - mov ebp, edx ; ebp = limit - test ebp, ebp ; we have separate loops for limit and no limit - jz no_limit_loop - jmp limit_loop - - align 64 - -limit_loop: - mov eax, [rsi] ; get next sample into eax - cdq ; edx = sign of sample (for abs) - add rsi, 4 - xor eax, edx - sub eax, edx - je L40 ; skip if sample was zero - mov edx, eax ; move to edx and apply rounding - shr eax, 9 - add edx, eax - bsr ecx, edx ; ecx = MSB set in sample (0 - 31) - lea eax, [ecx+1] ; eax = number used bits in sample (1 - 32) - sub ecx, 8 ; ecx = shift right amount (-8 to 23) - ror edx, cl ; use rotate to do "signed" shift - sal eax, 8 ; move nbits to integer portion of log - movzx edx, dl ; dl = mantissa, look up log fraction in table - mov al, [r8+rdx] ; eax = combined integer and fraction for full log - add edi, eax ; add to running sum and compare to limit - cmp eax, ebp - jge limit_exceeded -L40: sub ebx, 1 ; loop back if more samples - jne limit_loop - jmp normal_exit - - align 64 - -no_limit_loop: - mov eax, [rsi] ; get next sample into eax - cdq ; edx = sign of sample (for abs) - add rsi, 4 - xor eax, edx - sub eax, edx - je L45 ; skip if sample was zero - mov edx, eax ; move to edx and apply rounding - shr eax, 9 - add edx, eax - bsr ecx, edx ; ecx = MSB set in sample (0 - 31) - lea eax, [ecx+1] ; eax = number used bits in sample (1 - 32) - sub ecx, 8 ; ecx = shift right amount (-8 to 23) - ror edx, cl ; use rotate to do "signed" shift - sal eax, 8 ; move nbits to integer portion of log - movzx edx, dl ; dl = mantissa, look up log fraction in table - mov al, [r8+rdx] ; eax = combined integer and fraction for full log - add edi, eax ; add to running sum -L45: sub ebx, 1 - jne no_limit_loop - jmp normal_exit - -limit_exceeded: - mov edi, -1 ; return -1 to indicate limit hit -normal_exit: - mov eax, edi ; move sum accumulator into eax for return - - add rsp, 8 ; begin epilog by deallocating stack - pop rsi ; restore non-volatile registers & return - pop rdi - pop rbx - pop rbp - ret - -log2buffer_x64win endp - -asmcode ends - - end - diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack_x86.S b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack_x86.S deleted file mode 100644 index 31cf7a4e..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack_x86.S +++ /dev/null @@ -1,1840 +0,0 @@ -############################################################################ -## **** WAVPACK **** ## -## Hybrid Lossless Wavefile Compressor ## -## Copyright (c) 1998 - 2015 Conifer Software. ## -## All Rights Reserved. ## -## Distributed under the BSD Software License (see license.txt) ## -############################################################################ - - .intel_syntax noprefix - .text - - .globl _pack_decorr_stereo_pass_x86 - .globl _pack_decorr_stereo_pass_cont_rev_x86 - .globl _pack_decorr_stereo_pass_cont_x86 - .globl _pack_decorr_mono_buffer_x86 - .globl _pack_decorr_mono_pass_cont_x86 - .globl _pack_cpu_has_feature_x86 - .globl _scan_max_magnitude_x86 - .globl _log2buffer_x86 - - .globl pack_decorr_stereo_pass_x86 - .globl pack_decorr_stereo_pass_cont_rev_x86 - .globl pack_decorr_stereo_pass_cont_x86 - .globl pack_decorr_mono_buffer_x86 - .globl pack_decorr_mono_pass_cont_x86 - .globl pack_cpu_has_feature_x86 - .globl scan_max_magnitude_x86 - .globl log2buffer_x86 - -# This module contains X86 assembly optimized versions of functions required -# to encode WavPack files. Note that the stereo versions of these functions -# use the MMX registers and instructions of the X86 processor, and so a -# helper function is provided to make a runtime check for that feature. - -# This is an assembly optimized version of the following WavPack function: -# -# void pack_decorr_stereo_pass ( -# struct decorr_pass *dpp, -# int32_t *buffer, -# int32_t sample_count); -# -# It performs a single pass of stereo decorrelation, in place, as specified -# by the decorr_pass structure. Note that this function does NOT return the -# dpp->samples_X[] values in the "normalized" positions for terms 1-8, so if -# the number of samples is not a multiple of MAX_TERM, these must be moved if -# they are to be used somewhere else. -# -# This is written to work on an IA-32 processor and uses the MMX extensions -# to improve the performance by processing both stereo channels together. -# It is based on the original MMX code written by Joachim Henke that used -# MMX intrinsics called from C. Many thanks to Joachim for that! -# -# An issue with using MMX for this is that the sample history array in the -# decorr_pass structure contains separate arrays for each channel while the -# MMX code wants there to be a single array of dual samples. The fix for -# this is to convert the data in the arrays on entry and exit, and this is -# made easy by the fact that the 8 MMX regsiters hold exactly the required -# amount of data (64 bytes)! -# -# This is written to work on an IA-32 processor. The arguments are on the -# stack at these locations (after 4 pushes, we do not use ebp as a base -# pointer): -# -# struct decorr_pass *dpp [esp+20] -# int32_t *buffer [esp+24] -# int32_t sample_count [esp+28] -# -# During the processing loops, the following registers are used: -# -# edi buffer pointer -# esi termination buffer pointer -# eax,ebx,edx used in default term to reduce calculation -# ebp decorr_pass pointer -# mm0, mm1 scratch -# mm2 original sample values -# mm3 correlation samples -# mm4 0 (for pcmpeqd) -# mm5 weights -# mm6 delta -# mm7 512 (for rounding) -# - -_pack_decorr_stereo_pass_x86: -pack_decorr_stereo_pass_x86: - push ebp - push ebx - push edi - push esi - - mov ebp, [esp+20] # ebp = *dpp - mov edi, [esp+24] # edi = buffer - mov esi, [esp+28] - shl esi, 3 - jz bdone - add esi, edi # esi = termination buffer pointer - - // convert samples_A and samples_B array into samples_AB array for MMX - // (the MMX registers provide exactly enough storage to do this easily) - - movq mm0, [ebp+16] - punpckldq mm0, [ebp+48] - movq mm1, [ebp+16] - punpckhdq mm1, [ebp+48] - movq mm2, [ebp+24] - punpckldq mm2, [ebp+56] - movq mm3, [ebp+24] - punpckhdq mm3, [ebp+56] - movq mm4, [ebp+32] - punpckldq mm4, [ebp+64] - movq mm5, [ebp+32] - punpckhdq mm5, [ebp+64] - movq mm6, [ebp+40] - punpckldq mm6, [ebp+72] - movq mm7, [ebp+40] - punpckhdq mm7, [ebp+72] - - movq [ebp+16], mm0 - movq [ebp+24], mm1 - movq [ebp+32], mm2 - movq [ebp+40], mm3 - movq [ebp+48], mm4 - movq [ebp+56], mm5 - movq [ebp+64], mm6 - movq [ebp+72], mm7 - - mov eax, 512 - movd mm7, eax - punpckldq mm7, mm7 # mm7 = round (512) - - mov eax, [ebp+4] - movd mm6, eax - punpckldq mm6, mm6 # mm6 = delta (0-7) - - mov eax, 0xFFFF # mask high weights to zero for PMADDWD - movd mm5, eax - punpckldq mm5, mm5 # mm5 = weight mask 0x0000FFFF0000FFFF - pand mm5, [ebp+8] # mm5 = weight_AB masked to 16-bit - - movq mm4, [ebp+16] # preload samples_AB[0] - - mov al, [ebp] # get term and vector to correct loop - cmp al, 17 - je buff_term_17_loop - cmp al, 18 - je buff_term_18_loop - cmp al, -1 - je buff_term_minus_1_loop - cmp al, -2 - je buff_term_minus_2_loop - cmp al, -3 - je buff_term_minus_3_loop - - pxor mm4, mm4 # mm4 = 0 (for pcmpeqd) - xor eax, eax - xor ebx, ebx - add bl, [ebp] - mov ecx, 7 - and ebx, ecx - jmp buff_default_term_loop - - .balign 64 - -buff_default_term_loop: - movq mm2, [edi] # mm2 = left_right - movq mm3, [ebp+16+eax*8] - inc eax - and eax, ecx - movq [ebp+16+ebx*8], mm2 - inc ebx - and ebx, ecx - - movq mm1, mm3 - paddd mm1, mm1 - psrlw mm1, 1 - pmaddwd mm1, mm5 - - movq mm0, mm3 - psrld mm0, 15 - pmaddwd mm0, mm5 - - pslld mm0, 5 - paddd mm1, mm7 # add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 # add shifted sums - movq mm0, mm3 - movq [edi], mm2 # store result - pxor mm0, mm2 - psrad mm0, 31 # mm0 = sign (sam_AB ^ left_right) - add edi, 8 - pcmpeqd mm2, mm4 # mm2 = 1s if left_right was zero - pcmpeqd mm3, mm4 # mm3 = 1s if sam_AB was zero - por mm2, mm3 # mm2 = 1s if either was zero - pandn mm2, mm6 # mask delta with zeros check - pxor mm5, mm0 - paddw mm5, mm2 # and add to weight_AB - pxor mm5, mm0 - cmp edi, esi - jnz buff_default_term_loop - - jmp bdone - - .balign 64 - -buff_term_17_loop: - movq mm3, mm4 # get previous calculated value - paddd mm3, mm4 - psubd mm3, [ebp+24] - movq [ebp+24], mm4 - - movq mm1, mm3 - paddd mm1, mm1 - psrlw mm1, 1 - pmaddwd mm1, mm5 - - movq mm0, mm3 - psrld mm0, 15 - pmaddwd mm0, mm5 - - movq mm2, [edi] # mm2 = left_right - movq mm4, mm2 - pslld mm0, 5 - paddd mm1, mm7 # add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 # add shifted sums - movq mm0, mm3 - movq [edi], mm2 # store result - pxor mm1, mm1 - pxor mm0, mm2 - psrad mm0, 31 # mm0 = sign (sam_AB ^ left_right) - add edi, 8 - pcmpeqd mm2, mm1 # mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 # mm3 = 1s if sam_AB was zero - por mm2, mm3 # mm2 = 1s if either was zero - pandn mm2, mm6 # mask delta with zeros check - pxor mm5, mm0 - paddw mm5, mm2 # and add to weight_AB - pxor mm5, mm0 - cmp edi, esi - jnz buff_term_17_loop - - movq [ebp+16], mm4 # post-store samples_AB[0] - jmp bdone - - .balign 64 - -buff_term_18_loop: - movq mm3, mm4 # get previous calculated value - psubd mm3, [ebp+24] - psrad mm3, 1 - paddd mm3, mm4 # mm3 = sam_AB - movq [ebp+24], mm4 - - movq mm1, mm3 - paddd mm1, mm1 - psrlw mm1, 1 - pmaddwd mm1, mm5 - - movq mm0, mm3 - psrld mm0, 15 - pmaddwd mm0, mm5 - - movq mm2, [edi] # mm2 = left_right - movq mm4, mm2 - pslld mm0, 5 - paddd mm1, mm7 # add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 # add shifted sums - movq mm0, mm3 - movq [edi], mm2 # store result - pxor mm1, mm1 - pxor mm0, mm2 - psrad mm0, 31 # mm0 = sign (sam_AB ^ left_right) - add edi, 8 - pcmpeqd mm2, mm1 # mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 # mm3 = 1s if sam_AB was zero - por mm2, mm3 # mm2 = 1s if either was zero - pandn mm2, mm6 # mask delta with zeros check - pxor mm5, mm0 - paddw mm5, mm2 # and add to weight_AB - pxor mm5, mm0 - cmp edi, esi - jnz buff_term_18_loop - - movq [ebp+16], mm4 # post-store samples_AB[0] - jmp bdone - - .balign 64 - -buff_term_minus_1_loop: - movq mm3, mm4 # mm3 = previous calculated value - movq mm2, [edi] # mm2 = left_right - movq mm4, mm2 - psrlq mm4, 32 - punpckldq mm3, mm2 # mm3 = sam_AB - - movq mm1, mm3 - paddd mm1, mm1 - psrlw mm1, 1 - pmaddwd mm1, mm5 - - movq mm0, mm3 - psrld mm0, 15 - pmaddwd mm0, mm5 - - pslld mm0, 5 - paddd mm1, mm7 # add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 # add shifted sums - movq mm0, mm3 - movq [edi], mm2 # store result - pxor mm1, mm1 - pxor mm0, mm2 - psrad mm0, 31 # mm0 = sign (sam_AB ^ left_right) - add edi, 8 - pcmpeqd mm2, mm1 # mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 # mm3 = 1s if sam_AB was zero - por mm2, mm3 # mm2 = 1s if either was zero - pandn mm2, mm6 # mask delta with zeros check - pcmpeqd mm1, mm1 - psubd mm1, mm7 - psubd mm1, mm7 - psubd mm1, mm0 - pxor mm5, mm0 - paddw mm5, mm1 - paddusw mm5, mm2 # and add to weight_AB - psubw mm5, mm1 - pxor mm5, mm0 - cmp edi, esi - jnz buff_term_minus_1_loop - - movq [ebp+16], mm4 # post-store samples_AB[0] - jmp bdone - - .balign 64 - -buff_term_minus_2_loop: - movq mm2, [edi] # mm2 = left_right - movq mm3, mm2 - psrlq mm3, 32 - por mm3, mm4 - punpckldq mm4, mm2 - - movq mm1, mm3 - paddd mm1, mm1 - psrlw mm1, 1 - pmaddwd mm1, mm5 - - movq mm0, mm3 - psrld mm0, 15 - pmaddwd mm0, mm5 - - pslld mm0, 5 - paddd mm1, mm7 # add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 # add shifted sums - movq mm0, mm3 - movq [edi], mm2 # store result - pxor mm1, mm1 - pxor mm0, mm2 - psrad mm0, 31 # mm0 = sign (sam_AB ^ left_right) - add edi, 8 - pcmpeqd mm2, mm1 # mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 # mm3 = 1s if sam_AB was zero - por mm2, mm3 # mm2 = 1s if either was zero - pandn mm2, mm6 # mask delta with zeros check - pcmpeqd mm1, mm1 - psubd mm1, mm7 - psubd mm1, mm7 - psubd mm1, mm0 - pxor mm5, mm0 - paddw mm5, mm1 - paddusw mm5, mm2 # and add to weight_AB - psubw mm5, mm1 - pxor mm5, mm0 - cmp edi, esi - jnz buff_term_minus_2_loop - - movq [ebp+16], mm4 # post-store samples_AB[0] - jmp bdone - - .balign 64 - -buff_term_minus_3_loop: - movq mm2, [edi] # mm2 = left_right - movq mm3, mm4 # mm3 = previous calculated value - movq mm4, mm2 # mm0 = swap dwords of new data - psrlq mm4, 32 - punpckldq mm4, mm2 # mm3 = sam_AB - - movq mm1, mm3 - paddd mm1, mm1 - psrlw mm1, 1 - pmaddwd mm1, mm5 - - movq mm0, mm3 - psrld mm0, 15 - pmaddwd mm0, mm5 - - pslld mm0, 5 - paddd mm1, mm7 # add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 # add shifted sums - movq mm0, mm3 - movq [edi], mm2 # store result - pxor mm1, mm1 - pxor mm0, mm2 - psrad mm0, 31 # mm0 = sign (sam_AB ^ left_right) - add edi, 8 - pcmpeqd mm2, mm1 # mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 # mm3 = 1s if sam_AB was zero - por mm2, mm3 # mm2 = 1s if either was zero - pandn mm2, mm6 # mask delta with zeros check - pcmpeqd mm1, mm1 - psubd mm1, mm7 - psubd mm1, mm7 - psubd mm1, mm0 - pxor mm5, mm0 - paddw mm5, mm1 - paddusw mm5, mm2 # and add to weight_AB - psubw mm5, mm1 - pxor mm5, mm0 - cmp edi, esi - jnz buff_term_minus_3_loop - - movq [ebp+16], mm4 # post-store samples_AB[0] - -bdone: pslld mm5, 16 # sign-extend 16-bit weights back to dwords - psrad mm5, 16 - movq [ebp+8], mm5 # put weight_AB back - - // convert samples_AB array back into samples_A and samples_B - - movq mm0, [ebp+16] - movq mm1, [ebp+24] - movq mm2, [ebp+32] - movq mm3, [ebp+40] - movq mm4, [ebp+48] - movq mm5, [ebp+56] - movq mm6, [ebp+64] - movq mm7, [ebp+72] - - movd [ebp+16], mm0 - movd [ebp+20], mm1 - movd [ebp+24], mm2 - movd [ebp+28], mm3 - movd [ebp+32], mm4 - movd [ebp+36], mm5 - movd [ebp+40], mm6 - movd [ebp+44], mm7 - - punpckhdq mm0, mm0 - punpckhdq mm1, mm1 - punpckhdq mm2, mm2 - punpckhdq mm3, mm3 - punpckhdq mm4, mm4 - punpckhdq mm5, mm5 - punpckhdq mm6, mm6 - punpckhdq mm7, mm7 - - movd [ebp+48], mm0 - movd [ebp+52], mm1 - movd [ebp+56], mm2 - movd [ebp+60], mm3 - movd [ebp+64], mm4 - movd [ebp+68], mm5 - movd [ebp+72], mm6 - movd [ebp+76], mm7 - - emms - - pop esi - pop edi - pop ebx - pop ebp - ret - -# These are assembly optimized version of the following WavPack functions: -# -# void pack_decorr_stereo_pass_cont ( -# struct decorr_pass *dpp, -# int32_t *in_buffer, -# int32_t *out_buffer, -# int32_t sample_count); -# -# void pack_decorr_stereo_pass_cont_rev ( -# struct decorr_pass *dpp, -# int32_t *in_buffer, -# int32_t *out_buffer, -# int32_t sample_count); -# -# It performs a single pass of stereo decorrelation, transfering from the -# input buffer to the output buffer. Note that this version of the function -# requires that the up to 8 previous (depending on dpp->term) stereo samples -# are visible and correct. In other words, it ignores the "samples_*" -# fields in the decorr_pass structure and gets the history data directly -# from the source buffer. It does, however, return the appropriate history -# samples to the decorr_pass structure before returning. -# -# This is written to work on an IA-32 processor and uses the MMX extensions -# to improve the performance by processing both stereo channels together. -# It is based on the original MMX code written by Joachim Henke that used -# MMX intrinsics called from C. Many thanks to Joachim for that! -# -# No additional stack space is used; all storage is done in registers. The -# arguments on entry: -# -# struct decorr_pass *dpp [ebp+8] -# int32_t *in_buffer [ebp+12] -# int32_t *out_buffer [ebp+16] -# int32_t sample_count [ebp+20] -# -# During the processing loops, the following registers are used: -# -# edi input buffer pointer -# esi direction (-8 forward, +8 reverse) -# ebx delta from input to output buffer -# ecx sample count -# edx sign (dir) * term * -8 (terms 1-8 only) -# mm0, mm1 scratch -# mm2 original sample values -# mm3 correlation samples -# mm4 weight sums -# mm5 weights -# mm6 delta -# mm7 512 (for rounding) -# - -_pack_decorr_stereo_pass_cont_rev_x86: -pack_decorr_stereo_pass_cont_rev_x86: - push ebp - mov ebp, esp - push ebx # save the registers that we need to - push esi - push edi - - mov esi, 8 # esi indicates direction (inverted) - jmp start - -_pack_decorr_stereo_pass_cont_x86: -pack_decorr_stereo_pass_cont_x86: - push ebp - mov ebp, esp - push ebx # save the registers that we need to - push esi - push edi - - mov esi, -8 # esi indicates direction (inverted) - -start: mov eax, 512 - movd mm7, eax - punpckldq mm7, mm7 # mm7 = round (512) - - mov eax, [ebp+8] # access dpp - mov eax, [eax+4] - movd mm6, eax - punpckldq mm6, mm6 # mm6 = delta (0-7) - - mov eax, [ebp+8] # access dpp - movq mm5, [eax+8] # mm5 = weight_AB - movq mm4, [eax+88] # mm4 = sum_AB - - mov edi, [ebp+12] # edi = in_buffer - mov ebx, [ebp+16] - sub ebx, edi # ebx = delta to output buffer - - mov ecx, [ebp+20] # ecx = sample_count - test ecx, ecx - jz done - - mov eax, [ebp+8] # *eax = dpp - mov eax, [eax] # get term and vector to correct loop - cmp eax, 17 - je term_17_loop - cmp eax, 18 - je term_18_loop - cmp eax, -1 - je term_minus_1_loop - cmp eax, -2 - je term_minus_2_loop - cmp eax, -3 - je term_minus_3_loop - - shl eax, 3 - mov edx, eax # edx = term * 8 to index correlation sample - test esi, esi # test direction - jns default_term_loop - neg edx - jmp default_term_loop - - .balign 64 - -default_term_loop: - movq mm3, [edi+edx] # mm3 = sam_AB - - movq mm1, mm3 - pslld mm1, 17 - psrld mm1, 17 - pmaddwd mm1, mm5 - - movq mm0, mm3 - pslld mm0, 1 - psrld mm0, 16 - pmaddwd mm0, mm5 - - movq mm2, [edi] # mm2 = left_right - pslld mm0, 5 - paddd mm1, mm7 # add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 # add shifted sums - movq mm0, mm3 - movq [edi+ebx], mm2 # store result - pxor mm0, mm2 - psrad mm0, 31 # mm0 = sign (sam_AB ^ left_right) - sub edi, esi - pxor mm1, mm1 # mm1 = zero - pcmpeqd mm2, mm1 # mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 # mm3 = 1s if sam_AB was zero - por mm2, mm3 # mm2 = 1s if either was zero - pandn mm2, mm6 # mask delta with zeros check - pxor mm5, mm0 - paddd mm5, mm2 # and add to weight_AB - pxor mm5, mm0 - paddd mm4, mm5 # add weights to sum - dec ecx - jnz default_term_loop - - mov eax, [ebp+8] # access dpp - movq [eax+8], mm5 # put weight_AB back - movq [eax+88], mm4 # put sum_AB back - emms - - mov edx, [ebp+8] # access dpp with edx - mov ecx, [edx] # ecx = dpp->term - -default_store_samples: - dec ecx - add edi, esi # back up one full sample - mov eax, [edi+4] - mov [edx+ecx*4+48], eax # store samples_B [ecx] - mov eax, [edi] - mov [edx+ecx*4+16], eax # store samples_A [ecx] - test ecx, ecx - jnz default_store_samples - jmp done - - .balign 64 - -term_17_loop: - movq mm3, [edi+esi] # get previous calculated value - paddd mm3, mm3 - psubd mm3, [edi+esi*2] - - movq mm1, mm3 - pslld mm1, 17 - psrld mm1, 17 - pmaddwd mm1, mm5 - - movq mm0, mm3 - pslld mm0, 1 - psrld mm0, 16 - pmaddwd mm0, mm5 - - movq mm2, [edi] # mm2 = left_right - pslld mm0, 5 - paddd mm1, mm7 # add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 # add shifted sums - movq mm0, mm3 - movq [edi+ebx], mm2 # store result - pxor mm0, mm2 - psrad mm0, 31 # mm0 = sign (sam_AB ^ left_right) - sub edi, esi - pxor mm1, mm1 # mm1 = zero - pcmpeqd mm2, mm1 # mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 # mm3 = 1s if sam_AB was zero - por mm2, mm3 # mm2 = 1s if either was zero - pandn mm2, mm6 # mask delta with zeros check - pxor mm5, mm0 - paddd mm5, mm2 # and add to weight_AB - pxor mm5, mm0 - paddd mm4, mm5 # add weights to sum - dec ecx - jnz term_17_loop - - mov eax, [ebp+8] # access dpp - movq [eax+8], mm5 # put weight_AB back - movq [eax+88], mm4 # put sum_AB back - emms - jmp term_1718_common_store - - .balign 64 - -term_18_loop: - movq mm3, [edi+esi] # get previous calculated value - movq mm0, mm3 - psubd mm3, [edi+esi*2] - psrad mm3, 1 - paddd mm3, mm0 # mm3 = sam_AB - - movq mm1, mm3 - pslld mm1, 17 - psrld mm1, 17 - pmaddwd mm1, mm5 - - movq mm0, mm3 - pslld mm0, 1 - psrld mm0, 16 - pmaddwd mm0, mm5 - - movq mm2, [edi] # mm2 = left_right - pslld mm0, 5 - paddd mm1, mm7 # add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 # add shifted sums - movq mm0, mm3 - movq [edi+ebx], mm2 # store result - pxor mm0, mm2 - psrad mm0, 31 # mm0 = sign (sam_AB ^ left_right) - sub edi, esi - pxor mm1, mm1 # mm1 = zero - pcmpeqd mm2, mm1 # mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 # mm3 = 1s if sam_AB was zero - por mm2, mm3 # mm2 = 1s if either was zero - pandn mm2, mm6 # mask delta with zeros check - pxor mm5, mm0 - paddd mm5, mm2 # and add to weight_AB - pxor mm5, mm0 - dec ecx - paddd mm4, mm5 # add weights to sum - jnz term_18_loop - - mov eax, [ebp+8] # access dpp - movq [eax+8], mm5 # put weight_AB back - movq [eax+88], mm4 # put sum_AB back - emms - -term_1718_common_store: - - mov eax, [ebp+8] # access dpp - add edi, esi # back up a full sample - mov edx, [edi+4] # dpp->samples_B [0] = iptr [-1]; - mov [eax+48], edx - mov edx, [edi] # dpp->samples_A [0] = iptr [-2]; - mov [eax+16], edx - add edi, esi # back up another sample - mov edx, [edi+4] # dpp->samples_B [1] = iptr [-3]; - mov [eax+52], edx - mov edx, [edi] # dpp->samples_A [1] = iptr [-4]; - mov [eax+20], edx - jmp done - - .balign 64 - -term_minus_1_loop: - movq mm3, [edi+esi] # mm3 = previous calculated value - movq mm2, [edi] # mm2 = left_right - psrlq mm3, 32 - punpckldq mm3, mm2 # mm3 = sam_AB - - movq mm1, mm3 - pslld mm1, 17 - psrld mm1, 17 - pmaddwd mm1, mm5 - - movq mm0, mm3 - pslld mm0, 1 - psrld mm0, 16 - pmaddwd mm0, mm5 - - pslld mm0, 5 - paddd mm1, mm7 # add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 # add shifted sums - movq mm0, mm3 - movq [edi+ebx], mm2 # store result - pxor mm0, mm2 - psrad mm0, 31 # mm0 = sign (sam_AB ^ left_right) - sub edi, esi - pxor mm1, mm1 # mm1 = zero - pcmpeqd mm2, mm1 # mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 # mm3 = 1s if sam_AB was zero - por mm2, mm3 # mm2 = 1s if either was zero - pandn mm2, mm6 # mask delta with zeros check - pcmpeqd mm1, mm1 - psubd mm1, mm7 - psubd mm1, mm7 - psubd mm1, mm0 - pxor mm5, mm0 - paddd mm5, mm1 - paddusw mm5, mm2 # and add to weight_AB - psubd mm5, mm1 - pxor mm5, mm0 - paddd mm4, mm5 # add weights to sum - dec ecx - jnz term_minus_1_loop - - mov eax, [ebp+8] # access dpp - movq [eax+8], mm5 # put weight_AB back - movq [eax+88], mm4 # put sum_AB back - emms - - add edi, esi # back up a full sample - mov edx, [edi+4] # dpp->samples_A [0] = iptr [-1]; - mov eax, [ebp+8] - mov [eax+16], edx - jmp done - - .balign 64 - -term_minus_2_loop: - movq mm2, [edi] # mm2 = left_right - movq mm3, mm2 # mm3 = swap dwords - psrlq mm3, 32 - punpckldq mm3, [edi+esi] # mm3 = sam_AB - - movq mm1, mm3 - pslld mm1, 17 - psrld mm1, 17 - pmaddwd mm1, mm5 - - movq mm0, mm3 - pslld mm0, 1 - psrld mm0, 16 - pmaddwd mm0, mm5 - - pslld mm0, 5 - paddd mm1, mm7 # add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 # add shifted sums - movq mm0, mm3 - movq [edi+ebx], mm2 # store result - pxor mm0, mm2 - psrad mm0, 31 # mm0 = sign (sam_AB ^ left_right) - sub edi, esi - pxor mm1, mm1 # mm1 = zero - pcmpeqd mm2, mm1 # mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 # mm3 = 1s if sam_AB was zero - por mm2, mm3 # mm2 = 1s if either was zero - pandn mm2, mm6 # mask delta with zeros check - pcmpeqd mm1, mm1 - psubd mm1, mm7 - psubd mm1, mm7 - psubd mm1, mm0 - pxor mm5, mm0 - paddd mm5, mm1 - paddusw mm5, mm2 # and add to weight_AB - psubd mm5, mm1 - pxor mm5, mm0 - paddd mm4, mm5 # add weights to sum - dec ecx - jnz term_minus_2_loop - - mov eax, [ebp+8] # access dpp - movq [eax+8], mm5 # put weight_AB back - movq [eax+88], mm4 # put sum_AB back - emms - - add edi, esi # back up a full sample - mov edx, [edi] # dpp->samples_B [0] = iptr [-2]; - mov eax, [ebp+8] - mov [eax+48], edx - jmp done - - .balign 64 - -term_minus_3_loop: - movq mm0, [edi+esi] # mm0 = previous calculated value - movq mm3, mm0 # mm3 = swap dwords - psrlq mm3, 32 - punpckldq mm3, mm0 # mm3 = sam_AB - - movq mm1, mm3 - pslld mm1, 17 - psrld mm1, 17 - pmaddwd mm1, mm5 - - movq mm0, mm3 - pslld mm0, 1 - psrld mm0, 16 - pmaddwd mm0, mm5 - - movq mm2, [edi] # mm2 = left_right - pslld mm0, 5 - paddd mm1, mm7 # add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 # add shifted sums - movq mm0, mm3 - movq [edi+ebx], mm2 # store result - pxor mm0, mm2 - psrad mm0, 31 # mm0 = sign (sam_AB ^ left_right) - sub edi, esi - pxor mm1, mm1 # mm1 = zero - pcmpeqd mm2, mm1 # mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 # mm3 = 1s if sam_AB was zero - por mm2, mm3 # mm2 = 1s if either was zero - pandn mm2, mm6 # mask delta with zeros check - pcmpeqd mm1, mm1 - psubd mm1, mm7 - psubd mm1, mm7 - psubd mm1, mm0 - pxor mm5, mm0 - paddd mm5, mm1 - paddusw mm5, mm2 # and add to weight_AB - psubd mm5, mm1 - pxor mm5, mm0 - paddd mm4, mm5 # add weights to sum - dec ecx - jnz term_minus_3_loop - - mov eax, [ebp+8] # access dpp - movq [eax+8], mm5 # put weight_AB back - movq [eax+88], mm4 # put sum_AB back - emms - - add edi, esi # back up a full sample - mov edx, [edi+4] # dpp->samples_A [0] = iptr [-1]; - mov eax, [ebp+8] - mov [eax+16], edx - mov edx, [edi] # dpp->samples_B [0] = iptr [-2]; - mov [eax+48], edx - -done: pop edi - pop esi - pop ebx - leave - ret - - -# This is an assembly optimized version of the following WavPack function: -# -# uint32_t decorr_mono_buffer (int32_t *buffer, -# struct decorr_pass *decorr_passes, -# int32_t num_terms, -# int32_t sample_count) -# -# Decorrelate a buffer of mono samples, in place, as specified by the array -# of decorr_pass structures. Note that this function does NOT return the -# dpp->samples_X[] values in the "normalized" positions for terms 1-8, so if -# the number of samples is not a multiple of MAX_TERM, these must be moved if -# they are to be used somewhere else. The magnitude of the output samples is -# accumulated and returned (see scan_max_magnitude() for more details). By -# using the overflow detection of the multiply instruction, this detects -# when the "long_math" varient is required. -# -# For the fastest possible operation with the four "common" decorrelation -# filters (i.e, fast, normal, high and very high) this function can be -# configured to include hardcoded versions of these filters that are created -# using macros. In that case, the passed filter is checked to make sure that -# it matches one of the four. If it doesn't, or if the hardcoded flters are -# not enabled, a "general" version of the decorrelation loop is used. This -# variable enables the hardcoded filters and can be disabled if there are -# problems with the code or macros: - - HARDCODED_FILTERS = 1 - -# This is written to work on an IA-32 processor. The arguments are on the -# stack at these locations (after 6 pushes, we do not use ebp as a base -# pointer): -# -# int32_t *buffer [esp+28] -# struct decorr_pass *dpp [esp+32] -# int32_t num_terms [esp+36] -# int32_t sample_count [esp+40] -# -# register usage: -# -# ecx = sample being decorrelated -# esi = sample up counter -# edi = *buffer -# ebp = *dpp -# -# stack usage: -# -# [esp+0] = dpp end ptr (unused in hardcoded filter case) -# [esp+4] = magnitude accumulator -# - .if HARDCODED_FILTERS -# -# This macro is used for checking the decorr_passes array to make sure that the terms match -# the hardcoded terms. The terms of these filters are the first element in the tables defined -# in decorr_tables.h (with the negative terms replaced with 1). -# - - .macro chkterm term ebp_offset - cmp BYTE PTR [ebp], \term - jnz use_general_version - add ebp, \ebp_offset - .endm -# -# This macro processes the single specified term (with a fixed delta of 2) and updates the -# term pointer (rbp) with the specified offset when done. It assumes the following registers: -# -# ecx = sample being decorrelated -# esi = sample up counter (used for terms 1-8) -# rbp = decorr_pass pointer for this term (updated with "rbp_offset" when done) -# rax, rbx, rdx = scratch -# - .macro exeterm term ebp_offset - - .if \term <= 8 - mov eax, esi - and eax, 7 - mov ebx, [ebp+16+eax*4] - .if \term != 8 - add eax, \term - and eax, 7 - .endif - mov [ebp+16+eax*4], ecx - - .elseif \term == 17 - - mov edx, [ebp+16] # handle term 17 - mov [ebp+16], ecx - lea ebx, [edx+edx] - sub ebx, [ebp+20] - mov [ebp+20], edx - - .else - - mov edx, [ebp+16] # handle term 18 - mov [ebp+16], ecx - lea ebx, [edx+edx*2] - sub ebx, [ebp+20] - sar ebx, 1 - mov [ebp+20], edx - - .endif - - mov eax, [ebp+8] - imul eax, ebx # 32-bit multiply is almost always enough - jo 1f # but handle overflow if it happens - sar eax, 10 - sbb ecx, eax # borrow flag provides rounding - jmp 2f -1: mov eax, [ebp+8] # perform 64-bit multiply on overflow - imul ebx - shr eax, 10 - sbb ecx, eax - shl edx, 22 - sub ecx, edx -2: je 3f - test ebx, ebx - je 3f - xor ebx, ecx - sar ebx, 30 - or ebx, 1 # this generates delta of 1 - shl ebx, 1 # this generates delta of 2 - add [ebp+8], ebx -3: add ebp, \ebp_offset - - .endm - - .endif # end of macro definitions - -# entry point of function - -_pack_decorr_mono_buffer_x86: -pack_decorr_mono_buffer_x86: - push ebp # save the resgister that we need to - push ebx - push esi - push edi - xor eax, eax - push eax # this is magnitude accumulator - push eax # this will be dpp end ptr - - mov edi, [esp+28] # edi is buffer pointer - xor esi, esi # up counter = 0 - - cmp DWORD PTR [esp+40], 0 # test & handle zero sample count & zero term count - jz mexit - cmp DWORD PTR [esp+36], 0 - jz mexit - - .if HARDCODED_FILTERS - -# first check to make sure all the "deltas" are 2 - - mov ebp, [esp+32] # ebp is decorr_pass pointer - mov ebx, [esp+36] # get term count -deltas: cmp BYTE PTR [ebp+4], 2 # make sure all the deltas are 2 - jnz use_general_version # if any aren't, use general case - add ebp, 96 - dec ebx - jnz deltas - - mov ebp, [esp+32] # ebp is decorr_pass pointer - mov edx, [esp+36] # get term count - cmp dl, 2 # 2 terms is "fast" - jnz nfast - chkterm 18, 96 # check "fast" terms - chkterm 17, -96 - jmp mono_fast_loop - -nfast: cmp dl, 5 # 5 terms is "normal" - jnz nnorm - chkterm 18, 96 # check "normal" terms - chkterm 18, 96 - chkterm 2, 96 - chkterm 17, 96 - chkterm 3, 96*-4 - jmp mono_normal_loop - -nnorm: cmp dl, 10 # 10 terms is "high" - jnz nhigh - chkterm 18, 96 # check "high" terms - chkterm 18, 96 - chkterm 18, 96 - chkterm 1, 96 - chkterm 2, 96 - chkterm 3, 96 - chkterm 5, 96 - chkterm 1, 96 - chkterm 17, 96 - chkterm 4, 96*-9 - jmp mono_high_loop - -nhigh: cmp dl, 16 # 16 terms is "very high" - jnz use_general_version # if none of these, use general version - chkterm 18, 96 # else check "very high" terms - chkterm 18, 96 - chkterm 2, 96 - chkterm 3, 96 - chkterm 1, 96 - chkterm 18, 96 - chkterm 2, 96 - chkterm 4, 96 - chkterm 7, 96 - chkterm 5, 96 - chkterm 3, 96 - chkterm 6, 96 - chkterm 8, 96 - chkterm 1, 96 - chkterm 18, 96 - chkterm 2, 96*-15 - jmp mono_vhigh_loop - - .balign 64 - -mono_fast_loop: - mov ecx, [edi+esi*4] # ecx is the sample we're decorrelating - - exeterm 18, 96 - exeterm 17, -96 - - mov [edi+esi*4], ecx # store completed sample - mov eax, ecx # magnitude accumulator |= (sample < 0) ? ~sample : sample - cdq - xor eax, edx - or [esp+4], eax - inc esi # increment sample index - cmp esi, [esp+40] - jnz mono_fast_loop # loop back for all samples - jmp mexit - - .balign 64 - -mono_normal_loop: - mov ecx, [edi+esi*4] # ecx is the sample we're decorrelating - - exeterm 18, 96 - exeterm 18, 96 - exeterm 2, 96 - exeterm 17, 96 - exeterm 3, 96*-4 - - mov [edi+esi*4], ecx # store completed sample - mov eax, ecx # magnitude accumulator |= (sample < 0) ? ~sample : sample - cdq - xor eax, edx - or [esp+4], eax - inc esi # increment sample index - cmp esi, [esp+40] - jnz mono_normal_loop # loop back for all samples - jmp mexit - - .balign 64 - -mono_high_loop: - mov ecx, [edi+esi*4] # ecx is the sample we're decorrelating - - exeterm 18, 96 - exeterm 18, 96 - exeterm 18, 96 - exeterm 1, 96 - exeterm 2, 96 - exeterm 3, 96 - exeterm 5, 96 - exeterm 1, 96 - exeterm 17, 96 - exeterm 4, 96*-9 - - mov [edi+esi*4], ecx # store completed sample - mov eax, ecx # magnitude accumulator |= (sample < 0) ? ~sample : sample - cdq - xor eax, edx - or [esp+4], eax - inc esi # increment sample index - cmp esi, [esp+40] - jnz mono_high_loop # loop back for all samples - jmp mexit - - .balign 64 - -mono_vhigh_loop: - mov ecx, [edi+esi*4] # ecx is the sample we're decorrelating - - exeterm 18, 96 - exeterm 18, 96 - exeterm 2, 96 - exeterm 3, 96 - exeterm 1, 96 - exeterm 18, 96 - exeterm 2, 96 - exeterm 4, 96 - exeterm 7, 96 - exeterm 5, 96 - exeterm 3, 96 - exeterm 6, 96 - exeterm 8, 96 - exeterm 1, 96 - exeterm 18, 96 - exeterm 2, 96*-15 - - mov [edi+esi*4], ecx # store completed sample - mov eax, ecx # magnitude accumulator |= (sample < 0) ? ~sample : sample - cdq - xor eax, edx - or [esp+4], eax - inc esi # increment sample index - cmp esi, [esp+40] - jnz mono_vhigh_loop # loop back for all samples - jmp mexit - - .endif - -use_general_version: - mov ebp, [esp+32] - mov edx, [esp+36] # get number of terms - imul eax, edx, 96 # calculate & store termination check ptr - add eax, [esp+32] - mov [esp], eax - jmp decorrelate_loop - - .balign 64 - -decorrelate_loop: - mov ecx, [edi+esi*4] # ecx is the sample we're decorrelating -nxterm: mov edx, [ebp] - cmp dl, 17 - jge 3f - - mov eax, esi - and eax, 7 - mov ebx, [ebp+16+eax*4] - add eax, edx - and eax, 7 - mov [ebp+16+eax*4], ecx - jmp domult - - .balign 4 -3: mov edx, [ebp+16] - mov [ebp+16], ecx - je 4f - lea ebx, [edx+edx*2] - sub ebx, [ebp+20] - sar ebx, 1 - mov [ebp+20], edx - jmp domult - - .balign 4 -4: lea ebx, [edx+edx] - sub ebx, [ebp+20] - mov [ebp+20], edx - -domult: mov eax, [ebp+8] - mov edx, eax - imul eax, ebx - jo multov # on overflow, jump to use 64-bit imul varient - sar eax, 10 - sbb ecx, eax - je 2f - test ebx, ebx - je 2f - xor ebx, ecx - sar ebx, 31 - xor edx, ebx - add edx, [ebp+4] - xor edx, ebx - mov [ebp+8], edx -2: add ebp, 96 - cmp ebp, [esp] - jnz nxterm - - mov [edi+esi*4], ecx # store completed sample - mov eax, ecx # magnitude accumulator |= (sample < 0) ? ~sample : sample - cdq - xor eax, edx - or [esp+4], eax - mov ebp, [esp+32] # reload decorr_passes pointer to first term - inc esi # increment sample index - cmp esi, [esp+40] - jnz decorrelate_loop - jmp mexit - - .balign 4 -multov: mov eax, [ebp+8] - imul ebx - shr eax, 10 - sbb ecx, eax - shl edx, 22 - sub ecx, edx - je 2f - test ebx, ebx - je 2f - xor ebx, ecx - sar ebx, 31 - mov eax, [ebp+8] - xor eax, ebx - add eax, [ebp+4] - xor eax, ebx - mov [ebp+8], eax -2: add ebp, 96 - cmp ebp, [esp] - jnz nxterm - - mov [edi+esi*4], ecx # store completed sample - mov eax, ecx # magnitude accumulator |= (sample < 0) ? ~sample : sample - cdq - xor eax, edx - or [esp+4], eax - mov ebp, [esp+32] # reload decorr_passes pointer to first term - inc esi # increment sample index - cmp esi, [esp+40] - jnz decorrelate_loop # loop all the way back this time - -mexit: pop eax - pop eax # pop magnitude accumulator - pop edi - pop esi - pop ebx - pop ebp - ret - - -# This is an assembly optimized version of the following WavPack function: -# -# void decorr_mono_pass_cont (int32_t *out_buffer, -# int32_t *in_buffer, -# struct decorr_pass *dpp, -# int32_t sample_count); -# -# It performs a single pass of mono decorrelation, transfering from the -# input buffer to the output buffer. Note that this version of the function -# requires that the up to 8 previous (depending on dpp->term) mono samples -# are visible and correct. In other words, it ignores the "samples_*" -# fields in the decorr_pass structure and gets the history data directly -# from the source buffer. It does, however, return the appropriate history -# samples to the decorr_pass structure before returning. -# -# By using the overflow detection of the multiply instruction, it detects -# when the "long_math" varient is required and automatically does it. -# -# This is written to work on an IA-32 processor. The arguments on entry: -# -# int32_t *out_buffer [ebp+8] -# int32_t *in_buffer [ebp+12] -# struct decorr_pass *dpp [ebp+16] -# int32_t sample_count [ebp+20] -# -# Register / stack usage: -# -# esi = source ptr -# edi = destination ptr -# ecx = term * -4 (default terms) -# ecx = previous sample (terms 17 & 18) -# ebp = weight -# [esp] = delta -# [esp+4] = weight sum -# [esp+8] = eptr -# - -_pack_decorr_mono_pass_cont_x86: -pack_decorr_mono_pass_cont_x86: - push ebp - mov ebp, esp - push ebx # save the registers that we need to - push esi - push edi - cld - - mov esi, [ebp+12] - mov edi, [ebp+8] - mov edx, [ebp+16] # edx = *dpp - mov ecx, [ebp+20] # ecx = sample count - mov ebp, [edx+8] # ebp = weight - lea eax, [esi+ecx*4] # calc & push eptr (access with [esp+8]) - push eax - mov eax, [edx+88] # push dpp->sum_A (access with [esp+4]) - push eax - mov eax, [edx+4] # push delta (access with [esp]) - push eax - test ecx, ecx # test for and handle zero count - jz mono_done - - cld # we use lodsd/stosd - mov ecx, [esi-4] # preload last sample - mov eax, [edx] # get term & branch for terms 17 & 18 - cmp eax, 17 - je mono_term_17_loop - cmp eax, 18 - je mono_term_18_loop - - imul ecx, eax, -4 # ecx is index to correlation sample now - jmp mono_default_term_loop - - .balign 64 - -mono_default_term_loop: - mov edx, [esi+ecx] - mov ebx, edx - imul edx, ebp - jo 1f - lodsd - sar edx, 10 - sbb eax, edx - jmp 2f -1: mov eax, ebx - imul ebp - shl edx, 22 - shr eax, 10 - adc edx, eax # edx = apply_weight (sam_A) - lodsd - sub eax, edx -2: stosd - je 3f - test ebx, ebx - je 3f - xor eax, ebx - cdq - xor ebp, edx - add ebp, [esp] - xor ebp, edx -3: add [esp+4], ebp - cmp esi, [esp+8] - jnz mono_default_term_loop - - mov ecx, ebp # ecx = weight - mov eax, [esp+4] # eax = weight sum - lea ebp, [esp+24] # restore ebp (we've pushed 6 DWORDS) - mov edx, [ebp+16] # edx = *dpp - mov [edx+8], ecx # put weight back - mov [edx+88], eax # put dpp->sum_A back - mov ecx, [edx] # ecx = dpp->term - -mono_default_store_samples: - dec ecx - sub esi, 4 # back up one sample - mov eax, [esi] - mov [edx+ecx*4+16], eax # store samples_A [ecx] - test ecx, ecx - jnz mono_default_store_samples - jmp mono_done - - .balign 64 - -mono_term_17_loop: - lea edx, [ecx+ecx] - sub edx, [esi-8] # ebx = sam_A - mov ebx, edx - imul edx, ebp - jo 1f - sar edx, 10 - lodsd - mov ecx, eax - sbb eax, edx - jmp 2f -1: mov eax, ebx - imul ebp - shl edx, 22 - shr eax, 10 - adc edx, eax # edx = apply_weight (sam_A) - lodsd - mov ecx, eax - sub eax, edx -2: stosd - je 3f - test ebx, ebx - je 3f - xor eax, ebx - cdq - xor ebp, edx - add ebp, [esp] - xor ebp, edx -3: add [esp+4], ebp - cmp esi, [esp+8] - jnz mono_term_17_loop - jmp mono_term_1718_exit - - .balign 64 - -mono_term_18_loop: - lea edx, [ecx+ecx*2] - sub edx, [esi-8] - sar edx, 1 - mov ebx, edx # ebx = sam_A - imul edx, ebp - jo 1f - sar edx, 10 - lodsd - mov ecx, eax - sbb eax, edx - jmp 2f -1: mov eax, ebx - imul ebp - shl edx, 22 - shr eax, 10 - adc edx, eax # edx = apply_weight (sam_A) - lodsd - mov ecx, eax - sub eax, edx -2: stosd - je 3f - test ebx, ebx - je 3f - xor eax, ebx - cdq - xor ebp, edx - add ebp, [esp] - xor ebp, edx -3: add [esp+4], ebp - cmp esi, [esp+8] - jnz mono_term_18_loop - -mono_term_1718_exit: - mov ecx, ebp # ecx = weight - mov eax, [esp+4] # eax = weight sum - lea ebp, [esp+24] # restore ebp (we've pushed 6 DWORDS) - mov edx, [ebp+16] # edx = *dpp - mov [edx+8], ecx # put weight back - mov [edx+88], eax # put dpp->sum_A back - mov eax, [esi-4] # dpp->samples_A [0] = bptr [-1] - mov [edx+16], eax - mov eax, [esi-8] # dpp->samples_A [1] = bptr [-2] - mov [edx+20], eax - -mono_done: - add esp, 12 # deallocate stack space - pop edi # pop saved registers & return - pop esi - pop ebx - pop ebp - ret - - -# This is an assembly optimized version of the following WavPack function: -# -# uint32_t scan_max_magnitude (int32_t *buffer, int32_t sample_count); -# -# This function scans a buffer of signed 32-bit ints and returns the magnitude -# of the largest sample, with a power-of-two resolution. It might be more -# useful to return the actual maximum absolute value, but that implementation -# would be slower. Instead, this simply returns the "or" of all the values -# "xor"d with their own sign, like so: -# -# while (sample_count--) -# magnitude |= (*buffer < 0) ? ~*buffer++ : *buffer++; -# -# This is written to work on an IA-32 processor and uses the MMX extensions -# to improve the performance by processing two samples together. The arguments -# are on the stack at these locations (after 4 pushes, we do not use ebp as a -# base pointer): -# -# int32_t *buffer [esp+20] -# uint32_t sample_count [esp+24] -# -# During the processing loops, the following registers are used: -# -# edi buffer pointer -# esi termination buffer pointer -# ebx single magnitude accumulator -# mm0 dual magnitude accumulator -# mm1, mm2 scratch -# - -_scan_max_magnitude_x86: -scan_max_magnitude_x86: - push ebp - push ebx - push esi - push edi - - xor ebx, ebx # clear magnitude accumulator - mov edi, [esp+20] # edi = buffer pointer - - mov eax, [esp+24] # eax = count - and eax, 7 - mov ecx, eax # ecx = leftover samples to "manually" scan at end - - mov eax, [esp+24] # eax = count - shr eax, 3 # eax = num of loops to process mmx (8 samples/loop) - shl eax, 5 # eax = num of bytes to process mmx (32 bytes/loop) - jz nommx # jump around if no mmx loops to do (< 8 samples) - - pxor mm0, mm0 # clear dual magnitude accumulator - add eax, edi # esi = termination buffer pointer for mmx loop - mov esi, eax - jmp mmxlp - - .balign 64 - -mmxlp: movq mm1, [edi] # get stereo samples in mm1 & mm2 - movq mm2, mm1 - psrad mm1, 31 # mm1 = sign (mm2) - pxor mm1, mm2 # mm1 = absolute magnitude, or into result - por mm0, mm1 - - movq mm1, [edi+8] # do it again with 6 more samples - movq mm2, mm1 - psrad mm1, 31 - pxor mm1, mm2 - por mm0, mm1 - - movq mm1, [edi+16] - movq mm2, mm1 - psrad mm1, 31 - pxor mm1, mm2 - por mm0, mm1 - - movq mm1, [edi+24] - movq mm2, mm1 - psrad mm1, 31 - pxor mm1, mm2 - por mm0, mm1 - - add edi, 32 - cmp edi, esi - jnz mmxlp - - movd eax, mm0 # ebx = "or" of high and low mm0 - punpckhdq mm0, mm0 - movd ebx, mm0 - or ebx, eax - emms - -nommx: and ecx, ecx # any leftover samples to do? - jz noleft - -leftlp: mov eax, [edi] - cdq - xor eax, edx - or ebx, eax - add edi, 4 - loop leftlp - -noleft: mov eax, ebx # move magnitude to eax for return - pop edi - pop esi - pop ebx - pop ebp - ret - - -# This is an assembly optimized version of the following WavPack function: -# -# uint32_t log2buffer (int32_t *samples, uint32_t num_samples, int limit); -# -# This function scans a buffer of 32-bit ints and accumulates the total -# log2 value of all the samples. This is useful for determining maximum -# compression because the bitstream storage required for entropy coding -# is proportional to the base 2 log of the samples. -# -# This is written to work on an IA-32 processor. The arguments are on the -# stack at these locations (after 4 pushes, we do not use ebp as a base -# pointer): -# -# int32_t *samples [esp+20] -# uint32_t num_samples [esp+24] -# int limit [esp+28] -# -# During the processing loops, the following registers are used: -# -# esi input buffer pointer -# edi sum accumulator -# ebx sample count -# ebp log2_table pointer -# eax,ecx,edx scratch -# - - .balign 256 - -log2_table: - .byte 0x00, 0x01, 0x03, 0x04, 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0d, 0x0e, 0x10, 0x11, 0x12, 0x14, 0x15 - .byte 0x16, 0x18, 0x19, 0x1a, 0x1c, 0x1d, 0x1e, 0x20, 0x21, 0x22, 0x24, 0x25, 0x26, 0x28, 0x29, 0x2a - .byte 0x2c, 0x2d, 0x2e, 0x2f, 0x31, 0x32, 0x33, 0x34, 0x36, 0x37, 0x38, 0x39, 0x3b, 0x3c, 0x3d, 0x3e - .byte 0x3f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4d, 0x4e, 0x4f, 0x50, 0x51 - .byte 0x52, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63 - .byte 0x64, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x74, 0x75 - .byte 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85 - .byte 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95 - .byte 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4 - .byte 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb2 - .byte 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc0 - .byte 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcb, 0xcc, 0xcd, 0xce - .byte 0xcf, 0xd0, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd8, 0xd9, 0xda, 0xdb - .byte 0xdc, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe4, 0xe5, 0xe6, 0xe7, 0xe7 - .byte 0xe8, 0xe9, 0xea, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xee, 0xef, 0xf0, 0xf1, 0xf1, 0xf2, 0xf3, 0xf4 - .byte 0xf4, 0xf5, 0xf6, 0xf7, 0xf7, 0xf8, 0xf9, 0xf9, 0xfa, 0xfb, 0xfc, 0xfc, 0xfd, 0xfe, 0xff, 0xff - -_log2buffer_x86: -log2buffer_x86: - push ebp - push ebx - push esi - push edi - cld - -# These three instructions allow this to be PIC (position independent code). Having the hardcoded offset is -# certainly not ideal, but it will probably work everywhere. The actual desired expression (nexti - log2_table) -# would not compile on OS X. - - call nexti # push address of nexti (return address) -nexti: pop ebp # pop address of nexti into ebp - sub ebp, 266 # offset to log2_table, should be (nexti - log2_table) - - mov esi, [esp+20] # esi = sample source pointer - xor edi, edi # edi = 0 (accumulator) - mov ebx, [esp+24] # ebx = num_samples - test ebx, ebx # exit now if none, sum = 0 - jz normal_exit - - mov eax, [esp+28] # eax = limit - test eax, eax # we have separate loops for limit and no limit - jz no_limit_loop - jmp limit_loop - - .balign 64 - -limit_loop: - mov eax, [esi] # get next sample into eax - cdq # edx = sign of sample (for abs) - add esi, 4 - xor eax, edx - sub eax, edx - je L40 # skip if sample was zero - mov edx, eax # move to edx and apply rounding - shr eax, 9 - add edx, eax - bsr ecx, edx # ecx = MSB set in sample (0 - 31) - lea eax, [ecx+1] # eax = number used bits in sample (1 - 32) - sub ecx, 8 # ecx = shift right amount (-8 to 23) - ror edx, cl # use rotate to do "signed" shift - shl eax, 8 # move nbits to integer portion of log - movzx edx, dl # dl = mantissa, look up log fraction in table - mov al, [ebp+edx] # eax = combined integer and fraction for full log - add edi, eax # add to running sum and compare to limit - cmp eax, [esp+28] - jge limit_exceeded -L40: sub ebx, 1 # loop back if more samples - jne limit_loop - jmp normal_exit - - .balign 64 - -no_limit_loop: - mov eax, [esi] # get next sample into eax - cdq # edx = sign of sample (for abs) - add esi, 4 - xor eax, edx - sub eax, edx - je L45 # skip if sample was zero - mov edx, eax # move to edx and apply rounding - shr eax, 9 - add edx, eax - bsr ecx, edx # ecx = MSB set in sample (0 - 31) - lea eax, [ecx+1] # eax = number used bits in sample (1 - 32) - sub ecx, 8 # ecx = shift right amount (-8 to 23) - ror edx, cl # use rotate to do "signed" shift - shl eax, 8 # move nbits to integer portion of log - movzx edx, dl # dl = mantissa, look up log fraction in table - mov al, [ebp+edx] # eax = combined integer and fraction for full log - add edi, eax # add to running sum -L45: sub ebx, 1 # loop back if more samples - jne no_limit_loop - jmp normal_exit - -limit_exceeded: - mov edi, -1 # -1 return means log limit exceeded -normal_exit: - mov eax, edi # move sum accumulator into eax for return - pop edi - pop esi - pop ebx - pop ebp - ret - -# Helper function to determine if specified CPU feature is available (used here for MMX). -# Input parameter is index of feature to be checked (EDX from CPUID(1) only, MMX = 23). -# Return value is the specified bit (0 or 1) or 0 if CPUID is not supported. - -_pack_cpu_has_feature_x86: -pack_cpu_has_feature_x86: - pushfd # save eflags - pushfd # push another copy - xor dword ptr [esp], 0x200000 # toggle ID bit on stack & pop it back into eflags - popfd - pushfd # store possibly modified eflags - pop eax # and pop back into eax - xor eax, [esp] # compare to original pushed eflags - popfd # restore original eflags - and eax, 0x200000 # eax = 1 if eflags ID bit was changable - jz oldcpu # return zero if CPUID is not available (wow!) - - push ebx # we must save ebx - mov eax, 1 # do cpuid (1) to get features into edx - cpuid - mov eax, edx # copy into eax for shift - mov cl, [esp+8] # get parameter and shift that bit index into LSB - sar eax, cl - and eax, 1 - pop ebx # restore ebx and return 0 or 1 - -oldcpu: ret # return value in eax - -#ifdef __ELF__ - .section .note.GNU-stack,"",@progbits -#endif - diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack_x86.asm b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack_x86.asm deleted file mode 100644 index 87b5f029..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/pack_x86.asm +++ /dev/null @@ -1,1827 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; **** WAVPACK **** ;; -;; Hybrid Lossless Wavefile Compressor ;; -;; Copyright (c) 1998 - 2015 Conifer Software. ;; -;; All Rights Reserved. ;; -;; Distributed under the BSD Software License (see license.txt) ;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - .686 - .mmx - .model flat -asmcode segment page 'CODE' - public _pack_decorr_stereo_pass_x86 - public _pack_decorr_stereo_pass_cont_rev_x86 - public _pack_decorr_stereo_pass_cont_x86 - public _pack_decorr_mono_buffer_x86 - public _pack_decorr_mono_pass_cont_x86 - public _pack_cpu_has_feature_x86 - public _scan_max_magnitude_x86 - public _log2buffer_x86 - -; This module contains X86 assembly optimized versions of functions required -; to encode WavPack files. - -; This is an assembly optimized version of the following WavPack function: -; -; void pack_decorr_stereo_pass ( -; struct decorr_pass *dpp, -; int32_t *buffer, -; int32_t sample_count); -; -; It performs a single pass of stereo decorrelation, in place, as specified -; by the decorr_pass structure. Note that this function does NOT return the -; dpp->samples_X[] values in the "normalized" positions for terms 1-8, so if -; the number of samples is not a multiple of MAX_TERM, these must be moved if -; they are to be used somewhere else. -; -; This is written to work on an IA-32 processor and uses the MMX extensions -; to improve the performance by processing both stereo channels together. -; It is based on the original MMX code written by Joachim Henke that used -; MMX intrinsics called from C. Many thanks to Joachim for that! -; -; An issue with using MMX for this is that the sample history array in the -; decorr_pass structure contains separate arrays for each channel while the -; MMX code wants there to be a single array of dual samples. The fix for -; this is to convert the data in the arrays on entry and exit, and this is -; made easy by the fact that the 8 MMX regsiters hold exactly the required -; amount of data (64 bytes)! -; -; This is written to work on an IA-32 processor. The arguments are on the -; stack at these locations (after 4 pushes, we do not use ebp as a base -; pointer): -; -; struct decorr_pass *dpp [esp+20] -; int32_t *buffer [esp+24] -; int32_t sample_count [esp+28] -; -; During the processing loops, the following registers are used: -; -; edi buffer pointer -; esi termination buffer pointer -; eax,ebx,edx used in default term to reduce calculation -; ebp decorr_pass pointer -; mm0, mm1 scratch -; mm2 original sample values -; mm3 correlation samples -; mm4 0 (for pcmpeqd) -; mm5 weights -; mm6 delta -; mm7 512 (for rounding) -; - -_pack_decorr_stereo_pass_x86: - push ebp - push ebx - push edi - push esi - - mov ebp, [esp+20] ; ebp = *dpp - mov edi, [esp+24] ; edi = buffer - mov esi, [esp+28] - sal esi, 3 - jz bdone - add esi, edi ; esi = termination buffer pointer - - ; convert samples_A and samples_B array into samples_AB array for MMX - ; (the MMX registers provide exactly enough storage to do this easily) - - movq mm0, [ebp+16] - punpckldq mm0, [ebp+48] - movq mm1, [ebp+16] - punpckhdq mm1, [ebp+48] - movq mm2, [ebp+24] - punpckldq mm2, [ebp+56] - movq mm3, [ebp+24] - punpckhdq mm3, [ebp+56] - movq mm4, [ebp+32] - punpckldq mm4, [ebp+64] - movq mm5, [ebp+32] - punpckhdq mm5, [ebp+64] - movq mm6, [ebp+40] - punpckldq mm6, [ebp+72] - movq mm7, [ebp+40] - punpckhdq mm7, [ebp+72] - - movq [ebp+16], mm0 - movq [ebp+24], mm1 - movq [ebp+32], mm2 - movq [ebp+40], mm3 - movq [ebp+48], mm4 - movq [ebp+56], mm5 - movq [ebp+64], mm6 - movq [ebp+72], mm7 - - mov eax, 512 - movd mm7, eax - punpckldq mm7, mm7 ; mm7 = round (512) - - mov eax, [ebp+4] - movd mm6, eax - punpckldq mm6, mm6 ; mm6 = delta (0-7) - - mov eax, 0FFFFh ; mask high weights to zero for PMADDWD - movd mm5, eax - punpckldq mm5, mm5 ; mm5 = weight mask 0x0000FFFF0000FFFF - pand mm5, [ebp+8] ; mm5 = weight_AB masked to 16-bit - - movq mm4, [ebp+16] ; preload samples_AB[0] - - mov al, [ebp] ; get term and vector to correct loop - cmp al, 17 - je buff_term_17_loop - cmp al, 18 - je buff_term_18_loop - cmp al, -1 - je buff_term_minus_1_loop - cmp al, -2 - je buff_term_minus_2_loop - cmp al, -3 - je buff_term_minus_3_loop - - pxor mm4, mm4 ; mm4 = 0 (for pcmpeqd) - xor eax, eax - xor ebx, ebx - add bl, [ebp] - mov ecx, 7 - and ebx, ecx - jmp buff_default_term_loop - - align 64 - -buff_default_term_loop: - movq mm2, [edi] ; mm2 = left_right - movq mm3, [ebp+16+eax*8] - inc eax - and eax, ecx - movq [ebp+16+ebx*8], mm2 - inc ebx - and ebx, ecx - - movq mm1, mm3 - paddd mm1, mm1 - psrlw mm1, 1 - pmaddwd mm1, mm5 - - movq mm0, mm3 - psrld mm0, 15 - pmaddwd mm0, mm5 - - pslld mm0, 5 - paddd mm1, mm7 ; add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 ; add shifted sums - movq mm0, mm3 - movq [edi], mm2 ; store result - pxor mm0, mm2 - psrad mm0, 31 ; mm0 = sign (sam_AB ^ left_right) - add edi, 8 - pcmpeqd mm2, mm4 ; mm2 = 1s if left_right was zero - pcmpeqd mm3, mm4 ; mm3 = 1s if sam_AB was zero - por mm2, mm3 ; mm2 = 1s if either was zero - pandn mm2, mm6 ; mask delta with zeros check - pxor mm5, mm0 - paddw mm5, mm2 ; and add to weight_AB - pxor mm5, mm0 - cmp edi, esi - jnz buff_default_term_loop - - jmp bdone - - align 64 - -buff_term_17_loop: - movq mm3, mm4 ; get previous calculated value - paddd mm3, mm4 - psubd mm3, [ebp+24] - movq [ebp+24], mm4 - - movq mm1, mm3 - paddd mm1, mm1 - psrlw mm1, 1 - pmaddwd mm1, mm5 - - movq mm0, mm3 - psrld mm0, 15 - pmaddwd mm0, mm5 - - movq mm2, [edi] ; mm2 = left_right - movq mm4, mm2 - pslld mm0, 5 - paddd mm1, mm7 ; add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 ; add shifted sums - movq mm0, mm3 - movq [edi], mm2 ; store result - pxor mm1, mm1 - pxor mm0, mm2 - psrad mm0, 31 ; mm0 = sign (sam_AB ^ left_right) - add edi, 8 - pcmpeqd mm2, mm1 ; mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 ; mm3 = 1s if sam_AB was zero - por mm2, mm3 ; mm2 = 1s if either was zero - pandn mm2, mm6 ; mask delta with zeros check - pxor mm5, mm0 - paddw mm5, mm2 ; and add to weight_AB - pxor mm5, mm0 - cmp edi, esi - jnz buff_term_17_loop - - movq [ebp+16], mm4 ; post-store samples_AB[0] - jmp bdone - - align 64 - -buff_term_18_loop: - movq mm3, mm4 ; get previous calculated value - psubd mm3, [ebp+24] - psrad mm3, 1 - paddd mm3, mm4 ; mm3 = sam_AB - movq [ebp+24], mm4 - - movq mm1, mm3 - paddd mm1, mm1 - psrlw mm1, 1 - pmaddwd mm1, mm5 - - movq mm0, mm3 - psrld mm0, 15 - pmaddwd mm0, mm5 - - movq mm2, [edi] ; mm2 = left_right - movq mm4, mm2 - pslld mm0, 5 - paddd mm1, mm7 ; add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 ; add shifted sums - movq mm0, mm3 - movq [edi], mm2 ; store result - pxor mm1, mm1 - pxor mm0, mm2 - psrad mm0, 31 ; mm0 = sign (sam_AB ^ left_right) - add edi, 8 - pcmpeqd mm2, mm1 ; mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 ; mm3 = 1s if sam_AB was zero - por mm2, mm3 ; mm2 = 1s if either was zero - pandn mm2, mm6 ; mask delta with zeros check - pxor mm5, mm0 - paddw mm5, mm2 ; and add to weight_AB - pxor mm5, mm0 - cmp edi, esi - jnz buff_term_18_loop - - movq [ebp+16], mm4 ; post-store samples_AB[0] - jmp bdone - - align 64 - -buff_term_minus_1_loop: - movq mm3, mm4 ; mm3 = previous calculated value - movq mm2, [edi] ; mm2 = left_right - movq mm4, mm2 - psrlq mm4, 32 - punpckldq mm3, mm2 ; mm3 = sam_AB - - movq mm1, mm3 - paddd mm1, mm1 - psrlw mm1, 1 - pmaddwd mm1, mm5 - - movq mm0, mm3 - psrld mm0, 15 - pmaddwd mm0, mm5 - - pslld mm0, 5 - paddd mm1, mm7 ; add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 ; add shifted sums - movq mm0, mm3 - movq [edi], mm2 ; store result - pxor mm1, mm1 - pxor mm0, mm2 - psrad mm0, 31 ; mm0 = sign (sam_AB ^ left_right) - add edi, 8 - pcmpeqd mm2, mm1 ; mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 ; mm3 = 1s if sam_AB was zero - por mm2, mm3 ; mm2 = 1s if either was zero - pandn mm2, mm6 ; mask delta with zeros check - pcmpeqd mm1, mm1 - psubd mm1, mm7 - psubd mm1, mm7 - psubd mm1, mm0 - pxor mm5, mm0 - paddw mm5, mm1 - paddusw mm5, mm2 ; and add to weight_AB - psubw mm5, mm1 - pxor mm5, mm0 - cmp edi, esi - jnz buff_term_minus_1_loop - - movq [ebp+16], mm4 ; post-store samples_AB[0] - jmp bdone - - align 64 - -buff_term_minus_2_loop: - movq mm2, [edi] ; mm2 = left_right - movq mm3, mm2 - psrlq mm3, 32 - por mm3, mm4 - punpckldq mm4, mm2 - - movq mm1, mm3 - paddd mm1, mm1 - psrlw mm1, 1 - pmaddwd mm1, mm5 - - movq mm0, mm3 - psrld mm0, 15 - pmaddwd mm0, mm5 - - pslld mm0, 5 - paddd mm1, mm7 ; add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 ; add shifted sums - movq mm0, mm3 - movq [edi], mm2 ; store result - pxor mm1, mm1 - pxor mm0, mm2 - psrad mm0, 31 ; mm0 = sign (sam_AB ^ left_right) - add edi, 8 - pcmpeqd mm2, mm1 ; mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 ; mm3 = 1s if sam_AB was zero - por mm2, mm3 ; mm2 = 1s if either was zero - pandn mm2, mm6 ; mask delta with zeros check - pcmpeqd mm1, mm1 - psubd mm1, mm7 - psubd mm1, mm7 - psubd mm1, mm0 - pxor mm5, mm0 - paddw mm5, mm1 - paddusw mm5, mm2 ; and add to weight_AB - psubw mm5, mm1 - pxor mm5, mm0 - cmp edi, esi - jnz buff_term_minus_2_loop - - movq [ebp+16], mm4 ; post-store samples_AB[0] - jmp bdone - - align 64 - -buff_term_minus_3_loop: - movq mm2, [edi] ; mm2 = left_right - movq mm3, mm4 ; mm3 = previous calculated value - movq mm4, mm2 ; mm0 = swap dwords of new data - psrlq mm4, 32 - punpckldq mm4, mm2 ; mm3 = sam_AB - - movq mm1, mm3 - paddd mm1, mm1 - psrlw mm1, 1 - pmaddwd mm1, mm5 - - movq mm0, mm3 - psrld mm0, 15 - pmaddwd mm0, mm5 - - pslld mm0, 5 - paddd mm1, mm7 ; add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 ; add shifted sums - movq mm0, mm3 - movq [edi], mm2 ; store result - pxor mm1, mm1 - pxor mm0, mm2 - psrad mm0, 31 ; mm0 = sign (sam_AB ^ left_right) - add edi, 8 - pcmpeqd mm2, mm1 ; mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 ; mm3 = 1s if sam_AB was zero - por mm2, mm3 ; mm2 = 1s if either was zero - pandn mm2, mm6 ; mask delta with zeros check - pcmpeqd mm1, mm1 - psubd mm1, mm7 - psubd mm1, mm7 - psubd mm1, mm0 - pxor mm5, mm0 - paddw mm5, mm1 - paddusw mm5, mm2 ; and add to weight_AB - psubw mm5, mm1 - pxor mm5, mm0 - cmp edi, esi - jnz buff_term_minus_3_loop - - movq [ebp+16], mm4 ; post-store samples_AB[0] - -bdone: pslld mm5, 16 ; sign-extend 16-bit weights back to dwords - psrad mm5, 16 - movq [ebp+8], mm5 ; put weight_AB back - - ; convert samples_AB array back into samples_A and samples_B - - movq mm0, [ebp+16] - movq mm1, [ebp+24] - movq mm2, [ebp+32] - movq mm3, [ebp+40] - movq mm4, [ebp+48] - movq mm5, [ebp+56] - movq mm6, [ebp+64] - movq mm7, [ebp+72] - - movd DWORD PTR [ebp+16], mm0 - movd DWORD PTR [ebp+20], mm1 - movd DWORD PTR [ebp+24], mm2 - movd DWORD PTR [ebp+28], mm3 - movd DWORD PTR [ebp+32], mm4 - movd DWORD PTR [ebp+36], mm5 - movd DWORD PTR [ebp+40], mm6 - movd DWORD PTR [ebp+44], mm7 - - punpckhdq mm0, mm0 - punpckhdq mm1, mm1 - punpckhdq mm2, mm2 - punpckhdq mm3, mm3 - punpckhdq mm4, mm4 - punpckhdq mm5, mm5 - punpckhdq mm6, mm6 - punpckhdq mm7, mm7 - - movd DWORD PTR [ebp+48], mm0 - movd DWORD PTR [ebp+52], mm1 - movd DWORD PTR [ebp+56], mm2 - movd DWORD PTR [ebp+60], mm3 - movd DWORD PTR [ebp+64], mm4 - movd DWORD PTR [ebp+68], mm5 - movd DWORD PTR [ebp+72], mm6 - movd DWORD PTR [ebp+76], mm7 - - emms - - pop esi - pop edi - pop ebx - pop ebp - ret - -; These are assembly optimized version of the following WavPack functions: -; -; void pack_decorr_stereo_pass_cont ( -; struct decorr_pass *dpp, -; int32_t *in_buffer, -; int32_t *out_buffer, -; int32_t sample_count); -; -; void pack_decorr_stereo_pass_cont_rev ( -; struct decorr_pass *dpp, -; int32_t *in_buffer, -; int32_t *out_buffer, -; int32_t sample_count); -; -; It performs a single pass of stereo decorrelation, transfering from the -; input buffer to the output buffer. Note that this version of the function -; requires that the up to 8 previous (depending on dpp->term) stereo samples -; are visible and correct. In other words, it ignores the "samples_*" -; fields in the decorr_pass structure and gets the history data directly -; from the source buffer. It does, however, return the appropriate history -; samples to the decorr_pass structure before returning. -; -; This is written to work on an IA-32 processor and uses the MMX extensions -; to improve the performance by processing both stereo channels together. -; It is based on the original MMX code written by Joachim Henke that used -; MMX intrinsics called from C. Many thanks to Joachim for that! -; -; No additional stack space is used; all storage is done in registers. The -; arguments on entry: -; -; struct decorr_pass *dpp [ebp+8] -; int32_t *in_buffer [ebp+12] -; int32_t *out_buffer [ebp+16] -; int32_t sample_count [ebp+20] -; -; During the processing loops, the following registers are used: -; -; edi input buffer pointer -; esi direction (-8 forward, +8 reverse) -; ebx delta from input to output buffer -; ecx sample count -; edx sign (dir) * term * -8 (terms 1-8 only) -; mm0, mm1 scratch -; mm2 original sample values -; mm3 correlation samples -; mm4 weight sums -; mm5 weights -; mm6 delta -; mm7 512 (for rounding) -; - -_pack_decorr_stereo_pass_cont_rev_x86: - push ebp - mov ebp, esp - push ebx ; save the registers that we need to - push esi - push edi - - mov esi, 8 ; esi indicates direction (inverted) - jmp start - -_pack_decorr_stereo_pass_cont_x86: - push ebp - mov ebp, esp - push ebx ; save the registers that we need to - push esi - push edi - - mov esi, -8 ; esi indicates direction (inverted) - -start: mov eax, 512 - movd mm7, eax - punpckldq mm7, mm7 ; mm7 = round (512) - - mov eax, [ebp+8] ; access dpp - mov eax, [eax+4] - movd mm6, eax - punpckldq mm6, mm6 ; mm6 = delta (0-7) - - mov eax, [ebp+8] ; access dpp - movq mm5, [eax+8] ; mm5 = weight_AB - movq mm4, [eax+88] ; mm4 = sum_AB - - mov edi, [ebp+12] ; edi = in_buffer - mov ebx, [ebp+16] - sub ebx, edi ; ebx = delta to output buffer - - mov ecx, [ebp+20] ; ecx = sample_count - test ecx, ecx - jz done - - mov eax, [ebp+8] ; *eax = dpp - mov eax, [eax] ; get term and vector to correct loop - cmp eax, 17 - je term_17_loop - cmp eax, 18 - je term_18_loop - cmp eax, -1 - je term_minus_1_loop - cmp eax, -2 - je term_minus_2_loop - cmp eax, -3 - je term_minus_3_loop - - sal eax, 3 - mov edx, eax ; edx = term * 8 to index correlation sample - test esi, esi ; test direction - jns default_term_loop - neg edx - jmp default_term_loop - - align 64 - -default_term_loop: - movq mm3, [edi+edx] ; mm3 = sam_AB - - movq mm1, mm3 - pslld mm1, 17 - psrld mm1, 17 - pmaddwd mm1, mm5 - - movq mm0, mm3 - pslld mm0, 1 - psrld mm0, 16 - pmaddwd mm0, mm5 - - movq mm2, [edi] ; mm2 = left_right - pslld mm0, 5 - paddd mm1, mm7 ; add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 ; add shifted sums - movq mm0, mm3 - movq [edi+ebx], mm2 ; store result - pxor mm0, mm2 - psrad mm0, 31 ; mm0 = sign (sam_AB ^ left_right) - sub edi, esi - pxor mm1, mm1 ; mm1 = zero - pcmpeqd mm2, mm1 ; mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 ; mm3 = 1s if sam_AB was zero - por mm2, mm3 ; mm2 = 1s if either was zero - pandn mm2, mm6 ; mask delta with zeros check - pxor mm5, mm0 - paddd mm5, mm2 ; and add to weight_AB - pxor mm5, mm0 - paddd mm4, mm5 ; add weights to sum - dec ecx - jnz default_term_loop - - mov eax, [ebp+8] ; access dpp - movq [eax+8], mm5 ; put weight_AB back - movq [eax+88], mm4 ; put sum_AB back - emms - - mov edx, [ebp+8] ; access dpp with edx - mov ecx, [edx] ; ecx = dpp->term - -default_store_samples: - dec ecx - add edi, esi ; back up one full sample - mov eax, [edi+4] - mov [edx+ecx*4+48], eax ; store samples_B [ecx] - mov eax, [edi] - mov [edx+ecx*4+16], eax ; store samples_A [ecx] - test ecx, ecx - jnz default_store_samples - jmp done - - align 64 - -term_17_loop: - movq mm3, [edi+esi] ; get previous calculated value - paddd mm3, mm3 - psubd mm3, [edi+esi*2] - - movq mm1, mm3 - pslld mm1, 17 - psrld mm1, 17 - pmaddwd mm1, mm5 - - movq mm0, mm3 - pslld mm0, 1 - psrld mm0, 16 - pmaddwd mm0, mm5 - - movq mm2, [edi] ; mm2 = left_right - pslld mm0, 5 - paddd mm1, mm7 ; add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 ; add shifted sums - movq mm0, mm3 - movq [edi+ebx], mm2 ; store result - pxor mm0, mm2 - psrad mm0, 31 ; mm0 = sign (sam_AB ^ left_right) - sub edi, esi - pxor mm1, mm1 ; mm1 = zero - pcmpeqd mm2, mm1 ; mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 ; mm3 = 1s if sam_AB was zero - por mm2, mm3 ; mm2 = 1s if either was zero - pandn mm2, mm6 ; mask delta with zeros check - pxor mm5, mm0 - paddd mm5, mm2 ; and add to weight_AB - pxor mm5, mm0 - paddd mm4, mm5 ; add weights to sum - dec ecx - jnz term_17_loop - - mov eax, [ebp+8] ; access dpp - movq [eax+8], mm5 ; put weight_AB back - movq [eax+88], mm4 ; put sum_AB back - emms - jmp term_1718_common_store - - align 64 - -term_18_loop: - movq mm3, [edi+esi] ; get previous calculated value - movq mm0, mm3 - psubd mm3, [edi+esi*2] - psrad mm3, 1 - paddd mm3, mm0 ; mm3 = sam_AB - - movq mm1, mm3 - pslld mm1, 17 - psrld mm1, 17 - pmaddwd mm1, mm5 - - movq mm0, mm3 - pslld mm0, 1 - psrld mm0, 16 - pmaddwd mm0, mm5 - - movq mm2, [edi] ; mm2 = left_right - pslld mm0, 5 - paddd mm1, mm7 ; add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 ; add shifted sums - movq mm0, mm3 - movq [edi+ebx], mm2 ; store result - pxor mm0, mm2 - psrad mm0, 31 ; mm0 = sign (sam_AB ^ left_right) - sub edi, esi - pxor mm1, mm1 ; mm1 = zero - pcmpeqd mm2, mm1 ; mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 ; mm3 = 1s if sam_AB was zero - por mm2, mm3 ; mm2 = 1s if either was zero - pandn mm2, mm6 ; mask delta with zeros check - pxor mm5, mm0 - paddd mm5, mm2 ; and add to weight_AB - pxor mm5, mm0 - dec ecx - paddd mm4, mm5 ; add weights to sum - jnz term_18_loop - - mov eax, [ebp+8] ; access dpp - movq [eax+8], mm5 ; put weight_AB back - movq [eax+88], mm4 ; put sum_AB back - emms - -term_1718_common_store: - - mov eax, [ebp+8] ; access dpp - add edi, esi ; back up a full sample - mov edx, [edi+4] ; dpp->samples_B [0] = iptr [-1]; - mov [eax+48], edx - mov edx, [edi] ; dpp->samples_A [0] = iptr [-2]; - mov [eax+16], edx - add edi, esi ; back up another sample - mov edx, [edi+4] ; dpp->samples_B [1] = iptr [-3]; - mov [eax+52], edx - mov edx, [edi] ; dpp->samples_A [1] = iptr [-4]; - mov [eax+20], edx - jmp done - - align 64 - -term_minus_1_loop: - movq mm3, [edi+esi] ; mm3 = previous calculated value - movq mm2, [edi] ; mm2 = left_right - psrlq mm3, 32 - punpckldq mm3, mm2 ; mm3 = sam_AB - - movq mm1, mm3 - pslld mm1, 17 - psrld mm1, 17 - pmaddwd mm1, mm5 - - movq mm0, mm3 - pslld mm0, 1 - psrld mm0, 16 - pmaddwd mm0, mm5 - - pslld mm0, 5 - paddd mm1, mm7 ; add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 ; add shifted sums - movq mm0, mm3 - movq [edi+ebx], mm2 ; store result - pxor mm0, mm2 - psrad mm0, 31 ; mm0 = sign (sam_AB ^ left_right) - sub edi, esi - pxor mm1, mm1 ; mm1 = zero - pcmpeqd mm2, mm1 ; mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 ; mm3 = 1s if sam_AB was zero - por mm2, mm3 ; mm2 = 1s if either was zero - pandn mm2, mm6 ; mask delta with zeros check - pcmpeqd mm1, mm1 - psubd mm1, mm7 - psubd mm1, mm7 - psubd mm1, mm0 - pxor mm5, mm0 - paddd mm5, mm1 - paddusw mm5, mm2 ; and add to weight_AB - psubd mm5, mm1 - pxor mm5, mm0 - paddd mm4, mm5 ; add weights to sum - dec ecx - jnz term_minus_1_loop - - mov eax, [ebp+8] ; access dpp - movq [eax+8], mm5 ; put weight_AB back - movq [eax+88], mm4 ; put sum_AB back - emms - - add edi, esi ; back up a full sample - mov edx, [edi+4] ; dpp->samples_A [0] = iptr [-1]; - mov eax, [ebp+8] - mov [eax+16], edx - jmp done - - align 64 - -term_minus_2_loop: - movq mm2, [edi] ; mm2 = left_right - movq mm3, mm2 ; mm3 = swap dwords - psrlq mm3, 32 - punpckldq mm3, [edi+esi] ; mm3 = sam_AB - - movq mm1, mm3 - pslld mm1, 17 - psrld mm1, 17 - pmaddwd mm1, mm5 - - movq mm0, mm3 - pslld mm0, 1 - psrld mm0, 16 - pmaddwd mm0, mm5 - - pslld mm0, 5 - paddd mm1, mm7 ; add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 ; add shifted sums - movq mm0, mm3 - movq [edi+ebx], mm2 ; store result - pxor mm0, mm2 - psrad mm0, 31 ; mm0 = sign (sam_AB ^ left_right) - sub edi, esi - pxor mm1, mm1 ; mm1 = zero - pcmpeqd mm2, mm1 ; mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 ; mm3 = 1s if sam_AB was zero - por mm2, mm3 ; mm2 = 1s if either was zero - pandn mm2, mm6 ; mask delta with zeros check - pcmpeqd mm1, mm1 - psubd mm1, mm7 - psubd mm1, mm7 - psubd mm1, mm0 - pxor mm5, mm0 - paddd mm5, mm1 - paddusw mm5, mm2 ; and add to weight_AB - psubd mm5, mm1 - pxor mm5, mm0 - paddd mm4, mm5 ; add weights to sum - dec ecx - jnz term_minus_2_loop - - mov eax, [ebp+8] ; access dpp - movq [eax+8], mm5 ; put weight_AB back - movq [eax+88], mm4 ; put sum_AB back - emms - - add edi, esi ; back up a full sample - mov edx, [edi] ; dpp->samples_B [0] = iptr [-2]; - mov eax, [ebp+8] - mov [eax+48], edx - jmp done - - align 64 - -term_minus_3_loop: - movq mm0, [edi+esi] ; mm0 = previous calculated value - movq mm3, mm0 ; mm3 = swap dwords - psrlq mm3, 32 - punpckldq mm3, mm0 ; mm3 = sam_AB - - movq mm1, mm3 - pslld mm1, 17 - psrld mm1, 17 - pmaddwd mm1, mm5 - - movq mm0, mm3 - pslld mm0, 1 - psrld mm0, 16 - pmaddwd mm0, mm5 - - movq mm2, [edi] ; mm2 = left_right - pslld mm0, 5 - paddd mm1, mm7 ; add 512 for rounding - psrad mm1, 10 - psubd mm2, mm0 - psubd mm2, mm1 ; add shifted sums - movq mm0, mm3 - movq [edi+ebx], mm2 ; store result - pxor mm0, mm2 - psrad mm0, 31 ; mm0 = sign (sam_AB ^ left_right) - sub edi, esi - pxor mm1, mm1 ; mm1 = zero - pcmpeqd mm2, mm1 ; mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 ; mm3 = 1s if sam_AB was zero - por mm2, mm3 ; mm2 = 1s if either was zero - pandn mm2, mm6 ; mask delta with zeros check - pcmpeqd mm1, mm1 - psubd mm1, mm7 - psubd mm1, mm7 - psubd mm1, mm0 - pxor mm5, mm0 - paddd mm5, mm1 - paddusw mm5, mm2 ; and add to weight_AB - psubd mm5, mm1 - pxor mm5, mm0 - paddd mm4, mm5 ; add weights to sum - dec ecx - jnz term_minus_3_loop - - mov eax, [ebp+8] ; access dpp - movq [eax+8], mm5 ; put weight_AB back - movq [eax+88], mm4 ; put sum_AB back - emms - - add edi, esi ; back up a full sample - mov edx, [edi+4] ; dpp->samples_A [0] = iptr [-1]; - mov eax, [ebp+8] - mov [eax+16], edx - mov edx, [edi] ; dpp->samples_B [0] = iptr [-2]; - mov [eax+48], edx - -done: pop edi - pop esi - pop ebx - leave - ret - - -; This is an assembly optimized version of the following WavPack function: -; -; uint32_t decorr_mono_buffer (int32_t *buffer, -; struct decorr_pass *decorr_passes, -; int32_t num_terms, -; int32_t sample_count) -; -; Decorrelate a buffer of mono samples, in place, as specified by the array -; of decorr_pass structures. Note that this function does NOT return the -; dpp->samples_X[] values in the "normalized" positions for terms 1-8, so if -; the number of samples is not a multiple of MAX_TERM, these must be moved if -; they are to be used somewhere else. The magnitude of the output samples is -; accumulated and returned (see scan_max_magnitude() for more details). By -; using the overflow detection of the multiply instruction, this detects -; when the "long_math" varient is required. -; -; For the fastest possible operation with the four "common" decorrelation -; filters (i.e, fast, normal, high and very high) this function can be -; configured to include hardcoded versions of these filters that are created -; using macros. In that case, the passed filter is checked to make sure that -; it matches one of the four. If it doesn't, or if the hardcoded flters are -; not enabled, a "general" version of the decorrelation loop is used. This -; variable enables the hardcoded filters and can be disabled if there are -; problems with the code or macros: - - HARDCODED_FILTERS = 1 - -; This is written to work on an IA-32 processor. The arguments are on the -; stack at these locations (after 6 pushes, we do not use ebp as a base -; pointer): -; -; int32_t *buffer [esp+28] -; struct decorr_pass *dpp [esp+32] -; int32_t num_terms [esp+36] -; int32_t sample_count [esp+40] -; -; register usage: -; -; ecx = sample being decorrelated -; esi = sample up counter -; edi = *buffer -; ebp = *dpp -; -; stack usage: -; -; [esp+0] = dpp end ptr (unused in hardcoded filter case) -; [esp+4] = magnitude accumulator -; - if HARDCODED_FILTERS -; -; This macro is used for checking the decorr_passes array to make sure that the terms match -; the hardcoded terms. The terms of these filters are the first element in the tables defined -; in decorr_tables.h (with the negative terms replaced with 1). -; - -chkterm macro term, ebp_offset - cmp BYTE PTR [ebp], term - jnz use_general_version - add ebp, ebp_offset - endm - -; -; This macro processes the single specified term (with a fixed delta of 2) and updates the -; term pointer (rbp) with the specified offset when done. It assumes the following registers: -; -; ecx = sample being decorrelated -; esi = sample up counter (used for terms 1-8) -; rbp = decorr_pass pointer for this term (updated with "rbp_offset" when done) -; rax, rbx, rdx = scratch -; - -exeterm macro term, ebp_offset - local over, cont, done - - if term le 8 - mov eax, esi - and eax, 7 - mov ebx, [ebp+16+eax*4] - if term ne 8 - add eax, term - and eax, 7 - endif - mov [ebp+16+eax*4], ecx - - elseif term eq 17 - - mov edx, [ebp+16] ; handle term 17 - mov [ebp+16], ecx - lea ebx, [edx+edx] - sub ebx, [ebp+20] - mov [ebp+20], edx - - else - - mov edx, [ebp+16] ; handle term 18 - mov [ebp+16], ecx - lea ebx, [edx+edx*2] - sub ebx, [ebp+20] - sar ebx, 1 - mov [ebp+20], edx - - endif - - mov eax, [ebp+8] - imul eax, ebx ; 32-bit multiply is almost always enough - jo over ; but handle overflow if it happens - sar eax, 10 - sbb ecx, eax ; borrow flag provides rounding - jmp cont -over: mov eax, [ebp+8] ; perform 64-bit multiply on overflow - imul ebx - shr eax, 10 - sbb ecx, eax - shl edx, 22 - sub ecx, edx -cont: je done - test ebx, ebx - je done - xor ebx, ecx - sar ebx, 30 - or ebx, 1 ; this generates delta of 1 - sal ebx, 1 ; this generates delta of 2 - add [ebp+8], ebx -done: add ebp, ebp_offset - - endm - - endif ; end of macro definitions - -; entry point of function - -_pack_decorr_mono_buffer_x86: - push ebp ; save the resgister that we need to - push ebx - push esi - push edi - xor eax, eax - push eax ; this is magnitude accumulator - push eax ; this will be dpp end ptr - - mov edi, [esp+28] ; edi is buffer pointer - xor esi, esi ; up counter = 0 - - cmp DWORD PTR [esp+40], 0 ; test & handle zero sample count & zero term count - jz mexit - cmp DWORD PTR [esp+36], 0 - jz mexit - - if HARDCODED_FILTERS - -; first check to make sure all the "deltas" are 2 - - mov ebp, [esp+32] ; ebp is decorr_pass pointer - mov ebx, [esp+36] ; get term count -deltas: cmp BYTE PTR [ebp+4], 2 ; make sure all the deltas are 2 - jnz use_general_version ; if any aren't, use general case - add ebp, 96 - dec ebx - jnz deltas - - mov ebp, [esp+32] ; ebp is decorr_pass pointer - mov edx, [esp+36] ; get term count - cmp dl, 2 ; 2 terms is "fast" - jnz nfast - chkterm 18, 96 ; check "fast" terms - chkterm 17, -96 - jmp mono_fast_loop - -nfast: cmp dl, 5 ; 5 terms is "normal" - jnz nnorm - chkterm 18, 96 ; check "normal" terms - chkterm 18, 96 - chkterm 2, 96 - chkterm 17, 96 - chkterm 3, 96*-4 - jmp mono_normal_loop - -nnorm: cmp dl, 10 ; 10 terms is "high" - jnz nhigh - chkterm 18, 96 ; check "high" terms - chkterm 18, 96 - chkterm 18, 96 - chkterm 1, 96 - chkterm 2, 96 - chkterm 3, 96 - chkterm 5, 96 - chkterm 1, 96 - chkterm 17, 96 - chkterm 4, 96*-9 - jmp mono_high_loop - -nhigh: cmp dl, 16 ; 16 terms is "very high" - jnz use_general_version ; if none of these, use general version - chkterm 18, 96 ; else check "very high" terms - chkterm 18, 96 - chkterm 2, 96 - chkterm 3, 96 - chkterm 1, 96 - chkterm 18, 96 - chkterm 2, 96 - chkterm 4, 96 - chkterm 7, 96 - chkterm 5, 96 - chkterm 3, 96 - chkterm 6, 96 - chkterm 8, 96 - chkterm 1, 96 - chkterm 18, 96 - chkterm 2, 96*-15 - jmp mono_vhigh_loop - - align 64 - -mono_fast_loop: - mov ecx, [edi+esi*4] ; ecx is the sample we're decorrelating - - exeterm 18, 96 - exeterm 17, -96 - - mov [edi+esi*4], ecx ; store completed sample - mov eax, ecx ; magnitude accumulator |= (sample < 0) ? ~sample : sample - cdq - xor eax, edx - or [esp+4], eax - inc esi ; increment sample index - cmp esi, [esp+40] - jnz mono_fast_loop ; loop back for all samples - jmp mexit - - align 64 - -mono_normal_loop: - mov ecx, [edi+esi*4] ; ecx is the sample we're decorrelating - - exeterm 18, 96 - exeterm 18, 96 - exeterm 2, 96 - exeterm 17, 96 - exeterm 3, 96*-4 - - mov [edi+esi*4], ecx ; store completed sample - mov eax, ecx ; magnitude accumulator |= (sample < 0) ? ~sample : sample - cdq - xor eax, edx - or [esp+4], eax - inc esi ; increment sample index - cmp esi, [esp+40] - jnz mono_normal_loop ; loop back for all samples - jmp mexit - - align 64 - -mono_high_loop: - mov ecx, [edi+esi*4] ; ecx is the sample we're decorrelating - - exeterm 18, 96 - exeterm 18, 96 - exeterm 18, 96 - exeterm 1, 96 - exeterm 2, 96 - exeterm 3, 96 - exeterm 5, 96 - exeterm 1, 96 - exeterm 17, 96 - exeterm 4, 96*-9 - - mov [edi+esi*4], ecx ; store completed sample - mov eax, ecx ; magnitude accumulator |= (sample < 0) ? ~sample : sample - cdq - xor eax, edx - or [esp+4], eax - inc esi ; increment sample index - cmp esi, [esp+40] - jnz mono_high_loop ; loop back for all samples - jmp mexit - - align 64 - -mono_vhigh_loop: - mov ecx, [edi+esi*4] ; ecx is the sample we're decorrelating - - exeterm 18, 96 - exeterm 18, 96 - exeterm 2, 96 - exeterm 3, 96 - exeterm 1, 96 - exeterm 18, 96 - exeterm 2, 96 - exeterm 4, 96 - exeterm 7, 96 - exeterm 5, 96 - exeterm 3, 96 - exeterm 6, 96 - exeterm 8, 96 - exeterm 1, 96 - exeterm 18, 96 - exeterm 2, 96*-15 - - mov [edi+esi*4], ecx ; store completed sample - mov eax, ecx ; magnitude accumulator |= (sample < 0) ? ~sample : sample - cdq - xor eax, edx - or [esp+4], eax - inc esi ; increment sample index - cmp esi, [esp+40] - jnz mono_vhigh_loop ; loop back for all samples - jmp mexit - - endif ; end of HARDCODED_FILTERS - -use_general_version: - mov ebp, [esp+32] - mov edx, [esp+36] ; get number of terms - imul eax, edx, 96 ; calculate & store termination check ptr - add eax, [esp+32] - mov [esp], eax - jmp decorrelate_loop - - align 64 - -decorrelate_loop: - mov ecx, [edi+esi*4] ; ecx is the sample we're decorrelating -nxterm: mov edx, [ebp] - cmp dl, 17 - jge @f - - mov eax, esi - and eax, 7 - mov ebx, [ebp+16+eax*4] - add eax, edx - and eax, 7 - mov [ebp+16+eax*4], ecx - jmp domult - - align 4 -@@: mov edx, [ebp+16] - mov [ebp+16], ecx - je @f - lea ebx, [edx+edx*2] - sub ebx, [ebp+20] - sar ebx, 1 - mov [ebp+20], edx - jmp domult - - align 4 -@@: lea ebx, [edx+edx] - sub ebx, [ebp+20] - mov [ebp+20], edx - -domult: mov eax, [ebp+8] - mov edx, eax - imul eax, ebx - jo multov ; on overflow, jump to use 64-bit imul varient - sar eax, 10 - sbb ecx, eax - je @f - test ebx, ebx - je @f - xor ebx, ecx - sar ebx, 31 - xor edx, ebx - add edx, [ebp+4] - xor edx, ebx - mov [ebp+8], edx -@@: add ebp, 96 - cmp ebp, [esp] - jnz nxterm - - mov [edi+esi*4], ecx ; store completed sample - mov eax, ecx ; magnitude accumulator |= (sample < 0) ? ~sample : sample - cdq - xor eax, edx - or [esp+4], eax - mov ebp, [esp+32] ; reload decorr_passes pointer to first term - inc esi ; increment sample index - cmp esi, [esp+40] - jnz decorrelate_loop - jmp mexit - - align 4 -multov: mov eax, [ebp+8] - imul ebx - shr eax, 10 - sbb ecx, eax - shl edx, 22 - sub ecx, edx - je @f - test ebx, ebx - je @f - xor ebx, ecx - sar ebx, 31 - mov eax, [ebp+8] - xor eax, ebx - add eax, [ebp+4] - xor eax, ebx - mov [ebp+8], eax -@@: add ebp, 96 - cmp ebp, [esp] - jnz nxterm - - mov [edi+esi*4], ecx ; store completed sample - mov eax, ecx ; magnitude accumulator |= (sample < 0) ? ~sample : sample - cdq - xor eax, edx - or [esp+4], eax - mov ebp, [esp+32] ; reload decorr_passes pointer to first term - inc esi ; increment sample index - cmp esi, [esp+40] - jnz decorrelate_loop ; loop all the way back this time - -mexit: pop eax - pop eax ; pop magnitude accumulator - pop edi - pop esi - pop ebx - pop ebp - ret - - -; This is an assembly optimized version of the following WavPack function: -; -; void decorr_mono_pass_cont (int32_t *out_buffer, -; int32_t *in_buffer, -; struct decorr_pass *dpp, -; int32_t sample_count); -; -; It performs a single pass of mono decorrelation, transfering from the -; input buffer to the output buffer. Note that this version of the function -; requires that the up to 8 previous (depending on dpp->term) mono samples -; are visible and correct. In other words, it ignores the "samples_*" -; fields in the decorr_pass structure and gets the history data directly -; from the source buffer. It does, however, return the appropriate history -; samples to the decorr_pass structure before returning. -; -; By using the overflow detection of the multiply instruction, it detects -; when the "long_math" varient is required and automatically does it. -; -; This is written to work on an IA-32 processor. The arguments on entry: -; -; int32_t *out_buffer [ebp+8] -; int32_t *in_buffer [ebp+12] -; struct decorr_pass *dpp [ebp+16] -; int32_t sample_count [ebp+20] -; -; Register / stack usage: -; -; esi = source ptr -; edi = destination ptr -; ecx = term * -4 (default terms) -; ecx = previous sample (terms 17 & 18) -; ebp = weight -; [esp] = delta -; [esp+4] = weight sum -; [esp+8] = eptr -; - -_pack_decorr_mono_pass_cont_x86: - push ebp - mov ebp, esp - push ebx ; save the registers that we need to - push esi - push edi - cld - - mov esi, [ebp+12] - mov edi, [ebp+8] - mov edx, [ebp+16] ; edx = *dpp - mov ecx, [ebp+20] ; ecx = sample count - mov ebp, [edx+8] ; ebp = weight - lea eax, [esi+ecx*4] ; calc & push eptr (access with [esp+8]) - push eax - mov eax, [edx+88] ; push dpp->sum_A (access with [esp+4]) - push eax - mov eax, [edx+4] ; push delta (access with [esp]) - push eax - test ecx, ecx ; test for and handle zero count - jz mono_done - - cld ; we use lodsd/stosd - mov ecx, [esi-4] ; preload last sample - mov eax, [edx] ; get term & branch for terms 17 & 18 - cmp eax, 17 - je mono_term_17_loop - cmp eax, 18 - je mono_term_18_loop - - imul ecx, eax, -4 ; ecx is index to correlation sample now - jmp mono_default_term_loop - - align 64 - -mono_default_term_loop: - mov edx, [esi+ecx] - mov ebx, edx - imul edx, ebp - jo over - lodsd - sar edx, 10 - sbb eax, edx - jmp @f -over: mov eax, ebx - imul ebp - shl edx, 22 - shr eax, 10 - adc edx, eax ; edx = apply_weight (sam_A) - lodsd - sub eax, edx -@@: stosd - je @f - test ebx, ebx - je @f - xor eax, ebx - cdq - xor ebp, edx - add ebp, [esp] - xor ebp, edx -@@: add [esp+4], ebp - cmp esi, [esp+8] - jnz mono_default_term_loop - - mov ecx, ebp ; ecx = weight - mov eax, [esp+4] ; eax = weight sum - lea ebp, [esp+24] ; restore ebp (we've pushed 6 DWORDS) - mov edx, [ebp+16] ; edx = *dpp - mov [edx+8], ecx ; put weight back - mov [edx+88], eax ; put dpp->sum_A back - mov ecx, [edx] ; ecx = dpp->term - -mono_default_store_samples: - dec ecx - sub esi, 4 ; back up one sample - mov eax, [esi] - mov [edx+ecx*4+16], eax ; store samples_A [ecx] - test ecx, ecx - jnz mono_default_store_samples - jmp mono_done - - align 64 - -mono_term_17_loop: - lea edx, [ecx+ecx] - sub edx, [esi-8] ; ebx = sam_A - mov ebx, edx - imul edx, ebp - jo over17 - sar edx, 10 - lodsd - mov ecx, eax - sbb eax, edx - jmp @f -over17: mov eax, ebx - imul ebp - shl edx, 22 - shr eax, 10 - adc edx, eax ; edx = apply_weight (sam_A) - lodsd - mov ecx, eax - sub eax, edx -@@: stosd - je @f - test ebx, ebx - je @f - xor eax, ebx - cdq - xor ebp, edx - add ebp, [esp] - xor ebp, edx -@@: add [esp+4], ebp - cmp esi, [esp+8] - jnz mono_term_17_loop - jmp mono_term_1718_exit - - align 64 - -mono_term_18_loop: - lea edx, [ecx+ecx*2] - sub edx, [esi-8] - sar edx, 1 - mov ebx, edx ; ebx = sam_A - imul edx, ebp - jo over18 - sar edx, 10 - lodsd - mov ecx, eax - sbb eax, edx - jmp @f -over18: mov eax, ebx - imul ebp - shl edx, 22 - shr eax, 10 - adc edx, eax ; edx = apply_weight (sam_A) - lodsd - mov ecx, eax - sub eax, edx -@@: stosd - je @f - test ebx, ebx - je @f - xor eax, ebx - cdq - xor ebp, edx - add ebp, [esp] - xor ebp, edx -@@: add [esp+4], ebp - cmp esi, [esp+8] - jnz mono_term_18_loop - -mono_term_1718_exit: - mov ecx, ebp ; ecx = weight - mov eax, [esp+4] ; eax = weight sum - lea ebp, [esp+24] ; restore ebp (we've pushed 6 DWORDS) - mov edx, [ebp+16] ; edx = *dpp - mov [edx+8], ecx ; put weight back - mov [edx+88], eax ; put dpp->sum_A back - mov eax, [esi-4] ; dpp->samples_A [0] = bptr [-1] - mov [edx+16], eax - mov eax, [esi-8] ; dpp->samples_A [1] = bptr [-2] - mov [edx+20], eax - -mono_done: - add esp, 12 ; deallocate stack space - pop edi ; pop saved registers & return - pop esi - pop ebx - pop ebp - ret - - -; This is an assembly optimized version of the following WavPack function: -; -; uint32_t scan_max_magnitude (int32_t *buffer, int32_t sample_count); -; -; This function scans a buffer of signed 32-bit ints and returns the magnitude -; of the largest sample, with a power-of-two resolution. It might be more -; useful to return the actual maximum absolute value, but that implementation -; would be slower. Instead, this simply returns the "or" of all the values -; "xor"d with their own sign, like so: -; -; while (sample_count--) -; magnitude |= (*buffer < 0) ? ~*buffer++ : *buffer++; -; -; This is written to work on an IA-32 processor and uses the MMX extensions -; to improve the performance by processing two samples together. The arguments -; are on the stack at these locations (after 4 pushes, we do not use ebp as a -; base pointer): -; -; int32_t *buffer [esp+20] -; uint32_t sample_count [esp+24] -; -; During the processing loops, the following registers are used: -; -; edi buffer pointer -; esi termination buffer pointer -; ebx single magnitude accumulator -; mm0 dual magnitude accumulator -; mm1, mm2 scratch -; - -_scan_max_magnitude_x86: - push ebp - push ebx - push esi - push edi - - xor ebx, ebx ; clear magnitude accumulator - mov edi, [esp+20] ; edi = buffer pointer - - mov eax, [esp+24] ; eax = count - and eax, 7 - mov ecx, eax ; ecx = leftover samples to "manually" scan at end - - mov eax, [esp+24] ; eax = count - shr eax, 3 ; eax = num of loops to process mmx (8 samples/loop) - shl eax, 5 ; eax = num of bytes to process mmx (32 bytes/loop) - jz nommx ; jump around if no mmx loops to do (< 8 samples) - - pxor mm0, mm0 ; clear dual magnitude accumulator - add eax, edi ; esi = termination buffer pointer for mmx loop - mov esi, eax - jmp mmxlp - - align 64 - -mmxlp: movq mm1, [edi] ; get stereo samples in mm1 & mm2 - movq mm2, mm1 - psrad mm1, 31 ; mm1 = sign (mm2) - pxor mm1, mm2 ; mm1 = absolute magnitude, or into result - por mm0, mm1 - - movq mm1, [edi+8] ; do it again with 6 more samples - movq mm2, mm1 - psrad mm1, 31 - pxor mm1, mm2 - por mm0, mm1 - - movq mm1, [edi+16] - movq mm2, mm1 - psrad mm1, 31 - pxor mm1, mm2 - por mm0, mm1 - - movq mm1, [edi+24] - movq mm2, mm1 - psrad mm1, 31 - pxor mm1, mm2 - por mm0, mm1 - - add edi, 32 - cmp edi, esi - jnz mmxlp - - movd eax, mm0 ; ebx = "or" of high and low mm0 - punpckhdq mm0, mm0 - movd ebx, mm0 - or ebx, eax - emms - -nommx: and ecx, ecx ; any leftover samples to do? - jz noleft - -leftlp: mov eax, [edi] - cdq - xor eax, edx - or ebx, eax - add edi, 4 - loop leftlp - -noleft: mov eax, ebx ; move magnitude to eax for return - pop edi - pop esi - pop ebx - pop ebp - ret - - -; This is an assembly optimized version of the following WavPack function: -; -; uint32_t log2buffer (int32_t *samples, uint32_t num_samples, int limit); -; -; This function scans a buffer of 32-bit ints and accumulates the total -; log2 value of all the samples. This is useful for determining maximum -; compression because the bitstream storage required for entropy coding -; is proportional to the base 2 log of the samples. -; -; This is written to work on an IA-32 processor. The arguments are on the -; stack at these locations (after 4 pushes, we do not use ebp as a base -; pointer): -; -; int32_t *samples [esp+20] -; uint32_t num_samples [esp+24] -; int limit [esp+28] -; -; During the processing loops, the following registers are used: -; -; esi input buffer pointer -; edi sum accumulator -; ebx sample count -; ebp log2_table pointer -; eax,ecx,edx scratch -; - - align 256 - .radix 16 - -log2_table: - byte 000, 001, 003, 004, 006, 007, 009, 00a, 00b, 00d, 00e, 010, 011, 012, 014, 015 - byte 016, 018, 019, 01a, 01c, 01d, 01e, 020, 021, 022, 024, 025, 026, 028, 029, 02a - byte 02c, 02d, 02e, 02f, 031, 032, 033, 034, 036, 037, 038, 039, 03b, 03c, 03d, 03e - byte 03f, 041, 042, 043, 044, 045, 047, 048, 049, 04a, 04b, 04d, 04e, 04f, 050, 051 - byte 052, 054, 055, 056, 057, 058, 059, 05a, 05c, 05d, 05e, 05f, 060, 061, 062, 063 - byte 064, 066, 067, 068, 069, 06a, 06b, 06c, 06d, 06e, 06f, 070, 071, 072, 074, 075 - byte 076, 077, 078, 079, 07a, 07b, 07c, 07d, 07e, 07f, 080, 081, 082, 083, 084, 085 - byte 086, 087, 088, 089, 08a, 08b, 08c, 08d, 08e, 08f, 090, 091, 092, 093, 094, 095 - byte 096, 097, 098, 099, 09a, 09b, 09b, 09c, 09d, 09e, 09f, 0a0, 0a1, 0a2, 0a3, 0a4 - byte 0a5, 0a6, 0a7, 0a8, 0a9, 0a9, 0aa, 0ab, 0ac, 0ad, 0ae, 0af, 0b0, 0b1, 0b2, 0b2 - byte 0b3, 0b4, 0b5, 0b6, 0b7, 0b8, 0b9, 0b9, 0ba, 0bb, 0bc, 0bd, 0be, 0bf, 0c0, 0c0 - byte 0c1, 0c2, 0c3, 0c4, 0c5, 0c6, 0c6, 0c7, 0c8, 0c9, 0ca, 0cb, 0cb, 0cc, 0cd, 0ce - byte 0cf, 0d0, 0d0, 0d1, 0d2, 0d3, 0d4, 0d4, 0d5, 0d6, 0d7, 0d8, 0d8, 0d9, 0da, 0db - byte 0dc, 0dc, 0dd, 0de, 0df, 0e0, 0e0, 0e1, 0e2, 0e3, 0e4, 0e4, 0e5, 0e6, 0e7, 0e7 - byte 0e8, 0e9, 0ea, 0ea, 0eb, 0ec, 0ed, 0ee, 0ee, 0ef, 0f0, 0f1, 0f1, 0f2, 0f3, 0f4 - byte 0f4, 0f5, 0f6, 0f7, 0f7, 0f8, 0f9, 0f9, 0fa, 0fb, 0fc, 0fc, 0fd, 0fe, 0ff, 0ff - - .radix 10 - -_log2buffer_x86: - push ebp - push ebx - push esi - push edi - cld - - mov esi, [esp+20] ; esi = sample source pointer - xor edi, edi ; edi = 0 (accumulator) - mov ebx, [esp+24] ; ebx = num_samples - test ebx, ebx ; exit now if none, sum = 0 - jz normal_exit - -; These three instructions allow this to be PIC (position independent code). The purpose is to -; load the address of the log2_table into ebp regardless of where this is all loaded in memory. - - call nexti ; push address of nexti (return address) -nexti: pop ebp ; pop address of nexti into ebp - sub ebp, nexti - log2_table ; offset to log2_table - - mov eax, [esp+28] ; eax = limit - test eax, eax ; we have separate loops for limit and no limit - jz no_limit_loop - jmp limit_loop - - align 64 - -limit_loop: - mov eax, [esi] ; get next sample into eax - cdq ; edx = sign of sample (for abs) - add esi, 4 - xor eax, edx - sub eax, edx - je L40 ; skip if sample was zero - mov edx, eax ; move to edx and apply rounding - shr eax, 9 - add edx, eax - bsr ecx, edx ; ecx = MSB set in sample (0 - 31) - lea eax, [ecx+1] ; eax = number used bits in sample (1 - 32) - sub ecx, 8 ; ecx = shift right amount (-8 to 23) - ror edx, cl ; use rotate to do "signed" shift - sal eax, 8 ; move nbits to integer portion of log - movzx edx, dl ; dl = mantissa, look up log fraction in table - mov al, BYTE PTR [ebp+edx] ; eax = combined integer and fraction for full log - add edi, eax ; add to running sum and compare to limit - cmp eax, [esp+28] - jge limit_exceeded -L40: sub ebx, 1 ; loop back if more samples - jne limit_loop - jmp normal_exit - - align 64 - -no_limit_loop: - mov eax, [esi] ; get next sample into eax - cdq ; edx = sign of sample (for abs) - add esi, 4 - xor eax, edx - sub eax, edx - je L45 ; skip if sample was zero - mov edx, eax ; move to edx and apply rounding - shr eax, 9 - add edx, eax - bsr ecx, edx ; ecx = MSB set in sample (0 - 31) - lea eax, [ecx+1] ; eax = number used bits in sample (1 - 32) - sub ecx, 8 ; ecx = shift right amount (-8 to 23) - ror edx, cl ; use rotate to do "signed" shift - sal eax, 8 ; move nbits to integer portion of log - movzx edx, dl ; dl = mantissa, look up log fraction in table - mov al, BYTE PTR [ebp+edx] ; eax = combined integer and fraction for full log - add edi, eax ; add to running sum -L45: sub ebx, 1 ; loop back if more samples - jne no_limit_loop - jmp normal_exit - -limit_exceeded: - mov edi, -1 ; -1 return means log limit exceeded -normal_exit: - mov eax, edi ; move sum accumulator into eax for return - pop edi - pop esi - pop ebx - pop ebp - ret - -; Helper function to determine if specified CPU feature is available (used here for MMX). -; Input parameter is index of feature to be checked (EDX from CPUID(1) only, MMX = 23). -; Return value is the specified bit (0 or 1) or 0 if CPUID is not supported. - -_pack_cpu_has_feature_x86: - pushfd ; save eflags - pushfd ; push another copy - xor dword ptr [esp], 200000h ; toggle ID bit on stack & pop it back into eflags - popfd - pushfd ; store possibly modified eflags - pop eax ; and pop back into eax - xor eax, [esp] ; compare to original pushed eflags - popfd ; restore original eflags - and eax, 200000h ; eax = 1 if eflags ID bit was changable - jz oldcpu ; return zero if CPUID is not available (wow!) - - push ebx ; we must save ebx - mov eax, 1 ; do cpuid (1) to get features into edx - cpuid - mov eax, edx ; copy into eax for shift - mov cl, [esp+8] ; get parameter and shift that bit index into LSB - sar eax, cl - and eax, 1 - pop ebx ; restore ebx and return 0 or 1 - -oldcpu: ret ; return value in eax - -asmcode ends - - end - diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/read_words.c b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/read_words.c deleted file mode 100644 index bbe2db52..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/read_words.c +++ /dev/null @@ -1,614 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2013 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// read_words.c - -// This module provides entropy word decoding functions using -// a variation on the Rice method. This was introduced in version 3.93 -// because it allows splitting the data into a "lossy" stream and a -// "correction" stream in a very efficient manner and is therefore ideal -// for the "hybrid" mode. For 4.0, the efficiency of this method was -// significantly improved by moving away from the normal Rice restriction of -// using powers of two for the modulus divisions and now the method can be -// used for both hybrid and pure lossless encoding. - -// Samples are divided by median probabilities at 5/7 (71.43%), 10/49 (20.41%), -// and 20/343 (5.83%). Each zone has 3.5 times fewer samples than the -// previous. Using standard Rice coding on this data would result in 1.4 -// bits per sample average (not counting sign bit). However, there is a -// very simple encoding that is over 99% efficient with this data and -// results in about 1.22 bits per sample. - -#include -#include - -#include "wavpack_local.h" - -#if defined (HAVE___BUILTIN_CTZ) || defined (_WIN64) -#define USE_CTZ_OPTIMIZATION // use ctz intrinsic (or Windows equivalent) to count trailing ones -#else -#define USE_NEXT8_OPTIMIZATION // optimization using a table to count trailing ones -#endif - -#define USE_BITMASK_TABLES // use tables instead of shifting for certain masking operations - -///////////////////////////// local table storage //////////////////////////// - -#ifdef USE_NEXT8_OPTIMIZATION -static const char ones_count_table [] = { - 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5, - 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6, - 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5, - 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7, - 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5, - 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6, - 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5, - 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,8 -}; -#endif - -///////////////////////////// executable code //////////////////////////////// - -static uint32_t __inline read_code (Bitstream *bs, uint32_t maxcode); - -// Read the next word from the bitstream "wvbits" and return the value. This -// function can be used for hybrid or lossless streams, but since an -// optimized version is available for lossless this function would normally -// be used for hybrid only. If a hybrid lossless stream is being read then -// the "correction" offset is written at the specified pointer. A return value -// of WORD_EOF indicates that the end of the bitstream was reached (all 1s) or -// some other error occurred. - -int32_t FASTCALL get_word (WavpackStream *wps, int chan, int32_t *correction) -{ - register struct entropy_data *c = wps->w.c + chan; - uint32_t ones_count, low, mid, high; - int32_t value; - int sign; - - if (!wps->wvbits.ptr) - return WORD_EOF; - - if (correction) - *correction = 0; - - if (!(wps->w.c [0].median [0] & ~1) && !wps->w.holding_zero && !wps->w.holding_one && !(wps->w.c [1].median [0] & ~1)) { - uint32_t mask; - int cbits; - - if (wps->w.zeros_acc) { - if (--wps->w.zeros_acc) { - c->slow_level -= (c->slow_level + SLO) >> SLS; - return 0; - } - } - else { - for (cbits = 0; cbits < 33 && getbit (&wps->wvbits); ++cbits); - - if (cbits == 33) - return WORD_EOF; - - if (cbits < 2) - wps->w.zeros_acc = cbits; - else { - for (mask = 1, wps->w.zeros_acc = 0; --cbits; mask <<= 1) - if (getbit (&wps->wvbits)) - wps->w.zeros_acc |= mask; - - wps->w.zeros_acc |= mask; - } - - if (wps->w.zeros_acc) { - c->slow_level -= (c->slow_level + SLO) >> SLS; - CLEAR (wps->w.c [0].median); - CLEAR (wps->w.c [1].median); - return 0; - } - } - } - - if (wps->w.holding_zero) - ones_count = wps->w.holding_zero = 0; - else { -#ifdef USE_CTZ_OPTIMIZATION - while (wps->wvbits.bc < LIMIT_ONES) { - if (++(wps->wvbits.ptr) == wps->wvbits.end) - wps->wvbits.wrap (&wps->wvbits); - - wps->wvbits.sr |= *(wps->wvbits.ptr) << wps->wvbits.bc; - wps->wvbits.bc += sizeof (*(wps->wvbits.ptr)) * 8; - } - -#ifdef _WIN32 - { unsigned long res; _BitScanForward (&res, (unsigned long)~wps->wvbits.sr); ones_count = (uint32_t) res; } -#else - ones_count = __builtin_ctz (~wps->wvbits.sr); -#endif - - if (ones_count >= LIMIT_ONES) { - wps->wvbits.bc -= ones_count; - wps->wvbits.sr >>= ones_count; - - for (; ones_count < (LIMIT_ONES + 1) && getbit (&wps->wvbits); ++ones_count); - - if (ones_count == (LIMIT_ONES + 1)) - return WORD_EOF; - - if (ones_count == LIMIT_ONES) { - uint32_t mask; - int cbits; - - for (cbits = 0; cbits < 33 && getbit (&wps->wvbits); ++cbits); - - if (cbits == 33) - return WORD_EOF; - - if (cbits < 2) - ones_count = cbits; - else { - for (mask = 1, ones_count = 0; --cbits; mask <<= 1) - if (getbit (&wps->wvbits)) - ones_count |= mask; - - ones_count |= mask; - } - - ones_count += LIMIT_ONES; - } - } - else { - wps->wvbits.bc -= ones_count + 1; - wps->wvbits.sr >>= ones_count + 1; - } -#elif defined (USE_NEXT8_OPTIMIZATION) - int next8; - - if (wps->wvbits.bc < 8) { - if (++(wps->wvbits.ptr) == wps->wvbits.end) - wps->wvbits.wrap (&wps->wvbits); - - next8 = (wps->wvbits.sr |= *(wps->wvbits.ptr) << wps->wvbits.bc) & 0xff; - wps->wvbits.bc += sizeof (*(wps->wvbits.ptr)) * 8; - } - else - next8 = wps->wvbits.sr & 0xff; - - if (next8 == 0xff) { - wps->wvbits.bc -= 8; - wps->wvbits.sr >>= 8; - - for (ones_count = 8; ones_count < (LIMIT_ONES + 1) && getbit (&wps->wvbits); ++ones_count); - - if (ones_count == (LIMIT_ONES + 1)) - return WORD_EOF; - - if (ones_count == LIMIT_ONES) { - uint32_t mask; - int cbits; - - for (cbits = 0; cbits < 33 && getbit (&wps->wvbits); ++cbits); - - if (cbits == 33) - return WORD_EOF; - - if (cbits < 2) - ones_count = cbits; - else { - for (mask = 1, ones_count = 0; --cbits; mask <<= 1) - if (getbit (&wps->wvbits)) - ones_count |= mask; - - ones_count |= mask; - } - - ones_count += LIMIT_ONES; - } - } - else { - wps->wvbits.bc -= (ones_count = ones_count_table [next8]) + 1; - wps->wvbits.sr >>= ones_count + 1; - } -#else - for (ones_count = 0; ones_count < (LIMIT_ONES + 1) && getbit (&wps->wvbits); ++ones_count); - - if (ones_count >= LIMIT_ONES) { - uint32_t mask; - int cbits; - - if (ones_count == (LIMIT_ONES + 1)) - return WORD_EOF; - - for (cbits = 0; cbits < 33 && getbit (&wps->wvbits); ++cbits); - - if (cbits == 33) - return WORD_EOF; - - if (cbits < 2) - ones_count = cbits; - else { - for (mask = 1, ones_count = 0; --cbits; mask <<= 1) - if (getbit (&wps->wvbits)) - ones_count |= mask; - - ones_count |= mask; - } - - ones_count += LIMIT_ONES; - } -#endif - - if (wps->w.holding_one) { - wps->w.holding_one = ones_count & 1; - ones_count = (ones_count >> 1) + 1; - } - else { - wps->w.holding_one = ones_count & 1; - ones_count >>= 1; - } - - wps->w.holding_zero = ~wps->w.holding_one & 1; - } - - if ((wps->wphdr.flags & HYBRID_FLAG) && !chan) - update_error_limit (wps); - - if (ones_count == 0) { - low = 0; - high = GET_MED (0) - 1; - DEC_MED0 (); - } - else { - low = GET_MED (0); - INC_MED0 (); - - if (ones_count == 1) { - high = low + GET_MED (1) - 1; - DEC_MED1 (); - } - else { - low += GET_MED (1); - INC_MED1 (); - - if (ones_count == 2) { - high = low + GET_MED (2) - 1; - DEC_MED2 (); - } - else { - low += (ones_count - 2) * GET_MED (2); - high = low + GET_MED (2) - 1; - INC_MED2 (); - } - } - } - - low &= 0x7fffffff; - high &= 0x7fffffff; - - if (low > high) // make sure high and low make sense - high = low; - - mid = (high + low + 1) >> 1; - - if (!c->error_limit) - mid = read_code (&wps->wvbits, high - low) + low; - else while (high - low > c->error_limit) { - if (getbit (&wps->wvbits)) - mid = (high + (low = mid) + 1) >> 1; - else - mid = ((high = mid - 1) + low + 1) >> 1; - } - - sign = getbit (&wps->wvbits); - - if (bs_is_open (&wps->wvcbits) && c->error_limit) { - value = read_code (&wps->wvcbits, high - low) + low; - - if (correction) - *correction = sign ? (mid - value) : (value - mid); - } - - if (wps->wphdr.flags & HYBRID_BITRATE) { - c->slow_level -= (c->slow_level + SLO) >> SLS; - c->slow_level += wp_log2 (mid); - } - - return sign ? ~mid : mid; -} - -// This is an optimized version of get_word() that is used for lossless only -// (error_limit == 0). Also, rather than obtaining a single sample, it can be -// used to obtain an entire buffer of either mono or stereo samples. - -int32_t get_words_lossless (WavpackStream *wps, int32_t *buffer, int32_t nsamples) -{ - struct entropy_data *c = wps->w.c; - uint32_t ones_count, low, high; - Bitstream *bs = &wps->wvbits; - int32_t csamples; -#ifdef USE_NEXT8_OPTIMIZATION - int32_t next8; -#endif - - if (nsamples && !bs->ptr) { - memset (buffer, 0, (wps->wphdr.flags & MONO_DATA) ? nsamples * 4 : nsamples * 8); - return nsamples; - } - - if (!(wps->wphdr.flags & MONO_DATA)) - nsamples *= 2; - - for (csamples = 0; csamples < nsamples; ++csamples) { - if (!(wps->wphdr.flags & MONO_DATA)) - c = wps->w.c + (csamples & 1); - - if (wps->w.holding_zero) { - wps->w.holding_zero = 0; - low = read_code (bs, GET_MED (0) - 1); - DEC_MED0 (); - buffer [csamples] = (getbit (bs)) ? ~low : low; - - if (++csamples == nsamples) - break; - - if (!(wps->wphdr.flags & MONO_DATA)) - c = wps->w.c + (csamples & 1); - } - - if (wps->w.c [0].median [0] < 2 && !wps->w.holding_one && wps->w.c [1].median [0] < 2) { - uint32_t mask; - int cbits; - - if (wps->w.zeros_acc) { - if (--wps->w.zeros_acc) { - buffer [csamples] = 0; - continue; - } - } - else { - for (cbits = 0; cbits < 33 && getbit (bs); ++cbits); - - if (cbits == 33) - break; - - if (cbits < 2) - wps->w.zeros_acc = cbits; - else { - for (mask = 1, wps->w.zeros_acc = 0; --cbits; mask <<= 1) - if (getbit (bs)) - wps->w.zeros_acc |= mask; - - wps->w.zeros_acc |= mask; - } - - if (wps->w.zeros_acc) { - CLEAR (wps->w.c [0].median); - CLEAR (wps->w.c [1].median); - buffer [csamples] = 0; - continue; - } - } - } - -#ifdef USE_CTZ_OPTIMIZATION - while (bs->bc < LIMIT_ONES) { - if (++(bs->ptr) == bs->end) - bs->wrap (bs); - - bs->sr |= *(bs->ptr) << bs->bc; - bs->bc += sizeof (*(bs->ptr)) * 8; - } - -#ifdef _WIN32 - { unsigned long res; _BitScanForward (&res, (unsigned long)~wps->wvbits.sr); ones_count = (uint32_t) res; } -#else - ones_count = __builtin_ctz (~wps->wvbits.sr); -#endif - - if (ones_count >= LIMIT_ONES) { - bs->bc -= ones_count; - bs->sr >>= ones_count; - - for (; ones_count < (LIMIT_ONES + 1) && getbit (bs); ++ones_count); - - if (ones_count == (LIMIT_ONES + 1)) - break; - - if (ones_count == LIMIT_ONES) { - uint32_t mask; - int cbits; - - for (cbits = 0; cbits < 33 && getbit (bs); ++cbits); - - if (cbits == 33) - break; - - if (cbits < 2) - ones_count = cbits; - else { - for (mask = 1, ones_count = 0; --cbits; mask <<= 1) - if (getbit (bs)) - ones_count |= mask; - - ones_count |= mask; - } - - ones_count += LIMIT_ONES; - } - } - else { - bs->bc -= ones_count + 1; - bs->sr >>= ones_count + 1; - } -#elif defined (USE_NEXT8_OPTIMIZATION) - if (bs->bc < 8) { - if (++(bs->ptr) == bs->end) - bs->wrap (bs); - - next8 = (bs->sr |= *(bs->ptr) << bs->bc) & 0xff; - bs->bc += sizeof (*(bs->ptr)) * 8; - } - else - next8 = bs->sr & 0xff; - - if (next8 == 0xff) { - bs->bc -= 8; - bs->sr >>= 8; - - for (ones_count = 8; ones_count < (LIMIT_ONES + 1) && getbit (bs); ++ones_count); - - if (ones_count == (LIMIT_ONES + 1)) - break; - - if (ones_count == LIMIT_ONES) { - uint32_t mask; - int cbits; - - for (cbits = 0; cbits < 33 && getbit (bs); ++cbits); - - if (cbits == 33) - break; - - if (cbits < 2) - ones_count = cbits; - else { - for (mask = 1, ones_count = 0; --cbits; mask <<= 1) - if (getbit (bs)) - ones_count |= mask; - - ones_count |= mask; - } - - ones_count += LIMIT_ONES; - } - } - else { - bs->bc -= (ones_count = ones_count_table [next8]) + 1; - bs->sr >>= ones_count + 1; - } -#else - for (ones_count = 0; ones_count < (LIMIT_ONES + 1) && getbit (bs); ++ones_count); - - if (ones_count >= LIMIT_ONES) { - uint32_t mask; - int cbits; - - if (ones_count == (LIMIT_ONES + 1)) - break; - - for (cbits = 0; cbits < 33 && getbit (bs); ++cbits); - - if (cbits == 33) - break; - - if (cbits < 2) - ones_count = cbits; - else { - for (mask = 1, ones_count = 0; --cbits; mask <<= 1) - if (getbit (bs)) - ones_count |= mask; - - ones_count |= mask; - } - - ones_count += LIMIT_ONES; - } -#endif - - low = wps->w.holding_one; - wps->w.holding_one = ones_count & 1; - wps->w.holding_zero = ~ones_count & 1; - ones_count = (ones_count >> 1) + low; - - if (ones_count == 0) { - low = 0; - high = GET_MED (0) - 1; - DEC_MED0 (); - } - else { - low = GET_MED (0); - INC_MED0 (); - - if (ones_count == 1) { - high = low + GET_MED (1) - 1; - DEC_MED1 (); - } - else { - low += GET_MED (1); - INC_MED1 (); - - if (ones_count == 2) { - high = low + GET_MED (2) - 1; - DEC_MED2 (); - } - else { - low += (ones_count - 2) * GET_MED (2); - high = low + GET_MED (2) - 1; - INC_MED2 (); - } - } - } - - low += read_code (bs, high - low); - buffer [csamples] = (getbit (bs)) ? ~low : low; - } - - return (wps->wphdr.flags & MONO_DATA) ? csamples : (csamples / 2); -} - -// Read a single unsigned value from the specified bitstream with a value -// from 0 to maxcode. If there are exactly a power of two number of possible -// codes then this will read a fixed number of bits; otherwise it reads the -// minimum number of bits and then determines whether another bit is needed -// to define the code. - -static uint32_t __inline read_code (Bitstream *bs, uint32_t maxcode) -{ - unsigned long local_sr; - uint32_t extras, code; - int bitcount; - - if (maxcode < 2) - return maxcode ? getbit (bs) : 0; - - bitcount = count_bits (maxcode); -#ifdef USE_BITMASK_TABLES - extras = bitset [bitcount] - maxcode - 1; -#else - extras = (1 << bitcount) - maxcode - 1; -#endif - - local_sr = bs->sr; - - while (bs->bc < bitcount) { - if (++(bs->ptr) == bs->end) - bs->wrap (bs); - - local_sr |= (long)*(bs->ptr) << bs->bc; - bs->bc += sizeof (*(bs->ptr)) * 8; - } - -#ifdef USE_BITMASK_TABLES - if ((code = local_sr & bitmask [bitcount - 1]) >= extras) -#else - if ((code = local_sr & ((1 << (bitcount - 1)) - 1)) >= extras) -#endif - code = (code << 1) - extras + ((local_sr >> (bitcount - 1)) & 1); - else - bitcount--; - - if (sizeof (local_sr) < 8 && bs->bc > sizeof (local_sr) * 8) { - bs->bc -= bitcount; - bs->sr = *(bs->ptr) >> (sizeof (*(bs->ptr)) * 8 - bs->bc); - } - else { - bs->bc -= bitcount; - bs->sr = local_sr >> bitcount; - } - - return code; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/tag_utils.c b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/tag_utils.c deleted file mode 100644 index f98e1dd6..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/tag_utils.c +++ /dev/null @@ -1,597 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2013 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// tag_utils.c - -// This module provides the high-level API for creating, reading and editing -// APEv2 tags on WavPack files. Read-only support is also provided for ID3v1 -// tags, but their use is not recommended. - -#include -#include - -#include "wavpack_local.h" - -#ifdef _WIN32 -#define stricmp(x,y) _stricmp(x,y) -#else -#define stricmp strcasecmp -#endif - -static int get_ape_tag_item (M_Tag *m_tag, const char *item, char *value, int size, int type); -static int get_id3_tag_item (M_Tag *m_tag, const char *item, char *value, int size); -static int get_ape_tag_item_indexed (M_Tag *m_tag, int index, char *item, int size, int type); -static int get_id3_tag_item_indexed (M_Tag *m_tag, int index, char *item, int size); -static int append_ape_tag_item (WavpackContext *wpc, const char *item, const char *value, int vsize, int type); -static int write_tag_blockout (WavpackContext *wpc); -static int write_tag_reader (WavpackContext *wpc); -static void tagcpy (char *dest, char *src, int tag_size); -static int tagdata (char *src, int tag_size); - -//////////////////// Global functions part of external API ///////////////////////// - -// Count and return the total number of tag items in the specified file. - -int WavpackGetNumTagItems (WavpackContext *wpc) -{ - int i = 0; - - while (WavpackGetTagItemIndexed (wpc, i, NULL, 0)) - ++i; - - return i; -} - -// Count and return the total number of binary tag items in the specified file. This applies -// only to APEv2 tags and was implemented as a separate function to avoid breaking the old API. - -int WavpackGetNumBinaryTagItems (WavpackContext *wpc) -{ - int i = 0; - - while (WavpackGetBinaryTagItemIndexed (wpc, i, NULL, 0)) - ++i; - - return i; -} - -// Attempt to get the specified item from the specified file's ID3v1 or APEv2 -// tag. The "size" parameter specifies the amount of space available at "value", -// if the desired item will not fit in this space then ellipses (...) will -// be appended and the string terminated. Only text data are supported. The -// actual length of the string is returned (or 0 if no matching value found). -// Note that with APEv2 tags the length might not be the same as the number of -// characters because UTF-8 encoding is used. Also, APEv2 tags can have multiple -// (NULL separated) strings for a single value (this is why the length is -// returned). If this function is called with a NULL "value" pointer (or a -// zero "length") then only the actual length of the value data is returned -// (not counting the terminating NULL). This can be used to determine the -// actual memory to be allocated beforehand. - -int WavpackGetTagItem (WavpackContext *wpc, const char *item, char *value, int size) -{ - M_Tag *m_tag = &wpc->m_tag; - - if (value && size) - *value = 0; - - if (m_tag->ape_tag_hdr.ID [0] == 'A') - return get_ape_tag_item (m_tag, item, value, size, APE_TAG_TYPE_TEXT); - else if (m_tag->id3_tag.tag_id [0] == 'T') - return get_id3_tag_item (m_tag, item, value, size); - else - return 0; -} - -// Attempt to get the specified binary item from the specified file's APEv2 -// tag. The "size" parameter specifies the amount of space available at "value". -// If the desired item will not fit in this space then nothing will be copied -// and 0 will be returned, otherwise the actual size will be returned. If this -// function is called with a NULL "value" pointer (or a zero "length") then only -// the actual length of the value data is returned and can be used to determine -// the actual memory to be allocated beforehand. - -int WavpackGetBinaryTagItem (WavpackContext *wpc, const char *item, char *value, int size) -{ - M_Tag *m_tag = &wpc->m_tag; - - if (value && size) - *value = 0; - - if (m_tag->ape_tag_hdr.ID [0] == 'A') - return get_ape_tag_item (m_tag, item, value, size, APE_TAG_TYPE_BINARY); - else - return 0; -} - -// This function looks up the tag item name by index and is used when the -// application wants to access all the items in the file's ID3v1 or APEv2 tag. -// Note that this function accesses only the item's name; WavpackGetTagItem() -// still must be called to get the actual value. The "size" parameter specifies -// the amount of space available at "item", if the desired item will not fit in -// this space then ellipses (...) will be appended and the string terminated. -// The actual length of the string is returned (or 0 if no item exists for -// index). If this function is called with a NULL "value" pointer (or a -// zero "length") then only the actual length of the item name is returned -// (not counting the terminating NULL). This can be used to determine the -// actual memory to be allocated beforehand. For binary tag values use the -// otherwise identical WavpackGetBinaryTagItemIndexed (); - -int WavpackGetTagItemIndexed (WavpackContext *wpc, int index, char *item, int size) -{ - M_Tag *m_tag = &wpc->m_tag; - - if (item && size) - *item = 0; - - if (m_tag->ape_tag_hdr.ID [0] == 'A') - return get_ape_tag_item_indexed (m_tag, index, item, size, APE_TAG_TYPE_TEXT); - else if (m_tag->id3_tag.tag_id [0] == 'T') - return get_id3_tag_item_indexed (m_tag, index, item, size); - else - return 0; -} - -int WavpackGetBinaryTagItemIndexed (WavpackContext *wpc, int index, char *item, int size) -{ - M_Tag *m_tag = &wpc->m_tag; - - if (item && size) - *item = 0; - - if (m_tag->ape_tag_hdr.ID [0] == 'A') - return get_ape_tag_item_indexed (m_tag, index, item, size, APE_TAG_TYPE_BINARY); - else - return 0; -} - -// These two functions are used to append APEv2 tags to WavPack files; one is -// for text values (UTF-8 encoded) and the other is for binary values. If no tag -// has been started, then an empty one will be allocated first. When finished, -// use WavpackWriteTag() to write the completed tag to the file. The purpose of -// the passed size parameter is obvious for binary values, but might not be for -// text values. Keep in mind that APEv2 text values can have multiple values -// that are NULL separated, so the size is required to know the extent of the -// value (although the final terminating NULL is not included in the passed -// size). If the specified item already exists, it will be replaced with the -// new value. ID3v1 tags are not supported. - -int WavpackAppendTagItem (WavpackContext *wpc, const char *item, const char *value, int vsize) -{ - while (WavpackDeleteTagItem (wpc, item)); - return append_ape_tag_item (wpc, item, value, vsize, APE_TAG_TYPE_TEXT); -} - -int WavpackAppendBinaryTagItem (WavpackContext *wpc, const char *item, const char *value, int vsize) -{ - while (WavpackDeleteTagItem (wpc, item)); - return append_ape_tag_item (wpc, item, value, vsize, APE_TAG_TYPE_BINARY); -} - -// Delete the specified tag item from the APEv2 tag on the specified WavPack file -// (fields cannot be deleted from ID3v1 tags). A return value of TRUE indicates -// that the item was found and successfully deleted. - -int WavpackDeleteTagItem (WavpackContext *wpc, const char *item) -{ - M_Tag *m_tag = &wpc->m_tag; - - if (m_tag->ape_tag_hdr.ID [0] == 'A') { - unsigned char *p = m_tag->ape_tag_data; - unsigned char *q = p + m_tag->ape_tag_hdr.length - sizeof (APE_Tag_Hdr); - int i; - - for (i = 0; i < m_tag->ape_tag_hdr.item_count; ++i) { - int vsize, isize; - - vsize = p[0] + (p[1] << 8) + (p[2] << 16) + (p[3] << 24); p += 8; // skip flags because we don't need them - for (isize = 0; p[isize] && p + isize < q; ++isize); - - if (vsize < 0 || vsize > m_tag->ape_tag_hdr.length || p + isize + vsize + 1 > q) - break; - - if (isize && vsize && !stricmp (item, (char *) p)) { - unsigned char *d = p - 8; - - p += isize + vsize + 1; - - while (p < q) - *d++ = *p++; - - m_tag->ape_tag_hdr.length = (int32_t)(d - m_tag->ape_tag_data) + sizeof (APE_Tag_Hdr); - m_tag->ape_tag_hdr.item_count--; - return 1; - } - else - p += isize + vsize + 1; - } - } - - return 0; -} - -// Once a APEv2 tag has been created with WavpackAppendTag(), this function is -// used to write the completed tag to the end of the WavPack file. Note that -// this function uses the same "blockout" function that is used to write -// regular WavPack blocks, although that's where the similarity ends. It is also -// used to write tags that have been edited on existing files. - -int WavpackWriteTag (WavpackContext *wpc) -{ - if (wpc->blockout) // this is the case for creating fresh WavPack files - return write_tag_blockout (wpc); - else // otherwise we are editing existing tags (OPEN_EDIT_TAGS) - return write_tag_reader (wpc); -} - -////////////////////////// local static functions ///////////////////////////// - -static int get_ape_tag_item (M_Tag *m_tag, const char *item, char *value, int size, int type) -{ - unsigned char *p = m_tag->ape_tag_data; - unsigned char *q = p + m_tag->ape_tag_hdr.length - sizeof (APE_Tag_Hdr); - int i; - - for (i = 0; i < m_tag->ape_tag_hdr.item_count && q - p > 8; ++i) { - int vsize, flags, isize; - - vsize = p[0] + (p[1] << 8) + (p[2] << 16) + (p[3] << 24); p += 4; - flags = p[0] + (p[1] << 8) + (p[2] << 16) + (p[3] << 24); p += 4; - for (isize = 0; p[isize] && p + isize < q; ++isize); - - if (vsize < 0 || vsize > m_tag->ape_tag_hdr.length || p + isize + vsize + 1 > q) - break; - - if (isize && vsize && !stricmp (item, (char *) p) && ((flags & 6) >> 1) == type) { - - if (!value || !size) - return vsize; - - if (type == APE_TAG_TYPE_BINARY) { - if (vsize <= size) { - memcpy (value, p + isize + 1, vsize); - return vsize; - } - else - return 0; - } - else if (vsize < size) { - memcpy (value, p + isize + 1, vsize); - value [vsize] = 0; - return vsize; - } - else if (size >= 4) { - memcpy (value, p + isize + 1, size - 1); - value [size - 4] = value [size - 3] = value [size - 2] = '.'; - value [size - 1] = 0; - return size - 1; - } - else - return 0; - } - else - p += isize + vsize + 1; - } - - return 0; -} - -static int get_id3_tag_item (M_Tag *m_tag, const char *item, char *value, int size) -{ - char lvalue [64]; - int len; - - lvalue [0] = 0; - - if (!stricmp (item, "title")) - tagcpy (lvalue, m_tag->id3_tag.title, sizeof (m_tag->id3_tag.title)); - else if (!stricmp (item, "artist")) - tagcpy (lvalue, m_tag->id3_tag.artist, sizeof (m_tag->id3_tag.artist)); - else if (!stricmp (item, "album")) - tagcpy (lvalue, m_tag->id3_tag.album, sizeof (m_tag->id3_tag.album)); - else if (!stricmp (item, "year")) - tagcpy (lvalue, m_tag->id3_tag.year, sizeof (m_tag->id3_tag.year)); - else if (!stricmp (item, "comment")) - tagcpy (lvalue, m_tag->id3_tag.comment, sizeof (m_tag->id3_tag.comment)); - else if (!stricmp (item, "track") && m_tag->id3_tag.comment [29] && !m_tag->id3_tag.comment [28]) - sprintf (lvalue, "%d", m_tag->id3_tag.comment [29]); - else - return 0; - - len = (int) strlen (lvalue); - - if (!value || !size) - return len; - - if (len < size) { - strcpy (value, lvalue); - return len; - } - else if (size >= 4) { - strncpy (value, lvalue, size - 1); - value [size - 4] = value [size - 3] = value [size - 2] = '.'; - value [size - 1] = 0; - return size - 1; - } - else - return 0; -} - -static int get_ape_tag_item_indexed (M_Tag *m_tag, int index, char *item, int size, int type) -{ - unsigned char *p = m_tag->ape_tag_data; - unsigned char *q = p + m_tag->ape_tag_hdr.length - sizeof (APE_Tag_Hdr); - int i; - - for (i = 0; i < m_tag->ape_tag_hdr.item_count && index >= 0 && q - p > 8; ++i) { - int vsize, flags, isize; - - vsize = p[0] + (p[1] << 8) + (p[2] << 16) + (p[3] << 24); p += 4; - flags = p[0] + (p[1] << 8) + (p[2] << 16) + (p[3] << 24); p += 4; - for (isize = 0; p[isize] && p + isize < q; ++isize); - - if (vsize < 0 || vsize > m_tag->ape_tag_hdr.length || p + isize + vsize + 1 > q) - break; - - if (isize && vsize && ((flags & 6) >> 1) == type && !index--) { - - if (!item || !size) - return isize; - - if (isize < size) { - memcpy (item, p, isize); - item [isize] = 0; - return isize; - } - else if (size >= 4) { - memcpy (item, p, size - 1); - item [size - 4] = item [size - 3] = item [size - 2] = '.'; - item [size - 1] = 0; - return size - 1; - } - else - return 0; - } - else - p += isize + vsize + 1; - } - - return 0; -} - -static int get_id3_tag_item_indexed (M_Tag *m_tag, int index, char *item, int size) -{ - char lvalue [16]; - int len; - - lvalue [0] = 0; - - if (tagdata (m_tag->id3_tag.title, sizeof (m_tag->id3_tag.title)) && !index--) - strcpy (lvalue, "Title"); - else if (tagdata (m_tag->id3_tag.artist, sizeof (m_tag->id3_tag.artist)) && !index--) - strcpy (lvalue, "Artist"); - else if (tagdata (m_tag->id3_tag.album, sizeof (m_tag->id3_tag.album)) && !index--) - strcpy (lvalue, "Album"); - else if (tagdata (m_tag->id3_tag.year, sizeof (m_tag->id3_tag.year)) && !index--) - strcpy (lvalue, "Year"); - else if (tagdata (m_tag->id3_tag.comment, sizeof (m_tag->id3_tag.comment)) && !index--) - strcpy (lvalue, "Comment"); - else if (m_tag->id3_tag.comment [29] && !m_tag->id3_tag.comment [28] && !index--) - strcpy (lvalue, "Track"); - else - return 0; - - len = (int) strlen (lvalue); - - if (!item || !size) - return len; - - if (len < size) { - strcpy (item, lvalue); - return len; - } - else if (size >= 4) { - strncpy (item, lvalue, size - 1); - item [size - 4] = item [size - 3] = item [size - 2] = '.'; - item [size - 1] = 0; - return size - 1; - } - else - return 0; -} - -static int append_ape_tag_item (WavpackContext *wpc, const char *item, const char *value, int vsize, int type) -{ - M_Tag *m_tag = &wpc->m_tag; - int isize = (int) strlen (item); - - if (!m_tag->ape_tag_hdr.ID [0]) { - strncpy (m_tag->ape_tag_hdr.ID, "APETAGEX", sizeof (m_tag->ape_tag_hdr.ID)); - m_tag->ape_tag_hdr.version = 2000; - m_tag->ape_tag_hdr.length = sizeof (m_tag->ape_tag_hdr); - m_tag->ape_tag_hdr.item_count = 0; - m_tag->ape_tag_hdr.flags = APE_TAG_CONTAINS_HEADER; // we will include header on tags we originate - } - - if (m_tag->ape_tag_hdr.ID [0] == 'A') { - int new_item_len = vsize + isize + 9, flags = type << 1; - unsigned char *p; - - if (m_tag->ape_tag_hdr.length + new_item_len > APE_TAG_MAX_LENGTH) { - strcpy (wpc->error_message, "APEv2 tag exceeds maximum allowed length!"); - return FALSE; - } - - m_tag->ape_tag_hdr.item_count++; - m_tag->ape_tag_hdr.length += new_item_len; - p = m_tag->ape_tag_data = (unsigned char*)realloc (m_tag->ape_tag_data, m_tag->ape_tag_hdr.length); - p += m_tag->ape_tag_hdr.length - sizeof (APE_Tag_Hdr) - new_item_len; - - *p++ = (unsigned char) vsize; - *p++ = (unsigned char) (vsize >> 8); - *p++ = (unsigned char) (vsize >> 16); - *p++ = (unsigned char) (vsize >> 24); - - *p++ = (unsigned char) flags; - *p++ = (unsigned char) (flags >> 8); - *p++ = (unsigned char) (flags >> 16); - *p++ = (unsigned char) (flags >> 24); - - strcpy ((char *) p, item); - p += isize + 1; - memcpy (p, value, vsize); - - return TRUE; - } - else - return FALSE; -} - -// Append the stored APEv2 tag to the file being created using the "blockout" function callback. - -static int write_tag_blockout (WavpackContext *wpc) -{ - M_Tag *m_tag = &wpc->m_tag; - int result = TRUE; - - if (m_tag->ape_tag_hdr.ID [0] == 'A' && m_tag->ape_tag_hdr.item_count) { - - // only write header if it's specified in the flags - - if (m_tag->ape_tag_hdr.flags & APE_TAG_CONTAINS_HEADER) { - m_tag->ape_tag_hdr.flags |= APE_TAG_THIS_IS_HEADER; - WavpackNativeToLittleEndian (&m_tag->ape_tag_hdr, APE_Tag_Hdr_Format); - result = wpc->blockout (wpc->wv_out, &m_tag->ape_tag_hdr, sizeof (m_tag->ape_tag_hdr)); - WavpackLittleEndianToNative (&m_tag->ape_tag_hdr, APE_Tag_Hdr_Format); - } - - if (m_tag->ape_tag_hdr.length > sizeof (m_tag->ape_tag_hdr)) - result = wpc->blockout (wpc->wv_out, m_tag->ape_tag_data, m_tag->ape_tag_hdr.length - sizeof (m_tag->ape_tag_hdr)); - - m_tag->ape_tag_hdr.flags &= ~APE_TAG_THIS_IS_HEADER; // this is NOT header - WavpackNativeToLittleEndian (&m_tag->ape_tag_hdr, APE_Tag_Hdr_Format); - result = wpc->blockout (wpc->wv_out, &m_tag->ape_tag_hdr, sizeof (m_tag->ape_tag_hdr)); - WavpackLittleEndianToNative (&m_tag->ape_tag_hdr, APE_Tag_Hdr_Format); - } - - if (!result) - strcpy (wpc->error_message, "can't write WavPack data, disk probably full!"); - - return result; -} - -// Write the [potentially] edited tag to the existing WavPack file using the reader callback functions. - -static int write_tag_reader (WavpackContext *wpc) -{ - M_Tag *m_tag = &wpc->m_tag; - int32_t tag_size = 0; - int result; - - // before we write an edited (or new) tag into an existing file, make sure it's safe and possible - - if (m_tag->tag_begins_file) { - strcpy (wpc->error_message, "can't edit tags located at the beginning of files!"); - return FALSE; - } - - if (!wpc->reader->can_seek (wpc->wv_in)) { - strcpy (wpc->error_message, "can't edit tags on pipes or unseekable files!"); - return FALSE; - } - - if (!(wpc->open_flags & OPEN_EDIT_TAGS)) { - strcpy (wpc->error_message, "can't edit tags without OPEN_EDIT_TAGS flag!"); - return FALSE; - } - - if (m_tag->ape_tag_hdr.ID [0] == 'A' && m_tag->ape_tag_hdr.item_count && - m_tag->ape_tag_hdr.length > sizeof (m_tag->ape_tag_hdr)) - tag_size = m_tag->ape_tag_hdr.length; - - // only write header if it's specified in the flags - - if (tag_size && (m_tag->ape_tag_hdr.flags & APE_TAG_CONTAINS_HEADER)) - tag_size += sizeof (m_tag->ape_tag_hdr); - - result = !wpc->reader->set_pos_rel (wpc->wv_in, m_tag->tag_file_pos, SEEK_END); - - if (result && tag_size < -m_tag->tag_file_pos && !wpc->reader->truncate_here) { - int nullcnt = (int) (-m_tag->tag_file_pos - tag_size); - char zero [1] = { 0 }; - - while (nullcnt--) - wpc->reader->write_bytes (wpc->wv_in, &zero, 1); - } - - if (result && tag_size) { - if (m_tag->ape_tag_hdr.flags & APE_TAG_CONTAINS_HEADER) { - m_tag->ape_tag_hdr.flags |= APE_TAG_THIS_IS_HEADER; - WavpackNativeToLittleEndian (&m_tag->ape_tag_hdr, APE_Tag_Hdr_Format); - result = (wpc->reader->write_bytes (wpc->wv_in, &m_tag->ape_tag_hdr, sizeof (m_tag->ape_tag_hdr)) == sizeof (m_tag->ape_tag_hdr)); - WavpackLittleEndianToNative (&m_tag->ape_tag_hdr, APE_Tag_Hdr_Format); - } - - result = (wpc->reader->write_bytes (wpc->wv_in, m_tag->ape_tag_data, m_tag->ape_tag_hdr.length - sizeof (m_tag->ape_tag_hdr)) == sizeof (m_tag->ape_tag_hdr)); - m_tag->ape_tag_hdr.flags &= ~APE_TAG_THIS_IS_HEADER; // this is NOT header - WavpackNativeToLittleEndian (&m_tag->ape_tag_hdr, APE_Tag_Hdr_Format); - result = (wpc->reader->write_bytes (wpc->wv_in, &m_tag->ape_tag_hdr, sizeof (m_tag->ape_tag_hdr)) == sizeof (m_tag->ape_tag_hdr)); - WavpackLittleEndianToNative (&m_tag->ape_tag_hdr, APE_Tag_Hdr_Format); - } - - if (result && tag_size < -m_tag->tag_file_pos && wpc->reader->truncate_here) - result = !wpc->reader->truncate_here (wpc->wv_in); - - if (!result) - strcpy (wpc->error_message, "can't write WavPack data, disk probably full!"); - - return result; -} - -// Copy the specified ID3v1 tag value (with specified field size) from the -// source pointer to the destination, eliminating leading spaces and trailing -// spaces and nulls. - -static void tagcpy (char *dest, char *src, int tag_size) -{ - char *s1 = src, *s2 = src + tag_size - 1; - - if (*s2 && !s2 [-1]) - s2--; - - while (s1 <= s2) - if (*s1 == ' ') - ++s1; - else if (!*s2 || *s2 == ' ') - --s2; - else - break; - - while (*s1 && s1 <= s2) - *dest++ = *s1++; - - *dest = 0; -} - -static int tagdata (char *src, int tag_size) -{ - char *s1 = src, *s2 = src + tag_size - 1; - - if (*s2 && !s2 [-1]) - s2--; - - while (s1 <= s2) - if (*s1 == ' ') - ++s1; - else if (!*s2 || *s2 == ' ') - --s2; - else - break; - - return (*s1 && s1 <= s2); -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/tags.c b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/tags.c deleted file mode 100644 index 21884ea9..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/tags.c +++ /dev/null @@ -1,179 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2013 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// tags.c - -// This module provides support for reading metadata tags (either ID3v1 or -// APEv2) from WavPack files. No actual creation or manipulation of the tags -// is done in this module; this is just internal code to load the tags into -// memory. The high-level API functions are in the tag_utils.c module. - -#include -#include - -#include "wavpack_local.h" - -// This function attempts to load an ID3v1 or APEv2 tag from the specified -// file into the specified M_Tag structure. The ID3 tag fits in completely, -// but an APEv2 tag is variable length and so space must be allocated here -// to accomodate the data, and this will need to be freed later. A return -// value of TRUE indicates a valid tag was found and loaded. Note that the -// file pointer is undefined when this function exits. - -int load_tag (WavpackContext *wpc) -{ - int ape_tag_length, ape_tag_items; - M_Tag *m_tag = &wpc->m_tag; - - CLEAR (*m_tag); - - // This is a loop because we can try up to three times to look for an APEv2 tag. In order, we look: - // - // 1. At the end of the file for a APEv2 footer (this is the preferred location) - // 2. If there's instead an ID3v1 tag at the end of the file, try looking for an APEv2 footer right before that - // 3. If all else fails, look for an APEv2 header the the beginning of the file (use is strongly discouraged) - - while (1) { - - // seek based on specific location that we are looking for tag (see above list) - - if (m_tag->tag_begins_file) // case #3 - wpc->reader->set_pos_abs (wpc->wv_in, 0); - else if (m_tag->id3_tag.tag_id [0] == 'T') // case #2 - wpc->reader->set_pos_rel (wpc->wv_in, -(int32_t)(sizeof (APE_Tag_Hdr) + sizeof (ID3_Tag)), SEEK_END); - else // case #1 - wpc->reader->set_pos_rel (wpc->wv_in, -(int32_t)sizeof (APE_Tag_Hdr), SEEK_END); - - // read a possible APEv2 tag header/footer and see if there's one there... - - if (wpc->reader->read_bytes (wpc->wv_in, &m_tag->ape_tag_hdr, sizeof (APE_Tag_Hdr)) == sizeof (APE_Tag_Hdr) && - !strncmp (m_tag->ape_tag_hdr.ID, "APETAGEX", 8)) { - - WavpackLittleEndianToNative (&m_tag->ape_tag_hdr, APE_Tag_Hdr_Format); - - if (m_tag->ape_tag_hdr.version == 2000 && m_tag->ape_tag_hdr.item_count && - m_tag->ape_tag_hdr.length > sizeof (m_tag->ape_tag_hdr) && - m_tag->ape_tag_hdr.length <= APE_TAG_MAX_LENGTH && - (m_tag->ape_tag_data = (unsigned char *)malloc (m_tag->ape_tag_hdr.length)) != NULL) { - - ape_tag_items = m_tag->ape_tag_hdr.item_count; - ape_tag_length = m_tag->ape_tag_hdr.length; - - // If this is a APEv2 footer (which is normal if we are searching at the end of the file)... - - if (!(m_tag->ape_tag_hdr.flags & APE_TAG_THIS_IS_HEADER)) { - - if (m_tag->id3_tag.tag_id [0] == 'T') - m_tag->tag_file_pos = -(int32_t)sizeof (ID3_Tag); - else - m_tag->tag_file_pos = 0; - - m_tag->tag_file_pos -= ape_tag_length; - - // if the footer claims there is a header present also, we will read that and use it - // instead of the footer (after verifying it, of course) for enhanced robustness - - if (m_tag->ape_tag_hdr.flags & APE_TAG_CONTAINS_HEADER) - m_tag->tag_file_pos -= sizeof (APE_Tag_Hdr); - - wpc->reader->set_pos_rel (wpc->wv_in, m_tag->tag_file_pos, SEEK_END); - - if (m_tag->ape_tag_hdr.flags & APE_TAG_CONTAINS_HEADER) { - if (wpc->reader->read_bytes (wpc->wv_in, &m_tag->ape_tag_hdr, sizeof (APE_Tag_Hdr)) != - sizeof (APE_Tag_Hdr) || strncmp (m_tag->ape_tag_hdr.ID, "APETAGEX", 8)) { - free (m_tag->ape_tag_data); - CLEAR (*m_tag); - return FALSE; // something's wrong... - } - - WavpackLittleEndianToNative (&m_tag->ape_tag_hdr, APE_Tag_Hdr_Format); - - if (m_tag->ape_tag_hdr.version != 2000 || m_tag->ape_tag_hdr.item_count != ape_tag_items || - m_tag->ape_tag_hdr.length != ape_tag_length) { - free (m_tag->ape_tag_data); - CLEAR (*m_tag); - return FALSE; // something's wrong... - } - } - } - - if (wpc->reader->read_bytes (wpc->wv_in, m_tag->ape_tag_data, - ape_tag_length - sizeof (APE_Tag_Hdr)) != ape_tag_length - sizeof (APE_Tag_Hdr)) { - free (m_tag->ape_tag_data); - CLEAR (*m_tag); - return FALSE; // something's wrong... - } - else { - CLEAR (m_tag->id3_tag); // ignore ID3v1 tag if we found APEv2 tag - return TRUE; - } - } - } - - // we come here if the search for the APEv2 tag failed (otherwise we would have returned with it) - - if (m_tag->id3_tag.tag_id [0] == 'T') { // settle for the ID3v1 tag that we found - CLEAR (m_tag->ape_tag_hdr); - return TRUE; - } - - // if this was the search for the APEv2 tag at the beginning of the file (which is our - // last resort) then we have nothing, so return failure - - if (m_tag->tag_begins_file) { - CLEAR (*m_tag); - return FALSE; - } - - // If we get here, then we have failed the first APEv2 tag search (at end of file) and so now we - // look for an ID3v1 tag at the same position. If that succeeds, then we'll loop back and look for - // an APEv2 tag immediately before the ID3v1 tag, otherwise our last resort is to look for an - // APEv2 tag at the beginning of the file. These are strongly discouraged (and not editable) but - // they have been seen in the wild so we attempt to handle them here (at least well enough to - // allow a proper transcoding). - - m_tag->tag_file_pos = -(int32_t)sizeof (ID3_Tag); - wpc->reader->set_pos_rel (wpc->wv_in, m_tag->tag_file_pos, SEEK_END); - - if (wpc->reader->read_bytes (wpc->wv_in, &m_tag->id3_tag, sizeof (ID3_Tag)) != sizeof (ID3_Tag) || - strncmp (m_tag->id3_tag.tag_id, "TAG", 3)) { - m_tag->tag_begins_file = 1; // failed ID3v1, so look for APEv2 at beginning of file - CLEAR (m_tag->id3_tag); - } - } -} - -// Return TRUE is a valid ID3v1 or APEv2 tag has been loaded. - -int valid_tag (M_Tag *m_tag) -{ - if (m_tag->ape_tag_hdr.ID [0] == 'A') - return 'A'; - else if (m_tag->id3_tag.tag_id [0] == 'T') - return 'T'; - else - return 0; -} - -// Return FALSE if a valid APEv2 tag was only found at the beginning of the file (these are read-only -// because they cannot be edited without possibly shifting the entire file) - -int editable_tag (M_Tag *m_tag) -{ - return !m_tag->tag_begins_file; -} - -// Free the data for any APEv2 tag that was allocated. - -void free_tag (M_Tag *m_tag) -{ - if (m_tag->ape_tag_data) { - free (m_tag->ape_tag_data); - m_tag->ape_tag_data = NULL; - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack.c b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack.c deleted file mode 100644 index c5ae9f71..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack.c +++ /dev/null @@ -1,817 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2013 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// unpack.c - -// This module actually handles the decompression of the audio data, except for -// the entropy decoding which is handled by the read_words.c module. For better -// efficiency, the conversion is isolated to tight loops that handle an entire -// buffer. - -#include -#include - -#include "wavpack_local.h" - -#ifdef OPT_ASM_X86 - #define DECORR_STEREO_PASS_CONT unpack_decorr_stereo_pass_cont_x86 - #define DECORR_STEREO_PASS_CONT_AVAILABLE unpack_cpu_has_feature_x86(CPU_FEATURE_MMX) - #define DECORR_MONO_PASS_CONT unpack_decorr_mono_pass_cont_x86 -#elif defined(OPT_ASM_X64) && (defined (_WIN64) || defined(__CYGWIN__) || defined(__MINGW64__)) - #define DECORR_STEREO_PASS_CONT unpack_decorr_stereo_pass_cont_x64win - #define DECORR_STEREO_PASS_CONT_AVAILABLE 1 - #define DECORR_MONO_PASS_CONT unpack_decorr_mono_pass_cont_x64win -#elif defined(OPT_ASM_X64) - #define DECORR_STEREO_PASS_CONT unpack_decorr_stereo_pass_cont_x64 - #define DECORR_STEREO_PASS_CONT_AVAILABLE 1 - #define DECORR_MONO_PASS_CONT unpack_decorr_mono_pass_cont_x64 -#elif defined(OPT_ASM_ARM) - #define DECORR_STEREO_PASS_CONT unpack_decorr_stereo_pass_cont_armv7 - #define DECORR_STEREO_PASS_CONT_AVAILABLE 1 - #define DECORR_MONO_PASS_CONT unpack_decorr_mono_pass_cont_armv7 -#endif - -#ifdef DECORR_STEREO_PASS_CONT -extern void DECORR_STEREO_PASS_CONT (struct decorr_pass *dpp, int32_t *buffer, int32_t sample_count, int32_t long_math); -extern void DECORR_MONO_PASS_CONT (struct decorr_pass *dpp, int32_t *buffer, int32_t sample_count, int32_t long_math); -#endif - -// This flag provides the functionality of terminating the decoding and muting -// the output when a lossy sample appears to be corrupt. This is automatic -// for lossless files because a corrupt sample is unambigious, but for lossy -// data it might be possible for this to falsely trigger (although I have never -// seen it). - -#define LOSSY_MUTE - -///////////////////////////// executable code //////////////////////////////// - -// This monster actually unpacks the WavPack bitstream(s) into the specified -// buffer as 32-bit integers or floats (depending on orignal data). Lossy -// samples will be clipped to their original limits (i.e. 8-bit samples are -// clipped to -128/+127) but are still returned in longs. It is up to the -// caller to potentially reformat this for the final output including any -// multichannel distribution, block alignment or endian compensation. The -// function unpack_init() must have been called and the entire WavPack block -// must still be visible (although wps->blockbuff will not be accessed again). -// For maximum clarity, the function is broken up into segments that handle -// various modes. This makes for a few extra infrequent flag checks, but -// makes the code easier to follow because the nesting does not become so -// deep. For maximum efficiency, the conversion is isolated to tight loops -// that handle an entire buffer. The function returns the total number of -// samples unpacked, which can be less than the number requested if an error -// occurs or the end of the block is reached. - -static void decorr_stereo_pass (struct decorr_pass *dpp, int32_t *buffer, int32_t sample_count); -static void decorr_mono_pass (struct decorr_pass *dpp, int32_t *buffer, int32_t sample_count); -static void fixup_samples (WavpackContext *wpc, int32_t *buffer, uint32_t sample_count); - -int32_t unpack_samples (WavpackContext *wpc, int32_t *buffer, uint32_t sample_count) -{ - WavpackStream *wps = wpc->streams [wpc->current_stream]; - uint32_t flags = wps->wphdr.flags, crc = wps->crc, i; - int32_t mute_limit = (1L << ((flags & MAG_MASK) >> MAG_LSB)) + 2; - int32_t correction [2], read_word, *bptr; - struct decorr_pass *dpp; - int tcount, m = 0; - - // don't attempt to decode past the end of the block, but watch out for overflow! - - if (wps->sample_index + sample_count > GET_BLOCK_INDEX (wps->wphdr) + wps->wphdr.block_samples && - GET_BLOCK_INDEX (wps->wphdr) + wps->wphdr.block_samples - wps->sample_index < sample_count) - sample_count = (uint32_t) (GET_BLOCK_INDEX (wps->wphdr) + wps->wphdr.block_samples - wps->sample_index); - - if (GET_BLOCK_INDEX (wps->wphdr) > wps->sample_index || wps->wphdr.block_samples < sample_count) - wps->mute_error = TRUE; - - if (wps->mute_error) { - if (wpc->reduced_channels == 1 || wpc->config.num_channels == 1 || (flags & MONO_FLAG)) - memset (buffer, 0, sample_count * 4); - else - memset (buffer, 0, sample_count * 8); - - wps->sample_index += sample_count; - return sample_count; - } - - if ((flags & HYBRID_FLAG) && !wps->block2buff) - mute_limit = (mute_limit * 2) + 128; - - //////////////// handle lossless or hybrid lossy mono data ///////////////// - - if (!wps->block2buff && (flags & MONO_DATA)) { - int32_t *eptr = buffer + sample_count; - - if (flags & HYBRID_FLAG) { - i = sample_count; - - for (bptr = buffer; bptr < eptr;) - if ((*bptr++ = get_word (wps, 0, NULL)) == WORD_EOF) { - i = (uint32_t)(bptr - buffer); - break; - } - } - else - i = get_words_lossless (wps, buffer, sample_count); - -#ifdef DECORR_MONO_PASS_CONT - if (sample_count < 16) - for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++) - decorr_mono_pass (dpp, buffer, sample_count); - else - for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++) { - int pre_samples = (dpp->term > MAX_TERM) ? 2 : dpp->term; - - decorr_mono_pass (dpp, buffer, pre_samples); - - DECORR_MONO_PASS_CONT (dpp, buffer + pre_samples, sample_count - pre_samples, - ((flags & MAG_MASK) >> MAG_LSB) > 15); - } -#else - for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++) - decorr_mono_pass (dpp, buffer, sample_count); -#endif - -#ifndef LOSSY_MUTE - if (!(flags & HYBRID_FLAG)) -#endif - for (bptr = buffer; bptr < eptr; ++bptr) { - if (labs (bptr [0]) > mute_limit) { - i = (uint32_t)(bptr - buffer); - break; - } - - crc = crc * 3 + bptr [0]; - } -#ifndef LOSSY_MUTE - else - for (bptr = buffer; bptr < eptr; ++bptr) - crc = crc * 3 + bptr [0]; -#endif - } - - /////////////// handle lossless or hybrid lossy stereo data /////////////// - - else if (!wps->block2buff && !(flags & MONO_DATA)) { - int32_t *eptr = buffer + (sample_count * 2); - - if (flags & HYBRID_FLAG) { - i = sample_count; - - for (bptr = buffer; bptr < eptr; bptr += 2) - if ((bptr [0] = get_word (wps, 0, NULL)) == WORD_EOF || - (bptr [1] = get_word (wps, 1, NULL)) == WORD_EOF) { - i = (uint32_t)(bptr - buffer) / 2; - break; - } - } - else - i = get_words_lossless (wps, buffer, sample_count); - -#ifdef DECORR_STEREO_PASS_CONT - if (sample_count < 16 || !DECORR_STEREO_PASS_CONT_AVAILABLE) { - for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++) - decorr_stereo_pass (dpp, buffer, sample_count); - - m = sample_count & (MAX_TERM - 1); - } - else - for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++) { - int pre_samples = (dpp->term < 0 || dpp->term > MAX_TERM) ? 2 : dpp->term; - - decorr_stereo_pass (dpp, buffer, pre_samples); - - DECORR_STEREO_PASS_CONT (dpp, buffer + pre_samples * 2, sample_count - pre_samples, - ((flags & MAG_MASK) >> MAG_LSB) >= 16); - } -#else - for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++) - decorr_stereo_pass (dpp, buffer, sample_count); - - m = sample_count & (MAX_TERM - 1); -#endif - - if (flags & JOINT_STEREO) - for (bptr = buffer; bptr < eptr; bptr += 2) { - bptr [0] += (bptr [1] -= (bptr [0] >> 1)); - crc += (crc << 3) + (bptr [0] << 1) + bptr [0] + bptr [1]; - } - else - for (bptr = buffer; bptr < eptr; bptr += 2) - crc += (crc << 3) + (bptr [0] << 1) + bptr [0] + bptr [1]; - -#ifndef LOSSY_MUTE - if (!(flags & HYBRID_FLAG)) -#endif - for (bptr = buffer; bptr < eptr; bptr += 16) - if (labs (bptr [0]) > mute_limit || labs (bptr [1]) > mute_limit) { - i = (uint32_t)(bptr - buffer) / 2; - break; - } - } - - /////////////////// handle hybrid lossless mono data //////////////////// - - else if ((flags & HYBRID_FLAG) && (flags & MONO_DATA)) - for (bptr = buffer, i = 0; i < sample_count; ++i) { - - if ((read_word = get_word (wps, 0, correction)) == WORD_EOF) - break; - - for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++) { - int32_t sam, temp; - int k; - - if (dpp->term > MAX_TERM) { - if (dpp->term & 1) - sam = 2 * dpp->samples_A [0] - dpp->samples_A [1]; - else - sam = (3 * dpp->samples_A [0] - dpp->samples_A [1]) >> 1; - - dpp->samples_A [1] = dpp->samples_A [0]; - k = 0; - } - else { - sam = dpp->samples_A [m]; - k = (m + dpp->term) & (MAX_TERM - 1); - } - - temp = apply_weight (dpp->weight_A, sam) + read_word; - update_weight (dpp->weight_A, dpp->delta, sam, read_word); - dpp->samples_A [k] = read_word = temp; - } - - m = (m + 1) & (MAX_TERM - 1); - - if (flags & HYBRID_SHAPE) { - int shaping_weight = (wps->dc.shaping_acc [0] += wps->dc.shaping_delta [0]) >> 16; - int32_t temp = -apply_weight (shaping_weight, wps->dc.error [0]); - - if ((flags & NEW_SHAPING) && shaping_weight < 0 && temp) { - if (temp == wps->dc.error [0]) - temp = (temp < 0) ? temp + 1 : temp - 1; - - wps->dc.error [0] = temp - correction [0]; - } - else - wps->dc.error [0] = -correction [0]; - - read_word += correction [0] - temp; - } - else - read_word += correction [0]; - - crc += (crc << 1) + read_word; - - if (labs (read_word) > mute_limit) - break; - - *bptr++ = read_word; - } - - //////////////////// handle hybrid lossless stereo data /////////////////// - - else if (wps->block2buff && !(flags & MONO_DATA)) - for (bptr = buffer, i = 0; i < sample_count; ++i) { - int32_t left, right, left2, right2; - int32_t left_c = 0, right_c = 0; - - if ((left = get_word (wps, 0, correction)) == WORD_EOF || - (right = get_word (wps, 1, correction + 1)) == WORD_EOF) - break; - - if (flags & CROSS_DECORR) { - left_c = left + correction [0]; - right_c = right + correction [1]; - - for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++) { - int32_t sam_A, sam_B; - - if (dpp->term > 0) { - if (dpp->term > MAX_TERM) { - if (dpp->term & 1) { - sam_A = 2 * dpp->samples_A [0] - dpp->samples_A [1]; - sam_B = 2 * dpp->samples_B [0] - dpp->samples_B [1]; - } - else { - sam_A = (3 * dpp->samples_A [0] - dpp->samples_A [1]) >> 1; - sam_B = (3 * dpp->samples_B [0] - dpp->samples_B [1]) >> 1; - } - } - else { - sam_A = dpp->samples_A [m]; - sam_B = dpp->samples_B [m]; - } - - left_c += apply_weight (dpp->weight_A, sam_A); - right_c += apply_weight (dpp->weight_B, sam_B); - } - else if (dpp->term == -1) { - left_c += apply_weight (dpp->weight_A, dpp->samples_A [0]); - right_c += apply_weight (dpp->weight_B, left_c); - } - else { - right_c += apply_weight (dpp->weight_B, dpp->samples_B [0]); - - if (dpp->term == -3) - left_c += apply_weight (dpp->weight_A, dpp->samples_A [0]); - else - left_c += apply_weight (dpp->weight_A, right_c); - } - } - - if (flags & JOINT_STEREO) - left_c += (right_c -= (left_c >> 1)); - } - - for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++) { - int32_t sam_A, sam_B; - - if (dpp->term > 0) { - int k; - - if (dpp->term > MAX_TERM) { - if (dpp->term & 1) { - sam_A = 2 * dpp->samples_A [0] - dpp->samples_A [1]; - sam_B = 2 * dpp->samples_B [0] - dpp->samples_B [1]; - } - else { - sam_A = (3 * dpp->samples_A [0] - dpp->samples_A [1]) >> 1; - sam_B = (3 * dpp->samples_B [0] - dpp->samples_B [1]) >> 1; - } - - dpp->samples_A [1] = dpp->samples_A [0]; - dpp->samples_B [1] = dpp->samples_B [0]; - k = 0; - } - else { - sam_A = dpp->samples_A [m]; - sam_B = dpp->samples_B [m]; - k = (m + dpp->term) & (MAX_TERM - 1); - } - - left2 = apply_weight (dpp->weight_A, sam_A) + left; - right2 = apply_weight (dpp->weight_B, sam_B) + right; - - update_weight (dpp->weight_A, dpp->delta, sam_A, left); - update_weight (dpp->weight_B, dpp->delta, sam_B, right); - - dpp->samples_A [k] = left = left2; - dpp->samples_B [k] = right = right2; - } - else if (dpp->term == -1) { - left2 = left + apply_weight (dpp->weight_A, dpp->samples_A [0]); - update_weight_clip (dpp->weight_A, dpp->delta, dpp->samples_A [0], left); - left = left2; - right2 = right + apply_weight (dpp->weight_B, left2); - update_weight_clip (dpp->weight_B, dpp->delta, left2, right); - dpp->samples_A [0] = right = right2; - } - else { - right2 = right + apply_weight (dpp->weight_B, dpp->samples_B [0]); - update_weight_clip (dpp->weight_B, dpp->delta, dpp->samples_B [0], right); - right = right2; - - if (dpp->term == -3) { - right2 = dpp->samples_A [0]; - dpp->samples_A [0] = right; - } - - left2 = left + apply_weight (dpp->weight_A, right2); - update_weight_clip (dpp->weight_A, dpp->delta, right2, left); - dpp->samples_B [0] = left = left2; - } - } - - m = (m + 1) & (MAX_TERM - 1); - - if (!(flags & CROSS_DECORR)) { - left_c = left + correction [0]; - right_c = right + correction [1]; - - if (flags & JOINT_STEREO) - left_c += (right_c -= (left_c >> 1)); - } - - if (flags & JOINT_STEREO) - left += (right -= (left >> 1)); - - if (flags & HYBRID_SHAPE) { - int shaping_weight; - int32_t temp; - - correction [0] = left_c - left; - shaping_weight = (wps->dc.shaping_acc [0] += wps->dc.shaping_delta [0]) >> 16; - temp = -apply_weight (shaping_weight, wps->dc.error [0]); - - if ((flags & NEW_SHAPING) && shaping_weight < 0 && temp) { - if (temp == wps->dc.error [0]) - temp = (temp < 0) ? temp + 1 : temp - 1; - - wps->dc.error [0] = temp - correction [0]; - } - else - wps->dc.error [0] = -correction [0]; - - left = left_c - temp; - correction [1] = right_c - right; - shaping_weight = (wps->dc.shaping_acc [1] += wps->dc.shaping_delta [1]) >> 16; - temp = -apply_weight (shaping_weight, wps->dc.error [1]); - - if ((flags & NEW_SHAPING) && shaping_weight < 0 && temp) { - if (temp == wps->dc.error [1]) - temp = (temp < 0) ? temp + 1 : temp - 1; - - wps->dc.error [1] = temp - correction [1]; - } - else - wps->dc.error [1] = -correction [1]; - - right = right_c - temp; - } - else { - left = left_c; - right = right_c; - } - - if (labs (left) > mute_limit || labs (right) > mute_limit) - break; - - crc += (crc << 3) + (left << 1) + left + right; - *bptr++ = left; - *bptr++ = right; - } - else - i = 0; /* this line can't execute, but suppresses compiler warning */ - - if (i != sample_count) { - memset (buffer, 0, sample_count * (flags & MONO_FLAG ? 4 : 8)); - wps->mute_error = TRUE; - i = sample_count; - - if (bs_is_open (&wps->wvxbits)) - bs_close_read (&wps->wvxbits); - } - - if (m) - for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++) - if (dpp->term > 0 && dpp->term <= MAX_TERM) { - int32_t temp_A [MAX_TERM], temp_B [MAX_TERM]; - int k; - - memcpy (temp_A, dpp->samples_A, sizeof (dpp->samples_A)); - memcpy (temp_B, dpp->samples_B, sizeof (dpp->samples_B)); - - for (k = 0; k < MAX_TERM; k++) { - dpp->samples_A [k] = temp_A [m]; - dpp->samples_B [k] = temp_B [m]; - m = (m + 1) & (MAX_TERM - 1); - } - } - - fixup_samples (wpc, buffer, i); - - if ((flags & FLOAT_DATA) && (wpc->open_flags & OPEN_NORMALIZE)) - WavpackFloatNormalize (buffer, (flags & MONO_DATA) ? i : i * 2, - 127 - wps->float_norm_exp + wpc->norm_offset); - - if (flags & FALSE_STEREO) { - int32_t *dptr = buffer + i * 2; - int32_t *sptr = buffer + i; - int32_t c = i; - - while (c--) { - *--dptr = *--sptr; - *--dptr = *sptr; - } - } - - wps->sample_index += i; - wps->crc = crc; - - return i; -} - -// General function to perform mono decorrelation pass on specified buffer -// (although since this is the reverse function it might technically be called -// "correlation" instead). This version handles all sample resolutions and -// weight deltas. The dpp->samples_X[] data is returned normalized for term -// values 1-8. - -static void decorr_mono_pass (struct decorr_pass *dpp, int32_t *buffer, int32_t sample_count) -{ - int32_t delta = dpp->delta, weight_A = dpp->weight_A; - int32_t *bptr, *eptr = buffer + sample_count, sam_A; - int m, k; - - switch (dpp->term) { - - case 17: - for (bptr = buffer; bptr < eptr; bptr++) { - sam_A = 2 * dpp->samples_A [0] - dpp->samples_A [1]; - dpp->samples_A [1] = dpp->samples_A [0]; - dpp->samples_A [0] = apply_weight (weight_A, sam_A) + bptr [0]; - update_weight (weight_A, delta, sam_A, bptr [0]); - bptr [0] = dpp->samples_A [0]; - } - - break; - - case 18: - for (bptr = buffer; bptr < eptr; bptr++) { - sam_A = (3 * dpp->samples_A [0] - dpp->samples_A [1]) >> 1; - dpp->samples_A [1] = dpp->samples_A [0]; - dpp->samples_A [0] = apply_weight (weight_A, sam_A) + bptr [0]; - update_weight (weight_A, delta, sam_A, bptr [0]); - bptr [0] = dpp->samples_A [0]; - } - - break; - - default: - for (m = 0, k = dpp->term & (MAX_TERM - 1), bptr = buffer; bptr < eptr; bptr++) { - sam_A = dpp->samples_A [m]; - dpp->samples_A [k] = apply_weight (weight_A, sam_A) + bptr [0]; - update_weight (weight_A, delta, sam_A, bptr [0]); - bptr [0] = dpp->samples_A [k]; - m = (m + 1) & (MAX_TERM - 1); - k = (k + 1) & (MAX_TERM - 1); - } - - if (m) { - int32_t temp_samples [MAX_TERM]; - - memcpy (temp_samples, dpp->samples_A, sizeof (dpp->samples_A)); - - for (k = 0; k < MAX_TERM; k++, m++) - dpp->samples_A [k] = temp_samples [m & (MAX_TERM - 1)]; - } - - break; - } - - dpp->weight_A = weight_A; -} - -// General function to perform stereo decorrelation pass on specified buffer -// (although since this is the reverse function it might technically be called -// "correlation" instead). This version handles all sample resolutions and -// weight deltas. The dpp->samples_X[] data is *not* returned normalized for -// term values 1-8, so it should be normalized if it is going to be used to -// call this function again. - -static void decorr_stereo_pass (struct decorr_pass *dpp, int32_t *buffer, int32_t sample_count) -{ - int32_t *bptr, *eptr = buffer + (sample_count * 2); - int m, k; - - switch (dpp->term) { - case 17: - for (bptr = buffer; bptr < eptr; bptr += 2) { - int32_t sam, tmp; - - sam = 2 * dpp->samples_A [0] - dpp->samples_A [1]; - dpp->samples_A [1] = dpp->samples_A [0]; - bptr [0] = dpp->samples_A [0] = apply_weight (dpp->weight_A, sam) + (tmp = bptr [0]); - update_weight (dpp->weight_A, dpp->delta, sam, tmp); - - sam = 2 * dpp->samples_B [0] - dpp->samples_B [1]; - dpp->samples_B [1] = dpp->samples_B [0]; - bptr [1] = dpp->samples_B [0] = apply_weight (dpp->weight_B, sam) + (tmp = bptr [1]); - update_weight (dpp->weight_B, dpp->delta, sam, tmp); - } - - break; - - case 18: - for (bptr = buffer; bptr < eptr; bptr += 2) { - int32_t sam, tmp; - - sam = dpp->samples_A [0] + ((dpp->samples_A [0] - dpp->samples_A [1]) >> 1); - dpp->samples_A [1] = dpp->samples_A [0]; - bptr [0] = dpp->samples_A [0] = apply_weight (dpp->weight_A, sam) + (tmp = bptr [0]); - update_weight (dpp->weight_A, dpp->delta, sam, tmp); - - sam = dpp->samples_B [0] + ((dpp->samples_B [0] - dpp->samples_B [1]) >> 1); - dpp->samples_B [1] = dpp->samples_B [0]; - bptr [1] = dpp->samples_B [0] = apply_weight (dpp->weight_B, sam) + (tmp = bptr [1]); - update_weight (dpp->weight_B, dpp->delta, sam, tmp); - } - - break; - - default: - for (m = 0, k = dpp->term & (MAX_TERM - 1), bptr = buffer; bptr < eptr; bptr += 2) { - int32_t sam; - - sam = dpp->samples_A [m]; - dpp->samples_A [k] = apply_weight (dpp->weight_A, sam) + bptr [0]; - update_weight (dpp->weight_A, dpp->delta, sam, bptr [0]); - bptr [0] = dpp->samples_A [k]; - - sam = dpp->samples_B [m]; - dpp->samples_B [k] = apply_weight (dpp->weight_B, sam) + bptr [1]; - update_weight (dpp->weight_B, dpp->delta, sam, bptr [1]); - bptr [1] = dpp->samples_B [k]; - - m = (m + 1) & (MAX_TERM - 1); - k = (k + 1) & (MAX_TERM - 1); - } - - break; - - case -1: - for (bptr = buffer; bptr < eptr; bptr += 2) { - int32_t sam; - - sam = bptr [0] + apply_weight (dpp->weight_A, dpp->samples_A [0]); - update_weight_clip (dpp->weight_A, dpp->delta, dpp->samples_A [0], bptr [0]); - bptr [0] = sam; - dpp->samples_A [0] = bptr [1] + apply_weight (dpp->weight_B, sam); - update_weight_clip (dpp->weight_B, dpp->delta, sam, bptr [1]); - bptr [1] = dpp->samples_A [0]; - } - - break; - - case -2: - for (bptr = buffer; bptr < eptr; bptr += 2) { - int32_t sam; - - sam = bptr [1] + apply_weight (dpp->weight_B, dpp->samples_B [0]); - update_weight_clip (dpp->weight_B, dpp->delta, dpp->samples_B [0], bptr [1]); - bptr [1] = sam; - dpp->samples_B [0] = bptr [0] + apply_weight (dpp->weight_A, sam); - update_weight_clip (dpp->weight_A, dpp->delta, sam, bptr [0]); - bptr [0] = dpp->samples_B [0]; - } - - break; - - case -3: - for (bptr = buffer; bptr < eptr; bptr += 2) { - int32_t sam_A, sam_B; - - sam_A = bptr [0] + apply_weight (dpp->weight_A, dpp->samples_A [0]); - update_weight_clip (dpp->weight_A, dpp->delta, dpp->samples_A [0], bptr [0]); - sam_B = bptr [1] + apply_weight (dpp->weight_B, dpp->samples_B [0]); - update_weight_clip (dpp->weight_B, dpp->delta, dpp->samples_B [0], bptr [1]); - bptr [0] = dpp->samples_B [0] = sam_A; - bptr [1] = dpp->samples_A [0] = sam_B; - } - - break; - } -} - -// This is a helper function for unpack_samples() that applies several final -// operations. First, if the data is 32-bit float data, then that conversion -// is done in the float.c module (whether lossy or lossless) and we return. -// Otherwise, if the extended integer data applies, then that operation is -// executed first. If the unpacked data is lossy (and not corrected) then -// it is clipped and shifted in a single operation. Otherwise, if it's -// lossless then the last step is to apply the final shift (if any). - -static void fixup_samples (WavpackContext *wpc, int32_t *buffer, uint32_t sample_count) -{ - WavpackStream *wps = wpc->streams [wpc->current_stream]; - uint32_t flags = wps->wphdr.flags; - int lossy_flag = (flags & HYBRID_FLAG) && !wps->block2buff; - int shift = (flags & SHIFT_MASK) >> SHIFT_LSB; - - if (flags & FLOAT_DATA) { - float_values (wps, buffer, (flags & MONO_DATA) ? sample_count : sample_count * 2); - return; - } - - if (flags & INT32_DATA) { - uint32_t count = (flags & MONO_DATA) ? sample_count : sample_count * 2; - int sent_bits = wps->int32_sent_bits, zeros = wps->int32_zeros; - int ones = wps->int32_ones, dups = wps->int32_dups; - uint32_t data, mask = (1 << sent_bits) - 1; - int32_t *dptr = buffer; - - if (bs_is_open (&wps->wvxbits)) { - uint32_t crc = wps->crc_x; - - while (count--) { -// if (sent_bits) { - getbits (&data, sent_bits, &wps->wvxbits); - *dptr = (*dptr << sent_bits) | (data & mask); -// } - - if (zeros) - *dptr <<= zeros; - else if (ones) - *dptr = ((*dptr + 1) << ones) - 1; - else if (dups) - *dptr = ((*dptr + (*dptr & 1)) << dups) - (*dptr & 1); - - crc = crc * 9 + (*dptr & 0xffff) * 3 + ((*dptr >> 16) & 0xffff); - dptr++; - } - - wps->crc_x = crc; - } - else if (!sent_bits && (zeros + ones + dups)) { - while (lossy_flag && (flags & BYTES_STORED) == 3 && shift < 8) { - if (zeros) - zeros--; - else if (ones) - ones--; - else if (dups) - dups--; - else - break; - - shift++; - } - - while (count--) { - if (zeros) - *dptr <<= zeros; - else if (ones) - *dptr = ((*dptr + 1) << ones) - 1; - else if (dups) - *dptr = ((*dptr + (*dptr & 1)) << dups) - (*dptr & 1); - - dptr++; - } - } - else - shift += zeros + sent_bits + ones + dups; - } - - if (lossy_flag) { - int32_t min_value, max_value, min_shifted, max_shifted; - - switch (flags & BYTES_STORED) { - case 0: - min_shifted = (min_value = -128 >> shift) << shift; - max_shifted = (max_value = 127 >> shift) << shift; - break; - - case 1: - min_shifted = (min_value = -32768 >> shift) << shift; - max_shifted = (max_value = 32767 >> shift) << shift; - break; - - case 2: - min_shifted = (min_value = -8388608 >> shift) << shift; - max_shifted = (max_value = 8388607 >> shift) << shift; - break; - - case 3: default: /* "default" suppresses compiler warning */ - min_shifted = (min_value = (int32_t) 0x80000000 >> shift) << shift; - max_shifted = (max_value = (int32_t) 0x7fffffff >> shift) << shift; - break; - } - - if (!(flags & MONO_DATA)) - sample_count *= 2; - - while (sample_count--) { - if (*buffer < min_value) - *buffer++ = min_shifted; - else if (*buffer > max_value) - *buffer++ = max_shifted; - else - *buffer++ <<= shift; - } - } - else if (shift) { - if (!(flags & MONO_DATA)) - sample_count *= 2; - - while (sample_count--) - *buffer++ <<= shift; - } -} - -// This function checks the crc value(s) for an unpacked block, returning the -// number of actual crc errors detected for the block. The block must be -// completely unpacked before this test is valid. For losslessly unpacked -// blocks of float or extended integer data the extended crc is also checked. -// Note that WavPack's crc is not a CCITT approved polynomial algorithm, but -// is a much simpler method that is virtually as robust for real world data. - -int check_crc_error (WavpackContext *wpc) -{ - int result = 0, stream; - - for (stream = 0; stream < wpc->num_streams; stream++) { - WavpackStream *wps = wpc->streams [stream]; - - if (wps->crc != wps->wphdr.crc) - ++result; - else if (bs_is_open (&wps->wvxbits) && wps->crc_x != wps->crc_wvx) - ++result; - } - - return result; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack3.c b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack3.c deleted file mode 100644 index dccf0853..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack3.c +++ /dev/null @@ -1,1703 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2013 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// unpack3.c - -// This module provides unpacking for WavPack files prior to version 4.0, -// not including "raw" files. As these modes are all obsolete and are no -// longer written, this code will not be fully documented other than the -// global functions. However, full documenation is provided in the version -// 3.97 source code. Note that this module does only the low-level sample -// unpacking; the actual opening of the file (and obtaining information -// from it) is handled in the unpack3_open.c module. - -#ifdef ENABLE_LEGACY - -#include -#include - -#include "wavpack_local.h" -#include "unpack3.h" - -#define ATTEMPT_ERROR_MUTING - -static int bs_open_read3 (Bitstream3 *bs, WavpackStreamReader64 *reader, void *id); -static uint32_t bs_unused_bytes (Bitstream3 *bs); -static unsigned char *bs_unused_data (Bitstream3 *bs); -static void init_words3 (WavpackStream3 *wps); - -//////////////////////////////// local macros ///////////////////////////////// - -#define apply_weight_n(bits, weight, sample) ((weight * sample + (1 << (bits - 1))) >> bits) - -#define update_weight_n(bits, weight, source, result) \ - if (source && result) { \ - if ((source ^ result) >= 0) { if (weight++ == (1 << bits)) weight--; } \ - else if (weight-- == min_weight) weight++; \ - } - -#define apply_weight24(weight, sample) (((((sample & 0xffff) * weight) >> 7) + \ - (((sample & ~0xffff) >> 7) * weight) + 1) >> 1) - -#define update_weight2(weight, source, result) \ - if (source && result) { \ - if ((source ^ result) >= 0) { if (weight++ == 256) weight--; } \ - else if (weight-- == min_weight) weight++; \ - } - -//////////////////////////////// local tables /////////////////////////////// - -// These three tables specify the characteristics of the decorrelation filters. -// Each term represents one layer of the sequential filter, where positive -// values indicate the relative sample involved from the same channel (1=prev) -// while -1 and -2 indicate cross channel decorrelation (in stereo only). The -// "simple_terms" table is no longer used for writing, but is kept for older -// file decoding. - -static const signed char extreme_terms [] = { 1,1,1,2,4,-1,1,2,3,6,-2,8,5,7,4,1,2,3 }; -static const signed char default_terms [] = { 1,1,1,-1,2,1,-2 }; -static const signed char simple_terms [] = { 1,1,1,1 }; - -///////////////////////////// executable code //////////////////////////////// - -// This function initializes everything required to unpack WavPack -// bitstreams and must be called before any unpacking is performed. Note -// that the (WavpackHeader3 *) in the WavpackStream3 struct must be valid. - -void unpack_init3 (WavpackStream3 *wps) -{ - int flags = wps->wphdr.flags; - struct decorr_pass *dpp; - int ti; - - CLEAR (wps->decorr_passes); - CLEAR (wps->dc); - - if (flags & EXTREME_DECORR) { - for (dpp = wps->decorr_passes, ti = 0; ti < sizeof (extreme_terms); ti++) - if (extreme_terms [sizeof (extreme_terms) - ti - 1] > 0 || (flags & CROSS_DECORR)) - dpp++->term = extreme_terms [sizeof (extreme_terms) - ti - 1]; - } - else if (flags & NEW_DECORR_FLAG) { - for (dpp = wps->decorr_passes, ti = 0; ti < sizeof (default_terms); ti++) - if (default_terms [sizeof (default_terms) - ti - 1] > 0 || (flags & CROSS_DECORR)) - dpp++->term = default_terms [sizeof (default_terms) - ti - 1]; - } - else - for (dpp = wps->decorr_passes, ti = 0; ti < sizeof (simple_terms); ti++) - dpp++->term = simple_terms [sizeof (simple_terms) - ti - 1]; - - wps->num_terms = (int)(dpp - wps->decorr_passes); - init_words3 (wps); -} - -#ifndef NO_SEEKING - -// This function returns the size (in bytes) required to save the unpacking -// context. Note that the (WavpackHeader3 *) in the WavpackStream3 struct -// must be valid. - -static int unpack_size (WavpackStream3 *wps) -{ - int flags = wps->wphdr.flags, byte_sum = 0, tcount; - struct decorr_pass *dpp; - - byte_sum += sizeof (wps->wvbits); - - if (flags & WVC_FLAG) - byte_sum += sizeof (wps->wvcbits); - - if (wps->wphdr.version == 3) { - if (wps->wphdr.bits) - byte_sum += sizeof (wps->w4); - else - byte_sum += sizeof (wps->w1); - - byte_sum += sizeof (wps->w3) + sizeof (wps->dc.crc); - } - else - byte_sum += sizeof (wps->w2); - - if (wps->wphdr.bits) - byte_sum += sizeof (wps->dc.error); - else - byte_sum += sizeof (wps->dc.sum_level) + sizeof (wps->dc.left_level) + - sizeof (wps->dc.right_level) + sizeof (wps->dc.diff_level); - - if (flags & OVER_20) - byte_sum += sizeof (wps->dc.last_extra_bits) + sizeof (wps->dc.extra_bits_count); - - if (!(flags & EXTREME_DECORR)) { - byte_sum += sizeof (wps->dc.sample); - byte_sum += sizeof (wps->dc.weight); - } - - if (flags & (HIGH_FLAG | NEW_HIGH_FLAG)) - for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++) { - if (dpp->term > 0) { - byte_sum += sizeof (dpp->samples_A [0]) * dpp->term; - byte_sum += sizeof (dpp->weight_A); - - if (!(flags & MONO_FLAG)) { - byte_sum += sizeof (dpp->samples_B [0]) * dpp->term; - byte_sum += sizeof (dpp->weight_B); - } - } - else { - byte_sum += sizeof (dpp->samples_A [0]) + sizeof (dpp->samples_B [0]); - byte_sum += sizeof (dpp->weight_A) + sizeof (dpp->weight_B); - } - } - - return byte_sum; -} - -// This function saves the unpacking context at the specified pointer and -// returns the updated pointer. The actual amount of data required can be -// determined beforehand by calling unpack_size() but must be allocated by -// the caller. - -static void *unpack_save (WavpackStream3 *wps, void *destin) -{ - int flags = wps->wphdr.flags, tcount; - struct decorr_pass *dpp; - - SAVE (destin, wps->wvbits); - - if (flags & WVC_FLAG) - SAVE (destin, wps->wvcbits); - - if (wps->wphdr.version == 3) { - if (wps->wphdr.bits) { - SAVE (destin, wps->w4); - } - else { - SAVE (destin, wps->w1); - } - - SAVE (destin, wps->w3); - SAVE (destin, wps->dc.crc); - } - else - SAVE (destin, wps->w2); - - if (wps->wphdr.bits) { - SAVE (destin, wps->dc.error); - } - else { - SAVE (destin, wps->dc.sum_level); - SAVE (destin, wps->dc.left_level); - SAVE (destin, wps->dc.right_level); - SAVE (destin, wps->dc.diff_level); - } - - if (flags & OVER_20) { - SAVE (destin, wps->dc.last_extra_bits); - SAVE (destin, wps->dc.extra_bits_count); - } - - if (!(flags & EXTREME_DECORR)) { - SAVE (destin, wps->dc.sample); - SAVE (destin, wps->dc.weight); - } - - if (flags & (HIGH_FLAG | NEW_HIGH_FLAG)) - for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++) { - if (dpp->term > 0) { - int count = dpp->term; - int index = wps->dc.m; - - SAVE (destin, dpp->weight_A); - - while (count--) { - SAVE (destin, dpp->samples_A [index]); - index = (index + 1) & (MAX_TERM - 1); - } - - if (!(flags & MONO_FLAG)) { - count = dpp->term; - index = wps->dc.m; - - SAVE (destin, dpp->weight_B); - - while (count--) { - SAVE (destin, dpp->samples_B [index]); - index = (index + 1) & (MAX_TERM - 1); - } - } - } - else { - SAVE (destin, dpp->weight_A); - SAVE (destin, dpp->weight_B); - SAVE (destin, dpp->samples_A [0]); - SAVE (destin, dpp->samples_B [0]); - } - } - - return destin; -} - -#endif - -// This monster actually unpacks the WavPack bitstream(s) into the specified -// buffer as longs, and serves as an extension to WavpackUnpackSamples(). -// Note that WavPack files created prior to version 4.0 could only contain 16 -// or 24 bit values, and these values are right-justified in the 32-bit values. -// So, if the original file contained 16-bit values, then the range of the -// returned longs would be +/- 32K. For maximum clarity, the function is -// broken up into segments that handle various modes. This makes for a few -// extra infrequent flag checks, but makes the code easier to follow because -// the nesting does not become so deep. For maximum efficiency, the conversion -// is isolated to tight loops that handle an entire buffer. - -static int32_t FASTCALL get_word1 (WavpackStream3 *wps, int chan); -static int32_t FASTCALL get_old_word1 (WavpackStream3 *wps, int chan); -static int32_t FASTCALL get_word2 (WavpackStream3 *wps, int chan); -static int32_t FASTCALL get_word3 (WavpackStream3 *wps, int chan); -static int32_t FASTCALL get_word4 (WavpackStream3 *wps, int chan, int32_t *correction); - -int32_t unpack_samples3 (WavpackContext *wpc, int32_t *buffer, uint32_t sample_count) -{ - WavpackStream3 *wps = (WavpackStream3 *) wpc->stream3; - int shift = wps->wphdr.shift, flags = wps->wphdr.flags, min_weight = 0, m = wps->dc.m, tcount; -#ifndef NO_SEEKING - int points_index = wps->sample_index / (((uint32_t) wpc->total_samples >> 8) + 1); -#endif - int32_t min_value, max_value, min_shifted, max_shifted; - int32_t correction [2], crc = wps->dc.crc; - struct decorr_pass *dpp; - int32_t read_word, *bptr; - int32_t sample [2] [2]; - int weight [2] [1]; - unsigned int i; - -#ifdef ATTEMPT_ERROR_MUTING - int32_t mute_limit = (flags & BYTES_3) ? 8388608 : 32768; - int mute_block = 0; - - if (wps->wphdr.bits && !(flags & WVC_FLAG)) { - if (wps->wphdr.version < 3) - mute_limit *= 4; - else - mute_limit *= 2; - } -#endif - - if (wps->sample_index + sample_count > wpc->total_samples) - sample_count = (uint32_t) (wpc->total_samples - wps->sample_index); - - if (!sample_count) - return 0; - - if (!wps->sample_index) { - unpack_init3 (wps); - - bs_open_read3 (&wps->wvbits, wpc->reader, wpc->wv_in); - - if (wpc->wvc_flag) - bs_open_read3 (&wps->wvcbits, wpc->reader, wpc->wvc_in); - } - -#ifndef NO_SEEKING - if (!wps->index_points [points_index].saved) { - - if (!wps->unpack_data) - wps->unpack_data = (unsigned char *) malloc (256 * (wps->unpack_size = unpack_size (wps))); - - wps->index_points [points_index].sample_index = wps->sample_index; - unpack_save (wps, wps->unpack_data + points_index * wps->unpack_size); - wps->index_points [points_index].saved = TRUE; - } -#endif - - memcpy (sample, wps->dc.sample, sizeof (sample)); - memcpy (weight, wps->dc.weight, sizeof (weight)); - - if (wps->wphdr.bits) { - if (flags & (NEW_DECORR_FLAG | EXTREME_DECORR)) - min_weight = -256; - } - else - if (flags & NEW_DECORR_FLAG) - min_weight = (flags & EXTREME_DECORR) ? -512 : -256; - - if (flags & BYTES_3) { - min_shifted = (min_value = -8388608 >> shift) << shift; - max_shifted = (max_value = 8388607 >> shift) << shift; - } - else { - min_shifted = (min_value = -32768 >> shift) << shift; - max_shifted = (max_value = 32767 >> shift) << shift; - } - - ///////////////// handle version 3 lossless mono data ///////////////////// - - if (wps->wphdr.version == 3 && !wps->wphdr.bits && (flags & MONO_FLAG)) { - if (flags & FAST_FLAG) { - if (flags & OVER_20) - for (bptr = buffer, i = 0; i < sample_count; ++i) { - int32_t temp; - - if ((read_word = get_word3 (wps, 0)) == WORD_EOF) - break; - - sample [0] [0] += sample [0] [1] += read_word; - getbits (&temp, 4, &wps->wvbits); - crc = crc * 3 + (temp = (temp & 0xf) + (sample [0] [0] << 4)); - *bptr++ = temp; - } - else - for (bptr = buffer, i = 0; i < sample_count; ++i) { - if ((read_word = get_word3 (wps, 0)) == WORD_EOF) - break; - - crc = crc * 3 + (sample [0] [0] += sample [0] [1] += read_word); - *bptr++ = sample [0] [0] << shift; - } - } - else if (flags & HIGH_FLAG) - for (bptr = buffer, i = 0; i < sample_count; ++i) { - int32_t temp; - - if (flags & NEW_HIGH_FLAG) { - if ((read_word = get_word1 (wps, 0)) == WORD_EOF) - break; - } - else { - if ((read_word = get_old_word1 (wps, 0)) == WORD_EOF) - break; - } - - if (flags & EXTREME_DECORR) - for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++) { - int32_t sam = dpp->samples_A [m]; - - temp = apply_weight_n (9, dpp->weight_A, sam) + read_word; - update_weight_n (9, dpp->weight_A, sam, read_word); - dpp->samples_A [(m + dpp->term) & (MAX_TERM - 1)] = read_word = temp; - } - else - for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++) { - int32_t sam = dpp->samples_A [m]; - - temp = apply_weight_n (8, dpp->weight_A, sam) + read_word; - update_weight_n (8, dpp->weight_A, sam, read_word); - dpp->samples_A [(m + dpp->term) & (MAX_TERM - 1)] = read_word = temp; - } - - m = (m + 1) & (MAX_TERM - 1); - - if (flags & OVER_20) { - if (wps->dc.extra_bits_count < 8 || !getbit (&wps->wvbits)) { - getbits (&temp, 4, &wps->wvbits); - - if ((temp &= 0xf) != wps->dc.last_extra_bits) { - wps->dc.last_extra_bits = temp; - wps->dc.extra_bits_count = 0; - } - else - ++wps->dc.extra_bits_count; - } - - crc = crc * 3 + (temp = wps->dc.last_extra_bits + (read_word << 4)); - *bptr++ = temp; - } - else { - crc = crc * 3 + read_word; - *bptr++ = read_word << shift; - } - } - else - for (bptr = buffer, i = 0; i < sample_count; ++i) { - - int32_t temp; - - if ((read_word = get_word3 (wps, 0)) == WORD_EOF) - break; - - temp = sample [0] [0] + ((sample [0] [1] * weight [0] [0] + 128) >> 8) + read_word; - - if ((sample [0] [1] >= 0) == (read_word > 0)) { - if (weight [0] [0]++ == 256) - weight [0] [0]--; - } - else if (weight [0] [0]-- == 0) - weight [0] [0]++; - - sample [0] [0] += (sample [0] [1] = temp - sample [0] [0]); - - if (flags & OVER_20) { - if (wps->dc.extra_bits_count < 8 || !getbit (&wps->wvbits)) { - getbits (&temp, 4, &wps->wvbits); - - if ((temp &= 0xf) != wps->dc.last_extra_bits) { - wps->dc.last_extra_bits = temp; - wps->dc.extra_bits_count = 0; - } - else - ++wps->dc.extra_bits_count; - } - - crc = crc * 3 + (*bptr++ = temp = wps->dc.last_extra_bits + (sample [0] [0] << 4)); - } - else { - crc = crc * 3 + sample [0] [0]; - *bptr++ = sample [0] [0] << shift; - } - } - } - - //////////////// handle version 3 lossless stereo data //////////////////// - - else if (wps->wphdr.version == 3 && !wps->wphdr.bits && !(flags & MONO_FLAG)) { - int32_t left_level = wps->dc.left_level, right_level = wps->dc.right_level; - int32_t sum_level = wps->dc.sum_level, diff_level = wps->dc.diff_level; - - if (flags & FAST_FLAG) { - if (flags & OVER_20) - for (bptr = buffer, i = 0; i < sample_count; ++i) { - int32_t sum, diff, temp; - - read_word = get_word3 (wps, 0); - - if (read_word == WORD_EOF) - break; - - sum = (read_word << 1) | ((diff = get_word3 (wps, 1)) & 1); - sample [0] [0] += sample [0] [1] += ((sum + diff) >> 1); - sample [1] [0] += sample [1] [1] += ((sum - diff) >> 1); - getbits (&temp, 8, &wps->wvbits); - crc = crc * 3 + (*bptr++ = (sample [0] [0] << 4) + ((temp >> 4) & 0xf)); - crc = crc * 3 + (*bptr++ = (sample [1] [0] << 4) + (temp & 0xf)); - } - else - for (bptr = buffer, i = 0; i < sample_count; ++i) { - int32_t sum, diff; - - read_word = get_word3 (wps, 0); - - if (read_word == WORD_EOF) - break; - - sum = (read_word << 1) | ((diff = get_word3 (wps, 1)) & 1); - sample [0] [1] += ((sum + diff) >> 1); - sample [1] [1] += ((sum - diff) >> 1); - crc = crc * 3 + (sample [0] [0] += sample [0] [1]); - crc = crc * 3 + (sample [1] [0] += sample [1] [1]); - *bptr++ = sample [0] [0] << shift; - *bptr++ = sample [1] [0] << shift; - } - } - else if (flags & HIGH_FLAG) { - for (bptr = buffer, i = 0; i < sample_count; ++i) { - int32_t sum, left, right, diff, left2, right2, extra_bits, next_word; - - if (flags & CROSS_DECORR) { - left = get_word1 (wps, 0); - - if (left == WORD_EOF) - break; - - right = get_word1 (wps, 1); - } - else { - if (flags & NEW_HIGH_FLAG) { - read_word = get_word1 (wps, 0); - - if (read_word == WORD_EOF) - break; - - next_word = get_word1 (wps, 1); - - if (right_level > left_level) { - if (left_level + right_level < sum_level + diff_level && right_level < diff_level) { - sum = (right = read_word) + (left = next_word); - diff = left - right; - } - else { - diff = read_word; - - if (sum_level < left_level) { - sum = (next_word << 1) | (diff & 1); - left = (sum + diff) >> 1; - right = (sum - diff) >> 1; - } - else - sum = next_word + (right = (left = next_word) - diff); - } - } - else { - if (left_level + right_level < sum_level + diff_level && left_level < diff_level) { - sum = (left = read_word) + (right = next_word); - diff = left - right; - } - else { - diff = read_word; - - if (sum_level < right_level) { - sum = (next_word << 1) | (diff & 1); - left = (sum + diff) >> 1; - right = (sum - diff) >> 1; - } - else - sum = (left = diff + (right = next_word)) + next_word; - } - } - } - else { - read_word = get_old_word1 (wps, 0); - - if (read_word == WORD_EOF) - break; - - next_word = get_old_word1 (wps, 1); - - if (sum_level <= right_level && sum_level <= left_level) { - sum = (next_word << 1) | (read_word & 1); - left = (sum + read_word) >> 1; - right = (sum - read_word) >> 1; - } - else if (left_level <= right_level) - sum = next_word + (right = (left = next_word) - read_word); - else - sum = next_word + (left = read_word + (right = next_word)); - - diff = left - right; - } - - sum_level = sum_level - (sum_level >> 8) + labs (sum >> 1); - left_level = left_level - (left_level >> 8) + labs (left); - right_level = right_level - (right_level >> 8) + labs (right); - diff_level = diff_level - (diff_level >> 8) + labs (diff); - - if (flags & JOINT_STEREO) { - left = diff; - right = sum >> 1; - } - } - - if (flags & EXTREME_DECORR) { - for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++) - if (dpp->term > 0) { - int32_t sam_A = dpp->samples_A [m], sam_B = dpp->samples_B [m]; - int k = (m + dpp->term) & (MAX_TERM - 1); - - left2 = apply_weight_n (9, dpp->weight_A, sam_A) + left; - right2 = apply_weight_n (9, dpp->weight_B, sam_B) + right; - - update_weight_n (9, dpp->weight_A, sam_A, left); - update_weight_n (9, dpp->weight_B, sam_B, right); - - dpp->samples_A [k] = left = left2; - dpp->samples_B [k] = right = right2; - } - else if (dpp->term == -1) { - left2 = left + apply_weight_n (9, dpp->weight_A, dpp->samples_A [0]); - update_weight_n (9, dpp->weight_A, dpp->samples_A [0], left); - left = left2; - right2 = right + apply_weight_n (9, dpp->weight_B, left); - update_weight_n (9, dpp->weight_B, left, right); - dpp->samples_A [0] = right = right2; - } - else { - right2 = right + apply_weight_n (9, dpp->weight_A, dpp->samples_A [0]); - update_weight_n (9, dpp->weight_A, dpp->samples_A [0], right); - right = right2; - left2 = left + apply_weight_n (9, dpp->weight_B, right); - update_weight_n (9, dpp->weight_B, right, left); - dpp->samples_A [0] = left = left2; - } - } - else { - for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++) - if (dpp->term > 0) { - int32_t sam_A = dpp->samples_A [m], sam_B = dpp->samples_B [m]; - int k = (m + dpp->term) & (MAX_TERM - 1); - - left2 = apply_weight_n (8, dpp->weight_A, sam_A) + left; - right2 = apply_weight_n (8, dpp->weight_B, sam_B) + right; - - update_weight_n (8, dpp->weight_A, sam_A, left); - update_weight_n (8, dpp->weight_B, sam_B, right); - - dpp->samples_A [k] = left = left2; - dpp->samples_B [k] = right = right2; - } - else if (dpp->term == -1) { - left2 = left + apply_weight_n (8, dpp->weight_A, dpp->samples_A [0]); - update_weight_n (8, dpp->weight_A, dpp->samples_A [0], left); - left = left2; - right2 = right + apply_weight_n (8, dpp->weight_B, left); - update_weight_n (8, dpp->weight_B, left, right); - dpp->samples_A [0] = right = right2; - } - else { - right2 = right + apply_weight_n (8, dpp->weight_A, dpp->samples_A [0]); - update_weight_n (8, dpp->weight_A, dpp->samples_A [0], right); - right = right2; - left2 = left + apply_weight_n (8, dpp->weight_B, right); - update_weight_n (8, dpp->weight_B, right, left); - dpp->samples_A [0] = left = left2; - } - } - - m = (m + 1) & (MAX_TERM - 1); - - if (flags & JOINT_STEREO) { - sum = (right << 1) | ((diff = left) & 1); - right = (sum - diff) >> 1; - left = (sum + diff) >> 1; - } - - if (flags & OVER_20) { - if (wps->dc.extra_bits_count < 8 || !getbit (&wps->wvbits)) { - getbits (&extra_bits, 8, &wps->wvbits); - - if ((extra_bits &= 0xff) != wps->dc.last_extra_bits) { - wps->dc.last_extra_bits = extra_bits; - wps->dc.extra_bits_count = 0; - } - else - ++wps->dc.extra_bits_count; - } - - crc = crc * 3 + (*bptr++ = left = (left << 4) + (wps->dc.last_extra_bits >> 4)); - crc = crc * 3 + (*bptr++ = right = (right << 4) + (wps->dc.last_extra_bits & 0xf)); - } - else { - crc = crc * 9 + left * 3 + right; - *bptr++ = left << shift; - *bptr++ = right << shift; - } - } - } - else - for (bptr = buffer, i = 0; i < sample_count; ++i) { - int32_t sum, left, right, left2, right2, extra_bits; - - read_word = get_word3 (wps, 0); - - if (read_word == WORD_EOF) - break; - - if (sum_level <= right_level && sum_level <= left_level) { - sum = (get_word3 (wps, 1) << 1) | (read_word & 1); - left = (sum + read_word) >> 1; - right = (sum - read_word) >> 1; - } - else if (left_level <= right_level) { - right = (left = get_word3 (wps, 1)) - read_word; - sum = left + right; - } - else { - left = read_word + (right = get_word3 (wps, 1)); - sum = right + left; - } - - sum_level = sum_level - (sum_level >> 8) + labs (sum >> 1); - left_level = left_level - (left_level >> 8) + labs (left); - right_level = right_level - (right_level >> 8) + labs (right); - - left2 = sample [0] [0] + ((sample [0] [1] * weight [0] [0] + 128) >> 8) + left; - right2 = sample [1] [0] + ((sample [1] [1] * weight [1] [0] + 128) >> 8) + right; - - if ((sample [0] [1] >= 0) == (left > 0)) { - if (weight [0] [0]++ == 256) - weight [0] [0]--; - } - else if (weight [0] [0]-- == 0) - weight [0] [0]++; - - if ((sample [1] [1] >= 0) == (right > 0)) { - if (weight [1] [0]++ == 256) - weight [1] [0]--; - } - else if (weight [1] [0]-- == 0) - weight [1] [0]++; - - sample [0] [0] += (sample [0] [1] = left2 - sample [0] [0]); - sample [1] [0] += (sample [1] [1] = right2 - sample [1] [0]); - - if (flags & OVER_20) { - if (wps->dc.extra_bits_count < 8 || !getbit (&wps->wvbits)) { - getbits (&extra_bits, 8, &wps->wvbits); - - if ((extra_bits &= 0xff) != wps->dc.last_extra_bits) { - wps->dc.last_extra_bits = extra_bits; - wps->dc.extra_bits_count = 0; - } - else - ++wps->dc.extra_bits_count; - } - - crc = crc * 3 + (*bptr++ = left2 = (sample [0] [0] << 4) + (wps->dc.last_extra_bits >> 4)); - crc = crc * 3 + (*bptr++ = right2 = (sample [1] [0] << 4) + (wps->dc.last_extra_bits & 0xf)); - } - else { - crc = crc * 9 + sample [0] [0] * 3 + sample [1] [0]; - *bptr++ = sample [0] [0] << shift; - *bptr++ = sample [1] [0] << shift; - } - } - - wps->dc.left_level = left_level; - wps->dc.right_level = right_level; - wps->dc.sum_level = sum_level; - wps->dc.diff_level = diff_level; - } - - //////////////// handle version 3 lossy/hybrid mono data ////////////////// - - else if (wps->wphdr.version == 3 && wps->wphdr.bits && (flags & MONO_FLAG)) { - if (flags & FAST_FLAG) - for (bptr = buffer, i = 0; i < sample_count; ++i) { - - if ((read_word = get_word3 (wps, 0)) == WORD_EOF) - break; - - crc = crc * 3 + (sample [0] [0] += sample [0] [1] += read_word); - - if (sample [0] [0] < min_value) { -#ifdef ATTEMPT_ERROR_MUTING - if (sample [0] [0] < -mute_limit) - mute_block = 1; -#endif - *bptr++ = min_shifted; - } - else if (sample [0] [0] > max_value) { -#ifdef ATTEMPT_ERROR_MUTING - if (sample [0] [0] > mute_limit) - mute_block = 1; -#endif - *bptr++ = max_shifted; - } - else - *bptr++ = sample [0] [0] << shift; - } - else if (flags & (HIGH_FLAG | NEW_HIGH_FLAG)) - for (bptr = buffer, i = 0; i < sample_count; ++i) { - int32_t temp; - - read_word = (flags & NEW_HIGH_FLAG) ? - get_word4 (wps, 0, correction) : get_word3 (wps, 0); - - if (read_word == WORD_EOF) - break; - - for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++) { - int32_t sam = dpp->samples_A [m]; - - temp = apply_weight24 (dpp->weight_A, sam) + read_word; - update_weight2 (dpp->weight_A, sam, read_word); - dpp->samples_A [(m + dpp->term) & (MAX_TERM - 1)] = read_word = temp; - } - - m = (m + 1) & (MAX_TERM - 1); - - if (flags & WVC_FLAG) { - if (flags & LOSSY_SHAPE) { - crc = crc * 3 + (read_word += correction [0] + wps->dc.error [0]); - wps->dc.error [0] = -correction [0]; - } - else - crc = crc * 3 + (read_word += correction [0]); - - *bptr++ = read_word << shift; - } - else { - crc = crc * 3 + read_word; - - if (read_word < min_value) { -#ifdef ATTEMPT_ERROR_MUTING - if (read_word < -mute_limit) - mute_block = 1; -#endif - *bptr++ = min_shifted; - } - else if (read_word > max_value) { -#ifdef ATTEMPT_ERROR_MUTING - if (read_word > mute_limit) - mute_block = 1; -#endif - *bptr++ = max_shifted; - } - else - *bptr++ = read_word << shift; - } - } - else - for (bptr = buffer, i = 0; i < sample_count; ++i) { - int32_t new_sample; - - if ((read_word = get_word3 (wps, 0)) == WORD_EOF) - break; - - new_sample = sample [0] [0] + ((sample [0] [1] * weight [0] [0] + 128) >> 8) + read_word; - - if ((sample [0] [1] >= 0) == (read_word > 0)) { - if (weight [0] [0]++ == 256) - weight [0] [0]--; - } - else if (weight [0] [0]-- == 0) - weight [0] [0]++; - - sample [0] [1] = new_sample - sample [0] [0]; - crc = crc * 3 + (sample [0] [0] = new_sample); - - if (sample [0] [0] < min_value) { -#ifdef ATTEMPT_ERROR_MUTING - if (sample [0] [0] < -mute_limit) - mute_block = 1; -#endif - *bptr++ = min_shifted; - } - else if (sample [0] [0] > max_value) { -#ifdef ATTEMPT_ERROR_MUTING - if (sample [0] [0] > mute_limit) - mute_block = 1; -#endif - *bptr++ = max_shifted; - } - else - *bptr++ = sample [0] [0] << shift; - } - } - - //////////////// handle version 3 lossy/hybrid stereo data //////////////// - - else if (wps->wphdr.version == 3 && wps->wphdr.bits && !(flags & MONO_FLAG)) { - if (flags & FAST_FLAG) - for (bptr = buffer, i = 0; i < sample_count; ++i) { - - if ((read_word = get_word3 (wps, 0)) == WORD_EOF) - break; - - crc = crc * 3 + (sample [0] [0] += sample [0] [1] += read_word); - - if (sample [0] [0] < min_value) { -#ifdef ATTEMPT_ERROR_MUTING - if (sample [0] [0] < -mute_limit) - mute_block = 1; -#endif - *bptr++ = min_shifted; - } - else if (sample [0] [0] > max_value) { -#ifdef ATTEMPT_ERROR_MUTING - if (sample [0] [0] > mute_limit) - mute_block = 1; -#endif - *bptr++ = max_shifted; - } - else - *bptr++ = sample [0] [0] << shift; - - crc = crc * 3 + (sample [1] [0] += sample [1] [1] += get_word3 (wps, 1)); - - if (sample [1] [0] < min_value) { -#ifdef ATTEMPT_ERROR_MUTING - if (sample [1] [0] < -mute_limit) - mute_block = 1; -#endif - *bptr++ = min_shifted; - } - else if (sample [1] [0] > max_value) { -#ifdef ATTEMPT_ERROR_MUTING - if (sample [1] [0] > mute_limit) - mute_block = 1; -#endif - *bptr++ = max_shifted; - } - else - *bptr++ = sample [1] [0] << shift; - } - else if (flags & (HIGH_FLAG | NEW_HIGH_FLAG)) - for (bptr = buffer, i = 0; i < sample_count; ++i) { - int32_t left, right, left2, right2, sum, diff; - - if (flags & NEW_HIGH_FLAG) { - left = get_word4 (wps, 0, correction); - right = get_word4 (wps, 1, correction + 1); - } - else { - left = get_word3 (wps, 0); - right = get_word3 (wps, 1); - } - - if (left == WORD_EOF) - break; - - for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++) { - int32_t sam_A = dpp->samples_A [m], sam_B = dpp->samples_B [m]; - int k = (m + dpp->term) & (MAX_TERM - 1); - - left2 = apply_weight24 (dpp->weight_A, sam_A) + left; - update_weight2 (dpp->weight_A, sam_A, left); - dpp->samples_A [k] = left = left2; - - right2 = apply_weight24 (dpp->weight_B, sam_B) + right; - update_weight2 (dpp->weight_B, sam_B, right); - dpp->samples_B [k] = right = right2; - } - - m = (m + 1) & (MAX_TERM - 1); - - if (flags & WVC_FLAG) { - if (flags & LOSSY_SHAPE) { - left += correction [0] + wps->dc.error [0]; - right += correction [1] + wps->dc.error [1]; - wps->dc.error [0] = -correction [0]; - wps->dc.error [1] = -correction [1]; - } - else { - left += correction [0]; - right += correction [1]; - } - } - - if (flags & JOINT_STEREO) { - right = ((sum = (right << 1) | (left & 1)) - (diff = left)) >> 1; - left = (sum + diff) >> 1; - } - - crc = crc * 9 + left * 3 + right; - - if (flags & WVC_FLAG) { - *bptr++ = left << shift; - *bptr++ = right << shift; - } - else { - if (left < min_value) { -#ifdef ATTEMPT_ERROR_MUTING - if (left < -mute_limit) - mute_block = 1; -#endif - *bptr++ = min_shifted; - } - else if (left > max_value) { -#ifdef ATTEMPT_ERROR_MUTING - if (left > mute_limit) - mute_block = 1; -#endif - *bptr++ = max_shifted; - } - else - *bptr++ = left << shift; - - if (right < min_value) { -#ifdef ATTEMPT_ERROR_MUTING - if (right < -mute_limit) - mute_block = 1; -#endif - *bptr++ = min_shifted; - } - else if (right > max_value) { -#ifdef ATTEMPT_ERROR_MUTING - if (right > mute_limit) - mute_block = 1; -#endif - *bptr++ = max_shifted; - } - else - *bptr++ = right << shift; - } - } - else - for (bptr = buffer, i = 0; i < sample_count; ++i) { - int32_t new_sample; - - if ((read_word = get_word3 (wps, 0)) == WORD_EOF) - break; - - new_sample = sample [0] [0] + ((sample [0] [1] * weight [0] [0] + 128) >> 8) + read_word; - - if ((sample [0] [1] >= 0) == (read_word > 0)) { - if (weight [0] [0]++ == 256) - weight [0] [0]--; - } - else if (weight [0] [0]-- == 0) - weight [0] [0]++; - - sample [0] [1] = new_sample - sample [0] [0]; - crc = crc * 3 + (sample [0] [0] = new_sample); - - read_word = get_word3 (wps, 1); - new_sample = sample [1] [0] + ((sample [1] [1] * weight [1] [0] + 128) >> 8) + read_word; - - if ((sample [1] [1] >= 0) == (read_word > 0)) { - if (weight [1] [0]++ == 256) - weight [1] [0]--; - } - else if (weight [1] [0]-- == 0) - weight [1] [0]++; - - sample [1] [1] = new_sample - sample [1] [0]; - crc = crc * 3 + (sample [1] [0] = new_sample); - - if (sample [0] [0] < min_value) { -#ifdef ATTEMPT_ERROR_MUTING - if (sample [0] [0] < -mute_limit) - mute_block = 1; -#endif - *bptr++ = min_shifted; - } - else if (sample [0] [0] > max_value) { -#ifdef ATTEMPT_ERROR_MUTING - if (sample [0] [0] > mute_limit) - mute_block = 1; -#endif - *bptr++ = max_shifted; - } - else - *bptr++ = sample [0] [0] << shift; - - if (sample [1] [0] < min_value) { -#ifdef ATTEMPT_ERROR_MUTING - if (sample [1] [0] < -mute_limit) - mute_block = 1; -#endif - *bptr++ = min_shifted; - } - else if (sample [1] [0] > max_value) { -#ifdef ATTEMPT_ERROR_MUTING - if (sample [1] [0] > mute_limit) - mute_block = 1; -#endif - *bptr++ = max_shifted; - } - else - *bptr++ = sample [1] [0] << shift; - } - } - - //////////////////// finally, handle version 2 data /////////////////////// - - else if (wps->wphdr.version == 2 && (flags & MONO_FLAG)) - for (bptr = buffer, i = 0; i < sample_count; ++i) { - if ((read_word = get_word2 (wps, 0)) == WORD_EOF) - break; - - sample [0] [0] += sample [0] [1] += read_word; - - if (wps->wphdr.bits) { - if (sample [0] [0] < min_value) { -#ifdef ATTEMPT_ERROR_MUTING - if (sample [0] [0] < -mute_limit) - mute_block = 1; -#endif - sample [0] [0] = min_value; - } - else if (sample [0] [0] > max_value) { -#ifdef ATTEMPT_ERROR_MUTING - if (sample [0] [0] > mute_limit) - mute_block = 1; -#endif - sample [0] [0] = max_value; - } - } - - *bptr++ = sample [0] [0] << shift; - } - else if (wps->wphdr.version < 3 && !(flags & MONO_FLAG)) - for (bptr = buffer, i = 0; i < sample_count; ++i) { - int32_t sum, diff; - - read_word = get_word2 (wps, 0); - - if (read_word == WORD_EOF) - break; - - sum = (read_word << 1) | ((diff = get_word2 (wps, 1)) & 1); - sample [0] [0] += sample [0] [1] += ((sum + diff) >> 1); - sample [1] [0] += sample [1] [1] += ((sum - diff) >> 1); - - if (wps->wphdr.bits) { - if (sample [0] [0] < min_value) { -#ifdef ATTEMPT_ERROR_MUTING - if (sample [0] [0] < -mute_limit) - mute_block = 1; -#endif - sample [0] [0] = min_value; - } - else if (sample [0] [0] > max_value) { -#ifdef ATTEMPT_ERROR_MUTING - if (sample [0] [0] > mute_limit) - mute_block = 1; -#endif - sample [0] [0] = max_value; - } - - if (sample [1] [0] < min_value) { -#ifdef ATTEMPT_ERROR_MUTING - if (sample [1] [0] < -mute_limit) - mute_block = 1; -#endif - sample [1] [0] = min_value; - } - else if (sample [1] [0] > max_value) { -#ifdef ATTEMPT_ERROR_MUTING - if (sample [1] [0] > mute_limit) - mute_block = 1; -#endif - sample [1] [0] = max_value; - } - } - - *bptr++ = sample [0] [0] << shift; - *bptr++ = sample [1] [0] << shift; - } - else - i = 0; /* can't get here, but suppresses warning */ - -#ifdef ATTEMPT_ERROR_MUTING - if (!wps->wphdr.bits || (flags & WVC_FLAG)) { - int32_t *eptr = buffer + sample_count * ((flags & MONO_FLAG) ? 1 : 2); - - for (bptr = buffer; bptr < eptr; bptr += 3) - if (*bptr > mute_limit || *bptr < -mute_limit) { - mute_block = 1; - break; - } - } - - if (mute_block) - memset (buffer, 0, sizeof (*buffer) * sample_count * ((flags & MONO_FLAG) ? 1 : 2)); -#endif - - if (i && (wps->sample_index += i) == wpc->total_samples) { - - if (wps->wphdr.version == 3 && crc != (wpc->wvc_flag ? wps->wphdr.crc2 : wps->wphdr.crc)) - wpc->crc_errors++; - - if (wpc->open_flags & OPEN_WRAPPER) { - unsigned char *temp = (unsigned char *)malloc (1024); - uint32_t bcount; - - if (bs_unused_bytes (&wps->wvbits)) { - wpc->wrapper_data = (unsigned char *)realloc (wpc->wrapper_data, wpc->wrapper_bytes + bs_unused_bytes (&wps->wvbits)); - memcpy (wpc->wrapper_data + wpc->wrapper_bytes, bs_unused_data (&wps->wvbits), bs_unused_bytes (&wps->wvbits)); - wpc->wrapper_bytes += bs_unused_bytes (&wps->wvbits); - } - - while (1) { - bcount = wpc->reader->read_bytes (wpc->wv_in, temp, 1024); - - if (!bcount) - break; - - wpc->wrapper_data = (unsigned char *)realloc (wpc->wrapper_data, wpc->wrapper_bytes + bcount); - memcpy (wpc->wrapper_data + wpc->wrapper_bytes, temp, bcount); - wpc->wrapper_bytes += bcount; - } - - free (temp); - - if (wpc->wrapper_bytes > 16) { - int c; - - for (c = 0; c < 16 && wpc->wrapper_data [c] == 0xff; ++c); - - if (c == 16) { - memmove (wpc->wrapper_data, wpc->wrapper_data + 16, wpc->wrapper_bytes - 16); - wpc->wrapper_bytes -= 16; - } - else { - free (wpc->wrapper_data); - wpc->wrapper_data = NULL; - wpc->wrapper_bytes = 0; - } - } - } - } - - memcpy (wps->dc.sample, sample, sizeof (sample)); - memcpy (wps->dc.weight, weight, sizeof (weight)); - wps->dc.crc = crc; - wps->dc.m = m; - - return i; -} - -// This function initializes everything required to receive words with this -// module and must be called BEFORE any other function in this module. - -static void init_words3 (WavpackStream3 *wps) -{ - CLEAR (wps->w1); - CLEAR (wps->w2); - CLEAR (wps->w3); - CLEAR (wps->w4); - - if (wps->wphdr.flags & MONO_FLAG) - wps->w4.bitrate = wps->wphdr.bits - 768; - else - wps->w4.bitrate = (wps->wphdr.bits / 2) - 768; -} - -static int32_t FASTCALL get_word1 (WavpackStream3 *wps, int chan) -{ - uint32_t tmp1, tmp2, avalue; - unsigned int ones_count; - int k; - - if ((wps->wphdr.flags & EXTREME_DECORR) && !(wps->wphdr.flags & OVER_20)) { - if (wps->w1.zeros_acc) { - if (--wps->w1.zeros_acc) - return 0; - } - else if (wps->w1.ave_level [0] [0] < 0x20 && wps->w1.ave_level [0] [1] < 0x20) { - int32_t mask; - int cbits; - - for (cbits = 0; cbits < 33 && getbit (&wps->wvbits); ++cbits); - - if (cbits == 33) - return WORD_EOF; - - if (cbits < 2) - wps->w1.zeros_acc = cbits; - else { - for (mask = 1, wps->w1.zeros_acc = 0; --cbits; mask <<= 1) - if (getbit (&wps->wvbits)) - wps->w1.zeros_acc |= mask; - - wps->w1.zeros_acc |= mask; - } - - if (wps->w1.zeros_acc) - return 0; - } - } - - // count consecutive ones in bitstream, > 25 indicates error (or EOF) - - for (ones_count = 0; ones_count < 25 && getbit (&wps->wvbits); ++ones_count); - - if (ones_count == 25) - return WORD_EOF; - - k = (wps->w1.ave_level [0] [chan] + (wps->w1.ave_level [0] [chan] >> 3) + 0x40) >> 7; - k = count_bits (k); - - if (k & ~31) - return WORD_EOF; - - if (ones_count == 0) { - getbits (&avalue, k, &wps->wvbits); - avalue &= bitmask [k]; - } - else { - tmp1 = bitset [k]; - k = (wps->w1.ave_level [1] [chan] + (wps->w1.ave_level [1] [chan] >> 4) + 0x20) >> 6; - k = count_bits (k); - - if (k & ~31) - return WORD_EOF; - - if (ones_count == 1) { - getbits (&avalue, k, &wps->wvbits); - avalue &= bitmask [k]; - } - else { - tmp2 = bitset [k]; - - // If the ones count is exactly 24, then next 24 bits are literal - - if (ones_count == 24) { - getbits (&avalue, 24, &wps->wvbits); - avalue &= 0xffffff; - } - else { - k = (wps->w1.ave_level [2] [chan] + 0x10) >> 5; - k = count_bits (k); - - if (k & ~31) - return WORD_EOF; - - getbits (&avalue, k, &wps->wvbits); - avalue = (avalue & bitmask [k]) + (bitset [k] * (ones_count - 2)); - } - - wps->w1.ave_level [2] [chan] -= ((wps->w1.ave_level [2] [chan] + 0x8) >> 4); - wps->w1.ave_level [2] [chan] += avalue; - avalue += tmp2; - } - - wps->w1.ave_level [1] [chan] -= ((wps->w1.ave_level [1] [chan] + 0x10) >> 5); - wps->w1.ave_level [1] [chan] += avalue; - avalue += tmp1; - } - - wps->w1.ave_level [0] [chan] -= ((wps->w1.ave_level [0] [chan] + 0x20) >> 6); - wps->w1.ave_level [0] [chan] += avalue; - - return (avalue && getbit (&wps->wvbits)) ? -(int32_t)avalue : avalue; -} - -#define NUM_SAMPLES 128 - -static int32_t FASTCALL get_old_word1 (WavpackStream3 *wps, int chan) -{ - uint32_t avalue; - unsigned int bc; - int k; - - if (!wps->w1.index [chan]) { - - int guess_k = (wps->w1.ave_k [chan] + 128) >> 8, ones; - - for (ones = 0; ones < 72 && getbit (&wps->wvbits); ++ones); - - if (ones == 72) - return WORD_EOF; - - if (ones % 3 == 1) - wps->w1.k_value [chan] = guess_k - (ones / 3) - 1; - else - wps->w1.k_value [chan] = guess_k + ones - ((ones + 1) / 3); - - wps->w1.ave_k [chan] -= (wps->w1.ave_k [chan] + 0x10) >> 5; - wps->w1.ave_k [chan] += wps->w1.k_value [chan] << 3; - } - - if (++wps->w1.index [chan] == NUM_SAMPLES) - wps->w1.index [chan] = 0; - - k = wps->w1.k_value [chan]; - getbits (&avalue, k, &wps->wvbits); - - for (bc = 0; bc < 32 && getbit (&wps->wvbits); ++bc); - - if (bc == 32 || (k & ~31)) - return WORD_EOF; - - avalue = (avalue & bitmask [k]) + bitset [k] * bc; - return (avalue && getbit (&wps->wvbits)) ? -(int32_t)avalue : avalue; -} - -static int32_t FASTCALL get_word2 (WavpackStream3 *wps, int chan) -{ - int cbits, delta_dbits, dbits; - int32_t value, mask = 1; - - cbits = 0; - - while (getbit (&wps->wvbits)) - if ((cbits += 2) == 50) - return WORD_EOF; - - if (getbit (&wps->wvbits)) - cbits++; - - if (cbits == 0) - delta_dbits = 0; - else if (cbits & 1) { - delta_dbits = (cbits + 1) / 2; - - if (wps->w2.last_delta_sign [chan] > 0) - delta_dbits *= -1; - - wps->w2.last_delta_sign [chan] = delta_dbits; - } - else { - delta_dbits = cbits / 2; - - if (wps->w2.last_delta_sign [chan] <= 0) - delta_dbits *= -1; - } - - dbits = (wps->w2.last_dbits [chan] += delta_dbits); - - if (dbits < 0 || dbits > 20) - return WORD_EOF; - - if (!dbits) - return 0L; - - if (wps->wphdr.bits) { - for (value = 1L << (dbits - 1); --dbits; mask <<= 1) - if (dbits < wps->wphdr.bits && getbit (&wps->wvbits)) - value |= mask; - } - else - for (value = 1L << (dbits - 1); --dbits; mask <<= 1) - if (getbit (&wps->wvbits)) - value |= mask; - - return getbit (&wps->wvbits) ? -(int32_t)value : value; -} - -static int32_t FASTCALL get_word3 (WavpackStream3 *wps, int chan) -{ - int cbits, delta_dbits, dbits; - int32_t value; - - for (cbits = 0; cbits < 72 && getbit (&wps->wvbits); ++cbits); - - if (cbits == 72) - return WORD_EOF; - - if (cbits || getbit (&wps->wvbits)) - ++cbits; - - if (!((cbits + 1) % 3)) - delta_dbits = (cbits + 1) / 3; - else - delta_dbits = -(cbits - cbits / 3); - - if (chan) { - dbits = (wps->w3.ave_dbits [1] >> 8) + 1 + delta_dbits; - wps->w3.ave_dbits [1] -= (wps->w3.ave_dbits [1] + 0x10) >> 5; - wps->w3.ave_dbits [1] += dbits << 3; - } - else { - dbits = (wps->w3.ave_dbits [0] >> 8) + 1 + delta_dbits; - wps->w3.ave_dbits [0] -= (wps->w3.ave_dbits [0] + 0x10) >> 5; - wps->w3.ave_dbits [0] += dbits << 3; - } - - if (dbits < 0 || dbits > 24) - return WORD_EOF; - - if (!dbits) - return 0L; - - if (wps->wphdr.bits && dbits > wps->wphdr.bits) { - getbits (&value, wps->wphdr.bits, &wps->wvbits); - - if (value & bitset [wps->wphdr.bits - 1]) - return -(int32_t)(value & bitmask [wps->wphdr.bits]) << (dbits - wps->wphdr.bits); - else - return ((value & bitmask [wps->wphdr.bits - 1]) | bitset [wps->wphdr.bits - 1]) << (dbits - wps->wphdr.bits); - } - else { - getbits (&value, dbits, &wps->wvbits); - - if (value & bitset [dbits - 1]) - return -(int32_t)(value & bitmask [dbits]); - else - return (value & bitmask [dbits - 1]) | bitset [dbits - 1]; - } -} - -static int FASTCALL wp3_log2 (uint32_t avalue); - -static int32_t FASTCALL get_word4 (WavpackStream3 *wps, int chan, int32_t *correction) -{ - uint32_t base, ones_count, avalue; - int32_t value, low, mid, high; - int bitcount; - - // count consecutive ones in bitstream, > 25 indicates error (or EOF) - - for (ones_count = 0; ones_count < 25 && getbit (&wps->wvbits); ++ones_count); - - if (ones_count == 25) - return WORD_EOF; - - // if the ones count is exactly 24, then we switch to non-unary method - - if (ones_count == 24) { - int32_t mask; - int cbits; - - for (cbits = 0; cbits < 33 && getbit (&wps->wvbits); ++cbits); - - if (cbits == 33) - return WORD_EOF; - - if (cbits < 2) - ones_count = cbits; - else { - for (mask = 1, ones_count = 0; --cbits; mask <<= 1) - if (getbit (&wps->wvbits)) - ones_count |= mask; - - ones_count |= mask; - } - - ones_count += 24; - } - - if (!chan) { - int slow_log_0, slow_log_1, balance; - - if (wps->wphdr.flags & MONO_FLAG) { - wps->w4.bits_acc [0] += wps->w4.bitrate + wp3_log2 (wps->w4.fast_level [0]) - wp3_log2 (wps->w4.slow_level [0]) + (3 << 8); - - if (wps->w4.bits_acc [0] < 0) - wps->w4.bits_acc [0] = 0; - } - else { - slow_log_0 = wp3_log2 (wps->w4.slow_level [0]); - slow_log_1 = wp3_log2 (wps->w4.slow_level [1]); - - if (wps->wphdr.flags & JOINT_STEREO) - balance = (slow_log_1 - slow_log_0 + 257) >> 1; - else - balance = (slow_log_1 - slow_log_0 + 1) >> 1; - - wps->w4.bits_acc [0] += wps->w4.bitrate - balance + wp3_log2 (wps->w4.fast_level [0]) - slow_log_0 + (3 << 8); - wps->w4.bits_acc [1] += wps->w4.bitrate + balance + wp3_log2 (wps->w4.fast_level [1]) - slow_log_1 + (3 << 8); - - if (wps->w4.bits_acc [0] + wps->w4.bits_acc [1] < 0) - wps->w4.bits_acc [0] = wps->w4.bits_acc [1] = 0; - else if (wps->w4.bits_acc [0] < 0) { - wps->w4.bits_acc [1] += wps->w4.bits_acc [0]; - wps->w4.bits_acc [0] = 0; - } - else if (wps->w4.bits_acc [1] < 0) { - wps->w4.bits_acc [0] += wps->w4.bits_acc [1]; - wps->w4.bits_acc [1] = 0; - } - } - } - - base = (wps->w4.fast_level [chan] + 48) / 96; - bitcount = wps->w4.bits_acc [chan] >> 8; - wps->w4.bits_acc [chan] &= 0xff; - - if (!base) { - if (ones_count) - high = low = mid = (getbit (&wps->wvbits)) ? -(int32_t)ones_count : ones_count; - else - high = low = mid = 0; - } - else { - mid = (ones_count * 2 + 1) * base; - if (getbit (&wps->wvbits)) mid = -mid; - low = mid - base; - high = mid + base - 1; - - while (bitcount--) { - if (getbit (&wps->wvbits)) - mid = (high + (low = mid) + 1) >> 1; - else - mid = ((high = mid - 1) + low + 1) >> 1; - - if (high == low) - break; - } - } - - wps->w4.fast_level [chan] -= ((wps->w4.fast_level [chan] + 0x10) >> 5); - wps->w4.fast_level [chan] += (avalue = labs (mid)); - wps->w4.slow_level [chan] -= ((wps->w4.slow_level [chan] + 0x80) >> 8); - wps->w4.slow_level [chan] += avalue; - - if (bs_is_open (&wps->wvcbits)) { - - if (high != low) { - uint32_t maxcode = high - low; - int bitcount = count_bits (maxcode); - uint32_t extras = (1L << bitcount) - maxcode - 1; - - getbits (&avalue, bitcount - 1, &wps->wvcbits); - avalue &= bitmask [bitcount - 1]; - - if (avalue >= extras) { - avalue = (avalue << 1) - extras; - - if (getbit (&wps->wvcbits)) - ++avalue; - } - - value = (mid < 0) ? high - avalue : avalue + low; - - if (correction) - *correction = value - mid; - } - else if (correction) - *correction = 0; - } - - return mid; -} - -// This function calculates an approximate base-2 logarithm (with 8 bits of -// fraction) from the supplied value. Using logarithms makes comparing -// signal level values and calculating fractional bitrates much easier. - -static int FASTCALL wp3_log2 (uint32_t avalue) -{ - int dbits; - - if ((avalue += avalue >> 9) < (1 << 8)) { - dbits = nbits_table [avalue]; - return (dbits << 8) + ((avalue << (9 - dbits)) & 0xff); - } - else { - if (avalue < (1L << 16)) - dbits = nbits_table [avalue >> 8] + 8; - else if (avalue < (1L << 24)) - dbits = nbits_table [avalue >> 16] + 16; - else - dbits = nbits_table [avalue >> 24] + 24; - - return (dbits << 8) + ((avalue >> (dbits - 9)) & 0xff); - } -} - -static void bs_read3 (Bitstream3 *bs) -{ - uint32_t bytes_read; - - bytes_read = bs->reader->read_bytes (bs->id, bs->buf, bs->bufsiz); - bs->end = bs->buf + bytes_read; - bs->fpos += bytes_read; - - if (bs->end == bs->buf) { - memset (bs->buf, -1, bs->bufsiz); - bs->end += bs->bufsiz; - } - - bs->ptr = bs->buf; -} - -// Open the specified BitStream and associate with the specified file. The -// "bufsiz" field of the structure must be preset with the desired buffer -// size and the file's read pointer must be set to where the desired bit -// data is located. A return value of TRUE indicates an error in -// allocating buffer space. - -static int bs_open_read3 (Bitstream3 *bs, WavpackStreamReader64 *reader, void *id) -{ - bs->fpos = (bs->reader = reader)->get_pos (bs->id = id); - - if (!bs->buf) - bs->buf = (unsigned char *) malloc (bs->bufsiz); - - bs->end = bs->buf + bs->bufsiz; - bs->ptr = bs->end - 1; - bs->sr = bs->bc = 0; - bs->error = bs->buf ? 0 : 1; - bs->wrap = bs_read3; - return bs->error; -} - -static uint32_t bs_unused_bytes (Bitstream3 *bs) -{ - if (bs->bc < 8) { - bs->bc += 8; - bs->ptr++; - } - - return (uint32_t)(bs->end - bs->ptr); -} - -static unsigned char *bs_unused_data (Bitstream3 *bs) -{ - if (bs->bc < 8) { - bs->bc += 8; - bs->ptr++; - } - - return bs->ptr; -} - -#endif // ENABLE_LEGACY - diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack3.h b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack3.h deleted file mode 100644 index ae351f83..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack3.h +++ /dev/null @@ -1,119 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2006 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// wavpack3.h - -// This header file contains all the additional definitions required for -// decoding old (versions 1, 2 & 3) WavPack files. - -typedef struct { - uint16_t FormatTag, NumChannels; - uint32_t SampleRate, BytesPerSecond; - uint16_t BlockAlign, BitsPerSample; -} WaveHeader3; - -#define WaveHeader3Format "SSLLSS" - -typedef struct { - char ckID [4]; - int32_t ckSize; - int16_t version; - int16_t bits; // added for version 2.00 - int16_t flags, shift; // added for version 3.00 - int32_t total_samples, crc, crc2; - char extension [4], extra_bc, extras [3]; -} WavpackHeader3; - -#define WavpackHeader3Format "4LSSSSLLL4L" - -// these flags added for version 3 - -#undef MONO_FLAG // these definitions changed for WavPack 4.0 -#undef CROSS_DECORR -#undef JOINT_STEREO - -#define MONO_FLAG 1 // not stereo -#define FAST_FLAG 2 // non-adaptive predictor and stereo mode -#define RAW_FLAG 4 // raw mode (no .wav header) -#define CALC_NOISE 8 // calc noise in lossy mode (no longer stored) -#define HIGH_FLAG 0x10 // high quality mode (all modes) -#define BYTES_3 0x20 // files have 3-byte samples -#define OVER_20 0x40 // samples are over 20 bits -#define WVC_FLAG 0x80 // create/use .wvc (no longer stored) -#define LOSSY_SHAPE 0x100 // noise shape (lossy mode only) -#define VERY_FAST_FLAG 0x200 // double fast (no longer stored) -#define NEW_HIGH_FLAG 0x400 // new high quality mode (lossless only) -#define CANCEL_EXTREME 0x800 // cancel EXTREME_DECORR -#define CROSS_DECORR 0x1000 // decorrelate chans (with EXTREME_DECORR flag) -#define NEW_DECORR_FLAG 0x2000 // new high-mode decorrelator -#define JOINT_STEREO 0x4000 // joint stereo (lossy and high lossless) -#define EXTREME_DECORR 0x8000 // extra decorrelation (+ enables other flags) - -#define STORED_FLAGS 0xfd77 // these are only flags that affect unpacking -#define NOT_STORED_FLAGS (~STORED_FLAGS & 0xffff) - -// BitStream stuff (bits.c) - -typedef struct bs3 { - void (*wrap)(struct bs3 *bs); - unsigned char *buf, *end, *ptr; - uint32_t bufsiz, sr; - int64_t fpos; - WavpackStreamReader64 *reader; - int error, bc; - void *id; -} Bitstream3; - -#define K_DEPTH 3 -#define MAX_NTERMS3 18 - -typedef struct { - WavpackHeader3 wphdr; - Bitstream3 wvbits, wvcbits; - uint32_t sample_index; - int num_terms; - -#ifndef NO_SEEKING - struct index_point { - char saved; - uint32_t sample_index; - } index_points [256]; - - unsigned char *unpack_data; - uint32_t unpack_size; -#endif - - struct { - int32_t sum_level, left_level, right_level, diff_level; - int last_extra_bits, extra_bits_count, m; - int32_t error [2], crc; - int32_t sample [2] [2]; - int weight [2] [1]; - } dc; - - struct decorr_pass decorr_passes [MAX_NTERMS3]; - - struct { - unsigned int index [2], k_value [2], ave_k [2]; - uint32_t zeros_acc, ave_level [K_DEPTH] [2]; - } w1; - - struct { int last_dbits [2], last_delta_sign [2], bit_limit; } w2; - - struct { int ave_dbits [2], bit_limit; } w3; - - struct { - uint32_t fast_level [2], slow_level [2]; - int bits_acc [2], bitrate; - } w4; -} WavpackStream3; - -#define SAVE(destin, item) { memcpy (destin, &item, sizeof (item)); destin = (char *) destin + sizeof (item); } -#define RESTORE(item, source) { memcpy (&item, source, sizeof (item)); source = (char *) source + sizeof (item); } - -void unpack_init3 (WavpackStream3 *wps); diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack3_open.c b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack3_open.c deleted file mode 100644 index 1572aafd..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack3_open.c +++ /dev/null @@ -1,289 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2013 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// unpack3_open.c - -// This module provides an extension to the open_utils.c module for handling -// WavPack files prior to version 4.0, not including "raw" files. As these -// modes are all obsolete and are no longer written, this code will not be -// fully documented other than the global functions. However, full documenation -// is provided in the version 3.97 source code. Note that this module only -// provides the functionality of opening the files and obtaining information -// from them; the actual audio decoding is located in the unpack3.c module. - -#ifdef ENABLE_LEGACY - -#include -#include - -#include "wavpack_local.h" -#include "unpack3.h" - -#define ATTEMPT_ERROR_MUTING - -// This provides an extension to the WavpackOpenFileRead () function contained -// in the wputils.c module. It is assumed that an 'R' had been read as the -// first character of the file/stream (indicating a non-raw pre version 4.0 -// WavPack file) and had been pushed back onto the stream (or simply seeked -// back to). - -WavpackContext *open_file3 (WavpackContext *wpc, char *error) -{ - RiffChunkHeader RiffChunkHeader; - ChunkHeader ChunkHeader; - WavpackHeader3 wphdr; - WavpackStream3 *wps; - WaveHeader3 wavhdr; - - CLEAR (wavhdr); - wpc->stream3 = wps = (WavpackStream3 *) malloc (sizeof (WavpackStream3)); - CLEAR (*wps); - - if (wpc->reader->read_bytes (wpc->wv_in, &RiffChunkHeader, sizeof (RiffChunkHeader)) != - sizeof (RiffChunkHeader)) { - if (error) strcpy (error, "not a valid WavPack file!"); - return WavpackCloseFile (wpc); - } - - if (!strncmp (RiffChunkHeader.ckID, "RIFF", 4) && !strncmp (RiffChunkHeader.formType, "WAVE", 4)) { - - if (wpc->open_flags & OPEN_WRAPPER) { - wpc->wrapper_data = (unsigned char *)malloc (wpc->wrapper_bytes = sizeof (RiffChunkHeader)); - memcpy (wpc->wrapper_data, &RiffChunkHeader, sizeof (RiffChunkHeader)); - } - - // If the first chunk is a wave RIFF header, then read the various chunks - // until we get to the "data" chunk (and WavPack header should follow). If - // the first chunk is not a RIFF, then we assume a "raw" WavPack file and - // the WavPack header must be first. - - while (1) { - - if (wpc->reader->read_bytes (wpc->wv_in, &ChunkHeader, sizeof (ChunkHeader)) != - sizeof (ChunkHeader)) { - if (error) strcpy (error, "not a valid WavPack file!"); - return WavpackCloseFile (wpc); - } - else { - if (wpc->open_flags & OPEN_WRAPPER) { - wpc->wrapper_data = (unsigned char *)realloc (wpc->wrapper_data, wpc->wrapper_bytes + sizeof (ChunkHeader)); - memcpy (wpc->wrapper_data + wpc->wrapper_bytes, &ChunkHeader, sizeof (ChunkHeader)); - wpc->wrapper_bytes += sizeof (ChunkHeader); - } - - WavpackLittleEndianToNative (&ChunkHeader, ChunkHeaderFormat); - - if (!strncmp (ChunkHeader.ckID, "fmt ", 4)) { - - if (ChunkHeader.ckSize < sizeof (wavhdr) || - wpc->reader->read_bytes (wpc->wv_in, &wavhdr, sizeof (wavhdr)) != sizeof (wavhdr)) { - if (error) strcpy (error, "not a valid WavPack file!"); - return WavpackCloseFile (wpc); - } - else if (wpc->open_flags & OPEN_WRAPPER) { - wpc->wrapper_data = (unsigned char *)realloc (wpc->wrapper_data, wpc->wrapper_bytes + sizeof (wavhdr)); - memcpy (wpc->wrapper_data + wpc->wrapper_bytes, &wavhdr, sizeof (wavhdr)); - wpc->wrapper_bytes += sizeof (wavhdr); - } - - WavpackLittleEndianToNative (&wavhdr, WaveHeader3Format); - - if (ChunkHeader.ckSize > sizeof (wavhdr)) { - uint32_t bytes_to_skip = (ChunkHeader.ckSize + 1 - sizeof (wavhdr)) & ~1L; - - if (bytes_to_skip > 1024 * 1024) { - if (error) strcpy (error, "not a valid WavPack file!"); - return WavpackCloseFile (wpc); - } - - if (wpc->open_flags & OPEN_WRAPPER) { - wpc->wrapper_data = (unsigned char *)realloc (wpc->wrapper_data, wpc->wrapper_bytes + bytes_to_skip); - wpc->reader->read_bytes (wpc->wv_in, wpc->wrapper_data + wpc->wrapper_bytes, bytes_to_skip); - wpc->wrapper_bytes += bytes_to_skip; - } - else { - unsigned char *temp = (unsigned char *)malloc (bytes_to_skip); - wpc->reader->read_bytes (wpc->wv_in, temp, bytes_to_skip); - free (temp); - } - } - } - else if (!strncmp (ChunkHeader.ckID, "data", 4)) - break; - else if ((ChunkHeader.ckSize + 1) & ~1L) { - uint32_t bytes_to_skip = (ChunkHeader.ckSize + 1) & ~1L; - - if (bytes_to_skip > 1024 * 1024) { - if (error) strcpy (error, "not a valid WavPack file!"); - return WavpackCloseFile (wpc); - } - - if (wpc->open_flags & OPEN_WRAPPER) { - wpc->wrapper_data = (unsigned char *)realloc (wpc->wrapper_data, wpc->wrapper_bytes + bytes_to_skip); - wpc->reader->read_bytes (wpc->wv_in, wpc->wrapper_data + wpc->wrapper_bytes, bytes_to_skip); - wpc->wrapper_bytes += bytes_to_skip; - } - else { - unsigned char *temp = (unsigned char *)malloc (bytes_to_skip); - wpc->reader->read_bytes (wpc->wv_in, temp, bytes_to_skip); - free (temp); - } - } - } - } - } - else { - if (error) strcpy (error, "not a valid WavPack file!"); - return WavpackCloseFile (wpc); - } - - if (wavhdr.FormatTag != 1 || !wavhdr.NumChannels || wavhdr.NumChannels > 2 || - !wavhdr.SampleRate || wavhdr.BitsPerSample < 16 || wavhdr.BitsPerSample > 24 || - wavhdr.BlockAlign / wavhdr.NumChannels > 3 || wavhdr.BlockAlign % wavhdr.NumChannels || - wavhdr.BlockAlign / wavhdr.NumChannels < (wavhdr.BitsPerSample + 7) / 8) { - if (error) strcpy (error, "not a valid WavPack file!"); - return WavpackCloseFile (wpc); - } - - wpc->total_samples = ChunkHeader.ckSize / wavhdr.NumChannels / - ((wavhdr.BitsPerSample > 16) ? 3 : 2); - - if (wpc->reader->read_bytes (wpc->wv_in, &wphdr, 10) != 10) { - if (error) strcpy (error, "not a valid WavPack file!"); - return WavpackCloseFile (wpc); - } - - if (((char *) &wphdr) [8] == 2 && (wpc->reader->read_bytes (wpc->wv_in, ((char *) &wphdr) + 10, 2) != 2)) { - if (error) strcpy (error, "not a valid WavPack file!"); - return WavpackCloseFile (wpc); - } - else if (((char *) &wphdr) [8] == 3 && (wpc->reader->read_bytes (wpc->wv_in, ((char *) &wphdr) + 10, - sizeof (wphdr) - 10) != sizeof (wphdr) - 10)) { - if (error) strcpy (error, "not a valid WavPack file!"); - return WavpackCloseFile (wpc); - } - - WavpackLittleEndianToNative (&wphdr, WavpackHeader3Format); - - // make sure this is a version we know about - - if (strncmp (wphdr.ckID, "wvpk", 4) || wphdr.version < 1 || wphdr.version > 3) { - if (error) strcpy (error, "not a valid WavPack file!"); - return WavpackCloseFile (wpc); - } - - // Because I ran out of flag bits in the WavPack header, an amazingly ugly - // kludge was forced upon me! This code takes care of preparing the flags - // field for internal use and checking for unknown formats we can't decode - - if (wphdr.version == 3) { - - if (wphdr.flags & EXTREME_DECORR) { - - if ((wphdr.flags & NOT_STORED_FLAGS) || - ((wphdr.bits) && - (((wphdr.flags & NEW_HIGH_FLAG) && - (wphdr.flags & (FAST_FLAG | HIGH_FLAG))) || - (wphdr.flags & CROSS_DECORR)))) { - if (error) strcpy (error, "not a valid WavPack file!"); - return WavpackCloseFile (wpc); - } - - if (wphdr.flags & CANCEL_EXTREME) - wphdr.flags &= ~(EXTREME_DECORR | CANCEL_EXTREME); - } - else - wphdr.flags &= ~CROSS_DECORR; - } - - // check to see if we should look for a "correction" file, and if so try - // to open it for reading, then set WVC_FLAG accordingly - - if (wpc->wvc_in && wphdr.version == 3 && wphdr.bits && (wphdr.flags & NEW_HIGH_FLAG)) { - wpc->file2len = wpc->reader->get_length (wpc->wvc_in); - wphdr.flags |= WVC_FLAG; - wpc->wvc_flag = TRUE; - } - else - wphdr.flags &= ~WVC_FLAG; - - // check WavPack version to handle special requirements of versions - // before 3.0 that had smaller headers - - if (wphdr.version < 3) { - wphdr.total_samples = (int32_t) wpc->total_samples; - wphdr.flags = wavhdr.NumChannels == 1 ? MONO_FLAG : 0; - wphdr.shift = 16 - wavhdr.BitsPerSample; - - if (wphdr.version == 1) - wphdr.bits = 0; - } - - wpc->config.sample_rate = wavhdr.SampleRate; - wpc->config.num_channels = wavhdr.NumChannels; - wpc->config.channel_mask = 5 - wavhdr.NumChannels; - - if (wphdr.flags & MONO_FLAG) - wpc->config.flags |= CONFIG_MONO_FLAG; - - if (wphdr.flags & EXTREME_DECORR) - wpc->config.flags |= CONFIG_HIGH_FLAG; - - if (wphdr.bits) { - if (wphdr.flags & NEW_HIGH_FLAG) - wpc->config.flags |= CONFIG_HYBRID_FLAG; - else - wpc->config.flags |= CONFIG_LOSSY_MODE; - } - else if (!(wphdr.flags & HIGH_FLAG)) - wpc->config.flags |= CONFIG_FAST_FLAG; - - wpc->config.bytes_per_sample = (wphdr.flags & BYTES_3) ? 3 : 2; - wpc->config.bits_per_sample = wavhdr.BitsPerSample; - - memcpy (&wps->wphdr, &wphdr, sizeof (wphdr)); - wps->wvbits.bufsiz = wps->wvcbits.bufsiz = 1024 * 1024; - return wpc; -} - -// return currently decoded sample index - -uint32_t get_sample_index3 (WavpackContext *wpc) -{ - WavpackStream3 *wps = (WavpackStream3 *) wpc->stream3; - - return (wps) ? wps->sample_index : (uint32_t) -1; -} - -int get_version3 (WavpackContext *wpc) -{ - WavpackStream3 *wps = (WavpackStream3 *) wpc->stream3; - - return (wps) ? wps->wphdr.version : 0; -} - -void free_stream3 (WavpackContext *wpc) -{ - WavpackStream3 *wps = (WavpackStream3 *) wpc->stream3; - - if (wps) { -#ifndef NO_SEEKING - if (wps->unpack_data) - free (wps->unpack_data); -#endif - if ((wps->wphdr.flags & WVC_FLAG) && wps->wvcbits.buf) - free (wps->wvcbits.buf); - - if (wps->wvbits.buf) - free (wps->wvbits.buf); - - free (wps); - } -} - -#endif // ENABLE_LEGACY diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack3_seek.c b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack3_seek.c deleted file mode 100644 index f1ed27fd..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack3_seek.c +++ /dev/null @@ -1,212 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2013 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// unpack3_seek.c - -// This module provides seeking support for WavPack files prior to version 4.0. - -#ifdef ENABLE_LEGACY -#ifndef NO_SEEKING - -#include -#include - -#include "wavpack_local.h" -#include "unpack3.h" - -static void *unpack_restore (WavpackStream3 *wps, void *source, int keep_resources); -static void bs_restore3 (Bitstream3 *bs); - -// This is an extension for WavpackSeekSample (). Note that because WavPack -// files created prior to version 4.0 are not inherently seekable, this -// function could take a long time if a forward seek is requested to an -// area that has not been played (or seeked through) yet. - -int seek_sample3 (WavpackContext *wpc, uint32_t desired_index) -{ - int points_index = desired_index / (((uint32_t) wpc->total_samples >> 8) + 1); - WavpackStream3 *wps = (WavpackStream3 *) wpc->stream3; - - if (desired_index >= wpc->total_samples) - return FALSE; - - while (points_index) - if (wps->index_points [points_index].saved && - wps->index_points [points_index].sample_index <= desired_index) - break; - else - points_index--; - - if (wps->index_points [points_index].saved) - if (wps->index_points [points_index].sample_index > wps->sample_index || - wps->sample_index > desired_index) { - wps->sample_index = wps->index_points [points_index].sample_index; - unpack_restore (wps, wps->unpack_data + points_index * wps->unpack_size, TRUE); - } - - if (desired_index > wps->sample_index) { - int32_t *buffer = (int32_t *) malloc (1024 * (wps->wphdr.flags & MONO_FLAG ? 4 : 8)); - uint32_t samples_to_skip = desired_index - wps->sample_index; - - while (1) { - if (samples_to_skip > 1024) { - if (unpack_samples3 (wpc, buffer, 1024) == 1024) - samples_to_skip -= 1024; - else - break; - } - else { - samples_to_skip -= unpack_samples3 (wpc, buffer, samples_to_skip); - break; - } - } - - free (buffer); - - if (samples_to_skip) - return FALSE; - } - - return TRUE; -} - -// This function restores the unpacking context from the specified pointer -// and returns the updated pointer. After this call, unpack_samples() will -// continue where it left off immediately before unpack_save() was called. -// If the WavPack files and bitstreams might have been closed and reopened, -// then the "keep_resources" flag should be set to avoid using the "old" -// resources that were originally saved (and are probably now invalid). - -static void *unpack_restore (WavpackStream3 *wps, void *source, int keep_resources) -{ - int flags = wps->wphdr.flags, tcount; - struct decorr_pass *dpp; - FILE *temp_file; - unsigned char *temp_buf; - - unpack_init3 (wps); - temp_file = wps->wvbits.id; - temp_buf = wps->wvbits.buf; - RESTORE (wps->wvbits, source); - - if (keep_resources) { - wps->wvbits.id = temp_file; - wps->wvbits.ptr += temp_buf - wps->wvbits.buf; - wps->wvbits.end += temp_buf - wps->wvbits.buf; - wps->wvbits.buf = temp_buf; - } - - bs_restore3 (&wps->wvbits); - - if (flags & WVC_FLAG) { - temp_file = wps->wvcbits.id; - temp_buf = wps->wvcbits.buf; - RESTORE (wps->wvcbits, source); - - if (keep_resources) { - wps->wvcbits.id = temp_file; - wps->wvcbits.ptr += temp_buf - wps->wvcbits.buf; - wps->wvcbits.end += temp_buf - wps->wvcbits.buf; - wps->wvcbits.buf = temp_buf; - } - - bs_restore3 (&wps->wvcbits); - } - - if (wps->wphdr.version == 3) { - if (wps->wphdr.bits) { - RESTORE (wps->w4, source); - } - else { - RESTORE (wps->w1, source); - } - - RESTORE (wps->w3, source); - RESTORE (wps->dc.crc, source); - } - else - RESTORE (wps->w2, source); - - if (wps->wphdr.bits) { - RESTORE (wps->dc.error, source); - } - else { - RESTORE (wps->dc.sum_level, source); - RESTORE (wps->dc.left_level, source); - RESTORE (wps->dc.right_level, source); - RESTORE (wps->dc.diff_level, source); - } - - if (flags & OVER_20) { - RESTORE (wps->dc.last_extra_bits, source); - RESTORE (wps->dc.extra_bits_count, source); - } - - if (!(flags & EXTREME_DECORR)) { - RESTORE (wps->dc.sample, source); - RESTORE (wps->dc.weight, source); - } - - if (flags & (HIGH_FLAG | NEW_HIGH_FLAG)) - for (tcount = wps->num_terms, dpp = wps->decorr_passes; tcount--; dpp++) { - if (dpp->term > 0) { - int count = dpp->term; - int index = wps->dc.m; - - RESTORE (dpp->weight_A, source); - - while (count--) { - RESTORE (dpp->samples_A [index], source); - index = (index + 1) & (MAX_TERM - 1); - } - - if (!(flags & MONO_FLAG)) { - count = dpp->term; - index = wps->dc.m; - - RESTORE (dpp->weight_B, source); - - while (count--) { - RESTORE (dpp->samples_B [index], source); - index = (index + 1) & (MAX_TERM - 1); - } - } - } - else { - RESTORE (dpp->weight_A, source); - RESTORE (dpp->weight_B, source); - RESTORE (dpp->samples_A [0], source); - RESTORE (dpp->samples_B [0], source); - } - } - - return source; -} - -// This function is called after a call to unpack_restore() has restored -// the BitStream structure to a previous state and causes any required data -// to be read from the file. This function is NOT supported for overlapped -// operation. - -static void bs_restore3 (Bitstream3 *bs) -{ - uint32_t bytes_to_read = (uint32_t)(bs->end - bs->ptr - 1), bytes_read; - - bs->reader->set_pos_abs (bs->id, bs->fpos - bytes_to_read); - - if (bytes_to_read > 0) { - - bytes_read = bs->reader->read_bytes (bs->id, bs->ptr + 1, bytes_to_read); - - if (bytes_to_read != bytes_read) - bs->end = bs->ptr + 1 + bytes_read; - } -} - -#endif // NO_SEEKING -#endif // ENABLE_LEGACY diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_armv7.S b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_armv7.S deleted file mode 100644 index f423de39..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_armv7.S +++ /dev/null @@ -1,887 +0,0 @@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@ **** WAVPACK **** @@ -@@ Hybrid Lossless Wavefile Compressor @@ -@@ Copyright (c) 1998 - 2015 Conifer Software. @@ -@@ All Rights Reserved. @@ -@@ Distributed under the BSD Software License (see license.txt) @@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - - .text - .align - .global unpack_decorr_stereo_pass_cont_armv7 - .global unpack_decorr_mono_pass_cont_armv7 - -/* This is an assembly optimized version of the following WavPack function: - * - * void decorr_stereo_pass_cont (struct decorr_pass *dpp, - * int32_t *buffer, - * int32_t sample_counti, - * int32_t long_math); - * - * It performs a single pass of stereo decorrelation on the provided buffer. - * Note that this version of the function requires that up to 8 previous stereo - * samples are visible and correct. In other words, it ignores the "samples_*" - * fields in the decorr_pass structure and gets the history data directly - * from the buffer. It does, however, return the appropriate history samples - * to the decorr_pass structure before returning. - * - * This should work on all ARM architectures. This version of the code - * checks the magnitude of the decorrelation sample with a pair of shifts - * to avoid possible overflow (and therefore ignores the "long_math" arg). - * Previously I used the SSAT instruction for this, but then discovered that - * SSAT is not universally available (although on the armv7 I'm testing on - * it is slightly faster than the shifts). - * - * A mono version follows below. - */ - -/* - * on entry: - * - * r0 = struct decorr_pass *dpp - * r1 = int32_t *buffer - * r2 = int32_t sample_count - * r3 = int32_t long_math - */ - -unpack_decorr_stereo_pass_cont_armv7: - - stmfd sp!, {r4 - r8, r10, r11, lr} - - mov r5, r0 @ r5 = dpp - mov r11, #512 @ r11 = 512 for rounding - ldr r6, [r0, #4] @ r6 = dpp->delta - ldr r4, [r0, #8] @ r4 = dpp->weight_A - ldr r0, [r0, #12] @ r0 = dpp->weight_B - cmp r2, #0 @ exit if no samples to process - beq common_exit - - add r7, r1, r2, asl #3 @ r7 = buffer ending position - ldr r2, [r5, #0] @ r2 = dpp->term - cmp r2, #0 - bmi minus_term - - ldr lr, [r1, #-16] @ load 2 sample history from buffer - ldr r10, [r1, #-12] @ for terms 2, 17, and 18 - ldr r8, [r1, #-8] - ldr r3, [r1, #-4] - cmp r2, #17 - beq term_17_loop - cmp r2, #18 - beq term_18_loop - cmp r2, #2 - beq term_2_loop - b term_default_loop @ else handle default (1-8, except 2) - -minus_term: - mov r10, #1024 @ r10 = -1024 for weight clipping - rsb r10, r10, #0 @ (only used for negative terms) - cmn r2, #1 - beq term_minus_1 - cmn r2, #2 - beq term_minus_2 - cmn r2, #3 - beq term_minus_3 - b common_exit - -/* - ****************************************************************************** - * Loop to handle term = 17 condition - * - * r0 = dpp->weight_B r8 = previous left sample - * r1 = bptr r9 = - * r2 = current sample r10 = second previous right sample - * r3 = previous right sample r11 = 512 (for rounding) - * r4 = dpp->weight_A ip = current decorrelation value - * r5 = dpp sp = - * r6 = dpp->delta lr = second previous left sample - * r7 = eptr pc = - ******************************************************************************* - */ - -term_17_loop: - rsb ip, lr, r8, asl #1 @ decorr value = (2 * prev) - 2nd prev - mov lr, r8 @ previous becomes 2nd previous - ldr r2, [r1], #4 @ get sample & update pointer - mov r8, ip, lsl #11 @ check magnitude by shifting left then right - cmp ip, r8, asr #11 @ and comparing, branch to 64-bit math if different - bne S117 - cmp ip, #0 - mla r8, ip, r4, r11 @ mult decorr value by weight, round, - add r8, r2, r8, asr #10 @ shift, and add to new sample - b S118 - -S117: mov r8, #0 @ use 64-bit multiply to avoid overflow - smlal r11, r8, r4, ip - add r8, r2, r8, lsl #22 - add r8, r8, r11, lsr #10 - mov r11, #512 - -S118: strne r8, [r1, #-4] @ if change possible, store sample back - cmpne r2, #0 - beq S325 - teq ip, r2 @ update weight based on signs - submi r4, r4, r6 - addpl r4, r4, r6 - -S325: rsb ip, r10, r3, asl #1 @ do same thing for right channel - mov r10, r3 - ldr r2, [r1], #4 - mov r3, ip, lsl #11 @ check magnitude by shifting left then right - cmp ip, r3, asr #11 @ and comparing, branch to 64-bit math if different - bne S119 - cmp ip, #0 - mla r3, ip, r0, r11 - add r3, r2, r3, asr #10 - b S120 - -S119: mov r3, #0 - smlal r11, r3, r0, ip - add r3, r2, r3, lsl #22 - add r3, r3, r11, lsr #10 - mov r11, #512 - -S120: strne r3, [r1, #-4] - cmpne r2, #0 - beq S329 - teq ip, r2 - submi r0, r0, r6 - addpl r0, r0, r6 - -S329: cmp r7, r1 @ loop back if more samples to do - bhi term_17_loop - b store_1718 @ common exit for terms 17 & 18 - -/* - ****************************************************************************** - * Loop to handle term = 18 condition - * - * r0 = dpp->weight_B r8 = previous left sample - * r1 = bptr r9 = - * r2 = current sample r10 = second previous right sample - * r3 = previous right sample r11 = 512 (for rounding) - * r4 = dpp->weight_A ip = decorrelation value - * r5 = dpp sp = - * r6 = dpp->delta lr = second previous left sample - * r7 = eptr pc = - ******************************************************************************* - */ - -term_18_loop: - sub ip, r8, lr @ decorr value = - mov lr, r8 @ ((3 * prev) - 2nd prev) >> 1 - add ip, r8, ip, asr #1 - ldr r2, [r1], #4 @ get sample & update pointer - mov r8, ip, lsl #11 @ check magnitude by shifting left then right - cmp ip, r8, asr #11 @ and comparing, branch to 64-bit math if different - bne S121 - cmp ip, #0 - mla r8, ip, r4, r11 @ mult decorr value by weight, round, - add r8, r2, r8, asr #10 @ shift, and add to new sample - b S122 - -S121: mov r8, #0 @ use 64-bit multiply to avoid overflow - smlal r11, r8, r4, ip - add r8, r2, r8, lsl #22 - add r8, r8, r11, lsr #10 - mov r11, #512 - -S122: strne r8, [r1, #-4] @ if change possible, store sample back - cmpne r2, #0 - beq S337 - teq ip, r2 @ update weight based on signs - submi r4, r4, r6 - addpl r4, r4, r6 - -S337: sub ip, r3, r10 @ do same thing for right channel - mov r10, r3 - add ip, r3, ip, asr #1 - ldr r2, [r1], #4 - mov r3, ip, lsl #11 @ check magnitude by shifting left then right - cmp ip, r3, asr #11 @ and comparing, branch to 64-bit math if different - bne S123 - cmp ip, #0 - mla r3, ip, r0, r11 - add r3, r2, r3, asr #10 - b S124 - -S123: mov r3, #0 - smlal r11, r3, r0, ip - add r3, r2, r3, lsl #22 - add r3, r3, r11, lsr #10 - mov r11, #512 - -S124: strne r3, [r1, #-4] - cmpne r2, #0 - beq S341 - teq ip, r2 - submi r0, r0, r6 - addpl r0, r0, r6 - -S341: cmp r7, r1 @ loop back if more samples to do - bhi term_18_loop - -/* common exit for terms 17 & 18 */ - -store_1718: - str r3, [r5, #48] @ store sample history into struct - str r8, [r5, #16] - str r10, [r5, #52] - str lr, [r5, #20] - b common_exit @ and return - -/* - ****************************************************************************** - * Loop to handle term = 2 condition - * (note that this case can be handled by the default term handler (1-8), but - * this special case is faster because it doesn't have to read memory twice) - * - * r0 = dpp->weight_B r8 = previous left sample - * r1 = bptr r9 = - * r2 = current sample r10 = second previous right sample - * r3 = previous right sample r11 = 512 (for rounding) - * r4 = dpp->weight_A ip = decorrelation value - * r5 = dpp sp = - * r6 = dpp->delta lr = second previous left sample - * r7 = eptr pc = - ******************************************************************************* - */ - -term_2_loop: - mov ip, lr @ get decorrelation value - mov lr, r8 @ previous becomes 2nd previous - ldr r2, [r1], #4 @ get sample & update pointer - mov r8, ip, lsl #11 @ check magnitude by shifting left then right - cmp ip, r8, asr #11 @ and comparing, branch to 64-bit math if different - bne S125 - cmp ip, #0 - mla r8, ip, r4, r11 @ mult decorr value by weight, round, - add r8, r2, r8, asr #10 @ shift, and add to new sample - b S126 - -S125: mov r8, #0 @ use 64-bit multiply to avoid overflow - smlal r11, r8, r4, ip - add r8, r2, r8, lsl #22 - add r8, r8, r11, lsr #10 - mov r11, #512 - -S126: strne r8, [r1, #-4] @ if change possible, store sample back - cmpne r2, #0 - beq S225 - teq ip, r2 @ update weight based on signs - submi r4, r4, r6 - addpl r4, r4, r6 - -S225: mov ip, r10 @ do same thing for right channel - mov r10, r3 - ldr r2, [r1], #4 - mov r3, ip, lsl #11 @ check magnitude by shifting left then right - cmp ip, r3, asr #11 @ and comparing, branch to 64-bit math if different - bne S127 - cmp ip, #0 - mla r3, ip, r0, r11 - add r3, r2, r3, asr #10 - b S128 - -S127: mov r3, #0 - smlal r11, r3, r0, ip - add r3, r2, r3, lsl #22 - add r3, r3, r11, lsr #10 - mov r11, #512 - -S128: strne r3, [r1, #-4] - cmpne r2, #0 - beq S229 - teq ip, r2 - submi r0, r0, r6 - addpl r0, r0, r6 - -S229: cmp r7, r1 @ loop back if more samples to do - bhi term_2_loop - b default_term_exit @ this exit updates all dpp->samples - -/* - ****************************************************************************** - * Loop to handle default term condition - * - * r0 = dpp->weight_B r8 = result accumulator - * r1 = bptr r9 = - * r2 = dpp->term r10 = - * r3 = decorrelation value r11 = 512 (for rounding) - * r4 = dpp->weight_A ip = current sample - * r5 = dpp sp = - * r6 = dpp->delta lr = - * r7 = eptr pc = - ******************************************************************************* - */ - -term_default_loop: - ldr ip, [r1] @ get original sample - ldr r3, [r1, -r2, asl #3] @ get decorrelation value based on term - mov r8, r3, lsl #11 @ check magnitude by shifting left then right - cmp r3, r8, asr #11 @ and comparing, branch to 64-bit math if different - bne S135 - cmp r3, #0 - mla r8, r3, r4, r11 @ mult decorr value by weight, round, - add r8, ip, r8, asr #10 @ shift and add to new sample - b S136 - -S135: mov r8, #0 @ use 64-bit multiply to avoid overflow - smlal r11, r8, r4, r3 - add r8, ip, r8, lsl #22 - add r8, r8, r11, lsr #10 - mov r11, #512 - -S136: str r8, [r1], #4 @ store update sample - cmpne ip, #0 - beq S350 - teq ip, r3 @ update weight based on signs - submi r4, r4, r6 - addpl r4, r4, r6 - -S350: ldr ip, [r1] @ do the same thing for right channel - ldr r3, [r1, -r2, asl #3] - mov r8, r3, lsl #11 @ check magnitude by shifting left then right - cmp r3, r8, asr #11 @ and comparing, branch to 64-bit math if different - bne S137 - cmp r3, #0 - mla r8, r3, r0, r11 - add r8, ip, r8, asr #10 - b S138 - -S137: mov r8, #0 - smlal r11, r8, r0, r3 - add r8, ip, r8, lsl #22 - add r8, r8, r11, lsr #10 - mov r11, #512 - -S138: str r8, [r1], #4 - cmpne ip, #0 - beq S354 - teq ip, r3 - submi r0, r0, r6 - addpl r0, r0, r6 - -S354: cmp r7, r1 @ loop back if more samples to do - bhi term_default_loop - -/* - * This exit is used by terms 1-8 to store the previous "term" samples (up to 8) - * into the decorr pass structure history - */ - -default_term_exit: - ldr r2, [r5, #0] @ r2 = dpp->term - -S358: sub r2, r2, #1 - sub r1, r1, #8 - ldr r3, [r1, #4] @ get right sample and store in dpp->samples_B [r2] - add r6, r5, #48 - str r3, [r6, r2, asl #2] - ldr r3, [r1, #0] @ get left sample and store in dpp->samples_A [r2] - add r6, r5, #16 - str r3, [r6, r2, asl #2] - cmp r2, #0 - bne S358 - b common_exit - -/* - ****************************************************************************** - * Loop to handle term = -1 condition - * - * r0 = dpp->weight_B r8 = - * r1 = bptr r9 = - * r2 = intermediate result r10 = -1024 (for clipping) - * r3 = previous right sample r11 = 512 (for rounding) - * r4 = dpp->weight_A ip = current sample - * r5 = dpp sp = - * r6 = dpp->delta lr = updated left sample - * r7 = eptr pc = - ******************************************************************************* - */ - -term_minus_1: - ldr r3, [r1, #-4] - -term_minus_1_loop: - ldr ip, [r1] @ for left channel the decorrelation value - @ is the previous right sample (in r3) - mov lr, r3, lsl #11 @ check magnitude by shifting left then right - cmp r3, lr, asr #11 @ and comparing, branch to 64-bit math if different - bne S142 - cmp r3, #0 - mla r2, r3, r4, r11 - add lr, ip, r2, asr #10 - b S143 - -S142: mov lr, #0 @ use 64-bit multiply to avoid overflow - smlal r11, lr, r4, r3 - add lr, ip, lr, lsl #22 - add lr, lr, r11, lsr #10 - mov r11, #512 - -S143: str lr, [r1], #8 - cmpne ip, #0 - beq S361 - teq ip, r3 @ update weight based on signs - submi r4, r4, r6 - addpl r4, r4, r6 - cmp r4, #1024 - movgt r4, #1024 - cmp r4, r10 - movlt r4, r10 - -S361: ldr r2, [r1, #-4] @ for right channel the decorrelation value - @ is the just updated right sample (in lr) - mov r3, lr, lsl #11 @ check magnitude by shifting left then right - cmp lr, r3, asr #11 @ and comparing, branch to 64-bit math if different - bne S144 - cmp lr, #0 - mla r3, lr, r0, r11 - add r3, r2, r3, asr #10 - b S145 - -S144: mov r3, #0 - smlal r11, r3, r0, lr - add r3, r2, r3, lsl #22 - add r3, r3, r11, lsr #10 - mov r11, #512 - -S145: strne r3, [r1, #-4] - cmpne r2, #0 - beq S369 - teq r2, lr - submi r0, r0, r6 - addpl r0, r0, r6 - cmp r0, #1024 @ then clip weight to +/-1024 - movgt r0, #1024 - cmp r0, r10 - movlt r0, r10 - -S369: cmp r7, r1 @ loop back if more samples to do - bhi term_minus_1_loop - - str r3, [r5, #16] @ else store right sample and exit - b common_exit - -/* - ****************************************************************************** - * Loop to handle term = -2 condition - * (note that the channels are processed in the reverse order here) - * - * r0 = dpp->weight_B r8 = - * r1 = bptr r9 = - * r2 = intermediate result r10 = -1024 (for clipping) - * r3 = previous left sample r11 = 512 (for rounding) - * r4 = dpp->weight_A ip = current sample - * r5 = dpp sp = - * r6 = dpp->delta lr = updated right sample - * r7 = eptr pc = - ******************************************************************************* - */ - -term_minus_2: - ldr r3, [r1, #-8] - -term_minus_2_loop: - ldr ip, [r1, #4] @ for right channel the decorrelation value - @ is the previous left sample (in r3) - mov lr, r3, lsl #11 @ check magnitude by shifting left then right - cmp r3, lr, asr #11 @ and comparing, branch to 64-bit math if different - bne S146 - cmp r3, #0 - mla r2, r3, r0, r11 - add lr, ip, r2, asr #10 - b S147 - -S146: mov lr, #0 @ use 64-bit multiply to avoid overflow - smlal r11, lr, r0, r3 - add lr, ip, lr, lsl #22 - add lr, lr, r11, lsr #10 - mov r11, #512 - -S147: strne lr, [r1, #4] - cmpne ip, #0 - beq S380 - teq ip, r3 @ update weight based on signs - submi r0, r0, r6 - addpl r0, r0, r6 - cmp r0, #1024 @ then clip weight to +/-1024 - movgt r0, #1024 - cmp r0, r10 - movlt r0, r10 - -S380: ldr r2, [r1, #0] @ for left channel the decorrelation value - @ is the just updated left sample (in lr) - mov r3, lr, lsl #11 @ check magnitude by shifting left then right - cmp lr, r3, asr #11 @ and comparing, branch to 64-bit math if different - bne S148 - cmp lr, #0 - mla r3, lr, r4, r11 - add r3, r2, r3, asr #10 - b S149 - -S148: mov r3, #0 - smlal r11, r3, r4, lr - add r3, r2, r3, lsl #22 - add r3, r3, r11, lsr #10 - mov r11, #512 - -S149: str r3, [r1], #8 - cmpne r2, #0 - beq S388 - teq r2, lr - submi r4, r4, r6 - addpl r4, r4, r6 - cmp r4, #1024 - movgt r4, #1024 - cmp r4, r10 - movlt r4, r10 - -S388: cmp r7, r1 @ loop back if more samples to do - bhi term_minus_2_loop - - str r3, [r5, #48] @ else store left channel and exit - b common_exit - -/* - ****************************************************************************** - * Loop to handle term = -3 condition - * - * r0 = dpp->weight_B r8 = previous left sample - * r1 = bptr r9 = - * r2 = current left sample r10 = -1024 (for clipping) - * r3 = previous right sample r11 = 512 (for rounding) - * r4 = dpp->weight_A ip = intermediate result - * r5 = dpp sp = - * r6 = dpp->delta lr = - * r7 = eptr pc = - ******************************************************************************* - */ - -term_minus_3: - ldr r3, [r1, #-4] @ load previous samples - ldr r8, [r1, #-8] - -term_minus_3_loop: - ldr ip, [r1] - mov r2, r3, lsl #11 @ check magnitude by shifting left then right - cmp r3, r2, asr #11 @ and comparing, branch to 64-bit math if different - bne S160 - cmp r3, #0 - mla r2, r3, r4, r11 - add r2, ip, r2, asr #10 - b S161 - -S160: mov r2, #0 @ use 64-bit multiply to avoid overflow - smlal r11, r2, r4, r3 - add r2, ip, r2, lsl #22 - add r2, r2, r11, lsr #10 - mov r11, #512 - -S161: str r2, [r1], #4 - cmpne ip, #0 - beq S399 - teq ip, r3 @ update weight based on signs - submi r4, r4, r6 - addpl r4, r4, r6 - cmp r4, #1024 @ then clip weight to +/-1024 - movgt r4, #1024 - cmp r4, r10 - movlt r4, r10 - -S399: mov ip, r8 @ ip = previous left we use now - mov r8, r2 @ r8 = current left we use next time - ldr r2, [r1], #4 - mov r3, ip, lsl #11 @ check magnitude by shifting left then right - cmp ip, r3, asr #11 @ and comparing, branch to 64-bit math if different - bne S162 - cmp ip, #0 - mla r3, ip, r0, r11 - add r3, r2, r3, asr #10 - b S163 - -S162: mov r3, #0 - smlal r11, r3, r0, ip - add r3, r2, r3, lsl #22 - add r3, r3, r11, lsr #10 - mov r11, #512 - -S163: strne r3, [r1, #-4] - cmpne r2, #0 - beq S407 - teq ip, r2 - submi r0, r0, r6 - addpl r0, r0, r6 - cmp r0, #1024 - movgt r0, #1024 - cmp r0, r10 - movlt r0, r10 - -S407: cmp r7, r1 @ loop back if more samples to do - bhi term_minus_3_loop - - str r3, [r5, #16] @ else store previous samples & exit - str r8, [r5, #48] - -/* - * Before finally exiting we must store weights back for next time - */ - -common_exit: - str r4, [r5, #8] - str r0, [r5, #12] - ldmfd sp!, {r4 - r8, r10, r11, pc} - - - -/* This is a mono version of the function above. It does not handle negative terms. - * - * void decorr_mono_pass_cont (struct decorr_pass *dpp, - * int32_t *buffer, - * int32_t sample_counti, - * int32_t long_math); - * on entry: - * - * r0 = struct decorr_pass *dpp - * r1 = int32_t *buffer - * r2 = int32_t sample_count - * r3 = int32_t long_math - */ - -unpack_decorr_mono_pass_cont_armv7: - - stmfd sp!, {r4 - r8, r11, lr} - - mov r5, r0 @ r5 = dpp - mov r11, #512 @ r11 = 512 for rounding - ldr r6, [r0, #4] @ r6 = dpp->delta - ldr r4, [r0, #8] @ r4 = dpp->weight_A - cmp r2, #0 @ exit if no samples to process - beq mono_common_exit - - add r7, r1, r2, asl #2 @ r7 = buffer ending position - ldr r2, [r5, #0] @ r2 = dpp->term - - ldr lr, [r1, #-8] @ load 2 sample history from buffer - ldr r8, [r1, #-4] - cmp r2, #17 - beq mono_term_17_loop - cmp r2, #18 - beq mono_term_18_loop - cmp r2, #2 - beq mono_term_2_loop - b mono_term_default_loop @ else handle default (1-8, except 2) - -/* - ****************************************************************************** - * Loop to handle term = 17 condition - * - * r0 = r8 = previous sample - * r1 = bptr r9 = - * r2 = current sample r10 = - * r3 = r11 = 512 (for rounding) - * r4 = dpp->weight_A ip = current decorrelation value - * r5 = dpp sp = - * r6 = dpp->delta lr = second previous sample - * r7 = eptr pc = - ******************************************************************************* - */ - -mono_term_17_loop: - rsb ip, lr, r8, asl #1 @ decorr value = (2 * prev) - 2nd prev - mov lr, r8 @ previous becomes 2nd previous - ldr r2, [r1], #4 @ get sample & update pointer - mov r8, ip, lsl #11 @ check magnitude by shifting left then right - cmp ip, r8, asr #11 @ and comparing, branch to 64-bit math if different - bne S717 - cmp ip, #0 - mla r8, ip, r4, r11 @ mult decorr value by weight, round, - add r8, r2, r8, asr #10 @ shift, and add to new sample - b S718 - -S717: mov r8, #0 - smlal r11, r8, r4, ip - add r8, r2, r8, lsl #22 - add r8, r8, r11, lsr #10 - mov r11, #512 - -S718: strne r8, [r1, #-4] @ if change possible, store sample back - cmpne r2, #0 - beq S129 - teq ip, r2 @ update weight based on signs - submi r4, r4, r6 - addpl r4, r4, r6 - -S129: cmp r7, r1 @ loop back if more samples to do - bhi mono_term_17_loop - b mono_store_1718 @ common exit for terms 17 & 18 - -/* - ****************************************************************************** - * Loop to handle term = 18 condition - * - * r0 = r8 = previous sample - * r1 = bptr r9 = - * r2 = current sample r10 = - * r3 = r11 = 512 (for rounding) - * r4 = dpp->weight_A ip = decorrelation value - * r5 = dpp sp = - * r6 = dpp->delta lr = second previous sample - * r7 = eptr pc = - ******************************************************************************* - */ - -mono_term_18_loop: - sub ip, r8, lr @ decorr value = - mov lr, r8 @ ((3 * prev) - 2nd prev) >> 1 - add ip, r8, ip, asr #1 - ldr r2, [r1], #4 @ get sample & update pointer - mov r8, ip, lsl #11 @ check magnitude by shifting left then right - cmp ip, r8, asr #11 @ and comparing, branch to 64-bit math if different - bne S817 - cmp ip, #0 - mla r8, ip, r4, r11 @ mult decorr value by weight, round, - add r8, r2, r8, asr #10 @ shift, and add to new sample - b S818 - -S817: mov r8, #0 - smlal r11, r8, r4, ip - add r8, r2, r8, lsl #22 - add r8, r8, r11, lsr #10 - mov r11, #512 - -S818: strne r8, [r1, #-4] @ if change possible, store sample back - cmpne r2, #0 - beq S141 - teq ip, r2 @ update weight based on signs - submi r4, r4, r6 - addpl r4, r4, r6 - -S141: cmp r7, r1 @ loop back if more samples to do - bhi mono_term_18_loop - -/* common exit for terms 17 & 18 */ - -mono_store_1718: - str r8, [r5, #16] @ store sample history into struct - str lr, [r5, #20] - b mono_common_exit @ and return - -/* - ****************************************************************************** - * Loop to handle term = 2 condition - * (note that this case can be handled by the default term handler (1-8), but - * this special case is faster because it doesn't have to read memory twice) - * - * r0 = r8 = previous sample - * r1 = bptr r9 = - * r2 = current sample r10 = - * r3 = r11 = 512 (for rounding) - * r4 = dpp->weight_A ip = decorrelation value - * r5 = dpp sp = - * r6 = dpp->delta lr = second previous sample - * r7 = eptr pc = - ******************************************************************************* - */ - -mono_term_2_loop: - mov ip, lr @ get decorrelation value - mov lr, r8 @ previous becomes 2nd previous - ldr r2, [r1], #4 @ get sample & update pointer - mov r8, ip, lsl #11 @ check magnitude by shifting left then right - cmp ip, r8, asr #11 @ and comparing, branch to 64-bit math if different - bne S917 - cmp ip, #0 - mla r8, ip, r4, r11 @ mult decorr value by weight, round, - add r8, r2, r8, asr #10 @ shift, and add to new sample - b S918 - -S917: mov r8, #0 - smlal r11, r8, r4, ip - add r8, r2, r8, lsl #22 - add r8, r8, r11, lsr #10 - mov r11, #512 - -S918: strne r8, [r1, #-4] @ if change possible, store sample back - cmpne r2, #0 - beq S029 - teq ip, r2 @ update weight based on signs - submi r4, r4, r6 - addpl r4, r4, r6 - -S029: cmp r7, r1 @ loop back if more samples to do - bhi mono_term_2_loop - b mono_default_term_exit @ this exit updates all dpp->samples - -/* - ****************************************************************************** - * Loop to handle default term condition - * - * r0 = r8 = result accumulator - * r1 = bptr r9 = - * r2 = dpp->term r10 = - * r3 = decorrelation value r11 = 512 (for rounding) - * r4 = dpp->weight_A ip = current sample - * r5 = dpp sp = - * r6 = dpp->delta lr = - * r7 = eptr pc = - ******************************************************************************* - */ - -mono_term_default_loop: - ldr ip, [r1] @ get original sample - ldr r3, [r1, -r2, asl #2] @ get decorrelation value based on term - mov r8, r3, lsl #11 @ check magnitude by shifting left then right - cmp r3, r8, asr #11 @ and comparing, branch to 64-bit math if different - bne S617 - mla r8, r3, r4, r11 @ mult decorr value by weight, round, - add r8, ip, r8, asr #10 @ shift and add to new sample - b S618 - -S617: mov r8, #0 - smlal r11, r8, r4, r3 - add r8, ip, r8, lsl #22 - add r8, r8, r11, lsr #10 - mov r11, #512 - -S618: str r8, [r1], #4 @ store update sample - cmp r3, #0 - cmpne ip, #0 - beq S154 - teq ip, r3 @ update weight based on signs - submi r4, r4, r6 - addpl r4, r4, r6 - -S154: cmp r7, r1 @ loop back if more samples to do - bhi mono_term_default_loop - -/* - * This exit is used by terms 1-8 to store the previous "term" samples (up to 8) - * into the decorr pass structure history - */ - -mono_default_term_exit: - ldr r2, [r5, #0] @ r2 = dpp->term - -S158: sub r2, r2, #1 - sub r1, r1, #4 - ldr r3, [r1, #0] @ get sample and store in dpp->samples_A [r2] - add r6, r5, #16 - str r3, [r6, r2, asl #2] - cmp r2, #0 - bne S158 - b mono_common_exit - -/* - * Before finally exiting we must store weight back for next time - */ - -mono_common_exit: - str r4, [r5, #8] - ldmfd sp!, {r4 - r8, r11, pc} - -#ifdef __ELF__ - .section .note.GNU-stack,"",%progbits -#endif - diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_dsd.c b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_dsd.c deleted file mode 100644 index 11aa04f9..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_dsd.c +++ /dev/null @@ -1,616 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** DSDPACK **** // -// Lossless DSD (Direct Stream Digital) Audio Compressor // -// Copyright (c) 2013 - 2016 David Bryant. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// unpack_dsd.c - -// This module actually handles the uncompression of the DSD audio data. - -#ifdef ENABLE_DSD - -#include -#include -#include - -#include "wavpack_local.h" - -///////////////////////////// executable code //////////////////////////////// - -// This function initialzes the main range-encoded data for DSD audio samples - -static int init_dsd_block_fast (WavpackStream *wps, WavpackMetadata *wpmd); -static int init_dsd_block_high (WavpackStream *wps, WavpackMetadata *wpmd); -static int decode_fast (WavpackStream *wps, int32_t *output, int sample_count); -static int decode_high (WavpackStream *wps, int32_t *output, int sample_count); - -int init_dsd_block (WavpackContext *wpc, WavpackMetadata *wpmd) -{ - WavpackStream *wps = wpc->streams [wpc->current_stream]; - - if (wpmd->byte_length < 2) - return FALSE; - - wps->dsd.byteptr = (unsigned char *)wpmd->data; - wps->dsd.endptr = wps->dsd.byteptr + wpmd->byte_length; - wpc->dsd_multiplier = 1 << *wps->dsd.byteptr++; - wps->dsd.mode = *wps->dsd.byteptr++; - - if (!wps->dsd.mode) { - if (wps->dsd.endptr - wps->dsd.byteptr != wps->wphdr.block_samples * (wps->wphdr.flags & MONO_DATA ? 1 : 2)) { - return FALSE; - } - - wps->dsd.ready = 1; - return TRUE; - } - - if (wps->dsd.mode == 1) - return init_dsd_block_fast (wps, wpmd); - else if (wps->dsd.mode == 3) - return init_dsd_block_high (wps, wpmd); - else - return FALSE; -} - -int32_t unpack_dsd_samples (WavpackContext *wpc, int32_t *buffer, uint32_t sample_count) -{ - WavpackStream *wps = wpc->streams [wpc->current_stream]; - uint32_t flags = wps->wphdr.flags; - - // don't attempt to decode past the end of the block, but watch out for overflow! - - if (wps->sample_index + sample_count > GET_BLOCK_INDEX (wps->wphdr) + wps->wphdr.block_samples && - GET_BLOCK_INDEX (wps->wphdr) + wps->wphdr.block_samples - wps->sample_index < sample_count) - sample_count = (uint32_t) (GET_BLOCK_INDEX (wps->wphdr) + wps->wphdr.block_samples - wps->sample_index); - - if (GET_BLOCK_INDEX (wps->wphdr) > wps->sample_index || wps->wphdr.block_samples < sample_count) - wps->mute_error = TRUE; - - if (!wps->mute_error) { - if (!wps->dsd.mode) { - int total_samples = sample_count * ((flags & MONO_DATA) ? 1 : 2); - int32_t *bptr = buffer; - - if (wps->dsd.endptr - wps->dsd.byteptr < total_samples) - total_samples = (int)(wps->dsd.endptr - wps->dsd.byteptr); - - while (total_samples--) - wps->crc += (wps->crc << 1) + (*bptr++ = *wps->dsd.byteptr++); - } - else if (wps->dsd.mode == 1) { - if (!decode_fast (wps, buffer, sample_count)) - wps->mute_error = TRUE; - } - else if (!decode_high (wps, buffer, sample_count)) - wps->mute_error = TRUE; - } - - if (wps->mute_error) { - int samples_to_null; - if (wpc->reduced_channels == 1 || wpc->config.num_channels == 1 || (flags & MONO_FLAG)) - samples_to_null = sample_count; - else - samples_to_null = sample_count * 2; - - while (samples_to_null--) - *buffer++ = 0x55; - - wps->sample_index += sample_count; - return sample_count; - } - - if (flags & FALSE_STEREO) { - int32_t *dptr = buffer + sample_count * 2; - int32_t *sptr = buffer + sample_count; - int32_t c = sample_count; - - while (c--) { - *--dptr = *--sptr; - *--dptr = *sptr; - } - } - - wps->sample_index += sample_count; - - return sample_count; -} - -/*------------------------------------------------------------------------------------------------------------------------*/ - -// #define DSD_BYTE_READY(low,high) (((low) >> 24) == ((high) >> 24)) -// #define DSD_BYTE_READY(low,high) (!(((low) ^ (high)) >> 24)) -#define DSD_BYTE_READY(low,high) (!(((low) ^ (high)) & 0xff000000)) -#define MAX_HISTORY_BITS 5 - -static int init_dsd_block_fast (WavpackStream *wps, WavpackMetadata *wpmd) -{ - unsigned char history_bits, max_probability; - int total_summed_probabilities = 0, i; - - if (wps->dsd.byteptr == wps->dsd.endptr) - return FALSE; - - history_bits = *wps->dsd.byteptr++; - - if (wps->dsd.byteptr == wps->dsd.endptr || history_bits > MAX_HISTORY_BITS) - return FALSE; - - wps->dsd.history_bins = 1 << history_bits; - - wps->dsd.value_lookup = (unsigned char **)malloc (sizeof (*wps->dsd.value_lookup) * wps->dsd.history_bins); - memset (wps->dsd.value_lookup, 0, sizeof (*wps->dsd.value_lookup) * wps->dsd.history_bins); - wps->dsd.summed_probabilities = (int16_t (*)[256])malloc (sizeof (*wps->dsd.summed_probabilities) * wps->dsd.history_bins); - wps->dsd.probabilities = (unsigned char (*)[256])malloc (sizeof (*wps->dsd.probabilities) * wps->dsd.history_bins); - - max_probability = *wps->dsd.byteptr++; - - if (max_probability < 0xff) { - unsigned char *outptr = (unsigned char *) wps->dsd.probabilities; - unsigned char *outend = outptr + sizeof (*wps->dsd.probabilities) * wps->dsd.history_bins; - - while (outptr < outend && wps->dsd.byteptr < wps->dsd.endptr) { - int code = *wps->dsd.byteptr++; - - if (code > max_probability) { - int zcount = code - max_probability; - - while (outptr < outend && zcount--) - *outptr++ = 0; - } - else if (code) - *outptr++ = code; - else - break; - } - - if (outptr < outend || (wps->dsd.byteptr < wps->dsd.endptr && *wps->dsd.byteptr++)) - return FALSE; - } - else if (wps->dsd.endptr - wps->dsd.byteptr > (int) sizeof (*wps->dsd.probabilities) * wps->dsd.history_bins) { - memcpy (wps->dsd.probabilities, wps->dsd.byteptr, sizeof (*wps->dsd.probabilities) * wps->dsd.history_bins); - wps->dsd.byteptr += sizeof (*wps->dsd.probabilities) * wps->dsd.history_bins; - } - else - return FALSE; - - for (wps->dsd.p0 = 0; wps->dsd.p0 < wps->dsd.history_bins; ++wps->dsd.p0) { - int32_t sum_values; - unsigned char *vp; - - for (sum_values = i = 0; i < 256; ++i) - wps->dsd.summed_probabilities [wps->dsd.p0] [i] = sum_values += wps->dsd.probabilities [wps->dsd.p0] [i]; - - if (sum_values) { - total_summed_probabilities += sum_values; - vp = wps->dsd.value_lookup [wps->dsd.p0] = (unsigned char *)malloc (sum_values); - - for (i = 0; i < 256; i++) { - int c = wps->dsd.probabilities [wps->dsd.p0] [i]; - - while (c--) - *vp++ = i; - } - } - } - - if (wps->dsd.endptr - wps->dsd.byteptr < 4 || total_summed_probabilities > wps->dsd.history_bins * 1280) - return FALSE; - - for (i = 4; i--;) - wps->dsd.value = (wps->dsd.value << 8) | *wps->dsd.byteptr++; - - wps->dsd.p0 = wps->dsd.p1 = 0; - wps->dsd.low = 0; wps->dsd.high = 0xffffffff; - wps->dsd.ready = 1; - - return TRUE; -} - -static int decode_fast (WavpackStream *wps, int32_t *output, int sample_count) -{ - int total_samples = sample_count; - - if (!(wps->wphdr.flags & MONO_DATA)) - total_samples *= 2; - - while (total_samples--) { - int mult, index, code, i; - - if (!wps->dsd.summed_probabilities [wps->dsd.p0] [255]) - return 0; - - mult = (wps->dsd.high - wps->dsd.low) / wps->dsd.summed_probabilities [wps->dsd.p0] [255]; - - if (!mult) { - if (wps->dsd.endptr - wps->dsd.byteptr >= 4) - for (i = 4; i--;) - wps->dsd.value = (wps->dsd.value << 8) | *wps->dsd.byteptr++; - - wps->dsd.low = 0; - wps->dsd.high = 0xffffffff; - mult = wps->dsd.high / wps->dsd.summed_probabilities [wps->dsd.p0] [255]; - - if (!mult) - return 0; - } - - index = (wps->dsd.value - wps->dsd.low) / mult; - - if (index >= wps->dsd.summed_probabilities [wps->dsd.p0] [255]) - return 0; - - if ((*output++ = code = wps->dsd.value_lookup [wps->dsd.p0] [index])) - wps->dsd.low += wps->dsd.summed_probabilities [wps->dsd.p0] [code-1] * mult; - - wps->dsd.high = wps->dsd.low + wps->dsd.probabilities [wps->dsd.p0] [code] * mult - 1; - wps->crc += (wps->crc << 1) + code; - - if (wps->wphdr.flags & MONO_DATA) - wps->dsd.p0 = code & (wps->dsd.history_bins-1); - else { - wps->dsd.p0 = wps->dsd.p1; - wps->dsd.p1 = code & (wps->dsd.history_bins-1); - } - - while (DSD_BYTE_READY (wps->dsd.high, wps->dsd.low) && wps->dsd.byteptr < wps->dsd.endptr) { - wps->dsd.value = (wps->dsd.value << 8) | *wps->dsd.byteptr++; - wps->dsd.high = (wps->dsd.high << 8) | 0xff; - wps->dsd.low <<= 8; - } - } - - return sample_count; -} - -/*------------------------------------------------------------------------------------------------------------------------*/ - -#define PTABLE_BITS 8 -#define PTABLE_BINS (1<> 8; c--;) - value += (DOWN - value) >> DECAY; - - for (i = 0; i < PTABLE_BINS/2; ++i) { - table [i] = value; - table [PTABLE_BINS-1-i] = 0x100ffff - value; - - if (value > 0x010000) { - rate += (rate * rate_s + 128) >> 8; - - for (c = (rate + 64) >> 7; c--;) - value += (DOWN - value) >> DECAY; - } - } -} - -static int init_dsd_block_high (WavpackStream *wps, WavpackMetadata *wpmd) -{ - uint32_t flags = wps->wphdr.flags; - int channel, rate_i, rate_s, i; - - if (wps->dsd.endptr - wps->dsd.byteptr < ((flags & MONO_DATA) ? 13 : 20)) - return FALSE; - - rate_i = *wps->dsd.byteptr++; - rate_s = *wps->dsd.byteptr++; - - if (rate_s != RATE_S) - return FALSE; - - wps->dsd.ptable = (int32_t *)malloc (PTABLE_BINS * sizeof (*wps->dsd.ptable)); - init_ptable (wps->dsd.ptable, rate_i, rate_s); - - for (channel = 0; channel < ((flags & MONO_DATA) ? 1 : 2); ++channel) { - DSDfilters *sp = wps->dsd.filters + channel; - - sp->filter1 = *wps->dsd.byteptr++ << (PRECISION - 8); - sp->filter2 = *wps->dsd.byteptr++ << (PRECISION - 8); - sp->filter3 = *wps->dsd.byteptr++ << (PRECISION - 8); - sp->filter4 = *wps->dsd.byteptr++ << (PRECISION - 8); - sp->filter5 = *wps->dsd.byteptr++ << (PRECISION - 8); - sp->filter6 = 0; - sp->factor = *wps->dsd.byteptr++ & 0xff; - sp->factor |= (*wps->dsd.byteptr++ << 8) & 0xff00; - sp->factor = (sp->factor << 16) >> 16; - } - - wps->dsd.high = 0xffffffff; - wps->dsd.low = 0x0; - - for (i = 4; i--;) - wps->dsd.value = (wps->dsd.value << 8) | *wps->dsd.byteptr++; - - wps->dsd.ready = 1; - - return TRUE; -} - -static int decode_high (WavpackStream *wps, int32_t *output, int sample_count) -{ - int total_samples = sample_count, stereo = (wps->wphdr.flags & MONO_DATA) ? 0 : 1; - DSDfilters *sp = wps->dsd.filters; - - while (total_samples--) { - int bitcount = 8; - - sp [0].value = sp [0].filter1 - sp [0].filter5 + ((sp [0].filter6 * sp [0].factor) >> 2); - - if (stereo) - sp [1].value = sp [1].filter1 - sp [1].filter5 + ((sp [1].filter6 * sp [1].factor) >> 2); - - while (bitcount--) { - int32_t *pp = wps->dsd.ptable + ((sp [0].value >> (PRECISION - PRECISION_USE)) & PTABLE_MASK); - uint32_t split = wps->dsd.low + ((wps->dsd.high - wps->dsd.low) >> 8) * (*pp >> 16); - - if (wps->dsd.value <= split) { - wps->dsd.high = split; - *pp += (UP - *pp) >> DECAY; - sp [0].filter0 = -1; - } - else { - wps->dsd.low = split + 1; - *pp += (DOWN - *pp) >> DECAY; - sp [0].filter0 = 0; - } - - while (DSD_BYTE_READY (wps->dsd.high, wps->dsd.low) && wps->dsd.byteptr < wps->dsd.endptr) { - wps->dsd.value = (wps->dsd.value << 8) | *wps->dsd.byteptr++; - wps->dsd.high = (wps->dsd.high << 8) | 0xff; - wps->dsd.low <<= 8; - } - - sp [0].value += sp [0].filter6 << 3; - sp [0].byte = (sp [0].byte << 1) | (sp [0].filter0 & 1); - sp [0].factor += (((sp [0].value ^ sp [0].filter0) >> 31) | 1) & ((sp [0].value ^ (sp [0].value - (sp [0].filter6 << 4))) >> 31); - sp [0].filter1 += ((sp [0].filter0 & VALUE_ONE) - sp [0].filter1) >> 6; - sp [0].filter2 += ((sp [0].filter0 & VALUE_ONE) - sp [0].filter2) >> 4; - sp [0].filter3 += (sp [0].filter2 - sp [0].filter3) >> 4; - sp [0].filter4 += (sp [0].filter3 - sp [0].filter4) >> 4; - sp [0].value = (sp [0].filter4 - sp [0].filter5) >> 4; - sp [0].filter5 += sp [0].value; - sp [0].filter6 += (sp [0].value - sp [0].filter6) >> 3; - sp [0].value = sp [0].filter1 - sp [0].filter5 + ((sp [0].filter6 * sp [0].factor) >> 2); - - if (!stereo) - continue; - - pp = wps->dsd.ptable + ((sp [1].value >> (PRECISION - PRECISION_USE)) & PTABLE_MASK); - split = wps->dsd.low + ((wps->dsd.high - wps->dsd.low) >> 8) * (*pp >> 16); - - if (wps->dsd.value <= split) { - wps->dsd.high = split; - *pp += (UP - *pp) >> DECAY; - sp [1].filter0 = -1; - } - else { - wps->dsd.low = split + 1; - *pp += (DOWN - *pp) >> DECAY; - sp [1].filter0 = 0; - } - - while (DSD_BYTE_READY (wps->dsd.high, wps->dsd.low) && wps->dsd.byteptr < wps->dsd.endptr) { - wps->dsd.value = (wps->dsd.value << 8) | *wps->dsd.byteptr++; - wps->dsd.high = (wps->dsd.high << 8) | 0xff; - wps->dsd.low <<= 8; - } - - sp [1].value += sp [1].filter6 << 3; - sp [1].byte = (sp [1].byte << 1) | (sp [1].filter0 & 1); - sp [1].factor += (((sp [1].value ^ sp [1].filter0) >> 31) | 1) & ((sp [1].value ^ (sp [1].value - (sp [1].filter6 << 4))) >> 31); - sp [1].filter1 += ((sp [1].filter0 & VALUE_ONE) - sp [1].filter1) >> 6; - sp [1].filter2 += ((sp [1].filter0 & VALUE_ONE) - sp [1].filter2) >> 4; - sp [1].filter3 += (sp [1].filter2 - sp [1].filter3) >> 4; - sp [1].filter4 += (sp [1].filter3 - sp [1].filter4) >> 4; - sp [1].value = (sp [1].filter4 - sp [1].filter5) >> 4; - sp [1].filter5 += sp [1].value; - sp [1].filter6 += (sp [1].value - sp [1].filter6) >> 3; - sp [1].value = sp [1].filter1 - sp [1].filter5 + ((sp [1].filter6 * sp [1].factor) >> 2); - } - - wps->crc += (wps->crc << 1) + (*output++ = sp [0].byte & 0xff); - sp [0].factor -= (sp [0].factor + 512) >> 10; - - if (stereo) { - wps->crc += (wps->crc << 1) + (*output++ = wps->dsd.filters [1].byte & 0xff); - wps->dsd.filters [1].factor -= (wps->dsd.filters [1].factor + 512) >> 10; - } - } - - return sample_count; -} - -/*------------------------------------------------------------------------------------------------------------------------*/ - -#if 0 - -// 80 term DSD decimation filter -// < 1 dB down at 20 kHz -// > 108 dB stopband attenuation (fs/16) - -static const int32_t decm_filter [] = { - 4, 17, 56, 147, 336, 693, 1320, 2359, - 4003, 6502, 10170, 15392, 22623, 32389, 45275, 61920, - 82994, 109174, 141119, 179431, 224621, 277068, 336983, 404373, - 479004, 560384, 647741, 740025, 835917, 933849, 1032042, 1128551, - 1221329, 1308290, 1387386, 1456680, 1514425, 1559128, 1589610, 1605059, - 1605059, 1589610, 1559128, 1514425, 1456680, 1387386, 1308290, 1221329, - 1128551, 1032042, 933849, 835917, 740025, 647741, 560384, 479004, - 404373, 336983, 277068, 224621, 179431, 141119, 109174, 82994, - 61920, 45275, 32389, 22623, 15392, 10170, 6502, 4003, - 2359, 1320, 693, 336, 147, 56, 17, 4, -}; - -#define NUM_FILTER_TERMS 80 - -#else - -// 56 term decimation filter -// < 0.5 dB down at 20 kHz -// > 100 dB stopband attenuation (fs/12) - -static const int32_t decm_filter [] = { - 4, 17, 56, 147, 336, 692, 1315, 2337, - 3926, 6281, 9631, 14216, 20275, 28021, 37619, 49155, - 62616, 77870, 94649, 112551, 131049, 149507, 167220, 183448, - 197472, 208636, 216402, 220385, 220385, 216402, 208636, 197472, - 183448, 167220, 149507, 131049, 112551, 94649, 77870, 62616, - 49155, 37619, 28021, 20275, 14216, 9631, 6281, 3926, - 2337, 1315, 692, 336, 147, 56, 17, 4, -}; - -#define NUM_FILTER_TERMS 56 - -#endif - -#define HISTORY_BYTES ((NUM_FILTER_TERMS+7)/8) - -typedef struct { - unsigned char delay [HISTORY_BYTES]; -} DecimationChannel; - -typedef struct { - int32_t conv_tables [HISTORY_BYTES] [256]; - DecimationChannel *chans; - int num_channels; -} DecimationContext; - -void *decimate_dsd_init (int num_channels) -{ - DecimationContext *context = (DecimationContext *)malloc (sizeof (DecimationContext)); - double filter_sum = 0, filter_scale; - int skipped_terms, i, j; - - if (!context) - return context; - - memset (context, 0, sizeof (*context)); - context->num_channels = num_channels; - context->chans = (DecimationChannel *)malloc (num_channels * sizeof (DecimationChannel)); - - if (!context->chans) { - free (context); - return NULL; - } - - for (i = 0; i < NUM_FILTER_TERMS; ++i) - filter_sum += decm_filter [i]; - - filter_scale = ((1 << 23) - 1) / filter_sum * 16.0; - // fprintf (stderr, "convolution, %d terms, %f sum, %f scale\n", NUM_FILTER_TERMS, filter_sum, filter_scale); - - for (skipped_terms = i = 0; i < NUM_FILTER_TERMS; ++i) { - int scaled_term = (int) floor (decm_filter [i] * filter_scale + 0.5); - - if (scaled_term) { - for (j = 0; j < 256; ++j) - if (j & (0x80 >> (i & 0x7))) - context->conv_tables [i >> 3] [j] += scaled_term; - else - context->conv_tables [i >> 3] [j] -= scaled_term; - } - else - skipped_terms++; - } - - // fprintf (stderr, "%d terms skipped\n", skipped_terms); - - decimate_dsd_reset (context); - - return context; -} - -void decimate_dsd_reset (void *decimate_context) -{ - DecimationContext *context = (DecimationContext *) decimate_context; - int chan = 0, i; - - if (!context) - return; - - for (chan = 0; chan < context->num_channels; ++chan) - for (i = 0; i < HISTORY_BYTES; ++i) - context->chans [chan].delay [i] = 0x55; -} - -void decimate_dsd_run (void *decimate_context, int32_t *samples, int num_samples) -{ - DecimationContext *context = (DecimationContext *) decimate_context; - int chan = 0; - - if (!context) - return; - - while (num_samples) { - DecimationChannel *sp = context->chans + chan; - int sum = 0; - -#if (HISTORY_BYTES == 10) - sum += context->conv_tables [0] [sp->delay [0] = sp->delay [1]]; - sum += context->conv_tables [1] [sp->delay [1] = sp->delay [2]]; - sum += context->conv_tables [2] [sp->delay [2] = sp->delay [3]]; - sum += context->conv_tables [3] [sp->delay [3] = sp->delay [4]]; - sum += context->conv_tables [4] [sp->delay [4] = sp->delay [5]]; - sum += context->conv_tables [5] [sp->delay [5] = sp->delay [6]]; - sum += context->conv_tables [6] [sp->delay [6] = sp->delay [7]]; - sum += context->conv_tables [7] [sp->delay [7] = sp->delay [8]]; - sum += context->conv_tables [8] [sp->delay [8] = sp->delay [9]]; - sum += context->conv_tables [9] [sp->delay [9] = *samples]; -#elif (HISTORY_BYTES == 7) - sum += context->conv_tables [0] [sp->delay [0] = sp->delay [1]]; - sum += context->conv_tables [1] [sp->delay [1] = sp->delay [2]]; - sum += context->conv_tables [2] [sp->delay [2] = sp->delay [3]]; - sum += context->conv_tables [3] [sp->delay [3] = sp->delay [4]]; - sum += context->conv_tables [4] [sp->delay [4] = sp->delay [5]]; - sum += context->conv_tables [5] [sp->delay [5] = sp->delay [6]]; - sum += context->conv_tables [6] [sp->delay [6] = *samples]; -#else - int i; - - for (i = 0; i < HISTORY_BYTES-1; ++i) - sum += context->conv_tables [i] [sp->delay [i] = sp->delay [i+1]]; - - sum += context->conv_tables [i] [sp->delay [i] = *samples]; -#endif - - *samples++ = sum >> 4; - - if (++chan == context->num_channels) { - num_samples--; - chan = 0; - } - } -} - -void decimate_dsd_destroy (void *decimate_context) -{ - DecimationContext *context = (DecimationContext *) decimate_context; - - if (!context) - return; - - if (context->chans) - free (context->chans); - - free (context); -} - -#endif // ENABLE_DSD diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_floats.c b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_floats.c deleted file mode 100644 index cc045ddc..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_floats.c +++ /dev/null @@ -1,134 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2013 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// unpack_floats.c - -// This module deals with the restoration of floating-point data. Note that no -// floating point math is involved here...the values are only processed with -// the macros that directly access the mantissa, exponent, and sign fields. -// That's why we use the f32 type instead of the built-in float type. - -#include - -#include "wavpack_local.h" - -static void float_values_nowvx (WavpackStream *wps, int32_t *values, int32_t num_values); - -void float_values (WavpackStream *wps, int32_t *values, int32_t num_values) -{ - uint32_t crc = wps->crc_x; - - if (!bs_is_open (&wps->wvxbits)) { - float_values_nowvx (wps, values, num_values); - return; - } - - while (num_values--) { - int shift_count = 0, exp = wps->float_max_exp; - f32 outval = 0; - uint32_t temp; - - if (*values == 0) { - if (wps->float_flags & FLOAT_ZEROS_SENT) { - if (getbit (&wps->wvxbits)) { - getbits (&temp, 23, &wps->wvxbits); - set_mantissa (outval, temp); - - if (exp >= 25) { - getbits (&temp, 8, &wps->wvxbits); - set_exponent (outval, temp); - } - - set_sign (outval, getbit (&wps->wvxbits)); - } - else if (wps->float_flags & FLOAT_NEG_ZEROS) - set_sign (outval, getbit (&wps->wvxbits)); - } - } - else { - *values <<= wps->float_shift; - - if (*values < 0) { - *values = -*values; - set_sign (outval, 1); - } - - if (*values == 0x1000000) { - if (getbit (&wps->wvxbits)) { - getbits (&temp, 23, &wps->wvxbits); - set_mantissa (outval, temp); - } - - set_exponent (outval, 255); - } - else { - if (exp) - while (!(*values & 0x800000) && --exp) { - shift_count++; - *values <<= 1; - } - - if (shift_count) { - if ((wps->float_flags & FLOAT_SHIFT_ONES) || - ((wps->float_flags & FLOAT_SHIFT_SAME) && getbit (&wps->wvxbits))) - *values |= ((1 << shift_count) - 1); - else if (wps->float_flags & FLOAT_SHIFT_SENT) { - getbits (&temp, shift_count, &wps->wvxbits); - *values |= temp & ((1 << shift_count) - 1); - } - } - - set_mantissa (outval, *values); - set_exponent (outval, exp); - } - } - - crc = crc * 27 + get_mantissa (outval) * 9 + get_exponent (outval) * 3 + get_sign (outval); - * (f32 *) values++ = outval; - } - - wps->crc_x = crc; -} - -static void float_values_nowvx (WavpackStream *wps, int32_t *values, int32_t num_values) -{ - while (num_values--) { - int shift_count = 0, exp = wps->float_max_exp; - f32 outval = 0; - - if (*values) { - *values <<= wps->float_shift; - - if (*values < 0) { - *values = -*values; - set_sign (outval, 1); - } - - if (*values >= 0x1000000) { - while (*values & 0xf000000) { - *values >>= 1; - ++exp; - } - } - else if (exp) { - while (!(*values & 0x800000) && --exp) { - shift_count++; - *values <<= 1; - } - - if (shift_count && (wps->float_flags & FLOAT_SHIFT_ONES)) - *values |= ((1 << shift_count) - 1); - } - - set_mantissa (outval, *values); - set_exponent (outval, exp); - } - - * (f32 *) values++ = outval; - } -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_seek.c b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_seek.c deleted file mode 100644 index f3ab081e..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_seek.c +++ /dev/null @@ -1,375 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2013 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// unpack_seek.c - -// This module provides the high-level API for unpacking audio data from -// a specific sample index (i.e., seeking). - -#ifndef NO_SEEKING - -#include -#include - -#include "wavpack_local.h" - -///////////////////////////// executable code //////////////////////////////// - -static int64_t find_sample (WavpackContext *wpc, void *infile, int64_t header_pos, int64_t sample); - -// Seek to the specifed sample index, returning TRUE on success. Note that -// files generated with version 4.0 or newer will seek almost immediately. -// Older files can take quite long if required to seek through unplayed -// portions of the file, but will create a seek map so that reverse seeks -// (or forward seeks to already scanned areas) will be very fast. After a -// FALSE return the file should not be accessed again (other than to close -// it); this is a fatal error. - -int WavpackSeekSample (WavpackContext *wpc, uint32_t sample) -{ - return WavpackSeekSample64 (wpc, sample); -} - -int WavpackSeekSample64 (WavpackContext *wpc, int64_t sample) -{ - WavpackStream *wps = wpc->streams ? wpc->streams [wpc->current_stream = 0] : NULL; - uint32_t bcount, samples_to_skip, samples_to_decode = 0; - int32_t *buffer; - - if (wpc->total_samples == -1 || sample >= wpc->total_samples || - !wpc->reader->can_seek (wpc->wv_in) || (wpc->open_flags & OPEN_STREAMING) || - (wpc->wvc_flag && !wpc->reader->can_seek (wpc->wvc_in))) - return FALSE; - -#ifdef ENABLE_LEGACY - if (wpc->stream3) - return seek_sample3 (wpc, (uint32_t) sample); -#endif - -#ifdef ENABLE_DSD - if (wpc->decimation_context) { // the decimation code needs some context to be sample accurate - if (sample < 16) { - samples_to_decode = (uint32_t) sample; - sample = 0; - } - else { - samples_to_decode = 16; - sample -= 16; - } - } -#endif - - if (!wps->wphdr.block_samples || !(wps->wphdr.flags & INITIAL_BLOCK) || sample < GET_BLOCK_INDEX (wps->wphdr) || - sample >= GET_BLOCK_INDEX (wps->wphdr) + wps->wphdr.block_samples) { - - free_streams (wpc); - wpc->filepos = find_sample (wpc, wpc->wv_in, wpc->filepos, sample); - - if (wpc->filepos == -1) - return FALSE; - - if (wpc->wvc_flag) { - wpc->file2pos = find_sample (wpc, wpc->wvc_in, 0, sample); - - if (wpc->file2pos == -1) - return FALSE; - } - } - - if (!wps->blockbuff) { - wpc->reader->set_pos_abs (wpc->wv_in, wpc->filepos); - wpc->reader->read_bytes (wpc->wv_in, &wps->wphdr, sizeof (WavpackHeader)); - WavpackLittleEndianToNative (&wps->wphdr, WavpackHeaderFormat); - wps->blockbuff = (unsigned char *)malloc (wps->wphdr.ckSize + 8); - memcpy (wps->blockbuff, &wps->wphdr, sizeof (WavpackHeader)); - - if (wpc->reader->read_bytes (wpc->wv_in, wps->blockbuff + sizeof (WavpackHeader), wps->wphdr.ckSize - 24) != - wps->wphdr.ckSize - 24) { - free_streams (wpc); - return FALSE; - } - - // render corrupt blocks harmless - if (!WavpackVerifySingleBlock (wps->blockbuff, !(wpc->open_flags & OPEN_NO_CHECKSUM))) { - wps->wphdr.ckSize = sizeof (WavpackHeader) - 8; - wps->wphdr.block_samples = 0; - memcpy (wps->blockbuff, &wps->wphdr, 32); - } - - SET_BLOCK_INDEX (wps->wphdr, GET_BLOCK_INDEX (wps->wphdr) - wpc->initial_index); - memcpy (wps->blockbuff, &wps->wphdr, sizeof (WavpackHeader)); - wps->init_done = FALSE; - - if (wpc->wvc_flag) { - wpc->reader->set_pos_abs (wpc->wvc_in, wpc->file2pos); - wpc->reader->read_bytes (wpc->wvc_in, &wps->wphdr, sizeof (WavpackHeader)); - WavpackLittleEndianToNative (&wps->wphdr, WavpackHeaderFormat); - wps->block2buff = (unsigned char *)malloc (wps->wphdr.ckSize + 8); - memcpy (wps->block2buff, &wps->wphdr, sizeof (WavpackHeader)); - - if (wpc->reader->read_bytes (wpc->wvc_in, wps->block2buff + sizeof (WavpackHeader), wps->wphdr.ckSize - 24) != - wps->wphdr.ckSize - 24) { - free_streams (wpc); - return FALSE; - } - - // render corrupt blocks harmless - if (!WavpackVerifySingleBlock (wps->block2buff, !(wpc->open_flags & OPEN_NO_CHECKSUM))) { - wps->wphdr.ckSize = sizeof (WavpackHeader) - 8; - wps->wphdr.block_samples = 0; - memcpy (wps->block2buff, &wps->wphdr, 32); - } - - SET_BLOCK_INDEX (wps->wphdr, GET_BLOCK_INDEX (wps->wphdr) - wpc->initial_index); - memcpy (wps->block2buff, &wps->wphdr, sizeof (WavpackHeader)); - } - - if (!wps->init_done && !unpack_init (wpc)) { - free_streams (wpc); - return FALSE; - } - - wps->init_done = TRUE; - } - - while (!wpc->reduced_channels && !(wps->wphdr.flags & FINAL_BLOCK)) { - if (++wpc->current_stream == wpc->num_streams) { - - if (wpc->num_streams == wpc->max_streams) { - free_streams (wpc); - return FALSE; - } - - wpc->streams = (WavpackStream **)realloc (wpc->streams, (wpc->num_streams + 1) * sizeof (wpc->streams [0])); - wps = wpc->streams [wpc->num_streams++] = (WavpackStream *)malloc (sizeof (WavpackStream)); - CLEAR (*wps); - bcount = read_next_header (wpc->reader, wpc->wv_in, &wps->wphdr); - - if (bcount == (uint32_t) -1) { - free_streams (wpc); - return FALSE; - } - - wps->blockbuff = (unsigned char *)malloc (wps->wphdr.ckSize + 8); - memcpy (wps->blockbuff, &wps->wphdr, 32); - - if (wpc->reader->read_bytes (wpc->wv_in, wps->blockbuff + 32, wps->wphdr.ckSize - 24) != - wps->wphdr.ckSize - 24) { - free_streams (wpc); - return FALSE; - } - - // render corrupt blocks harmless - if (!WavpackVerifySingleBlock (wps->blockbuff, !(wpc->open_flags & OPEN_NO_CHECKSUM))) { - wps->wphdr.ckSize = sizeof (WavpackHeader) - 8; - wps->wphdr.block_samples = 0; - memcpy (wps->blockbuff, &wps->wphdr, 32); - } - - wps->init_done = FALSE; - - if (wpc->wvc_flag && !read_wvc_block (wpc)) { - free_streams (wpc); - return FALSE; - } - - if (!wps->init_done && !unpack_init (wpc)) { - free_streams (wpc); - return FALSE; - } - - wps->init_done = TRUE; - } - else - wps = wpc->streams [wpc->current_stream]; - } - - if (sample < wps->sample_index) { - for (wpc->current_stream = 0; wpc->current_stream < wpc->num_streams; wpc->current_stream++) - if (!unpack_init (wpc)) - return FALSE; - else - wpc->streams [wpc->current_stream]->init_done = TRUE; - } - - samples_to_skip = (uint32_t) (sample - wps->sample_index); - - if (samples_to_skip > 131072) { - free_streams (wpc); - return FALSE; - } - - if (samples_to_skip) { - buffer = (int32_t *)malloc (samples_to_skip * 8); - - for (wpc->current_stream = 0; wpc->current_stream < wpc->num_streams; wpc->current_stream++) -#ifdef ENABLE_DSD - if (wpc->streams [wpc->current_stream]->wphdr.flags & DSD_FLAG) - unpack_dsd_samples (wpc, buffer, samples_to_skip); - else -#endif - unpack_samples (wpc, buffer, samples_to_skip); - - free (buffer); - } - - wpc->current_stream = 0; - -#ifdef ENABLE_DSD - if (wpc->decimation_context) - decimate_dsd_reset (wpc->decimation_context); - - if (samples_to_decode) { - buffer = (int32_t *)malloc (samples_to_decode * wpc->config.num_channels * 4); - - if (buffer) { - WavpackUnpackSamples (wpc, buffer, samples_to_decode); - free (buffer); - } - } -#endif - - return TRUE; -} - -// Find a valid WavPack header, searching either from the current file position -// (or from the specified position if not -1) and store it (endian corrected) -// at the specified pointer. The return value is the exact file position of the -// header, although we may have actually read past it. Because this function -// is used for seeking to a specific audio sample, it only considers blocks -// that contain audio samples for the initial stream to be valid. - -#define BUFSIZE 4096 - -static int64_t find_header (WavpackStreamReader64 *reader, void *id, int64_t filepos, WavpackHeader *wphdr) -{ - unsigned char *buffer = (unsigned char *)malloc (BUFSIZE), *sp = buffer, *ep = buffer; - - if (filepos != (uint32_t) -1 && reader->set_pos_abs (id, filepos)) { - free (buffer); - return -1; - } - - while (1) { - int bleft; - - if (sp < ep) { - bleft = (int)(ep - sp); - memcpy (buffer, sp, bleft); - ep -= (sp - buffer); - sp = buffer; - } - else { - if (sp > ep) - if (reader->set_pos_rel (id, (int32_t)(sp - ep), SEEK_CUR)) { - free (buffer); - return -1; - } - - sp = ep = buffer; - bleft = 0; - } - - ep += reader->read_bytes (id, ep, BUFSIZE - bleft); - - if (ep - sp < 32) { - free (buffer); - return -1; - } - - while (sp + 32 <= ep) - if (*sp++ == 'w' && *sp == 'v' && *++sp == 'p' && *++sp == 'k' && - !(*++sp & 1) && sp [2] < 16 && !sp [3] && (sp [2] || sp [1] || *sp >= 24) && sp [5] == 4 && - sp [4] >= (MIN_STREAM_VERS & 0xff) && sp [4] <= (MAX_STREAM_VERS & 0xff) && sp [18] < 3 && !sp [19]) { - memcpy (wphdr, sp - 4, sizeof (*wphdr)); - WavpackLittleEndianToNative (wphdr, WavpackHeaderFormat); - - if (wphdr->block_samples && (wphdr->flags & INITIAL_BLOCK)) { - free (buffer); - return reader->get_pos (id) - (ep - sp + 4); - } - - if (wphdr->ckSize > 1024) - sp += wphdr->ckSize - 1024; - } - } -} - -// Find the WavPack block that contains the specified sample. If "header_pos" -// is zero, then no information is assumed except the total number of samples -// in the file and its size in bytes. If "header_pos" is non-zero then we -// assume that it is the file position of the valid header image contained in -// the first stream and we can limit our search to either the portion above -// or below that point. If a .wvc file is being used, then this must be called -// for that file also. - -static int64_t find_sample (WavpackContext *wpc, void *infile, int64_t header_pos, int64_t sample) -{ - WavpackStream *wps = wpc->streams [wpc->current_stream]; - int64_t file_pos1 = 0, file_pos2 = wpc->reader->get_length (infile); - int64_t sample_pos1 = 0, sample_pos2 = wpc->total_samples; - double ratio = 0.96; - int file_skip = 0; - - if (sample >= wpc->total_samples) - return -1; - - if (header_pos && wps->wphdr.block_samples) { - if (GET_BLOCK_INDEX (wps->wphdr) > sample) { - sample_pos2 = GET_BLOCK_INDEX (wps->wphdr); - file_pos2 = header_pos; - } - else if (GET_BLOCK_INDEX (wps->wphdr) + wps->wphdr.block_samples <= sample) { - sample_pos1 = GET_BLOCK_INDEX (wps->wphdr); - file_pos1 = header_pos; - } - else - return header_pos; - } - - while (1) { - double bytes_per_sample; - int64_t seek_pos; - - bytes_per_sample = (double) file_pos2 - file_pos1; - bytes_per_sample /= sample_pos2 - sample_pos1; - seek_pos = file_pos1 + (file_skip ? 32 : 0); - seek_pos += (int64_t)(bytes_per_sample * (sample - sample_pos1) * ratio); - seek_pos = find_header (wpc->reader, infile, seek_pos, &wps->wphdr); - - if (seek_pos != (int64_t) -1) - SET_BLOCK_INDEX (wps->wphdr, GET_BLOCK_INDEX (wps->wphdr) - wpc->initial_index); - - if (seek_pos == (int64_t) -1 || seek_pos >= file_pos2) { - if (ratio > 0.0) { - if ((ratio -= 0.24) < 0.0) - ratio = 0.0; - } - else - return -1; - } - else if (GET_BLOCK_INDEX (wps->wphdr) > sample) { - sample_pos2 = GET_BLOCK_INDEX (wps->wphdr); - file_pos2 = seek_pos; - } - else if (GET_BLOCK_INDEX (wps->wphdr) + wps->wphdr.block_samples <= sample) { - - if (seek_pos == file_pos1) - file_skip = 1; - else { - sample_pos1 = GET_BLOCK_INDEX (wps->wphdr); - file_pos1 = seek_pos; - } - } - else - return seek_pos; - } -} - -#endif - diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_utils.c b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_utils.c deleted file mode 100644 index ce7d7da9..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_utils.c +++ /dev/null @@ -1,411 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2013 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// unpack_utils.c - -// This module provides the high-level API for unpacking audio data from -// WavPack files. It manages the buffers used to interleave the data passed -// back to the application from the individual streams. The actual audio -// stream decompression is handled in the unpack.c module. - -#include -#include - -#include "wavpack_local.h" - -///////////////////////////// executable code //////////////////////////////// - -// Unpack the specified number of samples from the current file position. -// Note that "samples" here refers to "complete" samples, which would be -// 2 longs for stereo files or even more for multichannel files, so the -// required memory at "buffer" is 4 * samples * num_channels bytes. The -// audio data is returned right-justified in 32-bit longs in the endian -// mode native to the executing processor. So, if the original data was -// 16-bit, then the values returned would be +/-32k. Floating point data -// can also be returned if the source was floating point data (and this -// can be optionally normalized to +/-1.0 by using the appropriate flag -// in the call to WavpackOpenFileInput ()). The actual number of samples -// unpacked is returned, which should be equal to the number requested unless -// the end of fle is encountered or an error occurs. After all samples have -// been unpacked then 0 will be returned. - -uint32_t WavpackUnpackSamples (WavpackContext *wpc, int32_t *buffer, uint32_t samples) -{ - WavpackStream *wps = wpc->streams ? wpc->streams [wpc->current_stream = 0] : NULL; - int num_channels = wpc->config.num_channels, file_done = FALSE; - uint32_t bcount, samples_unpacked = 0, samples_to_unpack; - int32_t *bptr = buffer; - -#ifdef ENABLE_LEGACY - if (wpc->stream3) - return unpack_samples3 (wpc, buffer, samples); -#endif - - while (samples) { - - // if the current block has no audio, or it's not the first block of a multichannel - // sequence, or the sample we're on is past the last sample in this block...we need - // to free up the streams and read the next block - - if (!wps->wphdr.block_samples || !(wps->wphdr.flags & INITIAL_BLOCK) || - wps->sample_index >= GET_BLOCK_INDEX (wps->wphdr) + wps->wphdr.block_samples) { - - int64_t nexthdrpos; - - if (wpc->wrapper_bytes >= MAX_WRAPPER_BYTES) - break; - - free_streams (wpc); - nexthdrpos = wpc->reader->get_pos (wpc->wv_in); - bcount = read_next_header (wpc->reader, wpc->wv_in, &wps->wphdr); - - if (bcount == (uint32_t) -1) - break; - - wpc->filepos = nexthdrpos + bcount; - - // allocate the memory for the entire raw block and read it in - - wps->blockbuff = (unsigned char *)malloc (wps->wphdr.ckSize + 8); - - if (!wps->blockbuff) - break; - - memcpy (wps->blockbuff, &wps->wphdr, 32); - - if (wpc->reader->read_bytes (wpc->wv_in, wps->blockbuff + 32, wps->wphdr.ckSize - 24) != - wps->wphdr.ckSize - 24) { - strcpy (wpc->error_message, "can't read all of last block!"); - wps->wphdr.block_samples = 0; - wps->wphdr.ckSize = 24; - break; - } - - // render corrupt blocks harmless - if (!WavpackVerifySingleBlock (wps->blockbuff, !(wpc->open_flags & OPEN_NO_CHECKSUM))) { - wps->wphdr.ckSize = sizeof (WavpackHeader) - 8; - wps->wphdr.block_samples = 0; - memcpy (wps->blockbuff, &wps->wphdr, 32); - } - - // potentially adjusting block_index must be done AFTER verifying block - - if (wpc->open_flags & OPEN_STREAMING) - SET_BLOCK_INDEX (wps->wphdr, wps->sample_index = 0); - else - SET_BLOCK_INDEX (wps->wphdr, GET_BLOCK_INDEX (wps->wphdr) - wpc->initial_index); - - memcpy (wps->blockbuff, &wps->wphdr, 32); - wps->init_done = FALSE; // we have not yet called unpack_init() for this block - - // if this block has audio, but not the sample index we were expecting, flag an error - - if (wps->wphdr.block_samples && wps->sample_index != GET_BLOCK_INDEX (wps->wphdr)) - wpc->crc_errors++; - - // if this block has audio, and we're in hybrid lossless mode, read the matching wvc block - - if (wps->wphdr.block_samples && wpc->wvc_flag) - read_wvc_block (wpc); - - // if the block does NOT have any audio, call unpack_init() to process non-audio stuff - - if (!wps->wphdr.block_samples) { - if (!wps->init_done && !unpack_init (wpc)) - wpc->crc_errors++; - - wps->init_done = TRUE; - } - } - - // if the current block has no audio, or it's not the first block of a multichannel - // sequence, or the sample we're on is past the last sample in this block...we need - // to loop back and read the next block - - if (!wps->wphdr.block_samples || !(wps->wphdr.flags & INITIAL_BLOCK) || - wps->sample_index >= GET_BLOCK_INDEX (wps->wphdr) + wps->wphdr.block_samples) - continue; - - // There seems to be some missing data, like a block was corrupted or something. - // If it's not too much data, just fill in with silence here and loop back. - - if (wps->sample_index < GET_BLOCK_INDEX (wps->wphdr)) { - int32_t zvalue = (wps->wphdr.flags & DSD_FLAG) ? 0x55 : 0; - - samples_to_unpack = (uint32_t) (GET_BLOCK_INDEX (wps->wphdr) - wps->sample_index); - - if (!samples_to_unpack || samples_to_unpack > 262144) { - strcpy (wpc->error_message, "discontinuity found, aborting file!"); - wps->wphdr.block_samples = 0; - wps->wphdr.ckSize = 24; - break; - } - - if (samples_to_unpack > samples) - samples_to_unpack = samples; - - wps->sample_index += samples_to_unpack; - samples_unpacked += samples_to_unpack; - samples -= samples_to_unpack; - - samples_to_unpack *= (wpc->reduced_channels ? wpc->reduced_channels : num_channels); - - while (samples_to_unpack--) - *bptr++ = zvalue; - - continue; - } - - // calculate number of samples to process from this block, then initialize the decoder for - // this block if we haven't already - - samples_to_unpack = (uint32_t) (GET_BLOCK_INDEX (wps->wphdr) + wps->wphdr.block_samples - wps->sample_index); - - if (samples_to_unpack > samples) - samples_to_unpack = samples; - - if (!wps->init_done && !unpack_init (wpc)) - wpc->crc_errors++; - - wps->init_done = TRUE; - - // if this block is not the final block of a multichannel sequence (and we're not truncating - // to stereo), then enter this conditional block...otherwise we just unpack the samples directly - - if (!wpc->reduced_channels && !(wps->wphdr.flags & FINAL_BLOCK)) { - int32_t *temp_buffer = (int32_t *)malloc (samples_to_unpack * 8), *src, *dst; - int offset = 0; // offset to next channel in sequence (0 to num_channels - 1) - uint32_t samcnt; - - // since we are getting samples from multiple bocks in a multichannel sequence, we must - // allocate a temporary buffer to unpack to so that we can re-interleave the samples - - if (!temp_buffer) - break; - - // loop through all the streams... - - while (1) { - - // if the stream has not been allocated and corresponding block read, do that here... - - if (wpc->current_stream == wpc->num_streams) { - wpc->streams = (WavpackStream **)realloc (wpc->streams, (wpc->num_streams + 1) * sizeof (wpc->streams [0])); - - if (!wpc->streams) - break; - - wps = wpc->streams [wpc->num_streams++] = (WavpackStream *)malloc (sizeof (WavpackStream)); - - if (!wps) - break; - - CLEAR (*wps); - bcount = read_next_header (wpc->reader, wpc->wv_in, &wps->wphdr); - - if (bcount == (uint32_t) -1) { - wpc->streams [0]->wphdr.block_samples = 0; - wpc->streams [0]->wphdr.ckSize = 24; - file_done = TRUE; - break; - } - - wps->blockbuff = (unsigned char *)malloc (wps->wphdr.ckSize + 8); - - if (!wps->blockbuff) - break; - - memcpy (wps->blockbuff, &wps->wphdr, 32); - - if (wpc->reader->read_bytes (wpc->wv_in, wps->blockbuff + 32, wps->wphdr.ckSize - 24) != - wps->wphdr.ckSize - 24) { - wpc->streams [0]->wphdr.block_samples = 0; - wpc->streams [0]->wphdr.ckSize = 24; - file_done = TRUE; - break; - } - - // render corrupt blocks harmless - if (!WavpackVerifySingleBlock (wps->blockbuff, !(wpc->open_flags & OPEN_NO_CHECKSUM))) { - wps->wphdr.ckSize = sizeof (WavpackHeader) - 8; - wps->wphdr.block_samples = 0; - memcpy (wps->blockbuff, &wps->wphdr, 32); - } - - // potentially adjusting block_index must be done AFTER verifying block - - if (wpc->open_flags & OPEN_STREAMING) - SET_BLOCK_INDEX (wps->wphdr, wps->sample_index = 0); - else - SET_BLOCK_INDEX (wps->wphdr, GET_BLOCK_INDEX (wps->wphdr) - wpc->initial_index); - - memcpy (wps->blockbuff, &wps->wphdr, 32); - - // if this block has audio, and we're in hybrid lossless mode, read the matching wvc block - - if (wpc->wvc_flag) - read_wvc_block (wpc); - - // initialize the unpacker for this block - - if (!unpack_init (wpc)) - wpc->crc_errors++; - - wps->init_done = TRUE; - } - else - wps = wpc->streams [wpc->current_stream]; - - // unpack the correct number of samples (either mono or stereo) into the temp buffer - -#ifdef ENABLE_DSD - if (wps->wphdr.flags & DSD_FLAG) - unpack_dsd_samples (wpc, src = temp_buffer, samples_to_unpack); - else -#endif - unpack_samples (wpc, src = temp_buffer, samples_to_unpack); - - samcnt = samples_to_unpack; - dst = bptr + offset; - - // if the block is mono, copy the samples from the single channel into the destination - // using num_channels as the stride - - if (wps->wphdr.flags & MONO_FLAG) { - while (samcnt--) { - dst [0] = *src++; - dst += num_channels; - } - - offset++; - } - - // if the block is stereo, and we don't have room for two more channels, just copy one - // and flag an error - - else if (offset == num_channels - 1) { - while (samcnt--) { - dst [0] = src [0]; - dst += num_channels; - src += 2; - } - - wpc->crc_errors++; - offset++; - } - - // otherwise copy the stereo samples into the destination - - else { - while (samcnt--) { - dst [0] = *src++; - dst [1] = *src++; - dst += num_channels; - } - - offset += 2; - } - - // check several clues that we're done with this set of blocks and exit if we are; else do next stream - - if ((wps->wphdr.flags & FINAL_BLOCK) || wpc->current_stream == wpc->max_streams - 1 || offset == num_channels) - break; - else - wpc->current_stream++; - } - - // if we didn't get all the channels we expected, mute the buffer and flag an error - - if (offset != num_channels) { - if (wps->wphdr.flags & DSD_FLAG) { - int samples_to_zero = samples_to_unpack * num_channels; - int32_t *zptr = bptr; - - while (samples_to_zero--) - *zptr++ = 0x55; - } - else - memset (bptr, 0, samples_to_unpack * num_channels * 4); - - wpc->crc_errors++; - } - - // go back to the first stream (we're going to leave them all loaded for now because they might have more samples) - // and free the temp buffer - - wps = wpc->streams [wpc->current_stream = 0]; - free (temp_buffer); - } - // catch the error situation where we have only one channel but run into a stereo block - // (this avoids overwriting the caller's buffer) - else if (!(wps->wphdr.flags & MONO_FLAG) && (num_channels == 1 || wpc->reduced_channels == 1)) { - memset (bptr, 0, samples_to_unpack * sizeof (*bptr)); - wps->sample_index += samples_to_unpack; - wpc->crc_errors++; - } -#ifdef ENABLE_DSD - else if (wps->wphdr.flags & DSD_FLAG) - unpack_dsd_samples (wpc, bptr, samples_to_unpack); -#endif - else - unpack_samples (wpc, bptr, samples_to_unpack); - - if (file_done) { - strcpy (wpc->error_message, "can't read all of last block!"); - break; - } - - if (wpc->reduced_channels) - bptr += samples_to_unpack * wpc->reduced_channels; - else - bptr += samples_to_unpack * num_channels; - - samples_unpacked += samples_to_unpack; - samples -= samples_to_unpack; - - // if we just finished a block, check for a calculated crc error - // (and back up the streams a little if possible in case we passed a header) - - if (wps->sample_index == GET_BLOCK_INDEX (wps->wphdr) + wps->wphdr.block_samples) { - if (check_crc_error (wpc)) { - int32_t *zptr = bptr, zvalue = (wps->wphdr.flags & DSD_FLAG) ? 0x55 : 0; - uint32_t samples_to_zero = wps->wphdr.block_samples; - - if (samples_to_zero > samples_to_unpack) - samples_to_zero = samples_to_unpack; - - samples_to_zero *= (wpc->reduced_channels ? wpc->reduced_channels : num_channels); - - while (samples_to_zero--) - *--zptr = zvalue; - - if (wps->blockbuff && wpc->reader->can_seek (wpc->wv_in)) { - int32_t rseek = ((WavpackHeader *) wps->blockbuff)->ckSize / 3; - wpc->reader->set_pos_rel (wpc->wv_in, (rseek > 16384) ? -16384 : -rseek, SEEK_CUR); - } - - if (wpc->wvc_flag && wps->block2buff && wpc->reader->can_seek (wpc->wvc_in)) { - int32_t rseek = ((WavpackHeader *) wps->block2buff)->ckSize / 3; - wpc->reader->set_pos_rel (wpc->wvc_in, (rseek > 16384) ? -16384 : -rseek, SEEK_CUR); - } - - wpc->crc_errors++; - } - } - - if (wpc->total_samples != -1 && wps->sample_index == wpc->total_samples) - break; - } - -#ifdef ENABLE_DSD - if (wpc->decimation_context) - decimate_dsd_run (wpc->decimation_context, buffer, samples_unpacked); -#endif - - return samples_unpacked; -} diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_x64.S b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_x64.S deleted file mode 100644 index f9657cf8..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_x64.S +++ /dev/null @@ -1,957 +0,0 @@ -############################################################################ -## **** WAVPACK **** ## -## Hybrid Lossless Wavefile Compressor ## -## Copyright (c) 1998 - 2015 Conifer Software. ## -## All Rights Reserved. ## -## Distributed under the BSD Software License (see license.txt) ## -############################################################################ - - .intel_syntax noprefix - .text - - .globl _unpack_decorr_stereo_pass_cont_x64win - .globl _unpack_decorr_mono_pass_cont_x64win - - .globl unpack_decorr_stereo_pass_cont_x64win - .globl unpack_decorr_mono_pass_cont_x64win - - .globl _unpack_decorr_stereo_pass_cont_x64 - .globl _unpack_decorr_mono_pass_cont_x64 - - .globl unpack_decorr_stereo_pass_cont_x64 - .globl unpack_decorr_mono_pass_cont_x64 - -# This is an assembly optimized version of the following WavPack function: -# -# void unpack_decorr_stereo_pass_cont (struct decorr_pass *dpp, -# int32_t *buffer, -# int32_t sample_count, -# int32_t long_math; -# -# It performs a single pass of stereo decorrelation on the provided buffer. -# Note that this version of the function requires that up to 8 previous -# stereo samples are visible and correct. In other words, it ignores the -# "samples_*" fields in the decorr_pass structure and gets the history data -# directly from the buffer. It does, however, return the appropriate history -# samples to the decorr_pass structure before returning. -# -# The "long_math" argument is used to specify that a 32-bit multiply is -# not enough for the "apply_weight" operation (although in this case it -# would only apply to the -1 and -2 terms because the MMX code does not have -# this limitation) but we ignore the parameter and use the overflow detection -# of the "imul" instruction to switch automatically to the "long_math" loop. -# -# This is written to work on an X86-64 processor (also called the AMD64) -# running in 64-bit mode and generally uses the MMX extensions to improve -# the performance by processing both stereo channels together. Unfortunately -# this is not easily used for terms -1 and -2, so these terms are handled -# sequentially with regular assembler code. -# -# This version has entry points for both the System V ABI and the Windows -# X64 ABI. It does not use the "red zone" or the "shadow area"; it saves the -# non-volatile registers for both ABIs on the stack and allocates another -# 8 bytes on the stack to store the dpp pointer. Note that it does NOT -# provide unwind data for the Windows ABI (the unpack_x64.asm module for -# MSVC does). The arguments are passed in registers: -# -# System V Windows -# rdi rcx struct decorr_pass *dpp -# rsi rdx int32_t *buffer -# edx r8 int32_t sample_count -# ecx r9 int32_t long_math -# -# registers after entry: -# -# rdi bptr -# rsi eptr -# -# stack usage: -# -# [rsp+0] = *dpp -# - -_unpack_decorr_stereo_pass_cont_x64win: -unpack_decorr_stereo_pass_cont_x64win: - push rbp - push rbx - push rdi - push rsi - sub rsp, 8 - mov rdi, rcx # copy params from win regs to Linux regs - mov rsi, rdx # so we can leave following code similar - mov rdx, r8 - mov rcx, r9 - jmp entry # jump into common portion - -_unpack_decorr_stereo_pass_cont_x64: -unpack_decorr_stereo_pass_cont_x64: - push rbp - push rbx - push rdi - push rsi - sub rsp, 8 - -entry: mov [rsp], rdi # store dpp* at [rsp] - and edx, edx # if sample_count is zero, do nothing - jz done - - mov rdi, rsi # rdi = bptr - lea rsi, [rdi+rdx*8] # rsi = eptr - - mov rax, [rsp] # get term from dpp struct & vector to handler - mov eax, [rax] - cmp al, 17 - je term_17_entry - cmp al, 18 - je term_18_entry - cmp al, -1 - je term_minus_1_entry - cmp al, -2 - je term_minus_2_entry - cmp al, -3 - je term_minus_3_entry - -# -# registers in default term loop: -# -# rbx term * -8 (for indexing correlation sample) -# rdi bptr -# rsi eptr -# -# mm0, mm1 scratch -# mm2 original sample values -# mm3 correlation sample -# mm4 zero (for pcmpeqd) -# mm5 weights -# mm6 delta -# mm7 512 (for rounding) -# - -default_term_entry: - imul rbx, rax, -8 # set RBX to term * -8 - mov eax, 512 - movd mm7, eax - punpckldq mm7, mm7 # mm7 = round (512) - mov rdx, [rsp] # set RDX to *dpp - mov eax, [rdx+4] - movd mm6, eax - punpckldq mm6, mm6 # mm6 = delta (0-7) - mov eax, 0xFFFF # mask high weights to zero for PMADDWD - movd mm5, eax - punpckldq mm5, mm5 # mm5 = weight mask 0x0000FFFF0000FFFF - pand mm5, [rdx+8] # mm5 = weight_AB masked to 16 bits - pxor mm4, mm4 # mm4 = zero (for pcmpeqd) - jmp default_term_loop - - .balign 64 -default_term_loop: - movq mm3, [rdi+rbx] # mm3 = sam_AB - movq mm1, mm3 - movq mm0, mm3 - paddd mm1, mm1 - psrld mm0, 15 - psrlw mm1, 1 - pmaddwd mm0, mm5 - pmaddwd mm1, mm5 - movq mm2, [rdi] # mm2 = left_right - pslld mm0, 5 - paddd mm1, mm7 # add 512 for rounding - psrad mm1, 10 - paddd mm0, mm2 - paddd mm0, mm1 # add shifted sums - movq [rdi], mm0 # store result - movq mm0, mm3 - pxor mm0, mm2 - psrad mm0, 31 # mm0 = sign (sam_AB ^ left_right) - add rdi, 8 - pcmpeqd mm2, mm4 # mm2 = 1s if left_right was zero - pcmpeqd mm3, mm4 # mm3 = 1s if sam_AB was zero - por mm2, mm3 # mm2 = 1s if either was zero - pandn mm2, mm6 # mask delta with zeros check - pxor mm5, mm0 - paddw mm5, mm2 # and add to weight_AB - pxor mm5, mm0 - cmp rdi, rsi # compare bptr and eptr to see if we're done - jb default_term_loop - - pslld mm5, 16 # sign-extend 16-bit weights back to dwords - psrad mm5, 16 - mov rdx, [rsp] # point to dpp - movq [rdx+8], mm5 # put weight_AB back - emms - - mov ecx, [rdx] # ecx = dpp->term - -default_store_samples: - dec ecx - sub rdi, 8 # back up one full sample - mov eax, [rdi+4] - mov [rdx+rcx*4+48], eax # store samples_B [ecx] - mov eax, [rdi] - mov [rdx+rcx*4+16], eax # store samples_A [ecx] - test ecx, ecx - jnz default_store_samples - jmp done - -# -# registers in term 17 & 18 loops: -# -# rdi bptr -# rsi eptr -# -# mm0, mm1 scratch -# mm2 original sample values -# mm3 correlation samples -# mm4 last calculated values (so we don't need to reload) -# mm5 weights -# mm6 delta -# mm7 512 (for rounding) -# - -term_17_entry: - mov eax, 512 - movd mm7, eax - punpckldq mm7, mm7 # mm7 = round (512) - mov rdx, [rsp] # set RDX to *dpp - mov eax, [rdx+4] - movd mm6, eax - punpckldq mm6, mm6 # mm6 = delta (0-7) - mov eax, 0xFFFF # mask high weights to zero for PMADDWD - movd mm5, eax - punpckldq mm5, mm5 # mm5 = weight mask 0x0000FFFF0000FFFF - pand mm5, [rdx+8] # mm5 = weight_AB masked to 16 bits - movq mm4, [rdi-8] # preload last calculated values in mm4 - jmp term_17_loop - - .balign 64 -term_17_loop: - paddd mm4, mm4 - psubd mm4, [rdi-16] # mm3 = sam_AB - movq mm3, mm4 - movq mm1, mm3 - paddd mm1, mm1 - psrld mm4, 15 - psrlw mm1, 1 - pmaddwd mm4, mm5 - pmaddwd mm1, mm5 - movq mm2, [rdi] # mm2 = left_right - pslld mm4, 5 - paddd mm1, mm7 # add 512 for rounding - psrad mm1, 10 - paddd mm4, mm2 - paddd mm4, mm1 # add shifted sums - movq mm0, mm3 - movq [rdi], mm4 # store result - pxor mm0, mm2 - psrad mm0, 31 # mm0 = sign (sam_AB ^ left_right) - add rdi, 8 - pxor mm1, mm1 # mm1 = zero - pcmpeqd mm2, mm1 # mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 # mm3 = 1s if sam_AB was zero - por mm2, mm3 # mm2 = 1s if either was zero - pandn mm2, mm6 # mask delta with zeros check - pxor mm5, mm0 - paddw mm5, mm2 # and add to weight_AB - pxor mm5, mm0 - cmp rdi, rsi # compare bptr and eptr to see if we're done - jb term_17_loop - jmp term_1718_exit # terms 17 & 18 treat samples_AB[] the same - -term_18_entry: - mov eax, 512 - movd mm7, eax - punpckldq mm7, mm7 # mm7 = round (512) - mov rdx, [rsp] # set RDX to *dpp - mov eax, [rdx+4] - movd mm6, eax - punpckldq mm6, mm6 # mm6 = delta (0-7) - mov eax, 0xFFFF # mask high weights to zero for PMADDWD - movd mm5, eax - punpckldq mm5, mm5 # mm5 = weight mask 0x0000FFFF0000FFFF - pand mm5, [rdx+8] # mm5 = weight_AB masked to 16 bits - movq mm4, [rdi-8] # preload last calculated values in mm4 - jmp term_18_loop - - .balign 64 -term_18_loop: - movq mm3, mm4 - psubd mm3, [rdi-16] - psrad mm3, 1 - paddd mm3, mm4 # mm3 = sam_AB - movq mm1, mm3 - movq mm4, mm3 - paddd mm1, mm1 - psrld mm4, 15 - psrlw mm1, 1 - pmaddwd mm4, mm5 - pmaddwd mm1, mm5 - movq mm2, [rdi] # mm2 = left_right - pslld mm4, 5 - paddd mm1, mm7 # add 512 for rounding - psrad mm1, 10 - paddd mm4, mm2 - paddd mm4, mm1 # add shifted sums - movq mm0, mm3 - movq [rdi], mm4 # store result - pxor mm0, mm2 - psrad mm0, 31 # mm0 = sign (sam_AB ^ left_right) - add rdi, 8 - pxor mm1, mm1 # mm1 = zero - pcmpeqd mm2, mm1 # mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 # mm3 = 1s if sam_AB was zero - por mm2, mm3 # mm2 = 1s if either was zero - pandn mm2, mm6 # mask delta with zeros check - pxor mm5, mm0 - paddw mm5, mm2 # and add to weight_AB - pxor mm5, mm0 - cmp rdi, rsi # compare bptr and eptr to see if we're done - jb term_18_loop - -term_1718_exit: - pslld mm5, 16 # sign-extend 16-bit weights back to dwords - psrad mm5, 16 - mov rdx, [rsp] # point to dpp - movq [rdx+8], mm5 # put weight_AB back - emms - - mov eax, [rdi-4] # dpp->samples_B [0] = bptr [-1]; - mov [rdx+48], eax - mov eax, [rdi-8] # dpp->samples_A [0] = bptr [-2]; - mov [rdx+16], eax - mov eax, [rdi-12] # dpp->samples_B [1] = bptr [-3]; - mov [rdx+52], eax - mov eax, [rdi-16] # dpp->samples_A [1] = bptr [-4]; - mov [rdx+20], eax - jmp done - -# -# registers in term -1 & -2 loops: -# -# eax,ebx,edx scratch -# ecx weight_A -# ebp weight_B -# rdi bptr -# rsi eptr -# r8d delta -# - -term_minus_1_entry: - cld - mov rdx, [rsp] # point to dpp - mov ecx, [rdx+8] # ecx = weight_A - mov ebp, [rdx+12] # ebp = weight_B - mov r8d, [rdx+4] # r8d = delta - mov eax, [rdi-4] - jmp term_minus_1_loop - - .balign 64 -term_minus_1_loop: - mov ebx, eax - imul eax, ecx - mov edx, [rdi] - jo OV11 - sar eax, 10 - adc eax, edx - stosd - test ebx, ebx - je L182 - test edx, edx - je L182 - xor ebx, edx - sar ebx, 31 - xor ecx, ebx - add ecx, r8d - mov edx, 1024 - add edx, ebx - cmp ecx, edx - jle L183 - mov ecx, edx -L183: xor ecx, ebx -L182: mov ebx, eax - imul eax, ebp - mov edx, [rdi] - jo OV12 - sar eax, 10 - adc eax, edx - stosd - test ebx, ebx - je L187 - test edx, edx - je L187 - xor ebx, edx - sar ebx, 31 - xor ebp, ebx - add ebp, r8d - mov edx, 1024 - add edx, ebx - cmp ebp, edx - jle L188 - mov ebp, edx -L188: xor ebp, ebx -L187: cmp rdi, rsi # compare bptr and eptr to see if we're done - jb term_minus_1_loop - jmp term_minus_1_done - -OV11: mov eax, ebx # restore previous sample into eax - jmp long_term_minus_1_loop - -OV12: mov eax, ebx # restore previous sample into eax - jmp L282 - - .balign 64 -long_term_minus_1_loop: - mov ebx, eax - imul ecx - shl edx, 22 - shr eax, 10 - adc eax, edx - mov edx, [rdi] - add eax, edx - stosd - test ebx, ebx - je L282 - test edx, edx - je L282 - xor ebx, edx - sar ebx, 31 - xor ecx, ebx - add ecx, r8d - mov edx, 1024 - add edx, ebx - cmp ecx, edx - jle L283 - mov ecx, edx -L283: xor ecx, ebx -L282: mov ebx, eax - imul ebp - shl edx, 22 - shr eax, 10 - adc eax, edx - mov edx, [rdi] - add eax, edx - stosd - test ebx, ebx - je L287 - test edx, edx - je L287 - xor ebx, edx - sar ebx, 31 - xor ebp, ebx - add ebp, r8d - mov edx, 1024 - add edx, ebx - cmp ebp, edx - jle L288 - mov ebp, edx -L288: xor ebp, ebx -L287: cmp rdi, rsi # compare bptr and eptr to see if we're done - jb long_term_minus_1_loop - -term_minus_1_done: - mov rdx, [rsp] # point to dpp - mov [rdx+8], ecx # store weights back - mov [rdx+12], ebp - mov eax, [rdi-4] # dpp->samples_A [0] = bptr [-1]; - mov [rdx+16], eax - jmp done - -term_minus_2_entry: - mov rdx, [rsp] # point to dpp - mov ecx, [rdx+8] # ecx = weight_A - mov ebp, [rdx+12] # ebp = weight_B - mov r8d, [rdx+4] # r8d = delta - mov eax, [rdi-8] - jmp term_minus_2_loop - - .balign 64 -term_minus_2_loop: - mov ebx, eax - imul eax, ebp - mov edx, [rdi+4] - jo OV21 - sar eax, 10 - adc eax, edx - mov [rdi+4], eax - test ebx, ebx - je L194 - test edx, edx - je L194 - xor ebx, edx - sar ebx, 31 - xor ebp, ebx - add ebp, r8d - mov edx, 1024 - add edx, ebx - cmp ebp, edx - jle L195 - mov ebp, edx -L195: xor ebp, ebx -L194: mov ebx, eax - imul eax, ecx - mov edx, [rdi] - jo OV22 - sar eax, 10 - adc eax, edx - mov [rdi], eax - test ebx, ebx - je L199 - test edx, edx - je L199 - xor ebx, edx - sar ebx, 31 - xor ecx, ebx - add ecx, r8d - mov edx, 1024 - add edx, ebx - cmp ecx, edx - jle L200 - mov ecx, edx -L200: xor ecx, ebx -L199: add rdi, 8 - cmp rdi, rsi # compare bptr and eptr to see if we're done - jb term_minus_2_loop - jmp term_minus_2_done - -OV21: mov eax, ebx # restore previous sample into eax - jmp long_term_minus_2_loop - -OV22: mov eax, ebx # restore previous sample into eax - jmp L294 - - .balign 64 -long_term_minus_2_loop: - mov ebx, eax - imul ebp - shl edx, 22 - shr eax, 10 - adc eax, edx - mov edx, [rdi+4] - add eax, edx - mov [rdi+4], eax - test ebx, ebx - je L294 - test edx, edx - je L294 - xor ebx, edx - sar ebx, 31 - xor ebp, ebx - add ebp, r8d - mov edx, 1024 - add edx, ebx - cmp ebp, edx - jle L295 - mov ebp, edx -L295: xor ebp, ebx -L294: mov ebx, eax - imul ecx - shl edx, 22 - shr eax, 10 - adc eax, edx - mov edx, [rdi] - add eax, edx - mov [rdi], eax - test ebx, ebx - je L299 - test edx, edx - je L299 - xor ebx, edx - sar ebx, 31 - xor ecx, ebx - add ecx, r8d - mov edx, 1024 - add edx, ebx - cmp ecx, edx - jle L300 - mov ecx, edx -L300: xor ecx, ebx -L299: add rdi, 8 - cmp rdi, rsi # compare bptr and eptr to see if we're done - jb long_term_minus_2_loop - -term_minus_2_done: - mov rdx, [rsp] # point to dpp - mov [rdx+8], ecx # store weights back - mov [rdx+12], ebp - mov eax, [rdi-8] # dpp->samples_B [0] = bptr [-2]; - mov [rdx+48], eax - jmp done - -# -# registers in term -3 loop: -# -# rdi bptr -# rsi eptr -# -# mm0, mm1 scratch -# mm2 original sample values -# mm3 correlation samples -# mm4 last calculated values (so we don't need to reload) -# mm5 weights -# mm6 delta -# mm7 512 (for rounding) -# - -term_minus_3_entry: - mov eax, 512 - movd mm7, eax - punpckldq mm7, mm7 # mm7 = round (512) - mov rdx, [rsp] # set RDX to *dpp - mov eax, [rdx+4] - movd mm6, eax - punpckldq mm6, mm6 # mm6 = delta (0-7) - mov eax, 0xFFFF # mask high weights to zero for PMADDWD - movd mm5, eax - punpckldq mm5, mm5 # mm5 = weight mask 0x0000FFFF0000FFFF - pand mm5, [rdx+8] # mm5 = weight_AB masked to 16 bits - movq mm4, [rdi-8] - jmp term_minus_3_loop - - .balign 64 -term_minus_3_loop: - movq mm3, mm4 - psrlq mm3, 32 - punpckldq mm3, mm4 # mm3 = sam_AB - movq mm1, mm3 - movq mm4, mm3 - pslld mm1, 1 - psrld mm4, 15 - psrlw mm1, 1 - pmaddwd mm4, mm5 - pmaddwd mm1, mm5 - movq mm2, [rdi] # mm2 = left_right - pslld mm4, 5 - paddd mm1, mm7 # add 512 for rounding - psrad mm1, 10 - paddd mm4, mm2 - paddd mm4, mm1 # add shifted sums - movq [rdi], mm4 # store result - movq mm0, mm3 - pxor mm0, mm2 - psrad mm0, 31 # mm0 = sign (sam_AB ^ left_right) - add rdi, 8 - pxor mm1, mm1 # mm1 = zero - pcmpeqd mm2, mm1 # mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 # mm3 = 1s if sam_AB was zero - por mm2, mm3 # mm2 = 1s if either was zero - pandn mm2, mm6 # mask delta with zeros check - pcmpeqd mm1, mm1 - psubd mm1, mm7 - psubd mm1, mm7 - psubd mm1, mm0 - pxor mm5, mm0 - paddw mm5, mm1 - paddusw mm5, mm2 # and add to weight_AB - psubw mm5, mm1 - pxor mm5, mm0 - cmp rdi, rsi # compare bptr and eptr to see if we're done - jb term_minus_3_loop - - pslld mm5, 16 # sign-extend 16-bit weights back to dwords - psrad mm5, 16 - mov rdx, [rsp] # point to dpp - movq [rdx+8], mm5 # put weight_AB back - emms - - mov edx, [rdi-4] # dpp->samples_A [0] = bptr [-1]; - mov rax, [rsp] - mov [rax+16], edx - mov edx, [rdi-8] # dpp->samples_B [0] = bptr [-2]; - mov [rax+48], edx - -done: add rsp, 8 - pop rsi - pop rdi - pop rbx - pop rbp - ret - -####################################################################################################################### -# -# This is the mono version of the above function. It does not use MMX and does not handle negative terms. -# -# void unpack_decorr_mono_pass_cont (struct decorr_pass *dpp, -# int32_t *buffer, -# int32_t sample_count, -# int32_t long_math; -# arguments on entry: -# -# System V Windows -# rdi rcx struct decorr_pass *dpp -# rsi rdx int32_t *buffer -# edx r8 int32_t sample_count -# ecx r9 int32_t long_math -# -# registers after entry: -# -# rdi bptr -# rsi eptr -# -# stack usage: -# -# [rsp+0] = *dpp -# - -_unpack_decorr_mono_pass_cont_x64win: -unpack_decorr_mono_pass_cont_x64win: - push rbp - push rbx - push rdi - push rsi - sub rsp, 8 - - mov rdi, rcx # copy params from win regs to Linux regs - mov rsi, rdx # so we can leave following code similar - mov rdx, r8 - mov rcx, r9 - jmp mentry # jump into common portion - -_unpack_decorr_mono_pass_cont_x64: -unpack_decorr_mono_pass_cont_x64: - push rbp - push rbx - push rdi - push rsi - sub rsp, 8 - -mentry: mov [rsp], rdi # store dpp* into [rsp] - and edx, edx # if sample_count is zero, do nothing - jz mono_done - - cld # we use stosd - mov rdi, rsi # rdi = bptr - lea rsi, [rdi+rdx*4] # rsi = eptr - - mov rax, [rsp] # get term from dpp struct & vector to handler - mov eax, [rax] - cmp al, 17 - je mono_17_entry - cmp al, 18 - je mono_18_entry - -# -# registers during default term processing loop: -# rdi active buffer pointer -# rsi end of buffer pointer -# r8d delta -# ecx weight_A -# ebx term * -4 -# eax,edx scratch -# - -default_mono_entry: - imul rbx, rax, -4 # set rbx to term * -4 for decorrelation index - mov rdx, [rsp] - mov ecx, [rdx+8] # ecx = weight, r8d = delta - mov r8d, [rdx+4] - jmp default_mono_loop - -# -# registers during processing loop for terms 17 & 18: -# rdi active buffer pointer -# rsi end of buffer pointer -# r8d delta -# ecx weight_A -# ebp previously calculated value -# ebx calculated correlation sample -# eax,edx scratch -# - -mono_17_entry: - mov rdx, [rsp] # rdx = dpp* - mov ecx, [rdx+8] # ecx = weight, r8d = delta - mov r8d, [rdx+4] - mov ebp, [rdi-4] - jmp mono_17_loop - -mono_18_entry: - mov rdx, [rsp] # rdx = dpp* - mov ecx, [rdx+8] # ecx = weight, r8d = delta - mov r8d, [rdx+4] - mov ebp, [rdi-4] - jmp mono_18_loop - - .balign 64 -default_mono_loop: - mov eax, [rdi+rbx] - imul eax, ecx - mov edx, [rdi] - jo long_default_mono_loop - sar eax, 10 - adc eax, edx - mov [rdi], eax - mov eax, [rdi+rbx] - add rdi, 4 - test edx, edx - je L100 - test eax, eax - je L100 - xor eax, edx - cdq - xor ecx, edx - add ecx, r8d - xor ecx, edx -L100: cmp rdi, rsi # compare bptr and eptr to see if we're done - jb default_mono_loop - jmp default_mono_done - - .balign 64 -long_default_mono_loop: - mov eax, [rdi+rbx] - imul ecx - shl edx, 22 - shr eax, 10 - adc eax, edx - mov edx, [rdi] - add eax, edx - mov [rdi], eax - mov eax, [rdi+rbx] - add rdi, 4 - test edx, edx - je L101 - test eax, eax - je L101 - xor eax, edx - cdq - xor ecx, edx - add ecx, r8d - xor ecx, edx -L101: cmp rdi, rsi # compare bptr and eptr to see if we're done - jb long_default_mono_loop - -default_mono_done: - mov rdx, [rsp] # edx = dpp* - mov [rdx+8], ecx # store weight_A back - mov ecx, [rdx] # ecx = dpp->term - -default_mono_store_samples: - dec ecx - sub rdi, 4 # back up one full sample - mov eax, [rdi] - mov [rdx+rcx*4+16], eax # store samples_A [ecx] - test ecx, ecx - jnz default_mono_store_samples - jmp mono_done - - .balign 64 -mono_17_loop: - lea ebx, [ebp+ebp] - sub ebx, [rdi-8] - mov eax, ecx - imul eax, ebx - mov edx, [rdi] - jo long_mono_17_loop - sar eax, 10 - adc eax, edx - stosd - test ebx, ebx - mov ebp, eax - je L117 - test edx, edx - je L117 - xor ebx, edx - sar ebx, 31 - xor ecx, ebx - add ecx, r8d - xor ecx, ebx -L117: cmp rdi, rsi # compare bptr and eptr to see if we're done - jb mono_17_loop - jmp mono_1718_exit - - .balign 64 -long_mono_17_loop: - lea ebx, [ebp+ebp] - sub ebx, [rdi-8] - mov eax, ecx - imul ebx - shl edx, 22 - shr eax, 10 - adc eax, edx - mov edx, [rdi] - add eax, edx - stosd - test ebx, ebx - mov ebp, eax - je L217 - test edx, edx - je L217 - xor ebx, edx - sar ebx, 31 - xor ecx, ebx - add ecx, r8d - xor ecx, ebx -L217: cmp rdi, rsi # compare bptr and eptr to see if we're done - jb long_mono_17_loop - jmp mono_1718_exit - - .balign 64 -mono_18_loop: - lea ebx, [ebp+ebp*2] - sub ebx, [rdi-8] - sar ebx, 1 - mov eax, ecx - imul eax, ebx - mov edx, [rdi] - jo long_mono_18_loop - sar eax, 10 - adc eax, edx - stosd - test ebx, ebx - mov ebp, eax - je L118 - test edx, edx - je L118 - xor ebx, edx - sar ebx, 31 - xor ecx, ebx - add ecx, r8d - xor ecx, ebx -L118: cmp rdi, rsi # compare bptr and eptr to see if we're done - jb mono_18_loop - jmp mono_1718_exit - - .balign 64 -long_mono_18_loop: - lea ebx, [ebp+ebp*2] - sub ebx, [rdi-8] - sar ebx, 1 - mov eax, ecx - imul ebx - shl edx, 22 - shr eax, 10 - adc eax, edx - mov edx, [rdi] - add eax, edx - stosd - test ebx, ebx - mov ebp, eax - je L218 - test edx, edx - je L218 - xor ebx, edx - sar ebx, 31 - xor ecx, ebx - add ecx, r8d - xor ecx, ebx -L218: cmp rdi, rsi # compare bptr and eptr to see if we're done - jb long_mono_18_loop - -mono_1718_exit: - mov rdx, [rsp] # edx = dpp* - mov [rdx+8], ecx # store weight_A back - mov eax, [rdi-4] # dpp->samples_A [0] = bptr [-1]; - mov [rdx+16], eax - mov eax, [rdi-8] # dpp->samples_A [1] = bptr [-2]; - mov [rdx+20], eax - -mono_done: - add rsp, 8 - pop rsi - pop rdi - pop rbx - pop rbp - ret - -#ifdef __ELF__ - .section .note.GNU-stack,"",@progbits -#endif - diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_x64.asm b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_x64.asm deleted file mode 100644 index a4df18a5..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_x64.asm +++ /dev/null @@ -1,930 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; **** WAVPACK **** ;; -;; Hybrid Lossless Wavefile Compressor ;; -;; Copyright (c) 1998 - 2015 Conifer Software. ;; -;; All Rights Reserved. ;; -;; Distributed under the BSD Software License (see license.txt) ;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - include - -asmcode segment page 'CODE' - -; This is an assembly optimized version of the following WavPack function: -; -; void unpack_decorr_stereo_pass_cont (struct decorr_pass *dpp, -; int32_t *buffer, -; int32_t sample_count, -; int32_t long_math; -; -; It performs a single pass of stereo decorrelation on the provided buffer. -; Note that this version of the function requires that up to 8 previous -; stereo samples are visible and correct. In other words, it ignores the -; "samples_*" fields in the decorr_pass structure and gets the history data -; directly from the buffer. It does, however, return the appropriate history -; samples to the decorr_pass structure before returning. -; -; The "long_math" argument is used to specify that a 32-bit multiply is -; not enough for the "apply_weight" operation (although in this case it -; would only apply to the -1 and -2 terms because the MMX code does not have -; this limitation) but we ignore the parameter and use the overflow detection -; of the "imul" instruction to switch automatically to the "long_math" loop. -; -; This is written to work on an X86-64 processor (also called the AMD64) -; running in 64-bit mode and generally uses the MMX extensions to improve -; the performance by processing both stereo channels together. Unfortunately -; this is not easily used for terms -1 and -2, so these terms are handled -; sequentially with regular assembler code. -; -; This version is for 64-bit Windows. The arguments are passed in registers: -; -; rcx struct decorr_pass *dpp -; rdx int32_t *buffer -; r8d int32_t sample_count -; r9d int32_t long_math -; -; registers after entry: -; -; rdi bptr -; rsi eptr -; ecx long_math (only used for terms -1 and -2) -; -; stack usage: -; -; [rsp+0] = *dpp -; - -unpack_decorr_stereo_pass_cont_x64win proc public frame - push_reg rbp ; save non-volatile registers on stack - push_reg rbx ; (alphabetically) - push_reg rdi - push_reg rsi - alloc_stack 8 ; allocate 8 bytes on stack & align to 16 bytes - end_prologue - - mov [rsp], rcx ; [rsp] = *dpp - mov rdi, rcx ; copy params from win regs to Linux regs - mov rsi, rdx ; so we can leave following code similar - mov rdx, r8 - mov rcx, r9 - - and edx, edx ; if sample_count is zero, do nothing - jz done - - mov rdi, rsi ; rdi = bptr - lea rsi, [rdi+rdx*8] ; rsi = eptr - - mov rax, [rsp] ; get term from dpp struct & vector to handler - mov eax, [rax] - cmp al, 17 - je term_17_entry - cmp al, 18 - je term_18_entry - cmp al, -1 - je term_minus_1_entry - cmp al, -2 - je term_minus_2_entry - cmp al, -3 - je term_minus_3_entry - -; -; registers in default term loop: -; -; rbx term * -8 (for indexing correlation sample) -; rdi bptr -; rsi eptr -; -; mm0, mm1 scratch -; mm2 original sample values -; mm3 correlation sample -; mm4 zero (for pcmpeqd) -; mm5 weights -; mm6 delta -; mm7 512 (for rounding) -; - -default_term_entry: - imul rbx, rax, -8 ; set RBX to term * -8 - mov eax, 512 - movd mm7, eax - punpckldq mm7, mm7 ; mm7 = round (512) - mov rdx, [rsp] ; set RDX to *dpp - mov eax, [rdx+4] - movd mm6, eax - punpckldq mm6, mm6 ; mm6 = delta (0-7) - mov eax, 0FFFFh ; mask high weights to zero for PMADDWD - movd mm5, eax - punpckldq mm5, mm5 ; mm5 = weight mask 0x0000FFFF0000FFFF - pand mm5, [rdx+8] ; mm5 = weight_AB masked to 16 bits - pxor mm4, mm4 ; mm4 = zero (for pcmpeqd) - jmp default_term_loop - - align 64 -default_term_loop: - movq mm3, [rdi+rbx] ; mm3 = sam_AB - movq mm1, mm3 - movq mm0, mm3 - paddd mm1, mm1 - psrld mm0, 15 - psrlw mm1, 1 - pmaddwd mm0, mm5 - pmaddwd mm1, mm5 - movq mm2, [rdi] ; mm2 = left_right - pslld mm0, 5 - paddd mm1, mm7 ; add 512 for rounding - psrad mm1, 10 - paddd mm0, mm2 - paddd mm0, mm1 ; add shifted sums - movq [rdi], mm0 ; store result - movq mm0, mm3 - pxor mm0, mm2 - psrad mm0, 31 ; mm0 = sign (sam_AB ^ left_right) - add rdi, 8 - pcmpeqd mm2, mm4 ; mm2 = 1s if left_right was zero - pcmpeqd mm3, mm4 ; mm3 = 1s if sam_AB was zero - por mm2, mm3 ; mm2 = 1s if either was zero - pandn mm2, mm6 ; mask delta with zeros check - pxor mm5, mm0 - paddw mm5, mm2 ; and add to weight_AB - pxor mm5, mm0 - cmp rdi, rsi ; compare bptr and eptr to see if we're done - jb default_term_loop - - pslld mm5, 16 ; sign-extend 16-bit weights back to dwords - psrad mm5, 16 - mov rdx, [rsp] ; point to dpp - movq [rdx+8], mm5 ; put weight_AB back - emms - - mov ecx, [rdx] ; ecx = dpp->term - -default_store_samples: - dec ecx - sub rdi, 8 ; back up one full sample - mov eax, [rdi+4] - mov [rdx+rcx*4+48], eax ; store samples_B [ecx] - mov eax, [rdi] - mov [rdx+rcx*4+16], eax ; store samples_A [ecx] - test ecx, ecx - jnz default_store_samples - jmp done - -; -; registers in term 17 & 18 loops: -; -; rdi bptr -; rsi eptr -; -; mm0, mm1 scratch -; mm2 original sample values -; mm3 correlation samples -; mm4 last calculated values (so we don't need to reload) -; mm5 weights -; mm6 delta -; mm7 512 (for rounding) -; - -term_17_entry: - mov eax, 512 - movd mm7, eax - punpckldq mm7, mm7 ; mm7 = round (512) - mov rdx, [rsp] ; set RDX to *dpp - mov eax, [rdx+4] - movd mm6, eax - punpckldq mm6, mm6 ; mm6 = delta (0-7) - mov eax, 0FFFFh ; mask high weights to zero for PMADDWD - movd mm5, eax - punpckldq mm5, mm5 ; mm5 = weight mask 0x0000FFFF0000FFFF - pand mm5, [rdx+8] ; mm5 = weight_AB masked to 16 bits - movq mm4, [rdi-8] ; preload last calculated values in mm4 - jmp term_17_loop - - align 64 -term_17_loop: - paddd mm4, mm4 - psubd mm4, [rdi-16] ; mm3 = sam_AB - movq mm3, mm4 - movq mm1, mm3 - paddd mm1, mm1 - psrld mm4, 15 - psrlw mm1, 1 - pmaddwd mm4, mm5 - pmaddwd mm1, mm5 - movq mm2, [rdi] ; mm2 = left_right - pslld mm4, 5 - paddd mm1, mm7 ; add 512 for rounding - psrad mm1, 10 - paddd mm4, mm2 - paddd mm4, mm1 ; add shifted sums - movq mm0, mm3 - movq [rdi], mm4 ; store result - pxor mm0, mm2 - psrad mm0, 31 ; mm0 = sign (sam_AB ^ left_right) - add rdi, 8 - pxor mm1, mm1 ; mm1 = zero - pcmpeqd mm2, mm1 ; mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 ; mm3 = 1s if sam_AB was zero - por mm2, mm3 ; mm2 = 1s if either was zero - pandn mm2, mm6 ; mask delta with zeros check - pxor mm5, mm0 - paddw mm5, mm2 ; and add to weight_AB - pxor mm5, mm0 - cmp rdi, rsi ; compare bptr and eptr to see if we're done - jb term_17_loop - jmp term_1718_exit ; terms 17 & 18 treat samples_AB[] the same - -term_18_entry: - mov eax, 512 - movd mm7, eax - punpckldq mm7, mm7 ; mm7 = round (512) - mov rdx, [rsp] ; set RDX to *dpp - mov eax, [rdx+4] - movd mm6, eax - punpckldq mm6, mm6 ; mm6 = delta (0-7) - mov eax, 0FFFFh ; mask high weights to zero for PMADDWD - movd mm5, eax - punpckldq mm5, mm5 ; mm5 = weight mask 0x0000FFFF0000FFFF - pand mm5, [rdx+8] ; mm5 = weight_AB masked to 16 bits - movq mm4, [rdi-8] ; preload last calculated values in mm4 - jmp term_18_loop - - align 64 -term_18_loop: - movq mm3, mm4 - psubd mm3, [rdi-16] - psrad mm3, 1 - paddd mm3, mm4 ; mm3 = sam_AB - movq mm1, mm3 - movq mm4, mm3 - paddd mm1, mm1 - psrld mm4, 15 - psrlw mm1, 1 - pmaddwd mm4, mm5 - pmaddwd mm1, mm5 - movq mm2, [rdi] ; mm2 = left_right - pslld mm4, 5 - paddd mm1, mm7 ; add 512 for rounding - psrad mm1, 10 - paddd mm4, mm2 - paddd mm4, mm1 ; add shifted sums - movq mm0, mm3 - movq [rdi], mm4 ; store result - pxor mm0, mm2 - psrad mm0, 31 ; mm0 = sign (sam_AB ^ left_right) - add rdi, 8 - pxor mm1, mm1 ; mm1 = zero - pcmpeqd mm2, mm1 ; mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 ; mm3 = 1s if sam_AB was zero - por mm2, mm3 ; mm2 = 1s if either was zero - pandn mm2, mm6 ; mask delta with zeros check - pxor mm5, mm0 - paddw mm5, mm2 ; and add to weight_AB - pxor mm5, mm0 - cmp rdi, rsi ; compare bptr and eptr to see if we're done - jb term_18_loop - -term_1718_exit: - pslld mm5, 16 ; sign-extend 16-bit weights back to dwords - psrad mm5, 16 - mov rdx, [rsp] ; point to dpp - movq [rdx+8], mm5 ; put weight_AB back - emms - - mov eax, [rdi-4] ; dpp->samples_B [0] = bptr [-1]; - mov [rdx+48], eax - mov eax, [rdi-8] ; dpp->samples_A [0] = bptr [-2]; - mov [rdx+16], eax - mov eax, [rdi-12] ; dpp->samples_B [1] = bptr [-3]; - mov [rdx+52], eax - mov eax, [rdi-16] ; dpp->samples_A [1] = bptr [-4]; - mov [rdx+20], eax - jmp done - -; -; registers in term -1 & -2 loops: -; -; eax,ebx,edx scratch -; ecx weight_A -; ebp weight_B -; rdi bptr -; rsi eptr -; r8d delta -; - -term_minus_1_entry: - cld - mov rdx, [rsp] ; point to dpp - mov ecx, [rdx+8] ; ecx = weight_A - mov ebp, [rdx+12] ; ebp = weight_B - mov r8d, [rdx+4] ; r8d = delta - mov eax, [rdi-4] - jmp term_minus_1_loop - - align 64 -term_minus_1_loop: - mov ebx, eax - imul eax, ecx - mov edx, [rdi] - jo OV11 - sar eax, 10 - adc eax, edx - stosd - test ebx, ebx - je L182 - test edx, edx - je L182 - xor ebx, edx - sar ebx, 31 - xor ecx, ebx - add ecx, r8d - mov edx, 1024 - add edx, ebx - cmp ecx, edx - jle L183 - mov ecx, edx -L183: xor ecx, ebx -L182: mov ebx, eax - imul eax, ebp - mov edx, [rdi] - jo OV12 - sar eax, 10 - adc eax, edx - stosd - test ebx, ebx - je L187 - test edx, edx - je L187 - xor ebx, edx - sar ebx, 31 - xor ebp, ebx - add ebp, r8d - mov edx, 1024 - add edx, ebx - cmp ebp, edx - jle L188 - mov ebp, edx -L188: xor ebp, ebx -L187: cmp rdi, rsi ; compare bptr and eptr to see if we're done - jb term_minus_1_loop - jmp term_minus_1_done - -OV11: mov eax, ebx ; restore previous sample into eax - jmp long_term_minus_1_loop - -OV12: mov eax, ebx ; restore previous sample into eax - jmp L282 - - align 64 -long_term_minus_1_loop: - mov ebx, eax - imul ecx - shl edx, 22 - shr eax, 10 - adc eax, edx - mov edx, [rdi] - add eax, edx - stosd - test ebx, ebx - je L282 - test edx, edx - je L282 - xor ebx, edx - sar ebx, 31 - xor ecx, ebx - add ecx, r8d - mov edx, 1024 - add edx, ebx - cmp ecx, edx - jle L283 - mov ecx, edx -L283: xor ecx, ebx -L282: mov ebx, eax - imul ebp - shl edx, 22 - shr eax, 10 - adc eax, edx - mov edx, [rdi] - add eax, edx - stosd - test ebx, ebx - je L287 - test edx, edx - je L287 - xor ebx, edx - sar ebx, 31 - xor ebp, ebx - add ebp, r8d - mov edx, 1024 - add edx, ebx - cmp ebp, edx - jle L288 - mov ebp, edx -L288: xor ebp, ebx -L287: cmp rdi, rsi ; compare bptr and eptr to see if we're done - jb long_term_minus_1_loop - -term_minus_1_done: - mov rdx, [rsp] ; point to dpp - mov [rdx+8], ecx ; store weights back - mov [rdx+12], ebp - mov eax, [rdi-4] ; dpp->samples_A [0] = bptr [-1]; - mov [rdx+16], eax - jmp done - -term_minus_2_entry: - mov rdx, [rsp] ; point to dpp - mov ecx, [rdx+8] ; ecx = weight_A - mov ebp, [rdx+12] ; ebp = weight_B - mov r8d, [rdx+4] ; r8d = delta - mov eax, [rdi-8] - jmp term_minus_2_loop - - align 64 -term_minus_2_loop: - mov ebx, eax - imul eax, ebp - mov edx, [rdi+4] - jo OV21 - sar eax, 10 - adc eax, edx - mov [rdi+4], eax - test ebx, ebx - je L194 - test edx, edx - je L194 - xor ebx, edx - sar ebx, 31 - xor ebp, ebx - add ebp, r8d - mov edx, 1024 - add edx, ebx - cmp ebp, edx - jle L195 - mov ebp, edx -L195: xor ebp, ebx -L194: mov ebx, eax - imul eax, ecx - mov edx, [rdi] - jo OV22 - sar eax, 10 - adc eax, edx - mov [rdi], eax - test ebx, ebx - je L199 - test edx, edx - je L199 - xor ebx, edx - sar ebx, 31 - xor ecx, ebx - add ecx, r8d - mov edx, 1024 - add edx, ebx - cmp ecx, edx - jle L200 - mov ecx, edx -L200: xor ecx, ebx -L199: add rdi, 8 - cmp rdi, rsi ; compare bptr and eptr to see if we're done - jb term_minus_2_loop - jmp term_minus_2_done - -OV21: mov eax, ebx ; restore previous sample into eax - jmp long_term_minus_2_loop - -OV22: mov eax, ebx ; restore previous sample into eax - jmp L294 - - align 64 -long_term_minus_2_loop: - mov ebx, eax - imul ebp - shl edx, 22 - shr eax, 10 - adc eax, edx - mov edx, [rdi+4] - add eax, edx - mov [rdi+4], eax - test ebx, ebx - je L294 - test edx, edx - je L294 - xor ebx, edx - sar ebx, 31 - xor ebp, ebx - add ebp, r8d - mov edx, 1024 - add edx, ebx - cmp ebp, edx - jle L295 - mov ebp, edx -L295: xor ebp, ebx -L294: mov ebx, eax - imul ecx - shl edx, 22 - shr eax, 10 - adc eax, edx - mov edx, [rdi] - add eax, edx - mov [rdi], eax - test ebx, ebx - je L299 - test edx, edx - je L299 - xor ebx, edx - sar ebx, 31 - xor ecx, ebx - add ecx, r8d - mov edx, 1024 - add edx, ebx - cmp ecx, edx - jle L300 - mov ecx, edx -L300: xor ecx, ebx -L299: add rdi, 8 - cmp rdi, rsi ; compare bptr and eptr to see if we're done - jb long_term_minus_2_loop - -term_minus_2_done: - mov rdx, [rsp] ; point to dpp - mov [rdx+8], ecx ; store weights back - mov [rdx+12], ebp - mov eax, [rdi-8] ; dpp->samples_B [0] = bptr [-2]; - mov [rdx+48], eax - jmp done - -; -; registers in term -3 loop: -; -; rdi bptr -; rsi eptr -; -; mm0, mm1 scratch -; mm2 original sample values -; mm3 correlation samples -; mm4 last calculated values (so we don't need to reload) -; mm5 weights -; mm6 delta -; mm7 512 (for rounding) -; - -term_minus_3_entry: - mov eax, 512 - movd mm7, eax - punpckldq mm7, mm7 ; mm7 = round (512) - mov rdx, [rsp] ; set RDX to *dpp - mov eax, [rdx+4] - movd mm6, eax - punpckldq mm6, mm6 ; mm6 = delta (0-7) - mov eax, 0FFFFh ; mask high weights to zero for PMADDWD - movd mm5, eax - punpckldq mm5, mm5 ; mm5 = weight mask 0x0000FFFF0000FFFF - pand mm5, [rdx+8] ; mm5 = weight_AB masked to 16 bits - movq mm4, [rdi-8] - jmp term_minus_3_loop - - align 64 -term_minus_3_loop: - movq mm3, mm4 - psrlq mm3, 32 - punpckldq mm3, mm4 ; mm3 = sam_AB - movq mm1, mm3 - movq mm4, mm3 - pslld mm1, 1 - psrld mm4, 15 - psrlw mm1, 1 - pmaddwd mm4, mm5 - pmaddwd mm1, mm5 - movq mm2, [rdi] ; mm2 = left_right - pslld mm4, 5 - paddd mm1, mm7 ; add 512 for rounding - psrad mm1, 10 - paddd mm4, mm2 - paddd mm4, mm1 ; add shifted sums - movq [rdi], mm4 ; store result - movq mm0, mm3 - pxor mm0, mm2 - psrad mm0, 31 ; mm0 = sign (sam_AB ^ left_right) - add rdi, 8 - pxor mm1, mm1 ; mm1 = zero - pcmpeqd mm2, mm1 ; mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 ; mm3 = 1s if sam_AB was zero - por mm2, mm3 ; mm2 = 1s if either was zero - pandn mm2, mm6 ; mask delta with zeros check - pcmpeqd mm1, mm1 - psubd mm1, mm7 - psubd mm1, mm7 - psubd mm1, mm0 - pxor mm5, mm0 - paddw mm5, mm1 - paddusw mm5, mm2 ; and add to weight_AB - psubw mm5, mm1 - pxor mm5, mm0 - cmp rdi, rsi ; compare bptr and eptr to see if we're done - jb term_minus_3_loop - - pslld mm5, 16 ; sign-extend 16-bit weights back to dwords - psrad mm5, 16 - mov rdx, [rsp] ; point to dpp - movq [rdx+8], mm5 ; put weight_AB back - emms - - mov edx, [rdi-4] ; dpp->samples_A [0] = bptr [-1]; - mov rax, [rsp] - mov [rax+16], edx - mov edx, [rdi-8] ; dpp->samples_B [0] = bptr [-2]; - mov [rax+48], edx - -done: add rsp, 8 ; begin epilog by deallocating stack - pop rsi ; restore non-volatile registers & return - pop rdi - pop rbx - pop rbp - ret - -unpack_decorr_stereo_pass_cont_x64win endp - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; -; This is the mono version of the above function. It does not use MMX and does not -; handle negative terms (since they don't apply to mono), but is otherwise similar. -; -; void unpack_decorr_mono_pass_cont (struct decorr_pass *dpp, -; int32_t *buffer, -; int32_t sample_count, -; int32_t long_math; -; arguments on entry: -; -; rcx struct decorr_pass *dpp -; rdx int32_t *buffer -; r8d int32_t sample_count -; r9d int32_t long_math -; -; registers after entry: -; -; rdi bptr -; rsi eptr -; ecx long_math -; -; stack usage: -; -; [rsp+0] = *dpp -; - -unpack_decorr_mono_pass_cont_x64win proc public frame - push_reg rbp ; save non-volatile registers on stack - push_reg rbx ; (alphabetically) - push_reg rdi - push_reg rsi - alloc_stack 8 ; allocate 8 bytes on stack & align to 16 bytes - end_prologue - - mov [rsp], rcx ; [rsp] = *dpp - mov rdi, rcx ; copy params from win regs to Linux regs - mov rsi, rdx ; so we can leave following code similar - mov rdx, r8 - mov rcx, r9 - - and edx, edx ; if sample_count is zero, do nothing - jz mono_done - - cld - mov rdi, rsi ; rdi = bptr - lea rsi, [rdi+rdx*4] ; rsi = eptr - - mov rax, [rsp] ; get term from dpp struct & vector to handler - mov eax, [rax] - cmp al, 17 - je mono_17_entry - cmp al, 18 - je mono_18_entry - -; -; registers during default term processing loop: -; rdi active buffer pointer -; rsi end of buffer pointer -; r8d delta -; ecx weight_A -; ebx term * -4 -; eax,edx scratch -; - -default_mono_entry: - imul rbx, rax, -4 ; set rbx to term * -4 for decorrelation index - mov rdx, [rsp] - mov ecx, [rdx+8] ; ecx = weight, r8d = delta - mov r8d, [rdx+4] - jmp default_mono_loop - -; -; registers during processing loop for terms 17 & 18: -; rdi active buffer pointer -; rsi end of buffer pointer -; r8d delta -; ecx weight_A -; ebp previously calculated value -; ebx calculated correlation sample -; eax,edx scratch -; - -mono_17_entry: - mov rdx, [rsp] ; rdx = dpp* - mov ecx, [rdx+8] ; ecx = weight, r8d = delta - mov r8d, [rdx+4] - mov ebp, [rdi-4] - jmp mono_17_loop - -mono_18_entry: - mov rdx, [rsp] ; rdx = dpp* - mov ecx, [rdx+8] ; ecx = weight, r8d = delta - mov r8d, [rdx+4] - mov ebp, [rdi-4] - jmp mono_18_loop - - align 64 -default_mono_loop: - mov eax, [rdi+rbx] - imul eax, ecx - mov edx, [rdi] - jo long_default_mono_loop - sar eax, 10 - adc eax, edx - mov [rdi], eax - mov eax, [rdi+rbx] - add rdi, 4 - test edx, edx - je L100 - test eax, eax - je L100 - xor eax, edx - cdq - xor ecx, edx - add ecx, r8d - xor ecx, edx -L100: cmp rdi, rsi ; compare bptr and eptr to see if we're done - jb default_mono_loop - jmp default_mono_done - - align 64 -long_default_mono_loop: - mov eax, [rdi+rbx] - imul ecx - shl edx, 22 - shr eax, 10 - adc eax, edx - mov edx, [rdi] - add eax, edx - mov [rdi], eax - mov eax, [rdi+rbx] - add rdi, 4 - test edx, edx - je L101 - test eax, eax - je L101 - xor eax, edx - cdq - xor ecx, edx - add ecx, r8d - xor ecx, edx -L101: cmp rdi, rsi ; compare bptr and eptr to see if we're done - jb long_default_mono_loop - -default_mono_done: - mov rdx, [rsp] ; edx = dpp* - mov [rdx+8], ecx ; store weight_A back - mov ecx, [rdx] ; ecx = dpp->term - -default_mono_store_samples: - dec ecx - sub rdi, 4 ; back up one full sample - mov eax, [rdi] - mov [rdx+rcx*4+16], eax ; store samples_A [ecx] - test ecx, ecx - jnz default_mono_store_samples - jmp mono_done - - align 64 -mono_17_loop: - lea ebx, [ebp+ebp] - sub ebx, [rdi-8] - mov eax, ecx - imul eax, ebx - mov edx, [rdi] - jo long_mono_17_loop - sar eax, 10 - adc eax, edx - stosd - test ebx, ebx - mov ebp, eax - je L117 - test edx, edx - je L117 - xor ebx, edx - sar ebx, 31 - xor ecx, ebx - add ecx, r8d - xor ecx, ebx -L117: cmp rdi, rsi ; compare bptr and eptr to see if we're done - jb mono_17_loop - jmp mono_1718_exit - - align 64 -long_mono_17_loop: - lea ebx, [ebp+ebp] - sub ebx, [rdi-8] - mov eax, ecx - imul ebx - shl edx, 22 - shr eax, 10 - adc eax, edx - mov edx, [rdi] - add eax, edx - stosd - test ebx, ebx - mov ebp, eax - je L217 - test edx, edx - je L217 - xor ebx, edx - sar ebx, 31 - xor ecx, ebx - add ecx, r8d - xor ecx, ebx -L217: cmp rdi, rsi ; compare bptr and eptr to see if we're done - jb long_mono_17_loop - jmp mono_1718_exit - - align 64 -mono_18_loop: - lea ebx, [ebp+ebp*2] - sub ebx, [rdi-8] - sar ebx, 1 - mov eax, ecx - imul eax, ebx - mov edx, [rdi] - jo long_mono_18_loop - sar eax, 10 - adc eax, edx - stosd - test ebx, ebx - mov ebp, eax - je L118 - test edx, edx - je L118 - xor ebx, edx - sar ebx, 31 - xor ecx, ebx - add ecx, r8d - xor ecx, ebx -L118: cmp rdi, rsi ; compare bptr and eptr to see if we're done - jb mono_18_loop - jmp mono_1718_exit - - align 64 -long_mono_18_loop: - lea ebx, [ebp+ebp*2] - sub ebx, [rdi-8] - sar ebx, 1 - mov eax, ecx - imul ebx - shl edx, 22 - shr eax, 10 - adc eax, edx - mov edx, [rdi] - add eax, edx - stosd - test ebx, ebx - mov ebp, eax - je L218 - test edx, edx - je L218 - xor ebx, edx - sar ebx, 31 - xor ecx, ebx - add ecx, r8d - xor ecx, ebx -L218: cmp rdi, rsi ; compare bptr and eptr to see if we're done - jb long_mono_18_loop - -mono_1718_exit: - mov rdx, [rsp] ; edx = dpp* - mov [rdx+8], ecx ; store weight_A back - mov eax, [rdi-4] ; dpp->samples_A [0] = bptr [-1]; - mov [rdx+16], eax - mov eax, [rdi-8] ; dpp->samples_A [1] = bptr [-2]; - mov [rdx+20], eax - -mono_done: - add rsp, 8 ; begin epilog by deallocating stack - pop rsi ; restore non-volatile registers & return - pop rdi - pop rbx - pop rbp - ret - -unpack_decorr_mono_pass_cont_x64win endp - -asmcode ends - - end - - diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_x86.S b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_x86.S deleted file mode 100644 index 104515b4..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_x86.S +++ /dev/null @@ -1,970 +0,0 @@ -############################################################################ -## **** WAVPACK **** ## -## Hybrid Lossless Wavefile Compressor ## -## Copyright (c) 1998 - 2015 Conifer Software. ## -## All Rights Reserved. ## -## Distributed under the BSD Software License (see license.txt) ## -############################################################################ - - .intel_syntax noprefix - .text - - .globl _unpack_decorr_stereo_pass_cont_x86 - .globl _unpack_decorr_mono_pass_cont_x86 - .globl _unpack_cpu_has_feature_x86 - - .globl unpack_decorr_stereo_pass_cont_x86 - .globl unpack_decorr_mono_pass_cont_x86 - .globl unpack_cpu_has_feature_x86 - - -# This module contains X86 assembly optimized versions of functions required -# to decode WavPack files. Note that the stereo versions of these functions -# use the MMX registers and instructions of the X86 processor, and so a -# helper function is provided to make a runtime check for that feature. - -# This is an assembly optimized version of the following WavPack function: -# -# void unpack_decorr_stereo_pass_cont (struct decorr_pass *dpp, -# int32_t *buffer, -# int32_t sample_count, -# int32_t long_math; -# -# It performs a single pass of stereo decorrelation on the provided buffer. -# Note that this version of the function requires that up to 8 previous -# stereo samples are visible and correct. In other words, it ignores the -# "samples_*" fields in the decorr_pass structure and gets the history data -# directly from the buffer. It does, however, return the appropriate history -# samples to the decorr_pass structure before returning. -# -# The "long_math" argument is used to specify that a 32-bit multiply is -# not enough for the "apply_weight" operation (although in this case it -# would only apply to the -1 and -2 terms because the MMX code does not have -# this limitation) but we ignore the parameter and use the overflow detection -# of the "imul" instruction to switch automatically to the "long_math" loop. -# -# This is written to work on an IA-32 processor and uses the MMX extensions -# to improve the performance by processing both stereo channels together. -# For terms -1 and -2 the MMX extensions are not usable, and so these are -# performed independently without them. -# -# arguments on entry: -# -# struct decorr_pass *dpp [ebp+8] -# int32_t *buffer [ebp+12] -# int32_t sample_count [ebp+16] -# int32_t long_math [ebp+20] -# -# registers after entry: -# -# rdi bptr -# rsi eptr -# -# on stack (used for terms -1 and -2 only): -# -# int32_t delta DWORD [esp] -# - -_unpack_decorr_stereo_pass_cont_x86: -unpack_decorr_stereo_pass_cont_x86: - push ebp - mov ebp, esp - push ebx - push esi - push edi - - mov edx, [ebp+8] # copy delta from dpp to top of stack - mov eax, [edx+4] - push eax - - mov edi, [ebp+12] # edi = buffer - mov eax, [ebp+16] # get sample_count and divide by 8 - shl eax, 3 - jz done # exit now if there's nothing to do - - add eax, edi # else add to buffer point to make eptr - mov esi, eax - - mov eax, [ebp+8] # get term from dpp and vector appropriately - mov eax, [eax] - cmp eax, 17 - je term_17_entry - cmp eax, 18 - je term_18_entry - cmp eax, -1 - je term_minus_1_entry - cmp eax, -2 - je term_minus_2_entry - cmp eax, -3 - je term_minus_3_entry - -# -# registers during default term processing loop: -# edi active buffer pointer -# esi end of buffer pointer -# -# MMX: -# mm0, mm1 scratch -# mm2 original sample values -# mm3 correlation samples -# mm4 zero (for pcmpeqd) -# mm5 weights -# mm6 delta -# mm7 512 (for rounding) -# - -default_term_entry: - imul ebx, eax, -8 # set ebx to term * -8 for decorrelation index - mov eax, 512 - movd mm7, eax - punpckldq mm7, mm7 # mm7 = round (512) - mov edx, [ebp+8] # edx = *dpp - mov eax, [edx+4] - movd mm6, eax - punpckldq mm6, mm6 # mm6 = delta (0-7) - mov eax, 0xFFFF # mask high weights to zero for PMADDWD - movd mm5, eax - punpckldq mm5, mm5 # mm5 = weight mask 0x0000FFFF0000FFFF - pand mm5, [edx+8] # mm5 = weight_AB masked to 16 bits - pxor mm4, mm4 # mm4 = zero (for pcmpeqd) - jmp default_term_loop - - .balign 64 -default_term_loop: - movq mm3, [edi+ebx] # mm3 = sam_AB - movq mm1, mm3 - movq mm0, mm3 - paddd mm1, mm1 - psrld mm0, 15 - psrlw mm1, 1 - pmaddwd mm0, mm5 - pmaddwd mm1, mm5 - movq mm2, [edi] # mm2 = left_right - pslld mm0, 5 - paddd mm1, mm7 # add 512 for rounding - psrad mm1, 10 - paddd mm0, mm2 - paddd mm0, mm1 # add shifted sums - movq [edi], mm0 # store result - movq mm0, mm3 - pxor mm0, mm2 - psrad mm0, 31 # mm0 = sign (sam_AB ^ left_right) - add edi, 8 - pcmpeqd mm2, mm4 # mm2 = 1s if left_right was zero - pcmpeqd mm3, mm4 # mm3 = 1s if sam_AB was zero - por mm2, mm3 # mm2 = 1s if either was zero - pandn mm2, mm6 # mask delta with zeros check - pxor mm5, mm0 - paddw mm5, mm2 # and add to weight_AB - pxor mm5, mm0 - cmp edi, esi # compare bptr and eptr to see if we're done - jb default_term_loop - - pslld mm5, 16 # sign-extend 16-bit weights back to dwords - psrad mm5, 16 - mov eax, [ebp+8] # point to dpp - movq [eax+8], mm5 # put weight_AB back - emms - mov edx, [ebp+8] # access dpp with edx - mov ecx, [edx] # ecx = dpp->term - -default_store_samples: - dec ecx - sub edi, 8 # back up one full sample - mov eax, [edi+4] - mov [edx+ecx*4+48], eax # store samples_B [ecx] - mov eax, [edi] - mov [edx+ecx*4+16], eax # store samples_A [ecx] - test ecx, ecx - jnz default_store_samples - - jmp done - -# -# registers during processing loop for terms 17 & 18: -# edi active buffer pointer -# esi end of buffer pointer -# -# MMX: -# mm0, mm1 scratch -# mm2 original sample values -# mm3 calculated correlation samples -# mm4 last calculated values (so we don't need to reload) -# mm5 weights -# mm6 delta -# mm7 512 (for rounding) -# - -term_17_entry: - mov eax, 512 - movd mm7, eax - punpckldq mm7, mm7 # mm7 = round (512) - mov edx, [ebp+8] # point to dpp & get delta - mov eax, [edx+4] - movd mm6, eax - punpckldq mm6, mm6 # mm6 = delta (0-7) - mov eax, 0xFFFF # mask high weights to zero for PMADDWD - movd mm5, eax - punpckldq mm5, mm5 # mm5 = weight mask 0x0000FFFF0000FFFF - pand mm5, [edx+8] # mm5 = weight_AB masked to 16 bits - movq mm4, [edi-8] # preload previous calculated values - jmp term_17_loop - - .balign 64 -term_17_loop: - paddd mm4, mm4 - psubd mm4, [edi-16] # mm3 = sam_AB - movq mm3, mm4 - movq mm1, mm3 - paddd mm1, mm1 - psrld mm4, 15 - psrlw mm1, 1 - pmaddwd mm4, mm5 - pmaddwd mm1, mm5 - movq mm2, [edi] # mm2 = left_right - pslld mm4, 5 - paddd mm1, mm7 # add 512 for rounding - psrad mm1, 10 - paddd mm4, mm2 - paddd mm4, mm1 # add shifted sums - movq mm0, mm3 - movq [edi], mm4 # store result - pxor mm0, mm2 - psrad mm0, 31 # mm0 = sign (sam_AB ^ left_right) - add edi, 8 - pxor mm1, mm1 # mm1 = zero - pcmpeqd mm2, mm1 # mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 # mm3 = 1s if sam_AB was zero - por mm2, mm3 # mm2 = 1s if either was zero - pandn mm2, mm6 # mask delta with zeros check - pxor mm5, mm0 - paddw mm5, mm2 # and add to weight_AB - pxor mm5, mm0 - cmp edi, esi # compare bptr and eptr to see if we're done - jb term_17_loop - - pslld mm5, 16 # sign-extend 16-bit weights back to dwords - psrad mm5, 16 - mov eax, [ebp+8] # point to dpp - movq [eax+8], mm5 # put weight_AB back - emms - jmp term_1718_exit - -term_18_entry: - mov eax, 512 - movd mm7, eax - punpckldq mm7, mm7 # mm7 = round (512) - mov edx, [ebp+8] # point to dpp & get delta - mov eax, [edx+4] - movd mm6, eax - punpckldq mm6, mm6 # mm6 = delta (0-7) - mov eax, 0xFFFF # mask high weights to zero for PMADDWD - movd mm5, eax - punpckldq mm5, mm5 # mm5 = weight mask 0x0000FFFF0000FFFF - pand mm5, [edx+8] # mm5 = weight_AB masked to 16 bits - movq mm4, [edi-8] # preload previous calculated value - jmp term_18_loop - - .balign 64 -term_18_loop: - movq mm3, mm4 - psubd mm3, [edi-16] - psrad mm3, 1 - paddd mm3, mm4 # mm3 = sam_AB - movq mm1, mm3 - movq mm4, mm3 - paddd mm1, mm1 - psrld mm4, 15 - psrlw mm1, 1 - pmaddwd mm4, mm5 - pmaddwd mm1, mm5 - movq mm2, [edi] # mm2 = left_right - pslld mm4, 5 - paddd mm1, mm7 # add 512 for rounding - psrad mm1, 10 - paddd mm4, mm2 - paddd mm4, mm1 # add shifted sums - movq mm0, mm3 - movq [edi], mm4 # store result - pxor mm0, mm2 - psrad mm0, 31 # mm0 = sign (sam_AB ^ left_right) - add edi, 8 - pxor mm1, mm1 # mm1 = zero - pcmpeqd mm2, mm1 # mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 # mm3 = 1s if sam_AB was zero - por mm2, mm3 # mm2 = 1s if either was zero - pandn mm2, mm6 # mask delta with zeros check - pxor mm5, mm0 - paddw mm5, mm2 # and add to weight_AB - pxor mm5, mm0 - cmp edi, esi # compare bptr and eptr to see if we're done - jb term_18_loop - - pslld mm5, 16 # sign-extend 16-bit weights back to dwords - psrad mm5, 16 - mov eax, [ebp+8] # point to dpp - movq [eax+8], mm5 # put weight_AB back - emms - -term_1718_exit: - mov edx, [edi-4] # dpp->samples_B [0] = bptr [-1]; - mov eax, [ebp+8] - mov [eax+48], edx - mov edx, [edi-8] # dpp->samples_A [0] = bptr [-2]; - mov [eax+16], edx - mov edx, [edi-12] # dpp->samples_B [1] = bptr [-3]; - mov [eax+52], edx - mov edx, [edi-16] # dpp->samples_A [1] = bptr [-4]; - mov [eax+20], edx - jmp done - -# -# registers in term -1 & -2 loops: -# -# eax,ebx,edx scratch -# ecx weight_A -# ebp weight_B -# edi bptr -# esi eptr -# - -term_minus_1_entry: - cld # we use stosd here... - mov eax, [ebp+8] # point to dpp - mov ecx, [eax+8] # ecx = weight_A and ebp = weight_B - mov ebp, [eax+12] - mov eax, [edi-4] - jmp term_minus_1_loop - - .balign 64 -term_minus_1_loop: - mov ebx, eax - imul eax, ecx - mov edx, [edi] - jo OV11 - sar eax, 10 - adc eax, edx - stosd - test ebx, ebx - je L182 - test edx, edx - je L182 - xor ebx, edx - sar ebx, 31 - xor ecx, ebx - add ecx, [esp] - mov edx, 1024 - add edx, ebx - cmp ecx, edx - jle L183 - mov ecx, edx -L183: xor ecx, ebx -L182: mov ebx, eax - imul eax, ebp - mov edx, [edi] - jo OV12 - sar eax, 10 - adc eax, edx - stosd - test ebx, ebx - je L189 - test edx, edx - je L189 - xor ebx, edx - sar ebx, 31 - xor ebp, ebx - add ebp, [esp] - mov edx, 1024 - add edx, ebx - cmp ebp, edx - jle L188 - mov ebp, edx -L188: xor ebp, ebx -L189: cmp edi, esi # compare bptr and eptr to see if we're done - jb term_minus_1_loop - jmp term_minus_1_done - -OV11: mov eax, ebx # restore previous sample into eax - jmp long_term_minus_1_loop - -OV12: mov eax, ebx # restore previous sample into eax - jmp L282 - - .balign 64 -long_term_minus_1_loop: - mov ebx, eax - imul ecx - shl edx, 22 - shr eax, 10 - adc eax, edx - mov edx, [edi] - add eax, edx - stosd - test ebx, ebx - je L282 - test edx, edx - je L282 - xor ebx, edx - sar ebx, 31 - xor ecx, ebx - add ecx, [esp] - mov edx, 1024 - add edx, ebx - cmp ecx, edx - jle L283 - mov ecx, edx -L283: xor ecx, ebx -L282: mov ebx, eax - imul ebp - shl edx, 22 - shr eax, 10 - adc eax, edx - mov edx, [edi] - add eax, edx - stosd - test ebx, ebx - je L289 - test edx, edx - je L289 - xor ebx, edx - sar ebx, 31 - xor ebp, ebx - add ebp, [esp] - mov edx, 1024 - add edx, ebx - cmp ebp, edx - jle L288 - mov ebp, edx -L288: xor ebp, ebx -L289: cmp edi, esi # compare bptr and eptr to see if we're done - jb long_term_minus_1_loop - -term_minus_1_done: - mov edx, ebp - mov ebp, esp # restore ebp (we've pushed 4 DWORDS) - add ebp, 16 - mov eax, [ebp+8] # point to dpp - mov [eax+8], ecx - mov [eax+12], edx - mov edx, [edi-4] # dpp->samples_A [0] = bptr [-1] - mov [eax+16], edx - jmp done - - -term_minus_2_entry: - mov eax, [ebp+8] # point to dpp - mov ecx, [eax+8] # ecx = weight_A and ebp = weight_B - mov ebp, [eax+12] - mov eax, [edi-8] - jmp term_minus_2_loop - - .balign 64 -term_minus_2_loop: - mov ebx, eax - imul eax, ebp - mov edx, [edi+4] - jo OV21 - sar eax, 10 - adc eax, edx - mov [edi+4], eax - test ebx, ebx - je L194 - test edx, edx - je L194 - xor ebx, edx - sar ebx, 31 - xor ebp, ebx - add ebp, [esp] - mov edx, 1024 - add edx, ebx - cmp ebp, edx - jle L195 - mov ebp, edx -L195: xor ebp, ebx -L194: mov ebx, eax - imul eax, ecx - mov edx, [edi] - jo OV22 - sar eax, 10 - adc eax, edx - mov [edi], eax - add edi, 8 - test ebx, ebx - je L201 - test edx, edx - je L201 - xor ebx, edx - sar ebx, 31 - xor ecx, ebx - add ecx, [esp] - mov edx, 1024 - add edx, ebx - cmp ecx, edx - jle L200 - mov ecx, edx -L200: xor ecx, ebx -L201: cmp edi, esi # compare bptr and eptr to see if we're done - jb term_minus_2_loop - jmp term_minus_2_done - -OV21: mov eax, ebx # restore previous sample into eax - jmp long_term_minus_2_loop - -OV22: mov eax, ebx # restore previous sample into eax - jmp L294 - - .balign 64 -long_term_minus_2_loop: - mov ebx, eax - imul ebp - shl edx, 22 - shr eax, 10 - adc eax, edx - mov edx, [edi+4] - add eax, edx - mov [edi+4], eax - test ebx, ebx - je L294 - test edx, edx - je L294 - xor ebx, edx - sar ebx, 31 - xor ebp, ebx - add ebp, [esp] - mov edx, 1024 - add edx, ebx - cmp ebp, edx - jle L295 - mov ebp, edx -L295: xor ebp, ebx -L294: mov ebx, eax - imul ecx - shl edx, 22 - shr eax, 10 - adc eax, edx - mov edx, [edi] - add eax, edx - mov [edi], eax - add edi, 8 - test ebx, ebx - je L301 - test edx, edx - je L301 - xor ebx, edx - sar ebx, 31 - xor ecx, ebx - add ecx, [esp] - mov edx, 1024 - add edx, ebx - cmp ecx, edx - jle L300 - mov ecx, edx -L300: xor ecx, ebx -L301: cmp edi, esi # compare bptr and eptr to see if we're done - jb long_term_minus_2_loop - -term_minus_2_done: - mov edx, ebp - lea ebp, [esp+16] # restore ebp (we've pushed 4 DWORDS) - mov eax, [ebp+8] # point to dpp - mov [eax+8], ecx - mov [eax+12], edx - mov edx, [edi-8] # dpp->samples_B [0] = bptr [-2]; - mov [eax+48], edx - jmp done - -# -# registers during processing loop for term -3: -# edi active buffer pointer -# esi end of buffer pointer -# -# MMX: -# mm0, mm1 scratch -# mm2 original sample values -# mm3 calculated correlation samples -# mm4 last calculated values (so we don't need to reload) -# mm5 weights -# mm6 delta -# mm7 512 (for rounding) -# - -term_minus_3_entry: - mov eax, 512 - movd mm7, eax - punpckldq mm7, mm7 # mm7 = round (512) - mov edx, [ebp+8] # point to dpp & get delta - mov eax, [edx+4] - movd mm6, eax - punpckldq mm6, mm6 # mm6 = delta (0-7) - mov eax, 0xFFFF # mask high weights to zero for PMADDWD - movd mm5, eax - punpckldq mm5, mm5 # mm5 = weight mask 0x0000FFFF0000FFFF - pand mm5, [edx+8] # mm5 = weight_AB masked to 16 bits - movq mm4, [edi-8] # preload previous calculated values - jmp term_minus_3_loop - - .balign 64 -term_minus_3_loop: - movq mm3, mm4 # mm3 = swap dwords (mm4) - psrlq mm3, 32 - punpckldq mm3, mm4 # mm3 = sam_AB - movq mm1, mm3 - movq mm4, mm3 - pslld mm1, 1 - psrld mm4, 15 - psrlw mm1, 1 - pmaddwd mm4, mm5 - pmaddwd mm1, mm5 - movq mm2, [edi] # mm2 = left_right - pslld mm4, 5 - paddd mm1, mm7 # add 512 for rounding - psrad mm1, 10 - paddd mm4, mm2 - paddd mm4, mm1 # add shifted sums - movq [edi], mm4 # store result - movq mm0, mm3 - pxor mm0, mm2 - psrad mm0, 31 # mm0 = sign (sam_AB ^ left_right) - add edi, 8 - pxor mm1, mm1 # mm1 = zero - pcmpeqd mm2, mm1 # mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 # mm3 = 1s if sam_AB was zero - por mm2, mm3 # mm2 = 1s if either was zero - pandn mm2, mm6 # mask delta with zeros check - pcmpeqd mm1, mm1 - psubd mm1, mm7 - psubd mm1, mm7 - psubd mm1, mm0 - pxor mm5, mm0 - paddw mm5, mm1 - paddusw mm5, mm2 # and add to weight_AB - psubw mm5, mm1 - pxor mm5, mm0 - cmp edi, esi # compare bptr and eptr to see if we're done - jb term_minus_3_loop - - pslld mm5, 16 # sign-extend 16-bit weights back to dwords - psrad mm5, 16 - mov eax, [ebp+8] # point to dpp - movq [eax+8], mm5 # put weight_AB back - emms - mov edx, [edi-4] # dpp->samples_A [0] = bptr [-1]; - mov eax, [ebp+8] - mov [eax+16], edx - mov edx, [edi-8] # dpp->samples_B [0] = bptr [-2]; - mov [eax+48], edx - -done: pop eax # pop delta & saved regs - pop edi - pop esi - pop ebx - pop ebp - ret - -####################################################################################################################### -# -# This is the mono version of the above function. It does not use MMX and does not handle negative terms. -# -# void unpack_decorr_mono_pass_cont (struct decorr_pass *dpp, -# int32_t *buffer, -# int32_t sample_count, -# int32_t long_math; -# arguments on entry: -# -# struct decorr_pass *dpp [ebp+8] -# int32_t *buffer [ebp+12] -# int32_t sample_count [ebp+16] -# int32_t long_math [ebp+20] -# -# registers after entry: -# -# rdi bptr -# rsi eptr -# -# on stack: -# -# int16_t delta DWORD [esp] -# - -_unpack_decorr_mono_pass_cont_x86: -unpack_decorr_mono_pass_cont_x86: - push ebp - mov ebp, esp - push ebx - push esi - push edi - cld - - mov edx, [ebp+8] # copy delta from dpp to local stack - mov eax, [edx+4] - push eax - - mov edi, [ebp+12] # edi = buffer - mov eax, [ebp+16] # get sample_count and multiply by 4 - shl eax, 2 - jz mono_done # exit now if there's nothing to do - lea esi, [edi+eax] # else add to buffer point to make eptr - - mov eax, [ebp+8] # get term from dpp and vector appropriately - mov eax, [eax] - cmp eax, 17 - je mono_17_entry - cmp eax, 18 - je mono_18_entry - -# -# registers during default term processing loop: -# edi active buffer pointer -# esi end of buffer pointer -# ecx weight_A -# ebp free -# ebx term * -4 -# eax,edx scratch -# - -default_mono_entry: - imul ebx, eax, -4 # set ebx to term * -4 for decorrelation index - mov edx, [ebp+8] # edx = dpp* - mov ecx, [edx+8] # ecx = weight - jmp default_mono_loop - -# -# registers during processing loop for terms 17 & 18: -# edi active buffer pointer -# esi end of buffer pointer -# ecx weight_A -# ebp previously calculated value -# ebx calculated correlation sample -# eax,edx scratch -# - -mono_17_entry: - mov edx, [ebp+8] # edx = dpp* - mov ecx, [edx+8] # ecx = weight_A - mov ebp, [edi-4] - jmp mono_17_loop - -mono_18_entry: - mov edx, [ebp+8] # edx = dpp* - mov ecx, [edx+8] # ecx = weight_A - mov ebp, [edi-4] - jmp mono_18_loop - - .balign 64 -default_mono_loop: - mov eax, [edi+ebx] - imul eax, ecx - mov edx, [edi] - jo long_default_mono_loop - sar eax, 10 - adc eax, edx - mov [edi], eax - mov eax, [edi+ebx] - add edi, 4 - test edx, edx - je L100 - test eax, eax - je L100 - xor eax, edx - cdq - xor ecx, edx - add ecx, [esp] - xor ecx, edx -L100: cmp edi, esi # compare bptr and eptr to see if we're done - jb default_mono_loop - jmp default_mono_done - - .balign 64 -long_default_mono_loop: - mov eax, [edi+ebx] - imul ecx - shl edx, 22 - shr eax, 10 - adc eax, edx - mov edx, [edi] - add eax, edx - mov [edi], eax - mov eax, [edi+ebx] - add edi, 4 - test edx, edx - je L101 - test eax, eax - je L101 - xor eax, edx - cdq - xor ecx, edx - add ecx, [esp] - xor ecx, edx -L101: cmp edi, esi # compare bptr and eptr to see if we're done - jb long_default_mono_loop - -default_mono_done: - mov edx, [ebp+8] # edx = dpp* - mov [edx+8], ecx # store weight_A back - mov ecx, [edx] # ecx = dpp->term - -default_mono_store_samples: - dec ecx - sub edi, 4 # back up one full sample - mov eax, [edi] - mov [edx+ecx*4+16], eax # store samples_A [ecx] - test ecx, ecx - jnz default_mono_store_samples - jmp mono_done - - .balign 64 -mono_17_loop: - lea ebx, [ebp+ebp] - sub ebx, [edi-8] - mov eax, ecx - imul eax, ebx - mov edx, [edi] - jo long_mono_17_loop - sar eax, 10 - adc eax, edx - stosd - test ebx, ebx - mov ebp, eax - je L117 - test edx, edx - je L117 - mov eax, [esp] - xor ebx, edx - sar ebx, 31 - xor eax, ebx - sub eax, ebx - add ecx, eax -L117: cmp edi, esi # compare bptr and eptr to see if we're done - jb mono_17_loop - jmp mono_1718_exit - - .balign 64 -long_mono_17_loop: - lea ebx, [ebp+ebp] - sub ebx, [edi-8] - mov eax, ecx - imul ebx - shl edx, 22 - shr eax, 10 - adc eax, edx - mov edx, [edi] - add eax, edx - stosd - test ebx, ebx - mov ebp, eax - je L217 - test edx, edx - je L217 - mov eax, [esp] - xor ebx, edx - sar ebx, 31 - xor eax, ebx - sub eax, ebx - add ecx, eax -L217: cmp edi, esi # compare bptr and eptr to see if we're done - jb long_mono_17_loop - jmp mono_1718_exit - - .balign 64 -mono_18_loop: - lea ebx, [ebp+ebp*2] - sub ebx, [edi-8] - sar ebx, 1 - mov eax, ecx - imul eax, ebx - mov edx, [edi] - jo long_mono_18_loop - sar eax, 10 - adc eax, edx - stosd - test ebx, ebx - mov ebp, eax - je L118 - test edx, edx - je L118 - mov eax, [esp] - xor ebx, edx - sar ebx, 31 - xor eax, ebx - sub eax, ebx - add ecx, eax -L118: cmp edi, esi # compare bptr and eptr to see if we're done - jb mono_18_loop - jmp mono_1718_exit - - .balign 64 -long_mono_18_loop: - lea ebx, [ebp+ebp*2] - sub ebx, [edi-8] - sar ebx, 1 - mov eax, ecx - imul ebx - shl edx, 22 - shr eax, 10 - adc eax, edx - mov edx, [edi] - add eax, edx - stosd - test ebx, ebx - mov ebp, eax - je L218 - test edx, edx - je L218 - mov eax, [esp] - xor ebx, edx - sar ebx, 31 - xor eax, ebx - sub eax, ebx - add ecx, eax -L218: cmp edi, esi # compare bptr and eptr to see if we're done - jb long_mono_18_loop - -mono_1718_exit: - lea ebp, [esp+16] # restore ebp (we've pushed 4 DWORDS) - mov edx, [ebp+8] # edx = dpp* - mov [edx+8], ecx # store weight_A back - mov eax, [edi-4] # dpp->samples_A [0] = bptr [-1]; - mov [edx+16], eax - mov eax, [edi-8] # dpp->samples_A [1] = bptr [-2]; - mov [edx+20], eax - -mono_done: - pop eax # pop delta & saved regs - pop edi - pop esi - pop ebx - pop ebp - ret - -# Helper function to determine if specified CPU feature is available (used here for MMX). -# Input parameter is index of feature to be checked (EDX from CPUID(1) only, MMX = 23). -# Return value is the specified bit (0 or 1) or 0 if CPUID is not supported. - -_unpack_cpu_has_feature_x86: -unpack_cpu_has_feature_x86: - pushfd # save eflags - pushfd # push another copy - xor dword ptr [esp], 0x200000 # toggle ID bit on stack & pop it back into eflags - popfd - pushfd # store possibly modified eflags - pop eax # and pop back into eax - xor eax, [esp] # compare to original pushed eflags - popfd # restore original eflags - and eax, 0x200000 # eax = 1 if eflags ID bit was changable - jz oldcpu # return zero if CPUID is not available (wow!) - - push ebx # we must save ebx - mov eax, 1 # do cpuid (1) to get features into edx - cpuid - mov eax, edx # copy into eax for shift - mov cl, [esp+8] # get parameter and shift that bit index into LSB - sar eax, cl - and eax, 1 - pop ebx # restore ebx and return 0 or 1 - -oldcpu: ret # return value in eax - -#ifdef __ELF__ - .section .note.GNU-stack,"",@progbits -#endif - diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_x86.asm b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_x86.asm deleted file mode 100644 index 1d991554..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/unpack_x86.asm +++ /dev/null @@ -1,958 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; **** WAVPACK **** ;; -;; Hybrid Lossless Wavefile Compressor ;; -;; Copyright (c) 1998 - 2015 Conifer Software. ;; -;; All Rights Reserved. ;; -;; Distributed under the BSD Software License (see license.txt) ;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - .686 - .mmx - .model flat -asmcode segment page 'CODE' - public _unpack_decorr_stereo_pass_cont_x86 - public _unpack_decorr_mono_pass_cont_x86 - public _unpack_cpu_has_feature_x86 - -; This is an assembly optimized version of the following WavPack function: -; -; void unpack_decorr_stereo_pass_cont (struct decorr_pass *dpp, -; int32_t *buffer, -; int32_t sample_count, -; int32_t long_math; -; -; It performs a single pass of stereo decorrelation on the provided buffer. -; Note that this version of the function requires that up to 8 previous -; stereo samples are visible and correct. In other words, it ignores the -; "samples_*" fields in the decorr_pass structure and gets the history data -; directly from the buffer. It does, however, return the appropriate history -; samples to the decorr_pass structure before returning. -; -; The "long_math" argument is used to specify that a 32-bit multiply is -; not enough for the "apply_weight" operation (although in this case it -; would only apply to the -1 and -2 terms because the MMX code does not have -; this limitation) but we ignore the parameter and use the overflow detection -; of the "imul" instruction to switch automatically to the "long_math" loop. -; -; This is written to work on an IA-32 processor and uses the MMX extensions -; to improve the performance by processing both stereo channels together. -; For terms -1 and -2 the MMX extensions are not usable, and so these are -; performed independently without them. -; -; arguments on entry: -; -; struct decorr_pass *dpp [ebp+8] -; int32_t *buffer [ebp+12] -; int32_t sample_count [ebp+16] -; int32_t long_math [ebp+20] -; -; registers after entry: -; -; rdi bptr -; rsi eptr -; -; on stack (used for terms -1 and -2 only): -; -; int32_t delta DWORD [esp] -; - -_unpack_decorr_stereo_pass_cont_x86: - push ebp - mov ebp, esp - push ebx - push esi - push edi - - mov edx, [ebp+8] ; copy delta from dpp to top of stack - mov eax, [edx+4] - push eax - - mov edi, [ebp+12] ; edi = buffer - mov eax, [ebp+16] ; get sample_count and divide by 8 - sal eax, 3 - jz done ; exit now if there's nothing to do - - add eax, edi ; else add to buffer point to make eptr - mov esi, eax - - mov eax, [ebp+8] ; get term from dpp and vector appropriately - mov eax, [eax] - cmp eax, 17 - je term_17_entry - cmp eax, 18 - je term_18_entry - cmp eax, -1 - je term_minus_1_entry - cmp eax, -2 - je term_minus_2_entry - cmp eax, -3 - je term_minus_3_entry - -; -; registers during default term processing loop: -; edi active buffer pointer -; esi end of buffer pointer -; -; MMX: -; mm0, mm1 scratch -; mm2 original sample values -; mm3 correlation samples -; mm4 zero (for pcmpeqd) -; mm5 weights -; mm6 delta -; mm7 512 (for rounding) -; - -default_term_entry: - imul ebx, eax, -8 ; set ebx to term * -8 for decorrelation index - mov eax, 512 - movd mm7, eax - punpckldq mm7, mm7 ; mm7 = round (512) - mov edx, [ebp+8] ; edx = *dpp - mov eax, [edx+4] - movd mm6, eax - punpckldq mm6, mm6 ; mm6 = delta (0-7) - mov eax, 0FFFFh ; mask high weights to zero for PMADDWD - movd mm5, eax - punpckldq mm5, mm5 ; mm5 = weight mask 0x0000FFFF0000FFFF - pand mm5, [edx+8] ; mm5 = weight_AB masked to 16 bits - pxor mm4, mm4 ; mm4 = zero (for pcmpeqd) - jmp default_term_loop - - align 64 -default_term_loop: - movq mm3, [edi+ebx] ; mm3 = sam_AB - movq mm1, mm3 - movq mm0, mm3 - paddd mm1, mm1 - psrld mm0, 15 - psrlw mm1, 1 - pmaddwd mm0, mm5 - pmaddwd mm1, mm5 - movq mm2, [edi] ; mm2 = left_right - pslld mm0, 5 - paddd mm1, mm7 ; add 512 for rounding - psrad mm1, 10 - paddd mm0, mm2 - paddd mm0, mm1 ; add shifted sums - movq [edi], mm0 ; store result - movq mm0, mm3 - pxor mm0, mm2 - psrad mm0, 31 ; mm0 = sign (sam_AB ^ left_right) - add edi, 8 - pcmpeqd mm2, mm4 ; mm2 = 1s if left_right was zero - pcmpeqd mm3, mm4 ; mm3 = 1s if sam_AB was zero - por mm2, mm3 ; mm2 = 1s if either was zero - pandn mm2, mm6 ; mask delta with zeros check - pxor mm5, mm0 - paddw mm5, mm2 ; and add to weight_AB - pxor mm5, mm0 - cmp edi, esi ; compare bptr and eptr to see if we're done - jb default_term_loop - - pslld mm5, 16 ; sign-extend 16-bit weights back to dwords - psrad mm5, 16 - mov eax, [ebp+8] ; point to dpp - movq [eax+8], mm5 ; put weight_AB back - emms - mov edx, [ebp+8] ; access dpp with edx - mov ecx, [edx] ; ecx = dpp->term - -default_store_samples: - dec ecx - sub edi, 8 ; back up one full sample - mov eax, [edi+4] - mov [edx+ecx*4+48], eax ; store samples_B [ecx] - mov eax, [edi] - mov [edx+ecx*4+16], eax ; store samples_A [ecx] - test ecx, ecx - jnz default_store_samples - - jmp done - -; -; registers during processing loop for terms 17 & 18: -; edi active buffer pointer -; esi end of buffer pointer -; -; MMX: -; mm0, mm1 scratch -; mm2 original sample values -; mm3 calculated correlation samples -; mm4 last calculated values (so we don't need to reload) -; mm5 weights -; mm6 delta -; mm7 512 (for rounding) -; - -term_17_entry: - mov eax, 512 - movd mm7, eax - punpckldq mm7, mm7 ; mm7 = round (512) - mov edx, [ebp+8] ; point to dpp & get delta - mov eax, [edx+4] - movd mm6, eax - punpckldq mm6, mm6 ; mm6 = delta (0-7) - mov eax, 0FFFFh ; mask high weights to zero for PMADDWD - movd mm5, eax - punpckldq mm5, mm5 ; mm5 = weight mask 0x0000FFFF0000FFFF - pand mm5, [edx+8] ; mm5 = weight_AB masked to 16 bits - movq mm4, [edi-8] ; preload previous calculated values - jmp term_17_loop - - align 64 -term_17_loop: - paddd mm4, mm4 - psubd mm4, [edi-16] ; mm3 = sam_AB - movq mm3, mm4 - movq mm1, mm3 - paddd mm1, mm1 - psrld mm4, 15 - psrlw mm1, 1 - pmaddwd mm4, mm5 - pmaddwd mm1, mm5 - movq mm2, [edi] ; mm2 = left_right - pslld mm4, 5 - paddd mm1, mm7 ; add 512 for rounding - psrad mm1, 10 - paddd mm4, mm2 - paddd mm4, mm1 ; add shifted sums - movq mm0, mm3 - movq [edi], mm4 ; store result - pxor mm0, mm2 - psrad mm0, 31 ; mm0 = sign (sam_AB ^ left_right) - add edi, 8 - pxor mm1, mm1 ; mm1 = zero - pcmpeqd mm2, mm1 ; mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 ; mm3 = 1s if sam_AB was zero - por mm2, mm3 ; mm2 = 1s if either was zero - pandn mm2, mm6 ; mask delta with zeros check - pxor mm5, mm0 - paddw mm5, mm2 ; and add to weight_AB - pxor mm5, mm0 - cmp edi, esi ; compare bptr and eptr to see if we're done - jb term_17_loop - - pslld mm5, 16 ; sign-extend 16-bit weights back to dwords - psrad mm5, 16 - mov eax, [ebp+8] ; point to dpp - movq [eax+8], mm5 ; put weight_AB back - emms - jmp term_1718_exit - -term_18_entry: - mov eax, 512 - movd mm7, eax - punpckldq mm7, mm7 ; mm7 = round (512) - mov edx, [ebp+8] ; point to dpp & get delta - mov eax, [edx+4] - movd mm6, eax - punpckldq mm6, mm6 ; mm6 = delta (0-7) - mov eax, 0FFFFh ; mask high weights to zero for PMADDWD - movd mm5, eax - punpckldq mm5, mm5 ; mm5 = weight mask 0x0000FFFF0000FFFF - pand mm5, [edx+8] ; mm5 = weight_AB masked to 16 bits - movq mm4, [edi-8] ; preload previous calculated value - jmp term_18_loop - - align 64 -term_18_loop: - movq mm3, mm4 - psubd mm3, [edi-16] - psrad mm3, 1 - paddd mm3, mm4 ; mm3 = sam_AB - movq mm1, mm3 - movq mm4, mm3 - paddd mm1, mm1 - psrld mm4, 15 - psrlw mm1, 1 - pmaddwd mm4, mm5 - pmaddwd mm1, mm5 - movq mm2, [edi] ; mm2 = left_right - pslld mm4, 5 - paddd mm1, mm7 ; add 512 for rounding - psrad mm1, 10 - paddd mm4, mm2 - paddd mm4, mm1 ; add shifted sums - movq mm0, mm3 - movq [edi], mm4 ; store result - pxor mm0, mm2 - psrad mm0, 31 ; mm0 = sign (sam_AB ^ left_right) - add edi, 8 - pxor mm1, mm1 ; mm1 = zero - pcmpeqd mm2, mm1 ; mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 ; mm3 = 1s if sam_AB was zero - por mm2, mm3 ; mm2 = 1s if either was zero - pandn mm2, mm6 ; mask delta with zeros check - pxor mm5, mm0 - paddw mm5, mm2 ; and add to weight_AB - pxor mm5, mm0 - cmp edi, esi ; compare bptr and eptr to see if we're done - jb term_18_loop - - pslld mm5, 16 ; sign-extend 16-bit weights back to dwords - psrad mm5, 16 - mov eax, [ebp+8] ; point to dpp - movq [eax+8], mm5 ; put weight_AB back - emms - -term_1718_exit: - mov edx, [edi-4] ; dpp->samples_B [0] = bptr [-1]; - mov eax, [ebp+8] - mov [eax+48], edx - mov edx, [edi-8] ; dpp->samples_A [0] = bptr [-2]; - mov [eax+16], edx - mov edx, [edi-12] ; dpp->samples_B [1] = bptr [-3]; - mov [eax+52], edx - mov edx, [edi-16] ; dpp->samples_A [1] = bptr [-4]; - mov [eax+20], edx - jmp done - -; -; registers in term -1 & -2 loops: -; -; eax,ebx,edx scratch -; ecx weight_A -; ebp weight_B -; edi bptr -; esi eptr -; - -term_minus_1_entry: - cld ; we use stosd here... - mov eax, [ebp+8] ; point to dpp - mov ecx, [eax+8] ; ecx = weight_A and ebp = weight_B - mov ebp, [eax+12] - mov eax, [edi-4] - jmp term_minus_1_loop - - align 64 -term_minus_1_loop: - mov ebx, eax - imul eax, ecx - mov edx, [edi] - jo OV11 - sar eax, 10 - adc eax, edx - stosd - test ebx, ebx - je L182 - test edx, edx - je L182 - xor ebx, edx - sar ebx, 31 - xor ecx, ebx - add ecx, [esp] - mov edx, 1024 - add edx, ebx - cmp ecx, edx - jle L183 - mov ecx, edx -L183: xor ecx, ebx -L182: mov ebx, eax - imul eax, ebp - mov edx, [edi] - jo OV12 - sar eax, 10 - adc eax, edx - stosd - test ebx, ebx - je L189 - test edx, edx - je L189 - xor ebx, edx - sar ebx, 31 - xor ebp, ebx - add ebp, [esp] - mov edx, 1024 - add edx, ebx - cmp ebp, edx - jle L188 - mov ebp, edx -L188: xor ebp, ebx -L189: cmp edi, esi ; compare bptr and eptr to see if we're done - jb term_minus_1_loop - jmp term_minus_1_done - -OV11: mov eax, ebx ; restore previous sample into eax - jmp long_term_minus_1_loop - -OV12: mov eax, ebx ; restore previous sample into eax - jmp L282 - - align 64 -long_term_minus_1_loop: - mov ebx, eax - imul ecx - shl edx, 22 - shr eax, 10 - adc eax, edx - mov edx, [edi] - add eax, edx - stosd - test ebx, ebx - je L282 - test edx, edx - je L282 - xor ebx, edx - sar ebx, 31 - xor ecx, ebx - add ecx, [esp] - mov edx, 1024 - add edx, ebx - cmp ecx, edx - jle L283 - mov ecx, edx -L283: xor ecx, ebx -L282: mov ebx, eax - imul ebp - shl edx, 22 - shr eax, 10 - adc eax, edx - mov edx, [edi] - add eax, edx - stosd - test ebx, ebx - je L289 - test edx, edx - je L289 - xor ebx, edx - sar ebx, 31 - xor ebp, ebx - add ebp, [esp] - mov edx, 1024 - add edx, ebx - cmp ebp, edx - jle L288 - mov ebp, edx -L288: xor ebp, ebx -L289: cmp edi, esi ; compare bptr and eptr to see if we're done - jb long_term_minus_1_loop - -term_minus_1_done: - mov edx, ebp - mov ebp, esp ; restore ebp (we've pushed 4 DWORDS) - add ebp, 16 - mov eax, [ebp+8] ; point to dpp - mov [eax+8], ecx - mov [eax+12], edx - mov edx, [edi-4] ; dpp->samples_A [0] = bptr [-1] - mov [eax+16], edx - jmp done - - -term_minus_2_entry: - mov eax, [ebp+8] ; point to dpp - mov ecx, [eax+8] ; ecx = weight_A and ebp = weight_B - mov ebp, [eax+12] - mov eax, [edi-8] - jmp term_minus_2_loop - - align 64 -term_minus_2_loop: - mov ebx, eax - imul eax, ebp - mov edx, [edi+4] - jo OV21 - sar eax, 10 - adc eax, edx - mov [edi+4], eax - test ebx, ebx - je L194 - test edx, edx - je L194 - xor ebx, edx - sar ebx, 31 - xor ebp, ebx - add ebp, [esp] - mov edx, 1024 - add edx, ebx - cmp ebp, edx - jle L195 - mov ebp, edx -L195: xor ebp, ebx -L194: mov ebx, eax - imul eax, ecx - mov edx, [edi] - jo OV22 - sar eax, 10 - adc eax, edx - mov [edi], eax - add edi, 8 - test ebx, ebx - je L201 - test edx, edx - je L201 - xor ebx, edx - sar ebx, 31 - xor ecx, ebx - add ecx, [esp] - mov edx, 1024 - add edx, ebx - cmp ecx, edx - jle L200 - mov ecx, edx -L200: xor ecx, ebx -L201: cmp edi, esi ; compare bptr and eptr to see if we're done - jb term_minus_2_loop - jmp term_minus_2_done - -OV21: mov eax, ebx ; restore previous sample into eax - jmp long_term_minus_2_loop - -OV22: mov eax, ebx ; restore previous sample into eax - jmp L294 - - align 64 -long_term_minus_2_loop: - mov ebx, eax - imul ebp - shl edx, 22 - shr eax, 10 - adc eax, edx - mov edx, [edi+4] - add eax, edx - mov [edi+4], eax - test ebx, ebx - je L294 - test edx, edx - je L294 - xor ebx, edx - sar ebx, 31 - xor ebp, ebx - add ebp, [esp] - mov edx, 1024 - add edx, ebx - cmp ebp, edx - jle L295 - mov ebp, edx -L295: xor ebp, ebx -L294: mov ebx, eax - imul ecx - shl edx, 22 - shr eax, 10 - adc eax, edx - mov edx, [edi] - add eax, edx - mov [edi], eax - add edi, 8 - test ebx, ebx - je L301 - test edx, edx - je L301 - xor ebx, edx - sar ebx, 31 - xor ecx, ebx - add ecx, [esp] - mov edx, 1024 - add edx, ebx - cmp ecx, edx - jle L300 - mov ecx, edx -L300: xor ecx, ebx -L301: cmp edi, esi ; compare bptr and eptr to see if we're done - jb long_term_minus_2_loop - -term_minus_2_done: - mov edx, ebp - lea ebp, [esp+16] ; restore ebp (we've pushed 4 DWORDS) - mov eax, [ebp+8] ; point to dpp - mov [eax+8], ecx - mov [eax+12], edx - mov edx, [edi-8] ; dpp->samples_B [0] = bptr [-2]; - mov [eax+48], edx - jmp done - -; -; registers during processing loop for term -3: -; edi active buffer pointer -; esi end of buffer pointer -; -; MMX: -; mm0, mm1 scratch -; mm2 original sample values -; mm3 calculated correlation samples -; mm4 last calculated values (so we don't need to reload) -; mm5 weights -; mm6 delta -; mm7 512 (for rounding) -; - -term_minus_3_entry: - mov eax, 512 - movd mm7, eax - punpckldq mm7, mm7 ; mm7 = round (512) - mov edx, [ebp+8] ; point to dpp & get delta - mov eax, [edx+4] - movd mm6, eax - punpckldq mm6, mm6 ; mm6 = delta (0-7) - mov eax, 0FFFFh ; mask high weights to zero for PMADDWD - movd mm5, eax - punpckldq mm5, mm5 ; mm5 = weight mask 0x0000FFFF0000FFFF - pand mm5, [edx+8] ; mm5 = weight_AB masked to 16 bits - movq mm4, [edi-8] ; preload previous calculated values - jmp term_minus_3_loop - - align 64 -term_minus_3_loop: - movq mm3, mm4 ; mm3 = swap dwords (mm4) - psrlq mm3, 32 - punpckldq mm3, mm4 ; mm3 = sam_AB - movq mm1, mm3 - movq mm4, mm3 - pslld mm1, 1 - psrld mm4, 15 - psrlw mm1, 1 - pmaddwd mm4, mm5 - pmaddwd mm1, mm5 - movq mm2, [edi] ; mm2 = left_right - pslld mm4, 5 - paddd mm1, mm7 ; add 512 for rounding - psrad mm1, 10 - paddd mm4, mm2 - paddd mm4, mm1 ; add shifted sums - movq [edi], mm4 ; store result - movq mm0, mm3 - pxor mm0, mm2 - psrad mm0, 31 ; mm0 = sign (sam_AB ^ left_right) - add edi, 8 - pxor mm1, mm1 ; mm1 = zero - pcmpeqd mm2, mm1 ; mm2 = 1s if left_right was zero - pcmpeqd mm3, mm1 ; mm3 = 1s if sam_AB was zero - por mm2, mm3 ; mm2 = 1s if either was zero - pandn mm2, mm6 ; mask delta with zeros check - pcmpeqd mm1, mm1 - psubd mm1, mm7 - psubd mm1, mm7 - psubd mm1, mm0 - pxor mm5, mm0 - paddw mm5, mm1 - paddusw mm5, mm2 ; and add to weight_AB - psubw mm5, mm1 - pxor mm5, mm0 - cmp edi, esi ; compare bptr and eptr to see if we're done - jb term_minus_3_loop - - pslld mm5, 16 ; sign-extend 16-bit weights back to dwords - psrad mm5, 16 - mov eax, [ebp+8] ; point to dpp - movq [eax+8], mm5 ; put weight_AB back - emms - mov edx, [edi-4] ; dpp->samples_A [0] = bptr [-1]; - mov eax, [ebp+8] - mov [eax+16], edx - mov edx, [edi-8] ; dpp->samples_B [0] = bptr [-2]; - mov [eax+48], edx - -done: pop eax ; pop delta & saved regs - pop edi - pop esi - pop ebx - pop ebp - ret - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; -; This is the mono version of the above function. It does not use MMX and does not handle negative terms. -; -; void unpack_decorr_mono_pass_cont (struct decorr_pass *dpp, -; int32_t *buffer, -; int32_t sample_count, -; int32_t long_math; -; arguments on entry: -; -; struct decorr_pass *dpp [ebp+8] -; int32_t *buffer [ebp+12] -; int32_t sample_count [ebp+16] -; int32_t long_math [ebp+20] -; -; registers after entry: -; -; rdi bptr -; rsi eptr -; -; on stack: -; -; int16_t delta DWORD [esp] -; - -_unpack_decorr_mono_pass_cont_x86: - push ebp - mov ebp, esp - push ebx - push esi - push edi - cld - - mov edx, [ebp+8] ; copy delta from dpp to local stack - mov eax, [edx+4] - push eax - - mov edi, [ebp+12] ; edi = buffer - mov eax, [ebp+16] ; get sample_count and multiply by 4 - sal eax, 2 - jz mono_done ; exit now if there's nothing to do - lea esi, [edi+eax] ; else add to buffer point to make eptr - - mov eax, [ebp+8] ; get term from dpp and vector appropriately - mov eax, [eax] - cmp eax, 17 - je mono_17_entry - cmp eax, 18 - je mono_18_entry - -; -; registers during default term processing loop: -; edi active buffer pointer -; esi end of buffer pointer -; ecx weight_A -; ebp free -; ebx term * -4 -; eax,edx scratch -; - -default_mono_entry: - imul ebx, eax, -4 ; set ebx to term * -4 for decorrelation index - mov edx, [ebp+8] ; edx = dpp* - mov ecx, [edx+8] ; ecx = weight - jmp default_mono_loop - -; -; registers during processing loop for terms 17 & 18: -; edi active buffer pointer -; esi end of buffer pointer -; ecx weight_A -; ebp previously calculated value -; ebx calculated correlation sample -; eax,edx scratch -; - -mono_17_entry: - mov edx, [ebp+8] ; edx = dpp* - mov ecx, [edx+8] ; ecx = weight_A - mov ebp, [edi-4] - jmp mono_17_loop - -mono_18_entry: - mov edx, [ebp+8] ; edx = dpp* - mov ecx, [edx+8] ; ecx = weight_A - mov ebp, [edi-4] - jmp mono_18_loop - - align 64 -default_mono_loop: - mov eax, [edi+ebx] - imul eax, ecx - mov edx, [edi] - jo long_default_mono_loop - sar eax, 10 - adc eax, edx - mov [edi], eax - mov eax, [edi+ebx] - add edi, 4 - test edx, edx - je L100 - test eax, eax - je L100 - xor eax, edx - cdq - xor ecx, edx - add ecx, [esp] - xor ecx, edx -L100: cmp edi, esi ; compare bptr and eptr to see if we're done - jb default_mono_loop - jmp default_mono_done - - align 64 -long_default_mono_loop: - mov eax, [edi+ebx] - imul ecx - shl edx, 22 - shr eax, 10 - adc eax, edx - mov edx, [edi] - add eax, edx - mov [edi], eax - mov eax, [edi+ebx] - add edi, 4 - test edx, edx - je L101 - test eax, eax - je L101 - xor eax, edx - cdq - xor ecx, edx - add ecx, [esp] - xor ecx, edx -L101: cmp edi, esi ; compare bptr and eptr to see if we're done - jb long_default_mono_loop - -default_mono_done: - mov edx, [ebp+8] ; edx = dpp* - mov [edx+8], ecx ; store weight_A back - mov ecx, [edx] ; ecx = dpp->term - -default_mono_store_samples: - dec ecx - sub edi, 4 ; back up one full sample - mov eax, [edi] - mov [edx+ecx*4+16], eax ; store samples_A [ecx] - test ecx, ecx - jnz default_mono_store_samples - jmp mono_done - - align 64 -mono_17_loop: - lea ebx, [ebp+ebp] - sub ebx, [edi-8] - mov eax, ecx - imul eax, ebx - mov edx, [edi] - jo long_mono_17_loop - sar eax, 10 - adc eax, edx - stosd - test ebx, ebx - mov ebp, eax - je L117 - test edx, edx - je L117 - mov eax, [esp] - xor ebx, edx - sar ebx, 31 - xor eax, ebx - sub eax, ebx - add ecx, eax -L117: cmp edi, esi ; compare bptr and eptr to see if we're done - jb mono_17_loop - jmp mono_1718_exit - - align 64 -long_mono_17_loop: - lea ebx, [ebp+ebp] - sub ebx, [edi-8] - mov eax, ecx - imul ebx - shl edx, 22 - shr eax, 10 - adc eax, edx - mov edx, [edi] - add eax, edx - stosd - test ebx, ebx - mov ebp, eax - je L217 - test edx, edx - je L217 - mov eax, [esp] - xor ebx, edx - sar ebx, 31 - xor eax, ebx - sub eax, ebx - add ecx, eax -L217: cmp edi, esi ; compare bptr and eptr to see if we're done - jb long_mono_17_loop - jmp mono_1718_exit - - align 64 -mono_18_loop: - lea ebx, [ebp+ebp*2] - sub ebx, [edi-8] - sar ebx, 1 - mov eax, ecx - imul eax, ebx - mov edx, [edi] - jo long_mono_18_loop - sar eax, 10 - adc eax, edx - stosd - test ebx, ebx - mov ebp, eax - je L118 - test edx, edx - je L118 - mov eax, [esp] - xor ebx, edx - sar ebx, 31 - xor eax, ebx - sub eax, ebx - add ecx, eax -L118: cmp edi, esi ; compare bptr and eptr to see if we're done - jb mono_18_loop - jmp mono_1718_exit - - align 64 -long_mono_18_loop: - lea ebx, [ebp+ebp*2] - sub ebx, [edi-8] - sar ebx, 1 - mov eax, ecx - imul ebx - shl edx, 22 - shr eax, 10 - adc eax, edx - mov edx, [edi] - add eax, edx - stosd - test ebx, ebx - mov ebp, eax - je L218 - test edx, edx - je L218 - mov eax, [esp] - xor ebx, edx - sar ebx, 31 - xor eax, ebx - sub eax, ebx - add ecx, eax -L218: cmp edi, esi ; compare bptr and eptr to see if we're done - jb long_mono_18_loop - -mono_1718_exit: - lea ebp, [esp+16] ; restore ebp (we've pushed 4 DWORDS) - mov edx, [ebp+8] ; edx = dpp* - mov [edx+8], ecx ; store weight_A back - mov eax, [edi-4] ; dpp->samples_A [0] = bptr [-1]; - mov [edx+16], eax - mov eax, [edi-8] ; dpp->samples_A [1] = bptr [-2]; - mov [edx+20], eax - -mono_done: - pop eax ; pop delta & saved regs - pop edi - pop esi - pop ebx - pop ebp - ret - -; Helper function to determine if specified CPU feature is available (used here for MMX). -; Input parameter is index of feature to be checked (EDX from CPUID(1) only, MMX = 23). -; Return value is the specified bit (0 or 1) or 0 if CPUID is not supported. - -_unpack_cpu_has_feature_x86: - pushfd ; save eflags - pushfd ; push another copy - xor dword ptr [esp], 200000h ; toggle ID bit on stack & pop it back into eflags - popfd - pushfd ; store possibly modified eflags - pop eax ; and pop back into eax - xor eax, [esp] ; compare to original pushed eflags - popfd ; restore original eflags - and eax, 200000h ; eax = 1 if eflags ID bit was changable - jz oldcpu ; return zero if CPUID is not available (wow!) - - push ebx ; we must save ebx - mov eax, 1 ; do cpuid (1) to get features into edx - cpuid - mov eax, edx ; copy into eax for shift - mov cl, [esp+8] ; get parameter and shift that bit index into LSB - sar eax, cl - and eax, 1 - pop ebx ; restore ebx and return 0 or 1 - -oldcpu: ret ; return value in eax - -asmcode ends - - end - diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/wavpack_local.h b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/wavpack_local.h deleted file mode 100644 index fc756285..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/wavpack_local.h +++ /dev/null @@ -1,895 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2013 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// wavpack_local.h - -#ifndef WAVPACK_LOCAL_H -#define WAVPACK_LOCAL_H - -#if defined(_WIN32) -#define strdup(x) _strdup(x) -#define FASTCALL __fastcall -#else -#define FASTCALL -#endif - -#if defined(_WIN32) || \ - (defined(BYTE_ORDER) && defined(LITTLE_ENDIAN) && (BYTE_ORDER == LITTLE_ENDIAN)) || \ - (defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)) -#define BITSTREAM_SHORTS // use 16-bit "shorts" for reading/writing bitstreams (instead of chars) - // (only works on little-endian machines) -#endif - -#include - -// This header file contains all the definitions required by WavPack. - -#if defined(_MSC_VER) && _MSC_VER < 1600 -#include -typedef unsigned __int64 uint64_t; -typedef unsigned __int32 uint32_t; -typedef unsigned __int16 uint16_t; -typedef unsigned __int8 uint8_t; -typedef __int64 int64_t; -typedef __int32 int32_t; -typedef __int16 int16_t; -typedef __int8 int8_t; -#else -#include -#endif - -// Because the C99 specification states that "The order of allocation of -// bit-fields within a unit (high-order to low-order or low-order to -// high-order) is implementation-defined" (6.7.2.1), I decided to change -// the representation of floating-point values from a structure of -// bit-fields to a 32-bit integer with access macros. Note that the WavPack -// library doesn't use any floating-point math to implement compression of -// floating-point data (although a little floating-point math is used in -// high-level functions unrelated to the codec). - -typedef int32_t f32; - -#define get_mantissa(f) ((f) & 0x7fffff) -#define get_magnitude(f) ((f) & 0x7fffffff) -#define get_exponent(f) (((f) >> 23) & 0xff) -#define get_sign(f) (((f) >> 31) & 0x1) - -#define set_mantissa(f,v) (f) ^= (((f) ^ (v)) & 0x7fffff) -#define set_exponent(f,v) (f) ^= (((f) ^ ((v) << 23)) & 0x7f800000) -#define set_sign(f,v) (f) ^= (((f) ^ ((v) << 31)) & 0x80000000) - -#include - -#define FALSE 0 -#define TRUE 1 - -// ID3v1 and APEv2 TAG formats (may occur at the end of WavPack files) - -typedef struct { - char tag_id [3], title [30], artist [30], album [30]; - char year [4], comment [30], genre; -} ID3_Tag; - -typedef struct { - char ID [8]; - int32_t version, length, item_count, flags; - char res [8]; -} APE_Tag_Hdr; - -#define APE_Tag_Hdr_Format "8LLLL" - -#define APE_TAG_TYPE_TEXT 0x0 -#define APE_TAG_TYPE_BINARY 0x1 -#define APE_TAG_THIS_IS_HEADER 0x20000000 -#define APE_TAG_CONTAINS_HEADER 0x80000000 -#define APE_TAG_MAX_LENGTH (1024 * 1024 * 16) - -typedef struct { - int64_t tag_file_pos; - int tag_begins_file; - ID3_Tag id3_tag; - APE_Tag_Hdr ape_tag_hdr; - unsigned char *ape_tag_data; -} M_Tag; - -// RIFF / wav header formats (these occur at the beginning of both wav files -// and pre-4.0 WavPack files that are not in the "raw" mode) - -typedef struct { - char ckID [4]; - uint32_t ckSize; - char formType [4]; -} RiffChunkHeader; - -typedef struct { - char ckID [4]; - uint32_t ckSize; -} ChunkHeader; - -#define ChunkHeaderFormat "4L" - -typedef struct { - uint16_t FormatTag, NumChannels; - uint32_t SampleRate, BytesPerSecond; - uint16_t BlockAlign, BitsPerSample; - uint16_t cbSize, ValidBitsPerSample; - int32_t ChannelMask; - uint16_t SubFormat; - char GUID [14]; -} WaveHeader; - -#define WaveHeaderFormat "SSLLSSSSLS" - -////////////////////////////// WavPack Header ///////////////////////////////// - -// Note that this is the ONLY structure that is written to (or read from) -// WavPack 4.0 files, and is the preamble to every block in both the .wv -// and .wvc files. - -typedef struct { - char ckID [4]; - uint32_t ckSize; - int16_t version; - unsigned char block_index_u8; - unsigned char total_samples_u8; - uint32_t total_samples, block_index, block_samples, flags, crc; -} WavpackHeader; - -#define WavpackHeaderFormat "4LS2LLLLL" - -// Macros to access the 40-bit block_index field - -#define GET_BLOCK_INDEX(hdr) ( (int64_t) (hdr).block_index + ((int64_t) (hdr).block_index_u8 << 32) ) - -#define SET_BLOCK_INDEX(hdr,value) do { \ - int64_t tmp = (value); \ - (hdr).block_index = (uint32_t) tmp; \ - (hdr).block_index_u8 = \ - (unsigned char) (tmp >> 32); \ -} while (0) - -// Macros to access the 40-bit total_samples field, which is complicated by the fact that -// all 1's in the lower 32 bits indicates "unknown" (regardless of upper 8 bits) - -#define GET_TOTAL_SAMPLES(hdr) ( ((hdr).total_samples == (uint32_t) -1) ? -1 : \ - (int64_t) (hdr).total_samples + ((int64_t) (hdr).total_samples_u8 << 32) - (hdr).total_samples_u8 ) - -#define SET_TOTAL_SAMPLES(hdr,value) do { \ - int64_t tmp = (value); \ - if (tmp < 0) \ - (hdr).total_samples = (uint32_t) -1; \ - else { \ - tmp += (tmp / (int64_t) 0xffffffff); \ - (hdr).total_samples = (uint32_t) tmp; \ - (hdr).total_samples_u8 = \ - (unsigned char) (tmp >> 32); \ - } \ -} while (0) - -// or-values for "flags" - -#define BYTES_STORED 3 // 1-4 bytes/sample -#define MONO_FLAG 4 // not stereo -#define HYBRID_FLAG 8 // hybrid mode -#define JOINT_STEREO 0x10 // joint stereo -#define CROSS_DECORR 0x20 // no-delay cross decorrelation -#define HYBRID_SHAPE 0x40 // noise shape (hybrid mode only) -#define FLOAT_DATA 0x80 // ieee 32-bit floating point data - -#define INT32_DATA 0x100 // special extended int handling -#define HYBRID_BITRATE 0x200 // bitrate noise (hybrid mode only) -#define HYBRID_BALANCE 0x400 // balance noise (hybrid stereo mode only) - -#define INITIAL_BLOCK 0x800 // initial block of multichannel segment -#define FINAL_BLOCK 0x1000 // final block of multichannel segment - -#define SHIFT_LSB 13 -#define SHIFT_MASK (0x1fL << SHIFT_LSB) - -#define MAG_LSB 18 -#define MAG_MASK (0x1fL << MAG_LSB) - -#define SRATE_LSB 23 -#define SRATE_MASK (0xfL << SRATE_LSB) - -#define FALSE_STEREO 0x40000000 // block is stereo, but data is mono -#define NEW_SHAPING 0x20000000 // use IIR filter for negative shaping - -#define MONO_DATA (MONO_FLAG | FALSE_STEREO) - -// Introduced in WavPack 5.0: -#define HAS_CHECKSUM 0x10000000 // block contains a trailing checksum -#define DSD_FLAG 0x80000000 // block is encoded DSD (1-bit PCM) - -#define IGNORED_FLAGS 0x08000000 // reserved, but ignore if encountered -#define UNKNOWN_FLAGS 0x00000000 // we no longer have any of these spares - -#define MIN_STREAM_VERS 0x402 // lowest stream version we'll decode -#define MAX_STREAM_VERS 0x410 // highest stream version we'll decode or encode - // (only stream version to support mono optimization) -#define CUR_STREAM_VERS 0x407 // universally compatible stream version - - -//////////////////////////// WavPack Metadata ///////////////////////////////// - -// This is an internal representation of metadata. - -typedef struct { - int32_t byte_length; - void *data; - unsigned char id; -} WavpackMetadata; - -#define ID_UNIQUE 0x3f -#define ID_OPTIONAL_DATA 0x20 -#define ID_ODD_SIZE 0x40 -#define ID_LARGE 0x80 - -#define ID_DUMMY 0x0 -#define ID_ENCODER_INFO 0x1 -#define ID_DECORR_TERMS 0x2 -#define ID_DECORR_WEIGHTS 0x3 -#define ID_DECORR_SAMPLES 0x4 -#define ID_ENTROPY_VARS 0x5 -#define ID_HYBRID_PROFILE 0x6 -#define ID_SHAPING_WEIGHTS 0x7 -#define ID_FLOAT_INFO 0x8 -#define ID_INT32_INFO 0x9 -#define ID_WV_BITSTREAM 0xa -#define ID_WVC_BITSTREAM 0xb -#define ID_WVX_BITSTREAM 0xc -#define ID_CHANNEL_INFO 0xd -#define ID_DSD_BLOCK 0xe - -#define ID_RIFF_HEADER (ID_OPTIONAL_DATA | 0x1) -#define ID_RIFF_TRAILER (ID_OPTIONAL_DATA | 0x2) -#define ID_ALT_HEADER (ID_OPTIONAL_DATA | 0x3) -#define ID_ALT_TRAILER (ID_OPTIONAL_DATA | 0x4) -#define ID_CONFIG_BLOCK (ID_OPTIONAL_DATA | 0x5) -#define ID_MD5_CHECKSUM (ID_OPTIONAL_DATA | 0x6) -#define ID_SAMPLE_RATE (ID_OPTIONAL_DATA | 0x7) -#define ID_ALT_EXTENSION (ID_OPTIONAL_DATA | 0x8) -#define ID_ALT_MD5_CHECKSUM (ID_OPTIONAL_DATA | 0x9) -#define ID_NEW_CONFIG_BLOCK (ID_OPTIONAL_DATA | 0xa) -#define ID_CHANNEL_IDENTITIES (ID_OPTIONAL_DATA | 0xb) -#define ID_BLOCK_CHECKSUM (ID_OPTIONAL_DATA | 0xf) - -///////////////////////// WavPack Configuration /////////////////////////////// - -// This internal structure is used during encode to provide configuration to -// the encoding engine and during decoding to provide fle information back to -// the higher level functions. Not all fields are used in both modes. - -typedef struct { - float bitrate, shaping_weight; - int bits_per_sample, bytes_per_sample; - int qmode, flags, xmode, num_channels, float_norm_exp; - int32_t block_samples, extra_flags, sample_rate, channel_mask; - unsigned char md5_checksum [16], md5_read; - int num_tag_strings; - char **tag_strings; -} WavpackConfig; - -#define CONFIG_BYTES_STORED 3 // 1-4 bytes/sample -#define CONFIG_MONO_FLAG 4 // not stereo -#define CONFIG_HYBRID_FLAG 8 // hybrid mode -#define CONFIG_JOINT_STEREO 0x10 // joint stereo -#define CONFIG_CROSS_DECORR 0x20 // no-delay cross decorrelation -#define CONFIG_HYBRID_SHAPE 0x40 // noise shape (hybrid mode only) -#define CONFIG_FLOAT_DATA 0x80 // ieee 32-bit floating point data - -#define CONFIG_FAST_FLAG 0x200 // fast mode -#define CONFIG_HIGH_FLAG 0x800 // high quality mode -#define CONFIG_VERY_HIGH_FLAG 0x1000 // very high -#define CONFIG_BITRATE_KBPS 0x2000 // bitrate is kbps, not bits / sample -#define CONFIG_AUTO_SHAPING 0x4000 // automatic noise shaping -#define CONFIG_SHAPE_OVERRIDE 0x8000 // shaping mode specified -#define CONFIG_JOINT_OVERRIDE 0x10000 // joint-stereo mode specified -#define CONFIG_DYNAMIC_SHAPING 0x20000 // dynamic noise shaping -#define CONFIG_CREATE_EXE 0x40000 // create executable -#define CONFIG_CREATE_WVC 0x80000 // create correction file -#define CONFIG_OPTIMIZE_WVC 0x100000 // maximize bybrid compression -#define CONFIG_COMPATIBLE_WRITE 0x400000 // write files for decoders < 4.3 -#define CONFIG_CALC_NOISE 0x800000 // calc noise in hybrid mode -#define CONFIG_LOSSY_MODE 0x1000000 // obsolete (for information) -#define CONFIG_EXTRA_MODE 0x2000000 // extra processing mode -#define CONFIG_SKIP_WVX 0x4000000 // no wvx stream w/ floats & big ints -#define CONFIG_MD5_CHECKSUM 0x8000000 // compute & store MD5 signature -#define CONFIG_MERGE_BLOCKS 0x10000000 // merge blocks of equal redundancy (for lossyWAV) -#define CONFIG_PAIR_UNDEF_CHANS 0x20000000 // encode undefined channels in stereo pairs -#define CONFIG_OPTIMIZE_MONO 0x80000000 // optimize for mono streams posing as stereo - -#define QMODE_DSD_AUDIO 0x30 // if either of these is set in qmode (version 5.0) - -/* - * These config flags were never actually used, or are no longer used, or are - * used for something else now. They may be used in the future for what they - * say, or for something else. WavPack files in the wild *may* have some of - * these bit set in their config flags (with these older meanings), but only - * if the stream version is 0x410 or less than 0x407. Of course, this is not - * very important because once the file has been encoded, the config bits are - * just for information purposes (i.e., they do not affect decoding), - * -#define CONFIG_ADOBE_MODE 0x100 // "adobe" mode for 32-bit floats -#define CONFIG_VERY_FAST_FLAG 0x400 // double fast -#define CONFIG_COPY_TIME 0x20000 // copy file-time from source -#define CONFIG_QUALITY_MODE 0x200000 // psychoacoustic quality mode -#define CONFIG_RAW_FLAG 0x400000 // raw mode (not implemented yet) -#define CONFIG_QUIET_MODE 0x10000000 // don't report progress % -#define CONFIG_IGNORE_LENGTH 0x20000000 // ignore length in wav header -#define CONFIG_NEW_RIFF_HEADER 0x40000000 // generate new RIFF wav header - * - */ - -#define EXTRA_SCAN_ONLY 1 -#define EXTRA_STEREO_MODES 2 -#define EXTRA_TRY_DELTAS 8 -#define EXTRA_ADJUST_DELTAS 16 -#define EXTRA_SORT_FIRST 32 -#define EXTRA_BRANCHES 0x1c0 -#define EXTRA_SKIP_8TO16 512 -#define EXTRA_TERMS 0x3c00 -#define EXTRA_DUMP_TERMS 16384 -#define EXTRA_SORT_LAST 32768 - -//////////////////////////////// WavPack Stream /////////////////////////////// - -// This internal structure contains everything required to handle a WavPack -// "stream", which is defined as a stereo or mono stream of audio samples. For -// multichannel audio several of these would be required. Each stream contains -// pointers to hold a complete allocated block of WavPack data, although it's -// possible to decode WavPack blocks without buffering an entire block. - -typedef struct bs { -#ifdef BITSTREAM_SHORTS - uint16_t *buf, *end, *ptr; -#else - unsigned char *buf, *end, *ptr; -#endif - void (*wrap)(struct bs *bs); - int error, bc; - uint32_t sr; -} Bitstream; - -#define MAX_WRAPPER_BYTES 16777216 -#define NEW_MAX_STREAMS 4096 -#define OLD_MAX_STREAMS 8 -#define MAX_NTERMS 16 -#define MAX_TERM 8 - -// Note that this structure is directly accessed in assembly files, so modify with care - -struct decorr_pass { - int32_t term, delta, weight_A, weight_B; - int32_t samples_A [MAX_TERM], samples_B [MAX_TERM]; - int32_t aweight_A, aweight_B; - int32_t sum_A, sum_B; -}; - -typedef struct { - signed char joint_stereo, delta, terms [MAX_NTERMS+1]; -} WavpackDecorrSpec; - -struct entropy_data { - uint32_t median [3], slow_level, error_limit; -}; - -struct words_data { - uint32_t bitrate_delta [2], bitrate_acc [2]; - uint32_t pend_data, holding_one, zeros_acc; - int holding_zero, pend_count; - struct entropy_data c [2]; -}; - -typedef struct { - int32_t value, filter0, filter1, filter2, filter3, filter4, filter5, filter6, factor, byte; -} DSDfilters; - -typedef struct { - WavpackHeader wphdr; - struct words_data w; - - unsigned char *blockbuff, *blockend; - unsigned char *block2buff, *block2end; - int32_t *sample_buffer; - - int64_t sample_index; - int bits, num_terms, mute_error, joint_stereo, false_stereo, shift; - int num_decorrs, num_passes, best_decorr, mask_decorr; - uint32_t crc, crc_x, crc_wvx; - Bitstream wvbits, wvcbits, wvxbits; - int init_done, wvc_skip; - float delta_decay; - - unsigned char int32_sent_bits, int32_zeros, int32_ones, int32_dups; - unsigned char float_flags, float_shift, float_max_exp, float_norm_exp; - - struct { - int32_t shaping_acc [2], shaping_delta [2], error [2]; - double noise_sum, noise_ave, noise_max; - int16_t *shaping_data, *shaping_array; - int32_t shaping_samples; - } dc; - - struct decorr_pass decorr_passes [MAX_NTERMS], analysis_pass; - const WavpackDecorrSpec *decorr_specs; - - struct { - unsigned char *byteptr, *endptr, (*probabilities) [256], **value_lookup, mode, ready; - int history_bins, p0, p1; - int16_t (*summed_probabilities) [256]; - uint32_t low, high, value; - DSDfilters filters [2]; - int32_t *ptable; - } dsd; - -} WavpackStream; - -// flags for float_flags: - -#define FLOAT_SHIFT_ONES 1 // bits left-shifted into float = '1' -#define FLOAT_SHIFT_SAME 2 // bits left-shifted into float are the same -#define FLOAT_SHIFT_SENT 4 // bits shifted into float are sent literally -#define FLOAT_ZEROS_SENT 8 // "zeros" are not all real zeros -#define FLOAT_NEG_ZEROS 0x10 // contains negative zeros -#define FLOAT_EXCEPTIONS 0x20 // contains exceptions (inf, nan, etc.) - -/////////////////////////////// WavPack Context /////////////////////////////// - -// This internal structure holds everything required to encode or decode WavPack -// files. It is recommended that direct access to this structure be minimized -// and the provided utilities used instead. - -typedef struct { - int32_t (*read_bytes)(void *id, void *data, int32_t bcount); - uint32_t (*get_pos)(void *id); - int (*set_pos_abs)(void *id, uint32_t pos); - int (*set_pos_rel)(void *id, int32_t delta, int mode); - int (*push_back_byte)(void *id, int c); - uint32_t (*get_length)(void *id); - int (*can_seek)(void *id); - - // this callback is for writing edited tags only - int32_t (*write_bytes)(void *id, void *data, int32_t bcount); -} WavpackStreamReader; - -// Extended version of structure for handling large files and added -// functionality for truncating and closing files - -typedef struct { - int32_t (*read_bytes)(void *id, void *data, int32_t bcount); - int32_t (*write_bytes)(void *id, void *data, int32_t bcount); - int64_t (*get_pos)(void *id); // new signature for large files - int (*set_pos_abs)(void *id, int64_t pos); // new signature for large files - int (*set_pos_rel)(void *id, int64_t delta, int mode); // new signature for large files - int (*push_back_byte)(void *id, int c); - int64_t (*get_length)(void *id); // new signature for large files - int (*can_seek)(void *id); - int (*truncate_here)(void *id); // new function to truncate file at current position - int (*close)(void *id); // new function to close file -} WavpackStreamReader64; - -typedef int (*WavpackBlockOutput)(void *id, void *data, int32_t bcount); - -typedef struct { - WavpackConfig config; - - WavpackMetadata *metadata; - uint32_t metabytes; - int metacount; - - unsigned char *wrapper_data; - uint32_t wrapper_bytes; - - WavpackBlockOutput blockout; - void *wv_out, *wvc_out; - - WavpackStreamReader64 *reader; - void *wv_in, *wvc_in; - - int64_t filelen, file2len, filepos, file2pos, total_samples, initial_index; - uint32_t crc_errors, first_flags; - int wvc_flag, open_flags, norm_offset, reduced_channels, lossy_blocks, version_five; - uint32_t block_samples, ave_block_samples, block_boundary, max_samples, acc_samples, riff_trailer_bytes; - int riff_header_added, riff_header_created; - M_Tag m_tag; - - int current_stream, num_streams, max_streams, stream_version; - WavpackStream **streams; - void *stream3; - - // these items were added in 5.0 to support alternate file types (especially CAF & DSD) - unsigned char file_format, *channel_reordering, *channel_identities; - uint32_t channel_layout, dsd_multiplier; - void *decimation_context; - char file_extension [8]; - - void (*close_callback)(void *wpc); - char error_message [80]; -} WavpackContext; - -//////////////////////// function prototypes and macros ////////////////////// - -#define CLEAR(destin) memset (&destin, 0, sizeof (destin)); - -//////////////////////////////// decorrelation ////////////////////////////// -// modules: pack.c, unpack.c, unpack_floats.c, extra1.c, extra2.c - -// #define SKIP_DECORRELATION // experimental switch to disable all decorrelation on encode - -// These macros implement the weight application and update operations -// that are at the heart of the decorrelation loops. Note that there are -// sometimes two and even three versions of each macro. Theses should be -// equivalent and produce identical results, but some may perform better -// or worse on a given architecture. - -#if 1 // PERFCOND - apply decorrelation weight when no 32-bit overflow possible -#define apply_weight_i(weight, sample) ((weight * sample + 512) >> 10) -#else -#define apply_weight_i(weight, sample) ((((weight * sample) >> 8) + 2) >> 2) -#endif - -#if 1 // PERFCOND - apply decorrelation weight when 32-bit overflow is possible -#define apply_weight_f(weight, sample) (((((sample & 0xffff) * weight) >> 9) + \ - (((sample & ~0xffff) >> 9) * weight) + 1) >> 1) -#elif 1 -#define apply_weight_f(weight, sample) ((int32_t)((weight * (int64_t) sample + 512) >> 10)) -#else -#define apply_weight_f(weight, sample) ((int32_t)floor(((double) weight * sample + 512.0) / 1024.0)) -#endif - -#if 1 // PERFCOND - universal version that checks input magnitude or always uses long version -#define apply_weight(weight, sample) (sample != (int16_t) sample ? \ - apply_weight_f (weight, sample) : apply_weight_i (weight, sample)) -#else -#define apply_weight(weight, sample) (apply_weight_f (weight, sample)) -#endif - -#if 1 // PERFCOND -#define update_weight(weight, delta, source, result) \ - if (source && result) { int32_t s = (int32_t) (source ^ result) >> 31; weight = (delta ^ s) + (weight - s); } -#elif 1 -#define update_weight(weight, delta, source, result) \ - if (source && result) weight += (((source ^ result) >> 30) | 1) * delta; -#else -#define update_weight(weight, delta, source, result) \ - if (source && result) (source ^ result) < 0 ? (weight -= delta) : (weight += delta); -#endif - -#define update_weight_clip(weight, delta, source, result) \ - if (source && result) { \ - const int32_t s = (source ^ result) >> 31; \ - if ((weight = (weight ^ s) + (delta - s)) > 1024) weight = 1024; \ - weight = (weight ^ s) - s; \ - } - -void pack_init (WavpackContext *wpc); -int pack_block (WavpackContext *wpc, int32_t *buffer); -void send_general_metadata (WavpackContext *wpc); -void free_metadata (WavpackMetadata *wpmd); -int copy_metadata (WavpackMetadata *wpmd, unsigned char *buffer_start, unsigned char *buffer_end); -double WavpackGetEncodedNoise (WavpackContext *wpc, double *peak); -int unpack_init (WavpackContext *wpc); -int read_decorr_terms (WavpackStream *wps, WavpackMetadata *wpmd); -int read_decorr_weights (WavpackStream *wps, WavpackMetadata *wpmd); -int read_decorr_samples (WavpackStream *wps, WavpackMetadata *wpmd); -int read_shaping_info (WavpackStream *wps, WavpackMetadata *wpmd); -int32_t unpack_samples (WavpackContext *wpc, int32_t *buffer, uint32_t sample_count); -int check_crc_error (WavpackContext *wpc); -int scan_float_data (WavpackStream *wps, f32 *values, int32_t num_values); -void send_float_data (WavpackStream *wps, f32 *values, int32_t num_values); -void float_values (WavpackStream *wps, int32_t *values, int32_t num_values); -void dynamic_noise_shaping (WavpackContext *wpc, int32_t *buffer, int shortening_allowed); -void execute_stereo (WavpackContext *wpc, int32_t *samples, int no_history, int do_samples); -void execute_mono (WavpackContext *wpc, int32_t *samples, int no_history, int do_samples); - -////////////////////////// DSD related (including decimation) ////////////////////////// -// modules: pack_dsd.c unpack_dsd.c - -void pack_dsd_init (WavpackContext *wpc); -int pack_dsd_block (WavpackContext *wpc, int32_t *buffer); -int init_dsd_block (WavpackContext *wpc, WavpackMetadata *wpmd); -int32_t unpack_dsd_samples (WavpackContext *wpc, int32_t *buffer, uint32_t sample_count); - -void *decimate_dsd_init (int num_channels); -void decimate_dsd_reset (void *decimate_context); -void decimate_dsd_run (void *decimate_context, int32_t *samples, int num_samples); -void decimate_dsd_destroy (void *decimate_context); - -///////////////////////////////// CPU feature detection //////////////////////////////// - -int unpack_cpu_has_feature_x86 (int findex), pack_cpu_has_feature_x86 (int findex); - -#define CPU_FEATURE_MMX 23 - -///////////////////////////// pre-4.0 version decoding //////////////////////////// -// modules: unpack3.c, unpack3_open.c, unpack3_seek.c - -WavpackContext *open_file3 (WavpackContext *wpc, char *error); -int32_t unpack_samples3 (WavpackContext *wpc, int32_t *buffer, uint32_t sample_count); -int seek_sample3 (WavpackContext *wpc, uint32_t desired_index); -uint32_t get_sample_index3 (WavpackContext *wpc); -void free_stream3 (WavpackContext *wpc); -int get_version3 (WavpackContext *wpc); - -////////////////////////////// bitstream macros & functions ///////////////////////////// - -#define bs_is_open(bs) ((bs)->ptr != NULL) -uint32_t bs_close_read (Bitstream *bs); - -#define getbit(bs) ( \ - (((bs)->bc) ? \ - ((bs)->bc--, (bs)->sr & 1) : \ - (((++((bs)->ptr) != (bs)->end) ? (void) 0 : (bs)->wrap (bs)), (bs)->bc = sizeof (*((bs)->ptr)) * 8 - 1, ((bs)->sr = *((bs)->ptr)) & 1) \ - ) ? \ - ((bs)->sr >>= 1, 1) : \ - ((bs)->sr >>= 1, 0) \ -) - -#define getbits(value, nbits, bs) do { \ - while ((nbits) > (bs)->bc) { \ - if (++((bs)->ptr) == (bs)->end) (bs)->wrap (bs); \ - (bs)->sr |= (int32_t)*((bs)->ptr) << (bs)->bc; \ - (bs)->bc += sizeof (*((bs)->ptr)) * 8; \ - } \ - *(value) = (bs)->sr; \ - if ((bs)->bc > 32) { \ - (bs)->bc -= (nbits); \ - (bs)->sr = *((bs)->ptr) >> (sizeof (*((bs)->ptr)) * 8 - (bs)->bc); \ - } \ - else { \ - (bs)->bc -= (nbits); \ - (bs)->sr >>= (nbits); \ - } \ -} while (0) - -#define putbit(bit, bs) do { if (bit) (bs)->sr |= (1 << (bs)->bc); \ - if (++((bs)->bc) == sizeof (*((bs)->ptr)) * 8) { \ - *((bs)->ptr) = (bs)->sr; \ - (bs)->sr = (bs)->bc = 0; \ - if (++((bs)->ptr) == (bs)->end) (bs)->wrap (bs); \ - }} while (0) - -#define putbit_0(bs) do { \ - if (++((bs)->bc) == sizeof (*((bs)->ptr)) * 8) { \ - *((bs)->ptr) = (bs)->sr; \ - (bs)->sr = (bs)->bc = 0; \ - if (++((bs)->ptr) == (bs)->end) (bs)->wrap (bs); \ - }} while (0) - -#define putbit_1(bs) do { (bs)->sr |= (1 << (bs)->bc); \ - if (++((bs)->bc) == sizeof (*((bs)->ptr)) * 8) { \ - *((bs)->ptr) = (bs)->sr; \ - (bs)->sr = (bs)->bc = 0; \ - if (++((bs)->ptr) == (bs)->end) (bs)->wrap (bs); \ - }} while (0) - -#define putbits(value, nbits, bs) do { \ - (bs)->sr |= (int32_t)(value) << (bs)->bc; \ - if (((bs)->bc += (nbits)) >= sizeof (*((bs)->ptr)) * 8) \ - do { \ - *((bs)->ptr) = (bs)->sr; \ - (bs)->sr >>= sizeof (*((bs)->ptr)) * 8; \ - if (((bs)->bc -= sizeof (*((bs)->ptr)) * 8) > 32 - sizeof (*((bs)->ptr)) * 8) \ - (bs)->sr |= ((value) >> ((nbits) - (bs)->bc)); \ - if (++((bs)->ptr) == (bs)->end) (bs)->wrap (bs); \ - } while ((bs)->bc >= sizeof (*((bs)->ptr)) * 8); \ -} while (0) - -///////////////////////////// entropy encoder / decoder //////////////////////////// -// modules: entropy_utils.c, read_words.c, write_words.c - -// these control the time constant "slow_level" which is used for hybrid mode -// that controls bitrate as a function of residual level (HYBRID_BITRATE). -#define SLS 8 -#define SLO ((1 << (SLS - 1))) - -#define LIMIT_ONES 16 // maximum consecutive 1s sent for "div" data - -// these control the time constant of the 3 median level breakpoints -#define DIV0 128 // 5/7 of samples -#define DIV1 64 // 10/49 of samples -#define DIV2 32 // 20/343 of samples - -// this macro retrieves the specified median breakpoint (without frac; min = 1) -#define GET_MED(med) (((c->median [med]) >> 4) + 1) - -// These macros update the specified median breakpoints. Note that the median -// is incremented when the sample is higher than the median, else decremented. -// They are designed so that the median will never drop below 1 and the value -// is essentially stationary if there are 2 increments for every 5 decrements. - -#define INC_MED0() (c->median [0] += ((c->median [0] + DIV0) / DIV0) * 5) -#define DEC_MED0() (c->median [0] -= ((c->median [0] + (DIV0-2)) / DIV0) * 2) -#define INC_MED1() (c->median [1] += ((c->median [1] + DIV1) / DIV1) * 5) -#define DEC_MED1() (c->median [1] -= ((c->median [1] + (DIV1-2)) / DIV1) * 2) -#define INC_MED2() (c->median [2] += ((c->median [2] + DIV2) / DIV2) * 5) -#define DEC_MED2() (c->median [2] -= ((c->median [2] + (DIV2-2)) / DIV2) * 2) - -#ifdef HAVE___BUILTIN_CLZ -#define count_bits(av) ((av) ? 32 - __builtin_clz (av) : 0) -#elif defined (_WIN64) -static __inline int count_bits (uint32_t av) { unsigned long res; return _BitScanReverse (&res, av) ? (int)(res + 1) : 0; } -#else -#define count_bits(av) ( \ - (av) < (1 << 8) ? nbits_table [av] : \ - ( \ - (av) < (1L << 16) ? nbits_table [(av) >> 8] + 8 : \ - ((av) < (1L << 24) ? nbits_table [(av) >> 16] + 16 : nbits_table [(av) >> 24] + 24) \ - ) \ -) -#endif - -void init_words (WavpackStream *wps); -void write_entropy_vars (WavpackStream *wps, WavpackMetadata *wpmd); -void write_hybrid_profile (WavpackStream *wps, WavpackMetadata *wpmd); -int read_entropy_vars (WavpackStream *wps, WavpackMetadata *wpmd); -int read_hybrid_profile (WavpackStream *wps, WavpackMetadata *wpmd); -int32_t FASTCALL send_word (WavpackStream *wps, int32_t value, int chan); -void send_words_lossless (WavpackStream *wps, int32_t *buffer, int32_t nsamples); -int32_t FASTCALL get_word (WavpackStream *wps, int chan, int32_t *correction); -int32_t get_words_lossless (WavpackStream *wps, int32_t *buffer, int32_t nsamples); -void flush_word (WavpackStream *wps); -int32_t nosend_word (WavpackStream *wps, int32_t value, int chan); -void scan_word (WavpackStream *wps, int32_t *samples, uint32_t num_samples, int dir); -void update_error_limit (WavpackStream *wps); - -extern const uint32_t bitset [32]; -extern const uint32_t bitmask [32]; -extern const char nbits_table [256]; - -int wp_log2s (int32_t value); -int32_t wp_exp2s (int log); -int FASTCALL wp_log2 (uint32_t avalue); - -#ifdef OPT_ASM_X86 -#define LOG2BUFFER log2buffer_x86 -#elif defined(OPT_ASM_X64) && (defined (_WIN64) || defined(__CYGWIN__) || defined(__MINGW64__)) -#define LOG2BUFFER log2buffer_x64win -#elif defined(OPT_ASM_X64) -#define LOG2BUFFER log2buffer_x64 -#else -#define LOG2BUFFER log2buffer -#endif - -uint32_t LOG2BUFFER (int32_t *samples, uint32_t num_samples, int limit); - -signed char store_weight (int weight); -int restore_weight (signed char weight); - -#define WORD_EOF ((int32_t)(1L << 31)) - -void WavpackFloatNormalize (int32_t *values, int32_t num_values, int delta_exp); - -/////////////////////////// high-level unpacking API and support //////////////////////////// -// modules: open_utils.c, unpack_utils.c, unpack_seek.c, unpack_floats.c - -WavpackContext *WavpackOpenFileInputEx64 (WavpackStreamReader64 *reader, void *wv_id, void *wvc_id, char *error, int flags, int norm_offset); -WavpackContext *WavpackOpenFileInputEx (WavpackStreamReader *reader, void *wv_id, void *wvc_id, char *error, int flags, int norm_offset); -WavpackContext *WavpackOpenFileInput (const char *infilename, char *error, int flags, int norm_offset); - -#define OPEN_WVC 0x1 // open/read "correction" file -#define OPEN_TAGS 0x2 // read ID3v1 / APEv2 tags (seekable file) -#define OPEN_WRAPPER 0x4 // make audio wrapper available (i.e. RIFF) -#define OPEN_2CH_MAX 0x8 // open multichannel as stereo (no downmix) -#define OPEN_NORMALIZE 0x10 // normalize floating point data to +/- 1.0 -#define OPEN_STREAMING 0x20 // "streaming" mode blindly unpacks blocks - // w/o regard to header file position info -#define OPEN_EDIT_TAGS 0x40 // allow editing of tags -#define OPEN_FILE_UTF8 0x80 // assume filenames are UTF-8 encoded, not ANSI (Windows only) - -// new for version 5 - -#define OPEN_DSD_NATIVE 0x100 // open DSD files as bitstreams - // (returned as 8-bit "samples" stored in 32-bit words) -#define OPEN_DSD_AS_PCM 0x200 // open DSD files as 24-bit PCM (decimated 8x) -#define OPEN_ALT_TYPES 0x400 // application is aware of alternate file types & qmode - // (just affects retrieving wrappers & MD5 checksums) -#define OPEN_NO_CHECKSUM 0x800 // don't verify block checksums before decoding - -int WavpackGetMode (WavpackContext *wpc); - -#define MODE_WVC 0x1 -#define MODE_LOSSLESS 0x2 -#define MODE_HYBRID 0x4 -#define MODE_FLOAT 0x8 -#define MODE_VALID_TAG 0x10 -#define MODE_HIGH 0x20 -#define MODE_FAST 0x40 -#define MODE_EXTRA 0x80 // extra mode used, see MODE_XMODE for possible level -#define MODE_APETAG 0x100 -#define MODE_SFX 0x200 -#define MODE_VERY_HIGH 0x400 -#define MODE_MD5 0x800 -#define MODE_XMODE 0x7000 // mask for extra level (1-6, 0=unknown) -#define MODE_DNS 0x8000 - -int WavpackGetQualifyMode (WavpackContext *wpc); -int WavpackGetVersion (WavpackContext *wpc); -uint32_t WavpackUnpackSamples (WavpackContext *wpc, int32_t *buffer, uint32_t samples); -int WavpackSeekSample (WavpackContext *wpc, uint32_t sample); -int WavpackSeekSample64 (WavpackContext *wpc, int64_t sample); -int WavpackGetMD5Sum (WavpackContext *wpc, unsigned char data [16]); - -int WavpackVerifySingleBlock (unsigned char *buffer, int verify_checksum); -uint32_t read_next_header (WavpackStreamReader64 *reader, void *id, WavpackHeader *wphdr); -int read_wvc_block (WavpackContext *wpc); - -/////////////////////////// high-level packing API and support //////////////////////////// -// modules: pack_utils.c, pack_floats.c - -WavpackContext *WavpackOpenFileOutput (WavpackBlockOutput blockout, void *wv_id, void *wvc_id); -int WavpackSetConfiguration (WavpackContext *wpc, WavpackConfig *config, uint32_t total_samples); -int WavpackSetConfiguration64 (WavpackContext *wpc, WavpackConfig *config, int64_t total_samples, const unsigned char *chan_ids); -int WavpackPackInit (WavpackContext *wpc); -int WavpackAddWrapper (WavpackContext *wpc, void *data, uint32_t bcount); -int WavpackPackSamples (WavpackContext *wpc, int32_t *sample_buffer, uint32_t sample_count); -int WavpackFlushSamples (WavpackContext *wpc); -int WavpackStoreMD5Sum (WavpackContext *wpc, unsigned char data [16]); -void WavpackSeekTrailingWrapper (WavpackContext *wpc); -void WavpackUpdateNumSamples (WavpackContext *wpc, void *first_block); -void *WavpackGetWrapperLocation (void *first_block, uint32_t *size); - -/////////////////////////////////// common utilities //////////////////////////////////// -// module: common_utils.c - -extern const uint32_t sample_rates [16]; -uint32_t WavpackGetLibraryVersion (void); -const char *WavpackGetLibraryVersionString (void); -uint32_t WavpackGetSampleRate (WavpackContext *wpc); -int WavpackGetBitsPerSample (WavpackContext *wpc); -int WavpackGetBytesPerSample (WavpackContext *wpc); -int WavpackGetNumChannels (WavpackContext *wpc); -int WavpackGetChannelMask (WavpackContext *wpc); -int WavpackGetReducedChannels (WavpackContext *wpc); -int WavpackGetFloatNormExp (WavpackContext *wpc); -uint32_t WavpackGetNumSamples (WavpackContext *wpc); -int64_t WavpackGetNumSamples64 (WavpackContext *wpc); -uint32_t WavpackGetSampleIndex (WavpackContext *wpc); -int64_t WavpackGetSampleIndex64 (WavpackContext *wpc); -char *WavpackGetErrorMessage (WavpackContext *wpc); -int WavpackGetNumErrors (WavpackContext *wpc); -int WavpackLossyBlocks (WavpackContext *wpc); -uint32_t WavpackGetWrapperBytes (WavpackContext *wpc); -unsigned char *WavpackGetWrapperData (WavpackContext *wpc); -void WavpackFreeWrapper (WavpackContext *wpc); -double WavpackGetProgress (WavpackContext *wpc); -uint32_t WavpackGetFileSize (WavpackContext *wpc); -int64_t WavpackGetFileSize64 (WavpackContext *wpc); -double WavpackGetRatio (WavpackContext *wpc); -double WavpackGetAverageBitrate (WavpackContext *wpc, int count_wvc); -double WavpackGetInstantBitrate (WavpackContext *wpc); -WavpackContext *WavpackCloseFile (WavpackContext *wpc); -void WavpackLittleEndianToNative (void *data, char *format); -void WavpackNativeToLittleEndian (void *data, char *format); -void WavpackBigEndianToNative (void *data, char *format); -void WavpackNativeToBigEndian (void *data, char *format); - -void install_close_callback (WavpackContext *wpc, void cb_func (void *wpc)); -void free_streams (WavpackContext *wpc); - -/////////////////////////////////// tag utilities //////////////////////////////////// -// modules: tags.c, tag_utils.c - -int WavpackGetNumTagItems (WavpackContext *wpc); -int WavpackGetTagItem (WavpackContext *wpc, const char *item, char *value, int size); -int WavpackGetTagItemIndexed (WavpackContext *wpc, int index, char *item, int size); -int WavpackGetNumBinaryTagItems (WavpackContext *wpc); -int WavpackGetBinaryTagItem (WavpackContext *wpc, const char *item, char *value, int size); -int WavpackGetBinaryTagItemIndexed (WavpackContext *wpc, int index, char *item, int size); -int WavpackAppendTagItem (WavpackContext *wpc, const char *item, const char *value, int vsize); -int WavpackAppendBinaryTagItem (WavpackContext *wpc, const char *item, const char *value, int vsize); -int WavpackDeleteTagItem (WavpackContext *wpc, const char *item); -int WavpackWriteTag (WavpackContext *wpc); -int load_tag (WavpackContext *wpc); -void free_tag (M_Tag *m_tag); -int valid_tag (M_Tag *m_tag); -int editable_tag (M_Tag *m_tag); - -#endif - diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/wavpack_version.h b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/wavpack_version.h deleted file mode 100644 index 6acf2740..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/wavpack_version.h +++ /dev/null @@ -1,19 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2006 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// wavpack_version.h - -#ifndef WAVPACK_VERSION_H -#define WAVPACK_VERSION_H - -#define LIBWAVPACK_MAJOR 5 -#define LIBWAVPACK_MINOR 1 -#define LIBWAVPACK_MICRO 0 -#define LIBWAVPACK_VERSION_STRING "5.1.0" - -#endif diff --git a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/write_words.c b/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/write_words.c deleted file mode 100644 index 6e6c6b6d..00000000 --- a/sources/LabSound/third_party/libnyquist/third_party/wavpack/src/write_words.c +++ /dev/null @@ -1,688 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// **** WAVPACK **** // -// Hybrid Lossless Wavefile Compressor // -// Copyright (c) 1998 - 2013 Conifer Software. // -// All Rights Reserved. // -// Distributed under the BSD Software License (see license.txt) // -//////////////////////////////////////////////////////////////////////////// - -// write_words.c - -// This module provides entropy word encoding functions using -// a variation on the Rice method. This was introduced in version 3.93 -// because it allows splitting the data into a "lossy" stream and a -// "correction" stream in a very efficient manner and is therefore ideal -// for the "hybrid" mode. For 4.0, the efficiency of this method was -// significantly improved by moving away from the normal Rice restriction of -// using powers of two for the modulus divisions and now the method can be -// used for both hybrid and pure lossless encoding. - -// Samples are divided by median probabilities at 5/7 (71.43%), 10/49 (20.41%), -// and 20/343 (5.83%). Each zone has 3.5 times fewer samples than the -// previous. Using standard Rice coding on this data would result in 1.4 -// bits per sample average (not counting sign bit). However, there is a -// very simple encoding that is over 99% efficient with this data and -// results in about 1.22 bits per sample. - -#include -#include - -#include "wavpack_local.h" - -///////////////////////////// executable code //////////////////////////////// - -// Initialize entropy encoder for the specified stream. In lossless mode there -// are no parameters to select; in hybrid mode the bitrate mode and value need -// be initialized. - -static void word_set_bitrate (WavpackStream *wps); - -void init_words (WavpackStream *wps) -{ - CLEAR (wps->w); - - if (wps->wphdr.flags & HYBRID_FLAG) - word_set_bitrate (wps); -} - -// Set up parameters for hybrid mode based on header flags and "bits" field. -// This is currently only set up for the HYBRID_BITRATE mode in which the -// allowed error varies with the residual level (from "slow_level"). The -// simpler mode (which is not used yet) has the error level directly -// controlled from the metadata. - -static void word_set_bitrate (WavpackStream *wps) -{ - int bitrate_0, bitrate_1; - - if (wps->wphdr.flags & HYBRID_BITRATE) { - if (wps->wphdr.flags & FALSE_STEREO) - bitrate_0 = (wps->bits * 2 - 512) < 568 ? 0 : (wps->bits * 2 - 512) - 568; - else - bitrate_0 = wps->bits < 568 ? 0 : wps->bits - 568; - - if (!(wps->wphdr.flags & MONO_DATA)) { - - if (wps->wphdr.flags & HYBRID_BALANCE) - bitrate_1 = (wps->wphdr.flags & JOINT_STEREO) ? 256 : 0; - else { - bitrate_1 = bitrate_0; - - if (wps->wphdr.flags & JOINT_STEREO) { - if (bitrate_0 < 128) { - bitrate_1 += bitrate_0; - bitrate_0 = 0; - } - else { - bitrate_0 -= 128; - bitrate_1 += 128; - } - } - } - } - else - bitrate_1 = 0; - } - else - bitrate_0 = bitrate_1 = 0; - - wps->w.bitrate_acc [0] = (int32_t) bitrate_0 << 16; - wps->w.bitrate_acc [1] = (int32_t) bitrate_1 << 16; -} - -// Allocates the correct space in the metadata structure and writes the -// current median values to it. Values are converted from 32-bit unsigned -// to our internal 16-bit wp_log2 values, and read_entropy_vars () is called -// to read the values back because we must compensate for the loss through -// the log function. - -void write_entropy_vars (WavpackStream *wps, WavpackMetadata *wpmd) -{ - unsigned char *byteptr; - int temp; - - byteptr = wpmd->data = malloc (12); - wpmd->id = ID_ENTROPY_VARS; - - *byteptr++ = temp = wp_log2 (wps->w.c [0].median [0]); - *byteptr++ = temp >> 8; - *byteptr++ = temp = wp_log2 (wps->w.c [0].median [1]); - *byteptr++ = temp >> 8; - *byteptr++ = temp = wp_log2 (wps->w.c [0].median [2]); - *byteptr++ = temp >> 8; - - if (!(wps->wphdr.flags & MONO_DATA)) { - *byteptr++ = temp = wp_log2 (wps->w.c [1].median [0]); - *byteptr++ = temp >> 8; - *byteptr++ = temp = wp_log2 (wps->w.c [1].median [1]); - *byteptr++ = temp >> 8; - *byteptr++ = temp = wp_log2 (wps->w.c [1].median [2]); - *byteptr++ = temp >> 8; - } - - wpmd->byte_length = (int32_t)(byteptr - (unsigned char *) wpmd->data); - read_entropy_vars (wps, wpmd); -} - -// Allocates enough space in the metadata structure and writes the current -// high word of the bitrate accumulator and the slow_level values to it. The -// slow_level values are converted from 32-bit unsigned to our internal 16-bit -// wp_log2 values. Afterward, read_entropy_vars () is called to read the values -// back because we must compensate for the loss through the log function and -// the truncation of the bitrate. - -void write_hybrid_profile (WavpackStream *wps, WavpackMetadata *wpmd) -{ - unsigned char *byteptr; - int temp; - - word_set_bitrate (wps); - byteptr = wpmd->data = malloc (512); - wpmd->id = ID_HYBRID_PROFILE; - - if (wps->wphdr.flags & HYBRID_BITRATE) { - *byteptr++ = temp = wp_log2s (wps->w.c [0].slow_level); - *byteptr++ = temp >> 8; - - if (!(wps->wphdr.flags & MONO_DATA)) { - *byteptr++ = temp = wp_log2s (wps->w.c [1].slow_level); - *byteptr++ = temp >> 8; - } - } - - *byteptr++ = temp = wps->w.bitrate_acc [0] >> 16; - *byteptr++ = temp >> 8; - - if (!(wps->wphdr.flags & MONO_DATA)) { - *byteptr++ = temp = wps->w.bitrate_acc [1] >> 16; - *byteptr++ = temp >> 8; - } - - if (wps->w.bitrate_delta [0] | wps->w.bitrate_delta [1]) { - *byteptr++ = temp = wp_log2s (wps->w.bitrate_delta [0]); - *byteptr++ = temp >> 8; - - if (!(wps->wphdr.flags & MONO_DATA)) { - *byteptr++ = temp = wp_log2s (wps->w.bitrate_delta [1]); - *byteptr++ = temp >> 8; - } - } - - wpmd->byte_length = (int32_t)(byteptr - (unsigned char *) wpmd->data); - read_hybrid_profile (wps, wpmd); -} - -// This function writes the specified word to the open bitstream "wvbits" and, -// if the bitstream "wvcbits" is open, writes any correction data there. This -// function will work for either lossless or hybrid but because a version -// optimized for lossless exits below, it would normally be used for the hybrid -// mode only. The return value is the actual value stored to the stream (even -// if a correction file is being created) and is used as feedback to the -// predictor. - -int32_t FASTCALL send_word (WavpackStream *wps, int32_t value, int chan) -{ - struct entropy_data *c = wps->w.c + chan; - uint32_t ones_count, low, mid, high; - int sign = (value < 0) ? 1 : 0; - - if (wps->w.c [0].median [0] < 2 && !wps->w.holding_zero && wps->w.c [1].median [0] < 2) { - if (wps->w.zeros_acc) { - if (value) - flush_word (wps); - else { - c->slow_level -= (c->slow_level + SLO) >> SLS; - wps->w.zeros_acc++; - return 0; - } - } - else if (value) - putbit_0 (&wps->wvbits); - else { - c->slow_level -= (c->slow_level + SLO) >> SLS; - CLEAR (wps->w.c [0].median); - CLEAR (wps->w.c [1].median); - wps->w.zeros_acc = 1; - return 0; - } - } - - if (sign) - value = ~value; - - if ((wps->wphdr.flags & HYBRID_FLAG) && !chan) - update_error_limit (wps); - - if (value < (int32_t) GET_MED (0)) { - ones_count = low = 0; - high = GET_MED (0) - 1; - DEC_MED0 (); - } - else { - low = GET_MED (0); - INC_MED0 (); - - if (value - low < GET_MED (1)) { - ones_count = 1; - high = low + GET_MED (1) - 1; - DEC_MED1 (); - } - else { - low += GET_MED (1); - INC_MED1 (); - - if (value - low < GET_MED (2)) { - ones_count = 2; - high = low + GET_MED (2) - 1; - DEC_MED2 (); - } - else { - ones_count = 2 + (value - low) / GET_MED (2); - low += (ones_count - 2) * GET_MED (2); - high = low + GET_MED (2) - 1; - INC_MED2 (); - } - } - } - - mid = (high + low + 1) >> 1; - - if (wps->w.holding_zero) { - if (ones_count) - wps->w.holding_one++; - - flush_word (wps); - - if (ones_count) { - wps->w.holding_zero = 1; - ones_count--; - } - else - wps->w.holding_zero = 0; - } - else - wps->w.holding_zero = 1; - - wps->w.holding_one = ones_count * 2; - - if (!c->error_limit) { - if (high != low) { - uint32_t maxcode = high - low, code = value - low; - int bitcount = count_bits (maxcode); - uint32_t extras = bitset [bitcount] - maxcode - 1; - - if (code < extras) { - wps->w.pend_data |= code << wps->w.pend_count; - wps->w.pend_count += bitcount - 1; - } - else { - wps->w.pend_data |= ((code + extras) >> 1) << wps->w.pend_count; - wps->w.pend_count += bitcount - 1; - wps->w.pend_data |= ((code + extras) & 1) << wps->w.pend_count++; - } - } - - mid = value; - } - else - while (high - low > c->error_limit) - if (value < (int32_t) mid) { - mid = ((high = mid - 1) + low + 1) >> 1; - wps->w.pend_count++; - } - else { - mid = (high + (low = mid) + 1) >> 1; - wps->w.pend_data |= bitset [wps->w.pend_count++]; - } - - wps->w.pend_data |= ((int32_t) sign << wps->w.pend_count++); - - if (!wps->w.holding_zero) - flush_word (wps); - - if (bs_is_open (&wps->wvcbits) && c->error_limit) { - uint32_t code = value - low, maxcode = high - low; - int bitcount = count_bits (maxcode); - uint32_t extras = bitset [bitcount] - maxcode - 1; - - if (bitcount) { - if (code < extras) - putbits (code, bitcount - 1, &wps->wvcbits); - else { - putbits ((code + extras) >> 1, bitcount - 1, &wps->wvcbits); - putbit ((code + extras) & 1, &wps->wvcbits); - } - } - } - - if (wps->wphdr.flags & HYBRID_BITRATE) { - c->slow_level -= (c->slow_level + SLO) >> SLS; - c->slow_level += wp_log2 (mid); - } - - return sign ? ~mid : mid; -} - -// This function is an optimized version of send_word() that only handles -// lossless (error_limit == 0) and sends an entire buffer of either mono or -// stereo data rather than a single sample. Unlike the generalized -// send_word(), it does not return values because it always encodes -// the exact value passed. - -void send_words_lossless (WavpackStream *wps, int32_t *buffer, int32_t nsamples) -{ - struct entropy_data *c = wps->w.c; - int32_t value, csamples; - - if (!(wps->wphdr.flags & MONO_DATA)) - nsamples *= 2; - - for (csamples = 0; csamples < nsamples; ++csamples) { - int sign = ((value = *buffer++) < 0) ? 1 : 0; - uint32_t ones_count, low, high; - - if (!(wps->wphdr.flags & MONO_DATA)) - c = wps->w.c + (csamples & 1); - - if (wps->w.c [0].median [0] < 2 && !wps->w.holding_zero && wps->w.c [1].median [0] < 2) { - if (wps->w.zeros_acc) { - if (value) - flush_word (wps); - else { - wps->w.zeros_acc++; - continue; - } - } - else if (value) - putbit_0 (&wps->wvbits); - else { - CLEAR (wps->w.c [0].median); - CLEAR (wps->w.c [1].median); - wps->w.zeros_acc = 1; - continue; - } - } - - if (sign) - value = ~value; - - if (value < (int32_t) GET_MED (0)) { - ones_count = low = 0; - high = GET_MED (0) - 1; - DEC_MED0 (); - } - else { - low = GET_MED (0); - INC_MED0 (); - - if (value - low < GET_MED (1)) { - ones_count = 1; - high = low + GET_MED (1) - 1; - DEC_MED1 (); - } - else { - low += GET_MED (1); - INC_MED1 (); - - if (value - low < GET_MED (2)) { - ones_count = 2; - high = low + GET_MED (2) - 1; - DEC_MED2 (); - } - else { - ones_count = 2 + (value - low) / GET_MED (2); - low += (ones_count - 2) * GET_MED (2); - high = low + GET_MED (2) - 1; - INC_MED2 (); - } - } - } - - if (wps->w.holding_zero) { - if (ones_count) - wps->w.holding_one++; - - flush_word (wps); - - if (ones_count) { - wps->w.holding_zero = 1; - ones_count--; - } - else - wps->w.holding_zero = 0; - } - else - wps->w.holding_zero = 1; - - wps->w.holding_one = ones_count * 2; - - if (high != low) { - uint32_t maxcode = high - low, code = value - low; - int bitcount = count_bits (maxcode); - uint32_t extras = bitset [bitcount] - maxcode - 1; - - if (code < extras) { - wps->w.pend_data |= code << wps->w.pend_count; - wps->w.pend_count += bitcount - 1; - } - else { - wps->w.pend_data |= ((code + extras) >> 1) << wps->w.pend_count; - wps->w.pend_count += bitcount - 1; - wps->w.pend_data |= ((code + extras) & 1) << wps->w.pend_count++; - } - } - - wps->w.pend_data |= ((int32_t) sign << wps->w.pend_count++); - - if (!wps->w.holding_zero) - flush_word (wps); - } -} - -// Used by send_word() and send_word_lossless() to actually send most the -// accumulated data onto the bitstream. This is also called directly from -// clients when all words have been sent. - -void flush_word (WavpackStream *wps) -{ - if (wps->w.zeros_acc) { - int cbits = count_bits (wps->w.zeros_acc); - - while (cbits--) - putbit_1 (&wps->wvbits); - - putbit_0 (&wps->wvbits); - - while (wps->w.zeros_acc > 1) { - putbit (wps->w.zeros_acc & 1, &wps->wvbits); - wps->w.zeros_acc >>= 1; - } - - wps->w.zeros_acc = 0; - } - - if (wps->w.holding_one) { -#ifdef LIMIT_ONES - if (wps->w.holding_one >= LIMIT_ONES) { - int cbits; - - putbits ((1L << LIMIT_ONES) - 1, LIMIT_ONES + 1, &wps->wvbits); - wps->w.holding_one -= LIMIT_ONES; - cbits = count_bits (wps->w.holding_one); - - while (cbits--) - putbit_1 (&wps->wvbits); - - putbit_0 (&wps->wvbits); - - while (wps->w.holding_one > 1) { - putbit (wps->w.holding_one & 1, &wps->wvbits); - wps->w.holding_one >>= 1; - } - - wps->w.holding_zero = 0; - } - else - putbits (bitmask [wps->w.holding_one], wps->w.holding_one, &wps->wvbits); - - wps->w.holding_one = 0; -#else - do { - putbit_1 (&wps->wvbits); - } while (--wps->w.holding_one); -#endif - } - - if (wps->w.holding_zero) { - putbit_0 (&wps->wvbits); - wps->w.holding_zero = 0; - } - - if (wps->w.pend_count) { - putbits (wps->w.pend_data, wps->w.pend_count, &wps->wvbits); - wps->w.pend_data = wps->w.pend_count = 0; - } -} - -// This function is similar to send_word() except that no data is actually -// written to any stream, but it does return the value that would have been -// sent to a hybrid stream. It is used to determine beforehand how much noise -// will be added to samples. - -int32_t nosend_word (WavpackStream *wps, int32_t value, int chan) -{ - struct entropy_data *c = wps->w.c + chan; - uint32_t ones_count, low, mid, high; - int sign = (value < 0) ? 1 : 0; - - if (sign) - value = ~value; - - if ((wps->wphdr.flags & HYBRID_FLAG) && !chan) - update_error_limit (wps); - - if (value < (int32_t) GET_MED (0)) { - low = 0; - high = GET_MED (0) - 1; - DEC_MED0 (); - } - else { - low = GET_MED (0); - INC_MED0 (); - - if (value - low < GET_MED (1)) { - high = low + GET_MED (1) - 1; - DEC_MED1 (); - } - else { - low += GET_MED (1); - INC_MED1 (); - - if (value - low < GET_MED (2)) { - high = low + GET_MED (2) - 1; - DEC_MED2 (); - } - else { - ones_count = 2 + (value - low) / GET_MED (2); - low += (ones_count - 2) * GET_MED (2); - high = low + GET_MED (2) - 1; - INC_MED2 (); - } - } - } - - mid = (high + low + 1) >> 1; - - if (!c->error_limit) - mid = value; - else - while (high - low > c->error_limit) - if (value < (int32_t) mid) - mid = ((high = mid - 1) + low + 1) >> 1; - else - mid = (high + (low = mid) + 1) >> 1; - - c->slow_level -= (c->slow_level + SLO) >> SLS; - c->slow_level += wp_log2 (mid); - - return sign ? ~mid : mid; -} - -// This function is used to scan some number of samples to set the variables -// "slow_level" and the "median" array. In pure symetrical encoding mode this -// would not be needed because these values would simply be continued from the -// previous block. However, in the -X modes and the 32-bit modes we cannot do -// this because parameters may change between blocks and the variables might -// not apply. This function can work in mono or stereo and can scan a block -// in either direction. - -static void scan_word_pass (WavpackStream *wps, int32_t *samples, uint32_t num_samples, int dir) -{ - uint32_t flags = wps->wphdr.flags, value, low; - struct entropy_data *c = wps->w.c; - int chan; - - if (flags & MONO_DATA) { - if (dir < 0) { - samples += (num_samples - 1); - dir = -1; - } - else - dir = 1; - } - else { - if (dir < 0) { - samples += (num_samples - 1) * 2; - dir = -2; - } - else - dir = 2; - } - - while (num_samples--) { - - value = labs (samples [chan = 0]); - - if (flags & HYBRID_BITRATE) { - wps->w.c [0].slow_level -= (wps->w.c [0].slow_level + SLO) >> SLS; - wps->w.c [0].slow_level += wp_log2 (value); - } - - if (value < GET_MED (0)) { - DEC_MED0 (); - } - else { - low = GET_MED (0); - INC_MED0 (); - - if (value - low < GET_MED (1)) { - DEC_MED1 (); - } - else { - low += GET_MED (1); - INC_MED1 (); - - if (value - low < GET_MED (2)) { - DEC_MED2 (); - } - else { - INC_MED2 (); - } - } - } - - if (!(flags & MONO_DATA)) { - value = labs (samples [chan = 1]); - c++; - - if (wps->wphdr.flags & HYBRID_BITRATE) { - wps->w.c [1].slow_level -= (wps->w.c [1].slow_level + SLO) >> SLS; - wps->w.c [1].slow_level += wp_log2 (value); - } - - if (value < GET_MED (0)) { - DEC_MED0 (); - } - else { - low = GET_MED (0); - INC_MED0 (); - - if (value - low < GET_MED (1)) { - DEC_MED1 (); - } - else { - low += GET_MED (1); - INC_MED1 (); - - if (value - low < GET_MED (2)) { - DEC_MED2 (); - } - else { - INC_MED2 (); - } - } - } - - c--; - } - - samples += dir; - } -} - -// Wrapper for scan_word_pass() than ensures that at least 2048 samples are processed by -// potentially making multiple passes through the data. See description of scan_word_pass() -// for more details. - -void scan_word (WavpackStream *wps, int32_t *samples, uint32_t num_samples, int dir) -{ - init_words (wps); - - if (num_samples) { - int passes = (2048 + num_samples - 1) / num_samples; // i.e., ceil (2048.0 / num_samples) - - while (passes--) - scan_word_pass (wps, samples, num_samples, dir); - } -} -

      dcNND_{66h$FK9B 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

      e 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

    Zame^73So9+$uKgLw-|z2yKu;Z@0wBr+kX^ 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�pYFVSiMOB|T6g$H<@t;>@9j&#laGLF_>V5ynU4WF5OV|OT~6LBG4J9;y(zz-aH5nND21eX7;D?7Eh>2N(}vsEx&}8CmZrG- z%T^m z`3XRC>$|CqMhZL-_M~l`+%3RnCJ8ea)s)#EZ{PhTJN+WoOWD>B$G}&B^|E?y{VBWdH}XkwnYKW><>G6%LlYY*dy-axRjUk@RaKTEAR`q)I@$ zug6Dzev8?k0@>l;zFv0<(%tIW&=82E!|WH^X(xEy=Hc5^bZK41d4+HS1yBRUGA)3&j)d5eOfO z&e$%0y$WXl%dv(n!Ziz*Fpo4m;sckzzUOr{o=3~{x*FP{ADcx;2-ZVVEd$N@p|v6` zKnnUUSSreh|KcR%+9e=%85A5p4jey?g4Pwq@GI!sm<}92)pKQU_6C99Hhu($aN-~P zOm{biH)$*_O)Uk5$Hg>+mh^A*H-^ufKLWB=QlTEcEYmG4oaTalxJDahZp=ORk570S zzP(=vJ0?3l@gupg(#$Ae*(c#0wt&yb=AAQa8t7ck7Q9OX2y=;_~*f+~$GXZg1^V@e8NvT&5OdOD8q@L8Tke_qIc`Ppm8HiHRefJosQR z0{skr7_R;TntZCba546RK5KeUjBpe-4u(k|OXROD1N>!?iA{!v^8JliuTLME;F=Ae zr94?o;XPcX3YYS9d4idA6nNOri~~hB@`%NyLnuYIl!JGC)++B`kd7-Kx`apm1bdM( ztWZD1DgL{V@GOy&%?n{=^l;^yU7W{-=SDRY_*10W2M^#S-E)C?WW-kVeUt?2vAp=^kanf*Y-t!dQGZd_c|CP z?|Z1<3eBYF2)#n+Ptfj4)0=?zPPRlMt2ET3ijT(IEK!;z{SzR2^%PUud;DjlmmsHA zu<~qd%u8z?d1)PfiMS}dw8D3xGDl$r12l$apiTm75mp9x){)*Nb_N4Jtf;P5H-~jV zRo6-QdaybT-}aM-SDWJD^-zldpN*G5+00Yqw=dDM2vX!1!f&d~Bje2tcvsRtj5WQ@ z^)`5Vsi&mB;sIzX3*&|#@3o9*e?;h-`c7sOVI}N>_hi)d6l}@r#84@DQ6w zRiG@^W_hQY&|AvSpQ@YzBv%SQ3@l)J_YQX1O+YIQx)Pq5Ox zmURDt-Ez!`lMUWm>o#6QE-WDwJNi6bdA?Sek8&0}=-qa3T73e10b7m@9DMWvtP_eH z7@_DTtT!HzM7;x2$$5?8;0Oo4v z7W+nKza7#F3cdBxVe}77i?t!4}>EjAHk8cPuzozBNi!>H(B5(e~{& zk_Z<$tVEOl8;TG;qu(6CiXoE!={8_@8<3teqHTm-qLn+qH9%9MUXiu6uOWzDX7x&{ zmSf<*K%WdA8%nD~p4J1f%%fVuuBe~viayUP>0TLk06JD?AgR(bwPXcsy7cN7F$<=` z7pCac47i|wuNsU4GHpqB+=8IM!jETy=bLou7sDpv$fVVcz0D#Mu=xuy2W%tn)cN2| zSR2DKaG`YTP;%pJSoX{wQlAf45=L@*X_Tq^A1>e{hTa`gO2YH7Y9b!f1^XVFKW(m) zSc#A=X$3rid-=?Sh~1I}-Z@tnavP0ISpBSn)z7**H}($}SpBSnYy@*lDOW6h2%CFt zUBu#NEoqyJn9)e5v)zl4VtNsC7{-!GjXmWptDo?$zBmljn220+Q9e9!gaz|~@Ecg! zmpN2n?RX)qjRzI0gz3VqFNC$2{U&4o=&8az(krei>CT#WLimm4#TL+}ocOzQNL>th zwhxl+D#7XSOdk@$1F+(e)JIz$uxLi~BlihM$!n;La+Jf$=^DyaK4C=vHvFm%Xv103 ze^|8PDM0%OZb%$4tm0Xy?FMbwF1@H&V`;*lBu1>U?$RhV*3b&(#Ym0s=eOV_W$7uJ z`7pl8t6`C~0DZ$_<@hbOp4lA5iHRT&(dm{A_9es}X;mYZnd}LWrG35@XJi?`BM?K2 z^f|DYRITu-JJR4az~(We8~i2xr%U}lQwaY)M)(pqTeJDNh_7t^MWn%k)58jqJ5`j~ zAaiPaJ*o#-(>(Pn^^->jes=HE&=M)=gIzAHJan1aWd(h2-mZ}i zK-+og9?};vxS-DfPY5^dq_WzR@s)XHkaKqt`7ZF*94F8H9U2P zE?i^c_LL6ziBusE2{@Kvy*AF{?yJS#f2($~$797xC7b7S2m7lz=j2~o4O_orh8JNY z(s$`sUwvwTk5OUYS1d&r-X#3$tB#!9zp|9%-P;hd0~bAQ!v7oC%eqy%@MhIcB~(b+ zjDN^WRLhb$>}GYyi{9=TeTzI&cz6@SwrV3`EQP`ZgvEJ2V9$j^@C%M_JoJ|AsgRRW zGNf;C{#7s_eM8;oeGvZzeE~7M%*!|&9MWo`9KYQ>_F<>#(~|w6i`g< zGQvJ}DdZq{yTrJiq{+FkIE!Fq(EYs8`89sV{aXg z8=$tfDiYR|h9W65J<>C;O>i_Vm9;+9rSv6b)|ybi40@WrW0Vp}gIs0ev4Xyj%qWX6 z0sZnbq|>uDRmu0G_*9g{C<|>zNcATK~Wmo^rK)LOo*LMRl7ep$2zm zLw-xrB$UmJ^9vuV1I>IKw2q|fIJ60q%xKLl#799Xc8@1*J7JioG<3?lS|L}M0#6rV zefCg04^hae%fAHjv^g$r;AAQN|MJW}g#7Xh=%yyR*)Ws0BmP^l?ka;8ZkhC}uf)A<;4@!( zT~__`Qp|Rugw+{ecQWwD!QexXN)G&Ft!8#o-A(n@?ZWKLT|_;Xeqx=mo^8}%3= zKu7(jc41o8hp-`xW0`RSb{~yo@vk}qjbx%2(LwEguWPdFWZ>5J`$9?ekGX?=3v06L zS&LX_2Mw~?vKpv`LDlk?rR~%+27Xt%4gXp7n=0e$w@CXgKgb?DbH9`Y8^1u%u!9F2 zO;nT22I}9@o|2BXveZr9$3^T8cfTh$)wU@RkY4hkkVc6T6~3u&}g`p!m9~E-Bs^u zwNTo?v_qcF1MKz~r7TpE$gUaaYlNaMy%yN*#?Ghj9ClMRSgFwNAv?KK-U#{iHyfy>R+Y>3QtIGo)0Z81D!-;|h2STb90e z;xqf@;uK4D1`ABX4Tr*9 z!G4;nPde>`D)gkbPTAC&Rlo1@BkYk@;yUVQ4SUbS!aIK7?#uICTW~oJT|)V&C!i-) zl#Own^m+?MSZaN2L-MoG@d(5<5O$3*fSI{~doZ`LB+n)`4!Dnh`^HqyQI^kMh0U%7 z94fuC40X8krE-;`=k)RTb~$A3UIcki{2?DS0&M|bRzp$cJIYAYd6H+hn#~P5$RcC0 zj)-f1{fhd@8?|MpcCm4g)hhlCTKm2Vmh?yLe(-0$$X2LFHH!*zcPa0_%z-k6JL2d-^!czB*JyhwSwp(O$K zza)!NX*aZF!q-CPjXw=mJ}OG*qG-@sD{5bmpTt$x)L{PLnqKTCQCCVJo^%>t6HE<2}^s;K*ETjpAZ7z zxj|j-Z8{CR7)NXe{6*Y<#2v4Aa43+c5i(L-KlA_>yn;P3Yyq!_cwfm0m2`iU44>%3 zdRg7`sP+U#zUkuI5#J7)3D}8L6>1fq4*LGjEymEd-;{J;PNcV0g&xn1=_bDt!DGP8 zqj>%JE@>fo{5YP`+8ZQvg+7vPqb*lFA3kHzVb>Aws-DB_r=XiqJqL9H-#H7~GK9XV z$DRY6rNIU6@blP<#6!S8u7STW6ZlA!i|9PnbN(^kp*I{JS}1Lt>WcA0{8oO8D$K;8 z_UbuUw?NZ9INgmtzKaVPZXXamOB1jbBCj~`{+?avYlq%mkx=7{;GdEnIQfI8F%;49 z7FR*5^**!cU!_<8{J3#dRJ$7*uo1hW>UGmjflrC;fCo=8AG;ZTYwnORKLMV&Ji|i2=;?0<-Y76fDPDBc zS-=N3|1B3L51;1{F{L;j;Cv?R2T8%8z z7~U4oGMq!>{du05Dz}{BgY6*D3Qr6Ke?mBhH;?MZ(}*tV33|T9IV0h#^#m8de^ZbU z9ph@#G<8L3NGS=ryo3AK!7C?g?fXW!V=(`I{3i;Ym)xxHzk<()Ta&f0{a1&y@Njbv z(3Di$+j@iZd{WWrcY7hl-h=)%5J)o&vq6$3t6)NnZ;SGktbA;%8t5?KsH@(1hbxZJRNn39WZ?Wi6Wp* zegbTel5QtMeoUPku%2(%z>A>ODC}n$+I@VsrjE~2)x)P?_veqmimO$y-~M&(E7lOk z8OaL0gomhW2Z~1zTX6f=YhR(Yghg8O<#v)LA|&w2A%tX0%fF1aZp@*Q?rmnY<$8S? zTDKZ4O07HIki^8j?$`^B;WK6*#wbR;>);5BKXVf_+--3q%p7FV-gCVl!KbFws+?J0 z#~J>Y=1Z~;D}Z3e^Wmp6jt>NXu=3*m7Ha~Vw!Tdb&Ys%x+W}Uh-x2J2ELd{~^h5;R zj$e8{hLp*OGYFi23NbrA?&A01Nw3}g=PthRXsUY0_>sg_M_cX%x6AUz?%n_&^iy%h zc2=tipVQwZ=egk7uo3bm_)Rfr$B#^S?zb)45!J8;`{LQ6`q}u@@gwnbwflCoOif)< zh_s4y`zW=ga;86KpB`s*h8>!{cybBh9Jg`D!BqWT_>5U~uw?~u%qTSN)P=JO<90p~ zDg&y{#K0YchV`v|Yi4MAom%70d3|4b%if3Q^DM(|)6ufG{zvGJJMNhOOW?~-3!r|Q z)WF?xR!|#$OnaxCSEmY}RejRM?_LTYhlZVTd*16ZJ+>^AzaT=1Gtwg-_&RSiDEnNZ z1>*ijyBp6MP-Rn7*l1Mkm^A$4;P{c$+GT~h@MI}=&$I=PcxDB(;j@~%L5q)NHFA3g z_qX_e7RXBl!julRS#uD6aFQ0{{D8bI$*O&t9UAa-^$zXc7gBVnZ=!UxWr>{by0 zgnU2V@RCrclai$s3ilm1W?NQ0hitx1;2MTL*Lhsia5-@;!xiOlo0}n-a{(u1JFO`p zq4RO92soc0ojYxV4ih&LPtQ)>H0Gn{9wna|$wxkVFe?G;NKL+VAmy9ZgcTV4EA}uQ z-zC)ZbQUf$!s`$FJx=BHDU<_ADJ@D0TB&H%%Z~;aLFDO&yz?L?F0GkzzWzltPp2p1 z6Nv94&pf(b6)r*7=swpW)H{a~Sky1iW=Oi3GxC*^3(7eg($OsFcByW#U!oP+rsliS zpxLP6yIohG!A~Eggy74mz!%d_ z8h-3=`?0DzD9w;~-gEA++WE7&L-9f9P@@0s0VYu#dcObW4%CKj|A-#%&h>8nj)74o`Hl|OxWPw04yDj228A3rP|rHa0d?IWt>4GBy6 zt_%kcKx>1@OOkLp}x=xWeP{bLbNSg0??-bJf)o8*i zv@xCh*=63Pl5vzK+7N&CMRx|MvJ6yNhPHiPp-S36q{=T}p%%TTUC5b;(ZNYZO*#1< zkeoOxeZj52$ikAUJh&lkJ?7rY($!0=tbiPwWx^_j)~~y~qCCO(AMK!@lltU-tcYhw zLXIjpu7mG;+WMFkec=zk8Db&R@aC)QQKIz{&&O%wt$mT+2#w}Mh4RNoza*MkI)q!) zv(Ya8)E4JZyziORJ!yyW9{S+ZL?9`WCd7YU68>(y{H~e2v+~K?F2^yJ@jGC98MhBt zK3Ms?A#>|d`C(_Gbkoj^!&p!5e6mHKVA!dLG;h+OJc$FtDR%o!hvIhe@K$cx&Kss7 zOry^T#rB?$+kct6V;W{XlZ2Il7M@<=!%{o*;XSfb+#`!F9p-OMxPf&7cf<+gubphG z?1T>Fe*BAMv80ca;`XT}OV{j)+3l1Q zn^pDiQ9473A@Y-pnlt!B!&#oqrB7g3C$WD0GdQ{LVOZNIz>6~NY4mEnW3tqAS`V$a zlJ2b}q4R4xTzz|Iz@NQ()$DPh1;;j6U45%OIy(1UsrI;fRxvds29X#{+}!d4(l%XH zO|y=e&6*L@fORAxfrZBxOlktP&FXMsQEWZ#f|`!Fc3pi*|F#WpKbRVtfL)d0l5=8g zBdZ$PGpyxpyLJBf|-jky-k7)9$GVnVKCx85=!!uiq`z<&# zJB(A;dg)H=@y)0i_Kh<$Tj2R_M%+F=5?88+*F5;xbr#9#W>Z7Nm+&s21N{6I!Qr}k zK1i#kZMsgmyb(RuC_wM?vtVldCU0El>+%-yZk!@lHExn#mmfBx2Z-wQo9d3rTg)7q zCt4|~-rDeGAEnz^cR)HSKM^9$hLm0OohmK^;bnF4JKvKpgl2`tH~qYa72I@~ zyikv8a><#%>{44qUWOU19c%EX1MdYaiYL$+P2^cQlLdR!j40*7|D;1EDOWa|??i9R zL|YajTn9A5&aUx|on48^Zy<#|{*V2gUE`K_c3JM+Ln})4Szy=TY$yF??CgZhX;Myi z_x&`oRhf^0C-QWS^c4Pu^jPT*jA&Ily-QQ>?~q=0ztFM#3&;(3bBCd0GM_7@OU8}- zM?kMvJ$V;lA${Gxim9gE{&m62>(VMX+iIsjNt&^ORv9NC!;HBR zyUFk|d@~EpJi9S)VuiC}j@)mZ-a$CT*`2`gVbg(T>Z}t-`6+yaW+o=*H6UK9O>^b+Ajx9r>qhT9jLlEmx%fVzK8goe z?{bvKdca-WS&??`cw-t_!Ns9O>5>{Jn%7JQ+^c6-ufR&uxdhlPo82N#xvy=jUb9%1 zuSD{XQ}XvH`M-?0gmB$SE3Q%cLi*|w3-wD>63*V2=0V?Vt}Kc~1Cj!M*lrFXRZ*0d z;LT3A`XbOeWSesVazdPZLh0{q?^zw=jADiKR6GV<9JRT6IWV>y@K_#d?fbmuRp8(D z2(v4N>FfNz?rl>QT>Te*tiol^t*ov9HFe}|;ce(IYC^BcWJ#eje}XS(t{FG{-l1_OuEy|LGwgJXWTzt^`Jw!X zsb~2Qq3Pbdym>XZy)EYj)h*nitZuPJq_*BH^{htg=~)YhSw5{Cqn;>(QW>pL?}t7= z_NaDf?7s$YlsC(b&G+X87>)sBy}iFp_weCT#UWgKGZN z7JduP=vm^3dZ46x_e`{+a%LnS5sN)mhLO(~e(EPf$RgF`8In|SdX?6ra$NYv;%mi>^1CHU^y*rZAM?$ zU{AIXNG}}pc^CI*P?{$ka1kn7VE2ogo8IET`)`#;2 z)z$GM8d%Y^glc8?1;Qu`tS&I8P(wqJ=MWM`9;r`yv;a zZK*Qa|MfKaZi4@J_*2~C?r+yZYnCWUr3QDhIalWe)~^O)6!-&d1zs>?c0J-B#O-rk^`1Vo>rId4MF$Vtn0 z%<3qRC;R!Vz37qEmCK~N zW%YZs?t~792DEDBQ;&nAy5#Ie^>ngXDv-0G)yL!Zdpp}ZyV&xb?pYTh=Q7PY&coYq z*1S#UlQZgkvcq-2n{=@cIjo`_$`5%Bl*2tAN=s?Z_%XB}eQerA%o!Wf_+H?7$(eNp zawhQjcDg&;O(CS>M=HLTu~Kl!4u65{z`MQfzV_(4y&3XP0a~NYuTzasdy{i0&AA*q zk9gPf%Fe^BsR}MiE^kLzjU1~CetVLAhaY(@!$N(qu|*NBW&(=3{7l=p9&RW#%A=yXm%ifXjtXr+<*K% zvP!f8FBMv!j-z1>^h*N@S|eBRAYhMdeG2)gZ3SgWK^WCMMXYMXg6;$?E_8{ocDBxy zH9^5M7yJQdH<&AX9C~<3gHH2$A5IYp<#NZ2NqBmItQ4SC0o@Db1=kZZy`&wM!vce0Z9JkOti&OaYE&(Jv-4S`-&@qAfCNY7YEQ`LMq z6Cqc|LT2y7h(*Zd(UAE{-k*;>Iq~k&*i#;!E{r|R#?wb*Px*Li8+&r$>HOG}2T$iv z<~i~?+?^c@FTzt^I#EYJeN1>th^JUra5p>M?7^FL&_O@thR(lAq^DqaA#+2^3@9{a z$X~E>0S+{D$o$y(R#hJys9FcVoUS?YB?rZBmdqnrJ#*v>CiOrS^iI#4uz$gGo5>FS zrIUD4_rQNL?5Pj-`jE;;CepQaL&uB0)(`x%4|-9>ZdhaK2Wow!4W=L1>Z5maV5zGg ze7M>T3myGHHQ78NtlzX5GVD90J_){tO{pPR4Vny)I8z<4PYsYg9U+LKmqTx?+@wPd z%5mpMC|Or1uC*_sLlZbs{^ zdLy4A2jm3`haP+C z`(RZyrj<1d}*{Q>{^w{&h7b=JGnq_R<+(mO)|*i0Pg{ee)D4eIcS#%@F> z^9rmiHhGKNq9r6hh@?APEHlga?J!4w%mn2lC2MIf=?~_o zhJ0>{AFbsZQ0LkSNtw2@0rfOoikuc`Lfe(J8X!wcmg0~WLoSzLj{_Zh><4txB&=&Q zt(bkopT$$z+*eBk^uc^sgh7+90yaO3%I}ob^Z9KDTCis70aiWqH50I!w7Dc%t*msf zkR4wmtb|ZT`;n&OWa$}rm3j`+2139hYh6oGA%jM&jRnzLsV*yVABZ(2&2)L?^@!YHJr=ac4V0}p#37BIr zjvQCW?r35M`3#vfybTtWj>3WzJ;oHzg{9JcGg}PdFJ@_=`}u%5aYQws31@n>Bc{7i zhx_Q88u#UnpA0|QL*s_W*=a?G9wGidT4rIi%)X>Ll$pwjT%Zx^fTrXoVIj(;X^8_G zJ>>8GF65w9a$qASpIa&OS4c6BzUjrvu$U;Of^L)mO>WZKwx-j!E;HhbNYf1qp^Qax z2Gc5OYDf5h%RFI37$mJo#PNIZj?WOMTtTV_O&X-6Qet8~H|R2t9}#fYHn|Wnop$0t zu#GDE-^3z|$nTSm=X=F+eXm&g-z(Pa?-eWWd&Tm7uUO9S70dCxV%fh}tjzBfOZ;B3 ztlukEl1V$(Ywjsj`V8z-Yz62uX0m0wjNT7!f$_QsJI|_9gyFz9V~iL7s1iE0z{%di z{;Lx64Mz4^)5gk@?&nR#-EaPwg*}*ooTiOft7kfA)34G4XAWh$$U+Ymgy{Wc#X^Ak z<=I|ASwXmW#JV*mPzy4!=@svvx1n}gN$LmCCnF$ zeC4}HSfd}-LZ%BC&xKe21v>V%u*aEJNE`+jF!`9nuL4cT3hUWZbCF(a{)_~|6PbZI zf0wlsA$9q4_xcht0324nEOJIATdac z%s4rav3@Q$kEE?S0gn?paI6zUTBjEJRf*t$M_Vcj5BFxGHa6E%SY291(pgm3dnwSg zo&XA723vyjOSARFkj_bS+Y>EIa9*ClmSRnMV#x5VFnT}jy%R$w)Yx?;abz-bxWDiO zBrJO%`+I6=f_Mu4GENPp_?C9X9$G5fw=D(7wTvYBagsE+wy<8B zH2lQXHHD{!(vZK+1#0w`7N((&k*CLdD+-fGG8y!*i=S(uuv4(vNI_|c6JmDx8_gM1 zsszw#d&^psaGDGK>`J^+N*hX9WkOqGU6fgMrbWp1qP&g!fY`I`9@%{5o-WlBu>U^~ z`$^wD*fjy$UVjQLbGYRc+U6A6qY#)-&BdpNw60X}+eGK_mI=t|o{dZu~)PpiK3JCKnNZ1EK8WA{QF+-c)L6|Rj znAPj5&{lsHFm6zvzSICHeyvTu2Cevwj%Qo8V2;-g0e7Jo^JDLQg;SxcmwA_YWU?;~ zcj+rIUa@LGzH{Tk4i~&QVttTldLOAZhV_iReF25MONgHlP|pIYLwPbr@u^~r#HuG- zXtkmm(Oiok$-GK_S1|t2{JVez7+ju>v8Ecd&~I-RWDCc_&;J0}NmYxx^5Q49HNeiH*uirbcm42gLS0H| z^VwK>#Z^64CB@czlS+CXMyXHc!zWe2b774;ek5a%QpHH^-JIfrml~Yl!VXhqsloay z5$#icL>s9EGH`wD64mk8Q<`eaO8R#!2T!+FVrR0^q#nVk7y9^PcycNwC;Oq< z#q(%9TCuYi!3{yf+52?(vbMCe3?pkB*<=X=TT8M3w$d0vE8)3%HH{$J`)$Vw4rpaH z;ymJ<984&c&dFQU!Sr)-t(uAF~q`{3^#ep$Mx1 zJ=61hSHMdzGy8x3=kPpXC2M`_yT0H1z4y2AJoWwv%S`Nfqnb-!6izRN?a^%!57@nk zQ4@uo_8>;PzELV?m17nj%sM~01@^g#fZO*gF(WDDgMxmbZm(%V@{v35Kz`y+H&((g zseW8KqGGW5AxX(ckjKLl-S1%$3CoEw$qG(wNL5~d{G85TlCLP^AVV=A^J}{>w+OPE z0$}#zCOPs^g6qagd~H}=F85O;sOBt4P|}rv2=WAGnO%cD^?`X23CaQ$47ql(_RbX2_eR0w%NX2G^!M1ii0eBh`Ox+A4jQk{CG+{9E%4-j)eDJ;>06xoDETB}Tvu-3 z)4yY@__SoJNIZI+p=?xf`C0h+?v;FAi6*iXybB(k^J^rJSNr9sJP|(K2YX@S)DQI@ zM+_PJK&yww4p`8t-Mm%T(;aS{L9t^#DM@w2B=P z6ToK6Sgv-IJMX2l z>`JBoFEiJ`3PASDpFzKL5}(+R`Nw!~*24a!3h6Xa;52!F>@jefJTNsJQw4l(LtU}4 zPL`tqUw#@V2l>>MkUa@}9&>>?mR#c8pZ=-znzyr0j7TNal1xH3CX-P09u!aiiQ-p$ zpKPMa1f4-`az8~IDKWv<9MQUuz!e|UU1JaSnN67pe`boPf7yH+CWI_Ma*mE_ehgQKu4SujIOtbNg zxED9(*{-#N2Oue1xfGoU^oI7qmnvRI`*`~u?RDSVEqH@qlj2Q1a!ry^kT7z*dy3@Xjdena3rc!=Bw% zMVO6^a)-KcKB_z9{x7nzX2bLJF{3K*o#_rXN*V4wab%U7Y>r2XKjkQ}s*51^P(kjI zD)OV+U&xbEHY&aZl!{FO33`C%l%(UzwwWf(tw;lT}eqe3d3oU1&yEZN!Y$z==fEQDczl$Ecn96@H=H_gm?UB>-KIAzxlXn>2PgyS} zIN5aaUIu@j_8uS&(MjCMpVo|ioIs>XB;V9PS46sO0er#pq6XZ?iLV~v9yuBLAMtM` zj^qzvk1#*XfTx?auU8}5t;CPKEb&c<>%eJ6;xE;1jo;47#YpB#;^j2pqAdS}i+Wws z`+#~jkt7V-NA9!m63|+oWa<11C_9fKw+5#l=y$^L=j$I_O&lI*d3f&D{EBD=57t-j zA-!4!GTmzppY`c#KI>EY6P?fbwXQf&i|=RsCd7lPK5Mc#m2SwbLZ5|gZJ&jUypYi0 zbBzFzKBq)=>L0jF3a`NjrxV6)_bkf8UpgjAvpqY|t*@E=8I_9L^!zI_L;- z?On$WI_;!)GmR<+pqs^r4rsNKuCE>1J-YX@)`m0xi1vtdw@Z6O()1mNl*x)WcR=IU zfKtsw>8Qii9Lnz2LjTTzUqG2vxVC9?*U-K}`{Ys8=-Eu9=* zU|jk#SJ&V#9`*bgbRv5D&JjMN1dwo{CcJ7Xa&SX_@=T6<6Xo126=uP%$KKQd%N}l3 z;p-y`5BQB5qRwLskh2X!I%C)c3;q*p7~(VGq`hne-Cl~4O7r4Ek`s~qjWWbe9?g)} zkYrXuvPqK1rPw2MPYL)0mZ9&aJ}%MbR+E+1tryH#qf+h8KhfPti6E%3b0pt^1cBr` zU+3$c(2i7MJ!Bp!ZI~82l<++~OS3SuL-C`NxnC7-#|l8!>VjlzQCXi1Q7~4ZHFpikX`VsWUbE$e z4p-s*@UTsD#Eqs~%KGFevjr{HYsbr^qs*@g3&+ZsLFuMA%KB6@%lal@20b;9cAkYC z&f@8)Ed*tTy3O|ez(%MK7=R?{>uZP~YejphkO1FPNPJA1JvJiSou?hFx08e-T%*r$ z_>QkCgOmg~Fy8|>i{p-u#Frk2T=)2h(OlN2d%mnsdjcFDBBU6$KMvg;AS<*AdRKy{ zhRY^MYhM8uoO+hl7v2ew=_X0?NQzcs0-a_-Y?9+6lS}6lFNOYRWEmxC?kfCFv6Ji> zZ_c|Awqs`V^Dl&*adoJ#wxj}MYpaPJ)>J?41qUQy(`zg|Wnq#;ka<<8FBO7}&yo zm7cH!yf3j%8OV7ci)Q}x1x4a4z-LxI<(JFfeZG%_4U$gCt8VK^gtrd|DgZo7FG=CS zM=M^%zACR;99I7L)e)g8#+W!7Q?U&&tO{dY2OoocQa-8}jT@c(uG*imfO>=3H@|^7 z&MZ;h!e@ICZ<%-m%tHR_YX~#p1jQ;eS9XQ%U!DhUjzovAso4Z7P#Bc?x600kyQTwT z&XArj)dJ`&fn1% z0_^Y;$QZAKETQUc$Vp>JPHMw>m^H1RLkmZ+!?_{PYM!DWUIi{APtmV`)C)T22xkWE zaJJol6cW?+6ME5vm^?>u@4#7R+b;gR&!&z&SBl?9@~bYZbUHr|F7*)y)wUlo<{&Hm znzM|3yNc-fyvlf&2s_!Mm{C*AD1XWqZhQwdroH0d|Klw1-7-){w%x=Bs{HfRpzT%2 zVjsV?jQQ1uXO=3- z&j}I$=i;z!^=8mH2GJ(6oSm*=p9~Zl)6g@*S7Q_p_ckmjIR6&42{jCu?niEcF5slE zAUWQ`bneZL3Fj7t6KW>9)13}nrzOT$*>czrqy_LU9dDhk)XS5rz8QY?2=xT9D=b{< zo>d8M+w>7&opR6GvoA-03ak=J$HC)CYI>T#FgK3lFr#&NUy2Ez< z4R;jQ+HTVLOU?6=?8?$553a%}Ve68?ZSPP>5t;O(G1E0;nsVL-Y79Pm8)Za^X}&{= zH9NxYNM?3(*kA^wav#M3j&Y;TSk7%vB1vxEDo|vg2H!{S0K0V85jJCFXCaU1sywlV zW*z+h5$vZ&l#tkbql`ohCdyUmj(nek6}hCn4}JgARMy8J$LR`pWpjSDtT3#tN^#r6 zDfnN8yg_8yPzbE9@vlrzaX$fS>`~;hcgat~;~>TTGwC<5RoS`lJJ~Y-N?8}K>A1UD zfk?o%vam9rg>0-Vd^Ve4?|q-y4NGwK2Jk1Jn)ZpMBE1Qr48@o1{ zzd@4izTjutzli6;=2bGRHA#DM2Xt8xs6+T`C*mZp$#zDf80?T;f8Hobf4%ITap=8YpC=23;=PS?VIL;7{O*gWhEl8a@9CswhUhg^U0krfbeP%N2CgFnw@ zEiAHO=Uav|Eo+`WA^~d75~jy>Q0*N!U1F$q3ma8fDo}gO4Ye1K)ebMIvD(RI3iv~S z9k>dXqN(_Y(@Gn{DRO7Jw2xP`|(>_vMcyN?r;l?NNwg`;z~ujiyfC_JR^4(Tw9xyvN%I zUiHk!TffDBxexKoq_;wLHE>jIKKblphV2D|OSOrRoR?xvoJ{7|Di?O~G8PPt?uxv%dP_HQwnjB|7pSf^&-D1%Aph`=!e%cqmVp0$8EWJ;} z&V9fo!cPtH02Lv4t3U<^t0(NQWirnHNjAkxgV$OTNv~>6QP8q3VA&&Da|LLYk8O73 zy3le3*xOEIkAWY6q=6!T5c|Ntd8nuN;5{#9U;(gkZAk%g{1pr?;gOR@k+fx1MMlM; zile_M7+fSjJ>)68=dL@AN~0Z7UhGLUZyqDp5s9xtTs)v+zypXrpsl2gBPnx6ViCis zkZ6`FtZs7rs3L}}$0l6lr_Xo&4Vg;jyE=z|@}khYP035&vtK-fd>K#sWy(ac0Mh0; zBZe+Mdk!p0VY__AG^%x8v0I#+6&^mbwkhYiF7;$ULy_p*YMSr5{Yu=635fCQ9E-`{ z9^%$gWDc$haTei^w(ttkIwe_M+<4pz`Ek3Pn`i)VIS7% z5>ei1%Etd9Q!@USn4)2gLHLCtp@I*`b!!MRwG-en$zsO_i=6^k>{P*GCtEYh0ADl? zXQK{L9vAlCwX!svUiC>I%V`4NQ4VXo%~zo{7{crvp-7CXI3qah)(!_a4zmI9oUb&K zZ33cFo5_0$)T?0|V2bW7>Elx{CeZQ`UYs~_TBRGy#E)hm%ST!P>8{DDcLB0*69v1; zbpR{o#tBt(f^3yZ15sP~^S+o5e%==cyMuTg!Q2k`%-_<1C`w-+6q9k?a+xF&7%^;R zP#XG4#BjL^E>Vm8nPJ%cg(yC+!YzoCNBO^-5PM@`e|KIxB%<*v%L^Cw|6z{8ueZN4 zqFtr%zo%&Ti$6ZlSqsS8k`KlAQ|vUj4%U&k-BbmrEKBHp`CRAJ2XgkX;F_ z%lYZw3|n6ODb|qImiU)8X?44_xVDkh5Lc||aT-&jfNyPd$4k7la!^ zD*gSc^WhmDyZ(GQzn!e62}{QT!giwv&6wlze3H=+9IV&2h18HewPlgCW`*`ABh&EQ zjjIjUT3mB*eFWDTxO#A%g=;;oWDB(gSCT9=;yM>sFRo-OwFB2YT$|BCV~Nb)$b&Z? zz?|mqTwMju)?4{8WC(GiNz-5Ms44t7oPl1Jo*=F|9vtz+)$sYX6Bh|9Bbj#<+2?3O zdL>!PG@~|)<1pk5;O;G0sS=V8Ajh#c{_|av9i$N;Tk~QM&iY zSg9v*XEN^4bF5B2ELJR!cif4V-1%htR|nXJ3`dWdGX1nKcBuw7KNfoeG8|;25XFU^ zR6|r2cE*uEkUz?uEDup5=O2Xq5QA;gMB?x5gFZ!Xq;%;KD*XrS?DBkYr2@&WaUQQH z?KN^a;tZ_R7Ggd~mOxR}%3zR`jz7u#G9>GzLclzu_(OPu???;rW< z-m(8)MEPpOClV?2WnknQSfP-dn`HY+K=BdO^sK3?k27@j@rH5#q8F6BL}hgjmmiLt zy$Ve>oxQSr==}KX{E=82EP*cL{GEQ{2KarS0ApENDN**oX(H~)G2 zn`F&Gk?M)I;WOiV2+Fxsc!ZSl$j?D^z{FAcyPyLq$ty1EB0pn2(E(}eUD}=uk};;y z8|z*2o@7LsLbQH7F?I8El9E!;BLQ@Q6Ec6)XX9sphN?nMh&dwrrQg2Wc>**I`Zkl^ zTkq=cL6i#tHTiNzCY!;R5BA%4I5|s)e>YKZGozrjrjlKd?NikIfot)Lo|9skevQn& z+u?1?+0{)fS>vUMsw`{f2_>=lb zybf4*k>4V0HQmTDnpSSO*v?y(og8e#WSJAZupZ%5 zPr=V~dqGcI2bcPV_)(wcu(kz0mwu-jUUZ%Vh}Jpow;0Lbst_k0fCZ~Y0lPN9*;vcW zLY|UT5`K537a^}k{1quWc_gmLCebz)nS}cJg^9c-&x;qsS#A6bmVTh4%yk;ti!Trd z*mx~o2qNgBzDTP$1EjWc5iexo0o5LJ*r+cUv>{6}%a{vmo=(K7%QS`PH=)_E#nVCYuPH;6Fu)Me;DzvdF7Dhd2Q~0;g7C-M~$!f?VI2E$xIVMrV;YyyXDaz!veBh1MFqlV*^mQa|e8xmx6!DN;#I%K^;4 z241Tew`L3S?!mh(RkP=o1BkzHldo#B1ZCqbnFhI$_tUrSR9ZA?m0(!#VLV-xP@%qYRma9QU1KBmyzz6_|1^$Bl?l)>!1i z=rrGQFk@+~I73>$IXA2ycftB{m+FD)A>*WI~n41iOAX) zb?z82F%SP_HZY-=h0L6ARrhr&xLSKZ;>J<5y|nAm_T&_85Ax~Lu?c$;3NsLcIR^3c zsy1TOsY$(e9;3S0#j^#9UUN3;8At_hQP9r`@NMQ^vY;M@EE^$u6C(>zmW{Tds`Z$6 z7NfxpUnGcqN)4l;usNO~EI=4sJtZVU(a9ml~%tf~d+1sJT zp_UQNlCN93u>Vv{GPEOfm+tV+Z6gexEOeK@=`JtbReNqMDU%;?lt5&E@_^)4&FQB zR{0<2WV@h;Zfg`(OO0Fh`%g|rzVEc|KE4PRA)`%XzX4t#W^|gNVvDj#i&LU$gdrAn zSNx$4#ZDXe1GTq#OAPdJ>6WGuzO>E%uIVjz+-R10Kj`$vE6WR2J1%S?+No(oW^Ni0 z^w0WF8Hut31%D-B)XFU{oUntQ8z1L)q5XuZt3cnwN+si(Pk^$8v~&-xGK5v|=V75a zt75|{`{*iR$DfUIMC?rI|MUIe7L)bprKbZH4+DoK3vs2_coz5?G}WfRyQ_7uiMSXx z_1+o>YyUFU-aXJZk#%?0;^z=~U59v<*6AmZ=`*cR2-y(HC1bj$qg2xPD0Wf%$`;Ur zWA#5H)o=Z%v15HW$F_v|O55PYv+1}F^ z6T1gbsqKu#Pe^T3pR8p);i}Rj9ZRHlC}N=Qaw_IE!*v8_QwHV{7!f71JrhnjW_{zl* zjd>=l1+|=?h1y}E=HjEo!>|RNk$=4N7SN-1QzrQT{46@5+ycvhrE%q2#IPl;0W^Ch zTRZH-H(mZj+~7QY`G3sZ#l^UJ|GPrY$jnmm1%MYo6}(8mduNnr;xGepCI3bS>LC_vk(xcSf)oyG@VYh06fd_-rCm9lx;8ljab0Vl~7IQ1d>k9B@; z&dt^iMbKzwX(QA)q9J5%a%=;)pj&)b63gryzURdoW)0kOQ4P`8AGkMv6~%?B#%btb z4u}$z@2!Z8w!K||^jOP23CESSV(!Yd+bJdmyc;Nsw}%^x{DJH{06KRoY zjz2+)c$(W!!U?D$!{C6o5OUCV2-(C5AX*=|$R#DTB9M>ctx8A>Q)`G5Br*FgH9fvyDewmyg4Z zi0>d&B{+#%ePcvv-_-HOh}yeO(kiCw_kQKDe;nRo`xurQiO!G19vk%c*sH4w@5hOh zjA!-wY`m+5)G-zJmqCV>Z1=5=9i0k)A{k@^17Jij z+t`tbUwXhdPHq*wV8SW3jlDs|k)3b{IZk*nj6$kie9mqL5-N95|5@`JfLvb33yNY_I)n4u-U zRsG`gU(njW06Ctt_K>Bf?k4<0XA1DlC4$&e$apdwcZMzSo~VPABUk$}JZR3`lAy@bl`?RX9zxeE%HzzzVuwElP5#G1Jy2I-CGQAZr=(D@5wFG1h&5-=jY z^AezZ+_&zf5oOm)BkEEKR#y{T(&x8|Si?ConJ`#N^b&AYlxg5huNY0ULM*wfJ8 zUE9+&|71_Eo+y?6FYW2oPp$rEd-~%(&Def2{y*4Hr7uDv^em(fhrry++7<43!<*(p&)9$Dp^G^X81e zPtgCU5+}FkJ%4@rhyE?*S0pNE%2m(Et%!Iqtx`3r9@6^jv$TGVu+n)etkkS`D#2|- zmNpadd}o$8RsJoRhK!%awETN6-v8Mrsk!gfsF|w#flxMWtrfrcw3Kb?@8n`+aZ41 zCmb(@L`3LC-0aotHjQ6lT`>66O0@C7g0OISVSfX^1Joop3QxpgX!+{}f98CYSb;o4 zq{CYeD=T-ePu5x|o^`HrQ9v$S!emK9`!qk#l06E?E(&O5`}weSg@e+2!|UP;vg z^Ob1)S~;`?qtGS%oh8ftlUnE#GA?EH1V#k@V?ScoXm)QY4n7O20!a>2)P zh>^OOrTB!`T|OJdPedR`jgdVzU8f*UfByC{;m;Flw^y)fV9 zUf5rcd|8u6;gVro=G-IXQpW;OQ;+MXNjF8>5Up5o`J%%{A+H-w;@wu?x zE3TrQ!oOKC{9ZD@`e zWf82bW8NZXn_r=Vq1P5x27GX3>JWh2~rMz&sA!BONlN~hHS@Ec1%GM1FUa zb4JpBz?6EB^!!#!j+3Rg;zamnvBJM79d*aXIdAs0X>~Y6oqubF)ZzndS5}yZm553q zYbJdYBA%$^yM$&ohx2c>ZoIPYMQKMrhV?4$>JxS!;sk&O-!`1PSqNPFqqgn4$ygyM&sg@z4IDmz||jq33f z5kENk%*Dr!&p4g_II?ysyLj&rNUF(#8`^fVE=Wa;VnCNu{tCEaNS8N5UhO`PenpST zs!>Y4-lglg71C<@PH(MuDSFa+7xp(J{uPg>Q@W2JDnPpUoL^9hu-?yxr2{_;(N#-P z+Ys40n6Ii4*`DkZPIOXKI(qj3*H=ALAr~||>rIebZ&&!TM<#P5xr>xWOPV+R&9HA6 ze}npsyJQz3%C4N!KASNuC5^F~%u)fs8em5OwSgCsqn^I0Wy z%^Kung`|cQ+trS!@p9*7A9rhpSk&ouBu3^ylYns63F?huR9o{KKSY$2Bci$uy%woceZ zIg39IB`DqtajNKZuVUt97nRLbR~45j+N}b)3e3oy%pqS#VZT!5gj`OBe7iE(wcNoK z7RHRl9HgwKk(h&vl**3Ot9+Q7hME66;xhKfI(T5ln9+nf-jDBBHG}&R%?ojHh!=F| zr8arAIZ&V)YmsY-w8=t+{fwL7ozSe@4QV2@6?bsL-hx8X1b2%nEh6cH0_QjFhXjcK zyP}o(V+&G{m6cu9gpk<~d4%HHDaynl(C5?a_Z9Yp1zQZLjfrU#PYgOghpYv$H)KYJn6yGUA}>+|Mgz?R ztZ5K^@d`8nE@?Jg+_W_Knj-!p#+p`w+%Sm2s3KkA62WgMU{}>wRMPm_#eo8$*E|dL zh6e1)LXw@r69s%OYhnX zGuR>Xus3u!?F|vxUN81Bx#>H5LwS+z?}cTF_QFods&Yav-PsB25!r>kxHDOtAz6+f zlj(iH*6SK@&mc~%QjJNk#_?=j`^Mt616)zba3%6be+)}z&H^`hOB_xO2XfFpdKKB1 z;~~pw2M*$&BIzEi6w>eH-6}-o{++R?bB)90D(L1c#kH`X<+ZiEUk#6?SF!pxgF4NX7Mvm(t>7Az>)@~l}eBl4!d)}GUEtB5)Kzc{+X4_wZZn3EI{Sc@0 zB3|KglaLOb?&WCff?93uf%AOtZjtZRK1lg4T!Tv&FYkDF@Q%e8Q`#bAE5P{XVfXa% z{*Ui#sNE0V)#6kmS3Kz!$H)2D=-4=+v(xa~$rhBxnOEpmUwv$FkJRU%xx{WRMYB%r zFP5FHmH9PVk;bVg>U_X))REWCENVP!;Lp}pI1Amo@XlS1mmD*@`Sf>0-MTaWGm5jd z3cp6@a(jT`b<%r#;TI`0EAieL?rd$j^YgG^mWdrWmy0?-0KPcpitWCLzGK8@Sj!J7 z*F{_H;%@P5?bGL#y=Na(^zIM^eC#6YwToB8>!YWU(};`LMMiw4mbq!if?hI>$5Di? z24Fl63oX#B!WX~v4%l0e2SurNLdwE^xZC>=L#_pnBEKKkB3$V={AB#AImGH1mzhD@ z`6f<0D!T?NHvwb9Du^s-D&hBenEPFy@)CKmuh4qH_t$ZdA8Mc>gM|*+ zP-Ks!;e3CLD;}I216h{`82G;5_%}~G>)(>v4!egZf#oK1iwpO6IEGWx$rmBTzS$WA zYCC-@C@-SUW&!iaUKULWFB4@nOXJ^R0c8Y#yhXf3hw)S=)!J}Zt?Jquu+fYo}y7DgQ5iN zC7163|E3+n{Ae*U2g>G<^h*i7>a+xzbEiY=-}x;r?SY7m=Q?XRPCpe{;c`TsB;C**T!_B4#>?qt> z$zkv`voM;}osOf@Xb}H~do!fRh_o|oBRu4p%NQ~unc{n7Q+7^PQVw-TT)14%CCk9uFM&-S zVvisT>dBD6$ucU#xwpfY*p|^LGtY;%PRLl=Q>XuTcz|(;D4Oi$%xeEU#VklB*^C|F z6#gOyRmKhX$Uwi(!@h8E_q)`{pqqiL2b`Hp{l1c3l$-ZoD2ME*CE-fsReSWNZMLRIpFun&HHNYr8Qy#b~LO{@Y|lzxd3@gspPBvcVInTd4gT^B*!BQ z2j9K$if5UjmnB>>4nQQRg8TYoq z@8i?3r~UKJGV!qv4I)n&z)t`h6i{oSmDJMOfsF-QV7a3d2ks$!Lz)D#8%5qy1(jNW z@!i;~|HB?tmeC03S=ZJ`z4~3aUh36m^y>bbdNuXGUGLR#*a1vkN%B|HFHn!jKJ5GE z>i@h~)oYK8^=Qiv^k~%$J)(JXuO$CBl1h=4+W+NwDk%f*sYHJEjjsJ`-|uV?$;Q%S ze6+)emAkX>KGQqlMyz16w1Q7dJv%@-1z?$ta|s*@EL|&cRX?{9k_h?F`x5m+s7eWI zJZLm3D`AK>N-KW^-pZOl|UFqr;g5rFQVMX#=6KMU!#C7E zO1gg3J(wx!`gx5eLgn+|*FfFNA>FU6G>i(_PH_PG*O-FG8F}V$euaId$i@A2-b2nZ z%wz*}((u}=0v{*Ei{E(VXD_~vGw+sej~TnN1m_^^OK-XK^S&v~J@X0;J>QWF5Wi2n zPx-~pX@-kLldc6%-UrIiTf0e*NT>tnum%az8bn|86~y*_IPZSdhmagxmn|p;rpORe zD|wN$9>_v^*=J8IBzq0a6|cukQC}#QDEI?tydr&C*k8&~za)OaVF5O->riQnX>W4H z!|$&nD+vyCjQw&nS5!zaqUqKTJu>BAU@JmBe*Qu{q#5dN4*04))VA@C9>RL`q~${B zug?~*b38kLgL8r5VJCTc=ZvJA7l+erJh%tgB=ThYNE8RW1Cd{Fi{D7T<71%Rb?^q~K}2Sb0oJQy+|;Ct$B^}`q8qW6V{pRc?=O!|M`Sh7uP^x> z(aKJJI=iYE9FL=(F2zy51##4qd+qw$d$~B+b8xwT#eRd;x7q&4yhn-)RS!urnCml2 z(i$4c?f*IB#jSt6TZ+G~81A;`6jJ!MtHnAJjQ77J4VO|ZfH!W$#Sf4iqIrC*N}ub@crE0H14U;y_P zTfqDUe8*5**~0#0gV5bE#MVy0S|;~)3~|3O&|0ob>V2+wp5wV6SVe7bTk!%_+k9Hx z4am?ozQQr1EW2RvLCc?Ou%?K%^nvl_p8rYe`ANjM=Q5S&SPwpEfzNu3ZT%09Z8gTW`Ul4Lh$UqWjV<>(W3${t ztMY$yY~NjzV)VQC2m4)seiwXizZYKFvFMjlzh~UoZ%Di?1+834ePldpEF}05TV>vd@T4) zAJCWFB78QCePoaivP|SEK0~>RNt?7UkZRixgEFg-lNw~jt&X&yP&_@zS8#Y{2(aQ5 z{MHBgJPzNR0$eebqB6*~jo%C{>6u0P&5F5@p8KQ+`CvPHqUYJsU5@L#ZacWC{nh}# zbvyX4SdnGc^y~}F)}VjjguedQCZYz^`~7NVLcdP)lXLAsdlHu#CCb5zKNVnkPX!>E znXxm#HdMM^3!ZLxE%@sV8Nmq;?+kF&uLV!x_j}dKpyJ`D(CbeFy!Ex17m*} z=lwDLGVR=Rl!Iz7l|P7d%Du>szQeq(J< zR?CBm%gni2UWIO+`_WSYPE$}Z_O zw6^2p8J988y6U&SFf`-8zwM6RzAy0UR^;3qqR~$5mnkggFhYS#i9-+J)fnK_FFC00 ztH{kSL80E0j16 zjk=?d6!HEiWeWe3LYrSFk3b{!L6}bK!fqoNKn+PDpVEI;Cd^{FLN?$f^Q>h3s)ctdoR2y&BT}5A`WK^yzIu4aQIDm3jFa0JaBIkp7}unXAa^)7 zsMgr9`cDLG_$<=cFK5)Lnt^3LB#Ux$UE{($gL+*>xQGP!*S026Vwo zx&}Y;L^pGg#2^A4I4HR1) zaAAf1i|5Svmbd;8K^5l8h<#klY^?!qwJ;Z$tpZOUrd4_rYx-`*tf1?zh5&b$I;2!% zt}6uO0Jj9?SXbJ8?^XXKD6X!orUI~9m>a||YG{ao@40J6Kqnj5UjcT>MkTNzC*vD#;#Vr@{&B&Q) zhtR$Q^q_C(!yG|seUppY-;Cdikdpdjg*_OJPI^lHehlAfq>;YWI|Zpv@A=jrpmpK= zA9846bO&tjrEi*~bFd!m(jP0`l@ znwNuJ8Y->&tn89O%12A%C;--^F})J(8f9jBehlT?gY$R2k8`*{bG^n%=k$jb_TR}e zBO{oNzN4ID4i|(j7rS{JMjpleXK-rxeHd{D^MA-TVQ!ZDWX&&$u-&Ki#(M>z5OnxJ zLxcI?%-FsDYcrFy$@P6Tqn;$}Xx5J$j>?(J8CvXQ!KMUu)M0m%y{wR{@v57JT(wu# zEZ9`uFrr9&Gn{r57$Io{xfHNA8e zv-*9qUV4|_Q)4zB?*$h0h^`6U`U4023Y<&taUV$j)12h765XReP(UNpP!297PNyyn z=2MNiQ4`#Te1z>+z>oXuT7AEgbDRTKUC=jJo-8Zb6*TBK8C5^!3oIY*}Kv;8*tQn-tN+f%SB~3N?L{K47i-mNj_=V zmm4hDs%vGl49+;`8}6Ns_k1Rtx$zo;A$t<}-DrF0TN&00yTK}Cf9LHMW@~W1?%v|~ zi*IUBi5ctC=z&|KaK^rMNq-}40s3kjFJR2~?F*PShJId~dJeNA<1BPC2{}YTESKmC z3up?$0xZZRI)YBB$Z2$1x(8e+U5RGsJ>TdOdJH53)HXsxLz)Jn6EOQmnth@Tq?$BC z*J*xni@EgS<5v^eEuiDhml<_!;)0-ALF9b*u4A4VYC+ zw8nSnM~da!>>*16jQ0UV!w_Qn6}o$nQ(REX5XFc2pH%Mm>k!Yap2NAM5pwqh3N>6R z%{Z5~RJ>D+r;~gpXxqGBji2NVKME=zjt}tFpopzwCwYSc_lV;C6#cyMB>xm|Dnfb% zsNV{reuF2B~QpE2w`)tpV*kaB-m~-Hbcn8*{I&_!2UBH z@@4dzrx3hg-gVS#W`&eX>V2HJAd%(M`N8?+3OOWZ_%1=-c&$N+F4clw(80<=$lWVZ zq&>cyDAF;2xsiV3w?5gv6?QFOuiF=RUX#?%6gx!K_VjaDZ^l`KY|Iwm2(x4Cz+O3J zy%CORbmN==ov{R4H^WhmSmBZZk~l=L&~+d7^K3b^1a-WS2aIF{{Wg0Xl7`X$t|V0p z*;&wRbPYbcN!2RAj$6t`CR1#` cVuzxFKX@DkUWdb6H&jBrIB--c*P7;Ta>LQwj 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

    Q&T6ZgwxD&Xi)bUi`qF7CueM`t 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%0Aj_k^(N?SPf9;nR`Sj~1ck;+2FLO7Xdc~+!TMweE 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 @4_ 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�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≠mis2>4^^`Z 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 HV!CLVkD9(9YYPCr%^}IOvxIDMpp^T6N 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%0Dq+&h23HU;yuknyB+(SjT;2&P>k6BG(#?9$u0 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 z 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
    p;9?hS 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
    &AKZz|;R&qO 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